raise the ceilings for a list of features, and say which kind of raise it is

core 2850 -> 3000, ext 2000 -> 3500, modules 6 -> 9.

ext was the binding one: 1975 of 2000, with syntax highlighting still to write,
so for that ceiling this is not anticipation but the difference between building
the next feature and not. The other two are bought ahead of a list of features
the human has signed for. DEPS_MAX 9 leaves room for chroma and its regexp2 —
which fill 6 exactly — plus two more.

Worth naming rather than glossing: a ceiling raised on evidence is a
measurement, and one raised on intent is a budget. The first two raises were the
first kind; this is the second, which is weaker. ADR-0041's test still stands —
if core approaches 3000 the question is again what belongs in ext, and the
answer is still feed.go and discover.go, waiting on a feature being able to own
a route.

Invariant 9 is measured by a number that has now moved three times. It says
something only because ext rose 75% where core rose 7%.

FILE_LOC_WARN and FUNC_LOC_WARN are untouched: they are about one file being
readable, and nothing about the plan changes that.
This commit is contained in:
Claude Opus 5
2026-08-02 00:09:01 +06:00
committed by bdeshi
parent f27193a036
commit 4c5bda98ab
3 changed files with 36 additions and 4 deletions
+8 -1
View File
@@ -68,7 +68,14 @@ into an author's prose. It worked and it had tests; `text-wrap: pretty` does it
content, so the feature was deleted (ADR-0045). If a feature only rearranges how something looks, expect the
agent to push back toward CSS or a template.
**The core ceiling has moved twice, both on purpose.** `CORE_LOC_MAX` went 2000 → 2800 (ADR-0041) because the
**The ceilings have moved three times, all on purpose, and the third is a different kind.** The first two
were measurements — a number costed before any code existed, then eight lines of contract that would not fit.
The third (ADR-0074) is a budget: core 2850 → 3000, ext 2000 → 3500, modules 6 → 9, signed off ahead of a
list of features rather than in response to one. `ext` was genuinely blocking at 1975 of 2000; the rest is
headroom bought deliberately. Invariant 9 is measured by a number that has now moved three times, and says
something only because ext rose 75% against core's 7%.
**The core ceiling has moved twice before that, both on purpose.** `CORE_LOC_MAX` went 2000 → 2800 (ADR-0041) because the
original figure was costed before any code existed and never budgeted what `cmd/` would hold — `check`, `new`,
`-dev`, change detection. It went 2800 → 2850 (ADR-0065) for eight lines of theme contract, and ADR-0041's own
test — read a second raise as evidence something belongs in `internal/ext/` — was applied rather than waived:
+20
View File
@@ -1224,3 +1224,23 @@ map where there was one map, and the bound is a constant rather than a setting,
thrash it has no knob. That is deliberate: a knob with one user is a knob nobody has asked for.
Revisit if: a real site evicts often enough to matter, which is a measurement and not a guess — and then the
question is the number, not the policy.
## ADR-0074 — The ceilings move for a list of features, not for one
Date: 2026-08-02 · Status: accepted (third raise of `CORE_LOC_MAX`, first of `EXT_LOC_MAX` and `DEPS_MAX`)
Decision: `CORE_LOC_MAX` 2850 → 3000, `EXT_LOC_MAX` 2000 → 3500, `DEPS_MAX` 6 → 9. `FILE_LOC_WARN` and
`FUNC_LOC_WARN` are unchanged, because they are about one file being readable and nothing about the plan
changes that.
Why: `ext` was the binding one at 1975 of 2000, with syntax highlighting still to write, so this is not
speculative for that ceiling — it is the difference between building the next feature and not. The other two
are anticipatory, and the human signed for them knowing a larger list of features is coming: `DEPS_MAX` 9
leaves room for chroma and its `regexp2` (which fills 6 exactly) plus two more, and core gets 150 lines for
the contract fields features keep needing. This is worth naming honestly: a ceiling raised on evidence is a
measurement, and a ceiling raised on intent is a budget. The first two raises were the first kind. This is the
second, which is weaker, and the mitigation is that ADR-0041's test still stands — if core approaches 3000,
the question is again what belongs in `ext`, and the answer is still `feed.go` and `discover.go` waiting on a
feature being able to own a route.
Consequence: cheap — the next several features fit without another conversation, which is the point of
budgeting ahead. Expensive — "core stops growing after Arc 2" (invariant 9) is measured by a number that has
now moved three times, and each move makes it a weaker claim. The two ceilings still say something only
because `ext` rose far more than core did: 75% against 7%.
Revisit if: core reaches 3000 — and then the answer is a route seam, not a fourth raise.
+8 -3
View File
@@ -5,11 +5,11 @@
# code worse — sharding a coherent file into a `_helpers.go` turns it green while creating the package
# CLAUDE.md rule 3.6 bans. Total mass cannot be gamed by moving code between files; file length can.
CORE_LOC_MAX=2850 # cmd/ + internal/{content,render,web} + repo root, non-test .go (ADR-0041, ADR-0065)
EXT_LOC_MAX=2000 # internal/ext/ — composition, grows after the core freezes
CORE_LOC_MAX=3000 # cmd/ + internal/{content,render,web} + repo root, non-test .go (ADR-0041, ADR-0065, ADR-0074)
EXT_LOC_MAX=3500 # internal/ext/ — composition, grows after the core freezes (ADR-0074)
FILE_LOC_WARN=500 # any single .go file — advisory
FUNC_LOC_WARN=60 # any single function — advisory
DEPS_MAX=6 # total modules in go.mod, direct plus indirect
DEPS_MAX=9 # total modules in go.mod, direct plus indirect (ADR-0074)
CLAUDE_LOC_MAX=150 # CLAUDE.md only — the one file billed on every turn (ADR-0053)
# Two ceilings because "the core stops growing after Arc 2" (architecture.md invariant 9) is only an
@@ -27,6 +27,11 @@ CLAUDE_LOC_MAX=150 # CLAUDE.md only — the one file billed on every turn (A
# `discover.go`, which cannot move until a feature can own a route. That is the registry's trigger, not this
# feature's problem, and the honest fix was not to pretend the contract fits.
#
# Raised a third time, and this one is different: 2850 → 3000 core, 2000 → 3500 ext, 6 → 9 modules, all
# signed off in advance of a list of features rather than in response to one that arrived (ADR-0074). A
# ceiling raised on evidence is a measurement; a ceiling raised on intent is a budget, and this is the second
# kind. `ext` was the binding one — 1975 of 2000 with a syntax-highlighting feature still to write.
#
# CLAUDE_LOC_MAX is a different kind of budget: every other ceiling here bills once, when someone reads
# the code, while CLAUDE.md is re-sent on every turn of every session. 150 leaves ~20 lines of headroom
# over the current file. Reaching it means moving detail to the doc that owns the topic, never deleting