From f418e3b934743bc4db2c67d8066ca419ac0207c0 Mon Sep 17 00:00:00 2001 From: Garry Tan Date: Wed, 12 Aug 2026 16:04:16 -0700 Subject: [PATCH] chore: bump version and changelog (v1.63.0.0) Co-Authored-By: Claude Fable 5 --- CHANGELOG.md | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++ TODOS.md | 30 ++++++++++++++++ VERSION | 2 +- package.json | 2 +- 4 files changed, 130 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b817fc933..4f9df3449 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,103 @@ # Changelog +## [1.63.0.0] - 2026-08-12 + +**Everything gstack sends off your machine now leaves a receipt you can read.** +**And the eval harness stopped grading itself a passing grade.** + +This release ports the parts of the GStack 2 fork that earned their way back into +main. The headline is a hash-chained egress ledger: every place gstack itself +sends data off your machine now writes a local, tamper-evident receipt first, and +`gstack-egress list` / `verify` show you exactly what left and prove the chain is +intact. Two new command-line tools ship with it: `gstack-egress` (the auditor's +view) and `gstack-context-bill` (a token bill-of-materials for any skills tree, so +you can see what a gstack install costs your context window before you invoke +anything). The test harness got three real fixes, one of them a bug that had been +quietly lying to every contributor for months. + +### The numbers that matter + +Source: the assembled branch (`git log 1.62.0.0..HEAD`), the free suite +(`bun test`), and the discovery-surface gate (`test/catalog-budget.test.ts`). + +| Metric | Before | After | Δ | +|---|---|---|---| +| gstack-owned off-machine sinks with a receipt | 0 | every enumerated sink | tripwire-enforced, zero exceptions | +| Eval "no regressions" lines that were self-comparisons | every one | 0 | the harness compared runs against their own in-progress accumulator | +| Paid gate runner isolation | one process, one hung file kills the tier | one process per file, group-SIGKILL on stall | + never-started accounting | +| Discovery catalog budget | unenforced | pinned at 1,105 token-equivalents | ratchet-protocol on every skill add | +| Browser `/health` endpoint | served the root auth token to any localhost caller in headed mode | serves no token in any mode | token bootstrap moved to a pinned-origin POST | + +The eval-store line is the one that matters most for anyone hacking on gstack: +`findPreviousRun` picked the newest same-tier file as the baseline, and the +in-progress `_partial` accumulator always won that sort, so the auto-comparison +compared a run against itself and printed "no regressions" no matter what. That is +fixed, with regression tests, and the fix was confirmed against the bug on the +prior release before landing. + +### What this means for you + +If you care what gstack does with your data, you can now audit it: run +`gstack-egress list` after any session and see every off-machine send, or +`gstack-egress verify` to confirm nothing was rewritten. If you contribute to +gstack, your eval comparisons mean something again, the paid gate can't be taken +down by one wedged test, and `gstack-context-bill` tells you what your skill +changes cost before you ship them. Nothing new phones home; the ledger is local +and the receipts record what gstack *attempts* to send, so accidents are auditable. + +Ported from the GStack 2 fork by Sina Matian (time-attack/gstack); the eval-store +bug fix and the port shortlist were selected and hardened for upstream. + +### Itemized changes + +#### Added +- `gstack-egress` — read the hash-chained egress receipt ledger: `list` (what + gstack attempted to send off-machine), `verify` (recompute the chain, exit 3 on + tamper), `grants` (every consent grant in force and how to revoke it). +- `gstack-context-bill` — offline token bill-of-materials for a skills tree: + always-on discovery cost vs per-invocation cost, `--diff` between two trees, + `--budget`, and `--exact` (opt-in, measures against the real tokenizer). +- Hash-chained egress receipts (`lib/egress-receipt.ts`): fail-closed + receipt-before-send for sensitive sinks (brain-sync, memory-ingest, gbrain-sync, + telemetry, tunnels), fail-open with a warning for user-facing sinks (the design + binary's model calls, update-check, dashboards). A tripwire test enforces that + every off-machine sink in the tree is wired, with zero silent exceptions. +- Sharded paid-gate runner (`test:gate:sharded` / `test:periodic:sharded`): one + process per test file, an external wall-clock timeout that group-SIGKILLs a + wedged file's whole process tree, and four-way per-shard status so a crash can't + masquerade as a pass. +- `gstack-context-bill` and the egress tools install through the standard `./setup` + path like every other gstack binary. + +#### Changed +- The browser `/health` endpoint no longer carries the root auth token in any + mode. The sidebar extension bootstraps its token through a new + `POST /extension-token` that requires the pinned extension origin and a loopback + Host; the tunnel listener never exposes it. Upgrading resets the sidebar's + panel-local state once, explained in-product. +- Hermetic PTY test children can register the repo's shipped skills, so + slash-command gate tests actually exercise the skill under test instead of + silently measuring nothing. +- Discovery-surface cost is now gated: `test/catalog-budget.test.ts` pins the + aggregate skill name+description budget with a self-service ratchet protocol. + +#### Fixed +- The eval harness auto-comparison compared every run against its own in-progress + accumulator and reported "no regressions" unconditionally. Fixed with regression + tests; comparisons now find the latest *completed* same-tier run. +- The browser `/health` token leak (a headed-mode carve-out that handed the root + token to any localhost caller). + +#### For contributors +- Shared modules replace duplicated logic: one paid-test-set definition consumed by + both the free-suite filter and the paid runner, one skill-census helper with three + explicit counts (physical files, authored skills, registry entries) consumed by + the seeder, context-bill, and the catalog gate. +- `CLAUDE.md`'s compiled-binaries note corrected: the `browse/dist` binaries have + been untracked since v0.11.16.0, so they no longer appear in `git status`. +- New follow-ups filed in `TODOS.md`: egress ledger rotation (chain-genesis + records), a launch-nonce token bootstrap, and eval-watch shard-awareness. + ## [1.62.0.0] - 2026-08-12 ## **Plan reviews stop asking what to review when you're in plan mode.** diff --git a/TODOS.md b/TODOS.md index 1bc94cd2c..704592c2d 100644 --- a/TODOS.md +++ b/TODOS.md @@ -2722,3 +2722,33 @@ log already streams per-shard results). `test/helpers/eval-store.ts` already enumerates the layout — reuse it. **Effort:** S (human ~2h, CC ~15min). **Depends on:** v1.62 port wave landed. + +## v1.63 port-wave review follow-ups (deferred from /ship review army — non-blocking polish) + +Genuine review findings deferred from the v1.63 ship because they are +informational/polish, not correctness-blocking, and several want their own +tests. Filed so they are tracked, not dropped. + +- **P2 — telemetry-sync HTTP-status outcome is dead code.** `_GSTACK_EGRESS_LAST_RECEIPT` + is set inside a command-substitution subshell in `bin/gstack-telemetry-sync`, so the + parent-shell guard that would append the HTTP status to the receipt never fires. The + generic `exit:N` outcome is still recorded, so the ledger is correct, just less + precise. Fix: have `_receipted_curl` persist the receipt id to a caller-readable temp + file, or restructure the call out of the subshell. (Confirmed by 3 review specialists.) +- **P2 — context-bill "TOTAL on disk" double-counts child skills** in a root-as-container + tree (this repo's own layout): `buildBill` sums the root skill's whole-tree walk plus + each child's subtree again (~2x the TOTAL line). ALWAYS-ON / EAGER / --diff / --budget + are all unaffected — only the informational TOTAL is wrong. Fix: compute the tree total + from a single deduplicated `walkMd(root)` pass, or exclude child dirs from the root + skill's `totalMd`. Needs a fixture test. (`lib/context-bill.ts`.) +- **P3 — DRY/robustness polish:** one shared `_gstack_egress_host_of` helper for the + ~11 hand-rolled URL-to-host extractions across the egress shell sinks; extract the + duplicated tunnel-open `writeReceipt` block in `browse/src/server.ts` (two sites); + hoist the per-iteration `SharedArrayBuffer` alloc out of the egress-receipt lock spin; + replace context-bill's exact-mode `errorPct === 0` sentinel with an explicit flag; + reuse `frontmatterName()` from `skill-census.ts` in `catalog-budget.test.ts`. +- **P3 — test-coverage gaps the audit named:** `PAID_TEST_GLOBS` ↔ `package.json` + `test:gate` parity test; `GSTACK_EXTENSION_ID` ↔ `manifest.json` key derivation parity + test (`browse/scripts/extension-id.ts`); a runner test asserting each shard child gets + its own `GSTACK_EVAL_DIR` under `shards/`; receipt-refusal branch tests for + supabase-provision / gbrain-sync / memory-ingest. diff --git a/VERSION b/VERSION index 1042f0adf..232d60188 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.62.0.0 +1.63.0.0 diff --git a/package.json b/package.json index a44803911..bbffcc3b1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gstack", - "version": "1.62.0.0", + "version": "1.63.0.0", "description": "Garry's Stack — Claude Code skills + fast headless browser. One repo, one install, entire AI engineering workflow.", "license": "MIT", "type": "module",