• v2.7.0 ddcbd84fc8

    v2.7.0: cut the proxies
    All checks were successful
    test / node-test (git, 22) (push) Successful in 21s
    test / node-test (git, 24) (push) Successful in 20s
    test / node-test (other, 22) (push) Successful in 15s
    test / node-test (other, 24) (push) Successful in 14s
    test / node-test (planning, 22) (push) Successful in 1m10s
    test / node-test (planning, 24) (push) Successful in 1m12s
    test / node-test (prose, 22) (push) Successful in 29s
    test / node-test (prose, 24) (push) Successful in 29s
    test / node-test (review, 22) (push) Successful in 22s
    test / node-test (review, 24) (push) Successful in 21s
    test / node-test (routing, 22) (push) Successful in 35s
    test / node-test (routing, 24) (push) Successful in 31s
    test / self-verify (push) Successful in 20s
    test / typecheck (push) Successful in 26s
    Stable

    john released this 2026-08-11 18:40:42 +00:00 | 980 commits to main since this release

    Signed by john
    GPG key ID: 693AB15F91734B0C

    Every 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 at xhigh and turned plan, phase_diff and pre_ship adjudicated at once.

    Measured on a transcript-recall project: src/store/session.rs floored phase 1 on auth; src/store/lock.rs and src/ingest/mod.rs floored phase 2 on concurrency and untrusted_input. ingest/, lock and session are that project's native vocabulary, so no phase of it could ever route below critical — 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 clamped model.effort.<role>, so a configured rung lost to a filename.

    Cadence already had a better detector for the same question. The commit-time risk_surface check reads the actual staged diff, and it stays, blocking at every level.

    workflow.subagent_timeout is gone

    The 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-size counts both facts against a ceiling.
    • /cad-plan now 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 BIG prompt 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 shipped review row is lighter

    plan adjudicated → advisory: the plan already passed cad-plan-checker, a blocking gate on by default, so this was a second adversarial pass plus a 13-survivor triage menu.

    diff advisory → off: execute.md states 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_surface still halts per risky commit and pre_ship still adjudicates the whole branch at land. critical is untouched.

    docs/EVIDENCE.md keeps the definitions, drops the numbers

    About 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-surface both stand, and weight.mjs still measures on demand.

    Also

    • The weight budget is a ceiling, not an equality. budget-undershoot fired 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 routing is ~2.5s against ~11.5s for the tree, and CI runs one job per group.
    • review-provider.test.mjs was 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 set refuses 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,021

    Downloads