From a24d0df7103fc9c311b061631db53b4a1d5bf832 Mon Sep 17 00:00:00 2001 From: Sawyer Cutler Date: Mon, 24 Aug 2026 14:27:34 -0700 Subject: [PATCH 1/2] Overhaul plan skill Rewrite /plan as a Skywalker spawn recipe for Counsel (plan director): agent-proof eng plans only, no ship, no tracker filing. Pin the contract in catalog tests. --- plugins/corbits-skills/skills/plan/SKILL.md | 33 +++++++++++++++++---- tests/unit/corbits-skills-catalog.test.ts | 11 +++++++ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/plugins/corbits-skills/skills/plan/SKILL.md b/plugins/corbits-skills/skills/plan/SKILL.md index b0822f163..a1f678c15 100644 --- a/plugins/corbits-skills/skills/plan/SKILL.md +++ b/plugins/corbits-skills/skills/plan/SKILL.md @@ -1,16 +1,37 @@ --- name: plan -description: Skywalker spawn recipe — plan director authors an agent-proof eng change plan. Does not implement. Does not file tracker issues. +description: Skywalker spawn recipe — Counsel (plan) authors an agent-proof eng change plan. Does not implement. Does not file tracker issues. +argument-hint: "[change target | spec]" --- # Plan -You are Skywalker. This skill is a spawn recipe. You do not write the plan yourself. +You are Skywalker. This skill is a slash command (`/plan`) and is also loadable with `use_skill("plan")`. You do not write the plan yourself. Do not implement. Do not ship product code. Do not file Linear or GitHub issues. -Spawn `task(agent="plan")` with the operator args as the brief. Prefer a typed spawn: `intent="plan"`, `success_criteria`, `do_not`, `report_focus`. +Spawn `task(agent="plan")` — Counsel — with the operator args as the brief. Prefer a typed spawn: `intent="plan"`, `success_criteria`, `do_not`, `report_focus`. -The plan director authors files, acceptance criteria, non-goals, risks, and ordered steps. It does not ship code. Greybeard is the architecture gate, not this slash. +Counsel is the plan lane only. Greybeard is the architecture gate, not this slash. A later `/implement` or `use_skill("dispatch")` ships the plan. -This is not `/create-issue`. Do not file Linear or GitHub issues. If the operator wants tickets, they use `/create-issue` after the plan. +## Brief to Counsel -Use `ask_operator` if the change target is too fuzzy to brief plan. +Pass whatever the operator gave you, plus enough for an agent-proof plan: + +- Change target / problem / desired outcome +- Known constraints, paths, or specs +- That Counsel must return: files/paths, acceptance criteria, non-goals, risks/open questions, and ordered steps a Builder can execute without guessing +- That Counsel must not implement, ship, review as Critic, explore as primary, or run the fleet + +## When to ask first + +Use `ask_operator` if the change target is too fuzzy to brief Counsel. Load `interview` when requirements need structured discovery before a plan. Do not invent scope. + +## Hard rules + +- Spawn with `task(agent="plan")`. Do not author the plan on this session. +- Do not ship code under this recipe — even a "tiny" DIY of the planned change is out of lane here. This slash is plan-only. +- This is not `/create-issue`. Do not file Linear or GitHub issues. If the operator wants tickets, they use `/create-issue` after the plan. +- Do not act as Greybeard, Builder, Critic, or Explorer. + +## After the report + +Synthesize Counsel's Summary / Findings / Blockers / Paths for the operator. Counsel's report is the artifact — do not write the plan to disk yourself. diff --git a/tests/unit/corbits-skills-catalog.test.ts b/tests/unit/corbits-skills-catalog.test.ts index ac0a83361..fe47c675f 100644 --- a/tests/unit/corbits-skills-catalog.test.ts +++ b/tests/unit/corbits-skills-catalog.test.ts @@ -106,6 +106,17 @@ test("spawn-recipe skills contain task(agent=", async () => { } }); +test("plan skill spawns Counsel (plan) and does not ship", async () => { + const skill = await Bun.file(join(pluginRoot, "skills/plan/SKILL.md")).text(); + expect(skill).toContain('task(agent="plan")'); + expect(skill).toMatch(/Counsel/); + expect(skill).toMatch(/agent-proof/); + expect(skill).toMatch(/[Dd]o not (implement|ship)/); + expect(skill).toContain("/create-issue"); + expect(skill).toContain("intent=\"plan\""); + expect(skill).not.toContain(USER_INVOCABLE_FALSE); +}); + test("create-issue selects Linear MCP, GitHub gh, and MEMORY.md preference", async () => { const skill = await Bun.file(join(pluginRoot, "skills/create-issue/SKILL.md")).text(); expect(skill).toContain("mcp__linear__"); From 2205b13085c13f5551a2012feeb30c99031c6f54 Mon Sep 17 00:00:00 2001 From: Sawyer Cutler Date: Mon, 24 Aug 2026 15:35:10 -0700 Subject: [PATCH 2/2] Fix prettier formatting in plan skill catalog test --- tests/unit/corbits-skills-catalog.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/corbits-skills-catalog.test.ts b/tests/unit/corbits-skills-catalog.test.ts index fe47c675f..4d2964135 100644 --- a/tests/unit/corbits-skills-catalog.test.ts +++ b/tests/unit/corbits-skills-catalog.test.ts @@ -113,7 +113,7 @@ test("plan skill spawns Counsel (plan) and does not ship", async () => { expect(skill).toMatch(/agent-proof/); expect(skill).toMatch(/[Dd]o not (implement|ship)/); expect(skill).toContain("/create-issue"); - expect(skill).toContain("intent=\"plan\""); + expect(skill).toContain('intent="plan"'); expect(skill).not.toContain(USER_INVOCABLE_FALSE); });