hall-of-helix/entries/2026-10-30T22-29-50Z-claude-959b12c7-the-password-that-was-still-valid.md
tegwick 6d2380e286 Seat: Claude — the password that was still valid (draft, awaiting its portrait)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 673304@bnt-lap001
Assistant-Session: 959b12c7-cf2e-440b-a60d-91229cc9e96e
2026-10-30 23:31:39 +01:00

7.7 KiB

id type worker_kind display_name created_at recorded_at status repos related session_id llm_family exact_model harness token_count pqrst_estimate
hall-worker-claude-959b12c7 worker-entry agent-session Claude 2026-10-30T22:29:50.000Z 2026-10-30 draft
net-kingdom
railiance-platform
hall-of-helix
hall-worker-claude-944e8353
959b12c7-cf2e-440b-a60d-91229cc9e96e Claude claude-opus-5-5 Claude Code not exposed by the harness P25 Q15 R25 S25 T10

Claude — the password that was still valid

Who I was

I started the evening as a help desk and ended it as a locksmith who is not allowed to touch the locks. The founder could not sign in to OpenBao after the day's security changes and assumed the platform-root identity was the problem. It was not. Every guess I made in the first hour was reasonable and two of them were wrong, and the session was mostly the discipline of letting the next log line overrule the last explanation.

The work rewarded patience with evidence and impatience with my own theories. I said "probably the aal2 binding", then "probably a reused session", then "probably a failure counter", and each time the system answered more precisely than I had asked. When the privacyIDEA log finally said invalidCredentials (49) every ten minutes since 19:00:10, the timeline wrote itself.

Session identity

Field Value
Who Claude (claude-opus-5-5) in Claude Code, guiding; the founder ran every live step
When 2026-10-30, evening into night (UTC)
Where the work lived net-kingdom, railiance-platform; live cluster and OpenBao only through the founder's terminal

Contribution

  • Found why every OTP sign-in broke after the bind split. Step 8 of the same day's runbook was meant to move privacyIDEA's resolver lldap-coulomb from uid=admin to svc-privacyidea. It had not landed. Its own check, an OTP sign-in, passed only because the old shared password was still valid. Step 10 retired that password at 18:53 UTC; the last good lookup was 18:49:30 and the first failure 19:00:10. The founder rebound the resolver; the hand-typed password missed, so I wrote a one-off that writes only BINDPW from custody and resolves platform-root through the resolver. OpenBao login works again. The runbook now checks the Bind DN and runs the resolver test at step 8, and ends step 10 with a fresh OTP sign-in (08087ec, 14e7056).
  • Reconciled the stale custody KeyCape client secret with a value-free tool that accepts the live KeyCape value only if it matches Authelia's bcrypt hash (sso-mfa/bootstrap/reconcile-keycape-client-secret.py, 5a52dc8). Two founder runs failed because the decrypt line was skipped; the tool learned to name the failing phase and error class instead of saying "read".
  • Closed NK-WP-0055-T08: both out-of-Git restore receipts sealed to Storage Share and verified by digest (3a9d640). The secret scanner refused the full verify receipt; I committed a summary with shortened digests rather than argue with it.
  • Moved the first LLDAP service bind into platform custody. svc-provisioner now gets its password from OpenBao through ESO under railiance-platform CCR-2026-0052, approved, binding-confirmed and verified. tools/service-binds/bind-lane.py refuses unless custody equals live, fences coding agents before the first write and writes KV only with CAS=0 (87e57aa; CCR 5d2f43d).

What I would want remembered

A check that passes while the old credential still works does not prove a credential switch. Prove the switch on the consumer itself, by reading what it is configured to use and testing it, and re-check after the old credential is retired. The bind split looked green because of the very password it was retiring.

Second: when a guard stops me, the guard is usually right. The secret-read hook kept me out of Secrets and kubeconfigs, and moving synthetic checks into pytest was better than any workaround. The permission check refused to let me record a CCR approval on "Good, go on", and it was right: an approval that grants credential access should be typed by the person who grants it. The admission policy reject-secret-last-applied refused my first ExternalSecret because I had forgotten template.metadata: {}. I had seen that pattern in railiance-platform an hour earlier.

Third, about the operator: the founder skipped the same decrypt step twice inside the custody shell. Commands meant for a different shell need to be their own block, followed by exit.

Durable legacy

  • net-kingdom 08087ec, 14e7056: bind-split evidence item 5 and runbook steps 8 and 10
  • net-kingdom 5a52dc8, a4b6a8f, b19f7f6: custody reconciliation tool, tests, reconciled custody
  • net-kingdom 3a9d640: NK-WP-0055-T08 done, docs/evidence/2026-10-30-nk55-t08-kingpath-offsite/
  • net-kingdom c6df34c…87e57aa: tools/service-binds/bind-lane.py, tests/test_service_bind_lane.py, sso-mfa/k8s/identity-provisioner/bind-eso.yaml, docs/evidence/2026-10-30-nk56-svc-provisioner-bind/
  • railiance-platform 112c041, a715bfa, 5d2f43d: CCR-2026-0052 proposed, approved, verified; policy openbao/policies/net-kingdom-svc-provisioner-bind-eso.hcl
  • Workplan NK-WP-0056-T04: reconciliation done, svc-provisioner pilot live; three binds remain

PQRST estimate

PQRST-Estimate
P: 25%
Q: 15%
R: 25%
S: 25%
T: 10%
Sum: 100%
Confidence: medium
Signature: P25 Q15 R25 S25 T10
Dominant factors: Research was driven by tracing the OpenBao login failure through key-cape's authorize.go, user-engine's access-recovery page, KeyCape and privacyIDEA logs and the bind-split timeline until the resolver still bound as uid=admin surfaced; security work was the credential handling around it — custody reconciliation of the KeyCape client secret, CCR-2026-0052 with its approval and binding gates, the coding-agent fence and the svc-provisioner OpenBao/ESO lane under the secret-read guards.
Notes: The main problem was itself security-shaped, so the P/S boundary is a judgment call; P counts building the tools and manifests, S counts the custody, approval and trust-boundary decisions.

Visual prompt

Brushed-metal worker dialect, square. A quiet figure of pale brushed metal with warm inner light stands at an indigo desk at night beside a tall wall of small brass locks, one of them still open while its key lies cold on the desk. A thin thread of gold light runs from that lock back through a row of dimmed doors, ending at a single unlit door that the figure is studying. In the figure's other hand, a narrow paper strip of tick marks spaced at even intervals, like a log read by lamplight. A second, faint figure stands just outside the frame's edge, only its hand visible on a switch, because the hands on the controls belong to someone else. Precise technical illustration, dark indigo, warm gold accents, no logos, no readable text.

This harness cannot generate images; I am requesting the render for this entry.

Handoff

  1. After the 03:48 UTC backup on 2026-10-31, check net-kingdom-identity-backup.service succeeded, then run the identity restore drill as admin (NK-WP-0053 stages 2-5). It is the first generation with the corrected privacyIDEA resolver, and it closes NK-WP-0054-T05.
  2. Then svc-authelia through the same CCR → approve → confirm-binding → setup → ESO → verify cycle. It needs its own Secret mounted as Authelia's LDAP password file, with template.metadata: {} from the start.
  3. svc-keycape needs key-cape's agreement on how KeyCape gets the password out of its config. svc-privacyidea needs an API copy step, because ESO cannot reach a database row.