Skip to content

v0.31.4.1 chore: align VERSION + package.json with #795 + mandate 4-segment versions#815

Merged
garrytan merged 4 commits into
masterfrom
garrytan/indianapolis-v3
May 10, 2026
Merged

v0.31.4.1 chore: align VERSION + package.json with #795 + mandate 4-segment versions#815
garrytan merged 4 commits into
masterfrom
garrytan/indianapolis-v3

Conversation

@garrytan

@garrytan garrytan commented May 10, 2026

Copy link
Copy Markdown
Owner

Summary

Quick fix to reconcile master's metadata with what shipped in #795.

PR #795 (takes v2) landed on master with v0.31.4 in its commit subject but never actually bumped VERSION, package.json, or CHANGELOG.md. Master had been sitting at 0.31.3 even though the takes-v2 work was already merged.

What changed:

  • VERSION + package.json0.31.4.1 (the dot-suffix follow-up channel, so the patch number doesn't churn to 0.31.5)
  • CHANGELOG.md → new top entry covering takes v2 (lessons from the first 100K-take production extraction, holder grammar enforcement, weight rounding, the new gbrain eval takes-quality CLI, and the gbrain auth Postgres regression fix)
  • CLAUDE.md → mandates MAJOR.MINOR.PATCH.MICRO for every new release. Historical 3-segment versions stay valid in git log and skills/migrations/v0.21.0.md-style filenames. Going forward only.

Why 4-segment versioning

Three reasons:

  1. Dot-suffix follow-ups. When a release ships its commit subject ahead of its VERSION bump (this PR's exact failure mode), the corrective ship lands as 0.31.4.1 rather than churning the patch number to 0.31.5. Cleaner audit trail.
  2. Maturity signal. gbrain has 31 minor releases of history and a healthy fix-wave cadence. The .MICRO slot gives community PR waves and corrective ships their own channel without polluting .PATCH.
  3. Existing precedent. 0.31.1.1-fixwave already 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 verify passed (typecheck + 4 pre-checks, exit 0).

TODOS

No TODO items completed in this PR.

Test plan

  • bun run verify passes (typecheck clean, all 4 pre-checks pass)
  • cat VERSION and node -e 'console.log(require("./package.json").version)' both report 0.31.4.1
  • gbrain --version (after bun build --compile) reads the bundled package.json and reports 0.31.4.1
  • Reviewer sanity-checks the CHANGELOG entry voice and the CLAUDE.md mandate language

🤖 Generated with Claude Code


View in Codesmith
Need help on this PR? Tag @codesmith with what you need.

  • Let Codesmith autofix CI failures and bot reviews

garrytan and others added 4 commits May 10, 2026 10:52
….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 garrytan merged commit 943e7b9 into master May 10, 2026
7 checks passed
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant