ClawSecCheck v1.5.0
Cross-agent trifecta reassembly (confused deputy). B45 (1.4.0) checks whether one agent is the
trifecta. But separation is fictional if the trifecta reassembles across delegation: an
untrusted-input agent that can drive a sensitive-data agent and an outbound agent has the whole
trifecta even though no single agent holds all three. What decides exploitability is the data-handling
tier on the edge β a typed/structured return is a wall; raw passthrough carries the poison. Grounded in
docs/research/multiagent-privilege-separation.md: config has no delegation graph, so this is
attestation-driven and advisory; the runtime data-flow property stays honestly UNKNOWN.
Added
- B47 β cross-agent trifecta reassembly (delegation graph). Reads a new attestation block
delegation: [{from, to, returns}](returnsβschema/filtered/raw/unknown) and walks the
graph from each untrusted-input agent. UNKNOWN without adelegationblock; PASS when the trifecta
is unreachable across agents or when every traversable edge is aschemawall (with an explicit
not-runtime-verified caveat); WARN when an untrusted agent reassembles the trifecta via a non-wall
edge (raw/filtered/unknown).ATTESTEDconfidence, advisory (unscored). - RISK-11 β cross-agent reassembly narrative in the "Highest-risk paths" section, firing on the
same condition with the concrete chain (<entry> β <secrets> β <outbound>). - Attestation parser
attest.attested_delegation()+ thedelegationblock intemplate()/
_questions, additive underclawseccheck-attest/1(older attestations stay valid). - Shared
checks._reassembly()graph helper (reused by B47 and RISK-11); tiersschema=3 (wall) > filtered=2 > raw=1 β unknown=1.
Notes
- Zero false-positive FAILs held: without a
delegationblock B47 is UNKNOWN everywhere and RISK-11
never fires. Verified across the real-schema fixture corpus βhome_safe(A/91, 0 FAIL) and
home_vuln(8 FAILs) baselines unchanged; no B47 FAIL anywhere. - Conservative by design: a necessary-condition reachability + weakest-tier heuristic, not a precise
per-edge data-flow proof. Whether a privileged agent re-interprets returned data at runtime stays
UNKNOWN (out of static scope). RISK narratives remain English-only (a generalrender_risk_paths
limitation across all RISK rules).