From 3ed655bcb538a8c0782cdeeabe6cee29720b8674 Mon Sep 17 00:00:00 2001 From: Garry Tan Date: Wed, 24 Jun 2026 15:21:10 -0700 Subject: [PATCH] fix(ci): copy SKILL.md as real files in pty-smoke registry (cross-mount symlink) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The e2e-pty-plan-smoke suite failed with "Unknown command: /office-hours" in CI while passing locally. Root cause (proven, not guessed): claude 2.1.187's interactive-TUI skill scanner does not follow the /github/home -> /__w cross-mount symlink the registry used for per-skill SKILL.md. Evidence: a CI debug step showed `claude -p` discovered the skill (printed READY), and a local macOS repro with the identical symlinked registry recognized /office-hours — isolating the failure to the container's cross-mount symlink, not registration content, claude version, duplicate names, or a race. Fix: register the per-skill SKILL.md + sections as REAL copies (same mount as $HOME) so the TUI reads them directly. The gstack root stays a symlink — the preamble's runtime bash resolves bin/* and sections/* through it and bash follows cross-mount symlinks fine. --- .github/workflows/evals.yml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/workflows/evals.yml b/.github/workflows/evals.yml index f2c5cb232..d10cf69a1 100644 --- a/.github/workflows/evals.yml +++ b/.github/workflows/evals.yml @@ -189,11 +189,23 @@ jobs: SKILLS_DIR="$HOME/.claude/skills" REPO="$GITHUB_WORKSPACE" # /__w/gstack/gstack mkdir -p "$SKILLS_DIR" + # The gstack root stays a symlink — the preamble's runtime bash resolves + # ~/.claude/skills/gstack/bin/* and ~/.claude/skills/gstack//sections/* + # through it, and bash follows cross-mount symlinks fine. ln -snf "$REPO" "$SKILLS_DIR/gstack" + # But the per-skill SKILL.md the TUI DISCOVERS must be a REAL file on the + # same mount as $HOME. claude 2.1.187's interactive-TUI skill scanner does + # not follow the /github/home -> /__w cross-mount symlink (proven: `claude + # -p` discovered the skill — READY — while the TUI rejected /office-hours + # as "Unknown command"; a local macOS repro with the identical symlinked + # registry recognized it, isolating the failure to the container's + # cross-mount symlink). Copy SKILL.md + sections as real files so the TUI + # reads them directly. for s in office-hours plan-ceo-review; do + rm -rf "$SKILLS_DIR/$s" mkdir -p "$SKILLS_DIR/$s" - ln -snf "$REPO/$s/SKILL.md" "$SKILLS_DIR/$s/SKILL.md" - ln -snf "$REPO/$s/sections" "$SKILLS_DIR/$s/sections" + cp "$REPO/$s/SKILL.md" "$SKILLS_DIR/$s/SKILL.md" + cp -R "$REPO/$s/sections" "$SKILLS_DIR/$s/sections" done echo "--- registry under $SKILLS_DIR ---" ls -la "$SKILLS_DIR/gstack" "$SKILLS_DIR/office-hours" "$SKILLS_DIR/plan-ceo-review"