v1.17.0.0: rebump again — bump-detection now classifies branch as MINOR

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) <noreply@anthropic.com>
This commit is contained in:
Garry Tan
2026-04-26 15:05:51 -07:00
parent 28257b7bc8
commit abd19d7d71
7 changed files with 19 additions and 19 deletions
+5 -5
View File
@@ -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
+1 -1
View File
@@ -1 +1 @@
1.16.1.0
1.17.0.0
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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 ----
@@ -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
}
+1 -1
View File
@@ -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",
@@ -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: '' } });