@nklisch/pi-agile-workflow 0.15.3

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 (203) hide show
  1. package/.claude-plugin/plugin.json +10 -0
  2. package/.codex-plugin/plugin.json +28 -0
  3. package/CHANGELOG.md +591 -0
  4. package/README.md +107 -0
  5. package/docs/ARCHITECTURE.md +716 -0
  6. package/docs/MIGRATION.md +419 -0
  7. package/docs/PRINCIPLES.md +464 -0
  8. package/docs/ROADMAP.md +95 -0
  9. package/docs/SPEC.md +855 -0
  10. package/docs/VISION.md +106 -0
  11. package/extensions/agile-workflow.test.ts +419 -0
  12. package/extensions/agile-workflow.ts +467 -0
  13. package/hooks/hooks.json +52 -0
  14. package/hooks/scripts/prompt-context.py +628 -0
  15. package/hooks/scripts/substrate-maintainer.py +359 -0
  16. package/hooks/scripts/test_prompt_context.py +757 -0
  17. package/package.json +30 -0
  18. package/scripts/install-work-view.sh +165 -0
  19. package/scripts/tests/agent-metadata.test.sh +75 -0
  20. package/scripts/tests/bump-version.test.sh +552 -0
  21. package/scripts/tests/channel-parity.test.sh +117 -0
  22. package/scripts/tests/convert-content-integrity.test.sh +246 -0
  23. package/scripts/tests/convert-install-routing.test.sh +159 -0
  24. package/scripts/tests/install-work-view.test.sh +411 -0
  25. package/scripts/tests/pi-package-metadata.test.sh +119 -0
  26. package/scripts/tests/work-board-shim.test.sh +239 -0
  27. package/scripts/tests/work-view-dist-version.test.sh +105 -0
  28. package/scripts/work-board.sh +64 -0
  29. package/scripts/work-view.sh +423 -0
  30. package/skills/autopilot/SKILL.md +330 -0
  31. package/skills/autopilot/agents/openai.yaml +6 -0
  32. package/skills/board/SKILL.md +62 -0
  33. package/skills/board/agents/openai.yaml +6 -0
  34. package/skills/bold-refactor/SKILL.md +244 -0
  35. package/skills/bold-refactor/agents/openai.yaml +6 -0
  36. package/skills/bug-scan/SKILL.md +378 -0
  37. package/skills/bug-scan/agents/openai.yaml +6 -0
  38. package/skills/bug-scan/references/async-promises.md +119 -0
  39. package/skills/bug-scan/references/concurrency-races.md +148 -0
  40. package/skills/bug-scan/references/data-layer.md +167 -0
  41. package/skills/bug-scan/references/error-handling.md +197 -0
  42. package/skills/bug-scan/references/gate-item-template.md +94 -0
  43. package/skills/bug-scan/references/language-footguns.md +219 -0
  44. package/skills/bug-scan/references/parked-item-template.md +103 -0
  45. package/skills/bug-scan/references/report-template.md +115 -0
  46. package/skills/bug-scan/references/resource-leaks.md +199 -0
  47. package/skills/bug-scan/references/state-closures.md +148 -0
  48. package/skills/bug-scan/references/time-numbers.md +158 -0
  49. package/skills/convert/SKILL.md +1463 -0
  50. package/skills/convert/agents/openai.yaml +6 -0
  51. package/skills/convert/references/legacy-overlap-migration.md +179 -0
  52. package/skills/deep-code-scan/SKILL.md +378 -0
  53. package/skills/deep-code-scan/agents/openai.yaml +6 -0
  54. package/skills/deep-code-scan/references/artifact-ledger.md +148 -0
  55. package/skills/deep-code-scan/references/consolidation.md +91 -0
  56. package/skills/deep-code-scan/references/decomposition.md +127 -0
  57. package/skills/deep-code-scan/references/item-templates.md +263 -0
  58. package/skills/deep-code-scan/references/lane-catalog.md +129 -0
  59. package/skills/deep-code-scan/references/review-gauntlet.md +108 -0
  60. package/skills/deep-code-scan/references/scanner-brief.md +152 -0
  61. package/skills/e2e-test-design/SKILL.md +517 -0
  62. package/skills/e2e-test-design/references/anti-tautology.md +261 -0
  63. package/skills/e2e-test-design/references/service-mocks.md +234 -0
  64. package/skills/e2e-test-design/references/test-taxonomy.md +211 -0
  65. package/skills/epic-design/SKILL.md +476 -0
  66. package/skills/epicize/SKILL.md +210 -0
  67. package/skills/epicize/agents/openai.yaml +6 -0
  68. package/skills/feature-design/SKILL.md +472 -0
  69. package/skills/fix/SKILL.md +173 -0
  70. package/skills/gate-cruft/SKILL.md +258 -0
  71. package/skills/gate-docs/SKILL.md +278 -0
  72. package/skills/gate-patterns/SKILL.md +389 -0
  73. package/skills/gate-refactor/SKILL.md +408 -0
  74. package/skills/gate-security/SKILL.md +275 -0
  75. package/skills/gate-tests/SKILL.md +367 -0
  76. package/skills/groom/SKILL.md +162 -0
  77. package/skills/groom/agents/openai.yaml +6 -0
  78. package/skills/ideate/SKILL.md +185 -0
  79. package/skills/ideate/agents/openai.yaml +6 -0
  80. package/skills/implement/SKILL.md +288 -0
  81. package/skills/implement-orchestrator/SKILL.md +604 -0
  82. package/skills/park/SKILL.md +111 -0
  83. package/skills/perf-design/SKILL.md +427 -0
  84. package/skills/perf-scout/SKILL.md +404 -0
  85. package/skills/perf-scout/agents/openai.yaml +6 -0
  86. package/skills/perf-scout/references/algorithmic-and-data-structures.md +126 -0
  87. package/skills/perf-scout/references/approximation-and-precomputation.md +136 -0
  88. package/skills/perf-scout/references/caching-and-memoization.md +123 -0
  89. package/skills/perf-scout/references/compiler-runtime-and-language.md +136 -0
  90. package/skills/perf-scout/references/database-and-storage-internals.md +144 -0
  91. package/skills/perf-scout/references/distributed-systems.md +150 -0
  92. package/skills/perf-scout/references/game-engine-and-realtime.md +136 -0
  93. package/skills/perf-scout/references/gpu-and-accelerators.md +130 -0
  94. package/skills/perf-scout/references/idea-ranking.md +75 -0
  95. package/skills/perf-scout/references/io-and-batching.md +135 -0
  96. package/skills/perf-scout/references/memory-and-data-locality.md +137 -0
  97. package/skills/perf-scout/references/parallelism-and-vectorization.md +126 -0
  98. package/skills/perf-scout/references/parked-item-template.md +117 -0
  99. package/skills/perf-scout/references/peer-review-pass.md +150 -0
  100. package/skills/perf-scout/references/report-template.md +148 -0
  101. package/skills/principles/SKILL.md +678 -0
  102. package/skills/principles/references/models.md +191 -0
  103. package/skills/principles/references/subagents.md +158 -0
  104. package/skills/prose-author/SKILL.md +185 -0
  105. package/skills/refactor-conventions-creator/SKILL.md +359 -0
  106. package/skills/refactor-conventions-creator/agents/openai.yaml +6 -0
  107. package/skills/refactor-conventions-creator/references/common-structures.md +91 -0
  108. package/skills/refactor-conventions-creator/references/common-styles.md +90 -0
  109. package/skills/refactor-design/SKILL.md +384 -0
  110. package/skills/release-deploy/SKILL.md +667 -0
  111. package/skills/release-deploy/agents/openai.yaml +6 -0
  112. package/skills/research/SKILL.md +166 -0
  113. package/skills/research/agents/openai.yaml +6 -0
  114. package/skills/review/SKILL.md +267 -0
  115. package/skills/review/references/deep-review.md +98 -0
  116. package/skills/review/references/review-lenses.md +68 -0
  117. package/skills/review/references/substrate-side-effects.md +161 -0
  118. package/skills/review/references/target-resolution.md +52 -0
  119. package/skills/scope/SKILL.md +486 -0
  120. package/work-view/Cargo.lock +486 -0
  121. package/work-view/Cargo.toml +9 -0
  122. package/work-view/crates/cli/.work-view-version +1 -0
  123. package/work-view/crates/cli/Cargo.toml +18 -0
  124. package/work-view/crates/cli/src/actionable.rs +500 -0
  125. package/work-view/crates/cli/src/args.rs +792 -0
  126. package/work-view/crates/cli/src/board/assets/board.css +855 -0
  127. package/work-view/crates/cli/src/board/assets/board.js +259 -0
  128. package/work-view/crates/cli/src/board/assets/card.js +139 -0
  129. package/work-view/crates/cli/src/board/assets/components.css +290 -0
  130. package/work-view/crates/cli/src/board/assets/dependency.js +1193 -0
  131. package/work-view/crates/cli/src/board/assets/detail.js +256 -0
  132. package/work-view/crates/cli/src/board/assets/filters.js +389 -0
  133. package/work-view/crates/cli/src/board/assets/index.html +77 -0
  134. package/work-view/crates/cli/src/board/assets/kanban.js +231 -0
  135. package/work-view/crates/cli/src/board/assets/markdown.js +260 -0
  136. package/work-view/crates/cli/src/board/assets/motion.css +131 -0
  137. package/work-view/crates/cli/src/board/assets/state.js +245 -0
  138. package/work-view/crates/cli/src/board/assets/table.js +304 -0
  139. package/work-view/crates/cli/src/board/assets/tokens.css +602 -0
  140. package/work-view/crates/cli/src/board/assets/views.js +41 -0
  141. package/work-view/crates/cli/src/board/assets.rs +162 -0
  142. package/work-view/crates/cli/src/board/feed.rs +204 -0
  143. package/work-view/crates/cli/src/board/mod.rs +246 -0
  144. package/work-view/crates/cli/src/board/open.rs +144 -0
  145. package/work-view/crates/cli/src/board/server.rs +407 -0
  146. package/work-view/crates/cli/src/main.rs +195 -0
  147. package/work-view/crates/cli/src/render.rs +354 -0
  148. package/work-view/crates/cli/src/scope.rs +157 -0
  149. package/work-view/crates/cli/src/stale.rs +581 -0
  150. package/work-view/crates/cli/tests/board-js/dependency-table.test.mjs +64 -0
  151. package/work-view/crates/cli/tests/board-js/expanded-browsing.test.mjs +79 -0
  152. package/work-view/crates/cli/tests/board-js/harness-smoke.test.mjs +11 -0
  153. package/work-view/crates/cli/tests/board-js/harness.mjs +437 -0
  154. package/work-view/crates/cli/tests/board-js/kanban-detail.test.mjs +75 -0
  155. package/work-view/crates/cli/tests/board-js/markdown-filter.test.mjs +60 -0
  156. package/work-view/crates/cli/tests/fixtures/golden/.work/CONVENTIONS.md +3 -0
  157. package/work-view/crates/cli/tests/fixtures/golden/.work/active/epics/epic-alpha.md +16 -0
  158. package/work-view/crates/cli/tests/fixtures/golden/.work/active/features/feat-a.md +16 -0
  159. package/work-view/crates/cli/tests/fixtures/golden/.work/active/features/feat-b.md +16 -0
  160. package/work-view/crates/cli/tests/fixtures/golden/.work/active/stories/story-alpha-1.md +16 -0
  161. package/work-view/crates/cli/tests/fixtures/golden/.work/active/stories/story-research-1.md +19 -0
  162. package/work-view/crates/cli/tests/fixtures/golden/.work/archive/feat-done.md +16 -0
  163. package/work-view/crates/cli/tests/fixtures/golden/.work/archive/feat-shipped.md +18 -0
  164. package/work-view/crates/cli/tests/fixtures/golden/.work/backlog/idea-backlog.md +7 -0
  165. package/work-view/crates/cli/tests/fixtures/golden/.work/releases/v1.0/v1.0.md +16 -0
  166. package/work-view/crates/cli/tests/fixtures/ready-drafting/.work/CONVENTIONS.md +6 -0
  167. package/work-view/crates/cli/tests/fixtures/ready-drafting/.work/active/features/feat-dep-done.md +17 -0
  168. package/work-view/crates/cli/tests/fixtures/ready-drafting/.work/active/features/feat-design-ready.md +17 -0
  169. package/work-view/crates/cli/tests/fixtures/ready-drafting/.work/active/features/feat-impl-ready.md +17 -0
  170. package/work-view/crates/cli/tests/fixtures/ready-drafting/.work/active/stories/story-review-ready.md +17 -0
  171. package/work-view/crates/cli/tests/fixtures/with-malformed/.work/CONVENTIONS.md +4 -0
  172. package/work-view/crates/cli/tests/fixtures/with-malformed/.work/active/epics/malformed-no-closing-fence.md +8 -0
  173. package/work-view/crates/cli/tests/fixtures/with-malformed/.work/active/features/good-item.md +16 -0
  174. package/work-view/crates/cli/tests/integration.rs +2833 -0
  175. package/work-view/crates/core/Cargo.toml +13 -0
  176. package/work-view/crates/core/src/error.rs +61 -0
  177. package/work-view/crates/core/src/filter.rs +804 -0
  178. package/work-view/crates/core/src/graph.rs +324 -0
  179. package/work-view/crates/core/src/index.rs +590 -0
  180. package/work-view/crates/core/src/lib.rs +54 -0
  181. package/work-view/crates/core/src/model.rs +202 -0
  182. package/work-view/crates/core/src/parse.rs +494 -0
  183. package/work-view/crates/core/tests/fixtures/golden/.work/CONVENTIONS.md +15 -0
  184. package/work-view/crates/core/tests/fixtures/golden/.work/active/epics/epic-core.md +16 -0
  185. package/work-view/crates/core/tests/fixtures/golden/.work/active/features/feat-parser.md +16 -0
  186. package/work-view/crates/core/tests/fixtures/golden/.work/active/features/feat-query.md +16 -0
  187. package/work-view/crates/core/tests/fixtures/golden/.work/active/stories/malformed-no-id.md +15 -0
  188. package/work-view/crates/core/tests/fixtures/golden/.work/active/stories/story-parse-unit.md +16 -0
  189. package/work-view/crates/core/tests/fixtures/golden/.work/active/stories/story-security-gate.md +16 -0
  190. package/work-view/crates/core/tests/fixtures/golden/.work/archive/feat-old.md +16 -0
  191. package/work-view/crates/core/tests/fixtures/golden/.work/archive/feat-parser.md +17 -0
  192. package/work-view/crates/core/tests/fixtures/golden/.work/backlog/idea-future-board.md +7 -0
  193. package/work-view/crates/core/tests/fixtures/golden/.work/releases/v1.0/v1.0.md +16 -0
  194. package/work-view/crates/core/tests/fixtures/precedence/.work/CONVENTIONS.md +10 -0
  195. package/work-view/crates/core/tests/fixtures/precedence/.work/archive/dup-item.md +18 -0
  196. package/work-view/crates/core/tests/fixtures/precedence/.work/releases/v2.0/dup-item.md +18 -0
  197. package/work-view/crates/core/tests/integration.rs +541 -0
  198. package/work-view/dist/.gitattributes +1 -0
  199. package/work-view/dist/README.md +42 -0
  200. package/work-view/dist/aarch64-apple-darwin/work-view +0 -0
  201. package/work-view/dist/aarch64-unknown-linux-musl/work-view +0 -0
  202. package/work-view/dist/x86_64-apple-darwin/work-view +0 -0
  203. package/work-view/dist/x86_64-unknown-linux-musl/work-view +0 -0
@@ -0,0 +1,161 @@
1
+ # Substrate Side Effects
2
+
3
+ Load this reference only in substrate mode, or when a standalone review's user
4
+ explicitly asks to track findings in the substrate.
5
+
6
+ Standalone mode must not create `.work` items, advance stages, archive files, or
7
+ commit unless the user explicitly asks for that side effect.
8
+
9
+ ## Triage Findings Into Items
10
+
11
+ For each finding above nit level, create a substrate item so it does not
12
+ disappear into prose:
13
+
14
+ - **Blocker**: either fix inline if small, or create a story in
15
+ `.work/active/stories/` with `stage: implementing` and tags such as `[bug]`,
16
+ `[security]`, `[tests]`, or the appropriate category.
17
+ - **Important**: park as a backlog item in `.work/backlog/`, or scope as a
18
+ feature if substantial.
19
+ - **Nit**: keep in conversation only; nits do not warrant items.
20
+
21
+ Review-created items use `gate_origin: null`; gate-produced findings set
22
+ `gate_origin`.
23
+
24
+ ## Decide And Advance
25
+
26
+ If there are no blockers:
27
+
28
+ 1. Advance the item from `review` to `done`.
29
+ 2. If it has `release_binding: <version>`, leave it active for
30
+ `/agile-workflow:release-deploy`.
31
+ 3. If it has no release binding and no active parent epic/feature, archive it per the
32
+ project's **Terminal-tier retention** value in `.work/CONVENTIONS.md` — the ONE merged
33
+ terminal convention (see convert / SPEC.md):
34
+ - `delete-refs` (the default) → archive as a **bodyless stub** (see "Archive as a bodyless
35
+ stub" below) — do not retain the full body on disk.
36
+ - `retain-bodies` (the documented opt-out) → archive with the **full body kept**, same
37
+ frontmatter additions (`archived_atop`, `git_ref`) and same late-binding semantics —
38
+ bodies are just not pruned. Honor the project's existing archive layout (e.g.
39
+ kind-grouped `archive/<kind>s/`) when one is established.
40
+ - **Any other value** → treat as `retain-bodies` (keep the full body) and print a loud
41
+ one-line warning: `WARNING: unrecognized Terminal-tier retention value "<value>" in
42
+ CONVENTIONS.md — archiving with body kept (safe default); fix CONVENTIONS.md.`
43
+ Rationale: a typo must never trigger body-pruning. `delete-refs` applies only when
44
+ explicitly and exactly declared (or when the key is absent — the documented default
45
+ above; that default is unchanged).
46
+ 4. If it has a parent, check whether all siblings are now `done`:
47
+
48
+ ```bash
49
+ parent_id=$(grep '^parent:' .work/active/<kind>s/<id>.md | awk '{print $2}')
50
+ .work/bin/work-view --parent "$parent_id" --stage done --count
51
+ .work/bin/work-view --parent "$parent_id" --count
52
+ ```
53
+
54
+ If sibling done count equals total count, advance the parent from `implementing`
55
+ to `review` and append a "Children complete" note.
56
+
57
+ If blockers exist:
58
+
59
+ 1. Set the item back to `stage: implementing`.
60
+ 2. Append a `## Review findings` section listing blockers and the created item
61
+ ids.
62
+ 3. Do not archive.
63
+
64
+ ## Archive as a bodyless stub
65
+
66
+ *(Applies under `delete-refs` retention — the default. Under `retain-bodies`, keep the full
67
+ body and apply only the frontmatter additions below.)*
68
+
69
+ Terminal items carry **zero design authority** (their rationale must not bind present decisions),
70
+ and a retained body on disk leaks stale "we decided X" prose to future agents. Git already preserves
71
+ every body, so archive items as bodyless refs — discoverable and late-bindable, but with no prose to
72
+ mislead.
73
+
74
+ The stub also records the release baseline it was done *atop* (`archived_atop`) so
75
+ `/agile-workflow:release-deploy` can later late-bind it into the release that ships work done on top
76
+ of the prior shipped tag. Archiving stays decoupled from release binding: the stub carries
77
+ `release_binding: null` until a release claims it.
78
+
79
+ To archive `<id>` (a `done` item with no release binding and no active parent):
80
+
81
+ 1. Capture the ref where the full body currently lives — **before** the archive commit:
82
+
83
+ ```bash
84
+ git_ref=$(git rev-parse --short HEAD)
85
+ ```
86
+
87
+ 2. Compute `archived_atop` — the immutable release baseline this item was done atop. It is the
88
+ **latest released version** at archival time:
89
+
90
+ ```bash
91
+ # Latest released version = newest git tag matching the project's release tag shape,
92
+ # OR the newest .work/releases/<version>/ summary if no tags are used.
93
+ archived_atop=$(git describe --tags --abbrev=0 2>/dev/null \
94
+ || ls -d .work/releases/*/ 2>/dev/null | sort -V | tail -1 | xargs -r basename)
95
+ # If neither exists yet (no release has ever shipped), use the sentinel:
96
+ archived_atop=${archived_atop:-pre-release}
97
+ ```
98
+
99
+ Stamp it **once** at archival and **never rewrite it** afterward — it is the immutable baseline.
100
+ On an idempotent re-archive of an existing stub, preserve the stub's existing `archived_atop`
101
+ rather than recomputing it.
102
+
103
+ 3. Write `.work/archive/<id>.md` as a stub: keep the YAML frontmatter (add `git_ref: <git_ref>` and
104
+ `archived_atop: <archived_atop>`) and the first `# <Title>` line only. Drop all other body
105
+ content. Keep `stage: done` and the existing `release_binding` (normally `null`; late-bind later
106
+ by setting it to a `<version>`).
107
+
108
+ ```
109
+ ---
110
+ id: <id>
111
+ kind: <kind>
112
+ stage: done
113
+ tags: [...]
114
+ parent: null
115
+ depends_on: []
116
+ release_binding: null
117
+ archived_atop: <release | pre-release>
118
+ git_ref: <git_ref>
119
+ created: <orig>
120
+ updated: <today>
121
+ ---
122
+
123
+ # <Title>
124
+ ```
125
+
126
+ 4. `git rm` the active file and `git add` the stub (see Commit).
127
+
128
+ The stub stays a first-class, work-view-queryable item. Recover the full body any time with
129
+ `git show <git_ref>:.work/active/<kind>s/<id>.md`.
130
+
131
+ ## Append Review Record
132
+
133
+ Append this section to the reviewed item:
134
+
135
+ ```markdown
136
+ ## Review (YYYY-MM-DD)
137
+
138
+ **Verdict**: Approve | Approve with comments | Request changes | Block
139
+
140
+ **Blockers**: <list with item ids> (or "none")
141
+ **Important**: <list with item ids> (or "none")
142
+ **Nits**: <inline notes - not items>
143
+
144
+ **Notes**: <mode, depth, skipped lenses, limitations, or anything else worth recording>
145
+ ```
146
+
147
+ ## Commit
148
+
149
+ Commit only substrate changes created by the review:
150
+
151
+ ```bash
152
+ git add .work/active/<kind>s/<id>.md .work/active/stories/<finding-id>.md .work/backlog/<finding-id>.md
153
+ git commit -m "review: <id> (<verdict>)"
154
+ ```
155
+
156
+ If the item was archived as a bodyless stub, stage the stub and remove the active body:
157
+
158
+ ```bash
159
+ git add .work/archive/<id>.md
160
+ git rm .work/active/<kind>s/<id>.md
161
+ ```
@@ -0,0 +1,52 @@
1
+ # Target Resolution
2
+
3
+ Load this reference when determining what review target to inspect and how to
4
+ collect its diff or aggregate scope.
5
+
6
+ ## Target Commands
7
+
8
+ | Target | Command |
9
+ |---|---|
10
+ | Item implementation commits | `git log --grep "<id>" --format='%H'`, then `git show <sha>` for each commit. |
11
+ | Current branch vs base | `git diff main...HEAD`; replace `main` with the detected default branch. |
12
+ | Specific branch | `git diff main...<branch>`; replace `main` with the detected default branch. |
13
+ | Specific commit | `git show <sha>` |
14
+ | Commit range | `git diff <sha1>..<sha2>` |
15
+ | Working tree | `git diff` |
16
+ | Unpushed commits | `git log @{u}..HEAD`, then `git diff @{u}..HEAD` |
17
+ | PR by number | `gh pr view <N> --json files,additions,deletions,title,body`, then `gh pr diff <N>` |
18
+
19
+ If `main` is not the default branch, detect the base from git metadata or the
20
+ remote tracking branch before running the diff.
21
+
22
+ ## Substrate Items
23
+
24
+ For a feature with child stories, the review scope spans all child story
25
+ implementation commits. Find them by grepping for each story id and unioning the
26
+ patches.
27
+
28
+ For a story, prefer the commit(s) referenced by the item implementation notes.
29
+ If notes do not identify commits, try item-id grep, branch-vs-base, then working
30
+ tree in that order.
31
+
32
+ ## Epic Scope
33
+
34
+ For an epic, do not attempt a line-by-line review by default. Each child feature
35
+ or story should already have passed review. Gather:
36
+
37
+ - The epic body: brief, decomposition, and acceptance intent.
38
+ - Each child feature body, especially its `## Review` section.
39
+ - The aggregate touched-file list from `git log --grep "<child-id>"` across all
40
+ children.
41
+
42
+ Use the aggregate scope to spot cross-cutting concerns: public API shifts,
43
+ foundation-doc drift, release gaps, and capability completeness.
44
+
45
+ ## Empty Diff Handling
46
+
47
+ If a non-epic diff is empty after obvious ranges:
48
+
49
+ - Autopilot substrate mode: advance only if the item has complete green
50
+ verification evidence. Otherwise bounce for missing review scope.
51
+ - Interactive substrate mode: ask the user which range to review.
52
+ - Standalone mode: report that there is no diff to review and stop.