gsd-pi 2.78.1-dev.eccf86e27 → 2.79.0-dev.579e14e9b

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 (96) hide show
  1. package/README.md +94 -47
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/extensions/gsd/auto-prompts.js +52 -29
  4. package/dist/resources/extensions/gsd/auto-recovery.js +18 -3
  5. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  6. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +33 -37
  7. package/dist/resources/extensions/gsd/commands/context.js +1 -1
  8. package/dist/resources/extensions/gsd/preferences-types.js +20 -2
  9. package/dist/resources/extensions/gsd/preferences-validation.js +3 -3
  10. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +41 -2
  11. package/dist/resources/extensions/gsd/unit-context-composer.js +32 -0
  12. package/dist/resources/extensions/gsd/unit-context-manifest.js +21 -0
  13. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  14. package/dist/web/standalone/.next/BUILD_ID +1 -1
  15. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  16. package/dist/web/standalone/.next/build-manifest.json +2 -2
  17. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  18. package/dist/web/standalone/.next/required-server-files.json +1 -1
  19. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  20. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  21. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  22. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  23. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  24. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  25. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  26. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  28. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  30. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  35. package/dist/web/standalone/.next/server/app/index.html +1 -1
  36. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  37. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  38. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  39. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  40. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  41. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  42. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  43. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  44. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  45. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  46. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  47. package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/index.js +1 -0
  48. package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/libvips-cpp.so.8.17.3 +0 -0
  49. package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/package.json +42 -0
  50. package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/versions.json +30 -0
  51. package/dist/web/standalone/node_modules/@img/sharp-linuxmusl-x64/LICENSE +191 -0
  52. package/dist/web/standalone/node_modules/@img/sharp-linuxmusl-x64/lib/sharp-linuxmusl-x64.node +0 -0
  53. package/dist/web/standalone/node_modules/@img/sharp-linuxmusl-x64/package.json +46 -0
  54. package/dist/web/standalone/server.js +1 -1
  55. package/package.json +1 -1
  56. package/packages/daemon/package.json +2 -2
  57. package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
  58. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  59. package/packages/mcp-server/dist/workflow-tools.js +53 -0
  60. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  61. package/packages/mcp-server/package.json +2 -2
  62. package/packages/mcp-server/src/workflow-tools.test.ts +116 -0
  63. package/packages/mcp-server/src/workflow-tools.ts +81 -0
  64. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  65. package/packages/native/package.json +1 -1
  66. package/packages/pi-agent-core/package.json +1 -1
  67. package/packages/pi-ai/package.json +1 -1
  68. package/packages/pi-coding-agent/package.json +1 -1
  69. package/packages/pi-tui/package.json +1 -1
  70. package/packages/rpc-client/package.json +1 -1
  71. package/pkg/package.json +1 -1
  72. package/src/resources/extensions/gsd/auto-prompts.ts +106 -28
  73. package/src/resources/extensions/gsd/auto-recovery.ts +17 -3
  74. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  75. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +38 -38
  76. package/src/resources/extensions/gsd/commands/context.ts +1 -1
  77. package/src/resources/extensions/gsd/preferences-types.ts +23 -4
  78. package/src/resources/extensions/gsd/preferences-validation.ts +3 -3
  79. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +68 -1
  80. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -2
  81. package/src/resources/extensions/gsd/tests/current-directory-root-homedir-fallback.test.ts +63 -0
  82. package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +14 -0
  83. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +8 -0
  84. package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +3 -0
  85. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +85 -0
  86. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +2 -0
  87. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +59 -0
  88. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +38 -0
  89. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +32 -0
  90. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +100 -0
  91. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +3 -0
  92. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +41 -1
  93. package/src/resources/extensions/gsd/unit-context-composer.ts +49 -0
  94. package/src/resources/extensions/gsd/unit-context-manifest.ts +34 -0
  95. /package/dist/web/standalone/.next/static/{Y5UeGFkXTYM9WIQOWHkot → X6D0ObmOxuQCMG5piZpbE}/_buildManifest.js +0 -0
  96. /package/dist/web/standalone/.next/static/{Y5UeGFkXTYM9WIQOWHkot → X6D0ObmOxuQCMG5piZpbE}/_ssgManifest.js +0 -0
@@ -3,6 +3,7 @@ import { sanitizeCompleteMilestoneParams } from "../bootstrap/sanitize-complete-
3
3
  import { loadWriteGateSnapshot, shouldBlockContextArtifactSaveInSnapshot, shouldBlockRootArtifactSaveInSnapshot } from "../bootstrap/write-gate.js";
4
4
  import {
5
5
  getActiveRequirements,
6
+ insertMilestone,
6
7
  getMilestone,
7
8
  getSliceStatusSummary,
8
9
  getSliceTaskCounts,
@@ -31,6 +32,7 @@ import { handleValidateMilestone } from "./validate-milestone.js";
31
32
  import { logError, logWarning } from "../workflow-logger.js";
32
33
  import { invalidateStateCache } from "../state.js";
33
34
  import { loadEffectiveGSDPreferences } from "../preferences.js";
35
+ import { parseProject } from "../schemas/parsers.js";
34
36
 
35
37
  export const SUPPORTED_SUMMARY_ARTIFACT_TYPES = [
36
38
  "SUMMARY",
@@ -71,6 +73,20 @@ export interface SummarySaveParams {
71
73
  content: string;
72
74
  }
73
75
 
76
+ function registerProjectMilestoneSequence(content: string): string[] {
77
+ const parsed = parseProject(content);
78
+ const registered: string[] = [];
79
+ for (const milestone of parsed.milestones) {
80
+ insertMilestone({
81
+ id: milestone.id,
82
+ title: milestone.title,
83
+ status: milestone.done ? "complete" : "queued",
84
+ });
85
+ registered.push(milestone.id);
86
+ }
87
+ return registered;
88
+ }
89
+
74
90
  export async function executeSummarySave(
75
91
  params: SummarySaveParams,
76
92
  basePath: string = process.cwd(),
@@ -173,6 +189,23 @@ export async function executeSummarySave(
173
189
  basePath,
174
190
  );
175
191
 
192
+ let registeredMilestones: string[] = [];
193
+ let registrationWarning: string | undefined;
194
+ if (params.artifact_type === "PROJECT") {
195
+ try {
196
+ registeredMilestones = registerProjectMilestoneSequence(contentToSave);
197
+ if (registeredMilestones.length > 0) invalidateStateCache();
198
+ } catch (err) {
199
+ const msg = err instanceof Error ? err.message : String(err);
200
+ registrationWarning = `PROJECT artifact saved, but milestone registration failed: ${msg}`;
201
+ logWarning("tool", registrationWarning, {
202
+ tool: "gsd_summary_save",
203
+ error: String(err),
204
+ stack: err instanceof Error ? err.stack ?? "" : "",
205
+ });
206
+ }
207
+ }
208
+
176
209
  if (params.artifact_type === "CONTEXT" && !params.task_id) {
177
210
  try {
178
211
  const draftFile = params.slice_id
@@ -186,7 +219,14 @@ export async function executeSummarySave(
186
219
 
187
220
  return {
188
221
  content: [{ type: "text", text: `Saved ${params.artifact_type} artifact to ${relativePath}` }],
189
- details: { operation: "save_summary", path: relativePath, artifact_type: params.artifact_type, content_source: contentSource },
222
+ details: {
223
+ operation: "save_summary",
224
+ path: relativePath,
225
+ artifact_type: params.artifact_type,
226
+ content_source: contentSource,
227
+ ...(registeredMilestones.length > 0 ? { registeredMilestones } : {}),
228
+ ...(registrationWarning ? { warning: registrationWarning } : {}),
229
+ },
190
230
  };
191
231
  } catch (err) {
192
232
  const msg = err instanceof Error ? err.message : String(err);
@@ -42,6 +42,7 @@ import {
42
42
  type BaseResolverContext,
43
43
  type ComputedArtifactId,
44
44
  type ComputedArtifactRegistry,
45
+ type ContextModePolicy,
45
46
  type UnitContextManifest,
46
47
  } from "./unit-context-manifest.js";
47
48
 
@@ -92,6 +93,54 @@ export function manifestBudgetChars(unitType: string): number | null {
92
93
  return manifest ? manifest.maxSystemPromptChars : null;
93
94
  }
94
95
 
96
+ // ─── Context Mode lane guidance ──────────────────────────────────────────
97
+
98
+ export type ContextModeRenderMode = "standalone" | "nested";
99
+
100
+ export interface ComposeContextModeInstructionOptions {
101
+ readonly enabled: boolean;
102
+ readonly renderMode: ContextModeRenderMode;
103
+ }
104
+
105
+ const CONTEXT_MODE_LANE_LABELS: Record<Exclude<ContextModePolicy, "none">, string> = {
106
+ interview: "interview",
107
+ research: "research",
108
+ planning: "planning",
109
+ execution: "execution",
110
+ verification: "verification",
111
+ orchestration: "orchestration",
112
+ docs: "documentation",
113
+ };
114
+
115
+ const CONTEXT_MODE_GUIDANCE =
116
+ "Use `gsd_exec` for noisy scans, builds, and tests so full output stays out of prompt context; call `gsd_exec_search` before repeating prior runs; call `gsd_resume` after compaction or resume to recover stored execution context.";
117
+
118
+ /**
119
+ * Render the Context Mode instruction lane for a unit type. Unknown unit
120
+ * types, disabled config, and explicit `contextMode: "none"` all omit the
121
+ * block so callers can prefix this safely without extra branching.
122
+ */
123
+ export function composeContextModeInstructions(
124
+ unitType: string,
125
+ opts: ComposeContextModeInstructionOptions,
126
+ ): string {
127
+ if (!opts.enabled) return "";
128
+ const manifest = resolveManifest(unitType);
129
+ if (!manifest || manifest.contextMode === "none") return "";
130
+
131
+ const lane = CONTEXT_MODE_LANE_LABELS[manifest.contextMode];
132
+ if (opts.renderMode === "nested") {
133
+ return `Context Mode (${lane} lane): ${CONTEXT_MODE_GUIDANCE}`;
134
+ }
135
+
136
+ return [
137
+ "## Context Mode",
138
+ "",
139
+ `Lane: **${lane} lane**.`,
140
+ CONTEXT_MODE_GUIDANCE,
141
+ ].join("\n");
142
+ }
143
+
95
144
  // ─── v2 surface (#4924) ───────────────────────────────────────────────────
96
145
 
97
146
  /**
@@ -90,6 +90,17 @@ export type MemoryPolicy = "none" | "critical-only" | "prompt-relevant";
90
90
  /** Preferences block policy. */
91
91
  export type PreferencesPolicy = "none" | "active-only" | "full";
92
92
 
93
+ /** Context Mode lane guidance policy for each auto-mode unit. */
94
+ export type ContextModePolicy =
95
+ | "none"
96
+ | "interview"
97
+ | "research"
98
+ | "planning"
99
+ | "execution"
100
+ | "verification"
101
+ | "orchestration"
102
+ | "docs";
103
+
93
104
  /**
94
105
  * Tool-access policy per unit type (#4934).
95
106
  *
@@ -220,6 +231,8 @@ export interface UnitContextManifest {
220
231
  readonly codebaseMap: boolean;
221
232
  /** Preferences block policy. */
222
233
  readonly preferences: PreferencesPolicy;
234
+ /** Context Mode guidance lane. */
235
+ readonly contextMode: ContextModePolicy;
223
236
  /**
224
237
  * Tool-access policy (#4934). Runtime enforcement covers path-scoped write
225
238
  * blocking, subagent denial, and bash allowlisting for active auto-mode
@@ -343,6 +356,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
343
356
  memory: "prompt-relevant",
344
357
  codebaseMap: true,
345
358
  preferences: "active-only",
359
+ contextMode: "research",
346
360
  tools: TOOLS_PLANNING,
347
361
  artifacts: {
348
362
  // Phase 3 migration (#4782): matches today's actual
@@ -359,6 +373,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
359
373
  memory: "prompt-relevant",
360
374
  codebaseMap: true,
361
375
  preferences: "active-only",
376
+ contextMode: "planning",
362
377
  tools: TOOLS_PLANNING,
363
378
  artifacts: {
364
379
  inline: ["project", "requirements", "decisions", "milestone-research", "templates"],
@@ -373,6 +388,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
373
388
  memory: "prompt-relevant",
374
389
  codebaseMap: true,
375
390
  preferences: "active-only",
391
+ contextMode: "interview",
376
392
  tools: TOOLS_PLANNING,
377
393
  artifacts: {
378
394
  inline: ["project", "requirements", "decisions", "milestone-context", "templates"],
@@ -387,6 +403,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
387
403
  memory: "prompt-relevant",
388
404
  codebaseMap: false,
389
405
  preferences: "active-only",
406
+ contextMode: "verification",
390
407
  // planning-dispatch: validation is a verification-fan-out unit. It reads
391
408
  // the milestone surface and dispatches reviewer/security/tester subagents
392
409
  // to report findings without touching user source. Mirrors
@@ -405,6 +422,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
405
422
  memory: "prompt-relevant",
406
423
  codebaseMap: false,
407
424
  preferences: "active-only",
425
+ contextMode: "verification",
408
426
  // planning-dispatch: completion is a high-leverage place to fan out to
409
427
  // reviewer / security / tester subagents. They read the diff and report
410
428
  // findings; they do not write user source. Write isolation to .gsd/ is
@@ -428,6 +446,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
428
446
  memory: "prompt-relevant",
429
447
  codebaseMap: true,
430
448
  preferences: "active-only",
449
+ contextMode: "research",
431
450
  tools: TOOLS_PLANNING,
432
451
  artifacts: {
433
452
  inline: ["roadmap", "milestone-research", "dependency-summaries", "templates"],
@@ -442,6 +461,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
442
461
  memory: "prompt-relevant",
443
462
  codebaseMap: true,
444
463
  preferences: "active-only",
464
+ contextMode: "planning",
445
465
  // planning-dispatch: allows subagent dispatch so the planner can fan out
446
466
  // to scout for codebase recon and to planner/decompose-style specialists
447
467
  // for sub-decomposition. Write-isolation to .gsd/ is preserved.
@@ -459,6 +479,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
459
479
  memory: "prompt-relevant",
460
480
  codebaseMap: true,
461
481
  preferences: "active-only",
482
+ contextMode: "planning",
462
483
  // See plan-slice — same rationale: dispatch to scout/planner-style
463
484
  // specialists during refinement is materially better than re-doing recon
464
485
  // inline.
@@ -476,6 +497,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
476
497
  memory: "prompt-relevant",
477
498
  codebaseMap: true,
478
499
  preferences: "active-only",
500
+ contextMode: "planning",
479
501
  tools: TOOLS_PLANNING,
480
502
  artifacts: {
481
503
  inline: ["slice-plan", "slice-research", "dependency-summaries", "prior-task-summaries", "templates"],
@@ -490,6 +512,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
490
512
  memory: "prompt-relevant",
491
513
  codebaseMap: false,
492
514
  preferences: "active-only",
515
+ contextMode: "verification",
493
516
  // See complete-milestone — same rationale: dispatch to reviewer / security /
494
517
  // tester subagents to fan out review work without bloating this unit's
495
518
  // context.
@@ -511,6 +534,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
511
534
  memory: "critical-only",
512
535
  codebaseMap: false,
513
536
  preferences: "none",
537
+ contextMode: "planning",
514
538
  tools: TOOLS_PLANNING,
515
539
  artifacts: {
516
540
  // Phase 2 pilot (#4782): manifest now matches today's actual
@@ -530,6 +554,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
530
554
  memory: "prompt-relevant",
531
555
  codebaseMap: true,
532
556
  preferences: "active-only",
557
+ contextMode: "execution",
533
558
  tools: TOOLS_ALL,
534
559
  artifacts: {
535
560
  inline: ["task-plan", "slice-plan", "prior-task-summaries", "templates"],
@@ -544,6 +569,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
544
569
  memory: "prompt-relevant",
545
570
  codebaseMap: true,
546
571
  preferences: "active-only",
572
+ contextMode: "execution",
547
573
  tools: TOOLS_ALL,
548
574
  artifacts: {
549
575
  inline: ["slice-plan", "prior-task-summaries", "templates"],
@@ -560,6 +586,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
560
586
  memory: "critical-only",
561
587
  codebaseMap: false,
562
588
  preferences: "active-only",
589
+ contextMode: "verification",
563
590
  tools: TOOLS_PLANNING,
564
591
  artifacts: {
565
592
  // Phase 3 migration (#4782): manifest matches today's actual
@@ -578,6 +605,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
578
605
  memory: "critical-only",
579
606
  codebaseMap: false,
580
607
  preferences: "active-only",
608
+ contextMode: "verification",
581
609
  tools: TOOLS_PLANNING,
582
610
  artifacts: {
583
611
  inline: ["slice-plan", "prior-task-summaries"],
@@ -592,6 +620,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
592
620
  memory: "prompt-relevant",
593
621
  codebaseMap: true,
594
622
  preferences: "active-only",
623
+ contextMode: "docs",
595
624
  tools: TOOLS_DOCS,
596
625
  artifacts: {
597
626
  inline: ["project", "requirements", "decisions", "templates"],
@@ -611,6 +640,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
611
640
  memory: "none",
612
641
  codebaseMap: false,
613
642
  preferences: "none",
643
+ contextMode: "none",
614
644
  tools: TOOLS_PLANNING,
615
645
  artifacts: {
616
646
  inline: [],
@@ -628,6 +658,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
628
658
  memory: "prompt-relevant",
629
659
  codebaseMap: true,
630
660
  preferences: "active-only",
661
+ contextMode: "interview",
631
662
  tools: TOOLS_PLANNING,
632
663
  artifacts: {
633
664
  inline: ["templates"],
@@ -644,6 +675,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
644
675
  memory: "prompt-relevant",
645
676
  codebaseMap: true,
646
677
  preferences: "active-only",
678
+ contextMode: "interview",
647
679
  tools: TOOLS_PLANNING,
648
680
  artifacts: {
649
681
  inline: ["project", "templates"],
@@ -660,6 +692,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
660
692
  memory: "none",
661
693
  codebaseMap: false,
662
694
  preferences: "none",
695
+ contextMode: "none",
663
696
  tools: TOOLS_PLANNING,
664
697
  artifacts: {
665
698
  inline: [],
@@ -678,6 +711,7 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
678
711
  memory: "prompt-relevant",
679
712
  codebaseMap: true,
680
713
  preferences: "active-only",
714
+ contextMode: "research",
681
715
  tools: { mode: "planning-dispatch", allowedSubagents: ["scout"] },
682
716
  artifacts: {
683
717
  inline: ["project", "requirements", "templates"],