The hourglass has inverted
The design is a tight core that barely changes, with rich integration above
and below. Measured 2026-09-03:
files KB share edits since v2.55.0
WAIST base/core 12 310 40.3% 71
WAIST base/workflow 9 159 20.7% 31
END stack 17 106 13.8% 11
END backend 18 68 8.9% 0
END frontend 3 17 2.2% 0
WAIST 61.1% of bytes, 102 edits
ENDS 30.1% of bytes, 16 edits
The waist is twice the size of both ends combined and takes six times the
churn. backend/ holds the most files of any layer and has not been touched
in 22 releases; frontend/ likewise. The average waist file is 26KB, the
average end file 4KB — seven to one, the wrong way round.
Supporting measurements: 12 of the 16 template file-touches across
v2.63.0..v2.77.0 landed in base/core and base/workflow; one in stack.
Zero template files have been deleted since v2.55.0. Control: the same probe
sees 3 stack/backend/frontend files in the preceding eight releases, so it is
not blind.
The test
A rule belongs in the waist only if changing the stack, the platform, or the
team's way of working would not change it.
"Branch naming is feat/<scope>" survives it. "The release runs nine steps,
here are the twelve gh commands" does not — that is one team's answer.
A heading ending in "(if applicable)" is the section declaring its own failure.
Result of applying it to all 226 sections
| verdict |
bytes |
share |
| KEEP — invariant policy |
181,365 |
38.4% |
| MOVE — process layer |
232,694 |
49.3% |
| MOVE — stack/platform end |
52,315 |
11.1% |
| MOVE — language end |
5,320 |
1.1% |
| total waist today |
471,694 |
|
Nearly half the waist is an operating manual for running an agent-assisted
repository. It is good material. It is not synthesized engineering policy,
and it currently ships to every consumer of every stack.
Per file
| file |
keep |
process |
end |
lang |
workflow/quality-gates.md |
30,050 |
36,109 |
|
|
core/git.md |
7,476 |
57,266 |
|
|
core/docs.md |
46,715 |
5,803 |
11,756 |
|
core/quality.md |
33,355 |
1,459 |
24,003 |
|
core/testing.md |
37,124 |
2,997 |
5,517 |
5,320 |
workflow/ai-workflow.md |
|
38,487 |
|
|
workflow/360.md |
|
20,890 |
|
|
core/review.md |
4,711 |
14,137 |
|
|
core/agents.md |
|
17,558 |
|
|
workflow/scope.md |
|
12,697 |
|
|
workflow/issues.md |
|
11,127 |
|
|
core/config.md |
7,887 |
|
|
|
core/readme.md |
7,418 |
|
|
|
core/examples.md |
|
|
6,625 |
|
core/skills.md |
|
6,458 |
|
|
core/cli.md |
|
|
4,414 |
|
core/oop.md |
3,958 |
|
|
|
workflow/two-pass-review.md |
|
3,559 |
|
|
workflow/compression.md |
|
3,379 |
|
|
workflow/release.md |
2,671 |
|
|
|
workflow/communication.md |
|
768 |
|
|
core/git.md is the sharpest case: 88% process. Its invariant content —
committer identity, commit messages, branching, versioning, .gitignore,
general — is 7.5KB. "Release process" and "Pull requests" are 54KB of it.
Nine files are 100% process and move whole: ai-workflow, 360, agents,
scope, issues, skills, two-pass-review, compression,
communication. Four are 100% keep: config, readme, oop, release.
What it buys
Measured by re-resolving all 37 roots with the non-keep sections removed:
| root |
today |
after |
cut |
base-communication (floor) |
269,146 |
140,120 |
48% |
stack-nodejs-lib (median) |
299,034 |
159,737 |
47% |
stack-django (ceiling) |
467,003 |
291,597 |
38% |
Mean cut across 37 roots: 44%. The floor moves from ~67k tokens to ~35k,
the ceiling from ~116k to ~72k.
Where the judgement is arguable
These are my calls and the ones worth challenging first:
quality.md's "Calibration discipline" (9KB) and "Cross-validation and
tool trust" (12KB) marked END. They are genuinely deep, but they address a
project that calibrates against reference data — a data/ML shape, not every
consumer.
quality-gates.md split roughly in half. The gate model, categories,
thresholds and pair-a-constraint-with-its-check are invariant; "Run the check
in the form it ships" (13KB) and "Gate scope agreement" (7.5KB) are this
project's operating discipline.
docs.md's "Development journal" marked process — it is an
agent-assisted-workflow artifact, not a documentation universal.
testing.md's pytest-specific sections (autouse fixtures, class-attribute
resource allocation, AST meta-tests) marked LANG. They name Python mechanics
in a stack-agnostic file.
Acceptance criteria
Provenance
Raised by the owner on 2026-09-03 after reviewing #1462: "the idea was to
synthesize the core engineering policies that are more or less known and refine
them with own knowledge, but clearly we are incrementing indefinitely."
The classification is reproducible: section boundaries are H2 headings outside
fenced blocks, sizes are bytes between headings, and every one of the 226
sections carries a verdict — 0 unclassified.
Related: #1462 (the ceiling prices growth rather than refusing it), #1470 (the
chains grew 45% in eight days at a flat stack count), #1471 (twenty template
files reach no stack chain).
Consolidated core-boundary review (owner-approved, 2026-09-05)
This issue owns the review previously duplicated in #1505. Inventory current core files, including CLI, examples, skill-authoring, and agent-output conventions, and map each to its responsibility and proposed home. Distinguish directory ownership from explicit manifest core: membership; report affected roots and context changes for semantic rewiring.
Coordinate final placement with #1504 so files move once. #727 retains the OOP reach decision and #712 retains delivery mechanics. Related layout and ownership choices may share one architectural decision; no separate ADR is required per issue. Apply the threshold being corrected in #1506.
#1353 and #1506 are the immediate adoption/policy fixes and do not wait for this v3.0 split. This issue remains the larger structural change, not a new hierarchy of process tickets.
Superseded citation, corrected 2026-09-06
The last acceptance criterion — "The chain-budget ceiling is re-based after the
split, and #1462 is resolved in the same pass" — can no longer be met.
ADR-041 deleted tests/chain-budget.txt and SYS-12 in v2.82.0 and closed
#1462. Chain size is now reported in README.md's model-limits table and
nothing caps it.
The criterion's reasoning was right and is settled rather than pending: a cap
that refused nothing could not hold the new floor either, so there is no cap.
Read the criterion as discharged. What a split still owes a reader is the
model-limits table, regenerated by tools/sync.py and gated by
sync.py --check.
The hourglass has inverted
The design is a tight core that barely changes, with rich integration above
and below. Measured 2026-09-03:
The waist is twice the size of both ends combined and takes six times the
churn.
backend/holds the most files of any layer and has not been touchedin 22 releases;
frontend/likewise. The average waist file is 26KB, theaverage end file 4KB — seven to one, the wrong way round.
Supporting measurements: 12 of the 16 template file-touches across
v2.63.0..v2.77.0landed inbase/coreandbase/workflow; one instack.Zero template files have been deleted since
v2.55.0. Control: the same probesees 3 stack/backend/frontend files in the preceding eight releases, so it is
not blind.
The test
A rule belongs in the waist only if changing the stack, the platform, or the
team's way of working would not change it.
"Branch naming is
feat/<scope>" survives it. "The release runs nine steps,here are the twelve
ghcommands" does not — that is one team's answer.A heading ending in "(if applicable)" is the section declaring its own failure.
Result of applying it to all 226 sections
Nearly half the waist is an operating manual for running an agent-assisted
repository. It is good material. It is not synthesized engineering policy,
and it currently ships to every consumer of every stack.
Per file
workflow/quality-gates.mdcore/git.mdcore/docs.mdcore/quality.mdcore/testing.mdworkflow/ai-workflow.mdworkflow/360.mdcore/review.mdcore/agents.mdworkflow/scope.mdworkflow/issues.mdcore/config.mdcore/readme.mdcore/examples.mdcore/skills.mdcore/cli.mdcore/oop.mdworkflow/two-pass-review.mdworkflow/compression.mdworkflow/release.mdworkflow/communication.mdcore/git.mdis the sharpest case: 88% process. Its invariant content —committer identity, commit messages, branching, versioning,
.gitignore,general — is 7.5KB. "Release process" and "Pull requests" are 54KB of it.
Nine files are 100% process and move whole:
ai-workflow,360,agents,scope,issues,skills,two-pass-review,compression,communication. Four are 100% keep:config,readme,oop,release.What it buys
Measured by re-resolving all 37 roots with the non-keep sections removed:
base-communication(floor)stack-nodejs-lib(median)stack-django(ceiling)Mean cut across 37 roots: 44%. The floor moves from ~67k tokens to ~35k,
the ceiling from ~116k to ~72k.
Where the judgement is arguable
These are my calls and the ones worth challenging first:
quality.md's "Calibration discipline" (9KB) and "Cross-validation andtool trust" (12KB) marked END. They are genuinely deep, but they address a
project that calibrates against reference data — a data/ML shape, not every
consumer.
quality-gates.mdsplit roughly in half. The gate model, categories,thresholds and pair-a-constraint-with-its-check are invariant; "Run the check
in the form it ships" (13KB) and "Gate scope agreement" (7.5KB) are this
project's operating discipline.
docs.md's "Development journal" marked process — it is anagent-assisted-workflow artifact, not a documentation universal.
testing.md's pytest-specific sections (autouse fixtures, class-attributeresource allocation, AST meta-tests) marked LANG. They name Python mechanics
in a stack-agnostic file.
Acceptance criteria
platform/) or a separate published artifactbase/coreholds only what survives the testwithout it the waist re-inflates by the same mechanism that filled it:
nobody adds to the core deliberately, they add to whichever file already
discusses the topic
resolved in the same pass — a cap that has never refused anything cannot
hold the new floor either
Provenance
Raised by the owner on 2026-09-03 after reviewing #1462: "the idea was to
synthesize the core engineering policies that are more or less known and refine
them with own knowledge, but clearly we are incrementing indefinitely."
The classification is reproducible: section boundaries are H2 headings outside
fenced blocks, sizes are bytes between headings, and every one of the 226
sections carries a verdict — 0 unclassified.
Related: #1462 (the ceiling prices growth rather than refusing it), #1470 (the
chains grew 45% in eight days at a flat stack count), #1471 (twenty template
files reach no stack chain).
Consolidated core-boundary review (owner-approved, 2026-09-05)
This issue owns the review previously duplicated in #1505. Inventory current core files, including CLI, examples, skill-authoring, and agent-output conventions, and map each to its responsibility and proposed home. Distinguish directory ownership from explicit manifest
core:membership; report affected roots and context changes for semantic rewiring.Coordinate final placement with #1504 so files move once. #727 retains the OOP reach decision and #712 retains delivery mechanics. Related layout and ownership choices may share one architectural decision; no separate ADR is required per issue. Apply the threshold being corrected in #1506.
#1353 and #1506 are the immediate adoption/policy fixes and do not wait for this v3.0 split. This issue remains the larger structural change, not a new hierarchy of process tickets.
Superseded citation, corrected 2026-09-06
The last acceptance criterion — "The chain-budget ceiling is re-based after the
split, and #1462 is resolved in the same pass" — can no longer be met.
ADR-041 deleted
tests/chain-budget.txtand SYS-12 in v2.82.0 and closed#1462. Chain size is now reported in
README.md's model-limits table andnothing caps it.
The criterion's reasoning was right and is settled rather than pending: a cap
that refused nothing could not hold the new floor either, so there is no cap.
Read the criterion as discharged. What a split still owes a reader is the
model-limits table, regenerated by
tools/sync.pyand gated bysync.py --check.