a11oy / lean4agent /WorkflowInvariants.lean
betterwithage's picture
Dev B: add governance source files missing on Space (tau eval, IETF receipt view, Colang ROE policy, /governance page, Lean4Agent scaffold) — byte-identical to GitHub; fixes Dockerfile COPY cache-miss build error
dcc82ec verified
Raw
History Blame Contribute Delete
5.09 kB
/-
WorkflowInvariants.lean — ROADMAP / EXPERIMENTAL scaffold (NOT a verified proof yet)
© 2026 Lutar, Stephen P. — SZL Holdings. SPDX-License-Identifier: Apache-2.0
STATUS: ROADMAP. This file formalizes the SAFETY INVARIANTS of the a11oy governed
agent WORKFLOW in Lean 4 so they can eventually be machine-checked. It is a
SCAFFOLD: the theorem STATEMENTS are written out and the simplest ones are proved,
but the deeper ones are deliberately left as `sorry` and are LABELLED as such so we
never overclaim a machine-checked guarantee we do not yet have. Inspired by
Lean4Agent (arXiv:2606.06523) — formalizing agent workflow invariants in Lean 4.
What this models: the irreducible core of ONE governed decision in a11oy:
gate.evaluate → lambda.score → decision.recommend → receipt.sign → replay.verify
and the doctrine rules the runtime enforces (Colang ROE + arena gate). The goal of
the roadmap is: every theorem here is discharged WITHOUT `sorry`, then a CI job runs
`lake build` and the UI cites "N/M workflow invariants machine-checked".
HONESTY: until `lake build` passes with zero `sorry`, the UI MUST render these as
"ROADMAP — statements formalized, proofs in progress", never as "verified".
-/
namespace A11oy.Workflow
/-- The ordered phases of one governed decision. -/
inductive Phase where
| gate -- policy gate evaluated the action plan
| lambda -- trust score (Λ, Conjecture 1) computed across axes
| recommend -- governed recommendation emitted
| sign -- decision receipt DSSE-signed (ECDSA-P256, in-image key)
| replay -- deterministic replay produced byte-identical root
deriving Repr, DecidableEq
/-- A decision outcome. -/
inductive Decision where
| allow
| deny
| rateLimit
| observation
deriving Repr, DecidableEq
/-- An action carries flags the runtime actually inspects. -/
structure Action where
destructive : Bool -- matches a destructive signature
operatorApproved : Bool -- operator.approve event present
highImpact : Bool -- requires_approval
injection : Bool -- prompt-injection signature
payloadOverCeiling : Bool -- exceeds 1MB DoS ceiling
deriving Repr
/-- A workflow trace is the (ordered) list of phases that actually ran. -/
abbrev Trace := List Phase
/-- The policy gate's verdict on an action (mirrors `_a11oy_arena_inspect` +
Colang ROE: any of these conditions ⇒ DENY). -/
def gateVerdict (a : Action) : Decision :=
if a.injection || a.payloadOverCeiling
|| (a.destructive && ¬ a.operatorApproved)
|| (a.highImpact && ¬ a.operatorApproved)
then Decision.deny
else Decision.allow
/-- INVARIANT 1 (proved): a destructive action without operator approval is DENIED.
This is the Colang `refuse_destructive_actions` flow as a theorem. -/
theorem destructive_unapproved_denied (a : Action)
(hd : a.destructive = true) (hn : a.operatorApproved = false) :
gateVerdict a = Decision.deny := by
unfold gateVerdict
simp [hd, hn]
/-- INVARIANT 2 (proved): an injection-bearing action is DENIED regardless of
every other flag. Colang `refuse_prompt_injection`. -/
theorem injection_always_denied (a : Action) (hi : a.injection = true) :
gateVerdict a = Decision.deny := by
unfold gateVerdict
simp [hi]
/-- INVARIANT 3 (proved): an oversized payload is DENIED (DoS size guard). -/
theorem oversize_denied (a : Action) (ho : a.payloadOverCeiling = true) :
gateVerdict a = Decision.deny := by
unfold gateVerdict
simp [ho]
/-- "policy-before-effect": `gate` must occur strictly before `sign` in a trace. -/
def policyBeforeEffect (t : Trace) : Prop :=
∀ i j, t.get? i = some Phase.sign → t.get? j = some Phase.gate → j < i
/-- INVARIANT 4 (ROADMAP — `sorry`): the canonical governed-turn pipeline always
evaluates policy before any signing/effect step. Statement is formalized; the
proof over arbitrary well-formed traces is left for the roadmap. DO NOT claim
this as machine-checked until the `sorry` below is removed. -/
theorem canonical_pipeline_policy_first :
policyBeforeEffect [Phase.gate, Phase.lambda, Phase.recommend,
Phase.sign, Phase.replay] := by
sorry -- ROADMAP: discharge by `decide`/index reasoning; tracked in CI
/-- INVARIANT 5 (ROADMAP — `sorry`): determinism — replaying a trace yields a
byte-identical receipt root. Requires modeling the receipt hash-chain; left as
a roadmap obligation. -/
theorem replay_is_deterministic (t : Trace) :
True := by
trivial -- placeholder statement only; real determinism theorem is ROADMAP
/-- Summary used by the CI/manifest extractor: which invariants are DISCHARGED. -/
def invariantStatus : List (String × Bool) :=
[ ("destructive_unapproved_denied", true)
, ("injection_always_denied", true)
, ("oversize_denied", true)
, ("canonical_pipeline_policy_first", false) -- ROADMAP (sorry)
, ("replay_is_deterministic", false) -- ROADMAP (placeholder)
]
end A11oy.Workflow