@entelligentsia/forgecli 1.0.3 → 1.0.10

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 (356) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +2 -1
  3. package/dist/CHANGELOG-forge-plugin.md +100 -0
  4. package/dist/CHANGELOG-pi.md +94 -0
  5. package/dist/extensions/forgecli/forge-artifact-tool.js +27 -4
  6. package/dist/extensions/forgecli/forge-artifact-tool.js.map +1 -1
  7. package/dist/extensions/forgecli/forge-tools.js +2 -2
  8. package/dist/extensions/forgecli/forge-tools.js.map +1 -1
  9. package/dist/extensions/forgecli/subagent/phase-guard.js +15 -5
  10. package/dist/extensions/forgecli/subagent/phase-guard.js.map +1 -1
  11. package/dist/extensions/forgecli/subagent/phase-summary-map.d.ts +1 -0
  12. package/dist/extensions/forgecli/subagent/phase-summary-map.js +17 -0
  13. package/dist/extensions/forgecli/subagent/phase-summary-map.js.map +1 -1
  14. package/dist/forge-payload/.base-pack/workflows/_fragments/store-cli-verbs.md +18 -3
  15. package/dist/forge-payload/.base-pack/workflows/architect_approve.md +4 -5
  16. package/dist/forge-payload/.base-pack/workflows/collator_agent.md +1 -1
  17. package/dist/forge-payload/.base-pack/workflows/commit_task.md +2 -3
  18. package/dist/forge-payload/.base-pack/workflows/implement_plan.md +3 -2
  19. package/dist/forge-payload/.base-pack/workflows/orchestrate_task.md +41 -47
  20. package/dist/forge-payload/.base-pack/workflows/triage.md +2 -2
  21. package/dist/forge-payload/.base-pack/workflows/validate_task.md +2 -3
  22. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  23. package/dist/forge-payload/.schemas/_defs/locator.schema.json +13 -0
  24. package/dist/forge-payload/.schemas/bug.schema.json +1 -0
  25. package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
  26. package/dist/forge-payload/.schemas/migrations.json +63 -0
  27. package/dist/forge-payload/.schemas/sprint.schema.json +1 -0
  28. package/dist/forge-payload/.schemas/task.schema.json +1 -0
  29. package/dist/forge-payload/integrity.json +3 -3
  30. package/dist/forge-payload/meta/workflows/_fragments/store-cli-verbs.md +18 -3
  31. package/dist/forge-payload/meta/workflows/meta-approve.md +4 -5
  32. package/dist/forge-payload/meta/workflows/meta-bug-triage.md +2 -2
  33. package/dist/forge-payload/meta/workflows/meta-collate.md +1 -1
  34. package/dist/forge-payload/meta/workflows/meta-commit.md +2 -3
  35. package/dist/forge-payload/meta/workflows/meta-implement.md +3 -2
  36. package/dist/forge-payload/meta/workflows/meta-orchestrate.md +41 -47
  37. package/dist/forge-payload/meta/workflows/meta-validate.md +2 -3
  38. package/dist/forge-payload/schemas/_defs/locator.schema.json +13 -0
  39. package/dist/forge-payload/schemas/bug.schema.json +1 -0
  40. package/dist/forge-payload/schemas/enum-catalog.json +2 -2
  41. package/dist/forge-payload/schemas/sprint.schema.json +1 -0
  42. package/dist/forge-payload/schemas/structure-manifest.json +3 -2
  43. package/dist/forge-payload/schemas/task.schema.json +1 -0
  44. package/dist/forge-payload/tools/artifact-store.cjs +242 -0
  45. package/dist/forge-payload/tools/artifact.cjs +60 -120
  46. package/dist/forge-payload/tools/lib/artifact-kinds.cjs +95 -0
  47. package/dist/forge-payload/tools/lib/store-nlp.cjs +6 -0
  48. package/dist/forge-payload/tools/lib/store-query-exec.cjs +39 -5
  49. package/dist/forge-payload/tools/lib/suggest.cjs +2 -1
  50. package/dist/forge-payload/tools/preflight-gate.cjs +55 -5
  51. package/dist/forge-payload/tools/store-cli.cjs +50 -15
  52. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts +5 -2
  53. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
  54. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +81 -18
  55. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
  56. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
  57. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js +1 -0
  58. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js.map +1 -1
  59. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.d.ts.map +1 -1
  60. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js +19 -24
  61. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js.map +1 -1
  62. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts +1 -0
  63. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts.map +1 -1
  64. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js +14 -1
  65. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js.map +1 -1
  66. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts +22 -8
  67. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
  68. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js.map +1 -1
  69. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  70. package/node_modules/@earendil-works/pi-ai/README.md +1 -1
  71. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +374 -122
  72. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  73. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +424 -232
  74. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
  75. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts +1 -1
  76. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  77. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js +38 -2
  78. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  79. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  80. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js +21 -12
  81. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js.map +1 -1
  82. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
  83. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js +6 -10
  84. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
  85. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.d.ts.map +1 -1
  86. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js +1 -1
  87. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js.map +1 -1
  88. package/node_modules/@earendil-works/pi-ai/dist/providers/google.d.ts.map +1 -1
  89. package/node_modules/@earendil-works/pi-ai/dist/providers/google.js +5 -3
  90. package/node_modules/@earendil-works/pi-ai/dist/providers/google.js.map +1 -1
  91. package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.d.ts.map +1 -1
  92. package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.js +3 -4
  93. package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.js.map +1 -1
  94. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.d.ts.map +1 -1
  95. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.js +2 -3
  96. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.js.map +1 -1
  97. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  98. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js +159 -78
  99. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  100. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  101. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js +16 -11
  102. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js.map +1 -1
  103. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
  104. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.js +4 -1
  105. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
  106. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
  107. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js +6 -10
  108. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js.map +1 -1
  109. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  110. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.js +1 -0
  111. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.js.map +1 -1
  112. package/node_modules/@earendil-works/pi-ai/dist/stream.d.ts.map +1 -1
  113. package/node_modules/@earendil-works/pi-ai/dist/stream.js +14 -2
  114. package/node_modules/@earendil-works/pi-ai/dist/stream.js.map +1 -1
  115. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +14 -4
  116. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  117. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  118. package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.d.ts +6 -0
  119. package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.d.ts.map +1 -0
  120. package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.js +34 -0
  121. package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.js.map +1 -0
  122. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.d.ts +9 -7
  123. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.d.ts.map +1 -1
  124. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.js +8 -7
  125. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.js.map +1 -1
  126. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  127. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js +1 -1
  128. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  129. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts +1 -1
  130. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts.map +1 -1
  131. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js +1 -1
  132. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js.map +1 -1
  133. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.d.ts +10 -1
  134. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  135. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.js +179 -79
  136. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  137. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  138. package/node_modules/@earendil-works/pi-coding-agent/CHANGELOG.md +94 -0
  139. package/node_modules/@earendil-works/pi-coding-agent/README.md +9 -0
  140. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/args.d.ts +3 -0
  141. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
  142. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/args.js +27 -0
  143. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/args.js.map +1 -1
  144. package/node_modules/@earendil-works/pi-coding-agent/dist/config.d.ts.map +1 -1
  145. package/node_modules/@earendil-works/pi-coding-agent/dist/config.js +15 -2
  146. package/node_modules/@earendil-works/pi-coding-agent/dist/config.js.map +1 -1
  147. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-services.d.ts +1 -0
  148. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-services.d.ts.map +1 -1
  149. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-services.js +1 -0
  150. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-services.js.map +1 -1
  151. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.d.ts +5 -1
  152. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  153. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.js +28 -4
  154. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  155. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  156. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/compaction.js +18 -24
  157. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  158. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.d.ts +1 -1
  159. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  160. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.js +8 -2
  161. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  162. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/types.d.ts +7 -5
  163. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  164. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  165. package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  166. package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-registry.js +65 -13
  167. package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  168. package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  169. package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-resolver.js +1 -1
  170. package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  171. package/node_modules/@earendil-works/pi-coding-agent/dist/core/resolve-config-value.d.ts +9 -1
  172. package/node_modules/@earendil-works/pi-coding-agent/dist/core/resolve-config-value.d.ts.map +1 -1
  173. package/node_modules/@earendil-works/pi-coding-agent/dist/core/resolve-config-value.js +134 -11
  174. package/node_modules/@earendil-works/pi-coding-agent/dist/core/resolve-config-value.js.map +1 -1
  175. package/node_modules/@earendil-works/pi-coding-agent/dist/core/sdk.d.ts +2 -0
  176. package/node_modules/@earendil-works/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  177. package/node_modules/@earendil-works/pi-coding-agent/dist/core/sdk.js +10 -6
  178. package/node_modules/@earendil-works/pi-coding-agent/dist/core/sdk.js.map +1 -1
  179. package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.d.ts +6 -7
  180. package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  181. package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.js +75 -28
  182. package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  183. package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.d.ts +2 -0
  184. package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  185. package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.js +14 -9
  186. package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  187. package/node_modules/@earendil-works/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  188. package/node_modules/@earendil-works/pi-coding-agent/dist/core/system-prompt.js +0 -3
  189. package/node_modules/@earendil-works/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  190. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  191. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit.js +7 -10
  192. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  193. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  194. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  195. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  196. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  197. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  198. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.js +5 -7
  199. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  200. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  201. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.js +6 -7
  202. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  203. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/render-utils.d.ts +5 -2
  204. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/render-utils.d.ts.map +1 -1
  205. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/render-utils.js +17 -1
  206. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/render-utils.js.map +1 -1
  207. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  208. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.js +5 -6
  209. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  210. package/node_modules/@earendil-works/pi-coding-agent/dist/index.d.ts +2 -0
  211. package/node_modules/@earendil-works/pi-coding-agent/dist/index.d.ts.map +1 -1
  212. package/node_modules/@earendil-works/pi-coding-agent/dist/index.js +2 -0
  213. package/node_modules/@earendil-works/pi-coding-agent/dist/index.js.map +1 -1
  214. package/node_modules/@earendil-works/pi-coding-agent/dist/main.d.ts.map +1 -1
  215. package/node_modules/@earendil-works/pi-coding-agent/dist/main.js +69 -16
  216. package/node_modules/@earendil-works/pi-coding-agent/dist/main.js.map +1 -1
  217. package/node_modules/@earendil-works/pi-coding-agent/dist/migrations.d.ts.map +1 -1
  218. package/node_modules/@earendil-works/pi-coding-agent/dist/migrations.js +118 -1
  219. package/node_modules/@earendil-works/pi-coding-agent/dist/migrations.js.map +1 -1
  220. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts +1 -3
  221. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  222. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +2 -4
  223. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
  224. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  225. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/user-message.js +1 -1
  226. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  227. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +3 -0
  228. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  229. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.js +59 -6
  230. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  231. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  232. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/theme/theme.js +10 -0
  233. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  234. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  235. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.js +3 -1
  236. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  237. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -0
  238. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  239. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  240. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/deprecation.d.ts +4 -0
  241. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/deprecation.d.ts.map +1 -0
  242. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/deprecation.js +13 -0
  243. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/deprecation.js.map +1 -0
  244. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/json.d.ts +3 -0
  245. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/json.d.ts.map +1 -0
  246. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/json.js +7 -0
  247. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/json.js.map +1 -0
  248. package/node_modules/@earendil-works/pi-coding-agent/docs/custom-provider.md +13 -10
  249. package/node_modules/@earendil-works/pi-coding-agent/docs/development.md +1 -1
  250. package/node_modules/@earendil-works/pi-coding-agent/docs/extensions.md +12 -6
  251. package/node_modules/@earendil-works/pi-coding-agent/docs/models.md +25 -12
  252. package/node_modules/@earendil-works/pi-coding-agent/docs/providers.md +13 -5
  253. package/node_modules/@earendil-works/pi-coding-agent/docs/quickstart.md +1 -0
  254. package/node_modules/@earendil-works/pi-coding-agent/docs/rpc.md +2 -1
  255. package/node_modules/@earendil-works/pi-coding-agent/docs/sdk.md +6 -0
  256. package/node_modules/@earendil-works/pi-coding-agent/docs/session-format.md +1 -1
  257. package/node_modules/@earendil-works/pi-coding-agent/docs/sessions.md +8 -0
  258. package/node_modules/@earendil-works/pi-coding-agent/docs/settings.md +7 -3
  259. package/node_modules/@earendil-works/pi-coding-agent/docs/terminal-setup.md +2 -0
  260. package/node_modules/@earendil-works/pi-coding-agent/docs/tui.md +2 -2
  261. package/node_modules/@earendil-works/pi-coding-agent/docs/usage.md +9 -0
  262. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/README.md +1 -0
  263. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-anthropic/index.ts +1 -1
  264. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-anthropic/package.json +1 -1
  265. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-gitlab-duo/index.ts +54 -3
  266. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  267. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/git-merge-and-resolve.ts +115 -0
  268. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/input-transform-streaming.ts +39 -0
  269. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/sandbox/package.json +1 -1
  270. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/with-deps/package.json +1 -1
  271. package/node_modules/@earendil-works/pi-coding-agent/npm-shrinkwrap.json +443 -61
  272. package/node_modules/@earendil-works/pi-coding-agent/package.json +6 -6
  273. package/node_modules/@earendil-works/pi-tui/README.md +2 -2
  274. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  275. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +24 -83
  276. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  277. package/node_modules/@earendil-works/pi-tui/dist/components/input.d.ts.map +1 -1
  278. package/node_modules/@earendil-works/pi-tui/dist/components/input.js +7 -55
  279. package/node_modules/@earendil-works/pi-tui/dist/components/input.js.map +1 -1
  280. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts +7 -1
  281. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts.map +1 -1
  282. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js +12 -2
  283. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js.map +1 -1
  284. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +1 -1
  285. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
  286. package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
  287. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts +1 -1
  288. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts.map +1 -1
  289. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js +34 -7
  290. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
  291. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +33 -10
  292. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
  293. package/node_modules/@earendil-works/pi-tui/dist/terminal.js +172 -37
  294. package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
  295. package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts +6 -1
  296. package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts.map +1 -1
  297. package/node_modules/@earendil-works/pi-tui/dist/utils.js +27 -15
  298. package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
  299. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.d.ts +25 -0
  300. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.d.ts.map +1 -0
  301. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.js +96 -0
  302. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.js.map +1 -0
  303. package/node_modules/@earendil-works/pi-tui/package.json +2 -2
  304. package/node_modules/@entelligentsia/forge-compress/LICENSE +21 -0
  305. package/node_modules/@entelligentsia/forge-compress/README.md +85 -0
  306. package/node_modules/@mariozechner/clipboard/Cargo.toml +3 -3
  307. package/node_modules/@mariozechner/clipboard/index.d.ts +34 -20
  308. package/node_modules/@mariozechner/clipboard/index.js +546 -257
  309. package/node_modules/@mariozechner/clipboard/package.json +5 -6
  310. package/node_modules/@mariozechner/clipboard/package.json.prepack-backup +14 -14
  311. package/node_modules/@mariozechner/clipboard/src/lib.rs +4 -9
  312. package/node_modules/@mariozechner/clipboard-linux-x64-gnu/clipboard.linux-x64-gnu.node +0 -0
  313. package/node_modules/@mariozechner/clipboard-linux-x64-gnu/package.json +2 -2
  314. package/package.json +7 -7
  315. package/dist/forge-payload/.base-pack/commands/quiz-agent.md +0 -6
  316. package/dist/forge-payload/.base-pack/commands/retrospective.md +0 -6
  317. package/dist/forge-payload/.base-pack/commands/sprint-intake.md +0 -6
  318. package/dist/forge-payload/.base-pack/commands/sprint-plan.md +0 -6
  319. package/dist/forge-payload/commands/calibrate.md +0 -10
  320. package/dist/forge-payload/commands/materialize.md +0 -119
  321. package/dist/forge-payload/commands/migrate.md +0 -12
  322. package/dist/forge-payload/commands/quiz-agent.md +0 -6
  323. package/dist/forge-payload/commands/regenerate.md +0 -6
  324. package/dist/forge-payload/commands/store-query.md +0 -6
  325. package/dist/forge-payload/commands/store-repair.md +0 -6
  326. package/dist/forge-payload/commands/update-tools.md +0 -10
  327. package/dist/forge-payload/meta/templates/meta-retrospective.md +0 -28
  328. package/dist/forge-payload/tools/prompts/sprint-plan-prompt.md +0 -70
  329. package/dist/forge-payload/tools/schemas/task-list.schema.json +0 -53
  330. package/node_modules/@earendil-works/pi-agent-core/dist/harness/execution-env.d.ts +0 -4
  331. package/node_modules/@earendil-works/pi-agent-core/dist/harness/execution-env.d.ts.map +0 -1
  332. package/node_modules/@earendil-works/pi-agent-core/dist/harness/execution-env.js +0 -3
  333. package/node_modules/@earendil-works/pi-agent-core/dist/harness/execution-env.js.map +0 -1
  334. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/jsonl.d.ts +0 -20
  335. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/jsonl.d.ts.map +0 -1
  336. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/jsonl.js +0 -92
  337. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/jsonl.js.map +0 -1
  338. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/memory.d.ts +0 -18
  339. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/memory.d.ts.map +0 -1
  340. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/memory.js +0 -42
  341. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/memory.js.map +0 -1
  342. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/shared.d.ts +0 -10
  343. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/shared.d.ts.map +0 -1
  344. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/shared.js +0 -31
  345. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/shared.js.map +0 -1
  346. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/jsonl.d.ts +0 -30
  347. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/jsonl.d.ts.map +0 -1
  348. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/jsonl.js +0 -170
  349. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/jsonl.js.map +0 -1
  350. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/memory.d.ts +0 -26
  351. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/memory.d.ts.map +0 -1
  352. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/memory.js +0 -90
  353. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/memory.js.map +0 -1
  354. package/node_modules/@mariozechner/clipboard-linux-x64-musl/README.md +0 -3
  355. package/node_modules/@mariozechner/clipboard-linux-x64-musl/clipboard.linux-x64-musl.node +0 -0
  356. package/node_modules/@mariozechner/clipboard-linux-x64-musl/package.json +0 -25
@@ -32,14 +32,29 @@ Notes for subagents:
32
32
  The three-arg form `update-status task {taskId} {value}` is WRONG and will
33
33
  error. Always include `status` between the id and the value.
34
34
  - **`emit`** appends an event. There is no `append-event` / `add-event`.
35
- - **`set-summary`** / **`set-bug-summary`** write summary sidecars referenced
36
- from the entity record. Do not inline summaries into the entity via `write`.
35
+ - **`set-summary <id> <phase>`** / **`set-bug-summary <id> <phase>`** link a
36
+ phase summary onto the entity record. The JSON-file argument is **optional**:
37
+ when omitted, the sidecar is auto-resolved from the record's `path` plus the
38
+ canonical phase→filename map (so `set-summary {taskId} validation` just works).
39
+ Never pass a hand-built `engineering/sprints/.../…-SUMMARY.json` path. Do not
40
+ inline summaries into the entity via `write`.
37
41
  - **Artifact I/O:** Use `forge_artifact` for ALL phase artifact reads and writes
38
42
  (PLAN.md, PROGRESS.md, *-SUMMARY.json, CODE_REVIEW.md, etc.). Never construct
39
43
  artifact file paths manually — the tool resolves paths from entity IDs and
40
44
  validates JSON summary schemas on write. After writing a summary JSON via
41
- `forge_artifact`, link it to the store record via `forge_store set-summary`.
45
+ `forge_artifact`, link it to the store record via `forge_store set-summary {id} {phase}` (no path).
42
46
  Example: `forge_artifact({ command:"write", entity:"task", entityId:"{taskId}", artifact:"progress", content:"..." })`
47
+ - **Artifact addressing (canonical) — never reconstruct a path.** Address an
48
+ artifact by `(entity, entityId, kind)` via `forge_artifact`, or read the
49
+ entity's `path` field from the store record. The on-disk directory is owned by
50
+ the record's `path`, NOT by any id template. Token glossary:
51
+ - `{sprintId}` / `{taskId}` / `{bugId}` — the **store record filenames**
52
+ (`.forge/store/<kind>s/<id>.json`); deterministic and safe to use as IDs.
53
+ - `{sprint}` / `{task}` / `{bug}` — runtime path-template substitutions used by
54
+ the **preflight gate**, derived from the record's `path` (not the bare ID).
55
+ - The engineering artifact directory always comes from `record.path`.
56
+ These spellings are parsed literally by tools (`preflight-gate.cjs`,
57
+ `collate.cjs`) — do not invent new spellings or rename them in prose.
43
58
  - If you need a verb not on this list, run
44
59
  `node "$FORGE_ROOT/tools/store-cli.cjs" --help` before improvising.
45
60
  - If you supply an unknown verb, entity type, enum value, or field name,
@@ -98,15 +98,14 @@ deps:
98
98
  "artifact_ref":"ARCHITECT_APPROVAL.md"
99
99
  }
100
100
  ```
101
- - Call (task mode) — optional for tasks, since `task.status` is the canonical signal:
101
+ - Call (task mode) — optional for tasks, since `task.status` is the canonical signal.
102
+ The sidecar path is auto-resolved from the record's `path` — never pass it:
102
103
  ```
103
- node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {taskId} approve \
104
- engineering/sprints/{sprint}/{task}/APPROVE-SUMMARY.json
104
+ node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {taskId} approve
105
105
  ```
106
106
  Or (bug mode) — REQUIRED for bugs, this is the canonical verdict signal:
107
107
  ```
108
- node "$FORGE_ROOT/tools/store-cli.cjs" set-bug-summary {bugId} approve \
109
- engineering/bugs/{bugDir}/APPROVE-SUMMARY.json
108
+ node "$FORGE_ROOT/tools/store-cli.cjs" set-bug-summary {bugId} approve
110
109
  ```
111
110
  - In bug mode, if the set-bug-summary call exits non-zero, fix the sidecar JSON and retry. Do not return without a valid summary — the downstream commit gate has no other way to read the approval verdict.
112
111
  ```
@@ -67,7 +67,7 @@ Never set `FORGE_SKIP_WRITE_VALIDATION=1` — operator-only emergency switch.
67
67
 
68
68
  4. Finalize:
69
69
  - **Do NOT emit a phase event yourself.** The orchestrator (or kickoff handler) owns event emission — it composes the canonical event from runtime telemetry (model, provider, tokens, wall times) plus the SUMMARY you write in the next step. Subagents that call `store-cli emit` for phase events hallucinate runtime facts (see Plan 11 / Slice 2). Write the SUMMARY and return.
70
- - Write `WRITEBACK-SUMMARY.json` to the sprint directory (`engineering/sprints/{sprintId}/`) with the following shape:
70
+ - Write `WRITEBACK-SUMMARY.json` to the sprint's artifact directory — use the sprint record's `path` field (read it from the store), not a reconstructed `engineering/sprints/{sprintId}/` template — with the following shape:
71
71
  ```json
72
72
  {
73
73
  "objective": "<one sentence — what views were regenerated>",
@@ -57,9 +57,8 @@ deps:
57
57
 
58
58
  1. Load Context:
59
59
  - Read the record manifest (task or bug, per entity_kind).
60
- - Read ARCHITECT_APPROVAL.md from the record's artifact directory:
61
- - Task mode: `engineering/sprints/{sprint}/{task}/ARCHITECT_APPROVAL.md`
62
- - Bug mode: `engineering/bugs/{bugDir}/ARCHITECT_APPROVAL.md`
60
+ - Read ARCHITECT_APPROVAL.md by kind never construct the path:
61
+ `forge_artifact({ command:"read", entity:"{entity_kind}", entityId:"{record_id}", artifact:"architect-approval" })`
63
62
 
64
63
  2. Staging:
65
64
  - Stage all record-related artifacts and the code changes:
@@ -92,9 +92,10 @@ deps:
92
92
  JSON shape: `{"objective":"<one sentence>", "key_changes":["<up to 12 bullets>"], "verdict":"n/a", "written_at":"<ISO 8601>", "artifact_ref":"PROGRESS.md"}`
93
93
  The tool validates required fields automatically — fix and retry if it rejects.
94
94
  - Then link sidecar to store (task mode):
95
- `forge_store({ command:"set-summary", args:["{taskId}", "implementation", "engineering/sprints/{sprint}/{task}/IMPLEMENTATION-SUMMARY.json"] })`
95
+ `forge_store({ command:"set-summary", args:["{taskId}", "implementation"] })`
96
96
  Or (bug mode):
97
- `forge_store({ command:"set-bug-summary", args:["{bugId}", "implementation", "engineering/bugs/{bugDir}/IMPLEMENTATION-SUMMARY.json"] })`
97
+ `forge_store({ command:"set-bug-summary", args:["{bugId}", "implementation"] })`
98
+ The sidecar path is auto-resolved from the record's `path` — never pass it.
98
99
  ```
99
100
 
100
101
  <!-- See _fragments/iron-laws.md for Iron Laws section structure guidance -->
@@ -561,28 +561,32 @@ for each task in dependency_sorted(tasks):
561
561
  /compact
562
562
  continue
563
563
 
564
- # --- Review phase: detect verdict via parse-verdict.cjs (see Verdict Detection below) ---
565
- # The CLI returns exit 0/1/2 for approved/revision/unknown. Never pattern-match
566
- # the **Verdict:** line manually — the closed vocabulary lives in the tool.
564
+ # --- Review phase: detect verdict via read-verdict.cjs (see Verdict Detection below) ---
565
+ # Verdicts come from the STORE record (phase summaries / task.status), NOT from a
566
+ # markdown review artifact — the orchestrator never constructs an artifact path.
567
+ # stdout is one of: approved | revision | n/a | unknown. Never pattern-match a
568
+ # **Verdict:** line — the closed vocabulary lives in the tool.
567
569
  verdict_result = run_bash(
568
- f'node "$FORGE_ROOT/tools/parse-verdict.cjs" {review_artifact_path(phase, task)}'
570
+ f'node "$FORGE_ROOT/tools/read-verdict.cjs" --phase {phase.role} --task {task_id}'
569
571
  )
570
- if verdict_result.exit_code == 0:
572
+ verdict_token = verdict_result.stdout.strip()
573
+ if verdict_token == "approved":
571
574
  verdict = "Approved"
572
- elif verdict_result.exit_code == 1:
575
+ elif verdict_token == "revision":
573
576
  verdict = "Revision Required"
574
577
  else:
575
- # exit 2: malformed, missing verdict line, or missing artifact. Never guess.
578
+ # "n/a" / "unknown" (no verdict recorded) or exit 2 (record not found / bad args).
579
+ # Never guess.
576
580
  print(f" ⚠ {task_id} {phase.role} — verdict_malformed, escalating\n")
577
581
  emit_event(task, phase, action="verdict_malformed",
578
- notes=f"parse-verdict exit={verdict_result.exit_code}")
582
+ notes=f"read-verdict stdout='{verdict_token}' exit={verdict_result.exit_code}")
579
583
  # ---- ESCALATION (mandatory hard stop — do NOT continue) ----
580
584
  run_bash(f'node "$FORGE_ROOT/tools/store-cli.cjs" update-status task {task_id} status escalated')
581
585
  emit_event(task, phase, eventId=event_id, iteration=iteration,
582
586
  action="escalated", verdict="escalated",
583
- notes="verdict_malformed: review artifact missing or verdict line unparseable")
584
- print(f" ⚠ Task {task_id} escalated: verdict_malformed — review artifact missing or verdict line unparseable\n")
585
- print(f" Review artifact: {review_artifact_path(phase, task)}\n")
587
+ notes="verdict_malformed: no verdict recorded in the phase summary / record")
588
+ print(f" ⚠ Task {task_id} escalated: verdict_malformed — no verdict recorded for {phase.role}\n")
589
+ print(f" Inspect with: node \"$FORGE_ROOT/tools/read-verdict.cjs\" --phase {phase.role} --task {task_id}\n")
586
590
  print(f" Resume with: /{phase.command} {task_id} after addressing the issues.\n")
587
591
  break
588
592
 
@@ -604,7 +608,7 @@ for each task in dependency_sorted(tasks):
604
608
  action="escalated", verdict="escalated",
605
609
  notes="max iterations reached")
606
610
  print(f" ⚠ Task {task_id} escalated: max iterations reached\n")
607
- print(f" Review artifact: {review_artifact_path(phase, task)}\n")
611
+ print(f" Inspect with: node \"$FORGE_ROOT/tools/read-verdict.cjs\" --phase {phase.role} --task {task_id}\n")
608
612
  print(f" Resume with: /{phase.command} {task_id} after addressing the issues.\n")
609
613
  break
610
614
  break # stop processing this task
@@ -616,7 +620,7 @@ for each task in dependency_sorted(tasks):
616
620
  print(f"[checkpoint] task={task_id} sprint={sprint_id} phase_index={i} iterations={iteration_counts}")
617
621
  /compact
618
622
 
619
- # No `else:` branch needed — parse-verdict.cjs already exhausts the
623
+ # No `else:` branch needed — read-verdict.cjs already exhausts the
620
624
  # possibilities (approved | revision | verdict_malformed), and the
621
625
  # malformed case is handled above before this if/elif chain.
622
626
  ```
@@ -676,45 +680,35 @@ Examples:
676
680
  ## Verdict Detection
677
681
 
678
682
  After each review phase completes, the orchestrator MUST read the verdict
679
- before branching. Do not infer the verdict from conversation context alone
680
- always read the artifact.
683
+ before branching. Do not infer the verdict from conversation context alone, and
684
+ **never construct or read a markdown artifact path** to find it — the verdict
685
+ lives in the **store record** (the phase summary written by `set-summary`, or
686
+ `task.status` for the approve phase).
681
687
 
682
- | Phase role | Artifact to read | Verdict field |
683
- |---------------|---------------------------------------------------------------------------|------------------------------|
684
- | `review-plan` | `{engineering}/sprints/{sprintDir}/{taskDir}/PLAN_REVIEW.md` | Line matching `**Verdict:**` |
685
- | `review-code` | `{engineering}/sprints/{sprintDir}/{taskDir}/CODE_REVIEW.md` | Line matching `**Verdict:**` |
686
- | `validate` | `{engineering}/sprints/{sprintDir}/{taskDir}/VALIDATION_REPORT.md` | Line matching `**Verdict:**` |
687
-
688
- The verdict line format is:
689
-
690
- ```
691
- **Verdict:** Approved
692
- ```
693
- or
694
- ```
695
- **Verdict:** Revision Required
696
- ```
697
-
698
- **Parse the verdict via `parse-verdict.cjs`** — do NOT pattern-match the
699
- line manually. The tool enforces a closed verdict vocabulary so typos, case
700
- drift, and reviewer prose cannot cause silent misclassification:
688
+ **Read the verdict via `read-verdict.cjs`** addressed by entity ID and phase
689
+ role, never by file path. The tool sources the verdict from the record and
690
+ enforces a closed vocabulary so typos, case drift, and reviewer prose cannot
691
+ cause silent misclassification:
701
692
 
702
693
  ```
703
694
  FORGE_ROOT = resolve_forge_root()
704
- result = run_bash(f'node "$FORGE_ROOT/tools/parse-verdict.cjs" {artifact_path}')
705
- # exit 0 → approved (stdout "approved")
706
- # exit 1 → revision (stdout "revision")
707
- # exit 2 unknown/malformed/missing (stdout "unknown")
695
+ result = run_bash(f'node "$FORGE_ROOT/tools/read-verdict.cjs" --phase {phase.role} --task {task_id}')
696
+ # stdout "approved" → approved
697
+ # stdout "revision" → revision
698
+ # stdout "n/a" | "unknown" → no verdict recorded (treat as malformed; do NOT guess)
699
+ # exit 2 → record not found / invalid args (treat as malformed)
708
700
  ```
709
701
 
710
- Recognised values (case-insensitive):
702
+ Branch on the **stdout token** (exit 1 bundles both `revision` and the
703
+ no-verdict cases, so the token is authoritative). Recognised verdict values:
711
704
 
712
- - **approved** — `Approved`, `Approve`, `[Approved]`
713
- - **revision** — `Revision Required`, `Revision`, `Needs Revision`, `Changes Requested`
705
+ - **approved** — written as `verdict: "approved"` in the phase summary (or `task.status == approved` for the approve phase).
706
+ - **revision** — `verdict: "revision"`.
714
707
 
715
- Anything else — including free-form prose, missing bold markers, a missing
716
- verdict line, or a missing artifact yields exit 2. Do NOT treat unknown
717
- as approved or revision; halt the loop and escalate via `verdict_malformed`.
708
+ Anything else — `n/a`, `unknown`, a missing summary, or a missing record —
709
+ must NOT be treated as approved or revision; halt the loop and escalate via
710
+ `verdict_malformed`. (In bug mode pass `--bug {bug_id}`; `read-verdict.cjs`
711
+ applies the bug-specific phase→summary map.)
718
712
 
719
713
  ## Escalation Procedure
720
714
 
@@ -750,8 +744,8 @@ Grammar (one directive per line):
750
744
  `in [v1, v2, ...]`. Fields are dotted paths against the store record, e.g.
751
745
  `task.status`.
752
746
  - `forbid <field> <op> <value>` — predicate must NOT hold.
753
- - `after <phase> = <approved|revision>` — predecessor phase's review artifact
754
- must carry the stated verdict (parsed by `parse-verdict.cjs`).
747
+ - `after <phase> = <approved|revision>` — predecessor phase's stored verdict
748
+ must match (read from the record by `read-verdict.cjs`, not from markdown).
755
749
 
756
750
  ```gates phase=plan
757
751
  forbid task.status == committed
@@ -849,7 +843,7 @@ is a violation of the Iron Laws.
849
843
  - Subagent empty/crash/timeout response: retry once with simplified prompt
850
844
  (strip summary and architecture blocks). Escalate on second failure.
851
845
  See Subagent Response Validation in the Execution Algorithm.
852
- - Subagent non-zero exit code (not parse-verdict): same as above — retry
846
+ - Subagent non-zero exit code (not read-verdict): same as above — retry
853
847
  once, escalate on second failure. The crash reason is captured in the
854
848
  escalation event notes.
855
849
  - Verdict malformed or missing: escalate to human immediately. Never guess.
@@ -130,8 +130,8 @@ deps:
130
130
  - Call:
131
131
  ```
132
132
  forge_store({ command:"set-bug-summary", entity:"bug",
133
- id:"{bugId}", phase:"triage",
134
- file:"engineering/bugs/{bugDir}/TRIAGE-SUMMARY.json" })
133
+ id:"{bugId}", phase:"triage" })
134
+ // sidecar path auto-resolved from the bug record's `path` — never pass it
135
135
  ```
136
136
  - If the set-bug-summary call exits non-zero, fix the sidecar JSON
137
137
  and retry (up to 3 attempts per the Store-Write Verification rule).
@@ -110,10 +110,9 @@ deps:
110
110
  "artifact_ref":"VALIDATION_REPORT.md"
111
111
  }
112
112
  ```
113
- - Call:
113
+ - Call (the sidecar path is auto-resolved from the task record's `path` — never pass it):
114
114
  ```
115
- node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {task_id} validation \
116
- engineering/sprints/{sprint}/{task}/VALIDATION-SUMMARY.json
115
+ node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {task_id} validation
117
116
  ```
118
117
  - If set-summary exits non-zero, fix the sidecar JSON and retry. Do not proceed without a valid summary.
119
118
  ```
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forge",
3
- "version": "1.0.3",
3
+ "version": "1.0.10",
4
4
  "description": "Self-enhancing AI software development lifecycle — generates project-specific SDLC instances from meta-definitions",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -0,0 +1,13 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "forge/_defs/locator.schema.json",
4
+ "title": "ArtifactLocator",
5
+ "description": "Backend-agnostic artifact locator (ADR doc/decisions/artifact-resolution-abstraction.md, issue #111 Phase 3). Single-sourced under _defs/ and $ref'd from task/bug/sprint schemas. `record.path` remains the required back-compat alias during migration; `locator` is the forward-looking form so a non-fs backend (s3/cms/db) is a drop-in. `ref` is an opaque, backend-specific reference (a URI is a fine encoding): fs → 'engineering/sprints/<dir>/<task>/', s3 → 's3://bucket/key', cms → 'cms://collection/<id>', db → 'blob:<uuid>'.",
6
+ "type": "object",
7
+ "required": ["backend", "ref"],
8
+ "properties": {
9
+ "backend": { "type": "string", "description": "Storage backend identifier — e.g. fs, s3, gcs, azure, cms, db." },
10
+ "ref": { "type": "string", "description": "Opaque backend-specific reference (URI-encodable)." }
11
+ },
12
+ "additionalProperties": false
13
+ }
@@ -11,6 +11,7 @@
11
11
  "severity": { "type": "string", "enum": ["critical", "major", "minor"] },
12
12
  "status": { "type": "string", "enum": ["reported", "triaged", "in-progress", "fixed"] },
13
13
  "path": { "type": "string" },
14
+ "locator": { "$ref": "_defs/locator.schema.json" },
14
15
  "rootCauseCategory": {
15
16
  "type": "string",
16
17
  "enum": ["validation", "auth", "business-rule", "data-integrity", "race-condition", "integration", "configuration", "regression"]
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.0.2",
3
- "generated": "2026-05-28",
2
+ "version": "1.0.10",
3
+ "generated": "2026-05-31",
4
4
  "note": "Authoritative enum catalog. Source: build-enum-catalog.cjs. Regenerate via node forge/tools/build-manifest.cjs.",
5
5
  "enums": {
6
6
  "task.status": [
@@ -1,4 +1,67 @@
1
1
  {
2
+ "1.0.9": {
3
+ "version": "1.0.10",
4
+ "date": "2026-05-31",
5
+ "notes": "v1.0.10 — set-summary self-resolve hardening. When the JSON file is omitted, set-summary/set-bug-summary resolve the CANONICAL sidecar name (e.g. VALIDATION-SUMMARY.json) from the phase→kind map. If that file is missing but a near-name summary sidecar exists in the same dir (e.g. an agent wrote VALIDATE-SUMMARY.json via the Write tool instead of forge_artifact's canonical name), the error now surfaces the near-name file and points at the canonical write path (forge_artifact artifact:\"<kind>\"), instead of a silent 'file not found' dead-end. Surfaced by cartographer CART-S01-T01 validate, where the QA subagent wrote a non-canonical sidecar and the verdict never reached the store (orchestrator then correctly escalated via read-verdict). No behavior change when the canonical file is present.",
6
+ "target": "tools:store-cli",
7
+ "regenerate": ["tools"],
8
+ "breaking": false,
9
+ "manual": ["Run /forge:update to copy the updated tools into your project."]
10
+ },
11
+ "1.0.8": {
12
+ "version": "1.0.9",
13
+ "date": "2026-05-31",
14
+ "notes": "v1.0.9 — store-cli suggestion drift-map: add create→write. Agents reach for REST-style `create <entity>`, but store-cli has no `create` verb (records are written with `write`), and create→write is beyond Levenshtein ≤2 so only the curated drift-map can surface it. `store-cli create sprint` now emits `Unknown command: create (Did you mean \"write\"?)`. Pure error-message UX improvement; no behavior change for valid commands. Observed on cartographer sprint-init dogfooding.",
15
+ "target": "tools:store-cli",
16
+ "regenerate": ["tools"],
17
+ "breaking": false,
18
+ "manual": ["Run /forge:update to copy the updated tools into your project."]
19
+ },
20
+ "1.0.7": {
21
+ "version": "1.0.8",
22
+ "date": "2026-05-31",
23
+ "notes": "v1.0.8 — artifact-resolution Phase 4 (issue #111). ArtifactStore gains a backend registry: artifactStore.register(backend, impl) and per-call routing by the handle's `backend` (default 'fs'). Adding a storage backend is now implementing the six-method interface and registering it — no prompt or call-site changes (the acceptance criterion). Ships MemArtifactImpl, a complete synchronous in-memory reference backend, as the canonical template for real S3/CMS/DB providers. Per the ADR sync constraint, a networked impl is sync-bound for in-process callers and reachable async-internally only through the forge-cli subprocess surface — so no live remote backend is bundled. tools-only; no schema, workflow, or store-layout changes.",
24
+ "target": "tools:artifact-store",
25
+ "regenerate": ["tools"],
26
+ "breaking": false,
27
+ "manual": ["Run /forge:update to copy the updated tools into your project."]
28
+ },
29
+ "1.0.6": {
30
+ "version": "1.0.7",
31
+ "date": "2026-05-31",
32
+ "notes": "v1.0.7 — artifact-resolution Phase 3 (issue #111). Introduces the ArtifactStore/FsArtifactImpl provider seam (tools/artifact-store.cjs), mirroring the store.cjs Store/FSImpl pattern: a backend-agnostic, synchronous facade (read/write/exists/url/list/delete) delegating to a swappable impl, default-wired to the filesystem. artifact.cjs is now a thin CLI over the facade and gains exists/url/delete subcommands; entity-dir resolution moved into artifact-store.cjs (re-exported for back-compat). Records gain an optional backend-agnostic locator {backend,ref} (schemas/_defs/locator.schema.json, $ref'd from task/bug/sprint); record.path stays REQUIRED as the read-time alias (the resolver derives {backend:'fs',ref:path} when locator is absent), so legacy records work unchanged and no store rewrite is forced. Concepts docs (task.md/bug.md) updated. Materialization of locator into stored records is deferred — the alias covers it. No FSM/lifecycle or store-layout changes.",
33
+ "target": "tools:artifact,tools:artifact-store,schemas:task,schemas:bug,schemas:sprint",
34
+ "regenerate": ["tools", "schemas"],
35
+ "breaking": false,
36
+ "manual": ["Run /forge:update to copy the updated tools and schemas into your project."]
37
+ },
38
+ "1.0.5": {
39
+ "version": "1.0.6",
40
+ "date": "2026-05-31",
41
+ "notes": "v1.0.6 — artifact-resolution Phase 2 (issue #111). (1) The orchestrator's Verdict Detection no longer reads a markdown review artifact via the removed parse-verdict.cjs — meta-orchestrate.md was the last reference to that deleted tool, which would have crashed the verdict step. It now reads the verdict from the store record via read-verdict.cjs (--phase <role> --task|--bug <id>), branching on the stdout token; no artifact path is constructed. (2) Removed the stale verdict-source table that hard-coded {sprintDir}/{taskDir} markdown paths. (3) meta-commit reads ARCHITECT_APPROVAL by kind via forge_artifact instead of a built path; meta-collate anchors WRITEBACK-SUMMARY on the sprint record's path. (4) Documented canonical artifact addressing + the placeholder-token glossary in the store-cli-verbs fragment (rename-unsafe: tools parse the literal tokens). No schema or store-layout changes.",
42
+ "target": "workflows:orchestrate_task,workflows:commit,workflows:collate",
43
+ "regenerate": ["workflows:orchestrate_task", "workflows:commit", "workflows:collate"],
44
+ "breaking": false,
45
+ "manual": ["Run /forge:update to copy the updated workflows into your project."]
46
+ },
47
+ "1.0.4": {
48
+ "version": "1.0.5",
49
+ "date": "2026-05-31",
50
+ "notes": "v1.0.5 — artifact-resolution Phase 1 (issue #111). set-summary / set-bug-summary now self-resolve the phase-summary sidecar from the store record's path: the JSON file argument is optional and the call collapses to `set-summary <id> <phase>`. This fixes the 2-arg arity failure (plan-phase set-summary previously exited 1 with Usage) and removes the hand-built `engineering/sprints/{sprint}/{task}/…-SUMMARY.json` paths from the implement/validate/approve/bug-triage workflows, which broke on non-default on-disk layouts. New canonical kind registry tools/lib/artifact-kinds.cjs (ARTIFACT_CATALOG + bug-mode overrides + phase→kind map) is now the single source consumed by artifact.cjs and store-cli.cjs. No schema or store-layout changes; the explicit jsonFile form remains accepted for back-compat.",
51
+ "target": "tools:store-cli,tools:artifact,tools:artifact-kinds,workflows:implement_plan,workflows:validate_task,workflows:approve_task,workflows:triage",
52
+ "regenerate": ["tools", "workflows:implement_plan", "workflows:validate_task", "workflows:approve_task", "workflows:triage"],
53
+ "breaking": false,
54
+ "manual": ["Run /forge:update to copy the updated tools and workflows into your project."]
55
+ },
56
+ "1.0.3": {
57
+ "version": "1.0.4",
58
+ "date": "2026-05-30",
59
+ "notes": "v1.0.4 — two store/path tool fixes. (1) preflight-gate.cjs now derives {sprint}/{task} from the store record's task.path instead of reconstructing sprints/{sprintId}/{taskId}/, fixing false 'artifact missing' halts on projects whose on-disk layout differs from the default (legacy sprint_NN_*/tasks/ trees and tasks/-nested dirs). (2) The store-query NLP path no longer degrades an explicit-ID query into a full-store scan: the parser keeps primary=tasks when a follow-word ('with sprint'/'with feature') accompanies an anchored task ID, and the engine re-routes a stripped anchored ID to its entity and applies a default result cap (new 'truncated' flag) so unbounded listings never dump the whole store. No schema, workflow, or store-layout changes.",
60
+ "target": "tools:preflight-gate,tools:store-query",
61
+ "regenerate": ["tools"],
62
+ "breaking": false,
63
+ "manual": ["Run /forge:update to copy the updated tools into your project."]
64
+ },
2
65
  "1.0.2": {
3
66
  "version": "1.0.3",
4
67
  "date": "2026-05-28",
@@ -20,6 +20,7 @@
20
20
  "createdAt": { "type": "string", "format": "date-time" },
21
21
  "completedAt": { "type": "string", "format": "date-time" },
22
22
  "path": { "type": "string" },
23
+ "locator": { "$ref": "_defs/locator.schema.json" },
23
24
  "humanEstimates": { "type": "object" },
24
25
  "features": { "type": "array", "items": { "type": "string" } }
25
26
  },
@@ -19,6 +19,7 @@
19
19
  ]
20
20
  },
21
21
  "path": { "type": "string" },
22
+ "locator": { "$ref": "_defs/locator.schema.json" },
22
23
  "estimate": { "type": "string", "enum": ["S", "M", "L", "XL"] },
23
24
  "dependencies": { "type": "array", "items": { "type": "string" } },
24
25
  "knowledgeUpdates": { "type": "array" },
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.0.3",
3
- "generated": "2026-05-28",
2
+ "version": "1.0.10",
3
+ "generated": "2026-05-31",
4
4
  "note": "Tamper-evident only. Authoritative source: /forge:update from remote.",
5
5
  "files": {
6
6
  "commands/add-pipeline.md": "529a2fc01be49815efa2cf1147528827ff1bfc12ce2ac8663b5a3a9781f8682e",
@@ -29,7 +29,7 @@
29
29
  "schemas/transitions/bug.json": "27b17da42d1cebffbd4f61ab3dcd432a0017aa71997d548ed80d22c2fc3fad6a",
30
30
  "schemas/transitions/sprint.json": "2e0a629396e687b0ca88e1814ac3e35d84533a5d55b25237ab67feddce3c9deb",
31
31
  "schemas/transitions/task.json": "4c71849747baa0d585756e57c56325ff6219c078178374e60815dff91e25e3e7",
32
- "schemas/enum-catalog.json": "93dc3d1656d9d638c8eaecc14ce66554b63149a4779869e6536cf0e620e5b37b",
32
+ "schemas/enum-catalog.json": "fe6c4b9d0b326a22ccbe2d2e6b8ea81c4f81ea827b9b46507a214cbeffcd45d3",
33
33
  "tools/verify-integrity.cjs": "3ec3c970dd3d7c3001f8f373bcc40556803eadd2fc2afafb14f1c232cba4cc3f"
34
34
  }
35
35
  }
@@ -32,14 +32,29 @@ Notes for subagents:
32
32
  The three-arg form `update-status task {taskId} {value}` is WRONG and will
33
33
  error. Always include `status` between the id and the value.
34
34
  - **`emit`** appends an event. There is no `append-event` / `add-event`.
35
- - **`set-summary`** / **`set-bug-summary`** write summary sidecars referenced
36
- from the entity record. Do not inline summaries into the entity via `write`.
35
+ - **`set-summary <id> <phase>`** / **`set-bug-summary <id> <phase>`** link a
36
+ phase summary onto the entity record. The JSON-file argument is **optional**:
37
+ when omitted, the sidecar is auto-resolved from the record's `path` plus the
38
+ canonical phase→filename map (so `set-summary {taskId} validation` just works).
39
+ Never pass a hand-built `engineering/sprints/.../…-SUMMARY.json` path. Do not
40
+ inline summaries into the entity via `write`.
37
41
  - **Artifact I/O:** Use `forge_artifact` for ALL phase artifact reads and writes
38
42
  (PLAN.md, PROGRESS.md, *-SUMMARY.json, CODE_REVIEW.md, etc.). Never construct
39
43
  artifact file paths manually — the tool resolves paths from entity IDs and
40
44
  validates JSON summary schemas on write. After writing a summary JSON via
41
- `forge_artifact`, link it to the store record via `forge_store set-summary`.
45
+ `forge_artifact`, link it to the store record via `forge_store set-summary {id} {phase}` (no path).
42
46
  Example: `forge_artifact({ command:"write", entity:"task", entityId:"{taskId}", artifact:"progress", content:"..." })`
47
+ - **Artifact addressing (canonical) — never reconstruct a path.** Address an
48
+ artifact by `(entity, entityId, kind)` via `forge_artifact`, or read the
49
+ entity's `path` field from the store record. The on-disk directory is owned by
50
+ the record's `path`, NOT by any id template. Token glossary:
51
+ - `{sprintId}` / `{taskId}` / `{bugId}` — the **store record filenames**
52
+ (`.forge/store/<kind>s/<id>.json`); deterministic and safe to use as IDs.
53
+ - `{sprint}` / `{task}` / `{bug}` — runtime path-template substitutions used by
54
+ the **preflight gate**, derived from the record's `path` (not the bare ID).
55
+ - The engineering artifact directory always comes from `record.path`.
56
+ These spellings are parsed literally by tools (`preflight-gate.cjs`,
57
+ `collate.cjs`) — do not invent new spellings or rename them in prose.
43
58
  - If you need a verb not on this list, run
44
59
  `node "$FORGE_ROOT/tools/store-cli.cjs" --help` before improvising.
45
60
  - If you supply an unknown verb, entity type, enum value, or field name,
@@ -103,15 +103,14 @@ The Architect gives final sign-off on a completed task after Supervisor approval
103
103
  "artifact_ref":"ARCHITECT_APPROVAL.md"
104
104
  }
105
105
  ```
106
- - Call (task mode) — optional for tasks, since `task.status` is the canonical signal:
106
+ - Call (task mode) — optional for tasks, since `task.status` is the canonical signal.
107
+ The sidecar path is auto-resolved from the record's `path` — never pass it:
107
108
  ```
108
- node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {taskId} approve \
109
- engineering/sprints/{sprint}/{task}/APPROVE-SUMMARY.json
109
+ node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {taskId} approve
110
110
  ```
111
111
  Or (bug mode) — REQUIRED for bugs, this is the canonical verdict signal:
112
112
  ```
113
- node "$FORGE_ROOT/tools/store-cli.cjs" set-bug-summary {bugId} approve \
114
- engineering/bugs/{bugDir}/APPROVE-SUMMARY.json
113
+ node "$FORGE_ROOT/tools/store-cli.cjs" set-bug-summary {bugId} approve
115
114
  ```
116
115
  - In bug mode, if the set-bug-summary call exits non-zero, fix the sidecar JSON and retry. Do not return without a valid summary — the downstream commit gate has no other way to read the approval verdict.
117
116
  ```
@@ -139,8 +139,8 @@ and the only phase that records the route decision read by the orchestrator
139
139
  - Call:
140
140
  ```
141
141
  forge_store({ command:"set-bug-summary", entity:"bug",
142
- id:"{bugId}", phase:"triage",
143
- file:"engineering/bugs/{bugDir}/TRIAGE-SUMMARY.json" })
142
+ id:"{bugId}", phase:"triage" })
143
+ // sidecar path auto-resolved from the bug record's `path` — never pass it
144
144
  ```
145
145
  - If the set-bug-summary call exits non-zero, fix the sidecar JSON
146
146
  and retry (up to 3 attempts per the Store-Write Verification rule).
@@ -72,7 +72,7 @@ Never set `FORGE_SKIP_WRITE_VALIDATION=1` — operator-only emergency switch.
72
72
 
73
73
  4. Finalize:
74
74
  - **Do NOT emit a phase event yourself.** The orchestrator (or kickoff handler) owns event emission — it composes the canonical event from runtime telemetry (model, provider, tokens, wall times) plus the SUMMARY you write in the next step. Subagents that call `store-cli emit` for phase events hallucinate runtime facts (see Plan 11 / Slice 2). Write the SUMMARY and return.
75
- - Write `WRITEBACK-SUMMARY.json` to the sprint directory (`engineering/sprints/{sprintId}/`) with the following shape:
75
+ - Write `WRITEBACK-SUMMARY.json` to the sprint's artifact directory — use the sprint record's `path` field (read it from the store), not a reconstructed `engineering/sprints/{sprintId}/` template — with the following shape:
76
76
  ```json
77
77
  {
78
78
  "objective": "<one sentence — what views were regenerated>",
@@ -62,9 +62,8 @@ Seal a completed and approved task by committing its artifacts to the VCS and up
62
62
 
63
63
  1. Load Context:
64
64
  - Read the record manifest (task or bug, per entity_kind).
65
- - Read ARCHITECT_APPROVAL.md from the record's artifact directory:
66
- - Task mode: `engineering/sprints/{sprint}/{task}/ARCHITECT_APPROVAL.md`
67
- - Bug mode: `engineering/bugs/{bugDir}/ARCHITECT_APPROVAL.md`
65
+ - Read ARCHITECT_APPROVAL.md by kind never construct the path:
66
+ `forge_artifact({ command:"read", entity:"{entity_kind}", entityId:"{record_id}", artifact:"architect-approval" })`
68
67
 
69
68
  2. Staging:
70
69
  - Stage all record-related artifacts and the code changes:
@@ -96,9 +96,10 @@ The Engineer implements the approved plan: write code, run tests, verify, and do
96
96
  JSON shape: `{"objective":"<one sentence>", "key_changes":["<up to 12 bullets>"], "verdict":"n/a", "written_at":"<ISO 8601>", "artifact_ref":"PROGRESS.md"}`
97
97
  The tool validates required fields automatically — fix and retry if it rejects.
98
98
  - Then link sidecar to store (task mode):
99
- `forge_store({ command:"set-summary", args:["{taskId}", "implementation", "engineering/sprints/{sprint}/{task}/IMPLEMENTATION-SUMMARY.json"] })`
99
+ `forge_store({ command:"set-summary", args:["{taskId}", "implementation"] })`
100
100
  Or (bug mode):
101
- `forge_store({ command:"set-bug-summary", args:["{bugId}", "implementation", "engineering/bugs/{bugDir}/IMPLEMENTATION-SUMMARY.json"] })`
101
+ `forge_store({ command:"set-bug-summary", args:["{bugId}", "implementation"] })`
102
+ The sidecar path is auto-resolved from the record's `path` — never pass it.
102
103
  ```
103
104
 
104
105
  <!-- See _fragments/iron-laws.md for Iron Laws section structure guidance -->