test-driver/scenarios/delegated_approval.py
tegwick cf682281d7 Complete local generalisation tasks and document remaining experiment blockers
Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a0e76f-be98-7ae3-965d-e0b31290a4c4
2026-09-28 12:06:24 +02:00

73 lines
3.3 KiB
Python

"""Sequenced delegation contract; no new kernel concepts."""
from testdriver import (
Actor, Cast, Claim, Invariant, Oracle, Provenance, Scenario, SemanticAction,
Step, UseCase, VerificationAsset, World,
)
from lab.workflows import ApprovalLab, ApprovalObserver, WorkflowDriver
SOURCE = "usecases/generalisation-spec.md#delegated-approval"
PROVENANCE = Provenance.AGENT_FROM_SPEC
def receipt(obs, operation, actor, allowed):
return obs["receipts"][-1] == {
"operation": operation, "actor": actor, "allowed": allowed,
}
def execution_matches_record(obs):
return obs["execution_gate"] == {
"requester": obs["state"] == "approved", "reviewer": False, "delegate": False,
}
USE_CASE = UseCase(
"uc-delegated-approval", "Delegate, approve, execute",
"A separate reviewer delegates approval before the requester executes.",
PROVENANCE, source_ref=SOURCE,
claims=(
Claim("approval-premature", "Execution before approval is denied", PROVENANCE,
lambda o: receipt(o, "execute", "requester", False) and o["state"] == "draft",
"premature", SOURCE),
Claim("approval-submit", "Submission enters pending review", PROVENANCE,
lambda o: o["state"] == "pending", "submit", SOURCE),
Claim("approval-delegate", "Authority passes to the delegate", PROVENANCE,
lambda o: o["reviewer"] == "delegate", "delegate", SOURCE),
Claim("approval-self", "Requester cannot self-approve", PROVENANCE,
lambda o: receipt(o, "approve", "requester", False) and o["state"] == "pending",
"self-approve", SOURCE),
Claim("approval-former", "Former reviewer cannot approve", PROVENANCE,
lambda o: receipt(o, "approve", "reviewer", False) and o["state"] == "pending",
"former-approve", SOURCE),
Claim("approval-approved", "Delegate approves", PROVENANCE,
lambda o: o["state"] == "approved" and o["approved_by"] == "delegate",
"approve", SOURCE),
Claim("approval-executed", "Requester executes approved work", PROVENANCE,
lambda o: o["state"] == "executed", "execute", SOURCE),
),
invariants=(Invariant("approval-gate", "Execution gate matches stored workflow",
PROVENANCE, execution_matches_record, SOURCE),),
)
def build(defect=None):
lab = ApprovalLab(defect)
cast = Cast()
for actor, token in lab.tokens.items():
cast.add(Actor(actor, actor.title(), credentials={"token": token}))
schedule = (
("premature", "requester", "execute", {}),
("submit", "requester", "submit", {}),
("delegate", "reviewer", "delegate", {"to": "delegate"}),
("self-approve", "requester", "approve", {}),
("former-approve", "reviewer", "approve", {}),
("approve", "delegate", "approve", {}),
("execute", "requester", "execute", {}),
)
scenario = Scenario("sc-delegated-approval", USE_CASE, tuple(
Step(id, actor, SemanticAction(operation, args, frozenset({"workflow"})))
for id, actor, operation, args in schedule
), variant=defect or "baseline")
return (World("w-approval", lab, f"approval-1/{defect or 'baseline'}", cast),
WorkflowDriver(lab), ApprovalObserver(lab),
VerificationAsset("va-approval", scenario), Oracle())