From b8fab8dc410ec136dde42fa87ffcdda058814b8c Mon Sep 17 00:00:00 2001 From: gregoryfoster Date: Fri, 7 Aug 2026 17:59:51 +0000 Subject: [PATCH] #27 fix: check out skills-vendor/ in the test job MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit tests/test_skills_hook.py dereferences the .claude/hooks/ symlink into skills-vendor/, so it needs a populated submodule, not merely a correctly-shaped link. actions/checkout does not fetch submodules by default, so the link dangled on the runner and the test could not pass in CI at all — red on main since 7bf5988, 443 of 444. `true` rather than `recursive`: neither submodule nests, so recursion only adds a foreach pass. Scoped to the test job — ruff never reads skills-vendor/. Both remotes are public HTTPS, so this needs no token and does not touch the wheelhouse WIF auth. Unrelated to the #22 v1.2 hold in both directions: the suspended refresh is a developer-machine SessionStart hook CI never invokes, and checkout resolves the SHA pinned here rather than upstream tip, so the pin the hold froze stays frozen. The assertion message named only the local remedy, which reads as nonsense on a runner; it now names both. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/ci.yml | 11 +++++++++++ tests/test_skills_hook.py | 5 ++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index babe8d2..70b00f8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -82,7 +82,18 @@ jobs: contents: read id-token: write steps: + # `submodules` is load-bearing for tests/test_skills_hook.py, which + # dereferences the .claude/hooks/ symlink into skills-vendor/ — an + # unpopulated submodule makes that link dangle and the test cannot pass. + # Both submodules are public HTTPS in .gitmodules, so no token is needed, + # and neither nests, so `true` is enough (`recursive` would only add a + # foreach pass). The coupling this buys: an upstream force-push that GCs a + # pinned SHA fails the job *at checkout*, which looks nothing like a test + # failure. The lint job deliberately omits this — ruff never reads + # skills-vendor/. - uses: actions/checkout@v5 + with: + submodules: true - name: Install uv uses: astral-sh/setup-uv@v5 diff --git a/tests/test_skills_hook.py b/tests/test_skills_hook.py index dc3697f..78fd0f8 100644 --- a/tests/test_skills_hook.py +++ b/tests/test_skills_hook.py @@ -26,5 +26,8 @@ def test_the_session_start_hook_is_a_symlink_into_the_submodule(): def test_the_hook_the_symlink_points_at_actually_exists(): """A populated submodule is the other half — a dangling link is a silent no-op.""" - assert HOOK.exists(), "skills-vendor/ is not checked out: run .skills/doctor.sh" + assert HOOK.exists(), ( + "skills-vendor/ is not checked out: run .skills/doctor.sh locally, " + "or add `submodules: true` to the CI job's actions/checkout (#27)" + ) assert os.access(HOOK, os.X_OK)