make-it-so
Skill1 starsChanged 28 days agoMITView on GitHub
Use when tickets are approved and it is time to build — test-first at agreed seams, layered verification, closed with roast-my-code and ship-log.
- Commits and pushes
In this repository37 other files it gives its agents.
- AGENTS.mdAGENTS.md
- plugin/AGENTS.mdAGENTS.md
- breakpointSkill
- expect-failSkill
- fork-itSkill
- make-it-soSkill
- no-thanksSkill
- receiptsSkill
- roast-my-codeSkill
- root-causeSkill
- save-asSkill
- scribeSkill
- setup-tnaSkill
- ship-logSkill
- breakpointSkill
- expect-failSkill
- fork-itSkill
- make-it-soSkill
- no-thanksSkill
- receiptsSkill
- roast-my-codeSkill
- root-causeSkill
- save-asSkill
- scribeSkill
- setup-tnaSkill
- ship-logSkill
- no-thanksSkill
- receiptsSkill
- breakpointSkill
- expect-failSkill
- fork-itSkill
- roast-my-codeSkill
- root-causeSkill
- save-asSkill
- scribeSkill
- setup-tnaSkill
- ship-logSkill
The file
We split this skill into the rules it gives an agent
12 rules. About 0 are common, 8 are distinctive, and 4 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈8
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 11
Before implementing, check for in-flight work touching the same area — open PRs, active branches, another session's worktree.
- Very specific: line 13
Use the expect-fail skill at pre-agreed seams, wherever possible.
- Distinctive: line 14
Run typechecking regularly, single test files regularly, and the full test suite once at the end.
- Very specific: line 15
When done, run the roast-my-code skill to review the work.
- Distinctive: line 29
When a verification step breaks (typecheck, test, lint, build):
- Distinctive: line 40
Every loop you enter — repair rounds, verification retries, research passes — declares its exit BEFORE the first iteration:
- Distinctive: line 50
When executing through subagents, every delegated prompt MUST include:
- Distinctive: line 62
Commit your work to the current branch once the user signs off (Iron Law 4 — commit is never a self-serve action).
- Distinctive: line 66
Before any expensive, irreversible, or shared-system action (commit, push, publish, delete, destructive migration), produce the dry-run in …
- Distinctive: line 81
Every failure that survives classification writes a structured lesson — the automatic tier under rule-inheritance:
- Very specific: line 87
Write it in the same message as the repair, appended under ## Lessons in the project's private .trust/lessons.md (create the file on first …
- Very specific: line 88
Before starting a structurally-similar task, read .trust/lessons.md and recall the matching lessons as priors — a recalled lesson is a …
≈ “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
Make It So
Implement the work the user described in the spec or tickets.
Before implementing, check for in-flight work touching the same area — open PRs, active branches, another session's worktree. On overlap, stop and ask: two sessions editing one area is a conflict, not a coincidence.
- Use the
expect-failskill at pre-agreed seams, wherever possible. - Run typechecking regularly, single test files regularly, and the full test suite once at the end.
- When done, run the
roast-my-codeskill to review the work. Its review-loop contract bounds the fix/re-review cycle — cap 3 rounds, then report to the human — so review never becomes an unbounded loop. - Record the work via the
ship-logskill.
Test-refusal gate (Iron Law 2)
The expect-fail Iron Law is NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST — it is not waivable by the same request that asks for the code.
- User declines tests ("no test runner", "I don't want tests", "just trust me") → STOP. Name the conflict in one line and ask once: "Tests are how the work is proven — do you want me to proceed without any verification, or pick a lighter option?" Lighter options, in order of preference: a zero-dependency assertion script run with plain
node, a smoke command against a real surface, or explicit acceptance of the risk in one sentence. - User declines every option but explicitly commands the change → the user still owns their code: write it. What cannot be negotiated away is the done claim, not their authority — report the ticket as "implemented, unverified", never "done", and keep that status until a real check runs. Record
decided_by: userin the receipt so the evidence gap is attributed, not hidden. - User picks any verification option → proceed test-first at that seam; the Iron Law holds.
- Record the outcome in the ticket's receipt:
decided_by: user, with the option chosen — so "who waived verification" is always answerable.
Repair receipt — the verification-failure contract
When a verification step breaks (typecheck, test, lint, build):
- Record a receipt BEFORE editing: subject (file + symbol), evidence (verbatim error), and the single fix you chose with why.
- Before each retry, classify the failure: missing capability, wrong instruction, environment gap, or context gap (the window lacked material the pass needed — never fetched, compacted away, or stale; repair by restoring the context, not by retrying the same window). Prefer the fix that repairs the class (a rule, a test, a config), not just this instance.
- Prove progress before retrying: if the workspace is unchanged since the failure (same
git diff HEADplus untracked files), a re-run cannot pass — the failing command and the code it tests are identical. Make a real change first (fix, config, dependency), then retry. Only a change that alters the tested input/output counts. - Change only the diagnosed subject per round. No drive-by refactors.
- Max two focused correction rounds for the same failure — then STOP: revert the failing chunk to last-known-good and report the diagnosis, both attempts, and remaining hypotheses to the user truthfully. No third round, even if the error count is still falling.
- A non-zero exit can never be reported as done. Every completed ticket cites its verification evidence.
Termination contract
Every loop you enter — repair rounds, verification retries, research passes — declares its exit BEFORE the first iteration:
- Success condition — categorical, checkable in one step (e.g. "typecheck + the failing test pass", "all 3 acceptance criteria met"). "Looks good" is not a success condition.
- Hard round cap — a number (default: 2 for the same failure). The cap is not a suggestion.
- Terminal action — what you MUST emit on the final round no matter what: report the evidence + remaining gaps to the user truthfully (stop), or ask the human a specific question (escalate). There is no "one more retry" on the final round.
Declaring all three before starting is what separates a bounded loop from a stall. Reaching the cap is a STOP with a report, never a silent continue. If the loop you are in was not declared up front, declare it now — in the next message — then honor it.
Delegation discipline (subagents)
When executing through subagents, every delegated prompt MUST include:
- The 3-line repo rules: (1) every file change is verified (typecheck/test/error output) before being called done; (2) no refactoring outside the requested scope; (3) no touching files outside the allowed path list.
- The 6 sections: TASK / EXPECTED OUTCOME / REQUIRED TOOLS / MUST DO / MUST NOT DO / CONTEXT.
- The 3 timing fields:
VERIFY:(the exact command, not "run the tests"),TIMEBOX:(wall-clock minutes),PARTIAL:(what the delegate returns if the TIMEBOX expires — evidence so far, no new work). A brief with no TIMEBOX has no partial-return trigger, and one with no exact VERIFY hands the definition of done to the delegate. The full template and a filled example live in this skill; AGENTS.md §5 pins the contract.
A vague prompt means the subagent improvises. Subagent results are verified by the orchestrator — never trusted from the report alone.
UI verification
Changes touching UI/data must be checked in a browser with real data (not unit-test fixtures) before being called done — real data catches bugs invisible to static checks: per-day rows appearing as separate entities, duplicate names across groups, empty columns. Light check (1-2 snapshots + 1 screenshot) for small changes; full check (explore + interact) for new features or refactors spanning 3+ files.
Commit your work to the current branch once the user signs off (Iron Law 4 — commit is never a self-serve action).
Dry-run gate (Iron Law 4)
Before any expensive, irreversible, or shared-system action (commit, push, publish, delete, destructive migration), produce the dry-run in this order — and do NOT perform the action until the human signs off:
- Proposed action — the exact command or edit, one line. Not "push changes" —
git push origin master. - Predicted effects — 3-6 concrete effects + the estimated number of things affected (files, rows, users, systems).
- Irreversibility — 1 to 5, with the rubric: read-only = 1; reversible local edit = 2; config/state change = 3; deletes or rewrites without easy undo = 4; destroys data or reaches shared systems = 5.
- Severity —
low/medium/high/block(what breaks if this goes wrong).
Then the gate: irreversibility ≥ 4 OR severity block ⇒ MUST ask the human, regardless of your own assessment. No self-made Ruling can override this — Iron-Law-4 actions are never a self-made decision (WORKFLOW.md rule 4). Verdict line records decided_by: hard_cap | agent_judgment with the human's answer, so the receipt names who decided.
Operational claims (beyond code)
When the ticket touches migrations, data fixes, external side effects, or async jobs, its success claim is not a code claim: follow receipts' Operational claims class — receipt the named target's terminal state (which system, what actually changed, declared delivery semantics), not the fact that a command exited 0. Exit codes prove the command ran; only target-state proves it worked.
Lessons (memory tier below rules)
Every failure that survives classification writes a structured lesson — the automatic tier under rule-inheritance:
Lesson: root_cause = <the specific broken feature, one sentence> | correction = <one imperative sentence>- Write it in the same message as the repair, appended under
## Lessonsin the project's private.trust/lessons.md(create the file on first entry). Root cause names the feature, not the symptom; correction is imperative, not descriptive. - Before starting a structurally-similar task, read
.trust/lessons.mdand recall the matching lessons as priors — a recalled lesson is a prompt, not a gate; it never blocks work. - Lessons rot: a lesson older than 21 days is stale until re-verified against current behavior with
node scripts/stale-probe.mjs --allow-exec(each lesson may carry aProbe: <exact command>line; exit 0 = re-verified; probes execute only with the explicit--allow-execsign-off — the default run is read-only and fail-closed). Only a lesson whose verdict is fresh or re-verified may gate a decision — a dead lesson (its probe now fails) or an unverifiable one (no probe, undated, or probes not run) cannot gate live work; report it for correction or deletion instead of obeying it. - Lessons are NOT rules: rules are gated, scoped, reversible (rule-inheritance); a lesson becomes a rule only when the same failure recurs — that recurrence is the trigger, and the rule lands via the gate, not here.
Rationalization table
| Excuse | Reality |
| "I'll refactor while I'm here" | Out of scope — log it as a review finding instead |
| "The error is flaky, rerun" | Read the error — a rerun without classification is a guess |
| "Let's rerun and see" (workspace unchanged) | A retry without a change is the same failure twice — prove progress first |
| "One more round won't hurt" | The two-round cap exists because round three rarely improves |
| "Just one more retry, I feel it" | Undeclared loop — state the success condition, the cap, and the terminal action before round one |
| "Skip this check, tests are slow" | Skipped verification is a lie with extra steps |
| "User said no tests, so I flagged it and coded anyway" | Flag-then-proceed is a negotiated Iron Law — invoke the test-refusal gate: offer a lighter option, stop if every option is declined |
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.

