mirror of https://github.com/garrytan/gstack.git
chore: bump version and changelog (v1.65.0.0)
Fork port wave 2: the release-summary entry credits Sina Matian (time-attack/gstack) and the four absorbed community PRs. TODOS gains three review-round follow-ups (dual-write E2E, migration runner re-offer, gbrain-adapter op coverage). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
f6a9cd841f
commit
5a6a686635
189
CHANGELOG.md
189
CHANGELOG.md
|
|
@ -1,5 +1,194 @@
|
|||
# Changelog
|
||||
|
||||
## [1.65.0.0] - 2026-08-14
|
||||
|
||||
**/autoplan, /codex on macOS, and memory ingest work again.**
|
||||
**And every consent gate now means what it says.**
|
||||
|
||||
This is the second and final wave of the GStack 2 fork port. Wave one (v1.63.0.0)
|
||||
took the audit infrastructure; this wave takes the fixes and the features. Three
|
||||
skills that failed silently on every run now work: /autoplan's task aggregation
|
||||
emits real tasks instead of zero, /codex creates its temp files on macOS instead
|
||||
of dying on BSD mktemp, and memory ingest actually imports pages on current
|
||||
gbrain builds, and prints the count so you can see it. On top of that: your
|
||||
browser auth can now survive a daemon restart, /ship can take an iOS app from
|
||||
working tree to Submit for Review, and four supply-chain gates now run on every
|
||||
PR. Nearly all of it traces back to Sina Matian's time-attack/gstack fork, ported
|
||||
with tests and attribution.
|
||||
|
||||
### The numbers that matter
|
||||
|
||||
Source: this branch (`git log 1.63.0.0..HEAD`, `git diff main...HEAD --stat`,
|
||||
`bun test`), plus the GitHub issues the release closes.
|
||||
|
||||
| What | Before | After |
|
||||
|------|--------|-------|
|
||||
| /autoplan Phase 4 task output (#2018) | 0 tasks, every run | every task |
|
||||
| /codex on macOS (#2091) | broken on every install | works |
|
||||
| Memory ingest on gbrain 0.42+ (#2144) | 0 pages, reported success | full corpus, count printed |
|
||||
| Headed browse on macOS 26 (#2242) | GPU crash, poisoned cache | launches, heals old caches |
|
||||
| Auth after a browse daemon restart (#778) | logged out | restored (opt-in) |
|
||||
| CI secret scanning on PR diffs | none | every PR, fail-closed |
|
||||
| GitHub issues closed | | 24 |
|
||||
| Community PRs landed with authorship | | 4 |
|
||||
|
||||
The stark one is the first three rows: those aren't degraded features, they were
|
||||
features returning empty results with a green checkmark. If you ran /autoplan in
|
||||
the last two months, the task list it handed off was empty and nothing told you.
|
||||
|
||||
### What this means for gstack users
|
||||
|
||||
Run /autoplan and the pipeline hands real tasks to the executor. Run /codex on a
|
||||
Mac and it just works. Set `BROWSE_PERSIST_STATE=1` and a daemon restart no
|
||||
longer logs you out of every site. If you ship an iOS app, `/ship` now knows the
|
||||
whole App Store journey, session-minted upload keys, the price-schedule API that
|
||||
replaced the broken fastlane path, error -22938 triage, one authorization moment
|
||||
instead of five. Upgrade with `/gstack-upgrade`; the migration cleans any
|
||||
Chromium bundle an older gstack broke and verifies the replacement download
|
||||
before it claims success.
|
||||
|
||||
### Itemized changes
|
||||
|
||||
#### Added
|
||||
|
||||
- **Opt-in browser session persistence** (#778, #2193): `BROWSE_PERSIST_STATE=1`
|
||||
snapshots cookies and tabs (atomic writes, 0600, never page HTML or
|
||||
ownership), restores them off the boot path on the next start, and quarantines
|
||||
a corrupt snapshot instead of crashing. Portions from time-attack/gstack.
|
||||
- **Apple App Store release journey for /ship**: `ship/sections/apple-release.md`
|
||||
loads before the repo-landing gates when the target is an Apple app. Encodes
|
||||
session-minted App Store Connect keys, `appPriceSchedules` over the broken
|
||||
fastlane `price_tier`, expanded age-rating attributes, -22938 classification,
|
||||
and a one-authorization-moment flow. Refined across 21 live releases on the
|
||||
fork. Portions copyright Sina Matian, MIT.
|
||||
- **Code-intelligence provider contract, Phase 1**: `gstack-code-intelligence`
|
||||
wraps GBrain, Sourcebot, and Graphify behind one interface with an ask-once
|
||||
indexing offer for large repos (1,000+ tracked files, decline persisted).
|
||||
Consent is explicit per repo (`consent <repo> yes|no`), the per-repo trust
|
||||
policy's deny and read-only tiers veto write-class operations no matter what
|
||||
consent was recorded, and every off-machine send writes an egress receipt that
|
||||
records the consent state actually checked. Portions from time-attack/gstack.
|
||||
- **Supply-chain CI**: a quality gate that runs `bin/gstack-redact` over every
|
||||
PR diff (HIGH findings fail, MEDIUM annotates), dependency review on
|
||||
lockfile changes, weekly OSV scans, grouped dependabot updates, and an
|
||||
evidence-bar PR template. All third-party actions pinned to commit SHAs.
|
||||
- **Third-party web-actions contract** in tier-2+ skills: when a workflow needs
|
||||
a vendor-site step (API key signup, OAuth app), gstack offers to drive the
|
||||
browser itself, hands credentials and CAPTCHAs to you, stores secrets
|
||||
owner-only, and verifies with a read-only call before claiming success.
|
||||
- **Design docs land in your repo** (#703, #2000): office-hours writes
|
||||
`docs/designs/<topic>.md` as a concise decision record (one bullet per
|
||||
decision with its why), redaction-scanned before anything touches your git
|
||||
history. Plan reviews prefer the repo-local doc when both exist.
|
||||
- **`gstack-verify-gate`** (opt-in Stop hook): blocks turn-end until the
|
||||
CLAUDE.md-declared verify command passes. A command runs only after you trust
|
||||
it once per repo (`--trust`), re-trust is required when it changes, every
|
||||
grant is audit-logged, and re-entries re-run the check instead of waving it
|
||||
through.
|
||||
- **"Never show me these again"** for the founder-resources pitch (#538): the
|
||||
opt-out verifies its own config write before promising anything. Re-enable
|
||||
with `gstack-config set founder_resources true`.
|
||||
- **Claimed limitations need evidence**: every tier-2+ skill now treats "the
|
||||
API can't do this" as a material claim requiring the verbatim error, the
|
||||
documented statement, or a live probe, and runs the ten-second check before
|
||||
declaring anything blocked.
|
||||
|
||||
#### Fixed
|
||||
|
||||
- **/autoplan Phase 4 emitted zero tasks on every run** (#2018): a jq context
|
||||
rebind dropped every aggregated task; the error was hidden by stderr
|
||||
suppression. Six-fixture regression suite pins it.
|
||||
- **/codex was broken on every macOS install** (#2091): BSD mktemp rejects
|
||||
suffixed templates; all temp files now use portable templates and a static
|
||||
test bans the pattern repo-wide.
|
||||
- **Memory ingest imported nothing on gbrain 0.42+** (#2144): the staging dir
|
||||
sits under a gitignored tree, so git-aware collectors saw zero files. Fixed
|
||||
with `--include-gitignored` (community PR #2560) plus a `GIT_CEILING_DIRECTORIES`
|
||||
second layer, Windows-safe, and a loud ingested-page count.
|
||||
- **Headed mode on macOS 26** (#2242, #2138, #2139): gstack no longer rewrites
|
||||
the signed Chrome-for-Testing bundle (the rebrand broke its code signature;
|
||||
GPU processes refused to start). Launch self-heals poisoned caches, on both
|
||||
headed entry points, by removing the whole revision directory so the re-fetch
|
||||
actually re-downloads, and the upgrade migration does the same for existing
|
||||
installs, verifying a working Chromium exists before recording success.
|
||||
Branding stays on the GStack Browser wrapper app.
|
||||
- **`browse stop` restarted the daemon it was told to stop**: the CLI now gets
|
||||
an acknowledgment before shutdown, and the shutdown snapshot has a hard
|
||||
deadline so a wedged page can never hold the port.
|
||||
- **Session cookies from internal networks stay out of snapshots**: the hygiene
|
||||
filter drops loopback and link-local IP literals (127.0.0.1, ::1, 169.254.*)
|
||||
alongside localhost and *.internal, shared by both the persistence path and
|
||||
`state load`.
|
||||
- **ios-qa stopped handing out raw bearer tokens**: `/auth/sessions` returns
|
||||
salted-hash token ids with revoke-by-id support, the boot token left os_log
|
||||
entirely, and the IPv4 listener pins to loopback at the socket.
|
||||
- **make-pdf's no-network promise holds against obfuscation**: `<style>`
|
||||
@import, inline style URLs (quoted, unquoted, CSS-escaped, and
|
||||
HTML-entity-encoded), srcset, and media sources are all neutralized when
|
||||
rendering untrusted HTML without `--allow-network`.
|
||||
- **pair-agent tunnels are consent-gated** (`gstack-config set pair_agent on`):
|
||||
the tunnel cannot start without the recorded opt-in, the receipts that always
|
||||
claimed consent now reflect a check that exists, and a disabled gate tells
|
||||
you the real remedy instead of ngrok install instructions.
|
||||
- **The per-repo gbrain trust policy is enforced at the code-import chokepoint**
|
||||
(#2140, sync path): deny refuses, read-only skips code ingest, an unreadable
|
||||
policy store fails closed, and the egress receipt names the decision.
|
||||
- **Handoff no longer disarms the tunnel-orphan reaper** (community PR #2565
|
||||
plus hardening): promoting a daemon to headed suppresses only the
|
||||
headed-shutdown branch; a daemon with an active tunnel still dies with its
|
||||
parent.
|
||||
- **Windows**: broken DACLs on state dirs self-repair (#1605), every
|
||||
Windows-reachable spawn passes windowsHide (#1835, community PRs #2523 and
|
||||
#2539), and decision files no longer land under a project named "unknown".
|
||||
- **Setup no longer hangs on first run** (#2136): the Chromium probe gets a
|
||||
90-second deadline that reaps the whole wedged process tree, installs are
|
||||
single-flight across concurrent setups, and EXIT cleanup traps chain instead
|
||||
of clobbering each other.
|
||||
- **Paper cuts**: `gh pr edit` falls back to the REST API when the
|
||||
Projects-classic GraphQL deprecation bites (#1079); the v1.27 migration never
|
||||
auto-proceeds without a TTY and never records a failed rename as done
|
||||
(#1383); model benchmarks recognize macOS Keychain auth (#1890); voyage
|
||||
embedding flags survive zsh (#1798); `--supersede` keeps the replacement
|
||||
decision it was given; brain context no longer disables itself after one slow
|
||||
cold-start probe; lock acquisition reports the real error instead of phantom
|
||||
contention (#1084); plan verification probes the dev server your project
|
||||
declares instead of a hardcoded port list.
|
||||
|
||||
#### Changed
|
||||
|
||||
- **Telemetry defaults to off everywhere**: the browse daemon now reads the
|
||||
same persistent consent the rest of gstack does; an absent key means
|
||||
disabled, matching `gstack-config get telemetry`.
|
||||
- **Test-command detection covers Django and config-less projects**: a working
|
||||
`manage.py test` or `*_test.go` suite is recognized instead of being offered
|
||||
a bootstrap it doesn't need.
|
||||
- **Base-branch detection everywhere**: the bins that hardcoded `main` now
|
||||
probe origin/HEAD, origin/main, and origin/master in order.
|
||||
- **Eval model resolution is host-neutral**: `GSTACK_EVAL_MODEL` (and per-kind
|
||||
variants) override the hardcoded model ids at all six call sites.
|
||||
- Dead bins removed (`chrome-cdp`, `gstack-open-url`, `gstack-platform-detect`);
|
||||
the stale-reference scan now covers docs/ so removals like these fail CI when
|
||||
documentation still cites them.
|
||||
|
||||
#### For contributors
|
||||
|
||||
- 22 new test files (+4,666 test lines): behavioral suites for session
|
||||
persistence, the poisoned-bundle probe, both migrations, the consent CLI,
|
||||
verify-gate trust, telemetry opt-out, the offline-gate bypass corpus, the
|
||||
secret-scan exit contract, and lock-acquisition edge branches. The ios-qa
|
||||
daemon suite (5 files) is now wired into `bun test` and the sharded runner;
|
||||
it had never run in CI.
|
||||
- `lib/gbrain-repo-policy-client.ts` is the one place repo-policy tiers are
|
||||
read; both enforcement points route through it.
|
||||
- `lib/context-bill.ts` no longer double-counts nested skills in totalMd, and
|
||||
`gstack-context-bill` works under Conductor env-shims.
|
||||
- Egress receipts: `bin/gstack-egress verify` passes with the chain intact;
|
||||
code-intelligence adapters registered as fail-closed sinks.
|
||||
- Credits: this release ports work by **Sina Matian** (time-attack/gstack, MIT)
|
||||
across nearly every cluster. Community PRs absorbed with authorship:
|
||||
**Gawie van Blerk** (#2560), **Shawn Reddy** (#2565), **Jake Wilk** (#2523),
|
||||
**Jerry Nichols** (#2539). Thank you all.
|
||||
|
||||
## [1.63.0.0] - 2026-08-13
|
||||
|
||||
**Everything gstack sends off your machine now leaves a receipt you can read.**
|
||||
|
|
|
|||
38
TODOS.md
38
TODOS.md
|
|
@ -40,6 +40,44 @@ evidence-before-claimed-limitations rule.
|
|||
|
||||
**Effort:** S per run. **Priority:** P3. **Depends on:** a paid ADP account.
|
||||
|
||||
### P2: office-hours design-doc dual-write functional E2E (fork port wave 2 review shortfall)
|
||||
|
||||
**What:** A paid E2E (claude -p) that runs the office-hours Phase 5 handoff in
|
||||
a tmp repo and asserts BOTH write paths (docs/designs/<topic>.md + the
|
||||
~/.gstack copy) land and that `bin/gstack-redact` was invoked at the sink.
|
||||
Today only a static prose pin exists (test/skill-validation.test.ts) — the
|
||||
plan's R9 asked for the functional shape.
|
||||
|
||||
**Why:** The dual-write is an egress path into the user's repo; prose drift
|
||||
that skips the redact scan-at-sink would ship user PII into git history with
|
||||
nothing failing. **Effort:** M → S with CC. **Priority:** P2.
|
||||
**Tier:** periodic (quality, non-deterministic).
|
||||
|
||||
### P2: migration runners honor per-migration skip state
|
||||
|
||||
**What:** Both migration runners (setup's post-setup block and
|
||||
/gstack-upgrade Step 4.75) select migrations purely by version window, so a
|
||||
migration that exits via the non-interactive default-skip (v1.27's
|
||||
GSTACK_MIGRATE_ASSUME_YES gate) is never offered again — the version marker
|
||||
advances past it. The remediation text now prints the honest direct
|
||||
invocation, but the runners should track per-migration .done/.skipped
|
||||
touchfiles and re-offer pending ones on the next interactive run.
|
||||
|
||||
**Why:** Every remaining pre-v1.27 user upgrading via an agent session ([ -t 0 ]
|
||||
false) permanently misses the artifacts-rename migration unless they paste the
|
||||
manual command. **Effort:** M. **Priority:** P2.
|
||||
|
||||
### P3: gbrain-adapter add/delete/export behavioral coverage
|
||||
|
||||
**What:** Extend test/code-intelligence.test.ts's fake-gbrain shim to pin the
|
||||
three untested capability-advertised ops: add() pipes the body to `put <slug>`
|
||||
and writes a receipt with the body's sha256, delete() survives the stdin-EOF
|
||||
prompt guard, export() returns stdout, and each degrades to
|
||||
PROVIDER_UNAVAILABLE when the CLI is absent.
|
||||
|
||||
**Why:** Shipped public ops with zero exercise; the harness to test them
|
||||
cheaply already exists. **Effort:** S. **Priority:** P3.
|
||||
|
||||
|
||||
### P1: #1882 — portable skill-install prefix (non-`gstack` install dirs break silently)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "gstack",
|
||||
"version": "1.63.0.0",
|
||||
"version": "1.65.0.0",
|
||||
"description": "Garry's Stack — Claude Code skills + fast headless browser. One repo, one install, entire AI engineering workflow.",
|
||||
"license": "MIT",
|
||||
"type": "module",
|
||||
|
|
|
|||
Loading…
Reference in New Issue