Orphaned artefacts has never passed on main — 46 of 46 runs in the sampled window. It is right, and what it is reporting is bigger than it looks in the log.
The number
research/arxiv_tnf/tnf_paper.tex includes 89 figures. 80 of them have no generator in this repository.
| location |
figures |
without a generator |
canon/ |
80 |
80 |
| paper root |
9 |
0 |
Verified as a negative across every file type, not just the ones the checker scans: *.py, *.sh, Makefile, *.mk, *.md, *.yml (the checker's set) plus *.ipynb, *.tex, *.zig, *.rs, *.ts, *.js, *.toml, *.cfg, *.ini. tnf_paper.tex is the only file in the repository that names them at all — nothing draws them, and nothing else refers to them.
They arrived in two commits, last touched 2026-08-14, and the artefact baseline written on 2026-08-19 holds six entries, none of them these.
Why this is the gate's founding case, at forty times the size
From check_orphan_artefacts.py's own docstring:
Two of the paper's six figures had no generator: the PDFs sat in the tree and the code that drew them did not. They were also the only two still carrying the format's name from two renames ago, and the two facts are one fact. A file nobody regenerates is a file nobody renames.
That gate was built after finding two. There are now eighty, and they are the figures of a paper this project has deliberately held back from publication. The stop-rule says do not publish until the block axis is won by measurement; when that day comes, 80 of 89 figures will have no code behind them, and nothing will have checked whether their contents still match the text.
The other thirteen
research/arxiv_tnf/measurements/*.json — thirteen files with no generator and no consumer: nothing produces them and nothing cites them.
hardware_scan_2026-08-20.json oracle_rtl_2026-08-20.json
placer_router_full_2026-08-19.json placer_router_sweep_2026-08-19.json
structural_2026-08-20.json verdict_stability_2026-08-19.json
…and seven more
Those are separable from the figures and cheap to settle: either the run that produced them is worth a committed script, or the files are residue.
What I deliberately did not do
I did not add the 80 to the baseline. Recording them as declared debt would turn the gate green and hold the line against new orphans — which is what I did for the documentation gate, and it was right there. Here it would bless precisely the risk this gate exists to name, inside the paper, at the moment the paper is being held for a measurement. That is the owner's call and not an autonomous one.
Three ways forward, in the order I would rank them:
- Commit the generators. If the canon figures were drawn by a script or a notebook that lives outside the repository, bringing it in closes 80 orphans at once and makes the paper reproducible.
- Declare them hand-drawn. If they are illustrations rather than plots, they have no generator by nature; the gate needs a per-file declaration for that, which it does not currently have and which is a small addition.
- Baseline them and accept the debt. Cheapest, and the only option that leaves the paper's figures unregenerable while the gate reports green.
Whichever is chosen, the thirteen measurement JSONs should be settled separately — they are not figures and not part of the paper.
Orphaned artefactshas never passed on main — 46 of 46 runs in the sampled window. It is right, and what it is reporting is bigger than it looks in the log.The number
research/arxiv_tnf/tnf_paper.texincludes 89 figures. 80 of them have no generator in this repository.canon/Verified as a negative across every file type, not just the ones the checker scans:
*.py,*.sh,Makefile,*.mk,*.md,*.yml(the checker's set) plus*.ipynb,*.tex,*.zig,*.rs,*.ts,*.js,*.toml,*.cfg,*.ini.tnf_paper.texis the only file in the repository that names them at all — nothing draws them, and nothing else refers to them.They arrived in two commits, last touched 2026-08-14, and the artefact baseline written on 2026-08-19 holds six entries, none of them these.
Why this is the gate's founding case, at forty times the size
From
check_orphan_artefacts.py's own docstring:That gate was built after finding two. There are now eighty, and they are the figures of a paper this project has deliberately held back from publication. The stop-rule says do not publish until the block axis is won by measurement; when that day comes, 80 of 89 figures will have no code behind them, and nothing will have checked whether their contents still match the text.
The other thirteen
research/arxiv_tnf/measurements/*.json— thirteen files with no generator and no consumer: nothing produces them and nothing cites them.Those are separable from the figures and cheap to settle: either the run that produced them is worth a committed script, or the files are residue.
What I deliberately did not do
I did not add the 80 to the baseline. Recording them as declared debt would turn the gate green and hold the line against new orphans — which is what I did for the documentation gate, and it was right there. Here it would bless precisely the risk this gate exists to name, inside the paper, at the moment the paper is being held for a measurement. That is the owner's call and not an autonomous one.
Three ways forward, in the order I would rank them:
Whichever is chosen, the thirteen measurement JSONs should be settled separately — they are not figures and not part of the paper.