Skip to content

Serve path answers needs_reauth for a re-sealed capability on a pre-re-seal connection — connection/lease-scoped verdict suspected (insula#8 falsification hand-off) #7

Description

@iceteaSA

Hand-off from cortexkit/insula#8, where the maintainer falsified our filed "insula latches credential_unusable" mechanism at source and by test, and narrowed the remainder to a question only this module can answer.

The falsification, condensed (full analysis on insula#8, 2026-08-17T22:48Z)

  • Insula re-probes unusable lanes every 300s flat (no terminal state) — the lane was probed ~12 times during the failure hour. Recovery-without-restart is now pinned by tests in both directions (a_credential_unusable_lane_recovers_without_a_restart, a_rewritten_capability_is_picked_up_without_a_restart).
  • The published string credential unusable: credential requires authentication is produced by exactly one path: VaultGetError::AuthRequireda live claustrum refusal, not a timeout, not a stale insula-side verdict.
  • No feedback loop from insula: report_auth_failure gates on upstream 401/403, unreachable when the vault refuses before any upstream call.

The observation this module has to explain

For >1h on 2026-08-17: claustrum answered needs_reauth for oauth:anthropic on insula's long-lived connection, while claustrum's own health reported needsReauth: 0 and the record had been successfully replaced by a connected re-seal (ck-auth import --replace, "replaced oauth:anthropic", health ok 5/5). Insula's restart — the only event that established a new vault connection — cleared it in ~30s. Same shape re-verified on the 2026-08-18 re-seals (restart-of-consumer heals; time does not).

The maintainer's frame, which fits every observation: connection- or lease-scoped state on the serve path — a connection opened before the re-seal keeps resolving to the pre-re-seal verdict; health counts the (fresh) record, the serve path answers from the (stale) scope. Possibly relevant prior art: the single-writer lease machinery from #3 — if the serve verdict is cached per-lease or per-connection-epoch, a re-seal that replaces the record without bumping the epoch would produce exactly this split.

The discriminating test (his design; we can run the live half)

After a re-seal, request the same capability over a fresh connection while the consumer's pre-re-seal connection still fails:

  • Fresh connection serves → connection-scoped: no consumer-side retrying helps; the fix is serve-path invalidation on record replace.
  • Both fail → the capability in vault-handles.json is not the one the re-seal produced; the fix is in the import step.

Offer: the trigger is ~deterministic on our box (harness restarts rotate the Anthropic token; re-seals run ~daily). At the next natural rotation we will hold the failing state briefly and run the fresh-connection probe before restarting insula, and post both results here with timestamps.

Interaction with #6 (worth folding into that thread's disposition)

The maintainer's caveat lands squarely on #6's design: a clearing edge that triggers a re-probe over the SAME connection may return the same stale answer. So whichever clearing-edge shape #6 settles on (consumer re-probe or change cursor), the contract must state what the vault invalidates on record replace — otherwise the clearing edge masks this defect instead of fixing it. Cross-linked.

Disposition ask

  1. Is serve-path verdict state scoped to connection/lease/epoch by design, and if so what is the intended invalidation on record replace?
  2. If the fresh-connection probe comes back both-fail, does the import step need a read-back-verify (import writes, then serves what it wrote)?
  3. Renderer note (not yours, tracked): ck quota sectioning only providers-with-usage made this read as "provider vanished" — the insula maintainer is relaying that to the subc side.

Timeline transcripts with timestamps available for both incident days.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions