Skip to content

Commit 4073968

Browse files
brabojclaude
andauthored
docs(decisions): upstream requires README, AGENTS.md and CLAUDE.md and prescribes no structure (#1964)
Part of #1944. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 4090951 commit 4073968

3 files changed

Lines changed: 12 additions & 9 deletions

File tree

‎docs/decisions/050-what-stays-upstream.md‎

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,11 @@ every answer to those questions moves to forks.
4848
upstream right for all of them, and each fork supplies its own answer.
4949
- History-safety rules in git hold for every team; branch prefixes and title
5050
forms are one team's choice.
51-
- Recording decisions is documentation practice any team benefits from; only
52-
a project's categories are its own.
51+
- Which documents a project keeps, and how each is laid out, differ across
52+
teams and organisations. Upstream requires only the documents every
53+
project needs, `README.md`, `AGENTS.md` and `CLAUDE.md`, and prescribes
54+
no document's structure, so the core stays as lean as the waist test
55+
allows.
5356

5457
## Design
5558

@@ -59,11 +62,11 @@ every answer to those questions moves to forks.
5962
| - | ---- | ----------- |
6063
| 1 | The waist test | A rule stays upstream only if changing the stack, the platform or the team's way of working would not change it |
6164
| 2 | Engine upstream | The manifest schema, IDs, EXTEND and OVERRIDE, the resolver, `tools/`, `tests/`, and a fixture stack and platform as test input |
62-
| 3 | Shared policy upstream | `core/`: config, oop, quality, testing, readme, the review checklists, and `agents.md` as the output contract; `security/`, `data/`, `infra/`, `backend/` and `frontend/` |
65+
| 3 | Shared policy upstream | `core/`: config, oop, quality, testing, the review checklists, and `agents.md` as the output contract; `security/`, `data/`, `infra/`, `backend/` and `frontend/` |
6366
| 4 | Rules, not language checks | `core/` states each idiom's rule language-neutrally and carries no language-specific code; the check moves with `language/`, which leaves upstream whole (#1926) |
6467
| 5 | Governance asks, forks answer | Upstream asks who approves a change, how work is tracked and what a release is, and answers none of them. Labels, milestones, merge and review policy, the journal, wrap-up and the release cut move to forks |
6568
| 6 | Git splits | Upstream keeps never force-push, never rebase a pushed branch, one concern per pull request, committer identity, submodules, off-limits paths and `.gitignore`. Branch prefixes, commit and title form, squash policy, versioning and the release process move |
66-
| 7 | Decision records stay upstream | The ADR threshold, the record layout, the immutability rules and the schema and layout checks; a fork sets only its categories and the record its layout binds from |
69+
| 7 | Required documents, no structure | Upstream requires `README.md`, `AGENTS.md` and `CLAUDE.md` and prescribes no document's structure. `core/readme.md`, decision records (threshold, layout, immutability, schema and layout checks), the changelog format, arc42, and the ONBOARDING, PLAYBOOK and journal rules move |
6770
| 8 | Workflow moves | All of `workflow/` moves, `release.md` included. From `quality-gates.md`, how a check is built stays; when gates run moves: the three-layer gate model, thresholds and periodic audits |
6871
| 9 | Ends move | `stack/`, `platform/`, `INTERVIEW.md`, `examples/`, `generated/`, `backend/templating.md`, `language/`, and `core/` cli, skills and examples |
6972
| 10 | Concern directories | Upstream drops `base/`: `core/`, `security/`, `data/` and `infra/` sit beside `backend/` and `frontend/` under `templates/` (#1504) |
@@ -96,7 +99,7 @@ leaves it for the project or its fork to fill in:
9699
| Keep the 2026-09-12 map, with the release rules and gate model upstream | The release cut and the gate schedule are one team's answers, and they would keep the file wrong for teams that work otherwise. |
97100
| Keep governance upstream and let forks OVERRIDE it | Every fork inherits answers it must find and undo, and a missed one silently governs its projects. |
98101
| Move the whole git policy to forks | The history-safety rules hold for every team, and a project with no fork would lose them. |
99-
| Move decision records to forks | Every fork would rebuild the same threshold, layout and check. |
102+
| Keep decision records and the README structure upstream | A record's layout and a README's sections are one organisation's structure; a fork that works otherwise would have to find and override them, and a lean core outweighs each fork keeping its own. |
100103
| Split by whole file | Three files mix policy and process, so either half would land on the wrong side. |
101104
| Fold each language check into `core/` beside its rule | A Python check changes with the stack, so it fails rule 1, and language code in `core/` grows every chain, the non-Python ones included. |
102105

‎docs/diagrams/template-boundary.drawio‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,18 @@
99
<mxCell id="g1" parent="1" style="rounded=1;arcSize=2;whiteSpace=wrap;html=1;fillColor=#F8FAFC;strokeColor=#CBD5E1;strokeWidth=1.5;align=left;verticalAlign=top;spacingLeft=16;spacingTop=10;fontFamily=Segoe UI;fontSize=14;fontColor=#334155;fontStyle=1;" value="Upstream: solid-ai-templates" vertex="1"><mxGeometry x="30" y="100" width="690" height="592" as="geometry" /></mxCell>
1010
<mxCell id="g2" parent="1" style="rounded=1;arcSize=2;whiteSpace=wrap;html=1;fillColor=#F8FAFC;strokeColor=#CBD5E1;strokeWidth=1.5;align=left;verticalAlign=top;spacingLeft=16;spacingTop=10;fontFamily=Segoe UI;fontSize=14;fontColor=#334155;fontStyle=1;" value="Each fork" vertex="1"><mxGeometry x="750" y="100" width="660" height="592" as="geometry" /></mxCell>
1111
<mxCell id="u0" parent="1" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FEF3C7;gradientColor=#FFFFFF;gradientDirection=north;strokeColor=#B45309;strokeWidth=1.6;shadow=1;align=center;fontFamily=Segoe UI;fontColor=#0F172A;spacing=6;" value="&lt;b style=&#x27;font-size:13px;color:#0F172A&#x27;&gt;Engine&lt;/b&gt;&lt;br&gt;&lt;span style=&#x27;font-size:11px;color:#92400E&#x27;&gt;manifest schema, IDs, EXTEND and OVERRIDE, resolver,&lt;br&gt;tools/, tests/, a fixture stack and platform&lt;/span&gt;" vertex="1"><mxGeometry x="60" y="150" width="630" height="62" as="geometry" /></mxCell>
12-
<mxCell id="u1" parent="1" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FEF3C7;gradientColor=#FFFFFF;gradientDirection=north;strokeColor=#B45309;strokeWidth=1.6;shadow=1;align=center;fontFamily=Segoe UI;fontColor=#0F172A;spacing=6;" value="&lt;b style=&#x27;font-size:13px;color:#0F172A&#x27;&gt;Shared engineering policy&lt;/b&gt;&lt;br&gt;&lt;span style=&#x27;font-size:11px;color:#92400E&#x27;&gt;core/: config, oop, quality, testing, readme, review checklists, agents.md&lt;br&gt;security/, data/, infra/, backend/, frontend/&lt;/span&gt;" vertex="1"><mxGeometry x="60" y="226" width="630" height="62" as="geometry" /></mxCell>
12+
<mxCell id="u1" parent="1" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FEF3C7;gradientColor=#FFFFFF;gradientDirection=north;strokeColor=#B45309;strokeWidth=1.6;shadow=1;align=center;fontFamily=Segoe UI;fontColor=#0F172A;spacing=6;" value="&lt;b style=&#x27;font-size:13px;color:#0F172A&#x27;&gt;Shared engineering policy&lt;/b&gt;&lt;br&gt;&lt;span style=&#x27;font-size:11px;color:#92400E&#x27;&gt;core/: config, oop, quality, testing, review checklists, agents.md&lt;br&gt;security/, data/, infra/, backend/, frontend/&lt;/span&gt;" vertex="1"><mxGeometry x="60" y="226" width="630" height="62" as="geometry" /></mxCell>
1313
<mxCell id="u2" parent="1" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FEF3C7;gradientColor=#FFFFFF;gradientDirection=north;strokeColor=#B45309;strokeWidth=1.6;shadow=1;align=center;fontFamily=Segoe UI;fontColor=#0F172A;spacing=6;" value="&lt;b style=&#x27;font-size:13px;color:#0F172A&#x27;&gt;Language idioms, as rules&lt;/b&gt;&lt;br&gt;&lt;span style=&#x27;font-size:11px;color:#92400E&#x27;&gt;stated in core/ with no language code&lt;/span&gt;" vertex="1"><mxGeometry x="60" y="302" width="630" height="62" as="geometry" /></mxCell>
1414
<mxCell id="u3" parent="1" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FEF3C7;gradientColor=#FFFFFF;gradientDirection=north;strokeColor=#B45309;strokeWidth=1.6;shadow=1;align=center;fontFamily=Segoe UI;fontColor=#0F172A;spacing=6;" value="&lt;b style=&#x27;font-size:13px;color:#0F172A&#x27;&gt;Questions every project answers&lt;/b&gt;&lt;br&gt;&lt;span style=&#x27;font-size:11px;color:#92400E&#x27;&gt;who approves a change, how work is tracked,&lt;br&gt;what a release is&lt;/span&gt;" vertex="1"><mxGeometry x="60" y="378" width="630" height="62" as="geometry" /></mxCell>
1515
<mxCell id="u4" parent="1" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FEF3C7;gradientColor=#FFFFFF;gradientDirection=north;strokeColor=#B45309;strokeWidth=1.6;shadow=1;align=center;fontFamily=Segoe UI;fontColor=#0F172A;spacing=6;dashed=1;dashPattern=6 4;" value="&lt;b style=&#x27;font-size:13px;color:#0F172A&#x27;&gt;git.md: safety&lt;/b&gt;&lt;br&gt;&lt;span style=&#x27;font-size:11px;color:#92400E&#x27;&gt;never force-push, never rebase a pushed branch,&lt;br&gt;one concern per pull request&lt;/span&gt;" vertex="1"><mxGeometry x="60" y="454" width="630" height="62" as="geometry" /></mxCell>
16-
<mxCell id="u5" parent="1" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FEF3C7;gradientColor=#FFFFFF;gradientDirection=north;strokeColor=#B45309;strokeWidth=1.6;shadow=1;align=center;fontFamily=Segoe UI;fontColor=#0F172A;spacing=6;dashed=1;dashPattern=6 4;" value="&lt;b style=&#x27;font-size:13px;color:#0F172A&#x27;&gt;docs.md: records and writing&lt;/b&gt;&lt;br&gt;&lt;span style=&#x27;font-size:11px;color:#92400E&#x27;&gt;decision records, writing style, README, generated files&lt;/span&gt;" vertex="1"><mxGeometry x="60" y="530" width="630" height="62" as="geometry" /></mxCell>
16+
<mxCell id="u5" parent="1" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FEF3C7;gradientColor=#FFFFFF;gradientDirection=north;strokeColor=#B45309;strokeWidth=1.6;shadow=1;align=center;fontFamily=Segoe UI;fontColor=#0F172A;spacing=6;dashed=1;dashPattern=6 4;" value="&lt;b style=&#x27;font-size:13px;color:#0F172A&#x27;&gt;docs.md: required documents and writing&lt;/b&gt;&lt;br&gt;&lt;span style=&#x27;font-size:11px;color:#92400E&#x27;&gt;README, AGENTS.md, CLAUDE.md; writing style, generated files&lt;/span&gt;" vertex="1"><mxGeometry x="60" y="530" width="630" height="62" as="geometry" /></mxCell>
1717
<mxCell id="u6" parent="1" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#FEF3C7;gradientColor=#FFFFFF;gradientDirection=north;strokeColor=#B45309;strokeWidth=1.6;shadow=1;align=center;fontFamily=Segoe UI;fontColor=#0F172A;spacing=6;dashed=1;dashPattern=6 4;" value="&lt;b style=&#x27;font-size:13px;color:#0F172A&#x27;&gt;quality-gates.md: building a check&lt;/b&gt;&lt;br&gt;&lt;span style=&#x27;font-size:11px;color:#92400E&#x27;&gt;freeze instances, pair a constraint with its check,&lt;br&gt;run the check in the form it ships&lt;/span&gt;" vertex="1"><mxGeometry x="60" y="606" width="630" height="62" as="geometry" /></mxCell>
1818
<mxCell id="f0" parent="1" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#F1F5F9;gradientColor=#FFFFFF;gradientDirection=north;strokeColor=#475569;strokeWidth=1.6;shadow=1;align=center;fontFamily=Segoe UI;fontColor=#0F172A;spacing=6;" value="&lt;b style=&#x27;font-size:13px;color:#0F172A&#x27;&gt;Stacks and platforms&lt;/b&gt;&lt;br&gt;&lt;span style=&#x27;font-size:11px;color:#475569&#x27;&gt;stack/, platform/, INTERVIEW.md,&lt;br&gt;examples/, generated/, backend/templating.md&lt;/span&gt;" vertex="1"><mxGeometry x="780" y="150" width="600" height="62" as="geometry" /></mxCell>
1919
<mxCell id="f1" parent="1" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#F1F5F9;gradientColor=#FFFFFF;gradientDirection=north;strokeColor=#475569;strokeWidth=1.6;shadow=1;align=center;fontFamily=Segoe UI;fontColor=#0F172A;spacing=6;" value="&lt;b style=&#x27;font-size:13px;color:#0F172A&#x27;&gt;Workflow&lt;/b&gt;&lt;br&gt;&lt;span style=&#x27;font-size:11px;color:#475569&#x27;&gt;workflow/: ai-workflow, 360, scope, issues, communication,&lt;br&gt;compression, two-pass-review, release&lt;/span&gt;" vertex="1"><mxGeometry x="780" y="226" width="600" height="62" as="geometry" /></mxCell>
20-
<mxCell id="f2" parent="1" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#F1F5F9;gradientColor=#FFFFFF;gradientDirection=north;strokeColor=#475569;strokeWidth=1.6;shadow=1;align=center;fontFamily=Segoe UI;fontColor=#0F172A;spacing=6;" value="&lt;b style=&#x27;font-size:13px;color:#0F172A&#x27;&gt;Process and tooling&lt;/b&gt;&lt;br&gt;&lt;span style=&#x27;font-size:11px;color:#475569&#x27;&gt;core/: cli, skills, examples&lt;br&gt;language/: every file, checks included&lt;/span&gt;" vertex="1"><mxGeometry x="780" y="302" width="600" height="62" as="geometry" /></mxCell>
20+
<mxCell id="f2" parent="1" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#F1F5F9;gradientColor=#FFFFFF;gradientDirection=north;strokeColor=#475569;strokeWidth=1.6;shadow=1;align=center;fontFamily=Segoe UI;fontColor=#0F172A;spacing=6;" value="&lt;b style=&#x27;font-size:13px;color:#0F172A&#x27;&gt;Process and tooling&lt;/b&gt;&lt;br&gt;&lt;span style=&#x27;font-size:11px;color:#475569&#x27;&gt;core/: cli, skills, examples, readme&lt;br&gt;language/: every file, checks included&lt;/span&gt;" vertex="1"><mxGeometry x="780" y="302" width="600" height="62" as="geometry" /></mxCell>
2121
<mxCell id="f3" parent="1" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#F1F5F9;gradientColor=#FFFFFF;gradientDirection=north;strokeColor=#475569;strokeWidth=1.6;shadow=1;align=center;fontFamily=Segoe UI;fontColor=#0F172A;spacing=6;" value="&lt;b style=&#x27;font-size:13px;color:#0F172A&#x27;&gt;Answers to the questions&lt;/b&gt;&lt;br&gt;&lt;span style=&#x27;font-size:11px;color:#475569&#x27;&gt;labels, milestones, merge and review policy,&lt;br&gt;journal, wrap-up, release cut&lt;/span&gt;" vertex="1"><mxGeometry x="780" y="378" width="600" height="62" as="geometry" /></mxCell>
2222
<mxCell id="f4" parent="1" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#F1F5F9;gradientColor=#FFFFFF;gradientDirection=north;strokeColor=#475569;strokeWidth=1.6;shadow=1;align=center;fontFamily=Segoe UI;fontColor=#0F172A;spacing=6;dashed=1;dashPattern=6 4;" value="&lt;b style=&#x27;font-size:13px;color:#0F172A&#x27;&gt;git.md: workflow&lt;/b&gt;&lt;br&gt;&lt;span style=&#x27;font-size:11px;color:#475569&#x27;&gt;branch prefixes, commit and title form, squash,&lt;br&gt;versioning, release process&lt;/span&gt;" vertex="1"><mxGeometry x="780" y="454" width="600" height="62" as="geometry" /></mxCell>
23-
<mxCell id="f5" parent="1" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#F1F5F9;gradientColor=#FFFFFF;gradientDirection=north;strokeColor=#475569;strokeWidth=1.6;shadow=1;align=center;fontFamily=Segoe UI;fontColor=#0F172A;spacing=6;dashed=1;dashPattern=6 4;" value="&lt;b style=&#x27;font-size:13px;color:#0F172A&#x27;&gt;docs.md: process&lt;/b&gt;&lt;br&gt;&lt;span style=&#x27;font-size:11px;color:#475569&#x27;&gt;development journal, ONBOARDING and PLAYBOOK structure,&lt;br&gt;release changelog&lt;/span&gt;" vertex="1"><mxGeometry x="780" y="530" width="600" height="62" as="geometry" /></mxCell>
23+
<mxCell id="f5" parent="1" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#F1F5F9;gradientColor=#FFFFFF;gradientDirection=north;strokeColor=#475569;strokeWidth=1.6;shadow=1;align=center;fontFamily=Segoe UI;fontColor=#0F172A;spacing=6;dashed=1;dashPattern=6 4;" value="&lt;b style=&#x27;font-size:13px;color:#0F172A&#x27;&gt;docs.md: structure and process&lt;/b&gt;&lt;br&gt;&lt;span style=&#x27;font-size:11px;color:#475569&#x27;&gt;decision records, journal, ONBOARDING, PLAYBOOK, arc42,&lt;br&gt;changelog format&lt;/span&gt;" vertex="1"><mxGeometry x="780" y="530" width="600" height="62" as="geometry" /></mxCell>
2424
<mxCell id="f6" parent="1" style="rounded=1;arcSize=8;whiteSpace=wrap;html=1;fillColor=#F1F5F9;gradientColor=#FFFFFF;gradientDirection=north;strokeColor=#475569;strokeWidth=1.6;shadow=1;align=center;fontFamily=Segoe UI;fontColor=#0F172A;spacing=6;dashed=1;dashPattern=6 4;" value="&lt;b style=&#x27;font-size:13px;color:#0F172A&#x27;&gt;quality-gates.md: when gates run&lt;/b&gt;&lt;br&gt;&lt;span style=&#x27;font-size:11px;color:#475569&#x27;&gt;the three-layer gate model, thresholds,&lt;br&gt;periodic audits&lt;/span&gt;" vertex="1"><mxGeometry x="780" y="606" width="600" height="62" as="geometry" /></mxCell>
2525
<mxCell id="t3" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=left;verticalAlign=top;fontFamily=Segoe UI;fontSize=12;fontColor=#475569;" value="IDs do not change: a template or section that moves keeps its ID, so a fork&#x27;s EXTEND and OVERRIDE directives still resolve." vertex="1"><mxGeometry x="30" y="712" width="1380" height="24" as="geometry" /></mxCell>
2626
<mxCell id="lg-0s" parent="1" style="rounded=1;arcSize=20;whiteSpace=wrap;html=1;gradientColor=#FFFFFF;gradientDirection=north;strokeWidth=1.6;fillColor=#FEF3C7;strokeColor=#B45309;" value="" vertex="1"><mxGeometry x="34" y="759" width="24" height="18" as="geometry" /></mxCell>
14 KB
Loading

0 commit comments

Comments
 (0)