Retain the attempted terminal phase on writer failure

The direct writer-interface control also checks the fixed failed phase. Report the attempted terminal, not the preceding in-memory recovery phase.

Contract-Neutral: Correct the fixed diagnostic label and its existing contract control; restoration, evidence-failure exit and authority remain unchanged.
Change-source: pulse-maintainer
This commit is contained in:
pulse-triage[bot]
2026-10-03 04:17:11 +01:00
parent 5cf724b4e7
commit 227657b1b0
2 changed files with 5 additions and 3 deletions
+4 -3
View File
@@ -438,13 +438,14 @@ class Transaction:
if self.receipt["observation_failures"]:
unverified()
terminal = self.receipt["status"] if self.receipt["observation_failures"] else status
try:
self.save(self.receipt["status"] if self.receipt["observation_failures"] else status)
self.save(terminal)
except (OSError, Failure) as error:
if isinstance(error, Failure) and str(error) != "receipt-observation":
raise
if self.receipt["status"] not in self.receipt["observation_failures"]:
self.receipt["observation_failures"].append(self.receipt["status"])
if terminal not in self.receipt["observation_failures"]:
self.receipt["observation_failures"].append(terminal)
unverified()
# One bounded attempt to retain the failure, not to obtain a pass.
self.recovery_save("observation_failed")
@@ -339,6 +339,7 @@ class TransactionTest(unittest.TestCase):
self.assertEqual(engine.estate_hash(self.paths), self.before)
self.assertEqual(tx.receipt["recovery"]["elapsed_seconds"], 300)
self.assertEqual(tx.receipt["failure"], "new-service-crash")
self.assertIn(phase, tx.receipt["observation_failures"])
self.assertEqual(tx.receipt, json.loads((self.attempt / "receipt.json").read_text()))
# Keep each independent snapshot/intent; never reuse its path.
self.attempt = self.root / "attempts" / ("b" * 64)