"""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())