release: cut v0.33.0 — the silent-wrong-answer release#703
Conversation
Two threads. The first is a sweep of the highest-yield failure class: a plausible-but-wrong value returned at rc=0, where nothing warns and nothing crashes. regex_match deleted every capture after a non-participating group (#629); json_decode truncated long number tokens and parsed a wrong-magnitude prefix, off by 50 orders of magnitude (#628); four stdlib math functions returned confidently wrong numbers (#638-#641); a module's top-level assignment rebound its IMPORTER's global instead of creating module state (#673); a comprehension variable and a same-named local split into two bindings, so program text after a statement changed that statement's result (#633/#642); and the observer indicted itself twice — report_value called a converging sequence diverging (#674), while the learning-rate gate measured 100% "stable" across 2,597 steps with the loss demonstrably still falling. The second is the primitive layer, every item requested by a consumer that had hit the wall rather than speculated: four DEFLATE codecs behind `make zlib` (#684 — .xlsx and .gz readable from script), a tape-captured clock_unix (#683), and four C-backed list operations (#543/#544). Plus `kill -USR1` live observer dumps (#660) and a test runner that no longer trusts its own binary, liveness, or arithmetic (#681/#648/#654 — its hand-synced tallies were under-reporting by 169 asserts). Carries the sites the cut ritual needs: VERSION, the CHANGELOG section retitled from [Unreleased] (with the ~20 landed changes that never got an entry written in — the drift this cut found), the docs/llms.txt version stamp, CLAUDE.md's "Latest release" line, and the ROADMAP sync. doc_drift_check rules 1/3/4/5 pass; rule 2 fires locally until the tag exists, which is the expected pre-tag state (CI's depth-1 clone has no tags, so the guard skips there — verified empirically at the v0.32.0 cut). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
⚠️ Not ready to approve
CHANGELOG.md no longer has an [Unreleased] section while CLAUDE.md still points readers to it, leaving the docs internally inconsistent.
Pull request overview
Cuts the v0.33.0 release by bumping version stamps across the repo and promoting the filled-out release notes into the changelog, aligning roadmap and contributor/docs pointers with the new tag.
Changes:
- Bump release/version markers to 0.33.0 (
VERSION,ROADMAP.md,docs/llms.txt,CLAUDE.md). - Promote and expand release notes into
CHANGELOG.mdunder [0.33.0] - 2026-07-24. - Update roadmap “recently shipped” range and add a 0.33.0 summary entry.
File summaries
| File | Description |
|---|---|
VERSION |
Updates the project version to 0.33.0. |
ROADMAP.md |
Updates current version and adds a 0.33.0 “recently shipped” summary. |
docs/llms.txt |
Updates the LLM reference doc’s version stamp to v0.33.0. |
CLAUDE.md |
Updates the “Latest release” line to v0.33.0 with the new release summary. |
CHANGELOG.md |
Adds the v0.33.0 release entry and detailed notes (currently displaces the [Unreleased] section). |
Review details
- Files reviewed: 5/5 changed files
- Comments generated: 1
- Review effort level: Low
Note
Your feedback helps us improve the quality of this feature.
Please use 👍 or 👎 to tell us whether this assessment is correct.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| ## [0.33.0] - 2026-07-24 | ||
|
|
…bytecode producers The original fix said 'no opcode number or on-disk format changed' — true, and the wrong frame: the operand WIDTH is the bytecode ABI for anything that builds a chunk and hands it to vm_run_bytecode. The pre-bump consumer sweep found ouroboros producing empty output for every behavioral-parity program (bootstrap fixed point still green — it compares bytes, it does not execute) and iLambdaAi's grading ladder unable to award its top grade, both silently at rc=0. Also flags #629's regex_match change, which is observable to anyone who consumed the truncated shape (EigenRegex's compat shim mirrored it on purpose). Gate for the class filed as #704. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
⚠️ Not ready to approve
CHANGELOG.md removed the [Unreleased] section while CLAUDE.md still references it, leaving the docs internally inconsistent and removing the intended landing spot for future entries.
Review details
Comments suppressed due to low confidence (1)
CHANGELOG.md:6
- The changelog no longer has an
[Unreleased]section, butCLAUDE.mdstill points readers toCHANGELOG.md [Unreleased]for work onmain. Reintroduce an[Unreleased]header above the new release section so future entries have a consistent landing spot and the cross-reference remains correct.
## [0.33.0] - 2026-07-24
- Files reviewed: 5/5 changed files
- Comments generated: 0 new
- Review effort level: Low
Note
Your feedback helps us improve the quality of this feature.
Please use 👍 or 👎 to tell us whether this assessment is correct.
…704) The canary for vm_run_bytecode already existed and is thorough — 34 checks covering opcodes, the verifier, the sandbox, and #348 — but it emitted no OP_LINE at all. So when #630 widened that operand from 16 to 32 bits, nothing here failed, and the break surfaced only at the next consumer bump: ouroboros producing empty output for all 44 parity programs, iLambdaAi's grading ladder unable to award its top rung, both at rc=0 with no error. Four checks close the hole: - a well-formed 4-byte OP_LINE keeps the stream aligned (2 + 3 == 5) - the pre-#630 3-byte shape must NOT still evaluate to 5 — whatever it does (verifier rejection or misaligned garbage), it is no longer the producer's intended arithmetic - a line number past 65535 survives the operand, which is the regime #630 exists for - a truncated operand is rejected rather than read off the end Validated red-then-green rather than assumed: against a v0.32.0 worktree build the first two fail ("expected 5, got null"); against main they pass 34/34. So this file now fails in the SAME PR as any future opcode-number or operand-width change, instead of at bump time in someone else's repo. The header comment said "16-bit operands are little-endian", which #630 made false; it now states the exception and names this file as the ABI contract for external producers. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
⚠️ Not ready to approve
CHANGELOG.md no longer has an [Unreleased] section, which conflicts with existing repo guidance and makes post-release tracking ambiguous.
Review details
Comments suppressed due to low confidence (1)
CHANGELOG.md:5
- CHANGELOG.md no longer contains an "[Unreleased]" section (it starts directly at 0.33.0). The repo guidance in CLAUDE.md points readers at CHANGELOG.md
[Unreleased], and removing it also makes it harder to track post-release work without immediately editing past release notes.
## [0.33.0] - 2026-07-24
- Files reviewed: 6/6 changed files
- Comments generated: 0 new
- Review effort level: Low
Note
Your feedback helps us improve the quality of this feature.
Please use 👍 or 👎 to tell us whether this assessment is correct.
Cuts v0.33.0: 51 commits since v0.32.0 (2026-07-16).
Why now
The app fleet has outrun the release.
eigen-sheet's shippedTODAY()/NOW()and
from_xlsxdepend onclock_unix(#683) and the DEFLATE codecs (#684),neither of which exists in v0.32.0 — so it and
eigen-editclone EigenScriptmainunpinned in CI, by necessity rather than sloppiness. Cutting thisrelease is what lets them pin.
What's in it
The silent-wrong-answer sweep — the plausible-but-wrong-at-rc=0 class,
where nothing warns and nothing crashes:
regex_matchdeleted every capture after a non-participating group, anddropped groups past 15 (regex_match drops every capture after a non-participating group, and hard-caps at 15 groups #629)
json_decodetruncated long number tokens at 63 chars and parsed awrong-magnitude prefix —
1.<60 zeros>e50decoded to1(json_decode silently truncates long numbers to a wrong magnitude (padded 1e50 decodes to 1) #628)Punnett square,
power_iterationreturning |lambda|,correlationcenteringon full-list means, and a negative
time_of_flight(lib/stats: correlation pairs min(len) elements but centers them on FULL-list means #638-lib: two degenerate-input contracts return a plausible-but-wrong number (factorial of a negative; time_of_flight's "positive root") #641)(fix(import): isolate module top-level bare assignments in module scope (fixes #589) #673)
program text after a statement changed that statement's result (BLOCKER: a comprehension var / catch name creates a SECOND live binding — adding a never-called lambda later in the body changes an earlier line's output #633/BLOCKER: a comprehension whose loop var shadows a local computes garbage — [i * 2 for i in [1,2,3]] yields [-2,-2,-2] #642)
pad_left/pad_righthung forever on an empty pad char (lib/string: pad_left / pad_right hang forever when the pad character is an empty string #637)report_valuecalled a convergingsequence
diverging(observer: report_value classifies monotone CONVERGENCE as 'diverging' (rate > ~0.87) #674), and the LR gate measured 100% "stable" across2,597 steps while the loss was still falling
The primitive layer — each one requested by a consumer that hit the wall:
four DEFLATE codecs behind
make zlib(#684), tape-capturedclock_unix(#683), and four C-backed list operations (#543/#544).
Instruments:
kill -USR1live observer dumps (#660), and a test runnerthat no longer trusts its own binary (mid-run rebuild detection #681), its own
liveness (runaway guards #648/#616/#651/#656), or its own arithmetic (derived
tallies #654 — the hand-synced literals were under-reporting by 169 asserts).
CHANGELOG drift found and fixed
[Unreleased]documented ~15 items while ~20 landed changes had no entry atall — including every builtin above. Rather than ship a release that
under-reports itself, the missing entries are written in from the commit
bodies. That is most of this diff.
Cut ritual sites
VERSION, the[Unreleased]->[0.33.0]retitle + backfill, thedocs/llms.txtversion stamp,CLAUDE.md's "Latest release" line, and theROADMAP.mdsync.Verification
(
CLAUDE.md 'Latest release' line is not v0.32.0) — the expected pre-tagstate. Tagging
v0.33.0locally and re-runningtools/doc_drift_check.shexits 0 (tag deleted afterward), which is the release build's shape.
CI's depth-1 clone has no tags, so the guard skips there.
.mdfiles (VERSION), so the ci: a docs-only fast lane — stop proving a paragraph didn't break ASan #643 docs-only fastlane does not engage — the full ASan/UBSan leg runs on this PR.
Closes #697 was landed separately in #700.
🤖 Generated with Claude Code