Skip to content

fpga/ps7: run the ternary MAC in a board's PL, and stop claiming GF-T silicon we cannot show - #382

Open
gHashTag wants to merge 7 commits into
mainfrom
feat/tri-node-and-verification
Open

fpga/ps7: run the ternary MAC in a board's PL, and stop claiming GF-T silicon we cannot show#382
gHashTag wants to merge 7 commits into
mainfrom
feat/tri-node-and-verification

Conversation

@gHashTag

Copy link
Copy Markdown
Owner

Two things that belong together: a run, and a correction.

The run. ps7_probe.swab.bin was configured into the PL of a Puzhi P201Mini on 2026-08-19. Anchor 0x47C0 (our bitstream, not the vendor's), heartbeat 6 → 12 (FCLK reaches the fabric), and the ternary sign-select MAC returned +42, −42, 0, 0, +127, −127 for weight codes 01, 10, 00, 11 — all three symbols including both zero encodings, and the edge of the sample range. Log: fpga/ternary/ps7/results/ps7_probe_silicon_2026-08-19.log.

The first attempt rebooted the board. FIRST_LOAD.md already explains why and says the teardown belongs in the loader; quiesce_and_load.sh is that teardown. reboot restored the vendor bitstream and the radio, confirmed.

The correction. docs/VERIFIABLE_COMPUTE.md said GF-T runs on real silicon and the last gap was closed; fpga/gft/SYNTH_RESULTS.md said in the same tree that place-and-route, timing closure and a loadable bitstream are not proven. No artefact for the on-chip claim exists in any branch, and docs/GF_T_PROVEN.md cited .v source files as evidence for on-chip rows. Those claims now read as simulation and name the four artefacts that would close them. No RTL changed.

🤖 Generated with Claude Code

gHashTag and others added 7 commits August 18, 2026 00:14
The Metrics table opens with "Все числа - с on-device логов, без hearsay". On
2026-08-17 three of those numbers disagreed with the repository they describe:
110 test blocks against 118, 4 463 source lines against 7 152, and one ported
T27 spec against 86. Nothing was measured wrongly. The numbers were written
once and never recomputed, which no document can catch by itself.

  tri facts            recompute the repository metrics, diff against
                       tri-facts.json, exit 1 on disagreement
  tri facts --update   accept the measured values as the new baseline
  tri status           every claim marked hw must still have its evidence file
  tri boards           probe the nodes: answered / silent / not probed
  tri smoke            run the M1 crypto smoke test

Two rules are built in. A number a machine can re-derive is never trusted from
prose. And a probe that did not run is reported UNKNOWN, never as zero -- a node
nobody contacted is not a node that is down.

Proven able to fail: putting the README's stale 1 back into tri-facts.json for
t27_specs makes the check report DISAGREES and exit 1. On its first run tri
status found that radio/README.md, cited as the evidence for the AD9361 hw
claim and for six numbers in the Metrics table, is in neither the working tree
nor the published repository.

Also drops the drone wording from the crate manifest. The published README had
already been changed to say mesh and to carry a civilian-connectivity notice;
description and keywords still said drone-mesh, so crates.io metadata
contradicted the repository's own framing.
Translated from the published README, which is already about half Russian; the
English half is now Russian too. Structure verified block for block: same
heading levels and counts, same table row and column counts, same code fences,
blockquotes and rules, and every URL, path, arXiv ID, ORCID and hash unchanged.

Four numeric corrections, each checked rather than carried over:

  84 -> 83 numeric formats, twice. The live arXiv v2 of 2606.09686 says 83; 84
  is the superseded v1 count. (The catalog repo's own README still says 84 and
  needs the same fix.)
  110 -> 118 test blocks, 4 463 -> 7 152 source lines, 1 -> 86 T27 specs.

Those three rows now name `tri facts` as their source instead of a shell
one-liner, so the value has a producer that fails when it drifts. The line count
moved from 6 697 to 7 152 during this very change, because src/bin/tri.rs added
455 lines -- which is the argument for the whole approach, made by accident.

The published wording is preserved deliberately: this is a mesh network for
civilian use, and the civilian-connectivity notice stays. No drone or military
vocabulary appears anywhere in the translation.

Note for whoever pushes: the working tree's README.md is OLDER than the
published one -- it still says drone-mesh and lacks the civilian notice. Reconcile
with origin/main before applying the same three corrections there.
…bout why

Three metrics in a table headed "все числа - с on-device логов, без hearsay"
disagreed with the tree by 3.9x, 2.4x and 107x: 110 test blocks against 432,
4 463 source lines against 10 805, one T27 spec against 107. The command that
catches each is printed in the next column and nothing ran it.

The table also UNDERSTATED the project, which is the rarer failure. M2, M3 and
M4 were marked -sim / "Not run" while smoke/ holds 53 evidence files from
18-19 July showing two radio hops between four P201 Minis with the coverage seal
0x9DBE2510 identical at all three points, four-node multi-witness capture, and
signed Ed25519 receipts. A status table wrong in both directions is not a status
table: a reader cannot tell a cautious row from a false one and has to check
every row.

Corrected here, each row now naming a file that exists:

  radio/README.md does not exist. It was deleted with the rest of radio/ in
  b0ef52c "repo cleanup", after f608dad had already removed the reproduction
  scripts under a zero-.sh/.py rule. The measurement was real and survives at
  git show b0ef52c^:radio/README.md, so the row now says archive, not hw.

  Both competitor links were broken. They now point at the files that exist in
  docs/archive/, including the eight-metric benchmark against MPU5, Rajant,
  Silvus, Doodle Labs, TrellisWare and goTenna.

  "никакого излучения в эфир" is contradicted by 30 files in smoke/ describing
  2.4 GHz ISM transmission, while REGULATORY_STATUS.md covers 5.8 GHz seven
  times and 2.4 GHz not once. The band actually used has no regulatory record.

README.ru.md carried a THIRD set of wrong numbers - 118 / 7 152 / 86 - because
it was measured against a stale local main. The line count is no longer stored
in prose at all.

The article in docs/blog/ is the honest version of the comparison: tri-net wins
one axis of eight, spec openness, and has no measurement at all on throughput,
multi-hop falloff, self-healing time or power.
… silicon we cannot show

Two things, and they belong together because one settles the other.

First, a run. ps7_probe.swab.bin was configured into the PL of a Puzhi P201Mini
today and answered: anchor 0x47C0, so it is our bitstream and not the vendor's;
heartbeat 6 -> 12, so FCLK reaches the fabric; and the ternary sign-select MAC
returned +42, -42, 0, 0, +127 and -127 for weight codes 01, 10, 00, 11 -- all
three symbols including both zero encodings, and the edge of the sample range.
Log in results/ps7_probe_silicon_2026-08-19.log.

The first attempt rebooted the board. FIRST_LOAD.md already explains why --
writing the bitstream while a PL master is mid-transaction hangs the CPU inside
the write to the fpga_manager, and only the watchdog ends it -- and says the
teardown belongs in the loader. quiesce_and_load.sh is that teardown: kill the
sample streams, unbind the AD9361 cores, unbind both DMA engines, drop PL
Ethernet, then load. With it the load is clean. `reboot` restored the vendor
bitstream and the radio, confirmed.

Second, a correction. docs/VERIFIABLE_COMPUTE.md said GF-T runs on real silicon
and that the last gap was closed; fpga/gft/SYNTH_RESULTS.md said in the same
tree that place-and-route, timing closure and a loadable bitstream are not
proven. Both cannot be true. Searching for the artefact -- a place-and-route log
naming a gft_*_ax7203 top, a .fasm, a .bit, an openocd transcript, a UART
capture -- returns nothing in any branch, and docs/GF_T_PROVEN.md cited .v source
files as the evidence for on-chip rows, which is a source file, not a run. The
quoted vectors cannot settle it either: they are the same golden vectors the
committed Icarus benches carry, so they do not distinguish a board from a
testbench.

So those claims now read as simulation, with the four artefacts that would close
them named in order. The gap is marked OPEN again rather than CLOSED. Nothing
about the RTL changed; only what we say we have shown.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The -sim baseline job runs cargo fmt --all --check and this file failed it,
which blocked the branch on a formatting diff rather than on anything it claims.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The -sim baseline job treats every clippy warning as an error. One empty format
string in the operator CLI held the branch, which is a formatting complaint
rather than anything about what the branch claims.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The drift gate went red on every file it checks -- 96 of 96 Rust, 107 of 107
Zig, 75 of 75 C -- which is not a stale file but a stale tree. It was green on
main as recently as 9 August; since then t27 master moved and nothing in tri-net
re-ran the generator, so the first branch to run the gate inherited the whole
accumulated difference. The remedy is the one the gate itself prints on every
failing line.

Regenerated with t27c built exactly as CI builds it -- gHashTag/t27 at master,
`cargo build --release --manifest-path bootstrap/Cargo.toml` -- because a
generator built from the repository root produces different output and would
have made this worse rather than better: it drops the C test runner. Rust is
piped through rustfmt, as the gate requires, since some gen/rust files are
`#[path]`-included into src/ and the build gate runs `cargo fmt --all --check`
over them. C and Zig are committed as emitted.

Verified before pushing rather than after: drift 0 of 289 across all three
backends, `cargo fmt --all --check` clean, `cargo clippy --all-targets -D
warnings` clean, 415 tests passing.

The visible content change is that generated C tests now carry real bodies where
the committed files still had `/* TODO: implement test */`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@gHashTag

Copy link
Copy Markdown
Owner Author

Blocked by the drift gate, which is red for reasons this branch does not cause — see #383 A1/A2. This branch touches zero files under gen/ or specs/.

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.

1 participant