From d5d49f37645ae5073caa8d26e6d19dec18f103a3 Mon Sep 17 00:00:00 2001 From: Safi Date: Tue, 2 Jun 2026 22:50:33 +0100 Subject: [PATCH] add end-to-end test that gemini install leaves no dead reference pointer Locks the body<->refs coupling: gemini ships claude's lean skill.md body but resolves references through a separate path, so a real install with the real claude bundle must leave every references/ pointer in SKILL.md resolvable. Co-Authored-By: Claude Opus 4.8 --- tests/test_install_references.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/test_install_references.py b/tests/test_install_references.py index 11fa56f4..06cfd9da 100644 --- a/tests/test_install_references.py +++ b/tests/test_install_references.py @@ -268,6 +268,25 @@ def test_claude_install_ships_lean_core_and_references(tmp_path): ] +def test_gemini_install_references_all_resolve(tmp_path): + """End-to-end: every references/ pointer in gemini's installed SKILL.md resolves. + + gemini ships claude's lean skill.md body but resolves its references through a + separate path, so this locks the body<->refs coupling: a real install with the + real claude bundle must leave no dead pointer on disk. + """ + import re + _install(tmp_path, "gemini") + skill = tmp_path / ".gemini" / "skills" / "graphify" / "SKILL.md" + assert skill.exists() + refdir = skill.parent / "references" + assert refdir.is_dir() + pointers = set(re.findall(r"references/([a-z-]+\.md)", skill.read_text(encoding="utf-8"))) + assert pointers, "the lean core should link to references/" + missing = [p for p in pointers if not (refdir / p).is_file()] + assert not missing, f"dead reference pointers in gemini install: {missing}" + + def test_claude_twins_ride_the_claude_bundle(tmp_path): """antigravity and kimi reuse claude's split bundle, so they go progressive too.