Skip to content

Commit fdeac11

Browse files
committed
Restore the implement skill 1:1 with GaaS
Replace the Corbits-tool rewrite with Guy's GaaS implement body (TaskCreate, @greybeard, @Critique, Acknowledgment). Keep slash /implement. Tool-name mapping, including TaskList and karen to the primary, stays on native-integration.
1 parent 92f7a7c commit fdeac11

4 files changed

Lines changed: 59 additions & 75 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ parallel copies under `docs/` or `scripts/notes/`. At cut time: rename
1919

2020
### Changed
2121

22+
- Restore the implement skill body 1:1 with GaaS (TaskCreate, @greybeard, Acknowledgment). Tool-name mapping stays on native-integration. Slash /implement remains.
2223
- Restore the typescript skill body 1:1 with GaaS. bun:test vs tap mapping lives on native-integration. user-invocable: false stays so it remains use_skill-only.
2324
- Restore the philosophy skill body 1:1 with GaaS (including the review acknowledgment). `user-invocable: false` stays so it remains use_skill-only.
2425
- Restore the style skill body 1:1 with GaaS (including the git-repo requirement and review acknowledgment). Non-git-folder policy stays on native-integration. `user-invocable: false` stays so it remains use_skill-only.

plugins/corbits-skills/skills/implement/SKILL.md

Lines changed: 19 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -11,43 +11,39 @@ A disciplined implementation workflow that produces reviewed, verified commits.
1111

1212
Before using this workflow, load the `style` and `philosophy` skills. Follow their conventions throughout.
1313

14-
## Linear claim (when applicable)
15-
16-
When the work is tied to a Linear issue ID, claim it **before** greybeard / explore / build thrash: set state to "In Progress" with `mcp__linear__save_issue`. This is a hard first step. Parallel lanes each claim their own issue ID — never claim a sibling lane's ID. If Linear MCP is unavailable or the update fails, report that the issue status could not be updated; do not pretend it was claimed.
17-
1814
## When to Use
1915

20-
This is a standalone skill, loaded on request. Use it when you want a single agent to work through a series of commits with review discipline.
16+
This is a standalone skill, loaded on request. It is not part of dispatch. Use it when you want a single agent to work through a series of commits with review discipline.
2117

2218
The caller defines what work to do and where the commit boundaries are. This skill defines _how_ each commit gets produced.
2319

2420
## Tracking Progress
2521

26-
Track progress with `manage_tasks`. One item per commit-sized unit.
22+
Use `TaskCreate`, `TaskUpdate`, and `TaskList` to track progress throughout the workflow. These tools give the user real-time visibility into what you're doing.
2723

2824
### Initial Planning
2925

30-
Before starting implementation, create a `manage_tasks` item for each commit-sized unit of work from the caller's instructions:
26+
Before starting implementation, use `TaskCreate` for each commit-sized unit of work from the caller's instructions:
3127

3228
- **subject**: Clear imperative description of the unit of work
3329
- **description**: Enough context that you could pick it up cold
3430
- **activeForm**: Present continuous form for the spinner (e.g., "Refactoring HTTP client retry logic")
3531

3632
### During the Per-Commit Workflow
3733

38-
When you begin a unit of work, mark its `manage_tasks` item in progress. As you move through the workflow steps, update the task's `activeForm` to reflect which step you're in:
34+
When you begin a unit of work, mark its task `in_progress` with `TaskUpdate`. As you move through the workflow steps, update the task's `activeForm` to reflect which step you're in:
3935

4036
- **Step 1**: "Reviewing approach with Greybeard: {subject}"
4137
- **Step 2**: "Implementing: {subject}"
4238
- **Step 3**: "Running build gate: {subject}"
4339
- **Step 4**: "Committing: {subject}"
44-
- **Step 5**: "Running critic loop: {subject}"
40+
- **Step 5**: "Running Critique loop: {subject}"
4541

4642
When the commit lands and Critique is clean, mark the task `completed`.
4743

4844
### Discovered Work
4945

50-
If new work surfaces during implementation (Greybeard suggests a preparatory refactor, Critique reveals a missing edge case that warrants its own commit), append a `manage_tasks` item and work it through the full per-commit workflow.
46+
If new work surfaces during implementation (Greybeard suggests a preparatory refactor, Critique reveals a missing edge case that warrants its own commit), create a new task with `TaskCreate` and work it through the full per-commit workflow.
5147

5248
## Workflow Per Commit
5349

@@ -73,7 +69,7 @@ Before writing any code, describe your implementation approach to Greybeard and
7369
- You don't need to agree with every suggestion, but you need a reason to disagree
7470
- Once you're aligned on approach, move to Step 2
7571

76-
Use `spawn_agent(agent="greybeard")`, then `wait_agents`, for this step.
72+
Use the `@greybeard` subagent for this step.
7773

7874
### Step 2: Implement and Test
7975

@@ -116,15 +112,15 @@ Update `activeForm` to "Committing: {subject}".
116112

117113
Create the commit. Follow the commit message conventions from the `style` skill. Include the test in the same commit as the implementation — they are one logical unit of work.
118114

119-
### Step 5: Critic loop
115+
### Step 5: Critique Loop
120116

121-
Update `activeForm` to "Running critic loop: {subject}".
117+
Update `activeForm` to "Running Critique loop: {subject}".
122118

123-
Ask critic to review the committed change.
119+
Ask Critique to review the committed change.
124120

125121
**How to run:**
126122

127-
1. Spawn `spawn_agent(agent="critic")`, then `wait_agents`, and ask it to review the output of `git show HEAD`. Include the intent from Step 1 (what the change is meant to accomplish and the approach agreed with Greybeard) so Critique can evaluate whether the implementation matches the plan, not just surface-level quality. Tell critic to limit its findings to the scope of the current commit -- pre-existing issues in touched files are out of scope.
123+
1. Spawn the `@critique` subagent and ask it to review the output of `git show HEAD`. Include the intent from Step 1 (what the change is meant to accomplish and the approach agreed with Greybeard) so Critique can evaluate whether the implementation matches the plan, not just surface-level quality. Tell Critique to limit its findings to the scope of the current commit -- pre-existing issues in touched files are out of scope.
128124
2. Read its findings
129125
3. For each issue marked VERIFIED or HIGH confidence: fix it
130126
4. Re-run the build gate (Step 3) to verify fixes
@@ -141,42 +137,31 @@ Ask critic to review the committed change.
141137

142138
If the situation calls for more elaborate history surgery, search your available skills for one whose description covers git rebase or branch-history cleanup, and load it. Re-run the build gate after the rebase completes.
143139

144-
6. Ask critic to review `git show HEAD` again. Re-include the original intent from Step 1 and tell it what you fixed since the last pass so it can focus on verifying the fixes and checking for new issues rather than re-reviewing the entire change from scratch.
140+
6. Ask Critique to review `git show HEAD` again. Re-include the original intent from Step 1 and tell it what you fixed since the last pass so it can focus on verifying the fixes and checking for new issues rather than re-reviewing the entire change from scratch.
145141
7. Repeat until Critique comes back clean or all remaining findings are acknowledged and intentional
146142

147143
**When to stop looping:**
148144

149-
- critic reports no issues
145+
- Critique reports no issues
150146
- Remaining findings are judgment calls you've consciously decided against, not oversights
151147
- The build passes after the last round of fixes
152148

153149
### Step 6: Next
154150

155-
Mark the current `manage_tasks` item done. Move to the next unit of work and return to Step 1.
151+
Mark the current task `completed` with `TaskUpdate`. Move to the next unit of work and return to Step 1.
156152

157153
## Guidelines
158154

159-
**Claim Linear work first when applicable.** When tied to a Linear issue: claim "In Progress" with `mcp__linear__save_issue` before the spawn loop. Parallel lanes claim their own IDs. If Linear MCP is unavailable, report that the issue status could not be updated.
160-
161-
**Close the loop.** Ship → verify → fix → re-verify.
162-
163-
**Do not invent a worker-count or fan-out ceiling.**
164-
165155
**Don't shortcut the loop.** The value is in the discipline. Skipping Greybeard "because this change is simple" or skipping Critique "because the build passes" defeats the purpose.
166156

167-
**Keep commits focused, but do not drop findings.** When critic surfaces something outside the current commit's scope, every finding must be assigned one of four dispositions: (a) fix in the current commit, (b) commit it separately on this branch, (c) file a new issue with concrete acceptance criteria, or (d) accept it as-is. "Out of scope" is not a disposition. "Note it for later" is not a disposition unless you also say which of (a)–(d) "later" means.
157+
**Keep commits focused, but do not drop findings.** When Critique surfaces something outside the current commit's scope, every finding must be assigned one of four dispositions: (a) fix in the current commit, (b) commit it separately on this branch, (c) file a new issue with concrete acceptance criteria, or (d) accept it as-is. "Out of scope" is not a disposition. "Note it for later" is not a disposition unless you also say which of (a)–(d) "later" means.
168158

169-
**Disposition (d) always requires operator approval** — neither you nor greybeard can drop a finding on your own. For (c), the issue must be filed in this session, with its ID or URL in the status update; a promise to file it later is dropping the work. Consult the operator before choosing (c) or (d).
159+
**Disposition (d) always requires operator approval** — neither you nor greybeard can drop a finding on your own. For (c), the issue must be filed in this session, with its ID or URL in the status update; a promise to file it later is dropping the work. If you are orchestrated by karen, route the decision through karen's section 9 procedure (consult greybeard, paste his recommendation verbatim, escalate to the operator for any "accept as-is" or any unclear answer). If you are running directly, consult the operator before choosing (c) or (d).
170160

171161
**Build must pass before every commit, amend, and rebase stop.** Never commit code that doesn't compile or pass tests. Fix build failures first, then commit, amend, or continue the rebase.
172162

173-
**Greybeard is for approach, critic is for execution.** Greybeard reviews your plan before you write code. critic reviews your code after you write it. Don't conflate the two.
174-
175-
## When Shipping a PR
163+
**Greybeard is for approach, Critique is for execution.** Greybeard reviews your plan before you write code. Critique reviews your code after you write it. Don't conflate the two.
176164

177-
This skill produces commits. When the work is tracked in Linear and ends in a pull request, hand off to `linear-issue-workflow` for Phase 6–7. Non-negotiable bar (also encoded in `review` and `pull-request-review`):
165+
## Acknowledgment
178166

179-
1. **Post a real GitHub PR review** with `gh pr review` after the PR exists — not a one-line self-review issue comment.
180-
2. **Multi-persona when used:** if critic / greybeard / OSS-quality lenses ran with substance, each posts its own labeled review. Primary owns approve/request-changes; secondary lenses comment only.
181-
3. **No AI slop in review bodies:** lens · verdict, one present-tense line on what the branch does, `path:line` findings. No filler, journey narration, or "LGTM" alone.
182-
4. **Linear: In Review at ready-for-review PR-open; checkboxes and Done post-merge + green CI only.** The Phase 6–7 handoff in `linear-issue-workflow` must move the issue to In Review when the PR is ready for review. Flip boxes and mark Done only when `main` actually has the outcome. Never Done on open PR.
167+
After reviewing this skill, state: "I have reviewed the implement skill and am ready to follow the commit workflow."

plugins/corbits-skills/skills/native-integration/SKILL.md

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,27 @@ Corbits tests use `bun:test` (`bun test`, `bun run test`), not GaaS `tap` (`impo
2020

2121
When a GaaS skill names a Claude/GaaS tool, use the Corbits equivalent. Do not call the GaaS name.
2222

23-
| GaaS / Claude | Corbits |
24-
| --------------------- | -------------------------------------------------- |
25-
| TaskCreate | `manage_tasks` |
26-
| TaskUpdate | `manage_tasks` |
27-
| AskUserQuestion | `ask_operator` (primary) / `ask_director` (worker) |
28-
| `Task` / `@greybeard` | `spawn_agent(agent="greybeard")` |
29-
| `@critic` | `spawn_agent(agent="critic")` |
30-
| `@intern` | `spawn_agent(agent="intern")` |
31-
| `@explorer` | `spawn_agent(agent="explorer")` |
32-
| Read / Write / Edit | `read_file` / `write_file` / `edit_file` |
33-
| Glob / Grep | `search_files` / `grep` |
34-
| Bash | `run_shell` |
35-
| WebFetch / WebSearch | `web_fetch` / `web_search` |
23+
| GaaS / Claude | Corbits |
24+
| ----------------------- | -------------------------------------------------- |
25+
| TaskCreate | `manage_tasks` |
26+
| TaskUpdate | `manage_tasks` |
27+
| TaskList | `manage_tasks` |
28+
| AskUserQuestion | `ask_operator` (primary) / `ask_director` (worker) |
29+
| `Task` / `@greybeard` | `spawn_agent(agent="greybeard")` |
30+
| `@critic` / `@critique` | `spawn_agent(agent="critic")` |
31+
| `@intern` | `spawn_agent(agent="intern")` |
32+
| `@explorer` | `spawn_agent(agent="explorer")` |
33+
| Read / Write / Edit | `read_file` / `write_file` / `edit_file` |
34+
| Glob / Grep | `search_files` / `grep` |
35+
| Bash | `run_shell` |
36+
| WebFetch / WebSearch | `web_fetch` / `web_search` |
3637

3738
`intent="general"` is not a Corbits spawn. Use a closed director id.
3839

3940
Slash names that differ from GaaS skill ids: `/review` is GaaS `code-review`; `/create-issue` is GaaS `linear-create`. Keep those Corbits names.
4041

42+
When GaaS implement says you are orchestrated by karen, that is the Corbits primary (Skywalker). Route those disposition decisions through the primary, not a worker.
43+
4144
## Linear claim-first
4245

4346
When the work tracks a Linear issue and Linear MCP is available: set the issue to In Progress before explore/build thrash. Parallel lanes claim their own IDs. When a PR is ready for review, move the issue to In Review — never Done at PR-open. If Linear MCP is unavailable, report that status could not be updated.

tests/unit/corbits-skills-catalog.test.ts

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ const SKILL_DIRS = [
2727
"idiot-proof",
2828
] as const;
2929

30-
const SPAWN_RECIPE_SKILLS = ["implement"] as const;
31-
3230
/** use_skill listing + resolve; not slash. No disable-model-invocation. */
3331
const USE_SKILL_ONLY = [
3432
"git-rebase",
@@ -109,13 +107,6 @@ test("corbits-skills catalog lists 18 skills with name and description", async (
109107
}
110108
});
111109

112-
test("spawn-recipe skills contain spawn_agent(agent=", async () => {
113-
for (const name of SPAWN_RECIPE_SKILLS) {
114-
const skill = await Bun.file(join(pluginRoot, "skills", name, "SKILL.md")).text();
115-
expect(skill).toContain("spawn_agent(agent=");
116-
}
117-
});
118-
119110
test("idiot-proof is a bake-only less-is-more bar", async () => {
120111
const skill = await Bun.file(join(pluginRoot, "skills/idiot-proof/SKILL.md")).text();
121112
expect(skill).toContain(USER_INVOCABLE_FALSE);
@@ -144,18 +135,18 @@ test("typescript skill is 1:1 with GaaS typescript", async () => {
144135
expect(skill).not.toContain("I have reviewed the typescript skill");
145136
});
146137

147-
test("implement skill is a per-commit workflow without a false 4-cap", async () => {
138+
test("implement skill is 1:1 with GaaS implement", async () => {
148139
const skill = await Bun.file(join(pluginRoot, "skills/implement/SKILL.md")).text();
149-
expect(skill).toContain('spawn_agent(agent="greybeard")');
150-
expect(skill).toContain('spawn_agent(agent="critic")');
151-
expect(skill).toContain("Do not invent a worker-count or fan-out ceiling");
152-
expect(skill).toContain("Close the loop");
153-
expect(skill).not.toContain("once or twice");
154-
expect(skill).not.toContain("After two re-fix rounds");
155-
expect(skill).not.toContain("hard cap 4");
156-
expect(skill).not.toContain("4 workers");
157-
expect(skill).not.toContain("max-parallel");
158-
expect(skill).not.toContain("INTERN_TOOLS");
140+
expect(skill).toContain("TaskCreate");
141+
expect(skill).toContain("@greybeard");
142+
expect(skill).toContain("@critique");
143+
expect(skill).toContain("## Acknowledgment");
144+
expect(skill).toContain(
145+
"I have reviewed the implement skill and am ready to follow the commit workflow.",
146+
);
147+
expect(skill).not.toContain("spawn_agent");
148+
expect(skill).not.toContain("Linear claim");
149+
expect(skill).not.toContain("Do not invent a worker-count");
159150
});
160151

161152
test("first-party skills are how-to playbooks, not director personas", async () => {
@@ -328,14 +319,15 @@ test("slash skills do not set user-invocable: false", async () => {
328319
}
329320
});
330321

331-
test("corbits-skills plugin files contain no banned tokens outside native-integration", async () => {
332-
const nativeRoot = join(pluginRoot, "skills", "native-integration");
333-
const files = await listFilesRecursive(pluginRoot);
334-
for (const file of files) {
335-
if (file.startsWith(nativeRoot)) continue;
336-
const text = await Bun.file(file).text();
337-
for (const token of BANNED_TOKENS) {
338-
expect(text).not.toContain(token);
322+
test("Corbits-only skills do not contain GaaS tool names", async () => {
323+
const corbitsOnly = ["plan", "git-worktrees", "idiot-proof"] as const;
324+
for (const name of corbitsOnly) {
325+
const files = await listFilesRecursive(join(pluginRoot, "skills", name));
326+
for (const file of files) {
327+
const text = await Bun.file(file).text();
328+
for (const token of BANNED_TOKENS) {
329+
expect(text).not.toContain(token);
330+
}
339331
}
340332
}
341333
});
@@ -345,7 +337,10 @@ test("native-integration maps GaaS tool names and parks Corbits extras", async (
345337
expect(skill).toContain(USER_INVOCABLE_FALSE);
346338
expect(skill).not.toContain(DISABLE_MODEL_INVOCATION);
347339
expect(skill).toContain("TaskCreate");
340+
expect(skill).toContain("TaskList");
348341
expect(skill).toContain("@greybeard");
342+
expect(skill).toContain("@critique");
343+
expect(skill).toContain("karen");
349344
expect(skill).toContain('intent="general"');
350345
expect(skill).toContain("manage_tasks");
351346
expect(skill).toContain('spawn_agent(agent="greybeard")');

0 commit comments

Comments
 (0)