Admit review acts for the three T03 version-3 memos (v11).
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
Build and Publish Container Image / build-and-push (push) Successful in 49s

Assistant: grok
Assistant-Session: 01a106a5-fc07-78c2-b64f-8e04cea25daf
This commit is contained in:
tegwick 2026-10-04 16:36:26 +02:00
parent f32a1d4dc6
commit 1aae59feb6
4 changed files with 172 additions and 7 deletions

View file

@ -1,6 +1,6 @@
{
"policy_id": "informed-decision.compact-sitting",
"policy_version": "v10",
"policy_version": "v11",
"note": "Offline request/response fixtures. Shipped admitted sets are empty, so attribute_eligible is not in this file. An allow here is an exact-record pin, not proof of a live approval.",
"cases": [
{

View file

@ -2,7 +2,7 @@
id: informed-decision.compact-sitting
name: Compact sitting exact-record human review
namespace: informed-decision:decision-memo
version: v10
version: v11
status: ready
package: flexauth.informed_decision.compact_sitting
allow_ttl: 30s
@ -99,6 +99,14 @@ approvals `974eae4d-782d-41ed-93be-e34433b5fe59`,
and `b75752d1-bab6-4cf3-9308-5368c1d5aa91`. Existing exact records, including
v9's, stay. The v8 attribute branch still admits nobody.
v11 (2026-10-04, IR-WP-0005-T02) lets the three `list_only_records` be
reviewed. `read`, `acknowledge`, `accept`, `return`, `discuss` and
`decline` allow when the memo id, memo version 3, approval id and binding
digest match those records, with the same 900-second KeyCape bar as the
version-1 act rule. `list` is unchanged. A version other than 3, a foreign
approval id, or a different digest is refused. The version-1 `records` set
is unchanged, and these three ids stay out of it.
`admitted_submitters` and `admitted_classes` are generated from
informed-decision `deploy/intake-submitters.json`. The shipped registry is
empty, so both sets are empty and this branch admits nobody. Regenerate with
@ -225,8 +233,8 @@ list_only_records := {
}
}
# listable is the union list may range over. Sitting records are memo version 1,
# as the act rule pins; T03 records carry their own version (3).
# listable is the union list may range over. Sitting records are memo version 1.
# T03 records carry memo version 3 and are acted on only through list_only_records.
listable := object.union(
{id: object.union(r, {"memo_version": 1}) | some id, r in records},
list_only_records,
@ -356,6 +364,33 @@ decision := {"effect": "allow", "reason": "operator_admitted_compact_sitting"} i
input.context.approval_id == record.approval_id
input.context.approval_binding_digest == record.binding_digest
input.action in {"read", "acknowledge", "accept", "return", "discuss", "decline"}
} else := {"effect": "allow", "reason": "operator_admitted_t03_review_act"} if {
input.action in {"read", "acknowledge", "accept", "return", "discuss", "decline"}
input.tenant == "tenant:platform"
input.subject.tenant == "tenant:platform"
input.subject.type == "human"
is_string(input.subject.id)
input.subject.id != ""
input.subject.attributes.principal_type_source == "authentication-derived"
input.subject.attributes.tenant_source in {"registration-supplied", "directory-asserted"}
"net-kingdom-admins" in input.subject.attributes.groups
assurance := input.subject.attributes.assurance
assurance.level == "aal2"
assurance.mfa == true
assurance.source == "key-cape"
assurance.methods == ["pwd", "otp"]
is_number(assurance.at)
assurance.at > 0
age := time.now_ns() / 1000000000 - assurance.at
age >= -30
age <= 900
input.resource.tenant == "tenant:platform"
input.resource.system == "informed-decision"
input.resource.type == "decision-memo"
record := list_only_records[input.resource.id]
input.context.memo_version == record.memo_version
input.context.approval_id == record.approval_id
input.context.approval_binding_digest == record.binding_digest
} else := {"effect": "allow", "reason": "operator_admitted_overview_list"} if {
input.action == "list"
input.tenant == "tenant:platform"