Adversary Sweep — Pre-Implementation (Gate 1)
Date: 2026-08-31 Mode: Architecture (no implementation) Finding count: 22 (3 Critical, 6 High, 8 Medium, 5 Low)
Critical
-
No timestamp field in claim schema — ADR-0007 requires timestamps for deterministic git commit synthesis, but
schema/claim.schema.jsonhas no timestamp field. Without it, the git projection either cannot synthesize commits, falls back to the wall clock (rejected by ADR-0007), or pulls from an unspecified field. -
validate_claim(&Claim)cannot enforce origin.kind rules — The function signature lacks the signer identity needed to enforce INV-06, INV-07, INV-12. The claim’sorigin.kindis self-reported; without the DSSE envelope’s signer, the validator cannot distinguish an agent forgingharness-observedfrom a genuine harness claim. R2 is unenforceable as designed. -
Tree structure ambiguous (flat vs hierarchical) — “Identical to git SHA-256 tree OID” requires git’s exact serialization (hierarchical trees, mode-space-path-null-OID, sort by name with trailing ‘/’ for directories). The spec doesn’t specify this. If elench trees are flat or use different serialization, OIDs differ and the passthrough claim is false.
High
- Supersession status semantics self-contradictory — UL says “not falsified but replaced” and also “status becomes falsified.” Contradictory.
- No invariant for claim ID content addressing — INV-25 covers blobs and trees but not claims. What goes into the hash is unspecified.
- dependsOn cycles unaddressed —
blast_radiusandcompute_statuscan loop infinitely. No cycle detection, no invariant, no error type. - INV-11 cannot be enforced by
validate_claim(&Claim)— Needs the full log to check whether a falsification “changed some claim’s status.” - Schema does not enforce conditional requirements —
targetis “required unless kind=assertion” but no JSON Schema if/then.residue-acceptanceneeds non-empty target but nominItems. - Verification record falsification — no “passed → unevaluated” transition — If a verification claim is itself falsified, the target should revert to
unevaluated, but the status machine has no such transition.
Medium
- Two contradictory predicates invisible to the gate (worse than “undefined status”)
origin.producer.idis a free string — impersonation possible- Corrupt log cascading — claims depending on corrupt claims have undefined status
origin.producer.hermeticityis self-reported — release gate condition 4 checks self-attested value- E0 session selection criteria not pre-registered — gate is gameable
predicateTypefor agent claims vs build provenance not specified- Empty store / zero claims / minimal case behavior undefined
- No “residue-acceptance from human” or “harness emits verification” feature scenarios
- Schema
$idisexample.invalidplaceholder additionalProperties: falseinconsistency (anchor, evidence, producer)
Low
- AGENTS.md says “no source code” but scaffold stubs exist
- “tree-changing claim” used but not in UL
TreeEntry.blobfield name misleading for directory entries- No
maxItemsondependsOn,target,evidencearrays compute_statusandblast_radiusare O(N²) — no performance invariant
Recommendation
Implementation should NOT proceed until Critical (3) and High (6) findings are resolved. The highest-risk area is the boundary between claim identity and enforcement: the validation function’s signature, the claim schema’s missing timestamp, and the tree serialization ambiguity all undermine the foundations the git projection rests on.