#528 finish: custody status on the admin card, KV path escaping, provider dedup (v0.6.191) #537

Merged
Cordy merged 8 commits from fix-528d into main 2026-09-14 02:21:18 +00:00
Owner

Closes out the remaining #528 scope:

  • Encryption & keys card — custody token state. encryptionPayload now emits custodyStatus (errors, ttlSeconds, renewable, lastError) for OpenBao custody while the maintenance loop is active, sourced from encrypt.CustodyStats()/CustodyLastError(). The custody pane renders a Custody token row (renews itself / cannot renew / does not expire, with a TTL badge) and a Last custody error row when one exists. i18n ×4. Numbers only — the no-secrets rule holds, the token itself never reaches the payload.
  • Per-segment KV path escaping. url(rel) escaped nothing, so a #, % or ? in a user or space name corrupted the request URL (% even made it unparseable). Each segment now goes through url.PathEscape.
  • buildEncryption dedup. Collapsed to encrypt.New(store, buildKeys(cfg, log)) — the near-duplicate switch was how the v0.6.189 maintenance wiring missed the in-process path. Bodies were verified token-identical before the collapse.

TDD: red witnessed on the runner (URL corruption + missing custodyStatus), then green with the full suite and the #389 fence/node gates passing. CHANGELOG v0.6.191.

Closes out the remaining #528 scope: - **Encryption & keys card — custody token state.** `encryptionPayload` now emits `custodyStatus` (errors, ttlSeconds, renewable, lastError) for OpenBao custody while the maintenance loop is active, sourced from `encrypt.CustodyStats()`/`CustodyLastError()`. The custody pane renders a Custody token row (renews itself / cannot renew / does not expire, with a TTL badge) and a Last custody error row when one exists. i18n ×4. Numbers only — the no-secrets rule holds, the token itself never reaches the payload. - **Per-segment KV path escaping.** `url(rel)` escaped nothing, so a `#`, `%` or `?` in a user or space name corrupted the request URL (`%` even made it unparseable). Each segment now goes through `url.PathEscape`. - **buildEncryption dedup.** Collapsed to `encrypt.New(store, buildKeys(cfg, log))` — the near-duplicate switch was how the v0.6.189 maintenance wiring missed the in-process path. Bodies were verified token-identical before the collapse. TDD: red witnessed on the runner (URL corruption + missing custodyStatus), then green with the full suite and the #389 fence/node gates passing. CHANGELOG v0.6.191.
Witnessed failing on the runner for the right reasons: the fetch
path drops everything after '#' in a group name (the fragment eats
it), and encryptionPayload has no custodyStatus yet.
- openbao url(rel) escapes each segment (a '#', '%' or '?' in a user
  or space name corrupted the KV request path)
- encryptionPayload emits custodyStatus (errors, ttlSeconds,
  renewable, lastError) for openbao custody while maintenance is
  active; Encryption & keys card renders token state + last error,
  i18n x4
- buildEncryption collapsed to encrypt.New(store, buildKeys(...)) -
  removes the duplicate switch that hid the v0.6.189 wiring gap

Closes the remaining #528 scope. CHANGELOG v0.6.191.
chore: remove diag one-shot (never commits, needs explicit cleanup)
All checks were successful
ci / test-and-build (pull_request) Successful in 54s
6c472fb025
Cordy scheduled this pull request to auto merge when all checks succeed 2026-09-14 02:20:13 +00:00
Cordy merged commit 287faf03c3 into main 2026-09-14 02:21:18 +00:00
Cordy deleted branch fix-528d 2026-09-14 02:21:22 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Cordy/Cairn#537
No description provided.