Repository navigation
Add TRACE-lite: typed verdicts, record store, and consumer contracts - #16
Merged
Merged
Conversation
Adapts the record contract from "TRACE: An Operational Reasoning Schema for Auditable Agentic Commitments" (arXiv:2607.12480) to this repo's machinery. Phase 1 — typed verdicts: critic-panel, loop-iteration, improve-skills and scan-docs return accept/qualify/revise/defer/reject instead of true/false; a missing verdict defers (never confirms, never counts as refuted). Critics type each claim; a deterministic evidence gate caps an accept whose evidence is weaker than its claim type demands; per-lens critical questions drive the skeptic; agreement between same-model critics no longer counts as evidence. Phase 2 — TRACE-lite records: versioned schema (.claude/trace/schema-v1.json), append-only store (.claude/memory/trace/records.jsonl) and the `pnpm trace` CLI (write/act/show/query/lint/reaudit/metrics/rotate/tree-id). Writes are all-or-nothing, consumer actions fail closed, and a vitest test replays the committed store. Shared deterministic blocks are byte-identical across workflows and parity-tested. Phase 3 — consumers: loop-plan gains `deferred` + record/missing columns and "done needs an accept/qualify record + CLEAR"; loop.md wires records, defer resolution and the TRACE stop conditions; /dream becomes a memory-admission gate (commit/qualify/quarantine/reject) with re-audit; story status changes cite a record; critic rounds reuse verdicts on an identical working tree. Phase 4 — TRACE-Bench-lite: 11 seeded-defect/good fixtures with judge claims verified by `pnpm trace bench-judge`, the trace-bench workflow (measures the byte-identical production loop verifier, a single-pass reviewer, optional panel), deterministic scoring with pre-registered falsification flags, and the /bench-checkers command. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
…ree-id The first bench run was contaminated: verifier prompts carried the real fixture ids (which name the defect), and agents grepping the repo found the plain-text manifest and patches (29 of 33 agents saw ground truth). Its results are discarded. - Fixtures now live gzip+base64-encoded in .claude/trace/bench/fixtures.bundle (bench-pack / bench-unpack); agents get opaque fx- tokens; raw runs are not committed; bench records carry counts only. - bench-score --transcripts scans every agent transcript for leaked ids or defect text, excludes those runs and raises F0; --record requires the scan. - A unit test fails if any fixture id or defect text is plain text anywhere in the tree; another checks bench args leak nothing. - Unit-test judges run `vitest run src` so the bench's own fixture tests do not pollute them. - Verdict reuse is keyed on `pnpm trace tree-id` (HEAD + uncommitted changes) instead of the commit, so an edited-but-uncommitted file never looks unchanged; records stamp provenance.tree. - The pre-release record store was reset once: its only record named fixture ids; it was rewritten counts-only (no consumer had acted on it). Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
…ing fixture ids - Bench tests no longer put fixture ids or defect text in test titles or assertion messages (opaque tokens/counts only): agents that ran `pnpm test` during the second bench run saw them via a failing test title. - Records TR-9a18fc60f0b9 (bench:trace-bench-lite): loop verifier WrongAcceptRate 0, FalseHoldRate 0, invariance 1.00; single-pass recall 1.00, false-block 0 — 4 of 33 runs excluded by the transcript leak scan (F0). Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
…ings) The new typed-verdict critic panel reviewed the TRACE-lite change set itself (5 critics, 27 adjudicated findings: 15 accept, 10 qualify, 1 revise, 1 reject). Fixes for the confirmed ones: Gate & reuse - qualify faces the evidence floor too (policy v2, version-gated so v1 records still replay); re-typing a claim gates under both types and keeps the stricter outcome (retyped_from recorded). - verdict reuse binds only to the SAME claim (lens + normalized title + type), only for licensing verdicts, on an identical tree; a failed identity check drops the link entirely. Newest prior records feed the critic digest. - improve-skills and scan-docs verdicts now face the gate on evidence their separate checker cites; no more workflow-fabricated evidence. Store contract - ids are content hashes (lint detects in-place edits); content idempotency for records and actions; CLEAR refused on any record that is not the newest for its claim; secret-shaped and bench-ground-truth drafts refused; union merge for records.jsonl; validate() uses own-property lookups. - Fixed an action-identity bug found while dogfooding: action ids ignored record_id, so the same action on two records collided. Bench - F4 and F5 are emitted; no-verdict runs are excluded (F0 validity); a measurement with exclusions is recorded as qualify (TR-34effc571db4 revises the earlier accept). Patch-only tokens count as leak markers. Fixture apply checks moved out of `pnpm test` into bench-args/bench-judge. - bench-judge: clean-tree baseline, "did not run" is never "caught", SIGINT/SIGTERM restore the tree, judges get an allowlisted env. Loop & prompts - Completion gate restored: a confirmed, deferred or revised blocker keeps a task open; diminishing returns stops re-running, not the task. - One consumer protocol in topics/trace.md (write/act procedure, defer/revise /reject handling, "fixed" = CLEAR after the checker); commands cite it. - loop-iteration enforces the trust level, fails closed on unparsable diffs, denylists scripts/trace/, treats item text and diff as untrusted, and chains re-dispatched nodes with `revises`; loop.md/loop-plan/checklist updated. - /dream records the decision only after filing, scopes Edit/Write to the wiki, and rotates the store only on the default branch. Tests: workflow bodies now run under a stub harness (mutation-checked), plus CLI process tests — 106 unit tests; pnpm verify green. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
The /improve-skills pass (112 agents) confirmed 4 blockers + 48 important findings on the prompt surface; nearly all were already fixed in 13b80bd. This closes the rest: - loop-plan: a node's `missing` is never empty (record missing, else repair, else "a human decision on: <reason>"); a human-approval defer is escalated, not deferred; a budget-stopped/error dispatch reverts nodes to `ready`. - /dream lint proposes (never auto-writes) a missing command description; untrusted text enters the wiki only as attributed facts, never as rules. - critic-round no longer claims /multi-agent-e2e runs a critic round. - Workflow diagrams updated for the strict gate, identity-checked reuse, the trust-level gate, the unparsable-diff gate and scan-docs' no-report path. - Record TR-21ea18ab874e notes why that run's per-finding records were not stored (they came from the pre-fix evidence mapping it reported). Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
- Round-2 critic-panel findings (0 blockers, 18 important) are on record with HOLD: fixed in 7e3bd02 with new tests, not re-reviewed by a third round. - /dream ingest through the new admission gate: 6 committed (trace.md, testing.md), 1 qualified (workflow.md, improve-skills cost), 1 rejected (duplicate). Every filed bullet carries its rec: provenance comment. - pnpm trace lint: ok, 57 records. CI=true pnpm verify: green (121 unit, 16 E2E, bundle 143.2 KB gzip). Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
Third critic-panel round over the round-2 fixes: 0 blockers, 24 important (~9 distinct issues). Round-1/2 findings it no longer raised are CLEARed; the round-3 records are on HOLD until a separate checker confirms the fixes. - Denylist: the workflow parser walks hunks by their line counts and marks any non-a/b header (mixed formats, odd prefixes) unparsable -> escalate; tab timestamps are stripped. `denylist-check` now takes --patch and runs BEFORE applying: paths from git's own parser (numstat, both directions), denylist read from HEAD, no state-file exemption, exit 2 on any failure. - bench-judge --recover is reachable: applied patches are detected (and recovered) before the stale-fixture check. - F0 coverage: runs with no scanned transcript are excluded and block `bench-score --record`. - `query --brief` keeps qualifier/repair/failed_gates (contract-tested against what critic-panel reads); docs point at --brief. - `act --from` accepts an empty reuseActions list; REAUDIT is a decision (an unchanged re-audit is a no-op, not a new line per pass). - 30 new regression tests (151 total); 26/26 targeted mutants killed. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
…efects - Bench re-run (verifier + single-pass, repeat 2, 33 agents, 33/33 transcripts scanned, each run covered by exactly one transcript of its own workflow run, no contamination, no missing verdicts): verifier WrongAcceptRate 0, FalseHoldRate 0, invariance 1.00; single-pass recall 1.00, false-block 0. Recorded as `accept` (only F2 informational) — the L3 measured-checker gate in loop-checklist.md is now satisfied. - A separate checker of the round-3 fixes found: panel labels with digits (qa-e2e) never matched, so a panel run could never be recorded; coverage matched by key, not by run (another run's transcripts could vouch); --recover could revert a fixture change that was later committed. Fixed: critic keys may contain digits; bench-args mints a run id carried by every agent label and the result, coverage requires the same run id and a non-empty transcript, --record refuses runs without one; a fixture counts as left applied only if its files have uncommitted changes; --recover reports what neither applies nor reverses; recover output is opaque tokens. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
…run ids, foreign leaks) - A fixture counts as left applied only if HEAD does not already contain it (reverse check against HEAD in a throwaway index; reverse because a pure-addition hunk still applies forward at an offset). --recover can no longer revert a committed change, even with an unrelated edit in the file. - The bench record carries its run ids; --record refuses a run id already recorded, and bench-checkers.md says to mint fresh args per invocation. - Leaks in bench-labelled transcripts of another run (other or no run id) count as unattributed, so --record refuses instead of ignoring them. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
…ngs) A separate checker confirmed the --recover, F0-coverage and REAUDIT fixes in three passes on scratch clones; one documented residual (args reused for two Workflow runs are caught only once the first run is recorded). Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
A separate checker confirmed the --brief and act --from fixes (8 records CLEARed) and mutation-tested the trace suite; this closes what it found. - Kill the judge's whole process group on timeout too: `timeout` is no longer forwarded to spawn (Node's own timeout kills only the direct child). - No test touches the real fixtures any more: the CLI's precondition step (flag wiring + exit codes) is a function tested on a synthetic manifest. - The signal/timeout tests use a judge with a child process and check both pids directly (no machine-wide argv scan, so not flaky). - New pins: refusal onto dirty files, reverse-failure throw, end-of-run tree check, attributed-leak exclusion, screened --record evidence ref, bench-unpack guard wiring, REAUDIT note, HEAD-sourced denylist, repeat / critic halves of run matching, scan-docs downgrade/upgrade, improve-skills real:false, the bench denylistHit field. act --from records both lists. - bench-score stdout is asserted as booleans (it names fixtures). - 173 unit tests; 23/24 targeted mutants killed (the survivor is equivalent). Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
The checker showed forwarding spawn's `timeout` is NOT equivalent (Node refreshes loop time per setTimeout, so spawn's timer and ours can fire in different passes and the child's exit cancels the group kill: ~3% orphans). - Timeout test busy-waits in onChild, so a forwarded spawn timeout orphans the grandchild deterministically (mutant killed 6/6). - CLI wiring tested end to end in a throwaway repo holding a copy of the tooling: denylist-check reads HEAD (a weakened working-tree denylist cannot pass), bench-args stops / `bench-judge --recover` reverses and stops on a synthetic bundle, `reaudit --act` screens notes and exits 1 on refusal. - act --from records actions AND reuseActions; a baseline judge that did not run aborts; dead() no longer defaults to "dead" without /proc. - 7/7 targeted mutants killed. TR-344ba896f5a5, TR-0b7c089f5ea6 and TR-80273a00eedd CLEARed on the checker's re-run. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
5 committed (Node spawn timeout vs process groups, git apply numstat rename side, mixed-format patches, reverse-check against HEAD, isolated CLI tests), 1 qualified (critic/bench cost reference), 1 quarantined, 1 rejected; log entry for the third checker round and the clean bench re-run. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
A separate checker (documented cases only, fresh clone) rebuilt every failing patch from the 8 denylist records: all are now escalated by the workflow gate and refused by `denylist-check --patch`; git failures exit 2; 5 ordinary git-generated patches pass. The 8 records are CLEARed. Follow-ups from that check: - diffPathScan parses a `diff --git` header that quotes only one side (a non-ASCII rename was a fail-closed false positive). - The loop implementer asks for `git diff --src-prefix=a/ --dst-prefix=b/`, so diff.noprefix / diff.mnemonicPrefix cannot make every diff unparsable. - Tests: unborn HEAD and non-repo exit 2, a dirty .claude/ tree with an innocent patch exits 0, copy-only and rename-out patches escalate, a state-file-only patch is a hit (4/4 targeted mutants killed). - /dream: one fact on explicit diff prefixes; log entry. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
Five new seeded defects that every deterministic check misses (a storage-key rename without migration, a half unsubscribe, an unannounced validation error, a length check before normalization, whitespace collapsing narrowed to spaces) and three new correct changes (a unit test, a helper extraction, a stronger focus ring). bench-judge: 19/19 judge claims observed (3 of 12 bad caught deterministically, 9 escape; all 7 good pass). Encoded as before. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
Run 04cb4d42: 152 agents, 152/152 transcripts scanned, 0 excluded. TR-34201765532f (accept; revises TR-bdc16b430394): verifier WrongAcceptRate 0.04, invariance 0.95; single-pass recall 1.00 / false-block 0.14; panel (any critic) the same; n_eff 1.89 of 5. Pre-registered flags F4 and F1 fired, so the L3 measured-checker gate is no longer satisfied. /dream: three qualified facts and a log entry; responses proposed, not applied. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
F4 (the loop verifier licensed a diff because it "does what the item asks" although the item contradicted a documented contract): the <loop-verifier> prompt now checks the change against the project's documented contracts (PRD/ACs, code doc comments, existing tests' intent, data already persisted) and returns defer for a human decision when the item itself contradicts one — never accept/qualify on item-literalism. Re-bench follows. F1 (single-pass matched the 5-critic panel on code-only review at ~5x lower cost): critic-panel gains reviewMode; a code-only round (uiInScope: false) runs ONE all-lens reviewer by default, while rounds that drive the app keep one critic per lens (not measured). Findings keep their lens and each still gets its own skeptic; claim ids and reuse are unchanged. Docs updated. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
A separate checker rated d703e79 `qualify` (panel prompts byte-identical, single-pass keeps the downstream contracts) and found: - single-pass reuse depended on the lens the reviewer picked: a finding that re-raises a prior claim now takes that claim's lens (same title slug and claim type), so REUSE/revises work as in panel mode; - a throwing single reviewer crashed the round: it is now a failed reviewer; findings naming no in-scope lens are logged and counted; one reviewer's cross-lens duplicates no longer count as independent corroboration; counts.reviewAgents / unassignedFindings; invalid reviewMode is logged; - the loop left the verifier's "human decision to change <contract>" defer quietly deferred: loop.md now escalates any defer that needs a human; - the F1 claim was stated more strongly than its `qualify` record: the qualifier is now carried everywhere it is cited; critic-round.md no longer contradicts the exception. (CLAUDE.md wording awaits confirmation.) Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
Run 6e7bcc95 (verifier, 3 repeats, 57/57 transcripts, 0 excluded): TR-44152fe382c5 accept — WrongAcceptRate 0, FalseHoldRate 0, invariance 1.00, F2 only. The L3 measured-checker gate is met mechanically; a HOLD note on the record says the contract rule is in-sample and L3 should wait for held-out fixtures. /dream: one qualified fact and a log entry. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
…ic rounds Confirmed by the user. A code-only round (uiInScope: false) uses one reviewer covering every lens; each finding is still verified by a separate skeptic (TRACE-Bench F1, one run). Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
Written by an independent agent that read only src/, e2e/, docs/ and never saw the checker prompts, the F4 contract rule or the existing fixtures — so the verifier's contract rule is tested out of sample. Six bad (three items that themselves conflict with the PRD, three subtle bugs), four good (consistent with the documented ACs). Four comment/test-title words were reworded so no patch-only token appears in the tree. bench-judge: 29/29 judge claims observed (5 of 18 bad caught deterministically, 13 escape). Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
Verifier-only TRACE-Bench-lite run at 3 repeats over 29 fixtures, 10 of them written blind to the contract rule. No bad diff was licensed, in or out of sample. The record is qualify, with F0 from 1 excluded run, and carries a HOLD: the L3 measured-checker gate is not met. Both blemishes trace to the bench instrument, not the verifier. /dream files the out-of-sample result and the run's cost. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
The F0 contamination scan now reads only what an agent received: its prompt, tool results and injected context (receivedText). The agent's own messages and the echo of its structured output are its measured output. A verifier that rewrites a defect description from the diff alone found the defect; nobody told it. The tree leak guard (leakyFiles) now counts as code the tracked code files plus the untracked files a fixture patch writes. A fixture applied as a new file in a verifier's worktree no longer turns pnpm test red. Any other untracked file still cannot whitelist its own tokens; a code review found that hole in the first version. Both defects are pinned by tests in lib.test.mjs. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
This is a fresh verifier run (3 repeats, 29 fixtures, including the 10 held-out ones). All 87 agent prompts were checked against the minted args. Result: WrongAcceptRate 0, FalseHoldRate 0, invariance 1.00. No run was excluded, and the old F0 scan also flags none. Only F2 fired. The bench record is accept, so the L3 measured-checker item of loop-checklist.md is met. No loop's trust level was changed. /dream files the qualified result and a transcript-format gotcha. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adopts TRACE-lite (from Chang & Chang, arXiv:2607.12480) as the durable record system for all adjudicated claims in the loop and multi-agent workflows. Every verdict (accept/qualify/revise/defer/reject) is now a typed, append-only record with evidence, failed gates, and missing evidence. Consumers act only on licensing verdicts (accept/qualify) via a deterministic evidence gate that prevents overclaiming.
Key Changes
Core TRACE-lite Machinery
scripts/trace/lib.mjs(1243 lines): Pure library implementing the evidence gate, schema validation, record I/O, and store operationsscripts/trace/cli.mjs(492 lines): Sanctioned writer of.claude/memory/trace/records.jsonlwrite,act,show,query,lint,tree-id,denylist-check,reaudit,metrics,rotate,bench-args,bench-judge,bench-score.claude/trace/schema-v1.json: JSON Schema for records and actions (record_id, claim_type, final_status, evidence, actions, revisions).claude/memory/topics/trace.md: Policy document defining verdicts, evidence requirements per claim type, consumer action matrix, and policy versioningWorkflow Integration
critic-panel.js(modified): Now types each claim, applies evidence gate, reuses prior verdicts on unchanged trees, and emits TRACE record draftsloop-iteration.js(modified): Verifier returns typed TRACE verdict instead of binary approve/reject; implementer and verifier are separate passesscan-docs.js(modified): Status verifier applies evidence gate; emits TRACE record draftstrace-bench.js(new): Measures loop verifier, single-pass reviewer, and optional critic panel on seeded-defect fixtures; returns raw per-fixture outcomes for scoringTesting & Contracts
scripts/trace/lib.test.mjs(629 lines): Unit tests for evidence gate, schema validation, record I/O, and store operationsscripts/trace/cli.test.mjs(629 lines): Process-level tests for CLI (exit codes, fail-closed paths, batch writes, consumer actions)scripts/trace/workflows.test.mjs(504 lines): Behavioral tests for critic-panel, loop-iteration, and scan-docs workflows; verifies every record draft satisfies schema and semantic rulesscripts/trace/contracts.test.mjs(186 lines): Drift detection — evidence gate block is byte-identical in lib.mjs and every workflow that inlines it; schema enums match policy; action matrix is consistentscripts/trace/bench-judge.mjs(278 lines): Deterministic judge runner for bench fixtures; applies patch, runs judge, reverses patch; safety gates prevent false catches and signal handlingDocumentation & Configuration
.claude/loop.md(modified): Records are the durable state change contract; no action without a TRACE record.claude/loop-plan.md(modified): Plan nodes now track licensing verdicts and ready rules.claude/loop-checklist.md(modified): Readiness rubric includes TRACE record requirements.claude/memory/quarantine.mdhttps://claude.ai/code/session_01HQ2AbPbWZkrm9P3neuwvPR