Commit Graph
544 Commits
Author SHA1 Message Date
garrytan cebc517964 TODOS: /review fingerprint under Codex's read-only .git sandbox (found by the live Codex check) 2026-10-03 22:40:16 +00:00
garrytan bc8e2181be test-of-test ratchet: a repo script or setup read by path counts as product code
codex-invocation-sites (runs scripts/gen-skill-docs.ts), gstack-config-gbrain-refresh
(copies bin/<name> through a variable) and setup-cso-windows-probe (reads setup and
scripts/build-cso-windows.ps1) exercise product code the detector could not see.
2026-10-03 22:33:09 +00:00
garrytan c43326b638 Regenerate generated output for v1.91.19.0 (gen:skill-docs --host all, goldens, llms.txt, context-budget fixture) 2026-10-03 22:25:46 +00:00
garrytan 406d01256d Parity caps: measured v1.91.19.0 union/skeleton sizes for ship, review, design-consultation, office-hours and design-shotgun, with the reason beside each 2026-10-03 22:25:45 +00:00
garrytan 94c164515d v1.91.19.0 docs and metadata: CHANGELOG, TODOS, README troubleshooting/upgrade/type --selector, BROWSER.md type and profiles, AGENTS.md conventions, CONTRIBUTING #2949, touchfiles for the wave's new lib/bin files 2026-10-03 22:23:54 +00:00
garrytan 3b03df807d Release v1.91.19.0 (next free patch in the queue: #3022 holds 1.91.17.0, #3023 holds 1.91.18.0); migration renamed; engines.bun >=1.4.0 to match the CI pin (#2815) 2026-10-03 22:19:03 +00:00
garrytan c545d4e733 INV-1: gate outcome rows and troubleshooting sections for every lane's new messages 2026-10-03 22:18:16 +00:00
garrytan d98b7c1e0f Q1: type the proxy-transport test doubles (typecheck:test ratchet) 2026-10-03 22:15:53 +00:00
garrytan b2c3e15a1d Q1 (#2971 salvage): bound iOS proxy responses
One wall-clock deadline covers headers and body (stalled and dribbling bodies
time out), the whole body is capped at 64 MiB (upstream_response_too_large),
every terminal path clears its timer, removes listeners and destroys the
request, and the daemon threads the deadline through both listeners. Ambiguous
mutations are still never replayed after a timeout or abort. Ported from
#2971's proxy-transport work plus the size bound.
2026-10-03 22:15:20 +00:00
garrytan f7efb26663 Integrator: C8 router omits disabled skills on every render (relink renders the served Claude router in place); Windows-safe E4/E6 entries; investigate hooks under the cmd.exe check; browse_extension_id reader; order-insensitive test typecheck identities
tsc printed one unchanged ceo-mode-option diagnostic's object members in a
different order (content?/isError?) once lib/fs-utils joined the generator's
import graph; identities now sort object-type members, and old baselines
normalize on read.
2026-10-03 22:11:25 +00:00
garrytan f76974be5a Integrator: outside-voice fences use the shared runtime prelude; TMPDIR mktemp and per-round variant paths in design templates 2026-10-03 22:05:04 +00:00
garrytan e6096a59b9 Merge lane wave/generator 2026-10-03 22:03:44 +00:00
garrytan ac8e30cce6 C4: rewrite section refs on hosts whose root stays a literal ~/<globalRoot>
Kiro, OpenCode, Cursor and Copilot render ~/.claude/skills/gstack as their own
literal root, not $GSTACK_ROOT, so plan-eng-review's self-check pointer
escaped the rewrite (found by the setup lane's installed-pointer check).
2026-10-03 21:51:27 +00:00
garrytan 424214ace7 C1: skillify finds the browse SDK under its own host's install root
The template hardcoded ~/.claude/skills/gstack for the canonical
browse-client.ts, so external hosts read another host's install or nothing.
A new INSTALLED_ROOT resolver (sibling of INSTALLED_BIN_DIR) names the host's
global root, or the per-install root when setup renders for one.
2026-10-03 21:48:59 +00:00
garrytan ea0b4841ba C4: no external render points at a section file that is not installed
design-html's detector install offer and plan-eng-review's self-check pointed
at $GSTACK_ROOT/<skill>/sections/<file> on every external host, where neither
skill is carved and no section tree exists. design-html now inlines the offer
off Claude, and a skill's pointer to its own {{SECTION}}-inlined section
names the inlined text.
2026-10-03 21:48:06 +00:00
garrytan d3640f28f8 B4: design --version prints the version, and the probe uses it
The design CLI treated --version as an unknown command (exit 1), so the
probe launched the binary with no arguments instead. Add --version (prints
the gstack version, exit 0, before auth or network) and probe with it, so
messages read '<path> --version exited <code>' as planned.
2026-10-03 21:46:16 +00:00
garrytan b94288db0b C9: Step 2 falls back to the install registry's source checkout (DX-7)
Codex users who installed from the README's ~/gstack clone got 'ERROR:
gstack not found' from /gstack-upgrade: Step 2 only looked under host skill
directories. It now falls back to the source checkout the install registry
recorded for the current host.
2026-10-03 21:44:22 +00:00
garrytan b8d08f1f4d G2/G3/INV-1: skill-start former-bucket notice and visible learnings failure; TMPDIR mktemp in gbrain bins; best-effort reasons 2026-10-03 21:44:06 +00:00
garrytan 8857089e85 Merge lane wave/setup 2026-10-03 21:43:08 +00:00
garrytan c05c796bc9 Merge lane wave/redaction 2026-10-03 21:43:08 +00:00
garrytan 67d5685ee3 Merge lane wave/ship-review 2026-10-03 21:43:08 +00:00
garrytan 5302d7a1bd Merge lane wave/browse-platform 2026-10-03 21:43:08 +00:00
garrytan 44e03d52aa Merge lane wave/memory 2026-10-03 21:43:08 +00:00
garrytan 93742a1ae2 Merge lane wave/inv1-codex 2026-10-03 21:43:07 +00:00
garrytan dc7a95a4b4 C8: a render given disabled skills drops them from the router (#3018)
The root router named every skill and ends 'When in doubt, invoke the skill',
so it routed to skills the user disabled. gen-skill-docs takes
--disabled-skills (runGeneration disabledSkills): the router drops their
routing rules, keeps the other side of an 'A or B' rule, and names them as
disabled. The router and gstack-upgrade cannot be disabled. With no disabled
skills the render is byte-identical.
2026-10-03 21:42:40 +00:00
garrytan 8d1b6dc470 A2: treat db-unreachable like timeout in gbrain-refresh
The memory lane's new db-unreachable status (network or DNS failure, config
intact) is transient, so gbrain-refresh keeps rendering brain-aware blocks
for it exactly as it does for timeout instead of suppressing them.
2026-10-03 21:41:25 +00:00
garrytan 3f3655b925 A2: render db-unreachable like timeout
gbrain's new db-unreachable status is a transient network failure; a setup
run while offline must not strip brain-aware blocks from every skill.
2026-10-03 21:40:42 +00:00
garrytanandBharadwaj Mittapelli 5526fca45c Q3: office-hours asks open-ended questions in a Q<N> prose form (#2719)
In Conductor, and whenever AskUserQuestion fails, prose is the only channel,
and the prose fallback defined only the D<N> decision brief. Phase 2A/2B
diagnostic questions have no option set, so the model dropped the phase.
Office-hours' preamble now defines the Q<N> open-question form (question,
why I'm asking, what a strong answer sounds like) and routes free-text
replies to it; the diagnostic sections name it. Scoped to office-hours so
every other skill's preamble is unchanged. Ported from PR #2729.

Co-authored-by: Bharadwaj Mittapelli <bharadwajmittapelli@gmail.com>
2026-10-03 21:40:12 +00:00
garrytan 4527c9b93f C3: guard Kiro's router copies on a present source; give the QA pointer adapter the copy and dist helpers
A copy fails where a symlink dangled, so the Kiro router and upgrade copies
are written only when their render exists (as every other runtime root
already does). test/qa-lazy-sections' extracted Kiro installer now supplies
_link_runtime_dists (C2) and the SKILL.md copy helpers (C3).
2026-10-03 21:38:56 +00:00
garrytan 8ae92b2bd0 C7: keep the required-mode hook's exit-2 deny
Copilot CLI treats a preToolUse exit 2 as deny (its hooks reference), and
#2413 established exit 2 plus hookSpecificOutput as the shape Claude Code
enforces, so the deny output stays as on main; only the matcher and the
in-place upgrade of older 'Skill' entries change.
2026-10-03 21:38:56 +00:00
garrytanandVaughan a1969d9287 E4: generators tolerate Bun's spurious EEXIST on Windows (#2329)
Bun on Windows throws EEXIST from a recursive mkdir of an existing directory,
so gen:skill-docs and the llms.txt writer crashed once a second file landed
in a directory. Both now use lib/fs-utils' mkdirpSync (ported from PR #2329
onto the existing helper instead of a new scripts/fs-utils.ts).

Co-authored-by: Vaughan <vaughan@cairnsitguy.com.au>
2026-10-03 21:38:00 +00:00
garrytan 9eda423a85 F4: design resolver reads per-round variant paths
$D variants now writes $_DESIGN_DIR/round-<N>/variant-*.png and prints JSON
with roundDir, manifest and paths. The mockup flow and comparison-board loops
build the board from those printed paths instead of hardcoded
variant-{A,B,C}.png, and approved.json records approved_path and round so a
round-1 choice made after round 2 still resolves.
2026-10-03 21:36:52 +00:00
garrytan 7da1c3cf68 E1: cmd.exe-safe investigate freeze hook
On Windows Claude Code runs hook commands through cmd.exe, which cannot parse
the single-quoted bash -c argument, so /investigate's scope-lock hook never
ran. Use one double-quoted bash -c script that names the hook path directly
(no S= variable: POSIX sh would expand $S to empty and skip the hook).
2026-10-03 21:35:23 +00:00
garrytan 7a04d4c708 A2: key the dot-slug catalog entry on the message users actually saw 2026-10-03 21:34:36 +00:00
garrytanandSom Samantray 44921995a0 E7: find the Aside CLI in ~/.local/bin when it is not on PATH (#2902)
The installer puts aside in ~/.local/bin, which is not on the default macOS
login PATH, so the probe said NEEDS_ASIDE ('download Aside') for a healthy
install. The probe now falls back to ~/.local/bin/aside, drives the resolved
binary, and prints READY: <path> when it is off PATH so later blocks run that
path. Ported from PR #2965 onto the current _gs_d probe.

Co-authored-by: Som Samantray <som.samantray@gmail.com>
2026-10-03 21:34:19 +00:00
garrytan 6de595e8d5 B5: shorter capture variable names (parity budget) 2026-10-03 21:34:19 +00:00
garrytan 07c2e8cc88 B4: shorter probe messages (design-consultation parity budget) 2026-10-03 21:34:19 +00:00
garrytanandbenjamin beres 6c0917aed2 B8: read gbrain JSON with bun instead of jq in install and wireup
gstack-gbrain-install read package.json with jq but never checked for it,
so on a machine without jq a successful install failed with "cannot read
version". gstack-gbrain-source-wireup hard-failed without jq ("brew
install jq" is not actionable on git-bash), so the wireup was skipped on
every run. Both now read the JSON with bun, which they already require.

Co-authored-by: benjamin beres <benjamin.beres@bienpreter.com>
2026-10-03 21:34:15 +00:00
garrytanandBrandon Pugsley c612f28339 A8: rename the artifacts repo with OWNER/REPO, rewrite the remote only after it
The v1.27.0.0 migration passed a bare repo name to gh repo rename / gh
repo edit, which always fails (gh wants [HOST/]OWNER/REPO), then step 2
rewrote ~/.gstack-artifacts-remote.txt to the never-renamed repository.

- Qualify both names with the owner from the recorded remote URL (else
  the signed-in gh user) and surface gh's error.
- Step 2 moves the remote file but rewrites the URL only once the rename
  is confirmed; a later successful retry rewrites it then.
- A pending journal now counts as state to migrate, so the #1383 retry
  actually re-runs step 1 (it used to see no legacy file and declare the
  migration done).
- The v1.91.17.0 migration (placeholder name) repairs installs already
  hit: when the remote names gstack-artifacts-<user> that does not exist
  but gstack-brain-<user> does, it restores the old URL in the remote
  file and ~/.gstack's origin and says so. It only calls gh for such a
  remote and never fails the upgrade.

Co-authored-by: Brandon Pugsley <aibpaem@gmail.com>
2026-10-03 21:32:42 +00:00
garrytan 4034a55029 F1: ship and review count unverified/unavailable outside reviews as missing coverage
INV-1 consumers in this lane's templates: /ship's readiness note, its
PR body Pre-Landing Review section and /review's completion rule now say
an outside review reporting unverified or unavailable is missing
coverage, never a pass. The PR body's Plan Completion section prints
F1's not-run line instead of the old 'No plan file detected.' The /ship
union-size cap moves to 1.415 for these lines (measured 1.4148).
2026-10-03 21:31:56 +00:00
garrytan f69f83165d B5: learnings callers report a failed search instead of reading as empty
Every generated gstack-learnings-search caller ended in 2>/dev/null || true,
so a missing bun or a failed search looked like 'nothing recorded'. Callers
now keep stdout, capture stderr and the exit status, and print
'LEARNINGS: unavailable (<first stderr line>)' on failure (resolver callers
in learnings.ts and review-army.ts, plus investigate, qa and ship's
adversarial section).
2026-10-03 21:30:33 +00:00
garrytan f238001db9 C4: migrate the ship docs-dispatch test to the carved external ship
On Codex and Factory the documentation dispatch now lives in
sections/documentation.md behind a pointer relative to the installed skill,
like Claude; the test pinned the old inlined layout.
2026-10-03 21:30:33 +00:00
garrytan 3882efba70 B4: compact the launch probe (cache keyed on inode, valid while newer than the binary)
Keeps design-consultation inside its parity size budget.
2026-10-03 21:30:33 +00:00
garrytan a05965fb0a B9: read cycle_freshness from a doctor run that includes it
/sync-gbrain Step 3.5 and the --full auto-dream decision read CYCLE from
gbrain doctor --json --fast, which skips the DB checks that carry
cycle_freshness, so the answer was always "unknown". Both now read
gbrain doctor --json --scope=brain (DB checks, no skill-file walk), parse
its JSON even when doctor exits 1 for a failing check, and match the
issue that names this source: "never completed" is never, "last cycled
Nh ago" is completed. When the installed gbrain does not report the
check, they say "unknown: installed gbrain does not expose
cycle_freshness" (lib readCycleStatus carries the reason to the --full
SKIP row).

The source-probe fixture that pinned the --fast call and a made-up
message format now answers --scope=brain with gbrain's real message.
2026-10-03 21:30:04 +00:00
garrytan 4c0436376b D0: keep the dotenv isolation test runnable on the Windows lane
The compiled probe gets its .exe name on Windows, and the terminal-agent
case (owner identity comes from ps) is skipped there.
2026-10-03 21:29:10 +00:00
garrytanandliutiming 76bf72d89f A7: run only the resolve_symbol_edges dream phase, detected first
/sync-gbrain --dream and the --full auto-build ran gbrain's full dream
cycle (~35 minutes, LLM phases) when the call graph needs only the
resolve_symbol_edges phase. The stage now runs
gbrain dream [--source <id>] --phase resolve_symbol_edges when the
installed gbrain accepts that phase (detected by behavior: gbrain
validates --phase before printing --help). Otherwise it skips the forced
dream and says the full cycle costs about 35 minutes and how to run it,
instead of starting it.

Co-authored-by: liutiming <timingliu@outlook.com>
2026-10-03 21:26:00 +00:00
garrytan 3995f0ebf2 D2: give the memory-leak reproducer's fake request isNavigationRequest()
wirePageEvents now runs the navigation guard on every request event; the
fake request adapter supplies the method real Playwright requests have.
2026-10-03 21:25:46 +00:00
garrytan 10eac648ba E8: count the BROWSE_EXTENSIONS_DIR persistent launch in the signal-flags guard
The new launch site carries handleSIGINT/SIGTERM/SIGHUP false like the
other three, so the guard's expected count moves from 3 to 4.
2026-10-03 21:25:46 +00:00
garrytan ae86d10f40 D0: pass the Bun child flags after 'run' so wrappers that rewrite 'bun run' argv keep working
bun run --no-env-file --config=/dev/null <script> has the same effect
(verified on Bun 1.4.0) and keeps argv[1] === 'run', which the
publication-lock fixture's preload injection relies on. The sidebar-tabs
source guard now expects the flags in the terminal-agent spawn.
2026-10-03 21:25:46 +00:00
garrytan ce651c2089 A6: report deleted-worktree gbrain sources; prune only with proof, on request
A deleted Conductor worktree leaves its gstack-code-<hash> source behind
and gbrain's autopilot fails on it forever. Local absence is not proof a
source is dead (machines sharing a federated brain register their own
paths, and its pages may be the only copy of uncommitted work), so gstack
never removes one automatically.

- Each sync counts consecutive misses for gstack code sources whose path
  is missing, prints "path unavailable" once per source with the review
  command, and records which repository each synced source belongs to.
- New gstack-gbrain-sync --prune-gone-worktrees (with --dry-run, whose
  plan it always prints first) removes a source only when its path was
  missing on two consecutive syncs, its parent is readable, recomputing
  deriveCodeSourceId() for that path on this host yields its id, and the
  repository's git common dir still exists and no longer lists the
  worktree. It re-checks the path right before removing (through the
  #1734-guarded safeSourcesRemove) and logs each removal.
2026-10-03 21:23:46 +00:00