TDD
fossasia/eventyay-interpretation
Test-driven development. An agent skill from fossasia/eventyay-interpretation.
Plans an architecture-driven change to code that already exists: module boundaries, type responsibilities, layering, coupling, and the public surface a revision moves.
$ npx skills add testdouble/han --skill plan-a-change -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install testdouble/han plan-a-change --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .claude/skills && cp -r skills-src/han-planning/skills/plan-a-change .claude/skills/plan-a-change && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "plan-a-change" agent skill from https://github.com/testdouble/han/tree/main/han-planning/skills/plan-a-change into .claude/skills/plan-a-change/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "plan-a-change", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/testdouble/han/tree/main/han-planning/skills/plan-a-changeType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add testdouble/han --skill plan-a-change -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install testdouble/han plan-a-change --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .agents/skills && cp -r skills-src/han-planning/skills/plan-a-change .agents/skills/plan-a-change && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "plan-a-change" agent skill from https://github.com/testdouble/han/tree/main/han-planning/skills/plan-a-change into .agents/skills/plan-a-change/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "plan-a-change", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add testdouble/han --skill plan-a-change -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install testdouble/han plan-a-change --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/han-planning/skills/plan-a-change .cursor/skills/plan-a-change && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "plan-a-change" agent skill from https://github.com/testdouble/han/tree/main/han-planning/skills/plan-a-change into .cursor/skills/plan-a-change/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "plan-a-change", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/testdouble/han.git --path han-planning/skills/plan-a-change--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add testdouble/han --skill plan-a-change -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install testdouble/han plan-a-change --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/han-planning/skills/plan-a-change .gemini/skills/plan-a-change && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "plan-a-change" agent skill from https://github.com/testdouble/han/tree/main/han-planning/skills/plan-a-change into .gemini/skills/plan-a-change/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "plan-a-change", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install testdouble/han plan-a-changeInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add testdouble/han --skill plan-a-change -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .github/skills && cp -r skills-src/han-planning/skills/plan-a-change .github/skills/plan-a-change && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "plan-a-change" agent skill from https://github.com/testdouble/han/tree/main/han-planning/skills/plan-a-change into .github/skills/plan-a-change/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "plan-a-change", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add testdouble/han --skill plan-a-change -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install testdouble/han plan-a-change --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/testdouble/han.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/han-planning/skills/plan-a-change .opencode/skills/plan-a-change && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "plan-a-change" agent skill from https://github.com/testdouble/han/tree/main/han-planning/skills/plan-a-change into .opencode/skills/plan-a-change/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "plan-a-change", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
plan-a-changePlans an architecture-driven change to code that already exists: module boundaries, type responsibilities, layering, coupling, and the public surface a revision moves.
Plan A Change is an agent skill from testdouble/han. Plans an architecture-driven change to code that already exists: module boundaries, type responsibilities, layering, coupling, and the public surface a revision moves. Produces a buildable change plan that names the types, modules, and methods involved and records the surface delta each change makes. Use when the user wants to plan, scope, or sequence a restructure, extraction, split, consolidation, responsibility shift, or API revision of existing code, including "these responsibilities are wrong, plan the fix"…
Its SKILL.md is about 6.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files, including reference files (for example `references/change-decision-log-template.md`, `references/change-plan-template.md` and `references/current-state-findings-template.md`).
It sits in Testing & QA, covering Test-driven development. The repository describes itself as: Han: AI skills and agents for "Solo" product engineers and small teams. The licence is MIT.
12 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit abba73a. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadWriteEditGlobGrepAgentBash(find *)Bash(git *)Bash(mkdir *)Bash(bash "${CLAUDE_PLUGIN_ROOT}/scripts/han-config-dir.sh")From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
bashgitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Plan A Change loads about 6.5k tokens when it runs, and up to ~14k if it reads all its reference files. Until then it costs about 195 tokens; SKILL.md has 3,598 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from testdouble/han at commit abba73a, republished under its MIT licence (© testdouble). 3,598 words, ~6,544 tokens.
.claude/skills/plan-a-change/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.find . -maxdepth 1 -name "CLAUDE.md" -type ffind . -maxdepth 3 -name "project-discovery.md" -type fbash "${CLAUDE_PLUGIN_ROOT}/scripts/han-config-dir.sh" 2>/dev/null || echo "$HOME/.claude"cat .han/config.md 2>/dev/null || echo ""As your first action, use the Read tool on .han/config.md inside the personal config directory path above. A read
that returns no file is no personal configuration: continue silently. When that file or the project .han/config.md
probe supplies content, apply it per config-rule.md, which governs precedence
between the two files, relative-path resolution, and what to do with a file that reads but cannot be used.
## Deferred (YAGNI) with the reopening trigger named.change-plan.md is the deliverable and sits at the root of
{folder}/; artifacts/change-decision-log.md and artifacts/current-state-findings.md sit beneath it. The plan
cites decisions with inline ([D-N](artifacts/change-decision-log.md#...)) links and cites current-state evidence with
([C-N](artifacts/current-state-findings.md#...)) links. Any edit to one file updates the matching cross-reference
fields in the others.Read the user's argument and the conversation context, then answer one question before anything else: why is a change being planned? Do not assume a prior report exists, and do not assume something is broken. Classify the reason into one of these, and record which:
architectural-analysis report, an investigate report, a code review, or an
ADR names the structural problem. Capture its path.When the context supplies none of these, ask for one, and ask for nothing else in that turn. A run with no recorded reason has nothing to apply the YAGNI evidence test against, so it produces taste rather than a plan. This is the one place the skill stops before doing any work.
Resolve the area. Name the modules, directories, or types the change concerns. If no area resolves to real files, ask the user to name one. "Restructure the codebase" is not a valid input.
Resolve the output location through the precedence chain in ../../references/config-rule.md:
output-directory setting from the project or personal .han/config.md, with the run's own folder
structure created beneath it.## Project Discovery section, project-discovery.md, or a Glob fallback (docs/changes/, docs/plans/,
docs/). Confirm the name with the user before creating files.Three files will be written. The plan sits at the root of {folder}/; the companions sit in {folder}/artifacts/:
{folder}/change-plan.md — the deliverable. Always written.{folder}/artifacts/change-decision-log.md — every committed decision with rationale, evidence, and rejected
alternatives. Always written.{folder}/artifacts/current-state-findings.md — what the code does today, as numbered C-N findings with file paths
and verbatim code. Always written, whether this run produced the findings or read them from a prior report.One more is written by Step 1.5:
{folder}/artifacts/scope-boundary.md — the boundary record.Create the artifacts/ subfolder before writing the companions. If any file already exists, ask whether to overwrite or
append before proceeding.
Read ../../references/planning-boundary-rule.md for the record's name and
its sections. Establish the boundary before Step 2 discovery begins. This skill plans code structure rather than
screens, so the rule's visual-material convention does not apply to it: write no ui-designs/ folder and run no
completeness gate. A diagram the user supplies is ordinary context.
A record already exists at {folder}/artifacts/scope-boundary.md, or in the folder of a source report Step 1
captured. Read it and use it. Do not re-ask anything it answers.
No record exists. Identify the work item this change descends from — a ticket, an issue, a pull request, or a written request the user typed — and read it. Record its stated scope and its stated exclusions word for word. When no work item exists, record that explicitly along with the statement that the user's request is the only boundary this run has.
The read does not traverse outward. A linked item, a sibling, or a closed item is not scope evidence for the item in hand.
Then take one confirmation turn before Step 2. It restates the recorded boundary in the user's own terms, restates the reason recorded in Step 1, and asks whether the area named is the whole area the change may touch. This turn is a confirmation rather than an escalation, and the one turn that carries more than one ask.
Source the explanation standard by invoking han-communication:explanation-guidance before you write the confirmation
turn, and again before any escalation later in the run.
When the user hands you a work item that conflicts with the recorded one, surface the conflict in the confirmation turn and ask which governs.
The plan's target state is only as good as the account of what exists today. Two paths reach that account, and which one runs depends on what Step 1 recorded.
A prior findings report exists. Read it in full. Extract its findings into
{folder}/artifacts/current-state-findings.md as numbered C-N entries, preserving each finding's file paths and
verbatim code. Note which findings the report left unverified, and carry that label forward. Do not re-run the analysis
the report already performed.
No prior findings report exists. Dispatch the discovery round yourself. This is the orchestration this skill exists to own:
han-core:structural-analyst — always. Module boundaries, coupling, dependency direction, duplication, abstractions.han-core:behavioral-analyst — always. Data flow, error propagation, state, integration boundaries at runtime.han-core:concurrency-analyst — only when the area actually contains concurrent access, async coordination, or shared
mutable state.Brief each with the area from Step 1, the reason from Step 1, the boundary record's path, and a report-length target matched to the size of the area rather than a size word. Ask each for numbered findings with file paths and verbatim code. Launch them in parallel, in a single message.
Either path, then: run one Glob and Grep sweep of your own for the project context the specialists do not cover, and
fold it into the same file — CLAUDE.md and project-discovery.md for stack and conventions, ADRs under docs/adr/,
coding standards, and, when git is available, git log --since="90 days ago" --name-only --pretty=format:"" over the
area's directories to surface churn and recent precedent.
Write {folder}/artifacts/current-state-findings.md using
current-state-findings-template.md. It is the single source of truth
for the current state across the rest of the run. Every later agent is told to read it first and not to re-grep for
what is already there.
Enumerate the gaps explicitly: what you searched for and did not find. A missing ADR or absent coding standard is itself a finding the plan should note.
Read team-selection.md. It carries the size bands with their specialist and round caps, the size-override rule, the seats every team fills, and the roster to draw the rest from.
Default to small and escalate only when the signals clearly require it. State the chosen size, the recommended team, and the reason in one short message before launching agents. If the user disagrees, accept their override of the size, the specialists, or both.
Dispatch han-core:software-architect with the current-state findings, the recorded reason, the boundary record, and
the project conventions from Step 2. Ask it for the target structure: which responsibilities live where, which module
and interface boundaries change, and the refactoring path between the two states.
Add han-core:system-architect only when the area crosses a service boundary, changes a context-map relationship, or
shifts data ownership between services. When it is not dispatched, its deferrals from the software architect are
surfaced in the plan rather than absorbed.
Both get the YAGNI directive in full: every new type, interface, abstraction layer, extension point, and adapter must cite evidence per ../../references/yagni-rule.md, and a proposal whose concern is satisfied by a strictly simpler structure returns the simpler structure. Both also get the contract directive: every contract two parts must independently agree on is specified to a concrete signature, field layout, or worked example, per ../../references/contract-pinning-rule.md.
The architect proposes; this skill decides. Where the proposal and the recorded reason do not line up — a restructure larger than the reason justifies, or one that leaves the reason unaddressed — that gap is a decision to settle at Step 5, not a recommendation to adopt.
Read surface-delta-rule.md before writing a single entry. It defines what counts as a surface element, the five delta verbs, and the target-state statement every entry carries.
Walk the target state element by element and commit each one as a delta entry. For each:
han-core:junior-developer to reframe. Launch it in conversational mode with
the question and the input that raised it, and a directive to restate the issue in plain language and surface the
clarifying questions a three-to-five-year generalist would ask. The reframing frequently exposes an unstated
assumption and settles the question without the user.Never escalate a question the recorded boundary already answers. When the boundary places an element outside scope, cut it and record why, rather than asking the user to choose between options their own work item already decided between.
Record every settled entry as a D-N decision in artifacts/change-decision-log.md with its rationale, evidence, and
rejected alternatives.
Classify every delta entry from Step 5 as one of two, and record the classification on the entry:
Every behavior-changing entry is escalated to the user before it is committed, one per turn under the Step 5 escalation
rules, whether or not the change looks obviously desirable. An architecture-driven change is planned on the premise that
it is safe to make, and this gate is where that premise is checked rather than assumed. Record the user's answer as its
own D-N decision.
An entry you cannot classify from the evidence available is recorded as behavior-unknown and escalated the same way. Do not resolve an unknown by assuming preservation.
Launch the specialists selected in Step 3 in parallel, in a single message, with domain-scoped briefs as team-selection.md specifies. Give each the current-state findings path, the target state, the delta with its behavior classifications, the boundary record, and a report-length target matched to the size of the area.
Aggregate their verbatim output into the plan's review record. Three passes run first, in this order:
Pass A: merge by substance. Two specialists often raise one finding in different words. Merge those into a single record carrying every originating specialist's identifier.
Pass B: strip blocking severity from findings resting on an uninspected input. A specialist that could not inspect
something says so on the finding itself. Every such finding, and every finding depending on that same input, is labeled
Unverified and cannot carry build-blocking severity. Keep it — it may be real, and you can often verify it
yourself. What it cannot do is reach the user looking like a blocker on the strength of something nobody read.
Pass C: close what the current-state findings already answer. A finding the C-N record answers directly is closed
with the citation rather than promoted to an open question.
Then resolve what remains under the Step 5 order: evidence, then han-core:junior-developer reframing, then escalation.
A finding that changes a delta entry sends that entry back through the Step 6 gate.
The round cap from Step 3 bounds this: small runs one round, medium two, large three. Re-engage specialists only when a finding names a specialist whose domain was not covered. At the cap, surface what remains to the user with recommendations and a note that the review has reached a plateau.
Run three gates over every part the target state introduces.
## Deferred (YAGNI) with the reopening trigger named.Rejected alternatives: in its D-N entry.artifacts/scope-boundary.md per
../../references/scope-justification-rule.md. Entries the boundary
excludes land in ## Cut for Scope with the citation.An item lands in one section or the other, never both, and never silently disappears.
Invoke han-communication:readability-guidance to source the shared readability standard into your context, then apply
it to the plan's prose. Hold the named audience: the engineer who will make the change. The standard governs how a fact
is said, never whether a required fact appears — keep the type names, paths, and contracts the plan depends on.
Write {folder}/change-plan.md using change-plan-template.md, and
{folder}/artifacts/change-decision-log.md using
change-decision-log-template.md. Read each template in full and copy its
structure whole.
Sequence the change units so each one leaves the codebase working. A unit that only compiles once a later unit lands is not a unit; merge it into the one it depends on, or split the dependency out first. This is the property that makes the plan buildable directly rather than needing a second planning pass, so state the ordering constraint on every unit that has one.
Then wire the cross-references: inline ([D-N](artifacts/change-decision-log.md#...)) citations in the plan for every
non-obvious claim, ([C-N](artifacts/current-state-findings.md#...)) for every claim about the code as it stands today,
and the Referenced in plan: field back from each decision.
Dispatch han-communication:readability-editor (one Agent call) to audit and rewrite the plan's prose. Pass it the file
path {folder}/change-plan.md and the named audience: the engineer who will make the change. The editor reads
han-communication's own canonical rule, so pass no rule path. It must preserve every fact and operate on prose regions
only — never inside code fences, tables, or the D-N and C-N citation identifiers, which must survive unchanged so
they still resolve. Apply its rewrite to the plan file.
It must also leave every plan section heading unchanged, because the decision log names those headings as text in its
Referenced in plan: field. The editor is otherwise free to make a heading descriptive, and here that would break a
link.
Then read the editor's fact-preservation report. Do not walk the self-check over the text the editor produced. The canonical readability rule says the dedicated editor replaces a skill's own readability pass rather than stacking a second one on top.
The editor's report has three shapes that need no repair, and one that does:
Insertions names nothing, or names a line whose quoted source= span you find in the plan. Nothing further is
needed.Insertions names a line whose quoted source= span is not in the plan. The editor wrote that sentence from
something the draft does not carry. Name it in the Step 10 summary and record it in artifacts/, quoting the inserted text
and the span the editor claimed. Change no text: there is no pre-edit draft on disk to restore, because the rewrite
was applied in place. Check nothing else.When no usable report comes back — the editor could not be reached, returned nothing, or returned something you cannot read as any of those shapes — run the readability rule's standardized self-check yourself over the plan's prose regions only. Say in the Step 10 summary that you did so and why. With no report, that check is the only fidelity guard the output has.
Summarize for the user:
change-plan.md, artifacts/change-decision-log.md, artifacts/current-state-findings.md, and
artifacts/scope-boundary.md.## Deferred (YAGNI), kept distinct from the cut list. Omit this line if nothing qualified.Unverified because a specialist could not inspect its input. Neither these nor the
deferrals are presented as blocking.Then name what comes next: plan-work-items to break the change units into independently-grabbable work, tdd to build
a unit test-first, or refactor to carry out a behavior-preserving unit directly. Ask whether the user wants to iterate
on specific sections or considers the plan ready.
© testdouble, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (references) in han-planning/skills/plan-a-change of testdouble/han.
Open the folder on GitHubat commit abba73a
Plan A Change next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Plan A Change this skilltestdouble/han | 279 | — | ~6.5k | Automated safety check: Pass | MIT | |
| TDDfossasia/eventyay-interpretation | 1.6k | 28 repos | ~1.1k | Automated safety check: Pass | Apache-2.0 | |
| TDD WorkflowhellangleZ/burn-in-cceverywhere-ralph | 112 | 11 repos | ~2.4k | Automated safety check: Pass | None | |
| TDDsanity-io/sanity | 6.4k | 20 repos | ~1k | Automated safety check: Pass | MIT | |
| Test Driven Developmentfarm-fe/farm | 5.6k | 49 repos | ~2.5k | Automated safety check: Pass | MIT | |
| Tapd Story PipelineTencentBlueKing/bk-bcs | 840 | — | ~2.6k | Automated safety check: Pass | Custom licence |
fossasia/eventyay-interpretation
Test-driven development. An agent skill from fossasia/eventyay-interpretation.
hellangleZ/burn-in-cceverywhere-ralph
A skill your agent uses when writing new features, fixing bugs, or refactoring code.
sanity-io/sanity
Test-driven development with red-green-refactor loop. An agent skill from sanity-io/sanity.
farm-fe/farm
A skill your agent uses when implementing any feature or bugfix, before writing implementation code
TencentBlueKing/bk-bcs
单需求实现流水线——把一个 TAPD 需求从零推进到代码提交。自动串联技术澄清、 开发计划、任务拆分、TDD 实现、架构/安全校验、代码提交六个阶段。
maddhruv/absolute
One-time setup for absolute: interview how you want it to behave (output style, autonomy, TDD strictness, spec dir, families) + detect the stack once, then write .absolute.config.json (project…
testdouble/han
Convert a stakeholder summary markdown file into a single self-contained HTML executive report — bottom line and decision asks up front, supporting detail later — styled with a Test Double-derived…
testdouble/han
Update Han plugin documentation so every skill, agent, guidance doc, index, and cross-reference is current and accurate.
testdouble/han
Authoritative guidance for building Claude Code skills, agents, and plugins, plus init and update steps that install and refresh the plugin-building skills in the current repository.
testdouble/han
Cut a Han release: update CHANGELOG.md with the changes since the last release, bump and tag every plugin that changed as {plugin-name}--v{version} so a version-constrained dependency can resolve…
testdouble/han
Builds a feature implementation plan from an existing feature specification (or equivalent context) through a facilitated team conversation.
testdouble/han
Restructure existing code without changing its behavior, through a test-gated refactoring loop: a named target, a green suite over that target before any edit, a planned sequence of small named…
Categories
Plans an architecture-driven change to code that already exists: module boundaries, type responsibilities, layering, coupling, and the public surface a revision moves. Plan A Change is an agent skill from testdouble/han. Plans an architecture-driven change to code that already exists: module boundaries, type responsibilities, layering, coupling, and the public surface a revision moves.
Plan A Change fits situations like: the user wants to plan; sequence a restructure; responsibility shift; API revision of existing code.
Run `npx skills add testdouble/han --skill plan-a-change -a claude-code`. Or copy the skill folder (han-planning/skills/plan-a-change in testdouble/han) into .claude/skills/plan-a-change in your project. Claude Code loads it when a task matches its description.
Run `npx skills add testdouble/han --skill plan-a-change -a codex`. Or copy the skill folder (han-planning/skills/plan-a-change in testdouble/han) into .agents/skills/plan-a-change in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add testdouble/han --skill plan-a-change -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/plan-a-change, .gemini/skills/plan-a-change, .github/skills/plan-a-change and .opencode/skills/plan-a-change in your project.
Going by SKILL.md and its folder, Plan A Change needs the command-line tools its instructions call (bash and git). Its frontmatter pre-approves these tools: Read, Write, Edit, Glob, Grep, Agent, Bash(find *), Bash(git *), Bash(mkdir *), Bash(bash "${CLAUDE_PLUGIN_ROOT}/scripts/han-config-dir.sh").
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Plan A Change is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.5k tokens (SKILL.md is roughly 26k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 7.7k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Plan A Change: TDD (fossasia/eventyay-interpretation, 1.6k stars), TDD Workflow (hellangleZ/burn-in-cceverywhere-ralph, 112 stars), TDD (sanity-io/sanity, 6.4k stars) and Test Driven Development (farm-fe/farm, 5.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
testdouble (a GitHub organization) maintains it in testdouble/han, which has 279 GitHub stars. The repository holds 54 skills in this directory. The repository was last updated on October 1, 2026.
Source: testdouble/han on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.