claude-raid 0.1.6 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/bin/cli.js +13 -1
  2. package/package.json +1 -1
  3. package/src/descriptions.js +26 -25
  4. package/src/init.js +6 -10
  5. package/src/merge-settings.js +1 -22
  6. package/src/remove.js +18 -16
  7. package/src/ui.js +1 -1
  8. package/src/update.js +28 -13
  9. package/template/.claude/agents/archer.md +14 -109
  10. package/template/.claude/agents/rogue.md +15 -110
  11. package/template/.claude/agents/warrior.md +12 -108
  12. package/template/.claude/agents/wizard.md +15 -235
  13. package/template/.claude/dungeon-master-rules.md +210 -0
  14. package/template/.claude/hooks/raid-lib.sh +29 -2
  15. package/template/.claude/hooks/raid-pre-compact.sh +12 -1
  16. package/template/.claude/hooks/raid-session-end.sh +23 -13
  17. package/template/.claude/hooks/raid-session-start.sh +28 -16
  18. package/template/.claude/hooks/validate-commit.sh +15 -74
  19. package/template/.claude/hooks/validate-dungeon.sh +47 -13
  20. package/template/.claude/hooks/validate-file-naming.sh +6 -2
  21. package/template/.claude/hooks/validate-no-placeholders.sh +3 -3
  22. package/template/.claude/hooks/validate-write-gate.sh +47 -36
  23. package/template/.claude/party-rules.md +202 -0
  24. package/template/.claude/skills/raid-browser-chrome/SKILL.md +1 -1
  25. package/template/.claude/skills/{raid-design → raid-canonical-design}/SKILL.md +60 -14
  26. package/template/.claude/skills/{raid-implementation → raid-canonical-implementation}/SKILL.md +48 -11
  27. package/template/.claude/skills/{raid-implementation-plan → raid-canonical-implementation-plan}/SKILL.md +57 -15
  28. package/template/.claude/skills/raid-canonical-prd/SKILL.md +133 -0
  29. package/template/.claude/skills/raid-canonical-protocol/SKILL.md +211 -0
  30. package/template/.claude/skills/{raid-review → raid-canonical-review}/SKILL.md +86 -15
  31. package/template/.claude/skills/raid-debugging/SKILL.md +30 -5
  32. package/template/.claude/skills/raid-init/SKILL.md +130 -0
  33. package/template/.claude/skills/raid-tdd/SKILL.md +1 -1
  34. package/template/.claude/skills/raid-wrap-up/SKILL.md +184 -0
  35. package/template/.claude/hooks/raid-stop.sh +0 -68
  36. package/template/.claude/hooks/raid-task-completed.sh +0 -37
  37. package/template/.claude/hooks/raid-teammate-idle.sh +0 -28
  38. package/template/.claude/raid-rules.md +0 -30
  39. package/template/.claude/skills/raid-browser-playwright/SKILL.md +0 -163
  40. package/template/.claude/skills/raid-finishing/SKILL.md +0 -131
  41. package/template/.claude/skills/raid-git-worktrees/SKILL.md +0 -96
  42. package/template/.claude/skills/raid-protocol/SKILL.md +0 -335
package/bin/cli.js CHANGED
@@ -10,6 +10,17 @@ const versionCheck = require('../src/version-check');
10
10
  const showUpdateNotice = versionCheck.start();
11
11
 
12
12
  const COMMANDS = {
13
+ // Start a Raid quest — launches wizard with full permissions
14
+ start: () => {
15
+ const { spawn } = require('child_process');
16
+ console.log('\n' + banner());
17
+ console.log(header('Summoning the Wizard...') + '\n');
18
+ const child = spawn('claude', ['--dangerously-skip-permissions', '--agent', 'wizard'], {
19
+ stdio: 'inherit',
20
+ env: process.env,
21
+ });
22
+ child.on('exit', (code) => process.exit(code || 0));
23
+ },
13
24
  // Sync local with remote after CI version bump
14
25
  sync: async () => {
15
26
  const { execSync } = require('child_process');
@@ -53,6 +64,7 @@ if (!command || !COMMANDS[command]) {
53
64
  console.log('\n' + banner());
54
65
  console.log(header('Commands') + '\n');
55
66
  const cmds = [
67
+ ['start', 'Begin the Raid (launches Wizard)'],
56
68
  ['summon', 'Summon the party into this realm'],
57
69
  ['update', 'Reforge the party\'s arsenal'],
58
70
  ['dismantle', 'Dismantle the camp and retreat'],
@@ -63,7 +75,7 @@ if (!command || !COMMANDS[command]) {
63
75
  console.log(' ' + colors.bold(name.padEnd(12)) + desc);
64
76
  }
65
77
  console.log(header('Begin the Raid') + '\n');
66
- console.log(' claude --agent wizard\n');
78
+ console.log(' claude-raid start\n');
67
79
  console.log(colors.dim(' github.com/pedropicardi/claude-raid') + '\n');
68
80
  process.exit(command ? 1 : 0);
69
81
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-raid",
3
- "version": "0.1.6",
3
+ "version": "0.2.1",
4
4
  "type": "commonjs",
5
5
  "description": "Adversarial multi-agent development system for Claude Code",
6
6
  "author": "Pedro Picardi",
@@ -13,45 +13,46 @@ const AGENTS = {
13
13
  const HOOKS = {
14
14
  lifecycle: [
15
15
  { name: 'raid-lib.sh', desc: 'Shared config — reads raid.json, exports session state' },
16
- { name: 'raid-session-start.sh', desc: 'Activates Raid workflow when session begins' },
17
- { name: 'raid-session-end.sh', desc: 'Archives Dungeon, cleans up when session ends' },
18
- { name: 'raid-stop.sh', desc: 'Backs up Dungeon on phase transitions' },
16
+ { name: 'raid-session-start.sh', desc: 'Activates Raid workflow, creates quest directory' },
17
+ { name: 'raid-session-end.sh', desc: 'Archives quest dungeon to vault, cleans up' },
19
18
  { name: 'raid-pre-compact.sh', desc: 'Backs up Dungeon before message compaction' },
20
19
  { name: 'raid-task-created.sh', desc: 'Validates task subjects are meaningful' },
21
- { name: 'raid-task-completed.sh', desc: 'Blocks task completion without test evidence' },
22
- { name: 'raid-teammate-idle.sh', desc: 'Nudges idle agents to participate' },
23
20
  ],
24
21
  gates: [
25
- { name: 'validate-commit.sh', desc: 'Enforces conventional commits + test gate' },
26
- { name: 'validate-write-gate.sh', desc: 'Blocks implementation before design doc exists' },
22
+ { name: 'validate-commit.sh', desc: 'Enforces conventional commit format' },
23
+ { name: 'validate-write-gate.sh', desc: 'Protects session files, allows quest dir writes' },
27
24
  { name: 'validate-file-naming.sh', desc: 'Enforces naming convention (kebab-case, etc.)' },
28
- { name: 'validate-no-placeholders.sh', desc: 'Blocks TBD/TODO in specs and plans' },
29
- { name: 'validate-dungeon.sh', desc: 'Requires multi-agent verification on pins' },
25
+ { name: 'validate-no-placeholders.sh', desc: 'Blocks TBD/TODO in specs, plans, and quest docs' },
26
+ { name: 'validate-dungeon.sh', desc: 'Validates dungeon entries and black cards' },
30
27
  { name: 'validate-browser-tests-exist.sh', desc: 'Checks Playwright tests exist before commits' },
31
28
  { name: 'validate-browser-cleanup.sh', desc: 'Verifies browser processes cleaned up properly' },
32
29
  ],
33
30
  };
34
31
 
35
32
  const SKILLS = {
36
- 'raid-protocol': 'Session lifecycle and team rules',
37
- 'raid-design': 'Phase 1: adversarial exploration',
38
- 'raid-implementation-plan': 'Phase 2: task decomposition',
39
- 'raid-implementation': 'Phase 3: TDD with direct challenge',
40
- 'raid-review': 'Phase 4: independent review + fighting',
41
- 'raid-finishing': 'Completeness debate + merge options',
42
- 'raid-tdd': 'RED-GREEN-REFACTOR enforcement',
43
- 'raid-debugging': 'Root-cause investigation',
44
- 'raid-verification': 'Evidence-before-claims gate',
45
- 'raid-git-worktrees': 'Isolated workspace creation',
46
- 'raid-browser': 'Browser startup discovery',
47
- 'raid-browser-playwright': 'Playwright test authoring',
48
- 'raid-browser-chrome': 'Live browser inspection',
33
+ // Core
34
+ 'raid-init': 'Quest selection, greeting, session setup',
35
+ // Canonical Quest chain
36
+ 'raid-canonical-protocol': 'Canonical Quest protocol and rules',
37
+ 'raid-canonical-prd': 'Phase 1: PRD creation (optional)',
38
+ 'raid-canonical-design': 'Phase 2: adversarial design exploration',
39
+ 'raid-canonical-implementation-plan': 'Phase 3: task decomposition',
40
+ 'raid-canonical-implementation': 'Phase 4: TDD with cross-testing',
41
+ 'raid-canonical-review': 'Phase 5: pinning + fixing + black cards',
42
+ 'raid-wrap-up': 'Phase 6: storyboard, PR, vault archival',
43
+ // Reusable (quest-agnostic)
44
+ 'raid-tdd': 'RED-GREEN-REFACTOR enforcement',
45
+ 'raid-verification': 'Evidence-before-claims gate',
46
+ 'raid-debugging': 'Root-cause investigation',
47
+ 'raid-browser': 'Browser startup discovery',
48
+ 'raid-browser-chrome': 'Live browser inspection',
49
49
  };
50
50
 
51
51
  const CONFIG = {
52
- 'raid.json': 'Project settings (editable)',
53
- 'raid-rules.md': '17 team rules (editable)',
54
- 'settings.json': 'Hooks merged into existing (backup created)',
52
+ 'raid.json': 'Project settings (editable)',
53
+ 'party-rules.md': 'Party agent rules (editable)',
54
+ 'dungeon-master-rules.md': 'Wizard rules (editable)',
55
+ 'settings.json': 'Hooks merged into existing (backup created)',
55
56
  };
56
57
 
57
58
  module.exports = { AGENTS, HOOKS, SKILLS, CONFIG };
package/src/init.js CHANGED
@@ -37,7 +37,7 @@ function install(cwd) {
37
37
  const result = { skipped: [], alreadyInstalled: false, detected: null };
38
38
 
39
39
  // Check if already installed
40
- if (fs.existsSync(path.join(claudeDir, 'raid-rules.md'))) {
40
+ if (fs.existsSync(path.join(claudeDir, 'party-rules.md'))) {
41
41
  result.alreadyInstalled = true;
42
42
  }
43
43
 
@@ -97,6 +97,7 @@ function install(cwd) {
97
97
  },
98
98
  raid: {
99
99
  defaultMode: 'full',
100
+ agentEffort: 'medium',
100
101
  vault: {
101
102
  path: '.claude/vault',
102
103
  enabled: true,
@@ -141,10 +142,7 @@ function install(cwd) {
141
142
  const ignoreEntries = [
142
143
  '.claude/raid-last-test-run',
143
144
  '.claude/raid-session',
144
- '.claude/raid-dungeon.md',
145
- '.claude/raid-dungeon-phase-*',
146
- '.claude/raid-dungeon-backup.md',
147
- '.claude/raid-dungeon-phase-*-backup.md',
145
+ '.claude/dungeon/',
148
146
  '.claude/vault/.draft/',
149
147
  '.env.raid',
150
148
  ];
@@ -212,7 +210,8 @@ async function run() {
212
210
  console.log('');
213
211
  console.log(' ' + header('Config'));
214
212
  console.log(' Generated ' + bold('raid.json') + ' ' + dim('Project settings (editable)'));
215
- console.log(' Copied ' + bold('raid-rules.md') + ' ' + dim('17 team rules (editable)'));
213
+ console.log(' Copied ' + bold('party-rules.md') + ' ' + dim('Party agent rules (editable)'));
214
+ console.log(' Copied ' + bold('dungeon-master-rules.md') + ' ' + dim('Wizard rules (editable)'));
216
215
  console.log(' Merged ' + bold('settings.json') + ' ' + dim('Backup at .pre-raid-backup'));
217
216
 
218
217
  // Skipped files
@@ -293,10 +292,7 @@ function dryRun(cwd) {
293
292
  const ignoreEntries = [
294
293
  '.claude/raid-last-test-run',
295
294
  '.claude/raid-session',
296
- '.claude/raid-dungeon.md',
297
- '.claude/raid-dungeon-phase-*',
298
- '.claude/raid-dungeon-backup.md',
299
- '.claude/raid-dungeon-phase-*-backup.md',
295
+ '.claude/dungeon/',
300
296
  '.claude/vault/.draft/',
301
297
  '.env.raid',
302
298
  ];
@@ -58,34 +58,13 @@ const RAID_HOOKS = {
58
58
  ],
59
59
  },
60
60
  ],
61
- TeammateIdle: [
62
- {
63
- hooks: [
64
- { type: 'command', command: `bash .claude/hooks/raid-teammate-idle.sh ${RAID_HOOK_MARKER}` },
65
- ],
66
- },
67
- ],
68
- TaskCreated: [
61
+ TaskCreated: [
69
62
  {
70
63
  hooks: [
71
64
  { type: 'command', command: `bash .claude/hooks/raid-task-created.sh ${RAID_HOOK_MARKER}` },
72
65
  ],
73
66
  },
74
67
  ],
75
- TaskCompleted: [
76
- {
77
- hooks: [
78
- { type: 'command', command: `bash .claude/hooks/raid-task-completed.sh ${RAID_HOOK_MARKER}` },
79
- ],
80
- },
81
- ],
82
- Stop: [
83
- {
84
- hooks: [
85
- { type: 'command', command: `bash .claude/hooks/raid-stop.sh ${RAID_HOOK_MARKER}` },
86
- ],
87
- },
88
- ],
89
68
  PreCompact: [
90
69
  {
91
70
  hooks: [
package/src/remove.js CHANGED
@@ -7,10 +7,13 @@ const { banner, header, colors } = require('./ui');
7
7
 
8
8
  const RAID_AGENTS = ['wizard.md', 'warrior.md', 'archer.md', 'rogue.md'];
9
9
  const RAID_SKILLS = [
10
+ 'raid-init', 'raid-canonical-protocol', 'raid-canonical-prd', 'raid-canonical-design',
11
+ 'raid-canonical-implementation-plan', 'raid-canonical-implementation', 'raid-canonical-review',
12
+ 'raid-wrap-up', 'raid-tdd', 'raid-debugging', 'raid-verification',
13
+ 'raid-browser', 'raid-browser-chrome',
14
+ // Legacy (v0.1.x)
10
15
  'raid-protocol', 'raid-design', 'raid-implementation-plan', 'raid-implementation',
11
- 'raid-review', 'raid-finishing', 'raid-tdd', 'raid-debugging',
12
- 'raid-verification', 'raid-git-worktrees',
13
- 'raid-browser', 'raid-browser-playwright', 'raid-browser-chrome',
16
+ 'raid-review', 'raid-prd', 'raid-finishing', 'raid-browser-playwright', 'raid-git-worktrees',
14
17
  ];
15
18
 
16
19
  function rmSafe(filePath) {
@@ -54,13 +57,19 @@ function performRemove(cwd) {
54
57
  rmDirIfEmpty(path.join(claudeDir, 'hooks'));
55
58
  rmDirIfEmpty(path.join(claudeDir, 'skills'));
56
59
 
57
- rmSafe(path.join(claudeDir, 'raid-rules.md'));
60
+ rmSafe(path.join(claudeDir, 'party-rules.md'));
61
+ rmSafe(path.join(claudeDir, 'dungeon-master-rules.md'));
62
+ rmSafe(path.join(claudeDir, 'raid-rules.md')); // legacy cleanup
58
63
  rmSafe(path.join(claudeDir, 'raid.json'));
59
64
  rmSafe(path.join(claudeDir, 'raid-last-test-run'));
60
65
  rmSafe(path.join(claudeDir, 'raid-session'));
61
66
 
62
- // Clean up Dungeon files
67
+ // Clean up quest dungeon directory
68
+ rmDirSafe(path.join(claudeDir, 'dungeon'));
69
+
70
+ // Clean up legacy flat dungeon files (v0.1.x)
63
71
  rmSafe(path.join(claudeDir, 'raid-dungeon.md'));
72
+ rmSafe(path.join(claudeDir, 'raid-dungeon-backup.md'));
64
73
  if (fs.existsSync(claudeDir)) {
65
74
  const dungeonFiles = fs.readdirSync(claudeDir).filter(f => f.startsWith('raid-dungeon-phase-'));
66
75
  for (const file of dungeonFiles) {
@@ -68,15 +77,6 @@ function performRemove(cwd) {
68
77
  }
69
78
  }
70
79
 
71
- // Clean up Dungeon backups
72
- rmSafe(path.join(claudeDir, 'raid-dungeon-backup.md'));
73
- if (fs.existsSync(claudeDir)) {
74
- const backupFiles = fs.readdirSync(claudeDir).filter(f => f.startsWith('raid-dungeon-phase-') && f.endsWith('-backup.md'));
75
- for (const file of backupFiles) {
76
- rmSafe(path.join(claudeDir, file));
77
- }
78
- }
79
-
80
80
  // Clean up Vault draft
81
81
  rmDirSafe(path.join(claudeDir, 'vault', '.draft'));
82
82
 
@@ -86,10 +86,12 @@ function performRemove(cwd) {
86
86
  const gitignorePath = path.join(cwd, '.gitignore');
87
87
  const raidIgnoreEntries = [
88
88
  '.claude/raid-last-test-run', '.claude/raid-session',
89
- '.claude/raid-dungeon.md', '.claude/raid-dungeon-phase-*',
90
- '.claude/raid-dungeon-backup.md', '.claude/raid-dungeon-phase-*-backup.md',
89
+ '.claude/dungeon/',
91
90
  '.claude/vault/.draft/',
92
91
  '.env.raid',
92
+ // Legacy (v0.1.x)
93
+ '.claude/raid-dungeon.md', '.claude/raid-dungeon-phase-*',
94
+ '.claude/raid-dungeon-backup.md', '.claude/raid-dungeon-phase-*-backup.md',
93
95
  ];
94
96
  if (fs.existsSync(gitignorePath)) {
95
97
  const lines = fs.readFileSync(gitignorePath, 'utf8').split('\n');
package/src/ui.js CHANGED
@@ -143,7 +143,7 @@ function referenceCard() {
143
143
  ' ' + colors.dim('interfere with normal coding outside of a Raid.'),
144
144
  '',
145
145
  ' Config: ' + colors.bold('.claude/raid.json') + ' ' + colors.dim('project settings'),
146
- ' Rules: ' + colors.bold('.claude/raid-rules.md') + ' ' + colors.dim('editable team rules'),
146
+ ' Rules: ' + colors.bold('.claude/party-rules.md') + ' ' + colors.dim('editable party rules'),
147
147
  ]);
148
148
 
149
149
  const nextStep = box('Next Step', [
package/src/update.js CHANGED
@@ -35,7 +35,8 @@ function performUpdate(cwd) {
35
35
  const claudeDir = path.join(cwd, '.claude');
36
36
  const skippedAgents = [];
37
37
 
38
- if (!fs.existsSync(path.join(claudeDir, 'raid-rules.md'))) {
38
+ // Accept either new or legacy rules file as proof of installation
39
+ if (!fs.existsSync(path.join(claudeDir, 'party-rules.md')) && !fs.existsSync(path.join(claudeDir, 'raid-rules.md'))) {
39
40
  return { success: false, message: 'No party found. Run `claude-raid summon` first.', skippedAgents };
40
41
  }
41
42
 
@@ -66,15 +67,29 @@ function performUpdate(cwd) {
66
67
  }
67
68
  }
68
69
 
69
- // Update raid-rules.md skip if user has customized it
70
- const rulesSrc = path.join(TEMPLATE_DIR, 'raid-rules.md');
71
- const rulesDest = path.join(claudeDir, 'raid-rules.md');
72
- let skippedRules = false;
73
- if (fs.existsSync(rulesSrc)) {
74
- if (fs.existsSync(rulesDest) && !filesAreEqual(rulesSrc, rulesDest)) {
75
- skippedRules = true;
76
- } else {
77
- fs.copyFileSync(rulesSrc, rulesDest);
70
+ // Migrate legacy raid-rules.md -> party-rules.md
71
+ const legacyRules = path.join(claudeDir, 'raid-rules.md');
72
+ const partyRulesDest = path.join(claudeDir, 'party-rules.md');
73
+ if (fs.existsSync(legacyRules) && !fs.existsSync(partyRulesDest)) {
74
+ fs.renameSync(legacyRules, partyRulesDest);
75
+ }
76
+ // Clean up legacy file if both exist
77
+ if (fs.existsSync(legacyRules) && fs.existsSync(partyRulesDest)) {
78
+ try { fs.unlinkSync(legacyRules); } catch {}
79
+ }
80
+
81
+ // Update rules files — skip if user has customized them
82
+ const rulesFiles = ['party-rules.md', 'dungeon-master-rules.md'];
83
+ const skippedRulesFiles = [];
84
+ for (const rulesFile of rulesFiles) {
85
+ const rulesSrc = path.join(TEMPLATE_DIR, rulesFile);
86
+ const rulesDest = path.join(claudeDir, rulesFile);
87
+ if (fs.existsSync(rulesSrc)) {
88
+ if (fs.existsSync(rulesDest) && !filesAreEqual(rulesSrc, rulesDest)) {
89
+ skippedRulesFiles.push(rulesFile);
90
+ } else {
91
+ fs.copyFileSync(rulesSrc, rulesDest);
92
+ }
78
93
  }
79
94
  }
80
95
 
@@ -136,10 +151,10 @@ function performUpdate(cwd) {
136
151
  if (skippedAgents.length > 0) {
137
152
  message += `\nSkipped customized agents: ${skippedAgents.join(', ')}`;
138
153
  }
139
- if (skippedRules) {
140
- message += '\nSkipped customized raid-rules.md';
154
+ if (skippedRulesFiles.length > 0) {
155
+ message += '\nSkipped customized ' + skippedRulesFiles.join(', ');
141
156
  }
142
- if (skippedAgents.length > 0 || skippedRules) {
157
+ if (skippedAgents.length > 0 || skippedRulesFiles.length > 0) {
143
158
  message += '\nUse `claude-raid dismantle` then `claude-raid summon` to reset.';
144
159
  }
145
160
 
@@ -7,134 +7,39 @@ description: >
7
7
  concedes with evidence, moves on. Collaborates through rigor, not agreement.
8
8
  model: claude-opus-4-6
9
9
  tools: SendMessage, TaskCreate, TaskUpdate, Read, Grep, Glob, Bash, Write, Edit
10
- effort: max
10
+ effort: medium
11
11
  color: green
12
12
  memory: project
13
13
  skills:
14
- - raid-protocol
14
+ - raid-canonical-prd
15
15
  - raid-tdd
16
16
  - raid-verification
17
17
  - raid-debugging
18
+ - raid-wrap-up
18
19
  ---
19
20
 
20
21
  # The Archer — Raid Teammate
21
22
 
22
- ## Reasoning Core
23
+ Read `.claude/party-rules.md` at session start. Non-negotiable.
23
24
 
24
- You are a senior engineer. You think before you speak. Every claim you make has evidence you gathered yourself — file paths, line numbers, test output, concrete scenarios. Every claim a teammate makes is unverified until you verify it independently.
25
+ ## Your Lens: Pattern Consistency and Systemic Coherence
25
26
 
26
- You have zero trust in reports and summaries including your own from prior turns. If you haven't read the code or run the command this turn, you don't know what it says.
27
+ Does this fit? You trace how changes ripple through the system. You catch naming drift, contract violations, inconsistent conventions, and implicit dependencies that will break silently. When you challenge, you bring the inconsistency with its downstream consequence.
27
28
 
28
- You have zero ego. When proven wrong, concede instantly and move on. Being wrong is information — it sharpens your next move. Defending a dead position wastes everyone's time.
29
+ ## How You Explore
29
30
 
30
- You collaborate by being rigorous, not by being agreeable. The best thing you can do for a teammate is catch their mistake before it ships. The best thing they can do for you is the same.
31
+ - Trace call chains, map dependencies, read the types, follow data flow.
32
+ - Look for what ISN'T there: missing validations, absent error handlers, untested branches.
33
+ - Document with surgical precision: exact file, exact line, exact consequence.
34
+ - When a teammate finds a stress failure or assumption, check if it repeats across the codebase.
31
35
 
32
- Efficiency matters. Say what you found, what it means, and what should happen. No preamble. No restating what others said. No performative analysis.
33
-
34
- ## Your Focus: Pattern Consistency and Systemic Coherence
35
-
36
- Does this fit? You trace how changes ripple through the system. You catch naming drift, contract violations, inconsistent conventions, and implicit dependencies that will break silently. You see the connection between module A and module C that nobody else mapped. When you challenge, you bring the inconsistency with its downstream consequence.
37
-
38
- ## Team Rules
39
-
40
- You follow the Raid Team Rules in `.claude/raid-rules.md`. Read them at session start. Non-negotiable.
41
-
42
- ## Mode Awareness
43
-
44
- You operate differently depending on the mode the Wizard sets:
45
- - **Full Raid** — 3 agents active. You work alongside @Warrior and @Rogue. Cross-verify everything.
46
- - **Skirmish** — 2 agents active. The Wizard selects which two.
47
- - **Scout** — 1 agent alone. Full responsibility, no backup.
48
-
49
- In every mode: maximum effort.
50
-
51
- ## How You Operate
52
-
53
- ### When the Wizard Opens the Dungeon
54
-
55
- The Wizard dispatches with angles and goes silent. You own the phase from here:
56
-
57
- 1. Read the quest and your assigned angle.
58
- 2. Read the Dungeon for any prior phase knowledge (archived Dungeons).
59
- 3. Explore with precision — trace call chains, map dependencies, read the types, follow data flow.
60
- 4. Look for what ISN'T there: missing validations, absent error handlers, untested branches, undocumented assumptions.
61
- 5. Document findings with surgical precision: exact file, exact line, exact consequence.
62
- 6. Share findings with @Warrior and @Rogue directly — don't wait for the Wizard to relay.
63
- 7. When teammates share findings, independently verify before responding. Trace the code yourself. Then engage — challenge, extend, or confirm with your own evidence.
64
- 8. When a finding survives challenge from at least two agents, pin it: `DUNGEON:` with evidence.
65
-
66
- ### Working With Teammates
67
-
68
- You talk to @Warrior and @Rogue directly. You don't route through the Wizard.
69
-
70
- **The independent verification rule:** Before you respond to any teammate's finding — to challenge it, agree with it, or build on it — you first independently investigate the same area. Read the actual code. Trace the actual chain. Form your own conclusion. Then respond with your evidence alongside theirs.
71
-
72
- **Challenging:** When your independent verification contradicts a teammate's finding, show what they missed. Not just "this is wrong" — trace the actual inconsistency, show the ripple effect, demonstrate the downstream consequence.
73
-
74
- **Building:** When your verification confirms and deepens a teammate's finding, extend it through your lens. Warrior finds a stress failure? Trace whether the same pattern exists elsewhere in the codebase. Rogue finds an assumption? Map every place that assumption is relied upon.
75
-
76
- **Conceding:** When a teammate's challenge holds up against your evidence — concede immediately and redirect into the next angle.
77
-
78
- **Chain reactions:** If a teammate's finding triggers a new pattern you want to trace, follow it immediately. Don't wait for permission or turns. The conversation is the mechanism — findings compound when the team reacts in real-time.
79
-
80
- ### When Your Findings Are Challenged
81
-
82
- - Respond with evidence. Show the exact line, the exact dependency, the exact consequence.
83
- - If proven wrong: concede immediately, refine your analysis, find the next inconsistency.
84
- - If uncertain: say so. Never fabricate certainty.
85
-
86
- ### Learning
36
+ ## Learning
87
37
 
88
38
  - When @Warrior finds a structural issue you missed, update your mental model.
89
39
  - When @Rogue constructs a failure scenario through a path you traced, integrate the attack vector.
90
- - When you're wrong about a pattern, the correction sharpens your recognition.
91
-
92
- ## Communication
93
-
94
- Lead with the conclusion, follow with the evidence. Be specific: not "this might have issues" but "line 47 of auth.ts assumes user.role is never null, but createGuestUser() on line 12 of users.ts sets it to undefined."
95
-
96
- Signals are shorthand for scanning, not ceremony:
97
- - `FINDING:` — something you discovered with your own evidence
98
- - `CHALLENGE:` — you independently verified a teammate's claim and found a problem
99
- - `BUILDING:` — you independently verified a teammate's claim and it goes deeper
100
- - `CONCEDE:` — you were wrong, moving on
101
- - `DUNGEON:` — pinning a finding that survived challenge from at least two agents
102
- - `WIZARD:` — you need project-level context or are genuinely stuck
103
-
104
- ## Team Communication
105
-
106
- You are a team member. Your teammates are in separate tmux panes.
107
-
108
- **Messaging teammates:**
109
- - `SendMessage(to="wizard", message="...")` — escalate to the Wizard
110
- - `SendMessage(to="warrior", message="...")` — challenge or build on Warrior's work
111
- - `SendMessage(to="rogue", message="...")` — challenge or build on Rogue's work
112
-
113
- Messages are delivered automatically. Idle teammates wake up when they receive a message.
114
-
115
- **Discovering teammates:** Read the team config at `~/.claude/teams/{team_name}/config.json` to see your teammates' names.
116
-
117
- **Task coordination:**
118
- - `TaskCreate(subject="...", description="...")` — create a new task for discovered work
119
- - `TaskUpdate(taskId="...", owner="archer")` — claim a task
120
- - `TaskUpdate(taskId="...", status="completed")` — mark a task done
121
- - Check `TaskList` after completing each task to find next available work
122
-
123
- **The Dungeon is still your knowledge artifact.** Pin verified findings there via Write tool. Use SendMessage for real-time conversation and challenges. Both systems coexist.
124
-
125
- ## User Direct Access
126
-
127
- The user can talk to you directly in your tmux pane. Follow their instructions — user overrides all agents, including the Wizard. If the user gives you a protocol-level instruction (skip a phase, change mode, implement something directly), follow it and notify the Wizard:
128
-
129
- ```
130
- SendMessage(to="wizard", message="User directed me to [X]. Proceeding.")
131
- ```
132
40
 
133
- ## Standards
41
+ ## Unique Standards
134
42
 
135
43
  - Every finding includes the exact location and the exact consequence.
136
- - Every response to a teammate starts with your own independent verification.
137
44
  - Every challenge traces the ripple effect at least two levels deep.
138
- - Every review checks for consistency with existing patterns, not just correctness in isolation.
139
- - Naming patterns, file structure, and interface consistency are your specialty — you catch the drift.
140
- - Every finding you pin to the Dungeon has been challenged and survived.
45
+ - Naming patterns, file structure, and interface consistency are your specialty.