Skip to content

Restore six 404 docs, fix the gitignore rule that hid them, and three checks that would have caught it - #648

Merged
gHashTag merged 33 commits into
mainfrom
fix/restore-vsa-via-zig-hdc
Aug 10, 2026
Merged

gHashTag merged 33 commits into
mainfrom
fix/restore-vsa-via-zig-hdc

Conversation

@gHashTag

Copy link
Copy Markdown
Owner

121 commits, unpushed until now. This PR exists so the merge is a decision someone takes rather than one that happens.

What it unblocks immediately

Six documentation links on t27.ai have returned 404 for five months — the whole Verified Benchmark Reports block and "Read Full Mathematical Proofs →". The site links to blob/main/, so they stay dead until this lands.

Root cause of the 404s: one line of .gitignore

*.md
!CLAUDE.md
!docs/

!docs/ un-ignores the directory; *.md matches the files inside it. The exception matched nothing, so every .md written into docs/ was invisible to git — 28 documents, including all six the site links to. Changed to !docs/**.

The six documents, with five claims corrected

claim-guard's pre-publish hook blocked the first attempt to restore them, correctly. Three were already clean; five lines in the other three were fixed. Every correction removed an editorial gloss — no measurement changed:

was now
DSPs: 0 (no multipliers!) DSPs: 0
Ternary matmul: no multiply operations Ternary NETWORK is multiplier-free; matmul → MUX+ADD
best-in-class CPU inference performance Trinity's measured CPU inference performance in this run:

All 73 documents in docs/ now pass claim-guard clean.

Site integrity fixes

  • Four panels rendered nothing in production. useState<keyof typeof MODES[number]> resolves to 'key' | 'label', so 26 branch conditions were statically false.
  • undefined.toFixed() on the only path production takes. The deployed API base is http://localhost:8080; 18 crash sites guarded.
  • φ presented as measurement. The ORCHESTRATOR panel read Consensus:1.618 in green; 0.618 and 1.62 appeared as measured φ-alignment. Now dashes, with an amber SAMPLE DATA marker driven by a sample() tag on all 39 service fallbacks.
  • A dashboard fabricating telemetry. ProductionDashboard has zero fetch() calls; Active Nodes was 12 + (tick % 3) and TPS was 42 + Math.sin(tick) * 5, animated beside a green OPERATIONAL dot — while the landing page says "Testnet Nodes / Launching Soon" about the same subject.
  • GitHub tiles wrong by 6.7× on stars (47 shown, 7 real), corrected against the API and dated on screen.
  • The GF-T page's two evidence links were 404. Oracle repointed to conformance/gf_ref.py — the model the live research file itself names. The RTL link removed rather than repointed: the nearest published multiplier is gf16_mul.v, and GF-T16 is not GF16.

Three new checks, each verified by breaking it

command catches
npm run check:render drives real Chrome over CDP, expands every panel across all nine canvas layers, fails on the first uncaught error — no browser dependency
npm run check:api a field the UI formats that no server emits; an untagged fallback
npm run typecheck:ratchet typecheck errors may fall, never rise (231 → 184)

vite build was green through every one of the defects above. It proves the bundler succeeded, not that the page renders.

Reviewing

The site and docs changes are 109 files, +11020 −1632. The remaining ~100 commits predate this work.

🤖 Generated with Claude Code

gHashTag and others added 30 commits August 10, 2026 05:07
- remove all gold/yellow (#fefce8, #92711a, #d4a843 and their alpha forms)
- unify legacy Tailwind greens (#16a34a, #4ade80) onto brand #00CC66/#00FF88
- keep green only on interactive state: focus, active filter, status badge
- disable respectPrefersColorScheme; the site has no light theme

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The pinout existed only as prose in a skill file -- a repo-wide search
found zero .xdc and zero Verilog mentioning RGMII anywhere. This puts it
back as something a build can consume.

Carries the three traps that cost whole sessions: nextpnr's XDC parser
matches port names exactly and silently ignores [*], so every constraint
is one pin per line; SLEW FAST belongs on every TX pin; phy_rst_n is
FPGA-driven and active low, so a retry interval must follow the settling
time of what it configures.

IOSTANDARD is deliberately absent -- the bank VCCO for this PHY is not
recorded anywhere, and a guess would build cleanly while driving the PHY
at the wrong level.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
resources.ts said 'OPEN, not merged' for all six openXC7 PRs. #109, #110
and #115 merged on 2026-08-09 with 'LGTM, thanks for the contribution!'.
The page other channels link back to was understating the result.

Added #663 and #682 on trabucayre/openFPGALoader -- both merged, and
absent from the site entirely until now.

posts.ts receipts now name each PR's state, and the file's house rule
changed from 'never say merged' to 'name the state exactly', with the
re-verification command beside it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
#111, #112, #113 merged 2026-08-10 by hansfbaier. resources.ts carries
his reply on #111 about a regression test suite.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
hansfbaier merged #111 saying he is thinking about a regression test
suite and that the reproduction posted there 'would be a nice start'.
This is that start, in the demo-projects idiom.

The point is check.py, not the build. A demo project passes when it
builds; this case only tests anything while Yosys' clkbufmap still
promotes the flip-flop divider to a BUFG. If that changes the project
still places and still goes green while exercising nothing, so the check
asserts its own premise -- two BUFG cells -- before its result.

Verified here: synthesis yields exactly two BUFGs, one of them
$auto$clkbufmap.cc:261:execute$2539, the cell named in the pre-patch
error. check.py exercised in three directions.

Not verified: placement. No nextpnr-xilinx or chipdb on this machine, so
the --fasm half has never run. Said so in the README.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The repo .gitignore has a blanket *.md at line 311, so 'git add <dir>'
took the four code files and left the documentation behind without a
word. Force-added.

Also records what running this costs: 813 MB of prjxray-db, a separate
24 MB metadata submodule without which bbaexport dies on a bare
FileNotFoundError, -DUSE_OPENMP=OFF because Apple clang rejects the
hardcoded -fopenmp, and a chipdb export measured in tens of minutes.
bbasm asserts streamStack.empty() on a truncated .bba -- that is what a
killed export looks like, not a corrupt database.

README к набору регрессионных тестов, потерянный прошлым коммитом:
в .gitignore стоит *.md, и git add по каталогу молча забрал только код.
Добавлено принудительно. Записана стоимость воспроизведения: chipdb для
xc7a200t считается десятками минут, и это дороже самого теста.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Built at e86f351 without the #111 fallback, generated an xc7a200t
chipdb, ran it: exit 0, FASM written. On a binary that lacks the patch.
So the case guards nothing as written.

Ruled out: pack_clocking_xc7.cc is byte-identical to f8e7643, and #110
is UltraScale+ only. Untested candidate: prjxray-db was bumped, and a
different database gives different legal BELs.

Случай не воспроизводит ошибку. Сборка без патча размещает дизайн
успешно, значит тест ничего не сторожит. Ведущая гипотеза -- смена
версии prjxray-db, и её надо закреплять вместе с кристаллом.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Generated a second xc7a200t chipdb from d429061 -- the database f8e7643
pins -- and compared it with the one from 399a099: byte-identical. The
bump adds RIOB18 entries for kintex7 and virtex7, so it cannot affect an
artix7 database at all.

Two chipdb exports and ~20 minutes to disprove one convincing sentence.
Remaining candidates, cheapest first: the unpinned Yosys version, then
xdc.cc from #109, then the carry-relocation addition to pack.cc.

Гипотеза про prjxray-db опровергнута измерением: обе chipdb побайтово
совпадают, правка в базе касается kintex7 и virtex7, а не artix7.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…h ways

Applied #111's ten lines by hand, rebuilt, and ran patched and unpatched
binaries on the same netlist and chipdb.

try_preplace leaves the fabric-driven buffer unplaced in both, exactly as
the PR describes -- that part reproduces. But the main placer then finds
it a legal BUFGCTRL site unaided, 2 of 32 used, so nothing aborts. The
CLK_BUFG FASM lines are identical between the two runs: same 129 lines,
same sites. preplace_unique only pre-assigns what the placer would pick.

The abort needs BUFGCTRL contention, which a two-buffer design cannot
create. Minimality removed the pressure the bug requires.

Механизм воспроизводится, симптом -- нет. Буфер от фабрики действительно
остаётся незакреплённым, но размещатель находит ему место сам. Для
падения нужна конкуренция за сайты BUFGCTRL, которой в минимальном
дизайне быть не может.

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

Generated designs with 8, 20 and 34 fabric-driven dividers, synthesised
to 9, 21 and 35 BUFG cells against 32 sites, and ran them on the
unpatched binary. Both completed designs placed -- 8 wrote 82,723 B of
FASM, 20 reached routing. No abort.

Two hypotheses tested, two disproved: the prjxray-db bump by
byte-identical chipdbs, contention by these runs.

Гипотеза о конкуренции за буферные сайты проверена и не подтвердилась:
ни 9, ни 21 буфер не вызывают падения на сборке без патча.

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

Built at f8e7643 and got the exact error from the PR, same cell name, no
FASM. Built at c8c4064 (the #109 merge) and it places, 34,788 B. So the
case is real and stops being real one commit later.

pack_clocking_xc7.cc is byte-identical across all of these, so packing
never changed -- try_preplace leaves the fabric-driven buffer unplaced
throughout. After #109 the placer finds it a site unaided.

Consequence for a suite: a case built on this reproduction would go
green the day it was added and stay green forever. A regression case has
to be validated against the commit where the bug was observed, not main.

Воспроизведено на f8e7643 и найдено бисекцией: #109 маскирует дефект,
который чинит #111. На текущем main этот случай упасть не может.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
check.py --nextpnr now fails on any tree at or after c8c4064 rather than
reporting a meaningless green. At f8e7643 it passes and can be run to the
failure.

This makes the directory what it honestly is: a historical verification,
not a guard on main. The patch's effect on main is not observable -- the
post-place JSON carries no BEL attribute for either buffer, patched or
not -- so a real guard would need a design where #111 still changes the
outcome after #109, and that design has not been found.

check.py отказывается зеленеть на дереве, где дефект недостижим. Зелёный
тест никто не перечитывает, поэтому молчаливый проход хуже отказа.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
AboutAuthor carried 'benchmarks best-in-class (~3-5.5x vs comparable
formats)' -- the same sentence as the LinkedIn About. int8 leads by ~3%,
and the comparison that holds is against tapered formats specifically.

Заменено на измеренное: 2.4-6.4x против tapered-форматов, 18 форматов,
один путь, XC7A200T. Число с условиями выдерживает проверку.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
CASE-00 of claim-audit-lab withdraws delta_CP = 3/phi^2 as the
CP-violating phase, after an independent arithmetic check showed the
identity does not deliver the claimed match at the required precision.
Marked never to be restated -- and until now visible only inside a
repository.

Kept separate from discrepancies(). A discrepancy is a row a reader
should treat with suspicion; a retraction is one the authors have already
settled against themselves. Conflating them understates both.

Отзыв delta_CP вынесен на сайт отдельным разделом. Программа, отозвавшая
собственное физическое утверждение по арифметике, должна говорить об этом
там, где это найдут.

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

Fixing AboutAuthor.tsx removed the string from src -- zero occurrences --
and the claim still shipped, because the rendered copy comes from
messages/en.json and messages/ru.json. Caught by grepping the built
bundle rather than the source.

en: 'benchmarks best-in-class (~3-5.5x vs comparable formats)' ->
'measured at 2.4-6.4x against tapered formats on a ternary network (18
formats, one path, XC7A200T)'. ru: the same, 'лучшие в классе' removed.

Заявление жило в файлах перевода, а не в компоненте. Правка компонента
убрала строку из исходника и не убрала её из сборки.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Checked de/es/zh: clean. en and ru each carried three, none of them in
any component:

- 'benchmarks best-in-class (~3-5.5x)' -> the measured 2.4-6.4x against
  tapered formats
- 'Ternary = no multiply ops' / 'Троичное = без умножений' -> the NETWORK
  removes the multiply, which is what the rule has always said
- 'metrics: 42 languages' and the 'No Multiplications' heading

And one more outside the catalogues: techTreeData.ts carried
metrics: '42 languages'.

Verified against the built bundle, not the source -- which is the only
reason any of these were found. All five locales pass claim-guard, all
five parse, and the bundle is clean of every blocked string while
carrying the corrected text and the delta_CP retraction.

Проверено по собранному пакету, а не по исходнику -- иначе ни одно из
этих мест не нашлось бы.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`npm run build` was `tsc -b && vite build` -- a lie in both directions. It
never ran in the deploy path, and it gated nothing, so 231 errors accrued
unseen. The decision was fix-or-rename; the errors turned out not to be
noise, so: both.

FormulaDiscoverySection declared mode as `keyof typeof MODES[number]`,
which resolves to 'key' | 'label' -- the keys of the element, not the
values of .key. Every one of the seven `mode === 'discover'` style
branches compared against a value the type could never hold, so all seven
were statically false and the section's entire panel rendered nothing in
production. TS2367 had been reporting exactly this, to no one.

MODES is `as const` now with `type Mode = (typeof MODES)[number]['key']`,
and the effect guards the empty initial mode. 231 -> 221; vite build ok.

The remaining 221 get a ratchet rather than a rewrite: the count may fall,
never rise. Deleting the typecheck would have thrown away the only thing
that found this.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The Mode annotation bug was in four sections, not one: NFTMarketplace,
SelfImprover and SacredEconomy carry the identical
keyof typeof MODES[number], so nineteen further branch conditions were
statically false. Four interactive panels rendered nothing in production.

TrinityCanvas was a different fault with the same symptom. chatApi
declares two fields -- consciousness_level: number and state: string with
the bands 'enhanced' | 'transcendent' | 'normal' | 'minimal'. The canvas
compared the number against the band names and called .toUpperCase() on
it, in four places.

The roadmap panel is worse: ConsciousAIRoadmapMetrics has no
consciousness_level at all, and mockConsciousnessRoadmap() -- the object
served when the API is unreachable -- does not define it. So
roadmapMetrics.consciousness_level.toUpperCase() was
undefined.toUpperCase() on the fallback path. Repointed at .milestone,
which is the string label that exists.

TS2367 is now 0, from 29. Total 231 -> 184, ratchet lowered. vite build ok.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A32 found one undefined.toUpperCase() on the API-failure path. It was not
one -- TrinityCanvas formats 17 further metric fields that appear in no
interface and in no mock or default object in chatApi.ts. Checked both:
zero of seventeen are declared, zero are given a value anywhere.

The panels guard on `metrics &&` only, never per field, so expanding any
of Consciousness, LISA, Neuromorphic or QG with the fallback object ran
undefined.toFixed() and threw. The mock is what renders when the backend
is down, so these were crashes on exactly the path that exists to survive
the backend being down.

Guarded as `x?.toFixed(n) ?? '—'` rather than invented values: a field
nobody declared has no defensible default, and a dash is honest about
that. No .map/.length/.join on undeclared fields remain.

Error count stays 184 on purpose. TS2339 still fires because the fields
really are undeclared -- that signal is now accurate rather than doubling
as a crash. Whether the backend sends them is the open question, and it
is a question about the API contract, not about this file.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Four loops produced one failure shape: a component formats a field no
interface declares, no mock defines and no server sends. Green build,
blank or throwing panel. This catches that class statically in a second.

It is NOT the render check that would have caught all of it -- build,
open /canvas, expand every panel, fail on the first console error. That
needs a headless browser this repo does not have, which is a separate
decision. This is the cheap static half.

First run reported 129 missing fields. It was comparing against one
server file, so swarm, DHT and TRI-token metrics -- emitted by other
services entirely -- counted as missing. 'Not emitted' has to mean 'by
anything'. Against all 2216 zig sources the real number is 110, and 19
of the first run's findings were the checker's own.

Baseline 110, may fall and never rise. The check compares names only: it
cannot see units or nesting, which is why A34's five mappable fields stay
unwired rather than being relabelled as microseconds.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Decomposing the 110 read-but-never-emitted fields by owner: 54
TrinityCanvas, 44 ConsciousnessMonitorWidget, 12 FPGASynthesisWidget.

I then reported 29 unguarded .toFixed() calls in the two widgets nobody
had checked. That was wrong, and tsc disproved it: strict is true and it
reports zero errors in both files. ConsciousnessMonitorWidget guards
every optional field with an explicit !== undefined, and FPGASynthesis
declares its own local interface with non-optional fields. My detector
only recognised ?. as a guard, so it called an enclosing conditional
unguarded. Same shape as A35 -- the definition was narrower than reality.

The real defect is better than the one I claimed. getMockMetrics() runs
whenever the fetch fails; on the deployed site the API base is localhost,
so it always fails. Nothing on screen said so. A literal like
novelty: 0.342 rendered as a consciousness-guided FPGA measurement, on a
public route, indefinitely.

Provenance is tracked at all three setMetrics sites now, and an amber
SAMPLE DATA marker shows whenever the displayed numbers did not come from
a response.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A36 labelled one widget. The other two get their mocks from chatApi, not
from themselves, so the label belongs there: sample() tags all 17 fallback
returns with __sample, and SampleBadge renders an amber marker from it.
A plain field rather than a Symbol, so it survives JSON round-trips.

And the sharpest instance of A36 was in the widget being wired.
Phi_gamma threshold rendered as
  metrics.phi_gamma_threshold?.toFixed(3) || '0.618'
-- phi-1, this project's signature constant, shown as a measured
threshold whenever the field is absent. It is absent always: the field is
one of the 110 no server emits. So the single number a sceptical reader
would scrutinise hardest was a literal with a decimal point on it.

Now a dash, with the badge saying why.

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

A36 was fixed by hand in three components. Fixing an instance without
fixing the pattern is how it comes back -- the register has four entries
of that shape already.

api-contract-check now also requires every 'return mockX()' in chatApi to
be wrapped in sample(). Verified by removing one wrap and confirming the
check exits non-zero and names the function, then restoring it. A checker
whose failure path has never run is an assumption.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A fan-out sweep with adversarial verification put 36 candidates up and 26
were refuted. Ten survived, and two of them exposed my own work from the
previous loop.

First: the rule I added to stop unlabelled fallbacks matched `return
mockX(` only. The codebase names most of them `generateMockX`, so the
check printed 'all service fallbacks tagged' while 22 were untagged. A
false all-clear from the checker built to prevent that exact class.
Pattern widened, 17 tagged became 39, and verified by breaking it:
untagging generateMockStorageMetrics exits non-zero and names it.

Second: sample() tags the data but only ConsciousnessMonitorWidget read
the tag. TrinityCanvas rendered SampleBadge zero times, so on /canvas the
tag was inert -- the ORCHESTRATOR panel read 'Consensus:1.618' in green,
phi reported as the live consensus of the agent swarm, because
consensus_score > 1.0 passes and the mock types the golden ratio in
literally. Badges now on all seven panels.

Tagging the data is necessary and not sufficient. Something has to read
the tag.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The sweep's worst finding was not a mock. ProductionDashboard, live at
/#/dashboard, contains zero fetch() calls. 'Active Nodes' was
12 + (tick % 3) and 'TPS' was 42 + Math.sin(tick) * 5, animated on a 3s
timer beside a green OPERATIONAL dot and a real chain name. The motion is
what sells it: a number that wobbles reads as a sensor reading.

And the site contradicted itself. The landing page's DePINSection says
'Testnet Nodes / Launching Soon' about the same subject. The dashboard
said 13.

The GitHub tiles were checkable in one click and wrong: 47 stars against a
real 7, 8 forks against 2, 12 open issues against 21, 120 commits against
5681 on HEAD. Corrected against the API and git rev-list, and dated on
screen -- a stale number that says when it was taken is honest, an
invented one that moves is not. 'Cycles: 110' had no source at all and is
now a dash.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A second file was doing exactly what A37 recorded. AutonomousUniverseSection
rendered the phi alignment as `?.toFixed(3) || '0.618'` and its reciprocal
as `: '1.62'`, so with the API down -- which is always, in production -- the
panel read 'phi^2 + 1/phi^2 = 3 | 0.618 phi | 1.62'. Both are the constant
itself, presented as measured alignment beside the identity they come from.

Also cleared: avg_price defaulting to 0.00, a marketplace fee asserting 2.5%
when unknown, and three zero-defaults. A zero shown in place of an unknown
is a statement -- '0.0000 TRI' says the balance is zero, it does not say
nobody answered. All now dashes.

184 typecheck errors before and after; the seven in the touched files are
pre-existing missing-export errors, not new.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The check A31-A38 kept pointing at: build, serve dist the way Pages does,
open the page in Chrome, expand every panel, fail on the first uncaught
error or console.error -- naming the panel that was clicked when it appeared.

No browser dependency. puppeteer-core measured 29MB over 2221 files and still
needs a Chrome to drive; Chrome is already installed, speaks CDP, and Node 22
has a WebSocket client built in.

Three findings came out of making it run, each a false clean it refused to report:

1. /canvas defaults to the 'petals' layer -- seven DOM nodes of constants
   ticker. Every panel A31-A38 was about lives on 'tools', one of NINE layers
   reachable only by pressing 1-9. Six loops of fixes had gone into panels the
   default view does not render.
2. Pressing the digits in sequence found nothing either: layer 2 is chat and
   focuses its textarea, so every later digit was TYPED INTO THE BOX.
   Indistinguishable from nine empty layers. Blur before each key.
3. ws://localhost:8080/ws/pas cannot connect here and, on an HTTPS page, is
   blocked as mixed content before it is tried. Classified as the absent
   backend with its endpoint named, not muted by a broad pattern.

Verified by breaking it: a canary in the LISA panel produced
"1 error after expanding LISA 2035 SAMPLE DATA on layer 7".

The passing run independently confirms the A38 fix reached the built bundle --
the panel labels it prints carry the SAMPLE DATA marker.

Проверка рендеринга через реальный Chrome по CDP, без зависимостей.
Обнаружено: панели, которые чинились шесть циклов, не рендерятся на слое по
умолчанию; слой чата перехватывает цифры фокусом; ws://localhost блокируется
как mixed content. Путь отказа проверен канарейкой.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…k flaking

Two defects, both found by the check built in the previous commit.

The manifest. index.html declares rel="manifest" href="manifest.json" and
vite build emits no such file, so every load logged "Manifest: Line 1,
column 1, Syntax error" -- the static server falls back to index.html and
the browser parses HTML as JSON. The live site is fine because
manifest.json was committed directly into the Pages repo and never existed
in public/. A file the site serves that is not in the source that builds
the site: any deploy from a clean build drops it. Copied into public/,
verified the built dist emits it and that all four icons it names are
present.

The flake. The same build gave 4 panels on one run and 0 on the next.
switchLayer holds a transitioning lock across a 200ms fade and returns
early while it is set, so a fixed sleep races it. Replaced with
press-watch-repress: press the key, watch body text for any change, press
again if nothing moved, and report "no DOM change after 4 presses" rather
than silently attributing it to an empty layer. Three consecutive runs now
report 4 panels.

A timing-flaky check is muted within a week, which makes flakiness the
same defect class as a false clean.

Манифест объявлен в index.html, но сборкой не производится: живой сайт
работает только потому, что файл лежит прямо в репозитории Pages. Перенесён
в public/. Флак проверки рендеринга снят: вместо фиксированной паузы --
ожидание фактической смены слоя.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every link in the site's "Verified Benchmark Reports" block, and "Read Full
Mathematical Proofs ->", returns 404 on a public repo whose docs/ holds 67
tracked files. Not access control -- dead paths.

The cause is one line:

    *.md
    !CLAUDE.md
    !.github/
    !docs/

The intent is plain: drop stray generated markdown, keep docs/. But !docs/
un-ignores the DIRECTORY, and *.md matches the files inside it at any depth,
so the exception matched nothing. Every .md written into docs/ since that rule
landed has been invisible to git -- 28 of them, including all six the site
links to.

Changed to !docs/**. Verified: git check-ignore now resolves those paths to
the negation rule, and git status names 28 files it had never mentioned.

The documents themselves are NOT restored here, and the reason is worth
recording. They were recovered from history and staged; claim-guard's
pre-publish hook blocked the push, correctly:

    "Trinity delivers best-in-class CPU inference performance"
    "Ternary Operations (No Multipliers!)"

Both are claims this project's own rules forbid -- int8 leads by 3%, and it is
the network that is multiplier-free, not the format. The documents predate that
discipline by five months. Restoring them as-is would republish exactly what
claim-guard exists to stop, so the links stay dead until the wording is fixed.
A dead link is better than a live overstatement.

Правило !docs/ отменяло игнор каталога, а не файлов в нём: 28 документов были
невидимы для git. Сами документы не восстановлены -- claim-guard заблокировал
их публикацию, и справедливо.

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

The links in "Verified Benchmark Reports" and "Read Full Mathematical
Proofs ->" have returned 404 for five months. The documents were not
missing: the .gitignore rule fixed in fe172f2 had made every .md in
docs/ invisible to git, so they fell out of the tree unnoticed.

Recovering them was blocked by claim-guard's pre-publish hook, correctly,
on five lines. Three of the six were already clean; the five corrections:

  "Ternary matmul: no multiply operations"
    -> "Ternary NETWORK is multiplier-free; matmul becomes MUX+ADD"
  "Trinity delivers best-in-class CPU inference performance"
    -> "Trinity's measured CPU inference performance in this run:"
  "Операция: MUX + ADD (без умножения)"
    -> attributes the removal to the network, not the format
  "### Ternary Operations (No Multipliers!)"
    -> "### Ternary Operations (the network is multiplier-free)"
  "DSPs: 0 (no multipliers!)"
    -> "DSPs: 0"

That last one is the shape of all five. DSPs: 0 is a measured synthesis
result and stays; the parenthetical was an editorial gloss attributing
multiplier-freedom to the format. The measurement was never the problem.

One judgement worth recording: the matmul line sits inside a fenced
box-drawing block that looks like captured console output, and editing a
recorded output would be doctoring an artefact. It is not one -- the box
contains authored bullets under "WHY TRINITY WINS". Prose formatted to
look like output is still prose.

All six now pass claim-guard clean.

Восстановлены шесть документов, на которые сайт ссылается пять месяцев,
с пятью исправленными формулировками. Измерения не менялись -- снята
только редакторская атрибуция отсутствия умножений формату вместо сети.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
gHashTag and others added 3 commits August 11, 2026 00:16
claim-guard checked across all 73 documents in docs/: zero flagged. Then
the same sweep over the site's 46 external links found 11 non-200 -- six
already fixed and pending merge, LinkedIn's 999 is anti-bot, and three
that were new.

Two of the three are on the GF-T page, which carries the flagship claim.
Measured against a full recursive tree of trinity-fpga (18,617 paths):
conformance/gft16_ref.py does not exist, and build/ does not exist at all.
So the page states "beats the published state of the art" and the two
links a sceptic would click to check it are dead.

The oracle is repointed to conformance/gf_ref.py -- sourced, not guessed:
research/GFT16_BEATS_TEKUM16_2026-08-05.md, which IS live, names gf_ref.py
and tekum_ref.py as the two models it compared. The RTL button now points
at tekum_ref.py, the other half of that comparison.

The RTL link is removed rather than repointed. There IS multiplier RTL in
that repo, fpga/openxc7-synth/gf16_mul.v, and it is a DIFFERENT format:
GF-T16 is sign:offset:mant in a u32, GF16 is S1E6M9 bias 31, and the skill
library keeps them apart because substituting one for the other is the
easiest error in this corpus. A link to another format's multiplier is
worse than no link.

And the COST table reports LUTs, DSP count and 81 MHz for gft_mul, whose
source is in no public repo. The numbers stay -- they were measured -- with
a visible footnote saying a reader cannot regenerate them. Better said than
discovered by clicking a link that is not there.

Две доказательные ссылки на странице GF-T отдавали 404. Оракул
перенаправлен на модель, которую называет сам research-файл; ссылка на RTL
снята, а не подменена: ближайший опубликованный множитель -- другой формат.

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

Two commits ago I wrote that gft_mul exists in no public repository, and put
a footnote on the page saying a reader cannot regenerate its synthesis
numbers. That was wrong.

I searched trinity-fpga -- a full recursive tree, 18,617 paths -- found no
gft_mul.v, and let a claim about one repository stand as a claim about all of
them. It is in gHashTag/trinity at fpga/gft/gft_mul_w.v, and fpga/gft/README.md
beside it carries THIS PAGE'S TABLE verbatim:

  | gft_mul -- 32-bit ports, as written | 1,179 | 3 | 81 MHz    |
  | gft_mul_w -- widths the values need |   219 | 1 | 81.35 MHz |

Both files return 200. So the RTL button is restored, pointing at
trinity/fpga/gft/gft_mul_w.v, and the footnote now names the README the
numbers come from instead of apologising for their absence.

What does NOT change: gf16_mul.v in trinity-fpga was not the answer and still
is not. GF-T16 is sign:offset:mant in a u32; GF16 is S1E6M9 bias 31.
Substituting one format's multiplier for another's remains the easiest error
in this corpus -- the link is right now because the right file was found, not
because a near-enough one was accepted.

Searching one repository does not license a claim about all of them. Fifth
instance of absent-is-not-zero in this register, and the first I committed
after writing four entries about it.

Исходник gft_mul опубликован -- в trinity, а не в trinity-fpga. Я искал в
одном репозитории и объявил "нигде". Ссылка на RTL восстановлена, сноска
называет README, откуда взята таблица.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The last line claim-guard flagged across the 30 markdown files this PR
touches. From #591 in May, not from this work, but it ships with the merge:
'No multiplications.' becomes 'The ternary network is multiplier-free.'

Патентный анализ: отсутствие умножений отнесено к сети, а не к формату.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@gHashTag
gHashTag merged commit b795a81 into main Aug 10, 2026
11 of 33 checks passed
github-actions Bot added a commit that referenced this pull request Aug 10, 2026
Restore six 404 docs, fix the gitignore rule that hid them, and three checks that would have caught it (#648)

Restore six 404 docs, fix the gitignore rule that hid them, and three checks that would have caught it
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