Repository navigation
Windows + Git Bash: auto-update held on every new release (tar can't create the connect-chrome symlink, fail-closed since 1.91.89.0); banner shows a stale "bun not found" instead #3184
Description
What happened
On Windows 11 + Git Bash, gstack auto-update (bin/gstack-session-update) has been held on every check since 2026-10-12 (24 times in ~/.gstack/analytics/session-update.log):
HELD hook-check-unavailable: git archive of the incoming revision failed incoming=<sha>
git archive is fine. It's the tar -xf in hook_incoming_hold that fails. With the 2>/dev/null removed:
$ git -C ~/.claude/skills/gstack archive --format=tar 15ebd85 | tar -xf - -C "$tmp"
tar: connect-chrome: Cannot create symlink to ‘open-gstack-browser’: No such file or directory
tar: Exiting with failure status due to previous errors
connect-chrome is a symlink (mode 120000, since v1.40.0.0) to open-gstack-browser, and it comes before its target in the archive. With MSYS unset, MSYS2 can't create a link whose target doesn't exist yet, so tar exits 2. It reproduces on every revision I tried (45a6783, 3b7254a, 15ebd85).
Before v1.91.89.0 (#3140) this was harmless: hook_incoming_hold failed open on an archive error (45a6783, bin/gstack-session-update:55: "an archive or bun failure fails open"). Since #3140 it fails closed (bin/gstack-session-update:100-101 at 15ebd85). So on Windows + Git Bash, auto-update stops at the first new upstream commit and never resumes. The HELD branch (:314-320) also exits before the pending-stage retry, so a pending setup stage is never retried while the pull is held.
Second, smaller problem: the session-start banner hides the real blocker. When the pending file has both stages= and pull=, line 161 prints the stages message and the pull hold (elif at :165) is never shown. In my case stages=setup reason=bun not found on PATH was left over from one retry that happened to run while a failed winget upgrade of Bun had removed the bun link (it was back the same afternoon). For the next 2.5 days every session printed:
gstack auto-update: setup did not finish (bun not found on PATH); installed skills may be out of date. gstack retries automatically. Fix now: install Bun (https://bun.sh), then cd ~/.claude/skills/gstack && ./setup
Bun was on PATH the whole time and the actual cause was the tar hold, so the suggested fix doesn't help.
Steps to reproduce
- Windows 11, Git Bash,
MSYSunset, global git install withauto_upgrade: true. tmp=$(mktemp -d); git -C ~/.claude/skills/gstack archive --format=tar HEAD | tar -xf - -C "$tmp"; echo $?prints2with the error above.- Or wait for any new upstream commit: the next session start logs
HELD hook-check-unavailable: git archive of the incoming revision failed.
Same extraction with different MSYS values:
MSYS |
tar exit |
|---|---|
| unset | 2: Cannot create symlink to ‘open-gstack-browser’: No such file or directory |
winsymlinks:lnk |
0 |
winsymlinks:sys |
0 |
winsymlinks:native |
2: Cannot utime: Permission denied |
winsymlinks:nativestrict |
2: Operation not permitted (Developer Mode off) |
Possible directions, your call:
connect-chromeis a skill alias, not a hook, so the check shouldn't need it: skip or tolerate symlink entries during this extraction (or setMSYS=winsymlinks:lnkjust for thistar).- Put tar's stderr in the held reason. "git archive of the incoming revision failed" sent me looking at git.
- Banner: when
pullis set, show the hold (or both lines), since a held pull blocks the stage retry.
Related, separate bug (happy to file on its own): while recovering by hand, the git-install guard in /gstack-upgrade Step 4 compares git rev-parse --show-toplevel (C:/Users/...) with pwd -P (/c/Users/...), so on Git Bash it always prints "not a gstack checkout". Wrapping the left side in cygpath -u fixed it. Same /c/ vs C:/ family as #3088.
Readiness report
After a manual /gstack-upgrade (username redacted):
gstack doctor 1.91.100.0
ok install root /c/Users/<user>/.claude/skills/gstack: claude global current (1.91.100.0)
ok state root /c/Users/<user>/.gstack durable=yes (selected by default)
ok bun 1.4.3 at /c/Users/<user>/AppData/Local/Microsoft/WinGet/Links/bun (floor 1.3.3, tested 1.4.2)
ok hooks 9 hook(s) parse
not configured codex Codex CLI not installed; outside reviews in /review, /ship, /autoplan and /codex have no Codex coverage
not configured artifacts sync off; cross-machine artifacts sync is unavailable
ok browse bundle browse/dist built
ok binaries find-browse, design, pdf, gstack-global-discover launch (4 of 4)
ok cso native helper 1.91.100.0 (15ebd85cdde6)
ok claude code 2.1.281 (Claude Code) at /c/Users/<user>/.local/bin/claude
ok session journal largest of 1: 2.8 MiB
ok guard log no guard decisions logged
10 ok, 0 warn, 2 not configured, 0 fail
Environment
- Host: Claude Code 2.1.281 (Claude desktop app, Code tab)
- OS: Windows 11 Pro 10.0.26200, Git Bash (GNU bash 5.3.15, MSYS2),
MSYSunset - gstack 1.91.100.0, global git install,
auto_upgrade: true; Bun 1.4.3 via winget
Activity
ci(windows-setup): dereference symlinks when copying the spaced checkout
v1.91.106.0 fix: the 2026-10-15 issue wave (#3209)
capy-ai commentedon Oct 16, 2026
Fixed in v1.91.106.0 (main 3e8b34d, wave PR #3209). The Windows hook check extracts the incoming release without
tar, so installs are no longer held on every release. If yours is held since 1.91.89.0, run the one-time recovery in docs/troubleshooting.md#auto-update-held-install-recovery (Git Bash and PowerShell forms).