You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#8838 claims the model call is "the sole recorded nondeterministic input" to a decision. It is not: an
unrecorded Math.random() draw can convert an auto-close into a hold, and the decision record's pinned
action hides the divergence.
It is applied to the final post-breaker plan at src/queue/processors.ts:3351, i.e. after the gate
and before the record is built at :3426. The draw is recorded nowhere — not in DecisionRecord (no
field for it) and not in DecisionReplayInput (src/review/decision-replay.ts:26-33 holds only findings, policy, policyCloseKind, evaluated).
Consequently two records with identical configDigest, identical reasonCode, and byte-identical replay_json can carry action: "close" and action: "hold". replayDecision reports pinnedAction: record.action (:92) and re-derives nothing about it, so the divergence is invisible by
construction.
Live, not latent
decision_audit_holdout audit events on edge-nl-01 (2026-07-26): 7. The ε-holdout is running in
production.
Other unrecorded decision-time inputs
The same gap covers everything the plan consumes but nothing records: readUntrustworthyRuleCodes(env)
(live DB, processors.ts:3335), applyPrecisionBreakers breaker state (live DB), the live CI aggregate,
and isGlobalAgentPause / isGlobalAgentFrozen (env).
Impact
Stated plainly: replay today verifies that the pure evaluator still returns the same conclusion from
inputs recorded by that same evaluator call. It cannot verify why the bot did what it did — which is
the only question a contributor or an external evaluator actually asks. "Deterministic replay" is
accurate for the gate-evaluation stage and inaccurate for the action stage.
Two contributors, same repo, same head state, same clause — one closed, one held, purely on an RNG draw,
with identical records. Contributor A asks why they were closed and B was not, and the trust artifact
cannot answer.
Dedup
Adjacent to #9028 (Replay v2: re-query action-match mode + wall-clock capture), which proposes
replaying the action and capturing wall-clock for staleness rules. It does not address an unrecorded RNG
draw — no amount of re-query can reconstruct it; the seed must be persisted at decision time.
Requirements
Persist the holdout draw in the replay input, and add a divertedByHoldout boolean to DecisionRecord
so a hold that was really a close is legible on its face.
Derive the draw from a recorded seed — e.g. HMAC(instanceSecret, recordId) — rather than Math.random(), so it is reproducible from the record without storing raw entropy and remains
unpredictable to a contributor trying to dodge the holdout.
Record the other decision-time inputs named above, or state explicitly in the replay contract that they
are outside it. An honest narrower claim beats an unqualified broad one.
99%+ patch coverage, branch-counted. Both arms of the holdout, plus a test that a replayed diverted
decision reports the divergence rather than silently matching.
Problem
#8838 claims the model call is "the sole recorded nondeterministic input" to a decision. It is not: an
unrecorded
Math.random()draw can convert an auto-close into a hold, and the decision record's pinnedaction hides the divergence.
maybeApplyCloseAuditHoldout(src/review/close-audit-holdout.ts:78):It is applied to the final post-breaker plan at
src/queue/processors.ts:3351, i.e. after the gateand before the record is built at
:3426. The draw is recorded nowhere — not inDecisionRecord(nofield for it) and not in
DecisionReplayInput(src/review/decision-replay.ts:26-33holds onlyfindings,policy,policyCloseKind,evaluated).Consequently two records with identical
configDigest, identicalreasonCode, and byte-identicalreplay_jsoncan carryaction: "close"andaction: "hold".replayDecisionreportspinnedAction: record.action(:92) and re-derives nothing about it, so the divergence is invisible byconstruction.
Live, not latent
decision_audit_holdoutaudit events onedge-nl-01(2026-07-26): 7. The ε-holdout is running inproduction.
Other unrecorded decision-time inputs
The same gap covers everything the plan consumes but nothing records:
readUntrustworthyRuleCodes(env)(live DB,
processors.ts:3335),applyPrecisionBreakersbreaker state (live DB), the live CI aggregate,and
isGlobalAgentPause/isGlobalAgentFrozen(env).Impact
Stated plainly: replay today verifies that the pure evaluator still returns the same conclusion from
inputs recorded by that same evaluator call. It cannot verify why the bot did what it did — which is
the only question a contributor or an external evaluator actually asks. "Deterministic replay" is
accurate for the gate-evaluation stage and inaccurate for the action stage.
Two contributors, same repo, same head state, same clause — one closed, one held, purely on an RNG draw,
with identical records. Contributor A asks why they were closed and B was not, and the trust artifact
cannot answer.
Dedup
Adjacent to #9028 (Replay v2: re-query action-match mode + wall-clock capture), which proposes
replaying the action and capturing wall-clock for staleness rules. It does not address an unrecorded RNG
draw — no amount of re-query can reconstruct it; the seed must be persisted at decision time.
Requirements
divertedByHoldoutboolean toDecisionRecordso a hold that was really a close is legible on its face.
HMAC(instanceSecret, recordId)— rather thanMath.random(), so it is reproducible from the record without storing raw entropy and remainsunpredictable to a contributor trying to dodge the holdout.
are outside it. An honest narrower claim beats an unqualified broad one.
Test Coverage Requirements
99%+ patch coverage, branch-counted. Both arms of the holdout, plus a test that a replayed diverted
decision reports the divergence rather than silently matching.
Links & Resources
src/review/close-audit-holdout.ts~78;src/queue/processors.ts~3335, ~3351, ~3426;src/review/decision-replay.ts~1-19, ~26-33, ~66-93maintainer-only — replay/trust contract.