@cluesmith/codev 3.0.0 → 3.0.1

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 (286) hide show
  1. package/LICENSE +201 -0
  2. package/bin/af.js +2 -2
  3. package/bin/afx.js +8 -0
  4. package/bin/consult.js +2 -1
  5. package/bin/team.js +2 -1
  6. package/{dashboard/dist/assets/index-nr0cXxtf.css → dashboard-dist/assets/index-BWYZtvwm.css} +1 -1
  7. package/dashboard-dist/assets/index-Dn9zmcKp.js +195 -0
  8. package/dashboard-dist/assets/index-Dn9zmcKp.js.map +1 -0
  9. package/{dashboard/dist → dashboard-dist}/index.html +2 -2
  10. package/dist/agent-farm/cli.d.ts.map +1 -1
  11. package/dist/agent-farm/cli.js +13 -14
  12. package/dist/agent-farm/cli.js.map +1 -1
  13. package/dist/agent-farm/commands/architect.d.ts +4 -4
  14. package/dist/agent-farm/commands/architect.d.ts.map +1 -1
  15. package/dist/agent-farm/commands/architect.js +23 -12
  16. package/dist/agent-farm/commands/architect.js.map +1 -1
  17. package/dist/agent-farm/commands/attach.js +8 -8
  18. package/dist/agent-farm/commands/attach.js.map +1 -1
  19. package/dist/agent-farm/commands/bench.d.ts +1 -1
  20. package/dist/agent-farm/commands/bench.js +1 -1
  21. package/dist/agent-farm/commands/cron.js +1 -1
  22. package/dist/agent-farm/commands/cron.js.map +1 -1
  23. package/dist/agent-farm/commands/db.d.ts +3 -3
  24. package/dist/agent-farm/commands/db.js +4 -4
  25. package/dist/agent-farm/commands/db.js.map +1 -1
  26. package/dist/agent-farm/commands/open.js +2 -2
  27. package/dist/agent-farm/commands/open.js.map +1 -1
  28. package/dist/agent-farm/commands/rename.js +1 -1
  29. package/dist/agent-farm/commands/rename.js.map +1 -1
  30. package/dist/agent-farm/commands/send.js +3 -3
  31. package/dist/agent-farm/commands/send.js.map +1 -1
  32. package/dist/agent-farm/commands/shell.js +3 -3
  33. package/dist/agent-farm/commands/shell.js.map +1 -1
  34. package/dist/agent-farm/commands/spawn-roles.d.ts +8 -4
  35. package/dist/agent-farm/commands/spawn-roles.d.ts.map +1 -1
  36. package/dist/agent-farm/commands/spawn-roles.js +48 -28
  37. package/dist/agent-farm/commands/spawn-roles.js.map +1 -1
  38. package/dist/agent-farm/commands/spawn-worktree.d.ts +1 -1
  39. package/dist/agent-farm/commands/spawn-worktree.d.ts.map +1 -1
  40. package/dist/agent-farm/commands/spawn-worktree.js +80 -13
  41. package/dist/agent-farm/commands/spawn-worktree.js.map +1 -1
  42. package/dist/agent-farm/commands/spawn.d.ts +6 -6
  43. package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
  44. package/dist/agent-farm/commands/spawn.js +90 -53
  45. package/dist/agent-farm/commands/spawn.js.map +1 -1
  46. package/dist/agent-farm/commands/status.d.ts.map +1 -1
  47. package/dist/agent-farm/commands/status.js +48 -3
  48. package/dist/agent-farm/commands/status.js.map +1 -1
  49. package/dist/agent-farm/commands/team-update.d.ts +1 -1
  50. package/dist/agent-farm/commands/team-update.js +1 -1
  51. package/dist/agent-farm/commands/team.d.ts +1 -1
  52. package/dist/agent-farm/commands/team.js +1 -1
  53. package/dist/agent-farm/commands/tower-cloud.d.ts +2 -2
  54. package/dist/agent-farm/commands/tower-cloud.js +3 -3
  55. package/dist/agent-farm/commands/tower-cloud.js.map +1 -1
  56. package/dist/agent-farm/commands/tower.js +2 -2
  57. package/dist/agent-farm/commands/tower.js.map +1 -1
  58. package/dist/agent-farm/lib/cloud-config.js +2 -2
  59. package/dist/agent-farm/lib/cloud-config.js.map +1 -1
  60. package/dist/agent-farm/lib/tower-client.d.ts +6 -230
  61. package/dist/agent-farm/lib/tower-client.d.ts.map +1 -1
  62. package/dist/agent-farm/lib/tower-client.js +6 -293
  63. package/dist/agent-farm/lib/tower-client.js.map +1 -1
  64. package/dist/agent-farm/lib/tunnel-client.js +1 -1
  65. package/dist/agent-farm/lib/tunnel-client.js.map +1 -1
  66. package/dist/agent-farm/servers/message-write.d.ts +24 -0
  67. package/dist/agent-farm/servers/message-write.d.ts.map +1 -0
  68. package/dist/agent-farm/servers/message-write.js +63 -0
  69. package/dist/agent-farm/servers/message-write.js.map +1 -0
  70. package/dist/agent-farm/servers/overview.d.ts +4 -1
  71. package/dist/agent-farm/servers/overview.d.ts.map +1 -1
  72. package/dist/agent-farm/servers/overview.js +38 -5
  73. package/dist/agent-farm/servers/overview.js.map +1 -1
  74. package/dist/agent-farm/servers/send-buffer.d.ts +4 -3
  75. package/dist/agent-farm/servers/send-buffer.d.ts.map +1 -1
  76. package/dist/agent-farm/servers/send-buffer.js +7 -4
  77. package/dist/agent-farm/servers/send-buffer.js.map +1 -1
  78. package/dist/agent-farm/servers/tower-cron-parser.js +1 -1
  79. package/dist/agent-farm/servers/tower-cron-parser.js.map +1 -1
  80. package/dist/agent-farm/servers/tower-cron.d.ts.map +1 -1
  81. package/dist/agent-farm/servers/tower-cron.js +4 -5
  82. package/dist/agent-farm/servers/tower-cron.js.map +1 -1
  83. package/dist/agent-farm/servers/tower-instances.d.ts.map +1 -1
  84. package/dist/agent-farm/servers/tower-instances.js +6 -5
  85. package/dist/agent-farm/servers/tower-instances.js.map +1 -1
  86. package/dist/agent-farm/servers/tower-routes.d.ts.map +1 -1
  87. package/dist/agent-farm/servers/tower-routes.js +19 -16
  88. package/dist/agent-farm/servers/tower-routes.js.map +1 -1
  89. package/dist/agent-farm/servers/tower-server.js +1 -1
  90. package/dist/agent-farm/servers/tower-terminals.d.ts +2 -2
  91. package/dist/agent-farm/servers/tower-terminals.d.ts.map +1 -1
  92. package/dist/agent-farm/servers/tower-terminals.js +47 -18
  93. package/dist/agent-farm/servers/tower-terminals.js.map +1 -1
  94. package/dist/agent-farm/servers/tower-tunnel.js +2 -2
  95. package/dist/agent-farm/servers/tower-tunnel.js.map +1 -1
  96. package/dist/agent-farm/servers/tower-utils.d.ts +9 -6
  97. package/dist/agent-farm/servers/tower-utils.d.ts.map +1 -1
  98. package/dist/agent-farm/servers/tower-utils.js +12 -6
  99. package/dist/agent-farm/servers/tower-utils.js.map +1 -1
  100. package/dist/agent-farm/types.d.ts +9 -0
  101. package/dist/agent-farm/types.d.ts.map +1 -1
  102. package/dist/agent-farm/utils/config.d.ts +11 -0
  103. package/dist/agent-farm/utils/config.d.ts.map +1 -1
  104. package/dist/agent-farm/utils/config.js +21 -0
  105. package/dist/agent-farm/utils/config.js.map +1 -1
  106. package/dist/agent-farm/utils/harness.d.ts +85 -0
  107. package/dist/agent-farm/utils/harness.d.ts.map +1 -0
  108. package/dist/agent-farm/utils/harness.js +212 -0
  109. package/dist/agent-farm/utils/harness.js.map +1 -0
  110. package/dist/cli.d.ts +1 -1
  111. package/dist/cli.d.ts.map +1 -1
  112. package/dist/cli.js +19 -5
  113. package/dist/cli.js.map +1 -1
  114. package/dist/commands/adopt.js +2 -2
  115. package/dist/commands/adopt.js.map +1 -1
  116. package/dist/commands/consult/index.d.ts +37 -3
  117. package/dist/commands/consult/index.d.ts.map +1 -1
  118. package/dist/commands/consult/index.js +220 -150
  119. package/dist/commands/consult/index.js.map +1 -1
  120. package/dist/commands/doctor.d.ts.map +1 -1
  121. package/dist/commands/doctor.js +54 -8
  122. package/dist/commands/doctor.js.map +1 -1
  123. package/dist/commands/init.js +1 -1
  124. package/dist/commands/init.js.map +1 -1
  125. package/dist/commands/porch/artifacts.d.ts +69 -0
  126. package/dist/commands/porch/artifacts.d.ts.map +1 -0
  127. package/dist/commands/porch/artifacts.js +368 -0
  128. package/dist/commands/porch/artifacts.js.map +1 -0
  129. package/dist/commands/porch/checks.d.ts +8 -1
  130. package/dist/commands/porch/checks.d.ts.map +1 -1
  131. package/dist/commands/porch/checks.js +98 -1
  132. package/dist/commands/porch/checks.js.map +1 -1
  133. package/dist/commands/porch/index.d.ts +12 -7
  134. package/dist/commands/porch/index.d.ts.map +1 -1
  135. package/dist/commands/porch/index.js +216 -61
  136. package/dist/commands/porch/index.js.map +1 -1
  137. package/dist/commands/porch/next.d.ts.map +1 -1
  138. package/dist/commands/porch/next.js +72 -74
  139. package/dist/commands/porch/next.js.map +1 -1
  140. package/dist/commands/porch/notify.d.ts +2 -2
  141. package/dist/commands/porch/notify.js +5 -5
  142. package/dist/commands/porch/notify.js.map +1 -1
  143. package/dist/commands/porch/prompts.d.ts +2 -1
  144. package/dist/commands/porch/prompts.d.ts.map +1 -1
  145. package/dist/commands/porch/prompts.js +19 -7
  146. package/dist/commands/porch/prompts.js.map +1 -1
  147. package/dist/commands/porch/state.d.ts +27 -2
  148. package/dist/commands/porch/state.d.ts.map +1 -1
  149. package/dist/commands/porch/state.js +96 -9
  150. package/dist/commands/porch/state.js.map +1 -1
  151. package/dist/commands/porch/types.d.ts +8 -0
  152. package/dist/commands/porch/types.d.ts.map +1 -1
  153. package/dist/lib/config.d.ts +14 -0
  154. package/dist/lib/config.d.ts.map +1 -1
  155. package/dist/lib/config.js +7 -0
  156. package/dist/lib/config.js.map +1 -1
  157. package/dist/lib/forge-contracts.d.ts +9 -0
  158. package/dist/lib/forge-contracts.d.ts.map +1 -1
  159. package/dist/lib/forge-contracts.js.map +1 -1
  160. package/dist/lib/forge.js +1 -1
  161. package/dist/lib/forge.js.map +1 -1
  162. package/dist/lib/team-github.d.ts +49 -0
  163. package/dist/lib/team-github.d.ts.map +1 -1
  164. package/dist/lib/team-github.js +115 -6
  165. package/dist/lib/team-github.js.map +1 -1
  166. package/dist/terminal/pty-manager.d.ts.map +1 -1
  167. package/dist/terminal/pty-manager.js +2 -0
  168. package/dist/terminal/pty-manager.js.map +1 -1
  169. package/dist/terminal/ws-protocol.d.ts +10 -8
  170. package/dist/terminal/ws-protocol.d.ts.map +1 -1
  171. package/dist/terminal/ws-protocol.js +3 -0
  172. package/dist/terminal/ws-protocol.js.map +1 -1
  173. package/package.json +28 -25
  174. package/scripts/forge/gitea/auth-status.sh +0 -0
  175. package/scripts/forge/gitea/issue-comment.sh +0 -0
  176. package/scripts/forge/gitea/issue-list.sh +0 -0
  177. package/scripts/forge/gitea/issue-view.sh +0 -0
  178. package/scripts/forge/gitea/pr-exists.sh +4 -1
  179. package/scripts/forge/gitea/pr-list.sh +0 -0
  180. package/scripts/forge/gitea/pr-merge.sh +0 -0
  181. package/scripts/forge/gitea/pr-view.sh +0 -0
  182. package/scripts/forge/gitea/recently-closed.sh +0 -0
  183. package/scripts/forge/gitea/recently-merged.sh +0 -0
  184. package/scripts/forge/gitea/repo-archive.sh +0 -0
  185. package/scripts/forge/gitea/user-identity.sh +0 -0
  186. package/scripts/forge/github/auth-status.sh +0 -0
  187. package/scripts/forge/github/issue-comment.sh +0 -0
  188. package/scripts/forge/github/issue-list.sh +2 -2
  189. package/scripts/forge/github/issue-view.sh +0 -0
  190. package/scripts/forge/github/on-it-timestamps.sh +0 -0
  191. package/scripts/forge/github/pr-diff.sh +0 -0
  192. package/scripts/forge/github/pr-exists.sh +3 -1
  193. package/scripts/forge/github/pr-list.sh +2 -2
  194. package/scripts/forge/github/pr-merge.sh +0 -0
  195. package/scripts/forge/github/pr-search.sh +0 -0
  196. package/scripts/forge/github/pr-view.sh +0 -0
  197. package/scripts/forge/github/recently-closed.sh +0 -0
  198. package/scripts/forge/github/recently-merged.sh +0 -0
  199. package/scripts/forge/github/repo-archive.sh +0 -0
  200. package/scripts/forge/github/team-activity.sh +0 -0
  201. package/scripts/forge/github/user-identity.sh +0 -0
  202. package/scripts/forge/gitlab/auth-status.sh +0 -0
  203. package/scripts/forge/gitlab/issue-comment.sh +0 -0
  204. package/scripts/forge/gitlab/issue-list.sh +0 -0
  205. package/scripts/forge/gitlab/issue-view.sh +0 -0
  206. package/scripts/forge/gitlab/pr-diff.sh +0 -0
  207. package/scripts/forge/gitlab/pr-exists.sh +3 -1
  208. package/scripts/forge/gitlab/pr-list.sh +0 -0
  209. package/scripts/forge/gitlab/pr-merge.sh +0 -0
  210. package/scripts/forge/gitlab/pr-search.sh +0 -0
  211. package/scripts/forge/gitlab/pr-view.sh +0 -0
  212. package/scripts/forge/gitlab/recently-closed.sh +0 -0
  213. package/scripts/forge/gitlab/recently-merged.sh +0 -0
  214. package/scripts/forge/gitlab/repo-archive.sh +0 -0
  215. package/scripts/forge/gitlab/user-identity.sh +0 -0
  216. package/scripts/postinstall.mjs +51 -0
  217. package/skeleton/.claude/skills/afx/SKILL.md +144 -0
  218. package/skeleton/.claude/skills/codev/SKILL.md +3 -3
  219. package/skeleton/.claude/skills/consult/SKILL.md +1 -1
  220. package/skeleton/.claude/skills/porch/SKILL.md +2 -2
  221. package/skeleton/DEPENDENCIES.md +1 -1
  222. package/skeleton/builders.md +4 -4
  223. package/skeleton/protocol-schema.json +2 -2
  224. package/skeleton/protocols/air/builder-prompt.md +6 -6
  225. package/skeleton/protocols/air/prompts/pr.md +17 -5
  226. package/skeleton/protocols/air/protocol.md +1 -2
  227. package/skeleton/protocols/aspir/builder-prompt.md +28 -6
  228. package/skeleton/protocols/aspir/prompts/review.md +11 -0
  229. package/skeleton/protocols/aspir/protocol.json +9 -1
  230. package/skeleton/protocols/aspir/protocol.md +1 -1
  231. package/skeleton/protocols/aspir/templates/plan.md +0 -20
  232. package/skeleton/protocols/aspir/templates/spec.md +0 -28
  233. package/skeleton/protocols/bugfix/builder-prompt.md +6 -6
  234. package/skeleton/protocols/bugfix/prompts/pr.md +16 -4
  235. package/skeleton/protocols/experiment/builder-prompt.md +15 -0
  236. package/skeleton/protocols/experiment/protocol.md +1 -6
  237. package/skeleton/protocols/maintain/builder-prompt.md +12 -11
  238. package/skeleton/protocols/maintain/prompts/maintain.md +88 -0
  239. package/skeleton/protocols/maintain/prompts/review.md +84 -0
  240. package/skeleton/protocols/maintain/protocol.json +14 -68
  241. package/skeleton/protocols/maintain/protocol.md +111 -409
  242. package/skeleton/protocols/maintain/templates/maintenance-run.md +18 -49
  243. package/skeleton/protocols/protocol-schema.json +1 -1
  244. package/skeleton/protocols/research/builder-prompt.md +85 -0
  245. package/skeleton/protocols/research/protocol.json +118 -0
  246. package/skeleton/protocols/research/protocol.md +169 -0
  247. package/skeleton/protocols/spike/builder-prompt.md +1 -1
  248. package/skeleton/protocols/spike/protocol.md +4 -4
  249. package/skeleton/protocols/spir/builder-prompt.md +28 -5
  250. package/skeleton/protocols/spir/prompts/review.md +11 -0
  251. package/skeleton/protocols/spir/protocol.json +9 -1
  252. package/skeleton/protocols/spir/protocol.md +2 -2
  253. package/skeleton/protocols/spir/templates/plan.md +0 -20
  254. package/skeleton/protocols/spir/templates/spec.md +0 -28
  255. package/skeleton/resources/commands/agent-farm.md +84 -84
  256. package/skeleton/resources/commands/codev.md +1 -1
  257. package/skeleton/resources/commands/consult.md +16 -7
  258. package/skeleton/resources/commands/overview.md +14 -15
  259. package/skeleton/resources/risk-triage.md +1 -1
  260. package/skeleton/resources/workflow-reference.md +14 -14
  261. package/skeleton/roles/architect.md +39 -39
  262. package/skeleton/roles/builder.md +22 -14
  263. package/skeleton/templates/AGENTS.md +5 -3
  264. package/skeleton/templates/CLAUDE.md +5 -3
  265. package/skeleton/templates/cheatsheet.md +12 -12
  266. package/templates/3d-viewer.html +16 -18
  267. package/templates/tower.html +1 -1
  268. package/dashboard/dist/assets/index-CTrlY11L.js +0 -194
  269. package/dashboard/dist/assets/index-CTrlY11L.js.map +0 -1
  270. package/skeleton/.claude/skills/af/SKILL.md +0 -146
  271. package/skeleton/porch/prompts/understand.md +0 -61
  272. package/skeleton/porch/prompts/verify.md +0 -58
  273. package/skeleton/protocols/maintain/prompts/audit.md +0 -111
  274. package/skeleton/protocols/maintain/prompts/clean.md +0 -91
  275. package/skeleton/protocols/maintain/prompts/sync.md +0 -113
  276. package/skeleton/protocols/maintain/prompts/verify.md +0 -110
  277. package/skeleton/protocols/tick/builder-prompt.md +0 -65
  278. package/skeleton/protocols/tick/consult-types/impl-review.md +0 -72
  279. package/skeleton/protocols/tick/consult-types/plan-review.md +0 -59
  280. package/skeleton/protocols/tick/consult-types/pr-review.md +0 -72
  281. package/skeleton/protocols/tick/consult-types/spec-review.md +0 -55
  282. package/skeleton/protocols/tick/protocol.json +0 -151
  283. package/skeleton/protocols/tick/protocol.md +0 -277
  284. package/skeleton/protocols/tick/templates/plan.md +0 -67
  285. package/skeleton/protocols/tick/templates/review.md +0 -89
  286. package/skeleton/protocols/tick/templates/spec.md +0 -61
@@ -1,64 +1,33 @@
1
- # Maintenance Run NNN
1
+ # Maintenance Run NNNN
2
2
 
3
- ## Metadata
4
- - **Date**: YYYY-MM-DD
5
- - **Base Commit**: (commit hash at start)
6
- - **PR**: #NNN
7
- - **Scope**: full | code-only | docs-only
3
+ **Date**: YYYY-MM-DD
4
+ **Base Commit**: <hash>
5
+ **PR**: #NNN
8
6
 
9
7
  ## Changes Since Last Run
10
8
 
11
- <!-- Auto-generated summary of commits since last maintenance -->
9
+ <key commits or summary>
12
10
 
13
- ```
14
- git log --oneline <last-maint-commit>..HEAD
15
- ```
11
+ ## What Was Done
16
12
 
17
- ## Tasks Completed
13
+ ### Dead Code Removed
14
+ - <file>: <item> — <reason>
18
15
 
19
- ### Code Hygiene
20
- - [ ] Dead code removal
21
- - [ ] Unused dependencies
22
- - [ ] Dependency updates
23
- - [ ] Test maintenance
16
+ ### Dependencies Cleaned
17
+ - <package> — <reason>
24
18
 
25
- ### Documentation
26
- - [ ] arch.md sync
27
- - [ ] lessons-learned.md generation
28
- - [ ] CLAUDE.md / AGENTS.md sync
29
- - [ ] Documentation pruning (obsolete content, size limits)
19
+ ### Documentation Updated
20
+ - arch.md: <what changed>
21
+ - lessons-learned.md: <what changed>
30
22
 
31
- ### Framework
32
- - [ ] codev update
33
- - [ ] GitHub Issue status updates (close completed, update labels)
34
-
35
- ## Findings
36
-
37
- <!-- Notable discoveries during maintenance -->
38
-
39
- ## Documentation Changes
40
-
41
- <!-- REQUIRED: Log all documentation deletions/moves with justification -->
42
-
43
- ### arch.md
44
- | Section | Action | Reason |
45
- |---------|--------|--------|
46
- | (example) | KEPT/MOVED/DELETED | (justification) |
47
-
48
- ### CLAUDE.md
49
- | Section | Action | Reason |
50
- |---------|--------|--------|
51
- | (example) | KEPT/MOVED/DELETED | (justification) |
52
-
53
- ### README.md
54
- | Section | Action | Reason |
55
- |---------|--------|--------|
56
- | (example) | KEPT/MOVED/DELETED | (justification) |
23
+ ### Documentation Changes Log
24
+ | Document | Section | Action | Reason |
25
+ |----------|---------|--------|--------|
57
26
 
58
27
  ## Deferred
59
28
 
60
- <!-- Items discovered but deferred to next run, with reason -->
29
+ - <items found but not fixed, with reason>
61
30
 
62
31
  ## Summary
63
32
 
64
- <!-- Brief summary of what was accomplished -->
33
+ <2-3 sentences>
@@ -8,7 +8,7 @@
8
8
  "properties": {
9
9
  "name": {
10
10
  "type": "string",
11
- "description": "Protocol identifier (e.g., 'spir', 'tick', 'bugfix')"
11
+ "description": "Protocol identifier (e.g., 'spir', 'bugfix', 'air')"
12
12
  },
13
13
  "version": {
14
14
  "type": "string",
@@ -0,0 +1,85 @@
1
+ # {{protocol_name}} Builder ({{mode}} mode)
2
+
3
+ You are conducting multi-agent research.
4
+
5
+ {{#if mode_soft}}
6
+ ## Mode: SOFT
7
+ You are running in SOFT mode. This means:
8
+ - You follow the RESEARCH protocol yourself (no porch orchestration)
9
+ - The architect monitors your work and verifies you're adhering to the protocol
10
+ - Use `consult` for the 3-way investigation and critique phases
11
+ {{/if}}
12
+
13
+ {{#if mode_strict}}
14
+ ## Mode: STRICT
15
+ You are running in STRICT mode. This means:
16
+ - Porch orchestrates your work
17
+ - Run: `porch next` to get your next tasks
18
+ - Follow porch signals and gate approvals
19
+
20
+ ### ABSOLUTE RESTRICTIONS (STRICT MODE)
21
+ - **NEVER edit `status.yaml` directly** — only porch commands may modify project state
22
+ - **NEVER call `porch approve` without explicit human approval** — only run it after the architect says to
23
+ - **NEVER skip the 3-way consultation** — always follow porch next → porch done cycle
24
+ {{/if}}
25
+
26
+ ## Protocol
27
+ Follow the RESEARCH protocol: `codev/protocols/research/protocol.md`
28
+
29
+ ## RESEARCH Overview
30
+
31
+ The RESEARCH protocol produces a high-confidence research report through triangulation:
32
+
33
+ 1. **Scope** — Define the precise question, scope, and acceptance criteria. Write a research brief. Gate: architect approval before proceeding.
34
+ 2. **Investigate** — Dispatch the brief to 3 models (Gemini, Codex, Claude) in parallel. Each investigates independently. No anchoring — they don't see each other's work.
35
+ 3. **Synthesize** — Read all 3 reports. Identify consensus, disagreements, and unique contributions. Write a single synthesis report organized by topic (not by model).
36
+ 4. **Critique** — Send the synthesis back to all 3 models for critique. Incorporate valid feedback. Document rejected critique. Finalize the report.
37
+
38
+ ## Output Location
39
+
40
+ All artifacts go to `codev/research/`:
41
+ - `<topic>-brief.md` — the scoped question (Phase 1)
42
+ - `<topic>-gemini.md`, `<topic>-codex.md`, `<topic>-claude.md` — individual investigations (Phase 2)
43
+ - `<topic>.md` — the final synthesis report (Phase 3+4, this is the deliverable)
44
+ - `<topic>-critique-rebuttals.md` — critique responses (Phase 4)
45
+
46
+ {{#if task}}
47
+ ## Research Topic
48
+ {{task_text}}
49
+ {{/if}}
50
+
51
+ ## Key Principles
52
+
53
+ - **Triangulate**: consensus across 3 models > any single model's claim
54
+ - **Cite sources**: tell investigators to provide sources where possible
55
+ - **Be candid about uncertainty**: "I don't know" > confabulation
56
+ - **Organize by topic, not by model**: the synthesis is a standalone document
57
+ - **Note surprises**: the most valuable findings are often unexpected
58
+ - **Keep it concise**: the synthesis should be shorter than the sum of the investigations
59
+
60
+ ## Using consult for 3-way Investigation
61
+
62
+ For the investigate phase, use the `consult` CLI to dispatch to each model:
63
+
64
+ ```bash
65
+ # Phase 2: parallel investigation
66
+ consult -m gemini --prompt-file codev/research/<topic>-brief.md --output codev/research/<topic>-gemini.md &
67
+ consult -m codex --prompt-file codev/research/<topic>-brief.md --output codev/research/<topic>-codex.md &
68
+ consult -m claude --prompt-file codev/research/<topic>-brief.md --output codev/research/<topic>-claude.md &
69
+ wait
70
+ ```
71
+
72
+ For the critique phase:
73
+ ```bash
74
+ # Phase 4: parallel critique
75
+ consult -m gemini --prompt "Critique this research synthesis for gaps, errors, and bias:" --prompt-file codev/research/<topic>.md --output codev/research/<topic>-critique-gemini.md &
76
+ consult -m codex --prompt "Critique this research synthesis for gaps, errors, and bias:" --prompt-file codev/research/<topic>.md --output codev/research/<topic>-critique-codex.md &
77
+ consult -m claude --prompt "Critique this research synthesis for gaps, errors, and bias:" --prompt-file codev/research/<topic>.md --output codev/research/<topic>-critique-claude.md &
78
+ wait
79
+ ```
80
+
81
+ ## Getting Started
82
+ 1. Read the RESEARCH protocol document
83
+ 2. Understand the research question from the architect
84
+ 3. Write the research brief (Phase 1)
85
+ 4. Wait for scope-approval before proceeding to investigation
@@ -0,0 +1,118 @@
1
+ {
2
+ "$schema": "../../protocol-schema.json",
3
+ "name": "research",
4
+ "version": "1.0.0",
5
+ "description": "Multi-agent research with 3-way investigation, synthesis, and critique",
6
+ "input": {
7
+ "type": "none",
8
+ "required": false,
9
+ "default_for": []
10
+ },
11
+ "hooks": {
12
+ "pre-spawn": {}
13
+ },
14
+ "phases": [
15
+ {
16
+ "id": "scope",
17
+ "name": "Scope",
18
+ "description": "Define the research question, scope, and acceptance criteria",
19
+ "type": "once",
20
+ "steps": [
21
+ "clarify_question",
22
+ "define_scope",
23
+ "define_acceptance_criteria",
24
+ "create_research_brief"
25
+ ],
26
+ "gate": {
27
+ "name": "scope-approval",
28
+ "description": "Architect confirms the research question is correctly scoped",
29
+ "requires": ["research_brief_exists"],
30
+ "next": "investigate"
31
+ }
32
+ },
33
+ {
34
+ "id": "investigate",
35
+ "name": "Investigate",
36
+ "description": "3-way parallel investigation — each model researches independently",
37
+ "type": "once",
38
+ "steps": [
39
+ "dispatch_gemini_investigation",
40
+ "dispatch_codex_investigation",
41
+ "dispatch_claude_investigation",
42
+ "collect_all_reports"
43
+ ],
44
+ "consultation": {
45
+ "enabled": true,
46
+ "models": ["codex"],
47
+ "parallel": true,
48
+ "type": "investigation"
49
+ },
50
+ "transition": {
51
+ "on_complete": "synthesize"
52
+ }
53
+ },
54
+ {
55
+ "id": "synthesize",
56
+ "name": "Synthesize",
57
+ "description": "Merge the 3 investigation reports into a single coherent research document",
58
+ "type": "once",
59
+ "steps": [
60
+ "read_all_investigation_reports",
61
+ "identify_consensus_and_disagreements",
62
+ "resolve_conflicts",
63
+ "write_synthesis_report"
64
+ ],
65
+ "transition": {
66
+ "on_complete": "critique"
67
+ }
68
+ },
69
+ {
70
+ "id": "critique",
71
+ "name": "Critique",
72
+ "description": "3-way review of the synthesis — each model critiques for gaps, errors, and bias",
73
+ "type": "once",
74
+ "steps": [
75
+ "dispatch_gemini_critique",
76
+ "dispatch_codex_critique",
77
+ "dispatch_claude_critique",
78
+ "incorporate_feedback",
79
+ "finalize_report"
80
+ ],
81
+ "consultation": {
82
+ "enabled": true,
83
+ "models": ["codex"],
84
+ "parallel": true,
85
+ "type": "critique"
86
+ },
87
+ "gate": {
88
+ "name": "research-complete",
89
+ "description": "Research report finalized",
90
+ "requires": ["report_finalized"],
91
+ "next": null
92
+ }
93
+ }
94
+ ],
95
+ "signals": {
96
+ "PHASE_COMPLETE": {
97
+ "description": "Signal current phase is complete",
98
+ "transitions_to": "next_phase"
99
+ },
100
+ "BLOCKED": {
101
+ "description": "Signal research is blocked",
102
+ "requires": "reason"
103
+ },
104
+ "SCOPE_REJECTED": {
105
+ "description": "Architect rejects the scope — rework needed",
106
+ "transitions_to": "scope"
107
+ }
108
+ },
109
+ "defaults": {
110
+ "mode": "strict",
111
+ "consultation": {
112
+ "enabled": true,
113
+ "models": ["codex"],
114
+ "parallel": true
115
+ },
116
+ "checks": {}
117
+ }
118
+ }
@@ -0,0 +1,169 @@
1
+ # RESEARCH Protocol
2
+
3
+ ## Overview
4
+
5
+ Multi-agent research with 3-way investigation, synthesis, and critique. Three AI models independently investigate a question, their findings are synthesized into a single report, and then all three models critique the synthesis for gaps, errors, and bias.
6
+
7
+ **Core Principle**: Triangulate. No single model's knowledge is authoritative. Consensus across models is more reliable than any individual output.
8
+
9
+ ## When to Use
10
+
11
+ **Use for**: Competitive analysis, technology evaluation, market research, architectural decision support, "what's the state of X?" questions, exploring unfamiliar domains.
12
+
13
+ **Skip for**: Implementation work (use SPIR/ASPIR), quick questions (just ask), experiments (use EXPERIMENT), known-answer lookups (just search).
14
+
15
+ ## Output
16
+
17
+ All research artifacts go to `codev/research/`. The final deliverable is a single synthesis report at `codev/research/<topic>.md`.
18
+
19
+ ## Phases
20
+
21
+ ### Phase 1: Scope
22
+
23
+ **Purpose**: Make sure we're asking the right question before spending 3 models' worth of compute on answering it.
24
+
25
+ The builder:
26
+ 1. Reads the architect's research request
27
+ 2. Clarifies the question — what specifically are we trying to learn?
28
+ 3. Defines the scope — what's in, what's out, what depth is needed
29
+ 4. Defines acceptance criteria — what does a good answer look like?
30
+ 5. Writes a **research brief** (`codev/research/<topic>-brief.md`) with:
31
+ - The precise question(s)
32
+ - Scope boundaries
33
+ - **Required targets** (when applicable — not all research questions have them). When the user names specific projects, products, or systems, those are exemplars of a CLASS, not an exhaustive list. The brief should:
34
+ - List the named targets as required coverage (each gets a dedicated section)
35
+ - Identify the CLASS they represent (e.g., "open-source always-on agent frameworks")
36
+ - Instruct investigators to find OTHER members of that class the user didn't name — discovering what the user SHOULD be thinking about is often the most valuable part of the research
37
+ - If an investigator cannot find information about a required target, they must say so explicitly — not silently skip it
38
+ - **Optional context** — additional sources that may be useful but are not required
39
+ - What a useful answer looks like
40
+ - Suggested sources or angles for the investigators
41
+ 6. Sends the brief to the architect for approval
42
+
43
+ **Gate**: `scope-approval` — the architect confirms the question is correctly scoped before the 3-way investigation begins. This prevents wasting compute on a badly-framed question.
44
+
45
+ ### Phase 2: Investigate (3-way parallel)
46
+
47
+ **Purpose**: Get three independent perspectives on the question.
48
+
49
+ The builder dispatches the research brief to three models (Gemini, Codex, Claude) via `consult`. Each model:
50
+ 1. Receives the scoped research brief
51
+ 2. Independently investigates using web search, its training knowledge, and reasoning
52
+ 3. Produces a standalone investigation report with:
53
+ - **A dedicated section for each required target** from the brief. Every required target gets its own heading with specific findings — not mentioned in passing, not substituted with an easier target. If a required target yields no findings, the section must say "No information found" rather than being omitted.
54
+ - Findings (with sources where possible)
55
+ - Confidence levels on key claims
56
+ - Gaps it couldn't fill
57
+ - Surprises or things that contradicted expectations
58
+
59
+ The investigations run in **parallel** — each model works independently without seeing the others' output. This prevents anchoring bias.
60
+
61
+ Investigation reports are saved to:
62
+ - `codev/research/<topic>-gemini.md`
63
+ - `codev/research/<topic>-codex.md`
64
+ - `codev/research/<topic>-claude.md`
65
+
66
+ ### Phase 3: Synthesize
67
+
68
+ **Purpose**: Merge three independent reports into one coherent document.
69
+
70
+ The builder:
71
+ 1. Reads all three investigation reports
72
+ 2. Identifies **consensus** — what all three agree on (highest confidence)
73
+ 3. Identifies **disagreements** — where models contradict each other
74
+ 4. Resolves conflicts — picks the best-supported position, notes the disagreement
75
+ 5. Identifies **unique contributions** — things only one model found that the others missed
76
+ 6. Writes the **synthesis report** (`codev/research/<topic>.md`) with:
77
+ - **Scope summary** — a short section (before the executive summary) restating the research question, required targets, and scope boundaries from the brief. A reader should understand what was asked without needing to read the brief separately.
78
+ - Executive summary
79
+ - Findings (organized by topic, not by model)
80
+ - Confidence annotations (consensus vs. single-source)
81
+ - Gaps and limitations
82
+ - Recommendations (if the research brief asked for them)
83
+
84
+ The synthesis is written as a **standalone document** — a reader should never need to reference the individual investigation reports. Those are kept as appendices for traceability.
85
+
86
+ ### Phase 4: Critique (3-way review)
87
+
88
+ **Purpose**: Pressure-test the synthesis for gaps, errors, and bias.
89
+
90
+ The builder dispatches the synthesis report back to all three models for critique. Each model:
91
+ 1. Reads the synthesis
92
+ 2. **Checks coverage against the brief** — does every required target from the research brief have dedicated coverage in the synthesis? Lists any required targets that were named in the brief but have zero or minimal coverage. This is the #1 critique check.
93
+ 3. Checks for factual errors or unsupported claims
94
+ 4. Identifies gaps — important aspects the synthesis missed
95
+ 5. Flags potential bias — did the synthesis over-weight one model's perspective?
96
+ 6. Suggests specific improvements
97
+
98
+ The builder then:
99
+ 1. Incorporates valid critique
100
+ 2. Documents rejected critique with rationale
101
+ 3. Finalizes the report
102
+ 4. Commits to `codev/research/<topic>.md`
103
+
104
+ ## File Structure
105
+
106
+ Only the brief and final report are checked in. Individual investigation reports and full critique outputs are working artifacts — useful during the process but not committed to the repo.
107
+
108
+ ```
109
+ codev/research/
110
+ ├── <topic>-brief.md # Phase 1: scoped research question (checked in)
111
+ └── <topic>.md # Phase 3+4: final synthesis (the deliverable, checked in)
112
+ ```
113
+
114
+ The final report includes:
115
+ - A **"Disagreements and resolution"** section documenting where the three investigators disagreed and how the synthesis resolved each disagreement
116
+ - A **"Changes from critique"** section summarizing what the critique phase changed (not the full critique — just what was added, removed, or corrected and why)
117
+
118
+ Individual investigation reports (`<topic>-gemini.md`, `<topic>-codex.md`, `<topic>-claude.md`) and raw critique outputs are kept locally during the research process but NOT committed. The final report is the deliverable; the process artifacts are disposable.
119
+
120
+ ## Best Practices
121
+
122
+ ### Scoping
123
+ - A good research question is specific enough to answer in 1500-3000 words per model
124
+ - "What's the state of X?" is too broad — "What are the top 5 players in X, their strengths/weaknesses, and the structural gaps?" is better
125
+ - Include the "so what" — why are we researching this? What decision does it inform?
126
+
127
+ ### Investigation
128
+ - Tell each model to cite sources where possible
129
+ - Tell each model to be candid about uncertainty — "I don't know" is better than confabulation
130
+ - Tell each model to note surprises — the most valuable findings are often the unexpected ones
131
+
132
+ ### Synthesis
133
+ - Organize by topic, not by model ("here's what we found about X" not "here's what Gemini said")
134
+ - Weight consensus over single-model claims
135
+ - Don't smooth over disagreements — note them explicitly
136
+ - Keep the synthesis shorter than the sum of the investigations
137
+
138
+ ### Critique
139
+ - Critiquers should focus on gaps and errors, not style
140
+ - A critique that says "add more about X" is useful; "rewrite the intro" is not
141
+ - The builder should reject critique that's outside the original scope
142
+
143
+ ## Integration with Other Protocols
144
+
145
+ ### Research → SPIR
146
+ When research informs a feature decision:
147
+ 1. Reference the research report in the spec
148
+ 2. Link specific findings as evidence for design choices
149
+
150
+ ### Research → EXPERIMENT
151
+ When research identifies something worth testing:
152
+ 1. Create an experiment to validate the research finding
153
+ 2. Reference the research report as motivation
154
+
155
+ ## Git Workflow
156
+
157
+ ### Commits
158
+ ```
159
+ [Research: topic] Scoped research brief
160
+ [Research: topic] 3-way investigation complete
161
+ [Research: topic] Synthesis report
162
+ [Research: topic] Final report (post-critique)
163
+ ```
164
+
165
+ ### What to Commit
166
+ - All investigation reports (for traceability)
167
+ - The final synthesis (the deliverable)
168
+ - The critique rebuttals (for process transparency)
169
+ - Do NOT commit raw web search results or intermediate notes
@@ -37,7 +37,7 @@ Follow this 3-step workflow. You can skip or reorder steps as the investigation
37
37
  - Write findings to `codev/spikes/<id>-<name>.md` using the template
38
38
  - Provide a clear feasibility verdict: Feasible / Not Feasible / Feasible with Caveats
39
39
  - Commit the findings document
40
- - Notify the architect: `af send architect "Spike <id> complete. Verdict: [verdict]"`
40
+ - Notify the architect: `afx send architect "Spike <id> complete. Verdict: [verdict]"`
41
41
 
42
42
  ## Key Principles
43
43
 
@@ -10,7 +10,7 @@ Time-boxed technical feasibility exploration. Answer "Can we do X?" and "What wo
10
10
 
11
11
  **Use for**: Quick technical feasibility investigations, proof-of-concept explorations, "can we do X?" questions, evaluating approaches before committing to SPIR
12
12
 
13
- **Skip for**: Production code (use SPIR), formal hypothesis testing (use EXPERIMENT), bug fixes (use BUGFIX), well-understood implementations (use TICK)
13
+ **Skip for**: Production code (use SPIR), formal hypothesis testing (use EXPERIMENT), bug fixes (use BUGFIX)
14
14
 
15
15
  ### Spike vs Experiment
16
16
 
@@ -25,8 +25,8 @@ Time-boxed technical feasibility exploration. Answer "Can we do X?" and "What wo
25
25
  ## Spawning a Spike
26
26
 
27
27
  ```bash
28
- af spawn --task "Can we use WebSockets for real-time updates?" --protocol spike
29
- af spawn --task "What would it take to support SQLite FTS?" --protocol spike
28
+ afx spawn --task "Can we use WebSockets for real-time updates?" --protocol spike
29
+ afx spawn --task "What would it take to support SQLite FTS?" --protocol spike
30
30
  ```
31
31
 
32
32
  Spikes are always soft mode — no porch orchestration, no gates, no consultation.
@@ -83,7 +83,7 @@ POC code from the iterate step is committed to the spike branch alongside the fi
83
83
 
84
84
  In all cases, notify the architect:
85
85
  ```bash
86
- af send architect "Spike <id> complete. Verdict: [feasible/not feasible/caveats]"
86
+ afx send architect "Spike <id> complete. Verdict: [feasible/not feasible/caveats]"
87
87
  ```
88
88
 
89
89
  ## Git Workflow
@@ -53,12 +53,35 @@ Follow the implementation plan at: `{{plan.path}}`
53
53
  {{task_text}}
54
54
  {{/if}}
55
55
 
56
+ ## Multi-PR Workflow
57
+
58
+ Your worktree is persistent — it survives across PR merges. You can produce multiple PRs sequentially:
59
+
60
+ 1. Cut a branch, open a PR, wait for merge
61
+ 2. After merge: `git fetch origin main && git checkout -b <next-branch> origin/main`
62
+ 3. Continue to the next phase, open another PR
63
+ 4. Repeat
64
+
65
+ **Important**: Do NOT run `git checkout main` — git worktrees cannot check out a branch that's checked out elsewhere. Always branch off `origin/main` via fetch.
66
+
67
+ Record PRs in status.yaml: `porch done {{project_id}} --pr <N> --branch <name>`
68
+ Record merges: `porch done {{project_id}} --merged <N>`
69
+
70
+ ## Verify Phase
71
+
72
+ After the final PR merges, the project enters the **verify** phase. You stay alive through verify:
73
+ 1. Pull main into your worktree
74
+ 2. Run `porch done {{project_id}}` to signal verification is ready
75
+ 3. The architect approves `verify-approval` when satisfied
76
+
77
+ If verification is not needed: `porch verify {{project_id}} --skip "reason"`
78
+
56
79
  ## Notifications
57
- Always use `af send architect "..."` to notify the architect at key moments:
58
- - **Gate reached**: `af send architect "Project {{project_id}}: <gate-name> ready for approval"`
59
- - **PR ready**: `af send architect "PR #N ready for review (project {{project_id}})"`
60
- - **PR merged**: `af send architect "Project {{project_id}} complete. PR merged. Ready for cleanup."`
61
- - **Blocked**: `af send architect "Blocked on project {{project_id}}: [reason]"`
80
+ Always use `afx send architect "..."` to notify the architect at key moments:
81
+ - **Gate reached**: `afx send architect "Project {{project_id}}: <gate-name> ready for approval"`
82
+ - **PR ready**: `afx send architect "PR #N ready for review (project {{project_id}})"`
83
+ - **PR merged**: `afx send architect "Project {{project_id}} PR merged. Entering verify phase."`
84
+ - **Blocked**: `afx send architect "Blocked on project {{project_id}}: [reason]"`
62
85
 
63
86
  ## Handling Flaky Tests
64
87
 
@@ -181,11 +181,22 @@ Before PR:
181
181
  porch consultation reviews the actual PR, and the architect can review a real PR
182
182
  when the pr gate fires.
183
183
 
184
+ **PR body requirements**: The PR body MUST include `Closes #<N>` (for feature issues)
185
+ or `Fixes #<N>` (for bug issues) for the driving GitHub issue. If the PR closes
186
+ multiple issues (e.g. duplicates consolidated), include one keyword per issue.
187
+ Without this, GitHub will not auto-close the issue on merge.
188
+
189
+ **Exception**: if this PR only partially addresses the issue (e.g. one phase of a
190
+ multi-PR effort), DO NOT use `Closes`/`Fixes` — reference the issue with `Refs #<N>`
191
+ or `Part of #<N>` instead. The issue stays open until the follow-up PR closes it.
192
+
184
193
  ```bash
185
194
  gh pr create --title "[Spec {{project_id}}] {{title}}" --body "$(cat <<'EOF'
186
195
  ## Summary
187
196
  [Brief description of the implementation]
188
197
 
198
+ Closes #<N> <!-- Replace <N> with the driving issue number, or use "Refs #<N>" for partial fixes -->
199
+
189
200
  ## Changes
190
201
  - [Change 1]
191
202
  - [Change 2]
@@ -53,7 +53,7 @@
53
53
  },
54
54
  "checks": {
55
55
  "plan_exists": "test -f codev/plans/${PROJECT_TITLE}.md",
56
- "has_phases_json": "grep -q '\"phases\":' codev/plans/${PROJECT_TITLE}.md",
56
+ "has_phases_json": "grep -qE '\"phases\"\\s*:' codev/plans/${PROJECT_TITLE}.md",
57
57
  "min_two_phases": "grep -o '\"id\": *\"[^\"]*\"' codev/plans/${PROJECT_TITLE}.md | wc -l | awk '$1 >= 2 {exit 0} {exit 1}'"
58
58
  },
59
59
  "gate": "plan-approval",
@@ -135,6 +135,14 @@
135
135
  }
136
136
  },
137
137
  "gate": "pr",
138
+ "next": "verify"
139
+ },
140
+ {
141
+ "id": "verify",
142
+ "name": "Verify",
143
+ "description": "Post-merge environmental verification (optional — skip with porch verify --skip)",
144
+ "type": "once",
145
+ "gate": "verify-approval",
138
146
  "next": null
139
147
  }
140
148
  ],
@@ -9,10 +9,10 @@
9
9
  ## Prerequisites
10
10
 
11
11
  **Clean Worktree Before Spawning Builders**:
12
- - All specs, plans, and local changes **MUST be committed** before `af spawn`
12
+ - All specs, plans, and local changes **MUST be committed** before `afx spawn`
13
13
  - Builders work in git worktrees branched from HEAD — uncommitted files are invisible
14
14
  - This includes `codev update` results, spec drafts, and plan approvals
15
- - The `af spawn` command enforces this (use `--force` to override)
15
+ - The `afx spawn` command enforces this (use `--force` to override)
16
16
 
17
17
  **Required for Multi-Agent Consultation**:
18
18
  - The `consult` CLI must be available (installed with `npm install -g @cluesmith/codev`)
@@ -182,23 +182,3 @@ Phase 1 ──→ Phase 2 ──→ Phase 3
182
182
  ## Notes
183
183
  [Additional context, assumptions, or considerations]
184
184
 
185
- ---
186
-
187
- ## Amendment History
188
-
189
- This section tracks all TICK amendments to this plan. TICKs modify both the spec and plan together as an atomic unit.
190
-
191
- <!-- When adding a TICK amendment, add a new entry below this line in chronological order -->
192
-
193
- <!--
194
- ### TICK-001: [Amendment Title] (YYYY-MM-DD)
195
-
196
- **Changes**:
197
- - [Phase added]: [Description of new phase]
198
- - [Phase modified]: [What was updated]
199
- - [Implementation steps]: [New steps added]
200
-
201
- **Review**: See `reviews/####-name-tick-001.md`
202
-
203
- ---
204
- -->
@@ -152,31 +152,3 @@ Note: All consultation feedback has been incorporated directly into the relevant
152
152
  ## Notes
153
153
  [Any additional context or considerations not covered above]
154
154
 
155
- ---
156
-
157
- ## Amendments
158
-
159
- This section tracks all TICK amendments to this specification. TICKs are lightweight changes that refine an existing spec rather than creating a new one.
160
-
161
- <!-- When adding a TICK amendment, add a new entry below this line in chronological order -->
162
-
163
- <!--
164
- ### TICK-001: [Amendment Title] (YYYY-MM-DD)
165
-
166
- **Summary**: [One-line description of what changed]
167
-
168
- **Problem Addressed**:
169
- [Why this amendment was needed - what gap or issue in the original spec]
170
-
171
- **Spec Changes**:
172
- - [Section modified]: [What changed and why]
173
- - [New section added]: [Purpose]
174
-
175
- **Plan Changes**:
176
- - [Phase added/modified]: [Description]
177
- - [Implementation steps]: [What was updated]
178
-
179
- **Review**: See `reviews/####-name-tick-001.md`
180
-
181
- ---
182
- -->