v3.5.3 - bounds not stated, costs not counted #208
No reviewers
Labels
No labels
already-shipped
bug
documentation
duplicate
enhancement
external-review
good first issue
help wanted
in progress
invalid
needs-decision
proposal
question
security
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: crenshawdev/cadence-archived#208
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "cadence/v3.5.3"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Cadence asserted controls it did not hold. The review path stated bounds it never enforced, the run record claimed to price a run it could not see, and three controls that already existed and were already correct never reached the path that needed them.
Five phases, thirteen requirements (RCL-07, GAT-04, PAR-01, MSR-01, MSR-02, RVP-01, RVP-02, WIR-01, MSR-03, TRN-02, PLN-01, MSR-04, SGT-01), all of it argued off this repo's own trace rather than off a guess.
Bounds the review path never stated: a 4 MiB response ceiling Cadence owns with its own over-response reason and a sanitized 1024-byte failure excerpt; local finding validation pinned to the canonical schema by an 18-fixture agreement table; and the recovery arm renamed to the turn cap and unusable return it can actually produce.
Costs the record never counted: turns per dispatch and per role, the three surfaces pricing a run now naming what that figure excludes, six per-role window ceilings derived from this repo's own p75, a bulk-output file transport with a 17-row register, and workflow.max_plan_tasks re-decided against both its forces and left at 8.
The retune the record could not state: the coordinator residue re-keyed on corr, so one run's marker stops closing at another run's event (phase 2's figure falls from 366,716,303 ms to 3,508,747 ms), and every retune suggestion now carries a direction, a current value and a read target, presented apart from the receipts and ending in an offer to route the change.
Full detail in CHANGELOG.md. Audit clean: 13/13 requirements traced, 35/35 acceptance criteria covered by a UAT item.
The release tag is not in this branch - it is cut on main after this merges.
182d2e1bc6fd92a3fThe type still said Set<string> after the value became an array of {key, sha, base}, so tsc reported three errors against correct runtime code. Caught by plan 3, which reported it rather than fixing it: planning.mjs was outside its lease.Every constraint FINDING_SCHEMA now carries is mirrored locally with its own diagnostic naming the offending field and the bound it crossed: line below 1, an empty or over-long file/claim/failure_scenario, a findings array past maxItems, and an unknown key at BOTH levels, since additionalProperties:false sits at both. Never a shared 'invalid finding' string - this text reaches the user as {ok:false, reason:'bad-shape', detail}, and a degradation the user cannot act on is the silent drop this guard exists to end. Lengths count Unicode CODE POINTS, as JSON Schema specifies. A .length reading counts one emoji as 2 and would refuse a string the schema accepts; the test pins both directions against a non-BMP fixture. The existing five diagnostics and their first-defect-wins order are intact, and an EMPTY findings array is still accepted - that is what a reviewer with nothing to report returns. bodyOfBytes moves its filler from the finding's claim to a sibling key of output_text. Padding the claim stopped being a valid finding under the new 2000-character maximum, and a response-ceiling fixture that degrades to bad-shape proves nothing about the ceiling.9b1fe5386cd45d76e86cd45d617a2a1171617a2a19e5529e565The residue accumulators in renderTrace key on `corr` instead of `key(e.phase)` at all three sites - the end-of-record `last` update, the COORDINATOR marker collection and the paired-bracket `spans.push` - so each run's last marker closes at that run's own last event rather than at whatever event a later run sharing the phase number happened to write. `mergeSpans` and the clip-and- subtract arithmetic inside a window are untouched; what moved is which markers and brackets land in one row and where the LAST marker's window ends. A marker that is its run's last event now closes at itself and contributes a zero-length window - the record holds no evidence the coordinator kept working after its own last act. A `steps[]` row's `phase` now comes from the marker's own event, since the key is no longer a phase; the row's key set is unchanged. The figures, measured over ONE record (the live `.planning/trace.jsonl` copied into a scratch `--dir` and rendered by both d94c79d's `planning.mjs` and this tree's), `trace render --phase 2`: coordinator.residue_ms 366,716,303 -> 3,508,747 largest steps[] window `commit` @2026-08-13T20:30:13.500Z, 280,613,472 ms -> `acceptance_criteria` @2026-08-12T19:35:12.762Z, 1,081,370 ms The 4,677-minute `commit` window was opened by `2-6790224`, a run whose own last event is 25 seconds later; phase "2" holds 9 distinct `corr` ids spanning 2026-08-08 to 2026-08-17. That is the measurement that refutes the roadmap's "unattributable" reading: the figure was wrong, not unattributable (D-01). The three shipped readers move in this same commit (D-17): `workflows/report.md` states the residue as the exception to its own phase-pooling warning and keeps saying it is TIME and never tokens; R6's comment in `lib/trace-suggest.mjs` says the figure it relays is corr-scoped, with its `evidence` string and `action: null` byte-identical (D-02); and `trace render`'s usage header in `planning.mjs` stops implying a phase span. The shipped test asserting the old pairing rule changes name, comment and arithmetic together (9 min -> 6); the four single-run coordinator fixtures pass unedited. `report.md` re-pinned at 12883 and DOCS-CLAIMS REPORT-13/14/15 re-anchored - REPORT-13's 67-69 was already stale.01b2ca128fb7ba3eb