devflow-kit 3.5.0 → 3.6.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 +98 -0
- package/README.md +4 -4
- package/dist/agents/{diagnose.md → debug.md} +4 -4
- package/dist/agents/{code-fix.md → fix.md} +2 -2
- package/dist/agents/{scrutinize.md → harden.md} +6 -6
- package/dist/agents/{code-edit.md → refactor.md} +3 -3
- package/dist/cli/agents-view/render.js +1 -1
- package/dist/cli/commands/init.js +3 -3
- package/dist/cli/commands/learning.js +12 -12
- package/dist/cli/commands/legacy-hooks.js +1 -1
- package/dist/cli/commands/uninstall.js +111 -5
- package/dist/commands/bug-analysis.md +19 -15
- package/dist/commands/code-review.md +13 -22
- package/dist/commands/debug.md +15 -15
- package/dist/commands/dynamic-build.md +51 -55
- package/dist/commands/dynamic-plan.md +11 -9
- package/dist/commands/dynamic-profile.md +7 -5
- package/dist/commands/dynamic-tickets.md +11 -9
- package/dist/commands/explore.md +13 -13
- package/dist/commands/implement.md +58 -127
- package/dist/commands/plan.md +19 -41
- package/dist/commands/release.md +9 -5
- package/dist/commands/research.md +12 -8
- package/dist/commands/resolve.md +42 -86
- package/dist/commands/self-review.md +42 -42
- package/dist/core/agent-models.js +47 -11
- package/dist/core/{learning-tuning-config.js → curate-tuning-config.js} +14 -14
- package/dist/core/learning-queue-cleanup.js +1 -1
- package/dist/core/migrations.js +63 -44
- package/dist/core/plugins.js +14 -12
- package/dist/core/project-paths.js +3 -3
- package/dist/hud/codex-usage.js +247 -0
- package/dist/hud/components/codex-quota.js +37 -0
- package/dist/hud/components/usage-quota.js +1 -1
- package/dist/hud/config.js +1 -0
- package/dist/hud/index.js +16 -3
- package/dist/hud/render.js +3 -1
- package/dist/learning-off/agents/{diagnose.md → debug.md} +4 -4
- package/dist/learning-off/agents/{code-fix.md → fix.md} +2 -2
- package/dist/learning-off/agents/{scrutinize.md → harden.md} +6 -6
- package/dist/learning-off/agents/{code-edit.md → refactor.md} +3 -3
- package/dist/learning-off/commands/bug-analysis.md +9 -9
- package/dist/learning-off/commands/code-review.md +2 -15
- package/dist/learning-off/commands/debug.md +4 -8
- package/dist/learning-off/commands/dynamic-build.md +45 -51
- package/dist/learning-off/commands/dynamic-plan.md +5 -5
- package/dist/learning-off/commands/dynamic-profile.md +1 -1
- package/dist/learning-off/commands/dynamic-tickets.md +5 -5
- package/dist/learning-off/commands/explore.md +2 -6
- package/dist/learning-off/commands/implement.md +46 -119
- package/dist/learning-off/commands/plan.md +8 -33
- package/dist/learning-off/commands/release.md +4 -2
- package/dist/learning-off/commands/research.md +2 -2
- package/dist/learning-off/commands/resolve.md +31 -79
- package/dist/learning-off/commands/self-review.md +30 -34
- package/dist/skills/git/references/pr/check-merge-readiness.md +2 -0
- package/dist/skills/git/references/pr/update-pr-evidence.md +4 -6
- package/dist/targets/claude-code/installer.js +117 -84
- package/dist/targets/claude-code/tracker-servers.js +1 -1
- package/package.json +1 -1
- package/src/assets/agents/_partials/_code.mds +2 -2
- package/src/assets/agents/code.mds +2 -2
- package/src/assets/agents/{learning.md → curate.md} +4 -4
- package/src/assets/agents/{diagnose.mds → debug.mds} +4 -4
- package/src/assets/agents/evaluate.md +4 -4
- package/src/assets/agents/{code-fix.mds → fix.mds} +5 -5
- package/src/assets/agents/{scrutinize.mds → harden.mds} +6 -6
- package/src/assets/agents/{simplify.md → polish.md} +4 -4
- package/src/assets/agents/{code-edit.mds → refactor.mds} +6 -6
- package/src/assets/agents/test.md +2 -2
- package/src/assets/commands/_partials/_compliance.mds +1 -1
- package/src/assets/commands/_partials/_decisions.mds +26 -6
- package/src/assets/commands/_partials/_engine.mds +15 -15
- package/src/assets/commands/_partials/_evidence_policy.mds +0 -17
- package/src/assets/commands/_partials/_knowledge.mds +14 -9
- package/src/assets/commands/_partials/_preamble.mds +4 -2
- package/src/assets/commands/_partials/_roster.mds +4 -4
- package/src/assets/commands/bug-analysis.mds +7 -7
- package/src/assets/commands/code-review.mds +1 -14
- package/src/assets/commands/debug.mds +2 -2
- package/src/assets/commands/dynamic-build.mds +26 -32
- package/src/assets/commands/implement.mds +45 -102
- package/src/assets/commands/plan.mds +7 -37
- package/src/assets/commands/release.mds +5 -1
- package/src/assets/commands/resolve.mds +28 -76
- package/src/assets/commands/self-review.mds +27 -27
- package/src/assets/mds/git/_pr.mds +6 -6
- package/src/assets/scripts/hooks/assets/orchestrator-charter.md +4 -3
- package/src/assets/scripts/hooks/capture-prompt +1 -1
- package/src/assets/scripts/hooks/capture-question +1 -1
- package/src/assets/scripts/hooks/capture-turn +1 -1
- package/src/assets/scripts/hooks/json-helper.cjs +2 -2
- package/src/assets/scripts/hooks/lib/learning-store.cjs +1 -1
- package/src/assets/scripts/hooks/lib/project-paths.cjs +4 -4
- package/src/assets/scripts/hooks/preamble +1 -1
- package/src/assets/scripts/hooks/session-start-context +58 -45
- package/src/assets/scripts/verify-evidence.cjs +726 -9
- package/src/assets/skills/agent-references/SKILL.md +9 -5
- package/src/assets/skills/agent-references/references/commands/implement-evidence-asks.md +35 -0
- package/src/assets/skills/agent-references/references/commands/implement-revalidate.md +15 -0
- package/src/assets/skills/agent-references/references/synthesize/bug-analysis.md +1 -1
- package/src/assets/skills/apply-decisions/SKILL.md +6 -4
- package/src/assets/skills/docs-framework/SKILL.md +3 -3
- package/src/assets/skills/qa/SKILL.md +1 -1
- package/src/assets/skills/quality-gates/SKILL.md +7 -7
- package/src/assets/skills/quality-gates/references/report-template.md +7 -7
- /package/src/assets/skills/agent-references/references/{learning → curate}/maintain.md +0 -0
|
@@ -203,7 +203,7 @@ If `index.md` exists and contains at least one entry line, use it for relevance
|
|
|
203
203
|
|
|
204
204
|
**Step 2 — Fallback: glob frontmatter (if `index.md` is absent or empty):**
|
|
205
205
|
|
|
206
|
-
Glob `{worktree}/.devflow/features/*/KNOWLEDGE.md`. For each file found, read only its YAML frontmatter block (between the opening and closing `---` delimiters).
|
|
206
|
+
Glob `{worktree}/.devflow/features/*/KNOWLEDGE.md`. For each file found, read only its YAML frontmatter block (between the opening and closing `---` delimiters).
|
|
207
207
|
|
|
208
208
|
**Step 3 — Pick relevant KBs:**
|
|
209
209
|
|
|
@@ -234,7 +234,7 @@ Headings: L5 Rules · L40 Overview · L62 Anti-Patterns · L118 Key Files
|
|
|
234
234
|
|
|
235
235
|
A KB with no Rules section labels its entries `Rules ({section name}):` and gives them no ID. `FEATURE_KNOWLEDGE` is these blocks; `FEATURE_KNOWLEDGE_RULES` is the same blocks without the `Headings:` line. Both come from this one selection, and each spawn names the variable its recipient takes. If no KBs exist, no KBs are relevant, or `.devflow/features/` is absent, set both to `(none)`.
|
|
236
236
|
|
|
237
|
-
**One git call, then direct reads — no `.cjs` script.**
|
|
237
|
+
**One git call, then direct reads — no `.cjs` script.**
|
|
238
238
|
|
|
239
239
|
#### Plan Artifact
|
|
240
240
|
|
|
@@ -263,11 +263,11 @@ Determine which focus analyzers to run using `CHANGED_FILES` (already computed i
|
|
|
263
263
|
**Produces:** ANALYZER_OUTPUTS
|
|
264
264
|
**Requires:** DIFF_RANGE, ANALYSIS_DIR, ACTIVE_FOCUSES, STATIC_FINDINGS, ACCEPTANCE_RULES, PLAN_CONTEXT, FEATURE_KNOWLEDGE
|
|
265
265
|
|
|
266
|
-
Spawn ALL active
|
|
266
|
+
Spawn ALL active Debug agents **in a single message** (parallel, NOT background):
|
|
267
267
|
|
|
268
268
|
For each active focus, spawn:
|
|
269
269
|
```
|
|
270
|
-
Agent(subagent_type="
|
|
270
|
+
Agent(subagent_type="Debug", run_in_background=false):
|
|
271
271
|
"Analyze focusing on {focus}.
|
|
272
272
|
FOCUS: {focus}
|
|
273
273
|
DIFF_COMMAND: git diff {DIFF_RANGE}
|
|
@@ -362,10 +362,10 @@ Run `/resolve` to process and fix these findings.
|
|
|
362
362
|
│ └─ Detect active focuses (security + functional always; integration + usability conditional)
|
|
363
363
|
│
|
|
364
364
|
├─ Phase 5: Bug Analysis (PARALLEL)
|
|
365
|
-
│ ├─
|
|
366
|
-
│ ├─
|
|
367
|
-
│ ├─
|
|
368
|
-
│ └─
|
|
365
|
+
│ ├─ Debug agent: security (+ STATIC_FINDINGS)
|
|
366
|
+
│ ├─ Debug agent: functional
|
|
367
|
+
│ ├─ Debug agent: integration (conditional)
|
|
368
|
+
│ └─ Debug agent: usability (conditional)
|
|
369
369
|
│
|
|
370
370
|
├─ Phase 6: Synthesis
|
|
371
371
|
│ └─ Synthesize agent (mode: bug-analysis)
|
|
@@ -402,7 +402,7 @@ Run `/resolve` after `/bug-analysis` to fix identified bugs. `/resolve` automati
|
|
|
402
402
|
2. **Parallel, not background** — Analyzers spawn in one message with `run_in_background=false`
|
|
403
403
|
3. **Static + semantic** — Two complementary tracks, each validates the other
|
|
404
404
|
4. **Incremental by default** — Only analyze new changes unless `--full` specified
|
|
405
|
-
5. **Verify before reporting** —
|
|
405
|
+
5. **Verify before reporting** — Debug agents self-verify every finding
|
|
406
406
|
6. **Honest reporting** — Display risk level and counts directly from synthesis
|
|
407
407
|
|
|
408
408
|
## Phase Completion Checklist
|
|
@@ -306,7 +306,7 @@ If `index.md` exists and contains at least one entry line, use it for relevance
|
|
|
306
306
|
|
|
307
307
|
**Step 2 — Fallback: glob frontmatter (if `index.md` is absent or empty):**
|
|
308
308
|
|
|
309
|
-
Glob `{worktree}/.devflow/features/*/KNOWLEDGE.md`. For each file found, read only its YAML frontmatter block (between the opening and closing `---` delimiters).
|
|
309
|
+
Glob `{worktree}/.devflow/features/*/KNOWLEDGE.md`. For each file found, read only its YAML frontmatter block (between the opening and closing `---` delimiters).
|
|
310
310
|
|
|
311
311
|
**Step 3 — Pick relevant KBs:**
|
|
312
312
|
|
|
@@ -337,7 +337,7 @@ Headings: L5 Rules · L40 Overview · L62 Anti-Patterns · L118 Key Files
|
|
|
337
337
|
|
|
338
338
|
A KB with no Rules section labels its entries `Rules ({section name}):` and gives them no ID. `FEATURE_KNOWLEDGE` is these blocks; `FEATURE_KNOWLEDGE_RULES` is the same blocks without the `Headings:` line. Both come from this one selection, and each spawn names the variable its recipient takes. If no KBs exist, no KBs are relevant, or `.devflow/features/` is absent, set both to `(none)`.
|
|
339
339
|
|
|
340
|
-
**One git call, then direct reads — no `.cjs` script.**
|
|
340
|
+
**One git call, then direct reads — no `.cjs` script.**
|
|
341
341
|
|
|
342
342
|
Pass `FEATURE_KNOWLEDGE` to all Review agents.
|
|
343
343
|
|
|
@@ -487,21 +487,8 @@ In multi-worktree mode, report results per worktree.
|
|
|
487
487
|
|
|
488
488
|
| Case | Handling |
|
|
489
489
|
|------|----------|
|
|
490
|
-
| No new commits since last review | Skip review, report: "No new commits since last review. Use --full for a full re-review." |
|
|
491
|
-
| Rebase invalidates `.last-review-head` SHA | `git cat-file -t` check fails → fallback to full diff |
|
|
492
|
-
| Same-minute review collision | `mkdir` fails → retry with seconds appended (`YYYY-MM-DD_HHMMSS`) |
|
|
493
|
-
| Worktree in detached HEAD | Filtered out (no branch name → not reviewable) |
|
|
494
|
-
| Worktree mid-rebase or mid-merge | Filtered out by status check |
|
|
495
|
-
| Two worktrees on same branch | Deduplicate by branch — review once, use first worktree's path |
|
|
496
|
-
| Worktree on protected branch | Filtered out (not reviewable) |
|
|
497
|
-
| Worktree pre-flight fails | Report failure, continue with other worktrees |
|
|
498
490
|
| `--full` in multi-worktree mode | Applies to all worktrees (global modifier) |
|
|
499
|
-
| Many worktrees (5+) | Report count and proceed — user manages their worktree count |
|
|
500
491
|
| Review comment already posted | Git agent matches its own marker on the `{cycle, timestamp}` pair → skip silently (D7); a re-review in the same cycle (different timestamp) posts its own comment. The marker's format belongs to the operation; this caller passes the pair and never restates the literal |
|
|
501
|
-
| First review (no prior resolution) | PRIOR_RESOLUTIONS=(none), no convergence check |
|
|
502
|
-
| fp_ratio denominator = 0 | fp_ratio = 0, no warning |
|
|
503
|
-
| `--full` flag | Bypass incremental detection (Step 0d), still load PRIOR_RESOLUTIONS for cross-cycle awareness |
|
|
504
|
-
| Parsing failure on resolution-summary.md | fp_ratio = 0, convergence tracking degraded (see Step 0e-ii) |
|
|
505
492
|
| Concurrent sessions | Advisory only, each session computes independently |
|
|
506
493
|
| Docs-only diff | `docs-only`: documentation, consistency, security on `diff.patch`; no language or conditional focus |
|
|
507
494
|
| Tests-only diff | `tests-only`: testing, reliability, consistency, security on `diff.patch`; no language or conditional focus |
|
|
@@ -198,7 +198,7 @@ Produce the final report:
|
|
|
198
198
|
|
|
199
199
|
Ask user via AskUserQuestion: "Want me to implement this fix?"
|
|
200
200
|
|
|
201
|
-
- **YES** → implement the fix through the Code agent, never in this thread, then spawn `Agent(subagent_type="
|
|
201
|
+
- **YES** → implement the fix through the Code agent, never in this thread, then spawn `Agent(subagent_type="Polish")` on the changed files. /debug loads no feature knowledge, so the fix gets none:
|
|
202
202
|
|
|
203
203
|
```
|
|
204
204
|
Agent(subagent_type="Code"):
|
|
@@ -249,16 +249,12 @@ FILES_CHANGED: {list of files changed}
|
|
|
249
249
|
Write the knowledge base to:
|
|
250
250
|
{worktree}/.devflow/features/{slug}/KNOWLEDGE.md
|
|
251
251
|
|
|
252
|
-
Then update the index cache
|
|
252
|
+
Then update the index cache:
|
|
253
253
|
{worktree}/.devflow/features/index.md
|
|
254
254
|
|
|
255
255
|
Index line format: `- **{slug}** — {areas} — {Use-when description}` — at most 300 characters, the description at most 220; reword a longer one, never cut it.
|
|
256
256
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
The frontmatter in KNOWLEDGE.md is the source of truth — index.md is only a cache. Write the two files directly — no intermediate result JSON files, no external scripts.
|
|
260
|
-
|
|
261
|
-
After writing, commit the two files to the current worktree branch yourself by running git via your Bash tool (do not use a script). Stage ONLY .devflow/features/index.md and .devflow/features/{slug}/KNOWLEDGE.md, then commit just those paths with a docs(knowledge): message. Do NOT push, do NOT force, do NOT stage anything else. Follow your Commit Protocol — it is non-blocking, so if any git step fails, report KB_COMMIT and finish normally."
|
|
257
|
+
Then commit the two files as your Commit Protocol directs."
|
|
262
258
|
```
|
|
263
259
|
|
|
264
260
|
**Step 4 — Surface an uncommitted knowledge base:**
|
|
@@ -290,7 +286,7 @@ When the Knowledge agent reports `KB_COMMIT: skipped (detached HEAD)`, the files
|
|
|
290
286
|
├─ Phase 6: Root cause report with confidence level
|
|
291
287
|
│
|
|
292
288
|
├─ Phase 7: Offer Fix
|
|
293
|
-
│ └─ AskUserQuestion → Code agent (fix) +
|
|
289
|
+
│ └─ AskUserQuestion → Code agent (fix) + Polish agent, or done
|
|
294
290
|
│
|
|
295
291
|
└─ Feature Knowledge Write-Back (Conditional)
|
|
296
292
|
└─ Knowledge agent (if investigation surfaced durable cross-cutting knowledge)
|
|
@@ -41,7 +41,7 @@ Spawn devflow agents with:
|
|
|
41
41
|
agent("your prompt here", { agentType: "Code" })
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
-
Valid `agentType` values: Code,
|
|
44
|
+
Valid `agentType` values: Code, Fix, Validate, Polish, Harden, Evaluate, Test, Review, Git, Synthesize, Knowledge, Design.
|
|
45
45
|
|
|
46
46
|
**OMIT `opts.model` whenever `agentType` is set.** The agent frontmatter carries its own model tier (Code→sonnet, Validate→haiku, Review→opus, etc.) and that tier is honored automatically. Passing `opts.model` overrides it — always a mistake.
|
|
47
47
|
|
|
@@ -100,10 +100,10 @@ The following agentType values are valid. Model tiers are shown for reference
|
|
|
100
100
|
| agentType | Model tier | Role |
|
|
101
101
|
|-----------|-----------|------|
|
|
102
102
|
| Code | sonnet | Implements the plan and fixes review findings — the Code family is the ONLY one that writes code |
|
|
103
|
-
|
|
|
103
|
+
| Fix | sonnet | Fixes the listed validation, alignment and QA failures — part of the Code family |
|
|
104
104
|
| Validate | haiku | Build / typecheck / lint / test — fast correctness gate |
|
|
105
|
-
|
|
|
106
|
-
|
|
|
105
|
+
| Polish | sonnet | Reduces complexity, removes duplication, improves readability |
|
|
106
|
+
| Harden | opus | 9-pillar self-review — deep structural analysis |
|
|
107
107
|
| Evaluate | sonnet | Plan-fidelity / alignment — "was the plan implemented correctly?" |
|
|
108
108
|
| Test | sonnet | Scenario-based acceptance tests against acceptance criteria |
|
|
109
109
|
| Review | opus | Focus-parameterized code review — spawn ONE agent() per focus area |
|
|
@@ -114,7 +114,7 @@ The following agentType values are valid. Model tiers are shown for reference
|
|
|
114
114
|
|
|
115
115
|
### Agent caveats
|
|
116
116
|
|
|
117
|
-
- **The Code family writes every fix** — Code for review findings,
|
|
117
|
+
- **The Code family writes every fix** — Code for review findings, Fix for gate failures; no other agent type writes code. Finding-verification uses adversarial Review agent-style passes (§6.3 of design doc). Risk-assessment and tech-debt routing live in the post-code pipeline + escalation doctrine.
|
|
118
118
|
- **Always omit `opts.model` with `agentType`.** Each agent honors its own frontmatter model tier; overriding it defeats the per-agent specialization.
|
|
119
119
|
- **Review agents are focus-parameterized.** Each focus is a SEPARATE `agent()` call with `agentType: "Review"` and the focus baked into the prompt. Do NOT batch multiple focuses into one Review agent call — that defeats parallel specialization.
|
|
120
120
|
- **Do not depend on agents enumerating their own skills.** Skills are loaded (spike F5 confirmed) but self-reporting is imperfect. Write agent prompts that give the agent full context directly.
|
|
@@ -165,7 +165,7 @@ Author the resolved `ISSUE_REQUIRED` and `APPLY_CONVENTIONS` into the workflow s
|
|
|
165
165
|
|
|
166
166
|
**Set the compliance lens** from that line: `COMPLIANCE_FRAMEWORKS` is the settings line's `COMPLIANCE` with `generic` written `none`: `off`, `none`, or the framework ids the machine and this repository declare.
|
|
167
167
|
|
|
168
|
-
Pass it as `complianceFrameworks` when invoking the workflow; the engine builds `COMPLIANCE_DIRECTIVE` from it and hands that to every Code and
|
|
168
|
+
Pass it as `complianceFrameworks` when invoking the workflow; the engine builds `COMPLIANCE_DIRECTIVE` from it and hands that to every Code and Fix agent.
|
|
169
169
|
|
|
170
170
|
**0c. Resolve the docs root**
|
|
171
171
|
|
|
@@ -268,7 +268,7 @@ const ISSUE_INPUT = args.issueInput || args.issueNumber || "(none)"; // this ti
|
|
|
268
268
|
const ISSUE_REQUIRED = String(args.issueRequired) === "false" ? "false" : "true"; // Pre-authoring step 0; only an explicit false turns it off — absent or unrecognised fails closed, like the resolver
|
|
269
269
|
const APPLY_CONVENTIONS = String(args.applyConventions) === "false" ? "false" : "true";
|
|
270
270
|
const COMPLIANCE_FRAMEWORKS = /^(?:off|none|[a-z][a-z0-9-]{0,15}(?:,[a-z][a-z0-9-]{0,15}){0,7})$/.test(String(args.complianceFrameworks)) ? String(args.complianceFrameworks) : "off"; // Pre-authoring step 0b; any other shape is no lens
|
|
271
|
-
const COMPLIANCE_DIRECTIVE = COMPLIANCE_FRAMEWORKS === "off" ? "" : `When the task touches regulated surface (data models, auth flows, logging/observability, payments, IaC, retention), invoke Skill(skill="devflow:compliance") and load references/{id}.md only for the ids in ${COMPLIANCE_FRAMEWORKS} (none: generic controls only); never fabricate guidance for a framework you were not given.`; // D-COMPLIANCE-INJECT: empty when the lens is off, so a Code or
|
|
271
|
+
const COMPLIANCE_DIRECTIVE = COMPLIANCE_FRAMEWORKS === "off" ? "" : `When the task touches regulated surface (data models, auth flows, logging/observability, payments, IaC, retention), invoke Skill(skill="devflow:compliance") and load references/{id}.md only for the ids in ${COMPLIANCE_FRAMEWORKS} (none: generic controls only); never fabricate guidance for a framework you were not given.`; // D-COMPLIANCE-INJECT: empty when the lens is off, so a Code or Fix spawn then carries nothing about compliance; otherwise the one line _compliance.mds renders as compliance_directive(), with the validated ids in place of <ids>
|
|
272
272
|
|
|
273
273
|
// Phase 1: Git setup — declare the operation; the agent owns the process, the branch name included
|
|
274
274
|
const setup = await phase("setup", () =>
|
|
@@ -318,16 +318,16 @@ After implementing, commit your changes with a conventional-commit message and r
|
|
|
318
318
|
- Any open questions or blockers`, { agentType: "Code" })
|
|
319
319
|
);
|
|
320
320
|
|
|
321
|
-
// Phase 3: Gate 1 #1 — post-code pipeline:
|
|
321
|
+
// Phase 3: Gate 1 #1 — post-code pipeline: Polish agent → Harden agent → Validate agent.
|
|
322
322
|
// Validate runs last and unconditionally, so its one full run covers every commit the pass made (see gate1_postcode()).
|
|
323
323
|
const gate1 = await phase("gate1", async () => {
|
|
324
|
-
await agent(`
|
|
324
|
+
await agent(`Polish and reduce complexity of recent changes on branch ${BRANCH}. Commit any improvements.`, { agentType: "Polish" });
|
|
325
325
|
|
|
326
|
-
const
|
|
327
|
-
Return: {"status": "PASS" | "FIXED" | "BLOCKED"}`, { agentType: "
|
|
328
|
-
// Anything but an explicit PASS or FIXED is a stop: a
|
|
329
|
-
if (!["PASS", "FIXED"].includes(
|
|
330
|
-
return { verdict: "ESCALATED", type: "
|
|
326
|
+
const harden = await agent(`9-pillar self-review of recent changes on branch ${BRANCH}. Fix P0/P1 issues and commit the fixes.
|
|
327
|
+
Return: {"status": "PASS" | "FIXED" | "BLOCKED"}`, { agentType: "Harden" });
|
|
328
|
+
// Anything but an explicit PASS or FIXED is a stop: a Harden that returned no status, or one this skeleton does not know, has not accepted the code.
|
|
329
|
+
if (!["PASS", "FIXED"].includes(harden?.status)) {
|
|
330
|
+
return { verdict: "ESCALATED", type: "harden-blocked", reason: harden?.status === "BLOCKED" ? "Harden agent returned BLOCKED: a P0 issue cannot be fixed in scope" : "Harden agent returned no recognised status: counted as BLOCKED" };
|
|
331
331
|
}
|
|
332
332
|
|
|
333
333
|
const validation = await agent(`Run build, typecheck, lint, and tests on branch ${BRANCH}.
|
|
@@ -343,19 +343,19 @@ Return: {"verdict": "PASS" | "FAIL", "details": "..."}`, { agentType: "Validate"
|
|
|
343
343
|
Fix the validation failures on branch ${BRANCH}:
|
|
344
344
|
${failureDetails}
|
|
345
345
|
${COMPLIANCE_DIRECTIVE}
|
|
346
|
-
Commit fixes with conventional-commit message.`, { agentType: "
|
|
346
|
+
Commit fixes with conventional-commit message.`, { agentType: "Fix" });
|
|
347
347
|
const recheck = await agent(`Re-run build, typecheck, lint, tests on branch ${BRANCH} after fix attempt ${attempt} (follow your Running commands block).
|
|
348
348
|
Return: {"verdict": "PASS" | "FAIL", "details": "..."}`, { agentType: "Validate" });
|
|
349
349
|
if (recheck?.verdict === "PASS") break;
|
|
350
350
|
failureDetails = recheck?.details || failureDetails;
|
|
351
|
-
if (attempt === 2) return { verdict: "ESCALATED", type: "validation-exhausted", reason: "Validation exhausted after 2
|
|
351
|
+
if (attempt === 2) return { verdict: "ESCALATED", type: "validation-exhausted", reason: "Validation exhausted after 2 Fix agent attempts" };
|
|
352
352
|
}
|
|
353
353
|
}
|
|
354
354
|
|
|
355
355
|
return { verdict: "PASS" };
|
|
356
356
|
});
|
|
357
357
|
|
|
358
|
-
// Gate 1 #1 stop, before Gate 2: an exhausted Validate or a BLOCKED
|
|
358
|
+
// Gate 1 #1 stop, before Gate 2: an exhausted Validate or a BLOCKED Harden leaves a broken or unfinished build,
|
|
359
359
|
// so Gate 2 and the review pass never run on it — a correctness stop, like the ticket-link and branch stops.
|
|
360
360
|
if (gate1.verdict === "ESCALATED") {
|
|
361
361
|
return { ticket: TICKET, branch: BRANCH, verdict: "ESCALATED", issueId: ISSUE_NUMBER, issuePrLink: ISSUE_PR_LINK, escalations: [{ type: gate1.type, description: gate1.reason }] };
|
|
@@ -383,7 +383,7 @@ Return: {"verdict": "PASS" | "FAIL", "rationale": "..."} — FAIL if either answ
|
|
|
383
383
|
Fix the alignment issues identified by the Evaluate agent on branch ${BRANCH}:
|
|
384
384
|
${evaluation?.rationale || "see the Evaluate agent's report"}
|
|
385
385
|
${COMPLIANCE_DIRECTIVE}
|
|
386
|
-
Self-verify your fix compiles, following your Running commands block. Commit fixes.`, { agentType: "
|
|
386
|
+
Self-verify your fix compiles, following your Running commands block. Commit fixes.`, { agentType: "Fix" });
|
|
387
387
|
evalVerdict = "FAIL-FIXED"; // issues found, fixes applied, not re-evaluated by design
|
|
388
388
|
}
|
|
389
389
|
}
|
|
@@ -402,7 +402,7 @@ Cover: functionality, API contracts, performance, and cover every TEST_PLAN scen
|
|
|
402
402
|
Fix the failing acceptance test scenarios on branch ${BRANCH}:
|
|
403
403
|
${testResult.failures}
|
|
404
404
|
${COMPLIANCE_DIRECTIVE}
|
|
405
|
-
Self-verify your fix compiles and the scenarios pass, following your Running commands block. Commit fixes.`, { agentType: "
|
|
405
|
+
Self-verify your fix compiles and the scenarios pass, following your Running commands block. Commit fixes.`, { agentType: "Fix" });
|
|
406
406
|
testVerdict = "FAIL-FIXED"; // issues found, fixes applied, not re-evaluated by design
|
|
407
407
|
}
|
|
408
408
|
}
|
|
@@ -554,16 +554,16 @@ Return: {"status": "fixed"|"blocked", "commitShas": ["<sha>"], "unresolved": ["<
|
|
|
554
554
|
return { survivingFindings: notAddressed, fixedFindings, coverageGaps };
|
|
555
555
|
});
|
|
556
556
|
|
|
557
|
-
// Phase 5.5: Gate 1 #2 — FINAL post-fix gate (
|
|
557
|
+
// Phase 5.5: Gate 1 #2 — FINAL post-fix gate (Polish agent → Harden agent → full Validate agent, Validate last and unconditional).
|
|
558
558
|
// Runs ONCE, after the review pass. Inside the pass the Code agent self-verified its own fixes;
|
|
559
559
|
// this is the build gate before the branch is handed back. See gate1_postcode() cadence.
|
|
560
560
|
const gate1Final = await phase("gate1-final", async () => {
|
|
561
|
-
await agent(`
|
|
561
|
+
await agent(`Polish and reduce complexity of recent changes on branch ${BRANCH}. Commit any improvements.`, { agentType: "Polish" });
|
|
562
562
|
|
|
563
|
-
const
|
|
564
|
-
Return: {"status": "PASS" | "FIXED" | "BLOCKED"}`, { agentType: "
|
|
565
|
-
if (!["PASS", "FIXED"].includes(
|
|
566
|
-
return { verdict: "ESCALATED", type: "
|
|
563
|
+
const harden = await agent(`9-pillar self-review of recent changes on branch ${BRANCH}. Fix P0/P1 issues and commit the fixes.
|
|
564
|
+
Return: {"status": "PASS" | "FIXED" | "BLOCKED"}`, { agentType: "Harden" });
|
|
565
|
+
if (!["PASS", "FIXED"].includes(harden?.status)) {
|
|
566
|
+
return { verdict: "ESCALATED", type: "harden-blocked", reason: harden?.status === "BLOCKED" ? "Final Gate 1 Harden agent returned BLOCKED: a P0 issue cannot be fixed in scope" : "Final Gate 1 Harden agent returned no recognised status: counted as BLOCKED" };
|
|
567
567
|
}
|
|
568
568
|
|
|
569
569
|
const validation = await agent(`Run build, typecheck, lint, and tests on branch ${BRANCH} (final gate after all fixing).
|
|
@@ -577,12 +577,12 @@ Return: {"verdict": "PASS" | "FAIL", "details": "..."}`, { agentType: "Validate"
|
|
|
577
577
|
Fix the final validation failures on branch ${BRANCH}:
|
|
578
578
|
${failureDetails}
|
|
579
579
|
${COMPLIANCE_DIRECTIVE}
|
|
580
|
-
Self-verify your fix compiles. Commit fixes with conventional-commit message.`, { agentType: "
|
|
580
|
+
Self-verify your fix compiles. Commit fixes with conventional-commit message.`, { agentType: "Fix" });
|
|
581
581
|
const recheck = await agent(`Re-run build, typecheck, lint, tests on branch ${BRANCH} (final gate, after fix attempt ${attempt}; follow your Running commands block).
|
|
582
582
|
Return: {"verdict": "PASS" | "FAIL", "details": "..."}`, { agentType: "Validate" });
|
|
583
583
|
if (recheck?.verdict === "PASS") break;
|
|
584
584
|
failureDetails = recheck?.details || failureDetails;
|
|
585
|
-
if (attempt === 2) return { verdict: "ESCALATED", type: "validation-exhausted", reason: "Final Gate 1 validation exhausted after 2
|
|
585
|
+
if (attempt === 2) return { verdict: "ESCALATED", type: "validation-exhausted", reason: "Final Gate 1 validation exhausted after 2 Fix agent attempts" };
|
|
586
586
|
}
|
|
587
587
|
}
|
|
588
588
|
|
|
@@ -667,7 +667,7 @@ Code(agentType:"Code", prompt: "OPERATION: implement" first line, then full task
|
|
|
667
667
|
→ gate2_acceptance() ← Gate 2 runs HERE — before the review pass, not after
|
|
668
668
|
```
|
|
669
669
|
|
|
670
|
-
Every Code-family agent prompt opens with `OPERATION: <mode>` as its first line: `implement` and `issue-fix` go to `agentType:"Code"`, `validation-fix`, `alignment-fix` and `qa-fix` go to `agentType:"
|
|
670
|
+
Every Code-family agent prompt opens with `OPERATION: <mode>` as its first line: `implement` and `issue-fix` go to `agentType:"Code"`, `validation-fix`, `alignment-fix` and `qa-fix` go to `agentType:"Fix"`. It must include: task description, implementation plan (if one exists), the compliance directive (`COMPLIANCE_DIRECTIVE` — every Code prompt carries it when it is not empty, fix prompts included), and any PRIOR_PHASE_SUMMARY / HANDOFF_FILE for sequential multi-phase tickets.
|
|
671
671
|
|
|
672
672
|
Gate 2 runs at implementation acceptance — this matches devflow's deliberate placement: "evaluation is part of implementation acceptance, not post-review" (§6.1).
|
|
673
673
|
|
|
@@ -675,12 +675,12 @@ Gate 2 runs at implementation acceptance — this matches devflow's deliberate p
|
|
|
675
675
|
|
|
676
676
|
ORDER IS LOAD-BEARING. Run exactly in this sequence:
|
|
677
677
|
|
|
678
|
-
1. **
|
|
679
|
-
2. **
|
|
680
|
-
- BLOCKED (a P0 issue cannot be fixed in scope), or a missing or unrecognised status, which counts as BLOCKED → stop the pass and escalate as `
|
|
681
|
-
3. **Validate agent** — build / typecheck / lint / test; returns `{"verdict": "PASS" | "FAIL", "details": "..."}`. It runs LAST and UNCONDITIONALLY: one full run over the HEAD that
|
|
678
|
+
1. **Polish agent** — reduce complexity, remove duplication
|
|
679
|
+
2. **Harden agent** — 9-pillar self-review (deep structural analysis); returns `{"status": "PASS" | "FIXED" | "BLOCKED"}`
|
|
680
|
+
- BLOCKED (a P0 issue cannot be fixed in scope), or a missing or unrecognised status, which counts as BLOCKED → stop the pass and escalate as `harden-blocked`; Validate does not run on code Harden could not accept
|
|
681
|
+
3. **Validate agent** — build / typecheck / lint / test; returns `{"verdict": "PASS" | "FAIL", "details": "..."}`. It runs LAST and UNCONDITIONALLY: one full run over the HEAD that Polish and Harden left, so it covers their commits whether or not Harden changed code
|
|
682
682
|
- Build/test commands follow `build_execution_doctrine()`: the Validate agent's Running commands block, foreground under an explicit Bash timeout.
|
|
683
|
-
- FAIL →
|
|
683
|
+
- FAIL → Fix agent fix (max 2 retries), each followed by a Validate agent re-run
|
|
684
684
|
- If still FAIL after 2 retries → escalate as `validation-exhausted` (do not loop endlessly)
|
|
685
685
|
|
|
686
686
|
**Gate 1 contains NO Evaluate agent and NO Test agent.** Those are Gate 2 only.
|
|
@@ -688,8 +688,8 @@ ORDER IS LOAD-BEARING. Run exactly in this sequence:
|
|
|
688
688
|
Depth scales to change size + budget: a trivial one-line fix warrants a lighter pass; a multi-file refactor warrants the full depth.
|
|
689
689
|
|
|
690
690
|
**Cadence — Gate 1 runs at exactly TWO points per ticket:**
|
|
691
|
-
1. **Gate 1 #1** — immediately after the initial Code agent implementation (inside `implement_bundle()`). An escalated result — Validate exhausted, or
|
|
692
|
-
2. **Gate 1 #2** — the FINAL gate, after ALL Gate-2 fixes AND the entire review pass have completed.
|
|
691
|
+
1. **Gate 1 #1** — immediately after the initial Code agent implementation (inside `implement_bundle()`). An escalated result — Validate exhausted, or Harden BLOCKED — returns early: the ticket's engine returns `ESCALATED` with one escalation, and Gate 2 and the review pass never run on a broken or unfinished build.
|
|
692
|
+
2. **Gate 1 #2** — the FINAL gate, after ALL Gate-2 fixes AND the entire review pass have completed. Harden BLOCKED here is `ESCALATED` as well.
|
|
693
693
|
|
|
694
694
|
It does NOT run inside the review pass, nor after each individual Gate-2 / review / QA fix. At those points the fixing Code agent self-verifies its OWN build compiles (see `review_pass()` and the Code agent's Running commands block). The final Gate 1 #2 is the invariant that all written code passes before merge.
|
|
695
695
|
|
|
@@ -701,11 +701,11 @@ Gate 2 inputs are produced by `/devflow:dynamic-plan`'s plan-challenge step —
|
|
|
701
701
|
|
|
702
702
|
**Evaluate agent** (only if a plan exists):
|
|
703
703
|
- Run `evaluator_panel()` — see that block for the one spawn and the two lenses it names
|
|
704
|
-
- If the Evaluate agent returns FAIL (either lens failed): fix-and-continue — the demanded fixes are applied by a
|
|
704
|
+
- If the Evaluate agent returns FAIL (either lens failed): fix-and-continue — the demanded fixes are applied by a Fix agent that self-verifies its own build (batched per the review-pass batching doctrine if numerous). The recorded verdict becomes `FAIL-FIXED` (issues found, fixes applied, not re-evaluated by design); Gate 2 then proceeds. In SINGLE mode the run reports it as `UNVERIFIED`, never PASS.
|
|
705
705
|
|
|
706
706
|
**Test agent** (only if acceptance criteria or a test plan exist):
|
|
707
707
|
- Scenario-based acceptance tests covering functionality, API contracts, performance
|
|
708
|
-
- FAIL → fix-and-continue — a
|
|
708
|
+
- FAIL → fix-and-continue — a Fix agent applies the demanded fixes and self-verifies its own build. The recorded verdict becomes `FAIL-FIXED`; Gate 2 then proceeds. In SINGLE mode the run reports it as `UNVERIFIED`, never PASS.
|
|
709
709
|
|
|
710
710
|
**When Gate 2 inputs are absent:**
|
|
711
711
|
- No plan → skip the Evaluate agent silently (note in output: "Gate 2 Evaluate agent skipped — no plan available")
|
|
@@ -820,13 +820,13 @@ Majority-survives: a finding needs >50% of verification lenses to confirm it. St
|
|
|
820
820
|
|
|
821
821
|
If no surviving findings: return early (no fixes needed). Any coverageGaps are carried in the return — they block a PASS verdict downstream, not the early exit.
|
|
822
822
|
|
|
823
|
-
If survivors remain: batch the confirmed findings for fixing: group findings by file — one file per set of sub-batches, chunked at max 5 findings per sub-batch; never mix two files in one batch. A finding with no `file` field is its own singleton batch. Sub-batches for the SAME file run sequentially (never two Code agents editing the same file concurrently — same-file edits in `parallel()` cause index contention and lost fixes); sub-batches for DISTINCT files run via `parallel()` in staggered chunks of ~5, same pacing bar as the Review spawn path (different code areas — safe per concurrency doctrine). Each Code agent's prompt pins a return contract: `{"status": "fixed"|"blocked", "commitShas": [...], "unresolved": [...]}` — a chunk is FIXED only when `result.status === "fixed"` AND `commitShas` is non-empty AND `result.unresolved` is empty; never decide disposition from status alone. A non-empty `unresolved` list means the agent named work it could not complete — carry the whole chunk into `survivingFindings` rather than guessing which findings the strings map to. `survivingFindings` = findings NOT addressed: fix Code agent dead/failed/blocked/deferred OR committed but left work named in `unresolved`. The fixing Code agent **self-verifies its own fix builds** (build/typecheck per the Code agent's Running commands block, once over its whole batch). Do **NOT** run Gate 1 or Gate 2 inside the pass (no Validate agent, no
|
|
823
|
+
If survivors remain: batch the confirmed findings for fixing: group findings by file — one file per set of sub-batches, chunked at max 5 findings per sub-batch; never mix two files in one batch. A finding with no `file` field is its own singleton batch. Sub-batches for the SAME file run sequentially (never two Code agents editing the same file concurrently — same-file edits in `parallel()` cause index contention and lost fixes); sub-batches for DISTINCT files run via `parallel()` in staggered chunks of ~5, same pacing bar as the Review spawn path (different code areas — safe per concurrency doctrine). Each Code agent's prompt pins a return contract: `{"status": "fixed"|"blocked", "commitShas": [...], "unresolved": [...]}` — a chunk is FIXED only when `result.status === "fixed"` AND `commitShas` is non-empty AND `result.unresolved` is empty; never decide disposition from status alone. A non-empty `unresolved` list means the agent named work it could not complete — carry the whole chunk into `survivingFindings` rather than guessing which findings the strings map to. `survivingFindings` = findings NOT addressed: fix Code agent dead/failed/blocked/deferred OR committed but left work named in `unresolved`. The fixing Code agent **self-verifies its own fix builds** (build/typecheck per the Code agent's Running commands block, once over its whole batch). Do **NOT** run Gate 1 or Gate 2 inside the pass (no Validate agent, no Polish agent, no Harden agent, no Evaluate agent, no Test agent). The engine runs ONE final Gate 1 after the pass exits — see the `gate1_postcode()` cadence (Gate 1 #2).
|
|
824
824
|
|
|
825
825
|
### Engine invariants (non-negotiable)
|
|
826
826
|
|
|
827
|
-
1. **Code is written ONLY by the Code family (Code,
|
|
827
|
+
1. **Code is written ONLY by the Code family (Code, Fix).** No other agent type writes code — not Review agent, not Evaluate agent.
|
|
828
828
|
2. **Findings are verified before any fix is written.** The adversarial verification step is not optional; unverified findings are not passed to the Code agent.
|
|
829
|
-
3. **All written code passes Gate 1.** No code merge, commit, or handoff before
|
|
829
|
+
3. **All written code passes Gate 1.** No code merge, commit, or handoff before Polish agent + Harden agent + Validate agent (in that order — Validate last, so its one run covers the commits of the two before it).
|
|
830
830
|
4. **Gate 2 runs once, at implementation acceptance.** It does not re-run after review-fixes.
|
|
831
831
|
5. **NEVER auto-merge to main or master.** All merges target the integration branch. The user merges to main themselves.
|
|
832
832
|
6. **No unauthorized tracker or remote side-effects.** Sub-agents NEVER create issues/PRs on the tracker, comment on them, or push beyond the ticket-authorized branch unless the ticket, plan, or user explicitly authorizes that exact action. This applies to whatever tracker is resolved, not to one vendor. Proposed follow-ups go in the run report.
|
|
@@ -868,7 +868,7 @@ Each ticket engine run returns a structured result. The Synthesize agent or the
|
|
|
868
868
|
},
|
|
869
869
|
"escalations": [
|
|
870
870
|
{
|
|
871
|
-
"type": "merge-conflict | gate2-fail | validation-exhausted |
|
|
871
|
+
"type": "merge-conflict | gate2-fail | validation-exhausted | harden-blocked | ambiguous-resolution | review-coverage-incomplete | dependency-blocked | engine-crash | ticket-link-missing | branch-missing",
|
|
872
872
|
"description": "string"
|
|
873
873
|
}
|
|
874
874
|
],
|
|
@@ -1224,19 +1224,13 @@ git -C "{integration worktree root}" push origin HEAD; echo "exit=$?"
|
|
|
1224
1224
|
|
|
1225
1225
|
Note: `auto` is NOT fail-open — under `auto`, the Git agent probes the repository visibility and treats any error or unrecognised value as PUBLIC (mode STUB). What each value does is decided by the Git agent's publication gate (`references/publication-gate.md` step 2); this partial only resolves the value.
|
|
1226
1226
|
|
|
1227
|
-
Then spawn:
|
|
1227
|
+
Then run the script inline — it is the whole `update-pr-evidence` operation, with no Git agent spawn — through the Bash tool with `timeout: 180000`:
|
|
1228
1228
|
|
|
1229
|
-
```
|
|
1230
|
-
|
|
1231
|
-
"OPERATION: update-pr-evidence
|
|
1232
|
-
PR_NUMBER: {n}
|
|
1233
|
-
EVIDENCE_FILE: .devflow/docs/evidence-wave-{slug}.md
|
|
1234
|
-
REVIEW_PUBLICATION: {REVIEW_PUBLICATION resolved above, or auto}
|
|
1235
|
-
WORKTREE_PATH: {integration worktree root}
|
|
1236
|
-
Update the wave PR's test-plan block and post its evidence comment."
|
|
1229
|
+
```bash
|
|
1230
|
+
cd "{integration worktree root}" && node "$HOME/.devflow/scripts/verify-evidence.cjs" publish --pr {n} --evidence ".devflow/docs/evidence-wave-{slug}.md" --publication {REVIEW_PUBLICATION resolved above, or auto}; echo "exit=$?"
|
|
1237
1231
|
```
|
|
1238
1232
|
|
|
1239
|
-
`
|
|
1233
|
+
`{n}` is the number admitted above, and the publication value is `auto`, `full`, `off` or `stub`. `publish` decides what each publication value means for the evidence comment. Report its `## PR Evidence` block — its `EVIDENCE` line and its `**Body**:` / `**Comment**:` line — with any `TRACEABILITY: DEGRADED ({reason})` lines after it, or its `TRACEABILITY: DEGRADED (evidence unavailable)` line; empty stdout or any other exit ⇒ `TRACEABILITY: DEGRADED (evidence refresh failed)`. Whatever it returns, the run ends here.
|
|
1240
1234
|
|
|
1241
1235
|
---
|
|
1242
1236
|
|
|
@@ -41,7 +41,7 @@ Spawn devflow agents with:
|
|
|
41
41
|
agent("your prompt here", { agentType: "Code" })
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
-
Valid `agentType` values: Code,
|
|
44
|
+
Valid `agentType` values: Code, Fix, Validate, Polish, Harden, Evaluate, Test, Review, Git, Synthesize, Knowledge, Design.
|
|
45
45
|
|
|
46
46
|
**OMIT `opts.model` whenever `agentType` is set.** The agent frontmatter carries its own model tier (Code→sonnet, Validate→haiku, Review→opus, etc.) and that tier is honored automatically. Passing `opts.model` overrides it — always a mistake.
|
|
47
47
|
|
|
@@ -88,10 +88,10 @@ The following agentType values are valid. Model tiers are shown for reference
|
|
|
88
88
|
| agentType | Model tier | Role |
|
|
89
89
|
|-----------|-----------|------|
|
|
90
90
|
| Code | sonnet | Implements the plan and fixes review findings — the Code family is the ONLY one that writes code |
|
|
91
|
-
|
|
|
91
|
+
| Fix | sonnet | Fixes the listed validation, alignment and QA failures — part of the Code family |
|
|
92
92
|
| Validate | haiku | Build / typecheck / lint / test — fast correctness gate |
|
|
93
|
-
|
|
|
94
|
-
|
|
|
93
|
+
| Polish | sonnet | Reduces complexity, removes duplication, improves readability |
|
|
94
|
+
| Harden | opus | 9-pillar self-review — deep structural analysis |
|
|
95
95
|
| Evaluate | sonnet | Plan-fidelity / alignment — "was the plan implemented correctly?" |
|
|
96
96
|
| Test | sonnet | Scenario-based acceptance tests against acceptance criteria |
|
|
97
97
|
| Review | opus | Focus-parameterized code review — spawn ONE agent() per focus area |
|
|
@@ -102,7 +102,7 @@ The following agentType values are valid. Model tiers are shown for reference
|
|
|
102
102
|
|
|
103
103
|
### Agent caveats
|
|
104
104
|
|
|
105
|
-
- **The Code family writes every fix** — Code for review findings,
|
|
105
|
+
- **The Code family writes every fix** — Code for review findings, Fix for gate failures; no other agent type writes code. Finding-verification uses adversarial Review agent-style passes (§6.3 of design doc). Risk-assessment and tech-debt routing live in the post-code pipeline + escalation doctrine.
|
|
106
106
|
- **Always omit `opts.model` with `agentType`.** Each agent honors its own frontmatter model tier; overriding it defeats the per-agent specialization.
|
|
107
107
|
- **Review agents are focus-parameterized.** Each focus is a SEPARATE `agent()` call with `agentType: "Review"` and the focus baked into the prompt. Do NOT batch multiple focuses into one Review agent call — that defeats parallel specialization.
|
|
108
108
|
- **Do not depend on agents enumerating their own skills.** Skills are loaded (spike F5 confirmed) but self-reporting is imperfect. Write agent prompts that give the agent full context directly.
|
|
@@ -41,7 +41,7 @@ Spawn devflow agents with:
|
|
|
41
41
|
agent("your prompt here", { agentType: "Code" })
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
-
Valid `agentType` values: Code,
|
|
44
|
+
Valid `agentType` values: Code, Fix, Validate, Polish, Harden, Evaluate, Test, Review, Git, Synthesize, Knowledge, Design.
|
|
45
45
|
|
|
46
46
|
**OMIT `opts.model` whenever `agentType` is set.** The agent frontmatter carries its own model tier (Code→sonnet, Validate→haiku, Review→opus, etc.) and that tier is honored automatically. Passing `opts.model` overrides it — always a mistake.
|
|
47
47
|
|
|
@@ -41,7 +41,7 @@ Spawn devflow agents with:
|
|
|
41
41
|
agent("your prompt here", { agentType: "Code" })
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
-
Valid `agentType` values: Code,
|
|
44
|
+
Valid `agentType` values: Code, Fix, Validate, Polish, Harden, Evaluate, Test, Review, Git, Synthesize, Knowledge, Design.
|
|
45
45
|
|
|
46
46
|
**OMIT `opts.model` whenever `agentType` is set.** The agent frontmatter carries its own model tier (Code→sonnet, Validate→haiku, Review→opus, etc.) and that tier is honored automatically. Passing `opts.model` overrides it — always a mistake.
|
|
47
47
|
|
|
@@ -88,10 +88,10 @@ The following agentType values are valid. Model tiers are shown for reference
|
|
|
88
88
|
| agentType | Model tier | Role |
|
|
89
89
|
|-----------|-----------|------|
|
|
90
90
|
| Code | sonnet | Implements the plan and fixes review findings — the Code family is the ONLY one that writes code |
|
|
91
|
-
|
|
|
91
|
+
| Fix | sonnet | Fixes the listed validation, alignment and QA failures — part of the Code family |
|
|
92
92
|
| Validate | haiku | Build / typecheck / lint / test — fast correctness gate |
|
|
93
|
-
|
|
|
94
|
-
|
|
|
93
|
+
| Polish | sonnet | Reduces complexity, removes duplication, improves readability |
|
|
94
|
+
| Harden | opus | 9-pillar self-review — deep structural analysis |
|
|
95
95
|
| Evaluate | sonnet | Plan-fidelity / alignment — "was the plan implemented correctly?" |
|
|
96
96
|
| Test | sonnet | Scenario-based acceptance tests against acceptance criteria |
|
|
97
97
|
| Review | opus | Focus-parameterized code review — spawn ONE agent() per focus area |
|
|
@@ -102,7 +102,7 @@ The following agentType values are valid. Model tiers are shown for reference
|
|
|
102
102
|
|
|
103
103
|
### Agent caveats
|
|
104
104
|
|
|
105
|
-
- **The Code family writes every fix** — Code for review findings,
|
|
105
|
+
- **The Code family writes every fix** — Code for review findings, Fix for gate failures; no other agent type writes code. Finding-verification uses adversarial Review agent-style passes (§6.3 of design doc). Risk-assessment and tech-debt routing live in the post-code pipeline + escalation doctrine.
|
|
106
106
|
- **Always omit `opts.model` with `agentType`.** Each agent honors its own frontmatter model tier; overriding it defeats the per-agent specialization.
|
|
107
107
|
- **Review agents are focus-parameterized.** Each focus is a SEPARATE `agent()` call with `agentType: "Review"` and the focus baked into the prompt. Do NOT batch multiple focuses into one Review agent call — that defeats parallel specialization.
|
|
108
108
|
- **Do not depend on agents enumerating their own skills.** Skills are loaded (spike F5 confirmed) but self-reporting is imperfect. Write agent prompts that give the agent full context directly.
|
|
@@ -136,16 +136,12 @@ FILES_CHANGED: {list of files changed}
|
|
|
136
136
|
Write the knowledge base to:
|
|
137
137
|
{worktree}/.devflow/features/{slug}/KNOWLEDGE.md
|
|
138
138
|
|
|
139
|
-
Then update the index cache
|
|
139
|
+
Then update the index cache:
|
|
140
140
|
{worktree}/.devflow/features/index.md
|
|
141
141
|
|
|
142
142
|
Index line format: `- **{slug}** — {areas} — {Use-when description}` — at most 300 characters, the description at most 220; reword a longer one, never cut it.
|
|
143
143
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
The frontmatter in KNOWLEDGE.md is the source of truth — index.md is only a cache. Write the two files directly — no intermediate result JSON files, no external scripts.
|
|
147
|
-
|
|
148
|
-
After writing, commit the two files to the current worktree branch yourself by running git via your Bash tool (do not use a script). Stage ONLY .devflow/features/index.md and .devflow/features/{slug}/KNOWLEDGE.md, then commit just those paths with a docs(knowledge): message. Do NOT push, do NOT force, do NOT stage anything else. Follow your Commit Protocol — it is non-blocking, so if any git step fails, report KB_COMMIT and finish normally."
|
|
144
|
+
Then commit the two files as your Commit Protocol directs."
|
|
149
145
|
```
|
|
150
146
|
|
|
151
147
|
**Step 4 — Surface an uncommitted knowledge base:**
|