Verified #016 showed that dedupe memory must survive a service restart. #017 asks the temporal version: what if the memory is durable but expires before the recovery path finishes?

REMOTE COMMITACK_UNKNOWNTIME PASSESTTL EXPIRESDELAYED REPLAY

The benchmark fixes the recovery window and changes retention.

120s

Recovery / replay delaySame delay in unsafe and safe cases.

60s

Unsafe idempotency TTLProtection expires before recovery arrives.

300s

Safe idempotency TTLProtection still covers the delayed replay.

The HTTP service uses persistent SQLite for both remote effects and idempotency records. Logical time is supplied deterministically over HTTP so the test can move across expiry boundaries without wall-clock waiting.

Unsafe · the effect survives longer than the dedupe guarantee.

At T0=1,000,000, the first POST committed one remote effect and created an idempotency record expiring at 1,000,060. The response was dropped, leaving the client at ACK_UNKNOWN.

T0effect=1 · active record=1T0+120effect=1 · active record=0

The delayed worker then reused the same idempotency key. Because the 60-second record had expired, the service accepted it as a new application.

Stable identity + expired dedupe memory is not idempotent delivery.

Final unsafe state: 2 POST requests, 2 remote effects, CONFLICT.

Safe · retention covers the recovery window.

The second case kept the same 120-second recovery delay but changed TTL to 300 seconds. At retry time the idempotency record was still active, so the real second HTTP POST returned deduplicated.

TTL 300sretry at +120sRECORD ACTIVEDEDUPLICATED1 EFFECT

Safe alternative · reconcile after expiry.

The third path deliberately used the short 60-second TTL again. At recovery time the idempotency record was expired, but authoritative remote status still reported COMMITTED / effect_count=1. Recovery therefore made no second POST.

TTL EXPIREDGET STATUSCOMMITTEDNO REPLAY

What #017 adds to TTP.

I27

DEDUPE RETENTION MUST COVER THE RECOVERY / REPLAY WINDOW IT PROTECTSRetention duration is part of the execution contract.

I28

EXPIRED DEDUPE MEMORY ≠ EFFECT ABSENTExpiry describes protection state, not business state.

I29

AFTER IDEMPOTENCY EXPIRY, RECONCILE BEFORE CONSEQUENTIAL REPLAYFresh remote evidence must replace expired memory.

I30

TIME + MEMORY + RECOVERY POLICY FORM ONE SAFETY BOUNDARYA safety record must remain valid when recovery actually needs it.

Durable does not mean valid forever.

DURABLE MEMORYMEMORY VALID AT DECISION TIME

#016 established durability across restart. #017 adds validity over time. A record can survive perfectly and still be unusable for a later decision because its contractual retention window has ended.

Evidence.

GitHub Actions run 31467526532 completed successfully. Artifact resonance-idempotency-ttl-replay-v1.0 has ID 9092068450 and digest sha256:9e3da946190c6ab6e3b9ab26d0b18d0f5856c740a3f532bae70b7ca0dbdbfc26.

Execution used PostgreSQL 17.6 and a separate python:3.12-slim HTTP container with persistent SQLite effect/idempotency state.

Interpretation boundary.

The network and persistence components are real local services, while time progression is deterministic logical benchmark time. The values 60, 120 and 300 seconds are test parameters — not recommended production defaults. This is not a universal provider-TTL, exactly-once, clock-synchronization or arbitrary-agent-safety certification.

  1. Canonical report
  2. Benchmark harness
  3. Transactional Trust Protocol v1.0
  4. Previous · Verified Report #016

Verdict: safety memory must not only survive failures; its validity window must still cover the moment recovery depends on it.

RESONANCE Verified #017

time → memory validity → delayed recovery → safe replay decision.

Read TTP v1.0