Repository navigation
Restore six 404 docs, fix the gitignore rule that hid them, and three checks that would have caught it - #648
Merged
Merged
Conversation
- 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>
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>
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>
This was referenced Aug 10, 2026
Merged
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.
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 Reportsblock and "Read Full Mathematical Proofs →". The site links toblob/main/, so they stay dead until this lands.Root cause of the 404s: one line of
.gitignore!docs/un-ignores the directory;*.mdmatches the files inside it. The exception matched nothing, so every.mdwritten intodocs/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:DSPs: 0 (no multipliers!)DSPs: 0Ternary matmul: no multiply operationsTernary NETWORK is multiplier-free; matmul → MUX+ADDbest-in-class CPU inference performanceTrinity's measured CPU inference performance in this run:All 73 documents in
docs/now passclaim-guardclean.Site integrity fixes
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 ishttp://localhost:8080; 18 crash sites guarded.Consensus:1.618in green;0.618and1.62appeared as measured φ-alignment. Now dashes, with an amberSAMPLE DATAmarker driven by asample()tag on all 39 service fallbacks.ProductionDashboardhas zerofetch()calls;Active Nodeswas12 + (tick % 3)andTPSwas42 + Math.sin(tick) * 5, animated beside a green OPERATIONAL dot — while the landing page says "Testnet Nodes / Launching Soon" about the same subject.conformance/gf_ref.py— the model the live research file itself names. The RTL link removed rather than repointed: the nearest published multiplier isgf16_mul.v, and GF-T16 is not GF16.Three new checks, each verified by breaking it
npm run check:rendernpm run check:apinpm run typecheck:ratchetvite buildwas 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