diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e0bc893e..70ffc2886 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,196 @@ # Changelog +## [1.67.0.0] - 2026-08-16 + +**The tracker wave: browse survives macOS, installs are complete,** +**memory sync never drops a record. 30 contributors landed.** + +This release mines the full issue tracker and community PR queue. Browse now +classifies a macOS XProtect kill at Chromium launch and heals itself — clears +the quarantine flag, reinstalls the pinned browser revision from the right +install root, and retries, all bounded and logged. Fresh installs link every +runtime asset a skill references, so /review and friends work on a clean +machine the first time. Brain-sync's queue is drained with a classified +disposition — privacy-held records are retained and labeled, a failed push +keeps its commit and re-delivers it on the next run, and the retry only ever +publishes commits it authored itself. Twenty-five community PRs landed with +credit, and roughly thirty-five issues close on merge. + +### The numbers that matter + +From the wave's gate eval run (`bun run eval:bg:gate`, log in +`~/.gstack-dev/eval-runs/`) and the free suite (`bun run test`) at HEAD. + +| Metric | Before | After | Δ | +|---|---|---|---| +| Browse launch on macOS 26 (XProtect kill) | manual reinstall | classified + self-healed | automatic | +| Skill runtime assets on a fresh install | SKILL.md + sections only | every referenced asset | /review works day one | +| Brain-sync queue at a push failure | truncated | retained + re-delivered | no data loss | +| Detector push with an interleaved user commit | published it | refuses | author boundary holds | +| Gate evals | 41/43 | 43/43 | both reds root-caused | +| Free suite | — | ~7,000 tests, ~90-100s | green at HEAD | + +The brain-sync row is the one to internalize: the queue is only ever rewritten +by subtracting the exact records that were staged, against a live re-read, so +a record enqueued mid-drain survives to the next boundary. + +### What this means for gstack users + +Upgrade and the three most-reported failure classes disappear: browse comes +back on macOS without touching a terminal, a teammate's first `./setup` +produces working skills, and your cross-machine memory stops silently thinning +under flaky networks. If you filed one of the ~35 issues this closes, your +repro is now a regression test with your name on the commit. + +### Itemized changes + +#### Fixed — the three P0s + +- **Browse dead on macOS (#2554).** Playwright pinned to 1.62.1 (split from + dependabot #2582), plus an XProtect kill-signature classifier with positive + AND negative fixtures, a one-shot quarantine-clear + bounded (~120s, + process-group-killed) reinstall from the gstack install root that pins the + matching Chromium revision, structured heal logging, and a v1.65-style + upgrade migration for already-poisoned caches. The heal resolves the install + root via `os.homedir()` and keeps its manual-remediation guidance even when + the post-heal retry fails. +- **Fresh installs missing runtime assets (#2317, #2454).** `setup` links + every runtime asset with an explicit exclusion list (node_modules, dist, + *.tmpl, test, hidden), pinned by a two-class referenced-paths test: + alias-relative references must exist under the installed alias, repo-anchored + ones in the tree modulo a reasoned dist/ allowlist. +- **Brain-sync data loss (#2549).** Queue records are classified at drain + time: skip-filtered and nonexistent drop WITH counts (full paths in a 0600 + sidecar), privacy-held records are retained and labeled instead of being + wiped as "no allowlisted changes", unparseable lines are preserved, and the + rewrite subtracts the staged set from a LIVE re-read so concurrent enqueues + survive. A failed push keeps its commit; a run-start detector re-delivers it + — receipted, locked, throttled to one attempt per 10 minutes, bounded by + git's low-speed limits (portable to stock macOS), and gated to fire only + when EVERY unpushed commit is its own, so an interleaved manual commit in + ~/.gstack is never auto-published. The sync lock releases on every exit + path, including interrupts mid-push. + +#### Fixed — browse & daemon lifecycle + +- A healthy daemon is never killed by `browse start` (the #2219 iron rule): + a total-budget health probe answers in ~8s, busy daemons get "retry or + --force-restart" plus a nonzero exit, and only an explicit `--force-restart` + ever kills an alive pid — pinned by a regression test. `browse stop` on a + dead daemon short-circuits to success (#2254); `/gstack-upgrade` defers to a + busy daemon and prints the escape hatch (#2551). +- Chromium no longer dies with the terminal: signal handling moved off + Playwright's defaults at all three launch sites with a SIGHUP handler + routing through the real shutdown path, and a tripwire pinning the count. +- The terminal-agent allocates from the same fixed port range as the daemon + (#2314) — and that range now ends at 49151, actually below the macOS + ephemeral pool it exists to avoid; boot retries a raced bind instead of + dying. Windows terminal-agent leaks fixed via `process.kill(pid, 0)` + liveness (#1952) and the error-handling helpers. Contributed by @SYKhayyat + (#2414). +- Daemon crash logs persist without tokens or unsanitized page content + (needle-tested). Contributed by @phuttimatebenchanakatkul (#2461). +- The dead security-shield surface was removed end to end (−535 lines) while + the live L4 sidecar path keeps its status endpoint — docs updated in the + same commit. Contributed by @frederik-kaster-noygear (#2557, with the + pipe-capture core from #2559). CDP `Emulation.setEmulatedMedia` joins the + allowlist — contributed by @meshailabs (#2419). Windows gbrain probe + timeout — contributed by @vaston-viji (#2450). `browse/dist` mkdir — + contributed by @guyua9 (#2542). +- First `patchedDependencies` entry: playwright-core's two Windows spawn + sites carry `windowsHide` (#2160, #1989), statically pinned and + independently revertable. + +#### Fixed — install & setup correctness + +- Root-alias skills install as rewritten copies, never symlinks whose edits + would corrupt generated sources (#2511, #2201). Windows re-runs refresh + real-directory installs (#2444), and uninstall deletes only directories + that pass BOTH the inventory match and the generated-banner provenance gate, + listing (never deleting) anything else (#2563). +- `--host cursor` gets the full install slice — contributed by @szsunyuan + (#2547). Settings-hook dedup includes the command (#2382) — contributed by + @gregario (#2431). `:user` renders route through `--out-dir` (#2569) with a + migration that cleans legacy in-place render dirt. setup-gbrain invocation + paths fixed (#2250) — contributed by @SomSamantray (#2409). Office-hours + installs into codex/factory/opencode runtime roots (#2449). +- The redact pre-push hook stays opt-in but its fail-open gaps are closed, + with a one-time consent prompt (#1946). Skills-timeline Stop hook ships + fail-open (always exit 0, 2s budget) with setup registration (#2553). +- iOS QA: DebugBridgeTouch compiles out of Release builds — contributed by + @Bastea (#2585); front-most bridge ordering — contributed by @IDSTUK + (#2397); compat preflight docs — contributed by @itstimwhite (#2581). + +#### Fixed — memory & gbrain + +- Windows slug resolution and the decisions.jsonl allowlist (#2396) — + contributed by @source-utsho (#2561). Brain-sync arithmetic-injection + guard — contributed by @sneakygriff (#2588). Windows bash routing for + brain-sync/gbrain — contributed by @ShahriarLak (#2510), extended to every + gbrain-sources spawn (#2471). `--full` walks the full tree — contributed by + @ShahriarLak (#2406). Honest "missing" from brain-cache — contributed by + @sneakygriff (#2587). Memory-ingest parses both codex rollout shapes and + stages outside GSTACK_HOME (#2105, #2104). +- gbrain detection: engine-locked is a healthy status (#2456), bearer-token + thin clients are recognized (#2520), GBRAIN_HOME gets its .gbrain segment + (#2521), project-scoped MCP registrations are honored (#2499). Source pins + respected — contributed by @exGeni (#2417); `--dry-run` works offline + (#2536) — contributed by @CarringtonCreative (#2540); bun-on-npm PATH + guidance (#2487); dream-stage classifier anchored (#2341). + +#### Fixed — version tooling, diff-scope, redaction + +- VERSION stays the 4-digit source of truth; package.json carries the + npm-valid 3-digit translation, lockfiles sync only when they already exist, + and drift is judged on translated forms. Built on re-derived work + contributed by @YiftahR (#2501), @ortonom (#2568), and + @CarringtonCreative (#2531, #2545). Pinned repos compare base and current + against the SAME file (#2462). JSON version-paths get honest per-file + recovery messages. The path pins (`.gstack/version-path`, + `.gstack/package-json-path`) cannot escape the repository — absolute paths, + `..` traversal, and symlink escapes are all refused, and a lockfile + symlinked outside the repo is skipped with a warning. +- Diff-scope covers api/*, migrations/*, and db/data, with a no-match exit + code and uncommitted-work handling (#2526, #2455, #2299). Redact scans the + merge-base range and knows parcel IDs are not phone numbers — contributed + by @Two-Six-Alpha-1115 (#2592, #2591); rebased force-pushes are scanned + correctly, proven by test (#2573). +- The codex model probe caches its verdicts both ways: a working model for an + hour, a deterministic model-400 for 15 minutes (editing config.toml + re-probes immediately) — so the affected account stops paying a 30s round + trip per review section (#2477). Its timeout wrapper now enforces the + deadline with a bash-native watchdog on stock macOS, where no timeout + binary exists. + +#### Fixed — templates & everything else + +- Skills running under Codex skip the nested codex specialist with a printed + notice (#2519). Codex web-search flag unified behind one resolver constant + across 19 sites (#2525). Slugs are sanitized in every path position + (#2550) — with groundwork contributed by @harjothkhara (#1851). AGENTS.md + routing probe — contributed by @gamerey43 (#2500); empty-find fallthrough + killed — contributed by @tranthanhnhatkhoa (#2483); cygpath MSYS builds — + contributed by @chiragborse1 (#2452). /ship's review army loops until clean + (#2391). Question-registry path is absolute (#2489). Retro glob (#2552), + capability-check temp file (#2503), repo-mode stat order (#2195), hover doc + note (#2445), make-pdf boolean flags — including `--strict` and + `--confidential` — no longer swallow the input file, with a guard test that + derives the flag set from the source (#2514). + +#### For contributors + +- Test/generator infra hardened first: host-config golden isolation (#2532), + hermetic-wiring tripwire and YAML ellipsis quoting — contributed by + @sneakygriff (#2586, #2589); prepush PATH separator — contributed by + @luckywenapere (#2544); gen-skill-docs throws on duplicate preamble tokens. +- Dependency hygiene: puppeteer-core removed outright (zero consumers), + adm-zip CVE closed via lock override — contributed by @anupamme (#2485); + transformers/marked/socks bumped with the ONNX sidecar smoke green; + .gitattributes LF pin — contributed by @mlaniak (#2527); GitHub Actions + bumps — contributed by @dependabot (#2594). +- The wave's own adversarial reviews (Codex + Claude, 28 findings) landed as + fixes in-branch; verified residuals are filed in TODOS.md with rationale. + ## [1.66.1.0] - 2026-08-16 **Every claim gstack makes now binds to the content it was made on.**