Implement
open-octo/octo-agent
Implement a technical design by decomposing it into dependency-ordered vertical slices, executing each with TDD red-green, reviewing each via an isolated sub-agent, and persisting progress to a…
Build work collaboratively in reviewable pieces, handing each piece back for review before starting the next, so the person stays in the lead and steers while the work happens instead of reviewing a…
$ npx skills add testdouble/han --skill pairing -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install testdouble/han pairing --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-core/skills/pairing .claude/skills/pairing && 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 "pairing" agent skill from https://github.com/testdouble/han/tree/main/han-core/skills/pairing into .claude/skills/pairing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pairing", 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-core/skills/pairingType 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 pairing -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install testdouble/han pairing --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-core/skills/pairing .agents/skills/pairing && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "pairing" agent skill from https://github.com/testdouble/han/tree/main/han-core/skills/pairing into .agents/skills/pairing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pairing", 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 pairing -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install testdouble/han pairing --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-core/skills/pairing .cursor/skills/pairing && 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 "pairing" agent skill from https://github.com/testdouble/han/tree/main/han-core/skills/pairing into .cursor/skills/pairing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pairing", 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-core/skills/pairing--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 pairing -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install testdouble/han pairing --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-core/skills/pairing .gemini/skills/pairing && 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 "pairing" agent skill from https://github.com/testdouble/han/tree/main/han-core/skills/pairing into .gemini/skills/pairing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pairing", 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 pairingInstalls 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 pairing -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-core/skills/pairing .github/skills/pairing && 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 "pairing" agent skill from https://github.com/testdouble/han/tree/main/han-core/skills/pairing into .github/skills/pairing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pairing", 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 pairing -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 pairing --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-core/skills/pairing .opencode/skills/pairing && 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 "pairing" agent skill from https://github.com/testdouble/han/tree/main/han-core/skills/pairing into .opencode/skills/pairing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pairing", 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.
pairingBuild work collaboratively in reviewable pieces, handing each piece back for review before starting the next, so the person stays in the lead and steers while the work happens instead of reviewing a…
Pairing is an agent skill from testdouble/han. Build work collaboratively in reviewable pieces, handing each piece back for review before starting the next, so the person stays in the lead and steers while the work happens instead of reviewing a finished result. Use when someone says to pair with them on something, asks to collaborate rather than direct, wants to review as it goes, or wants to guide the work piece by piece — on code, on a design decision, or on writing. For a test-first build it runs tdd, for restructuring it runs refactor, for an interface…
Its SKILL.md is about 3.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Testing & QA, covering Test-driven development, Architecture decision records and API design. The repository describes itself as: Han: AI skills and agents for "Solo" product engineers and small teams. The licence is MIT.
7 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:
ReadWriteEditGlobGrepSkillBash(find *)Bash(bash "${CLAUDE_PLUGIN_ROOT}/scripts/han-config-dir.sh")From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
bashFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
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.
Pairing loads about 3.5k tokens when it runs. Until then it costs about 234 tokens; SKILL.md has 2,135 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). 2,135 words, ~3,540 tokens.
.claude/skills/pairing/SKILL.md (or your agent's skills folder).bash "${CLAUDE_PLUGIN_ROOT}/scripts/han-config-dir.sh" 2>/dev/null || echo "$HOME/.claude"cat .han/config.md 2>/dev/null || echo ""find . -maxdepth 1 -name "CLAUDE.md" -type fAs 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.
Read collaborative-stop-rule.md before Step 4. It defines what a stop presents, when the pre-build ask fires, what makes a choice expensive to walk back, and what to do with the answer. The skills this one hands work to follow the same file, which is what makes a stop feel the same whoever performed it.
Two constraints from that file govern every step below and are repeated here because they are the ones most easily lost:
Resolve where the running feedback record will be written, using the output base directory from the configuration
probed above. Absent any configuration, write it beside the work under .han/pairing/.
Name the file for this run so a second run in the same repository does not overwrite the first. State the path to the person in Step 4's plan, in one clause, BECAUSE a record they cannot find is not a record.
Read the file first if it already exists. A run resuming after an interrupted session inherits the record rather than starting a new one.
Split the request into concerns before sorting any of it. A request holding two concerns and sorted as one produces one kind, one set of boundaries, and one uninterrupted run through both, which is how a build and the work that depends on that build end up in the same turn with neither of them reviewed.
A concern is one thing the person asked for, with its own deliverable. Two asks joined by "and", "and then", "then help me", or a numbered list are two concerns whenever they produce two things the person would check separately. An edit to a file and a reply to a question are two deliverables even when they are about the same lines of code.
Changing code and understanding or answering a question are always separate concerns. This one takes no judgment. Never bundle them, whatever their subject, however small either one is, and however plainly the second follows from the first, BECAUSE checking an edit means reading a diff and checking an answer means reading the answer. Bundled, the answer arrives before the edit it rests on has been verified, so a wrong edit yields a confident wrong answer and the two pass unreviewed together.
Do not split one deliverable into concerns. The steps inside a single deliverable are pieces, and Step 4's plan divides them. Two concerns exist when the person would check two different artifacts, not when one artifact takes several steps.
Concerns run in sequence and never interleave. The last piece of one concern is a stop like any other, and the next concern does not begin until the person responds.
When you cannot tell whether the request holds one concern or two, treat it as two and say so in the plan, where the person can merge them back. An extra stop costs one turn. A missing one costs the review this whole loop exists to get.
Apply this test to each concern separately, in order, and stop at the first match:
tdd for a test-first build, refactor for restructuring, design-an-api for an interface contract,
iterative-plan-review for sharpening a plan, and plan-implementation for planning a build.The order is the tie-break. A concern matching more than one kind sorts as the earliest match, so drafting a decision record sorts as decision work rather than prose work. Concerns sort independently, so one request routinely yields a skill-backed concern and a prose concern side by side.
Never guess the discipline for skill-backed work. A concern to build something that does not say whether to drive it from tests, restructure what is there, or sketch a shape first is answered by proposing an approach in Step 4, never by picking one silently. A single concern may span more than one approach.
When a concern is too vague to sort, ask once. Name what was ambiguous and offer candidate readings. If the answer still does not settle it, propose a plan against the most likely reading and say that is what you did. Never sort a concern you could not read.
When a concern asks to understand something rather than produce something, this skill is the wrong one for it. Say
so and name where it goes: code-walkthrough for paced explanation of existing code, code-overview for a written
overview, research for an open question. Do not sort it as open-ended and propose a plan to build things. When it is
one concern among several, hand off that one and keep the rest in the plan rather than ending the run.
Before any work starts, present a short plan. It names:
What counts as one piece depends on the kind that concern sorted into:
| Kind of work | One piece is |
|---|---|
| Skill-backed | Whatever that skill already treats as one unit |
| Decision | One decision, with its context, the options weighed, and what it commits the person to |
| Prose | One rung of a fidelity ladder: the shape, then a rough draft, then the language |
| Open-ended | Whatever this plan names |
For prose, scale the ladder to the size of the work. Short work climbs the ladder once, whole. For longer work, agree the shape for the whole artifact first, then climb the remaining rungs section by section, naming the sections in this plan so they can be redirected. Sectioning only the later rungs keeps structural feedback ahead of surface feedback, which is the ordering the ladder exists for.
For skill-backed work the plan names the backing skill, the unit it stops at, and the reason — not the list of units. That skill builds its own list partway through its own run, so the list does not exist yet. Surface it at the first stop, where it can still be redirected.
When the plan sequences more than one backing skill, order them so each skill's own preconditions hold when its turn
arrives. refactor will not run alongside an unfinished test-driven loop, so a plan that sequences both closes the first
before starting the second.
Then wait. The person accepts the plan, changes it, or replaces it.
Repeat until the plan is finished or the person ends it. The loop walks the concerns in the order the plan named, and the pieces inside each one in the order the plan named.
If the plan marked this piece expensive to walk back, ask first, in a turn of its own. The ask opens this piece's turn, after the person has responded to the previous stop, or to the plan when this is the first piece. Name the dimension the choice turns on, offer no candidate answers, and end the turn. Never append the ask to that stop or plan, BECAUSE a reply to it is a reply to that alone and answers nothing about this piece.
When the reply arrives, write it into the record in the person's words, against this ask, then build. A declined answer is a complete one, and a question about the ask holds it open: answer it and end the turn again. The reply is not routed through Step 6, which handles replies to a stop.
When an earlier turn already bundled the ask into a stop or the plan and the reply spoke only to that, the ask was never posed on its own: present it now, on its own, before building.
Build one piece.
For skill-backed work, invoke the backing skill with the collaborative argument set, and forward the person's request and any constraints through unchanged. That skill runs its own job and stops at the boundary it already has. After the invocation returns, continue this loop explicitly BECAUSE the moment after a sub-skill call is where an orchestration most often stops and treats the sub-skill's output as its final answer.
When a backing skill is not available, name it and offer the choice between the open-ended path and installing the plugin that carries it. Never substitute silently — hand-rolling a refactoring skips the passing-test gate that skill exists to enforce.
For every other kind, build the piece yourself.
Present the stop, in the shape the stop rule specifies: position in the plan, what was built, what can be checked, what changed, and one line saying the reasoning is available for the asking.
When the piece closes a concern, say so in the position line and name the concern that comes next. That tells the person the next response starts different work, which is the moment their review matters most. That is a report about what comes next, never a question about it.
End the turn. Nothing further is built until the person responds. Starting the next concern is not an exception, however directly it follows from the one that just closed.
Write the response into the record, in the person's words and against the stop or ask it answers, before acting on it. When a recorded entry shapes this piece, name which entry it was.
Then route by what the feedback touches, per the stop rule:
A question holds the person's place; it never advances the work. Answer it and stop again at the same place.
When the person asks for more than one piece at a time, honor it as asked, present the pieces together, and return to the normal pace at the following stop without being asked to.
When the person says to finish without stopping, acknowledge it in the same turn and name what will now go unreviewed, then continue from the current plan and report at the end.
Report what was built, what the person's feedback changed, anything the plan named but did not reach, the state of any work a backing skill left mid-cycle, and where the feedback record was written.
Ending is the person's call throughout. Nothing here computes a stopping point, BECAUSE work being built produces no countable signal to compute over.
© testdouble, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in han-core/skills/pairing of testdouble/han.
Open the folder on GitHubat commit abba73a
Pairing 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 |
|---|---|---|---|---|---|---|
| Pairing this skilltestdouble/han | 279 | — | ~3.5k | Automated safety check: Pass | MIT | |
| Implementopen-octo/octo-agent | 125 | — | ~2.3k | Automated safety check: Pass | MIT | |
| Development Workflowrunceel/ReactiveProperty | 944 | — | ~1.4k | Automated safety check: Pass | MIT | |
| SDKkortix-ai/suna | 20k | — | ~9.6k | Automated safety check: Pass | Custom licence | |
| Technical Design Doc Creatortech-leads-club/agent-skills | 7k | — | ~13k | Automated safety check: Pass | Custom licence | |
| Nw TDD Review EnforcementnWave-ai/nWave | 617 | — | ~3.5k | Automated safety check: Pass | MIT |
open-octo/octo-agent
Implement a technical design by decomposing it into dependency-ordered vertical slices, executing each with TDD red-green, reviewing each via an isolated sub-agent, and persisting progress to a…
runceel/ReactiveProperty
ReactiveProperty repository development policy. An agent skill from runceel/ReactiveProperty.
kortix-ai/suna
The hard rules for editing @kortix/sdk (packages/sdk) — a PUBLISHED npm package with constraints no other package in this repo has: TDD is mandatory (failing test first, gates run and pasted every…
tech-leads-club/agent-skills
Creates comprehensive Technical Design Documents (TDD) with mandatory and optional sections through interactive discovery.
nWave-ai/nWave
Test design mandate enforcement, test budget validation, TDD phase validation (3-phase canon per ADR-025), and external validity checks for the software crafter reviewer
first-fluke/oh-my-agent
Evaluates system boundaries and tradeoffs and writes architecture recommendations, option comparisons or ADRs, with a Mermaid diagram when structure changes.
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
Build work collaboratively in reviewable pieces, handing each piece back for review before starting the next, so the person stays in the lead and steers while the work happens instead of reviewing a…. Pairing is an agent skill from testdouble/han. Build work collaboratively in reviewable pieces, handing each piece back for review before starting the next, so the person stays in the lead and steers while the work happens instead of reviewing a finished result.
Pairing fits situations like: someone says to pair with them on something; asks to collaborate rather than direct; wants to review as it goes; wants to guide the work piece by piece — on code.
Run `npx skills add testdouble/han --skill pairing -a claude-code`. Or copy the skill folder (han-core/skills/pairing in testdouble/han) into .claude/skills/pairing in your project. Claude Code loads it when a task matches its description.
Run `npx skills add testdouble/han --skill pairing -a codex`. Or copy the skill folder (han-core/skills/pairing in testdouble/han) into .agents/skills/pairing 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 pairing -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/pairing, .gemini/skills/pairing, .github/skills/pairing and .opencode/skills/pairing in your project.
Going by SKILL.md and its folder, Pairing needs the command-line tools its instructions call (bash). Its frontmatter pre-approves these tools: Read, Write, Edit, Glob, Grep, Skill, Bash(find *), Bash(bash "${CLAUDE_PLUGIN_ROOT}/scripts/han-config-dir.sh").
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. 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.
Pairing is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.5k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Pairing: Implement (open-octo/octo-agent, 125 stars), Development Workflow (runceel/ReactiveProperty, 944 stars), SDK (kortix-ai/suna, 20k stars) and Technical Design Doc Creator (tech-leads-club/agent-skills, 7k 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.