Lane key-cape-oidc-login -> keycape-attended-case-change in the register-client, ensure-groups and bind-env descriptors; deliver-consumer-secret actor agent -> human; verify_consumer reports a value-free, exactly-once probe record list bound into the observation digest. Composition artifacts, type.yaml and admit/compose tests are left for the orchestrator to regenerate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Assistant: claude-code Assistant-Model: opus Assistant-Process: 903097@bnt-lap001 Assistant-Session: aa320c8f-c3fa-46e7-8541-0b58e1e45d23
2.7 KiB
Bind-env adapter source candidate (NK-WP-0048-T27)
Status: unexercised source candidate. Not reviewed, pinned, admitted or run.
bind-env-adapter.py adds one env entry to the keycape container of the
sso/keycape Deployment, binding the helper-derived name
(KEYCAPE_<CLIENT>_CLIENT_SECRET) to valueFrom.secretKeyRef on the delivered
secret reference (keycape-<client>-client, key client-secret). It handles
references only: a binding carrying value, or an existing entry of that name
bound to anything else (including a literal), is refused.
- Case parsing reuses
keycape-client.py(client_from_case,env_binding), so canonicaloidc-browser-relying-party@1.1stays the default; public clients andallow_unimplementedare refused. read/writeare injected capabilities;writeis compare-and-swap on the observedresourceVersion. No kubectl, credential or secret value is used.build(...)returns a closed Warden v1Adapter(T13 pattern). It pins the owner source digest over the full local import closure (bind-env-adapter.py,keycape-client.py,portal-client-rollout.py,openbao-client-config.py,register-user-engine-portal.py— closure checked bytest_adapter_source_closure.py), the descriptor digest (Pins.adapter), case source and acceptance digests, and the admitted invocation (stepbind-env, actorhuman, lanekeycape-attended-case-change, created objectkeycape-env-binding, not retry-safe,parent-sessionscope). Every attempt is rebound to that invocation and re-checks source drift.publish,authenticateandrevoke_sessionare mandatory injected capabilities. The parent session is revoked infinally, also on refusal; a missing revocation or invalid/reused evidence identifier is never success. Evidence payload is closed metadata (netkingdom.keycape-bind-env.attempt.v1: invocation, source, outcome, env name, before/after revision) with no values.- An identical existing binding is
no-changeand is not rollbackable. - Rollback removes only the entry this process created, whose evidence still authenticates (a fresh process has no creation authority), and only while the Deployment is still at the revision that creation produced; otherwise owner reconciliation is required.
Tests: PYTHONPATH=~/ops-warden/src ~/ops-warden/.venv/bin/python -m pytest -q test_bind_env_adapter.py (synthetic only).
Not supplied: kernel-level admission/dispatch tests with fixture trust (as in T13), owner confirmation of the proposed step/lane/schema/object names, NetKingdom runtime owner source review before pinning, the real owner evidence and revocation capabilities, and any native action. Those remain separate gates.