From 38317fb8248643b1def07062b70cc1219d89f664 Mon Sep 17 00:00:00 2001 From: gregoryfoster Date: Thu, 22 Oct 2026 22:46:45 +0000 Subject: [PATCH 1/4] =?UTF-8?q?#62=20fix:=20CR=201=20=E2=80=94=20brainstor?= =?UTF-8?q?ming's=20small=20change=20still=20gets=20a=20plan=20when=20non-?= =?UTF-8?q?trivial?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- AGENTS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AGENTS.md b/AGENTS.md index 33ad6c7..3a3fd40 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -18,6 +18,7 @@ TDD required. Red → Green → Refactor. No production code without a failing t - A change to the service's behaviour amends the spec: a dated **Amended** entry in its header, plus the sections it touches. A design doc of its own only for work the spec doesn't cover: `docs/specs/YYYY-MM-DD---design.md`, never `docs/superpowers/specs/`. - `superpowers:` means this repo's `skills/`, whichever vendor it links. `superpowers:writing-plans` is gregoryfoster's `writing-plans`, which writes the plan above to `docs/plans/`; `superpowers:using-git-worktrees` is gregoryfoster's too (§ Conventions). - The builder check runs as written. On an amendment, hand it the spec and name the amended sections. +- Its sizes don't replace the rules above: a "small change" that is non-trivial still gets a plan, and every change goes issue → branch → PR. ## Environment & Tooling From d276d7e33d1237adbcea8f82b2840cf082f15663 Mon Sep 17 00:00:00 2001 From: gregoryfoster Date: Thu, 22 Oct 2026 22:46:56 +0000 Subject: [PATCH 2/4] =?UTF-8?q?#62=20fix:=20CR=202=20=E2=80=94=20the=20sup?= =?UTF-8?q?erpowers-invocation=20guard=20reads=20every=20.md=20in=20the=20?= =?UTF-8?q?skill,=20not=20just=20SKILL.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- tests/test_skills.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_skills.py b/tests/test_skills.py index 5624017..c9bb734 100644 --- a/tests/test_skills.py +++ b/tests/test_skills.py @@ -135,7 +135,8 @@ def test_superpowers_invocations_resolve_here() -> None: invoked = { m for n in ours - for m in re.findall(r"superpowers:([\w-]+)", (SKILLS / n / "SKILL.md").read_text()) + for md in (SKILLS / n).rglob("*.md") + for m in re.findall(r"superpowers:([\w-]+)", md.read_text()) } missing = sorted(n for n in invoked if not (SKILLS / n).exists()) assert not missing, missing From 57a74cb54c4966ee14b47d85b3d30762ceffb8f3 Mon Sep 17 00:00:00 2001 From: gregoryfoster Date: Thu, 22 Oct 2026 22:47:13 +0000 Subject: [PATCH 3/4] =?UTF-8?q?#62=20fix:=20CR=203=20=E2=80=94=20the=20sup?= =?UTF-8?q?erpowers-invocation=20guard=20fails=20on=20a=20dangling=20link,?= =?UTF-8?q?=20with=20the=20doctor=20hint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since CR 2's rglob, a dangling link scanned nothing and the guard passed. Co-Authored-By: Claude Opus 5.5 --- tests/test_skills.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_skills.py b/tests/test_skills.py index c9bb734..78ac70f 100644 --- a/tests/test_skills.py +++ b/tests/test_skills.py @@ -132,6 +132,9 @@ def test_superpowers_invocations_resolve_here() -> None: """A superpowers skill's ``superpowers:`` is ``skills/``; AGENTS.md maps strays.""" agents = (ROOT / "AGENTS.md").read_text() ours = [n for n in _names(SKILLS) if _vendor_of(n) == "obra-superpowers"] + # A dangling link globs nothing, and an empty scan passes: fail on it instead. + for n in ours: + assert (SKILLS / n / "SKILL.md").is_file(), (n, DOCTOR_HINT) invoked = { m for n in ours From 57fc8a341153ef63b1cf30c10693120267f3f9e3 Mon Sep 17 00:00:00 2001 From: gregoryfoster Date: Thu, 22 Oct 2026 22:47:25 +0000 Subject: [PATCH 4/4] =?UTF-8?q?#62=20fix:=20CR=204=20=E2=80=94=20the=20wor?= =?UTF-8?q?ktree=20pointer=20names=20=C2=A7=20Conventions=20=E2=86=92=20Wo?= =?UTF-8?q?rkflow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- AGENTS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AGENTS.md b/AGENTS.md index 3a3fd40..94a1c5d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -16,7 +16,7 @@ TDD required. Red → Green → Refactor. No production code without a failing t **Brainstorming** (`skills/brainstorming`, superpowers' unmodified): these are the partner's preferences its *Where it goes* defers to. - A change to the service's behaviour amends the spec: a dated **Amended** entry in its header, plus the sections it touches. A design doc of its own only for work the spec doesn't cover: `docs/specs/YYYY-MM-DD---design.md`, never `docs/superpowers/specs/`. -- `superpowers:` means this repo's `skills/`, whichever vendor it links. `superpowers:writing-plans` is gregoryfoster's `writing-plans`, which writes the plan above to `docs/plans/`; `superpowers:using-git-worktrees` is gregoryfoster's too (§ Conventions). +- `superpowers:` means this repo's `skills/`, whichever vendor it links. `superpowers:writing-plans` is gregoryfoster's `writing-plans`, which writes the plan above to `docs/plans/`; `superpowers:using-git-worktrees` is gregoryfoster's too (§ Conventions → Workflow). - The builder check runs as written. On an amendment, hand it the spec and name the amended sections. - Its sizes don't replace the rules above: a "small change" that is non-trivial still gets a plan, and every change goes issue → branch → PR.