Skip to content

round-16: Corrupt succeeded-attempt-row evidence under the strict verdict makes the run permanently unresumable, with no quarantine action, test, or doc #171

Description

@roninjin10

Severity: p1
Area: engine-store
Slug: attempt-row-corruption-strict-terminal

Claim

The #164 quarantine contract (journal AND take a state action so the next dispatch proceeds) landed only on the cache-hit branch. The succeeded-attempt-row branch (the second corruption detection site) journals the Inconsistency record and, under the default strict verdict, fails with the non-retryable CacheCorruptionDetected — but takes no repair/quarantine action on the durable attempt row, so every resume of that run re-reads the same row via attempts.get(attemptId), re-detects the identical corruption, and re-fails forever, with tolerant mode or time-travel as the only exits. Blind eviction/re-execution would violate exactly-once for irreversible activities (the gaps lens's dissent is valid), so the fix is not a copy of #164 — but the terminality is currently neither an explicit documented design decision nor pinned by any test, and it is the same permanent refuse→fail shape #99/#107/#164 closed elsewhere.

Evidence

Failure scenario

Run R's attempt seals; a disk fault corrupts one recorded output blob; R resumes → strict fail. Every subsequent resume repeats identically and R can never complete without hand-deleting the row.

Verifier confirmation

Read the code read-only; every element of the claim holds. (1) The succeeded-attempt-row branch at 570-623 never mutates the row. (2) The #164 quarantine (journal AND cache.evict) exists only on the cache-hit branch. (3) CacheCorruptionDetected is non-retryable with no opt-out, so the re-fail loop is deterministic. (4) No test pins whether the run stays failed or heals on a second dispatch. (5) The terminality is not documented as a design decision. The finding's own caveat is also correct: blind eviction of a succeeded attempt row would re-execute a durably-completed (possibly irreversible) activity, so the fix legitimately differs from #164 — but that nuance doesn't refute the claim, which is precisely that the terminality is neither quarantined, tested, nor documented.

Found by the iterate-until-dry loop, round 15 review.

Metadata

Metadata

Assignees

No one assigned

    Labels

    second-reviewsecond-pass review finding

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions