You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 4090951
Browse filesBrowse the repository at this point in the historyBrowse files
feat(templates): state the language idioms as rules in core, checks stay with language/ (#1926) (#1963)
ADR-050 rule 4 is rewritten in place: core carries no language-specific
code, because a Python check fails the waist test and grows every chain.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: docs/decisions/050-what-stays-upstream.md
+5-4Lines changed: 5 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -53,19 +53,19 @@ every answer to those questions moves to forks.
53
53
54
54
## Design
55
55
56
-

56
+

57
57
58
58
| # | Rule | In practice |
59
59
| - | ---- | ----------- |
60
60
| 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 |
61
61
| 2 | Engine upstream | The manifest schema, IDs, EXTEND and OVERRIDE, the resolver, `tools/`, `tests/`, and a fixture stack and platform as test input |
62
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/`|
63
-
| 4 |Language idioms as checks |Each idiom becomes the language-specific check beside its generic rule in `core/`, and `language/`leaves upstream (#1926) |
63
+
| 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) |
64
64
| 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 |
65
65
| 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
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 |
67
67
| 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 |
68
-
| 9 | Ends move |`stack/`, `platform/`, `INTERVIEW.md`, `examples/`, `generated/`, `backend/templating.md`, the `language/` Tooling sections, `go.md`, `c.md`, and `core/` cli, skills and examples |
68
+
| 9 | Ends move |`stack/`, `platform/`, `INTERVIEW.md`, `examples/`, `generated/`, `backend/templating.md`, `language/`, and `core/` cli, skills and examples |
69
69
| 10 | Concern directories | Upstream drops `base/`: `core/`, `security/`, `data/` and `infra/` sit beside `backend/` and `frontend/` under `templates/` (#1504) |
70
70
| 11 | IDs never change | A file or section keeps its ID when it moves or splits, so every EXTEND and OVERRIDE still resolves; a split file's moved sections go to a fork-owned file |
71
71
| 12 | The audit is the starting list | Each section not named above is placed by rule 1; the audit's per-section verdicts are the starting list, checked against the test as the path move lands (#1480) |
@@ -74,7 +74,7 @@ every answer to those questions moves to forks.
74
74
| ---- | -------------------- | ----------- |
75
75
| 1, 12 | Mechanism | Review of the path-move pull request (#1504) |
76
76
| 2, 3, 6, 7 | Promise to projects and forks | Review of the split commit; the ownership check then keeps forks from editing these keys (#1923) |
77
-
| 4 | Promise to projects | The idioms fold (#1926) |
77
+
| 4 | Promise to projects | The generic rules land in `core/` (#1926) |
78
78
| 5, 8, 9 | Promise to forks | The split commit and the migration guide (#1292) |
79
79
| 10, 11 | Promise to projects and forks | The path move: every root resolves the same ordered ID list before and after (#1504) |
80
80
@@ -98,6 +98,7 @@ leaves it for the project or its fork to fill in:
98
98
| 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
99
| Move decision records to forks | Every fork would rebuild the same threshold, layout and check. |
100
100
| Split by whole file | Three files mix policy and process, so either half would land on the wrong side. |
101
+
| 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. |
<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="<b style='font-size:13px;color:#0F172A'>Language idioms, as checks</b><br><span style='font-size:11px;color:#92400E'>each beside its generic rule in core/</span>" vertex="1"><mxGeometry x="60" y="302" width="630" height="62" as="geometry" /></mxCell>
13
+
<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="<b style='font-size:13px;color:#0F172A'>Language idioms, as rules</b><br><span style='font-size:11px;color:#92400E'>stated in core/ with no language code</span>" vertex="1"><mxGeometry x="60" y="302" width="630" height="62" as="geometry" /></mxCell>
14
14
<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="<b style='font-size:13px;color:#0F172A'>Questions every project answers</b><br><span style='font-size:11px;color:#92400E'>who approves a change, how work is tracked,<br>what a release is</span>" vertex="1"><mxGeometry x="60" y="378" width="630" height="62" as="geometry" /></mxCell>
15
15
<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="<b style='font-size:13px;color:#0F172A'>git.md: safety</b><br><span style='font-size:11px;color:#92400E'>never force-push, never rebase a pushed branch,<br>one concern per pull request</span>" vertex="1"><mxGeometry x="60" y="454" width="630" height="62" as="geometry" /></mxCell>
<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="<b style='font-size:13px;color:#0F172A'>quality-gates.md: building a check</b><br><span style='font-size:11px;color:#92400E'>freeze instances, pair a constraint with its check,<br>run the check in the form it ships</span>" vertex="1"><mxGeometry x="60" y="606" width="630" height="62" as="geometry" /></mxCell>
0 commit comments