Skip to content

The hourglass has inverted: half the core is an operating manual, not engineering policy #1480

Description

@braboj

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

  • A decision on whether the process layer becomes an opt-in root (like
    platform/) or a separate published artifact
  • The split is executed so base/core holds only what survives the test
  • A rule states the test, so the next addition has somewhere to be judged —
    without 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
  • The chain-budget ceiling is re-based after the split, and The chain ceiling has been raised 313 times and lowered none, so it prices growth rather than refusing it #1462 is
    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.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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1High — must fix before next milestonespikeResearch or exploration

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions