From abd19d7d71a7b53700f53cf4cc2be674be39367d Mon Sep 17 00:00:00 2001 From: Garry Tan Date: Sun, 26 Apr 2026 15:05:51 -0700 Subject: [PATCH] =?UTF-8?q?v1.17.0.0:=20rebump=20again=20=E2=80=94=20bump-?= =?UTF-8?q?detection=20now=20classifies=20branch=20as=20MINOR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI's version-stale check (job 73106360896) failed: PR #1234 claims v1.16.1.0 but the queue moved to v1.17.0.0. Root cause: bumping 1.15.1.0 → 1.16.1.0 to dodge the prior collision turned the branch's diff classification from PATCH (1.15.0 → 1.15.1) into MINOR (1.15.0 → 1.16.x). detect-bump.ts now sees MINOR, gstack-next-version walks the MINOR lane past #1233's v1.16.0.0 claim, and the next free slot is v1.17.0.0. Honestly accurate per CLAUDE.md scale-aware bumps: this branch IS a MINOR ("substantial new capability shipped — skill, harness, command, big refactor"). The new helper + migration + integration totals ~1200 lines added across 11 files with 26 new tests. PATCH was always the wrong honest classification; the queue collision forced the right answer. Files updated: - VERSION 1.16.1.0 → 1.17.0.0 - package.json 1.16.1.0 → 1.17.0.0 - CHANGELOG.md heading + After column 1.16.1.0 → 1.17.0.0 - CHANGELOG removal targets 1.17.0.0 → 1.18.0.0 - gstack-upgrade/migrations/v1.16.1.0.sh → renamed v1.17.0.0.sh + log prefix - bin/gstack-brain-consumer "DEPRECATED in" + "removal in" 1.16.1.0/1.17.0.0 → 1.17.0.0/1.18.0.0 - bin/gstack-brain-uninstall "since vX.Y.Z.W" 1.16.1.0 → 1.17.0.0 - test/gstack-upgrade-migration-v1_16_1_0.test.ts → renamed v1_17_0_0.test.ts 26/26 tests still pass. No behavior change. Co-Authored-By: Claude Opus 4.7 (1M context) --- CHANGELOG.md | 10 +++++----- VERSION | 2 +- bin/gstack-brain-consumer | 4 ++-- bin/gstack-brain-uninstall | 2 +- .../migrations/{v1.16.1.0.sh => v1.17.0.0.sh} | 12 ++++++------ package.json | 2 +- ...ts => gstack-upgrade-migration-v1_17_0_0.test.ts} | 6 +++--- 7 files changed, 19 insertions(+), 19 deletions(-) rename gstack-upgrade/migrations/{v1.16.1.0.sh => v1.17.0.0.sh} (82%) rename test/{gstack-upgrade-migration-v1_16_1_0.test.ts => gstack-upgrade-migration-v1_17_0_0.test.ts} (97%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82e85b03..d329f5ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [1.16.1.0] - 2026-04-26 +## [1.17.0.0] - 2026-04-26 ## **Your gstack memory now actually lives in gbrain.** @@ -27,7 +27,7 @@ The helper locks the database URL at startup (precedence: `--database-url` flag `/setup-gbrain` Step 7 now invokes the helper with `--strict` after `gstack-brain-init`. `/gstack-upgrade` invokes the helper without `--strict` via `gstack-upgrade/migrations/v1.12.3.0.sh` so missing/old gbrain is a benign skip during batch upgrade. `bin/gstack-brain-restore` invokes the helper after the initial clone so a 2nd Mac gets the wireup automatically. `bin/gstack-brain-uninstall` invokes `--uninstall` plus removes legacy `consumers.json`. -`bin/gstack-brain-init` drops 60 lines of dead consumer-registration code (the HTTP POST block, the `consumers.json` writer, the chore commit). `bin/gstack-brain-restore` drops the 18-line `consumers.json` token-rehydration block (the only consumer that used it never had real tokens). `bin/gstack-brain-consumer` is marked deprecated in its header docstring; removal in v1.17.0.0 after one cycle of grace. +`bin/gstack-brain-init` drops 60 lines of dead consumer-registration code (the HTTP POST block, the `consumers.json` writer, the chore commit). `bin/gstack-brain-restore` drops the 18-line `consumers.json` token-rehydration block (the only consumer that used it never had real tokens). `bin/gstack-brain-consumer` is marked deprecated in its header docstring; removal in v1.18.0.0 after one cycle of grace. `test/gstack-gbrain-source-wireup.test.ts` is new: 13 unit tests with a fake `gbrain` binary on `$PATH` covering fresh-state registration, idempotent re-runs, drift recovery (gbrain has no `sources update`, only `remove + add`), `--strict` failure modes, source-id fallback chain (`.git` → remote-file → flag), `--probe` non-mutation, sync errors, and `--uninstall`. @@ -35,7 +35,7 @@ The helper locks the database URL at startup (precedence: `--database-url` flag These are reproducible on any machine after upgrade. Run the verify commands above to see your own delta. -| Metric | Before (v1.16.0.0) | After (v1.16.1.0) | +| Metric | Before (v1.16.0.0) | After (v1.17.0.0) | |---|---|---| | `gbrain sources list` size | 1 (default `/data/brain`) | 2 (default + `gstack-brain-{user}`) | | `consumers.json` status | `"pending"`, ingest_url `""` | file deleted from new installs | @@ -51,8 +51,8 @@ Your gstack memory is searchable now. Run a CEO plan review or office-hours sess ### For contributors -- `bin/gstack-brain-consumer` is deprecated in this release; removal in v1.17.0.0. -- The `gbrain_url` and `gbrain_token` config keys are now no-ops. They remain readable for one cycle for back-compat, removed in v1.17.0.0. +- `bin/gstack-brain-consumer` is deprecated in this release; removal in v1.18.0.0. +- The `gbrain_url` and `gbrain_token` config keys are now no-ops. They remain readable for one cycle for back-compat, removed in v1.18.0.0. - Three pre-existing test failures on this branch (`gstack-config gbrain keys > GSTACK_HOME overrides real config dir`, `no compiled binaries in git > git tracks no files larger than 2MB`, `Opus 4.7 overlay — pacing directive`) were verified to fail on the base branch too. Out of scope for this PR; flagged for a follow-up. ## [1.15.0.0] - 2026-04-26 diff --git a/VERSION b/VERSION index 6f8d0338..706a8a06 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.16.1.0 +1.17.0.0 diff --git a/bin/gstack-brain-consumer b/bin/gstack-brain-consumer index 4f9ca673..12403ae5 100755 --- a/bin/gstack-brain-consumer +++ b/bin/gstack-brain-consumer @@ -1,10 +1,10 @@ #!/usr/bin/env bash # gstack-brain-consumer — manage the consumer (reader) registry. # -# DEPRECATED in v1.16.1.0. This binary targets a gbrain HTTP /ingest-repo +# DEPRECATED in v1.17.0.0. This binary targets a gbrain HTTP /ingest-repo # endpoint that never shipped on the gbrain side. Live federation now uses # `gbrain sources` directly via bin/gstack-gbrain-source-wireup. This file -# stays for one cycle to avoid breaking external scripts; removal in v1.17.0.0. +# stays for one cycle to avoid breaking external scripts; removal in v1.18.0.0. # # Consumer = a reader that ingests the gstack-brain git repo as a source of # session memory. v1 primary consumer is GBrain; later versions can register diff --git a/bin/gstack-brain-uninstall b/bin/gstack-brain-uninstall index c316914c..c8ce1119 100755 --- a/bin/gstack-brain-uninstall +++ b/bin/gstack-brain-uninstall @@ -129,7 +129,7 @@ if [ -x "$WIREUP_BIN" ]; then "$WIREUP_BIN" --uninstall 2>/dev/null || true fi -# ---- legacy consumers.json (no longer written by gstack-brain-init since v1.16.1.0) ---- +# ---- legacy consumers.json (no longer written by gstack-brain-init since v1.17.0.0) ---- rm -f "$GSTACK_HOME/consumers.json" 2>/dev/null || true # ---- clear config keys ---- diff --git a/gstack-upgrade/migrations/v1.16.1.0.sh b/gstack-upgrade/migrations/v1.17.0.0.sh similarity index 82% rename from gstack-upgrade/migrations/v1.16.1.0.sh rename to gstack-upgrade/migrations/v1.17.0.0.sh index c780b6f9..5b8f1dd9 100755 --- a/gstack-upgrade/migrations/v1.16.1.0.sh +++ b/gstack-upgrade/migrations/v1.17.0.0.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash -# Migration: v1.16.1.0 — Wire existing brain-sync repos as gbrain federated sources +# Migration: v1.17.0.0 — Wire existing brain-sync repos as gbrain federated sources # -# Pre-1.16.1.0 /setup-gbrain wrote ~/.gstack/consumers.json with a placeholder +# Pre-1.17.0.0 /setup-gbrain wrote ~/.gstack/consumers.json with a placeholder # `status: "pending"` and an empty `ingest_url`, expecting a gbrain HTTP # /ingest-repo endpoint that never shipped. This migration runs the real # wireup (gbrain sources add + worktree + initial sync) for users who @@ -17,7 +17,7 @@ set -euo pipefail if [ -z "${HOME:-}" ]; then - echo " [v1.16.1.0] HOME is unset or empty — skipping migration." >&2 + echo " [v1.17.0.0] HOME is unset or empty — skipping migration." >&2 exit 0 fi @@ -44,13 +44,13 @@ fi # Skip if helper missing (defensive — should always be present post-upgrade). if [ ! -x "$WIREUP_BIN" ]; then - echo " [v1.16.1.0] $WIREUP_BIN missing or non-executable — skipping wireup." >&2 + echo " [v1.17.0.0] $WIREUP_BIN missing or non-executable — skipping wireup." >&2 exit 0 fi -echo " [v1.16.1.0] Wiring brain-sync repo into gbrain (federated source + initial sync)..." +echo " [v1.17.0.0] Wiring brain-sync repo into gbrain (federated source + initial sync)..." # No --strict: missing/old gbrain is a benign skip during a batch upgrade. "$WIREUP_BIN" || { - echo " [v1.16.1.0] Wireup exited non-zero — re-run manually with: $WIREUP_BIN" >&2 + echo " [v1.17.0.0] Wireup exited non-zero — re-run manually with: $WIREUP_BIN" >&2 } diff --git a/package.json b/package.json index 30a74feb..5326f311 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gstack", - "version": "1.16.1.0", + "version": "1.17.0.0", "description": "Garry's Stack — Claude Code skills + fast headless browser. One repo, one install, entire AI engineering workflow.", "license": "MIT", "type": "module", diff --git a/test/gstack-upgrade-migration-v1_16_1_0.test.ts b/test/gstack-upgrade-migration-v1_17_0_0.test.ts similarity index 97% rename from test/gstack-upgrade-migration-v1_16_1_0.test.ts rename to test/gstack-upgrade-migration-v1_17_0_0.test.ts index edf9e118..e1d20a95 100644 --- a/test/gstack-upgrade-migration-v1_16_1_0.test.ts +++ b/test/gstack-upgrade-migration-v1_17_0_0.test.ts @@ -1,5 +1,5 @@ /** - * gstack-upgrade/migrations/v1.16.1.0.sh — migration script unit tests. + * gstack-upgrade/migrations/v1.17.0.0.sh — migration script unit tests. * * The migration runs on /gstack-upgrade for users with brain-sync configured but * never wired up to gbrain. It has 4 skip conditions and one happy path. @@ -16,7 +16,7 @@ import * as path from 'path'; import { spawnSync } from 'child_process'; const ROOT = path.resolve(import.meta.dir, '..'); -const MIGRATION = path.join(ROOT, 'gstack-upgrade', 'migrations', 'v1.16.1.0.sh'); +const MIGRATION = path.join(ROOT, 'gstack-upgrade', 'migrations', 'v1.17.0.0.sh'); let tmpHome: string; let fakeBinDir: string; @@ -85,7 +85,7 @@ afterEach(() => { } catch {} }); -describe('migrations/v1.16.1.0.sh', () => { +describe('migrations/v1.17.0.0.sh', () => { test('HOME unset: prints message + exit 0 (defensive)', () => { // Override HOME to empty string. Bash's [ -z "${HOME:-}" ] guard should fire. const r = run({ env: { HOME: '' } });