Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
157 commits
Select commit Hold shift + click to select a range
5aa95b5
Measure the actual frontier: four levers against MXFP4, and what each…
gHashTag Aug 9, 2026
ad320be
Seven measurements at the frontier, and the honest verdict they add u…
gHashTag Aug 9, 2026
3aa88bd
Read BlockDialect, measure the sign lever on real activations, and cl…
gHashTag Aug 9, 2026
79d3f0f
Energy asymmetry: the unclaimed ceiling sits on GELU and SwiGLU
gHashTag Aug 9, 2026
d73344d
An asymmetric dialect beats DialectFP4 on activations at no arithmeti…
gHashTag Aug 9, 2026
8a03c11
Real trained tensors: the criterion predicts correctly, the format wi…
gHashTag Aug 9, 2026
122076b
Transforms move the ceiling that formats share -- and can destroy wha…
gHashTag Aug 9, 2026
da15c01
Order of operations changes the result by up to 2.78x, with a clean c…
gHashTag Aug 9, 2026
f90a1f1
Perplexity on a task that can degrade, and the summary of what this l…
gHashTag Aug 9, 2026
9ce2a38
The ternary-network datapath, measured as one design rather than summed
gHashTag Aug 9, 2026
c0f9477
The full matrix: one ternary neuron across formats, scored against ev…
gHashTag Aug 9, 2026
2bd01e6
Eighteen formats through one ternary neuron, including the GF ladder
gHashTag Aug 9, 2026
1709847
The TEF ladder in the matrix, and the unfair comparison it exposed
gHashTag Aug 9, 2026
ecfd381
The BNF/TNF control in silicon, and the frontier across all four fami…
gHashTag Aug 9, 2026
9b1b0c2
The frontier and the silicon, which contradict each other only apart
gHashTag Aug 9, 2026
df03754
docs(research): dominance verified across all five width classes
Aug 9, 2026
b7d3d47
docs(skills): record what the frontier result does and does not close
Aug 9, 2026
ef520bc
paper: retitle to Ternary Network Floats and prove the trit is the slack
Aug 9, 2026
5be18cc
paper: width-rule optimality, regret, composition, and the block gap
Aug 9, 2026
ff4b66e
research(block): MXFP4 was given six magnitudes where the spec gives …
Aug 9, 2026
ccef7ac
paper: name the first principles -- KKT, radix economy, Kraft
Aug 9, 2026
00a8029
research(ternary): the accumulator law, derived and measured
Aug 9, 2026
366355a
paper: lead with the datapath, and split trainable from rejected
Aug 9, 2026
e891684
research(block): the block axis is decided, against us
Aug 9, 2026
f262300
paper: place the work inside a sixty-eight-year argument
Aug 9, 2026
c9b36ce
paper: complete the truncated table and withdraw stale headline numbers
Aug 9, 2026
0f85ce8
research(families): the two axes return the same format, measured
Aug 9, 2026
a1ac116
paper: the multiply-free path is not merely cheap, it is exact
Aug 9, 2026
078cc7c
research(phi): the phi scale grid halves the cost of removing the mul…
Aug 9, 2026
f00d434
fpga(phiscale): what the layer scale costs with and without a multiplier
Aug 9, 2026
f8a4fa5
fpga(phiscale): name which direction was actually built
Aug 9, 2026
42cb186
research: APoT refutes our scale-grid claim, and exactness was never …
Aug 9, 2026
7ab7b30
research(scale): three vertices, no winner, and the shifter we ignored
Aug 9, 2026
626a51f
paper: the scale applier has three vertices, and two of our claims move
Aug 9, 2026
bcbe583
research: the area ordering inverts with regime, and ours was the wro…
Aug 9, 2026
63c28b0
paper: withdraw the area advantage as well, by our own attack
gHashTag Aug 9, 2026
06861e1
research: the operating point, which is what survives five withdrawals
gHashTag Aug 9, 2026
dc727bf
paper: the operating point, and four theorems that bound it
gHashTag Aug 9, 2026
da5e96a
research: seven iterations, seven withdrawals, and what is left
gHashTag Aug 9, 2026
360dca7
research(frontier): withdrawal 8 -- the headline was a positions-vs-b…
gHashTag Aug 9, 2026
41dacc5
paper: correct the headline -- the frontier at equal storage
gHashTag Aug 9, 2026
1e15fe7
research: withdrawal 9 -- the ternary rungs are wider than their names
gHashTag Aug 9, 2026
25c041a
conformance: gate artefact divergence, and withdraw the BNF/TNF reading
gHashTag Aug 9, 2026
7dd5831
conformance: catch implementation orphans, and bound the damage
gHashTag Aug 9, 2026
3847884
ci: run the artefact-agreement gate as a ratchet
gHashTag Aug 9, 2026
3be1fa2
research: withdrawal 12 -- the instrument limitation was false
gHashTag Aug 9, 2026
dfcc2fb
research: post-route resolution of three prior disputes
gHashTag Aug 9, 2026
d016864
research: the silicon table reproduces exactly, and its MHz column ha…
gHashTag Aug 10, 2026
7a7c5d6
tools: gate reproduction-script rot, and fix the second instance
gHashTag Aug 10, 2026
f7e0b0b
research: median of five seeds, and int8 does not lead GFTernary
gHashTag Aug 10, 2026
9ead776
research: withdrawal 13 -- the groups overlap and the metric restates…
gHashTag Aug 10, 2026
b256047
research: isolate the decoder, and withdrawal 13 is itself withdrawn
gHashTag Aug 10, 2026
347c533
research: withdrawal 14 -- observing four bits pruned 85% of the design
gHashTag Aug 10, 2026
06cdcdf
research: full observation splits the group claim by axis
gHashTag Aug 10, 2026
4b918d5
tools: gate partial observation, and record that the LNS number keeps…
gHashTag Aug 10, 2026
d116510
research: withdrawal 15 -- the harness is not the same size in every …
gHashTag Aug 10, 2026
616ae99
ci: ratchet the harness-observation gate
gHashTag Aug 10, 2026
c8a7997
docs: consolidate twenty-two iterations of method
gHashTag Aug 10, 2026
5e9cf78
research: the definitive silicon table, on an audited harness
gHashTag Aug 10, 2026
69a08d8
research: withdrawal 16 -- the LNS comparison was never well-posed
gHashTag Aug 10, 2026
3ed89b8
docs: record T7 and close the LNS entry in the register
gHashTag Aug 10, 2026
a0dd369
research: apply T7 deliberately, and partition the frontier claim
gHashTag Aug 10, 2026
b4e5e54
docs: add T8 and the frontier partition to the method
gHashTag Aug 10, 2026
44a53b9
research: crossovers for all eleven tapers, measured
gHashTag Aug 10, 2026
bfe461d
research: the selection table, and the price where the axes disagree
gHashTag Aug 10, 2026
7687e42
research: close the 64-bit gap -- the scan is superlinear and the row…
gHashTag Aug 10, 2026
abb3b57
research: the break-even width does not exist, and the last estimate …
gHashTag Aug 10, 2026
f127c78
paper: reformulate the E2M1 derivation as a threshold, and close the …
gHashTag Aug 10, 2026
f02633a
research: test the method against external published claims
gHashTag Aug 10, 2026
f8ba131
research: full text corrects our own external flag
gHashTag Aug 10, 2026
abfa2a2
research: the external test finishes with zero confirmed defects
gHashTag Aug 10, 2026
8e2f0c8
docs: the method as a self-check instrument, framed by what the evide…
gHashTag Aug 10, 2026
b10206f
paper: state the shape of the errors this paper has already made
gHashTag Aug 10, 2026
912407f
paper: rebuild after the self-check section
gHashTag Aug 10, 2026
21bce01
docs: verified state of the tree after thirty-four iterations
gHashTag Aug 10, 2026
078405b
tools: the fourth defect class, found by enumeration rather than acci…
gHashTag Aug 10, 2026
61a722e
paper: list the seven figures with no generating file, and gate the rest
gHashTag Aug 10, 2026
d7b7952
research: withdrawal 17 -- a taper's slope depends on the fitting window
gHashTag Aug 10, 2026
8b6cd3b
docs: the re-measurement gives four of the seven figures a source
gHashTag Aug 10, 2026
011e59b
research: the staircase form decides how a taper must be compared
gHashTag Aug 10, 2026
9b9d5da
paper: the staircase taxonomy prescribes the comparison, not just the…
gHashTag Aug 10, 2026
d6b545d
research: the taxonomy prescribes a comparison method for all four forms
gHashTag Aug 10, 2026
82abacf
research: withdrawal 18 -- the prescription claim was too strong
gHashTag Aug 10, 2026
ebc8af0
paper: withdraw the sentence about how the literature reports
gHashTag Aug 10, 2026
fd9def7
tools: gate document references, closing the last unguarded pair class
gHashTag Aug 10, 2026
d65a7b7
research: three theorems on why a pair check passed while the pair wa…
gHashTag Aug 10, 2026
3777cb9
paper: cite the nearest prior art, and derive our difference from it
gHashTag Aug 10, 2026
12bc5f9
measure: the cost of non-closure, and a strawman caught before publis…
gHashTag Aug 10, 2026
e912dce
paper: the measured cost of non-closure, next to the corollary that p…
gHashTag Aug 10, 2026
7d00b9c
tools: name the exclusions instead of keeping them silent
gHashTag Aug 10, 2026
1ebde0b
paper: closure as a named axis, and a false positive found by experiment
gHashTag Aug 10, 2026
678050c
paper: fit the abstract to the arXiv metadata cap exactly
gHashTag Aug 10, 2026
a940a91
measure: pipelining the non-closed path hits a ceiling below the clos…
gHashTag Aug 10, 2026
f5e2693
paper: replace the pipelining caveat with the measurement that closes it
gHashTag Aug 10, 2026
46256bc
tools: let a document declare that it names absent files by design
gHashTag Aug 10, 2026
a41ae9a
fpga: the closure measurement sources, and ignore its scratch
gHashTag Aug 10, 2026
21ddf35
measure: which multiply-free ladder wins, and why it depends on the bits
gHashTag Aug 10, 2026
d2cbb8b
paper: the ladder law, and the predictor that failed before it
gHashTag Aug 10, 2026
a61ad0c
measure: degree 4 in silicon, and a closed form for the optimal ratio
gHashTag Aug 10, 2026
b5881f9
measure: the ladder law replicates on Qwen2.5-0.5B
gHashTag Aug 10, 2026
f728c1f
paper: the second model, and the four-bit case it settles
gHashTag Aug 10, 2026
b1bc001
measure: the optimal-ratio law transfers between models numerically
gHashTag Aug 10, 2026
7d46d23
explain: the four-bit transposition, and why it favours our own rung
gHashTag Aug 10, 2026
b3d884d
withdraw: the salience correction fails on the second model
gHashTag Aug 10, 2026
08c300f
measure: the two operands of a layer want different rungs
gHashTag Aug 10, 2026
35ac59a
tools: require a document to agree with itself
gHashTag Aug 10, 2026
0f40e28
measure: the block axis attacked a second way, and still lost
gHashTag Aug 10, 2026
32d00e4
paper: the transposition explained by curvature, and the law's scope …
gHashTag Aug 10, 2026
07f987e
measure: the block axis is closed, and the bound proves it
gHashTag Aug 10, 2026
a2d5e22
paper: state the block-axis ceiling and why a fourth attempt is not w…
gHashTag Aug 10, 2026
59e45b9
paper: rewrite the argument section as one argument
gHashTag Aug 10, 2026
c38a3ee
measure: a phi-power block scale beats a power-of-two one at equal bits
gHashTag Aug 10, 2026
029ff0b
paper: the scale axis, where something of ours finally helps
gHashTag Aug 10, 2026
ebf8174
measure: phi-power block scale strictly dominates MXFP4 on two models
gHashTag Aug 10, 2026
4b3d393
paper: the scale-cost frontier, with the two findings that are not ours
gHashTag Aug 10, 2026
266b30c
theory: a geometric scale grid beats a float one at every width
gHashTag Aug 10, 2026
67db94e
paper: the geometric scale grid dominates a float one, by inequality
gHashTag Aug 10, 2026
294c941
measure: the geometric-grid inequality replicates on the second model
gHashTag Aug 10, 2026
af0c480
measure: fineness costs registers, not adders
gHashTag Aug 10, 2026
6863b58
paper: the one-adder family, and the tension it resolves
gHashTag Aug 10, 2026
21b3432
measure: the one-adder family on networks, and a calibration error of…
gHashTag Aug 10, 2026
73fd5d4
withdraw: there is no gap in the multiply-free spectrum
gHashTag Aug 10, 2026
5c419e0
paper: withdraw the spectrum gap, and add the network measurement
gHashTag Aug 10, 2026
7f5a0f5
fix: four duplicate labels sent twelve references to the wrong theorems
gHashTag Aug 10, 2026
c842ff3
tools: ratchet the LaTeX hygiene gate
gHashTag Aug 10, 2026
651c0b4
tools: check that a reference names the kind it points at
gHashTag Aug 10, 2026
33ce81f
research: the multiply-free scales are Pisot numbers, and one predict…
gHashTag Aug 10, 2026
154c349
measure: the ladder law over the whole one-adder family
gHashTag Aug 10, 2026
639eb1b
measure: the element decoder in silicon closes the chain
gHashTag Aug 10, 2026
f8ea2ae
paper: the element decoder priced against what it buys
gHashTag Aug 10, 2026
1a39e43
fix: a withdrawn figure was still asserted live, and a whole table wa…
gHashTag Aug 10, 2026
50d41fb
fix: repair the reference I broke, and key the gate on content not lines
gHashTag Aug 10, 2026
a6b5272
research: Siegel's floor explains the family's boundary, and two clai…
gHashTag Aug 10, 2026
96597bd
measure: the complete node, with the reason its figure is not yet the…
gHashTag Aug 10, 2026
64cdf51
measure: folding the negation takes the node from 82.5 to 28.0 LUT pe…
gHashTag Aug 10, 2026
d7b6552
research: ternary is forced by cardinality, and the report was mis-st…
gHashTag Aug 10, 2026
6b65bc2
paper: the assembled node, the alphabet's cardinality, and the last s…
gHashTag Aug 10, 2026
0c8dcd8
paper: new abstract, hierarchy summary table, and the qualifications …
gHashTag Aug 10, 2026
63d814b
tools: a simple dyadic fraction is not a distinctive number
gHashTag Aug 10, 2026
b104af4
tools: a negative test must assert its injection applied
gHashTag Aug 10, 2026
a4b4593
fix: eight overfull boxes, float spacing, and a gate for text that ru…
gHashTag Aug 10, 2026
4a058ec
paper: split the section that eighteen iterations had accreted into
gHashTag Aug 10, 2026
2fb3810
fix: three figures still carried the format's name from two renames ago
gHashTag Aug 10, 2026
54ae7f3
fix: the ladder-accuracy figure's legend sat on its own annotation
gHashTag Aug 10, 2026
ebca311
tools: an artefact with no generator is where staleness accumulates
gHashTag Aug 10, 2026
99faff2
paper: restore the four families, which the paper had lost
gHashTag Aug 10, 2026
33b9d34
measure: one pipeline register helps the node at fan-in 8 and 16, not…
gHashTag Aug 10, 2026
20667c1
paper: the pipelined node, and the fan-in where the cut stops paying
gHashTag Aug 10, 2026
6e48de8
tools: the orphan gate learns a second f-string shape
gHashTag Aug 10, 2026
6310cb9
tools: three characters is enough for a prefix, six was not
gHashTag Aug 10, 2026
d9e7d96
paper: state why BNF and GF-T have no separate rows, and harden the f…
gHashTag Aug 10, 2026
c582f31
paper: GFTernary is named in the abstract again
gHashTag Aug 10, 2026
08b96c5
paper: BNF16 measured on the datapath harness and added to the table
gHashTag Aug 10, 2026
33dd4e3
paper: state where the BNF16 row's numbers come from
gHashTag Aug 10, 2026
ffcf8fb
Declare the source file in MINI and HOLO's info.yaml
gHashTag Aug 10, 2026
fa837ac
docs(research): erratum drafts for both preprints -- the board, the k…
gHashTag Aug 10, 2026
4a38d4d
docs(research): name the three results that share the number 323
gHashTag Aug 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
36 changes: 36 additions & 0 deletions .claude/skills/fpga-synth/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,42 @@ remedy** until it survives several cold starts in a row.
until an independent signal confirms it took, and report the attempt count so the retry is visible
rather than assumed.

### 🧷 Vary ONE parameter, and build the control with the others held identical

Bisecting frame length against bring-up nearly produced an uninterpretable result: the test builds
differed from the known-good one in **four** parameters at once (frame length, sweep mode, skew,
request interval). A failure could not have been attributed to any of them. Building the control —
same everything, frame length back at its original value — is what made the measurement mean
something, and it exonerated two of the four parameters for free.

Measured (node link-ups, all other parameters identical): 74 bytes on the wire ~48%, 314 bytes 3/8,
714 bytes 4/8, **1514 bytes 0/20**. A sharp threshold, ordinary lottery rate either side of it.
Mechanism still open: 1024 sits in the gap, but the RX and TX indices are both 11-bit, so no
10-bit bound exists in the datapath.

**Watch parameter widths:** `parameter [13:0] IVL0` silently truncated 25 000 to 8 616, so an
interval quoted as 200 µs was really 69 µs.

### 📏 Check frame duty cycle before choosing a request interval

A 1514-byte frame occupies **12.1 µs** at 1 Gbit/s. A design whose request interval sweeps down to
10 µs and 6 µs runs at **121% and 202% duty** at full MTU — saturated, no inter-frame gap, on every
node at once. The same table is fine at 64 bytes (~5%). Compute
`frame_time = (FLEN + 14) * 8 / 1e9` against the interval before believing a load figure: a
throughput number from a saturated transmitter measures the transmitter, not the link.

### 🔁 Audit MDIO designs for HOW OFTEN they write, not just what they write

"Rewriting the PHY configuration restarts auto-negotiation" invalidated **three separate designs**
here: an uncapped 1 s retry (0 links in 4), a 6 s runtime skew sweep built to measure the timing
window, and a *supposedly fixed-skew* build that gated the skew **stepping** but not the
**reprogramming** — its state machine still re-entered the MDIO write sequence every 6 s.

The third is the instructive one: the parameter was named `SWEEP`, the intent was "do not disturb
the PHY", and it disturbed it every six seconds. **Grep every path that can re-enter the programming
state, not just the one that changes the value.** A measurement procedure that perturbs what it
measures yields no data, and looks exactly like broken hardware.

### 🧪 Assume the instrument is wrong until a second signal agrees

Three separate instrument defects surfaced in one investigation on this project:
Expand Down
36 changes: 36 additions & 0 deletions .github/workflows/artefact-agreement.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: Artefact agreement

# Every other check in this repository verifies an artefact against ITSELF: the
# oracle round-trips, the RTL simulates, the catalogue validates. All of them
# passed while the oracle and the RTL implemented different formats under the
# name TNF16, and while a synthesised, measured format had no catalogue row at
# all. No within-artefact test can catch either. This one compares declared
# PARAMETERS across artefacts.
#
# It runs as a ratchet: the known divergences are recorded in
# conformance/artefact_agreement_baseline.txt and the job fails only on NEW
# ones, or when a baseline entry stops reproducing (so the file cannot rot into
# a permanent excuse). Background: research/frontier/WITHDRAWAL_10_*.md and
# WITHDRAWAL_11_*.md.

on:
pull_request:
push:
branches: [main, master]

jobs:
artefact-agreement:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check out the SSOT catalogue
uses: actions/checkout@v4
with:
repository: gHashTag/t27
path: ../t27
continue-on-error: true
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Compare declared parameters across artefacts
run: python3 conformance/check_artefact_agreement.py
24 changes: 24 additions & 0 deletions .github/workflows/doc-refs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: Document references

# Enumerating every pair of artefacts that must agree showed all existing gates
# are code against code, and that every pair with a DOCUMENT on one side was
# unguarded. A document naming a file, a script or a gate makes a checkable claim
# about the tree, and a path in prose does not update itself when the tree moves.
#
# Ratcheted: 250 historical dangling references are baselined and the job fails
# only on new ones. Temporary paths, sibling-repository paths, and files a
# document names precisely to record their absence are excluded explicitly.

on:
pull_request:
push:
branches: [main, master]

jobs:
doc-refs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: '3.12' }
- run: python3 tools/check_doc_refs.py
19 changes: 19 additions & 0 deletions .github/workflows/figure-names.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
name: Figure names

# Three figures carried "TEF" and "GF-T" -- the format's names one and two
# renames ago -- long after every sentence said TNF. Two had no generator at
# all: the PDFs sat in the tree and the code that drew them did not, and a file
# nobody regenerates is a file nobody renames. No textual gate can see it; the
# names are inside vector graphics.

on: [pull_request, push]

jobs:
figure-names:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: '3.12' }
- run: sudo apt-get update && sudo apt-get install -y poppler-utils
- run: python3 tools/check_figure_names.py
29 changes: 29 additions & 0 deletions .github/workflows/harness.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: Harness observation

# Three harness confounds in three iterations, none visible in any number
# because every design synthesised, routed and reported plausible figures:
# 1. a shared accumulator held the critical path, so delay differences bounded
# the shared block rather than the varying part;
# 2. observing four output bits pruned a 32-bit datapath to 15% of itself and
# an unrelated 6-bit design barely at all, reversing a 2.34x conclusion;
# 3. designs consuming fewer harness sources pruned the rest, so net-of-harness
# subtraction used a subtrahend that varied with the design.
#
# Synthesis removes logic that does not reach an output. A harness must fold
# every output bit of the design under test, and every source it provides, into
# what it observes -- or the comparison is between designs cut to different
# fractions of themselves.

on:
pull_request:
push:
branches: [main, master]

jobs:
harness:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: '3.12' }
- run: python3 tools/check_harness.py
16 changes: 16 additions & 0 deletions .github/workflows/latex-hygiene.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: LaTeX hygiene

# Defects LaTeX resolves silently. Four duplicate \label definitions sent twelve
# \ref commands to the wrong theorems and tables while the build reported zero
# errors and zero undefined references.

on: [pull_request, push]

jobs:
latex-hygiene:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: '3.12' }
- run: python3 tools/check_latex_hygiene.py
18 changes: 18 additions & 0 deletions .github/workflows/orphan-artefacts.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
name: Orphaned artefacts

# 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. An orphaned artefact is not
# merely a reproducibility gap; it is where staleness accumulates.

on: [pull_request, push]

jobs:
orphan-artefacts:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: '3.12' }
- run: python3 tools/check_orphan_artefacts.py
19 changes: 19 additions & 0 deletions .github/workflows/overfull.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
name: Overfull boxes

# The build reported zero errors and zero undefined references while a display
# equation stuck 57.5pt past the right margin and seven paragraphs and table
# rows did the same. LaTeX calls an overfull box a warning, prints it among
# hundreds of lines of engine chatter, and typesets the page anyway. It is not a
# warning to a reader -- it is text they cannot see.

on: [pull_request, push]

jobs:
overfull:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: '3.12' }
- run: cargo install tectonic || true
- run: python3 tools/check_overfull.py
26 changes: 26 additions & 0 deletions .github/workflows/paper-numbers.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: Paper traceability

# Three earlier gates in this repository guard code against code, and each was
# found by tripping over the defect it now catches. Enumerating every pair of
# artefacts that must agree showed all three occupy one region, and that every
# pair with a DOCUMENT on either side is unguarded -- which is where a withdrawn
# claim's number survives, since it does not remove itself from a paper.
#
# This asks whether each distinctive figure in the paper appears in any file
# under research/, fpga/ or conformance/. It excludes constants stated beside
# their own formula, figures attributed to someone else's paper, and rounding.

on:
pull_request:
paths: ['research/arxiv_tnf/**', 'research/**', 'fpga/**']
push:
branches: [main, master]

jobs:
paper-numbers:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: '3.12' }
- run: python3 tools/check_paper_numbers.py
18 changes: 18 additions & 0 deletions .github/workflows/ref-kinds.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
name: Reference kinds

# A \ref can exist, be unique, and still be wrong: the paper said
# "Appendix~\ref{sec:limits}" in a document with no appendix, and
# "Section~\ref{sec:blockrelated}" inside the section labelled sec:blockrelated.
# LaTeX resolves both silently and correctly by its own rules; the sentence is
# what is wrong, and the sentence names the kind.

on: [pull_request, push]

jobs:
ref-kinds:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: '3.12' }
- run: python3 tools/check_ref_kinds.py
26 changes: 26 additions & 0 deletions .github/workflows/script-rot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: Reproduction scripts

# fpga/tnet/mk8.sh -- the script that produced the 21-format silicon table --
# instantiated `gft_add_w` while the file it reads defines `tef_add_w`. The
# TEF-to-TNF rename changed the module name and left the script, so yosys
# errored, no JSON was produced, and every run reported empty fields. The table
# had already been written, so nobody ran it again. mkgf.sh, which produced the
# GF rows, carried the identical defect.
#
# A reproduction path that is never run is a claim, not a capability.

on:
pull_request:
push:
branches: [main, master]

jobs:
script-rot:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Every instantiated module must exist in the files its script reads
run: python3 tools/check_script_rot.py
20 changes: 20 additions & 0 deletions .github/workflows/self-consistency.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: Document self-consistency

# Every other gate compares a document against something else -- data files, the
# tree, a sibling artefact. None compared a document against itself, and the
# paper carried three different counts of its own retractions: four in the
# roadmap, eleven in the abstract, sixteen in the method section.
#
# A number a document states about its own contents is checkable against those
# contents.

on: [pull_request, push]

jobs:
self-consistency:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: '3.12' }
- run: python3 tools/check_self_consistency.py
18 changes: 18 additions & 0 deletions .github/workflows/withdrawn-live.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
name: Withdrawn numbers

# The paper carried two paragraphs about one measurement eighteen lines apart:
# the first asserted a figure "and that number is real", the second withdrew it
# as a single placement run. The abstract quoted the withdrawn one. Nothing
# checked it -- the traceability gate asks whether a number appears in a data
# file, which a withdrawn number does, having been measured once.

on: [pull_request, push]

jobs:
withdrawn-live:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: '3.12' }
- run: python3 tools/check_withdrawn_live.py
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -415,3 +415,8 @@ apps/queen/Trinity.app/
trinet-keys.txt
*.trinet-keys
research/.gate_cache/

# synthesis scratch from the closure measurements: generated wrappers and netlists
fpga/phiscale/c_*.v
fpga/phiscale/c_*.json
fpga/phiscale/c[sy]_*.log
Loading
Loading