v0.31.4.1 chore: align VERSION + package.json with #795 + mandate 4-segment versions#815
Merged
Conversation
….MINOR.PATCH.MICRO PR #795 (takes v2) landed on master with `v0.31.4` in its commit subject but never bumped VERSION, package.json, or CHANGELOG.md. Master shipped at 0.31.3. This corrective release: - Bumps VERSION + package.json to 0.31.4.1 (the dot-suffix follow-up channel documented in CLAUDE.md, so the patch number doesn't churn to 0.31.5) - Adds the v0.31.4.1 CHANGELOG entry covering takes v2 (lessons from a 100K-take production extraction), the auth-on-Postgres regression fix, and the new `gbrain eval takes-quality` CLI surface - Updates CLAUDE.md to mandate `MAJOR.MINOR.PATCH.MICRO` for every new release. Historical 3-segment versions in git log + migration filenames stay valid; do not rewrite. Going forward only. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The build-llms regen-drift guard caught that llms-full.txt was stale relative to the CHANGELOG + CLAUDE.md edits in the prior commit. Per CLAUDE.md the bundle is auto-derived: bump VERSION/CHANGELOG/CLAUDE.md, then run `bun run build:llms`. Did the second part now. llms.txt unchanged (it's just the curated index). Only llms-full.txt picks up the v0.31.4.1 CHANGELOG entry and the new "Version format is mandatory" section in CLAUDE.md. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Root cause of test (2) failing on the v0.31.4.1 PR (and on master since #795 landed): CI's scripts/test-shard.sh hashed every test file into 4 shards via FNV-1a, INCLUDING *.serial.test.ts files. Serial files share file-wide state (top-level mock.module, module singletons) that's supposed to be quarantined by the .serial.test.ts naming + local run-serial-tests.sh running them at --max-concurrency=1. In CI the quarantine didn't apply. eval-takes-quality-runner.serial.test.ts (new in #795) hashes into shard 2, where it calls: mock.module('../src/core/ai/gateway.ts', () => ({ chat: async (opts) => { ... }, configureGateway: () => undefined, })); That replaces every export of gateway.ts at module-load time for the WHOLE shard process. voyage-multimodal.test.ts also lives in shard 2 (both files happen to hash there), and it imports `embedMultimodal` from gateway.ts. After the serial file loads, `embedMultimodal` is undefined inside the shard process, and all 18 of voyage-multimodal's embedMultimodal tests fail. Tests still passed locally because run-unit-shard.sh excludes .serial files from its parallel pass. Fix: - scripts/test-shard.sh: add `-not -name '*.serial.test.ts'` to the find expression so serial files no longer compete for shard buckets. Add --dry-run-list flag to mirror run-unit-shard.sh's interface so the regression test can introspect without spawning bun test. - .github/workflows/test.yml: add a `bun run test:serial` step that runs on shard 1 (which already runs `bun run verify`). Uses the existing scripts/run-serial-tests.sh which invokes bun test at --max-concurrency=1, matching local behavior. - test/scripts/test-shard.slow.test.ts: 4 regression cases that pin the contract (no serial files in any shard, no e2e files in any shard, plain files partitioned without overlap). .slow.test.ts because it shells out 4× with pure-bash FNV-1a hashing (~14s wallclock); excluded from the local fast loop, runs in CI via the same hash bucketing as other slow tests. - CLAUDE.md: update the CI vs local divergence section so this intentional asymmetry is documented going forward. Build-llms drift in test (1) was fixed in the prior commit (c99a4af). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The prior commit updated the "CI vs local: intentionally divergent file sets" section in CLAUDE.md, which drifted llms-full.txt. Per CLAUDE.md the bundle is auto-derived: edit CLAUDE.md, then run `bun run build:llms`. Did the second part now. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
garrytan
added a commit
that referenced
this pull request
May 10, 2026
Brings v0.31.4.1 (#815: VERSION/package.json alignment + 4-segment version mandate) and v0.31.6 (#796: extract facts during sync, real-time hot memory) into the wave assembly. Conflicts resolved: 1. VERSION + package.json — kept 0.31.7 (highest semver wins). 2. scripts/test-shard.sh — took master's version. v0.31.4.1 (#815) independently shipped the same .serial.test.ts exclusion fix I added in 45c4004, plus a richer --dry-run-list flag this branch didn't have. Master's shape supersedes mine. 3. .github/workflows/test.yml — took master's version. Master added the serial-test step inside shard 1 with `if: matrix.shard == 1` guarding it; mine added it as a sibling `test-serial` job. Master's shape uses one less runner and is now the canonical pattern. 4. CHANGELOG.md — kept v0.31.7 entry on top, layered v0.31.4.1 below it followed by v0.31.3 (chronology preserved). Master never wrote a v0.31.6 entry; the v0.31.6 commit reused the v0.31.4.1 section. 5. test/doctor.test.ts — auto-merged cleanly. v0.31.6's `facts_extraction_health` test (line 110+) lives alongside this wave's IRON-RULE graph_coverage hint test. 6. test/scripts/test-shard.test.ts (mine, deleted) — superseded by master's test/scripts/test-shard.slow.test.ts which ships a more thorough regression suite that actually drives `--dry-run-list` to verify the exclusion against real shard buckets. 7. scripts/check-test-isolation.allowlist — added test/migration-orchestrator-v0_31_0.test.ts. Master's v0.31.6 shipped this file with R1 process.env mutation in beforeEach/ afterEach but didn't allowlist it; the file follows the existing try/finally restore pattern (functionally correct, just doesn't use withEnv()). Allowlisting per the linter's own help text for baseline files; sweep candidate for a future env-pattern PR. Verified post-merge: - typecheck clean - bun run verify clean - bun run check:test-isolation clean - 102/0 fail across resolver/doctor/repo-root/check-resolvable surfaces - live gbrain check-resolvable: 39/39 reachable, ok=true
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Quick fix to reconcile master's metadata with what shipped in #795.
PR #795 (takes v2) landed on master with
v0.31.4in its commit subject but never actually bumpedVERSION,package.json, orCHANGELOG.md. Master had been sitting at0.31.3even though the takes-v2 work was already merged.What changed:
VERSION+package.json→0.31.4.1(the dot-suffix follow-up channel, so the patch number doesn't churn to0.31.5)CHANGELOG.md→ new top entry covering takes v2 (lessons from the first 100K-take production extraction, holder grammar enforcement, weight rounding, the newgbrain eval takes-qualityCLI, and thegbrain authPostgres regression fix)CLAUDE.md→ mandatesMAJOR.MINOR.PATCH.MICROfor every new release. Historical 3-segment versions stay valid in git log andskills/migrations/v0.21.0.md-style filenames. Going forward only.Why 4-segment versioning
Three reasons:
0.31.4.1rather than churning the patch number to0.31.5. Cleaner audit trail..MICROslot gives community PR waves and corrective ships their own channel without polluting.PATCH.0.31.1.1-fixwavealready shipped with a 4-segment version + suffix. CLAUDE.md just makes the existing-but-undocumented practice mandatory and removes the ambiguous "4-digit" wording (which had paired with a 3-segment example).Pre-Landing Review
Doc-only diff (4 files, 115 insertions / 7 deletions). No code paths to audit, no plan file, no prompt files for evals, no frontend changes. Skipped the heavy review machinery accordingly.
bun run verifypassed (typecheck + 4 pre-checks, exit 0).TODOS
No TODO items completed in this PR.
Test plan
bun run verifypasses (typecheck clean, all 4 pre-checks pass)cat VERSIONandnode -e 'console.log(require("./package.json").version)'both report0.31.4.1gbrain --version(afterbun build --compile) reads the bundledpackage.jsonand reports0.31.4.1🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmithwith what you need.