lazycodex-ai 5.0.0-beta.87 → 5.0.0-beta.89

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 (83) hide show
  1. package/README.ja.md +1 -11
  2. package/README.ko.md +1 -11
  3. package/README.md +1 -1
  4. package/README.ru.md +1 -11
  5. package/README.zh-cn.md +1 -11
  6. package/dist/cli/index.js +90 -73
  7. package/dist/cli-node/index.js +90 -73
  8. package/package.json +1 -1
  9. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  10. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  11. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  12. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  13. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  14. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  15. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  16. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  17. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  18. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  19. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  20. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  21. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  22. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  23. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  24. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  25. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  26. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  27. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +16 -3
  28. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  29. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  30. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +5 -5
  31. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +13 -9
  32. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +5 -6
  33. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +2 -2
  34. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/plan-templates.mjs +180 -0
  35. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +3 -154
  36. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  37. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  38. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  39. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  40. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  41. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  42. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  43. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  44. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  45. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  46. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  47. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  57. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  58. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  59. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  60. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  61. package/packages/omo-codex/plugin/package-lock.json +12 -12
  62. package/packages/omo-codex/plugin/package.json +1 -1
  63. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  64. package/packages/omo-codex/plugin/skills/frontend/references/design/ambience-skill.md +2 -1
  65. package/packages/omo-codex/plugin/skills/frontend/references/design/design-system-architecture.md +30 -7
  66. package/packages/omo-codex/plugin/skills/frontend/references/design/interaction-skill.md +17 -5
  67. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +5 -5
  68. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +13 -9
  69. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +5 -6
  70. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +2 -2
  71. package/packages/omo-codex/plugin/skills/ulw-plan/scripts/plan-templates.mjs +180 -0
  72. package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +3 -154
  73. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2 -2
  74. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
  75. package/packages/shared-skills/skills/frontend/references/design/ambience-skill.md +2 -1
  76. package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md +30 -7
  77. package/packages/shared-skills/skills/frontend/references/design/interaction-skill.md +17 -5
  78. package/packages/shared-skills/skills/ulw-plan/SKILL.md +5 -5
  79. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +13 -9
  80. package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +5 -6
  81. package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +2 -2
  82. package/packages/shared-skills/skills/ulw-plan/scripts/plan-templates.mjs +180 -0
  83. package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +3 -154
@@ -0,0 +1,180 @@
1
+ // plan-templates.mjs - the draft and plan skeleton text that scaffold-plan.mjs emits.
2
+ //
3
+ // Text only: no filesystem access, no path policy (scaffold-plan.mjs owns the write
4
+ // boundary). Zero external dependencies so it runs byte-identically under `node` and `bun`.
5
+
6
+ // The canonical AI-plan section headers, in order. references/full-workflow.md
7
+ // documents this exact list; the two must never drift.
8
+ export const PLAN_SECTION_HEADERS = [
9
+ "## TL;DR (For humans)",
10
+ "## Scope",
11
+ "## Verification strategy",
12
+ "## Execution strategy",
13
+ "## Todos",
14
+ "## Final verification wave",
15
+ "## Commit strategy",
16
+ "## Success criteria",
17
+ ];
18
+
19
+ export const FINAL_VERIFICATION_ITEMS = [
20
+ "F1. Plan compliance audit",
21
+ "F2. Code quality review",
22
+ "F3. Real manual QA",
23
+ "F4. Ideal-state fidelity",
24
+ ];
25
+
26
+ export function buildDraft(slug, intent, { reviewRequired = false } = {}) {
27
+ const assumptionsNote =
28
+ intent === "unclear"
29
+ ? "Intent is UNCLEAR: research resolves ambiguity, defaults are adopted (not asked), and each is surfaced in the plan's human TL;DR for veto."
30
+ : "Record any default you adopt instead of asking, so the user can veto it at the gate.";
31
+ const reviewState = reviewRequired
32
+ ? `review_required: true
33
+ plan_path: .omo/plans/${slug}.md
34
+ plan_sha256: null
35
+ review_round_id: null
36
+ pending-action: write and review .omo/plans/${slug}.md
37
+ review:
38
+ momus:
39
+ status: pending
40
+ workspace_root: null
41
+ runtime_home: null
42
+ target: .omo/plans/${slug}.md
43
+ round_id: null
44
+ plan_sha256: null
45
+ launch_id: null
46
+ session: null
47
+ result: null
48
+ independent:
49
+ status: pending
50
+ workspace_root: null
51
+ runtime_home: null
52
+ target: .omo/plans/${slug}.md
53
+ round_id: null
54
+ plan_sha256: null
55
+ launch_id: null
56
+ session: null
57
+ result: null`
58
+ : `review_required: false
59
+ pending-action: write .omo/plans/${slug}.md`;
60
+ return `---
61
+ slug: ${slug}
62
+ status: drafting
63
+ intent: ${intent}
64
+ ${reviewState}
65
+ approach: <fill: the approach you intend to plan>
66
+ ---
67
+
68
+ # Draft: ${slug}
69
+
70
+ ## Affected user and ideal state
71
+ <!-- Who this output touches (a customer, another programmer, a program or agent consuming it - often more than one) and how each uses it today and will use it after. -->
72
+ <!-- IS-n | property of the ideal state: nothing snags, feels odd, regresses, or degrades for them | reason -->
73
+ <!-- GAP-n | difference between IS-n and today | reason | closed by todo(s) -->
74
+
75
+ ## Components (topology ledger)
76
+ <!-- Lock the SHAPE before depth. One row per top-level component that can succeed or fail independently. -->
77
+ <!-- id | outcome (one line) | status: active|deferred | evidence path -->
78
+
79
+ ## Open assumptions (announced defaults)
80
+ <!-- ${assumptionsNote} -->
81
+ <!-- assumption | adopted default | rationale | reversible? -->
82
+
83
+ ## Findings (cited - path:lines)
84
+
85
+ ## Decisions (with rationale)
86
+
87
+ ## Scope IN
88
+
89
+ ## Scope OUT (Must NOT have)
90
+
91
+ ## Open questions
92
+
93
+ ## Approval gate
94
+ status: drafting
95
+ <!-- When exploration is exhausted and unknowns are answered, set status: awaiting-approval. -->
96
+ <!-- That durable record is the loop guard: on a later turn read it and resume at the gate instead of re-running exploration. -->
97
+ `;
98
+ }
99
+
100
+ export function buildPlanSkeleton(slug, intent) {
101
+ const decisionsLine =
102
+ intent === "unclear"
103
+ ? "**Decisions I made for you:** <fill last - the best-practice defaults you adopted; the user vetoes any here>"
104
+ : "**Decisions to sanity-check:** <fill last - the few choices worth a human glance>";
105
+ return `# ${slug} - Work Plan
106
+
107
+ ## TL;DR (For humans)
108
+ <!-- Fill this LAST, after the detailed plan below is written, so it summarizes the REAL plan. -->
109
+ <!-- Plain English for a non-engineer: NO file paths, NO todo numbers, NO wave/agent/tool names. -->
110
+
111
+ **Who this is for and what changes for them:** <fill last - the affected user and their experience after, 1-2 sentences>
112
+
113
+ **What you'll get:** <fill last - deliverables in human terms, 1-2 sentences>
114
+
115
+ **Why this approach:** <fill last - the one or two load-bearing decisions and why>
116
+
117
+ **What it will NOT do:** <fill last - 1-3 plain lines mirroring Must NOT have>
118
+
119
+ **Effort:** <Quick | Short | Medium | Large | XL>
120
+ <!-- Effort is exactly ONE band, never hours/days. Quick = single edit, minutes of agent work; Short = one focused change, a few files; Medium = multi-file feature in one session; Large = several waves, one long session; XL = multi-session or architectural work. A written duration is rewritten to a band. -->
121
+ **Risk:** <Low | Medium | High> - <one-line driver>
122
+ ${decisionsLine}
123
+
124
+ Your next move: <fill - e.g. approve, or run a high-accuracy review>. Full execution detail follows below.
125
+
126
+ ---
127
+
128
+ > TL;DR (machine): <1 line - effort, risk, deliverables>
129
+
130
+ ## Scope
131
+ ### Affected user and ideal state
132
+ <!-- From the draft ledger: who this touches and how they use the result, then one IS row per property with its reason, then one GAP row per difference with its reason. Every todo below closes a GAP row; ## Success criteria proves every IS row. -->
133
+ **Affected user:** <who, and how they use it today and after>
134
+
135
+ | Row | Statement | Reason |
136
+ | --- | --- | --- |
137
+ | IS-1 | <what the user does, sees, or never has break> | <why this is the ideal for them> |
138
+ | GAP-1 | <how today differs from IS-1> | <why it matters to them> |
139
+
140
+ ### Must have
141
+ ### Must NOT have (guardrails, anti-slop, scope boundaries)
142
+
143
+ ## Verification strategy
144
+ > Zero human intervention - all verification is agent-executed.
145
+ - Test decision: <TDD | tests-after | none> + framework
146
+ - Evidence: <attemptDir>/task-<N>-${slug}.<ext> (attemptDir = currentAttemptDir from the ulw-loop status operation - on Senpi the eval SDK import, const { agentToolkit } = await import(\`\${env("OMO_AGENT_TOOLKIT_SDK_ROOT")}/sdk.js\`) then agentToolkit.status(), on Codex the omo-agent-toolkit CLI, .omo/evidence/ulw/<session>/<goalId>/a<attempt>; outside ulw-loop use .omo/evidence/)
147
+
148
+ ## Execution strategy
149
+ ### Parallel execution waves
150
+ > Target 5-8 todos per wave. Fewer than 3 (except the final) means you under-split.
151
+
152
+ ### Dependency matrix
153
+ | Todo | Depends on | Blocks | Can parallelize with |
154
+ | --- | --- | --- | --- |
155
+
156
+ ## Todos
157
+ > Implementation + Test = ONE todo. Never separate.
158
+ <!-- APPEND TASK BATCHES BELOW THIS LINE WITH edit/apply_patch - never rewrite the headers above. -->
159
+ - [ ] 1. <title>
160
+ What to do / Must NOT do: <...>
161
+ Closes: GAP-<n>
162
+ Parallelization: Wave <N> | Blocked by: <...> | Blocks: <...>
163
+ References (executor has NO interview context - be exhaustive): <src/path:lines>
164
+ Acceptance criteria (agent-executable): <exact command or assertion>
165
+ QA scenarios (name the exact tool + invocation): happy + failure, Evidence <attemptDir>/task-1-${slug}.<ext>
166
+ Commit: <Y/N> | <type>(<scope>): <summary>
167
+
168
+ ## Final verification wave
169
+ > Runs in parallel after ALL todos. ALL must APPROVE. Surface results and wait for the user's explicit okay before declaring complete.
170
+ ${FINAL_VERIFICATION_ITEMS.map((item) => `- [ ] ${item}`).join("\n")}
171
+
172
+ ## Commit strategy
173
+
174
+ ## Success criteria
175
+ > One row per IS row. The plan is complete only when every IS row has a delivering todo and a proving QA scenario; F4 checks the delivered behavior against these rows 1:1, and a shortfall becomes new \`- [ ] N.\` rows, never a note.
176
+ | IS | Delivering todo(s) | Proving QA scenario | Evidence |
177
+ | --- | --- | --- | --- |
178
+ | IS-1 | <N> | <scenario name from todo N> | <attemptDir>/task-<N>-${slug}.<ext> |
179
+ `;
180
+ }
@@ -23,26 +23,10 @@
23
23
  import { lstat, mkdir, writeFile, readFile, realpath } from "node:fs/promises";
24
24
  import { dirname, join, relative, resolve, isAbsolute } from "node:path";
25
25
  import { pathToFileURL } from "node:url";
26
+ import { FINAL_VERIFICATION_ITEMS, PLAN_SECTION_HEADERS, buildDraft, buildPlanSkeleton } from "./plan-templates.mjs";
26
27
 
27
- // The canonical AI-plan section headers, in order. references/full-workflow.md
28
- // documents this exact list; a build-time test asserts the two never drift.
29
- export const PLAN_SECTION_HEADERS = [
30
- "## TL;DR (For humans)",
31
- "## Scope",
32
- "## Verification strategy",
33
- "## Execution strategy",
34
- "## Todos",
35
- "## Final verification wave",
36
- "## Commit strategy",
37
- "## Success criteria",
38
- ];
39
-
40
- export const FINAL_VERIFICATION_ITEMS = [
41
- "F1. Plan compliance audit",
42
- "F2. Code quality review",
43
- "F3. Real manual QA",
44
- "F4. Scope fidelity",
45
- ];
28
+ // The emitted text lives in plan-templates.mjs; re-exported so importers keep one entry point.
29
+ export { FINAL_VERIFICATION_ITEMS, PLAN_SECTION_HEADERS, buildDraft, buildPlanSkeleton };
46
30
 
47
31
  const SLUG_PATTERN = /^[a-z0-9][a-z0-9-]{0,79}$/;
48
32
 
@@ -151,141 +135,6 @@ export function isUlwArtifact(content) {
151
135
  return isPlan || isDraft;
152
136
  }
153
137
 
154
- export function buildDraft(slug, intent, { reviewRequired = false } = {}) {
155
- const assumptionsNote =
156
- intent === "unclear"
157
- ? "Intent is UNCLEAR: research resolves ambiguity, defaults are adopted (not asked), and each is surfaced in the plan's human TL;DR for veto."
158
- : "Record any default you adopt instead of asking, so the user can veto it at the gate.";
159
- const reviewState = reviewRequired
160
- ? `review_required: true
161
- plan_path: .omo/plans/${slug}.md
162
- plan_sha256: null
163
- review_round_id: null
164
- pending-action: write and review .omo/plans/${slug}.md
165
- review:
166
- momus:
167
- status: pending
168
- workspace_root: null
169
- runtime_home: null
170
- target: .omo/plans/${slug}.md
171
- round_id: null
172
- plan_sha256: null
173
- launch_id: null
174
- session: null
175
- result: null
176
- independent:
177
- status: pending
178
- workspace_root: null
179
- runtime_home: null
180
- target: .omo/plans/${slug}.md
181
- round_id: null
182
- plan_sha256: null
183
- launch_id: null
184
- session: null
185
- result: null`
186
- : `review_required: false
187
- pending-action: write .omo/plans/${slug}.md`;
188
- return `---
189
- slug: ${slug}
190
- status: drafting
191
- intent: ${intent}
192
- ${reviewState}
193
- approach: <fill: the approach you intend to plan>
194
- ---
195
-
196
- # Draft: ${slug}
197
-
198
- ## Components (topology ledger)
199
- <!-- Lock the SHAPE before depth. One row per top-level component that can succeed or fail independently. -->
200
- <!-- id | outcome (one line) | status: active|deferred | evidence path -->
201
-
202
- ## Open assumptions (announced defaults)
203
- <!-- ${assumptionsNote} -->
204
- <!-- assumption | adopted default | rationale | reversible? -->
205
-
206
- ## Findings (cited - path:lines)
207
-
208
- ## Decisions (with rationale)
209
-
210
- ## Scope IN
211
-
212
- ## Scope OUT (Must NOT have)
213
-
214
- ## Open questions
215
-
216
- ## Approval gate
217
- status: drafting
218
- <!-- When exploration is exhausted and unknowns are answered, set status: awaiting-approval. -->
219
- <!-- That durable record is the loop guard: on a later turn read it and resume at the gate instead of re-running exploration. -->
220
- `;
221
- }
222
-
223
- export function buildPlanSkeleton(slug, intent) {
224
- const decisionsLine =
225
- intent === "unclear"
226
- ? "**Decisions I made for you:** <fill last - the best-practice defaults you adopted; the user vetoes any here>"
227
- : "**Decisions to sanity-check:** <fill last - the few choices worth a human glance>";
228
- return `# ${slug} - Work Plan
229
-
230
- ## TL;DR (For humans)
231
- <!-- Fill this LAST, after the detailed plan below is written, so it summarizes the REAL plan. -->
232
- <!-- Plain English for a non-engineer: NO file paths, NO todo numbers, NO wave/agent/tool names. -->
233
-
234
- **What you'll get:** <fill last - deliverables in human terms, 1-2 sentences>
235
-
236
- **Why this approach:** <fill last - the one or two load-bearing decisions and why>
237
-
238
- **What it will NOT do:** <fill last - 1-3 plain lines mirroring Must NOT have>
239
-
240
- **Effort:** <Quick | Short | Medium | Large | XL>
241
- <!-- Effort is exactly ONE band, never hours/days. Quick = single edit, minutes of agent work; Short = one focused change, a few files; Medium = multi-file feature in one session; Large = several waves, one long session; XL = multi-session or architectural work. A written duration is rewritten to a band. -->
242
- **Risk:** <Low | Medium | High> - <one-line driver>
243
- ${decisionsLine}
244
-
245
- Your next move: <fill - e.g. approve, or run a high-accuracy review>. Full execution detail follows below.
246
-
247
- ---
248
-
249
- > TL;DR (machine): <1 line - effort, risk, deliverables>
250
-
251
- ## Scope
252
- ### Must have
253
- ### Must NOT have (guardrails, anti-slop, scope boundaries)
254
-
255
- ## Verification strategy
256
- > Zero human intervention - all verification is agent-executed.
257
- - Test decision: <TDD | tests-after | none> + framework
258
- - Evidence: <attemptDir>/task-<N>-${slug}.<ext> (attemptDir = currentAttemptDir from the ulw-loop status operation - on Senpi the eval SDK import, const { agentToolkit } = await import(\`\${env("OMO_AGENT_TOOLKIT_SDK_ROOT")}/sdk.js\`) then agentToolkit.status(), on Codex the omo-agent-toolkit CLI, .omo/evidence/ulw/<session>/<goalId>/a<attempt>; outside ulw-loop use .omo/evidence/)
259
-
260
- ## Execution strategy
261
- ### Parallel execution waves
262
- > Target 5-8 todos per wave. Fewer than 3 (except the final) means you under-split.
263
-
264
- ### Dependency matrix
265
- | Todo | Depends on | Blocks | Can parallelize with |
266
- | --- | --- | --- | --- |
267
-
268
- ## Todos
269
- > Implementation + Test = ONE todo. Never separate.
270
- <!-- APPEND TASK BATCHES BELOW THIS LINE WITH edit/apply_patch - never rewrite the headers above. -->
271
- - [ ] 1. <title>
272
- What to do / Must NOT do: <...>
273
- Parallelization: Wave <N> | Blocked by: <...> | Blocks: <...>
274
- References (executor has NO interview context - be exhaustive): <src/path:lines>
275
- Acceptance criteria (agent-executable): <exact command or assertion>
276
- QA scenarios (name the exact tool + invocation): happy + failure, Evidence <attemptDir>/task-1-${slug}.<ext>
277
- Commit: <Y/N> | <type>(<scope>): <summary>
278
-
279
- ## Final verification wave
280
- > Runs in parallel after ALL todos. ALL must APPROVE. Surface results and wait for the user's explicit okay before declaring complete.
281
- ${FINAL_VERIFICATION_ITEMS.map((item) => `- [ ] ${item}`).join("\n")}
282
-
283
- ## Commit strategy
284
-
285
- ## Success criteria
286
- `;
287
- }
288
-
289
138
  // Resume-safe write: plain re-run on an existing ulw-plan artifact is a no-op
290
139
  // success; --reset overwrites but refuses to discard a hand-edited file unless
291
140
  // --force is also passed.