Implement GH-DEC-2026-003 consume-before-OpenBao PEP gate
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s

Every live privileged production handler CAS-consumes through
approval-engine before OpenBao. Conflict, unavailability, or a missing
binding fail closed. Live production remains disabled until the durable
decision record is served.

Record kings-guard assent on the secret-use evidence contract.

Assistant: grok
Assistant-Session: 01a05f07-ae72-7781-9fcb-19efd61add00
This commit is contained in:
tegwick 2026-09-02 01:06:50 +02:00
parent 465c0d7049
commit 4b4d556d62
14 changed files with 724 additions and 20 deletions

View file

@ -237,6 +237,7 @@ class PrivilegedActionEvidence:
approval_status: str = "pending"
completed: bool = False
stance: dict[str, Any] = field(default_factory=dict)
consume: dict[str, Any] = field(default_factory=dict)
def __post_init__(self) -> None:
if not self.approval_required:
@ -252,6 +253,8 @@ class PrivilegedActionEvidence:
)
if self.stance:
merged.update(self.stance)
if self.consume:
merged.update(self.consume)
if extra:
merged.update(extra)
return merged
@ -273,6 +276,17 @@ class PrivilegedActionEvidence:
self.decision_id = str(getattr(decision, "id", ""))
self.approval_status = "approved"
def mark_consumed(self, consumed: object | None) -> None:
if consumed is None:
return
if hasattr(consumed, "as_evidence"):
payload = consumed.as_evidence()
elif isinstance(consumed, dict):
payload = consumed
else:
return
self.consume = {key: value for key, value in payload.items() if value != ""}
def mark_stance(self, stance: object | None) -> None:
if stance is None:
return