Repository navigation
feat(blog): one outlier, 23 zeros -- the post on course module 11 - #1445
Conversation
Closes #1440 The course continues past the lab with three lessons on the number formats AI chips use (OCP Microscaling v1.0), each opening a widget whose numbers come from a real run: - 31 One scale for a block of weights -- play-e8m0: the player compiles e8m0.t27 in the browser on seven backends and runs its tests, skipping what the browser cannot run and saying why. - 32 The scale byte on a real machine -- t27c-e8m0: native t27c and Zig on the t27c lab, 18 tests pass, 9 invariants proved at comptime. - 33 One outlier, many zeros -- t27c-ocp-mx: ocp_mx.t27 on 31 small weights and one outlier; E2M1 flushes 23 to zero, E3M2 and E4M3 none; one changed bias fails exactly one test. Words and order live in specs/course/course.t27 (LESSON_COUNT 33, MODULE_COUNT 11; the core stays 27 and the spec's own test says so). The generators wrote the TypeScript, 68 pages and 68 cards; the gallery gains the three widgets and the player a second play. scripts/course-from-spec.test.mjs loses two asserts that pinned the old counts (30, 10): the count has one home, the spec's test the_core_is_three_cubed, which buildCourse evaluates. Three in-memory mutants of that count each fail the build. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…the hook Review of #1443 found two imprecise phrases. The ocp_mx recording shows only E4M3 among the MXFP8 formats, so the widget hook now says "MXFP8 E4M3 none". Lesson 33's task asked for "the format that flushes none", but two formats flush none on the worked block (E3M2 and E4M3); it now asks for both. The Russian bundle carries the same change. Pages and generated files are regenerated; the cards are unchanged. Refs #1440 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A bilingual post (EN body + RU ruBody) on the three new course lessons on the OCP Microscaling block: one byte of scale for 32 weights, what one outlier flushes to zero format by format (E2M1 23 of 31, E2M3 4, INT8 2, E3M2 0, E4M3 0), the mutant that fails exactly one of 49 tests, and a comparison with ten other places that teach MX, as their pages read on 6 October 2026. Every number has a receipt; what is not proven is listed in openQuestions, including that ocp_mx.t27 is still on an open PR. Closes #1444 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refs #1444 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Independent review of #1445 (reviewer bee, not the author) at head
|
| # | Check | Command / source | Result |
|---|---|---|---|
| 1 | Only prose and data changed | git diff --stat 1fc505d2c..9fb6fa7f8 (the #1443 head is an ancestor of this head) |
3 files, +330/-0: body.ts, index.ts, posts.ts (+1 import, +1 map entry). Pass |
| 2a | Recording numbers | decoded public/term/t27c-ocp-mx/session.cast + meta.json, public/term/t27c-e8m0/ |
49/49 pass. Mutant E5M2 bias 15->16 gives 48 pass / 1 FAIL (bias_puts_the_min_normal_at_two_to_one_minus_bias), and git restores the spec. 32.7 s. e8m0: 18/18 + 9 invariants, 19.9 s. Pass |
| 2b | Spec numbers | ocp_mx.t27 at t27 1a3786657 (same blob as the #6828 head 2ac62df75) |
Flushed 23/4/0/2/0, scales 2^-1/2^-1/2^-3/2^1/2^-7, L1 errors match the table's decimals exactly. Pass |
| 2c | Independent recompute | Python fractions, OCP 6.3 rule, RNE, saturating |
Reproduces every flush count, scale and L1 error. Pass |
| 2d | Mutants and compile errors | t27#6828 body | 11 mutants and 20 errors, as stated. Pass |
| 2e | Player 17/0/10 of 27 | public/play/e8m0/card.png, plus runSpec run locally on e8m0.t27 |
17 pass, 0 fail, 10 skip, all 10 not run: ExprCast. Pass |
| 2f | Course | specs/course/course.t27 |
33 lessons, 11 modules, lesson 29 "An honest scoreboard" measures a language model. Pass |
| 3 | EN = RU | body, summary, openQuestions, side by side | Same claims and numbers, and RU links go to /ru/learn/. Pass (the findings below apply to both) |
| 4 | Receipts | curl -sIL on every href, gh api state of every labelled PR/issue |
All external hrefs return 200, and the OCP PDF did not 403. The 4 t27.ai/learn/... lesson receipts return 404 until #1443 deploys, which is expected for a stacked PR. Each state label is true today (see F5) |
| 5 | Competitor rows | live pages, 6 of 10 rows | Grootendorst, gfloat, Sharma and sw23 are accurate. microxcaling understates (F9). The HF cells cite a page that is not in the receipts (F10) |
| 6 | openQuestions | read against the sources | Honest overall. #3 is wrong about capability (F8), and #7's count conflicts with the body (F7) |
| 7 | Types and tests | npx tsc --noEmit -p . in apps/website (node_modules symlinked, not committed); env -u LOG_LEVEL -u log_level node --test scripts/blog-cover-accessibility.test.mjs scripts/blog-cover-versions.test.mjs |
tsc rc=0. node --test: 12/12 pass. Pass |
| 8 | Work report | PR body JSON block | head_sha == 9fb6fa7f8461b77efcc15e892087b8612b8a9274. The claims match, except that they repeat F1 and F7 |
Findings
F1 (medium): the "of 31" denominator means two different things. BLOCK_A[14] is exactly 0. The "31 small weights" are therefore 30 non-zero weights plus one zero. The spec's "of 31" (ocp_mx.t27 L12, and the comment in small_weights_vanish_in_mxfp4) counts the 31 non-zero inputs, which are the 30 small ones plus the outlier. The counts 23/4/0/2/0 are right under either reading. The reader's denominator is not:
body.ts:12says "what one large weight does to the 31 small ones in its block: in MXFP4, 23 of them become zero". Suggested: "...to the other 31 weights in its block (30 non-zero and one exact zero): in MXFP4, 23 of the 30 non-zero ones become zero".body.ts:40says "31 weights between -0.17 and 0.17 and one outlier". Suggested: "31 weights between -0.17 and 0.17, one of them exactly zero, and one outlier". The next sentence already says "non-zero inputs", which is good.body.ts:44has the headerFlushed to zero (of 31). Suggested:Flushed to zero (of 31 non-zero inputs).body.ts:89has "counted: 23, 4, 0, 2 and 0 of 31". Suggested: "... of 31 non-zero inputs".- RU mirrors:
body.ts:142,:170,:174,:219. - Summaries:
index.ts:8and:53("23 of the 31 become zero"). Suggested: "23 of the 30 non-zero small ones become zero". - The PR body outline repeats the same wording.
F2 (low): body.ts:40 and :170 say "Every cell below is an assert in the spec". storage_is_8_25_6_25_4_25_bits_per_element (ocp_mx.t27 L603) asserts 825/825/625/425 for E4M3, INT8, E2M3 and E2M1. E3M2's 6.25 is not asserted. Either add assert centibits_per_element(K_E3M2) == 625; on t27#6828, or write "Every count, scale and error below is an assert in the spec".
F3 (low-medium, factual): body.ts:107 and :237 say "decodes all 256 codes of FP4 E2M1, FP6 E2M3 and E3M2, INT8, and OFP8...". FP4 has 16 codes and FP6 has 64. The spec's "all 256 codes" comment (L132) covers OFP8 only. The round trips walk every code of each kind up to KIND_TOP. Suggested: "It decodes every code of FP4 E2M1 (16), FP6 E2M3 and E3M2 (64 each), INT8, and OFP8 E4M3 and E5M2 (256 each), NaN and Inf included".
F4 (low): body.ts:107 and :237 say "Its 49 tests are exact vectors". Many of the 49 tests are structural properties, for example every_kind_increases_strictly, round_trip_*, and e4m3_span_is_between_17_and_18_binades. They are not input/output vectors a kernel can replay. Suggested: "Its 49 tests assert exact integers (codes, scales, counts, errors in units of 2^-24); the named code points and the five block-code tables can be run against a conversion in a kernel or in hardware".
F5 (medium): the state labels will be false on the live page. index.ts:17-20 label #1443, #1440, #1445 ("this post") and #1444 "· OPEN". All four are true today. The post can only go live after #1443 merges (which closes #1440) and #1445 merges (Closes #1444), so on the published page all four labels are wrong by construction. Drop the suffix for this post and its stack, as the terminal post did for its own #1366, or relabel them at merge time. External items (t27#6828, #6827, #6867, #1441) can keep the dated "· OPEN" convention. Merge order: the 4 t27.ai/learn/... receipts 404 until #1443 is deployed, so ship #1443 first.
F6 (low): body.ts:117 and :247 say "The recordings were made on its commit 1a3786657". Only the t27c-ocp-mx recording shows that commit. The t27c-e8m0 recording's git log shows d4417fe72. Suggested: "The ocp_mx recording was made on its commit 1a3786657".
F7 (low-medium): resource counts. body.ts:73 says "we read the pages of twelve other resources ... The table keeps ten of them", and RU body.ts:203 says the same. The table has 10 rows but 12 resources: DeepLearning.AI's two courses share a row, and so do OCP MX and arXiv:2310.10537. All 12 are in the table, and "keeps ten" suggests that two were dropped. index.ts:47 and :61 ("ten resources") and the PR body ("ten resources") inherit the problem. Suggested: "we read the pages of twelve other resources ... The table puts them in ten rows". If two other pages really were read and dropped, name them.
F8 (medium): openQuestions #3 makes a capability claim that the evaluator contradicts. index.ts:43 says "the browser cannot yet run ocp_mx.t27's tests", and :57 is the RU version. I ran the site's own evaluator on the file: loadCompiler(public/t27/t27_compiler.wasm) and then runSpec from public/play/t27run.js gave 49 pass / 0 fail / 0 skip. That matches the t27#6828 body. #1443 gives the real reason: ocp_mx.t27 is not vendored into the site yet. Suggested: "Lesson 33 is a recording, not a player: ocp_mx.t27 is not on the site yet, so the page does not run its tests (the site's evaluator passes all 49 when run on the file)". The second sentence, "because its evaluator has no casts", is also imprecise. t27run.js:166 handles cast(), @intCast, @floatCast and @as, and all 10 e8m0 skips are not run: ExprCast. Suggested: "because its evaluator does not handle the ExprCast conversion yet". body.ts:118 and :248 ("the page cannot yet run") are true of the page and need no change.
F9 (low, understated cell): the microxcaling row (body.ts:85, RU :215) says "yes: MXFP8, MXFP4, MXINT8, blocks of 32". Those are the three README examples. The library's mx/formats.py also defines fp6_e3m2, fp6_e2m3, int4 and int2. Suggested: "yes: MXFP8, MXFP6, MXFP4, MXINT8 (and INT4/INT2), blocks of 32", and the same in RU. The other cells are confirmed: mx/tests uses pytest, and "CUDA is required".
F10 (low): the HF row's sources (body.ts:81, RU :211). The receipt (index.ts:31) links only the docs page. That page says "blockwise scaling", does not give 32, and shows no benchmarks. "Blocks of 32" and the benchmarks come from the blog post it links, https://huggingface.co/blog/faster-transformers#mxfp4-quantization. Add that page as a receipt.
Rows confirmed live (no change):
- Grootendorst: no FP8, FP4 or MX; the outlier is shown, "all small values would get mapped to the same" code, and not counted.
- gfloat: OCP MX elements and block formats.
test/test_microxcaling.pycross-checks againsttorchao.prototype.mx_formats. - Sharma:
math.ceil(math.log2(max_abs / 6.0)). The full visualizer reads "Block size 16 values" and "one outlier costs every other value precision". - sw23: E8M0, MXINT8 and OCP FP4/FP6/FP8.
tests/oracle-vectors.jsonplus atest.ymlworkflow; shareable URL state.
I also checked the scale contrast in body.ts:102. With max 3.3, ceil(log2(3.3/6)) = 0, which gives 2^0, and floor(log2 3.3) - 2 = -1, which gives 2^-1. It is correct.
Summary of the required wording fixes
F1, F5, F7 and F8 are what make the published page say something false or misleading. F3 is a plain factual slip. F2, F4, F6, F9 and F10 are small precision fixes. None of them needs a code, spec or recording change, except optionally adding the E3M2 storage assert for F2.
…aims The reviewer found ten imprecise phrases; every number was right. - The block has 31 small weights, one of them exactly zero, so MXFP4 flushes 23 of the 30 non-zero ones; the table says "of 31 non-zero inputs". - FP4 has 16 codes and FP6 64, not 256; the spec decodes every code. - The 49 tests assert exact integers; the named codes and five block tables are what a kernel can be checked against. - Only the ocp_mx recording was made on t27 commit 1a3786657. - Twelve resources in ten rows; microxcaling lists MXFP6 and INT4/INT2; the Hugging Face MXFP4 blog post is now a receipt (27). - Lesson 33: the site's evaluator passes all 49 tests on ocp_mx.t27 (reproduced in node); the page does not run them because the file is not on the site yet. The e8m0 skips are named as ExprCast. - Our own PRs and issues drop the OPEN tag. Refs #1444 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review round 1 addressed in 7460c31. Every number stood; the ten phrases are fixed:
Checks on 7460c31: tsc rc 0; cover tests 12/12; EN/RU number multisets identical in body, summary and open questions; gitleaks clean; lefthook pre-commit and commit-msg pass; work report re-validated at the new head. 🤖 Generated with Claude Code |
Review (reviewer bee): not merged -- the status claims went stale during reviewReviewed head Blocking: t27#6828 merged while this PR was opengHashTag/t27#6828 was merged at 2026-10-06 16:21 UTC as
The numbers do not change. Checks run
Non-blocking nits
Once the status wording is fixed in both languages and 🤖 Generated with Claude Code |
ocp_mx.t27 was merged into t27 on 2026-10-06 as 322cc77d7 and t27#6827 was closed by it. The post still called the PR open and the issue open. The recording stays valid: ocp_mx.t27 at the branch commit 1a3786657 and at 322cc77d7 is byte-identical. The file is still not on the site, because the world scan that vendors t27 specs has been red since 2026-10-03; the open question now says that instead. Refs #1444 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
gHashTag
left a comment
There was a problem hiding this comment.
Reviewer bee, head 0d82a57. Not merging: one stale status claim is left.
Problem (EN and RU, same paragraph): the "For people who build MX" section still treats t27#6828 as open and unmerged:
body, section "For people who build MX", last sentence: "If one disagrees with your reading of the specification, we want that report: on t27#6828 while it is open, as an issue in gHashTag/t27 after it merges."ruBody, section "Тем, кто строит MX", last sentence: the same claim ("в t27#6828, пока он открыт, и отдельным issue в gHashTag/t27 после слияния").
t27#6828 was merged on 2026-10-06 as 322cc77d7, so both sentences should just point to a new issue in gHashTag/t27, e.g. "we want that report as an issue in gHashTag/t27." The status-update commit fixed the summary, the receipts, the open questions and the "What this does not show" list, but missed this paragraph.
Verified and correct (no change needed):
- headRefOid and the work report
head_shaboth equal 0d82a57; only the three blog files change. - t27#6828 MERGED 2026-10-06T16:21:00Z, merge commit 322cc77d7; t27#6827 CLOSED (completed) 2026-10-06.
specs/numeric/ocp_mx.t27blob is 44a37dd9 at both 1a3786657 and 322cc77d7 (byte-identical).apps/website/public/t27/files/specs/numeric/ocp_mx.t27is 404 on trinity main (not on the site yet).- t27 world scan: last success 2026-10-02 18:11 (workflow_dispatch), every scheduled run from 2026-10-03 to 2026-10-06 failed, so "red since 2026-10-03" holds.
- The spec at 322cc77d7 has 49 tests, the named test
bias_puts_the_min_normal_at_two_to_one_minus_bias, and asserts block_flushed 23 / 4 / 2 / 0 / 0 for E2M1 / E2M3 / INT8 / E3M2 / E4M3, matching the table. - Referenced assets exist on main: term/t27c-ocp-mx and term/t27c-e8m0 casts, learn/one-outlier, learn/one-scale-per-block, learn/scale-byte-native, ru/learn/one-outlier, play/e8m0. t27#6867 and trinity#1441 are OPEN, as labelled.
Checks: every required check on this head is QUEUED (none ran), so mergeStateStatus is BLOCKED. That is the Actions queue or billing, not a code verdict; it would still block the merge after the text fix.
X Brain Health CheckScore: 100.0/100 X Brain is above merge threshold |
🧪 Brain Stress Test ResultsTests: 261/261 passed, 0 leaked |
Closes #1444
#1443 is merged (squash
0e1a789d7): lessons 31-33 are on main. This branch tookorigin/mainby a merge (f5f50a800, no force push) and the base is nowmain; against main the PR changes only the three blog files below.What
A bilingual blog post,
one-outlier-twenty-three-zeros, on the course's new module 11, "AI numbers: the MX block":ocp_mx.t27.The terminal recording
term/t27c-ocp-mx/session.castis embedded, and every number has a receipt.Files (prose and data only)
apps/website/src/data/blog/bodies/one-outlier-twenty-three-zeros.ts:body(EN, 27 blocks) andruBody(RU, 27 blocks).apps/website/src/data/blog/index.ts: the post's metadata, 27 receipts, and 8 open questions in each language.apps/website/src/data/blog/posts.ts: one import line and one map entry.No code is added. The post has no cover yet; covers come from the static repo and are optional (#1366 shipped without one).
What is not proven (also in the post)
ocp_mx.t27was merged into t27 on 2026-10-06 (t27#6828,322cc77d7), but is not on the site: the world scan that vendors t27 specs has been red since 2026-10-03. The ocp_mx recording was made on the branch commit 1a3786657; the file is byte-identical at both commits.ocp_mx.t27is not on the site yet. The site's own evaluator passes all 49 of its tests when run on the file (reproduced in node).Review round 2 (360a18d)
The reviewer of 0d82a57 found one more sentence, in both languages, asking for reports "on t27#6828 while it is open". It now asks for an issue in gHashTag/t27. No text in the post calls t27#6828 open any more; tsc rc 0, the EN and RU numbers are still the same multiset.
Status update (0d82a57)
t27#6828 was merged on 2026-10-06 as
322cc77d7and closed t27#6827. The post called both open; it now says merged and closed, in English and Russian, in the body, the summary, the receipts and the open questions.ocp_mx.t27is byte-identical at the recorded commit 1a3786657 and at 322cc77d7, so the recording stands. Checked again:tsc --noEmitrc 0, the post still loads first of 87, and the numbers in the EN and RU body, summary and open questions are the same multiset.Review round 1 (7460c31)
The reviewer checked every number against the spec and the pages and found them right, and named ten imprecise phrases, all fixed: the denominator (the block's 31 small weights include one exact zero, so MXFP4 flushes 23 of the 30 non-zero ones), "all 256 codes" (FP4 has 16, FP6 64), what the 49 tests assert, which recording was made on 1a3786657, twelve resources in ten rows, microxcaling's MXFP6 and INT4/INT2, the Hugging Face MXFP4 blog post as receipt 27, the lesson 33 wording, and the OPEN tag on our own PRs and issues.
{ "version": 1, "head_sha": "360a18d0d3f5d4b9d40481845ceed8c869d9f56f", "summary": "A bilingual post on the t27 course's new MX module: how one outlier in a block of 32 flushes small weights to zero format by format, the one-test mutant that proves the spec checks itself, and a comparison with twelve other places that teach MX.", "changes": [ "apps/website/src/data/blog/bodies/one-outlier-twenty-three-zeros.ts: EN body and RU ruBody, 27 blocks each, with the t27c-ocp-mx terminal recording and two tables", "apps/website/src/data/blog/index.ts: post metadata first in postsIndex, 27 receipts with their state, 8 open questions in English and 8 in Russian", "apps/website/src/data/blog/posts.ts: the import and the map entry for the new body" ], "tests": [ { "command": "npx tsc --noEmit -p . (apps/website)", "result": "rc 0, no type errors, before and after the merge of main", "status": "passed", "evidence": "local run on 7460c31dc and on f5f50a800" }, { "command": "node --test scripts/blog-cover-accessibility.test.mjs scripts/blog-cover-versions.test.mjs", "result": "12 pass, 0 fail", "status": "passed", "evidence": "local node --test summary" }, { "command": "esbuild-bundle posts.ts and load the post by slug", "result": "the post is first of 87 published posts; ru carries title, summary, openQuestions and body", "status": "passed", "evidence": "/tmp/blog-load.mjs output" }, { "command": "compare the multiset of numbers in the EN and RU body, summary and openQuestions", "result": "identical in all three, so no number differs between the two languages", "status": "passed", "evidence": "local parity script output" }, { "command": "render #/blog/one-outlier-twenty-three-zeros in the Vite dev server, EN and RU", "result": "h1, eight sections, two tables (6 and 12 rows), both terminal recordings load (200), inline code renders, RU title and headings correct", "status": "passed", "evidence": "browser pane on 127.0.0.1:5234, screenshots taken" }, { "command": "gitleaks protect --staged", "result": "no leaks found in about 41 KB", "status": "passed", "evidence": "local gitleaks run before the commit" }, { "command": "lefthook pre-commit and commit-msg (explorer and queen language contracts, english-only)", "result": "all three hooks pass on every commit", "status": "passed", "evidence": "hook output on commits 61912986d and 7460c31dc and on the merge f5f50a800" }, { "command": "run ocp_mx.t27 through the site's own wasm compiler and public/play/t27run.js runSpec in node", "result": "49 pass, 0 fail, 0 skip; e8m0.t27 gives 17 pass, 0 fail, 10 skip (ExprCast), as lesson 31 shows", "status": "passed", "evidence": "/tmp/ocpmx-eval/run.mjs output" } ], "limitations": [ "The numbers come from one block of 31 small weights and one outlier, chosen to show the flush; there is no model and no accuracy measurement", "ocp_mx.t27 is merged into t27 (gHashTag/t27#6828, 322cc77d7) but not yet on the site, because the world scan that vendors t27 specs has been red since 2026-10-03; the ocp_mx recording was made on the byte-identical branch commit 1a3786657", "The competitor comparison is twelve resources in ten rows as their pages read on 6 October 2026, not a complete survey", "The post has no cover image yet" ], "tags": [ "t27", "OCPMX", "blog", "NumberFormats" ], "blog": { "title": "One outlier, 23 zeros: a course module on the OCP MX block", "summary": "A post on the course's MX module: one outlier in a block of 32 flushes 23 of 30 non-zero small weights to zero in MXFP4, and a spec with 49 tests catches a one-digit change in an exponent bias.", "cast": "term/t27c-ocp-mx/session.cast", "outline": [ "The t27 course grew to 33 lessons, and its new eleventh module teaches the shared-scale number formats that AI chips use for weights.", "An OCP MX block holds 32 small elements and one E8M0 scale byte, which is a pure power of two with bias 127 and no mantissa.", "One outlier of 3.3 sets the scale for the whole block, so MXFP4 E2M1 flushes 23 of the 30 non-zero small weights to exactly zero.", "The same block loses 4 weights in MXFP6 E2M3 and 2 in MXINT8, and none at all in MXFP6 E3M2 or MXFP8 E4M3.", "Changing the E5M2 exponent bias from 15 to 16 fails exactly one of the 49 tests, so the spec notices a one-digit mistake in itself.", "Twelve other resources that teach MX were compared in ten rows as their pages read on 6 October 2026, and none of them counts the zeros element by element.", "The post lists what it does not show: one chosen block, no model, no accuracy number, and a spec that is merged into t27 but not yet on the site." ] } }🤖 Generated with Claude Code