Founder-run under CCR-2026-0057: KeyCape client registered, lane.py setup (privacyIDEA-generated key, KV v1) and verify passed; the live journey reached aal2 with otp against kc.coulomb.social. Receipts, findings and the one teardown of a partial run in docs/evidence. syn-journey declared active. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Assistant: claude-code Assistant-Model: opus Assistant-Process: 994874@bnt-lap001 Assistant-Session: 6017c416-d619-47eb-bd1a-f670a02d7d87 |
||
|---|---|---|
| .. | ||
| 00-setup-refused-absent.json | ||
| 00-setup-refused-pi-admin-login.json | ||
| 00-verify-before-setup.json | ||
| 01-setup.json | ||
| 10-teardown.json | ||
| 11-setup.json | ||
| 12-verify.json | ||
| README.md | ||
NK-WP-0056-T09: synthetic journey identity live (2026-10-31)
Founder-run, attended. claude-code prepared the tooling and guided the run. Under CCR-2026-0057
(railiance-platform 2ac9786, sha256 4a966885…8754) and the accepted SecurityCase
nk-synthetic-journey (net-kingdom d654f8a):
- The KeyCape client
nk-synthetic-journey(public, PKCE, MFA pinned) was registered withkeycape-client.py apply(check-config from the deployede2b5fa1binary) and KeyCape restarted. lane.py setupfenced coding agents from the KV path and createdsyn-journeyin LLDAP with no groups and a generated password. It enrolled TOTP tokenSYNJOURNEY01in realmcoulombwith a key generated by privacyIDEA, confirmed with a code, and wrotePASSWORDandTOTP_SEEDtoplatform/workloads/net-kingdom/synthetic-journey/syn-journey(KV v1, CAS=0). No workload role.lane.py verify: the KV holds exactly the two fields, the fence is present, no workload role exists, the KV password signs in to LLDAP, and the synthetic journey passed againsthttps://kc.coulomb.social: aal2, methodspwd+otp, signature verified against KeyCape's JWKS,preferred_usernamematched. About 3 s end to end.
| Receipt | Result |
|---|---|
00-setup-refused-absent.json |
refused, nothing changed (privacyIDEA token lookup by a user that did not resolve yet, or the pi-admin login) |
00-setup-refused-pi-admin-login.json |
refused at the pi-admin sign-in, nothing changed |
00-verify-before-setup.json |
expected failure: no KV yet |
01-setup.json |
stopped at /token/init after the user and KV v1 were written (see finding 1) |
10-teardown.json |
removed that partial state: token, user, KV |
11-setup.json |
identity_prepared, key generated by privacyIDEA, enrollment confirmed with a code |
12-verify.json |
identity_verified, journey pass (embedded, value-free) |
All receipts were scanned for secret-shaped strings before commit. They hold identifiers, versions and booleans only.
Findings
- privacyIDEA silently replaces a supplied TOTP key for
pi-admin. An admin policy withaction=*(aspi-admin-all-rights) enablestotp_force_server_generate, sootpkeyis ignored and the confirmation with a code from the supplied key fails (ERR905). This was reproduced on the pinned 3.12.2 image. The lane now enrolls withgenkey=1and takes the seed from the enrollment response, in memory only. Any tool that enrolls a known seed aspi-adminhas the same problem. - Listing privacyIDEA tokens by a user that does not resolve is an error, not an empty list. The lane looks tokens up by serial.
- Live KeyCape issues tokens to a user with no groups and no tenant mapping. The open point in the runbook is answered.
- Still open, recorded in CCR-2026-0057: KeyCape marks the token
principal_type: human, and KeyCape has no per-client group gate.