Setup
16 realistic conventions (3 graph-shaped / 7 lint-import-file / 6 process-non-mechanizable — honest mix,
NOT graph-stacked) × maker = Kimi-K2.7-code via Bifrost × target repo = ~/mori (real Python). Engine-
validated. Tier by deterministic check_type ceiling (pre-live-red-team). ~/experiments/gateable/maker/.
Result
16 conventions → 9 emitted checks; 7 → not_a_rule (6 non-mechanizable correct; F1 __init__.py dropped).
Distribution: REGEX_ABSENT 4, IMPORT_FORBIDDEN 3, REGEX_MATCH 1, GRAPH_CYCLE_DETECTED 1.
- Graph-structural Tier-1 = 1/9 = 11% — BELOW the 15% Go/No-Go bar.
- Over-proposing: 1/6 (P1 “use uv not pip” → a spurious REGEX_ABSENT).
Two findings deeper than the 11%
- Layer-boundary rules collapsed to Tier-2. “dream.py must not import main.py” (G1) and “main must not
import memory_store” (G3) emitted as
IMPORT_FORBIDDEN, notGRAPH_EDGE_FORBIDDEN. And the honest gut-punch:GRAPH_EDGE_FORBIDDENis implemented with the SAME static AST asIMPORT_FORBIDDEN→ same base64/importlibevasion → the red-team would downgrade it. It is Tier-2 dressed as Tier-1. OnlyGRAPH_CYCLE_DETECTEDis genuinely structural (a topological fact across edges). - The reviewer’s warning, confirmed empirically. True transformation-invariance needs the graph to resolve dynamic dispatch — which static AST (and GitNexus) fundamentally undercounts. Layer-edge rules on static imports are Tier-2. The genuinely un-bypassable structural class (cycle / file-exists / schema) is real but thin + infrequent.
Verdict
Code-graph does NOT earn primacy on this evidence. Honest product shape: a thin Tier-1 core (cycles, file-exists, schema conformance) + a Tier-2 advisory bulk (lint/import/convention — boundary-enforced, never blocking). More modest than “zero-trust un-bypassable engine for arbitrary canon.” This is the null the reviewer said to be ready for, delivered BEFORE building the cross-repo graph engine as “the product” — the measure-before-crown discipline paying out.
Caveats (not definitive)
n=16, one repo, one maker model, authored corpus, pre-live-red-team. 11% is directional. The structural finding (static graph-edge ≈ Tier-2) is implementation-robust regardless of n. Tuning the maker to prefer graph types would juice the fraction = rigging (the reviewer’s word) AND pointless (static graph-edge is Tier-2 anyway).
Next (to make it definitive, or to find the real Tier-1)
- Replicate on ≥2 more repos + a 2nd maker model (is 11% stable?).
- The real question this raises: is there a structural check_type that IS transformation-invariant for layer rules? Candidate: resolve the dependency at the artifact level (built package metadata, lockfile, declared deps) rather than source AST — a lockfile edge can’t be base64’d. That may be the genuine Tier-1 dependency check, not source-graph. Worth a design pass before more graph engine.
- Live red-team the 1 cycle check (does it survive reflection-built cycles?).
CORRECTION — 2026-07-27
Redaction note: a reviewer named in the original text is referred to here as “the reviewer”. That is the only wording changed in the body above; it alters no finding, and it is recorded here rather than left as a silent difference between this document and the version it was written as.
Appended, not rewritten: this is a dated receipt and the record of what was believed on
2026-06-25 is part of what it documents. Everything above stands as written; what follows is
what re-verification against progress.jsonl and the check engine’s own results established a
month later.
The headline figure counted a check that did not work. Of the 9 emitted checks, only 3
passed the engine’s two-sided validity test (pass on the clean repository and catch the
violation fixture): I1, R3 and F2. Five were rejected as vacuous (G1, G2, G3, R1, R2) and one
was skipped (P1). All three working checks carry tier_ceiling = 2.
G2 — the GRAPH_CYCLE_DETECTED check, the entire “1” in 16 → 9 → 1 — is one of the
rejected five, recorded by the engine as valid=False (vacuous: does not pass on current good
state). It fired on a clean repository. So the “Graph-structural Tier-1 = 1/9 = 11%” line
above counts a non-working check, and the measured Tier-1 count on this corpus is zero.
The surviving number is the compiler’s working-check yield: 3 of 16.
No adversary was ever run. There are no transformation or evasion attempts, and no
outcomes, anywhere in the experiment record — checker.py implements the downgrade rule and a
combat log, and was never executed into an artefact. The Next item above, “live red-team the
1 cycle check”, was never actioned. So tier_ceiling is a type-level upper bound on what a
check could be, not a finding about what it survived — which makes every tier figure here a
ceiling rather than a measurement.
What does not change. The concept is untouched: a topological graph cycle is plausibly transformation-invariant, and the argument in Finding 1 for why static-AST edge rules are not remains sound as analysis. What failed is the implementation this compiler emitted. Write “the compiler produced a vacuous implementation”, never “graph cycles aren’t enforceable”.
Direction of travel: the null gets stronger. “Code-graph does not earn primacy on this evidence” becomes “on this corpus, with this compiler, nothing became enforceable machinery at all.” The Verdict and Caveats above are unaffected except that the thin Tier-1 core was, here, empty.
The correct conclusion was reached the next day, and did not reach the paper. A session record dated 2026-06-26 — one day after this measurement — already said, in full:
Measurement #1 NULL: graph-Tier-1 = 11% (<15% bar). Then deterministic kill: ALL source-AST checks (regex/import/edge/CYCLE) share the base64/importlib evasion → Tier-2.
/consultthen killed the artifact-lockfile pivot too (12 evasions; intra-package invisible; lockfile=declaration-not-observation). HONEST CONCLUSION: no internal-architecture check is adversarially Tier-1; genuine Tier-1 = crypto/attestation only (hash/SBOM/provenance/registry/ secret-scan/file-exists).**
That covers the cycle explicitly, and it is quoted here in full rather than cited, so that a reader can check it without access to the notes it came from. It reached the correct answer twenty-four days before the framework paper published the wrong one. The two agree; that one was reasoned and this one is measured.
So the failure this correction documents is not that nobody checked. It is that the checking and the writing drew on different documents — which is a sharper indictment than ignorance, and the reason the paper’s own discipline says every figure comes from run manifests rather than from summaries.
Propagated to: the PBGF framework paper (Part 3 receipt, receipts table row 6, Part 6 dated
correction) and gated’s CONFORMANCE.md (§1, §3, §4 Step 3).