180 lines
5.1 KiB
Markdown
180 lines
5.1 KiB
Markdown
# Phase 1 PR #1 Checklist: Context Levels
|
|
|
|
Created: 2026-02-12
|
|
Owner: Flynn core
|
|
Status: ready to implement
|
|
|
|
## Goal
|
|
|
|
Add configurable prompt context levels so Flynn can trade off speed/cost vs depth:
|
|
- `minimal`
|
|
- `normal` (default)
|
|
- `detailed`
|
|
- `debug`
|
|
|
|
This PR only adds config + prompt assembly behavior. It does not add command routing or runtime switching.
|
|
|
|
## PR Boundary
|
|
|
|
In scope:
|
|
- Schema support for `prompt.context_level`
|
|
- Pass `context_level` into prompt assembly
|
|
- Context-level behavior in `assembleSystemPrompt`
|
|
- Unit tests for parsing and prompt output differences
|
|
|
|
Out of scope:
|
|
- Per-agent overrides
|
|
- Slash-command switching (`/context ...`)
|
|
- Adaptive auto-switching by token budget
|
|
- Tool-list verbosity tuning inside `NativeAgent`
|
|
|
|
## File-by-File Diff Plan
|
|
|
|
1) `src/config/schema.ts`
|
|
|
|
- Add enum and default under `promptSchema`.
|
|
- Export type for use by prompt module.
|
|
|
|
```diff
|
|
@@
|
|
const promptSchema = z.object({
|
|
search_dirs: z.array(z.string()).default([]),
|
|
extra_sections: z.array(z.object({
|
|
name: z.string(),
|
|
content: z.string(),
|
|
})).default([]),
|
|
+ context_level: z.enum(['minimal', 'normal', 'detailed', 'debug']).default('normal'),
|
|
}).default({});
|
|
@@
|
|
+export type ContextLevel = z.infer<typeof promptSchema.shape.context_level>;
|
|
export type PromptConfig = z.infer<typeof promptSchema>;
|
|
```
|
|
|
|
2) `src/prompt/template.ts`
|
|
|
|
- Accept `contextLevel` in `PromptTemplateConfig`.
|
|
- Implement level-based assembly behavior:
|
|
- `minimal`: load `SOUL.md` + runtime only, skip extra sections
|
|
- `normal`: current behavior (all templates + runtime)
|
|
- `detailed`: `normal` + include extra sections explicitly (same as current, documented)
|
|
- `debug`: `detailed` + append loaded file list and directory resolution notes in a debug section
|
|
|
|
```diff
|
|
@@
|
|
+import type { ContextLevel } from '../config/schema.js';
|
|
@@
|
|
export interface PromptTemplateConfig {
|
|
searchDirs: string[];
|
|
extraSections?: Array<{ name: string; content: string }>;
|
|
+ contextLevel?: ContextLevel;
|
|
}
|
|
@@
|
|
-export function assembleSystemPrompt(config: PromptTemplateConfig): PromptTemplateResult {
|
|
+export function assembleSystemPrompt(config: PromptTemplateConfig): PromptTemplateResult {
|
|
+ const level = config.contextLevel ?? 'normal';
|
|
+ const includeAllTemplates = level !== 'minimal';
|
|
+ const includeExtraSections = level !== 'minimal';
|
|
+ const includeDebugSection = level === 'debug';
|
|
const sections: string[] = [];
|
|
const loadedFiles: string[] = [];
|
|
- for (const { name, section } of PROMPT_FILES) {
|
|
+ for (const { name, section } of PROMPT_FILES) {
|
|
+ if (!includeAllTemplates && name !== 'SOUL.md') { continue; }
|
|
...
|
|
}
|
|
- if (config.extraSections) {
|
|
+ if (includeExtraSections && config.extraSections) {
|
|
...
|
|
}
|
|
+ if (includeDebugSection) {
|
|
+ sections.push(`# Prompt Debug\n\nContext level: ${level}\nLoaded files:\n${loadedFiles.map(f => `- ${f}`).join('\n') || '- none'}`);
|
|
+ }
|
|
...
|
|
}
|
|
```
|
|
|
|
3) `src/daemon/services.ts`
|
|
|
|
- Pass config value through `loadSystemPrompt`.
|
|
|
|
```diff
|
|
@@
|
|
const result = assembleSystemPrompt({
|
|
searchDirs,
|
|
extraSections: config.prompt.extra_sections,
|
|
+ contextLevel: config.prompt.context_level,
|
|
});
|
|
```
|
|
|
|
4) `src/prompt/template.test.ts`
|
|
|
|
- Add focused tests for level behavior.
|
|
|
|
```diff
|
|
@@
|
|
+it('uses normal as default context level', ...)
|
|
+it('minimal loads SOUL plus runtime only', ...)
|
|
+it('normal keeps current template behavior', ...)
|
|
+it('detailed includes extra sections', ...)
|
|
+it('debug appends prompt debug section with loaded files', ...)
|
|
+it('minimal skips extra sections', ...)
|
|
```
|
|
|
|
5) `config/default.yaml` (optional but recommended)
|
|
|
|
- Add commented prompt block to advertise the new setting.
|
|
|
|
```diff
|
|
@@
|
|
+# prompt:
|
|
+# search_dirs: []
|
|
+# extra_sections: []
|
|
+# context_level: normal # minimal | normal | detailed | debug
|
|
```
|
|
|
|
## Implementation Steps
|
|
|
|
1. Add schema enum + exported type in `src/config/schema.ts`.
|
|
2. Update prompt template types and logic in `src/prompt/template.ts`.
|
|
3. Thread config value in `src/daemon/services.ts`.
|
|
4. Add/adjust tests in `src/prompt/template.test.ts`.
|
|
5. Optionally document setting in `config/default.yaml`.
|
|
6. Run validation commands and fix any regressions.
|
|
|
|
## Validation Commands
|
|
|
|
Run in this order:
|
|
|
|
```bash
|
|
pnpm typecheck
|
|
pnpm test:run src/prompt/template.test.ts
|
|
pnpm test:run
|
|
pnpm lint
|
|
pnpm build
|
|
```
|
|
|
|
## Acceptance Criteria
|
|
|
|
- Config parses with no `prompt.context_level` set (defaults to `normal`).
|
|
- Invalid context levels are rejected by schema.
|
|
- `minimal` omits AGENTS/IDENTITY/USER/TOOLS sections.
|
|
- `normal` output matches current behavior.
|
|
- `detailed` keeps full prompt and extra sections.
|
|
- `debug` adds an explicit debug section with loaded file paths.
|
|
- Existing prompt tests continue to pass.
|
|
|
|
## Risk Notes
|
|
|
|
- Main risk: prompt regressions from changed assembly order.
|
|
- Mitigation: keep `normal` behavior byte-close to current output and pin tests.
|
|
|
|
## Suggested Commit Message
|
|
|
|
`feat(prompt): add configurable context levels for system prompt assembly`
|
|
|
|
## Follow-up PRs
|
|
|
|
1. Add runtime/session override (`/context minimal|normal|detailed|debug`).
|
|
2. Extend levels to tool-list verbosity and memory injection depth.
|
|
3. Add per-agent `context_level` override in `agent_configs`.
|