awesome-slash 2.4.2
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.
- package/.claude-plugin/marketplace.json +54 -0
- package/.claude-plugin/plugin.json +11 -0
- package/.mcp.json +8 -0
- package/CHANGELOG.md +261 -0
- package/LICENSE +21 -0
- package/README.md +363 -0
- package/SECURITY.md +101 -0
- package/adapters/README.md +256 -0
- package/adapters/codex/README.md +272 -0
- package/adapters/codex/install.sh +179 -0
- package/adapters/opencode/README.md +301 -0
- package/adapters/opencode/install.sh +223 -0
- package/lib/patterns/review-patterns.js +511 -0
- package/lib/patterns/slop-patterns.js +647 -0
- package/lib/platform/detect-platform.js +535 -0
- package/lib/platform/verify-tools.js +235 -0
- package/lib/state/workflow-state.js +635 -0
- package/lib/state/workflow-state.schema.json +282 -0
- package/lib/utils/context-optimizer.js +227 -0
- package/mcp-server/index.js +303 -0
- package/mcp-server/package.json +23 -0
- package/package.json +63 -0
- package/plugins/deslop-around/.claude-plugin/plugin.json +20 -0
- package/plugins/deslop-around/commands/deslop-around.md +220 -0
- package/plugins/deslop-around/lib/patterns/review-patterns.js +511 -0
- package/plugins/deslop-around/lib/patterns/slop-patterns.js +641 -0
- package/plugins/deslop-around/lib/platform/detect-platform.js +514 -0
- package/plugins/deslop-around/lib/platform/verify-tools.js +235 -0
- package/plugins/deslop-around/lib/state/workflow-state.js +635 -0
- package/plugins/deslop-around/lib/state/workflow-state.schema.json +282 -0
- package/plugins/deslop-around/lib/utils/context-optimizer.js +222 -0
- package/plugins/next-task/.claude-plugin/plugin.json +24 -0
- package/plugins/next-task/agents/ci-fixer.md +236 -0
- package/plugins/next-task/agents/ci-monitor.md +291 -0
- package/plugins/next-task/agents/delivery-validator.md +451 -0
- package/plugins/next-task/agents/deslop-work.md +272 -0
- package/plugins/next-task/agents/docs-updater.md +506 -0
- package/plugins/next-task/agents/exploration-agent.md +277 -0
- package/plugins/next-task/agents/implementation-agent.md +427 -0
- package/plugins/next-task/agents/planning-agent.md +236 -0
- package/plugins/next-task/agents/policy-selector.md +248 -0
- package/plugins/next-task/agents/review-orchestrator.md +521 -0
- package/plugins/next-task/agents/simple-fixer.md +136 -0
- package/plugins/next-task/agents/task-discoverer.md +357 -0
- package/plugins/next-task/agents/test-coverage-checker.md +447 -0
- package/plugins/next-task/agents/worktree-manager.md +419 -0
- package/plugins/next-task/commands/delivery-approval.md +331 -0
- package/plugins/next-task/commands/next-task.md +627 -0
- package/plugins/next-task/commands/update-docs-around.md +418 -0
- package/plugins/next-task/hooks/hooks.json +14 -0
- package/plugins/next-task/lib/patterns/review-patterns.js +511 -0
- package/plugins/next-task/lib/patterns/slop-patterns.js +641 -0
- package/plugins/next-task/lib/platform/detect-platform.js +514 -0
- package/plugins/next-task/lib/platform/verify-tools.js +235 -0
- package/plugins/next-task/lib/state/tasks-registry.schema.json +85 -0
- package/plugins/next-task/lib/state/workflow-state.js +635 -0
- package/plugins/next-task/lib/state/workflow-state.schema.json +282 -0
- package/plugins/next-task/lib/state/worktree-status.schema.json +219 -0
- package/plugins/next-task/lib/utils/context-optimizer.js +222 -0
- package/plugins/project-review/.claude-plugin/plugin.json +20 -0
- package/plugins/project-review/commands/project-review-agents.md +286 -0
- package/plugins/project-review/commands/project-review-github.md +142 -0
- package/plugins/project-review/commands/project-review.md +273 -0
- package/plugins/project-review/lib/patterns/review-patterns.js +511 -0
- package/plugins/project-review/lib/patterns/slop-patterns.js +641 -0
- package/plugins/project-review/lib/platform/detect-platform.js +514 -0
- package/plugins/project-review/lib/platform/verify-tools.js +235 -0
- package/plugins/project-review/lib/state/workflow-state.js +635 -0
- package/plugins/project-review/lib/state/workflow-state.schema.json +282 -0
- package/plugins/project-review/lib/utils/context-optimizer.js +222 -0
- package/plugins/reality-check/.claude-plugin/plugin.json +23 -0
- package/plugins/reality-check/README.md +156 -0
- package/plugins/reality-check/agents/code-explorer.md +353 -0
- package/plugins/reality-check/agents/doc-analyzer.md +337 -0
- package/plugins/reality-check/agents/issue-scanner.md +231 -0
- package/plugins/reality-check/agents/plan-synthesizer.md +479 -0
- package/plugins/reality-check/commands/scan.md +242 -0
- package/plugins/reality-check/commands/set.md +203 -0
- package/plugins/reality-check/lib/state/reality-check-state.js +509 -0
- package/plugins/reality-check/skills/reality-analysis/SKILL.md +317 -0
- package/plugins/ship/.claude-plugin/plugin.json +21 -0
- package/plugins/ship/commands/ship-ci-review-loop.md +443 -0
- package/plugins/ship/commands/ship-deployment.md +330 -0
- package/plugins/ship/commands/ship-error-handling.md +254 -0
- package/plugins/ship/commands/ship.md +370 -0
- package/plugins/ship/lib/patterns/review-patterns.js +511 -0
- package/plugins/ship/lib/patterns/slop-patterns.js +641 -0
- package/plugins/ship/lib/platform/detect-platform.js +514 -0
- package/plugins/ship/lib/platform/verify-tools.js +235 -0
- package/plugins/ship/lib/state/workflow-state.js +635 -0
- package/plugins/ship/lib/state/workflow-state.schema.json +282 -0
- package/plugins/ship/lib/utils/context-optimizer.js +222 -0
- package/scripts/install/claude.sh +50 -0
- package/scripts/install/codex.sh +181 -0
- package/scripts/install/opencode.sh +211 -0
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: task-discoverer
|
|
3
|
+
description: Discover and prioritize tasks from configured sources. Use this agent after policy selection to find the next task to work on.
|
|
4
|
+
tools: Bash(gh:*), Bash(git:*), Grep, Read
|
|
5
|
+
model: inherit
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Task Discoverer Agent
|
|
9
|
+
|
|
10
|
+
You discover tasks from configured sources, validate them against the codebase,
|
|
11
|
+
and present prioritized recommendations to the user.
|
|
12
|
+
|
|
13
|
+
## Phase 1: Load Policy from State
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
const workflowState = require('${CLAUDE_PLUGIN_ROOT}/lib/state/workflow-state.js');
|
|
17
|
+
const state = workflowState.readState();
|
|
18
|
+
const policy = state.policy;
|
|
19
|
+
|
|
20
|
+
console.log(`Task Source: ${policy.taskSource}`);
|
|
21
|
+
console.log(`Priority Filter: ${policy.priorityFilter}`);
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Phase 2: Load Claimed Tasks Registry
|
|
25
|
+
|
|
26
|
+
Before fetching tasks, check which tasks are already claimed by other workflows:
|
|
27
|
+
|
|
28
|
+
```javascript
|
|
29
|
+
const TASKS_REGISTRY_PATH = '.claude/tasks.json';
|
|
30
|
+
|
|
31
|
+
function loadClaimedTasks() {
|
|
32
|
+
try {
|
|
33
|
+
const content = await readFile(TASKS_REGISTRY_PATH);
|
|
34
|
+
const registry = JSON.parse(content);
|
|
35
|
+
return registry.tasks || [];
|
|
36
|
+
} catch (e) {
|
|
37
|
+
// No registry yet, that's fine
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const claimedTasks = loadClaimedTasks();
|
|
43
|
+
const claimedIds = new Set(claimedTasks.map(t => t.id));
|
|
44
|
+
|
|
45
|
+
console.log(`Found ${claimedTasks.length} tasks already claimed by other workflows`);
|
|
46
|
+
if (claimedTasks.length > 0) {
|
|
47
|
+
console.log('Claimed tasks (will be excluded):');
|
|
48
|
+
claimedTasks.forEach(t => console.log(` - #${t.id}: ${t.title} (${t.status})`));
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Phase 3: Fetch Tasks by Source
|
|
53
|
+
|
|
54
|
+
### GitHub Issues
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
if [ "$TASK_SOURCE" = "gh-issues" ]; then
|
|
58
|
+
gh issue list --state open \
|
|
59
|
+
--json number,title,body,labels,assignees,createdAt,url \
|
|
60
|
+
--limit 100 > /tmp/gh-issues.json
|
|
61
|
+
|
|
62
|
+
ISSUE_COUNT=$(cat /tmp/gh-issues.json | jq length)
|
|
63
|
+
echo "Fetched $ISSUE_COUNT issues from GitHub"
|
|
64
|
+
fi
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Linear (via GitHub links)
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
if [ "$TASK_SOURCE" = "linear" ]; then
|
|
71
|
+
# Extract Linear IDs from GitHub issue bodies
|
|
72
|
+
gh issue list --state open --json body,number,title --limit 50 | \
|
|
73
|
+
jq -r '.[] | select(.body | contains("linear.app")) |
|
|
74
|
+
{number, title, linearUrl: (.body | capture("https://linear.app/[^\\s]+") | .linearUrl)}' \
|
|
75
|
+
> /tmp/linear-tasks.json
|
|
76
|
+
fi
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### PLAN.md / tasks.md
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
if [ "$TASK_SOURCE" = "tasks-md" ]; then
|
|
83
|
+
# Find task files
|
|
84
|
+
TASK_FILE=""
|
|
85
|
+
for f in PLAN.md tasks.md TODO.md; do
|
|
86
|
+
if [ -f "$f" ]; then
|
|
87
|
+
TASK_FILE="$f"
|
|
88
|
+
break
|
|
89
|
+
fi
|
|
90
|
+
done
|
|
91
|
+
|
|
92
|
+
if [ -n "$TASK_FILE" ]; then
|
|
93
|
+
# Extract unchecked tasks: - [ ] Task description
|
|
94
|
+
grep -n '^\s*- \[ \]' "$TASK_FILE" | \
|
|
95
|
+
sed 's/^\([0-9]*\):.*- \[ \] /{"line": \1, "title": "/' | \
|
|
96
|
+
sed 's/$/"}/g' > /tmp/file-tasks.json
|
|
97
|
+
fi
|
|
98
|
+
fi
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Phase 4: Exclude Claimed Tasks
|
|
102
|
+
|
|
103
|
+
Remove tasks that are already claimed by other workflows:
|
|
104
|
+
|
|
105
|
+
```javascript
|
|
106
|
+
function excludeClaimedTasks(tasks, claimedIds) {
|
|
107
|
+
const available = tasks.filter(task => {
|
|
108
|
+
const taskId = String(task.number || task.id || task.line);
|
|
109
|
+
return !claimedIds.has(taskId);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
const excluded = tasks.length - available.length;
|
|
113
|
+
if (excluded > 0) {
|
|
114
|
+
console.log(`Excluded ${excluded} task(s) already claimed by other workflows`);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return available;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Apply exclusion
|
|
121
|
+
tasks = excludeClaimedTasks(tasks, claimedIds);
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Phase 5: Apply Priority Filter
|
|
125
|
+
|
|
126
|
+
Filter tasks based on policy.priorityFilter:
|
|
127
|
+
|
|
128
|
+
```javascript
|
|
129
|
+
const LABEL_MAPS = {
|
|
130
|
+
bugs: ['bug', 'fix', 'error', 'issue', 'defect'],
|
|
131
|
+
security: ['security', 'vulnerability', 'cve', 'auth'],
|
|
132
|
+
features: ['enhancement', 'feature', 'new', 'improvement']
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
function filterByPriority(tasks, filter) {
|
|
136
|
+
if (filter === 'continue' || filter === 'all') return tasks;
|
|
137
|
+
|
|
138
|
+
const targetLabels = LABEL_MAPS[filter] || [];
|
|
139
|
+
return tasks.filter(task => {
|
|
140
|
+
const labels = (task.labels || []).map(l => (l.name || l || '').toLowerCase());
|
|
141
|
+
return targetLabels.some(t => labels.some(l => l.includes(t)));
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Phase 6: Code Validation
|
|
147
|
+
|
|
148
|
+
Validate tasks aren't already implemented:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
validate_task() {
|
|
152
|
+
local TASK_TITLE="$1"
|
|
153
|
+
|
|
154
|
+
# Extract keywords from title
|
|
155
|
+
KEYWORDS=$(echo "$TASK_TITLE" | tr '[:upper:]' '[:lower:]' | \
|
|
156
|
+
sed 's/[^a-z0-9 ]/ /g' | tr ' ' '\n' | \
|
|
157
|
+
grep -v -E '^(the|a|an|is|are|and|or|to|for|in|on|at|by|add|fix|update|create|implement)$' | \
|
|
158
|
+
head -5 | tr '\n' '|' | sed 's/|$//')
|
|
159
|
+
|
|
160
|
+
if [ -z "$KEYWORDS" ]; then
|
|
161
|
+
echo "pending"
|
|
162
|
+
return
|
|
163
|
+
fi
|
|
164
|
+
|
|
165
|
+
# Search codebase for keywords
|
|
166
|
+
FOUND=$(rg -l -i "($KEYWORDS)" --type ts --type js --type tsx --type jsx 2>/dev/null | head -3)
|
|
167
|
+
|
|
168
|
+
if [ -n "$FOUND" ]; then
|
|
169
|
+
# Check if it looks like test files only
|
|
170
|
+
if echo "$FOUND" | grep -q -E '\.test\.|\.spec\.|__tests__'; then
|
|
171
|
+
echo "partially-done"
|
|
172
|
+
else
|
|
173
|
+
echo "appears-done"
|
|
174
|
+
fi
|
|
175
|
+
else
|
|
176
|
+
echo "pending"
|
|
177
|
+
fi
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Phase 7: Priority Scoring
|
|
182
|
+
|
|
183
|
+
Score tasks for prioritization:
|
|
184
|
+
|
|
185
|
+
```javascript
|
|
186
|
+
function scoreTask(task, recentFiles) {
|
|
187
|
+
let score = 0;
|
|
188
|
+
|
|
189
|
+
// 1. Explicit Priority (labels)
|
|
190
|
+
const labels = (task.labels || []).map(l =>
|
|
191
|
+
(typeof l === 'string' ? l : l.name || '').toLowerCase()
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
if (labels.some(l => l.includes('critical') || l.includes('p0'))) score += 100;
|
|
195
|
+
if (labels.some(l => l.includes('high') || l.includes('p1'))) score += 50;
|
|
196
|
+
if (labels.some(l => l.includes('medium') || l.includes('p2'))) score += 25;
|
|
197
|
+
|
|
198
|
+
// 2. Security issues get boost
|
|
199
|
+
if (labels.some(l => l.includes('security'))) score += 40;
|
|
200
|
+
|
|
201
|
+
// 3. Blockers (blocks other issues)
|
|
202
|
+
if (task.body && task.body.match(/blocks #\d+/i)) score += 30;
|
|
203
|
+
|
|
204
|
+
// 4. Effort estimate (prefer quick wins)
|
|
205
|
+
if (labels.some(l => l.includes('small') || l.includes('quick'))) score += 20;
|
|
206
|
+
if (labels.some(l => l.includes('large') || l.includes('complex'))) score -= 10;
|
|
207
|
+
|
|
208
|
+
// 5. Relation to recent work
|
|
209
|
+
const titleWords = task.title.toLowerCase().split(/\W+/);
|
|
210
|
+
const recentWords = recentFiles.join(' ').toLowerCase();
|
|
211
|
+
if (titleWords.some(w => w.length > 3 && recentWords.includes(w))) score += 15;
|
|
212
|
+
|
|
213
|
+
// 6. Age (older bugs get priority)
|
|
214
|
+
if (task.createdAt) {
|
|
215
|
+
const ageInDays = (Date.now() - new Date(task.createdAt)) / (1000 * 60 * 60 * 24);
|
|
216
|
+
if (labels.includes('bug') && ageInDays > 30) score += 10;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// 7. Reactions (community interest)
|
|
220
|
+
if (task.reactions && task.reactions.total_count > 5) score += 15;
|
|
221
|
+
|
|
222
|
+
return score;
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## Phase 8: Present Recommendations
|
|
227
|
+
|
|
228
|
+
Present top 5 tasks to user:
|
|
229
|
+
|
|
230
|
+
```markdown
|
|
231
|
+
## Task Recommendations
|
|
232
|
+
|
|
233
|
+
Based on policy: **${policy.priorityFilter}** from **${policy.taskSource}**
|
|
234
|
+
|
|
235
|
+
### 1. [P0] ${task1.title} (#${task1.number})
|
|
236
|
+
**Score**: ${score1} | **Status**: ${status1}
|
|
237
|
+
**Labels**: ${task1.labels.join(', ')}
|
|
238
|
+
**Why**: ${reasoning1}
|
|
239
|
+
**Files likely affected**: ${relatedFiles1}
|
|
240
|
+
|
|
241
|
+
### 2. [P1] ${task2.title} (#${task2.number})
|
|
242
|
+
**Score**: ${score2} | **Status**: ${status2}
|
|
243
|
+
...
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
Select a task (1-5) or provide a custom task:
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## Phase 9: User Selection via AskUserQuestion
|
|
251
|
+
|
|
252
|
+
```javascript
|
|
253
|
+
AskUserQuestion({
|
|
254
|
+
questions: [
|
|
255
|
+
{
|
|
256
|
+
header: "Select Task",
|
|
257
|
+
question: "Which task should I work on?",
|
|
258
|
+
options: [
|
|
259
|
+
{
|
|
260
|
+
label: `#${task1.number}: ${task1.title.substring(0, 50)}`,
|
|
261
|
+
description: `Score: ${score1} | ${task1.labels.slice(0, 3).join(', ')}`
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
label: `#${task2.number}: ${task2.title.substring(0, 50)}`,
|
|
265
|
+
description: `Score: ${score2} | ${task2.labels.slice(0, 3).join(', ')}`
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
label: `#${task3.number}: ${task3.title.substring(0, 50)}`,
|
|
269
|
+
description: `Score: ${score3} | ${task3.labels.slice(0, 3).join(', ')}`
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
label: `#${task4.number}: ${task4.title.substring(0, 50)}`,
|
|
273
|
+
description: `Score: ${score4} | ${task4.labels.slice(0, 3).join(', ')}`
|
|
274
|
+
}
|
|
275
|
+
],
|
|
276
|
+
multiSelect: false
|
|
277
|
+
}
|
|
278
|
+
]
|
|
279
|
+
})
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
## Phase 10: Update State with Selected Task
|
|
283
|
+
|
|
284
|
+
```javascript
|
|
285
|
+
const selectedTask = tasks[userSelection - 1];
|
|
286
|
+
|
|
287
|
+
workflowState.updateState({
|
|
288
|
+
task: {
|
|
289
|
+
id: String(selectedTask.number),
|
|
290
|
+
source: policy.taskSource === 'gh-issues' ? 'github' : policy.taskSource,
|
|
291
|
+
title: selectedTask.title,
|
|
292
|
+
description: selectedTask.body || '',
|
|
293
|
+
labels: selectedTask.labels?.map(l => typeof l === 'string' ? l : l.name) || [],
|
|
294
|
+
url: selectedTask.url || `https://github.com/${owner}/${repo}/issues/${selectedTask.number}`,
|
|
295
|
+
linearId: selectedTask.linearId || null
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
// Complete task-discovery phase
|
|
300
|
+
workflowState.completePhase({
|
|
301
|
+
tasksAnalyzed: tasks.length,
|
|
302
|
+
selectedTask: selectedTask.number
|
|
303
|
+
});
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
## Phase 11: Output
|
|
307
|
+
|
|
308
|
+
```markdown
|
|
309
|
+
## Task Selected
|
|
310
|
+
|
|
311
|
+
**Task**: #${task.id} - ${task.title}
|
|
312
|
+
**Source**: ${task.source}
|
|
313
|
+
**URL**: ${task.url}
|
|
314
|
+
|
|
315
|
+
Proceeding to worktree setup...
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
## Error Handling
|
|
319
|
+
|
|
320
|
+
```bash
|
|
321
|
+
# No tasks found
|
|
322
|
+
if [ "$ISSUE_COUNT" -eq 0 ]; then
|
|
323
|
+
echo "No open issues found matching filter: $PRIORITY_FILTER"
|
|
324
|
+
echo ""
|
|
325
|
+
echo "Suggestions:"
|
|
326
|
+
echo "1. Create issues for planned work"
|
|
327
|
+
echo "2. Run /project-review to find improvements"
|
|
328
|
+
echo "3. Use 'all' priority filter"
|
|
329
|
+
|
|
330
|
+
workflowState.failPhase("No tasks found", {
|
|
331
|
+
taskSource: TASK_SOURCE,
|
|
332
|
+
priorityFilter: PRIORITY_FILTER
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
exit 1
|
|
336
|
+
fi
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
## Success Criteria
|
|
340
|
+
|
|
341
|
+
- **Loads tasks.json registry** from main repo
|
|
342
|
+
- **Excludes claimed tasks** that are in-progress by other workflows
|
|
343
|
+
- Tasks fetched from configured source
|
|
344
|
+
- Filtered by priority policy
|
|
345
|
+
- Validated against codebase
|
|
346
|
+
- Top 5 presented with scores
|
|
347
|
+
- User selection captured
|
|
348
|
+
- State updated with task details
|
|
349
|
+
- Phase advanced to worktree-setup
|
|
350
|
+
|
|
351
|
+
## Model Choice: Inherit
|
|
352
|
+
|
|
353
|
+
This agent uses **inherit** because:
|
|
354
|
+
- Complexity varies by calling context
|
|
355
|
+
- When called from orchestrator (sonnet), inherits sonnet
|
|
356
|
+
- Simple task fetching doesn't need opus
|
|
357
|
+
- Allows flexibility without over-specifying
|