harness(rolepolicy): prove the DEPLOYED gate enforces the role policy
deploy / test (push) Successful in 4m59s
deploy / build (push) Successful in 1m0s

The role policy was unit-tested against the script the code generates.
This probes the script the SERVER INSTALLED, inside a live mission
container: the verifier's Write exits 2 with its reason, the lead's
identical Write exits 0, the verifier's Read and another role's Edit exit
0, and the denial the deployed gate wrote names role-verifier-readonly and
agent_type verifier. 5/5 on prod.

Three of the four probes are negative controls. A gate that refused
everything would pass the first and be worthless — the same trade the
module's header refuses. 'Compiled in and CI-green' and 'enforced by the
artifact in production' are different claims; the gap between them is
this module's history.

The record is matched with a shell glob on the raw JSON line, not a
nested python -c: the first version could not survive quoting through
bash, ssh and sh, and reported an empty record while the gate had written
a correct one.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01WZb5A2kfVfjpdwSochkuHz
This commit is contained in:
Omar Sobh
2026-09-22 09:42:07 -05:00
co-authored by Claude Opus 5
parent ad67ce2fde
commit 70dbee662d
2 changed files with 102 additions and 1 deletions
+13
View File
@@ -535,6 +535,19 @@ Rendered into the same guest script as the floor, so the shell and the
Rust predicate cannot disagree; shell tests run the generated script and
check that the lead's identical write is still allowed.
**Proven against the deployed artifact**, not only the unit-tested one
(`rolepolicy` scenario, 5/5): payloads piped through the gate script the
server actually installed, inside a live mission container. The verifier's
`Write` exits 2 with the reason; the lead's identical `Write` exits 0; the
verifier's `Read` and another role's `Edit` exit 0; and the denial the
deployed gate wrote names `rule: role-verifier-readonly` and
`agent_type: verifier`. Three of the four probes are negative controls on
purpose — a gate that refused everything would pass the first one and be
worthless. "Compiled in and CI-green" and "enforced by the artifact in
production" are different claims, and the gap between them is this
module's whole history (a gate installed and inert; an `--agents` list
that silently did nothing until 2.1.243 rejected it).
**The real gap the paper names, and we do not have:** `arg_provenance`.
Our gate sees a command string and cannot tell a URL the operator supplied
from one a fetched web page supplied — so "no outbound action derived from