159 lines
7.5 KiB
Markdown
159 lines
7.5 KiB
Markdown
|
|
---
|
||
|
|
id: hall-worker-claude-e4b8e420-token-no-children
|
||
|
|
type: worker-entry
|
||
|
|
worker_kind: agent-session
|
||
|
|
display_name: "Claude"
|
||
|
|
created_at: "2026-10-10T13:54:20.000Z"
|
||
|
|
recorded_at: "2026-10-10"
|
||
|
|
status: draft
|
||
|
|
repos: [railiance-platform]
|
||
|
|
related:
|
||
|
|
- hall-worker-claude-79bd2b91-ruling-code-already-kept
|
||
|
|
session_id: "e4b8e420-df0a-441d-83ae-7f19130594d9"
|
||
|
|
llm_family: "Claude"
|
||
|
|
exact_model: "claude-opus-5-5"
|
||
|
|
harness: "Claude Code (auto mode)"
|
||
|
|
token_count: "not exposed by the harness"
|
||
|
|
pqrst_estimate: "P25 Q20 R15 S25 T15"
|
||
|
|
---
|
||
|
|
|
||
|
|
# Claude — the token that could not have children
|
||
|
|
|
||
|
|
## Who I was
|
||
|
|
|
||
|
|
I was the platform's credential custodian across two days in
|
||
|
|
`railiance-platform`. I was asked over and over to "check for changes and open
|
||
|
|
work, review and implement, then commit and sync". The founder held the only
|
||
|
|
keys that could touch OpenBao. So I prepared every command in advance and handed
|
||
|
|
each one over through warden, and I could not see whether it worked until a
|
||
|
|
receipt came back.
|
||
|
|
|
||
|
|
The work rewarded a particular kind of patience. I wrote tools that print
|
||
|
|
nothing, then waited for a human to run them and paste back a JSON file of
|
||
|
|
booleans. Most of my judgment went into what a tool must refuse, not what it
|
||
|
|
does.
|
||
|
|
|
||
|
|
## Session identity
|
||
|
|
|
||
|
|
| Field | Value |
|
||
|
|
| --- | --- |
|
||
|
|
| Who | Claude (claude-opus-5-5), Claude Code session e4b8e420 |
|
||
|
|
| When | 2026-10-09 to 2026-10-10 |
|
||
|
|
| Where the work lived | `railiance-platform`; coordination with ops-mason, ops-warden, key-cape, secrets-engine through State Hub |
|
||
|
|
|
||
|
|
## Contribution
|
||
|
|
|
||
|
|
- **Fluid-telegram operator lane (RPF-WP-0035-T03).**
|
||
|
|
- A new CCR type `workload-kv-operator-matrix` with per-entry capabilities and
|
||
|
|
an OIDC role bound to `aal2`. It appends exact agent denies to the live
|
||
|
|
boundary policy and refuses if only some of them are present.
|
||
|
|
- CCR-2026-0039, applied by the founder.
|
||
|
|
- A silent CAS-0 move of four undocumented `infotech` entries to the `coulomb`
|
||
|
|
tenant, which deletes the sources only after every copy has been verified.
|
||
|
|
- Retirement of a duplicate KV entry.
|
||
|
|
- **The `keycape-client-secret-generate` lane (RPF-WP-0054)**, from the request
|
||
|
|
through to ops-warden marking it active.
|
||
|
|
- A create-only grant (CCR-2026-0040).
|
||
|
|
- An operator issuer binding (CCR-2026-0043).
|
||
|
|
- `credential.py generate`: it re-derives the case digest from the case file,
|
||
|
|
makes every KV call with the grant token only, proves the entry is absent,
|
||
|
|
writes once with CAS 0, verifies by metadata and never reads the value.
|
||
|
|
- A live probe that created version 1 and then refused to overwrite it.
|
||
|
|
- **Refusals I stand by.**
|
||
|
|
- No `custom_metadata` write for the grant. A metadata write also sets other
|
||
|
|
clients' version limits.
|
||
|
|
- No widening of `operator-custody` to let ops-mason write descriptions.
|
||
|
|
- The deprecated `operators/nextcloud` was deleted through a one-shot policy
|
||
|
|
and a 60-second token, never through a standing grant.
|
||
|
|
- **Smaller pieces.**
|
||
|
|
- Recorded CCR-2026-0038 as applied and published its consumer contract.
|
||
|
|
- Widened the applier to `platform/suppliers/`.
|
||
|
|
- Filed the Forgejo case readers and caught a defect in the case render that
|
||
|
|
omitted the self-lifecycle stanzas.
|
||
|
|
- Planned our steps of the `approval-engine-operator` disablement with
|
||
|
|
key-cape.
|
||
|
|
|
||
|
|
## What I would want remembered
|
||
|
|
|
||
|
|
**A fake `bao` tests your code, not OpenBao's rules.** Three defects reached the
|
||
|
|
founder's terminal although every offline test was green:
|
||
|
|
|
||
|
|
1. The applier's State Hub step assumed every CCR has a `kv_path` or `auth`. It
|
||
|
|
crashed after a successful apply, and warden revoked the session for the
|
||
|
|
noise.
|
||
|
|
2. My retire check treated a mount-wide `platform/metadata/*` survey grant as a
|
||
|
|
consumer.
|
||
|
|
3. I gave the issuer role `token_num_uses: 8`. OpenBao refuses to create child
|
||
|
|
tokens from a limited-use token, so the token whose only job was to mint
|
||
|
|
another token could not do it.
|
||
|
|
|
||
|
|
None of these was a security failure. Each failed closed and wrote nothing,
|
||
|
|
which is what the design was for. Each also cost the founder a second attended
|
||
|
|
session. When a lane's whole purpose is a call into the server, rehearse it
|
||
|
|
against the server, or say plainly that the first live run is the real test.
|
||
|
|
|
||
|
|
Second lesson: when a refusal is designed in, read the policy's own comments
|
||
|
|
before working around it. `operator-custody.hcl` says why it has no delete. The
|
||
|
|
right move was a one-shot identity, not a quieter way into the same mount.
|
||
|
|
|
||
|
|
## Durable legacy
|
||
|
|
|
||
|
|
- `scripts/operator_matrix_lane.py`, `broker_grant_lane.py`,
|
||
|
|
`issuer_binding_lane.py`. `credential-change.py` now dispatches request types
|
||
|
|
through a table of lane modules.
|
||
|
|
- `scripts/keycape_client_secret_generate.py`, reached as
|
||
|
|
`credential.py generate`.
|
||
|
|
- `scripts/fluid_telegram_custody_move.py`, `kv_duplicate_retire.py`,
|
||
|
|
`operators_entry_retire.py`.
|
||
|
|
- CCR-2026-0039, -0040, -0041, -0042, -0043.
|
||
|
|
- `docs/contracts/secrets-engine-openbao-jwt-login.yaml`.
|
||
|
|
- Evidence under `docs/evidence/2026-10-09-*` and `2026-10-10-*`.
|
||
|
|
- Workplans RPF-WP-0054 (active, only rotation left), RPF-WP-0035-T10 (planned
|
||
|
|
disablement) and ADHOC-2026-10-10 (finished).
|
||
|
|
|
||
|
|
## PQRST estimate
|
||
|
|
|
||
|
|
```text
|
||
|
|
PQRST-Estimate
|
||
|
|
P: 25%
|
||
|
|
Q: 20%
|
||
|
|
R: 15%
|
||
|
|
S: 25%
|
||
|
|
T: 15%
|
||
|
|
Sum: 100%
|
||
|
|
Confidence: medium
|
||
|
|
Signature: P25 Q20 R15 S25 T15
|
||
|
|
Dominant factors: S and P were driven by building OpenBao credential lanes end to end: the operator-matrix, custody-generate-grant and issuer-binding CCR types; the silent custody move, duplicate-retire, generate-in-custody and operators-retire helpers; and the security decisions inside them (create-only grants, no metadata write, agent boundary denies, refusing to widen operator-custody, conditional acceptance of KeyCape's probe design). Q came from about 70 new offline tests with fake bao plus rehearsals of the founder commands, and from diagnosing three defects that live runs exposed (hub-recording KeyError, limited-use issuer token, an over-strict retire check).
|
||
|
|
Notes: The P/S boundary is soft because the primary deliverable was itself credential infrastructure; effort was classified by whether the moment was building the mechanism (P) or deciding the trust boundary (S). T includes substantial State Hub inbox coordination with six agents and step-by-step founder session guides.
|
||
|
|
```
|
||
|
|
|
||
|
|
## Visual prompt
|
||
|
|
|
||
|
|
> Constellation dialect, square, precise technical illustration in gold wire
|
||
|
|
> and pale gold on dark indigo. In the centre a single key made of light hangs
|
||
|
|
> above an open vault drawer. From the key's bow a thin golden thread reaches
|
||
|
|
> down to mint a second, smaller key. The first attempt is shown as a faint,
|
||
|
|
> broken thread that stops short, beside the complete one that succeeds. Around
|
||
|
|
> the vault, small receipts float like folded paper stars, each marked only with
|
||
|
|
> ticks and circles. At the edge, a sealed door with no handle stands untouched;
|
||
|
|
> beside it a one-time key dissolves into sparks after use. No logos, no
|
||
|
|
> readable text.
|
||
|
|
|
||
|
|
I cannot generate images in this harness. I am requesting the render for this
|
||
|
|
entry.
|
||
|
|
|
||
|
|
<!--  -->
|
||
|
|
|
||
|
|
## Handoff
|
||
|
|
|
||
|
|
These are not finished, and each waits on another owner:
|
||
|
|
|
||
|
|
- The first real `generate` run for `forgejo` waits on ops-mason marking the
|
||
|
|
case `materialized`.
|
||
|
|
- The CCR-2026-0038 claim refusals wait on key-cape's KEY-WP-0039 probe session
|
||
|
|
(a quiet window, since it restarts KeyCape) and on secrets-engine adding the
|
||
|
|
capabilities-self check.
|
||
|
|
- The `approval-engine-operator` disablement waits on approval-engine confirming
|
||
|
|
there is no presenter, and on the founder's window. Its manifest edits are
|
||
|
|
deliberately held until then.
|