feat(observability): bind execution traces and task-cost metrics to exact attempts (#2676) - #2790
Conversation
Drift check reportFound 2 drift finding(s): 0 error, 0 warning, 2 notice. required-check-contract (2)
|
…xact attempts (issue #2676) Workstream D16: one execution_attempt_recorded event per attempt with the closed denial/attempt/result/duplicate/late/cancelled/provider_failed vocabulary, callId+invocationId envelope join axes, an unknown-honest per-attempt cost block (null + unavailable, never 0), a snapshot-qualified task-cohort report with frozen provenance manifests (FIFO-20), and the /swarm report task-attempts cohort section (json schema v2).
…lt records the late class (issue #2676 review finding) The guardrails pending-gate-task map holds the correlation's workflow generation at the toolAfter seam; pass it through StageAGateRouteEventInput so production late_result routes become recorded late attempts instead of fail-open drops. duplicate_result still holds no original identity and stays a disclosed fail-open drop.
…p surface, provider_failed fixture, duplicate disclosure) - report registry details + docs/commands.md now describe the task-attempts cohort section and --json schema v2 (approved-plan item 12, dropped in the first commit without disclosure) - provider_failed class gets a recorder-level fixture drive (AC1 detail) - the duplicate class row and the release fragment disclose that production duplicate_result routes stay fail-open drops (no duplicateOf at the seam) - stage-a-route comment updated for the threaded generation
2699b5b to
dcc875c
Compare
There was a problem hiding this comment.
🔵 Needs a closer look
The change touches invariant-sensitive guardrail hook paths, the telemetry catalog, and the delegation lifecycle, adds a new filesystem write to the previously read-only report command, and carries subtle unknown-vs-zero provenance semantics (including a runtime-mislabel bug) that warrant final human review.
Pull request overview
This PR implements Workstream D16 (issue #2676): it makes execution traces and task-cost measurements bindable to the exact attempt and outcome that produced them, so aggregate reporting can distinguish honest "known" values from "unknown" ones and only make causal-rate claims over a stable, snapshotted cohort. It adds a new execution_attempt_recorded telemetry kind (fully registered across the event catalog, envelope, legacy adapter, retention registry, and docs), two new envelope correlation axes (callId/invocationId), producer wiring in the delegation lifecycle and Stage A gate route, cohort-snapshot machinery with frozen provenance manifests, and a new /swarm report "Task attempts (cohort)" section.
Changes:
- New
execution-attempt.tsrecorder (closed attempt-class vocabulary, unknown-honestnumber|nullcost block, fail-open validation) plus producers indelegation-lifecycle.tsandstage-a-route.ts. - New
task-cohort.tssnapshot/report/qualification module with deep-copied population, bounded provenance manifests, and FIFO-20 persistence under.swarm/observability/cohorts/. - Catalog/envelope/legacy/retention-registry registration (64→65 kinds, 13→15 workflow IDs),
/swarm reportv2 JSON + cohort section, and supporting docs/release fragment.
File summaries
| File | Description |
|---|---|
| src/observability/execution-attempt.ts | New recorder; builds cost block and emits the new event fail-open |
| src/observability/task-cohort.ts | New cohort snapshot, report, manifest capture, FIFO persistence |
| src/observability/envelope.ts | Adds callId/invocationId correlation axes to WorkflowIdsSchema |
| src/observability/legacy.ts | Maps new axes in extractWorkflowIds; adds KNOWN_TELEMETRY_KEYS entry |
| src/observability/catalog.ts | Registers 65th kind; reflows shifted producer line citations |
| src/telemetry.ts | Adds execution_attempt_recorded to the TelemetryEvent union |
| src/background/delegation-lifecycle.ts | Wires begin (attempt) and terminal (result/cancelled) producers |
| src/hooks/guardrails/stage-a-route.ts | Route→class mapping and Stage A execution-attempt producer |
| src/hooks/guardrails/index.ts | Threads the pending-gate-task generation cursor for late records |
| src/commands/report.ts | Folds attempt rows into a snapshot cohort; adds v2 section (runtime-strata issue) |
| src/commands/registry.ts / docs/commands.md | Documents the new /swarm report cohort section |
| scripts/retention-registry.data.ts / docs/observability-retention-registry.md | Registers the observability-cohorts store |
| scripts/check-core-events-usage.ts | Allowlists the cohort provenance-digest read of events.jsonl |
| docs/execution-attempt-tracing.md / observability-event-contract.md / releases/pending | Defines vocabulary, manifest schema, cohort rules; release fragment |
| tests/unit/observability/*, tests/unit/commands/report.test.ts | New/updated tests for recorder, cost, cohort, envelope fixture, determinism |
Review details
- Files reviewed: 23/23 changed files
- Comments generated: 1
- Review effort level: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| const taskAttemptSnapshot = snapshotTaskAttemptCohort({ | ||
| tasks: taskAttemptPopulation, | ||
| directory, | ||
| strata: { runtime: `bun ${process.versions.bun ?? ''}`.trim() }, |
There was a problem hiding this comment.
Verified against source and closed in the feedback round (commits bbdc5c5 + b142e88):
The premise was partially right and the conclusion was fully right. You were correct that report.ts hardcodes bun ${process.versions.bun ?? ''} and that this poisons the frozen host-status provenance. Two corrections to the record, both caught by our final critic and verified empirically under real Node v24.16.0:
- The first fix attempt (dropping the caller-supplied stratum to rely on the module's bun→node fallback) did NOT cure it: the fallback
(\bun ${process.versions.bun ?? ''}`.trim() || `node ...`)is dead code under Node — \"bun ".trim()` is the truthy literal"bun", so the node branch never fired and the digest stayed `sha256("bun")`. - The shipped fix extracts a pure
deriveRuntimeLabel(versions)that branches onprocess.versions.bun !== undefined(bun-first, since Bun also definesversions.node), persists the derived label into the snapshot strata, and a new digest-tie test assertshost.digest === sha256(persisted label)and!== sha256("bun")— the exact poisoned constant you flagged.
Also closed in the same round: the report cohort section had no content-level test coverage (new integration test seeds real attempt rows through the DB and asserts the fold + qualification rendering), and 7 smaller docs/test-hardening findings.
Thanks for the catch — the runtime-mislabel was real and is fixed at head b142e88.
…rvices and close PR-review findings (PRR-001..020) PR-review round on #2790: the no-io.test.ts directory contract (issue #2029) forbids I/O in src/observability/ — relocate execution-attempt.ts and task-cohort.ts (plus their tests) to src/services/, repoint producer/consumer citations, registry rows, gate allowlist, and docs. Frozen acceptance checks C1-C3 amended via CHECK_WRONG with fresh base-RED/head-GREEN replays. Also closes: PRR-003 (report cohort integration tests), PRR-004 (stale 64-entry prose), PRR-005/020 (report header honesty), PRR-009 (FIFO eviction order pinned + per-file unlink tolerance), PRR-014 (registry citation drift), PRR-015 (generation:0 / empty-duplicateOf boundary tests), PRR-016 (emitDelegationBegin attempt-class test).
… hardcoding bun (final-critic round on PRR-002)
The reviewer's PRR-002 rejection was wrong: the plugin bundle builds
--target node (package.json), so /swarm report executes inside the OpenCode
Node sidecar where process.versions.bun is undefined — the hardcoded
'bun <undefined>' stratum fed a sha256('bun') host-status digest. Drop the
caller-supplied stratum and let captureHostStatusManifest derive the real
runtime via its bun-to-node fallback; regression test pins the derived
label is never the bare literal 'bun'.
…esence (final-critic round 2)
The bun-to-node fallback relied on .trim() truthiness — 'bun '.trim() is the
truthy 'bun' under Node, so the node branch was dead code and the host-status
digest stayed sha256('bun') on the Node sidecar. Extract deriveRuntimeLabel
branching on process.versions.bun presence, persist the derived label into
snapshot.strata (serialized-manifest honesty), and replace the vacuous
regression test with helper branch tests plus a digest-tie assertion
(digest === sha256(persisted label), never the constant sha256('bun')).
🤖 Multi-Stage PR ReviewPipeline: MiniMax-M2.7-highspeed (orientation) (context pack) → MiniMax-M2.7-highspeed (explorer) + MiniMax-M2.7-highspeed (explorer B) (parallel explore, distinct lenses) → GLM-5-turbo (critique) ↔ GLM-5-turbo (critique) (cross-critique) → MiniMax-M2.7-highspeed (fallback arbiter) (arbiter: blind-spot + synthesize) PR Reviewer — opencode-swarm🔍 PR Intent
📦 Implementation SummaryThe PR adds a new ✅ /
|
| Obligation | Status | Evidence (file:line) |
|---|---|---|
| O-001 | SUPPORTED |
src/observability/execution-attempt.ts:1-271 — closed 7-class vocabulary, exact join axes, explicit captured/unknown coverage |
| O-002 | SUPPORTED |
src/observability/envelope.ts:151-163 — callId + invocationId added to WorkflowIdsSchema; legacy.ts:655-663 extracts both |
| O-003 | SUPPORTED |
src/observability/execution-attempt.ts:73-95 — buildTaskAttemptCost: null + unavailable push; knownCostValue at :61-67 rejects invalid inputs |
| O-004 | SUPPORTED |
src/background/delegation-lifecycle.ts:261-272 (attempt), :351-390 (terminal); src/hooks/guardrails/stage-a-route.ts:83-109 (route→class mapping), :129-145 (emit) |
| O-005 | SUPPORTED |
src/observability/task-cohort.ts — snapshotTaskAttemptCohort deep-copies (structuredClone at :127); captureFileManifest bounded 64 KiB digests at :136-162; buildTaskCohortReport at :261-338 |
| O-006 | SUPPORTED |
src/commands/report.ts:72 (SCHEMA_VERSION = 2), :57-80 (cohort collection), :322-329 (snapshot call), :412 (cohort render) |
| O-007 | SUPPORTED |
scripts/retention-registry.data.ts:4444-4468 — observability-cohorts row with FIFO-20, derived-rebuildable, retention-registry doc updated |
| O-008 | SUPPORTED |
src/observability/catalog.ts:1292-1318 — new execution_attempt_recorded entry; src/telemetry.ts:177 union addition |
| O-009 | SUPPORTED |
scripts/check-core-events-usage.ts:58-61 — provenance-digest entry for task-cohort.ts |
🚨 Confirmed Findings
[LOW] Filename collision under concurrent same-millisecond snapshots with identical manifest content
- Location:
src/observability/task-cohort.ts:152 - Why it matters: If two
snapshotTaskAttemptCohortcalls occur within the same millisecond AND produce manifest entries with byte-identical digests (e.g., all sources unavailable in both calls, same host_status digest),manifestFileNameproduces the same filename andwriteFileSyncsilently overwrites the earlier manifest. - Evidence: Line 152:
const stamp = Number.isFinite(epoch) ? epoch : 0;whereepoch = Date.parse(capturedAt).Date.parseoperates at millisecond precision. The suffix (createHash('sha256').update(combined).digest('hex').slice(0, 12)) is identical for identical manifest content. The persistence at:175useswriteFileSync(noflag: 'x'), so the second write overwrites the first. - Fix direction: Add a monotonic counter (e.g.,
_counterin a closure, persisted in the filename) or use the ISO string's sub-millisecond component (capturedAt.split('T')[1].replace(/[:.]/g, '')) as a tiebreaker. Alternatively, open withflag: 'wx'(Bun/Node ≥22) to fail-fast on collision rather than overwrite. - Confidence: Low. Practical likelihood is minimal: callers control
now, the manifest content (4 sources including live file stats) typically differs between snapshots, and the window is one millisecond. The overwrite is semantically equivalent to FIFO eviction. The cohort store is described as "provenance evidence," not authoritative state.
🔬 Unverified but Plausible Risks
- Risk:
structuredCloneindeepCopyRecord(task-cohort.ts:127) falls back toJSON.parse(JSON.stringify(record)). The fallback losesundefinedvalues,BigInt,Symbol, and circular references — butTaskAttemptPopulationRecordcontains only plain JSON-compatible fields (strings, numbers, objects, arrays), so this is not a practical concern for the actual data shapes. - Risk: The
execution_attempt_recordedproducer paths addemit()calls inside existing hook catch blocks (delegation lifecycleemitDelegationBegin/emitDelegationCostObservation, Stage ArecordStageAGateRoute) that were already fail-open. Since the execution-attempt recorder is itself fail-open, the nesting preserves fail-open semantics — but no new isolation is added.
🧪 Test / Coverage Gaps
- Gap: No test for
duplicateclass +duplicateOfthroughrecordExecutionAttemptend-to-end (only the "noduplicateOf→ refused" case is covered; the "withduplicateOf→ recorded" path is only exercised by theprovider_failedfixture test at a different call site). Minor: the code path is trivially simple. - Gap: No concurrent snapshot test (would validate the filename-collision finding above, but the practical likelihood is low enough that a test would be testing a theoretical race condition).
📋 Shipped-vs-Claimed Gaps
- Gap: None. The PR delivers all nine obligations and the disclosed residual (legacy
delegation_endzero-defaults tracked by Migrate the legacy delegation_end / cost-fold zero-defaults to null-preserving unknown semantics #2789) is accurately characterized.
📝 Merge Recommendation
APPROVE
This is a thorough, well-tested observability implementation. The single confirmed finding (filename collision) is low-severity, has a clear fix path, and does not affect any authoritative state. The implementation correctly:
- Uses strict
null+unavailablelist for unknown cost axes (never0) - Deep-copies the cohort population before returning
- Captures manifests BEFORE returning the snapshot (the correct order)
- Maps Stage A generation cursor into
lateexecution-attempt records - Qualifies cohort reports explicitly (no silent false causal claims)
- Registers the new store with a compliant retention-registry row (FIFO-20, keyed by content-addressed name)
- Wires the catalog entry, envelope schema, legacy extractor, and CI gates in lockstep
| Check | Result |
|---|---|
| No CRITICAL findings | ✅ |
| No unresolved STEALTH_CHANGE | ✅ |
| No UNSUPPORTED obligations | ✅ |
| Test coverage adequate | ✅ |
| No hardcoded secrets | ✅ |
| All async errors handled | ✅ |
| Input validation present | ✅ |
| No broken agent role boundaries | ✅ |
| Prompt format contracts intact | ✅ |
| Lockfile consistent | ✅ (no lockfile changes) |
🔁 Validation provenance
| Item | Decision | Reason |
|---|---|---|
Filename collision (task-cohort.ts:152) |
KEPT (LOW) | Confirmed: Date.parse millisecond precision + identical manifest digests → filename collision. Practically unlikely but structurally real. Fix path clear. |
duplicateOf double-bounded in execution-attempt.ts:242-243 |
DROPPED | Trivially redundant, not incorrect. No + line introduced it — the function is self-contained. |
duplicate class never produced at delegation terminal |
DROPPED | By design: the seam holds no original record identity (disclosed in PR). |
unknown as default outcome for non-terminal non-cancelled statuses |
DROPPED | By design: "never guess" per docs and the provider_failed class comment. |
structuredClone fallback for non-cloneable values |
DROPPED | Not a regression; the data shapes (strings, numbers, objects) are JSON-compatible. |
stage-a-route.ts _internals exports nothing |
DROPPED | Pre-existing; no + line introduced it. |
Missing duplicateOf in Stage A route execution-attempt emit |
DROPPED | By design: Stage A duplicate_result routes stay fail-open drops (disclosed); duplicateOf is only for callers who supply it. |
Missing --json cohort test in report.test.ts |
DROPPED | execution-attempt-2676.test.ts and task-cohort-2676.test.ts cover the cohort machinery directly; the report test validates the full integration with deterministic-strip for volatile fields. |
| Blind-spot: FIFO transient (write count > 20 before trim) | DROPPED | Brief window (one call) before trim runs; harmless. |
Blind-spot: report.ts JSON.parse on untrusted payload |
DROPPED | The execution_attempt_recorded rows are produced by the local emit() function — not external input. Quarantine is still applied upstream in the sink. |
🔒 Reviewed by a 3-model cross-family adversarial debate (architect → dual-lens parallel explorers → cross-critique → arbiter) for high recall with low false-positive noise. Findings are advisory — verify before acting.
PR review round — closure ledger (swarm-pr-review → swarm-pr-feedback)Full run: 6 base lanes + 11 risk-family micro-lanes (all attested), 35 raw candidates → 21 deduped, 2 independent reviewer shards, critic challenge on HIGH/CRITICAL. Review verdict: REQUEST_CHANGES → fixes shipped → reviewer APPROVE → final critic APPROVE (3 rounds) at head b142e88.
External signals
Gates after fixesno-io 112 · moved+new suites 54 · contract 731 · stage-a/lifecycle 37 · report+cohort all green · typecheck/events/retention/citations/core-events/invariants/test-clock/file-cap clean · biome ci clean (4 pre-existing warnings) · frozen C1–C3 GREEN after CHECK_WRONG amendments · reviewer APPROVE per-item · final critic APPROVE round 3 (real-Node-verified) at b142e88 / tree e181290bd65fb6949818fe4c87d49242a1fb2f8c. |
Closes #2676
PR head: b142e88
(history: 2699b5b reviewed → rebased to dcc875c (base-drift) → PR-review feedback round bbdc5c5 → final-critic rounds 2f51e42 + b142e88)
Summary
Workstream D16: binds execution traces and task-cost measurements to exact attempts and outcomes.
execution_attempt_recordedevent kind (65th catalogued, full contract registration): one event per execution attempt, joined to the exact task / call / invocation / generation identity the producer holds, with the closed attempt-class vocabularydenial | attempt | result | duplicate | late | cancelled | provider_failed, explicit capture-coverage lists (captured/unknown), andduplicateOf(required forduplicate) /generation(required forlate) enforced fail-open by the recorder.callId+invocationIdadded toWorkflowIdsSchema(13 → 15 recognized IDs; additive-optional, schema version stays 1);extractWorkflowIds+KNOWN_TELEMETRY_KEYSextended; Stage A's PascalCasesessionID/callIDnormalized at the recorder.buildTaskAttemptCost): the six axeslatencyMs, inputTokens, outputTokens, cacheReadTokens, estimatedCostUsd, billedCostUsdarenumber | null— an axis the producer did not hold is strictlynullAND listed inunavailable; zero is only ever a known value. The delegation terminal carries tokens only when the provider's own payload attested usage (cost_source === 'reported'), so the legacy zero-default fold cannot leak known-zeros; estimated-vs-billed ridecost_source.attempt) and terminal (result/cancelled, latency from dispatch start); Stage A gate route (denial×4 routes,resultforvalid_pass,latewith the correlation's generation cursor threaded from the pending-gate-task map;duplicate_resultstays a disclosed fail-open drop because the seam holds no original record identity).task-cohort.ts): deep-copied population snapshot (post-snapshot mutation cannot change a reported denominator), frozen provenance manifests for trigger/WAL/event/host-status (bounded 64 KiB digests; missing sources explicitunavailable), config/version strata, a computeduncertaintychannel (present when the sample is below threshold, any cost axis is unavailable, or any outcome is missing), and an explicit causal-ratequalificationverdict. Manifests persist under.swarm/observability/cohorts/(FIFO-20, retention-registry rowobservability-cohorts)./swarm reportgains the "Task attempts (cohort)" section (--jsonschemaVersion 2, additive); registry details + docs/commands.md regenerated. Existing pairing/savings sections are unchanged and documented as descriptive operational counts — the new section is the qualified-claims surface.docs/execution-attempt-tracing.mddefines the vocabulary, manifest schema, cohort inclusion rules, and the operational-counts vs causal-rate-claims boundary; the event-contract doc gains the kind section and the two new axes; release fragment included.Disclosed residual: the legacy
delegation_end/cost-fold zero-defaults are tracked by follow-up issue #2789 (the new surface is immune by construction and by type).Invariant audit
src/observability/execution-attempt.tsemits via the existing fire-and-forget telemetry seam; no new init registrations.bun:imports anywhere in the new modules (src/observability/execution-attempt.ts,task-cohort.tsusenode:crypto/node:fs/node:pathonly);bun run typecheckclean; emit-line-parity test passes (legacy projection byte-identical)..swarm/observability/cohorts/store written only via the explicitdirectoryparameter (report passes the project root); registered inscripts/retention-registry.data.ts(rowobservability-cohorts) +docs/observability-retention-registry.md;bun run check:retentionpasses (124 rows).bun run check:registry-citationsexit 0 +tests/unit/utils/atomic-write-ratchet.test.tspass.canonicalMkdtemp+safeRmRecursive, no real clocks in tests, no newmock.moduletargets;check:test-file-cap,check:test-tmpdir,check:test-clock,check:mock-cleanupall pass.#### execution_attempt_recordedcontract section, envelope-roundtrip fixture);bun run check:eventspasses ("65 catalogued event kinds, coherent across the TelemetryEvent union, producers, consumers/owners, retention, documentation, tests, and OTel mapping");check:core-eventsallowlists the provenance-digest read with a reason class;drift:check --enforcereports only the pre-existing local CRLF artifact (verified local-only on a clean origin/main worktree — the file is untouched by this branch).docs/releases/pending/2676-execution-attempt-tracing.mdshipped; version files untouched (release-please owns them).Test plan
Frozen acceptance checks (base
7aa8b9f8b→ head2699b5b2e, independently re-run by the implementation reviewer and the final critic):tests/unit/observability/execution-attempt-2676.test.ts17 pass / 0 fail (vocabulary, joins, late-requires-generation, duplicate-requires-identity, casing normalization, extractWorkflowIds mapping, real Stage A handler drive, provider_failed fixture drive).execution-attempt-cost-2676.test.ts9 pass / 0 fail (null+unavailable, zero-as-known, invalid→unknown, re-fold stability, real delegation-terminal drive, frozen-manifest persistence + FIFO).task-cohort-2676.test.ts9 pass / 0 fail (snapshot-then-mutate, deep-mutation immunity, manifest set + explicit unavailable, uncertainty, qualification, FIFO-20).Quality gates:
bun run typecheckclean;check:events(65 kinds);check:retention(124 rows);check:registry-citationsexit 0;retention-registry-rows+atomic-write-ratchet24 pass;check:core-eventsOK (allowlisted provenance-digest);check:mock-cleanup,check:test-clock,check:invariants,check:test-file-cap(0 violations),check:test-tmpdir,check:cross-contamination,check:bash-portability,check:gate-portability,check:pending-fragmentall pass; scopedbiome ci src tests scriptsclean (4 pre-existing warnings also on main).Regression suites: report + report-adversarial (13 pass; the determinism test normalizes the cohort's wall-clock
capturedAtexactly as it already normalizedimportedThisSync), guardrails stage-a family (24 pass), delegation-lifecycle family (30 pass), catalog-contract + envelope-roundtrip + emit-line-parity (731 pass).Mutation probes (implementation reviewer, tier L): removing
unavailable.push→ 6 tests RED; inverting the provider-attestation gate → known-zero leak caught; removing the snapshot deep copy → mutation-leak tests RED. All restored GREEN.Acceptance Criteria -> Evidence
Waivers (or none)
None. Scoped decisions (not waivers), all disclosed: legacy zero-default fold tracked by follow-up #2789; Stage A duplicate_result stays a fail-open drop (no original identity at the seam); computePairing/computeSavings documented as descriptive operational counts (docs/execution-attempt-tracing.md section 5).
PR-review feedback round (post-publication)
A full swarm-pr-review run (6 base lanes + 11 risk-family micro-lanes, 2 independent reviewer shards, critic challenge) on the published head verified 10 actionable findings and rejected 11 with evidence (transparency ledger in the run artifacts). Fixes shipped in bbdc5c5 + b142e88:
src/observability/, violating the directory's issue-[Observability PR 01/23] Define canonical event contract, correlation, and stream inventory #2029 no-I/O contract (nonode:fs,./-sibling imports only) — red on unit shards ubuntu-4 + macos-4. Fixed by relocatingexecution-attempt.tsandtask-cohort.tstosrc/services/(tests totests/unit/services/), repointing all citations (catalog producer, registry rows, gate allowlist, docs), and amending the frozen acceptance checks C1–C3 via sanctioned CHECK_WRONG amendments with fresh base-RED → head-GREEN replays. no-io.test.ts untouched and green (112 pass)./swarm reportcohort section had zero content coverage — new integration test seeds real attempt rows through the DB and asserts the fold (denominator, per-class counts, cost known/unavailable split, uncertainty, qualification) in both JSON and markdown.--target node— and then found the deeper bug: the bun→node runtime fallback relied on.trim()truthiness, so under Node it yielded the version-less"bun"and sha256'd it into the host-status digest. Fixed with a purederiveRuntimeLabelbranching on bun presence, the derived label persisted intosnapshot.strata, and a digest-tie test (digest === sha256(persisted label), never the constantsha256("bun")), verified under real Node v24.16.0 by the critic.Gates after the round: no-io 112 pass, contract 731 pass, all suites green, typecheck/events/retention/citations/core-events/invariants/test-clock/file-cap clean, biome ci clean (4 pre-existing warnings), frozen checks C1–C3 GREEN after CHECK_WRONG amendments. Independent reviewer APPROVE (per-item) + final critic APPROVE (Round 3, real-Node-verified) at head b142e88 / tree e181290bd65fb6949818fe4c87d49242a1fb2f8c.