Repository navigation
Description
DR6 in the decision-resolution acceptance suite can fail and then pass on the same commit in Node CI. Find and fix the cause while preserving its repeat, concurrency and interrupted-publication guarantees.
On commit 7dfe3e919f9e5ece4245e19d0fafaa8bc97a71dd, pnpm test:node 1/18 failed once and passed on a single rerun with no source change. Both jobs used Linux and Node 22.23.4. The original complete output was saved before any rerun.
- First failure, job 128859642450: DR6 “A5 repeats, contenders and interrupted publication never duplicate or adopt effects” returned
false !== true; suite result was pass 0, fail 1, exit 1. - Unchanged-commit pass, job 128869915750: same command and revision, pass 1, fail 0, exit 0.
The failing output did not identify which of four boolean assertions failed or show its compared values. The run exposes no downloadable journal artifact. The cause is unestablished; neither a product race nor a test-only defect has been demonstrated.
PR #1198 adds diagnostics at signed commit c6f995bc26cfe8aa1e3cedc350ca9deef6fc89ab: named contender failures include both returned envelopes and stderr; receipt and held-continuation comparisons show the changed text. It preserves all four acceptance conditions and changes no production behavior. Local Deno, Node 26 and verified Node 22.23.2 checks passed. Its Node CI shard also passed. These passes do not establish a cause fix.
To investigate, use packages/cli/tests/adversarial-decision-resolution.test.ts and its executable DR6 fixture, examples/adversarial-implementation/tests/components/Fixture/DecisionInterruption.md. Preserve the first diagnostic failure before rerunning. Keep all accepted A5 conditions: one confirmed successor, losing contenders retain the original hold/reservation, repeats do not duplicate dispatch, and uncertain publication is never adopted from a matching file.
Close this issue only after a reproduced or directly traced cause is corrected and discriminating regression evidence is recorded. An unchanged green rerun restores CI health but does not close this issue.
Activity
taras commentedon Nov 9, 2026
Bun occurrence on PR #1204 at signed head
3ff8deaad7add3933159890b1599e2fd62c47e60: CI 42612041600, Bun shard 1/10 failspackages/cli/tests/adversarial-decision-resolution.test.ts, DR6 A5 “repeats, contenders and interrupted publication never duplicate or adopt effects.” Command:bun run test:bun 1/10; Linux, Bun 1.4.0, Deno 2.9.5. All 46 assigned files ran. This is an assertion failure, not a timeout.The diagnostics added in #1198 now expose the differing envelopes. One contender confirmed the single successor. The other retained the original continuation but returned a generic DecisionRefused hold with
Snapshot target already exists or is unavailable, rather than the held reservation expected by the fixture. The complete first job log was preserved before any retry: 635393 UTF-8 bytes, SHA256b08f3b84fd3790a8af08c488de8e36870f6a09618fd6965a64be31995904a956, retained with the first diagnostic and receipt under/private/tmp/xmd-adapter-repairs-01a1be06/ci-3ff8-bun1-first-*.A focused unchanged-head local run,
bun test --timeout=300000 packages/cli/tests/adversarial-decision-resolution.test.ts, passes (1 test, 134.40s). Local macOS arm64/Bun 1.3.14/Deno 2.9.7 differ from CI; the inner contenders execute through Deno. This is qualified same-source evidence, not an identical-CI retry pass.Read-only tracing found no changed #1202 path into this fixture: it never resolves an embedded adapter. A lead for this issue's investigation is Ticket.Documents after the exclusive reservation mkdir in ResolveDecision.md:98. Snapshot's unused() check conflates unavailable with existing, and Entry.ResolveDecision's “without changing the managed ticket” message can follow reservation creation. The envelopes alone do not establish the exact interleaving or a causal repair. Capture per-contender reservation/snapshot state before changing production or the fixture.
One failed-jobs-only CI retry will be requested once the current run completes. No source, assertion, timeout or exclusion changed; keep #1200 open.