Skip to content

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

Closed

Description

@wengweiling

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

  1. Windows 11, Git Bash, MSYS unset, global git install with auto_upgrade: true.
  2. tmp=$(mktemp -d); git -C ~/.claude/skills/gstack archive --format=tar HEAD | tar -xf - -C "$tmp"; echo $? prints 2 with the error above.
  3. 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-chrome is a skill alias, not a hook, so the check shouldn't need it: skip or tolerate symlink entries during this extraction (or set MSYS=winsymlinks:lnk just for this tar).
  • Put tar's stderr in the held reason. "git archive of the incoming revision failed" sent me looking at git.
  • Banner: when pull is 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), MSYS unset
  • gstack 1.91.100.0, global git install, auto_upgrade: true; Bun 1.4.3 via winget

Activity

  1. capy-ai commented on Oct 16, 2026

    @capy-ai
    Contributor

    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).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions