Skip to content

fix(conformance): check tern_tc receipts, and cover every ternary matrix - #800

Merged
gHashTag merged 38 commits into
trinet-fleet-truthfrom
claude/peaceful-noether-dperdx
Sep 27, 2026
Merged

gHashTag merged 38 commits into
trinet-fleet-truthfrom
claude/peaceful-noether-dperdx

Conversation

@gHashTag

@gHashTag gHashTag commented Sep 26, 2026 •

Copy link
Copy Markdown
Owner

Description

This PR fixes the Stage B.1 harness from 1f131fd. That harness printed "284160/284160 receipts authenticated under node0's key", but it never compared a tag. It built each receipt preimage and then dropped it. It counted status 0x01 as authentication, ignored the nonce echo, and compared only row sums.

I tested it against a cell that signs with a key the host does not hold. It still printed receipts authenticated 160/160 and PASS.

  • Still stands: the 28,416 bit-exact row dots.
  • Withdrawn: the 284,160-receipt count, because it was never checked. It is replaced by a measurement with the fixed harness (below).

The rewrite also covers work that had been booked as new hardware. As a result, all 42 ternary matrices of tern_tc run on the existing 32-trit cell:

  • w_down: 864 = 27 × 32, so each row is 27 chunks.
  • wk and wv: these are 320-in matrices that were skipped before.
  • int8 activations (--act int8): each activation is split into six balanced-ternary digit planes.

Board runs (2026-09-27, owner's M1 Pro, recorded in TERN_TC_LAYER_RECEIPTS.md and conformance/board_runs/):

  • All 42 matrices of the trained model at window 24: PASS. 403,200/403,200 receipts verified, 33,792/33,792 rows bit-exact, 85.5 s, 4,716 answers/s (board_runs/tern_tc_all_w24.log).
  • Layer 5 w_down with int8 activations at window 8: PASS. 51,840/51,840 receipts, 320/320 rows.
  • The link limit is the USB bridge's receive buffer.
    • Every long run with more than 512 bytes of answers in flight slipped: window 64 four times, window 30 once. No answer that arrived whole was wrong or badly signed.
    • A test registered before it ran (rerun step 3) predicted a PASS at window 26 (494 B) and a slip at window 30 (570 B). Both happened. The threshold is therefore between 494 and 570 bytes, around the CP2102N's 512-byte receive buffer.
    • Not the old hub either (rerun step 4; pre-registered in cf82eeb at 09:34:19Z, run 15 s later, recorded in c590308 and corrected in e1834ee, board_runs/tern_tc_all_w64_genesys.log).
      • Setup: the CP2102N alone behind a Genesys 05e3:0610 single-TT hub on another bus, away from the FE1.1s dongle that carries the JTAG adapter.
      • Result: window 64 still slipped, as predicted. 188,936 receipts were verified. Exit 1, one attempt, and the command changed only in its port.
      • The hole is 53 bytes, not the 8 first recorded (e1834ee). I checked this against the harness's frame layout (A5 | y | status | nonce | node id | tag):
        • the failed read opens with the first 4 bytes of answer 0x3e208, the one due next, and then the head of answer 0x3e20b;
        • so the last 15 bytes of 0x3e208 and all of 0x3e209 and 0x3e20a were lost.
        • The commit message of c590308 still says 8.
      • What it shows: the old dongle, bus and port are not needed for the loss. Between the window-64 control and this run the harness changed only in comments and help text, so for that pair the USB path is the only difference.
      • What it does not show: the earlier window-64 slips came after 6,744 to 19,049 jobs, but a single run cannot say whether the old dongle made loss more frequent.
      • Untried: a connection with no hub at all.
    • The CP2102N datasheet asks for handshaking above 1 Mbaud. The node has no RTS/CTS.
    • Harness process pauses are not the trigger: runs at 24 and 26 survived pauses of 22.4 and 25.8 ms, and the reload control below survived 127.9 ms.
    • What stalls the bridge's USB transfers is not measured.
    • The harness now keeps 19 × window under 512 bytes (default 24).

Also on this branch (from the owner's machine, bc3015d to 09b3d6f):

  • GFTernary × Z[φ], layer 0, on the board: PASS, as pre-registered.
    • gft_zphi_ax7203.py runs GFTernary (t·φ) weights on Z[φ] activations on the same node, with no new RTL and no reflash.
    • Result: 403,200/403,200 receipts verified, and 5,632/5,632 Z[φ] rows bit-exact against a plain Z[φ] multiplication oracle, in 85.35 s (board_runs/gft_zphi_l0.log).
    • The pre-registration was committed 38 s before the run started.
    • Not shown: a TNF accumulator or rounding. The digit recombination and the φ step are host arithmetic.
  • TERN_TC_WEAK_POINTS.md ranks ten weak points of the tern_tc record.
  • TERN_TC_PRIOR_ART.md is a prior-art survey. It checks the CP2102N figures against the datasheet.

Later on the owner's machine (523447c to fba3995), recorded here as committed:

  • GF8 ADD, exhaustive, on the AX7203 at 154839 baud: 65,536/65,536 bit-exact, 0 fails, 254 s. The run was pre-registered in 054b1fe and recorded in bc40613 (board_runs/gf8_add_exhaustive_154839.log).
  • TNF16 add and mul on the AX7203: 1,035,886/1,035,886 bit-exact, 0 fails, 0 lost (cf12a50, board_runs/tnf16_board_ax7203.log). This is the first board log for any TNF format (tnf_ref.py TNFFormat(4, 11), v2-spec).
    • It was run once, as pre-registered in aa4511d, 19 minutes after that commit.
    • The log ends with the spec's PASS_LINE verbatim. It names the spec's sha256 703b35c0…, which equals the pre-registered file's, and the request-set sha256 2b1ea80b…2c38, which was written into FORMATS_ON_BOARD.md before the run.
    • All eight sets passed, add and mul for each: edge, near, pinned and uniform.
    • 10,118 answers/s at window 24, over 102.4 s.
    • Before the board, the core RTL, a Python model of the datapath and the yosys gate netlist had each matched all 1,035,886 requests.
  • mxdot4, an MXFP4 and TNF4 block dot product, on the AX7203: 251,616/251,616 bit-exact, 0 fails, 0 lost (e243f27, board_runs/mxdot4_board_ax7203.log). One exact cell computes the dot product of two 32-element blocks with E8M0 scales, and the two formats differ only in the element table.
    • Before the board (8b98e6c, 4f68a4d): the core RTL and the yosys gate netlist of the core (FORMATS=3, 1,706 LUT instances, on xilinx/cells_sim.v) each matched all 251,616 requests.
    • The run. One flash (board_runs/mxdot4_flash.log: IDCODE 0x13636093, 778.8 s) and one run, 07:58:47 to 08:02:02 UTC. All 10 groups passed: edge, pinned, scales, top and uniform, for each format.
    • The run speed. 1,413 answers/s at window 6 behind the USB hub, 178.0 s against an 83.7 s wire floor. The USB round trip sets that rate, not the board.
    • Checked here against what was committed before the run:
      • the log's spec sha256 e63d4a31… equals the spec file at 8b98e6c, and the spec is unchanged since;
      • the log's last line is the spec's PASS_LINE verbatim, at the spec's window of 6;
      • the vector sha256 107843f1…cb2d is the one written into FORMATS_ON_BOARD.md in 8b98e6c;
      • the flashed bit's sha256 dec2ada9…d01a equals artifacts/bitstreams/mxdot4_board_ax7203.bit.sha256 from 8b98e6c;
      • mxfp_ref.py and block_tnf.py match the sha256 pins in the spec;
      • between 8b98e6c and the run, no spec, RTL, bitstream or vector generator changed. The one host-script edit in e243f27 is its docstring's run command.
    • What this is not:
      • It is exactness on silicon for both element tables through one datapath. It is not a quality result, and the block-axis perplexity verdict (MXFP4 21.94, TNF4 36.72) stands.
      • The pre-registered cost prediction (TNF4 within 5% of MXFP4 in LUTs) is refuted (-12.0%), and the sign of the gap flips with the synthesis flags. What holds regardless is structural: TNF4 is a subset of MXFP4.
  • The TRI-NET node is back on the board, and its control run passed as pre-registered (pre-registered in 0fdbeb6, run recorded in c1e7091).
    • The reload. One load of the CI node0 artifact from run 30762491794 (board_runs/node0_ci_flash.log): sha256 0fafd225e2d18f73…eddb4, IDCODE 0x13636093, 778.7 s, exit 0.
    • The control (board_runs/tern_tc_all_w24_reload.log):
      • setkey was installed and its ack verified on node 0x5452494e;
      • receipts verified (tag) 403,200/403,200, and rows bit-exact 33,792/33,792;
      • exit 0, in 86.17 s at 4,679 answers/s.
    • Checked here against the pre-registration:
      • the log's command is the pre-registered window-24 command, character for character;
      • the flashed bit's sha256 is the pre-registered one;
      • all three PASS conditions hold;
      • there is one run log, so one attempt.
      • The harness file has changed since b1e95f6 only in help text.
      • The pre-registration was committed at 08:31:19Z. That is 49 s after the load began and 18 minutes before the control run started at 08:49:40Z.
    • Weak point 5 gets a status. The bitstream on the board is pinned by its full hash and load log. A local rebuild gives a different payload (99d90a6a against CI's ee75d97b), which is consistent with the two yosys versions.
  • Ternary storage search: stopped by its own ruler, no verdict (1f68b92, research/block/TERNARY_STORAGE_VERDICT_2026-09-27.md).
    • The question: does a 27-level element in a 3-trit cell beat MXFP4 E2M1 at equal storage?
    • How it is set up: the search is written as specs/numeric/ternary_storage_search.t27 (10 test blocks, 70 asserts), and its runner's parameters are generated from that spec. The runner must first reproduce three of main's perplexities within 0.01, and it stops if one misses.
    • What happened:
      • BASE was off by 0.0005 and MXFP4 rule B by 0.0044, both within the ruler.
      • TNF4_7 rule B missed by 0.0398 (36.7612 against 36.7214), so the runner stopped.
      • No claim arm ran, so there is no verdict either way, and there was no retry.
      • The suspected cause, library drift on a different machine, is not proven.
    • What stands without a claim arm:
      • TNF4_7 plus the 1/12 code equals E2M1 bit for bit;
      • the storage arithmetic: 101 trits per block against 102, and densely packed MXFP4 needs 86.
    • On the order of events: the commit says the spec was written before any arm ran. The spec, the runner and the results arrived in the same commit, though, and no earlier commit of the spec exists on any branch. So that order is the author's statement, not something git shows.
    • A position survey follows (e1834ee, research/block/TERNARY_POSITION_SURVEY_2026-09-27.md). It is secondary sources, not a measurement:
      • nobody publishes a 27-level ternary element;
      • several binary formats already beat MXFP4;
      • a 3-trit cell holds 4.75 bits, so the fair opponents are 4.5-bit formats.
  • Ethernet step E2: a PHY status reader, built and simulated, not flashed (1733ab1).
    • It is an MDIO reader for the board's two KSZ9031 PHYs. It resets them, reads the PHY ID and status, restarts auto-negotiation at 100 Mb/s and prints one UART line per poll. Nothing drives TX.
    • openXC7 build: 848 LUT and 939 FF; post-route Fmax 133.26 MHz on mclk and 174.61 MHz on rxc.
    • Icarus simulation against a KSZ9031 status model: link and no-link PASS at RTL, and the synth_xilinx netlist prints the same UART lines byte for byte.
    • The model and the RTL share one reading of the register map, so the simulation cannot catch a misread datasheet. Flashing waits on the VCCO_16 check and the owner's yes.
  • A loss-counting UART diagnostic, pre-registered; no arm has run yet (fba3995, specs/trinet/uart_loss_diag_ax7203.t27).
    • The arms: window 64, then window 24, 2,016,000 jobs each, once. The runner resyncs on the next job whose tag verifies, so one run counts every hole instead of stopping at the first.
    • Predictions, written before the run:
      • if the losses are the 512-byte buffer overrunning, window 24 has no hole and window 64 at least one;
      • the Genesys prior (1 in 189,001 jobs) predicts about 10 events at window 64, and any count from 1 to 30 is unsurprising.
      • The only claim, that window 64 loses more often than window 24, needs an exact binomial test at 1/100.
    • The spec's worked example is the corrected 53-byte Genesys hole.
    • Checked here on fba3995:
      • --self-test passes 9/9. Five injected holes of 16/53/4/59/7 bytes are found at their sizes, and a drop, damage, a lie, a wrong key and a dead node are each classed;
      • uart_loss_diag_from_spec.mjs --check finds the parameters file in step with the spec (7 tests, 20 asserts, 0 failures).
  • The baud sweep and the edge test.
    • The 33 requested rates were 5 on the wire (523447c).
    • Both sweep edges sit on the CP2102N divider boundaries (4d90d59).
  • Write-ups:
    • FORMATS_ON_BOARD.md (85e0eb7);
    • NODE_ETHERNET_PLAN.md, for moving the job link to the board's Ethernet port (3e00ed6);
    • NODE_TOOLCHAIN_RESTORE.md (27087cb), which also records that the fleet clock figures are adapter bins.

This PR targets trinet-fleet-truth (open PR #355), so its diff contains only this work. The base has been merged in (discover_port.py).

Related Issue

Related to #355. It corrects a claim made in commit 1f131fd.

Specification Link

N/A. These are conformance hosts and a testbench, not generated code.

Changes Made

  • Bug Fix: receipts are now verified. A response counts only if its status, nonce (issued once), node id, SipHash-2-4 tag and per-chunk y all check. A row passes only if its chunk sum equals the dot product computed from the int8 weights directly.
  • Feature: --all now covers all 7 matrix kinds, including w_down as 27 chunks. New flags:
    • --act int8;
    • --setkey, which installs the key and verifies the ack tag;
    • --emit-requests / --responses, for RTL co-simulation;
    • --synthetic, for tern_tc-shaped weights when no model.bin is present.
  • Tests: --self-test checks the harness against a reference cell. It has 8 negative controls, and each one must fail: wrong key, a signed lie, a flipped tag bit, an unissued nonce, another node id, a dropped response, 16 bytes lost mid-stream (the board failure, replayed), and an unkeyed node.
  • Fix after the first board run:
    • --window defaults to 24, which keeps answers in flight under the CP2102N's 512-byte buffer.
    • The summary reports the jobs actually written and answers/s (it used to print the jobs planned), plus the longest host pause between reads.
    • A failed read logs its hex, the jobs outstanding and the bytes waiting.
  • Documentation: conformance/TERN_TC_LAYER_RECEIPTS.md, with every board run, the controls, the registered buffer test and the byte analysis.

Files Changed

  • conformance/tern_tc_layer_ax7203.py: rewritten harness
  • formal/tern_tc_layer_rtl_tb.v: plays the harness byte stream through the unchanged trinet_node_core.v + trinet_siphash24.v over UART
  • conformance/TERN_TC_LAYER_RECEIPTS.md: what is verified, by what, and how to reproduce it; the board runs
  • conformance/board_runs/*.log: raw board logs (checked for the key: 0 hits)
  • conformance/gft_zphi_ax7203.py, GFT_ZPHI_ON_THE_NODE.md, TERN_TC_WEAK_POINTS.md, TERN_TC_PRIOR_ART.md: added on the owner's machine (see above)

Golden Chain Checklist

  • Spec First / Code Generation: N/A (Python hosts and a Verilog testbench)
  • No Manual Edits in var/trinity/output/
  • No forbidden files, and no shell scripts

Testing Checklist

  • Unit: python3 conformance/tern_tc_layer_ax7203.py --self-test → PASS, all 18 checks, on this machine and on the owner's. A mutant that reports planned jobs as sent fails the new control. gft_zphi_ax7203.py --self-test → PASS. uart_loss_diag_ax7203.py --self-test → PASS, 9/9.
  • Integration: RTL co-simulation, Icarus Verilog 12.0 (results below)
  • python3 -m pyflakes conformance/tern_tc_layer_ax7203.py → clean. The old file had 5 findings, including siphash24 imported but unused.
  • Board:
    • all 42 matrices: 403,200/403,200 receipts verified, 33,792/33,792 rows bit-exact, three times (windows 24 and 26, and the control after the reload);
    • GFTernary × Z[φ], layer 0: 403,200/403,200 receipts, 5,632/5,632 rows;
    • mxdot4 (MXFP4 and TNF4 block dot): 251,616/251,616 bit-exact, with the hashes checked against the pre-run commit.

Test Results

RTL, layer 0, all 7 matrices (synthetic tern_tc-shaped weights)
  receipts verified (tag) : 67200/67200 under node 0x5452494e
  rows bit-exact          : 5632/5632  (activations: ternary)
RTL, layer 5 w_down, int8 activations (6 digit planes)
  receipts verified (tag) : 51840/51840
  rows bit-exact          : 320/320  (activations: int8)
RTL controls
  no setkey frame   -> 0/640 credited, all status 0x04, FAIL
  different key     -> 0/1280 receipts, 0/128 rows, FAIL
Old harness vs a wrong-key cell -> "receipts authenticated 160/160", PASS  (the defect)

AX7203, 2026-09-27, trained model.bin          (answer bytes in flight = 19 x window)
  --all, window 64 (403,200 jobs)     FAIL  18,984 verified, then 16 answer bytes lost
  matvec_demo, window 64 (3,200)      PASS  3200/3200 receipts, 320/320 rows
  w_down int8, window 64 (51,840)     FAIL  9,886 verified, then 4 answer bytes lost
  w_down int8, window 8 (51,840)      PASS  51840/51840 receipts, 320/320 rows, 4,344 jobs/s
  self-test on b1e95f6                PASS  18/18
  --all, window 24 (456 B)            PASS  403200/403200 receipts, 33792/33792 rows,
                                            85.49 s, 4716 answers/s, longest host pause 22.4 ms
  --all, window 64 (1,216 B), control FAIL  6,679 verified, then 59 answer bytes lost
  GFTernary x Z[phi], layer 0, w24    PASS  403200/403200 receipts, 5632/5632 Z[phi] rows (pre-registered)
  --all, window 26 (494 B), registered PASS 403200/403200 receipts, 33792/33792 rows, 85.29 s
  --all, window 30 (570 B), registered FAIL 149,986 verified, then 7 answer bytes lost
  --all, window 24, after the reload  PASS  403200/403200 receipts, 33792/33792 rows, 86.17 s,
                                            4679 answers/s, longest host pause 127.9 ms (pre-registered)
  --all, window 64, own Genesys hub   FAIL  188,936 verified, then 53 answer bytes lost
                                            (answers 0x3e208-0x3e20a; pre-registered prediction: FAIL)

AX7203, 2026-09-27, other formats (owner's runs, checked against their pre-run commits)
  GF8 ADD exhaustive, 154839 baud     PASS  65536/65536 bit-exact, 254 s
  TNF16 add+mul, window 24            PASS  1035886/1035886 bit-exact (fails=0, lost=0), 102.4 s
  mxdot4 MXFP4+TNF4, window 6         PASS  251616/251616 bit-exact (fails=0, lost=0), 178.0 s

Performance Impact

  • No change to the hardware. Host cost is about 16 µs of SipHash per job, well below the 210 µs per job at line rate. Measured on the board:
    • about 4,680 to 4,720 answers/s at windows 24 and 26;
    • 4,344 at window 8;
    • about 4,540 to 4,750 at 64 before the slips.

Breaking Changes

  • No. The CLI is a superset. Note that --all now means all 42 matrices, and --window defaults to 24. The old 24-matrix set is --mats wq,wo,gate,up.

🔥 TOXIC VERDICT

What Works

  • The receipt checks, each shown able to fail.
  • The whole tern_tc layer set, including w_down and int8 activations, runs bit-exact through the real RTL.
  • On the board:
    • all 42 trained matrices with every one of 403,200 receipts verified, three times: windows 24 and 26, and again after the node was reloaded from the CI artifact;
    • w_down with int8 activations;
    • GFTernary × Z[φ] on layer 0;
    • GF8 ADD exhaustively, TNF16 add and mul, and the MXFP4/TNF4 block dot, each bit-exact against a run registered before it.
  • No answer that arrived whole was wrong or badly signed.

What Doesn't Work

  • More than 512 bytes of answers in flight on this link: the CP2102N's receive buffer overruns, and the node cannot be held off. Moving the UART to its own hub did not change that.

Known Issues

  • SipHash is a shared-key MAC. It authenticates the node to the key holder. It is not publicly verifiable, and it does not stop an operator forging their own receipts.
  • A lost frame stops the run rather than resynchronising. This fails safe. The pre-registered loss diagnostic (fba3995) resyncs instead, to count losses; the main harness is unchanged.
  • The activation vectors are random test vectors, not the model's real activations, and there is no forward pass.
  • The bitstream on the board is the CI artifact. A local rebuild does not reproduce its payload (99d90a6a against ee75d97b), which is consistent with the two yosys versions but not yet explained.
  • The ternary storage search could not reproduce one of main's reference perplexities on this machine (TNF4_7 off by 0.0398), so it has no verdict. That drift itself is unexplained.

Toxic Verdict

Overall Assessment: APPROVE. This PR set itself a condition: a board rerun that reproduces 42/42 matrices with every receipt verified. That condition is met. Self-Score: 8/10. Silicon passed, and the link limit is bracketed by a registered test. Real activations are still open.

🌳 TECH TREE Options

Option 1: Real activations

  • Description: Dump the int8 inputs from tc_infer for a real prompt and run one full layer with them.
  • Complexity: ★★☆☆☆

Option 2: Flow control on the node

  • Description: Add RTS/CTS to trinet_node_core.v and the AX7203 constraints, as the CP2102N datasheet asks above 1 Mbaud. Then rerun at window 64.
  • Complexity: ★★★☆☆

Option 3: Leave the UART

  • Description: Move to Ethernet or a USB FIFO. Measured throughput is UART-bound.
  • Complexity: ★★★★☆

Recommendation: Option 1. It turns this from a weights check into a step towards a forward pass. Window 24 already runs at line rate, so Option 2 buys safety margin, not speed.

Deployment Notes

  • None.

Reviewer Notes

  • The nonce-to-job map is FIRST_JOB_NONCE + index. The setkey frame uses a separate nonce, so its ack can never be credited as work.
  • Commits 4601246, 50e8d95, 0bdeab2, 1e2677a, 05d1f8b, bc3015d, 8a20321, 7c35699, d437476 and 09b3d6f were made on the owner's machine. They hold the board logs, the write-ups, the pre-registrations and the survey. So were 523447c, 4d90d59, 27087cb, 3e00ed6, 85e0eb7, 054b1fe, bc40613, aa4511d, cf12a50, 8b98e6c, 4f68a4d, e243f27, 0fdbeb6, c1e7091, cf82eeb, c590308, 1f68b92, e1834ee, 1733ab1 and fba3995.

🤖 Generated with Claude Code

https://claude.ai/code/session_011vMJx1ZWk2hq58jyEecRBY

The Stage B.1 harness (1f131fd) reported "284160/284160 receipts
authenticated under node0's key" without comparing a single tag: it built
the preimage and dropped it, counted status 0x01 as authentication, ignored
the nonce echo and compared only row sums. Fed a cell that signs with a key
the host does not hold, it printed 160/160 and PASS. The 28,416 bit-exact
row dots stand; the receipt count is withdrawn until the board reruns.

The rewrite accepts a response only if status, nonce (issued once), node id,
SipHash-2-4 tag and per-chunk y all check, and a row only if its chunk sum
equals the dot computed from the int8 weights directly. --self-test shows
each check failing on a cell built to break it (wrong key, signed lie,
flipped tag bit, unissued nonce, other node, dropped response, unkeyed).

It also covers what was booked as new hardware: w_down (864 = 27 x 32
chunks), wk and wv, and int8 activations as six balanced-ternary digit
planes, so all 42 matrices run on the existing cell.

formal/tern_tc_layer_rtl_tb.v plays the harness's byte stream through the
unchanged trinet_node_core.v over its UART. Under iverilog: layer 0, all
seven matrices, 67,200/67,200 receipts and 5,632/5,632 rows; layer 5 w_down
with int8 activations, 51,840/51,840 and 320/320; an unkeyed node and a
wrong key both earn nothing. Synthetic weights in tern_tc's shapes; the
trained model.bin was not available here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011vMJx1ZWk2hq58jyEecRBY
gHashTag and others added 28 commits September 27, 2026 09:13
… harness

Board run 2026-09-27 UTC on /dev/cu.usbserial-1130 at 1144744 baud, harness
2b9830c, model.bin sha256 3102abdf...3ce9c. Self-test PASS 17/17; node0
0x5452494e found. The --all run FAILED: UART framing slipped after 19049
jobs (receipts verified (tag) : 18984/403200, rows bit-exact : 1898/33792).
Steps 4 and 5 were not run. Logs in conformance/board_runs/, checked for
the key (0 hits). The 284160-receipt figure stays withdrawn.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Run once each at the owner's request after the main run failed.
trinet_matvec_demo.py: 3200/3200 receipts, 320/320 rows, PASS.
Layer 5 w_down with int8 activations: framing slipped after 9951 jobs,
9886/51840 receipts, 61/320 rows, FAIL. No retry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nd the queue

The 2026-09-27 AX7203 runs stopped twice: step 3 after 18,984 verified
answers, step 5 after 9,886. Their bytes show the answer stream lost 16 and 4
contiguous bytes, with intact bytes on both sides; the node always sends whole
frames, so the loss is between its UART and the harness. With 64 jobs in
flight, up to 1,216 bytes of answers can queue there while the host is not
reading.

- --window defaults to 24 (at most 456 bytes queued).
- The summary reports jobs actually written (both runs printed the jobs
  planned) and answers/s, plus the longest host pause between reads.
- A failed read logs its hex, the jobs outstanding and the bytes waiting.
- The self-test replays the step 3 failure (16 bytes lost at the same
  offset); a mutant that reports planned jobs as sent fails it.
- The doc records the byte analysis and a rerun that separates queue
  overflow from a link fault (window 24, control at 64, then no hub).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011vMJx1ZWk2hq58jyEecRBY
Same port, hub and baud as the failed window-64 run; only the number of
jobs in flight changed. Layer 5 w_down with int8 activations:
51840/51840 receipts, 320/320 rows, PASS, 4344 jobs/s. The full --all
run has not been repeated at this window.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…the PR branch

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011vMJx1ZWk2hq58jyEecRBY
Step 5 at window 8 came back whole over 51,840 jobs, 5.2 times the length
after which the same matrix slipped at 64, at about 9% less throughput. The
full --all rerun at the default window 24, with a control at 64, is still
the test that separates the queue from the link.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011vMJx1ZWk2hq58jyEecRBY
…7203: PASS

Rerun step 1 from TERN_TC_LAYER_RECEIPTS.md, run once at the owner's request
on harness b1e95f6 (checkout 067e176), same port, hub and baud as the
failed window-64 run, no power cycle:

  receipts verified (tag) : 403200/403200 under node 0x5452494e
  rows bit-exact          : 33792/33792  (activations: ternary)
  elapsed                 : 85.49 s (4716 answers/s)

Self-test on the same harness: 18/18 ok, PASS. Both logs are added under
board_runs/ and have 0 hits for the key's hex. The 284,160-receipt row in the
claims table stays withdrawn and now points at this measurement. The window-64
control (plan step 2) has not been run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…fter 6,744 jobs

Rerun step 2 from TERN_TC_LAYER_RECEIPTS.md, run once at the owner's request:
the same --all --setkey command as step 1 on the same harness (b1e95f6),
port, hub and baud, eight minutes later, with only --window 64 changed.

  jobs sent               : 6744 of 403200 planned (window 64)
  receipts verified (tag) : 6679/403200 under node 0x5452494e
  rejected                : {'tag': 1, 'short': 1, 'missing': 396520}
  longest host pause      : 4.2 ms (after 4987 answers)

Window 24 carried 403,200 jobs clean and window 64 slipped, so the step 1
pass comes from the window, not from the harness change. The answer stream
lost 59 bytes starting inside job 6,679's tag (the harness refused that
receipt), with no long host pause before the hole. The log is added under
board_runs/ and has 0 hits for the key's hex. No retry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The window-64 control (rerun step 2) lost bytes with no long host pause
before the hole, so the window matters but not through a queue filled
while the harness is busy. The DEFAULT_WINDOW comment and the --window
help now state what was measured, and the earlier analysis bullet is
marked as superseded. No behaviour change; self-test 18/18.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011vMJx1ZWk2hq58jyEecRBY
… tern_tc weak points

gft_zphi_ax7203.py runs the TNF paper's weight algebra on the existing
TRI-NET cell with no new RTL: a t*phi weight on a + b*phi is the Fibonacci
step, so each output is W.b + (W.a + W.b)*phi, two ternary-by-int8 dots of
6 digit planes each. Every per-answer check reuses tern_tc_layer_ax7203.run()
unchanged; the oracle is plain Z[phi] multiplication.

Self-test PASS with five negative controls (phi^2 = 1, weights as t, a
dropped digit plane, a lying cell, a wrong key). RTL co-simulation of the
unchanged node core: 7680/7680 receipts, 128/128 rows. The board run
(layer 0, 403,200 jobs, 5,632 rows, window 24) is pre-registered in
GFT_ZPHI_ON_THE_NODE.md before it runs.

TERN_TC_WEAK_POINTS.md ranks ten weak points of the tern_tc record, from
"conformance, not speed" to the untested window-64 buffer hypothesis.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Run once, as pre-registered in the previous commit: 7 ternary matrices of
layer 0, 2,816 Z[phi] outputs, window 24, same port and hub.
receipts verified (tag) : 403200/403200, rows bit-exact : 5632/5632,
rejected none, 85.35 s. The board was not reflashed; log has 0 key hits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…yte buffer

The CP2102N datasheet (Rev. 1.5) gives a 512-byte receive buffer and asks
for handshaking above 1 MBaud; the node has no RTS/CTS. If the window-64
loss is that buffer overflowing, window 26 (494 bytes in flight) cannot
slip and window 30 (570 bytes) should slip about as readily as 64 did.
Both runs are written down here before either runs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
As pre-registered in 7c35699, each run once. Window 26: receipts verified
(tag) : 403200/403200, rows 33792/33792. Window 30: slipped after 150,017
jobs (149986/403200), a 7-byte hole. The loss threshold lies between 494
and 570 bytes in flight and brackets the CP2102N's 512-byte receive buffer.
The side prediction that window 30 would slip within ~20,000 jobs missed;
it took 150,017, and the record says so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ures checked

Ternary FPGA LLM accelerators (TeLLMe, TerEffic, TernaryCore and others),
verifiable-inference schemes, number formats on FPGA, and host links. An
editor's note records which figures were checked at the source (the CP2102N
datasheet, Rev. 1.5) and corrects two points about the receipts: the tag
binds operands, nonce and result, and every row is also compared bit-exact
with a host oracle.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rerun step 3 (pre-registered) put the loss threshold between 494 and 570
bytes in flight: window 26 carried all 403,200 jobs clean, and window 30
slipped. The CP2102N has a 512-byte receive buffer, and its datasheet asks
for handshaking above 1 Mbaud, which the node's UART lacks. The comment on
DEFAULT_WINDOW and the --window help now give that rule (keep 19 * window
under 512 bytes) instead of the unexplained link fault. There is no
behaviour change; the self-tests of both harnesses pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011vMJx1ZWk2hq58jyEecRBY
…pre-register the edge test

The CP2102N sends 24 MHz / N, so the sweep's centre and its +/-0.17 MHz are
artefacts of the adapter's rounding. CFGMCLK is bounded to 65.6..68.7 MHz.
Two narrow sweeps at the divider boundaries are pre-registered here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…N divider boundaries

Pre-registered in f37cfcce, run once each: every step matched 24 MHz / N
rounding, including the two steps within 0.01 % of the boundaries. The link
runs at 1,142,857 baud on the wire; CFGMCLK stays bounded to 65.6..68.7 MHz.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…adapter bins

build_trinet_node.py rebuilds the TRI-NET node with the local openXC7 tools.
It pins prjxray-db at ab1fc60, which nextpnr-xilinx expects. The upstream
0a0adde lacks the STARTUPE2 ppips, so fasm2frames wrote a 0-byte .frames and
left a stale .bit in place. Four builds gave the same payload hash. The script
prints the flash command and never runs a programmer.

NODE_TOOLCHAIN_RESTORE.md records the recipe, what was broken, the build
result, and what the rebuild does not show: it is not the CI bitstream on the
board, and timing is not closed at CFGMCLK.

Weak point 6: all five edges of the 2026-08-03 per-chip windows sit within one
sweep step of 24 MHz / N divider boundaries. The recorded 70.46 / 67.13 /
68.69 MHz are therefore the centres of the adapter's rate bins, not the chips'
clocks. The spec record itself is not edited.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The board is now cabled to the LAN router, but the node bitstream has no MAC.
The LAN check found the router and two hosts in ARP; nothing answers at the
old 192.168.1.222. At 100BASE-TX with 60 jobs per datagram the derived
ceiling is 496,689 jobs/s, against 4,762 on the UART.

The plan starts at 100M: a 25 MHz RGMII clock gives fabric capture room while
the hardware IDDR issue (openXC7/nextpnr#22) is open. On E4, OP_SETKEY is
refused over UDP. The RGMII pins match LiteX's alinx_ax7203 on all 15.

E1 is built but not flashed: the 200 MHz IBUFDS -> BUFG path routes in the
open flow (Fmax 336.7 MHz).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n their commits

FORMATS_ON_BOARD.md answers how the paper's number formats behave on the
AX7203. Today the board runs the TRI-NET node only: ternary, Z[phi] and int8
activations pass with signed receipts. None of the paper's 27 Tier-E cells can
be re-measured without a reflash; their UART results exist only as quotes in
EPIC #199 comments, and the only bitstream on disk is GF8 ADD. TNF/BNF figures
are post-route, never a board load. Also: a derived link-rate risk for any
re-run (CFGMCLK/434 against a 160000 host).

Three time stamps I wrote were estimates, not clock readings: the E1 build
(04:20 -> 04:09 UTC, from the build's file times), the LAN check (04:10 ->
04:04, from the command log), and the weak-points update (04:05Z -> 04:02Z,
its commit time). The loop's audit now flags any stamp later than the commit
that wrote it. The IDDR prior-art lines gain the files that were checked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…stive

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…5536

The pre-registered run (054b1fe): one attempt, all 65536 pairs against
gf_ref.py, HW RESULT: 65536/65536 bit-exact (fails=0), exit 0, 254 s.
The JTAG load and the run log are committed as board_runs/gf8_add_flash.log
and board_runs/gf8_add_exhaustive_154839.log. The load replaced the TRI-NET
node, so receipt runs wait for a node reload.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One .t27 spec (specs/trinet/tnf16_on_board_ax7203.t27) holds the format,
the wire, the vector counts, the pass line and the guard bits; a generator
compiles it, runs its test blocks and writes the Verilog and Python params.

The RTL is a six-stage TNF16 core (tnf_ref.py TNFFormat(4, 11), v2-spec)
behind the TRI-NET node's UART. 1,035,886 requests: pinned, edge,
uniform and near-random, expected words from tnf_ref.py. Before the board:
the core RTL, a Python model of the datapath and the yosys gate netlist
each match all 1,035,886. The UART top passes at the ends of the CFGMCLK
band, and the host self-test catches six injected faults.

build_trinet_node.py gets --nosrl and stops on inferred SRL16E/SRLC32E:
router1 did not finish on such a netlist here in two runs of over 13 min,
and the -nosrl netlist routed in 24-28 s. Bitstream payload 6d4e0dd3,
the same in two builds, 126.87 MHz post-route.

tnf_ref.py, tnf_ladder_versions.py and the v2-spec vector file come from
main at 9947512.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One load and one run, as pre-registered in aa4511d. The log ends with
the spec's pass line, TNF16 RESULT: 1035886/1035886 bit-exact (fails=0,
lost=0), and exit 0. It names the pre-registered spec and vector hashes.
The load log shows the pre-registered bit file, IDCODE 0x13636093 and a
clean 778 s load. 10,358,860 bytes out and 5,179,430 back at 1,142,857
baud on the wire, window 24, in 102.4 s against a 90.6 s floor.

This is the first board log for any TNF format: tnf_ref.py
TNFFormat(4, 11), v2-spec. It says nothing about TNF against other
formats, and the TRI-NET node stays off the board until it is reloaded
and re-keyed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One exact cell for the dot product of two 32-element MX blocks with E8M0
scales; the element table is the only thing that differs between MXFP4
(E2M1) and TNF4 (tnf_levels(4, 1) from research/block/block_tnf.py).

- specs/trinet/mxdot4_on_board_ax7203.t27: wire, word, window, pass line,
  reference pins and a cost prediction written before any synthesis.
- conformance/mxdot4_board_from_spec.mjs generates the Verilog and Python
  params; mxdot4_board_vectors.py builds 251616 requests whose words come
  from mxfp_ref.py and block_tnf.py, not from the spec's tables.
- fpga/tnet/mxdot4_core.v, fpga/vivado/mxdot4_board_ax7203.v and their
  testbenches; conformance/mxdot4_board_ax7203.py is the board host.
- Simulated: 251616/251616 bit-exact for FORMATS=3, and 251619/251619 as
  specified for the one-format builds. Board-level UART sim passes.
- Cost: the pre-registered prediction (TNF4 within 5% of MXFP4 in LUTs)
  is refuted under the builder's flags (-12.0%), and the sign of the gap
  flips with the synthesis flags (+3.5%, +0.7%, 0.0%). No robust cost
  difference; the robust fact is structural: TNF4 is a subset of MXFP4.
- Bitstream built with --nosrl, hashes in artifacts/bitstreams. It has
  not been loaded on the board.

This is a cost and exactness axis. It is not a quality result and cannot
change the block-axis perplexity verdict.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The yosys netlist of mxdot4_core (builder flags, FORMATS=3, 1706 LUTs) on
xilinx/cells_sim.v, over the full vector file (sha256 107843f1...cb2d):
MXDOT4 SIM: 251616/251616 bit-exact (fails=0). Simulated, not on the board.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The owner said yes to the load. One flash (openocd, IDCODE 0x13636093,
bit sha256 dec2ada9...d01a, 778.8 s) and one run, 07:58:47 to 08:02:02 UTC:
all 10 groups complete, fails 0, lost 0, exit 0. Spec and vector hashes are
the committed ones.

Window 6 behind the hub gave 1413 answers/s, 178.0 s against an 83.7 s
wire floor; the USB round trip sets the rate, not the board.

This is exactness on silicon for both element tables through one datapath.
It is not a quality result: the block-axis perplexity verdict (MXFP4 21.94,
TNF4 36.72) and the closed publication stand, and the cost reading (no
robust difference) is unchanged. TNF16 and the TRI-NET node are off the board.

Also fixes the documented run command: tri fpga-run runs in conformance/,
so the script path has no conformance/ prefix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ol run

The owner said yes to returning the TRI-NET node after MXDOT4 and chose the
CI artifact (run 30762491794, sha256 0fafd225e2...ddb4, matching the recorded
prefix). PASS is 403200/403200 receipts and 33792/33792 rows with exit 0 on
the unchanged window-24 command; one attempt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
gHashTag and others added 9 commits September 27, 2026 15:52
One load of the CI artifact (run 30762491794, sha256 0fafd225e2...ddb4,
IDCODE 0x13636093, 778.7 s, exit 0) and one control run on the unchanged
pre-registered command: setkey installed and acked on node 0x5452494e,
receipts verified (tag) 403200/403200, rows bit-exact 33792/33792, exit 0,
86.17 s.

Weak point 5 gets its status: the bitstream on the board is pinned by full
hash and load log; the local rebuild's payload differs (99d90a6a vs the CI
ee75d97b), consistent with the two yosys versions. MXDOT4 is off the board.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The owner moved the UART's Mac end. The CP2102N now sits alone behind a
Genesys 05e3:0610 single-TT hub on bus 0x00, apart from the FE1.1s dongle
that carries the JTAG adapter. It is not the direct connection. Prediction:
FAIL under the bridge-buffer hypothesis. One attempt, unchanged command
except the port.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pre-registered run, one attempt: the CP2102N alone behind a Genesys
single-TT hub on bus 0x00. FAIL as predicted, receipts 188936/403200, an
8-byte hole. The three earlier window-64 slips behind the FE1.1s dongle came
after 6,744 to 19,049 jobs. The old dongle is not needed for the loss but
very probably made it more frequent. Window 24 stays the operating point.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The search asks whether a 27-level element in a 3-trit cell beats MXFP4
E2M1 at equal storage. It was pre-registered as a t27 spec
(specs/numeric/ternary_storage_search.t27: 10 test blocks, 70 asserts)
before any arm ran; its parameters are generated from the spec.

The spec makes the runner reproduce three of main's numbers first and
stop if one misses by more than 0.01 perplexity. BASE (0.0005) and
MXFP4 rule B (0.0044) passed; TNF4_7 rule B missed by 0.0398
(36.7612 against 36.7214). The runner stopped. No claim arm ran, so
there is no verdict in either direction, and no retry: three arms had
finished. The leading hypothesis is library drift on a different
machine; it is not proven.

What stands without a claim arm: TNF4_7 plus the 1/12 code equals E2M1
bit for bit, and the storage arithmetic (101 trits per block against
102; MXFP4 densely packed needs 86).

Also corrects a heading stamp in TERN_TC_LAYER_RECEIPTS.md: 09:40Z was
not read from a clock; the pre-registration commit is 09:34:19Z.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
E2 of NODE_ETHERNET_PLAN.md: an MDIO reader for the two KSZ9031 PHYs
that resets them, reads PHYID and status, restarts auto-negotiation
at 100 Mb/s, and prints one UART line per poll with the in-band RGMII
status and an RXC count. Nothing drives TX.

- Build (openXC7): 848 LUT, 939 FF; post-route Fmax mclk 133.26 MHz,
  rxc 174.61 MHz.
- Simulation (Icarus, scaled counters) against a KSZ9031 status
  model: link and no-link PASS at RTL, and the synth_xilinx netlist
  (build flags) prints the same UART lines byte for byte.
- The model and the RTL share one reading of the register map, so
  the simulation cannot catch a misread datasheet. Flashing needs the
  VCCO_16 check and the owner's yes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The record of c590308 read "a5 fd 01 0b e2 03 00" as the tail of an
answer. It is the head of answer 0x3e20b: byte 1 is the output y. The
next answer due was 0x10000 + 188936 = 0x3e208, whose first 4 bytes
open the read, so the last 15 bytes of 0x3e208 and both 0x3e209 and
0x3e20a were lost: 53 bytes. The node id at offset 11 rules out 8 on
its own. The commit message of c590308 keeps the wrong 8.

Also corrected: between the window-64 control (b1e95f6) and this run
the harness changed only in comments and --window help text, so for
that pair the USB path is the only difference.

research/block/TERNARY_POSITION_SURVEY_2026-09-27.md: a secondary
survey of where a 27-level ternary element could stand. Nobody
publishes one; several binary formats already beat MXFP4; a 3-trit
cell holds 4.75 bits, so the fair opponents are 4.5-bit formats.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
specs/trinet/uart_loss_diag_ax7203.t27 fixes the arms (window 64, then 24,
2,016,000 jobs each, once), the hole arithmetic, the predictions and the
claim rule (exact binomial, 1/100). The generator checks the pinned harness
and MAC32 bytes and writes uart_loss_diag_params.py. The runner imports the
layer harness unchanged and resyncs on the next job whose SipHash tag
verifies, so one board run counts every hole instead of stopping at the
first. Self-test: five injected holes of 16/53/4/59/7 bytes are found at
their sizes; drop, damage, lie, wrong key and a dead node are each classed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The first attempt stopped at its ruler (TNF4_7 36.7612 on this Mac vs
main's 36.7214). This spec takes the first attempt's own this-Mac numbers
as the rulers (parsed from its log, sha pinned) with a 0.001 tolerance
fixed now, and adds the 4.5-bit opponents the survey called for:

- NVFP4: E2M1 per 16, E4M3 block scale, FP32 per-tensor scale
- MX+: MXFP4 with 3 extra mantissa bits on the block max
  (re-implemented from arXiv 2510.14557, not the authors' code)

Storage per 32 weights on a trit substrate: T27 101, MXFP4 102,
NVFP4 106, MX+ 106, E2M2 134. On binary memory T27 is not cheapest.
Verdict ladder (990/1010 permille) and predictions written before any
arm. The generator compiles the first spec too and fails if a shared
table drifts. Runner --dry: pins, tables, quantizer unit checks pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The pre-registered loss diagnostic (fba3995), one run per arm, same
node, key, jobs and USB path (Genesys hub):

- W64 (1216 B in flight): 2,015,426 answers accepted, 574 lost in 121
  events (119 byte holes of 3-417 B, 2 whole frames), 0 wrong y
- W24 (456 B in flight): 2,016,000 accepted, 0 lost, 0 wrong y
- CLAIM_W64_WORSE: yes, P = 3.8e-37 against the 1/100 threshold
- PRED_BUFFER (512 B CP2102N buffer) held; PRED_RATE (about 10 events)
  failed at 121; events cluster (var/mean 1.86), so the Poisson
  interval is too narrow
- Both arms took about 425 s: the request direction is the wire bound,
  so windows above 26 buy nothing on this path

Harness and its PASS criterion untouched. Logs key-checked (0 hits).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@gHashTag
gHashTag marked this pull request as ready for review September 27, 2026 11:47
@gHashTag
gHashTag merged commit f703e23 into trinet-fleet-truth Sep 27, 2026
14 checks passed
gHashTag added a commit that referenced this pull request Sep 27, 2026
TRI-NET: three boards, ten families, four corrected numbers, and the fixed receipt harness with its board runs (#800)

Merged as a merge commit, not a squash, at the owner's request: the
pre-registrations on this branch are evidenced by the order and time of
their own commits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011vMJx1ZWk2hq58jyEecRBY

Copy link
Copy Markdown
Owner Author

Two commits landed on the owner's machine after the description above was written. Both are in this merge and in main via #355.

The UART loss diagnostic ran as pre-registered (fba3995 → 5a31118, conformance/UART_LOSS_DIAG.md, board_runs/uart_loss_w64.log, uart_loss_w24.log).

  • Window 64 (1,216 B in flight): 2,015,426 accepted, 574 lost in 121 events (119 byte holes of 3–417 B, 2 whole frames), 0 wrong y.
  • Window 24 (456 B): 2,016,000 accepted, 0 lost, 0 wrong y.
  • PRED_BUFFER held. PRED_RATE failed: 121 events against about 10, outside the 1–30 the spec called unsurprising. The events cluster (variance/mean 1.86 per 100,800-job bin), so a Poisson interval is too narrow for them.
  • CLAIM_W64_WORSE: yes. P = 3.8e-37 against the 1/100 threshold.
  • Both arms took about 425 s, so on this path the request direction bounds the wire, and windows above 26 buy nothing.

Checked here against the pre-registration:

  • W64 started at 11:27:26Z and W24 at 11:35:12Z. That is 3 and 11 minutes after fba3995 (11:24:30Z), in the pre-registered order, with one log per arm.
  • Both logs name the spec sha256 5d8587dd…, which is the file at fba3995.
  • The instrument check holds in both arms: accepted + wrong y + lost + in flight = 2,016,000, the number sent.
  • On fba3995, --self-test passes 9/9 and uart_loss_diag_from_spec.mjs --check finds the parameters in step with the spec.
  • The key file is not in this container, so the key check is the author's (0 hits). What I could check here: the new logs hold no hex run of key length, and the one 64-hex value is the spec's sha256.

A second trit-cell search is pre-registered (49a84ad, specs/numeric/ternary_storage_search_v2.t27), against NVFP4 and MX+. No arm has run yet.


Generated by Claude Code

dmitrii-f-t27 pushed a commit to dmitrii-f-t27/trinity that referenced this pull request Oct 1, 2026
…were not checked

New post (EN + RU, published: true). The AX7203 computed 28,416 of 28,416
rows of tern_tc's 320-input matrices bit-exact, and the harness reported
284,160 authenticated receipts without comparing a tag. The post withdraws
that count until the board reruns, shows the fixed harness failing on seven
kinds of misbehaving cell, reports the RTL co-simulation (layer 0, all seven
matrices, 67,200/67,200 receipts; w_down with int8 activations, 51,840/51,840)
and why w_down, wk, wv and int8 activations need no new hardware. Receipts
link to gHashTag/trinity-fpga#800 and pinned files.

"A small agent needs an exact judge": the open question "No IGLA model has
run on a board" and "the 13M model has been neither trained nor run" are
updated with dated notes, and the summary's 0.97% is corrected to 1.01%, the
mean of the post's own MultiPL-E table.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011vMJx1ZWk2hq58jyEecRBY
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants