devflow-kit 2.4.0 → 3.0.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.
Files changed (213) hide show
  1. package/CHANGELOG.md +229 -0
  2. package/README.md +111 -18
  3. package/dist/agents/git.md +822 -0
  4. package/dist/cli/commands/agents.js +6 -1
  5. package/dist/cli/commands/ambient.js +160 -145
  6. package/dist/cli/commands/attribution-prompts.js +1 -1
  7. package/dist/cli/commands/capture.js +29 -55
  8. package/dist/cli/commands/compliance-prompts.js +1 -1
  9. package/dist/cli/commands/compliance.js +48 -55
  10. package/dist/cli/commands/context.js +17 -32
  11. package/dist/cli/commands/debug.js +65 -26
  12. package/dist/cli/commands/flags.js +3 -3
  13. package/dist/cli/commands/hud.js +34 -10
  14. package/dist/cli/commands/init-seed.js +61 -27
  15. package/dist/cli/commands/init.js +649 -240
  16. package/dist/cli/commands/install-report.js +200 -0
  17. package/dist/cli/commands/knowledge/index.js +2 -2
  18. package/dist/cli/commands/knowledge/toggle.js +35 -37
  19. package/dist/cli/commands/learning.js +79 -57
  20. package/dist/cli/commands/legacy-hooks.js +11 -14
  21. package/dist/cli/commands/memory.js +134 -135
  22. package/dist/cli/commands/prompt-io.js +4 -4
  23. package/dist/cli/commands/proxy.js +23 -41
  24. package/dist/cli/commands/security.js +81 -29
  25. package/dist/cli/commands/skills.js +71 -7
  26. package/dist/cli/commands/tracker-prompts.js +145 -0
  27. package/dist/cli/commands/tracker.js +277 -0
  28. package/dist/cli/commands/uninstall.js +520 -169
  29. package/dist/cli.js +2 -0
  30. package/dist/commands/bug-analysis.md +58 -14
  31. package/dist/commands/code-review.md +110 -32
  32. package/dist/commands/debug.md +55 -11
  33. package/dist/commands/dynamic-build.md +344 -73
  34. package/dist/commands/dynamic-plan.md +77 -27
  35. package/dist/commands/dynamic-profile.md +25 -11
  36. package/dist/commands/dynamic-tickets.md +76 -15
  37. package/dist/commands/explore.md +37 -7
  38. package/dist/commands/implement.md +314 -62
  39. package/dist/commands/plan.md +146 -32
  40. package/dist/commands/release.md +64 -17
  41. package/dist/commands/research.md +34 -8
  42. package/dist/commands/resolve.md +196 -68
  43. package/dist/commands/self-review.md +45 -9
  44. package/dist/core/agent-models.js +55 -12
  45. package/dist/core/assets.js +58 -2
  46. package/dist/core/compliance-compose.js +27 -27
  47. package/dist/core/evidence-policy.js +363 -0
  48. package/dist/core/feature-config.js +200 -65
  49. package/dist/core/feature-switch.js +112 -0
  50. package/dist/core/flags.js +34 -6
  51. package/dist/core/fs-atomic.js +27 -0
  52. package/dist/core/hook-log-dirs.js +104 -0
  53. package/dist/core/learning-tuning-config.js +5 -3
  54. package/dist/core/ledger-root.js +102 -0
  55. package/dist/core/manifest.js +38 -10
  56. package/dist/core/mds-variants.js +798 -0
  57. package/dist/core/migrations.js +49 -23
  58. package/dist/core/model-discovery.js +12 -1
  59. package/dist/core/plugins.js +361 -12
  60. package/dist/core/project-paths.js +1 -18
  61. package/dist/core/proxy-log.js +8 -6
  62. package/dist/core/proxy-state.js +11 -8
  63. package/dist/core/reference-sweep.js +136 -0
  64. package/dist/core/same-location.js +25 -0
  65. package/dist/core/tracker.js +494 -0
  66. package/dist/hud/components/config-counts.js +15 -4
  67. package/dist/hud/components/learning-counts.js +14 -0
  68. package/dist/hud/config.js +2 -1
  69. package/dist/hud/cost-history.js +2 -4
  70. package/dist/hud/git.js +52 -7
  71. package/dist/hud/index.js +7 -9
  72. package/dist/skills/git/references/decision-markers.md +19 -0
  73. package/dist/skills/git/references/learn-conventions.md +56 -0
  74. package/dist/skills/git/references/pr/check-ci-status.md +14 -0
  75. package/dist/skills/git/references/pr/check-merge-readiness.md +28 -0
  76. package/dist/skills/git/references/pr/ensure-pr-ready.md +24 -0
  77. package/dist/skills/git/references/pr/fetch-review-threads.md +22 -0
  78. package/dist/skills/git/references/pr/post-resolution-summary.md +40 -0
  79. package/dist/skills/git/references/pr/post-review-summary.md +42 -0
  80. package/dist/skills/git/references/pr/resolve-review-threads.md +35 -0
  81. package/dist/skills/git/references/pr/update-pr-evidence.md +14 -0
  82. package/dist/skills/git/references/pr/validate-branch.md +18 -0
  83. package/dist/skills/git/references/publication-gate.md +13 -0
  84. package/dist/skills/git/references/tracker/_mcp.md +153 -0
  85. package/dist/skills/git/references/tracker/github/associate-release.md +18 -0
  86. package/dist/skills/git/references/tracker/github/backlink-shipped-issues.md +40 -0
  87. package/dist/skills/git/references/tracker/github/create-release.md +11 -0
  88. package/dist/skills/git/references/tracker/github/ensure-pr-ready.md +16 -0
  89. package/dist/skills/git/references/tracker/github/ensure-traceable-issue.md +69 -0
  90. package/dist/skills/git/references/tracker/github/fetch-issue.md +32 -0
  91. package/dist/skills/git/references/tracker/github/fetch-issues-batch.md +17 -0
  92. package/dist/skills/git/references/tracker/github/gather-release-evidence.md +19 -0
  93. package/dist/skills/git/references/tracker/github/manage-debt.md +101 -0
  94. package/dist/skills/git/references/tracker/github/post-wave-report.md +28 -0
  95. package/dist/skills/git/references/tracker/github/setup-task.md +26 -0
  96. package/dist/skills/git/references/tracker/jira/associate-release.md +18 -0
  97. package/dist/skills/git/references/tracker/jira/backlink-shipped-issues.md +49 -0
  98. package/dist/skills/git/references/tracker/jira/create-release.md +17 -0
  99. package/dist/skills/git/references/tracker/jira/ensure-pr-ready.md +22 -0
  100. package/dist/skills/git/references/tracker/jira/ensure-traceable-issue.md +53 -0
  101. package/dist/skills/git/references/tracker/jira/fetch-issue.md +14 -0
  102. package/dist/skills/git/references/tracker/jira/fetch-issues-batch.md +15 -0
  103. package/dist/skills/git/references/tracker/jira/gather-release-evidence.md +18 -0
  104. package/dist/skills/git/references/tracker/jira/manage-debt.md +37 -0
  105. package/dist/skills/git/references/tracker/jira/post-wave-report.md +33 -0
  106. package/dist/skills/git/references/tracker/jira/setup-task.md +31 -0
  107. package/dist/skills/git/references/tracker/linear/associate-release.md +18 -0
  108. package/dist/skills/git/references/tracker/linear/backlink-shipped-issues.md +53 -0
  109. package/dist/skills/git/references/tracker/linear/create-release.md +17 -0
  110. package/dist/skills/git/references/tracker/linear/ensure-pr-ready.md +22 -0
  111. package/dist/skills/git/references/tracker/linear/ensure-traceable-issue.md +53 -0
  112. package/dist/skills/git/references/tracker/linear/fetch-issue.md +14 -0
  113. package/dist/skills/git/references/tracker/linear/fetch-issues-batch.md +15 -0
  114. package/dist/skills/git/references/tracker/linear/gather-release-evidence.md +18 -0
  115. package/dist/skills/git/references/tracker/linear/manage-debt.md +37 -0
  116. package/dist/skills/git/references/tracker/linear/post-wave-report.md +33 -0
  117. package/dist/skills/git/references/tracker/linear/setup-task.md +32 -0
  118. package/dist/skills/git/references/trust-rule.md +7 -0
  119. package/dist/targets/claude-code/claude-paths.js +59 -57
  120. package/dist/targets/claude-code/compliance-install.js +49 -65
  121. package/dist/targets/claude-code/hooks.js +108 -3
  122. package/dist/targets/claude-code/installer.js +1187 -32
  123. package/dist/targets/claude-code/legacy.js +5 -0
  124. package/dist/targets/claude-code/post-install.js +366 -151
  125. package/dist/targets/claude-code/tracker-install.js +134 -0
  126. package/package.json +8 -6
  127. package/src/assets/agents/code.md +45 -6
  128. package/src/assets/agents/design.md +2 -1
  129. package/src/assets/agents/git.mds +825 -0
  130. package/src/assets/agents/knowledge.md +3 -3
  131. package/src/assets/agents/learning.md +11 -0
  132. package/src/assets/agents/review.md +3 -1
  133. package/src/assets/agents/synthesize.md +1 -1
  134. package/src/assets/agents/test.md +16 -5
  135. package/src/assets/agents/tracker.md +474 -0
  136. package/src/assets/agents/validate.md +7 -5
  137. package/src/assets/commands/_partials/_compliance.mds +19 -1
  138. package/src/assets/commands/_partials/_decisions.mds +15 -3
  139. package/src/assets/commands/_partials/_docs_root.mds +35 -0
  140. package/src/assets/commands/_partials/_engine.mds +13 -11
  141. package/src/assets/commands/_partials/_evidence_policy.mds +30 -0
  142. package/src/assets/commands/_partials/_factory.mds +1 -1
  143. package/src/assets/commands/_partials/_knowledge.mds +27 -9
  144. package/src/assets/commands/_partials/_plan_contract.mds +22 -7
  145. package/src/assets/commands/_partials/_preamble.mds +2 -2
  146. package/src/assets/commands/_partials/_publication.mds +8 -2
  147. package/src/assets/commands/_partials/_settings.mds +28 -0
  148. package/src/assets/commands/_partials/_ticket_template.mds +3 -2
  149. package/src/assets/commands/_partials/_tracker.mds +18 -0
  150. package/src/assets/commands/_partials/_wave.mds +16 -10
  151. package/src/assets/commands/bug-analysis.mds +31 -19
  152. package/src/assets/commands/code-review.mds +67 -41
  153. package/src/assets/commands/debug.mds +13 -7
  154. package/src/assets/commands/dynamic-build.mds +274 -66
  155. package/src/assets/commands/dynamic-plan.mds +50 -23
  156. package/src/assets/commands/dynamic-profile.mds +24 -11
  157. package/src/assets/commands/dynamic-tickets.mds +63 -16
  158. package/src/assets/commands/explore.mds +4 -5
  159. package/src/assets/commands/implement.mds +234 -67
  160. package/src/assets/commands/plan.mds +91 -33
  161. package/src/assets/commands/release.md +64 -17
  162. package/src/assets/commands/research.mds +11 -9
  163. package/src/assets/commands/resolve.mds +150 -78
  164. package/src/assets/commands/self-review.mds +24 -25
  165. package/src/assets/mds/git/_pr.mds +331 -0
  166. package/src/assets/mds/git/_references.mds +135 -0
  167. package/src/assets/mds/tracker/_common.mds +156 -0
  168. package/src/assets/mds/tracker/_github.mds +472 -0
  169. package/src/assets/mds/tracker/_jira.mds +407 -0
  170. package/src/assets/mds/tracker/_linear.mds +449 -0
  171. package/src/assets/mds/tracker/_mcp.mds +305 -0
  172. package/src/assets/scripts/hooks/assets/orchestrator-charter.md +5 -8
  173. package/src/assets/scripts/hooks/background-memory-update +40 -19
  174. package/src/assets/scripts/hooks/capture-prompt +18 -8
  175. package/src/assets/scripts/hooks/capture-question +18 -8
  176. package/src/assets/scripts/hooks/capture-turn +27 -13
  177. package/src/assets/scripts/hooks/debug-trace +11 -6
  178. package/src/assets/scripts/hooks/ensure-devflow-init +33 -6
  179. package/src/assets/scripts/hooks/ensure-proxy +9 -8
  180. package/src/assets/scripts/hooks/ensure-root-gitignore +236 -60
  181. package/src/assets/scripts/hooks/git-marker +48 -0
  182. package/src/assets/scripts/hooks/hook-log-init +3 -1
  183. package/src/assets/scripts/hooks/json-helper.cjs +228 -5
  184. package/src/assets/scripts/hooks/lib/project-paths.cjs +1 -20
  185. package/src/assets/scripts/hooks/log-paths +80 -0
  186. package/src/assets/scripts/hooks/memory-worker +22 -13
  187. package/src/assets/scripts/hooks/pre-compact-memory +44 -15
  188. package/src/assets/scripts/hooks/preamble +1 -4
  189. package/src/assets/scripts/hooks/queue-append +146 -28
  190. package/src/assets/scripts/hooks/resolve-project-root +101 -7
  191. package/src/assets/scripts/hooks/session-start-context +534 -20
  192. package/src/assets/scripts/hooks/session-start-memory +38 -15
  193. package/src/assets/scripts/lib/project-config.cjs +633 -0
  194. package/src/assets/scripts/pr-evidence.cjs +1961 -0
  195. package/src/assets/scripts/redact-secrets.cjs +490 -62
  196. package/src/assets/scripts/release-trace.cjs +1143 -0
  197. package/src/assets/scripts/resolve-evidence-policy.cjs +1145 -0
  198. package/src/assets/scripts/resolve-settings.cjs +1054 -0
  199. package/src/assets/scripts/verify-evidence.cjs +1822 -0
  200. package/src/assets/skills/compliance/SKILL.md +4 -2
  201. package/src/assets/skills/docs-framework/SKILL.md +11 -10
  202. package/src/assets/skills/docs-framework/references/patterns.md +10 -17
  203. package/src/assets/skills/gap-analysis/SKILL.md +2 -2
  204. package/src/assets/skills/git/SKILL.md +8 -78
  205. package/src/assets/skills/git/references/github-api.md +179 -141
  206. package/src/assets/skills/git/references/patterns.md +11 -6
  207. package/src/assets/skills/review-methodology/SKILL.md +1 -1
  208. package/src/assets/skills/review-methodology/references/patterns.md +6 -61
  209. package/src/assets/skills/review-methodology/references/violations.md +14 -22
  210. package/src/assets/skills/worktree-support/SKILL.md +1 -1
  211. package/src/assets/skills/worktree-support/references/roots.md +29 -0
  212. package/src/targets/claude-code/templates/managed-settings.json +25 -9
  213. package/src/assets/agents/git.md +0 -938
@@ -4,8 +4,8 @@ output-dir: dist/commands
4
4
  ---
5
5
  @import { knowledge_load } from "./_partials/_knowledge.mds"
6
6
  @import { decisions_load } from "./_partials/_decisions.mds"
7
- @import { compliance_gate } from "./_partials/_compliance.mds"
8
-
7
+ @import { docs_root } from "./_partials/_docs_root.mds"
8
+ @import { evidence_policy } from "./_partials/_evidence_policy.mds"
9
9
  # Bug Analysis Command
10
10
 
11
11
  Run a proactive bug analysis on the current branch by combining static analysis tools with parallel semantic analyzers, then synthesizing results into an actionable bug report. Supports incremental analysis, timestamped report directories, and `/resolve` compatibility.
@@ -22,17 +22,29 @@ Run a proactive bug analysis on the current branch by combining static analysis
22
22
 
23
23
  ### Phase 1: Pre-flight
24
24
 
25
- **Produces:** BRANCH_INFO, PR_DESCRIPTION, COMPLIANCE_SKILL_INSTALLED
25
+ **Produces:** BRANCH_INFO, PR_DESCRIPTION, EVIDENCE_POLICY, ISSUE_REQUIRED, APPLY_CONVENTIONS, REQUIRE_NON_AUTHOR_APPROVAL
26
+
27
+ {{evidence_policy()}}
28
+
29
+ {{docs_root()}}
30
+
31
+ Render the test-plan block from `/implement`'s evidence file, and from nothing else:
32
+ 1. `branch_slug` is `git branch --show-current` with every `/` replaced by `-`.
33
+ 2. Only when `branch_slug` matches `^[A-Za-z0-9._-]{1,200}$` and the file exists, run (the path double-quoted):
34
+
35
+ ```bash
36
+ node "$HOME/.devflow/scripts/verify-evidence.cjs" render --plan "{worktree}/.devflow/docs/evidence-{branch_slug}.md"; echo "exit=$?"
37
+ ```
26
38
 
27
- {compliance_gate()}
28
- Reuse this result for every downstream phase.
39
+ 3. On `exit=0`, `PR_TEST_PLAN_BLOCK` is its stdout byte for byte without that `exit=` line; in every other case it is `(none)`. Nothing here waits on it: the Git agent pastes it only behind its own check, and only into a PR it creates.
29
40
 
30
41
  Spawn Git agent:
31
42
 
32
43
  ```
33
44
  Agent(subagent_type="Git", run_in_background=false):
34
45
  "OPERATION: ensure-pr-ready
35
- COMPLIANCE: {COMPLIANCE_SKILL_INSTALLED ? "enabled" : "(none)"}
46
+ PR_TEST_PLAN_BLOCK: {PR_TEST_PLAN_BLOCK verbatim, or (none)}
47
+ APPLY_CONVENTIONS: {APPLY_CONVENTIONS}
36
48
  Validate branch, commit if needed, push, create PR if needed.
37
49
  Return: branch, base_branch, branch-slug, PR#"
38
50
  ```
@@ -54,16 +66,16 @@ If `pr_number` is absent or the command fails, set `PR_DESCRIPTION` to `(none)`.
54
66
  **Produces:** DIFF_RANGE, ANALYSIS_DIR
55
67
  **Requires:** BRANCH_INFO
56
68
 
57
- 1. Check `.devflow/docs/bug-analysis/\{branch-slug\}/.last-analysis-head`:
69
+ 1. Check `{worktree}/.devflow/docs/bug-analysis/{branch-slug}/.last-analysis-head`:
58
70
  - **If exists AND `--full` NOT set:**
59
71
  - Read the SHA from the file
60
- - Verify reachable: `git cat-file -t \{sha\}` — if exit code non-zero (rebase invalidated SHA), fall through to full
72
+ - Verify reachable: `git cat-file -t {sha}` — if exit code non-zero (rebase invalidated SHA), fall through to full
61
73
  - If SHA == current HEAD → "No new commits since last analysis. Use --full for a full re-analysis." Stop.
62
- - Set `DIFF_RANGE` to `\{sha\}...HEAD`
74
+ - Set `DIFF_RANGE` to `{sha}...HEAD`
63
75
  - **If not exists, unreachable SHA, or `--full`:**
64
- - Set `DIFF_RANGE` to `\{base_branch\}...HEAD`
76
+ - Set `DIFF_RANGE` to `{base_branch}...HEAD`
65
77
  2. Generate timestamp: `YYYY-MM-DD_HHMM`. If directory already exists (same-minute collision), append seconds (`YYYY-MM-DD_HHMMSS`).
66
- 3. Create timestamped analysis directory: `mkdir -p .devflow/docs/bug-analysis/\{branch-slug\}/\{timestamp\}/`
78
+ 3. Create timestamped analysis directory: `mkdir -p "{worktree}/.devflow/docs/bug-analysis/{branch-slug}/{timestamp}/"`
67
79
  4. Set `ANALYSIS_DIR` to that path.
68
80
 
69
81
  #### Step 2b: Check Changed Files
@@ -148,9 +160,9 @@ Parse `CODEQL_SARIF` → extract findings. If database creation fails, `CODEQL_E
148
160
 
149
161
  | Tool | File:Line | CWE | Severity | Title | Description |
150
162
  |------|-----------|-----|----------|-------|-------------|
151
- | \{tool\} | \{file\}:\{line\} | \{CWE or —\} | \{CRITICAL/HIGH/MEDIUM/LOW\} | \{title\} | \{description truncated to 200 chars\} |
163
+ | {tool} | {file}:{line} | {CWE or —} | {CRITICAL/HIGH/MEDIUM/LOW} | {title} | {description truncated to 200 chars} |
152
164
 
153
- Write ALL raw findings to `\{ANALYSIS_DIR\}/static-findings.md`. Set `STATIC_FINDINGS` to the top-50 table.
165
+ Write ALL raw findings to `{ANALYSIS_DIR}/static-findings.md`. Set `STATIC_FINDINGS` to the top-50 table.
154
166
 
155
167
  If no tool produced findings: set `STATIC_FINDINGS` to `(none)`.
156
168
 
@@ -160,15 +172,15 @@ If no tool produced findings: set `STATIC_FINDINGS` to `(none)`.
160
172
 
161
173
  #### Decisions Index
162
174
 
163
- {decisions_load()}
175
+ {{decisions_load()}}
164
176
 
165
177
  #### Feature Knowledge
166
178
 
167
- {knowledge_load()}
179
+ {{knowledge_load()}}
168
180
 
169
181
  #### Plan Artifact
170
182
 
171
- 1. List `.devflow/docs/design/*.md` — sort descending by filename (timestamps are naturally sortable), scan the 10 most recent
183
+ 1. List `{worktree}/.devflow/docs/design/*.md` — sort descending by filename (timestamps are naturally sortable), scan the 10 most recent
172
184
  2. Read the most recent file if it exists
173
185
  3. Extract `## Acceptance Criteria` section → parse into table: `| ID | Criterion | Type | Testable Condition |`
174
186
  4. Set `PLAN_CONTEXT` to plan summary; `ACCEPTANCE_RULES` to the table
@@ -238,7 +250,7 @@ Output: {ANALYSIS_DIR}/bug-analysis-summary.md"
238
250
 
239
251
  **Requires:** BRANCH_INFO, ANALYSIS_DIR
240
252
 
241
- 1. Write current HEAD SHA to `.devflow/docs/bug-analysis/\{branch-slug\}/.last-analysis-head`
253
+ 1. Write current HEAD SHA to `{worktree}/.devflow/docs/bug-analysis/{branch-slug}/.last-analysis-head`
242
254
  2. Report to user:
243
255
 
244
256
  ```
@@ -289,7 +301,7 @@ Run `/resolve` to process and fix these findings.
289
301
  ├─ Phase 3: Context Loading
290
302
  │ ├─ index.md (pre-rendered) → DECISIONS_CONTEXT
291
303
  │ ├─ Feature knowledge load → FEATURE_KNOWLEDGE
292
- │ └─ .devflow/docs/design/*.md → PLAN_CONTEXT + ACCEPTANCE_RULES
304
+ │ └─ {worktree}/.devflow/docs/design/*.md → PLAN_CONTEXT + ACCEPTANCE_RULES
293
305
  │
294
306
  ├─ Phase 4: File Analysis
295
307
  │ └─ Detect active focuses (security + functional always; integration + usability conditional)
@@ -347,7 +359,7 @@ Before reporting results, verify every phase was executed:
347
359
  - [ ] Phase 3: Context Loading → DECISIONS_CONTEXT captured, FEATURE_KNOWLEDGE loaded (or `(none)`), PLAN_CONTEXT and ACCEPTANCE_RULES captured (or `(none)`)
348
360
  - [ ] Phase 4: File Analysis → ACTIVE_FOCUSES determined (security + functional always present)
349
361
  - [ ] Phase 5: Parallel Bug Analysis → ANALYZER_OUTPUTS captured per active focus; all reports written to ANALYSIS_DIR
350
- - [ ] Phase 6: Synthesis → BUG_ANALYSIS_SUMMARY written to `\{ANALYSIS_DIR\}/bug-analysis-summary.md`
362
+ - [ ] Phase 6: Synthesis → BUG_ANALYSIS_SUMMARY written to `{ANALYSIS_DIR}/bug-analysis-summary.md`
351
363
  - [ ] Phase 7: Finalize → `.last-analysis-head` updated; results displayed to user
352
364
 
353
365
  If any phase is unchecked, execute it before proceeding.
@@ -5,8 +5,8 @@ output-dir: dist/commands
5
5
  @import { knowledge_load } from "./_partials/_knowledge.mds"
6
6
  @import { decisions_load } from "./_partials/_decisions.mds"
7
7
  @import { compliance_gate } from "./_partials/_compliance.mds"
8
+ @import { evidence_policy } from "./_partials/_evidence_policy.mds"
8
9
  @import { publication_gate } from "./_partials/_publication.mds"
9
-
10
10
  # Code Review Command
11
11
 
12
12
  Run a comprehensive code review of the current branch by spawning parallel review agents, then synthesizing results into PR comments. Supports incremental reviews, timestamped report directories, and multi-worktree auto-discovery.
@@ -30,18 +30,24 @@ Run a comprehensive code review of the current branch by spawning parallel revie
30
30
 
31
31
  1. **Discover reviewable worktrees** using the `devflow:worktree-support` skill discovery algorithm:
32
32
  - Run `git worktree list --porcelain` → parse, filter (skip protected/detached/mid-rebase), dedup by branch, sort by recent commit
33
- - See `~/.claude/skills/devflow:worktree-support/SKILL.md` for the full 7-step algorithm and canonical protected branch list
33
+ - See the `devflow:worktree-support` skill for the full 7-step algorithm and canonical protected branch list
34
34
  2. **If `--path` flag provided:** use only that worktree, skip discovery
35
35
  **`--path` validation**: Before proceeding, verify the path exists as a directory and appears in `git worktree list` output. If not: report error and stop.
36
36
  3. **If only 1 reviewable worktree** (the common case): proceed as single-worktree flow — zero behavior change
37
- 4. **If multiple reviewable worktrees:** report "Found N worktrees with reviewable branches: \{list with paths and branches\}" and proceed with multi-worktree flow
37
+ 4. **If multiple reviewable worktrees:** report "Found N worktrees with reviewable branches: {list with paths and branches}" and proceed with multi-worktree flow
38
+
39
+ #### Step 0b: Resolve the compliance lens
40
+
41
+ **Produces:** COMPLIANCE_ACTIVE, COMPLIANCE_FRAMEWORKS
42
+
43
+ {{compliance_gate()}}
44
+ Keep each worktree's values for every downstream phase of that worktree.
38
45
 
39
- #### Step 0b: Resolve COMPLIANCE_SKILL_INSTALLED
46
+ #### Step 0b-ii: Resolve the evidence policy
40
47
 
41
- **Produces:** COMPLIANCE_SKILL_INSTALLED
48
+ **Produces:** EVIDENCE_POLICY, ISSUE_REQUIRED, APPLY_CONVENTIONS, REQUIRE_NON_AUTHOR_APPROVAL
42
49
 
43
- {compliance_gate()}
44
- Reuse this result for every worktree and every downstream phase.
50
+ {{evidence_policy()}}
45
51
 
46
52
  #### Step 0c: Per-Worktree Pre-Flight (Git Agent)
47
53
 
@@ -49,11 +55,21 @@ Reuse this result for every worktree and every downstream phase.
49
55
  **Requires:** WORKTREES
50
56
 
51
57
  Discover PR description guidance from plan artifact (per worktree):
52
- 1. List `\{worktree\}/.devflow/docs/design/*.md` files
58
+ 1. List `{worktree}/.devflow/docs/design/*.md` files
53
59
  2. Sort by timestamp in filename (descending -- timestamps are YYYY-MM-DD_HHMM, naturally sortable)
54
60
  3. Read the most recent file, extract `## PR Description Guidance` section
55
61
  4. If no plan files exist or section not found, set `PR_DESCRIPTION_GUIDANCE` to `(none)`
56
62
 
63
+ Render the test-plan block (per worktree) from `/implement`'s evidence file, and from nothing else:
64
+ 1. `branch_slug` is `git -C "{worktree}" branch --show-current` with every `/` replaced by `-`.
65
+ 2. Only when `branch_slug` matches `^[A-Za-z0-9._-]{1,200}$` and the file exists, run (the path double-quoted):
66
+
67
+ ```bash
68
+ node "$HOME/.devflow/scripts/verify-evidence.cjs" render --plan "{worktree}/.devflow/docs/evidence-{branch_slug}.md"; echo "exit=$?"
69
+ ```
70
+
71
+ 3. On `exit=0`, `PR_TEST_PLAN_BLOCK` is its stdout byte for byte without that `exit=` line; in every other case it is `(none)`. Nothing here waits on it: the Git agent pastes it only behind its own check, and only into a PR it creates.
72
+
57
73
  For each reviewable worktree, spawn Git agent:
58
74
 
59
75
  ```
@@ -61,7 +77,8 @@ Agent(subagent_type="Git", run_in_background=false):
61
77
  "OPERATION: ensure-pr-ready
62
78
  WORKTREE_PATH: {worktree_path} (omit if cwd)
63
79
  PR_DESCRIPTION_GUIDANCE: {pr_description_guidance}
64
- COMPLIANCE: {COMPLIANCE_SKILL_INSTALLED ? "enabled" : "(none)"}
80
+ PR_TEST_PLAN_BLOCK: {PR_TEST_PLAN_BLOCK verbatim, or (none)}
81
+ APPLY_CONVENTIONS: {APPLY_CONVENTIONS}
65
82
  Validate branch, commit if needed, push, create PR if needed.
66
83
  Return: branch, base_branch, branch-slug, PR#"
67
84
  ```
@@ -86,15 +103,15 @@ If `pr_number` is absent or the command fails, set `PR_DESCRIPTION` to `(none)`.
86
103
  For each worktree:
87
104
 
88
105
  1. Generate timestamp: `YYYY-MM-DD_HHMM`. If directory already exists (same-minute collision), append seconds (`YYYY-MM-DD_HHMMSS`).
89
- 2. Create timestamped review directory: `mkdir -p \{worktree\}/.devflow/docs/reviews/\{branch-slug\}/\{timestamp\}/`
90
- 3. Check if `\{worktree\}/.devflow/docs/reviews/\{branch-slug\}/.last-review-head` exists:
106
+ 2. Create timestamped review directory: `mkdir -p {worktree}/.devflow/docs/reviews/{branch-slug}/{timestamp}/`
107
+ 3. Check if `{worktree}/.devflow/docs/reviews/{branch-slug}/.last-review-head` exists:
91
108
  - **If yes AND `--full` NOT set:**
92
109
  - Read the SHA from the file
93
- - Verify reachable: `git -C \{worktree\} cat-file -t \{sha\}` (handles rebases — if unreachable, fallback to full)
110
+ - Verify reachable: `git -C {worktree} cat-file -t {sha}` (handles rebases — if unreachable, fallback to full)
94
111
  - Check if SHA == current HEAD → if so, skip review: "No new commits since last review. Use --full for a full re-review."
95
- - Set `DIFF_RANGE` to `\{last-review-sha\}...HEAD`
112
+ - Set `DIFF_RANGE` to `{last-review-sha}...HEAD`
96
113
  - **If no (first review), or `--full`:**
97
- - Set `DIFF_RANGE` to `\{base_branch\}...HEAD`
114
+ - Set `DIFF_RANGE` to `{base_branch}...HEAD`
98
115
 
99
116
  #### Step 0e-i: Load Prior Resolution and Count Cycles
100
117
 
@@ -102,10 +119,10 @@ For each worktree:
102
119
  **Requires:** BRANCH_INFO
103
120
 
104
121
  For each worktree, perform a single pass over timestamped directories:
105
- 1. List timestamped directories in `\{worktree\}/.devflow/docs/reviews/\{branch-slug\}/` sorted descending: `ls -1d \{worktree\}/.devflow/docs/reviews/\{branch-slug\}/20* 2>/dev/null | sort -r`
122
+ 1. List timestamped directories in `{worktree}/.devflow/docs/reviews/{branch-slug}/` sorted descending: `ls -1d {worktree}/.devflow/docs/reviews/{branch-slug}/20* 2>/dev/null | sort -r`
106
123
  2. Iterate once: accumulate CYCLE_NUMBER count for each directory containing `resolution-summary.md`; capture the first (most-recent) such directory as PRIOR_DIR.
107
124
  3. If CYCLE_NUMBER = 0: set PRIOR_RESOLUTIONS=(none), CYCLE_NUMBER=1, proceed.
108
- 4. Otherwise: set CYCLE_NUMBER = count + 1. Read `\{PRIOR_DIR\}/resolution-summary.md` as PRIOR_RESOLUTIONS.
125
+ 4. Otherwise: set CYCLE_NUMBER = count + 1. Read `{PRIOR_DIR}/resolution-summary.md` as PRIOR_RESOLUTIONS.
109
126
  5. If `--full`: still load PRIOR_RESOLUTIONS (valuable for Review agent cross-cycle awareness).
110
127
 
111
128
  #### Step 0e-ii: Convergence Assessment
@@ -116,7 +133,7 @@ For each worktree, perform a single pass over timestamped directories:
116
133
  MAX_REVIEW_CYCLES = 10
117
134
 
118
135
  1. If CYCLE_NUMBER > MAX_REVIEW_CYCLES:
119
- Warn in output: "âš ī¸ Review pipeline has run \{CYCLE_NUMBER-1\} cycles (exceeds MAX_REVIEW_CYCLES=10). Consider merging or manual inspection."
136
+ Warn in output: "âš ī¸ Review pipeline has run {CYCLE_NUMBER-1} cycles (exceeds MAX_REVIEW_CYCLES=10). Consider merging or manual inspection."
120
137
  Continue with review.
121
138
  2. Parse Statistics table from PRIOR_RESOLUTIONS:
122
139
  - Extract False Positive, Fixed, Deferred counts
@@ -125,7 +142,7 @@ MAX_REVIEW_CYCLES = 10
125
142
  - If denominator = 0: fp_ratio = 0, skip warning
126
143
  - If parsing fails: fp_ratio = 0, skip warning; note in output: "Warning: Could not parse Statistics table from prior resolution. FP ratio unavailable — convergence tracking degraded."
127
144
  3. If fp_ratio > 0.7 AND CYCLE_NUMBER >= 3:
128
- Warn in output: "âš ī¸ Convergence: \{ratio\}% false positives in cycle \{N-1\}. Consider merging or manual inspection."
145
+ Warn in output: "âš ī¸ Convergence: {ratio}% false positives in cycle {N-1}. Consider merging or manual inspection."
129
146
  Continue with review.
130
147
 
131
148
  **Decision table — Step 0e-ii paths:**
@@ -139,16 +156,16 @@ MAX_REVIEW_CYCLES = 10
139
156
  #### Step 0f: Resolve Publication Mode (Per Worktree)
140
157
 
141
158
  **Produces:** REVIEW_PUBLICATION
142
- **Requires:** WORKTREES
159
+ **Requires:** WORKTREES, EVIDENCE_POLICY
143
160
 
144
161
  For each reviewable worktree, call:
145
162
 
146
- {publication_gate()}
163
+ {{publication_gate()}}
147
164
 
148
165
  ### Phase 1: Analyze Changed Files
149
166
 
150
167
  **Produces:** REVIEW_FOCUS_LIST
151
- **Requires:** DIFF_RANGE, COMPLIANCE_SKILL_INSTALLED (from Step 0b)
168
+ **Requires:** DIFF_RANGE, COMPLIANCE_ACTIVE (from Step 0b)
152
169
 
153
170
  Per worktree, detect file types in diff using `DIFF_RANGE` to determine conditional reviews.
154
171
 
@@ -165,21 +182,29 @@ Per worktree, detect file types in diff using `DIFF_RANGE` to determine conditio
165
182
  | DB/migration files | database |
166
183
  | Dependency files changed | dependencies |
167
184
  | Docs or significant code | documentation |
168
- | COMPLIANCE_SKILL_INSTALLED AND diff touches regulated surface | compliance |
185
+ | COMPLIANCE_ACTIVE AND diff touches regulated surface | compliance |
186
+
187
+ If `COMPLIANCE_ACTIVE` AND the diff touches regulated surface (data models, auth flows, logging/observability, payments, IaC, retention): add `compliance` to REVIEW_FOCUS_LIST for this worktree.
188
+
189
+ **Language focus presence gate.** The eight language focuses — `typescript`, `react`, `accessibility`, `ui-design`, `go`, `java`, `python`, `rust` — ship with optional plugins, so their pattern skills are installed only when the user selected that plugin. Gate them by presence: for each language focus the table above would add, check whether `{claude_dir}/skills/devflow:{focus}/SKILL.md` exists, `{claude_dir}` being Claude Code's directory as the installer resolves it — `CLAUDE_CONFIG_DIR` when that is set to an absolute path, else `$HOME/.claude` (D-CLAUDE-DIR-PROMPTS). Run one read-only, silent check per candidate focus:
190
+
191
+ ```bash
192
+ d="${CLAUDE_CONFIG_DIR:-}"; case "$d" in /*) ;; *) d="$HOME/.claude" ;; esac; test -f "$d/skills/devflow:{focus}/SKILL.md"; echo "exit=$?"
193
+ ```
169
194
 
170
- If `COMPLIANCE_SKILL_INSTALLED` AND the diff touches regulated surface (data models, auth flows, logging/observability, payments, IaC, retention): add `compliance` to REVIEW_FOCUS_LIST for this worktree.
195
+ Only `exit=0` means the skill is installed. On any other result, do NOT add that focus to `REVIEW_FOCUS_LIST` and do NOT spawn a Review agent for it — the file-type condition alone never spawns a language focus. The eight core focuses are unconditional and are never presence-gated.
171
196
 
172
197
  ### Phase 1b: Load Decisions Index
173
198
 
174
- **Produces:** DECISIONS_CONTEXT, FEATURE_KNOWLEDGE, COMPLIANCE_SKILL_INSTALLED (carried from Step 0b)
199
+ **Produces:** DECISIONS_CONTEXT, FEATURE_KNOWLEDGE, COMPLIANCE_FRAMEWORKS (carried from Step 0b)
175
200
 
176
201
  **Load Companion Skills** — Load via Skill tool: `devflow:quality-gates`, `devflow:software-design`. If a skill fails to load, continue without it.
177
202
 
178
- {decisions_load()}
203
+ {{decisions_load()}}
179
204
 
180
205
  This produces a compact index of active ADR/PF entries. Pass `DECISIONS_CONTEXT` to all Review agents. Review agents use `devflow:apply-decisions` to Read full entry bodies on demand.
181
206
 
182
- {knowledge_load()}
207
+ {{knowledge_load()}}
183
208
 
184
209
  Pass `FEATURE_KNOWLEDGE` to all Review agents alongside `DECISIONS_CONTEXT`.
185
210
 
@@ -200,14 +225,14 @@ Spawn Review agents **in a single message**. Always run 8 core reviews; conditio
200
225
  | regression | ✓ | devflow:regression |
201
226
  | testing | ✓ | devflow:testing |
202
227
  | reliability | ✓ | devflow:reliability |
203
- | typescript | conditional | devflow:typescript |
204
- | react | conditional | devflow:react |
205
- | accessibility | conditional | devflow:accessibility |
206
- | ui-design | conditional | devflow:ui-design |
207
- | go | conditional | devflow:go |
208
- | java | conditional | devflow:java |
209
- | python | conditional | devflow:python |
210
- | rust | conditional | devflow:rust |
228
+ | typescript | presence-gated | devflow:typescript |
229
+ | react | presence-gated | devflow:react |
230
+ | accessibility | presence-gated | devflow:accessibility |
231
+ | ui-design | presence-gated | devflow:ui-design |
232
+ | go | presence-gated | devflow:go |
233
+ | java | presence-gated | devflow:java |
234
+ | python | presence-gated | devflow:python |
235
+ | rust | presence-gated | devflow:rust |
211
236
  | database | conditional | devflow:database |
212
237
  | dependencies | conditional | devflow:dependencies |
213
238
  | documentation | conditional | devflow:documentation |
@@ -227,6 +252,7 @@ DECISIONS_CONTEXT: {decisions_context}
227
252
  FEATURE_KNOWLEDGE: {feature_knowledge}
228
253
  PR_DESCRIPTION: <pr-description>{pr_description}</pr-description>
229
254
  PRIOR_RESOLUTIONS: <prior-resolution-summary>{prior_resolutions}</prior-resolution-summary>
255
+ COMPLIANCE_FRAMEWORKS: {COMPLIANCE_FRAMEWORKS} (compliance focus only)
230
256
  If PRIOR_RESOLUTIONS is not (none), follow Cross-Cycle Awareness in review.md.
231
257
  Follow devflow:apply-decisions to scan the index and Read full ADR/PF bodies on demand.
232
258
  Follow devflow:apply-feature-knowledge for FEATURE_KNOWLEDGE — feature-specific patterns and anti-patterns inform findings.
@@ -261,7 +287,7 @@ Output: {worktree_path}/.devflow/docs/reviews/{branch-slug}/{timestamp}/review-s
261
287
  Agent(subagent_type="Git", run_in_background=false):
262
288
  "OPERATION: post-review-summary
263
289
  PR_NUMBER: {pr_number}
264
- REVIEW_SUMMARY_PATH: {worktree_path}/.devflow/docs/reviews/{branch-slug}/{timestamp}/review-summary.md
290
+ REVIEW_SUMMARY_PATH: .devflow/docs/reviews/{branch-slug}/{timestamp}/review-summary.md
265
291
  CYCLE_NUMBER: {cycle_number}
266
292
  REVIEW_TIMESTAMP: {timestamp}
267
293
  REVIEW_PUBLICATION: {REVIEW_PUBLICATION}
@@ -274,12 +300,12 @@ Posts the consolidated review-summary comment (marker-deduped by the operation o
274
300
  **Requires:** BRANCH_INFO, REVIEW_DIR
275
301
 
276
302
  Per worktree, after successful completion:
277
- 1. Write current HEAD SHA to `\{worktree_path\}/.devflow/docs/reviews/\{branch-slug\}/.last-review-head`
303
+ 1. Write current HEAD SHA to `{worktree_path}/.devflow/docs/reviews/{branch-slug}/.last-review-head`
278
304
  2. Display results from all agents:
279
305
  - Merge recommendation (from Synthesize agent)
280
306
  - Issue counts by category (🔴 blocking / âš ī¸ should-fix / â„šī¸ pre-existing)
281
307
  - Review comment status: POSTED / POSTED+TRUNCATED (body exceeded 60k after redaction) / SKIPPED (D7 dedup) / DEGRADED (from Git)
282
- - Publication status: FULL (private repo) | FULL (config override) | STUB (public repository) | OFF (publication disabled by config) (from Git agent)
308
+ - Publication status: FULL (private repo) | FULL (config override) | STUB (public repository) | OFF (publication disabled by config) | STUB (visibility undeterminable) | STUB (evidence policy) (from Git agent)
283
309
  - Artifact paths
284
310
 
285
311
  In multi-worktree mode, report results per worktree.
@@ -291,7 +317,7 @@ In multi-worktree mode, report results per worktree.
291
317
  │
292
318
  ├─ Phase 0: Worktree Discovery & Pre-flight
293
319
  │ ├─ Step 0a: git worktree list → filter reviewable
294
- │ ├─ Step 0b: Resolve COMPLIANCE_SKILL_INSTALLED
320
+ │ ├─ Step 0b: Resolve the compliance lens
295
321
  │ ├─ Step 0c: Git agent (ensure-pr-ready) per worktree [parallel]
296
322
  │ ├─ Step 0d: Incremental detection + timestamp setup per worktree
297
323
  │ ├─ Step 0e-i: Load prior resolution-summary.md
@@ -330,19 +356,19 @@ In multi-worktree mode, report results per worktree.
330
356
  | Worktree pre-flight fails | Report failure, continue with other worktrees |
331
357
  | `--full` in multi-worktree mode | Applies to all worktrees (global modifier) |
332
358
  | Many worktrees (5+) | Report count and proceed — user manages their worktree count |
333
- | Review comment already posted | Git agent matches `<!-- devflow:review-summary cycle:\{N\} ts:\{REVIEW_TIMESTAMP\}` pair → skip silently (D7); a re-review in the same cycle (different timestamp) posts its own comment |
359
+ | 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 |
334
360
  | First review (no prior resolution) | PRIOR_RESOLUTIONS=(none), no convergence check |
335
361
  | fp_ratio denominator = 0 | fp_ratio = 0, no warning |
336
362
  | `--full` flag | Bypass incremental detection (Step 0d), still load PRIOR_RESOLUTIONS for cross-cycle awareness |
337
363
  | Parsing failure on resolution-summary.md | fp_ratio = 0, convergence tracking degraded (see Step 0e-ii) |
338
364
  | Concurrent sessions | Advisory only, each session computes independently |
339
365
  | Public repo (`auto` mode) | Git agent probes visibility, posts counts-only STUB comment; full report stays local |
340
- | `reviewPublication: off` | Git agent skips posting the review comment (OFF) |
366
+ | `reviewPublication: off` | Git agent skips posting the review comment (OFF) — except that, only when `EVIDENCE_POLICY` is `required`, Step 0f passes `stub` and a counts-only STUB comment posts |
341
367
 
342
368
  ## Backwards Compatibility
343
369
 
344
370
  - **Single worktree**: Auto-discovery finds only one worktree → proceeds exactly as before. Zero behavior change.
345
- - **Legacy flat layout**: If `.devflow/docs/reviews/\{branch-slug\}/` contains flat `*.md` files (no timestamped subdirectories), new runs create timestamped subdirectories. Old flat files remain untouched.
371
+ - **Legacy flat layout**: If `{worktree}/.devflow/docs/reviews/{branch-slug}/` contains flat `*.md` files (no timestamped subdirectories), new runs create timestamped subdirectories. Old flat files remain untouched.
346
372
 
347
373
  ## Principles
348
374
 
@@ -4,7 +4,7 @@ output-dir: dist/commands
4
4
  ---
5
5
  @import { knowledge_writeback } from "./_partials/_knowledge.mds"
6
6
  @import { decisions_load } from "./_partials/_decisions.mds"
7
-
7
+ @import { issue_ref_grammar, issue_capture_contract } from "./_partials/_tracker.mds"
8
8
  # Debug Command
9
9
 
10
10
  Investigate bugs by spawning parallel agents, each pursuing a different hypothesis. Evidence is aggregated and synthesized to identify the root cause.
@@ -14,14 +14,14 @@ Investigate bugs by spawning parallel agents, each pursuing a different hypothes
14
14
  ```
15
15
  /debug "description of bug or issue"
16
16
  /debug "function returns undefined when called with empty array"
17
- /debug #42 (investigate bug from GitHub issue)
17
+ /debug #42 (investigate bug from issue reference)
18
18
  ```
19
19
 
20
20
  ## Input
21
21
 
22
22
  `$ARGUMENTS` contains whatever follows `/debug`:
23
23
  - Bug description: "login fails after session timeout"
24
- - GitHub issue: "#42"
24
+ - Issue reference: "#42"
25
25
  - Empty: use conversation context
26
26
 
27
27
  ## Phases
@@ -32,7 +32,7 @@ Investigate bugs by spawning parallel agents, each pursuing a different hypothes
32
32
 
33
33
  **Load Companion Skills** — Load via Skill tool: `devflow:test-driven-development`, `devflow:software-design`, `devflow:testing`. If a skill fails to load, continue without it.
34
34
 
35
- {decisions_load()}
35
+ {{decisions_load()}}
36
36
 
37
37
  The orchestrator uses `DECISIONS_CONTEXT` locally when generating hypotheses (Phase 2) — prior pitfalls and decisions can suggest specific root causes to investigate. Follow `devflow:apply-decisions` to Read full entry bodies on demand. **Do NOT pass `DECISIONS_CONTEXT` to Explore investigators** — decisions context stays in the orchestrator; investigators examine code directly.
38
38
 
@@ -43,15 +43,21 @@ The orchestrator uses `DECISIONS_CONTEXT` locally when generating hypotheses (Ph
43
43
  **Produces:** HYPOTHESES, BUG_CONTEXT
44
44
  **Requires:** DECISIONS_CONTEXT
45
45
 
46
- If `$ARGUMENTS` starts with `#`, fetch the GitHub issue:
46
+ If `$ARGUMENTS` opens with a candidate issue reference, fetch the issue:
47
+
48
+ {{issue_ref_grammar()}}
47
49
 
48
50
  ```
49
51
  Agent(subagent_type="Git"):
50
52
  "OPERATION: fetch-issue
51
- ISSUE: {issue number}
53
+ ISSUE_INPUT: {issue reference}
52
54
  Return issue title, body, labels, and any linked error logs."
53
55
  ```
54
56
 
57
+ {{issue_capture_contract()}}
58
+
59
+ If the Git agent returns only a TRACEABILITY: DEGRADED line and no issue content, report that line verbatim to the user and use AskUserQuestion to request the bug description before generating any hypotheses — do not fabricate a description from the raw candidate token alone.
60
+
55
61
  Analyze the bug description (from arguments or issue) and identify 3-5 plausible hypotheses. Each hypothesis must be:
56
62
  - **Specific**: Points to a concrete mechanism (not "something is wrong")
57
63
  - **Testable**: Can be confirmed or disproved by reading code/logs
@@ -175,7 +181,7 @@ Ask user via AskUserQuestion: "Want me to implement this fix?"
175
181
  - **YES** → Load `devflow:patterns` and `devflow:test-driven-development` skills, implement the fix, then spawn `Agent(subagent_type="Simplify")` on changed files.
176
182
  - **NO** → Done. Report stands as documentation.
177
183
 
178
- {knowledge_writeback()}
184
+ {{knowledge_writeback()}}
179
185
 
180
186
  ## Architecture
181
187