@openrig/cli 0.5.4 → 0.5.5

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 (747) hide show
  1. package/daemon/assets/guidance/openrig-start.md +7 -0
  2. package/daemon/assets/onboarding/01-world-and-purpose.md +52 -0
  3. package/daemon/assets/onboarding/02-self-and-competent-action.md +57 -0
  4. package/daemon/assets/plugins/openrig-core/README.md +5 -2
  5. package/daemon/assets/plugins/openrig-core/hooks/claude.json +3 -12
  6. package/daemon/assets/plugins/openrig-core/hooks/codex.json +5 -12
  7. package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus.cjs +194 -124
  8. package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +18 -23
  9. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/CHANGELOG.md +92 -0
  10. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/REVISION-GUIDE.md +34 -0
  11. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/ROADMAP.md +23 -0
  12. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/ROLLOUT.md +234 -0
  13. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/SKILL.md +404 -0
  14. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/compose.py +653 -0
  15. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/scaffold.sh +34 -0
  16. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/trace-due.sh +32 -0
  17. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/trace-stamp.sh +5 -0
  18. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/trunk-diff.sh +18 -0
  19. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/LEARNED.md +40 -0
  20. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/NOTES.md +9 -0
  21. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/PLAYBOOK.md +5 -0
  22. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/SOP.md +24 -0
  23. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/SPEC.md +54 -0
  24. package/daemon/assets/plugins/openrig-core/skills/openrig-skills/SKILL.md +2 -0
  25. package/daemon/assets/plugins/openrig-core/skills/refocusing/SKILL.md +31 -0
  26. package/daemon/assets/plugins/openrig-core/skills/refocusing/references/refocus.md +22 -0
  27. package/daemon/assets/plugins/openrig-core/skills/refocusing/scripts/trace-to-root.py +221 -0
  28. package/daemon/assets/plugins/openrig-core/skills/retiring-and-inheriting-a-seat/SKILL.md +3 -3
  29. package/daemon/context-packs/onboarding-width/manifest.yaml +11 -0
  30. package/daemon/context-packs/{world/install/reference-material.md → onboarding-width/public-reference-material.md} +4 -26
  31. package/daemon/context-packs/{world/install/what-you-can-do.md → onboarding-width/public-what-you-can-do.md} +13 -9
  32. package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
  33. package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/SKILL.md +1 -1
  34. package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
  35. package/daemon/context-packs/skills/core/attention-queue/manifest.yaml +1 -1
  36. package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
  37. package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
  38. package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
  39. package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
  40. package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
  41. package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
  42. package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
  43. package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
  44. package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
  45. package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
  46. package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
  47. package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
  48. package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +1 -1
  49. package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
  50. package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
  51. package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
  52. package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
  53. package/daemon/context-packs/skills/pm/requirements-writer/SKILL.md +21 -15
  54. package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +3 -3
  55. package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
  56. package/daemon/context-packs/skills/pods/development-team/manifest.yaml +1 -1
  57. package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +1 -1
  58. package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
  59. package/daemon/context-packs/skills/pods/review-team/manifest.yaml +1 -1
  60. package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
  61. package/daemon/context-packs/skills/process/brainstorming/manifest.yaml +1 -1
  62. package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
  63. package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
  64. package/daemon/context-packs/skills/process/executing-plans/manifest.yaml +1 -1
  65. package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
  66. package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
  67. package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
  68. package/daemon/context-packs/skills/process/using-superpowers/manifest.yaml +1 -1
  69. package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +1 -1
  70. package/daemon/context-packs/skills/process/writing-plans/manifest.yaml +1 -1
  71. package/daemon/context-packs/world-example/manifest.yaml +8 -0
  72. package/daemon/context-packs/world-example/your-world.md +37 -0
  73. package/daemon/dist/adapters/claude-code-adapter.d.ts +15 -0
  74. package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
  75. package/daemon/dist/adapters/claude-code-adapter.js +57 -0
  76. package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
  77. package/daemon/dist/build-info.js +3 -3
  78. package/daemon/dist/db/all-migrations.d.ts.map +1 -1
  79. package/daemon/dist/db/all-migrations.js +4 -0
  80. package/daemon/dist/db/all-migrations.js.map +1 -1
  81. package/daemon/dist/db/migrations/072_thread_seat_map.d.ts +3 -0
  82. package/daemon/dist/db/migrations/072_thread_seat_map.d.ts.map +1 -0
  83. package/daemon/dist/db/migrations/072_thread_seat_map.js +22 -0
  84. package/daemon/dist/db/migrations/072_thread_seat_map.js.map +1 -0
  85. package/daemon/dist/db/migrations/073_queue_transition_wakes.d.ts +3 -0
  86. package/daemon/dist/db/migrations/073_queue_transition_wakes.d.ts.map +1 -0
  87. package/daemon/dist/db/migrations/073_queue_transition_wakes.js +21 -0
  88. package/daemon/dist/db/migrations/073_queue_transition_wakes.js.map +1 -0
  89. package/daemon/dist/domain/activity-taxonomy.d.ts +112 -0
  90. package/daemon/dist/domain/activity-taxonomy.d.ts.map +1 -0
  91. package/daemon/dist/domain/activity-taxonomy.js +99 -0
  92. package/daemon/dist/domain/activity-taxonomy.js.map +1 -0
  93. package/daemon/dist/domain/bind-plan.d.ts +19 -0
  94. package/daemon/dist/domain/bind-plan.d.ts.map +1 -0
  95. package/daemon/dist/domain/bind-plan.js +25 -0
  96. package/daemon/dist/domain/bind-plan.js.map +1 -0
  97. package/daemon/dist/domain/event-bus.d.ts +6 -0
  98. package/daemon/dist/domain/event-bus.d.ts.map +1 -1
  99. package/daemon/dist/domain/event-bus.js +15 -5
  100. package/daemon/dist/domain/event-bus.js.map +1 -1
  101. package/daemon/dist/domain/gateway/gateway-process-main.d.ts.map +1 -1
  102. package/daemon/dist/domain/gateway/gateway-process-main.js +9 -0
  103. package/daemon/dist/domain/gateway/gateway-process-main.js.map +1 -1
  104. package/daemon/dist/domain/gateway/gateway-process.d.ts.map +1 -1
  105. package/daemon/dist/domain/gateway/gateway-process.js +9 -0
  106. package/daemon/dist/domain/gateway/gateway-process.js.map +1 -1
  107. package/daemon/dist/domain/gateway/gateway-subsystem.d.ts +80 -0
  108. package/daemon/dist/domain/gateway/gateway-subsystem.d.ts.map +1 -0
  109. package/daemon/dist/domain/gateway/gateway-subsystem.js +149 -0
  110. package/daemon/dist/domain/gateway/gateway-subsystem.js.map +1 -0
  111. package/daemon/dist/domain/gateway/human-registry.d.ts +109 -0
  112. package/daemon/dist/domain/gateway/human-registry.d.ts.map +1 -1
  113. package/daemon/dist/domain/gateway/human-registry.js +250 -0
  114. package/daemon/dist/domain/gateway/human-registry.js.map +1 -1
  115. package/{dist → daemon/dist/domain/gateway}/slack/config.d.ts +8 -5
  116. package/daemon/dist/domain/gateway/slack/config.d.ts.map +1 -0
  117. package/{dist → daemon/dist/domain/gateway}/slack/config.js +8 -6
  118. package/daemon/dist/domain/gateway/slack/config.js.map +1 -0
  119. package/{dist → daemon/dist/domain/gateway}/slack/inbound-admission.d.ts +1 -1
  120. package/daemon/dist/domain/gateway/slack/inbound-admission.d.ts.map +1 -0
  121. package/daemon/dist/domain/gateway/slack/inbound-admission.js.map +1 -0
  122. package/{dist → daemon/dist/domain/gateway}/slack/inbound.d.ts +14 -3
  123. package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -0
  124. package/{dist → daemon/dist/domain/gateway}/slack/inbound.js +6 -5
  125. package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -0
  126. package/daemon/dist/domain/gateway/slack/message.d.ts +80 -0
  127. package/daemon/dist/domain/gateway/slack/message.d.ts.map +1 -0
  128. package/daemon/dist/domain/gateway/slack/message.js +164 -0
  129. package/daemon/dist/domain/gateway/slack/message.js.map +1 -0
  130. package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts +54 -0
  131. package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts.map +1 -0
  132. package/daemon/dist/domain/gateway/slack/outbound-driver.js +96 -0
  133. package/daemon/dist/domain/gateway/slack/outbound-driver.js.map +1 -0
  134. package/daemon/dist/domain/gateway/slack/queue-access.d.ts +53 -0
  135. package/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -0
  136. package/daemon/dist/domain/gateway/slack/queue-access.js +72 -0
  137. package/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -0
  138. package/daemon/dist/domain/gateway/slack/secrets.d.ts.map +1 -0
  139. package/daemon/dist/domain/gateway/slack/secrets.js.map +1 -0
  140. package/daemon/dist/domain/gateway/slack/slack-api.d.ts +106 -0
  141. package/daemon/dist/domain/gateway/slack/slack-api.d.ts.map +1 -0
  142. package/daemon/dist/domain/gateway/slack/slack-api.js +198 -0
  143. package/daemon/dist/domain/gateway/slack/slack-api.js.map +1 -0
  144. package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +47 -0
  145. package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -0
  146. package/daemon/dist/domain/gateway/slack/slack-delivery.js +147 -0
  147. package/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -0
  148. package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts +21 -0
  149. package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -0
  150. package/daemon/dist/domain/gateway/slack/slack-subsystem.js +198 -0
  151. package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -0
  152. package/daemon/dist/domain/gateway/slack/socket-inbound.d.ts +30 -0
  153. package/daemon/dist/domain/gateway/slack/socket-inbound.d.ts.map +1 -0
  154. package/daemon/dist/domain/gateway/slack/socket-inbound.js +99 -0
  155. package/daemon/dist/domain/gateway/slack/socket-inbound.js.map +1 -0
  156. package/daemon/dist/domain/gateway/slack/state-store.d.ts.map +1 -0
  157. package/daemon/dist/domain/gateway/slack/state-store.js.map +1 -0
  158. package/daemon/dist/domain/gateway/slack/thread-routing.d.ts +17 -0
  159. package/daemon/dist/domain/gateway/slack/thread-routing.d.ts.map +1 -0
  160. package/daemon/dist/domain/gateway/slack/thread-routing.js +35 -0
  161. package/daemon/dist/domain/gateway/slack/thread-routing.js.map +1 -0
  162. package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts +56 -0
  163. package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts.map +1 -0
  164. package/daemon/dist/domain/gateway/slack/thread-seat-map.js +103 -0
  165. package/daemon/dist/domain/gateway/slack/thread-seat-map.js.map +1 -0
  166. package/daemon/dist/domain/gateway/spawn-gateway.d.ts.map +1 -1
  167. package/daemon/dist/domain/gateway/spawn-gateway.js +9 -0
  168. package/daemon/dist/domain/gateway/spawn-gateway.js.map +1 -1
  169. package/daemon/dist/domain/gateway/transport.d.ts.map +1 -1
  170. package/daemon/dist/domain/gateway/transport.js +9 -0
  171. package/daemon/dist/domain/gateway/transport.js.map +1 -1
  172. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  173. package/daemon/dist/domain/node-inventory.js +20 -0
  174. package/daemon/dist/domain/node-inventory.js.map +1 -1
  175. package/daemon/dist/domain/parked-query.d.ts +81 -0
  176. package/daemon/dist/domain/parked-query.d.ts.map +1 -0
  177. package/daemon/dist/domain/parked-query.js +126 -0
  178. package/daemon/dist/domain/parked-query.js.map +1 -0
  179. package/daemon/dist/domain/queue-pickup.d.ts +38 -0
  180. package/daemon/dist/domain/queue-pickup.d.ts.map +1 -0
  181. package/daemon/dist/domain/queue-pickup.js +67 -0
  182. package/daemon/dist/domain/queue-pickup.js.map +1 -0
  183. package/daemon/dist/domain/queue-repository.d.ts +38 -10
  184. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  185. package/daemon/dist/domain/queue-repository.js +267 -35
  186. package/daemon/dist/domain/queue-repository.js.map +1 -1
  187. package/daemon/dist/domain/queue-stuck-sweep.d.ts +77 -0
  188. package/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -0
  189. package/daemon/dist/domain/queue-stuck-sweep.js +348 -0
  190. package/daemon/dist/domain/queue-stuck-sweep.js.map +1 -0
  191. package/daemon/dist/domain/queue-wake-ladder.d.ts +96 -0
  192. package/daemon/dist/domain/queue-wake-ladder.d.ts.map +1 -0
  193. package/daemon/dist/domain/queue-wake-ladder.js +533 -0
  194. package/daemon/dist/domain/queue-wake-ladder.js.map +1 -0
  195. package/daemon/dist/domain/queue-wake-repository.d.ts +37 -0
  196. package/daemon/dist/domain/queue-wake-repository.d.ts.map +1 -0
  197. package/daemon/dist/domain/queue-wake-repository.js +80 -0
  198. package/daemon/dist/domain/queue-wake-repository.js.map +1 -0
  199. package/daemon/dist/domain/rebuild-priming-chain.d.ts +28 -0
  200. package/daemon/dist/domain/rebuild-priming-chain.d.ts.map +1 -0
  201. package/daemon/dist/domain/rebuild-priming-chain.js +71 -0
  202. package/daemon/dist/domain/rebuild-priming-chain.js.map +1 -0
  203. package/daemon/dist/domain/review/compose.d.ts +3 -1
  204. package/daemon/dist/domain/review/compose.d.ts.map +1 -1
  205. package/daemon/dist/domain/review/compose.js +14 -8
  206. package/daemon/dist/domain/review/compose.js.map +1 -1
  207. package/daemon/dist/domain/review/gather.d.ts.map +1 -1
  208. package/daemon/dist/domain/review/gather.js +3 -1
  209. package/daemon/dist/domain/review/gather.js.map +1 -1
  210. package/daemon/dist/domain/rigspec-instantiator.d.ts +3 -0
  211. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  212. package/daemon/dist/domain/rigspec-instantiator.js +18 -0
  213. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  214. package/daemon/dist/domain/scope/plan-lock-artifacts.d.ts +6 -5
  215. package/daemon/dist/domain/scope/plan-lock-artifacts.d.ts.map +1 -1
  216. package/daemon/dist/domain/scope/plan-lock-artifacts.js +23 -20
  217. package/daemon/dist/domain/scope/plan-lock-artifacts.js.map +1 -1
  218. package/daemon/dist/domain/scope/scaffold-placeholder.d.ts +4 -5
  219. package/daemon/dist/domain/scope/scaffold-placeholder.d.ts.map +1 -1
  220. package/daemon/dist/domain/scope/scaffold-placeholder.js +6 -7
  221. package/daemon/dist/domain/scope/scaffold-placeholder.js.map +1 -1
  222. package/daemon/dist/domain/scope/scope-approve.d.ts +1 -1
  223. package/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -1
  224. package/daemon/dist/domain/scope/scope-approve.js +5 -4
  225. package/daemon/dist/domain/scope/scope-approve.js.map +1 -1
  226. package/daemon/dist/domain/scope/scope-audit.d.ts +42 -3
  227. package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
  228. package/daemon/dist/domain/scope/scope-audit.js +78 -93
  229. package/daemon/dist/domain/scope/scope-audit.js.map +1 -1
  230. package/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
  231. package/daemon/dist/domain/scope/scope-view-projection.js +7 -2
  232. package/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
  233. package/daemon/dist/domain/seat-activity-service.d.ts +91 -0
  234. package/daemon/dist/domain/seat-activity-service.d.ts.map +1 -1
  235. package/daemon/dist/domain/seat-activity-service.js +416 -1
  236. package/daemon/dist/domain/seat-activity-service.js.map +1 -1
  237. package/daemon/dist/domain/seat-handover-planner.d.ts +14 -0
  238. package/daemon/dist/domain/seat-handover-planner.d.ts.map +1 -1
  239. package/daemon/dist/domain/seat-handover-planner.js +14 -1
  240. package/daemon/dist/domain/seat-handover-planner.js.map +1 -1
  241. package/daemon/dist/domain/seat-handover-service.d.ts +54 -1
  242. package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
  243. package/daemon/dist/domain/seat-handover-service.js +162 -19
  244. package/daemon/dist/domain/seat-handover-service.js.map +1 -1
  245. package/daemon/dist/domain/session-transport.js +1 -2
  246. package/daemon/dist/domain/session-transport.js.map +1 -1
  247. package/daemon/dist/domain/successor-session-launcher.d.ts +6 -1
  248. package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
  249. package/daemon/dist/domain/successor-session-launcher.js +3 -3
  250. package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
  251. package/daemon/dist/domain/types.d.ts +33 -0
  252. package/daemon/dist/domain/types.d.ts.map +1 -1
  253. package/daemon/dist/domain/types.js.map +1 -1
  254. package/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
  255. package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  256. package/daemon/dist/domain/user-settings/settings-store.js +48 -0
  257. package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  258. package/daemon/dist/domain/view-projector.d.ts +1 -1
  259. package/daemon/dist/domain/view-projector.d.ts.map +1 -1
  260. package/daemon/dist/domain/view-projector.js +41 -2
  261. package/daemon/dist/domain/view-projector.js.map +1 -1
  262. package/daemon/dist/domain/watchdog-policy-engine.d.ts +7 -0
  263. package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
  264. package/daemon/dist/domain/watchdog-policy-engine.js +3 -0
  265. package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
  266. package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts +4 -3
  267. package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
  268. package/daemon/dist/domain/workspace/default-workspace-scaffold.js +56 -196
  269. package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
  270. package/daemon/dist/domain/workspace/getting-started-narrative.js +1 -1
  271. package/daemon/dist/domain/workspace/getting-started-narrative.js.map +1 -1
  272. package/daemon/dist/domain/workspace/workspace-doctor.d.ts +8 -11
  273. package/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
  274. package/daemon/dist/domain/workspace/workspace-doctor.js +23 -25
  275. package/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
  276. package/daemon/dist/gateway-slack-surface.d.ts +4 -0
  277. package/daemon/dist/gateway-slack-surface.d.ts.map +1 -0
  278. package/daemon/dist/gateway-slack-surface.js +8 -0
  279. package/daemon/dist/gateway-slack-surface.js.map +1 -0
  280. package/daemon/dist/index.d.ts +29 -0
  281. package/daemon/dist/index.d.ts.map +1 -1
  282. package/daemon/dist/index.js +99 -4
  283. package/daemon/dist/index.js.map +1 -1
  284. package/daemon/dist/lib/pane-envelope.d.ts +1 -1
  285. package/daemon/dist/lib/pane-envelope.d.ts.map +1 -1
  286. package/daemon/dist/lib/pane-envelope.js +8 -14
  287. package/daemon/dist/lib/pane-envelope.js.map +1 -1
  288. package/daemon/dist/routes/activity.d.ts +13 -0
  289. package/daemon/dist/routes/activity.d.ts.map +1 -1
  290. package/daemon/dist/routes/activity.js +186 -0
  291. package/daemon/dist/routes/activity.js.map +1 -1
  292. package/daemon/dist/routes/config.js +2 -2
  293. package/daemon/dist/routes/config.js.map +1 -1
  294. package/daemon/dist/routes/gateway.d.ts +3 -0
  295. package/daemon/dist/routes/gateway.d.ts.map +1 -0
  296. package/daemon/dist/routes/gateway.js +46 -0
  297. package/daemon/dist/routes/gateway.js.map +1 -0
  298. package/daemon/dist/routes/health-summary.d.ts.map +1 -1
  299. package/daemon/dist/routes/health-summary.js +8 -0
  300. package/daemon/dist/routes/health-summary.js.map +1 -1
  301. package/daemon/dist/routes/queue.d.ts.map +1 -1
  302. package/daemon/dist/routes/queue.js +3 -1
  303. package/daemon/dist/routes/queue.js.map +1 -1
  304. package/daemon/dist/routes/scope-audit.d.ts.map +1 -1
  305. package/daemon/dist/routes/scope-audit.js +72 -13
  306. package/daemon/dist/routes/scope-audit.js.map +1 -1
  307. package/daemon/dist/routes/seat.d.ts.map +1 -1
  308. package/daemon/dist/routes/seat.js +15 -0
  309. package/daemon/dist/routes/seat.js.map +1 -1
  310. package/daemon/dist/server.d.ts +17 -0
  311. package/daemon/dist/server.d.ts.map +1 -1
  312. package/daemon/dist/server.js +25 -4
  313. package/daemon/dist/server.js.map +1 -1
  314. package/daemon/dist/startup.d.ts +4 -0
  315. package/daemon/dist/startup.d.ts.map +1 -1
  316. package/daemon/dist/startup.js +33 -0
  317. package/daemon/dist/startup.js.map +1 -1
  318. package/daemon/docs/reference/agent-state-taxonomy.md +106 -0
  319. package/daemon/docs/reference/project-workspace.md +22 -14
  320. package/daemon/docs/reference/refocus-channel.md +27 -14
  321. package/daemon/docs/reference/sdlc-conventions.md +24 -13
  322. package/daemon/specs/agents/shared/skills/core/agent-startup-and-context-ingestion/SKILL.md +1 -1
  323. package/daemon/specs/agents/shared/skills/pm/requirements-writer/SKILL.md +21 -15
  324. package/daemon/specs/rigs/launch/kernel/agents/advisor/lead/guidance/role.md +1 -1
  325. package/dist/build-info.js +3 -3
  326. package/dist/commands/config-init-workspace.d.ts.map +1 -1
  327. package/dist/commands/config-init-workspace.js +32 -57
  328. package/dist/commands/config-init-workspace.js.map +1 -1
  329. package/dist/commands/config.d.ts.map +1 -1
  330. package/dist/commands/config.js +5 -0
  331. package/dist/commands/config.js.map +1 -1
  332. package/dist/commands/daemon.d.ts.map +1 -1
  333. package/dist/commands/daemon.js +14 -4
  334. package/dist/commands/daemon.js.map +1 -1
  335. package/dist/commands/gateway.d.ts +19 -1
  336. package/dist/commands/gateway.d.ts.map +1 -1
  337. package/dist/commands/gateway.js +157 -33
  338. package/dist/commands/gateway.js.map +1 -1
  339. package/dist/commands/parked.d.ts +3 -0
  340. package/dist/commands/parked.d.ts.map +1 -0
  341. package/dist/commands/parked.js +83 -0
  342. package/dist/commands/parked.js.map +1 -0
  343. package/dist/commands/proof.d.ts +2 -1
  344. package/dist/commands/proof.d.ts.map +1 -1
  345. package/dist/commands/proof.js +8 -8
  346. package/dist/commands/proof.js.map +1 -1
  347. package/dist/commands/ps.d.ts +10 -0
  348. package/dist/commands/ps.d.ts.map +1 -1
  349. package/dist/commands/ps.js +14 -3
  350. package/dist/commands/ps.js.map +1 -1
  351. package/dist/commands/queue.d.ts.map +1 -1
  352. package/dist/commands/queue.js +31 -3
  353. package/dist/commands/queue.js.map +1 -1
  354. package/dist/commands/scope.d.ts.map +1 -1
  355. package/dist/commands/scope.js +255 -136
  356. package/dist/commands/scope.js.map +1 -1
  357. package/dist/commands/seat.d.ts.map +1 -1
  358. package/dist/commands/seat.js +40 -10
  359. package/dist/commands/seat.js.map +1 -1
  360. package/dist/commands/send.d.ts +1 -1
  361. package/dist/commands/send.d.ts.map +1 -1
  362. package/dist/commands/send.js +13 -14
  363. package/dist/commands/send.js.map +1 -1
  364. package/dist/commands/slack.d.ts +14 -28
  365. package/dist/commands/slack.d.ts.map +1 -1
  366. package/dist/commands/slack.js +73 -187
  367. package/dist/commands/slack.js.map +1 -1
  368. package/dist/commands/start.d.ts +3 -0
  369. package/dist/commands/start.d.ts.map +1 -1
  370. package/dist/commands/start.js +12 -5
  371. package/dist/commands/start.js.map +1 -1
  372. package/dist/commands/up.d.ts.map +1 -1
  373. package/dist/commands/up.js +11 -4
  374. package/dist/commands/up.js.map +1 -1
  375. package/dist/commands/view.d.ts +4 -2
  376. package/dist/commands/view.d.ts.map +1 -1
  377. package/dist/commands/view.js +1 -1
  378. package/dist/commands/view.js.map +1 -1
  379. package/dist/commands/watchdog.d.ts.map +1 -1
  380. package/dist/commands/watchdog.js +2 -1
  381. package/dist/commands/watchdog.js.map +1 -1
  382. package/dist/commands/workspace.js +1 -1
  383. package/dist/config-store.d.ts +15 -1
  384. package/dist/config-store.d.ts.map +1 -1
  385. package/dist/config-store.js +60 -0
  386. package/dist/config-store.js.map +1 -1
  387. package/dist/cross-host-target.d.ts.map +1 -1
  388. package/dist/cross-host-target.js +5 -4
  389. package/dist/cross-host-target.js.map +1 -1
  390. package/dist/daemon-lifecycle.d.ts +45 -3
  391. package/dist/daemon-lifecycle.d.ts.map +1 -1
  392. package/dist/daemon-lifecycle.js +126 -0
  393. package/dist/daemon-lifecycle.js.map +1 -1
  394. package/dist/index.d.ts.map +1 -1
  395. package/dist/index.js +2 -0
  396. package/dist/index.js.map +1 -1
  397. package/dist/lib/scope/capability-delta.d.ts +9 -0
  398. package/dist/lib/scope/capability-delta.d.ts.map +1 -0
  399. package/dist/lib/scope/capability-delta.js +73 -0
  400. package/dist/lib/scope/capability-delta.js.map +1 -0
  401. package/dist/lib/scope/scaffold-placeholder.d.ts +4 -5
  402. package/dist/lib/scope/scaffold-placeholder.d.ts.map +1 -1
  403. package/dist/lib/scope/scaffold-placeholder.js +6 -7
  404. package/dist/lib/scope/scaffold-placeholder.js.map +1 -1
  405. package/dist/lib/scope/scope-audit.d.ts +42 -3
  406. package/dist/lib/scope/scope-audit.d.ts.map +1 -1
  407. package/dist/lib/scope/scope-audit.js +78 -93
  408. package/dist/lib/scope/scope-audit.js.map +1 -1
  409. package/dist/lib/scope/scope-fs.d.ts +18 -14
  410. package/dist/lib/scope/scope-fs.d.ts.map +1 -1
  411. package/dist/lib/scope/scope-fs.js +60 -29
  412. package/dist/lib/scope/scope-fs.js.map +1 -1
  413. package/dist/lib/scope/templates.d.ts +17 -17
  414. package/dist/lib/scope/templates.d.ts.map +1 -1
  415. package/dist/lib/scope/templates.js +35 -39
  416. package/dist/lib/scope/templates.js.map +1 -1
  417. package/dist/lib/scope-templates/backlog-deprecation.md +3 -1
  418. package/dist/lib/scope-templates/backlog-tech-debt.md +3 -1
  419. package/dist/lib/scope-templates/bug-fix.md +3 -1
  420. package/dist/lib/scope-templates/capability-delta.md +60 -0
  421. package/dist/lib/scope-templates/mission-placeholder.md +9 -40
  422. package/dist/lib/scope-templates/mission-progress.md +5 -6
  423. package/dist/lib/scope-templates/mission-release.md +9 -40
  424. package/dist/lib/scope-templates/notes.md +14 -0
  425. package/dist/lib/scope-templates/placeholder.md +3 -1
  426. package/dist/lib/scope-templates/proof.md +1 -1
  427. package/dist/lib/scope-templates/release-feature.md +3 -1
  428. package/dist/lib/scope-templates/research.md +3 -1
  429. package/dist/lib/scope-templates/slice-progress.md +4 -5
  430. package/node_modules/@openrig/daemon/dist/adapters/claude-code-adapter.d.ts +15 -0
  431. package/node_modules/@openrig/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
  432. package/node_modules/@openrig/daemon/dist/adapters/claude-code-adapter.js +57 -0
  433. package/node_modules/@openrig/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
  434. package/node_modules/@openrig/daemon/dist/build-info.js +3 -3
  435. package/node_modules/@openrig/daemon/dist/db/all-migrations.d.ts.map +1 -1
  436. package/node_modules/@openrig/daemon/dist/db/all-migrations.js +4 -0
  437. package/node_modules/@openrig/daemon/dist/db/all-migrations.js.map +1 -1
  438. package/node_modules/@openrig/daemon/dist/db/migrations/072_thread_seat_map.d.ts +3 -0
  439. package/node_modules/@openrig/daemon/dist/db/migrations/072_thread_seat_map.d.ts.map +1 -0
  440. package/node_modules/@openrig/daemon/dist/db/migrations/072_thread_seat_map.js +22 -0
  441. package/node_modules/@openrig/daemon/dist/db/migrations/072_thread_seat_map.js.map +1 -0
  442. package/node_modules/@openrig/daemon/dist/db/migrations/073_queue_transition_wakes.d.ts +3 -0
  443. package/node_modules/@openrig/daemon/dist/db/migrations/073_queue_transition_wakes.d.ts.map +1 -0
  444. package/node_modules/@openrig/daemon/dist/db/migrations/073_queue_transition_wakes.js +21 -0
  445. package/node_modules/@openrig/daemon/dist/db/migrations/073_queue_transition_wakes.js.map +1 -0
  446. package/node_modules/@openrig/daemon/dist/domain/activity-taxonomy.d.ts +112 -0
  447. package/node_modules/@openrig/daemon/dist/domain/activity-taxonomy.d.ts.map +1 -0
  448. package/node_modules/@openrig/daemon/dist/domain/activity-taxonomy.js +99 -0
  449. package/node_modules/@openrig/daemon/dist/domain/activity-taxonomy.js.map +1 -0
  450. package/node_modules/@openrig/daemon/dist/domain/bind-plan.d.ts +19 -0
  451. package/node_modules/@openrig/daemon/dist/domain/bind-plan.d.ts.map +1 -0
  452. package/node_modules/@openrig/daemon/dist/domain/bind-plan.js +25 -0
  453. package/node_modules/@openrig/daemon/dist/domain/bind-plan.js.map +1 -0
  454. package/node_modules/@openrig/daemon/dist/domain/event-bus.d.ts +6 -0
  455. package/node_modules/@openrig/daemon/dist/domain/event-bus.d.ts.map +1 -1
  456. package/node_modules/@openrig/daemon/dist/domain/event-bus.js +15 -5
  457. package/node_modules/@openrig/daemon/dist/domain/event-bus.js.map +1 -1
  458. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process-main.d.ts.map +1 -1
  459. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process-main.js +9 -0
  460. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process-main.js.map +1 -1
  461. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process.d.ts.map +1 -1
  462. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process.js +9 -0
  463. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process.js.map +1 -1
  464. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.d.ts +80 -0
  465. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.d.ts.map +1 -0
  466. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.js +149 -0
  467. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.js.map +1 -0
  468. package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.d.ts +109 -0
  469. package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.d.ts.map +1 -1
  470. package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.js +250 -0
  471. package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.js.map +1 -1
  472. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.d.ts +44 -0
  473. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.d.ts.map +1 -0
  474. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.js +62 -0
  475. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.js.map +1 -0
  476. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound-admission.d.ts +8 -0
  477. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound-admission.d.ts.map +1 -0
  478. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound-admission.js +20 -0
  479. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound-admission.js.map +1 -0
  480. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.d.ts +113 -0
  481. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -0
  482. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.js +146 -0
  483. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.js.map +1 -0
  484. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.d.ts +80 -0
  485. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.d.ts.map +1 -0
  486. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.js +164 -0
  487. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.js.map +1 -0
  488. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.d.ts +54 -0
  489. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.d.ts.map +1 -0
  490. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.js +96 -0
  491. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.js.map +1 -0
  492. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.d.ts +53 -0
  493. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -0
  494. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.js +72 -0
  495. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -0
  496. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/secrets.d.ts +21 -0
  497. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/secrets.d.ts.map +1 -0
  498. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/secrets.js +73 -0
  499. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/secrets.js.map +1 -0
  500. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.d.ts +106 -0
  501. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.d.ts.map +1 -0
  502. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.js +198 -0
  503. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.js.map +1 -0
  504. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +47 -0
  505. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -0
  506. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.js +147 -0
  507. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -0
  508. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts +21 -0
  509. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -0
  510. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.js +198 -0
  511. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -0
  512. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.d.ts +30 -0
  513. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.d.ts.map +1 -0
  514. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.js +99 -0
  515. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.js.map +1 -0
  516. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.d.ts +62 -0
  517. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.d.ts.map +1 -0
  518. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.js +132 -0
  519. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.js.map +1 -0
  520. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.d.ts +17 -0
  521. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.d.ts.map +1 -0
  522. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.js +35 -0
  523. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.js.map +1 -0
  524. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts +56 -0
  525. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts.map +1 -0
  526. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.js +103 -0
  527. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.js.map +1 -0
  528. package/node_modules/@openrig/daemon/dist/domain/gateway/spawn-gateway.d.ts.map +1 -1
  529. package/node_modules/@openrig/daemon/dist/domain/gateway/spawn-gateway.js +9 -0
  530. package/node_modules/@openrig/daemon/dist/domain/gateway/spawn-gateway.js.map +1 -1
  531. package/node_modules/@openrig/daemon/dist/domain/gateway/transport.d.ts.map +1 -1
  532. package/node_modules/@openrig/daemon/dist/domain/gateway/transport.js +9 -0
  533. package/node_modules/@openrig/daemon/dist/domain/gateway/transport.js.map +1 -1
  534. package/node_modules/@openrig/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  535. package/node_modules/@openrig/daemon/dist/domain/node-inventory.js +20 -0
  536. package/node_modules/@openrig/daemon/dist/domain/node-inventory.js.map +1 -1
  537. package/node_modules/@openrig/daemon/dist/domain/parked-query.d.ts +81 -0
  538. package/node_modules/@openrig/daemon/dist/domain/parked-query.d.ts.map +1 -0
  539. package/node_modules/@openrig/daemon/dist/domain/parked-query.js +126 -0
  540. package/node_modules/@openrig/daemon/dist/domain/parked-query.js.map +1 -0
  541. package/node_modules/@openrig/daemon/dist/domain/queue-pickup.d.ts +38 -0
  542. package/node_modules/@openrig/daemon/dist/domain/queue-pickup.d.ts.map +1 -0
  543. package/node_modules/@openrig/daemon/dist/domain/queue-pickup.js +67 -0
  544. package/node_modules/@openrig/daemon/dist/domain/queue-pickup.js.map +1 -0
  545. package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts +38 -10
  546. package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  547. package/node_modules/@openrig/daemon/dist/domain/queue-repository.js +267 -35
  548. package/node_modules/@openrig/daemon/dist/domain/queue-repository.js.map +1 -1
  549. package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.d.ts +77 -0
  550. package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -0
  551. package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.js +348 -0
  552. package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.js.map +1 -0
  553. package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.d.ts +96 -0
  554. package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.d.ts.map +1 -0
  555. package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.js +533 -0
  556. package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.js.map +1 -0
  557. package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.d.ts +37 -0
  558. package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.d.ts.map +1 -0
  559. package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.js +80 -0
  560. package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.js.map +1 -0
  561. package/node_modules/@openrig/daemon/dist/domain/rebuild-priming-chain.d.ts +28 -0
  562. package/node_modules/@openrig/daemon/dist/domain/rebuild-priming-chain.d.ts.map +1 -0
  563. package/node_modules/@openrig/daemon/dist/domain/rebuild-priming-chain.js +71 -0
  564. package/node_modules/@openrig/daemon/dist/domain/rebuild-priming-chain.js.map +1 -0
  565. package/node_modules/@openrig/daemon/dist/domain/review/compose.d.ts +3 -1
  566. package/node_modules/@openrig/daemon/dist/domain/review/compose.d.ts.map +1 -1
  567. package/node_modules/@openrig/daemon/dist/domain/review/compose.js +14 -8
  568. package/node_modules/@openrig/daemon/dist/domain/review/compose.js.map +1 -1
  569. package/node_modules/@openrig/daemon/dist/domain/review/gather.d.ts.map +1 -1
  570. package/node_modules/@openrig/daemon/dist/domain/review/gather.js +3 -1
  571. package/node_modules/@openrig/daemon/dist/domain/review/gather.js.map +1 -1
  572. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.d.ts +3 -0
  573. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  574. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.js +18 -0
  575. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  576. package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.d.ts +6 -5
  577. package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.d.ts.map +1 -1
  578. package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.js +23 -20
  579. package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.js.map +1 -1
  580. package/node_modules/@openrig/daemon/dist/domain/scope/scaffold-placeholder.d.ts +4 -5
  581. package/node_modules/@openrig/daemon/dist/domain/scope/scaffold-placeholder.d.ts.map +1 -1
  582. package/node_modules/@openrig/daemon/dist/domain/scope/scaffold-placeholder.js +6 -7
  583. package/node_modules/@openrig/daemon/dist/domain/scope/scaffold-placeholder.js.map +1 -1
  584. package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.d.ts +1 -1
  585. package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -1
  586. package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.js +5 -4
  587. package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.js.map +1 -1
  588. package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.d.ts +42 -3
  589. package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
  590. package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.js +78 -93
  591. package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.js.map +1 -1
  592. package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
  593. package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.js +7 -2
  594. package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
  595. package/node_modules/@openrig/daemon/dist/domain/seat-activity-service.d.ts +91 -0
  596. package/node_modules/@openrig/daemon/dist/domain/seat-activity-service.d.ts.map +1 -1
  597. package/node_modules/@openrig/daemon/dist/domain/seat-activity-service.js +416 -1
  598. package/node_modules/@openrig/daemon/dist/domain/seat-activity-service.js.map +1 -1
  599. package/node_modules/@openrig/daemon/dist/domain/seat-handover-planner.d.ts +14 -0
  600. package/node_modules/@openrig/daemon/dist/domain/seat-handover-planner.d.ts.map +1 -1
  601. package/node_modules/@openrig/daemon/dist/domain/seat-handover-planner.js +14 -1
  602. package/node_modules/@openrig/daemon/dist/domain/seat-handover-planner.js.map +1 -1
  603. package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.d.ts +54 -1
  604. package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
  605. package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.js +162 -19
  606. package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.js.map +1 -1
  607. package/node_modules/@openrig/daemon/dist/domain/session-transport.js +1 -2
  608. package/node_modules/@openrig/daemon/dist/domain/session-transport.js.map +1 -1
  609. package/node_modules/@openrig/daemon/dist/domain/successor-session-launcher.d.ts +6 -1
  610. package/node_modules/@openrig/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
  611. package/node_modules/@openrig/daemon/dist/domain/successor-session-launcher.js +3 -3
  612. package/node_modules/@openrig/daemon/dist/domain/successor-session-launcher.js.map +1 -1
  613. package/node_modules/@openrig/daemon/dist/domain/types.d.ts +33 -0
  614. package/node_modules/@openrig/daemon/dist/domain/types.d.ts.map +1 -1
  615. package/node_modules/@openrig/daemon/dist/domain/types.js.map +1 -1
  616. package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
  617. package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  618. package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.js +48 -0
  619. package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  620. package/node_modules/@openrig/daemon/dist/domain/view-projector.d.ts +1 -1
  621. package/node_modules/@openrig/daemon/dist/domain/view-projector.d.ts.map +1 -1
  622. package/node_modules/@openrig/daemon/dist/domain/view-projector.js +41 -2
  623. package/node_modules/@openrig/daemon/dist/domain/view-projector.js.map +1 -1
  624. package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.d.ts +7 -0
  625. package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
  626. package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.js +3 -0
  627. package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
  628. package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts +4 -3
  629. package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
  630. package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.js +56 -196
  631. package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
  632. package/node_modules/@openrig/daemon/dist/domain/workspace/getting-started-narrative.js +1 -1
  633. package/node_modules/@openrig/daemon/dist/domain/workspace/getting-started-narrative.js.map +1 -1
  634. package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.d.ts +8 -11
  635. package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
  636. package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.js +23 -25
  637. package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
  638. package/node_modules/@openrig/daemon/dist/gateway-slack-surface.d.ts +4 -0
  639. package/node_modules/@openrig/daemon/dist/gateway-slack-surface.d.ts.map +1 -0
  640. package/node_modules/@openrig/daemon/dist/gateway-slack-surface.js +8 -0
  641. package/node_modules/@openrig/daemon/dist/gateway-slack-surface.js.map +1 -0
  642. package/node_modules/@openrig/daemon/dist/index.d.ts +29 -0
  643. package/node_modules/@openrig/daemon/dist/index.d.ts.map +1 -1
  644. package/node_modules/@openrig/daemon/dist/index.js +99 -4
  645. package/node_modules/@openrig/daemon/dist/index.js.map +1 -1
  646. package/node_modules/@openrig/daemon/dist/lib/pane-envelope.d.ts +1 -1
  647. package/node_modules/@openrig/daemon/dist/lib/pane-envelope.d.ts.map +1 -1
  648. package/node_modules/@openrig/daemon/dist/lib/pane-envelope.js +8 -14
  649. package/node_modules/@openrig/daemon/dist/lib/pane-envelope.js.map +1 -1
  650. package/node_modules/@openrig/daemon/dist/routes/activity.d.ts +13 -0
  651. package/node_modules/@openrig/daemon/dist/routes/activity.d.ts.map +1 -1
  652. package/node_modules/@openrig/daemon/dist/routes/activity.js +186 -0
  653. package/node_modules/@openrig/daemon/dist/routes/activity.js.map +1 -1
  654. package/node_modules/@openrig/daemon/dist/routes/config.js +2 -2
  655. package/node_modules/@openrig/daemon/dist/routes/config.js.map +1 -1
  656. package/node_modules/@openrig/daemon/dist/routes/gateway.d.ts +3 -0
  657. package/node_modules/@openrig/daemon/dist/routes/gateway.d.ts.map +1 -0
  658. package/node_modules/@openrig/daemon/dist/routes/gateway.js +46 -0
  659. package/node_modules/@openrig/daemon/dist/routes/gateway.js.map +1 -0
  660. package/node_modules/@openrig/daemon/dist/routes/health-summary.d.ts.map +1 -1
  661. package/node_modules/@openrig/daemon/dist/routes/health-summary.js +8 -0
  662. package/node_modules/@openrig/daemon/dist/routes/health-summary.js.map +1 -1
  663. package/node_modules/@openrig/daemon/dist/routes/queue.d.ts.map +1 -1
  664. package/node_modules/@openrig/daemon/dist/routes/queue.js +3 -1
  665. package/node_modules/@openrig/daemon/dist/routes/queue.js.map +1 -1
  666. package/node_modules/@openrig/daemon/dist/routes/scope-audit.d.ts.map +1 -1
  667. package/node_modules/@openrig/daemon/dist/routes/scope-audit.js +72 -13
  668. package/node_modules/@openrig/daemon/dist/routes/scope-audit.js.map +1 -1
  669. package/node_modules/@openrig/daemon/dist/routes/seat.d.ts.map +1 -1
  670. package/node_modules/@openrig/daemon/dist/routes/seat.js +15 -0
  671. package/node_modules/@openrig/daemon/dist/routes/seat.js.map +1 -1
  672. package/node_modules/@openrig/daemon/dist/server.d.ts +17 -0
  673. package/node_modules/@openrig/daemon/dist/server.d.ts.map +1 -1
  674. package/node_modules/@openrig/daemon/dist/server.js +25 -4
  675. package/node_modules/@openrig/daemon/dist/server.js.map +1 -1
  676. package/node_modules/@openrig/daemon/dist/startup.d.ts +4 -0
  677. package/node_modules/@openrig/daemon/dist/startup.d.ts.map +1 -1
  678. package/node_modules/@openrig/daemon/dist/startup.js +33 -0
  679. package/node_modules/@openrig/daemon/dist/startup.js.map +1 -1
  680. package/node_modules/@openrig/daemon/package.json +5 -1
  681. package/package.json +1 -1
  682. package/tui/dist/daemon-client.d.ts +5 -0
  683. package/tui/dist/daemon-client.d.ts.map +1 -1
  684. package/tui/dist/daemon-client.js +17 -0
  685. package/tui/dist/daemon-client.js.map +1 -1
  686. package/tui/dist/hydrate.d.ts.map +1 -1
  687. package/tui/dist/hydrate.js +12 -4
  688. package/tui/dist/hydrate.js.map +1 -1
  689. package/tui/dist/live-events.d.ts +21 -0
  690. package/tui/dist/live-events.d.ts.map +1 -0
  691. package/tui/dist/live-events.js +88 -0
  692. package/tui/dist/live-events.js.map +1 -0
  693. package/tui/dist/live.js +1 -1
  694. package/tui/dist/main.js +27 -8
  695. package/tui/dist/main.js.map +1 -1
  696. package/tui/dist/refresh.d.ts +10 -1
  697. package/tui/dist/refresh.d.ts.map +1 -1
  698. package/tui/dist/refresh.js +22 -2
  699. package/tui/dist/refresh.js.map +1 -1
  700. package/daemon/context-packs/world/install/01-world-from-primitives.md +0 -97
  701. package/daemon/context-packs/world/install/02-permission-self-sleep.md +0 -141
  702. package/daemon/context-packs/world/install/03-what-this-is-for.md +0 -86
  703. package/daemon/context-packs/world/install/04-ontology.md +0 -790
  704. package/daemon/context-packs/world/install/05-harness-power-use.md +0 -355
  705. package/daemon/context-packs/world/install/06-a-competent-turn.md +0 -225
  706. package/daemon/context-packs/world/install/manifest.yaml +0 -125
  707. package/dist/lib/scope-templates/mission-brief.md +0 -20
  708. package/dist/lib/scope-templates/mission-notes.md +0 -102
  709. package/dist/slack/config.d.ts.map +0 -1
  710. package/dist/slack/config.js.map +0 -1
  711. package/dist/slack/connector-server.d.ts +0 -31
  712. package/dist/slack/connector-server.d.ts.map +0 -1
  713. package/dist/slack/connector-server.js +0 -108
  714. package/dist/slack/connector-server.js.map +0 -1
  715. package/dist/slack/inbound-admission.d.ts.map +0 -1
  716. package/dist/slack/inbound-admission.js.map +0 -1
  717. package/dist/slack/inbound.d.ts.map +0 -1
  718. package/dist/slack/inbound.js.map +0 -1
  719. package/dist/slack/message.d.ts +0 -39
  720. package/dist/slack/message.d.ts.map +0 -1
  721. package/dist/slack/message.js +0 -88
  722. package/dist/slack/message.js.map +0 -1
  723. package/dist/slack/outbound.d.ts +0 -39
  724. package/dist/slack/outbound.d.ts.map +0 -1
  725. package/dist/slack/outbound.js +0 -63
  726. package/dist/slack/outbound.js.map +0 -1
  727. package/dist/slack/queue-bridge.d.ts +0 -61
  728. package/dist/slack/queue-bridge.d.ts.map +0 -1
  729. package/dist/slack/queue-bridge.js +0 -114
  730. package/dist/slack/queue-bridge.js.map +0 -1
  731. package/dist/slack/secrets.d.ts.map +0 -1
  732. package/dist/slack/secrets.js.map +0 -1
  733. package/dist/slack/slack-api.d.ts +0 -49
  734. package/dist/slack/slack-api.d.ts.map +0 -1
  735. package/dist/slack/slack-api.js +0 -110
  736. package/dist/slack/slack-api.js.map +0 -1
  737. package/dist/slack/slack-delivery.d.ts +0 -14
  738. package/dist/slack/slack-delivery.d.ts.map +0 -1
  739. package/dist/slack/slack-delivery.js +0 -28
  740. package/dist/slack/slack-delivery.js.map +0 -1
  741. package/dist/slack/state-store.d.ts.map +0 -1
  742. package/dist/slack/state-store.js.map +0 -1
  743. /package/{dist → daemon/dist/domain/gateway}/slack/inbound-admission.js +0 -0
  744. /package/{dist → daemon/dist/domain/gateway}/slack/secrets.d.ts +0 -0
  745. /package/{dist → daemon/dist/domain/gateway}/slack/secrets.js +0 -0
  746. /package/{dist → daemon/dist/domain/gateway}/slack/state-store.d.ts +0 -0
  747. /package/{dist → daemon/dist/domain/gateway}/slack/state-store.js +0 -0
@@ -7,18 +7,18 @@
7
7
  // mission/slice frontmatter per §1 of that convention.
8
8
  import fs from "node:fs";
9
9
  import path from "node:path";
10
- import { execFileSync } from "node:child_process";
11
10
  import { Command } from "commander";
12
11
  import { DaemonClient } from "../client.js";
13
12
  import { attestationLineage } from "../lib/scope/attestation-lineage.js";
14
13
  import { getDaemonStatus, getDaemonUrl, statusGuardMessage } from "../daemon-lifecycle.js";
15
14
  import { realDeps } from "./daemon.js";
16
15
  import { CLOSE_REASONS, MISSION_TEMPLATE_KINDS, SLICE_TEMPLATE_KINDS, STAGE_VALUES, ScopeCliError, } from "../lib/scope/types.js";
17
- import { DEFAULT_PROJECT_PREFIX, inferMissionDotId, isMissionDotId, nextEscapeBandOrdinal, sliceIdFromMission, } from "../lib/scope/dot-id.js";
18
- import { ensureMissionId, ensureMissionIdPersisted, findMission, resolveNodeFile, findSlice, gitTopLevel, listMissions, listSlices, moveSlice, nextSliceNN, pad2, readFrontmatter, resolveMissionsRoot, splitFrontmatter, todayDateISO, updateFrontmatter, } from "../lib/scope/scope-fs.js";
19
- import { renderImplementationPrdTemplate, renderMissionBriefTemplate, renderMissionNotesTemplate, renderMissionProgressTemplate, renderMissionTemplate, renderSliceProofTemplate, renderSliceProgressTemplate, renderSliceTemplate, titleFromSlug, } from "../lib/scope/templates.js";
16
+ import { DEFAULT_PROJECT_PREFIX, inferMissionDotId, isMissionDotId, isSliceDotId, nextEscapeBandOrdinal, sliceIdFromMission, } from "../lib/scope/dot-id.js";
17
+ import { buildMissionDependencyGraph, ensureMissionId, ensureMissionIdPersisted, findMission, resolveNodeFile, findSlice, listMissions, listSlices, moveSlice, nextSliceNN, pad2, readFrontmatter, resolveMissionsRoot, splitFrontmatter, todayDateISO, updateFrontmatter, } from "../lib/scope/scope-fs.js";
18
+ import { renderCapabilityDeltaTemplate, renderNotesTemplate, renderMissionProgressTemplate, renderMissionTemplate, renderSliceProofTemplate, renderSliceProgressTemplate, renderSliceTemplate, titleFromSlug, } from "../lib/scope/templates.js";
20
19
  import { addProgressRow, DEFAULT_PROGRESS_SECTION, parseStatus, PROGRESS_STATUSES, setProgressRow, } from "../lib/scope/progress-edit.js";
21
20
  import { deriveScopeTrust } from "../lib/scope/trust.js";
21
+ import { capabilityDeltaExpiryFindings } from "../lib/scope/capability-delta.js";
22
22
  function makeStdout() {
23
23
  return { write: (text) => process.stdout.write(text) };
24
24
  }
@@ -192,11 +192,13 @@ function buildSliceShowCommand() {
192
192
  // ---------------------------------------------------------------------
193
193
  function buildSliceCreateCommand() {
194
194
  return new Command("create")
195
- .description("Create a new slice in a mission. Scaffolds the SDLC convention sections (## Intent / ## Mini-requirements / ## Proof contract) + proof/ + PROOF.md + IMPLEMENTATION-PRD.md for EVERY template kind — the shapes the Living Notes UI projects. Conventions SSOT: docs/reference/sdlc-conventions.md (installed: $OPENRIG_HOME/reference/sdlc-conventions.md).")
195
+ .description("Create a new slice with SPEC.md, PROGRESS.md, PROOF.md, and proof/. Conventions SSOT: docs/reference/sdlc-conventions.md (installed: $OPENRIG_HOME/reference/sdlc-conventions.md).")
196
196
  .argument("<mission>", "Mission name")
197
197
  .argument("<slug>", "Short slug (becomes the folder name's suffix)")
198
198
  .option("--template <kind>", `Template: ${SLICE_TEMPLATE_KINDS.join(" | ")}`, "placeholder")
199
199
  .option("--title <text>", "Display title (defaults to titlecased slug)")
200
+ .option("--intent <text>", "Authored intent stored in SPEC.md frontmatter (defaults to title)")
201
+ .option("--depends-on <dot-id...>", "Advisory build-order dependencies on sibling slice dot-IDs")
200
202
  .option("--readme-only", "Write progress_rail: readme-only in README frontmatter instead of scaffolding PROGRESS.md")
201
203
  .option("--json", "Machine-readable output")
202
204
  .action(async (missionName, rawSlug, opts, command) => {
@@ -238,6 +240,17 @@ function buildSliceCreateCommand() {
238
240
  }
239
241
  const id = sliceIdFromMission(missionId, nn);
240
242
  const title = opts.title ?? titleFromSlug(slug);
243
+ const intent = opts.intent ?? title;
244
+ const dependsOn = Array.isArray(opts.dependsOn) ? [...new Set(opts.dependsOn)] : [];
245
+ for (const dependency of dependsOn) {
246
+ if (!isSliceDotId(dependency) || !dependency.startsWith(`${missionId}.`)) {
247
+ throw new ScopeCliError({
248
+ fact: `Dependency "${dependency}" is not a sibling slice dot-ID under ${missionId}.`,
249
+ consequence: "Slice not created.",
250
+ action: `Use a sibling ID shaped like ${missionId}.<n>, or omit --depends-on.`,
251
+ });
252
+ }
253
+ }
241
254
  const createdDate = todayDateISO();
242
255
  const body = renderSliceTemplate(kind, {
243
256
  id,
@@ -246,20 +259,10 @@ function buildSliceCreateCommand() {
246
259
  mission: mission.name,
247
260
  title,
248
261
  created_date: createdDate,
262
+ intent,
263
+ depends_on: dependsOn,
249
264
  });
250
265
  const proofBody = renderSliceProofTemplate({ id, title });
251
- // OPR.0.4.4.23 — every template kind also scaffolds the
252
- // IMPLEMENTATION-PRD skeleton (convention sections + elastic-middle
253
- // note): the PRD is what the Living Notes UI's proof-contract join
254
- // reads, so a slice without one doesn't project its DELIVERED pairing.
255
- const prdBody = renderImplementationPrdTemplate({
256
- id,
257
- slice_number: pad2(nn),
258
- slug,
259
- mission: mission.name,
260
- title,
261
- created_date: createdDate,
262
- });
263
266
  fs.mkdirSync(sliceAbs, { recursive: true });
264
267
  fs.mkdirSync(path.join(sliceAbs, "proof"), { recursive: true });
265
268
  // New scaffolds author SPEC.md; existing README-backed nodes are never rewritten.
@@ -275,7 +278,6 @@ function buildSliceCreateCommand() {
275
278
  fs.writeFileSync(progressPath, renderSliceProgressTemplate(title), "utf8");
276
279
  }
277
280
  fs.writeFileSync(path.join(sliceAbs, "PROOF.md"), proofBody, "utf8");
278
- fs.writeFileSync(path.join(sliceAbs, "IMPLEMENTATION-PRD.md"), prdBody, "utf8");
279
281
  const payload = {
280
282
  ok: true,
281
283
  slice: {
@@ -474,7 +476,7 @@ function buildSliceMoveCommand() {
474
476
  // ---------------------------------------------------------------------
475
477
  function buildMissionLsCommand() {
476
478
  return new Command("ls")
477
- .description("List missions (top-level folders with README.md)")
479
+ .description("List missions (top-level folders with SPEC.md or a legacy README.md)")
478
480
  .option("--json", "Machine-readable output")
479
481
  .action(async (opts, command) => {
480
482
  const out = makeStdout();
@@ -540,7 +542,7 @@ function buildMissionShowCommand() {
540
542
  out.write(` closed slices: ${mission.closedSliceCount}\n`);
541
543
  out.write(` path: ${mission.absPath}\n`);
542
544
  if (readme) {
543
- out.write("\n--- README ---\n");
545
+ out.write(`\n--- ${path.basename(mission.readmePath)} ---\n`);
544
546
  out.write(readme);
545
547
  if (!readme.endsWith("\n"))
546
548
  out.write("\n");
@@ -559,7 +561,10 @@ function buildMissionCreateCommand() {
559
561
  .option("--template <kind>", `Template: ${MISSION_TEMPLATE_KINDS.join(" | ")} (auto when name matches release-X.Y.Z)`, "")
560
562
  .option("--id <dot-id>", "Explicit dot-ID. Overrides name-pattern inference.")
561
563
  .option("--title <text>", "Display title (defaults to titlecased name)")
562
- .option("--no-mission-notes", "Skip the auto-scaffold of MISSION_NOTES.md (rare; default is to scaffold from conventions/mission-notes/TEMPLATE.md)")
564
+ .option("--intent <text>", "Authored intent stored in SPEC.md frontmatter (defaults to title)")
565
+ .option("--depends-on <dot-id...>", "Advisory build-order dependencies on sibling mission dot-IDs")
566
+ .option("--no-notes", "Skip NOTES.md scaffolding")
567
+ .option("--no-mission-notes", "Deprecated alias for --no-notes")
563
568
  .option("--json", "Machine-readable output")
564
569
  .action(async (rawName, opts, command) => {
565
570
  const out = makeStdout();
@@ -619,15 +624,22 @@ function buildMissionCreateCommand() {
619
624
  const ordinal = nextEscapeBandOrdinal(peers.map((p) => p.id));
620
625
  id = inferMissionDotId(name, ordinal);
621
626
  }
622
- // Resolve titles + render templates BEFORE any filesystem side
623
- // effects (banked verify-first-then-write guard catch on
624
- // OPR.0.3.2.21.FR-3 qitem-20260601121058: a stale
625
- // OPENRIG_MISSION_NOTES_TEMPLATE_PATH used to throw AFTER
626
- // mkdirSync + README write, leaking a half-created mission dir
627
- // that future `mission create <same-name>` would reject as
628
- // already-existing). Rendering MISSION_NOTES first means a
629
- // stale env-var fails before any disk mutation.
627
+ // Resolve titles + render templates before any filesystem side
628
+ // effects. A stale current or legacy notes-template override must
629
+ // fail before mkdir, or it leaks a half-created mission directory.
630
630
  const title = opts.title ?? titleFromSlug(name.replace(/^release-/, ""));
631
+ const intent = opts.intent ?? title;
632
+ const dependsOn = Array.isArray(opts.dependsOn) ? [...new Set(opts.dependsOn)] : [];
633
+ const project = id.split(".")[0];
634
+ for (const dependency of dependsOn) {
635
+ if (!isMissionDotId(dependency) || dependency.split(".")[0] !== project) {
636
+ throw new ScopeCliError({
637
+ fact: `Dependency "${dependency}" is not a sibling mission dot-ID in project ${project}.`,
638
+ consequence: "Mission not created.",
639
+ action: `Use a mission ID shaped like ${project}.<version>, or omit --depends-on.`,
640
+ });
641
+ }
642
+ }
631
643
  const releaseVersion = isReleaseName ? name.replace(/^release-/, "") : "";
632
644
  const readmeBody = renderMissionTemplate(templateKind, {
633
645
  id,
@@ -636,18 +648,30 @@ function buildMissionCreateCommand() {
636
648
  title,
637
649
  created_date: todayDateISO(),
638
650
  release_version: releaseVersion,
651
+ intent,
652
+ depends_on: dependsOn,
639
653
  });
640
- let missionNotesRendered = null;
641
- if (opts.missionNotes !== false) {
642
- const r = renderMissionNotesTemplate({
654
+ let notesRendered = null;
655
+ if (opts.notes !== false && opts.missionNotes !== false) {
656
+ notesRendered = renderNotesTemplate({
643
657
  mission_id: id,
644
658
  mission_name: title,
645
659
  created_date: todayDateISO(),
646
660
  });
647
- missionNotesRendered = { rendered: r.rendered, resolvedFrom: r.resolvedFrom };
648
661
  }
649
662
  const progressBody = renderMissionProgressTemplate(title);
650
- const missionBriefBody = renderMissionBriefTemplate(title);
663
+ const capabilityDeltaBody = isReleaseName
664
+ ? renderCapabilityDeltaTemplate({
665
+ id,
666
+ slug: name,
667
+ mission: name,
668
+ title,
669
+ created_date: todayDateISO(),
670
+ release_version: releaseVersion,
671
+ intent,
672
+ depends_on: dependsOn,
673
+ })
674
+ : null;
651
675
  // All renders succeeded — safe to touch the filesystem.
652
676
  fs.mkdirSync(absPath, { recursive: true });
653
677
  fs.mkdirSync(path.join(absPath, "slices"), { recursive: true });
@@ -656,14 +680,16 @@ function buildMissionCreateCommand() {
656
680
  fs.writeFileSync(readmePath, readmeBody, "utf8");
657
681
  const progressPath = path.join(absPath, "PROGRESS.md");
658
682
  fs.writeFileSync(progressPath, progressBody, "utf8");
659
- const missionBriefPath = path.join(absPath, "MISSION_BRIEF.md");
660
- fs.writeFileSync(missionBriefPath, missionBriefBody, "utf8");
661
- let missionNotesPath = null;
662
- let missionNotesResolvedFrom = null;
663
- if (missionNotesRendered) {
664
- missionNotesPath = path.join(absPath, "MISSION_NOTES.md");
665
- fs.writeFileSync(missionNotesPath, missionNotesRendered.rendered, "utf8");
666
- missionNotesResolvedFrom = missionNotesRendered.resolvedFrom;
683
+ const capabilityDeltaPath = capabilityDeltaBody
684
+ ? path.join(absPath, `CAPABILITY-DELTA-v${releaseVersion}.md`)
685
+ : null;
686
+ if (capabilityDeltaPath && capabilityDeltaBody) {
687
+ fs.writeFileSync(capabilityDeltaPath, capabilityDeltaBody, "utf8");
688
+ }
689
+ let notesPath = null;
690
+ if (notesRendered) {
691
+ notesPath = path.join(absPath, "NOTES.md");
692
+ fs.writeFileSync(notesPath, notesRendered.rendered, "utf8");
667
693
  }
668
694
  const humanLines = [
669
695
  `Created mission ${name}`,
@@ -671,8 +697,13 @@ function buildMissionCreateCommand() {
671
697
  ` template: ${templateKind}`,
672
698
  ` path: ${absPath}`,
673
699
  ];
674
- if (missionNotesPath) {
675
- humanLines.push(` mission-notes: ${missionNotesPath} (template: ${missionNotesResolvedFrom})`);
700
+ if (notesPath) {
701
+ humanLines.push(` notes: ${notesPath} (template: ${notesRendered?.resolvedFrom})`);
702
+ }
703
+ if (capabilityDeltaPath)
704
+ humanLines.push(` capability delta: ${capabilityDeltaPath}`);
705
+ if (notesRendered?.resolvedFrom === "legacy-env") {
706
+ humanLines.push(" advisory: OPENRIG_MISSION_NOTES_TEMPLATE_PATH is deprecated; use OPENRIG_NOTES_TEMPLATE_PATH");
676
707
  }
677
708
  emit(out, {
678
709
  ok: true,
@@ -682,9 +713,12 @@ function buildMissionCreateCommand() {
682
713
  template: templateKind,
683
714
  path: absPath,
684
715
  readmePath,
685
- missionBriefPath,
686
- missionNotesPath,
687
- missionNotesResolvedFrom,
716
+ notesPath,
717
+ capabilityDeltaPath,
718
+ notesResolvedFrom: notesRendered?.resolvedFrom ?? null,
719
+ advisories: notesRendered?.resolvedFrom === "legacy-env"
720
+ ? ["OPENRIG_MISSION_NOTES_TEMPLATE_PATH is deprecated; use OPENRIG_NOTES_TEMPLATE_PATH"]
721
+ : [],
688
722
  },
689
723
  }, json, humanLines);
690
724
  }
@@ -693,38 +727,34 @@ function buildMissionCreateCommand() {
693
727
  }
694
728
  });
695
729
  }
730
+ function buildMissionGraphCommand() {
731
+ return new Command("graph")
732
+ .description("Show advisory sibling build-order edges and the current ready set")
733
+ .argument("<mission>", "Mission name")
734
+ .option("--json", "Machine-readable output")
735
+ .action(async (missionName, opts, command) => {
736
+ const out = makeStdout();
737
+ const json = Boolean(opts.json);
738
+ try {
739
+ const missionsRoot = resolveMissionsRoot({ override: getOpts(command).workspace });
740
+ const graph = buildMissionDependencyGraph(findMission(missionsRoot, missionName));
741
+ emit(out, { ok: true, graph }, json, [
742
+ `Ready: ${graph.ready.join(", ") || "(none)"}`,
743
+ ...graph.waiting.map((row) => `Waiting: ${row.id} on ${row.on.join(", ")}`),
744
+ ...graph.advisories.map((row) => `Advisory: ${row.id}${row.dependency ? ` -> ${row.dependency}` : ""}: ${row.message}`),
745
+ ]);
746
+ }
747
+ catch (err) {
748
+ fail(err, json, out);
749
+ }
750
+ });
751
+ }
696
752
  // ---------------------------------------------------------------------
697
753
  // Audit (B2 — read-only scope audit)
698
754
  // ---------------------------------------------------------------------
699
- /**
700
- * Files changed by the most recent commit (revision basis: HEAD), returned as
701
- * ABSOLUTE resolved paths. Returns null when there is NO git context — the dir
702
- * is not inside a repo, HEAD does not resolve (e.g. a fresh repo with no
703
- * commits), or the git command fails. Callers then leave the
704
- * committed-without-PROGRESS classifier inputs UNDEFINED, so the check stays
705
- * inert: no false-green (we never assume "PROGRESS untouched" without evidence)
706
- * and no false-positive (we never fire when we cannot see the commit).
707
- */
708
- function gitHeadTouchedAbsPaths(dir) {
709
- const topLevel = gitTopLevel(dir);
710
- if (!topLevel)
711
- return null;
712
- try {
713
- const out = execFileSync("git", ["-C", topLevel, "show", "--name-only", "--pretty=format:", "HEAD"], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
714
- const abs = out
715
- .split(/\r?\n/)
716
- .map((line) => line.trim())
717
- .filter((line) => line.length > 0)
718
- .map((rel) => path.resolve(topLevel, rel));
719
- return new Set(abs);
720
- }
721
- catch {
722
- return null;
723
- }
724
- }
725
755
  function buildAuditCommand() {
726
756
  return new Command("audit")
727
- .description("Read-only scope audit: flag missing/malformed progress rails and registration ghosts")
757
+ .description("Read-only scope audit: flag scope findings and show the advisory dependency graph")
728
758
  .requiredOption("--mission <name>", "Mission to audit")
729
759
  .option("--json", "Machine-readable JSON output")
730
760
  .action(async (opts, command) => {
@@ -740,11 +770,23 @@ function buildAuditCommand() {
740
770
  }
741
771
  const missionReadme = resolveNodeFile(missionDir) ?? path.join(missionDir, "SPEC.md");
742
772
  const missionProgress = path.join(missionDir, "PROGRESS.md");
743
- const missionBrief = path.join(missionDir, "MISSION_BRIEF.md");
744
- const missionNotes = path.join(missionDir, "MISSION_NOTES.md");
773
+ const missionNotesCurrent = path.join(missionDir, "NOTES.md");
774
+ const missionNotesLegacy = path.join(missionDir, "MISSION_NOTES.md");
775
+ const missionNotesExists = fs.existsSync(missionNotesCurrent) || fs.existsSync(missionNotesLegacy);
745
776
  const missionReadmeExists = fs.existsSync(missionReadme);
746
777
  const missionProgressExists = fs.existsSync(missionProgress);
747
- const missionBriefExists = fs.existsSync(missionBrief);
778
+ const auditMission = missionReadmeExists
779
+ ? findMission(missionsRoot, missionName)
780
+ : {
781
+ name: missionName,
782
+ absPath: missionDir,
783
+ readmePath: null,
784
+ frontmatter: {},
785
+ id: null,
786
+ activeSliceCount: 0,
787
+ closedSliceCount: 0,
788
+ };
789
+ const graph = buildMissionDependencyGraph(auditMission);
748
790
  let missionResult;
749
791
  if (!missionReadmeExists && missionProgressExists) {
750
792
  missionResult = {
@@ -753,8 +795,8 @@ function buildAuditCommand() {
753
795
  kind: "orphan_progress",
754
796
  severity: "high",
755
797
  path: missionDir,
756
- message: `PROGRESS.md exists but no README.md (orphan progress rail, no backing scope item)`,
757
- remediation: `Add a README.md with frontmatter id, or remove the orphan PROGRESS.md`,
798
+ message: `PROGRESS.md exists but no SPEC.md or legacy README.md (orphan progress rail, no backing scope item)`,
799
+ remediation: `Add SPEC.md with frontmatter id, or remove the orphan PROGRESS.md`,
758
800
  }],
759
801
  frontmatterError: null,
760
802
  };
@@ -771,22 +813,16 @@ function buildAuditCommand() {
771
813
  readmeOnlyMarker: false,
772
814
  isActiveRelease: true,
773
815
  level: "mission",
774
- missionBriefExists,
775
- missionBriefPath: missionBrief,
776
- missionBriefContent: missionBriefExists ? fs.readFileSync(missionBrief, "utf-8") : null,
777
- missionNotesExists: fs.existsSync(missionNotes),
778
- missionNotesPath: missionNotes,
816
+ missionNotesExists,
817
+ missionNotesPath: missionNotesCurrent,
779
818
  });
780
819
  }
781
820
  const missionShadow = shadowedNodeFileFinding(missionDir, "mission");
782
821
  if (missionShadow)
783
822
  missionResult.findings.push(missionShadow);
823
+ missionResult.findings.push(...capabilityDeltaExpiryFindings(missionDir));
784
824
  const slicesDir = path.join(missionDir, "slices");
785
825
  const dogfoodEvidenceRoot = defaultDogfoodEvidenceRoot(missionsRoot);
786
- // Git-derived input for the committed-without-PROGRESS check (CLI-only).
787
- // Revision basis = the most recent commit (HEAD). null when git context
788
- // is unavailable → the check is left inert per-slice below.
789
- const headTouched = gitHeadTouchedAbsPaths(missionDir);
790
826
  const sliceResults = [];
791
827
  if (fs.existsSync(slicesDir)) {
792
828
  for (const entry of fs.readdirSync(slicesDir)) {
@@ -807,8 +843,8 @@ function buildAuditCommand() {
807
843
  kind: "orphan_progress",
808
844
  severity: "high",
809
845
  path: sliceDir,
810
- message: `PROGRESS.md exists but no README.md (orphan progress rail, no backing scope item)`,
811
- remediation: `Add a README.md with frontmatter id, or remove the orphan PROGRESS.md`,
846
+ message: `PROGRESS.md exists but no SPEC.md or legacy README.md (orphan progress rail, no backing scope item)`,
847
+ remediation: `Add SPEC.md with frontmatter id, or remove the orphan PROGRESS.md`,
812
848
  }],
813
849
  frontmatterError: null,
814
850
  },
@@ -831,23 +867,6 @@ function buildAuditCommand() {
831
867
  const sliceReadmeContent = fs.readFileSync(sliceReadme, "utf-8");
832
868
  const sliceFm = extractFrontmatterRaw(sliceReadmeContent);
833
869
  const readmeOnlyMarker = sliceFm !== null && /^progress_rail\s*:\s*readme-only/m.test(sliceFm);
834
- // committed-without-PROGRESS inputs (CLI-only; inert when git is
835
- // unavailable — leave both undefined so the check does not fire).
836
- // Normalize to realpath so a symlinked workspace (e.g. macOS
837
- // /var → /private/var) still matches git's realpath'd output.
838
- let sliceTouchedByRecentCommit;
839
- let progressTouchedByRecentCommit;
840
- if (headTouched) {
841
- let realSliceDir = sliceDir;
842
- try {
843
- realSliceDir = fs.realpathSync(sliceDir);
844
- }
845
- catch { /* keep sliceDir */ }
846
- const slicePrefix = realSliceDir.endsWith(path.sep) ? realSliceDir : realSliceDir + path.sep;
847
- const realSliceProgress = path.join(realSliceDir, "PROGRESS.md");
848
- sliceTouchedByRecentCommit = [...headTouched].some((p) => p === realSliceDir || p.startsWith(slicePrefix));
849
- progressTouchedByRecentCommit = headTouched.has(realSliceProgress);
850
- }
851
870
  const sliceResult = classifyScopeItem({
852
871
  id: null,
853
872
  path: sliceDir,
@@ -862,12 +881,11 @@ function buildAuditCommand() {
862
881
  proofDirPath: proofDir,
863
882
  proofDirHasEntries: directoryHasEntries(proofDir),
864
883
  hasProofPacket: hasProofPacketForSlice(dogfoodEvidenceRoot, entry),
865
- sliceTouchedByRecentCommit,
866
- progressTouchedByRecentCommit,
867
884
  // OPR.0.4.4.19 FR-10 backstop inputs.
868
885
  proofArtifacts: listProofArtifactsForAudit(proofDir),
869
886
  implementationPrdExists: fs.existsSync(path.join(sliceDir, "IMPLEMENTATION-PRD.md")),
870
887
  // OPR.0.4.4.23 convention-section advisory inputs.
888
+ nodeFileName: path.basename(sliceReadme),
871
889
  readmeContent: sliceReadmeContent,
872
890
  implementationPrdContent: fs.existsSync(path.join(sliceDir, "IMPLEMENTATION-PRD.md"))
873
891
  ? fs.readFileSync(path.join(sliceDir, "IMPLEMENTATION-PRD.md"), "utf-8")
@@ -907,6 +925,7 @@ function buildAuditCommand() {
907
925
  // OPR.0.5.0.18 — amendment lineage (present only when re-stamped).
908
926
  ...(s.attestations ? { attestations: s.attestations } : {}),
909
927
  })),
928
+ graph,
910
929
  totalFindings: allFindings.length,
911
930
  }, null, 2));
912
931
  out.write("\n");
@@ -916,7 +935,14 @@ function buildAuditCommand() {
916
935
  }
917
936
  out.write(`Scope audit: ${missionName}\n`);
918
937
  out.write(`Mission rail: ${missionResult.railStatus}\n`);
919
- out.write(`Slices: ${sliceResults.length} total\n\n`);
938
+ out.write(`Slices: ${sliceResults.length} total\n`);
939
+ out.write(`Ready: ${graph.ready.join(", ") || "(none)"}\n`);
940
+ for (const row of graph.waiting)
941
+ out.write(`Waiting: ${row.id} on ${row.on.join(", ")}\n`);
942
+ for (const row of graph.advisories) {
943
+ out.write(`Advisory: ${row.id}${row.dependency ? ` -> ${row.dependency}` : ""}: ${row.message}\n`);
944
+ }
945
+ out.write("\n");
920
946
  // OPR.0.5.0.18 — amendment lineage: a re-stamped slice shows the
921
947
  // CURRENT attestation + prior-count (the append-only audit rows
922
948
  // reconstruct the full history; this is the at-a-glance surface).
@@ -1228,9 +1254,9 @@ function buildSliceStageCommand() {
1228
1254
  const slice = findSlice(missionsRoot, slicePath, opts.mission ?? null);
1229
1255
  if (!slice.readmePath) {
1230
1256
  throw new ScopeCliError({
1231
- fact: `Slice ${slice.name} has no README.md.`,
1232
- consequence: "Stage is a frontmatter field on the README; nothing to write.",
1233
- action: "Create the slice README (rig scope slice create) before setting its stage.",
1257
+ fact: `Slice ${slice.name} has no SPEC.md or legacy README.md.`,
1258
+ consequence: "Stage is a work-node frontmatter field; nothing to write.",
1259
+ action: "Create the slice with `rig scope slice create` before setting its stage.",
1234
1260
  });
1235
1261
  }
1236
1262
  applyStage(slice.readmePath, stage, opts.successor);
@@ -1262,9 +1288,9 @@ function buildMissionStageCommand() {
1262
1288
  const mission = findMission(missionsRoot, missionName);
1263
1289
  if (!mission.readmePath) {
1264
1290
  throw new ScopeCliError({
1265
- fact: `Mission ${mission.name} has no README.md.`,
1266
- consequence: "Stage is a frontmatter field on the README; nothing to write.",
1267
- action: "Create the mission README before setting its stage.",
1291
+ fact: `Mission ${mission.name} has no SPEC.md or legacy README.md.`,
1292
+ consequence: "Stage is a work-node frontmatter field; nothing to write.",
1293
+ action: "Create the mission with `rig scope mission create` before setting its stage.",
1268
1294
  });
1269
1295
  }
1270
1296
  applyStage(mission.readmePath, stage, opts.successor);
@@ -1296,9 +1322,9 @@ function buildSliceVerifiedCommand() {
1296
1322
  const slice = findSlice(missionsRoot, slicePath, opts.mission ?? null);
1297
1323
  if (!slice.readmePath) {
1298
1324
  throw new ScopeCliError({
1299
- fact: `Slice ${slice.name} has no README.md.`,
1300
- consequence: "verified is a frontmatter field on the README; nothing to write.",
1301
- action: "Create the slice README before stamping verified.",
1325
+ fact: `Slice ${slice.name} has no SPEC.md or legacy README.md.`,
1326
+ consequence: "verified is a work-node frontmatter field; nothing to write.",
1327
+ action: "Create the slice with `rig scope slice create` before stamping verified.",
1302
1328
  });
1303
1329
  }
1304
1330
  const verified = `${todayDateISO()} against ${source}`;
@@ -1327,9 +1353,9 @@ function buildMissionVerifiedCommand() {
1327
1353
  const mission = findMission(missionsRoot, missionName);
1328
1354
  if (!mission.readmePath) {
1329
1355
  throw new ScopeCliError({
1330
- fact: `Mission ${mission.name} has no README.md.`,
1331
- consequence: "verified is a frontmatter field on the README; nothing to write.",
1332
- action: "Create the mission README before stamping verified.",
1356
+ fact: `Mission ${mission.name} has no SPEC.md or legacy README.md.`,
1357
+ consequence: "verified is a work-node frontmatter field; nothing to write.",
1358
+ action: "Create the mission with `rig scope mission create` before stamping verified.",
1333
1359
  });
1334
1360
  }
1335
1361
  const verified = `${todayDateISO()} against ${source}`;
@@ -1359,16 +1385,34 @@ function mapLegacyStatusToStage(status) {
1359
1385
  return "provisional";
1360
1386
  return "wip";
1361
1387
  }
1362
- /** Idempotently conform a scope README's mandatory frontmatter. Only ADDS
1363
- * absent fields never clobbers an existing id/stage/verified. `mintId` is
1364
- * called only when `id` is absent (it may persist a parent id per §1 lazy
1365
- * adoption). */
1388
+ /** Preserve a malformed value before repair replaces it with the conformant
1389
+ * representation. A pre-existing preservation key means a prior repair has
1390
+ * already recorded a different original; refusing is the only lossless move. */
1391
+ function preserveMalformedFrontmatterValue(frontmatter, updates, key) {
1392
+ if (!Object.prototype.hasOwnProperty.call(frontmatter, key))
1393
+ return;
1394
+ const preservedKey = `repair-original-${key.replaceAll("_", "-")}`;
1395
+ if (Object.prototype.hasOwnProperty.call(frontmatter, preservedKey)) {
1396
+ throw new ScopeCliError({
1397
+ fact: `${key} is malformed and ${preservedKey} already exists.`,
1398
+ consequence: "Repair refused rather than overwrite either authored value.",
1399
+ action: `Resolve ${key} manually and retain ${preservedKey} as the prior-value record, then re-run repair.`,
1400
+ });
1401
+ }
1402
+ updates[preservedKey] = frontmatter[key];
1403
+ }
1404
+ /** Idempotently conform a scope README's mandatory frontmatter. Adds absent
1405
+ * fields and replaces malformed ones only after preserving their values under
1406
+ * repair-original-* keys. A valid id/stage/verified is never touched.
1407
+ * `mintId` is called only when `id` is absent or malformed (it may persist a
1408
+ * parent id per §1 lazy adoption). */
1366
1409
  function conformReadmeFrontmatter(readmePath, mintId) {
1367
1410
  const fm = readFrontmatter(readmePath);
1368
1411
  const updates = {};
1369
1412
  let idAdded = null;
1370
- const hasId = typeof fm.id === "string" && fm.id.length > 0;
1413
+ const hasId = typeof fm.id === "string" && fm.id.trim().length > 0;
1371
1414
  if (!hasId) {
1415
+ preserveMalformedFrontmatterValue(fm, updates, "id");
1372
1416
  const minted = mintId();
1373
1417
  if (minted) {
1374
1418
  idAdded = minted;
@@ -1376,12 +1420,16 @@ function conformReadmeFrontmatter(readmePath, mintId) {
1376
1420
  }
1377
1421
  }
1378
1422
  let stageAdded = null;
1379
- if (!fm.stage) {
1423
+ const hasStage = typeof fm.stage === "string" && STAGE_VALUES.includes(fm.stage);
1424
+ if (!hasStage) {
1425
+ preserveMalformedFrontmatterValue(fm, updates, "stage");
1380
1426
  stageAdded = mapLegacyStatusToStage(fm.status);
1381
1427
  updates.stage = stageAdded;
1382
1428
  }
1383
1429
  let verifiedAdded = null;
1384
- if (!fm.verified) {
1430
+ const hasVerified = typeof fm.verified === "string" && fm.verified.trim().length > 0;
1431
+ if (!hasVerified) {
1432
+ preserveMalformedFrontmatterValue(fm, updates, "verified");
1385
1433
  verifiedAdded = `${todayDateISO()} against backfill (rig scope repair)`;
1386
1434
  updates.verified = verifiedAdded;
1387
1435
  }
@@ -1424,11 +1472,16 @@ function buildSliceRepairCommand() {
1424
1472
  const json = Boolean(opts.json);
1425
1473
  try {
1426
1474
  const missionsRoot = resolveMissionsRoot({ override: getOpts(command).workspace });
1427
- const slice = findSlice(missionsRoot, slicePath, opts.mission ?? null);
1475
+ const legacySlice = findSlice(missionsRoot, slicePath, opts.mission ?? null);
1476
+ const specPath = ensureCurrentSpec(legacySlice.absPath, legacySlice.readmePath, legacySlice.name);
1477
+ const slice = findSlice(missionsRoot, legacySlice.absPath, opts.mission ?? null);
1428
1478
  const result = backfillScopeProgress(slice.absPath, "slice");
1429
- const frontmatter = slice.readmePath
1430
- ? conformReadmeFrontmatter(slice.readmePath, mintSliceIdClosure(slice, missionsRoot))
1479
+ const frontmatter = specPath
1480
+ ? conformReadmeFrontmatter(specPath, mintSliceIdClosure(slice, missionsRoot))
1431
1481
  : { idAdded: null, stageAdded: null, verifiedAdded: null, changed: false };
1482
+ if (specPath)
1483
+ ensureConventionFrontmatter(specPath, slice.name);
1484
+ ensureSliceProofSurface(slice.absPath, readFrontmatter(specPath ?? "").id, slice.name);
1432
1485
  emit(out, { ok: true, result, frontmatter }, json, [
1433
1486
  `${result.created ? "Backfilled" : "Skipped"} ${slice.name}: ${result.reason}`,
1434
1487
  ...(result.path ? [` path: ${result.path}`] : []),
@@ -1450,6 +1503,8 @@ function buildMissionRepairCommand() {
1450
1503
  const json = Boolean(opts.json);
1451
1504
  try {
1452
1505
  const missionsRoot = resolveMissionsRoot({ override: getOpts(command).workspace });
1506
+ const legacyMission = findMission(missionsRoot, missionName);
1507
+ const missionSpec = ensureCurrentSpec(legacyMission.absPath, legacyMission.readmePath, legacyMission.name);
1453
1508
  const mission = findMission(missionsRoot, missionName);
1454
1509
  const results = [];
1455
1510
  results.push(backfillScopeProgress(mission.absPath, "mission"));
@@ -1465,15 +1520,21 @@ function buildMissionRepairCommand() {
1465
1520
  // the mission id), then each slice (child ids derive from the now-
1466
1521
  // persisted parent id).
1467
1522
  const conformed = [];
1468
- if (mission.readmePath) {
1469
- const fm = conformReadmeFrontmatter(mission.readmePath, () => ensureMissionId(mission, missionsRoot));
1523
+ if (missionSpec) {
1524
+ const fm = conformReadmeFrontmatter(missionSpec, () => ensureMissionId(mission, missionsRoot));
1525
+ ensureConventionFrontmatter(missionSpec, mission.name);
1470
1526
  conformed.push({ scope: "mission", name: mission.name, frontmatter: fm });
1471
1527
  }
1472
1528
  const freshMission = findMission(missionsRoot, mission.name);
1529
+ ensureMissionNotesSurface(freshMission.absPath, freshMission);
1473
1530
  for (const slice of listSlices(freshMission, "all")) {
1474
- if (!slice.readmePath)
1531
+ const specPath = ensureCurrentSpec(slice.absPath, slice.readmePath, slice.name);
1532
+ if (!specPath)
1475
1533
  continue;
1476
- const fm = conformReadmeFrontmatter(slice.readmePath, mintSliceIdClosure(slice, missionsRoot));
1534
+ const fm = conformReadmeFrontmatter(specPath, mintSliceIdClosure(slice, missionsRoot));
1535
+ ensureConventionFrontmatter(specPath, slice.name);
1536
+ backfillScopeProgress(slice.absPath, "slice");
1537
+ ensureSliceProofSurface(slice.absPath, readFrontmatter(specPath).id, slice.name);
1477
1538
  conformed.push({ scope: "slice", name: slice.name, frontmatter: fm });
1478
1539
  }
1479
1540
  const created = results.filter((r) => r.created);
@@ -1489,6 +1550,63 @@ function buildMissionRepairCommand() {
1489
1550
  }
1490
1551
  });
1491
1552
  }
1553
+ /** Add the current authored node beside a legacy README without touching the
1554
+ * legacy file. Existing SPEC bytes stay in place. */
1555
+ function ensureCurrentSpec(dir, nodePath, fallbackName) {
1556
+ const specPath = path.join(dir, "SPEC.md");
1557
+ if (fs.existsSync(specPath))
1558
+ return specPath;
1559
+ if (!nodePath || !fs.existsSync(nodePath))
1560
+ return null;
1561
+ fs.copyFileSync(nodePath, specPath);
1562
+ ensureConventionFrontmatter(specPath, fallbackName);
1563
+ return specPath;
1564
+ }
1565
+ function ensureConventionFrontmatter(specPath, fallbackName) {
1566
+ const content = fs.readFileSync(specPath, "utf8");
1567
+ const { frontmatter, body } = splitFrontmatter(content);
1568
+ const h2Intent = /^## Intent\s*\n+([\s\S]*?)(?=\n## |$)/m.exec(body)?.[1]?.trim();
1569
+ const h1 = /^#\s+(.+)$/m.exec(body)?.[1]?.trim();
1570
+ const updates = {};
1571
+ if (!(typeof frontmatter.intent === "string" && frontmatter.intent.trim().length > 0)) {
1572
+ preserveMalformedFrontmatterValue(frontmatter, updates, "intent");
1573
+ updates.intent = h2Intent && !/^\[.*\]$/.test(h2Intent)
1574
+ ? h2Intent
1575
+ : h1 ?? titleFromSlug(fallbackName.replace(/^\d+-/, ""));
1576
+ }
1577
+ if (!Array.isArray(frontmatter.depends_on)) {
1578
+ preserveMalformedFrontmatterValue(frontmatter, updates, "depends_on");
1579
+ updates.depends_on = [];
1580
+ }
1581
+ if (Object.keys(updates).length > 0)
1582
+ updateFrontmatter(specPath, updates);
1583
+ }
1584
+ function ensureMissionNotesSurface(dir, mission) {
1585
+ const notesPath = path.join(dir, "NOTES.md");
1586
+ if (fs.existsSync(notesPath))
1587
+ return;
1588
+ const legacyPath = path.join(dir, "MISSION_NOTES.md");
1589
+ if (fs.existsSync(legacyPath)) {
1590
+ fs.copyFileSync(legacyPath, notesPath);
1591
+ return;
1592
+ }
1593
+ const rendered = renderNotesTemplate({
1594
+ mission_id: mission.id ?? mission.name,
1595
+ mission_name: typeof mission.frontmatter.intent === "string" ? mission.frontmatter.intent : mission.name,
1596
+ created_date: todayDateISO(),
1597
+ });
1598
+ fs.writeFileSync(notesPath, rendered.rendered, "utf8");
1599
+ }
1600
+ function ensureSliceProofSurface(dir, rawId, fallbackName) {
1601
+ fs.mkdirSync(path.join(dir, "proof"), { recursive: true });
1602
+ const proofPath = path.join(dir, "PROOF.md");
1603
+ if (fs.existsSync(proofPath))
1604
+ return;
1605
+ fs.writeFileSync(proofPath, renderSliceProofTemplate({
1606
+ id: typeof rawId === "string" ? rawId : fallbackName,
1607
+ title: titleFromSlug(fallbackName.replace(/^\d+-/, "")),
1608
+ }), "utf8");
1609
+ }
1492
1610
  // ---------------------------------------------------------------------
1493
1611
  // Approve (OPR.0.4.4.19 FR-9)
1494
1612
  // ---------------------------------------------------------------------
@@ -1663,6 +1781,7 @@ export function scopeCommand() {
1663
1781
  mission.addCommand(buildMissionLsCommand());
1664
1782
  mission.addCommand(buildMissionShowCommand());
1665
1783
  mission.addCommand(buildMissionCreateCommand());
1784
+ mission.addCommand(buildMissionGraphCommand());
1666
1785
  mission.addCommand(buildMissionProgressCommand());
1667
1786
  mission.addCommand(buildMissionRepairCommand());
1668
1787
  mission.addCommand(buildMissionStageCommand());