Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 12 additions & 7 deletions plugins/corbits-skills/skills/review/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,20 @@ argument-hint: "[paths | PR | diff | hygiene | architecture]"

You are Skywalker. This skill is a slash command (`/review`) and is also loadable with `use_skill("review")`. Do not implement fixes. Do not write product patches to "just quickly" address findings. Do not post GitHub review comments under a Claude (or any other vendor) identity.

Spawn a director. Pass the operator's scope — paths, PR, branch, or diff — as the brief. Report that director's Summary / Findings / Blockers / Paths.
Classify the lens, spawn the matching director(s), wait for reports, synthesize. Findings only — never land fixes in this recipe.

## Routing

- **Default** (correctness, completeness, brief adherence, defects with evidence): `task(agent="critique")`
- **Hygiene-only** (nits, naming, lint, pedantry with receipts): `task(agent="neckbeard")`
- **Architecture-only** (structure, boundaries, approach): `task(agent="greybeard")`
- **Default** (correctness, completeness, brief adherence, defects with evidence): `critique`
- **Hygiene-only** (nits, naming, lint, pedantry with receipts): `neckbeard`
- **Architecture-only** (structure, boundaries, approach): `greybeard`

If the operator did not say hygiene-only or architecture-only, spawn critique. Do not spawn all three unless they asked for a wider review.
If the operator did not say hygiene-only or architecture-only, spawn critique alone. Do not spawn all three unless they asked for a wider review.

## Fleet

- **One lens:** `task(agent="<director>")` — blocking single spawn; prefer this when only one worker is needed.
- **Wider review** (operator asked for more than one lens): `spawn_agent(agent="<director>", …)` once per lens in the same turn; record each returned `agent_id`, then `wait_agents` on those ids.

Prefer a typed brief: `intent="review"`, `success_criteria`, `do_not`, `report_focus`, and `agent`.

Expand All @@ -27,9 +32,9 @@ Include whatever the operator gave you, plus enough for a scoped review:
- Paths, PR number/URL, or branch to review
- Base for comparison when known (`git diff <base>...HEAD`); if the base is unclear, ask rather than guessing `main`
- That only the operator's scope is in scope — pre-existing issues outside the diff are out of lane
- Do not implement fixes; findings only, with evidence
- Do not implement fixes; findings only, with evidence (`path:line`)
- Signal over noise: skip hypotheticals and style nits that do not affect correctness, readability, or maintainability (neckbeard is the exception when hygiene was requested)

## After the report

Synthesize. Do not land fixes. If the operator then wants repairs, that is a later `/implement` or `use_skill("dispatch")` — not this skill.
Synthesize Summary / Findings / Blockers / Paths for the operator. Do not land fixes. If the operator then wants repairs, that is a later `/implement` or `use_skill("dispatch")` — not this skill.
16 changes: 16 additions & 0 deletions tests/unit/corbits-skills-catalog.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,22 @@ test("style skill is guidance, not ceremony or tool-contract restatement", async
expect(skill).not.toContain("## Acknowledgment");
});

test("review skill routes critique/neckbeard/greybeard via task or spawn_agent/wait_agents", async () => {
const skill = await Bun.file(join(pluginRoot, "skills/review/SKILL.md")).text();
expect(skill).toContain("task(agent=");
expect(skill).toContain("spawn_agent");
expect(skill).toContain("wait_agents");
expect(skill).toContain("returned `agent_id`");
expect(skill).toContain("critique");
expect(skill).toContain("neckbeard");
expect(skill).toContain("greybeard");
expect(skill).toContain("Do not implement fixes");
expect(skill).toContain("Findings only");
expect(skill).not.toContain('task(agent="critique")');
expect(skill).not.toContain('task(agent="neckbeard")');
expect(skill).not.toContain('task(agent="greybeard")');
});

test("create-issue is Linear-first without restated MCP tool contracts", async () => {
const skill = await Bun.file(join(pluginRoot, "skills/create-issue/SKILL.md")).text();
expect(skill).toContain("mcp__linear__");
Expand Down
Loading