devflow-kit 3.4.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 +127 -0
- package/README.md +12 -8
- package/dist/agents/code.md +39 -182
- package/dist/agents/{diagnose.md → debug.md} +4 -4
- package/dist/agents/design.md +0 -1
- package/dist/agents/fix.md +165 -0
- package/dist/agents/git.md +31 -693
- package/dist/agents/{scrutinize.md → harden.md} +9 -6
- package/dist/agents/knowledge.md +8 -2
- package/dist/agents/refactor.md +133 -0
- package/dist/agents/research.md +6 -0
- package/dist/agents/review.md +0 -4
- package/dist/agents/skim.md +4 -0
- package/dist/agents/triage.md +8 -1
- package/dist/cli/agents-view/render.js +1 -1
- package/dist/cli/commands/behavior-prompts.js +77 -0
- package/dist/cli/commands/behavior.js +123 -0
- package/dist/cli/commands/flags.js +8 -2
- package/dist/cli/commands/init-seed.js +7 -3
- package/dist/cli/commands/init.js +75 -8
- package/dist/cli/commands/learning.js +12 -12
- package/dist/cli/commands/legacy-hooks.js +1 -1
- package/dist/cli/commands/rules.js +16 -0
- package/dist/cli/commands/tracker.js +112 -15
- package/dist/cli/commands/uninstall.js +111 -5
- package/dist/cli.js +2 -0
- package/dist/commands/bug-analysis.md +22 -18
- package/dist/commands/code-review.md +25 -29
- package/dist/commands/debug.md +36 -15
- package/dist/commands/dynamic-build.md +64 -78
- package/dist/commands/dynamic-plan.md +18 -14
- package/dist/commands/dynamic-profile.md +8 -6
- package/dist/commands/dynamic-tickets.md +19 -15
- package/dist/commands/explore.md +14 -14
- package/dist/commands/implement.md +122 -225
- package/dist/commands/plan.md +32 -47
- package/dist/commands/release.md +12 -7
- package/dist/commands/research.md +26 -15
- package/dist/commands/resolve.md +53 -92
- package/dist/commands/self-review.md +42 -42
- package/dist/core/agent-frontmatter.js +101 -0
- package/dist/core/agent-models.js +47 -11
- package/dist/core/compliance-compose.js +6 -4
- package/dist/core/{learning-tuning-config.js → curate-tuning-config.js} +14 -14
- package/dist/core/feature-switch.js +23 -2
- package/dist/core/flags.js +111 -0
- package/dist/core/learning-queue-cleanup.js +1 -1
- package/dist/core/manifest.js +11 -3
- package/dist/core/mds-variants.js +68 -26
- package/dist/core/migrations.js +63 -44
- package/dist/core/plugins.js +49 -70
- package/dist/core/project-paths.js +3 -7
- package/dist/core/proxy-log.js +1 -1
- package/dist/core/proxy-state.js +1 -1
- package/dist/core/tracker.js +120 -2
- 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/code.md +37 -180
- package/dist/learning-off/agents/{diagnose.md → debug.md} +4 -4
- package/dist/learning-off/agents/design.md +0 -1
- package/dist/learning-off/agents/fix.md +161 -0
- package/dist/learning-off/agents/{scrutinize.md → harden.md} +9 -6
- package/dist/learning-off/agents/knowledge.md +8 -2
- package/dist/learning-off/agents/refactor.md +129 -0
- package/dist/learning-off/agents/research.md +6 -0
- package/dist/learning-off/agents/review.md +0 -4
- package/dist/learning-off/agents/skim.md +4 -0
- package/dist/learning-off/agents/triage.md +8 -1
- package/dist/learning-off/commands/bug-analysis.md +12 -12
- package/dist/learning-off/commands/code-review.md +14 -22
- package/dist/learning-off/commands/debug.md +24 -8
- package/dist/learning-off/commands/dynamic-build.md +58 -74
- package/dist/learning-off/commands/dynamic-plan.md +12 -10
- package/dist/learning-off/commands/dynamic-profile.md +2 -2
- package/dist/learning-off/commands/dynamic-tickets.md +13 -11
- package/dist/learning-off/commands/explore.md +3 -7
- package/dist/learning-off/commands/implement.md +110 -217
- package/dist/learning-off/commands/plan.md +21 -39
- package/dist/learning-off/commands/release.md +7 -4
- package/dist/learning-off/commands/research.md +16 -9
- package/dist/learning-off/commands/resolve.md +42 -85
- package/dist/learning-off/commands/self-review.md +30 -34
- package/dist/skills/git/references/learn-conventions.md +27 -3
- package/dist/skills/git/references/pr/check-ci-status.md +19 -0
- package/dist/skills/git/references/pr/check-merge-readiness.md +21 -0
- package/dist/skills/git/references/pr/fetch-review-threads.md +30 -0
- package/dist/skills/git/references/pr/post-resolution-summary.md +18 -0
- package/dist/skills/git/references/pr/post-review-summary.md +20 -0
- package/dist/skills/git/references/pr/resolve-review-threads.md +28 -4
- package/dist/skills/git/references/pr/update-pr-evidence.md +17 -6
- package/dist/skills/git/references/pr/validate-branch.md +26 -0
- package/dist/skills/git/references/tracker/github/associate-release.md +24 -0
- package/dist/skills/git/references/tracker/github/backlink-shipped-issues.md +31 -1
- package/dist/skills/git/references/tracker/github/create-release.md +30 -1
- package/dist/skills/git/references/tracker/github/ensure-pr-ready.md +89 -2
- package/dist/skills/git/references/tracker/github/ensure-traceable-issue.md +16 -1
- package/dist/skills/git/references/tracker/github/fetch-issue.md +36 -1
- package/dist/skills/git/references/tracker/github/fetch-issues-batch.md +47 -1
- package/dist/skills/git/references/tracker/github/gather-release-evidence.md +25 -0
- package/dist/skills/git/references/tracker/github/manage-debt.md +21 -1
- package/dist/skills/git/references/tracker/github/post-wave-report.md +15 -1
- package/dist/skills/git/references/tracker/github/setup-task.md +41 -1
- package/dist/skills/git/references/tracker/jira/associate-release.md +24 -0
- package/dist/skills/git/references/tracker/jira/backlink-shipped-issues.md +31 -1
- package/dist/skills/git/references/tracker/jira/create-release.md +30 -1
- package/dist/skills/git/references/tracker/jira/ensure-pr-ready.md +89 -2
- package/dist/skills/git/references/tracker/jira/ensure-traceable-issue.md +16 -1
- package/dist/skills/git/references/tracker/jira/fetch-issue.md +36 -1
- package/dist/skills/git/references/tracker/jira/fetch-issues-batch.md +47 -1
- package/dist/skills/git/references/tracker/jira/gather-release-evidence.md +25 -0
- package/dist/skills/git/references/tracker/jira/manage-debt.md +21 -1
- package/dist/skills/git/references/tracker/jira/post-wave-report.md +15 -1
- package/dist/skills/git/references/tracker/jira/setup-task.md +41 -1
- package/dist/skills/git/references/tracker/linear/associate-release.md +24 -0
- package/dist/skills/git/references/tracker/linear/backlink-shipped-issues.md +31 -1
- package/dist/skills/git/references/tracker/linear/create-release.md +30 -1
- package/dist/skills/git/references/tracker/linear/ensure-pr-ready.md +89 -2
- package/dist/skills/git/references/tracker/linear/ensure-traceable-issue.md +16 -1
- package/dist/skills/git/references/tracker/linear/fetch-issue.md +36 -1
- package/dist/skills/git/references/tracker/linear/fetch-issues-batch.md +47 -1
- package/dist/skills/git/references/tracker/linear/gather-release-evidence.md +25 -0
- package/dist/skills/git/references/tracker/linear/manage-debt.md +21 -1
- package/dist/skills/git/references/tracker/linear/post-wave-report.md +15 -1
- package/dist/skills/git/references/tracker/linear/setup-task.md +41 -1
- package/dist/targets/claude-code/agent-type-owner.js +164 -0
- package/dist/targets/claude-code/behavior-install.js +111 -0
- package/dist/targets/claude-code/installer.js +177 -77
- package/dist/targets/claude-code/learning-install.js +9 -1
- package/dist/targets/claude-code/tracker-install.js +33 -16
- package/dist/targets/claude-code/tracker-servers.js +107 -0
- package/package.json +4 -3
- package/src/assets/agents/_partials/_code.mds +109 -0
- package/src/assets/agents/code.mds +18 -222
- package/src/assets/agents/{learning.md → curate.md} +22 -72
- package/src/assets/agents/{diagnose.mds → debug.mds} +4 -4
- package/src/assets/agents/design.mds +0 -1
- package/src/assets/agents/evaluate.md +11 -5
- package/src/assets/agents/explore.md +58 -0
- package/src/assets/agents/fix.mds +113 -0
- package/src/assets/agents/git.mds +31 -693
- package/src/assets/agents/{scrutinize.mds → harden.mds} +9 -6
- package/src/assets/agents/knowledge.mds +8 -2
- package/src/assets/agents/{simplify.md → polish.md} +7 -4
- package/src/assets/agents/refactor.mds +81 -0
- package/src/assets/agents/research.mds +6 -0
- package/src/assets/agents/review.mds +0 -4
- package/src/assets/agents/skim.mds +4 -0
- package/src/assets/agents/synthesize.md +26 -352
- package/src/assets/agents/test.md +10 -2
- package/src/assets/agents/tracker.md +20 -7
- package/src/assets/agents/triage.mds +8 -1
- package/src/assets/agents/validate.md +5 -0
- package/src/assets/commands/_partials/_compliance.mds +36 -0
- package/src/assets/commands/_partials/_decisions.mds +26 -6
- package/src/assets/commands/_partials/_engine.mds +17 -17
- 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 +5 -3
- package/src/assets/commands/_partials/_roster.mds +6 -5
- package/src/assets/commands/_partials/_wave.mds +2 -2
- package/src/assets/commands/bug-analysis.mds +10 -10
- package/src/assets/commands/code-review.mds +12 -22
- package/src/assets/commands/debug.mds +24 -2
- package/src/assets/commands/dynamic-build.mds +34 -51
- package/src/assets/commands/dynamic-plan.mds +4 -3
- package/src/assets/commands/dynamic-tickets.mds +5 -4
- package/src/assets/commands/explore.mds +1 -1
- package/src/assets/commands/implement.mds +108 -201
- package/src/assets/commands/plan.mds +19 -44
- package/src/assets/commands/release.mds +8 -3
- package/src/assets/commands/research.mds +14 -7
- package/src/assets/commands/resolve.mds +37 -82
- package/src/assets/commands/self-review.mds +27 -27
- package/src/assets/mds/.mdsroot +4 -0
- package/src/assets/mds/git/_ops.mds +383 -0
- package/src/assets/mds/git/_ops_pr.mds +201 -0
- package/src/assets/mds/git/_ops_steps.mds +147 -0
- package/src/assets/mds/git/_pr.mds +45 -50
- package/src/assets/mds/git/_references.mds +6 -3
- package/src/assets/mds/tracker/_common.mds +5 -5
- package/src/assets/mds/tracker/_contract.mds +4 -3
- package/src/assets/mds/tracker/_github.mds +60 -14
- package/src/assets/mds/tracker/_jira.mds +60 -14
- package/src/assets/mds/tracker/_linear.mds +60 -14
- package/src/assets/mds/tracker/_steps.mds +10 -9
- package/src/assets/rules/behavior.md +6 -0
- package/src/assets/scripts/hooks/assets/orchestrator-charter.md +5 -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 -10
- 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 +37 -0
- 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/curate/maintain.md +71 -0
- package/src/assets/skills/agent-references/references/synthesize/bug-analysis.md +71 -0
- package/src/assets/skills/agent-references/references/synthesize/design.md +36 -0
- package/src/assets/skills/agent-references/references/synthesize/exploration.md +38 -0
- package/src/assets/skills/agent-references/references/synthesize/planning.md +60 -0
- package/src/assets/skills/agent-references/references/synthesize/research.md +61 -0
- package/src/assets/skills/agent-references/references/synthesize/review.md +76 -0
- package/src/assets/skills/apply-decisions/SKILL.md +6 -4
- package/src/assets/skills/compliance/SKILL.md +1 -1
- package/src/assets/skills/docs-framework/SKILL.md +81 -84
- package/src/assets/skills/docs-framework/references/patterns.md +14 -25
- package/src/assets/skills/docs-framework/references/violations.md +7 -7
- package/src/assets/skills/gap-analysis/SKILL.md +0 -16
- package/src/assets/skills/gap-analysis/references/compliance.md +19 -0
- 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/dist/skills/git/references/pr/ensure-pr-ready.md +0 -24
package/dist/commands/plan.md
CHANGED
|
@@ -148,19 +148,19 @@ and using its one-line output. If the command fails (outside a git repository),
|
|
|
148
148
|
|
|
149
149
|
When the settings line says `LEARNING=off`, set `DECISIONS_CONTEXT` to `(none)` and skip this step, locating no ledger and reading no index.
|
|
150
150
|
|
|
151
|
-
The decisions ledger belongs to the repository, not to one checkout:
|
|
151
|
+
The decisions ledger belongs to the repository, not to one checkout: a linked worktree reads the main worktree's copy, a subdirectory session the repository root's. Locate it with ONE git call, run from the start directory — `WORKTREE_PATH` if provided, otherwise cwd (`devflow:worktree-support`):
|
|
152
152
|
|
|
153
153
|
```bash
|
|
154
154
|
git -C "{start}" rev-parse --path-format=absolute --show-toplevel --git-common-dir
|
|
155
155
|
```
|
|
156
156
|
|
|
157
|
-
Line 1 is the checkout's toplevel, line 2 the
|
|
157
|
+
Line 1 is the checkout's toplevel, line 2 the common git directory. A git older than 2.31 echoes `--path-format=absolute` back as a line of its own first. `{ledger}` is the first that applies:
|
|
158
158
|
|
|
159
159
|
1. **The main worktree** — line 2 without its trailing `/.git`, when the output is exactly two lines each beginning with `/`, line 2 ends in `/.git`, and the directory left once it is removed is not your home directory and contains a `.devflow/` directory.
|
|
160
160
|
2. **The toplevel** — line 1, or on an older git the line after the echoed flag.
|
|
161
161
|
3. **The start directory itself** — when the command failed or printed no absolute toplevel (outside a git repository).
|
|
162
162
|
|
|
163
|
-
This is the rule the learning hooks apply
|
|
163
|
+
This is the rule the learning hooks apply, so you read the index the Curate agent writes.
|
|
164
164
|
|
|
165
165
|
**Step 1 — Read the pre-rendered index:**
|
|
166
166
|
|
|
@@ -169,13 +169,17 @@ Attempt to read `{ledger}/.devflow/learning/index.md`.
|
|
|
169
169
|
- If the file exists and contains non-empty content: use that content as `DECISIONS_CONTEXT`.
|
|
170
170
|
- If the file is absent or empty: set `DECISIONS_CONTEXT` to `(none)`.
|
|
171
171
|
|
|
172
|
-
The index is one direct file read, written at render time by `render-decisions.cjs`
|
|
172
|
+
The index is one direct file read, written at render time by `render-decisions.cjs` — no `.cjs` script runs here.
|
|
173
173
|
|
|
174
|
-
**Step 2 —
|
|
174
|
+
**Step 2 — Slice the index, then hand it on:**
|
|
175
175
|
|
|
176
|
-
When `DECISIONS_CONTEXT` is not `(none)`,
|
|
176
|
+
When `DECISIONS_CONTEXT` is not `(none)`, hand it only to the agents whose contract declares it.
|
|
177
177
|
|
|
178
|
-
|
|
178
|
+
Hand each agent that takes `DECISIONS_CONTEXT` a slice, not the whole index: the index lines whose title, scope or area touch the files and task it works on, verbatim, led by `(slice: N of M entries — full index: <absolute index path>)` and closed by the index footer. When unsure, include the line. Siblings over one diff share ONE slice.
|
|
179
|
+
|
|
180
|
+
Those agents follow `devflow:apply-decisions`. A host that uses the index in its own thread says so in its own step.
|
|
181
|
+
|
|
182
|
+
This produces a compact index of active ADR/PF entries. Pass the Skim agent context to all subsequent agents. Pass `DECISIONS_CONTEXT` to the Design agents of the gap-analysis phase as one shared slice — prior decisions constrain design, known pitfalls inform gap analysis. Design agents use `devflow:apply-decisions` to Read full entry bodies on demand.
|
|
179
183
|
|
|
180
184
|
### Load Feature Knowledge
|
|
181
185
|
|
|
@@ -199,7 +203,7 @@ If `index.md` exists and contains at least one entry line, use it for relevance
|
|
|
199
203
|
|
|
200
204
|
**Step 2 — Fallback: glob frontmatter (if `index.md` is absent or empty):**
|
|
201
205
|
|
|
202
|
-
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).
|
|
203
207
|
|
|
204
208
|
**Step 3 — Pick relevant KBs:**
|
|
205
209
|
|
|
@@ -230,7 +234,7 @@ Headings: L5 Rules · L40 Overview · L62 Anti-Patterns · L118 Key Files
|
|
|
230
234
|
|
|
231
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)`.
|
|
232
236
|
|
|
233
|
-
**One git call, then direct reads — no `.cjs` script.**
|
|
237
|
+
**One git call, then direct reads — no `.cjs` script.**
|
|
234
238
|
|
|
235
239
|
Pass `FEATURE_KNOWLEDGE` to Explore and Design agents. Pass `DECISIONS_CONTEXT` to Design agents only.
|
|
236
240
|
|
|
@@ -239,7 +243,7 @@ Pass `FEATURE_KNOWLEDGE` to Explore and Design agents. Pass `DECISIONS_CONTEXT`
|
|
|
239
243
|
**Produces:** EXPLORE_OUTPUTS
|
|
240
244
|
**Requires:** SKIM_CONTEXT
|
|
241
245
|
|
|
242
|
-
Spawn 4 Explore agents **in a single message**, each with Skim agent context and `FEATURE_KNOWLEDGE: {feature_knowledge}` (from Phase 2). Include the instruction: "The FEATURE_KNOWLEDGE is a baseline — VALIDATE, EXTEND, and CORRECT it. For anything it already covers, cite its KB IDs (`{slug} KB-AP-n`) instead of restating the text. Focus on areas the feature knowledge doesn't cover and changes since it was last updated." Ask each agent for a final report of at most about 1,500 tokens: findings with file:line references, not file dumps.
|
|
246
|
+
Spawn 4 `Agent(subagent_type="Explore")` agents **in a single message**, each with Skim agent context and `FEATURE_KNOWLEDGE: {feature_knowledge}` (from Phase 2). Include the instruction: "The FEATURE_KNOWLEDGE is a baseline — VALIDATE, EXTEND, and CORRECT it. For anything it already covers, cite its KB IDs (`{slug} KB-AP-n`) instead of restating the text. Focus on areas the feature knowledge doesn't cover and changes since it was last updated." Ask each agent for a final report of at most about 1,500 tokens: findings with file:line references, not file dumps.
|
|
243
247
|
|
|
244
248
|
| Focus | Thoroughness | Find |
|
|
245
249
|
|-------|-------------|------|
|
|
@@ -301,16 +305,21 @@ Each Design agent receives:
|
|
|
301
305
|
- Exploration synthesis from Phase 4
|
|
302
306
|
- Skim agent context from Phase 2
|
|
303
307
|
- `DECISIONS_CONTEXT` (index from Phase 2)
|
|
304
|
-
- `
|
|
308
|
+
- `COMPLIANCE_FOCUS_DIRECTIVE` (compliance focus only)
|
|
305
309
|
- Multi-issue: all issue bodies
|
|
306
310
|
|
|
311
|
+
**Set the compliance focus directive** from `COMPLIANCE_FRAMEWORKS`. `COMPLIANCE_FOCUS_DIRECTIVE` is this one line, with `<ids>` replaced by the value of `COMPLIANCE_FRAMEWORKS`; only the compliance focus's spawn carries it:
|
|
312
|
+
|
|
313
|
+
> For this compliance focus, invoke Skill(skill="devflow:compliance") and load references/{id}.md only for the ids in <ids> (none: generic controls only); never fabricate guidance for a framework you were not given.
|
|
314
|
+
|
|
307
315
|
```
|
|
308
316
|
Agent(subagent_type="Design"):
|
|
309
317
|
"Mode: gap-analysis
|
|
310
318
|
Focus: {completeness|architecture|security|performance|compliance|consistency|dependencies}
|
|
311
319
|
DECISIONS_CONTEXT: {decisions_context}
|
|
312
320
|
FEATURE_KNOWLEDGE: {feature_knowledge}
|
|
313
|
-
|
|
321
|
+
{COMPLIANCE_FOCUS_DIRECTIVE} (compliance focus only)
|
|
322
|
+
Resolve `${CLAUDE_CONFIG_DIR:-$HOME/.claude}` in Bash, then Read `<that directory>/skills/devflow:gap-analysis/references/compliance.md` with the Read tool and apply it as your focus patterns. (compliance focus only)
|
|
314
323
|
Artifacts:
|
|
315
324
|
Feature/Issues: {feature description or issue bodies}
|
|
316
325
|
Exploration synthesis: {Phase 4 output}
|
|
@@ -372,7 +381,7 @@ User can:
|
|
|
372
381
|
**Produces:** IMPL_EXPLORE_OUTPUTS
|
|
373
382
|
**Requires:** SKIM_CONTEXT, ACCEPTED_SCOPE
|
|
374
383
|
|
|
375
|
-
Spawn 4 Explore agents **in a single message**, each with Skim agent context + accepted scope. Ask each agent for a final report of at most about 1,500 tokens: findings with file:line references, not file dumps.
|
|
384
|
+
Spawn 4 `Agent(subagent_type="Explore")` agents **in a single message**, each with Skim agent context + accepted scope. Ask each agent for a final report of at most about 1,500 tokens: findings with file:line references, not file dumps.
|
|
376
385
|
|
|
377
386
|
| Focus | Thoroughness | Find |
|
|
378
387
|
|-------|-------------|------|
|
|
@@ -480,8 +489,9 @@ Use AskUserQuestion to present:
|
|
|
480
489
|
|
|
481
490
|
User can:
|
|
482
491
|
- **Accept** — proceed to output phases
|
|
483
|
-
- **Revise** — re-run phases 10-12 with new constraints
|
|
492
|
+
- **Revise** — when fewer than 2 revisions have run, re-run phases 10-12 with new constraints. Budget: at most 2 revisions, counted over the whole run
|
|
484
493
|
- **Cancel** — stop gracefully, no artifact written
|
|
494
|
+
- **Restart /plan with these constraints** — offered in place of Revise once 2 revisions have run: stop gracefully, write no artifact, and print the constraints given so far for a fresh `/plan` run
|
|
485
495
|
|
|
486
496
|
**MANDATORY**: Do not write design artifact until Gate 2 is confirmed.
|
|
487
497
|
|
|
@@ -496,8 +506,10 @@ User can:
|
|
|
496
506
|
|
|
497
507
|
**Store design artifact:**
|
|
498
508
|
|
|
499
|
-
**
|
|
500
|
-
|
|
509
|
+
**Load `devflow:docs-framework`** — Load via Skill tool: `devflow:docs-framework`, here and not earlier, so a run that stops before this phase never pays for it. If it fails to load, continue with the paths below.
|
|
510
|
+
|
|
511
|
+
**Pre-compute the artifact path** (it never changes after this) by the skill's rules: `{topic-slug}` is its topic slug of the feature title, the same value as the artifact's `slug:` frontmatter, and `{YYYY-MM-DD_HHMM}` is the local time, computed once:
|
|
512
|
+
- If one issue: `{worktree}/.devflow/docs/design/{ISSUE_ID}-{topic-slug}.{YYYY-MM-DD_HHMM}.md` (e.g. `42-jwt-auth.2026-04-07_1430.md`)
|
|
501
513
|
- If multi-issue: `{worktree}/.devflow/docs/design/multi-{topic-slug}.{YYYY-MM-DD_HHMM}.md`, frontmatter `issue: pending` — a batch fetch returns no issue ID to name it by
|
|
502
514
|
- If no issue: `{worktree}/.devflow/docs/design/{topic-slug}.{YYYY-MM-DD_HHMM}.md`
|
|
503
515
|
|
|
@@ -626,60 +638,33 @@ Display completion summary:
|
|
|
626
638
|
│
|
|
627
639
|
├─ Block 1: Requirements Discovery
|
|
628
640
|
│ ├─ Phase 1: GATE 0 - Requirements Discovery ⛔ MANDATORY
|
|
641
|
+
│ │ ├─ Git agent (fetch-issue / fetch-issues-batch) - issue mode only
|
|
629
642
|
│ │ └─ AskUserQuestion: Validate interpretation
|
|
630
643
|
│ ├─ Phase 2: Orient + Load Decisions
|
|
631
|
-
│ │ ├─ Skim agent (codebase context)
|
|
632
|
-
│ │ └─ Read index.md → DECISIONS_CONTEXT
|
|
633
644
|
│ ├─ Phase 3: Explore Requirements (PARALLEL)
|
|
634
|
-
│ │ ├─ Explore: User perspective
|
|
635
|
-
│ │ ├─ Explore: Similar features
|
|
636
|
-
│ │ ├─ Explore: Constraints
|
|
637
|
-
│ │ └─ Explore: Failure modes
|
|
638
645
|
│ └─ Phase 4: Synthesize Exploration
|
|
639
|
-
│ └─ Synthesize agent (mode: exploration)
|
|
640
646
|
│
|
|
641
647
|
├─ Block 2: Gap Analysis
|
|
642
648
|
│ ├─ Phase 5: Gap Analysis (PARALLEL)
|
|
643
|
-
│ │ ├─ Design agent: completeness
|
|
644
|
-
│ │ ├─ Design agent: architecture
|
|
645
|
-
│ │ ├─ Design agent: security
|
|
646
|
-
│ │ ├─ Design agent: performance
|
|
647
|
-
│ │ ├─ Design agent: compliance (only when COMPLIANCE_ACTIVE)
|
|
648
|
-
│ │ ├─ Design agent: consistency (multi-issue only)
|
|
649
|
-
│ │ └─ Design agent: dependencies (multi-issue only)
|
|
650
649
|
│ └─ Phase 6: Synthesize Gap Analysis
|
|
651
|
-
│ └─ Synthesize agent (mode: design)
|
|
652
650
|
│
|
|
653
651
|
├─ Block 3: Scope Approval
|
|
654
652
|
│ └─ Phase 7: GATE 1 - Validate Scope + Gaps ⛔ MANDATORY
|
|
655
|
-
│ └─ AskUserQuestion: Confirm scope and gap resolutions
|
|
656
653
|
│
|
|
657
654
|
├─ Block 4: Implementation Design
|
|
658
655
|
│ ├─ Phase 8: Explore Implementation (PARALLEL)
|
|
659
|
-
│ │ ├─ Explore: Architecture
|
|
660
|
-
│ │ ├─ Explore: Integration
|
|
661
|
-
│ │ ├─ Explore: Reusable code
|
|
662
|
-
│ │ └─ Explore: Edge cases
|
|
663
656
|
│ ├─ Phase 9: Synthesize Implementation Exploration
|
|
664
|
-
│ │ └─ Synthesize agent (mode: exploration)
|
|
665
657
|
│ ├─ Phase 10: Plan Implementation (PARALLEL)
|
|
666
|
-
│ │ ├─ Plan: Implementation steps
|
|
667
|
-
│ │ ├─ Plan: Testing strategy
|
|
668
|
-
│ │ └─ Plan: Execution strategy
|
|
669
658
|
│ └─ Phase 11: Synthesize Planning
|
|
670
|
-
│ └─ Synthesize agent (mode: planning)
|
|
671
659
|
│
|
|
672
660
|
├─ Block 5: Design Review + Approval
|
|
673
661
|
│ ├─ Phase 12: Design Review
|
|
674
|
-
│ │ └─ Design agent (mode: design-review)
|
|
675
662
|
│ └─ Phase 13: GATE 2 - Confirm Plan + Design Review ⛔ MANDATORY
|
|
676
|
-
│ └─
|
|
663
|
+
│ └─ Revise ≤ 2 → back to Phase 10; after 2: Accept / Cancel / Restart /plan
|
|
677
664
|
│
|
|
678
665
|
├─ Block 6: Output
|
|
679
666
|
│ └─ Phase 14: Output
|
|
680
|
-
│
|
|
681
|
-
│ ├─ Create tracker issue (optional)
|
|
682
|
-
│ └─ Report summary + next step
|
|
667
|
+
│ └─ Git agent (ensure-traceable-issue) - create or enrich tracker issue (optional)
|
|
683
668
|
│
|
|
684
669
|
```
|
|
685
670
|
|
|
@@ -696,6 +681,6 @@ Display completion summary:
|
|
|
696
681
|
## Error Handling
|
|
697
682
|
|
|
698
683
|
- If any agent fails, report the phase, agent type, and error
|
|
699
|
-
- If user selects "Revise" at Gate 2, loop back to Phase 10 with user's constraints
|
|
684
|
+
- If user selects "Revise" at Gate 2 and fewer than 2 revisions have run, loop back to Phase 10 with user's constraints; after the second revision Gate 2 offers Accept, Cancel or "Restart /plan with these constraints" only
|
|
700
685
|
- If user selects "Cancel" at any gate, stop gracefully without writing artifact
|
|
701
686
|
- If `{worktree}/.devflow/docs/design/` does not exist, create it in Phase 14
|
package/dist/commands/release.md
CHANGED
|
@@ -40,8 +40,6 @@ Parse from `COMMAND_INPUT`:
|
|
|
40
40
|
|
|
41
41
|
**Produces:** RELEASE_CONFIG, CONFIG_STATE (`learned` | `fresh`)
|
|
42
42
|
|
|
43
|
-
**Load Companion Skills** — Load via Skill tool: `devflow:git`. If a skill fails to load, continue without it.
|
|
44
|
-
|
|
45
43
|
**Continuation detection**: Check `.release/.progress.json`. If exists, an interrupted release is in progress. Offer user:
|
|
46
44
|
- **Resume**: continue from last checkpoint (skip phases already completed)
|
|
47
45
|
- **Restart**: clean start (delete `.release/.progress.json` and begin from Phase 1)
|
|
@@ -66,22 +64,24 @@ The accepted line is the only source of these values: the script alone folds the
|
|
|
66
64
|
|
|
67
65
|
When the settings line says `LEARNING=off`, set `DECISIONS_CONTEXT` to `(none)` and skip this step, locating no ledger and reading no index.
|
|
68
66
|
|
|
69
|
-
The decisions ledger belongs to the repository, not to one checkout:
|
|
67
|
+
The decisions ledger belongs to the repository, not to one checkout: a linked worktree reads the main worktree's copy, a subdirectory session the repository root's. Locate it with ONE git call, run from the start directory — `WORKTREE_PATH` if provided, otherwise cwd (`devflow:worktree-support`):
|
|
70
68
|
|
|
71
69
|
```bash
|
|
72
70
|
git -C "{start}" rev-parse --path-format=absolute --show-toplevel --git-common-dir
|
|
73
71
|
```
|
|
74
72
|
|
|
75
|
-
Line 1 is the checkout's toplevel, line 2 the
|
|
73
|
+
Line 1 is the checkout's toplevel, line 2 the common git directory. A git older than 2.31 echoes `--path-format=absolute` back as a line of its own first. `{ledger}` is the first that applies:
|
|
76
74
|
|
|
77
75
|
1. **The main worktree** — line 2 without its trailing `/.git`, when the output is exactly two lines each beginning with `/`, line 2 ends in `/.git`, and the directory left once it is removed is not your home directory and contains a `.devflow/` directory.
|
|
78
76
|
2. **The toplevel** — line 1, or on an older git the line after the echoed flag.
|
|
79
77
|
3. **The start directory itself** — when the command failed or printed no absolute toplevel (outside a git repository).
|
|
80
78
|
|
|
81
|
-
This is the rule the learning hooks apply
|
|
79
|
+
This is the rule the learning hooks apply, so you read the index the Curate agent writes.
|
|
82
80
|
|
|
83
81
|
Read `{ledger}/.devflow/learning/index.md`. If the file is absent or empty, set `DECISIONS_CONTEXT` to `(none)`; otherwise use the file content as `DECISIONS_CONTEXT`.
|
|
84
82
|
|
|
83
|
+
Hand each agent that takes `DECISIONS_CONTEXT` a slice, not the whole index: the index lines whose title, scope or area touch the files and task it works on, verbatim, led by `(slice: N of M entries — full index: <absolute index path>)` and closed by the index footer. When unsure, include the line. Siblings over one diff share ONE slice.
|
|
84
|
+
|
|
85
85
|
### Load Feature Knowledge
|
|
86
86
|
|
|
87
87
|
Resolve `{worktree}` as the checkout's toplevel, because feature knowledge bases are committed with the branch (D-PROMPT-ROOT): from the start directory — `WORKTREE_PATH` if provided, otherwise cwd (`devflow:worktree-support`) — run
|
|
@@ -104,7 +104,7 @@ If `index.md` exists and contains at least one entry line, use it for relevance
|
|
|
104
104
|
|
|
105
105
|
**Step 2 — Fallback: glob frontmatter (if `index.md` is absent or empty):**
|
|
106
106
|
|
|
107
|
-
Glob `{worktree}/.devflow/features/*/KNOWLEDGE.md`. For each file found, read only its YAML frontmatter block (between the opening and closing `---` delimiters).
|
|
107
|
+
Glob `{worktree}/.devflow/features/*/KNOWLEDGE.md`. For each file found, read only its YAML frontmatter block (between the opening and closing `---` delimiters).
|
|
108
108
|
|
|
109
109
|
**Step 3 — Pick relevant KBs:**
|
|
110
110
|
|
|
@@ -135,7 +135,7 @@ Headings: L5 Rules · L40 Overview · L62 Anti-Patterns · L118 Key Files
|
|
|
135
135
|
|
|
136
136
|
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)`.
|
|
137
137
|
|
|
138
|
-
**One git call, then direct reads — no `.cjs` script.**
|
|
138
|
+
**One git call, then direct reads — no `.cjs` script.**
|
|
139
139
|
|
|
140
140
|
Pass `DECISIONS_CONTEXT` and `FEATURE_KNOWLEDGE` only to agents whose contract declares them; the Validate and Git agents this command spawns do not.
|
|
141
141
|
|
|
@@ -231,10 +231,12 @@ Arm 1 or 2 ⇒ ask once, via AskUserQuestion: "{u} untraced commits{, coverage u
|
|
|
231
231
|
## Traceability exceptions
|
|
232
232
|
- `untraced` <sha12> (<author>) self-attested by @<login> at <utc>: <reason>
|
|
233
233
|
- `coverage` <bound-hit|trace-unavailable|gather-indeterminate|untraced-beyond-list> self-attested by @<login> at <utc>: <reason>
|
|
234
|
+
|
|
234
235
|
Exempt (not attested): release <n> · revert <n> · bot <n> — <sha12>, …
|
|
235
236
|
```
|
|
236
237
|
|
|
237
238
|
- One `untraced` line per listed untraced commit (≤100), its `<sha12>` and `<author>` copied from that `### TRACE_MAP` line. One `coverage` line per arm-1 cause — `bound-hit` for `bound:hit`, `gather-indeterminate` for status `INDETERMINATE` or none of the five, `trace-unavailable` for any other — plus `untraced-beyond-list` when an `…and <n> more` line closes the untraced list. The `Exempt` line counts each exempt kind (its listed lines plus its `…and <n> more`) and names every listed exempt SHA.
|
|
239
|
+
- A blank line separates the last bullet from the `Exempt` line, so Markdown renders that line as its own paragraph and not inside the bullet. Compose the block with that blank line every time.
|
|
238
240
|
- `@<login>` is `@` followed by the output of `gh api user --jq .login` when that output matches `^[A-Za-z0-9][A-Za-z0-9-]{0,38}$`. On any other output, or a failed call, it is `(login unavailable)` instead, with no `@`.
|
|
239
241
|
- `<utc>` is the output of `date -u +%Y-%m-%dT%H:%M:%SZ`.
|
|
240
242
|
- `<reason>` is the user's own words, made inert: replace every character outside printable ASCII (newlines and tabs included) with a space, remove every `<`, `>`, `` ` ``, `[`, `]`, `\`, `/`, `#`, `@`, `&` and `$`, collapse runs of spaces, trim, keep the first 200 characters, and trim again. A reason that is empty after this is no reason.
|
|
@@ -256,6 +258,9 @@ Confirm with user via AskUserQuestion before executing:
|
|
|
256
258
|
Sequential execution with progress checkpoints:
|
|
257
259
|
1. **Version bumps** — write new version to configured files
|
|
258
260
|
2. **Changelog update** — move Unreleased section to versioned entry (if configured)
|
|
261
|
+
|
|
262
|
+
**Load Companion Skills** (D-RELEASE-GIT-LOAD-LATE) — Load via Skill tool: `devflow:git`, here and not earlier: steps 1–2 only write files and `--dry-run` halts after Phase 4, so neither carries the skill. A resume that skips step 3 loads it before its next main-thread git write. If a skill fails to load, continue without it.
|
|
263
|
+
|
|
259
264
|
3. **Release commit** — `chore(release): v{VERSION}` (conventional commit)
|
|
260
265
|
4. **Tag and GitHub Release** — spawn `Agent(subagent_type="Git")` with `create-release` operation (the agent reads `.devflow/conventions.md` for tag format and release title conventions; compliance defaults when absent); only when `EVIDENCE_POLICY` is `required`, also pass `COMMIT_LIST` and `SHIPPED_ISSUES` from RELEASE_EVIDENCE, and `TRACEABILITY_EXCEPTIONS` when composed (Record, or the no-ask exempt rule), as inputs so the agent includes them in the release notes body.
|
|
261
266
|
4b. **Back-link shipped issues** (only when `EVIDENCE_POLICY` is `required`) — spawn `Agent(subagent_type="Git")` with `backlink-shipped-issues` operation, passing `VERSION` and `SHIPPED_ISSUES`; posts a marker-deduped comment on each issue (bounds and throttle enforced by the operation); degrade gracefully (D4) on any API failure — never block the release
|
|
@@ -55,19 +55,19 @@ The accepted line is the only source of these values: the script alone folds the
|
|
|
55
55
|
|
|
56
56
|
When the settings line says `LEARNING=off`, set `DECISIONS_CONTEXT` to `(none)` and skip this step, locating no ledger and reading no index.
|
|
57
57
|
|
|
58
|
-
The decisions ledger belongs to the repository, not to one checkout:
|
|
58
|
+
The decisions ledger belongs to the repository, not to one checkout: a linked worktree reads the main worktree's copy, a subdirectory session the repository root's. Locate it with ONE git call, run from the start directory — `WORKTREE_PATH` if provided, otherwise cwd (`devflow:worktree-support`):
|
|
59
59
|
|
|
60
60
|
```bash
|
|
61
61
|
git -C "{start}" rev-parse --path-format=absolute --show-toplevel --git-common-dir
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
Line 1 is the checkout's toplevel, line 2 the
|
|
64
|
+
Line 1 is the checkout's toplevel, line 2 the common git directory. A git older than 2.31 echoes `--path-format=absolute` back as a line of its own first. `{ledger}` is the first that applies:
|
|
65
65
|
|
|
66
66
|
1. **The main worktree** — line 2 without its trailing `/.git`, when the output is exactly two lines each beginning with `/`, line 2 ends in `/.git`, and the directory left once it is removed is not your home directory and contains a `.devflow/` directory.
|
|
67
67
|
2. **The toplevel** — line 1, or on an older git the line after the echoed flag.
|
|
68
68
|
3. **The start directory itself** — when the command failed or printed no absolute toplevel (outside a git repository).
|
|
69
69
|
|
|
70
|
-
This is the rule the learning hooks apply
|
|
70
|
+
This is the rule the learning hooks apply, so you read the index the Curate agent writes.
|
|
71
71
|
|
|
72
72
|
**Step 1 — Read the pre-rendered index:**
|
|
73
73
|
|
|
@@ -76,11 +76,15 @@ Attempt to read `{ledger}/.devflow/learning/index.md`.
|
|
|
76
76
|
- If the file exists and contains non-empty content: use that content as `DECISIONS_CONTEXT`.
|
|
77
77
|
- If the file is absent or empty: set `DECISIONS_CONTEXT` to `(none)`.
|
|
78
78
|
|
|
79
|
-
The index is one direct file read, written at render time by `render-decisions.cjs`
|
|
79
|
+
The index is one direct file read, written at render time by `render-decisions.cjs` — no `.cjs` script runs here.
|
|
80
80
|
|
|
81
|
-
**Step 2 —
|
|
81
|
+
**Step 2 — Slice the index, then hand it on:**
|
|
82
82
|
|
|
83
|
-
When `DECISIONS_CONTEXT` is not `(none)`,
|
|
83
|
+
When `DECISIONS_CONTEXT` is not `(none)`, hand it only to the agents whose contract declares it.
|
|
84
|
+
|
|
85
|
+
Hand each agent that takes `DECISIONS_CONTEXT` a slice, not the whole index: the index lines whose title, scope or area touch the files and task it works on, verbatim, led by `(slice: N of M entries — full index: <absolute index path>)` and closed by the index footer. When unsure, include the line. Siblings over one diff share ONE slice.
|
|
86
|
+
|
|
87
|
+
Those agents follow `devflow:apply-decisions`. A host that uses the index in its own thread says so in its own step.
|
|
84
88
|
|
|
85
89
|
Use `DECISIONS_CONTEXT` locally when framing research — prior decisions and pitfalls suggest areas to investigate. Follow `devflow:apply-decisions` to Read full entry bodies on demand. Pass `DECISIONS_CONTEXT` to each Research agent in Phase 4 so their findings can account for relevant decisions.
|
|
86
90
|
|
|
@@ -106,7 +110,7 @@ If `index.md` exists and contains at least one entry line, use it for relevance
|
|
|
106
110
|
|
|
107
111
|
**Step 2 — Fallback: glob frontmatter (if `index.md` is absent or empty):**
|
|
108
112
|
|
|
109
|
-
Glob `{worktree}/.devflow/features/*/KNOWLEDGE.md`. For each file found, read only its YAML frontmatter block (between the opening and closing `---` delimiters).
|
|
113
|
+
Glob `{worktree}/.devflow/features/*/KNOWLEDGE.md`. For each file found, read only its YAML frontmatter block (between the opening and closing `---` delimiters).
|
|
110
114
|
|
|
111
115
|
**Step 3 — Pick relevant KBs:**
|
|
112
116
|
|
|
@@ -137,7 +141,7 @@ Headings: L5 Rules · L40 Overview · L62 Anti-Patterns · L118 Key Files
|
|
|
137
141
|
|
|
138
142
|
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)`.
|
|
139
143
|
|
|
140
|
-
**One git call, then direct reads — no `.cjs` script.**
|
|
144
|
+
**One git call, then direct reads — no `.cjs` script.**
|
|
141
145
|
|
|
142
146
|
Use `FEATURE_KNOWLEDGE` **locally** for research framing. Pass to each Research agent in Phase 4.
|
|
143
147
|
|
|
@@ -145,6 +149,10 @@ Use `FEATURE_KNOWLEDGE` **locally** for research framing. Pass to each Research
|
|
|
145
149
|
|
|
146
150
|
**Produces:** RESEARCH_PLAN
|
|
147
151
|
|
|
152
|
+
**Load `devflow:docs-framework`** — Load via Skill tool: `devflow:docs-framework`, here and not earlier, so a run that stops before this phase never pays for it. If it fails to load, continue with the rules below.
|
|
153
|
+
|
|
154
|
+
Name the research directory by the skill's rules, once: `{topic-slug}` is its topic slug of the research question and `{YYYY-MM-DD_HHMM}` is the local time. When `{worktree}/.devflow/docs/research/{topic-slug}/{YYYY-MM-DD_HHMM}` already exists (a same-minute collision), the timestamp takes seconds instead, `YYYY-MM-DD_HHMMSS`. Every path of this run uses that one directory.
|
|
155
|
+
|
|
148
156
|
Analyze the research question to infer research types needed (min 2, max 5). For each type:
|
|
149
157
|
- `RESEARCH_TYPE`: `codebase | external | market | competitor | technology`
|
|
150
158
|
- `RESEARCH_QUESTION`: Focused sub-question for this type
|
|
@@ -152,8 +160,6 @@ Analyze the research question to infer research types needed (min 2, max 5). For
|
|
|
152
160
|
|
|
153
161
|
**Tool availability check**: If WebSearch/WebFetch are unavailable, restrict to `codebase` type only.
|
|
154
162
|
|
|
155
|
-
Generate topic slug from the research question (kebab-case, lowercase, no articles).
|
|
156
|
-
|
|
157
163
|
### Phase 3: Orient (Conditional)
|
|
158
164
|
|
|
159
165
|
**Produces:** ORIENT_OUTPUT
|
|
@@ -185,12 +191,17 @@ Each Research agent writes findings to disk at OUTPUT_PATH.
|
|
|
185
191
|
**Produces:** RESEARCH_SUMMARY
|
|
186
192
|
**Requires:** RESEARCH_OUTPUTS
|
|
187
193
|
|
|
188
|
-
Spawn `Agent(subagent_type="Synthesize")` in `research` mode:
|
|
189
|
-
- Reads Research agent outputs from RESEARCH_OUTPUTS paths
|
|
190
|
-
- Merges findings with trust-aware aggregation
|
|
191
|
-
- Writes `research-summary.md` to the same timestamped directory
|
|
194
|
+
Spawn `Agent(subagent_type="Synthesize")` in `research` mode. It reads the Research agent outputs from the `RESEARCH_OUTPUTS` paths, merges them with trust-aware aggregation, and writes `research-summary.md` into `RESEARCH_BASE_DIR` — the one directory of this run, which only this spawn names:
|
|
192
195
|
|
|
193
|
-
|
|
196
|
+
```
|
|
197
|
+
Agent(subagent_type="Synthesize", run_in_background=false):
|
|
198
|
+
"Mode: research
|
|
199
|
+
WORKTREE_PATH: {WORKTREE_PATH} (omit if none was provided)
|
|
200
|
+
RESEARCH_OUTPUTS: {the OUTPUT_PATH of every Research agent that wrote its file}
|
|
201
|
+
RESEARCH_BASE_DIR: {worktree}/.devflow/docs/research/{topic-slug}/{YYYY-MM-DD_HHMM}
|
|
202
|
+
Merge findings with trust-aware aggregation.
|
|
203
|
+
Output: {worktree}/.devflow/docs/research/{topic-slug}/{YYYY-MM-DD_HHMM}/research-summary.md"
|
|
204
|
+
```
|
|
194
205
|
|
|
195
206
|
### Phase 6: Present
|
|
196
207
|
|