Objective
Stop crates lane authorize from hard-failing with blocked_registry_state (indeterminate) when a still-absent crate's initial observe-all snapshot ages past MAX_OBSERVATION_AGE_SECONDS (10m) during durable crates.io Retry-After waits.
Evidence
- Run: https://github.com/CurateLabs/graphforge/actions/runs/30715697365
- After
graphforge-rel accepted (following a 523s Retry-After sleep), authorize for crates:graphforge-search exited 1 with blocked_registry_state (indeterminate).
- No search attempt/receipt was written.
- Live crates.io:
graphforge-search does not exist (404). Reconciliation for that run classifies search as absent / publish.
- Root cause:
plan_recovery rewrites observations older than 10 minutes to observation_stale → indeterminate. The crates loop refreshes only the crate just published, so remaining absent crates keep the initial observe-all timestamp.
Done when
- The crates publish loop refreshes the current node's live observation immediately before
authorize.
- A contract test locks that ordering/behavior.
- Authorize failure text includes the observation reason when disposition is blocked (for operability).
- Tag
v0.5.1 remains at dd1fd8cdeb75aba11948ed6e1871e98a46560be8 (no retag).
Non-goals
- Moving or retagging
v0.5.1.
- Weakening observation age checks.
- Thrashing redispatches without this fix on
main.
Objective
Stop crates lane authorize from hard-failing with
blocked_registry_state (indeterminate)when a still-absent crate's initialobserve-allsnapshot ages pastMAX_OBSERVATION_AGE_SECONDS(10m) during durable crates.ioRetry-Afterwaits.Evidence
graphforge-relaccepted (following a 523s Retry-After sleep), authorize forcrates:graphforge-searchexited 1 withblocked_registry_state (indeterminate).graphforge-searchdoes not exist (404). Reconciliation for that run classifies search asabsent/publish.plan_recoveryrewrites observations older than 10 minutes toobservation_stale→indeterminate. The crates loop refreshes only the crate just published, so remaining absent crates keep the initial observe-all timestamp.Done when
authorize.v0.5.1remains atdd1fd8cdeb75aba11948ed6e1871e98a46560be8(no retag).Non-goals
v0.5.1.main.