sf-handoff
Skill1 starsChanged 40 days agoMITView on GitHub
Use when every spec is approved and the spec set has to leave the factory.
1 other project uses a version of this.
Adopted by
Most recently taken up by
- ya222/skillforgetheir own version, first seen Oct 20, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- ya222/skillforge★ 1same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository13 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- specs/CLAUDE.mdCLAUDE.md
- sf-grillSkill
- sf-ideaSkill
- sf-improveSkill
- sf-ingestSkill
- sf-prdSkill
- sf-reviewSkill
- sf-specSkill
- sf-tddSkill
- sf-uxSkill
- specfactorySkill
The file
We split this skill into the rules it gives an agent
11 rules. About 0 are common, 7 are distinctive, and 4 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈7
Distinctive · estimate
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 12
Call it with the destination directory.
- Distinctive: line 13
When the owner named none, ask for one and stop.
- Very specific: line 17
Run python ${CLAUDE_PLUGIN_ROOT}/scripts/sf_status.py --root .
- Very specific: line 20
Add --root <run directory> to both when the chain is not in the current directory, and to the export in step 3 as well.
- Distinctive: line 21
All three read the same tree or the gate answers for one chain while the export ships another.
- Distinctive: line 68
every file the export wrote, and the total
- Distinctive: line 71
every question the chain parked, so the receiving factory reads the gaps in the specs rather than discovering them
- Very specific: line 78
Never set approved:; only a human does, by running python ${CLAUDE_PLUGIN_ROOT}/scripts/sf_approve.py <path> --root ..
- Very specific: line 79
Never edit an artifact, and never edit a ratified anchors section.
- Distinctive: line 80
Never export a chain carrying a row that is not approved, and never export part of one.
- Distinctive: line 81
Never write a format the target factory did not ask for.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
sf-handoff
The last stage: the approved spec set leaves for the factory that will build from it. You export, you report, and you refuse. You never draft, never approve, and never edit a spec to make a check pass.
Call it with the destination directory. When the owner named none, ask for one and stop; where a handoff lands is not a default worth guessing.
1. Read the chain
Run python ${CLAUDE_PLUGIN_ROOT}/scripts/sf_status.py --root . and print the table it returns.
Then run python ${CLAUDE_PLUGIN_ROOT}/scripts/sf_trace.py --check --root . and print what it says, line for line.
Add --root <run directory> to both when the chain is not in the current directory, and to the export in step 3 as well.
All three read the same tree or the gate answers for one chain while the export ships another.
2. Refuse unless the chain is finished
| Check | Where it comes from | Passes when |
| status | the status column | every artifact the weight requires is approved |
| lint | the lint column | PASS |
| open findings | the open findings column | 0 |
| traceability | python ${CLAUDE_PLUGIN_ROOT}/scripts/sf_trace.py --check --root . | no orphan in either direction |
| obligations | python ${CLAUDE_PLUGIN_ROOT}/scripts/sf_status.py --root . obligations table | none open |
An open obligation is a correction the chain still owes, so the handoff refuses it as NOT_RUN: OBL-n is open against <target> and sf_export.py refuses it as well, every format and --force included.
draft, reviewed, stale (affected), and stale (upstream only) are all not approved.
A reviewed artifact is waiting on the owner: print python ${CLAUDE_PLUGIN_ROOT}/scripts/sf_approve.py <path> --root . and stop, rather than handing over something nobody signed.
Which artifacts the weight requires, read from the first artifact that exists:
side: the brief and the specs, with UX only where the run produced one. The PRD and the TDD areNOT_APPLICABLEat that weight and their rows readmissing; that is the one absence that is not a refusal. Say which weight you read and where.standardandenterprise: the idea, the PRD, the TDD with its ADRs, and the specs, with UX where the run produced one.
The cross-model check is reported rather than required.
Codex is not on every machine, so a NOT_ verdict is an honest record of a check that did not run and it does not block the handoff; a FAIL does, because it means a findings file was recorded and is not there.
Either way the verdict goes in the summary, per artifact, with its reason.
Refuse as NOT_RUN: <what is not finished>, one line per row that failed a check, and stop.
A partial export is worse than none: it reads downstream as the whole spec set.
3. Export
python ${CLAUDE_PLUGIN_ROOT}/scripts/sf_export.py --format raw --out <destination> --root .with the same --root <run directory> step 1 used, so the tree that passed the gate is the tree that ships.
raw is the only format until somebody describes the target factory's intake format.
It is the spec files as they are, copied byte for byte, so the target receives exactly what the owner approved and nothing this stage decided for them.
A new intake format is a new entry in the export script's format registry, and choosing one is the owner's call, never yours.
The export refuses a destination that already holds files, because an export mixed with what was there is not the spec set. Name an empty directory; never clear one without asking.
4. Print the summary
- the format and the destination
- every file the export wrote, and the total
- the requirement and spec counts
sf_trace.py --checkreported - the cross-model verdict per artifact, with its reason. Any artifact whose verdict is not
PASSmakes the summary readhandoff-ready, not all green, on the same line as the verdict and the reason it carries, so nobody downstream reads aNOT_RUNas a check that passed - every question the chain parked, so the receiving factory reads the gaps in the specs rather than discovering them
Say the handoff is complete only once the export returned and every check in step 2 passed. Otherwise say which check stopped it and what the owner has to do next.
What sf-handoff never does
Never set approved:; only a human does, by running python ${CLAUDE_PLUGIN_ROOT}/scripts/sf_approve.py <path> --root ..
Never edit an artifact, and never edit a ratified anchors section; an approved artifact changes only through a proposal under docs/factory/changes/.
Never export a chain carrying a row that is not approved, and never export part of one.
Never write a format the target factory did not ask for.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

