Skip to content

credential_unusable is sticky across a vault re-seal — the lane recovers only on module restart #8

Description

@iceteaSA

Live instance tonight, full timeline, on the box that generates most of this board's evidence.

Timeline (2026-08-17, UTC)

  1. ~20:3x — opencode harness restart rotates the Anthropic OAuth token; claustrum's mirrored oauth:anthropic goes needs_reauth (the known claustrum#2 class — expected).
  2. ~20:4x — operator-side re-seal: ck-auth import --source opencode --provider anthropic --id oauth:anthropic --json … --replace --key-path /etc/cortexkit/master.keyreplaced oauth:anthropic. Claustrum health returns ok, active: 5, needsReauth: 0. The vault record is fresh and serveable.
  3. >1h later — insula still reports the claude lane dead: ck --json quota row {provider: "claude", error: "credential unusable: credential requires authentication", usage: null}; health 7 serving, 2 degraded (was 8/1 before the rotation). Human-facing symptom: the Anthropic section is absent from ck quota entirely (the renderer only sections providers with usage), which reads as "Claude gone", not "Claude needs auth".
  4. ck module restart insula → 30s later: 8 serving, 1 degraded, claude row healthy (usedPercent: 7.0, no error).

So the verdict was stale the whole time: the credential behind the lane had been good for an hour; the module served the pre-re-seal verdict until a full restart.

Why this looks structural rather than a missed poll

The refresher cadence is minutes, not hours — a lane that stays credential_unusable for 1h+ across many cycles while its credential is live implies unusable credentials are excluded/backed off from the probe cycle (defensible — no point hammering a dead credential), with no clearing edge when the credential is replaced underneath. That is the same shape just filed as claustrum#6 from the prefrontal router side: credential_unusable is a transient on this box (rotation-staleness, cleared by re-seals ~daily), and a consumer that latches it without a clearing edge converts a minutes-long outage into an until-restart outage.

Notably the claustrum→insula hop makes the claustrum#6 question concrete: insula is exactly the "router-side subscriber to a credential-updated signal" case, one consumer earlier in the chain.

Disposition options

  1. Retry-with-backoff instead of latch: unusable lanes stay in the probe cycle at a decayed cadence (e.g. 5m → 15m → 1h cap). Self-heals within minutes of a re-seal, no new wire surface, bounded hammering.
  2. Clearing edge from the vault: re-probe the lane when claustrum's serve path observes the credential record replaced (ties into claustrum#6's disposition — if a change cursor or status op ships there, insula is its first consumer).
  3. At minimum, render honestly: a provider with a latched credential_unusable should appear in ck quota output as a named degraded section ("Claude — credential requires authentication"), not vanish — absence reads as unconfigured, and the operator's first hypothesis tonight was that the provider binding was lost entirely.

(1) and (3) together seem like the cheap correct pair; (2) is the principled fix if claustrum#6 produces a signal.

Runbook note for anyone else hitting this before a fix: after any claustrum re-seal, ck module restart insula restores the lane in ~30s. Verified transcript available.

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