docs: record the end-to-end authorization proof in SECRETS-WP-0007-T04
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01M65ovP3eiiPHubibvWs9mD Assistant: claude-code Assistant-Model: opus Assistant-Process: 393550@bnt-lap001 Assistant-Session: 4bb359f9-1f12-4410-9e76-079cf23c82e4
This commit is contained in:
parent
f62d3fe789
commit
64aeec921c
1 changed files with 36 additions and 0 deletions
|
|
@ -453,6 +453,42 @@ class we had just been warning about.
|
||||||
one package covering all twelve actions. Do not build per-action pin
|
one package covering all twelve actions. Do not build per-action pin
|
||||||
configuration for a distinction that does not exist.
|
configuration for a distinction that does not exist.
|
||||||
|
|
||||||
|
Brought into practice 2026-09-06. The chain is complete in code and proven end
|
||||||
|
to end; what remains is deployment only.
|
||||||
|
|
||||||
|
- Step 2 is implemented (`decision_check.check_decision`, POST `/v1/check`) and
|
||||||
|
`approval_consume.authorize_action` coordinates steps 1 and 2. Both build the
|
||||||
|
same CheckRequest through one `_expected_request`, since two descriptions of
|
||||||
|
the proposed action cannot produce corresponding digests.
|
||||||
|
- `apply_unreachable_engine_stance` now takes `authorized=`. The published map
|
||||||
|
defines `fail_closed` as no protected side effect *without* a durable
|
||||||
|
access-engine decision record, so holding a validated one means the engine was
|
||||||
|
reachable and the residue does not apply. This is not a stance bypass: both
|
||||||
|
steps must have succeeded, CAS consume still precedes OpenBao, and with
|
||||||
|
nothing configured `authorize_action` returns `None` and production fails
|
||||||
|
closed exactly as before. Verified by CLI, not only by unit test.
|
||||||
|
- `tests/test_integration_authorization.py` drives the real gate through
|
||||||
|
claim -> check -> consume -> OpenBao against a live throwaway OpenBao, and
|
||||||
|
asserts PIP-before-PDP ordering, consume as the last step before the backend,
|
||||||
|
and that an unreachable PDP, a denied decision, an invalid claim, a missing
|
||||||
|
`pdp_digest`, a consume conflict, and an action mismatch each stop before the
|
||||||
|
backend. The stub serves transport and sequencing only; wire contracts stay
|
||||||
|
pinned to flex-auth's real fixtures.
|
||||||
|
- The end-to-end run found a third instance of the cross-vocabulary defect: a
|
||||||
|
leftover comparison of the claim's `binding.action` against ours. Real claims
|
||||||
|
say `secrets.kv.destroy` where we say `destroy`, so it would have failed
|
||||||
|
against every one of them. Removed; the tie is `pdp_digest`. Worth noting the
|
||||||
|
pattern: unit tests with self-consistent fakes hid all three, and each was
|
||||||
|
found only by a real artifact or a real chain.
|
||||||
|
|
||||||
|
Remaining to go live is configuration and deployment, not engine work:
|
||||||
|
`SECRETS_ENGINE_PDP_URL`/`_PDP_TOKEN_FILE` (awaiting the `flex-auth-secrets-engine`
|
||||||
|
pin, `FLEX-WP-0021-T04`/`T05`), `SECRETS_ENGINE_APPROVAL_URL`/`_TOKEN_FILE`
|
||||||
|
(awaiting `APPROVAL-WP-0002-T03`), the policy pin (published but not to be set
|
||||||
|
until T05), a KeyCape RS256 credential in place of the static Bearer token, and
|
||||||
|
`approval.authorization_id` on each lane. Destroy additionally needs the
|
||||||
|
vocabulary mapping or a `pdp_digest` guarantee.
|
||||||
|
|
||||||
Define and enforce the decision contract needed by production commands. A
|
Define and enforce the decision contract needed by production commands. A
|
||||||
resolved approval must bind at least:
|
resolved approval must bind at least:
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue