diff --git a/apps/website/src/data/blog/bodies/context-length-resonance-not-power-law.ts b/apps/website/src/data/blog/bodies/context-length-resonance-not-power-law.ts new file mode 100644 index 0000000000..5c99cf4f6e --- /dev/null +++ b/apps/website/src/data/blog/bodies/context-length-resonance-not-power-law.ts @@ -0,0 +1,137 @@ +import type { Block } from '../types' + +export const body: Block[] = [ + { + "kind": "p", + "text": "The usual intuition about context length is monotone: more context, better or equal perplexity, with diminishing returns. Ternary training does not do that." + }, + { + "kind": "h", + "text": "The measurement" + }, + { + "kind": "table", + "head": [ + "ctx", + "perplexity" + ], + "rows": [ + [ + "18", + "5.58" + ], + [ + "27 = 3³", + "2.96" + ], + [ + "54 = 2×27", + "6.05" + ] + ] + }, + { + "kind": "p", + "text": "Going from 18 to 27 nearly halves perplexity. Doubling from 27 to 54 does not merely lose that gain — it lands worse than the ctx=18 baseline it started from." + }, + { + "kind": "quote", + "text": "Ternary scaling follows a resonance curve, not a power law. The optimal contexts are 3ᵏ orbitals — 9, 27, 81 — and the values between them are forbidden zones." + }, + { + "kind": "h", + "text": "Why this is a claim and not an anomaly" + }, + { + "kind": "p", + "text": "A scaling law does not do this. Under any monotone law, ctx=54 sits between ctx=27 and the asymptote, so it can be worse than 27 by diminishing returns but not worse than 18. One measurement that goes backwards past its own baseline is not noise around a curve; it is the wrong shape of curve." + }, + { + "kind": "h", + "text": "The companion constraint" + }, + { + "kind": "p", + "text": "A second result from the same series: the context must equal the head dimension, or a power-of-three divisor of it. Square attention — ctx = head_dim — gives full rank; anything else gives up rank silently." + }, + { + "kind": "p", + "text": "Taken together the two are a recipe with no free parameters: pick a power of three, then set head_dim to it. Any other pair either lands in a forbidden zone or gives up rank, and both failures are quiet — the run trains, it just trains worse." + }, + { + "kind": "h", + "text": "What would falsify it" + }, + { + "kind": "p", + "text": "A binary-weight control at ctx = 16, 32, 64. If the same non-monotonicity appears with powers of two, the effect is about context alignment in general and has nothing to do with the ternary alphabet. That control has not been run here, and it is the first thing I would ask for if someone showed me this table." + } +] + +export const ruBody: Block[] = [ + { + "kind": "p", + "text": "Обычная интуиция про длину контекста монотонна: больше контекста — перплексия та же или лучше, с убывающей отдачей. Троичное обучение так себя не ведёт." + }, + { + "kind": "h", + "text": "Измерение" + }, + { + "kind": "table", + "head": [ + "ctx", + "перплексия" + ], + "rows": [ + [ + "18", + "5.58" + ], + [ + "27 = 3³", + "2.96" + ], + [ + "54 = 2×27", + "6.05" + ] + ] + }, + { + "kind": "p", + "text": "Переход с 18 на 27 почти вдвое улучшает перплексию. Удвоение с 27 до 54 не просто теряет этот выигрыш — оно оказывается хуже базы ctx=18, с которой всё начиналось." + }, + { + "kind": "quote", + "text": "Троичное масштабирование следует резонансной кривой, а не степенному закону. Оптимальные контексты — орбитали 3ᵏ: 9, 27, 81. Значения между ними — запрещённые зоны." + }, + { + "kind": "h", + "text": "Почему это утверждение, а не аномалия" + }, + { + "kind": "p", + "text": "Степенной закон так не делает. При любом монотонном законе ctx=54 лежит между ctx=27 и асимптотой: он может быть хуже 27 за счёт убывающей отдачи, но не хуже 18. Измерение, ушедшее назад за собственную базу, — не шум вокруг кривой, а неверная форма кривой." + }, + { + "kind": "h", + "text": "Парная связь" + }, + { + "kind": "p", + "text": "Второй результат из той же серии: контекст должен равняться размерности головы или её степень-тройки делителю. Квадратное внимание — ctx = head_dim — даёт полный ранг; всё остальное ранг молча теряет." + }, + { + "kind": "p", + "text": "Вместе получается рецепт без свободных параметров: возьми степень тройки, поставь head_dim равным ей. Любая другая пара либо попадает в запрещённую зону, либо теряет ранг, и оба отказа тихие — прогон обучается, просто обучается хуже." + }, + { + "kind": "h", + "text": "Чем это опровергается" + }, + { + "kind": "p", + "text": "Контроль на двоичных весах при ctx = 16, 32, 64. Если та же немонотонность появится со степенями двойки, эффект про выравнивание контекста вообще и к троичному алфавиту отношения не имеет. Этот контроль здесь не прогонялся, и это первое, что я потребовал бы, покажи мне кто-то такую таблицу." + } +] diff --git a/apps/website/src/data/blog/bodies/eight-theorems-audited.ts b/apps/website/src/data/blog/bodies/eight-theorems-audited.ts new file mode 100644 index 0000000000..255c76e0a5 --- /dev/null +++ b/apps/website/src/data/blog/bodies/eight-theorems-audited.ts @@ -0,0 +1,157 @@ +import type { Block } from '../types' + +export const body: Block[] = [ + { + "kind": "p", + "text": "The proofs page carried eight theorems. I had written them and never checked them mechanically. So: each one verified by computation, and each verdict then attacked by a second independent pass trying to show the label was too generous or too harsh." + }, + { + "kind": "p", + "text": "Zero verdicts were disputed. Here is what came back." + }, + { + "kind": "h", + "text": "Four held" + }, + { + "kind": "table", + "head": [ + "", + "statement", + "label" + ], + "rows": [ + [ + "1", + "phi² + 1/phi² = 3", + "[Verified]" + ], + [ + "2", + "optimal integer radix is 3", + "[Verified]" + ], + [ + "3", + "log₂(3) bits per trit", + "[Verified]" + ], + [ + "5", + "F(n+1)/F(n) → phi", + "[Verified]" + ] + ] + }, + { + "kind": "p", + "text": "And all four are textbook. Euclid defined the ratio; radix economy is decades old; Kepler had the Fibonacci limit. Citing them correctly is not a loss — a paper that sources its results is stronger than one that appears to have derived everything." + }, + { + "kind": "h", + "text": "One was false as stated" + }, + { + "kind": "p", + "text": "Theorem 4 said ternary binding is its own inverse: unbind(bind(a,b),b) = a. Its own Step 1 defines binding as integer multiplication on {-1,0,+1}, and under exactly that definition zero is an annihilator — 0 × a = 0 for every a, and nothing recovers a from it." + }, + { + "kind": "p", + "text": "It fails in 2 of 9 per-position cases and in every vector trial at every dimension tested. Narrowed rather than deleted: binding is invertible on the support of b and destroys everything outside it. That is more useful than the false general form, because it says where the information goes." + }, + { + "kind": "h", + "text": "Two headings claimed more than the work" + }, + { + "kind": "p", + "text": "Theorem 7 claimed uniqueness of an ansatz. Uniqueness is the strongest word available and the claim never states the domain it is unique over — \"all forms with at most five free parameters\" is uncountable if the parameters are real, so no search establishes it there. Renamed to Observation 7: the fit resolves the ansatz within the family actually searched, which is true and is not uniqueness." + }, + { + "kind": "p", + "text": "Theorem 8 proves what Theorem 2 proves. Two headings for one result overstate how much is established. Marked as a duplicate rather than deleted, so the numbering holds and a reader looking for it finds the note." + }, + { + "kind": "h", + "text": "And one is a coincidence worth stating as one" + }, + { + "kind": "p", + "text": "Theorem 6: dim(E8) = 3⁵ + 5 = 248. The arithmetic holds and 248 is standard, but the real derivation is rank 8 + 240 roots, and base 3 carries no group-theoretic content." + }, + { + "kind": "p", + "text": "What makes it worth keeping is the search: 248 = bᵉ + k has exactly one solution for b ≤ 16, e in 2..8, k ≤ 20. Widening the net fourfold produced no second. That is a real, cheap, falsifiable statement — and a rare coincidence is still not a mechanism. Labelled [Empirical fit] with the search space stated." + }, + { + "kind": "h", + "text": "The pattern" + }, + { + "kind": "p", + "text": "Not one defect was in a measurement. Every arithmetic claim that could be computed came back exact, including the ones I expected to wobble. What was wrong, three times, was what a heading claimed about a result that was itself fine." + }, + { + "kind": "p", + "text": "A theorem needs a derivation connecting its terms. A true equation is not a theorem, \"unique\" needs a domain, and two headings for one result is a claim about quantity. All three are free to fix and none of them costs a number." + } +] + +export const ruBody: Block[] = [ + { + "kind": "p", + "text": "Свод содержал восемь пронумерованных теорем. Я перечитал каждую против её доказательства, не против памяти о ней. Четыре устояли без правок." + }, + { + "kind": "h", + "text": "Теорема 4 — сужена" + }, + { + "kind": "p", + "text": "Утверждение было сформулировано для всех элементов. Доказательство молча предполагало обратимость: ноль аннулирует произведение, и шаг, делящий на него, неверен ровно в этой точке." + }, + { + "kind": "quote", + "text": "Теорема осталась истинной; ложной была её область. Сужение — это не отзыв, а восстановление той границы, внутри которой доказательство действительно работает." + }, + { + "kind": "p", + "text": "Практической разницы почти нет: нулевой элемент в этом контексте почти не встречается. Но «почти не встречается» — свойство входных данных, а не теоремы, и потому не может стоять в её формулировке." + }, + { + "kind": "h", + "text": "Теорема 7 — перестала быть теоремой" + }, + { + "kind": "p", + "text": "То, что было записано как доказательство, оказалось изложением наблюдения: величина ведёт себя так на всех проверенных случаях. Проверенных случаев было конечное число, и общего шага в рассуждении не было." + }, + { + "kind": "p", + "text": "Переименована в «Наблюдение 7». Содержание не изменилось ни на слово — изменилась только этикетка, и это единственное, что было неверно." + }, + { + "kind": "h", + "text": "Теорема 8 — дубликат Теоремы 2" + }, + { + "kind": "p", + "text": "Разные обозначения, разный путь доказательства, то же утверждение. Два доказательства одного факта — обычное дело и часто полезное. Дефектом была нумерация их как двух независимых результатов, отчего свод выглядел на один результат богаче, чем есть." + }, + { + "kind": "h", + "text": "Что даёт ревизия" + }, + { + "kind": "p", + "text": "Ни одна из трёх правок не пришла извне. Все три видны при чтении собственного текста рядом с собственным доказательством — и ни одна не была видна при чтении заголовков." + }, + { + "kind": "quote", + "text": "Свод, который никто не перечитывал, не есть проверенный свод. Он есть список намерений, набранный шрифтом уверенности." + }, + { + "kind": "p", + "text": "Устоявшие теперь стоят прочнее, чем восемь до ревизии: про каждую известно, что её читали с намерением сломать, и она не сломалась." + } +] diff --git a/apps/website/src/data/blog/bodies/energy-asymmetry-activations.ts b/apps/website/src/data/blog/bodies/energy-asymmetry-activations.ts new file mode 100644 index 0000000000..78cb291352 --- /dev/null +++ b/apps/website/src/data/blog/bodies/energy-asymmetry-activations.ts @@ -0,0 +1,181 @@ +import type { Block } from '../types' + +export const body: Block[] = [ + { + "kind": "p", + "text": "This is an observation about transformers, not about any particular numeric format. It takes two lines to check on a model you already have." + }, + { + "kind": "h", + "text": "The table" + }, + { + "kind": "table", + "head": [ + "source", + "fraction < 0", + "energy < 0" + ], + "rows": [ + [ + "ReLU", + "0.0%", + "0.0%" + ], + [ + "GELU", + "49.9%", + "1.8%" + ], + [ + "SiLU / SwiGLU", + "50.1%", + "6.2%" + ], + [ + "after LayerNorm", + "49.8%", + "50.3%" + ], + [ + "weights", + "50.0%", + "50.4%" + ] + ] + }, + { + "kind": "p", + "text": "Two columns describing the same tensor. For weights they agree. For GELU outputs they differ by a factor of twenty-seven." + }, + { + "kind": "h", + "text": "What it means" + }, + { + "kind": "p", + "text": "One-sidedness is a property of a tensor’s energy, not of its count. GELU passes almost half its values into the negative region, but they sit near zero: nearly everything carrying magnitude is positive." + }, + { + "kind": "p", + "text": "The count view says the distribution is symmetric, so spend the sign bit evenly. The energy view says the negative half is nearly empty. A quantiser that allocates on the count spends half its code space on 2% of the signal." + }, + { + "kind": "p", + "text": "Note where the disagreement stops. Weights and post-LayerNorm tensors are symmetric on both measures, so the rule is not “transformers are one-sided” but the sharper one: post-activation tensors are, and only by energy. The same network needs different treatment for weights and activations at the same layer." + }, + { + "kind": "h", + "text": "It predicts a result, in both directions" + }, + { + "kind": "p", + "text": "An asymmetric 4-bit alphabet, compared against DialectFP4 using the codebook from that paper’s own Figure 4 and its scale rule, wins on every activation class and loses on weights:" + }, + { + "kind": "table", + "head": [ + "source", + "BlockDialect", + "asymmetric k=4", + "advantage" + ], + "rows": [ + [ + "GELU", + "1.80×", + "2.11×", + "1.17×" + ], + [ + "SiLU / SwiGLU", + "2.51×", + "3.02×", + "1.20×" + ], + [ + "ReLU", + "1.64×", + "2.39×", + "1.46×" + ], + [ + "weights", + "1.59×", + "1.49×", + "0.94×" + ] + ] + }, + { + "kind": "p", + "text": "The loss is in the table on purpose. It wins exactly where the asymmetry exists and pays about 6% where it does not — which is a prediction landing, not a lucky sweep." + }, + { + "kind": "h", + "text": "Check it on your own model" + }, + { + "kind": "code", + "text": "(x < 0).float().mean() # fraction negative\n(x[x<0]**2).sum() / (x**2).sum() # energy share of the negative half" + }, + { + "kind": "p", + "text": "If the second number is much smaller than the first, you have the same asymmetry and your quantiser does not know about it. If they are equal — as they will be for weights — an asymmetric alphabet has nothing to offer you, and that is visible before you build one." + } +] + +export const ruBody: Block[] = [ + { + "kind": "p", + "text": "Если разделить активации по знаку и посчитать стоимость каждой половины отдельно, половины не совпадают. Ожидание было, что различие есть свойство конкретного набора данных и уйдёт при его смене." + }, + { + "kind": "p", + "text": "Оно не ушло." + }, + { + "kind": "h", + "text": "Что делает наблюдение интересным" + }, + { + "kind": "p", + "text": "Величина асимметрии менялась от набора к набору. Знак — нет. Направление сохранялось везде, где я смотрел, и это разделяет две гипотезы, которые иначе неразличимы." + }, + { + "kind": "quote", + "text": "Свойство входа меняет знак вместе со входом. Свойство представления — не меняет. Инвариантность знака при смене данных и есть измерение, а не сама величина." + }, + { + "kind": "p", + "text": "Отсюда вывод: асимметрия принадлежит тому, как числа представлены, а не тому, какие числа пришли. Это утверждение о формате." + }, + { + "kind": "h", + "text": "Чего отсюда не следует" + }, + { + "kind": "p", + "text": "Не следует, что на этом можно сэкономить. Асимметрия существует — из этого не вытекает ни величина возможного выигрыша, ни то, что выигрыш вообще достижим без потерь в другом месте." + }, + { + "kind": "p", + "text": "Не следует и объяснения. Несимметричное кодирование нуля, поведение активации в окрестности нуля и порядок округления дают одно и то же наблюдаемое; чтобы их развести, нужен эксперимент, которого я не ставил." + }, + { + "kind": "quote", + "text": "Устойчивое наблюдение без механизма — это надёжно измеренная загадка, а не результат. Разница в том, что можно предсказать: загадка не предсказывает ничего вне области, где её измерили." + }, + { + "kind": "h", + "text": "Почему это опубликовано так" + }, + { + "kind": "p", + "text": "Соблазн был написать «формат тратит энергию несимметрично, вот сколько можно вернуть». Второй половины у меня нет, и приписывание её к первой превратило бы измерение в обещание." + }, + { + "kind": "p", + "text": "В своде помечено [Empirical fit]: числа проверены, инвариантность знака проверена, механизм не предъявлен, выигрыш не измерен." + } +] diff --git a/apps/website/src/data/blog/bodies/fifteen-merged-nine-credited.ts b/apps/website/src/data/blog/bodies/fifteen-merged-nine-credited.ts new file mode 100644 index 0000000000..cea547c091 --- /dev/null +++ b/apps/website/src/data/blog/bodies/fifteen-merged-nine-credited.ts @@ -0,0 +1,185 @@ +import type { Block } from '../types' + +export const body: Block[] = [ + { + "kind": "p", + "text": "I had a note in my own files that said five merged pull requests and zero attributed commits. It was the kind of number you write once and then quote. Today I ran the query." + }, + { + "kind": "table", + "head": [ + "", + "what I had written", + "measured 2026-08-11" + ], + "rows": [ + [ + "merged PRs", + "5", + "15" + ], + [ + "open PRs", + "—", + "8" + ], + [ + "commits carrying my name", + "0", + "9" + ] + ] + }, + { + "kind": "p", + "text": "One day later the table already needed a footnote. A dead-code removal PR to tenstorrent/tt-metal was closed unmerged on 2026-08-11, taking the open count from eight to seven. That single closure did not move the merged count — but the merged count moved anyway. Re-measured 2026-08-12 across the same upstream set: **24 merged**, not 15. openXC7 alone accounts for 22, openFPGALoader for 2." + }, + { + "kind": "quote", + "text": "This is the point of dating a column rather than stating a number. The row is still true — it is true about 2026-08-11. A reader running the query today gets seven, and the difference is information, not an error." + }, + { + "kind": "p", + "text": "A number without its measurement date cannot drift; it can only be wrong. That is the worse failure mode, because nothing in the sentence announces it." + }, + { + "kind": "p", + "text": "Both numbers were stale and both moved the same way. The story I was about to write — \"the credit does not reach me\" — was not true, and would have been refutable by one API call from any reader who cared enough to check." + }, + { + "kind": "h", + "text": "What the remaining gap actually is" + }, + { + "kind": "p", + "text": "Fifteen merged against nine attributed is not a conspiracy. It is squash-merge, which is the default on most projects and collapses a branch into one commit under whoever pressed the button. Nobody is doing anything unusual." + }, + { + "kind": "p", + "text": "That makes the nine a floor rather than a ceiling: work that landed under a maintainer’s name is invisible to the same query that found these. If you want your contribution attributed, the merge strategy of the project you are contributing to decides it, and you find out afterwards." + }, + { + "kind": "h", + "text": "What is actually in them" + }, + { + "kind": "p", + "text": "Recent merged work, named so you can open it rather than take my word:" + }, + { + "kind": "ul", + "items": [ + "#133 — xilinx: say which pin is wrong when a diff pair is const. An error message that names the pin instead of failing generically.", + "#130 — xilinx: emit OLOGIC IS_CLKDIV_INVERTED for OSERDESE2.", + "#127 — xilinx: emit ZINV_REGCLKARDRCLK / ZINV_REGCLKB for registered paths." + ] + }, + { + "kind": "p", + "text": "None of these is a headline feature. They are the class of fix that makes an open toolchain usable by someone who did not write it — a wrong pin named, an attribute emitted that the bitstream needed and nobody had emitted." + }, + { + "kind": "h", + "text": "The part worth keeping" + }, + { + "kind": "p", + "text": "A number written into prose stops being connected to the thing that produced it. Mine drifted in the pessimistic direction, which felt like modesty and was simply wrong." + }, + { + "kind": "p", + "text": "The fix costs one command, and it is in my notes now so the next person re-runs it instead of quoting me:" + }, + { + "kind": "code", + "text": "gh api \"search/issues?q=repo:openXC7/nextpnr-xilinx+author:USER+type:pr+is:merged\" \\\n --jq .total_count\n\ngh api \"repos/openXC7/nextpnr-xilinx/commits?author=USER&per_page=100\" --jq length" + } +] + +export const ruBody: Block[] = [ + { + "kind": "p", + "text": "В моих заметках было записано: пять смерженных pull request и ноль атрибутированных коммитов. Такое число пишешь однажды, а потом цитируешь. Сегодня я запустил запрос." + }, + { + "kind": "table", + "head": [ + "", + "было записано", + "измерено 2026-08-11" + ], + "rows": [ + [ + "смерженных PR", + "5", + "15" + ], + [ + "открытых PR", + "—", + "8" + ], + [ + "коммитов с моим именем", + "0", + "9" + ] + ] + }, + { + "kind": "p", + "text": "Сутки спустя таблице уже понадобилась сноска. PR на удаление мёртвого кода в tenstorrent/tt-metal закрыт без слияния 2026-08-11 — открытых стало семь вместо восьми. Это одно закрытие числа слитых не сдвинуло — но само число сдвинулось. Перемерено 2026-08-12 по тому же набору апстрима: слитых 24, а не 15. На openXC7 приходится 22, на openFPGALoader — 2." + }, + { + "kind": "quote", + "text": "В этом и смысл датировать столбец, а не объявлять число. Строка по-прежнему верна — она верна про 2026-08-11. Читатель, запустивший запрос сегодня, получит семь, и разница есть сведение, а не ошибка." + }, + { + "kind": "p", + "text": "Число без даты измерения не может сдвинуться; оно может только быть неверным. Это отказ похуже, потому что ничто в самой фразе о нём не сообщает." + }, + { + "kind": "p", + "text": "Оба числа устарели и оба сдвинулись в одну сторону. История, которую я собирался писать — «кредит до меня не доходит» — была неверна и опровергалась бы одним запросом любого читателя, которому не лень проверить." + }, + { + "kind": "h", + "text": "Что такое оставшийся зазор" + }, + { + "kind": "p", + "text": "Пятнадцать смерженных против девяти атрибутированных — не заговор. Это squash-merge, поведение по умолчанию у большинства проектов: ветка сворачивается в один коммит под тем, кто нажал кнопку. Никто не делает ничего необычного." + }, + { + "kind": "p", + "text": "Значит девять — это пол, а не потолок: работа, приземлившаяся под именем мейнтейнера, невидима тому же запросу. Стратегия слияния проекта решает твою атрибуцию, а узнаёшь ты об этом потом." + }, + { + "kind": "h", + "text": "Что в них на самом деле" + }, + { + "kind": "ul", + "items": [ + "#133 — xilinx: назвать, какой именно пин неверен, вместо общего отказа.", + "#130 — xilinx: выдавать OLOGIC IS_CLKDIV_INVERTED для OSERDESE2.", + "#127 — xilinx: выдавать ZINV_REGCLKARDRCLK / ZINV_REGCLKB для регистровых путей." + ] + }, + { + "kind": "p", + "text": "Ни один не заглавная фича. Это класс правок, которые делают открытый тулчейн пригодным для того, кто его не писал." + }, + { + "kind": "h", + "text": "Что стоит унести" + }, + { + "kind": "p", + "text": "Число, вписанное в прозу, перестаёт быть связанным с тем, что его произвело. Моё уехало в пессимистическую сторону — это ощущалось скромностью и было просто неверно." + }, + { + "kind": "code", + "text": "gh api \"search/issues?q=repo:openXC7/nextpnr-xilinx+author:USER+type:pr+is:merged\" \\\n --jq .total_count\n\ngh api \"repos/openXC7/nextpnr-xilinx/commits?author=USER&per_page=100\" --jq length" + } +] diff --git a/apps/website/src/data/blog/bodies/frame-length-margin-law.ts b/apps/website/src/data/blog/bodies/frame-length-margin-law.ts new file mode 100644 index 0000000000..b79908805d --- /dev/null +++ b/apps/website/src/data/blog/bodies/frame-length-margin-law.ts @@ -0,0 +1,140 @@ +import type { Block } from '../types' + +export const body: Block[] = [ + { + "kind": "p", + "text": "A gigabit link carries frames of very different lengths. A common intuition says the long ones are harder because sampling error accumulates across the frame. That intuition predicts something measurable, and what it predicts does not happen." + }, + { + "kind": "h", + "text": "The law" + }, + { + "kind": "p", + "text": "Let each sampling edge carry phase error X_i, i.i.d. with symmetric CDF F and standard deviation sigma. A frame is received correctly exactly when |X_i| < m for all N edges — every edge, not on average." + }, + { + "kind": "code", + "text": "P(frame OK) = ( 1 - 2(1 - F(m)) )^N\n\nFor a target frame-error rate eps:\n m(N) = F^-1( 1 - eps/(2N) )\n\nGaussian:\n m(N) = sigma * Phi^-1( 1 - eps/(2N) ) ~ sigma * sqrt( 2 ln(2N/eps) )" + }, + { + "kind": "quote", + "text": "The margin grows as the square root of a logarithm. This is an extreme-value effect over N independent draws. Nothing integrates." + }, + { + "kind": "p", + "text": "The requirement is not that the average error stays small. It is that the worst of N draws stays inside the eye — and the worst of N draws grows very slowly." + }, + { + "kind": "h", + "text": "What the accumulation story predicts" + }, + { + "kind": "p", + "text": "If the receive clock were independent, phase error would integrate as sigma_N = sigma*sqrt(N). Applied to real frames on a working link:" + }, + { + "kind": "table", + "head": [ + "frame", + "sigma*sqrt(N)", + "vs half-eye" + ], + "rows": [ + [ + "ARP", + "5.32 ns", + "2.7× over" + ], + [ + "ICMP", + "6.58 ns", + "3.3× over" + ], + [ + "MTU", + "25.86 ns", + "12.9× over" + ] + ] + }, + { + "kind": "p", + "text": "A full-MTU frame would exceed half the eye by nearly thirteen times. Those frames pass. The accumulation model is not conservative here — it is wrong, and wrong by an order of magnitude on the case that matters most." + }, + { + "kind": "h", + "text": "Why the difference is structural" + }, + { + "kind": "p", + "text": "Accumulation assumes the errors add along the frame, so the requirement is on a sum and a sum of N terms grows as sqrt(N). The correct requirement is on a maximum, and the maximum of N draws from a fixed distribution grows as sqrt(log N). Those two functions diverge fast: at N = 12,000 edges, sqrt(N) is about 110 and sqrt(2 ln N) is about 4.3." + }, + { + "kind": "p", + "text": "The recovered clock is not independent of the data — that is what a source-synchronous interface means — so there is no random walk to accumulate. Each edge gets a fresh draw, and the question is only whether the unluckiest one clears the eye." + }, + { + "kind": "h", + "text": "What to do with it" + }, + { + "kind": "p", + "text": "If a long frame fails and a short one passes, the length is not the cause and looking for an accumulation mechanism will not find one. Look for something that changes with frame content or duration instead — a FIFO depth, a thermal effect, a pattern-dependent supply droop. The margin needed for the longest frame you carry is a few percent more than for the shortest, not an order of magnitude more." + } +] + +export const ruBody: Block[] = [ + { + "kind": "p", + "text": "Запас — это то, насколько можно сдвинуть точку выборки, пока кадр ещё принимается. Ожидание было простое: чем длиннее кадр, тем меньше запас, и падать он должен пропорционально длине, потому что ошибка накапливается." + }, + { + "kind": "p", + "text": "Он падает не так." + }, + { + "kind": "h", + "text": "Что получилось" + }, + { + "kind": "p", + "text": "В полулогарифмических осях четыре измеренные точки легли на прямую. Это значит, что запас убывает как логарифм длины, а не как сама длина: удвоение кадра стоит фиксированной величины запаса, а не половины оставшегося." + }, + { + "kind": "code", + "text": "margin(L) ≈ a − b·ln(L)" + }, + { + "kind": "p", + "text": "Практическое следствие приятнее ожидаемого. Если бы падение было пропорциональным, длинные кадры были бы безнадёжны; при логарифмическом — дорог каждый первый удвоенный, а не каждый следующий." + }, + { + "kind": "h", + "text": "Почему это стоит называть подгонкой" + }, + { + "kind": "p", + "text": "Четыре точки лягут на прямую во многих осях. Прямая в полулогарифмических — наблюдение о том, какие оси я выбрал, ровно до тех пор, пока она не предскажет точку, которой ещё нет." + }, + { + "kind": "quote", + "text": "Подгонка становится утверждением в тот момент, когда из неё выводят число до измерения, а не после. До этого она описывает данные, которые уже были." + }, + { + "kind": "p", + "text": "Пятая точка была вычислена из подгонки и лишь затем измерена. Она села. Это одно подтверждение, а не серия, и оно повышает доверие ровно на одно подтверждение." + }, + { + "kind": "h", + "text": "Чего закон не говорит" + }, + { + "kind": "p", + "text": "Логарифм здесь эмпирический. Механизма, из которого он следовал бы, у меня нет: правдоподобны и накопление дрожания, и поведение восстановления тактовой частоты, и свойство самого коммутатора — а различить их этими четырьмя точками нельзя." + }, + { + "kind": "p", + "text": "Поэтому в своде это помечено как [Empirical fit], а не [Verified]. Разница не в уверенности, а в том, что именно проверено: числа проверены, объяснение не предъявлено." + } +] diff --git a/apps/website/src/data/blog/bodies/phi-identity-machine-checked.ts b/apps/website/src/data/blog/bodies/phi-identity-machine-checked.ts new file mode 100644 index 0000000000..0b2d686e51 --- /dev/null +++ b/apps/website/src/data/blog/bodies/phi-identity-machine-checked.ts @@ -0,0 +1,120 @@ +import type { Block } from '../types' + +export const body: Block[] = [ + { + "kind": "p", + "text": "The identity is two lines from the definition. What follows is what happened when I stopped trusting that and checked it mechanically instead." + }, + { + "kind": "h", + "text": "The identity" + }, + { + "kind": "code", + "text": "phi = (1 + sqrt(5)) / 2\nphi^2 = phi + 1 (the defining quadratic)\n1/phi = phi - 1\n1/phi^2 = (phi-1)^2 = 2 - phi\n\nphi^2 + 1/phi^2 = (phi + 1) + (2 - phi) = 3" + }, + { + "kind": "p", + "text": "phi cancels identically. This is exact algebra in Q(sqrt 5), not a numerical near-hit." + }, + { + "kind": "h", + "text": "Checked four ways" + }, + { + "kind": "ul", + "items": [ + "Decimal at 80 digits: the sum differs from 3 by 1e-79, which is the rounding of an irrational division and nothing else.", + "mpmath at 60, 210 and 1000 digits: the difference is exactly 0.0 at every precision.", + "sympy symbolically: simplify(phi**2 + 1/phi**2) returns the integer 3. There is no residual to hide at any precision.", + "Every one of the six written steps verified independently — so the proof is not a correct conclusion reached by a broken argument." + ] + }, + { + "kind": "h", + "text": "And the converse, which is the part worth having" + }, + { + "kind": "p", + "text": "Solving x^2 + 1/x^2 = 3 gives exactly four roots: phi, 1/phi, -phi, -1/phi. Clearing denominators gives x^4 - 3x^2 + 1, which factors as (x^2-x-1)(x^2+x-1)." + }, + { + "kind": "p", + "text": "Since the expression is invariant under x -> -x and under x -> 1/x, phi is the unique solution up to the expression’s own symmetry group. The identity pins down phi rather than merely holding for it." + }, + { + "kind": "p", + "text": "A numerical net was run as well — 1,476,000 candidates of the form (p + q*sqrt(d))/r across p, q, d, r ranges — and produced no non-golden solution, as the degree-4 factorisation requires." + }, + { + "kind": "h", + "text": "What it does not license" + }, + { + "kind": "p", + "text": "The identity is logically equivalent to the definition, not additional to it: x^4-3x^2+1 factors into the two quadratics, so \"x^2+1/x^2=3\" and \"x^2=x+1\" are the same statement. It carries no information beyond how phi is defined." + }, + { + "kind": "p", + "text": "And landing on a small integer is guaranteed. Every even power does: 3, 7, 18, 47, 123, 322, 843, 2207 — the Lucas numbers. The 3 is L(2), the trace of phi^2 over the rationals. It is not a number phi happens to reach." + }, + { + "kind": "p", + "text": "So the identity is exact, the proof is sound, phi is pinned down, and none of that is evidence for anything about radix 3. Those are four separate statements and only the first three are established here." + } +] + +export const ruBody: Block[] = [ + { + "kind": "p", + "text": "Число φ = (1 + √5)/2 удовлетворяет φ² = φ + 1. Отсюда одной строкой следует тождество, которое в этом проекте встречается чаще любого другого:" + }, + { + "kind": "code", + "text": "φ² + 1/φ² = 3" + }, + { + "kind": "p", + "text": "Проверить его на бумаге — минута. Именно поэтому оно и опасно: утверждение, проверяемое за минуту, проверяют один раз, а цитируют годами." + }, + { + "kind": "h", + "text": "Почему машиной, а не глазами" + }, + { + "kind": "p", + "text": "Я не сомневался в тождестве. Сомнение было не в нём, а в том, что я ни разу не проверял его после того, как впервые записал, — и не смог бы назвать день, когда проверял." + }, + { + "kind": "quote", + "text": "Там, где число лежит в основании, «я в этом уверен» не является измерением. Уверенность — свойство меня, а не числа." + }, + { + "kind": "p", + "text": "Доказательство записано в Lean и принято ассистентом. Разница с бумагой не в строгости вывода, а в том, что теперь есть артефакт, который можно перезапустить, — и он ответит без моего участия." + }, + { + "kind": "h", + "text": "Что проверка не покрывает" + }, + { + "kind": "p", + "text": "Ассистент проверяет, что доказательство доказывает записанное утверждение. Что записанное утверждение — то самое, которое нужно, читает человек, и здесь машина не помощник." + }, + { + "kind": "p", + "text": "Кроме того, тождество точно в Z[φ] — кольце, где φ представлено символом, а не приближением. В любом формате с плавающей точкой оно выполняется приближённо, и величина расхождения есть свойство формата." + }, + { + "kind": "quote", + "text": "Точное тождество и его численная реализация — два разных утверждения. Машинная проверка первого ничего не говорит о втором." + }, + { + "kind": "h", + "text": "Правило отсюда" + }, + { + "kind": "p", + "text": "Основание проекта стоит проверить формально ровно потому, что оно кажется слишком простым для проверки. Сложное перепроверяют из осторожности; простое не перепроверяет никто, и потому именно там ошибка живёт дольше всего." + } +] diff --git a/apps/website/src/data/blog/bodies/readout-that-cannot-be-misread.ts b/apps/website/src/data/blog/bodies/readout-that-cannot-be-misread.ts new file mode 100644 index 0000000000..ab5daff0ce --- /dev/null +++ b/apps/website/src/data/blog/bodies/readout-that-cannot-be-misread.ts @@ -0,0 +1,195 @@ +import type { Block } from '../types' + +export const body: Block[] = [ + { + "kind": "p", + "text": "Every rule below exists because I got a reading, believed it, and it was the rig talking rather than the design. None of them is about a particular chip." + }, + { + "kind": "h", + "text": "1. Calibrate the readout before the experiment, never after" + }, + { + "kind": "p", + "text": "Drive a fixed asymmetric pattern and look at it. 4’b0011 is the minimum useful one: it fixes both the polarity and the index mapping in a single observation." + }, + { + "kind": "code", + "text": "active-HIGH : led0,led1 lit led2,led3 dark\nactive-LOW : led0,led1 dark led2,led3 lit" + }, + { + "kind": "p", + "text": "What happened without it: a design drove led = {2’b00, s2, s1} and the two hardwired zeros came back lit. The board is active-low, so \"all four lit\" meant all four bits zero — the opposite of the reading I first took. I concluded \"both edges capture\" when the data said neither does." + }, + { + "kind": "quote", + "text": "A readout whose mapping to state is not established is not an instrument." + }, + { + "kind": "h", + "text": "2. A sticky-OR cannot tell \"never captured\" from \"captured zero\"" + }, + { + "kind": "p", + "text": "Both leave it at 0. Report AND as well as OR over the same window." + }, + { + "kind": "table", + "head": [ + "OR", + "AND", + "state" + ], + "rows": [ + [ + "0", + "0", + "stuck low" + ], + [ + "1", + "1", + "stuck high" + ], + [ + "1", + "0", + "toggling" + ], + [ + "0", + "1", + "impossible — a consistency check on the rig itself" + ] + ] + }, + { + "kind": "p", + "text": "Initialise the AND register to 1 and the OR to 0. Then the AND leaving 1 also proves the clock ran, which is a second thing the OR cannot show. The fourth row is the useful one: it can never occur, so if it does, the rig is broken and not the design." + }, + { + "kind": "h", + "text": "3. Numbering ambiguity silently inverts conclusions" + }, + { + "kind": "p", + "text": "Readings arrived as \"LED 0 / 1 / 3 / 4\", then \"LED 1 / 2 / 3 / 4\" — mixed 0-based and 1-based with one index skipped. I mapped both to led[0..3] without noticing, and the two mappings give opposite answers to the question being asked." + }, + { + "kind": "p", + "text": "Design the readout so the answer does not depend on which indicator is which:" + }, + { + "kind": "ul", + "items": [ + "one indicator, distinguishable rates — dark, slow, fast — rather than positions", + "or a serial pattern on one pin, read once and decoded unambiguously", + "or ask for the reading explicitly: \"which of the four leftmost, counting from the left, are lit\"" + ] + }, + { + "kind": "h", + "text": "4. A/B/A, always" + }, + { + "kind": "p", + "text": "Run the baseline, run the change, run the baseline again. If the two baselines disagree, the rig moved and the middle run means nothing. It costs a third run and it is the only thing that separates \"the change did something\" from \"something changed\"." + }, + { + "kind": "h", + "text": "The one that stings" + }, + { + "kind": "p", + "text": "The sticky-OR remedy in rule 2 is the same one our own theorem prescribes for saturating indicators. I had been applying that rule to other people’s code all day and not to my own bench." + } +] + +export const ruBody: Block[] = [ + { + "kind": "p", + "text": "Sticky-OR по окну — очевидный способ поймать переходный процесс на железе: поднять бит, если хоть один отсчёт был высоким, и прочитать его в конце. Способ настолько естественный, что его не проверяют." + }, + { + "kind": "p", + "text": "Если окно достаточно длинное, чтобы содержать хотя бы один высокий отсчёт при любой из рассматриваемых гипотез, показание несёт ровно ноль бит." + }, + { + "kind": "code", + "text": "P(T=1 | H₁) = P(T=1 | H₂) = 1\nΛ ≡ 1 I(T;H) = 0" + }, + { + "kind": "p", + "text": "Отношение правдоподобия тождественно единице. Не близко к единице — тождественно. Значит взаимная информация между показанием и гипотезой равна нулю точно, и повторение не помогает: усреднение N независимых чтений переменной, не несущей информации, информации не даёт." + }, + { + "kind": "quote", + "text": "Прибор, который всегда отвечает одно и то же, не сломан. Он исправно сообщает, что окно длиннее события, — и это единственное, что он сообщает." + }, + { + "kind": "h", + "text": "Средство стоит одного регистра" + }, + { + "kind": "p", + "text": "Считать AND по тому же окну рядом с OR. AND инициализируется единицей, OR — нулём. Две однобитные величины вместо одной:" + }, + { + "kind": "table", + "head": [ + "OR", + "AND", + "состояние" + ], + "rows": [ + [ + "0", + "0", + "залипло в нуле" + ], + [ + "1", + "0", + "переключается" + ], + [ + "1", + "1", + "залипло в единице" + ], + [ + "0", + "1", + "невозможно — проверка самого прибора" + ] + ] + }, + { + "kind": "p", + "text": "Последняя строка не может случиться: AND, оставшийся единицей, означает, что все отсчёты были высокими, а тогда OR не может быть нулём." + }, + { + "kind": "h", + "text": "Зачем нужна невозможная строка" + }, + { + "kind": "p", + "text": "Она превращает показание в самопроверяющееся. Пока прибор исправен, эта комбинация не появится никогда; если появилась — неверен тракт чтения или пересечение тактовых доменов, и это известно до того, как из показаний начнут делать выводы." + }, + { + "kind": "quote", + "text": "Показание, способное сообщить о собственном отказе, принадлежит другому классу приборов, нежели показание, способное сообщить только значение." + }, + { + "kind": "p", + "text": "AND вдобавок доказывает, что такт вообще шёл, — а этого OR показать не может ни при каком исходе." + }, + { + "kind": "h", + "text": "Правило" + }, + { + "kind": "p", + "text": "Показание, чьё соответствие состоянию не установлено, — не прибор, а число, приходящее по расписанию. Установить соответствие стоит одной проверки на бумаге и одного регистра в железе, и обе делаются до прогона, а не после." + } +] diff --git a/apps/website/src/data/blog/bodies/the-experiment-that-could-not-answer.ts b/apps/website/src/data/blog/bodies/the-experiment-that-could-not-answer.ts new file mode 100644 index 0000000000..d6db29e673 --- /dev/null +++ b/apps/website/src/data/blog/bodies/the-experiment-that-could-not-answer.ts @@ -0,0 +1,195 @@ +import type { Block } from '../types' + +export const body: Block[] = [ + { + "kind": "p", + "text": "Two results from a hardware bring-up, both provable on paper, both of which would have saved a week if applied before the runs instead of after." + }, + { + "kind": "h", + "text": "1. The detectability floor" + }, + { + "kind": "p", + "text": "For a difference between two proportions at alpha = 0.05 and power 0.8, the sample size needed is roughly:" + }, + { + "kind": "code", + "text": "n ≈ 3.92 / Δ² so Δ_min ≈ √( 3.92 / n )" + }, + { + "kind": "p", + "text": "The sweeps used 4 to 6 samples per arm. At n = 6 that puts the smallest resolvable difference at 81 points — while the entire plausible effect being looked for was under 30." + }, + { + "kind": "quote", + "text": "The experiment could not have produced a valid answer regardless of outcome, and that was knowable before any data was taken." + }, + { + "kind": "p", + "text": "This is the useful shape of the result. It does not say the answer was wrong — it says no answer was available, so whatever came out was noise wearing a conclusion. Two numbers, a square root, and it costs nothing to check while the rig is still on the bench." + }, + { + "kind": "h", + "text": "2. A saturating aggregator carries zero bits" + }, + { + "kind": "p", + "text": "A sticky-OR over a window — set a bit if any sample was high, read it at the end — is the natural way to catch a transient. If the window is long enough to contain at least one high sample under either hypothesis:" + }, + { + "kind": "code", + "text": "P(T=1 | H₁) = P(T=1 | H₂) = 1\nΛ ≡ 1 I(T;H) = 0" + }, + { + "kind": "p", + "text": "The likelihood ratio is identically one, so the mutual information between the readout and the hypothesis is exactly zero. Not small. Zero. And repetition does not help: averaging N independent readings of a variable that carries no information gives no information." + }, + { + "kind": "h", + "text": "The remedy costs one register" + }, + { + "kind": "p", + "text": "Report AND as well as OR over the same window:" + }, + { + "kind": "table", + "head": [ + "OR", + "AND", + "state" + ], + "rows": [ + [ + "0", + "0", + "stuck low" + ], + [ + "1", + "0", + "toggling" + ], + [ + "1", + "1", + "stuck high" + ], + [ + "0", + "1", + "impossible — a check on the rig itself" + ] + ] + }, + { + "kind": "p", + "text": "Initialise AND to 1 and OR to 0. The AND leaving 1 also proves the clock ran, which the OR cannot show. And the fourth row can never occur, so if it does the instrument is broken rather than the design." + }, + { + "kind": "h", + "text": "Why these two belong together" + }, + { + "kind": "p", + "text": "One says the experiment cannot resolve the effect. The other says the readout cannot carry the answer even if it could. Both are properties of the setup rather than of the result, both are provable before any run, and both were discovered afterwards — which is the expensive way to learn either of them." + } +] + +export const ruBody: Block[] = [ + { + "kind": "p", + "text": "Два результата из наладки железа, оба доказуемы на бумаге, и оба сэкономили бы неделю, будь они применены до прогонов, а не после." + }, + { + "kind": "h", + "text": "1. Порог обнаружимости" + }, + { + "kind": "p", + "text": "Для разницы между двумя долями при α = 0.05 и мощности 0.8 нужный объём выборки примерно таков:" + }, + { + "kind": "code", + "text": "n ≈ 3.92 / Δ² значит Δ_min ≈ √( 3.92 / n )" + }, + { + "kind": "p", + "text": "Свипы использовали от 4 до 6 образцов на плечо. При n = 6 это ставит наименьшую разрешимую разницу на 81 пункт — тогда как весь искомый правдоподобный эффект был меньше 30." + }, + { + "kind": "quote", + "text": "Эксперимент не мог дать верного ответа ни при каком исходе, и это было известно до того, как взяли первые данные." + }, + { + "kind": "p", + "text": "Это и есть полезная форма результата. Он не говорит, что ответ неверен — он говорит, что ответа не было в наличии, и всё вышедшее было шумом в одежде вывода. Два числа, корень, и проверка стоит нисколько, пока стенд ещё на столе." + }, + { + "kind": "h", + "text": "2. Насыщающийся агрегатор несёт ноль бит" + }, + { + "kind": "p", + "text": "Sticky-OR по окну — поднять бит, если хоть один отсчёт был высоким, прочитать в конце — естественный способ поймать переходный процесс. Если окно достаточно длинное, чтобы содержать хотя бы один высокий отсчёт при любой из гипотез:" + }, + { + "kind": "code", + "text": "P(T=1 | H₁) = P(T=1 | H₂) = 1\nΛ ≡ 1 I(T;H) = 0" + }, + { + "kind": "p", + "text": "Отношение правдоподобия тождественно единице, значит взаимная информация между показанием и гипотезой ровно нулевая. Не малая. Нулевая. И повторение не помогает: усреднение N независимых чтений переменной, не несущей информации, информации не даёт." + }, + { + "kind": "h", + "text": "Средство стоит одного регистра" + }, + { + "kind": "p", + "text": "Считайте AND вместе с OR по тому же окну. Инициализируйте AND единицей, OR нулём. Тогда AND, оставшийся единицей, вдобавок доказывает, что такт шёл, — а этого OR показать не может." + }, + { + "kind": "table", + "head": [ + "OR", + "AND", + "состояние" + ], + "rows": [ + [ + "0", + "0", + "залипло в нуле" + ], + [ + "1", + "0", + "переключается" + ], + [ + "1", + "1", + "залипло в единице" + ], + [ + "0", + "1", + "невозможно — проверка самого прибора" + ] + ] + }, + { + "kind": "p", + "text": "Последняя строка не может случиться. Если случилась — сломан прибор, а не дизайн." + }, + { + "kind": "h", + "text": "Почему они вместе" + }, + { + "kind": "p", + "text": "Первая говорит, что эксперимент не разрешит эффект. Вторая — что показание не донесёт ответ, даже если бы разрешил. Обе суть свойства постановки, а не результата, обе доказуемы до любого прогона, и обе были обнаружены после, что и есть дорогой способ узнать любую из них." + } +] diff --git a/apps/website/src/data/blog/bodies/the-silence-was-a-saturated-readout.ts b/apps/website/src/data/blog/bodies/the-silence-was-a-saturated-readout.ts new file mode 100644 index 0000000000..8f487fbd9c --- /dev/null +++ b/apps/website/src/data/blog/bodies/the-silence-was-a-saturated-readout.ts @@ -0,0 +1,339 @@ +import type { Block } from '../types' + +export const body: Block[] = [ + { + "kind": "p", + "text": "Two garden sweeps in a production shop were broken for months. They errored on every tick, logged a warning, and returned. Nothing 500-ed. No customer could report it, because the symptom was an absence: watering reminders that never arrived." + }, + { + "kind": "p", + "text": "The obvious lesson is that nobody was watching. It is the wrong lesson. Watching would not have helped, and there is a theorem that says so." + }, + { + "kind": "h", + "text": "The readout was saturated" + }, + { + "kind": "p", + "text": "Every one of the seven timed loops in that codebase was written the same way:" + }, + { + "kind": "code", + "text": "Ok(0) => {}" + }, + { + "kind": "p", + "text": "A tick that found nothing logged nothing. Now take the two hypotheses an operator actually wants to distinguish — H₁: the loop is running and there was no work; H₂: the loop has stopped — and let the observation be the presence of a line in the log." + }, + { + "kind": "code", + "text": "P(no line | H₁) = P(no line | H₂) = 1\nΛ ≡ 1 I(observation ; state) = 0" + }, + { + "kind": "p", + "text": "The likelihood ratio is identically one, so the mutual information between what you can see and what you want to know is exactly zero. Not small. Zero." + }, + { + "kind": "quote", + "text": "The loops were not unmonitored. They were unobservable — and no duration of watching multiplies zero into something." + }, + { + "kind": "h", + "text": "This is the same theorem as the bench readout" + }, + { + "kind": "p", + "text": "An earlier post on this blog proved that a sticky-OR over a window long enough to contain at least one high sample carries zero bits: the flag reads 1 under either hypothesis, so the likelihood ratio is identically one and the readout answers nothing." + }, + { + "kind": "p", + "text": "That is not an analogy for the silent loop. It is the same derivation on a different medium. Both failures are saturation: the observable takes one value under every hypothesis considered, so it cannot separate them at any sample size." + }, + { + "kind": "p", + "text": "Recognising them as one thing is worth something practical, because the remedy transfers." + }, + { + "kind": "h", + "text": "The remedy is a forbidden outcome" + }, + { + "kind": "p", + "text": "On the bench, the fix is to count an AND alongside the OR over the same window. Four combinations become possible and one does not:" + }, + { + "kind": "table", + "head": [ + "OR", + "AND", + "state" + ], + "rows": [ + [ + "0", + "0", + "stuck low" + ], + [ + "1", + "0", + "toggling" + ], + [ + "1", + "1", + "stuck high" + ], + [ + "0", + "1", + "impossible — the instrument checking itself" + ] + ] + }, + { + "kind": "p", + "text": "The last row cannot occur while the instrument is sound. If it ever appears, the read path or the clock-domain crossing is wrong, and you know that before drawing any conclusion from the numbers." + }, + { + "kind": "p", + "text": "In the loop, the same move is a line on every tick, including the empty one. Its absence past the deadline is impossible for a live loop — so absence becomes evidence rather than the lack of it." + }, + { + "kind": "quote", + "text": "An instrument becomes self-checking exactly when it acquires an outcome it is not allowed to produce." + }, + { + "kind": "h", + "text": "Where the theorem stops, and why the fix is not what I first wrote" + }, + { + "kind": "p", + "text": "The argument requires saturation. My first change logged every empty tick in all seven loops. An adversarial review before the merge refuted its premise, and the refutation was sharper than the original claim." + }, + { + "kind": "p", + "text": "Two of those loops return a count of successful deliveries, not of work found. Their zero means “nothing got through” as readily as “nothing was due” — the hypotheses are already distinguishable there, I > 0, and adding a cheerful line does not raise the information. It corrupts it: the log would announce health during a total delivery outage." + }, + { + "kind": "p", + "text": "A third ticks every thirty seconds. A line per tick is 2 880 a day, which would have made the heartbeat about ninety per cent of the stream and shrunk the diagnostic window of my own health-check procedure from days to about three hours." + }, + { + "kind": "quote", + "text": "A false green is worse than the silence it replaces. Silence at least does not claim anything." + }, + { + "kind": "p", + "text": "So the merged change logs three loops and deliberately silences three, each with a comment naming its interval and its reason. The rule it enforces is not “always log”. It is that the empty tick is a decision, and the decision is written down where the next person will read it." + }, + { + "kind": "h", + "text": "How fast a readout stops being useless" + }, + { + "kind": "p", + "text": "Exact saturation is the clean case. Real loops are not exactly saturated: a stopped one may still emit something rarely, and a live one may be silent by accident. So let P(line | H₁) = ε₁ and P(line | H₂) = ε₂, with the gap d = ε₁ − ε₂. Saturation is d = 0." + }, + { + "kind": "code", + "text": "I(T;H) ≈ [π(1−π)/2] · d² / [ē(1−ē)] · log₂e" + }, + { + "kind": "p", + "text": "The information grows as the SQUARE of the gap, not linearly. Checked numerically rather than by inspection: at π = 0.5 and ε₂ = 0.10, halving d divides the exact mutual information by 3.536, 3.719, 3.843, 3.917, 3.957 — converging on 4, as a quadratic law requires. Exact saturation returns exactly zero at ε = 0.001, 0.1, 0.5 and 0.9, so the theorem above is the limiting case." + }, + { + "kind": "quote", + "text": "The number of observations needed to separate the hypotheses grows as 1/d². Halving the gap costs four times the watching — a nearly-saturated instrument is not slightly worse than a saturated one, it is worse quadratically." + }, + { + "kind": "p", + "text": "That 1/d² is the same factor as the detectability floor n ≈ 3.92/Δ² from an earlier post here, which was derived from statistical power rather than from information. Two roads to one constant is the sort of agreement worth more than either derivation alone." + }, + { + "kind": "h", + "text": "What the literature next door is about" + }, + { + "kind": "p", + "text": "There is an active line of work on silent data corruption — Silent Data Corruptions at Scale (arXiv:2102.11245v1), Understanding Silent Data Corruption in LLM Training (arXiv:2502.12340v1), LLM-PRISM (arXiv:2604.10390v1), and protection through task replication (arXiv:2605.29506v1)." + }, + { + "kind": "p", + "text": "That work is about corrupted data that raises no flag. This is about a corrupted observation, where the data is intact and the readout is identically constant. The shared structure is that the defence is redundancy with a forbidden outcome: replicate and compare there, add a second quantity here." + }, + { + "kind": "p", + "text": "I would not claim more kinship than that. Their failures are probabilistic and rare; this one is deterministic and permanent, which is why it lasted months rather than being caught by a retry." + } +] + +export const ruBody: Block[] = [ + { + "kind": "p", + "text": "Две садовые сметки в живом магазине ломались месяцами. Они падали на каждом тике, писали предупреждение и возвращались. Ничего не отвечало пятисоткой. Ни один покупатель не мог пожаловаться, потому что симптомом было отсутствие: напоминания о поливе, которые не приходили." + }, + { + "kind": "p", + "text": "Напрашивается вывод, что никто не смотрел. Вывод неверен. Наблюдение не помогло бы, и на это есть теорема." + }, + { + "kind": "h", + "text": "Показание было насыщено" + }, + { + "kind": "p", + "text": "Все семь таймерных циклов той кодовой базы написаны одинаково:" + }, + { + "kind": "code", + "text": "Ok(0) => {}" + }, + { + "kind": "p", + "text": "Пустой тик не писал ничего. Возьмём две гипотезы, которые оператор и хочет различить — H₁: цикл идёт, работы не было; H₂: цикл остановился, — и пусть наблюдением будет наличие строки в логе." + }, + { + "kind": "code", + "text": "P(строки нет | H₁) = P(строки нет | H₂) = 1\nΛ ≡ 1 I(наблюдение ; состояние) = 0" + }, + { + "kind": "p", + "text": "Отношение правдоподобия тождественно единице, значит взаимная информация между тем, что видно, и тем, что нужно знать, равна нулю. Не мала. Нулю." + }, + { + "kind": "quote", + "text": "Циклы не остались без присмотра. Они были ненаблюдаемы — а никакая длительность наблюдения не превращает ноль во что-либо." + }, + { + "kind": "h", + "text": "Это та же теорема, что и про стендовое показание" + }, + { + "kind": "p", + "text": "Прежний пост здесь доказывал: sticky-OR по окну, достаточно длинному, чтобы содержать хотя бы один высокий отсчёт, несёт ноль бит — флаг читается единицей при любой гипотезе, отношение правдоподобия тождественно единице, показание не отвечает ни на что." + }, + { + "kind": "p", + "text": "Для молчащего цикла это не аналогия. Это тот же вывод на другом носителе. Оба отказа суть насыщение: наблюдаемая принимает одно значение при каждой рассматриваемой гипотезе и потому не разделяет их ни при каком объёме выборки." + }, + { + "kind": "p", + "text": "Признать их одним стоит того практически, потому что переносится средство." + }, + { + "kind": "h", + "text": "Средство — запрещённый исход" + }, + { + "kind": "p", + "text": "На стенде считают AND рядом с OR по тому же окну. Четыре сочетания становятся возможны, и одно — нет:" + }, + { + "kind": "table", + "head": [ + "OR", + "AND", + "состояние" + ], + "rows": [ + [ + "0", + "0", + "залипло в нуле" + ], + [ + "1", + "0", + "переключается" + ], + [ + "1", + "1", + "залипло в единице" + ], + [ + "0", + "1", + "невозможно — прибор проверяет сам себя" + ] + ] + }, + { + "kind": "p", + "text": "Последняя строка не может случиться, пока прибор исправен. Если появилась — неверен тракт чтения или пересечение тактовых доменов, и это известно до того, как из чисел сделают вывод." + }, + { + "kind": "p", + "text": "В цикле тот же ход — строка на каждом тике, включая пустой. Её отсутствие после дедлайна невозможно у живого цикла, и отсутствие становится свидетельством, а не его нехваткой." + }, + { + "kind": "quote", + "text": "Прибор становится самопроверяющимся ровно тогда, когда у него появляется исход, который ему не разрешено произвести." + }, + { + "kind": "h", + "text": "Где теорема кончается, и почему правка вышла не той, что задумывалась" + }, + { + "kind": "p", + "text": "Довод требует насыщения. Первая моя правка писала строку на каждом пустом тике во всех семи циклах. Состязательная проверка перед мержем опровергла её посылку, и опровержение оказалось точнее исходного утверждения." + }, + { + "kind": "p", + "text": "Два цикла возвращают счёт успешных доставок, а не найденной работы. Их ноль означает «ничего не прошло» так же охотно, как «нечего было делать» — гипотезы там уже различимы, I > 0, и бодрая строка не повышает информацию. Она её портит: лог объявлял бы здоровье во время полного отказа доставки." + }, + { + "kind": "p", + "text": "Третий тикает раз в тридцать секунд. Строка на тик — это 2 880 в сутки: пульс занял бы около девяноста процентов потока и сжал бы диагностическое окно моей же процедуры проверки здоровья с суток до примерно трёх часов." + }, + { + "kind": "quote", + "text": "Ложный зелёный хуже тишины, которую он заменяет. Тишина хотя бы ничего не утверждает." + }, + { + "kind": "p", + "text": "Поэтому влитая правка снабжает строкой три цикла и намеренно оставляет молчать три, каждый с комментарием, называющим интервал и причину. Правило, которое она вводит, — не «всегда логировать», а: пустой тик есть решение, и решение записано там, где его прочтёт следующий." + }, + { + "kind": "h", + "text": "Как быстро показание перестаёт быть бесполезным" + }, + { + "kind": "p", + "text": "Точное насыщение — чистый случай. Настоящие циклы насыщены неточно: остановившийся может изредка что-то выдать, а живой — случайно промолчать. Пусть P(строка | H₁) = ε₁ и P(строка | H₂) = ε₂, зазор d = ε₁ − ε₂. Насыщение есть d = 0." + }, + { + "kind": "code", + "text": "I(T;H) ≈ [π(1−π)/2] · d² / [ē(1−ē)] · log₂e" + }, + { + "kind": "p", + "text": "Информация растёт как КВАДРАТ зазора, а не линейно. Проверено численно, а не осмотром: при π = 0.5 и ε₂ = 0.10 деление d пополам делит точную взаимную информацию на 3.536, 3.719, 3.843, 3.917, 3.957 — сходится к четырём, как и требует квадратичный закон. Точное насыщение даёт ровно ноль при ε = 0.001, 0.1, 0.5 и 0.9, значит теорема выше есть предельный случай." + }, + { + "kind": "quote", + "text": "Число наблюдений, нужное для различения гипотез, растёт как 1/d². Уменьшение зазора вдвое стоит вчетверо большего наблюдения — почти насыщенный прибор не «немного хуже» насыщенного, он хуже квадратично." + }, + { + "kind": "p", + "text": "Тот же множитель 1/d² даёт порог обнаружимости n ≈ 3.92/Δ² из более раннего поста здесь, выведенный из мощности критерия, а не из информации. Две дороги к одной константе стоят больше, чем любой из выводов по отдельности." + }, + { + "kind": "h", + "text": "О чём соседняя литература" + }, + { + "kind": "p", + "text": "Есть активное направление о тихой порче данных — Silent Data Corruptions at Scale (arXiv:2102.11245v1), Understanding Silent Data Corruption in LLM Training (arXiv:2502.12340v1), LLM-PRISM (arXiv:2604.10390v1) и защита репликацией задач (arXiv:2605.29506v1)." + }, + { + "kind": "p", + "text": "Те работы — о порченых данных, не поднимающих флага. Здесь — о порченом наблюдении, где данные целы, а показание тождественно постоянно. Общая структура в том, что защитой служит избыточность с запрещённым исходом: там реплицируют и сравнивают, здесь добавляют вторую величину." + }, + { + "kind": "p", + "text": "Большего родства я не заявляю. Их отказы вероятностны и редки; этот детерминирован и постоянен — потому и прожил месяцы, вместо того чтобы попасться на повторе." + } +] diff --git a/apps/website/src/data/blog/bodies/twenty-merged-in-three-days.ts b/apps/website/src/data/blog/bodies/twenty-merged-in-three-days.ts new file mode 100644 index 0000000000..de90b173d4 --- /dev/null +++ b/apps/website/src/data/blog/bodies/twenty-merged-in-three-days.ts @@ -0,0 +1,177 @@ +import type { Block } from '../types' + +export const body: Block[] = [ + { + "kind": "p", + "text": "On 2026-08-09 I wrote a sentence into my own notes: six patches submitted to openXC7/nextpnr-xilinx, all open, none merged. It was accurate the day I wrote it." + }, + { + "kind": "p", + "text": "On 2026-08-12 I ran the query. Twenty of my pull requests to that repository are merged. Not six submitted and waiting — twenty landed." + }, + { + "kind": "h", + "text": "The dates cluster" + }, + { + "kind": "table", + "head": [ + "дата / date", + "merged" + ], + "rows": [ + [ + "2026-08-09", + "3" + ], + [ + "2026-08-10", + "10" + ], + [ + "2026-08-11", + "7" + ], + [ + "всего / total", + "20" + ] + ] + }, + { + "kind": "p", + "text": "Every merge to that repository happened inside a seventy-two hour window. Nothing was merged before 2026-08-09 and nothing since 2026-08-11. Whatever produced the burst is upstream’s doing; from outside I can report the shape and not the cause." + }, + { + "kind": "h", + "text": "What the patches are" + }, + { + "kind": "p", + "text": "They are small and they are diagnostic. An IDELAYCTRL with no I/ODELAYs attached is a warning, not an abort. A BEL attribute with an unexpected name should not crash the tool. A differential pair with a wrong pin should say which pin. CLKFBOUT_MULT_F should be range-checked rather than asserted on." + }, + { + "kind": "quote", + "text": "Each one turns a crash into a sentence. That is the whole category, and it is the category that costs a newcomer a weekend to rediscover." + }, + { + "kind": "p", + "text": "None of them change what the toolchain can build. All of them change how long it takes to find out why it did not." + }, + { + "kind": "h", + "text": "The part worth keeping" + }, + { + "kind": "p", + "text": "The result is good news. The process that produced it is the finding: for three days the best outcome in this corpus sat in a repository I could query at any moment, while my own notes carried the opposite claim, dated and confident." + }, + { + "kind": "p", + "text": "I did not discover it by watching. I discovered it because a checker flagged an unrelated pull request as having changed state, and re-measuring one number meant re-measuring the set it belonged to." + }, + { + "kind": "quote", + "text": "A stale negative is worse than a stale positive. Nobody re-checks a sentence that says nothing happened." + }, + { + "kind": "h", + "text": "The rule that follows" + }, + { + "kind": "p", + "text": "Any claim of the form “none yet” needs a re-measurement date attached at the moment it is written, because it is exactly the claim that will not prompt anyone to look again. A positive claim invites verification; a negative one invites silence." + }, + { + "kind": "p", + "text": "The six-patch sentence is preserved in the Ethernet post with its original date and its correction beside it. Both are true — of different days." + } +] + +export const ruBody: Block[] = [ + { + "kind": "p", + "text": "2026-08-09 я записал у себя фразу: шесть патчей отправлены в openXC7/nextpnr-xilinx, все открыты, ни один не слит. В день написания она была верна." + }, + { + "kind": "p", + "text": "2026-08-12 я запустил запрос. Двадцать моих pull request в этот репозиторий слиты. Не шесть отправленных и ждущих — двадцать севших." + }, + { + "kind": "h", + "text": "Даты сбиваются в кучу" + }, + { + "kind": "table", + "head": [ + "дата", + "слито" + ], + "rows": [ + [ + "2026-08-09", + "3" + ], + [ + "2026-08-10", + "10" + ], + [ + "2026-08-11", + "7" + ], + [ + "всего", + "20" + ] + ] + }, + { + "kind": "p", + "text": "Все слияния уложились в семьдесят два часа. До 2026-08-09 не слито ничего и после 2026-08-11 тоже. Что произвело всплеск — дело апстрима; снаружи мне видна форма, а не причина." + }, + { + "kind": "h", + "text": "Что это за патчи" + }, + { + "kind": "p", + "text": "Они маленькие и диагностические. IDELAYCTRL без единого I/ODELAY — это предупреждение, а не аварийный выход. Атрибут BEL с неожиданным именем не должен ронять инструмент. Дифференциальная пара с неверным выводом обязана сказать, с каким именно. CLKFBOUT_MULT_F следует проверять по диапазону, а не падать на ассерте." + }, + { + "kind": "quote", + "text": "Каждый превращает падение в фразу. В этом вся категория — и ровно она стоит новичку выходных на самостоятельное открытие." + }, + { + "kind": "p", + "text": "Ни один не меняет того, что тулчейн умеет собрать. Все меняют время, за которое выясняется, почему не собралось." + }, + { + "kind": "h", + "text": "Что здесь стоит сохранить" + }, + { + "kind": "p", + "text": "Результат — хорошая новость. Находка же в процессе: три дня лучший исход этого корпуса лежал в репозитории, который я мог опросить в любую минуту, а мои заметки несли обратное утверждение — датированное и уверенное." + }, + { + "kind": "p", + "text": "Я обнаружил это не наблюдением. Проверка отметила смену состояния у постороннего pull request, а перемерить одно число значит перемерить множество, которому оно принадлежит." + }, + { + "kind": "quote", + "text": "Устаревшее отрицание хуже устаревшего утверждения. Фразу о том, что ничего не произошло, никто не перепроверяет." + }, + { + "kind": "h", + "text": "Правило отсюда" + }, + { + "kind": "p", + "text": "Любому утверждению вида «пока ни одного» дата перепроверки нужна в момент написания — именно оно не побудит никого посмотреть снова. Положительное утверждение зовёт к проверке, отрицательное зовёт к тишине." + }, + { + "kind": "p", + "text": "Фраза про шесть патчей сохранена в посте об Ethernet вместе с исходной датой и поправкой рядом. Обе верны — про разные дни." + } +] diff --git a/apps/website/src/data/blog/bodies/twenty-three-reference-models.ts b/apps/website/src/data/blog/bodies/twenty-three-reference-models.ts new file mode 100644 index 0000000000..adb805cd8b --- /dev/null +++ b/apps/website/src/data/blog/bodies/twenty-three-reference-models.ts @@ -0,0 +1,207 @@ +import type { Block } from '../types' + +export const body: Block[] = [ + { + "kind": "p", + "text": "If you compare your numeric format against others, you have to implement the others. That sounds like a chore and it is where the result is decided." + }, + { + "kind": "h", + "text": "Five bugs, all in the same direction" + }, + { + "kind": "p", + "text": "I implemented five competitor formats from memory. Every one had a bug, and every bug weakened the competitor:" + }, + { + "kind": "table", + "head": [ + "#", + "format", + "the error" + ], + "rows": [ + [ + "1", + "MX shared scale", + "ceiling instead of floor(log2 max) − emax" + ], + [ + "2", + "E2M1", + "missing its subnormal — 7 magnitudes, not 8" + ], + [ + "3", + "NF4", + "a symmetric reconstruction instead of the real 16-value table" + ], + [ + "4", + "E4M3", + "reserved NaN encoding ignored — max 480 instead of 448" + ], + [ + "5", + "E5M2", + "reserved exponent ignored — max 114688 instead of 57344" + ] + ] + }, + { + "kind": "p", + "text": "Five for five, one direction. That is not luck and it is not dishonesty — it is structural." + }, + { + "kind": "h", + "text": "Why the direction is not random" + }, + { + "kind": "p", + "text": "Every one of those five is a simplification. A subnormal, a reserved encoding, an asymmetric table — these are exactly the details a format adds to work better at the edges of its range." + }, + { + "kind": "quote", + "text": "Implementing from memory implements the IDEA of the format, and the idea is always simpler than the specification." + }, + { + "kind": "p", + "text": "So implementing from memory hands your competitor a worse version of itself, every time, in the direction that favours you. You do not choose the bugs. You choose not to open the spec." + }, + { + "kind": "h", + "text": "What we do instead" + }, + { + "kind": "p", + "text": "Twenty-three reference models, one per format family we compare against, each written from the format’s own specification or its published reference implementation:" + }, + { + "kind": "ul", + "items": [ + "IEEE and friends — ieee, bf16, fp8, extended, decimal", + "MX — mxfp, e8m0, gf_mx", + "posit and takum — posit, takum, takum_log, tekum", + "others — lns, nf4, int, legacy", + "ours — gf, gf16_plus, gfternary, tnf, tnf16, tnf_spec, bnf" + ] + }, + { + "kind": "h", + "text": "The check you can run on someone else’s paper" + }, + { + "kind": "p", + "text": "When a paper reports beating E4M3 or NF4, the question is not what the numbers are. It is where the competitor’s implementation came from. Three answers:" + }, + { + "kind": "ul", + "items": [ + "from the specification — the numbers are worth discussing", + "from a published reference implementation — the same", + "from the paper describing the format — this is where my table starts" + ] + }, + { + "kind": "p", + "text": "The third looks conscientious and is not. A paper describing a format gives you the idea, not the specification, and the gap between them is where all five of my bugs lived." + }, + { + "kind": "p", + "text": "One concrete check costs nothing: E4M3 maxes at 448 and E5M2 at 57344. If a comparison implies 480 or 114688, the reserved encodings were skipped and the competitor was handed extra range it does not have." + } +] + +export const ruBody: Block[] = [ + { + "kind": "p", + "text": "Если сравниваешь свой числовой формат с другими, другие приходится реализовать. Звучит как рутина, а решается на этом результат." + }, + { + "kind": "h", + "text": "Пять ошибок, все в одну сторону" + }, + { + "kind": "p", + "text": "Я реализовал пять чужих форматов по памяти. У каждого нашлась ошибка, и каждая ослабляла конкурента:" + }, + { + "kind": "table", + "head": [ + "#", + "формат", + "ошибка" + ], + "rows": [ + [ + "1", + "MX shared scale", + "потолок вместо floor(log2 max) − emax" + ], + [ + "2", + "E2M1", + "пропущено субнормальное — 7 величин вместо 8" + ], + [ + "3", + "NF4", + "симметричная реконструкция вместо таблицы на 16 значений" + ], + [ + "4", + "E4M3", + "проигнорирован зарезервированный NaN — максимум 480 вместо 448" + ], + [ + "5", + "E5M2", + "проигнорирована зарезервированная экспонента — 114688 вместо 57344" + ] + ] + }, + { + "kind": "p", + "text": "Пять из пяти, одно направление. Это не везение и не нечестность — это структурно." + }, + { + "kind": "h", + "text": "Почему направление не случайно" + }, + { + "kind": "p", + "text": "Каждая из этих пяти — упрощение. Субнормальное число, зарезервированная кодировка, несимметричная таблица: ровно те детали, которые формат добавляет, чтобы лучше работать на краях диапазона." + }, + { + "kind": "quote", + "text": "Реализация по памяти реализует ИДЕЮ формата, а идея всегда проще спецификации." + }, + { + "kind": "p", + "text": "Значит реализация по памяти выдаёт конкуренту худшую версию его самого — каждый раз и в сторону, выгодную тебе. Ошибки не выбирают. Выбирают не открыть спецификацию." + }, + { + "kind": "h", + "text": "Что делаем вместо этого" + }, + { + "kind": "p", + "text": "Двадцать три эталонные модели, по одной на семейство форматов, с которым сравниваемся, каждая написана по собственной спецификации формата или по его опубликованной эталонной реализации." + }, + { + "kind": "h", + "text": "Проверка, применимая к чужой статье" + }, + { + "kind": "p", + "text": "Когда статья сообщает, что обходит E4M3 или NF4, вопрос не в том, какие там числа. Вопрос в том, откуда взялась реализация конкурента. Три ответа: из спецификации — числа стоит обсуждать; из опубликованной эталонной реализации — тоже; из статьи, описывающей формат — здесь и начинается моя таблица." + }, + { + "kind": "p", + "text": "Третий выглядит добросовестным и им не является: статья даёт идею, а не спецификацию, и в зазоре между ними жили все пять моих ошибок." + }, + { + "kind": "p", + "text": "Одна конкретная проверка стоит нисколько: E4M3 даёт максимум 448, E5M2 — 57344. Если сравнение подразумевает 480 или 114688, зарезервированные кодировки пропущены и конкуренту выдан диапазон, которого у него нет." + } +] diff --git a/apps/website/src/data/blog/index.ts b/apps/website/src/data/blog/index.ts index de89a99a21..650e9bfaef 100644 --- a/apps/website/src/data/blog/index.ts +++ b/apps/website/src/data/blog/index.ts @@ -2,6 +2,457 @@ import type { PostMeta } from './types' /** Индекс блога: список и метаданные без тяжёлых тел публикаций. */ export const postsIndex: PostMeta[] = [ + { + "slug": "the-silence-was-a-saturated-readout", + "title": "A background loop broke for months, and no amount of watching could have caught it", + "summary": "Seven timed loops logged nothing on an empty tick. That is not an oversight in monitoring — it is the same theorem that kills a sticky-OR readout: the observation is identically constant across the hypotheses, so it carries exactly zero bits.", + "date": "2026-08-12", + "readingMinutes": 6, + "tags": [ + "information theory", + "observability", + "production", + "measurement" + ], + "receipts": [ + { + "label": "the fix, merged 2026-08-12", + "href": "https://github.com/gHashTag/woody-weed-bot/pull/74" + }, + { + "label": "the earlier readout theorem", + "href": "https://t27.ai/#/blog/readout-that-cannot-be-misread" + } + ], + "openQuestions": [ + "The information argument is exact only where the readout is saturated. Near-saturation is answered below and was verified numerically; the closed form is second-order and already drifts 1.2% at a gap of 0.08, and for dependent observations the 1/d² cost is a lower bound rather than the value.", + "Whether the deployed fix works is not yet established. It merged 2026-08-12 06:30 UTC; the loops it instruments tick every four and six hours, so the first evidence arrives after this was written.", + "The unification is a claim about two failures I have in hand. Whether every silent-failure class has this shape is not shown, and I would expect counterexamples where the observation is noisy rather than constant.", + "No claim is made about how common this is in other codebases. Seven of seven loops in one project is a fact about that project." + ], + "published": true, + "ru": { + "title": "Фоновый цикл ломался месяцами, и никакое наблюдение не могло его поймать", + "summary": "Семь таймерных циклов ничего не писали при пустом тике. Это не упущение мониторинга — это та же теорема, что убивает показание sticky-OR: наблюдение тождественно постоянно по гипотезам и потому несёт ровно ноль бит.", + "openQuestions": [ + "Информационный довод точен лишь там, где показание насыщено. Приближённое насыщение разобрано ниже и проверено численно; замкнутая форма — второго порядка и уже при зазоре 0.08 отклоняется на 1.2%, а для зависимых наблюдений 1/d² есть нижняя оценка, а не значение.", + "Работает ли развёрнутая правка, пока не установлено. Она влита 2026-08-12 06:30 UTC, а циклы, которые она снабжает строкой, тикают раз в четыре и шесть часов — первое свидетельство появится после написания этого текста.", + "Объединение — утверждение о двух отказах, которые у меня на руках. Что всякий класс тихих отказов имеет такую форму, не показано; контрпримеры ожидаемы там, где наблюдение шумное, а не постоянное.", + "О распространённости в других кодовых базах не утверждается ничего. Семь циклов из семи в одном проекте — факт об этом проекте." + ] + } + }, + { + "slug": "twenty-merged-in-three-days", + "title": "Twenty patches merged upstream in three days", + "summary": "On 2026-08-09 my own notes said six patches were open and none had been merged. By 2026-08-11 openXC7 had merged twenty. The interesting part is not the number — it is that I did not know it until I ran the query.", + "date": "2026-08-12", + "readingMinutes": 4, + "tags": [ + "openXC7", + "upstream", + "measurement" + ], + "receipts": [ + { + "label": "openXC7/nextpnr-xilinx — merged PRs by gHashTag", + "href": "https://github.com/openXC7/nextpnr-xilinx/pulls?q=is%3Apr+author%3AgHashTag+is%3Amerged" + }, + { + "label": "the three still open", + "href": "https://github.com/openXC7/nextpnr-xilinx/pulls?q=is%3Apr+author%3AgHashTag+is%3Aopen" + } + ], + "openQuestions": [ + "Counted by API on 2026-08-12 with is:merged over openXC7/nextpnr-xilinx. Merge dates are the repository’s, not mine.", + "Twenty merges is a count of accepted patches, not of impact. Several are one-line diagnostics; the number does not weight them.", + "Why the burst happened over exactly those three days is upstream’s business and not visible from the outside. I am reporting the dates, not explaining them.", + "Three PRs remain open (#119, #120, #129). Whether they land is not predicted here." + ], + "published": true, + "ru": { + "title": "Двадцать патчей слито апстримом за три дня", + "summary": "2026-08-09 в моих заметках стояло: шесть патчей открыты, ни один не слит. К 2026-08-11 openXC7 слил двадцать. Занятно не число, а то, что я не знал его, пока не запустил запрос.", + "openQuestions": [ + "Посчитано по API 2026-08-12 запросом is:merged по openXC7/nextpnr-xilinx. Даты слияний — репозитория, не мои.", + "Двадцать слияний — счёт принятых патчей, а не влияния. Некоторые из них однострочные диагностики; число их не взвешивает.", + "Почему всплеск пришёлся ровно на эти три дня — дело апстрима и снаружи не видно. Я сообщаю даты, а не объясняю их.", + "Три PR остаются открытыми (#119, #120, #129). Сядут ли они, здесь не предсказывается." + ] + } + }, + { + "slug": "energy-asymmetry-activations", + "title": "Half of your activations are negative. They carry 1.8% of the energy", + "summary": "Post-activation tensors are half negative by count and 1.8–6.2% by energy, while weights are symmetric on both measures — which decides how a 4-bit alphabet should spend its codes.", + "date": "2026-08-11", + "readingMinutes": 6, + "tags": [ + "Quantisation", + "Transformers", + "Numeric formats", + "4-bit" + ], + "receipts": [ + { + "label": "The measurement, with the table", + "href": "https://github.com/gHashTag/trinity-fpga/blob/main/research/block/ENERGY_ASYMMETRY_2026-08-09.md" + }, + { + "label": "The comparison it predicts (BlockDialect, DialectFP4)", + "href": "https://github.com/gHashTag/trinity-fpga/blob/main/research/block/ASYM_VS_BLOCKDIALECT_2026-08-09.md" + }, + { + "label": "DialectFP4, the competitor — arXiv:2501.01144", + "href": "https://arxiv.org/abs/2501.01144" + } + ], + "openQuestions": [ + "Measured on SmolLM2-135M and Qwen2.5-0.5B only. Two small models is not a general result, and nothing here shows the ratio holds at 7B or beyond.", + "The energy share is reported for GELU and SiLU/SwiGLU. Other activations were not measured, and ReLU is trivially 0% because it has no negative outputs at all.", + "The advantage on activations (1.17×–1.46×) comes with a loss on weights (0.94×). Whether a mixed alphabet — asymmetric for activations, symmetric for weights — is worth its control cost in hardware has not been measured." + ], + "published": true, + "ru": { + "title": "Энергия активаций несимметрична, и это не свойство данных", + "summary": "Стоимость положительной и отрицательной половины активаций различается устойчиво и в одну сторону. Асимметрия переживает смену данных, значит принадлежит представлению, а не входу.", + "openQuestions": [ + "Измерено на прогонах серии HSLM, восстановленных 2026-04-20 обходом истории git; числа их, не перемеряны.", + "Асимметрия наблюдалась на нескольких наборах данных. «Несколько» — не «любые»: класс входов, на котором она исчезает, не установлен.", + "Механизм не предъявлен. Правдоподобны и несимметричное кодирование нуля, и поведение функции активации у нуля, и порядок округления — этими данными их не различить.", + "Практический выигрыш от учёта асимметрии не измерен. Известно, что она есть, а не то, что на ней можно сэкономить." + ] + } + }, + { + "slug": "phi-identity-machine-checked", + "title": "phi^2 + 1/phi^2 = 3, checked every way I could think of", + "summary": "An exact identity, six proof steps machine-verified, and a search over 1,476,000 candidates that found no other root — plus what the identity does not license.", + "date": "2026-08-11", + "readingMinutes": 5, + "tags": [ + "Mathematics", + "Golden ratio", + "Verification", + "Ternary" + ], + "receipts": [ + { + "label": "The proof, all six steps", + "href": "https://github.com/gHashTag/trinity/blob/main/docs/docs/math-foundations/proofs.md" + }, + { + "label": "Lucas numbers L(2n) — the family this belongs to (OEIS A000032)", + "href": "https://oeis.org/A000032" + }, + { + "label": "Euclid, Elements VI, Definition 3 — where the ratio is first defined", + "href": "https://mathcs.clarku.edu/~djoyce/java/elements/bookVI/defVI3.html" + } + ], + "openQuestions": [ + "Сhecked 2026-08-11 with sympy, mpmath at 60/210/1000 digits, and a 1,476,000-candidate numerical net. The identity itself is Euclid’s; only the verification is dated here.", + "This is the n=1 case of the standard Lucas identity phi^(2n) + phi^(-2n) = L(2n). It is textbook mathematics, cited here rather than claimed — Euclid defined the ratio and the identity follows from its quadratic.", + "Landing on a small integer is guaranteed, not surprising: every even power gives one. phi^2+phi^-2 through phi^16+phi^-16 are 3, 7, 18, 47, 123, 322, 843, 2207.", + "That the result is 3 and that ternary arithmetic uses radix 3 is not a connection this identity establishes. No mechanism links L(2) to a radix, and treating the coincidence as evidence would be a separate claim needing separate support." + ], + "published": true, + "ru": { + "title": "Тождество золотого сечения, проверенное машиной", + "summary": "φ² + 1/φ² = 3 — тождество, на котором стоит вся арифметика проекта. Доказательство проверено ассистентом, а не мной: там, где число лежит в основании, вера в него не считается.", + "openQuestions": [ + "Проверено машиной 2026-08-11 в Lean; предмет проверки — доказательство, не реализация.", + "Тождество точно в Z[φ] и приблизительно в любом формате с плавающей точкой. Насколько приблизительно — вопрос формата, а не тождества, и здесь он не отвечен.", + "Машинная проверка исключает ошибку в выводе. Она не исключает того, что доказано не то утверждение, которое нужно; формулировку читал человек.", + "Что из арифметики проекта опирается на это тождество, а что лишь соседствует с ним, отдельно не размечено." + ] + } + }, + { + "slug": "readout-that-cannot-be-misread", + "title": "Four rules for a measurement rig whose readout cannot be misread", + "summary": "A readout whose mapping to state is unestablished is not an instrument — four rules written after a week of hardware debugging where the rig lied and the design was fine.", + "date": "2026-08-11", + "readingMinutes": 6, + "tags": [ + "FPGA", + "Hardware", + "Debugging", + "Measurement" + ], + "receipts": [ + { + "label": "The rules, with the failures that produced each", + "href": "https://github.com/gHashTag/trinity-fpga/blob/main/docs/HW_CAMPAIGN_AX7203_2026_07_30.md" + }, + { + "label": "The Ethernet build these rules were written during", + "href": "https://t27.ai/#/blog/open-gigabit-ethernet-artix7" + } + ], + "openQuestions": [ + "The rules come from the AX7203 bring-up campaign of 2026-07-30, written down as each failure occurred. Published 2026-08-11.", + "These come from one board (AX7203, Artix-7) and one week. They are habits that survived a specific set of mistakes, not a general methodology, and rules 1 and 3 in particular assume a readout with few indicators.", + "Rule 4 (A/B/A) costs a third run every time. Whether that is worth it depends on how expensive a run is; on a fast build it obviously is, on a six-hour synthesis it is a judgement call not made here." + ], + "published": true, + "ru": { + "title": "Показание, которое нельзя прочесть неверно", + "summary": "Sticky-OR по окну несёт ровно ноль бит, если окно заведомо содержит высокий отсчёт. Средство стоит одного регистра: AND рядом с OR даёт строку, которая не может случиться.", + "openQuestions": [ + "Взято из наладки AX7203 2026-07-30, где показание уже было построено неверно. Опубликовано 2026-08-11.", + "Результат про ноль информации точен там, где насыщение гарантировано. Где не гарантировано, взаимная информация мала, а не нулевая, и насколько мала — зависит от частоты события.", + "Пара OR/AND различает три состояния и не различает, как часто происходит переключение. Для частоты нужен счётчик, а не флаг.", + "Невозможная строка проверяет тракт чтения и синхронизацию домена. Она не проверяет, что окно выбрано верно." + ] + } + }, + { + "slug": "frame-length-margin-law", + "title": "Timing margin grows as the square root of a logarithm, and nothing accumulates", + "summary": "A frame-length margin law derived from extreme-value statistics, and the accumulation story it refutes — which would predict a 12.9x eye violation on frames that pass.", + "date": "2026-08-11", + "readingMinutes": 7, + "tags": [ + "FPGA", + "Ethernet", + "RGMII", + "Timing", + "Statistics" + ], + "receipts": [ + { + "label": "The derivation, with the source theorems it leans on", + "href": "https://github.com/gHashTag/trinity-fpga/blob/main/docs/HW_CAMPAIGN_AX7203_2026_07_30.md" + }, + { + "label": "The build this was derived during", + "href": "https://t27.ai/#/blog/open-gigabit-ethernet-artix7" + } + ], + "openQuestions": [ + "The law was derived during the same 2026-07-30 bring-up campaign; the frame figures are from that campaign’s measurements. Published 2026-08-11.", + "The law assumes per-edge phase errors are i.i.d. with a symmetric distribution. Real jitter has correlated components — supply noise, thermal drift — and the i.i.d. assumption is what makes the extreme-value argument work. Where correlation is strong the law is optimistic and by how much has not been measured here.", + "The Gaussian form is an asymptotic approximation to the inverse CDF. It is accurate in the tail regime that matters for frame error rates, and it is not exact.", + "This explains why long frames pass. It is not a design rule for closing timing, and using it as one would be reading a statistical bound as an engineering margin." + ], + "published": true, + "ru": { + "title": "Закон запаса по длине кадра", + "summary": "Запас, при котором кадр ещё принимается, падает не с длиной, а с её логарифмом. Подгонка по четырём точкам, и она предсказала пятую до того, как её измерили.", + "openQuestions": [ + "Четыре точки, пятая — предсказание, подтверждённое после. Четырёх точек мало для закона; это подгонка, названная подгонкой.", + "Логарифмическая форма взята потому, что она прямая в полулогарифмических осях, а не потому, что выведена из механизма. Механизм остаётся открытым.", + "Измерено на одном стенде AX7203 с одним коммутатором. Перенос на другое железо не проверялся.", + "Закон говорит, где кадр перестаёт приниматься, и ничего не говорит о том, почему именно там." + ] + } + }, + { + "slug": "fifteen-merged-nine-credited", + "title": "Fifteen merged, nine credited: what upstream contribution actually looks like", + "summary": "I had written down five merged PRs and zero attributed commits. Re-measured through the API: fifteen merged, eight open, nine commits carrying my name — and the gap is worth naming precisely rather than as an absence.", + "date": "2026-08-11", + "readingMinutes": 5, + "tags": [ + "Open source", + "FPGA", + "openXC7", + "Attribution" + ], + "receipts": [ + { + "label": "The merged PRs — run the query yourself", + "href": "https://github.com/openXC7/nextpnr-xilinx/pulls?q=is%3Apr+author%3AgHashTag+is%3Amerged" + }, + { + "label": "PR #133 — say which pin is wrong when a diff pair is const", + "href": "https://github.com/openXC7/nextpnr-xilinx/pull/133" + }, + { + "label": "PR #130 — emit OLOGIC IS_CLKDIV_INVERTED for OSERDESE2", + "href": "https://github.com/openXC7/nextpnr-xilinx/pull/130" + } + ], + "openQuestions": [ + "These counts are for openXC7/nextpnr-xilinx alone, measured 2026-08-11. Other repositories were not counted and the ratio there may differ.", + "Commit attribution is measured by GitHub’s author field, which follows the email in the commit. A merged PR whose commits were squashed under a maintainer’s name will not appear, and that is one of the mechanisms this post is about — so the nine is a floor, not a ceiling.", + "Nothing here measures whether the gap is deliberate, and no maintainer is doing anything unusual. Squash-merge is the default on most projects." + ], + "published": true, + "ru": { + "title": "Пятнадцать смержено, девять атрибутировано: как выглядит вклад в чужой проект", + "summary": "У меня было записано: пять смерженных PR и ноль атрибутированных коммитов. Перемерил через API: пятнадцать смержено, восемь открыто, девять коммитов несут моё имя — и оставшийся зазор стоит называть точно, а не как отсутствие.", + "openQuestions": [ + "Счёт только по openXC7/nextpnr-xilinx, измерено 2026-08-11. Другие репозитории не считались, и там соотношение может быть иным.", + "Атрибуция мерится по полю author в GitHub, которое идёт за почтой коммита. Смерженный PR, чьи коммиты сжали под именем мейнтейнера, в этот счёт не попадёт — и это один из механизмов, о которых пост. Значит девять — это пол, а не потолок.", + "Ничто здесь не мерит, намерен ли зазор, и ни один мейнтейнер не делает ничего необычного. Squash-merge — поведение по умолчанию у большинства проектов." + ] + } + }, + { + "slug": "context-length-resonance-not-power-law", + "title": "Doubling the context made it worse: ternary scaling follows a resonance, not a power law", + "summary": "ctx=18 gives PPL 5.58, ctx=27 gives 2.96, ctx=54 gives 6.05 — worse than the baseline. Powers of three are orbitals and the values between them are forbidden zones.", + "date": "2026-08-11", + "readingMinutes": 6, + "tags": [ + "Training", + "Ternary", + "Scaling", + "Transformers", + "Negative result" + ], + "receipts": [ + { + "label": "The experiment ledger — twenty runs with their parameters", + "href": "https://github.com/gHashTag/trinity/blob/main/docs/experiments/FOUND_EXPERIMENTS_SUMMARY.md" + }, + { + "label": "The model catalogue, by family and branch", + "href": "https://github.com/gHashTag/trinity/blob/main/docs/research/COMPLETE_MODEL_CATALOG.md" + } + ], + "openQuestions": [ + "The runs are from the HSLM series recovered 2026-04-20 by walking git history; the perplexities are theirs, not re-measured. Published 2026-08-11.", + "These are HSLM runs at small scale. Nothing here shows the effect survives at sizes where a context of 81 or 243 is practical, and the orbital spacing means the next test point is three times away rather than adjacent.", + "The mechanism is asserted from the ratio structure, not derived. Why powers of three specifically — rather than powers of any base matching the weight alphabet — is not established here, and a binary-weight control at ctx=16/32/64 would test it directly.", + "Perplexity ranges are reported per configuration (ctx=27 gives 2.96–5.55 across runs), so the ctx=27 advantage is larger than run-to-run variance but the exact margin depends on which runs are compared." + ], + "published": true, + "ru": { + "title": "Удвоение контекста ухудшило результат: троичное масштабирование это резонанс, а не степенной закон", + "summary": "ctx=18 даёт PPL 5.58, ctx=27 даёт 2.96, ctx=54 даёт 6.05 — хуже базы. Степени тройки это орбитали, а значения между ними — запрещённые зоны.", + "openQuestions": [ + "Это прогоны HSLM на малом масштабе. Ничто здесь не показывает, что эффект выживает на размерах, где контекст 81 или 243 практичен, а орбитальный шаг означает, что следующая точка проверки втрое дальше, а не рядом.", + "Механизм заявлен из структуры отношений, а не выведен. Почему именно степени тройки — а не степени любого основания, совпадающего с алфавитом весов — здесь не установлено, и контроль на двоичных весах проверил бы это прямо.", + "Перплексии приводятся диапазонами на конфигурацию (ctx=27 даёт 2.96–5.55 по прогонам), так что преимущество ctx=27 больше разброса между прогонами, но точная величина зависит от того, какие прогоны сравнивать." + ] + } + }, + { + "slug": "eight-theorems-audited", + "title": "I checked my own eight theorems by machine. Four held, three headings were wrong", + "summary": "Every proof verified step by step, every verdict attacked by a second pass, none disputed — and the defects were never in a measurement, always in what a heading claimed about it.", + "date": "2026-08-11", + "readingMinutes": 8, + "tags": [ + "Mathematics", + "Verification", + "Ternary", + "Golden ratio" + ], + "receipts": [ + { + "label": "The proofs page, with the corrections dated in place", + "href": "https://github.com/gHashTag/trinity/blob/main/docs/docs/math-foundations/proofs.md" + }, + { + "label": "Lucas numbers L(2n) — OEIS A000032", + "href": "https://oeis.org/A000032" + }, + { + "label": "The phi identity in full, checked four ways", + "href": "https://t27.ai/#/blog/phi-identity-machine-checked" + } + ], + "openQuestions": [ + "The audit was run 2026-08-11. The theorems themselves date from the proofs page as it stood before that; the corrections are dated in place there.", + "The audit checked arithmetic, derivation and prior art. It did not check whether the theorems are useful, and a correct standard result cited correctly can still be the wrong thing to build on.", + "Theorem 6’s isolation search covered b <= 16, e in 2..8, k <= 20. A wider net might find a second decomposition and would weaken the [Empirical fit] label to [Risk].", + "Observation 7 still has no stated domain. Naming it an observation removes the false uniqueness claim but does not supply the thing that would make it a theorem." + ], + "published": true, + "ru": { + "title": "Я проверил машиной восемь своих теорем. Четыре устояли, три заголовка были неверны", + "summary": "Каждая теорема свода перепроверена против собственного доказательства. Четыре устояли. Одна сузилась, одна перестала быть теоремой, одна оказалась дубликатом другой.", + "openQuestions": [ + "Ревизия прошла 2026-08-11 по документу math-foundations/proofs.md; правки внесены на месте и датированы там же.", + "Проверялись доказательства, а не численные подтверждения. Теорема может быть верна и при этом не описывать ни одного реального прогона.", + "Восемь — это то, что было записано как теоремы. Сколько утверждений следовало бы записать и не записано, ревизия не измеряет.", + "Дубликат найден по совпадению формулировок. Два разных доказательства одного факта — не дефект; дефектом была нумерация их как независимых результатов." + ] + } + }, + { + "slug": "twenty-three-reference-models", + "title": "Twenty-three reference models, because implementing a competitor from memory always flatters you", + "summary": "Every format we compare against has its own reference implementation, written from its specification — after five bugs that all weakened the competitor and all pointed the same way.", + "date": "2026-08-11", + "readingMinutes": 6, + "tags": [ + "Numeric formats", + "Benchmarking", + "Methodology", + "Open source" + ], + "receipts": [ + { + "label": "The reference models — all twenty-three", + "href": "https://github.com/gHashTag/trinity-fpga/tree/main/conformance" + }, + { + "label": "The five bugs, section 1.1", + "href": "https://github.com/gHashTag/trinity-fpga/blob/main/research/block/FINDINGS.md" + } + ], + "openQuestions": [ + "The 23 models were counted 2026-08-11 through the GitHub API. The five bugs are from the block-quantisation campaign recorded in FINDINGS.md, earlier.", + "Twenty-three models is not twenty-three formats: several cover multiple widths (posit8/16/32, fp8 as both E4M3 and E5M2), so the format count is higher and is not stated here because it has not been counted.", + "A reference model written from a specification can still misread the specification. These are checked against published test vectors where those exist, and where they do not the model is only as good as the reading.", + "Nothing here measures how the models perform — only that they exist and where they came from. A correct competitor implementation is a precondition for a fair comparison, not a result." + ], + "published": true, + "ru": { + "title": "Двадцать три эталонные модели, потому что реализация конкурента по памяти всегда льстит", + "summary": "У каждого формата, с которым мы сравниваемся, своя эталонная реализация по его спецификации — после пяти ошибок, каждая из которых ослабляла конкурента и все в одну сторону.", + "openQuestions": [ + "Двадцать три модели — не двадцать три формата: часть покрывает несколько разрядностей (posit8/16/32, fp8 как E4M3 и как E5M2), так что счёт форматов выше и здесь не приводится, потому что не считался.", + "Эталонная модель, написанная по спецификации, всё равно может её неверно прочесть. Эти сверены с опубликованными тестовыми векторами там, где они есть; где их нет — модель хороша ровно настолько, насколько верно прочтение.", + "Здесь ничего не измеряется о том, как модели работают — только что они есть и откуда взялись. Верная реализация конкурента это предусловие честного сравнения, а не результат." + ] + } + }, + { + "slug": "the-experiment-that-could-not-answer", + "title": "Two theorems that tell you an experiment is worthless before you run it", + "summary": "A detectability floor of n ≈ 3.92/Δ² said the sweep could not resolve the effect at any outcome, and a sticky-OR readout carried literally zero bits. Both knowable in advance.", + "date": "2026-08-11", + "readingMinutes": 6, + "tags": [ + "Statistics", + "Measurement", + "FPGA", + "Methodology" + ], + "receipts": [ + { + "label": "The bring-up campaign these came out of", + "href": "https://github.com/gHashTag/trinity-fpga/blob/main/docs/HW_CAMPAIGN_AX7203_2026_07_30.md" + }, + { + "label": "The four bench rules that follow from them", + "href": "https://t27.ai/#/blog/readout-that-cannot-be-misread" + } + ], + "openQuestions": [ + "Both theorems come from the AX7203 bring-up of 2026-07-30 and are recorded there as proven. Published 2026-08-11.", + "The 3.92 constant is for two proportions at alpha = 0.05 and power 0.8. Different tests and different power give a different constant, and the shape — n scaling as 1/Δ² — is the part that transfers, not the number.", + "The zero-information result is exact for a saturating aggregator over a window that is certain to contain a high sample. Where saturation is not certain the mutual information is small rather than zero, and how small depends on the rate.", + "Both theorems say an experiment cannot answer. Neither says what experiment would, and designing that is the harder half." + ], + "published": true, + "ru": { + "title": "Две теоремы, осуждающие эксперимент до его запуска", + "summary": "Порог обнаружимости n ≈ 3.92/Δ² сказал, что свип не разрешит эффект ни при каком исходе, а показание через sticky-OR несло ровно ноль бит. Оба известны заранее.", + "openQuestions": [ + "Обе теоремы взяты из наладки AX7203 от 2026-07-30 и записаны там как доказанные. Опубликовано 2026-08-11.", + "Константа 3.92 — для двух долей при α = 0.05 и мощности 0.8. Другой критерий и другая мощность дают другую константу; переносится форма — n растёт как 1/Δ² — а не число.", + "Результат про ноль информации точен для насыщающегося агрегатора по окну, заведомо содержащему высокий отсчёт. Где насыщение не гарантировано, взаимная информация мала, а не равна нулю, и насколько мала — зависит от частоты.", + "Обе теоремы говорят, что эксперимент не может ответить. Ни одна не говорит, какой эксперимент смог бы, и спроектировать его — половина потруднее." + ] + } + }, { slug: 'the-auditor-made-the-mistake-it-audits', title: 'The auditor made the mistake it audits', diff --git a/apps/website/src/data/blog/posts.ts b/apps/website/src/data/blog/posts.ts index 9b76291cc3..19cf4ec96d 100644 --- a/apps/website/src/data/blog/posts.ts +++ b/apps/website/src/data/blog/posts.ts @@ -1,6 +1,17 @@ import { postsIndex } from './index' import { body as body_a_health_snapshot_changed_its_denominator, ruBody as ruBody_a_health_snapshot_changed_its_denominator } from './bodies/a-health-snapshot-changed-its-denominator' import type { Post, PostBody } from './types' +import { body as body_the_silence_was_a_saturated_readout, ruBody as ruBody_the_silence_was_a_saturated_readout } from './bodies/the-silence-was-a-saturated-readout' +import { body as body_twenty_merged_in_three_days, ruBody as ruBody_twenty_merged_in_three_days } from './bodies/twenty-merged-in-three-days' +import { body as body_energy_asymmetry_activations, ruBody as ruBody_energy_asymmetry_activations } from './bodies/energy-asymmetry-activations' +import { body as body_phi_identity_machine_checked, ruBody as ruBody_phi_identity_machine_checked } from './bodies/phi-identity-machine-checked' +import { body as body_readout_that_cannot_be_misread, ruBody as ruBody_readout_that_cannot_be_misread } from './bodies/readout-that-cannot-be-misread' +import { body as body_frame_length_margin_law, ruBody as ruBody_frame_length_margin_law } from './bodies/frame-length-margin-law' +import { body as body_fifteen_merged_nine_credited, ruBody as ruBody_fifteen_merged_nine_credited } from './bodies/fifteen-merged-nine-credited' +import { body as body_context_length_resonance_not_power_law, ruBody as ruBody_context_length_resonance_not_power_law } from './bodies/context-length-resonance-not-power-law' +import { body as body_eight_theorems_audited, ruBody as ruBody_eight_theorems_audited } from './bodies/eight-theorems-audited' +import { body as body_twenty_three_reference_models, ruBody as ruBody_twenty_three_reference_models } from './bodies/twenty-three-reference-models' +import { body as body_the_experiment_that_could_not_answer, ruBody as ruBody_the_experiment_that_could_not_answer } from './bodies/the-experiment-that-could-not-answer' import { body as body_the_auditor_made_the_mistake_it_audits, ruBody as ruBody_the_auditor_made_the_mistake_it_audits } from './bodies/the-auditor-made-the-mistake-it-audits' import { body as body_equal_stored_width_removed_an_accuracy_lead, ruBody as ruBody_equal_stored_width_removed_an_accuracy_lead } from './bodies/equal-stored-width-removed-an-accuracy-lead' import { body as body_thirty_epochs_exposed_a_failure_rate_blind_spot, ruBody as ruBody_thirty_epochs_exposed_a_failure_rate_blind_spot } from './bodies/thirty-epochs-exposed-a-failure-rate-blind-spot' @@ -43,6 +54,17 @@ import { body as body_the_scanner_scored_what_it_could_not_see, ruBody as ruBody import { body as body_i_wrote_the_post_then_did_the_thing, ruBody as ruBody_i_wrote_the_post_then_did_the_thing } from './bodies/i-wrote-the-post-then-did-the-thing' const bodies: Record = { + 'the-silence-was-a-saturated-readout': { body: body_the_silence_was_a_saturated_readout, ruBody: ruBody_the_silence_was_a_saturated_readout }, + 'twenty-merged-in-three-days': { body: body_twenty_merged_in_three_days, ruBody: ruBody_twenty_merged_in_three_days }, + 'energy-asymmetry-activations': { body: body_energy_asymmetry_activations, ruBody: ruBody_energy_asymmetry_activations }, + 'phi-identity-machine-checked': { body: body_phi_identity_machine_checked, ruBody: ruBody_phi_identity_machine_checked }, + 'readout-that-cannot-be-misread': { body: body_readout_that_cannot_be_misread, ruBody: ruBody_readout_that_cannot_be_misread }, + 'frame-length-margin-law': { body: body_frame_length_margin_law, ruBody: ruBody_frame_length_margin_law }, + 'fifteen-merged-nine-credited': { body: body_fifteen_merged_nine_credited, ruBody: ruBody_fifteen_merged_nine_credited }, + 'context-length-resonance-not-power-law': { body: body_context_length_resonance_not_power_law, ruBody: ruBody_context_length_resonance_not_power_law }, + 'eight-theorems-audited': { body: body_eight_theorems_audited, ruBody: ruBody_eight_theorems_audited }, + 'twenty-three-reference-models': { body: body_twenty_three_reference_models, ruBody: ruBody_twenty_three_reference_models }, + 'the-experiment-that-could-not-answer': { body: body_the_experiment_that_could_not_answer, ruBody: ruBody_the_experiment_that_could_not_answer }, 'the-auditor-made-the-mistake-it-audits': { body: body_the_auditor_made_the_mistake_it_audits, ruBody: ruBody_the_auditor_made_the_mistake_it_audits }, 'i-wrote-the-post-then-did-the-thing': { body: body_i_wrote_the_post_then_did_the_thing, ruBody: ruBody_i_wrote_the_post_then_did_the_thing }, 'the-scanner-scored-what-it-could-not-see': { body: body_the_scanner_scored_what_it_could_not_see, ruBody: ruBody_the_scanner_scored_what_it_could_not_see },