Repository navigation
fix(conformance): check tern_tc receipts, and cover every ternary matrix - #800
Merged
Merged
Conversation
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
19 of 21 tasks
… 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>
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
marked this pull request as ready for review
September 27, 2026 11:47
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
Owner
Author
|
Two commits landed on the owner's machine after the description above was written. Both are in this merge and in The UART loss diagnostic ran as pre-registered (
Checked here against the pre-registration:
A second trit-cell search is pre-registered ( 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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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/160and PASS.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:
--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.mdandconformance/board_runs/):board_runs/tern_tc_all_w24.log).cf82eebat 09:34:19Z, run 15 s later, recorded inc590308and corrected ine1834ee,board_runs/tern_tc_all_w64_genesys.log).e1834ee). I checked this against the harness's frame layout (A5 | y | status | nonce | node id | tag):c590308still says 8.Also on this branch (from the owner's machine,
bc3015dto09b3d6f):gft_zphi_ax7203.pyruns GFTernary (t·φ) weights on Z[φ] activations on the same node, with no new RTL and no reflash.board_runs/gft_zphi_l0.log).TERN_TC_WEAK_POINTS.mdranks ten weak points of the tern_tc record.TERN_TC_PRIOR_ART.mdis a prior-art survey. It checks the CP2102N figures against the datasheet.Later on the owner's machine (
523447ctofba3995), recorded here as committed:054b1feand recorded inbc40613(board_runs/gf8_add_exhaustive_154839.log).cf12a50,board_runs/tnf16_board_ax7203.log). This is the first board log for any TNF format (tnf_ref.pyTNFFormat(4, 11), v2-spec).aa4511d, 19 minutes after that commit.PASS_LINEverbatim. It names the spec's sha256703b35c0…, which equals the pre-registered file's, and the request-set sha2562b1ea80b…2c38, which was written intoFORMATS_ON_BOARD.mdbefore the run.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.8b98e6c,4f68a4d): the core RTL and the yosys gate netlist of the core (FORMATS=3, 1,706 LUT instances, onxilinx/cells_sim.v) each matched all 251,616 requests.board_runs/mxdot4_flash.log: IDCODE0x13636093, 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.e63d4a31…equals the spec file at8b98e6c, and the spec is unchanged since;PASS_LINEverbatim, at the spec's window of 6;107843f1…cb2dis the one written intoFORMATS_ON_BOARD.mdin8b98e6c;dec2ada9…d01aequalsartifacts/bitstreams/mxdot4_board_ax7203.bit.sha256from8b98e6c;mxfp_ref.pyandblock_tnf.pymatch the sha256 pins in the spec;8b98e6cand the run, no spec, RTL, bitstream or vector generator changed. The one host-script edit ine243f27is its docstring's run command.0fdbeb6, run recorded inc1e7091).board_runs/node0_ci_flash.log): sha2560fafd225e2d18f73…eddb4, IDCODE0x13636093, 778.7 s, exit 0.board_runs/tern_tc_all_w24_reload.log):0x5452494e;b1e95f6only in help text.99d90a6aagainst CI'see75d97b), which is consistent with the two yosys versions.1f68b92,research/block/TERNARY_STORAGE_VERDICT_2026-09-27.md).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.e1834ee,research/block/TERNARY_POSITION_SURVEY_2026-09-27.md). It is secondary sources, not a measurement:1733ab1).fba3995,specs/trinet/uart_loss_diag_ax7203.t27).fba3995:--self-testpasses 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 --checkfinds the parameters file in step with the spec (7 tests, 20 asserts, 0 failures).523447c).4d90d59).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
--allnow 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.--self-testchecks 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.--windowdefaults to 24, which keeps answers in flight under the CP2102N's 512-byte buffer.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 harnessformal/tern_tc_layer_rtl_tb.v: plays the harness byte stream through the unchangedtrinet_node_core.v+trinet_siphash24.vover UARTconformance/TERN_TC_LAYER_RECEIPTS.md: what is verified, by what, and how to reproduce it; the board runsconformance/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
var/trinity/output/Testing Checklist
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.python3 -m pyflakes conformance/tern_tc_layer_ax7203.py→ clean. The old file had 5 findings, includingsiphash24 imported but unused.Test Results
Performance Impact
Breaking Changes
--allnow means all 42 matrices, and--windowdefaults to 24. The old 24-matrix set is--mats wq,wo,gate,up.🔥 TOXIC VERDICT
What Works
What Doesn't Work
Known Issues
fba3995) resyncs instead, to count losses; the main harness is unchanged.99d90a6aagainstee75d97b), which is consistent with the two yosys versions but not yet explained.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
tc_inferfor a real prompt and run one full layer with them.Option 2: Flow control on the node
trinet_node_core.vand the AX7203 constraints, as the CP2102N datasheet asks above 1 Mbaud. Then rerun at window 64.Option 3: Leave the UART
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
Reviewer Notes
FIRST_JOB_NONCE + index. The setkey frame uses a separate nonce, so its ack can never be credited as work.4601246,50e8d95,0bdeab2,1e2677a,05d1f8b,bc3015d,8a20321,7c35699,d437476and09b3d6fwere made on the owner's machine. They hold the board logs, the write-ups, the pre-registrations and the survey. So were523447c,4d90d59,27087cb,3e00ed6,85e0eb7,054b1fe,bc40613,aa4511d,cf12a50,8b98e6c,4f68a4d,e243f27,0fdbeb6,c1e7091,cf82eeb,c590308,1f68b92,e1834ee,1733ab1andfba3995.🤖 Generated with Claude Code
https://claude.ai/code/session_011vMJx1ZWk2hq58jyEecRBY