@dreki-gg/pi-subagent 0.5.0 → 0.7.0

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 (32) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +99 -49
  3. package/agents/advisor.md +37 -0
  4. package/agents/bug-prover.md +42 -0
  5. package/agents/docs-scout.md +2 -2
  6. package/agents/manager.md +52 -0
  7. package/agents/planner.md +16 -1
  8. package/agents/reviewer.md +65 -8
  9. package/agents/scout.md +5 -1
  10. package/agents/validator.md +42 -0
  11. package/agents/worker.md +39 -3
  12. package/docs/orchestration-principles.md +132 -0
  13. package/docs/plans/01_structured-handoffs-and-synthesis.plan.md +376 -0
  14. package/docs/plans/02_clean-context-review-loop.plan.md +240 -0
  15. package/docs/plans/03_parallel-recon-single-writer-docs.plan.md +199 -0
  16. package/docs/plans/04_manager-workflow.plan.md +248 -0
  17. package/docs/plans/05_advisor-routing.plan.md +244 -0
  18. package/extensions/subagent/agent-result-utils.ts +12 -0
  19. package/extensions/subagent/agent-runner-types.ts +23 -0
  20. package/extensions/subagent/{delegate-executor.ts → agent-runner.ts} +10 -29
  21. package/extensions/subagent/agents.ts +11 -0
  22. package/extensions/subagent/handoffs.ts +273 -0
  23. package/extensions/subagent/index.ts +494 -196
  24. package/extensions/subagent/{delegate-args.ts → run-agent-args.ts} +35 -29
  25. package/package.json +3 -6
  26. package/skills/spawn-subagents/SKILL.md +80 -8
  27. package/extensions/subagent/delegate-types.ts +0 -62
  28. package/extensions/subagent/delegate-ui.ts +0 -132
  29. package/extensions/subagent/workflows.ts +0 -150
  30. package/prompts/implement-and-review.md +0 -10
  31. package/prompts/implement.md +0 -10
  32. package/prompts/scout-and-plan.md +0 -9
@@ -0,0 +1,132 @@
1
+ # Orchestration Principles
2
+
3
+ `@dreki-gg/pi-subagent` is an opinionated orchestration package.
4
+
5
+ Its default operating model is simple: use extra agents to improve reconnaissance, planning, and review, while keeping implementation coherent under one writer unless ownership is clearly partitioned.
6
+
7
+ ## Default philosophy
8
+
9
+ - Prefer **one writer, many thinkers**.
10
+ - Use **parallel mode for discovery**, not for competing edits.
11
+ - Use **chain mode for safe sequential handoffs** between scout, planner, worker, and reviewer.
12
+ - Treat `reviewer` as a **fresh-context verifier**, not as a second implementation agent.
13
+ - Reach for subagents to reduce context rot and sharpen conclusions, not to create an arbitrary swarm.
14
+
15
+ ## When to use each mode
16
+
17
+ ### `single`
18
+
19
+ Use `single` when one specialist can do the job.
20
+
21
+ Good fits:
22
+ - `scout` tracing a code path
23
+ - `docs-scout` checking framework or library docs
24
+ - `planner` producing a focused implementation plan
25
+ - `worker` implementing a bounded change
26
+ - `reviewer` performing a focused review
27
+ - `validator` confirming or falsifying a specific bug claim
28
+ - `bug-prover` creating a minimal failing repro when proof needs a new artifact
29
+
30
+ ### `parallel`
31
+
32
+ Use `parallel` when tasks are read-heavy, independent, and easy to synthesize.
33
+
34
+ Good fits:
35
+ - `scout` + `docs-scout` gathering code and docs context at the same time
36
+ - two scouts inspecting different subsystems
37
+ - multiple reviewers checking different bounded concerns
38
+
39
+ Avoid `parallel` when two agents would edit the same files, make overlapping design decisions, or race to implement the same slice.
40
+
41
+ ### `chain`
42
+
43
+ Use `chain` when a task benefits from ordered handoffs.
44
+
45
+ Good fits:
46
+ - discovery before planning
47
+ - planning before implementation
48
+ - implementation before review
49
+ - review findings before a final fix pass
50
+
51
+ Prefer compact handoffs and summaries over long transcript dumps.
52
+
53
+ ## Recommended workflows
54
+
55
+ ### Scout → planner → worker
56
+
57
+ Use this when the task is unclear or spans multiple files.
58
+
59
+ - `scout` identifies relevant code, constraints, and touched files
60
+ - `planner` turns that into a concrete implementation path
61
+ - `worker` executes with a coherent plan
62
+
63
+ ### Worker → reviewer → validator / bug-prover → worker
64
+
65
+ Use this when you want fresh-context verification before returning a result and some review claims need proof.
66
+
67
+ - `worker` makes the change
68
+ - `reviewer` checks the diff and code with a fresh lens
69
+ - `validator` confirms uncertain claims from commands, existing tests, and code
70
+ - `bug-prover` creates the smallest failing repro only when proof needs a new artifact
71
+ - `worker` applies concrete, scoped fixes after claims are evidenced
72
+
73
+ ### Scout + docs-scout in parallel
74
+
75
+ Use this when both repository context and external documentation matter.
76
+
77
+ - `scout` inspects the local codebase
78
+ - `docs-scout` checks framework, library, or API docs
79
+ - the main thread synthesizes both into one next action
80
+
81
+ ## Non-goals
82
+
83
+ This package is not trying to optimize for:
84
+
85
+ - arbitrary agent swarms
86
+ - multi-writer editing without clear file ownership
87
+ - speculative parallel implementations of the same task
88
+ - using subagents as a substitute for coherent architecture decisions
89
+ - pushing raw agent logs back into the main thread as the primary artifact
90
+
91
+ ## Examples
92
+
93
+ ### Single specialist
94
+
95
+ ```text
96
+ /run-agent scout trace how auth state is loaded
97
+ ```
98
+
99
+ ### Parallel recon
100
+
101
+ ```ts
102
+ subagent({
103
+ tasks: [
104
+ { agent: "scout", task: "Trace how auth state is loaded" },
105
+ { agent: "docs-scout", task: "Check the latest auth library session refresh docs" },
106
+ ],
107
+ })
108
+ ```
109
+
110
+ ### Plan then implement
111
+
112
+ ```ts
113
+ subagent({
114
+ chain: [
115
+ { agent: "scout", task: "Find all code relevant to auth session refresh" },
116
+ { agent: "planner", task: "Create an implementation plan for auth session refresh using {previous} as the handoff" },
117
+ { agent: "worker", task: "Implement the auth session refresh plan from {previous}" },
118
+ ],
119
+ })
120
+ ```
121
+
122
+ ### Implement and review
123
+
124
+ ```ts
125
+ subagent({
126
+ chain: [
127
+ { agent: "worker", task: "Implement questionnaire validation improvements" },
128
+ { agent: "reviewer", task: "Review the diff using {previous} as a compact handoff" },
129
+ { agent: "worker", task: "Address concrete findings from {previous}" },
130
+ ],
131
+ })
132
+ ```
@@ -0,0 +1,376 @@
1
+ ---
2
+ name: "Structured handoffs + synthesis for chain workflows"
3
+ overview: "Introduce a first-class handoff format for `@dreki-gg/pi-subagent` so chained agents pass compact, decision-rich context instead of raw `{previous}` markdown blobs. This slice should improve coherence across isolated agents without changing the core single/parallel/chain execution model."
4
+ todo:
5
+ - id: "structured-handoffs-1"
6
+ task: "Add a handoff module that normalizes agent output into a compact envelope with goal, decisions, constraints, files, symbols, and raw output"
7
+ status: pending
8
+ - id: "structured-handoffs-2"
9
+ task: "Thread the structured handoff through chain execution in `extensions/subagent/index.ts` while preserving `{previous}` compatibility"
10
+ status: pending
11
+ - id: "structured-handoffs-3"
12
+ task: "Tighten bundled prompts so scout/planner/worker/docs-scout emit sections the handoff module can reliably summarize"
13
+ status: pending
14
+ ---
15
+
16
+ # Goal
17
+
18
+ Make chained subagent workflows in `packages/subagent` pass structured, compact handoffs instead of blindly injecting the previous agent’s final markdown blob into the next task.
19
+
20
+ # Context
21
+
22
+ - Parent rationale: apply the “single writer, many thinkers” / “context engineering over prompt gimmicks” learnings we discussed for `@dreki-gg/pi-subagent`.
23
+ - Module root: `packages/subagent`
24
+ - This slice is infrastructure. Later slices like clean-context review, manager orchestration, and advisor routing should be able to reuse the same handoff format, but this plan must **not** assume those slices already exist.
25
+ - Existing repo convention for package-local planning docs lives under `packages/<pkg>/docs/plans/` (see `packages/browser-tools/docs/plans/`).
26
+
27
+ ## What exists
28
+
29
+ Current relevant file tree on disk:
30
+
31
+ - `packages/subagent/package.json`
32
+ - `packages/subagent/tsconfig.json`
33
+ - `packages/subagent/README.md`
34
+ - `packages/subagent/CHANGELOG.md`
35
+ - `packages/subagent/extensions/subagent/index.ts`
36
+ - `packages/subagent/extensions/subagent/agents.ts`
37
+ - `packages/subagent/extensions/subagent/agent-runner.ts`
38
+ - `packages/subagent/extensions/subagent/agent-runner-types.ts`
39
+ - `packages/subagent/extensions/subagent/agent-result-utils.ts`
40
+ - `packages/subagent/extensions/subagent/run-agent-args.ts`
41
+ - `packages/subagent/extensions/subagent/synthesis.ts`
42
+ - `packages/subagent/agents/docs-scout.md`
43
+ - `packages/subagent/agents/planner.md`
44
+ - `packages/subagent/agents/reviewer.md`
45
+ - `packages/subagent/agents/scout.md`
46
+ - `packages/subagent/agents/ux-designer.md`
47
+ - `packages/subagent/agents/worker.md`
48
+ - `packages/subagent/prompts/implement.md`
49
+ - `packages/subagent/prompts/implement-and-review.md`
50
+ - `packages/subagent/prompts/scout-and-plan.md`
51
+ - `packages/subagent/skills/spawn-subagents/SKILL.md`
52
+ - `packages/subagent/skills/write-an-agent/SKILL.md`
53
+
54
+ Actual current behavior on disk:
55
+
56
+ - Chain mode is still raw text plumbing. In `packages/subagent/extensions/subagent/index.ts:658-716`, each step computes `taskWithContext = step.task.replace(/\{previous\}/g, previousOutput)` and then updates `previousOutput = getFinalOutput(result.messages)`. There is no typed handoff object, parser, or summarizer.
57
+ - `getFinalOutput()` in `packages/subagent/extensions/subagent/index.ts:204-214` returns only the last assistant text block, so any rich structure from tool calls or earlier assistant messages is discarded before handoff.
58
+ - `run-agent` synthesizes main-conversation context via `extractRecentConversation()` and `buildRunAgentTask()` (`index.ts:1215-1229`, `index.ts:1557-1559`), but that synthesis is only used for direct `/run-agent` entry and not for agent-to-agent handoff.
59
+ - `packages/subagent/extensions/subagent/synthesis.ts:5-38` already defines a strong section-oriented synthesis instruction (`Goal`, `Decisions`, `Constraints`, `Architecture`, `Open Questions`, `Intent`), but those sections are not reused anywhere in chain orchestration.
60
+ - Bundled prompt templates still explicitly rely on `{previous}` text substitution:
61
+ - `packages/subagent/prompts/implement.md:6-10`
62
+ - `packages/subagent/prompts/scout-and-plan.md:6-9`
63
+ - `packages/subagent/prompts/implement-and-review.md:6-10`
64
+ - The `spawn-subagents` skill already hints at the desired future shape: it says to “return a compact synthesis to the main thread” and to pass previous outputs “verbatim or as a tight structured summary” (`packages/subagent/skills/spawn-subagents/SKILL.md:31-35`, `:49-54`). That guidance is not enforced in code.
65
+ - Bundled agents already emit semi-structured markdown, but the section names are inconsistent across roles:
66
+ - `scout` => `Files Retrieved`, `Key Code`, `Architecture`, `Start Here`
67
+ - `docs-scout` => `Libraries`, `Key Documentation`, `Integration Notes`, `Recommended Next Step`
68
+ - `planner` => `Goal`, `Plan`, `Files to Modify`, `New Files`, `Risks`
69
+ - `worker` => `Completed`, `Files Changed`, `Notes`
70
+ - There is no test directory in `packages/subagent`; current validation is package typechecking (`packages/subagent/package.json`, `packages/subagent/tsconfig.json`).
71
+
72
+ # API inventory
73
+
74
+ ## Existing public types and helpers the implementation will touch
75
+
76
+ From `packages/subagent/extensions/subagent/agents.ts`:
77
+
78
+ ```ts
79
+ export type AgentScope = 'user' | 'project' | 'both';
80
+ export type AgentSource = 'bundled' | 'user' | 'project' | 'package';
81
+ export type AgentSessionStrategy = 'inline' | 'fork-at';
82
+
83
+ export interface AgentConfig {
84
+ name: string;
85
+ description: string;
86
+ tools?: string[];
87
+ model?: string;
88
+ thinking?: string;
89
+ sessionStrategy?: AgentSessionStrategy;
90
+ systemPrompt: string;
91
+ source: AgentSource;
92
+ filePath: string;
93
+ }
94
+
95
+ export interface AgentDiscoveryResult {
96
+ agents: AgentConfig[];
97
+ projectAgentsDir: string | null;
98
+ }
99
+ ```
100
+
101
+ From `packages/subagent/extensions/subagent/agent-runner-types.ts`:
102
+
103
+ ```ts
104
+ export interface UsageStats {
105
+ input: number;
106
+ output: number;
107
+ cacheRead: number;
108
+ cacheWrite: number;
109
+ cost: number;
110
+ contextTokens: number;
111
+ turns: number;
112
+ }
113
+
114
+ export interface AgentResult {
115
+ agent: string;
116
+ task: string;
117
+ exitCode: number;
118
+ messages: Message[];
119
+ stderr: string;
120
+ usage: UsageStats;
121
+ model?: string;
122
+ stopReason?: string;
123
+ errorMessage?: string;
124
+ }
125
+ ```
126
+
127
+ From `packages/subagent/extensions/subagent/agent-runner.ts`:
128
+
129
+ ```ts
130
+ export type OnPhaseUpdate = (
131
+ phaseName: string,
132
+ agentName: string,
133
+ result: AgentResult,
134
+ ) => void;
135
+
136
+ export interface RunAgentOptions {
137
+ agentScope?: AgentScope;
138
+ cwd?: string;
139
+ onUpdate?: OnPhaseUpdate;
140
+ phaseName?: string;
141
+ signal?: AbortSignal;
142
+ resolvedPaths?: ResolvedPaths;
143
+ }
144
+
145
+ export async function runAgent(
146
+ cwd: string,
147
+ agentName: string,
148
+ task: string,
149
+ options: RunAgentOptions = {},
150
+ ): Promise<AgentResult>
151
+ ```
152
+
153
+ From `packages/subagent/extensions/subagent/synthesis.ts`:
154
+
155
+ ```ts
156
+ export function extractRecentConversation(
157
+ ctx: ExtensionCommandContext,
158
+ ): string
159
+
160
+ export function buildSynthesisPrompt(
161
+ conversation: string,
162
+ explicitTask?: string,
163
+ ): string
164
+ ```
165
+
166
+ ## Existing internal chain data shape in `index.ts`
167
+
168
+ ```ts
169
+ interface SingleResult {
170
+ agent: string;
171
+ agentSource: AgentSource | 'unknown';
172
+ task: string;
173
+ exitCode: number;
174
+ messages: Message[];
175
+ stderr: string;
176
+ usage: UsageStats;
177
+ model?: string;
178
+ stopReason?: string;
179
+ errorMessage?: string;
180
+ step?: number;
181
+ }
182
+
183
+ interface SubagentDetails {
184
+ mode: 'single' | 'parallel' | 'chain';
185
+ agentScope: AgentScope;
186
+ projectAgentsDir: string | null;
187
+ results: SingleResult[];
188
+ }
189
+ ```
190
+
191
+ These are currently private to `index.ts`, but the new handoff helper can either:
192
+ - accept a narrow `Pick<SingleResult, ...>` shape, or
193
+ - define its own exported `HandoffSource` input type to avoid importing internal UI state.
194
+
195
+ ## Proposed new handoff shape for this slice
196
+
197
+ Create a dedicated module for this instead of baking ad hoc string munging into `index.ts`:
198
+
199
+ ```ts
200
+ export interface HandoffFileRef {
201
+ path: string;
202
+ notes?: string;
203
+ }
204
+
205
+ export interface HandoffEnvelope {
206
+ version: 'subagent-handoff/v1';
207
+ sourceAgent: string;
208
+ sourceStep?: number;
209
+ task: string;
210
+ summary: string;
211
+ goal?: string;
212
+ decisions: string[];
213
+ constraints: string[];
214
+ files: HandoffFileRef[];
215
+ symbols: string[];
216
+ openQuestions: string[];
217
+ rawOutput: string;
218
+ }
219
+
220
+ export interface RenderHandoffOptions {
221
+ includeRawOutput?: boolean;
222
+ maxRawChars?: number;
223
+ }
224
+
225
+ export function buildHandoffFromResult(input: {
226
+ agent: string;
227
+ step?: number;
228
+ task: string;
229
+ output: string;
230
+ }): HandoffEnvelope
231
+
232
+ export function renderHandoffForPrompt(
233
+ handoff: HandoffEnvelope,
234
+ options?: RenderHandoffOptions,
235
+ ): string
236
+ ```
237
+
238
+ The parser can be heuristic and markdown-based. It does **not** need to become a full AST parser. The goal is reliable compaction, not perfect semantic extraction.
239
+
240
+ # Tasks
241
+
242
+ ## 1. Add a handoff module that normalizes agent output into a compact envelope
243
+
244
+ ### Files
245
+ - Create `packages/subagent/extensions/subagent/handoffs.ts`
246
+
247
+ ### What to add
248
+ - Export a small, typed handoff model (see `Proposed new handoff shape` above).
249
+ - Implement markdown-section extraction that recognizes the current bundled agent contracts:
250
+ - `## Goal`
251
+ - `## Decisions`
252
+ - `## Constraints`
253
+ - `## Architecture`
254
+ - `## Open Questions`
255
+ - `## Plan`
256
+ - `## Files Retrieved`
257
+ - `## Files to Modify`
258
+ - `## New Files`
259
+ - `## Files Changed`
260
+ - `## Notes`
261
+ - `## Risks`
262
+ - `## Recommended Next Step`
263
+ - Build a compact summary by prioritizing the most useful sections instead of returning the entire raw output.
264
+ - Extract file paths by scanning markdown bullets/code spans for repo-looking paths (e.g. `` `packages/subagent/...` ``).
265
+ - Extract symbols conservatively from code fences or bullets when they are clearly named functions/types; do not overfit.
266
+ - Always keep `rawOutput` so callers can still include the source text when needed.
267
+
268
+ ### Code sketch
269
+
270
+ ```ts
271
+ const SECTION_RE = /^##\s+(.+)$/gm;
272
+
273
+ function splitMarkdownSections(markdown: string): Map<string, string> {
274
+ // return section title -> body
275
+ }
276
+
277
+ export function buildHandoffFromResult(input: {
278
+ agent: string;
279
+ step?: number;
280
+ task: string;
281
+ output: string;
282
+ }): HandoffEnvelope {
283
+ const sections = splitMarkdownSections(input.output);
284
+ return {
285
+ version: 'subagent-handoff/v1',
286
+ sourceAgent: input.agent,
287
+ sourceStep: input.step,
288
+ task: input.task,
289
+ summary: ...,
290
+ goal: ...,
291
+ decisions: ...,
292
+ constraints: ...,
293
+ files: ...,
294
+ symbols: ...,
295
+ openQuestions: ...,
296
+ rawOutput: input.output,
297
+ };
298
+ }
299
+ ```
300
+
301
+ ### Notes
302
+ - Keep this module dependency-free.
303
+ - Do not move UI rendering logic into this file.
304
+ - The formatter should emit readable markdown because existing prompt templates still use string substitution.
305
+
306
+ ## 2. Thread the structured handoff through chain execution in `extensions/subagent/index.ts`
307
+
308
+ ### Files
309
+ - Modify `packages/subagent/extensions/subagent/index.ts`
310
+
311
+ ### What to change
312
+ - Import the new handoff helper.
313
+ - In the chain path (`index.ts:658-716`), replace the raw `previousOutput` update with a rendered handoff string built from the prior step’s final output.
314
+ - Preserve the existing `{previous}` placeholder contract so current prompt templates still work, but change what gets injected:
315
+ - before: raw final assistant text
316
+ - after: a compact structured markdown summary plus optional truncated raw output
317
+ - Keep error handling behavior unchanged.
318
+ - Keep streaming UI behavior unchanged.
319
+
320
+ ### Implementation rules
321
+ - Do **not** change single-mode or parallel-mode semantics in this slice.
322
+ - Do **not** add a new tool mode; keep `single`, `parallel`, and `chain` only.
323
+ - Avoid coupling the handoff module to `Message[]`; extract final text in `index.ts` and pass plain strings into the helper.
324
+ - If the previous step returned no final text, fall back to `'(no output)'` exactly as current code does.
325
+
326
+ ## 3. Tighten bundled prompts so handoffs have stable sections to summarize
327
+
328
+ ### Files
329
+ - Modify `packages/subagent/agents/scout.md`
330
+ - Modify `packages/subagent/agents/docs-scout.md`
331
+ - Modify `packages/subagent/agents/planner.md`
332
+ - Modify `packages/subagent/agents/worker.md`
333
+ - Modify `packages/subagent/prompts/implement.md`
334
+ - Modify `packages/subagent/prompts/scout-and-plan.md`
335
+
336
+ ### What to change
337
+ - Keep the roles the same, but make their output contracts easier to summarize reliably.
338
+ - Prefer stable section names over freeform prose.
339
+ - Add a small “Handoff” / “Next step” section where helpful instead of forcing the summarizer to infer everything from generic notes.
340
+
341
+ ### Recommended section adjustments
342
+ - `scout.md`: keep `Files Retrieved` / `Key Code` / `Architecture`, and add `## Constraints or Unknowns`
343
+ - `docs-scout.md`: keep `Libraries` / `Key Documentation` / `Integration Notes`, and make `Recommended Next Step` mandatory
344
+ - `planner.md`: keep `Goal` / `Plan` / `Files to Modify` / `New Files` / `Risks`; optionally add `## Constraints`
345
+ - `worker.md`: keep `Completed` / `Files Changed` / `Notes`, but require a short bullet list of decisions made and unresolved concerns
346
+ - Prompt templates should mention that `{previous}` now contains a structured handoff, not an unbounded transcript dump
347
+
348
+ # Files to create
349
+
350
+ - `packages/subagent/extensions/subagent/handoffs.ts`
351
+
352
+ # Files to modify
353
+
354
+ - `packages/subagent/extensions/subagent/index.ts` — switch chain substitution from raw final text to rendered structured handoff
355
+ - `packages/subagent/agents/scout.md` — make scout output easier to summarize deterministically
356
+ - `packages/subagent/agents/docs-scout.md` — make docs handoff more consistent
357
+ - `packages/subagent/agents/planner.md` — preserve plan structure but expose constraints explicitly
358
+ - `packages/subagent/agents/worker.md` — add explicit decision / unresolved sections for downstream agents
359
+ - `packages/subagent/prompts/implement.md` — document structured `{previous}` expectations
360
+ - `packages/subagent/prompts/scout-and-plan.md` — document structured `{previous}` expectations
361
+
362
+ # Testing notes
363
+
364
+ - Run `bun run --filter '@dreki-gg/pi-subagent' typecheck` after adding `handoffs.ts` and updating imports.
365
+ - Manually inspect the rendered handoff string by running a small local chain (for example, a trivial `scout -> planner` task) and confirm that the second step receives a compact summary instead of a huge raw blob.
366
+ - Verify that existing prompt templates still work without changing the user-facing `{previous}` placeholder name.
367
+ - Do not add runtime-only assumptions about sibling plans. This slice must provide value on its own.
368
+
369
+ # Patterns to follow
370
+
371
+ - `packages/subagent/extensions/subagent/synthesis.ts:5-38` — section-oriented synthesis prompt structure worth mirroring in handoffs
372
+ - `packages/subagent/extensions/subagent/index.ts:658-716` — existing chain control flow to preserve
373
+ - `packages/subagent/extensions/subagent/index.ts:204-214` — current final-output extraction behavior to wrap, not duplicate all over the package
374
+ - `packages/subagent/skills/spawn-subagents/SKILL.md:31-35` — “compact synthesis” guidance already present in the skill
375
+ - `packages/subagent/skills/spawn-subagents/SKILL.md:49-54` — existing advice about structured summaries
376
+ - `packages/subagent/skills/write-an-agent/SKILL.md:15-20` and `:62-67` — output contracts should stay sharp and structured