forge-ddr
Skill1 starsChanged 42 days agoApache-2.0View on GitHub
Capture a design decision made mid-session into decisions/ as a new DDR. Use when you (or the user) make a non-obvious choice worth recording — a library, pattern, or tradeoff pick, a scope cut, a reversal of an earlier decision — or when the user explicitly asks to "write a DDR" / "record this decision".
In this repository6 other files it gives its agents.
- skills/AGENTS.mdAGENTS.md
- forge-freezeSkill
- forge-initSkill
- forge-intakeSkill
- forge-reviewSkill
- forge-triageSkill
The file
We split this skill into the rules it gives an agent
2 rules. About 0 are common, 1 is distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 22
Confirm the decision is settled: If the user is still weighing options, don't stage a DDR yet — keep discussing until there's an actual …
- Very specific: line 56
Stage it: Write the draft as JSON to .forge/ddr/<slug>.json in the record root:
≈ “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
forge-ddr
Records one decision as a DDR-###-slug.md concept in the record's decisions/. This skill is conversation and
judgment only — it never writes into decisions/ directly. forge ddr apply does that
write, so the id allocation and file shape stay deterministic and consistent no matter
which agent runs this skill.
When to use this
Per this repo's own rule (CLAUDE.md #3): a DDR is for a non-obvious choice — something a future reader would otherwise have to reverse-engineer from the diff. Routine, expected implementation work doesn't need one. If you're unsure whether a choice is DDR-worthy, ask the user rather than skipping it or writing one reflexively.
Steps
- Confirm the decision is settled. If the user is still weighing options, don't stage a DDR yet — keep discussing until there's an actual decision to record.
- Draft the content:
title— short, specific (e.g. "Pivot: Forge is the design record, not the build tool", not "Pivot").slug— lowercase, hyphenated, derived from the title (e.g.pivot-design-record).status—draftunless the user has explicitly signed off on it as final, in which caseaccepted. Never writeacceptedon your own judgment alone.date— when the decision was actually made,YYYY-MM-DD. Omit it for a decision made now; set it when back-filling history, which is the case a default of "today" gets wrong on every entry.contextSource— what triggered this (a meeting, a transcript, this conversation, an exploration branch). Be specific enough that someone reading it in six months knows where to go for more detail.reach—projectorgeneral. Ask it once, here, with two questions: does the why name this project's users, brand, or constraint? Thenproject. Would the decision hold on a project with a different client — a house rule, a standing practice? Thengeneral. Both true:projectnow; it earnsgeneralwhen it recurs somewhere else. A file without the field reads asproject, so write the field rather than rely on the default — the point is that a developer inheriting the repo can tell house style from this-project-only without reading every why.audience—ownerorstakeholders. A decision stays with the creator by default, because it carries the alternatives it beat and those may be a client's business. Setstakeholdersonly when the why is the stakeholder's to read — then it crosses at publish and shows on the release hub. Leave it out otherwise; absent isowner.decision— one paragraph, plainly stating what was decided.why— the forces at play and the reasoning. This is the part that actually earns a DDR instead of a commit message; don't skip it.alternativesRejected(optional but usually worth including) — what else was considered and why it lost.consequences(optional) — what this makes easier, what it makes harder, what it commits the project to.
- Stage it. Write the draft as JSON to
.forge/ddr/<slug>.jsonin the record root:
({ "title": "...", "status": "draft", "date": "2026-05-06", "contextSource": "...", "reach": "project", "audience": "owner", "decision": "...", "why": "...", "alternativesRejected": "...", "consequences": "..." }.forge/is staging, not the record — writing here directly is fine.) - Apply it:
This allocates the nextforge ddr apply <slug>DDR-###id (scanningdecisions/for the current max — ids are never reused or renumbered) and writesDDR-###-<slug>.mdinto the record's decisions folder. It fails with a clear error if a required field is missing,statusisn'tdraft/accepted/superseded (by DDR-###), orreachisn'tproject/general— fix the staged JSON and rerun rather than hand-editing the output file. - Run
forge doctorand fix anything it reports. This is the last step of every skill — don't skip it because the apply step succeeded. Changing an earlier decision: say which, and which way. Accepted DDRs are immutable content-wise (
forge doctorenforces this), so an earlier decision is never rewritten. There are two ways to change one and they are different facts:- Replaced wholesale — the older DDR's
decision_statusbecomessupersededwith asuperseded_bylink. Only that changes; never rewrite its body. - Part of it changed, the rest still stands — the far more common case. The older DDR
keeps
decision_status: acceptedand gainsamended_by: [DDR-###], which is the one edit the immutability rule permits. Put"amends": ["DDR-###"]in the staged JSON so the new decision declares it too:forge doctorchecks that both halves agree, and it reads that key rather than your prose, so writing "this amends DDR-###" in the body alone records nothing.
Reach for
supersededonly when nothing in the older decision still holds. Marking an amendment as superseded asserts something false about the parts still in force.- Replaced wholesale — the older DDR's
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.

