flex-auth/docs
tegwick 68ad039a3f Fix the destroy rule: it was written against an invented claim shape
approval-engine flagged the class one message earlier -- a contract whose
examples contradict its prose gets implemented as its examples -- and
yesterday's package was a fresh instance of it, committed while flagging
it.

The published rule required context.approval.status == "approved" and
counted context.approval.approvals[].subject_id. Neither field exists.
approval-engine's approval_claim.schema.json has `state` (whose operative
value is `valid`, not `approved`) and carries no approver list at all. The
rule was unsatisfiable: every live destroy would have denied
dual_control_required no matter how good the approval was. It failed
closed, so it was never a hole, but it was policy written against a shape
of our own devising rather than a published one.

The rule now consumes valid_now from the real claim, guarded on kind and
issuer. valid_now is the summary predicate that already folds in the
distinct-approver threshold, with reason_code insufficient_approvers for
a claim that failed it -- so this is also the correct layering, not just
the correct shape. Counting approvers here is exactly the duplication
GH-DEC-2026-005 removes; the compensating property is reconstructability
at the issuer under 9.6, which is approval-engine's.

Recorded as a correction section in the package and the vocabulary doc
rather than quietly rewritten. 25 Rego tests and 29 fixtures pass,
covering insufficient_approvers, consumed, revoked, approved-but-not-yet-
valid, foreign issuer, and wrong kind.

Two things the package deliberately does not do, both now written down:
it does not compare binding.pdp_digest, because the request digest is
computed after policy evaluation and a Rego rule cannot see it; and it
makes no cross-check that the claim was approved for this action and
target, because the claim's binding uses approval-engine's vocabulary and
no mapping between the two is published. Inventing one would silently
accept a claim approved for something else. Both belong to the PEP until
a mapping exists, and that is worth closing before SECRETS-WP-0007-T04
makes destroy reachable.

Also swept the other published fixtures on approval-engine's reasoning.
One more instance: the inner decision in examples/caring/action_authorization.json
declared contract_version flex-auth.decision-record.v1 while its
provenance omitted policy_package_digest, registry_snapshot_digest, and
input_claim_digests -- all published contract fields since 2026-09-02.
Completed. The remaining example context vocabularies are consumer-owned
and match their integrations.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JTbVXpEiXA7mNJVpDnEPcB

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 412054@bnt-lap001
Assistant-Session: 3968fae1-8d59-4209-9bd6-c22594b8ab19
2026-09-06 08:11:14 +02:00
..
adr Finish FLEX-WP-0015: both pins enforce, live A2 probes, AuthZEN deferred 2026-08-19 14:35:27 +02:00
evidence feat(policy): adopt security zone stances 2026-08-22 15:17:13 +02:00
action-bound-authorization-contract.md Accept ActionAuthorization deferral; fix the state-hub authority constant 2026-09-06 01:30:04 +02:00
canonical-request-digest.md Finish FLEX-WP-0019 layer-model v0.7 conformance 2026-09-03 23:48:45 +02:00
caring-architecture-blueprint.md Refine workplans for CARING profile 2026-05-17 04:15:38 +02:00
decision-input-freshness.md Answer ops-warden and secrets-engine; open FLEX-WP-0021 2026-09-06 01:12:50 +02:00
decision-record-contract.md Finish FLEX-WP-0019 layer-model v0.7 conformance 2026-09-03 23:48:45 +02:00
delegated-mode-operations.md Document delegated mode operations 2026-05-17 07:27:45 +02:00
directory-group-resolver-adapters.md Add directory group resolver adapters 2026-05-17 07:24:50 +02:00
flex-auth-authorization-registry-research.md Established INTENT.md 2026-05-04 17:52:29 +02:00
iam-profile-consumption.md Align IAM Profile consumption with v0.2 2026-05-22 14:35:30 +02:00
keycloak-authz-adapter-path.md Add Keycloak authorization adapter path 2026-05-17 07:18:45 +02:00
markitect-action-vocabulary.md Define Markitect action vocabulary 2026-05-17 06:26:13 +02:00
markitect-integration-flow.md Document Markitect integration flow 2026-05-17 06:41:07 +02:00
markitect-resource-namespace.md Define Markitect resource namespace 2026-05-17 06:14:04 +02:00
ops-warden-policy-gate-handoff.md Close ops-warden policy gate deployment 2026-06-30 00:52:56 +02:00
ops-warden-registry-sync.md FLEX-WP-0007: production registry fixture, tests, and sync runbook 2026-06-24 14:52:35 +02:00
pre-implementation-assessment.md Land foundations: assessment, ADR-001/002/003, FLEX-WP-0005, Go skeleton 2026-05-16 01:54:44 +02:00
ProductRequirementsDocument.md feat(authz): bind decisions to exact actions 2026-08-23 13:18:26 +02:00
railiance-platform-action-vocabulary.md feat(policy): add credential grant authorization package 2026-08-23 13:59:03 +02:00
relationship-pdp-adapter-boundary.md Add relationship PDP adapter boundary 2026-05-17 07:06:14 +02:00
rule-pdp-adapter-boundary.md Add rule PDP adapter boundary 2026-05-17 07:13:27 +02:00
secrets-engine-action-vocabulary.md Fix the destroy rule: it was written against an invented claim shape 2026-09-06 08:11:14 +02:00
tenancy-posture-review.md Record zone-engine compilation invariant; drop uncommitted policy leftovers 2026-08-19 21:36:22 +02:00
tenant-engine-action-vocabulary.md Authorize tenant-engine guardrail read and set actions 2026-08-16 02:46:25 +02:00
tenant-engine-resource-namespace.md Authorize tenant-engine guardrail read and set actions 2026-08-16 02:46:25 +02:00
topaz-adapter-operations.md Implement Topaz adapter 2026-05-17 06:58:04 +02:00
topaz-mapping-spike.md Topaz alignment spike — mapping doc + green e2e example 2026-05-16 09:04:42 +02:00
workplan-planning-map.md Enforce caller-auth on flex-auth-ops-warden (FLEX-WP-0016-T03) 2026-08-19 20:10:31 +02:00