@sienklogic/plan-build-run 2.34.0 → 2.37.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.
- package/CHANGELOG.md +663 -0
- package/dashboard/public/css/command-center.css +152 -65
- package/dashboard/public/css/explorer.css +22 -41
- package/dashboard/public/css/layout.css +119 -1
- package/dashboard/public/css/tokens.css +13 -0
- package/dashboard/src/components/Layout.tsx +32 -6
- package/dashboard/src/components/explorer/tabs/PhasesTab.tsx +11 -1
- package/dashboard/src/components/explorer/tabs/TodosTab.tsx +18 -2
- package/dashboard/src/components/partials/AttentionPanel.tsx +7 -1
- package/dashboard/src/components/partials/CurrentPhaseCard.tsx +26 -24
- package/dashboard/src/components/partials/QuickActions.tsx +21 -11
- package/dashboard/src/components/partials/StatCardGrid.tsx +67 -0
- package/dashboard/src/components/partials/StatusHeader.tsx +1 -0
- package/dashboard/src/routes/command-center.routes.tsx +8 -7
- package/dashboard/src/routes/index.routes.tsx +32 -29
- package/package.json +2 -2
- package/plugins/copilot-pbr/agents/audit.agent.md +128 -16
- package/plugins/copilot-pbr/agents/codebase-mapper.agent.md +48 -1
- package/plugins/copilot-pbr/agents/debugger.agent.md +47 -1
- package/plugins/copilot-pbr/agents/executor.agent.md +152 -8
- package/plugins/copilot-pbr/agents/general.agent.md +46 -1
- package/plugins/copilot-pbr/agents/integration-checker.agent.md +52 -2
- package/plugins/copilot-pbr/agents/plan-checker.agent.md +50 -2
- package/plugins/copilot-pbr/agents/planner.agent.md +54 -1
- package/plugins/copilot-pbr/agents/researcher.agent.md +47 -2
- package/plugins/copilot-pbr/agents/synthesizer.agent.md +49 -1
- package/plugins/copilot-pbr/agents/verifier.agent.md +86 -2
- package/plugins/copilot-pbr/hooks/hooks.json +11 -0
- package/plugins/copilot-pbr/plugin.json +1 -1
- package/plugins/copilot-pbr/references/agent-contracts.md +27 -0
- package/plugins/copilot-pbr/references/checkpoints.md +32 -1
- package/plugins/copilot-pbr/references/context-quality-tiers.md +45 -0
- package/plugins/copilot-pbr/references/pbr-tools-cli.md +115 -0
- package/plugins/copilot-pbr/references/questioning.md +21 -1
- package/plugins/copilot-pbr/references/verification-patterns.md +52 -1
- package/plugins/copilot-pbr/skills/audit/SKILL.md +19 -3
- package/plugins/copilot-pbr/skills/begin/SKILL.md +57 -4
- package/plugins/copilot-pbr/skills/build/SKILL.md +39 -2
- package/plugins/copilot-pbr/skills/debug/SKILL.md +12 -1
- package/plugins/copilot-pbr/skills/explore/SKILL.md +13 -2
- package/plugins/copilot-pbr/skills/import/SKILL.md +26 -1
- package/plugins/copilot-pbr/skills/milestone/SKILL.md +15 -3
- package/plugins/copilot-pbr/skills/plan/SKILL.md +50 -0
- package/plugins/copilot-pbr/skills/quick/SKILL.md +21 -0
- package/plugins/copilot-pbr/skills/review/SKILL.md +45 -0
- package/plugins/copilot-pbr/skills/scan/SKILL.md +20 -0
- package/plugins/copilot-pbr/templates/SUMMARY-complex.md.tmpl +95 -0
- package/plugins/copilot-pbr/templates/SUMMARY-minimal.md.tmpl +48 -0
- package/plugins/cursor-pbr/.cursor-plugin/plugin.json +1 -1
- package/plugins/cursor-pbr/agents/audit.md +51 -5
- package/plugins/cursor-pbr/agents/codebase-mapper.md +48 -1
- package/plugins/cursor-pbr/agents/debugger.md +47 -1
- package/plugins/cursor-pbr/agents/executor.md +152 -8
- package/plugins/cursor-pbr/agents/general.md +46 -1
- package/plugins/cursor-pbr/agents/integration-checker.md +51 -1
- package/plugins/cursor-pbr/agents/plan-checker.md +49 -1
- package/plugins/cursor-pbr/agents/planner.md +54 -1
- package/plugins/cursor-pbr/agents/researcher.md +46 -1
- package/plugins/cursor-pbr/agents/synthesizer.md +49 -1
- package/plugins/cursor-pbr/agents/verifier.md +85 -1
- package/plugins/cursor-pbr/hooks/hooks.json +9 -0
- package/plugins/cursor-pbr/references/agent-contracts.md +27 -0
- package/plugins/cursor-pbr/references/checkpoints.md +32 -1
- package/plugins/cursor-pbr/references/context-quality-tiers.md +45 -0
- package/plugins/cursor-pbr/references/pbr-tools-cli.md +115 -0
- package/plugins/cursor-pbr/references/questioning.md +21 -1
- package/plugins/cursor-pbr/references/verification-patterns.md +52 -1
- package/plugins/cursor-pbr/skills/audit/SKILL.md +19 -3
- package/plugins/cursor-pbr/skills/begin/SKILL.md +57 -4
- package/plugins/cursor-pbr/skills/build/SKILL.md +37 -2
- package/plugins/cursor-pbr/skills/debug/SKILL.md +12 -1
- package/plugins/cursor-pbr/skills/explore/SKILL.md +13 -2
- package/plugins/cursor-pbr/skills/import/SKILL.md +26 -1
- package/plugins/cursor-pbr/skills/milestone/SKILL.md +15 -3
- package/plugins/cursor-pbr/skills/plan/SKILL.md +50 -0
- package/plugins/cursor-pbr/skills/quick/SKILL.md +21 -0
- package/plugins/cursor-pbr/skills/review/SKILL.md +45 -0
- package/plugins/cursor-pbr/skills/scan/SKILL.md +20 -0
- package/plugins/cursor-pbr/templates/SUMMARY-complex.md.tmpl +95 -0
- package/plugins/cursor-pbr/templates/SUMMARY-minimal.md.tmpl +48 -0
- package/plugins/pbr/.claude-plugin/plugin.json +1 -1
- package/plugins/pbr/agents/audit.md +44 -0
- package/plugins/pbr/agents/codebase-mapper.md +47 -0
- package/plugins/pbr/agents/debugger.md +46 -0
- package/plugins/pbr/agents/executor.md +150 -6
- package/plugins/pbr/agents/general.md +45 -0
- package/plugins/pbr/agents/integration-checker.md +50 -0
- package/plugins/pbr/agents/plan-checker.md +48 -0
- package/plugins/pbr/agents/planner.md +51 -0
- package/plugins/pbr/agents/researcher.md +45 -0
- package/plugins/pbr/agents/synthesizer.md +48 -0
- package/plugins/pbr/agents/verifier.md +84 -0
- package/plugins/pbr/hooks/hooks.json +9 -0
- package/plugins/pbr/references/agent-contracts.md +27 -0
- package/plugins/pbr/references/checkpoints.md +32 -0
- package/plugins/pbr/references/context-quality-tiers.md +45 -0
- package/plugins/pbr/references/pbr-tools-cli.md +115 -0
- package/plugins/pbr/references/questioning.md +21 -0
- package/plugins/pbr/references/verification-patterns.md +52 -0
- package/plugins/pbr/scripts/check-plan-format.js +13 -1
- package/plugins/pbr/scripts/check-state-sync.js +26 -7
- package/plugins/pbr/scripts/check-subagent-output.js +30 -2
- package/plugins/pbr/scripts/config-schema.json +11 -1
- package/plugins/pbr/scripts/context-bridge.js +259 -0
- package/plugins/pbr/scripts/lib/config.js +178 -0
- package/plugins/pbr/scripts/lib/core.js +578 -0
- package/plugins/pbr/scripts/lib/history.js +73 -0
- package/plugins/pbr/scripts/lib/init.js +166 -0
- package/plugins/pbr/scripts/lib/phase.js +364 -0
- package/plugins/pbr/scripts/lib/roadmap.js +175 -0
- package/plugins/pbr/scripts/lib/state.js +397 -0
- package/plugins/pbr/scripts/pbr-tools.js +346 -1310
- package/plugins/pbr/scripts/post-write-dispatch.js +5 -4
- package/plugins/pbr/scripts/pre-write-dispatch.js +1 -1
- package/plugins/pbr/scripts/progress-tracker.js +1 -1
- package/plugins/pbr/scripts/suggest-compact.js +1 -1
- package/plugins/pbr/scripts/track-context-budget.js +53 -2
- package/plugins/pbr/scripts/validate-task.js +20 -28
- package/plugins/pbr/skills/audit/SKILL.md +19 -3
- package/plugins/pbr/skills/begin/SKILL.md +48 -2
- package/plugins/pbr/skills/build/SKILL.md +39 -2
- package/plugins/pbr/skills/debug/SKILL.md +12 -1
- package/plugins/pbr/skills/debug/templates/continuation-prompt.md.tmpl +12 -1
- package/plugins/pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +12 -5
- package/plugins/pbr/skills/explore/SKILL.md +13 -2
- package/plugins/pbr/skills/import/SKILL.md +26 -1
- package/plugins/pbr/skills/milestone/SKILL.md +15 -3
- package/plugins/pbr/skills/plan/SKILL.md +52 -2
- package/plugins/pbr/skills/quick/SKILL.md +21 -0
- package/plugins/pbr/skills/review/SKILL.md +46 -0
- package/plugins/pbr/skills/scan/SKILL.md +20 -0
- package/plugins/pbr/templates/SUMMARY-complex.md.tmpl +95 -0
- package/plugins/pbr/templates/SUMMARY-minimal.md.tmpl +48 -0
|
@@ -12,6 +12,14 @@ tools:
|
|
|
12
12
|
- Write
|
|
13
13
|
---
|
|
14
14
|
|
|
15
|
+
<files_to_read>
|
|
16
|
+
CRITICAL: If your spawn prompt contains a files_to_read block,
|
|
17
|
+
you MUST Read every listed file BEFORE any other action.
|
|
18
|
+
Skipping this causes hallucinated context and broken output.
|
|
19
|
+
</files_to_read>
|
|
20
|
+
|
|
21
|
+
> Default files: all PLAN files (must-haves), SUMMARY files, prior VERIFICATION.md
|
|
22
|
+
|
|
15
23
|
# Plan-Build-Run Verifier
|
|
16
24
|
|
|
17
25
|
You are **verifier**, the phase verification agent for the Plan-Build-Run development system. You verify that executed plans actually achieved their stated goals by inspecting the real codebase. You are the quality gate between execution and phase completion.
|
|
@@ -20,6 +28,8 @@ You are **verifier**, the phase verification agent for the Plan-Build-Run develo
|
|
|
20
28
|
|
|
21
29
|
**Task completion does NOT equal goal achievement.** You verify the GOAL, not the tasks. You check the CODEBASE, not the SUMMARY.md claims. Trust nothing — verify everything.
|
|
22
30
|
|
|
31
|
+
<critical_rules>
|
|
32
|
+
|
|
23
33
|
## Critical Constraints
|
|
24
34
|
|
|
25
35
|
### Read-Only Agent
|
|
@@ -36,6 +46,8 @@ Every claim must be backed by evidence. "I checked and it exists" is not evidenc
|
|
|
36
46
|
|
|
37
47
|
When validating SUMMARY.md and VERIFICATION.md outputs, read `references/agent-contracts.md` to confirm output schemas match their contract definitions. Check required fields, format constraints, and status enums.
|
|
38
48
|
|
|
49
|
+
</critical_rules>
|
|
50
|
+
|
|
39
51
|
## The 10-Step Verification Process
|
|
40
52
|
|
|
41
53
|
### Step 1: Check Previous Verification (Always)
|
|
@@ -213,6 +225,61 @@ Output includes `is_re_verification: true` in frontmatter and a regressions sect
|
|
|
213
225
|
|
|
214
226
|
Read `references/stub-patterns.md` for stub detection patterns by technology. Read the project's stack from `.planning/codebase/STACK.md` or `.planning/research/STACK.md` to determine which patterns to apply. If no stack file exists, use universal patterns only.
|
|
215
227
|
|
|
228
|
+
<stub_detection_patterns>
|
|
229
|
+
## Stub Detection Patterns
|
|
230
|
+
|
|
231
|
+
When checking if code is "substantive" (not a stub/placeholder), scan for these patterns:
|
|
232
|
+
|
|
233
|
+
**Universal stubs:**
|
|
234
|
+
- `return null`, `return undefined`, `return {}`, `return []`
|
|
235
|
+
- `TODO`, `FIXME`, `HACK`, `XXX` comments
|
|
236
|
+
- Empty function bodies: `function foo() {}`
|
|
237
|
+
- `throw new Error('Not implemented')`
|
|
238
|
+
- `console.log('placeholder')`
|
|
239
|
+
|
|
240
|
+
**React/JSX stubs:**
|
|
241
|
+
- `<div>ComponentName</div>` (render-only placeholder)
|
|
242
|
+
- `onClick={() => {}}` (empty event handler)
|
|
243
|
+
- `useState()` value never referenced in JSX
|
|
244
|
+
- Component returns only static text with no props usage
|
|
245
|
+
|
|
246
|
+
**API stubs:**
|
|
247
|
+
- `res.json({ message: 'Not implemented' })`
|
|
248
|
+
- `res.status(501)` or `res.status(200).json({})`
|
|
249
|
+
- Empty middleware: `(req, res, next) => next()`
|
|
250
|
+
- Route handler with no database/service calls
|
|
251
|
+
|
|
252
|
+
**Data flow stubs:**
|
|
253
|
+
- `fetch()` with no `await` or `.then()` — result discarded
|
|
254
|
+
- `useState()` setter never called
|
|
255
|
+
- Props received but never used in render
|
|
256
|
+
- Event handler that only calls `preventDefault()`
|
|
257
|
+
|
|
258
|
+
Mark any file containing 2+ stub patterns as "STUB — not substantive".
|
|
259
|
+
</stub_detection_patterns>
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
<success_criteria>
|
|
264
|
+
- [ ] Previous VERIFICATION.md checked
|
|
265
|
+
- [ ] Must-haves established from plan frontmatter
|
|
266
|
+
- [ ] All truths verified with status and evidence
|
|
267
|
+
- [ ] All artifacts checked at 3 levels (exists, substantive, wired)
|
|
268
|
+
- [ ] All key links verified including argument values
|
|
269
|
+
- [ ] Anti-patterns scanned and categorized
|
|
270
|
+
- [ ] Overall status determined
|
|
271
|
+
- [ ] VERIFICATION.md created with complete report
|
|
272
|
+
</success_criteria>
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## Completion Protocol
|
|
277
|
+
|
|
278
|
+
CRITICAL: Your final output MUST end with exactly one completion marker.
|
|
279
|
+
Orchestrators pattern-match on these markers to route results. Omitting causes silent failures.
|
|
280
|
+
|
|
281
|
+
- `## VERIFICATION COMPLETE` - VERIFICATION.md written (status in frontmatter)
|
|
282
|
+
|
|
216
283
|
---
|
|
217
284
|
|
|
218
285
|
## Budget Management
|
|
@@ -223,6 +290,19 @@ Read `references/stub-patterns.md` for stub detection patterns by technology. Re
|
|
|
223
290
|
|
|
224
291
|
---
|
|
225
292
|
|
|
293
|
+
### Context Quality Tiers
|
|
294
|
+
|
|
295
|
+
| Budget Used | Tier | Behavior |
|
|
296
|
+
|------------|------|----------|
|
|
297
|
+
| 0-30% | PEAK | Explore freely, read broadly |
|
|
298
|
+
| 30-50% | GOOD | Be selective with reads |
|
|
299
|
+
| 50-70% | DEGRADING | Write incrementally, skip non-essential |
|
|
300
|
+
| 70%+ | POOR | Finish current task and return immediately |
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
<anti_patterns>
|
|
305
|
+
|
|
226
306
|
## Anti-Patterns
|
|
227
307
|
|
|
228
308
|
### Universal Anti-Patterns
|
|
@@ -252,3 +332,7 @@ Read `references/stub-patterns.md` for stub detection patterns by technology. Re
|
|
|
252
332
|
10. DO NOT count deferred items as gaps — they are intentionally not implemented
|
|
253
333
|
11. DO NOT be lenient — your job is to find problems, not to be encouraging
|
|
254
334
|
12. DO NOT mark a call as WIRED if it passes hardcoded `undefined`/`null` for parameters that have a known source in scope — check arguments, not just function names
|
|
335
|
+
|
|
336
|
+
</anti_patterns>
|
|
337
|
+
|
|
338
|
+
---
|
|
@@ -63,6 +63,15 @@
|
|
|
63
63
|
"statusMessage": "Tracking context budget..."
|
|
64
64
|
}
|
|
65
65
|
]
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"hooks": [
|
|
69
|
+
{
|
|
70
|
+
"type": "command",
|
|
71
|
+
"command": "node -e \"var r=process.env.CLAUDE_PLUGIN_ROOT||'',m=r.match(/^\\/([a-zA-Z])\\/(.*)/);if(m)r=m[1]+String.fromCharCode(58)+String.fromCharCode(92)+m[2];require(require('path').resolve(r,'scripts','run-hook.js'))\" context-bridge.js",
|
|
72
|
+
"statusMessage": "Updating context monitor..."
|
|
73
|
+
}
|
|
74
|
+
]
|
|
66
75
|
}
|
|
67
76
|
],
|
|
68
77
|
"PostToolUseFailure": [
|
|
@@ -295,3 +295,30 @@ No YAML frontmatter required — these are reference documents with markdown tab
|
|
|
295
295
|
- Codebase-Mapper does NOT commit — the orchestrator handles commits
|
|
296
296
|
- Researcher treats these as S0 (highest confidence) local prior research
|
|
297
297
|
- One focus area per invocation
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## Completion Markers
|
|
302
|
+
|
|
303
|
+
Every agent MUST end its output with exactly one completion marker. Orchestrating skills pattern-match on these markers to route results. Omitting a marker causes silent routing failures.
|
|
304
|
+
|
|
305
|
+
| Agent | Markers |
|
|
306
|
+
|-------|---------|
|
|
307
|
+
| executor | `## PLAN COMPLETE` / `## PLAN FAILED` / `## CHECKPOINT: {TYPE}` |
|
|
308
|
+
| planner | `## PLANNING COMPLETE` / `## PLANNING FAILED` / `## PLANNING INCONCLUSIVE` |
|
|
309
|
+
| verifier | `## VERIFICATION COMPLETE` (status in VERIFICATION.md frontmatter) |
|
|
310
|
+
| researcher | `## RESEARCH COMPLETE` / `## RESEARCH BLOCKED` |
|
|
311
|
+
| synthesizer | `## SYNTHESIS COMPLETE` / `## SYNTHESIS BLOCKED` |
|
|
312
|
+
| plan-checker | `## CHECK PASSED` / `## ISSUES FOUND` |
|
|
313
|
+
| debugger | `## DEBUG COMPLETE` / `## ROOT CAUSE FOUND` / `## DEBUG SESSION PAUSED` |
|
|
314
|
+
| codebase-mapper | `## MAPPING COMPLETE` |
|
|
315
|
+
| integration-checker | `## INTEGRATION CHECK COMPLETE` |
|
|
316
|
+
| general | `## TASK COMPLETE` / `## TASK FAILED` |
|
|
317
|
+
| audit | `## AUDIT COMPLETE` |
|
|
318
|
+
|
|
319
|
+
### Rules
|
|
320
|
+
|
|
321
|
+
- Exactly ONE marker per agent invocation — never zero, never multiple
|
|
322
|
+
- Marker must be the LAST heading in output (content may follow on same line)
|
|
323
|
+
- Skills check for markers with regex: `/^## (PLAN COMPLETE|PLAN FAILED|CHECKPOINT)/m`
|
|
324
|
+
- If an agent cannot determine outcome, use the FAILED/BLOCKED variant with explanation
|
|
@@ -155,3 +155,35 @@ When creating plans that include checkpoints:
|
|
|
155
155
|
4. **Provide clear instructions** — the `<action>` and `<verify>` elements should give the human everything they need
|
|
156
156
|
5. **Consider autonomous alternatives** — if a task CAN be verified automatically, prefer `type="auto"` with a robust `<verify>` command
|
|
157
157
|
6. **Set `autonomous: false`** in the plan frontmatter when any task is a checkpoint
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Automation-First Philosophy
|
|
162
|
+
|
|
163
|
+
### 5 Golden Rules
|
|
164
|
+
1. If Claude CAN run it, Claude MUST run it
|
|
165
|
+
2. If Claude CAN verify it, Claude MUST verify it
|
|
166
|
+
3. Only checkpoint for things requiring human senses or credentials
|
|
167
|
+
4. Group manual actions to minimize checkpoint count
|
|
168
|
+
5. Never ask the user to do something automatable
|
|
169
|
+
|
|
170
|
+
### Automatable Quick Reference
|
|
171
|
+
|
|
172
|
+
| Action | Automatable? | Notes |
|
|
173
|
+
|--------|-------------|-------|
|
|
174
|
+
| Run tests | YES | `npm test`, `pytest`, etc. |
|
|
175
|
+
| Start dev server | YES | `npm run dev` (check port) |
|
|
176
|
+
| Check environment variables | YES | `env \| grep KEY` |
|
|
177
|
+
| Build project | YES | `npm run build` |
|
|
178
|
+
| Run linting | YES | `npm run lint` |
|
|
179
|
+
| Database migrations | YES | CLI commands |
|
|
180
|
+
| Click email verification link | NO | Requires browser + inbox |
|
|
181
|
+
| 3DS payment verification | NO | Requires card + phone |
|
|
182
|
+
| OAuth consent screen | NO | Requires browser interaction |
|
|
183
|
+
| Hardware token/YubiKey | NO | Physical device |
|
|
184
|
+
|
|
185
|
+
### Anti-Patterns
|
|
186
|
+
- Asking user to "start the dev server" — just run it
|
|
187
|
+
- Asking user to "check if tests pass" — run `npm test`
|
|
188
|
+
- Saying "please verify the output" without running verification commands first
|
|
189
|
+
- Creating a checkpoint for `mkdir` or `npm install`
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Context Quality Tiers
|
|
2
|
+
|
|
3
|
+
Behavioral guidance for agents based on context window utilization.
|
|
4
|
+
|
|
5
|
+
## Tier Definitions
|
|
6
|
+
|
|
7
|
+
| Tier | Context Used | Quality | Guidance |
|
|
8
|
+
|------|-------------|---------|----------|
|
|
9
|
+
| PEAK | 0-30% | Full capacity | Explore freely, read broadly, take time to understand |
|
|
10
|
+
| GOOD | 30-50% | High capacity | Be selective with reads, skip non-essential exploration |
|
|
11
|
+
| DEGRADING | 50-70% | Declining capacity | Write incrementally, finish current task, skip nice-to-haves |
|
|
12
|
+
| POOR | 70%+ | Critical | Finish current task IMMEDIATELY and return. No new reads. |
|
|
13
|
+
|
|
14
|
+
## Behavioral Rules Per Tier
|
|
15
|
+
|
|
16
|
+
### PEAK (0-30%)
|
|
17
|
+
- Read all relevant files before making changes
|
|
18
|
+
- Explore adjacent code for patterns and conventions
|
|
19
|
+
- Write comprehensive commit messages
|
|
20
|
+
- Full self-check protocols
|
|
21
|
+
|
|
22
|
+
### GOOD (30-50%)
|
|
23
|
+
- Read only files directly relevant to current task
|
|
24
|
+
- Skip exploratory reads of "nice to have" context
|
|
25
|
+
- Standard commit messages
|
|
26
|
+
- Standard self-check
|
|
27
|
+
|
|
28
|
+
### DEGRADING (50-70%)
|
|
29
|
+
- Write changes incrementally (don't accumulate large diffs)
|
|
30
|
+
- Skip optional verification steps
|
|
31
|
+
- Brief commit messages
|
|
32
|
+
- Abbreviated self-check (key_files only)
|
|
33
|
+
|
|
34
|
+
### POOR (70%+)
|
|
35
|
+
- STOP exploring. Finish the current task only.
|
|
36
|
+
- Write SUMMARY.md immediately if executor
|
|
37
|
+
- Return completion marker immediately
|
|
38
|
+
- Do NOT start new tasks or reads
|
|
39
|
+
|
|
40
|
+
## Agent-Specific Overrides
|
|
41
|
+
|
|
42
|
+
- **Researcher**: At DEGRADING, write findings immediately rather than accumulating
|
|
43
|
+
- **Executor**: At DEGRADING, complete current task then return CHECKPOINT
|
|
44
|
+
- **Verifier**: At DEGRADING, check existence only (skip substantiveness/wiring layers)
|
|
45
|
+
- **Planner**: At GOOD, reduce task detail level; at DEGRADING, finish current plan file only
|
|
@@ -283,3 +283,118 @@ node ${CLAUDE_PLUGIN_ROOT}/scripts/pbr-tools.js event error hook-failure '{"scri
|
|
|
283
283
|
**Output:** `{ "logged": true, "category": "build", "event": "plan-complete" }`
|
|
284
284
|
|
|
285
285
|
If the JSON-details argument is not valid JSON, it's stored as `{ "raw": "<the string>" }`.
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## Compound Init Commands
|
|
290
|
+
|
|
291
|
+
Compound commands that compose multiple data sources into a single JSON response.
|
|
292
|
+
Replace multi-step context loading in skills with a single CLI call.
|
|
293
|
+
|
|
294
|
+
### `init execute-phase <phase>`
|
|
295
|
+
|
|
296
|
+
Everything an executor needs to start building a phase.
|
|
297
|
+
|
|
298
|
+
```bash
|
|
299
|
+
node ${CLAUDE_PLUGIN_ROOT}/scripts/pbr-tools.js init execute-phase 3
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**Output:**
|
|
303
|
+
```json
|
|
304
|
+
{
|
|
305
|
+
"executor_model": "sonnet",
|
|
306
|
+
"verifier_model": "sonnet",
|
|
307
|
+
"config": { "depth": "standard", "mode": "interactive", "parallelization": {}, "planning": {}, "gates": {}, "features": {} },
|
|
308
|
+
"phase": { "num": "3", "dir": "03-auth", "name": "auth", "goal": "...", "has_context": false, "status": "planned", "plan_count": 2, "completed": 0 },
|
|
309
|
+
"plans": [{ "file": "PLAN-01.md", "plan_id": "01", "wave": 1, "autonomous": true, "has_summary": false, "must_haves_count": 4, "depends_on": [] }],
|
|
310
|
+
"waves": { "wave_1": ["01", "02"] },
|
|
311
|
+
"branch_name": "main",
|
|
312
|
+
"git_clean": true
|
|
313
|
+
}
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### `init plan-phase <phase>`
|
|
317
|
+
|
|
318
|
+
Everything a planner needs to start phase planning.
|
|
319
|
+
|
|
320
|
+
```bash
|
|
321
|
+
node ${CLAUDE_PLUGIN_ROOT}/scripts/pbr-tools.js init plan-phase 3
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
**Output:** `researcher_model`, `planner_model`, `checker_model`, `config` (depth profile, features, planning settings), `phase` (num, dir, goal, depends_on), `existing_artifacts`, `workflow` flags.
|
|
325
|
+
|
|
326
|
+
### `init quick <description>`
|
|
327
|
+
|
|
328
|
+
Everything the quick skill needs: next task number, slug, directory path.
|
|
329
|
+
|
|
330
|
+
```bash
|
|
331
|
+
node ${CLAUDE_PLUGIN_ROOT}/scripts/pbr-tools.js init quick "add search feature"
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
**Output:** `next_task_number`, `slug`, `dir`, `dir_name`, `timestamp`, `config` subset.
|
|
335
|
+
|
|
336
|
+
### `init verify-work <phase>`
|
|
337
|
+
|
|
338
|
+
Everything a verifier needs to start verification.
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
node ${CLAUDE_PLUGIN_ROOT}/scripts/pbr-tools.js init verify-work 3
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
**Output:** `verifier_model`, `phase` info, `has_verification`, `prior_attempts`, `prior_status`, `summaries`.
|
|
345
|
+
|
|
346
|
+
### `init resume`
|
|
347
|
+
|
|
348
|
+
Detect interrupted state and suggest continuation.
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
node ${CLAUDE_PLUGIN_ROOT}/scripts/pbr-tools.js init resume
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
**Output:** `state`, `auto_next`, `continue_here`, `active_skill`, `current_phase`, `progress`.
|
|
355
|
+
|
|
356
|
+
### `init progress`
|
|
357
|
+
|
|
358
|
+
All phases with status and completion data.
|
|
359
|
+
|
|
360
|
+
```bash
|
|
361
|
+
node ${CLAUDE_PLUGIN_ROOT}/scripts/pbr-tools.js init progress
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
**Output:** `current_phase`, `total_phases`, `status`, `phases` array, `total_plans`, `completed_plans`, `percentage`.
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
## State Mutation Extensions
|
|
369
|
+
|
|
370
|
+
### `state patch <JSON>`
|
|
371
|
+
|
|
372
|
+
Multi-field atomic STATE.md update. Updates all fields in a single pass.
|
|
373
|
+
|
|
374
|
+
```bash
|
|
375
|
+
node ${CLAUDE_PLUGIN_ROOT}/scripts/pbr-tools.js state patch '{"status":"executing","last_activity":"now"}'
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
**Valid fields:** `current_phase`, `status`, `plans_complete`, `last_activity`, `progress_percent`, `phase_slug`, `total_phases`, `last_command`, `blockers`
|
|
379
|
+
|
|
380
|
+
**Output:** `{ "success": true, "updated": ["status", "last_activity"] }`
|
|
381
|
+
|
|
382
|
+
### `state advance-plan`
|
|
383
|
+
|
|
384
|
+
Increment current plan number in STATE.md and update progress percentage.
|
|
385
|
+
|
|
386
|
+
```bash
|
|
387
|
+
node ${CLAUDE_PLUGIN_ROOT}/scripts/pbr-tools.js state advance-plan
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
**Output:** `{ "success": true, "previous_plan": 1, "current_plan": 2, "total_plans": 5, "progress_percent": 40 }`
|
|
391
|
+
|
|
392
|
+
### `state record-metric [--duration Nm] [--plans-completed N]`
|
|
393
|
+
|
|
394
|
+
Record session/execution metrics. Appends to HISTORY.md and updates last_activity.
|
|
395
|
+
|
|
396
|
+
```bash
|
|
397
|
+
node ${CLAUDE_PLUGIN_ROOT}/scripts/pbr-tools.js state record-metric --duration 15m --plans-completed 3
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
**Output:** `{ "success": true, "duration_minutes": 15, "plans_completed": 3 }`
|
|
@@ -212,3 +212,24 @@ See **[skills/shared/domain-probes.md](../shared/domain-probes.md)** for technol
|
|
|
212
212
|
9. **DO NOT** lead the user toward a particular solution
|
|
213
213
|
10. **DO NOT** forget to summarize and confirm understanding
|
|
214
214
|
11. **DO NOT** ask what you already know — track what the user has stated and never re-ask it. If they said "I'm using React", do not later ask "Are you using a frontend framework?" If they said "PostgreSQL", do not ask "What database are you using?" Redundant questions waste exchanges and erode trust. Instead, build on what you know: "You mentioned React — are you using Next.js or plain CRA?"
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## Dream Extraction Philosophy
|
|
219
|
+
|
|
220
|
+
The goal of questioning is not to gather requirements — it's to extract the user's dream and make it buildable.
|
|
221
|
+
|
|
222
|
+
### 4-Item Context Checklist
|
|
223
|
+
Before planning can begin, you must know:
|
|
224
|
+
1. **What** are we building? (concrete deliverable, not abstract concept)
|
|
225
|
+
2. **Why** does it exist? (the problem it solves, not the tech it uses)
|
|
226
|
+
3. **Who** is it for? (specific users, not "everyone")
|
|
227
|
+
4. **What does done look like?** (observable outcomes, not technical milestones)
|
|
228
|
+
|
|
229
|
+
### Conversation Rules
|
|
230
|
+
- **Start open**: "Tell me about what you want to build"
|
|
231
|
+
- **Follow energy**: When they light up about something, dig deeper there
|
|
232
|
+
- **Challenge vagueness**: "You said 'user-friendly' — what does that mean specifically?"
|
|
233
|
+
- **Know when to stop**: When you have the 4 items above, move to planning
|
|
234
|
+
- **NEVER ask about technical experience**: It's irrelevant and condescending
|
|
235
|
+
- **NEVER present a menu of options**: Open questions reveal more than multiple choice
|
|
@@ -196,3 +196,55 @@ Bad: "Tests pass"
|
|
|
196
196
|
Good: "All 5 auth middleware tests pass: valid token, expired token,
|
|
197
197
|
missing token, malformed token, and correct user extraction"
|
|
198
198
|
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Wiring Verification Patterns
|
|
203
|
+
|
|
204
|
+
4 concrete patterns for verifying components are actually connected, not just present.
|
|
205
|
+
|
|
206
|
+
### Pattern 1: Component to API
|
|
207
|
+
1. Find the fetch/axios call in the component
|
|
208
|
+
2. Verify the call is NOT commented out
|
|
209
|
+
3. Verify the response is assigned to state (not discarded)
|
|
210
|
+
4. Verify error handling exists (try/catch or .catch)
|
|
211
|
+
|
|
212
|
+
### Pattern 2: API to Database
|
|
213
|
+
1. Find the database query in the route handler
|
|
214
|
+
2. Verify `await` is present (not fire-and-forget)
|
|
215
|
+
3. Verify the result is returned in the response (not discarded)
|
|
216
|
+
4. Verify error cases return appropriate HTTP status codes
|
|
217
|
+
|
|
218
|
+
### Pattern 3: Form to Handler
|
|
219
|
+
1. Find the form's onSubmit handler
|
|
220
|
+
2. Verify it calls an API function (not just preventDefault)
|
|
221
|
+
3. Verify form validation runs before the API call
|
|
222
|
+
4. Verify success/error feedback is shown to the user
|
|
223
|
+
|
|
224
|
+
### Pattern 4: State to Render
|
|
225
|
+
1. Find state variables (useState, store, etc.)
|
|
226
|
+
2. Verify they appear in JSX/template via .map(), interpolation, or conditional rendering
|
|
227
|
+
3. Verify loading/error states are rendered (not just success state)
|
|
228
|
+
4. Verify empty state is handled (not just "no data" crash)
|
|
229
|
+
|
|
230
|
+
### Quick Verification Checklists
|
|
231
|
+
|
|
232
|
+
**Component Checklist (8 items):**
|
|
233
|
+
- [ ] Component file exists and exports correctly
|
|
234
|
+
- [ ] Props/types are defined (not `any`)
|
|
235
|
+
- [ ] API calls use actual endpoints (not hardcoded data)
|
|
236
|
+
- [ ] Loading state renders something meaningful
|
|
237
|
+
- [ ] Error state renders something meaningful
|
|
238
|
+
- [ ] Empty state renders something meaningful
|
|
239
|
+
- [ ] User interactions trigger actual handlers
|
|
240
|
+
- [ ] Component is imported and rendered in parent
|
|
241
|
+
|
|
242
|
+
**API Route Checklist (8 items):**
|
|
243
|
+
- [ ] Route file exists and exports handler
|
|
244
|
+
- [ ] Route is registered in router/app
|
|
245
|
+
- [ ] Request validation exists (body, params, query)
|
|
246
|
+
- [ ] Database query uses parameterized inputs
|
|
247
|
+
- [ ] Success response includes expected data shape
|
|
248
|
+
- [ ] Error response includes status code and message
|
|
249
|
+
- [ ] Authentication/authorization check exists if needed
|
|
250
|
+
- [ ] Response matches what the frontend expects
|
|
@@ -194,7 +194,7 @@ function validatePlan(content, _filePath) {
|
|
|
194
194
|
|
|
195
195
|
// Skip checkpoint tasks - they have different required elements
|
|
196
196
|
const taskTag = taskTags[index] || '';
|
|
197
|
-
if (taskTag.
|
|
197
|
+
if (/\btype\s*=\s*["']?checkpoint/i.test(taskTag) || /\bcheckpoint\s*[:=]/i.test(taskTag)) {
|
|
198
198
|
return; // Checkpoint tasks have different structure
|
|
199
199
|
}
|
|
200
200
|
|
|
@@ -205,6 +205,18 @@ function validatePlan(content, _filePath) {
|
|
|
205
205
|
}
|
|
206
206
|
});
|
|
207
207
|
|
|
208
|
+
// Path traversal check: ensure <files> elements don't escape project root
|
|
209
|
+
const filesTags = content.match(/<files>([\s\S]*?)<\/files>/g) || [];
|
|
210
|
+
for (const filesTag of filesTags) {
|
|
211
|
+
const filesContent = filesTag.replace(/<\/?files>/g, '');
|
|
212
|
+
const paths = filesContent.split(/[\n,]/).map(p => p.trim()).filter(Boolean);
|
|
213
|
+
for (const p of paths) {
|
|
214
|
+
if (p.includes('..') || path.isAbsolute(p.replace(/^[A-Za-z]:/, ''))) {
|
|
215
|
+
warnings.push(`Path traversal risk in <files>: "${p}" — use relative paths without ".." segments`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
208
220
|
return { errors, warnings };
|
|
209
221
|
}
|
|
210
222
|
|
|
@@ -26,7 +26,25 @@ const fs = require('fs');
|
|
|
26
26
|
const path = require('path');
|
|
27
27
|
const { logHook } = require('./hook-logger');
|
|
28
28
|
const { logEvent } = require('./event-logger');
|
|
29
|
-
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Write content to a file atomically using write-then-rename.
|
|
32
|
+
* Writes to a PID-stamped temp file, then renames over the original.
|
|
33
|
+
* If the rename fails, cleans up the temp file and re-throws.
|
|
34
|
+
*
|
|
35
|
+
* @param {string} filePath - Target file path
|
|
36
|
+
* @param {string} content - Content to write
|
|
37
|
+
*/
|
|
38
|
+
function atomicWriteFile(filePath, content) {
|
|
39
|
+
const tmpPath = filePath + '.tmp.' + process.pid;
|
|
40
|
+
try {
|
|
41
|
+
fs.writeFileSync(tmpPath, content, 'utf8');
|
|
42
|
+
fs.renameSync(tmpPath, filePath);
|
|
43
|
+
} catch (e) {
|
|
44
|
+
try { fs.unlinkSync(tmpPath); } catch (_) { /* best effort cleanup */ }
|
|
45
|
+
throw e;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
30
48
|
|
|
31
49
|
/**
|
|
32
50
|
* Extract phase number from a phase directory name.
|
|
@@ -326,7 +344,7 @@ function checkStateSync(data) {
|
|
|
326
344
|
return null;
|
|
327
345
|
}
|
|
328
346
|
|
|
329
|
-
const cwd = process.cwd();
|
|
347
|
+
const cwd = process.env.PBR_PROJECT_ROOT || process.cwd();
|
|
330
348
|
const planningDir = path.join(cwd, '.planning');
|
|
331
349
|
const roadmapPath = path.join(planningDir, 'ROADMAP.md');
|
|
332
350
|
const statePath = path.join(planningDir, 'STATE.md');
|
|
@@ -370,7 +388,7 @@ function checkStateSync(data) {
|
|
|
370
388
|
} else {
|
|
371
389
|
const updatedRoadmap = updateProgressTable(roadmapContent, phaseNum, plansComplete, newStatus, completedDate);
|
|
372
390
|
if (updatedRoadmap !== roadmapContent) {
|
|
373
|
-
|
|
391
|
+
atomicWriteFile(roadmapPath, updatedRoadmap);
|
|
374
392
|
messages.push(`ROADMAP.md: Phase ${phaseNum} → ${plansComplete} plans, ${newStatus}`);
|
|
375
393
|
}
|
|
376
394
|
}
|
|
@@ -410,7 +428,7 @@ function checkStateSync(data) {
|
|
|
410
428
|
|
|
411
429
|
const updatedState = updateStatePosition(stateContent, stateUpdates);
|
|
412
430
|
if (updatedState !== stateContent) {
|
|
413
|
-
|
|
431
|
+
atomicWriteFile(statePath, updatedState);
|
|
414
432
|
messages.push(`STATE.md: ${artifacts.completeSummaries}/${artifacts.plans} plans, ${overallPct}%`);
|
|
415
433
|
}
|
|
416
434
|
} catch (e) {
|
|
@@ -455,7 +473,7 @@ function checkStateSync(data) {
|
|
|
455
473
|
} else {
|
|
456
474
|
const updatedRoadmap = updateProgressTable(roadmapContent, phaseNum, plansComplete, roadmapStatus, completedDate);
|
|
457
475
|
if (updatedRoadmap !== roadmapContent) {
|
|
458
|
-
|
|
476
|
+
atomicWriteFile(roadmapPath, updatedRoadmap);
|
|
459
477
|
messages.push(`ROADMAP.md: Phase ${phaseNum} → ${roadmapStatus}`);
|
|
460
478
|
}
|
|
461
479
|
}
|
|
@@ -493,7 +511,7 @@ function checkStateSync(data) {
|
|
|
493
511
|
|
|
494
512
|
const updatedState = updateStatePosition(stateContent, stateUpdates);
|
|
495
513
|
if (updatedState !== stateContent) {
|
|
496
|
-
|
|
514
|
+
atomicWriteFile(statePath, updatedState);
|
|
497
515
|
messages.push(`STATE.md: ${stateStatus}, ${overallPct}%`);
|
|
498
516
|
}
|
|
499
517
|
} catch (e) {
|
|
@@ -543,7 +561,7 @@ function checkStateSync(data) {
|
|
|
543
561
|
const plansComplete = `${artifacts.completeSummaries}/${artifacts.plans}`;
|
|
544
562
|
const updatedRoadmap = updateProgressTable(roadmapContent, phaseNum, plansComplete, 'Planning', null);
|
|
545
563
|
if (updatedRoadmap !== roadmapContent) {
|
|
546
|
-
|
|
564
|
+
atomicWriteFile(roadmapPath, updatedRoadmap);
|
|
547
565
|
messages.push(`ROADMAP.md: Phase ${phaseNum} → Planning`);
|
|
548
566
|
}
|
|
549
567
|
}
|
|
@@ -588,6 +606,7 @@ function main() {
|
|
|
588
606
|
|
|
589
607
|
if (require.main === module || process.argv[1] === __filename) { main(); }
|
|
590
608
|
module.exports = {
|
|
609
|
+
atomicWriteFile,
|
|
591
610
|
extractPhaseNum,
|
|
592
611
|
countPhaseArtifacts,
|
|
593
612
|
updateProgressTable,
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
const fs = require('fs');
|
|
21
21
|
const path = require('path');
|
|
22
22
|
const { logHook } = require('./hook-logger');
|
|
23
|
+
const { KNOWN_AGENTS } = require('./pbr-tools');
|
|
23
24
|
const { resolveConfig } = require('./local-llm/health');
|
|
24
25
|
const { classifyError } = require('./local-llm/operations/classify-error');
|
|
25
26
|
|
|
@@ -27,7 +28,7 @@ const { classifyError } = require('./local-llm/operations/classify-error');
|
|
|
27
28
|
* Check if a file was modified recently (within thresholdMs).
|
|
28
29
|
* Returns false if file doesn't exist or on error.
|
|
29
30
|
*/
|
|
30
|
-
function isRecent(filePath, thresholdMs =
|
|
31
|
+
function isRecent(filePath, thresholdMs = 1800000) {
|
|
31
32
|
try {
|
|
32
33
|
const stat = fs.statSync(filePath);
|
|
33
34
|
return (Date.now() - stat.mtimeMs) < thresholdMs;
|
|
@@ -151,6 +152,25 @@ const AGENT_OUTPUTS = {
|
|
|
151
152
|
description: 'advisory output (no file expected)',
|
|
152
153
|
noFileExpected: true,
|
|
153
154
|
check: () => []
|
|
155
|
+
},
|
|
156
|
+
'pbr:audit': {
|
|
157
|
+
description: 'audit report in .planning/audits/',
|
|
158
|
+
check: (planningDir) => {
|
|
159
|
+
const auditsDir = path.join(planningDir, 'audits');
|
|
160
|
+
if (!fs.existsSync(auditsDir)) return [];
|
|
161
|
+
try {
|
|
162
|
+
return fs.readdirSync(auditsDir)
|
|
163
|
+
.filter(f => f.endsWith('.md'))
|
|
164
|
+
.map(f => path.join('audits', f));
|
|
165
|
+
} catch (_e) {
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
'pbr:dev-sync': {
|
|
171
|
+
description: 'advisory output (no file expected)',
|
|
172
|
+
noFileExpected: true,
|
|
173
|
+
check: () => []
|
|
154
174
|
}
|
|
155
175
|
};
|
|
156
176
|
|
|
@@ -324,7 +344,7 @@ function loadLocalLlmConfig(cwd) {
|
|
|
324
344
|
|
|
325
345
|
async function main() {
|
|
326
346
|
const data = readStdin();
|
|
327
|
-
const cwd = process.cwd();
|
|
347
|
+
const cwd = process.env.PBR_PROJECT_ROOT || process.cwd();
|
|
328
348
|
const planningDir = path.join(cwd, '.planning');
|
|
329
349
|
|
|
330
350
|
// Only relevant for Plan-Build-Run projects
|
|
@@ -338,6 +358,14 @@ async function main() {
|
|
|
338
358
|
// Only check known Plan-Build-Run agent types
|
|
339
359
|
const outputSpec = AGENT_OUTPUTS[agentType];
|
|
340
360
|
if (!outputSpec) {
|
|
361
|
+
// Log when agent is in KNOWN_AGENTS but missing from AGENT_OUTPUTS
|
|
362
|
+
const shortName = agentType.startsWith('pbr:') ? agentType.slice(4) : agentType;
|
|
363
|
+
if (KNOWN_AGENTS && KNOWN_AGENTS.includes && KNOWN_AGENTS.includes(shortName)) {
|
|
364
|
+
logHook('check-subagent-output', 'PostToolUse', 'missing-output-spec', {
|
|
365
|
+
agent_type: agentType,
|
|
366
|
+
message: `Agent ${agentType} is in KNOWN_AGENTS but has no AGENT_OUTPUTS entry. Add one to check-subagent-output.js.`
|
|
367
|
+
});
|
|
368
|
+
}
|
|
341
369
|
process.exit(0);
|
|
342
370
|
}
|
|
343
371
|
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
"description": "Configuration schema for .planning/config.json",
|
|
5
5
|
"type": "object",
|
|
6
6
|
"properties": {
|
|
7
|
-
"version": { "type": "integer", "enum": [1, 2] },
|
|
7
|
+
"version": { "type": ["integer", "string"], "enum": [1, 2, "1", "2"], "description": "Planning format version. v2 is current." },
|
|
8
|
+
"schema_version": { "type": "integer", "enum": [1], "description": "Config schema version for migration detection. Increment when config structure changes." },
|
|
8
9
|
"context_strategy": { "type": "string", "enum": ["aggressive", "conservative", "balanced"] },
|
|
9
10
|
"mode": { "type": "string", "enum": ["interactive", "autonomous"] },
|
|
10
11
|
"depth": { "type": "string", "enum": ["quick", "standard", "comprehensive"], "description": "Workflow depth: quick = budget mode (fewer spawns, skip optional stages), standard = balanced mode (conditional spawns), comprehensive = thorough mode (all spawns, current default)" },
|
|
@@ -131,6 +132,15 @@
|
|
|
131
132
|
},
|
|
132
133
|
"additionalProperties": false
|
|
133
134
|
},
|
|
135
|
+
"timeouts": {
|
|
136
|
+
"type": "object",
|
|
137
|
+
"properties": {
|
|
138
|
+
"task_default_ms": { "type": "integer", "minimum": 30000, "description": "Default timeout per task in milliseconds (default: 300000 = 5 min)" },
|
|
139
|
+
"build_max_ms": { "type": "integer", "minimum": 60000, "description": "Maximum time for entire build command in milliseconds" },
|
|
140
|
+
"verify_max_ms": { "type": "integer", "minimum": 30000, "description": "Maximum time for verification in milliseconds" }
|
|
141
|
+
},
|
|
142
|
+
"additionalProperties": false
|
|
143
|
+
},
|
|
134
144
|
"hooks": {
|
|
135
145
|
"type": "object",
|
|
136
146
|
"properties": {
|