@pareto4/pp-core 1.19.0 → 1.21.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/.claude-plugin/plugin.json +1 -1
- package/agents/pp-nyquist-auditor.md +19 -14
- package/agents/pp-phase-researcher.md +10 -0
- package/agents/pp-plan-checker.md +59 -36
- package/agents/pp-planner.md +49 -53
- package/agents/pp-vault-reviewer.md +2 -0
- package/agents/pp-verifier.md +15 -60
- package/commands/pp-autonomous.md +2 -1
- package/commands/pp-discovery.md +3 -2
- package/commands/pp-plan-phase.md +2 -1
- package/commands/pp-plan-review-convergence.md +2 -1
- package/gemini-extension.json +1 -1
- package/package.json +6 -3
- package/pareto-skills/_shared/pp-claude-md-protocol.md +1 -1
- package/pareto-skills/pp-project-setup/SKILL.md +18 -343
- package/pp-core/bin/lib/capability-activation.cjs +77 -0
- package/pp-core/bin/lib/capability-registry.cjs +15 -15
- package/pp-core/bin/lib/capability-state.cjs +8 -18
- package/pp-core/bin/lib/ceremony.cjs +1342 -0
- package/pp-core/bin/lib/check-command-router.cjs +62 -1
- package/pp-core/bin/lib/commands.cjs +29 -3
- package/pp-core/bin/lib/config.cjs +5 -0
- package/pp-core/bin/lib/discovery-access.cjs +276 -0
- package/pp-core/bin/lib/discovery-charter.cjs +664 -0
- package/pp-core/bin/lib/discovery-deviations.cjs +264 -0
- package/pp-core/bin/lib/discovery-entities.cjs +323 -0
- package/pp-core/bin/lib/discovery-for-phase.cjs +628 -0
- package/pp-core/bin/lib/discovery-integrations.cjs +286 -0
- package/pp-core/bin/lib/discovery-migration.cjs +246 -0
- package/pp-core/bin/lib/discovery-phases.cjs +233 -0
- package/pp-core/bin/lib/discovery-processes.cjs +355 -0
- package/pp-core/bin/lib/discovery-research-track.cjs +5 -4
- package/pp-core/bin/lib/discovery-rollup.cjs +8 -7
- package/pp-core/bin/lib/discovery-rules.cjs +216 -0
- package/pp-core/bin/lib/discovery-screens.cjs +1 -1
- package/pp-core/bin/lib/discovery-session-check.cjs +264 -0
- package/pp-core/bin/lib/discovery-stories.cjs +273 -0
- package/pp-core/bin/lib/discovery-sweep.cjs +1 -1
- package/pp-core/bin/lib/discovery-table.cjs +55 -0
- package/pp-core/bin/lib/init.cjs +50 -1
- package/pp-core/bin/lib/io.cjs +24 -0
- package/pp-core/bin/lib/loop-resolver.cjs +26 -12
- package/pp-core/bin/lib/phase.cjs +39 -3
- package/pp-core/bin/lib/plan-sizing.cjs +346 -0
- package/pp-core/bin/lib/test-substance.cjs +3190 -0
- package/pp-core/bin/lib/timeline.cjs +605 -0
- package/pp-core/bin/lib/vault-standards-review.cjs +50 -2
- package/pp-core/bin/pp-tools.cjs +214 -5
- package/pp-core/bin/shared/ceremony-gates.json +17 -0
- package/pp-core/bin/shared/config-schema.manifest.json +1 -0
- package/pp-core/references/ceremony.md +81 -0
- package/pp-core/references/discovery-access.md +112 -0
- package/pp-core/references/discovery-build-consumption.md +256 -0
- package/pp-core/references/discovery-charter.md +127 -0
- package/pp-core/references/discovery-data-model.md +145 -0
- package/pp-core/references/discovery-id-conventions.md +50 -14
- package/pp-core/references/discovery-integrations.md +151 -0
- package/pp-core/references/discovery-processes.md +190 -0
- package/pp-core/references/discovery-rebaseline.md +2 -2
- package/pp-core/references/discovery-research-track.md +5 -6
- package/pp-core/references/discovery-session-output.md +70 -0
- package/pp-core/references/discovery-standards.md +107 -0
- package/pp-core/references/discovery-traceability.md +2 -2
- package/pp-core/references/few-shot-examples/plan-checker.md +8 -8
- package/pp-core/references/phase-timeline.md +107 -0
- package/pp-core/references/planner-antipatterns.md +32 -0
- package/pp-core/references/planner-discovery-extract.md +35 -0
- package/pp-core/references/planner-guidance.md +17 -14
- package/pp-core/references/planner-revision.md +1 -1
- package/pp-core/references/planning-config.md +3 -2
- package/pp-core/references/test-substance.md +324 -0
- package/pp-core/references/verifier-discovery-conformance.md +36 -0
- package/pp-core/references/verifier-stub-patterns.md +51 -0
- package/pp-core/templates/VALIDATION.md +1 -0
- package/pp-core/templates/phase-prompt.md +19 -7
- package/pp-core/templates/project-charter.md +161 -100
- package/pp-core/templates/project.md +3 -3
- package/pp-core/templates/requirements.md +18 -0
- package/pp-core/templates/roadmap.md +1 -1
- package/pp-core/templates/verification-report.md +17 -1
- package/pp-core/workflows/audit-milestone.md +4 -1
- package/pp-core/workflows/autonomous.md +11 -8
- package/pp-core/workflows/code-review.md +15 -6
- package/pp-core/workflows/discovery-sprint/charter.md +114 -0
- package/pp-core/workflows/discovery-sprint/prefill.md +1 -1
- package/pp-core/workflows/discovery-sprint/prototype.md +4 -4
- package/pp-core/workflows/discovery-sprint/session-13-gates.md +10 -0
- package/pp-core/workflows/discovery-sprint/sessions/01-kick-off.md +5 -2
- package/pp-core/workflows/discovery-sprint/sessions/02-as-is.md +27 -5
- package/pp-core/workflows/discovery-sprint/sessions/03-to-be.md +56 -31
- package/pp-core/workflows/discovery-sprint/sessions/04-ux-design.md +1 -1
- package/pp-core/workflows/discovery-sprint/sessions/05-architecture.md +42 -19
- package/pp-core/workflows/discovery-sprint/sessions/06-security.md +27 -12
- package/pp-core/workflows/discovery-sprint/sessions/07-identity.md +41 -23
- package/pp-core/workflows/discovery-sprint/sessions/08-integration.md +50 -23
- package/pp-core/workflows/discovery-sprint/sessions/09-qa.md +26 -11
- package/pp-core/workflows/discovery-sprint/sessions/10-infrastructure.md +28 -9
- package/pp-core/workflows/discovery-sprint/sessions/11-roadmap.md +21 -0
- package/pp-core/workflows/discovery-sprint/sessions/13-wrap-up.md +24 -9
- package/pp-core/workflows/discovery-sprint.md +12 -15
- package/pp-core/workflows/discovery-to-build/steps/architecture-deliverables.md +80 -29
- package/pp-core/workflows/discovery-to-build/steps/{screen-inventory-gate.md → handoff-gates.md} +111 -3
- package/pp-core/workflows/discovery-to-build/templates/discovery-references.md +12 -9
- package/pp-core/workflows/discovery-to-build/templates/pp-handoff.md +27 -26
- package/pp-core/workflows/discovery-to-build.md +70 -34
- package/pp-core/workflows/discuss-phase/discovery.md +83 -0
- package/pp-core/workflows/discuss-phase/templates/context.md +4 -0
- package/pp-core/workflows/discuss-phase.md +10 -7
- package/pp-core/workflows/execute-phase/steps/check-query-gate.md +7 -7
- package/pp-core/workflows/execute-phase/steps/codebase-drift-gate.md +3 -2
- package/pp-core/workflows/execute-phase.md +14 -3
- package/pp-core/workflows/new-project.md +3 -3
- package/pp-core/workflows/plan-phase/steps/chunked-planning.md +7 -3
- package/pp-core/workflows/plan-phase/steps/discovery-extract.md +41 -0
- package/pp-core/workflows/plan-phase/steps/prd-express.md +104 -0
- package/pp-core/workflows/plan-phase.md +62 -124
- package/pp-core/workflows/plan-review-convergence.md +6 -3
- package/pp-core/workflows/ship.md +2 -2
- package/pp-core/workflows/stats.md +19 -4
- package/pp-core/workflows/validate-phase.md +19 -4
- package/pp-core/workflows/vault-review.md +5 -0
- package/pp-core/workflows/verify-phase.md +1 -1
- package/pp-core/workflows/verify-work.md +1 -1
- package/scripts/gen-capability-registry.cjs +43 -45
- package/scripts/run-tests.cjs +54 -30
- package/pp-core/workflows/discovery-sprint/templates/context-template.md +0 -272
|
@@ -31,6 +31,7 @@ For each gap in `<gaps>`: generate minimal behavioral test, run it, debug if fai
|
|
|
31
31
|
- Treating "test file created" as "gap filled" before the test actually runs and passes
|
|
32
32
|
- Marking gaps as SKIP without escalating — a skipped gap is an unverified requirement, not a resolved one
|
|
33
33
|
- Debugging a failing test by weakening the assertion rather than fixing the implementation via ESCALATE
|
|
34
|
+
- Counting a test that asserts nothing as coverage
|
|
34
35
|
|
|
35
36
|
**Required finding classification:**
|
|
36
37
|
- **BLOCKER** — gap test fails after 3 iterations; requirement unmet; ESCALATE to developer
|
|
@@ -80,6 +81,9 @@ Action by gap type:
|
|
|
80
81
|
- `no_test_file` → Create test file
|
|
81
82
|
- `test_fails` → Diagnose and fix the test (not impl)
|
|
82
83
|
- `no_automated_command` → Determine command, update map
|
|
84
|
+
- `asserts_nothing` → Read the case first; an assertion made inside a helper it calls clears it (report it covered, no edit). Otherwise add an assertion of the requirement's behaviour to the existing test. Never delete the test or weaken an assertion. An added assertion that still fails after the 3 debug iterations is an implementation bug → ESCALATE.
|
|
85
|
+
|
|
86
|
+
While reading tests, also report any case you find yourself that asserts nothing, as an `asserts_nothing` gap. Rules: `~/.claude/pp-core/references/test-substance.md` § Assertion-free tests at validation.
|
|
83
87
|
</step>
|
|
84
88
|
|
|
85
89
|
<step name="generate_tests">
|
|
@@ -117,8 +121,8 @@ After 3 failed iterations: ESCALATE with requirement, expected vs actual behavio
|
|
|
117
121
|
</step>
|
|
118
122
|
|
|
119
123
|
<step name="report">
|
|
120
|
-
Resolved gaps: `{ task_id, requirement, test_type, automated_command, file_path, status: "green" }`
|
|
121
|
-
Escalated gaps: `{ task_id, requirement, reason, debug_iterations, last_error }`
|
|
124
|
+
Resolved gaps: `{ task_id, requirement, gap_type, test_type, automated_command, file_path, status: "green" }`
|
|
125
|
+
Escalated gaps: `{ task_id, requirement, gap_type, reason, debug_iterations, last_error }`
|
|
122
126
|
|
|
123
127
|
Return one of three formats below.
|
|
124
128
|
</step>
|
|
@@ -141,9 +145,9 @@ Return one of three formats below.
|
|
|
141
145
|
| 1 | {path} | {unit/integration/smoke} | `{cmd}` |
|
|
142
146
|
|
|
143
147
|
### Verification Map Updates
|
|
144
|
-
| Task ID | Requirement | Command | Status |
|
|
145
|
-
|
|
146
|
-
| {id} | {req} | `{cmd}` | green |
|
|
148
|
+
| Task ID | Requirement | Gap Type | Command | Status |
|
|
149
|
+
|---------|-------------|----------|---------|--------|
|
|
150
|
+
| {id} | {req} | {gap_type} | `{cmd}` | green |
|
|
147
151
|
|
|
148
152
|
### Files for Commit
|
|
149
153
|
{test file paths}
|
|
@@ -158,14 +162,14 @@ Return one of three formats below.
|
|
|
158
162
|
**Resolved:** {M}/{total} | **Escalated:** {K}/{total}
|
|
159
163
|
|
|
160
164
|
### Resolved
|
|
161
|
-
| Task ID | Requirement | File | Command | Status |
|
|
162
|
-
|
|
163
|
-
| {id} | {req} | {file} | `{cmd}` | green |
|
|
165
|
+
| Task ID | Requirement | Gap Type | File | Command | Status |
|
|
166
|
+
|---------|-------------|----------|------|---------|--------|
|
|
167
|
+
| {id} | {req} | {gap_type} | {file} | `{cmd}` | green |
|
|
164
168
|
|
|
165
169
|
### Escalated
|
|
166
|
-
| Task ID | Requirement | Reason | Iterations |
|
|
167
|
-
|
|
168
|
-
| {id} | {req} | {reason} | {N}/3 |
|
|
170
|
+
| Task ID | Requirement | Gap Type | Reason | Iterations |
|
|
171
|
+
|---------|-------------|----------|--------|------------|
|
|
172
|
+
| {id} | {req} | {gap_type} | {reason} | {N}/3 |
|
|
169
173
|
|
|
170
174
|
### Files for Commit
|
|
171
175
|
{test file paths for resolved gaps}
|
|
@@ -180,9 +184,9 @@ Return one of three formats below.
|
|
|
180
184
|
**Resolved:** 0/{total}
|
|
181
185
|
|
|
182
186
|
### Details
|
|
183
|
-
| Task ID | Requirement | Reason | Iterations |
|
|
184
|
-
|
|
185
|
-
| {id} | {req} | {reason} | {N}/3 |
|
|
187
|
+
| Task ID | Requirement | Gap Type | Reason | Iterations |
|
|
188
|
+
|---------|-------------|----------|--------|------------|
|
|
189
|
+
| {id} | {req} | {gap_type} | {reason} | {N}/3 |
|
|
186
190
|
|
|
187
191
|
### Recommendations
|
|
188
192
|
- **{req}:** {manual test instructions or implementation fix needed}
|
|
@@ -197,6 +201,7 @@ Return one of three formats below.
|
|
|
197
201
|
- [ ] Tests verify behavior, not structure
|
|
198
202
|
- [ ] Every test executed — none marked passing without running
|
|
199
203
|
- [ ] Implementation files never modified
|
|
204
|
+
- [ ] `asserts_nothing` gaps filled by adding assertions, never by deleting or weakening tests
|
|
200
205
|
- [ ] Max 3 debug iterations per gap
|
|
201
206
|
- [ ] Implementation bugs escalated, not fixed
|
|
202
207
|
- [ ] Structured return provided (GAPS FILLED / PARTIAL / ESCALATE)
|
|
@@ -61,6 +61,12 @@ Before researching, discover project context:
|
|
|
61
61
|
| `## Deferred Ideas` | Out of scope — ignore completely |
|
|
62
62
|
|
|
63
63
|
If CONTEXT.md exists, it constrains your research scope. Don't explore alternatives to locked decisions.
|
|
64
|
+
|
|
65
|
+
**`{padded}-DISCOVERY-EXTRACT.md`** (if listed in your files to read) — the Discovery registers' rows
|
|
66
|
+
that cite this phase's requirement IDs. Required reading; Read
|
|
67
|
+
`pp-core/references/planner-discovery-extract.md` § Researcher and follow it. **Never open
|
|
68
|
+
`.planning/discovery/session-NN.md`**: the session files are the facilitation record, not a
|
|
69
|
+
source. Absent file → nothing here applies.
|
|
64
70
|
</upstream_input>
|
|
65
71
|
|
|
66
72
|
<downstream_consumer>
|
|
@@ -548,6 +554,10 @@ cat "$phase_dir"/*-CONTEXT.md 2>/dev/null
|
|
|
548
554
|
- User decided "simple UI, no animations" → don't research animation libraries
|
|
549
555
|
- Marked as Claude's discretion → research options and recommend
|
|
550
556
|
|
|
557
|
+
Then read `$phase_dir`/*-DISCOVERY-EXTRACT.md if it exists (see `<upstream_input>`): list the
|
|
558
|
+
entities, integrations and rules it names under `## User Constraints` as "Discovery facts (by row
|
|
559
|
+
ID)" so the planner sees them beside the locked decisions. Do not open any `session-NN.md`.
|
|
560
|
+
|
|
551
561
|
## Step 1.3: Load Graph Context
|
|
552
562
|
|
|
553
563
|
Check for knowledge graph:
|
|
@@ -85,6 +85,7 @@ REVIEWS.md is audit trail and feedback input, not a hidden execution contract. /
|
|
|
85
85
|
- Do not re-open historical findings that are already incorporated, explicitly deferred/rejected in PLAN.md, or marked fully resolved.
|
|
86
86
|
- Verify each current actionable review finding appears in executable PLAN.md content: a task, `<action>`, `<acceptance_criteria>`, `<verify>`, `must_haves`, threat model, artifact list, stale-path correction, or explicit deferral/rejection rationale.
|
|
87
87
|
- If a current actionable finding remains only in REVIEWS.md and would be invisible to /pp:execute-phase, return `## ISSUES FOUND`. Use WARNING by default; use BLOCKER when the missing incorporation can prevent the phase goal, create unsafe execution, or invalidate verification.
|
|
88
|
+
**Check mode.** When the prompt says `**Check mode:** blockers-only`, Read `~/.claude/pp-core/references/ceremony.md` § `## Blockers-only checker mode` before Step 1 and follow it: report BLOCKER issues only.
|
|
88
89
|
</upstream_input>
|
|
89
90
|
|
|
90
91
|
<core_principle>
|
|
@@ -244,37 +245,43 @@ issue:
|
|
|
244
245
|
|
|
245
246
|
## Dimension 5: Scope Sanity
|
|
246
247
|
|
|
247
|
-
**Question:** Will plans complete within context budget?
|
|
248
|
+
**Question:** Will plans complete within context budget, and is every split justified?
|
|
248
249
|
|
|
249
250
|
**Process:**
|
|
250
|
-
1.
|
|
251
|
-
2.
|
|
252
|
-
3.
|
|
251
|
+
1. Run `pp_run check plan-sizing "$phase_number" --raw` (reads every PLAN.md and `context_window`)
|
|
252
|
+
2. Raise each `over_ceiling` plan with `has_summary` false and each `unjustified_splits` or `unestimated_serial` pair as a blocker, naming each `unparseable_estimate` value (fix: a bare integer or `60k`). `phase_found` false means the phase number is wrong: re-run with the right one before judging scope
|
|
253
|
+
3. Compare each unexecuted plan's `percent_of_window` with the Total-context row
|
|
254
|
+
4. Judge whether each `context_estimate` is plausible for its tasks and files (signals: planner-guidance.md Task Sizing)
|
|
255
|
+
|
|
256
|
+
**Executed plans:** a plan with `has_summary` true is executed. Report its task count and context as info, never as a warning or blocker, under every threshold and red flag below and in Step 8: the planner cannot split it.
|
|
253
257
|
|
|
254
258
|
**Thresholds:**
|
|
255
259
|
| Metric | Target | Warning | Blocker |
|
|
256
260
|
|--------|--------|---------|---------|
|
|
257
|
-
| Tasks/plan |
|
|
258
|
-
|
|
|
259
|
-
|
|
|
261
|
+
| Tasks/plan | 1-6 | — | 7+ |
|
|
262
|
+
| Total context (`context_estimate` vs `context_window`) | ~50% | ~70% | 80%+ |
|
|
263
|
+
| Serial split (`unjustified_splits`) | none | — | any pair |
|
|
264
|
+
|
|
265
|
+
Files per plan are a cross-check on the estimate, not a threshold: a plan in `estimate_files_mismatch` (many files, low estimate) is a warning. A plan above 50% but under 70% is info (the planner should have split it). A plan without `context_estimate` is judged on task count only: alone it is info; in an `unestimated_serial` pair (serial, merge fits 6 tasks, no estimate shows a budget reason) it is a blocker.
|
|
260
266
|
|
|
261
267
|
**Red flags:**
|
|
262
|
-
-
|
|
263
|
-
-
|
|
268
|
+
- Unexecuted plan with 7+ tasks
|
|
269
|
+
- A serial pair, each plan alone in its wave, whose merge fits 6 tasks and the budget (a split with neither a parallelism nor a budget reason)
|
|
264
270
|
- Single task with 10+ files
|
|
265
|
-
-
|
|
271
|
+
- A context_estimate implausibly low for the plan's tasks and files
|
|
266
272
|
|
|
267
273
|
**Example issue:**
|
|
268
274
|
```yaml
|
|
269
275
|
issue:
|
|
270
276
|
dimension: scope_sanity
|
|
271
|
-
severity:
|
|
272
|
-
description: "
|
|
273
|
-
plan: "
|
|
277
|
+
severity: blocker
|
|
278
|
+
description: "Plans 02 and 03 are a serial split with no reason: each alone in its wave, merged 4 tasks / 70000 tokens fits the 100000 budget"
|
|
279
|
+
plan: "02"
|
|
274
280
|
metrics:
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
281
|
+
merged_tasks: 4
|
|
282
|
+
merged_estimate: 70000
|
|
283
|
+
plan_budget_tokens: 100000
|
|
284
|
+
fix_hint: "Merge 03 into 02"
|
|
278
285
|
```
|
|
279
286
|
|
|
280
287
|
## Dimension 6: Verification Derivation
|
|
@@ -446,11 +453,17 @@ issue:
|
|
|
446
453
|
|
|
447
454
|
## Dimension 8: Nyquist Compliance
|
|
448
455
|
|
|
449
|
-
Skip if
|
|
456
|
+
Skip only if `workflow.nyquist_validation` is explicitly `false` in config.json (absent key = enabled; the verb then reports `enforced: false`). Output: "Dimension 8: SKIPPED (nyquist_validation disabled)". A missing RESEARCH.md never skips this dimension, at any tier, light included. Rules: Read `~/.claude/pp-core/references/test-substance.md`.
|
|
457
|
+
|
|
458
|
+
### Check 8f — Test Substance (run first)
|
|
459
|
+
|
|
460
|
+
Run `pp_run check test-substance "$phase_number" --raw` (launcher bound in Step 1). `phase_found` false: re-run with the right phase. Raise every finding on a plan with `executed` false as a BLOCKER under its `code` and `detail` (every code is a blocker, so blockers-only mode keeps them). Then judge what code cannot:
|
|
461
|
+
- Does each `<behavior>` name what its `<automated>` command actually asserts? A statement about a different behaviour than the command tests is a BLOCKER.
|
|
462
|
+
- For each `tdd_candidates_without_tdd` task, apply the planner's TDD heuristic (`expect(fn(input)).toBe(output)` before `fn`): a confirmed business-logic task without `tdd="true"` is a BLOCKER; glue code that touches source files is not raised.
|
|
450
463
|
|
|
451
464
|
### Check 8e — VALIDATION.md Existence (Gate)
|
|
452
465
|
|
|
453
|
-
Before
|
|
466
|
+
Applies only when RESEARCH.md exists and has a `## Validation Architecture` section; otherwise skip 8e and run 8a-8d and 8f. Before checks 8a-8d, verify VALIDATION.md exists:
|
|
454
467
|
|
|
455
468
|
```bash
|
|
456
469
|
[ -z "${ZSH_VERSION:-}" ] || emulate -R sh
|
|
@@ -467,7 +480,7 @@ Skip checks 8a-8d entirely. Report Dimension 8 as FAIL with this single issue.
|
|
|
467
480
|
For each `<task>` in each plan:
|
|
468
481
|
- `<verify>` must contain `<automated>` command, OR a Wave 0 dependency that creates the test first
|
|
469
482
|
- If `<automated>` is absent with no Wave 0 dependency → **BLOCKING FAIL**
|
|
470
|
-
- If `<automated>` says "MISSING"
|
|
483
|
+
- If `<automated>` says "MISSING" → **BLOCKING FAIL**: the executor cannot run the marker. A test file not yet written is listed by a `tdd="true"` task's own `<files>` or an earlier task of the same plan, which must be test infrastructure or `tdd="true"` (its own verify fails on the still-failing assertion), and `<automated>` runs that file's real command. Wave 0 plans carry test infrastructure only.
|
|
471
484
|
|
|
472
485
|
### Check 8b — Feedback Latency Assessment
|
|
473
486
|
|
|
@@ -482,9 +495,10 @@ Map tasks to waves. Per wave, any consecutive window of 3 implementation tasks m
|
|
|
482
495
|
|
|
483
496
|
### Check 8d — Wave 0 Completeness
|
|
484
497
|
|
|
485
|
-
For each `<automated
|
|
486
|
-
- Wave 0 task
|
|
487
|
-
-
|
|
498
|
+
For each test file an `<automated>` command runs that is not on disk yet. Check 8f's verb reports the order as `scaffold_uncreated` (`later_task`, `other_plan:<id>`, `no_creator`); raise those as in 8f, then judge what it accepts:
|
|
499
|
+
- The test file that carries the task's own assertion is listed by a `tdd="true"` task's own `<files>` or an earlier task of the same plan (test infrastructure or `tdd="true"`). Across plans it is accepted only when a Wave 0 test-infrastructure task (no behaviour assertion) has a matching `<files>` path
|
|
500
|
+
- The verb accepts any earlier-wave creator. Test infrastructure, or a test that passes with its own code in that wave, is fine; a plan that writes this task's assertion ahead of its code → **BLOCKING FAIL** (no wave merges a failing test)
|
|
501
|
+
- That creator executes before the dependent task
|
|
488
502
|
- Missing match → **BLOCKING FAIL**
|
|
489
503
|
|
|
490
504
|
### Dimension 8 Output
|
|
@@ -492,10 +506,11 @@ For each `<automated>MISSING</automated>` reference:
|
|
|
492
506
|
```
|
|
493
507
|
## Dimension 8: Nyquist Compliance
|
|
494
508
|
|
|
495
|
-
| Task | Plan | Wave | Automated Command | Status |
|
|
496
|
-
|
|
497
|
-
| {task} | {plan} | {wave} | `{command}` | ✅ / ❌ |
|
|
509
|
+
| Task | Plan | Wave | Automated Command | Behavior | Status |
|
|
510
|
+
|------|------|------|-------------------|----------|--------|
|
|
511
|
+
| {task} | {plan} | {wave} | `{command}` | {what it asserts} | ✅ / ❌ |
|
|
498
512
|
|
|
513
|
+
Test substance: {N} findings → ✅ / ❌
|
|
499
514
|
Sampling: Wave {N}: {X}/{Y} verified → ✅ / ❌
|
|
500
515
|
Wave 0: {test file} → ✅ present / ❌ MISSING
|
|
501
516
|
Overall: ✅ PASS / ❌ FAIL
|
|
@@ -789,9 +804,10 @@ Missing: No mention of fetch/API call → Issue: Key link not planned
|
|
|
789
804
|
```bash
|
|
790
805
|
pp_run query plan.task-structure "$PHASE_DIR/$PHASE-01-PLAN.md"
|
|
791
806
|
pp_run query frontmatter.get "$PHASE_DIR/$PHASE-01-PLAN.md" files_modified
|
|
807
|
+
pp_run check plan-sizing "$phase_number" --raw
|
|
792
808
|
```
|
|
793
809
|
|
|
794
|
-
Thresholds:
|
|
810
|
+
Thresholds (task count and percent_of_window apply to unexecuted plans only, `has_summary` false; an executed plan is info): 1-6 tasks/plan accepted, 7+ blocker (split). Every unjustified_splits pair: blocker (merge). Every unestimated_serial pair: blocker (estimate, or merge). percent_of_window above 50% info, ~70% warning, 80%+ blocker. A doubtful estimate: warning.
|
|
795
811
|
|
|
796
812
|
## Step 9: Verify must_haves Derivation
|
|
797
813
|
|
|
@@ -817,8 +833,9 @@ Severities: `blocker` (must fix), `warning` (should fix), `info` (suggestions).
|
|
|
817
833
|
|
|
818
834
|
**Plan 01 analysis:**
|
|
819
835
|
```
|
|
820
|
-
Tasks:
|
|
836
|
+
Tasks: 7
|
|
821
837
|
Files modified: 12
|
|
838
|
+
context_estimate: 150000 (context_window: 200000, plan_budget_tokens: 100000)
|
|
822
839
|
- prisma/schema.prisma
|
|
823
840
|
- src/app/api/auth/login/route.ts
|
|
824
841
|
- src/app/api/auth/logout/route.ts
|
|
@@ -833,19 +850,19 @@ Files modified: 12
|
|
|
833
850
|
- src/types/auth.ts
|
|
834
851
|
```
|
|
835
852
|
|
|
836
|
-
|
|
853
|
+
7 tasks exceed the 6-task ceiling and 150000 tokens is 75% of the window, over the 100000 per-plan budget.
|
|
837
854
|
|
|
838
855
|
```yaml
|
|
839
856
|
issue:
|
|
840
857
|
dimension: scope_sanity
|
|
841
858
|
severity: blocker
|
|
842
|
-
description: "Plan 01 has
|
|
859
|
+
description: "Plan 01 has 7 tasks and context_estimate 150000 - over the 6-task ceiling and the per-plan budget"
|
|
843
860
|
plan: "01"
|
|
844
861
|
metrics:
|
|
845
|
-
tasks:
|
|
862
|
+
tasks: 7
|
|
846
863
|
files: 12
|
|
847
|
-
|
|
848
|
-
fix_hint: "Split into
|
|
864
|
+
context_estimate: 150000
|
|
865
|
+
fix_hint: "Split into two plans of at most 6 tasks and 100000 tokens each: parallel when their files are disjoint, otherwise serial (justified by budget)"
|
|
849
866
|
```
|
|
850
867
|
|
|
851
868
|
</examples>
|
|
@@ -870,15 +887,21 @@ issue:
|
|
|
870
887
|
- Missing requirement coverage
|
|
871
888
|
- Missing required task fields
|
|
872
889
|
- Circular dependencies
|
|
873
|
-
- Scope >
|
|
890
|
+
- Scope > 6 tasks per plan (unexecuted, `has_summary` false)
|
|
891
|
+
- A split flagged by check plan-sizing (unjustified_splits, unestimated_serial)
|
|
892
|
+
- context_estimate at 80%+ of context_window (unexecuted plan)
|
|
893
|
+
- A `check test-substance` finding on an unexecuted plan, or a confirmed business-logic task without `tdd="true"`
|
|
874
894
|
|
|
875
895
|
**warning** - Should fix, execution may work
|
|
876
|
-
-
|
|
896
|
+
- context_estimate at ~70% of context_window (unexecuted plan)
|
|
897
|
+
- A doubtful estimate (implausible for its tasks and files, or listed in estimate_files_mismatch)
|
|
877
898
|
- Implementation-focused truths
|
|
878
899
|
- Minor wiring missing
|
|
879
900
|
|
|
880
901
|
**info** - Suggestions for improvement
|
|
881
|
-
- Could split
|
|
902
|
+
- Could split independent subsystems into parallel plans
|
|
903
|
+
- context_estimate above 50% of context_window
|
|
904
|
+
- Plan without context_estimate (not in a serial pair)
|
|
882
905
|
- Could improve verification specificity
|
|
883
906
|
|
|
884
907
|
Return all issues as a structured `issues:` YAML list (see dimension examples for format).
|
|
@@ -956,7 +979,7 @@ Plans verified. Run `/pp:execute-phase {phase}` to proceed.
|
|
|
956
979
|
|
|
957
980
|
**DO NOT** skip dependency analysis. Circular/broken dependencies cause execution failures.
|
|
958
981
|
|
|
959
|
-
**DO NOT** ignore scope.
|
|
982
|
+
**DO NOT** ignore scope. 7+ tasks in an unexecuted plan or a flagged serial split is a blocker: report it — split the first, merge the second.
|
|
960
983
|
|
|
961
984
|
**DO NOT** verify implementation details. Check that plans describe what to build.
|
|
962
985
|
|
package/agents/pp-planner.md
CHANGED
|
@@ -26,7 +26,7 @@ Your job: Produce PLAN.md files that Claude executors can implement without inte
|
|
|
26
26
|
|
|
27
27
|
**Core responsibilities:**
|
|
28
28
|
- **FIRST: Parse and honor user decisions from CONTEXT.md** (locked decisions are NON-NEGOTIABLE)
|
|
29
|
-
-
|
|
29
|
+
- Size plans by estimated context cost: up to 6 tasks, split only for parallelism or budget
|
|
30
30
|
- Build dependency graphs and assign execution waves
|
|
31
31
|
- Derive must-haves using goal-backward methodology
|
|
32
32
|
- Handle both standard planning and gap closure mode
|
|
@@ -114,7 +114,7 @@ Exclusions (not gaps): Deferred Ideas in CONTEXT.md, items scoped to other phase
|
|
|
114
114
|
The planner has no authority to judge a feature as too difficult, omit features because they seem challenging, or use "complex/difficult/non-trivial" to justify scope reduction.
|
|
115
115
|
|
|
116
116
|
**Only three legitimate reasons to split or flag:**
|
|
117
|
-
1. **Context cost:** implementation would consume >50% of
|
|
117
|
+
1. **Context cost:** implementation would consume >50% of the configured context window (`plan_budget_tokens` from init)
|
|
118
118
|
2. **Missing information:** required data not present in any source artifact
|
|
119
119
|
3. **Dependency conflict:** feature cannot be built until another phase ships
|
|
120
120
|
|
|
@@ -162,7 +162,7 @@ For niche domains (3D/games/audio/shaders/ML), suggest `/pp:plan-phase --researc
|
|
|
162
162
|
|
|
163
163
|
## Task Anatomy
|
|
164
164
|
|
|
165
|
-
Every task has
|
|
165
|
+
Every task has five required fields:
|
|
166
166
|
|
|
167
167
|
**<files>:** Exact file paths created or modified.
|
|
168
168
|
- Good: `src/app/api/auth/login/route.ts`, `prisma/schema.prisma`
|
|
@@ -186,7 +186,7 @@ Every task has four required fields:
|
|
|
186
186
|
- Bad: "It works", "Looks good", manual-only verification
|
|
187
187
|
- Simple format also accepted: `npm test` passes, `curl -X POST /api/auth/login` returns 200
|
|
188
188
|
|
|
189
|
-
**Nyquist Rule:** Every `<verify>` includes `<automated
|
|
189
|
+
**Nyquist Rule:** Every `<verify>` includes `<automated>`, and every non-checkpoint task has a `<behavior>` naming what that command asserts as input → expected output (`tdd="true"`: its test cases; "tests pass", "works", "file exists" are not behaviours). With no test yet, list that test file, assertion included, in an earlier task of the plan or a `tdd="true"` task's own `<files>`; `<automated>` runs it, never `MISSING — Wave 0 must create {test_file} first`; never a vacuous scaffold. Rules: Read `~/.claude/pp-core/references/test-substance.md`.
|
|
190
190
|
|
|
191
191
|
**Grep gate hygiene:** `grep -c` counts comments, so header prose can be self-invalidating. Use `grep -v '^#' | grep -c token`. Bare `== 0` gates on unfiltered files are forbidden.
|
|
192
192
|
|
|
@@ -212,37 +212,7 @@ See @~/.claude/pp-core/references/planner-guidance.md for Task Types table, Task
|
|
|
212
212
|
|
|
213
213
|
**When `workflow.tdd_mode` is enabled:** Apply TDD heuristics aggressively — all eligible tasks MUST use `type: tdd`. Read @~/.claude/pp-core/references/tdd.md for gate enforcement rules and the end-of-phase review checkpoint format.
|
|
214
214
|
|
|
215
|
-
**When `workflow.tdd_mode` is disabled (default):**
|
|
216
|
-
|
|
217
|
-
**Heuristic:** Can you write `expect(fn(input)).toBe(output)` before writing `fn`?
|
|
218
|
-
- Yes → Create a dedicated TDD plan (type: tdd)
|
|
219
|
-
- No → Standard task in standard plan
|
|
220
|
-
|
|
221
|
-
**TDD candidates (dedicated TDD plans):** Business logic with defined I/O, API endpoints with request/response contracts, data transformations, validation rules, algorithms, state machines.
|
|
222
|
-
|
|
223
|
-
**Standard tasks:** UI layout/styling, configuration, glue code, one-off scripts, simple CRUD with no business logic.
|
|
224
|
-
|
|
225
|
-
**Why TDD gets own plan:** TDD requires RED→GREEN→REFACTOR cycles consuming 40-50% context. Embedding in multi-task plans degrades quality.
|
|
226
|
-
|
|
227
|
-
**Task-level TDD** (for code-producing tasks in standard plans): When a task creates or modifies production code, add `tdd="true"` and a `<behavior>` block to make test expectations explicit before implementation:
|
|
228
|
-
|
|
229
|
-
```xml
|
|
230
|
-
<task type="auto" tdd="true">
|
|
231
|
-
<name>Task: [name]</name>
|
|
232
|
-
<files>src/feature.ts, src/feature.test.ts</files>
|
|
233
|
-
<behavior>
|
|
234
|
-
- Test 1: [expected behavior]
|
|
235
|
-
- Test 2: [edge case]
|
|
236
|
-
</behavior>
|
|
237
|
-
<action>[Implementation after tests pass]</action>
|
|
238
|
-
<verify>
|
|
239
|
-
<automated>npm test -- --filter=feature</automated>
|
|
240
|
-
</verify>
|
|
241
|
-
<done>[Criteria]</done>
|
|
242
|
-
</task>
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
Exceptions where `tdd="true"` is not needed: `type="checkpoint:*"` tasks, configuration-only files, documentation, migration scripts, glue code wiring existing tested components, styling-only changes.
|
|
215
|
+
**When `workflow.tdd_mode` is disabled (default):** Heuristic: can you write `expect(fn(input)).toBe(output)` before writing `fn`? Candidates: business logic with defined I/O, API endpoints with request/response contracts, data transformations, validation rules, algorithms, state machines. A candidate gets `tdd="true"` and a `<behavior>` test-case list inside an ordinary plan (RED→GREEN); dedicated `type: tdd` plans stay `tdd_mode`'s. Not for `checkpoint:*`, configuration-only files, documentation, migration scripts, glue code wiring tested components, styling-only or test-only tasks. Example and rules: `~/.claude/pp-core/references/test-substance.md`.
|
|
246
216
|
|
|
247
217
|
`workflow.human_verify_mode=end-of-phase`: no `checkpoint:human-verify`; use `<verify><human-check>`.
|
|
248
218
|
|
|
@@ -289,26 +259,18 @@ See @~/.claude/pp-core/references/planner-guidance.md for dependency graph build
|
|
|
289
259
|
|
|
290
260
|
## Context Budget Rules
|
|
291
261
|
|
|
292
|
-
Plans should complete within ~50% context (not 80%).
|
|
293
|
-
|
|
294
|
-
**Each plan: 2-3 tasks maximum.**
|
|
262
|
+
Plans should complete within ~50% context (not 80%).
|
|
295
263
|
|
|
296
|
-
|
|
297
|
-
|----------------|------------|--------------|-------|
|
|
298
|
-
| Light (CRUD, config) | 3 | ~10-15% | ~30-45% |
|
|
299
|
-
| Medium (auth, payments) | 2 | ~20-30% | ~40-50% |
|
|
300
|
-
| Heavy (migrations, multi-subsystem) | 1-2 | ~30-40% | ~30-50% |
|
|
264
|
+
**Each plan: up to 6 tasks** (`max_tasks_per_plan`), added while the summed estimate stays within `plan_budget_tokens` (50% of `context_window`, from init). The count is an outcome of the estimate, never a target. Tasks stay ~20-60k tokens (10–30% at 200k) at any window: a larger window fits more tasks, not larger ones. Estimate per planner-guidance.md Task Sizing; record each plan's sum as `context_estimate`.
|
|
301
265
|
|
|
302
266
|
## Split Signals
|
|
303
267
|
|
|
304
268
|
**ALWAYS split if:**
|
|
305
|
-
-
|
|
306
|
-
-
|
|
307
|
-
-
|
|
308
|
-
- Checkpoint + implementation in same plan
|
|
309
|
-
- Discovery + implementation in same plan
|
|
269
|
+
- **Parallelism:** independent subsystems with disjoint `files_modified`, run in the same wave
|
|
270
|
+
- **Budget:** merged, the work would exceed `plan_budget_tokens` or 6 tasks (a dedicated TDD plan and discovery + implementation are budget cases)
|
|
271
|
+
- A task with >5 file modifications: split the task, not the plan
|
|
310
272
|
|
|
311
|
-
|
|
273
|
+
Never split serial single-concern work to fit a task count — see "Plan-Split Anti-Patterns" in @~/.claude/pp-core/references/planner-antipatterns.md. Phase splits and gap-closure plans are separate mechanisms. See `<planner_authority_limits>` for prohibited split reasons.
|
|
312
274
|
|
|
313
275
|
See @~/.claude/pp-core/references/planner-guidance.md for Granularity Calibration table (Coarse/Standard/Fine plans-per-phase).
|
|
314
276
|
|
|
@@ -329,6 +291,7 @@ files_modified: [] # Files this plan touches
|
|
|
329
291
|
autonomous: true # false if plan has checkpoints
|
|
330
292
|
requirements: [] # REQUIRED — Requirement IDs from ROADMAP this plan addresses. MUST NOT be empty.
|
|
331
293
|
user_setup: [] # Human-required setup (omit if empty)
|
|
294
|
+
context_estimate: N # REQUIRED — sum of task estimates in tokens: 90000 or 90k, no ~/units
|
|
332
295
|
|
|
333
296
|
must_haves:
|
|
334
297
|
truths: [] # Observable behaviors
|
|
@@ -362,11 +325,17 @@ Output: [Artifacts created]
|
|
|
362
325
|
Its exact shape comes from `pp_run vault standards block`, per `pp-core/references/planner-vault-standards.md`.]
|
|
363
326
|
</vault_standards>
|
|
364
327
|
|
|
328
|
+
<discovery_extract>
|
|
329
|
+
[Present ONLY when a `*-DISCOVERY-EXTRACT.md` is in your files to read — omitted entirely otherwise.
|
|
330
|
+
The file's content verbatim, `<!-- discovery:auto -->` markers included; see <discovery_mode>.]
|
|
331
|
+
</discovery_extract>
|
|
332
|
+
|
|
365
333
|
<tasks>
|
|
366
334
|
|
|
367
335
|
<task type="auto">
|
|
368
336
|
<name>Task 1: [Action-oriented name]</name>
|
|
369
337
|
<files>path/to/file.ext</files>
|
|
338
|
+
<behavior>[What the verify command asserts: input → expected output]</behavior>
|
|
370
339
|
<action>[Specific implementation]</action>
|
|
371
340
|
<verify>[Command or check]</verify>
|
|
372
341
|
<done>[Acceptance criteria]</done>
|
|
@@ -577,6 +546,13 @@ start of execution when the injected `plan:pre -> into: planner` fragment for
|
|
|
577
546
|
the vault capability is present in your context.
|
|
578
547
|
</vault_standards_mode>
|
|
579
548
|
|
|
549
|
+
<discovery_mode>
|
|
550
|
+
See `pp-core/references/planner-discovery-extract.md`. Load this file at the
|
|
551
|
+
start of execution when a `*-DISCOVERY-EXTRACT.md` is listed in your files to
|
|
552
|
+
read: it is required reading, embedded verbatim as `<discovery_extract>`, and
|
|
553
|
+
you never open a `.planning/discovery/session-NN.md`.
|
|
554
|
+
</discovery_mode>
|
|
555
|
+
|
|
580
556
|
<execution_flow>
|
|
581
557
|
|
|
582
558
|
<step name="load_project_state" priority="first">
|
|
@@ -588,7 +564,7 @@ INIT=$(pp_run query init.plan-phase "${PHASE}")
|
|
|
588
564
|
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
589
565
|
```
|
|
590
566
|
|
|
591
|
-
Extract from init JSON: `planner_model`, `researcher_model`, `checker_model`, `commit_docs`, `research_enabled`, `phase_dir`, `phase_number`, `has_research`, `has_context`.
|
|
567
|
+
Extract from init JSON: `planner_model`, `researcher_model`, `checker_model`, `commit_docs`, `research_enabled`, `phase_dir`, `phase_number`, `has_research`, `has_context`, `context_window`, `plan_budget_tokens`, `task_tokens_min`, `task_tokens_max`, `max_tasks_per_plan`.
|
|
592
568
|
|
|
593
569
|
Also load planning state (position, decisions, blockers) via the SDK — **use `node` to invoke the CLI** (not `npx`):
|
|
594
570
|
```bash
|
|
@@ -604,6 +580,7 @@ Check the invocation mode and load the relevant reference file:
|
|
|
604
580
|
- If `<revision_context>` provided by orchestrator: Read `pp-core/references/planner-revision.md`
|
|
605
581
|
- If `--reviews` flag present or reviews mode active: Read `pp-core/references/planner-reviews.md`
|
|
606
582
|
- If the vault capability's `plan:pre` fragment is present: Read `pp-core/references/planner-vault-standards.md`
|
|
583
|
+
- If a `*-DISCOVERY-EXTRACT.md` is in your files to read: Read `pp-core/references/planner-discovery-extract.md`
|
|
607
584
|
- If task_breakdown identifies TDD candidates or TDD mode is active: Read `pp-core/references/planner-tdd.md`
|
|
608
585
|
- Standard planning mode: no additional file to read
|
|
609
586
|
|
|
@@ -776,7 +753,7 @@ Rules:
|
|
|
776
753
|
1. Same-wave tasks with no file conflicts → parallel plans
|
|
777
754
|
2. Shared files → same plan or sequential plans (shared file = implicit dependency → later wave)
|
|
778
755
|
3. Checkpoint tasks → `autonomous: false`
|
|
779
|
-
4. Each plan:
|
|
756
|
+
4. Each plan: up to 6 tasks within `plan_budget_tokens`, single concern; split only for parallelism or budget
|
|
780
757
|
</step>
|
|
781
758
|
|
|
782
759
|
<step name="derive_must_haves">
|
|
@@ -798,7 +775,7 @@ UNREACHABLE (no path) → revise plan.
|
|
|
798
775
|
</step>
|
|
799
776
|
|
|
800
777
|
<step name="estimate_scope">
|
|
801
|
-
|
|
778
|
+
Sum each plan's task estimates into `context_estimate`; it must fit `plan_budget_tokens` with at most 6 tasks. Merge serial plans whose sum fits; split only for parallelism or budget. Check granularity setting.
|
|
802
779
|
</step>
|
|
803
780
|
|
|
804
781
|
<step name="confirm_breakdown">
|
|
@@ -812,6 +789,8 @@ Use template structure for each PLAN.md.
|
|
|
812
789
|
|
|
813
790
|
When the fragment IS present, follow `pp-core/references/planner-vault-standards.md` in full — select documents from the INDEX, read each in full, obtain the block from `pp_run vault standards block` once `files_modified` settles, embed it verbatim after `<context>` and before `<tasks>`, fill only the reason slots, and re-run it on revision.
|
|
814
791
|
|
|
792
|
+
**Discovery extract block (only when a `*-DISCOVERY-EXTRACT.md` is in your files to read):** embed the file verbatim as `<discovery_extract>` after `<context>` (and after `<vault_standards>` when present), before `<tasks>`, per `<discovery_mode>`. Absent file → write no block.
|
|
793
|
+
|
|
815
794
|
**ALWAYS use the Write tool to create files** — never use `Bash(cat << 'EOF')` or heredoc commands for file creation.
|
|
816
795
|
|
|
817
796
|
**Write contract (hard rules — must follow):**
|
|
@@ -879,6 +858,22 @@ Returns JSON: `{ valid, errors, warnings, task_count, tasks }`
|
|
|
879
858
|
- Missing `<name>` in task → add name element
|
|
880
859
|
- Missing `<action>` → add action element
|
|
881
860
|
- Checkpoint/autonomous mismatch → update `autonomous: false`
|
|
861
|
+
|
|
862
|
+
Then check sizing across the phase:
|
|
863
|
+
|
|
864
|
+
```bash
|
|
865
|
+
SIZING=$(pp_run check plan-sizing "$PHASE" --raw)
|
|
866
|
+
```
|
|
867
|
+
|
|
868
|
+
`phase_found` false: wrong phase, stop. Merge only the first `unjustified_splits` pair, estimate each `unestimated_serial` pair (rewrite each `unparseable_estimate` as an integer), split each unexecuted `over_ceiling` / `over_budget` plan (see "Plan-Split Anti-Patterns"), re-run; repeat until `block` is false (expect `min_plans` plans).
|
|
869
|
+
|
|
870
|
+
Then:
|
|
871
|
+
|
|
872
|
+
```bash
|
|
873
|
+
SUBSTANCE=$(pp_run check test-substance "$PHASE" --raw)
|
|
874
|
+
```
|
|
875
|
+
|
|
876
|
+
Fix every finding on an unexecuted plan, re-run until `block` is false. Judge each `tdd_candidates_without_tdd` task by the heuristic; add `tdd="true"` to business logic. `enforced: false` (`nyquist_validation` off): findings advisory; still write `<behavior>`.
|
|
882
877
|
</step>
|
|
883
878
|
|
|
884
879
|
<step name="update_roadmap">
|
|
@@ -952,7 +947,8 @@ Phase planning complete when:
|
|
|
952
947
|
- [ ] Each plan: depends_on, files_modified, autonomous, must_haves in frontmatter
|
|
953
948
|
- [ ] Each plan: user_setup declared if external services involved
|
|
954
949
|
- [ ] Each plan: Objective, context, tasks, verification, success criteria, output
|
|
955
|
-
- [ ] Each plan:
|
|
950
|
+
- [ ] Each plan: ≤ 6 tasks within `plan_budget_tokens`; `check plan-sizing` reports `block: false`
|
|
951
|
+
- [ ] Each non-checkpoint task has a `<behavior>`; `check test-substance` reports `block: false`
|
|
956
952
|
- [ ] Each task: Type, Files (if auto), Action, Verify, Done
|
|
957
953
|
- [ ] Checkpoints properly structured
|
|
958
954
|
- [ ] Wave structure maximizes parallelism
|
|
@@ -56,6 +56,8 @@ Forbidden, without exception, even when a finding seems to demand it:
|
|
|
56
56
|
**Counts, never a score.** Report counts by verdict in the exact counts line the template shows. A ratio, percentage, letter grade or compliance number is prohibited anywhere in the artifact.
|
|
57
57
|
|
|
58
58
|
A document the executor marked `not read: …` is still judged against the code; record the executor's reason in the row's evidence, because a standard nobody read is worth a reader's attention.
|
|
59
|
+
|
|
60
|
+
**Deviations on file (`deviations[]` in the payload).** A Discovery Sprint records the client's agreed departures from the vault in `.planning/discovery/_deviations.md`; the CLI copies them into the payload (`pp-core/references/discovery-build-consumption.md` § `_deviations.md` read contract). Before writing `FAIL`, check the list: when a deviation whose `standard` names the document and whose `status` is `Approved` covers the clause the code breaks, the verdict is `N-A` with the reason `deviation on file: <id> (<decision>)` — the sponsor chose this departure and the document does not govern that clause here. A deviation in any other status (`Proposed`, `Rejected`, empty) leaves the `FAIL` standing; name the deviation and its status in the reason so the reader sees the gap between what was asked and what was approved. Never coin a verdict for it; `N-A` with that reason is the whole mechanism. An empty `deviations[]` changes nothing.
|
|
59
61
|
</verdicts>
|
|
60
62
|
|
|
61
63
|
<adversarial_stance>
|