-
v2.7.0: cut the proxies
StableAll checks were successfultest / node-test (git, 22) (push) Successful in 21stest / node-test (git, 24) (push) Successful in 20stest / node-test (other, 22) (push) Successful in 15stest / node-test (other, 24) (push) Successful in 14stest / node-test (planning, 22) (push) Successful in 1m10stest / node-test (planning, 24) (push) Successful in 1m12stest / node-test (prose, 22) (push) Successful in 29stest / node-test (prose, 24) (push) Successful in 29stest / node-test (review, 22) (push) Successful in 22stest / node-test (review, 24) (push) Successful in 21stest / node-test (routing, 22) (push) Successful in 35stest / node-test (routing, 24) (push) Successful in 31stest / self-verify (push) Successful in 20stest / typecheck (push) Successful in 26sreleased this
2026-08-11 18:40:42 +00:00 | 980 commits to main since this releaseEvery mechanism removed in this release fired on something measurable that stood in for the property it actually cared about. Each was defensible alone. Together they are why the tool got slow: every proxy brings its own config key, its own CI check, and its own prose surface.
The dispatch-time risk floor is gone
It judged a file by its name. One path token matched against ~100 common lowercase words raised the whole phase to
critical, which put all six roles on opus atxhighand turnedplan,phase_diffandpre_shipadjudicated at once.Measured on a transcript-recall project:
src/store/session.rsfloored phase 1 onauth;src/store/lock.rsandsrc/ingest/mod.rsfloored phase 2 onconcurrencyanduntrusted_input.ingest/,lockandsessionare that project's native vocabulary, so no phase of it could ever route belowcritical— 15 of 16 resolves ran opus, against a README claim of ~27% routed down to Sonnet.tests/ingest_concurrency.rs, a test file, floored its phase on two surfaces at once. The floor also clampedmodel.effort.<role>, so a configured rung lost to a filename.Cadence already had a better detector for the same question. The commit-time
risk_surfacecheck reads the actual staged diff, and it stays, blocking at every level.workflow.subagent_timeoutis goneThe schema called it "ms before a subagent is killed." No code read it, and the host spawn seam takes no timeout and offers no cancel. The trace shows a 32-minute hang against a configured five-minute bound, unkilled. A missing feature is honest; a knob reporting a control you do not have is a false safety signal.
Plan and phase size are counted, not judged
A phase naming 25 of a project's 46 requirements was planned as 8 tasks against a configured ceiling of 4 — by a planner handed the ceiling and a checker told to flag the overrun. Both passed it.
- New
planning.mjs plan-sizecounts both facts against a ceiling. /cad-plannow sizes the phase before dispatching a planner. Learning a phase is too big cost 10–14 minutes; it now costs a count.- The task ceiling is explicitly per plan. A count ceiling on a large phase does not make tasks smaller, it makes them fatter, which is how one task came to be "scaffolding, license, typed errors and the CLI skeleton."
- The
PHASE TOO BIGprompt gets a third option, and it is the recommended one: split into sequential plans inside the phase. That had been forbidden on a reason that was wrong.
The
shippedreview row is lighterplanadjudicated → advisory: the plan already passedcad-plan-checker, a blocking gate on by default, so this was a second adversarial pass plus a 13-survivor triage menu.diffadvisory → off:execute.mdstates the cost itself — at advisory the fire overlaps the next plan's dispatch and is free, but "the last plan has no next dispatch, so it fires and waits." On a single-plan phase that is 32 minutes of serial tail for findings that gate nothing.risk_surfacestill halts per risky commit andpre_shipstill adjudicates the whole branch at land.criticalis untouched.docs/EVIDENCE.mdkeeps the definitions, drops the numbersAbout 200 measured figures across six asserted tables were derived data carried in the tree, with tests proving the copy still matched a source that recomputes in 200ms. One byte changed in any of 99 surfaces could stale five tables at once.
Falsified after the cut — appending one sentence to
references/seams.md:signals before 6, across 4 tables it never touched after 1, naming the file that grew No check weakened. The byte ceiling and
unbudgeted-surfaceboth stand, andweight.mjsstill measures on demand.Also
- The weight budget is a ceiling, not an equality.
budget-undershootfired on any shrink, taxing a prose cut at the rate it taxed growth. - Prose no longer restates measured byte figures. Eleven deferral sites carried a hardcoded size a test then verified against the tree. Cite the file, not its size.
- The test suite runs by group:
node cadence-core/bin/test.mjs routingis ~2.5s against ~11.5s for the tree, and CI runs one job per group. review-provider.test.mjswas writing into Cadence's own.planning/trace.jsonl— 1,443 fixture rows against 33 real ones.
Breaking
Nine config keys retired, all through
lib/retired-keys.mjs, so an existing config warns and routes normally rather than breaking.config.mjs setrefuses them.risk.override.{auth,migrations,billing,concurrency,destructive,secrets,api_contract,untrusted_input}workflow.subagent_timeout
Verification
node cadence-core/bin/test.mjs— 1,369 pass, 0 fail ·self-verify— 0 problems ·tsc -p tsconfig.ci.json— clean · 8 commits, 53 files, +977 / −3,021Downloads
-
Source code (ZIP)
3 downloads
-
Source code (TAR.GZ)
2 downloads
- New