@svenroth-ai/shipwright 0.24.7-next.0 → 0.26.0

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 (239) hide show
  1. package/client/dist/assets/{EmbeddedTerminal-D2BLGWdW.js → EmbeddedTerminal-D3wpPNZP.js} +20 -20
  2. package/client/dist/assets/{abnfDiagram-VRR7QNED-C-W_2Jd4.js → abnfDiagram-VRR7QNED-BkLIltB3.js} +1 -1
  3. package/client/dist/assets/{arc-CpqwESP5.js → arc-Sw-Gh0nI.js} +1 -1
  4. package/client/dist/assets/{architectureDiagram-ZJ3FMSHR-DZVZ895V.js → architectureDiagram-ZJ3FMSHR-rdxUi9Ks.js} +1 -1
  5. package/client/dist/assets/{blockDiagram-677ZJIJ3-CCCZiAA7.js → blockDiagram-677ZJIJ3-Ch_9dj8a.js} +1 -1
  6. package/client/dist/assets/{c4Diagram-LMCZKHZV-Bg1beZAE.js → c4Diagram-LMCZKHZV-CkFlO65x.js} +1 -1
  7. package/client/dist/assets/channel-BYPbLjRl.js +1 -0
  8. package/client/dist/assets/{chunk-2Q5K7J3B-CoaXSarh.js → chunk-2Q5K7J3B-CypX83xu.js} +1 -1
  9. package/client/dist/assets/{chunk-32BRIVSS-CeFXS-CM.js → chunk-32BRIVSS-DxVLYGdl.js} +1 -1
  10. package/client/dist/assets/{chunk-5VM5RSS4-QyJMVe0m.js → chunk-5VM5RSS4-Cxk1evhx.js} +1 -1
  11. package/client/dist/assets/{chunk-EX3LRPZG-BIOtWVF8.js → chunk-EX3LRPZG-n9q5S4yJ.js} +1 -1
  12. package/client/dist/assets/{chunk-JWPE2WC7-Dcq-lWyX.js → chunk-JWPE2WC7-jeL4xvir.js} +1 -1
  13. package/client/dist/assets/{chunk-MOJQB5TN-C95323ja.js → chunk-MOJQB5TN-DDSHN0cj.js} +1 -1
  14. package/client/dist/assets/{chunk-RYQCIY6F-C0HPwpWy.js → chunk-RYQCIY6F-C0bo383g.js} +1 -1
  15. package/client/dist/assets/{chunk-V7JOEXUC-BPrTbZqA.js → chunk-V7JOEXUC-C0jDXXAU.js} +1 -1
  16. package/client/dist/assets/{chunk-VR4S4FIN--BCnNoqt.js → chunk-VR4S4FIN-h-Rr4Pn2.js} +1 -1
  17. package/client/dist/assets/{chunk-XXDRQBXY-Dj8vtcXf.js → chunk-XXDRQBXY-BexSo0-s.js} +1 -1
  18. package/client/dist/assets/classDiagram-OUVF2IWQ-CsFIeTju.js +1 -0
  19. package/client/dist/assets/classDiagram-v2-EOCWNBFH-CsFIeTju.js +1 -0
  20. package/client/dist/assets/{cose-bilkent-JH36ORCC-y51otZKz.js → cose-bilkent-JH36ORCC-BQXzaioj.js} +1 -1
  21. package/client/dist/assets/{cynefin-VYW2F7L2-BRfS3cHo.js → cynefin-VYW2F7L2-BJIofhfe.js} +1 -1
  22. package/client/dist/assets/{cynefinDiagram-TSTJHNR4-Dpg2RtfL.js → cynefinDiagram-TSTJHNR4-DmPqTM1T.js} +1 -1
  23. package/client/dist/assets/{dagre-VKFMJZFB-BdZtXgKZ.js → dagre-VKFMJZFB-1xljvw6X.js} +1 -1
  24. package/client/dist/assets/{diagram-FQU43EPY-K-RCwWxW.js → diagram-FQU43EPY-iyL9muCG.js} +1 -1
  25. package/client/dist/assets/{diagram-G47NLZAW-CHNn7F2-.js → diagram-G47NLZAW-DREp2Th6.js} +1 -1
  26. package/client/dist/assets/{diagram-NH7WQ7WH-B3zu6xib.js → diagram-NH7WQ7WH-h0X3Is2S.js} +1 -1
  27. package/client/dist/assets/{diagram-OA4YK3LP-Wp5ju7L7.js → diagram-OA4YK3LP-Bj8YZRFJ.js} +1 -1
  28. package/client/dist/assets/{diagram-WEI45ONY-C94GpsRk.js → diagram-WEI45ONY-BZOf805d.js} +1 -1
  29. package/client/dist/assets/{ebnfDiagram-CCIWWBDH-DXrTPOrP.js → ebnfDiagram-CCIWWBDH-DO5JnXda.js} +1 -1
  30. package/client/dist/assets/{erDiagram-Q63AITRT-CGejnW0f.js → erDiagram-Q63AITRT-DRgcqg1T.js} +1 -1
  31. package/client/dist/assets/{flowDiagram-23GEKE2U-CFJMM637.js → flowDiagram-23GEKE2U-C3J9QmrW.js} +1 -1
  32. package/client/dist/assets/{ganttDiagram-NO4QXBWP-DnaH94Su.js → ganttDiagram-NO4QXBWP-BIEl3Tkm.js} +1 -1
  33. package/client/dist/assets/{gitGraphDiagram-IHSO6WYX-DT-D0gbn.js → gitGraphDiagram-IHSO6WYX-BNF0tFWC.js} +1 -1
  34. package/client/dist/assets/index-BnTOrFHb.js +829 -0
  35. package/client/dist/assets/index-CYPc6qxw.css +1 -0
  36. package/client/dist/assets/{infoDiagram-FWYZ7A6U-DW3Ps00w.js → infoDiagram-FWYZ7A6U-DEyFxiyY.js} +1 -1
  37. package/client/dist/assets/{ishikawaDiagram-FXEZZL3T-DjxjIT3n.js → ishikawaDiagram-FXEZZL3T-B_ehlg3I.js} +1 -1
  38. package/client/dist/assets/{journeyDiagram-5HDEW3XC-DTQRI93Y.js → journeyDiagram-5HDEW3XC-Dp00FyJS.js} +1 -1
  39. package/client/dist/assets/{kanban-definition-HUTT4EX6-BeDvbiEs.js → kanban-definition-HUTT4EX6-CTAf16q8.js} +1 -1
  40. package/client/dist/assets/{linear-B4foxDlh.js → linear-9vNUgmYd.js} +1 -1
  41. package/client/dist/assets/{mermaid.core-c-L4qgSB.js → mermaid.core-A6tjaEVD.js} +4 -4
  42. package/client/dist/assets/{mindmap-definition-LN4V7U3C-dh8v0J8T.js → mindmap-definition-LN4V7U3C-DRW3bmCY.js} +1 -1
  43. package/client/dist/assets/{pegDiagram-2B236MQR-D5vNrtFh.js → pegDiagram-2B236MQR-DJFCjHp2.js} +1 -1
  44. package/client/dist/assets/{pieDiagram-ENE6RG2P-CIjg_6lR.js → pieDiagram-ENE6RG2P-KRd-sGvC.js} +1 -1
  45. package/client/dist/assets/{quadrantDiagram-ABIIQ3AL-CF37qWQD.js → quadrantDiagram-ABIIQ3AL-9TLZE3Hu.js} +1 -1
  46. package/client/dist/assets/{railroadDiagram-RFXS5EU6-x0Hn30Kj.js → railroadDiagram-RFXS5EU6-y4tLtjXg.js} +1 -1
  47. package/client/dist/assets/{requirementDiagram-TGXJPOKE-BE2QnVbN.js → requirementDiagram-TGXJPOKE-B9EOQDQM.js} +1 -1
  48. package/client/dist/assets/{sankeyDiagram-HTMAVEWB-CUv6cIlV.js → sankeyDiagram-HTMAVEWB-zfwiDzkT.js} +1 -1
  49. package/client/dist/assets/{sequenceDiagram-DBY2YBRQ-C3ACj5LS.js → sequenceDiagram-DBY2YBRQ-DW1LWepL.js} +1 -1
  50. package/client/dist/assets/{sizeCapture-X5ZJPWSS-DTMIb5gX.js → sizeCapture-X5ZJPWSS-BM81Mik0.js} +1 -1
  51. package/client/dist/assets/{stateDiagram-2N3HPSRC-DI1Z8P74.js → stateDiagram-2N3HPSRC-D0EMIw1w.js} +1 -1
  52. package/client/dist/assets/stateDiagram-v2-6OUMAXLB-B3E4_xxT.js +1 -0
  53. package/client/dist/assets/{swimlanes-5IMT3BWC-CLSr9w29.js → swimlanes-5IMT3BWC-CKXNCX6M.js} +2 -2
  54. package/client/dist/assets/swimlanesDiagram-G3AALYLV-BegQBqnC.js +8 -0
  55. package/client/dist/assets/{timeline-definition-FHXFAJF6-BTWmUhDh.js → timeline-definition-FHXFAJF6-ByzIfvL5.js} +1 -1
  56. package/client/dist/assets/{vennDiagram-L72KCM5P-Ce1dlLCM.js → vennDiagram-L72KCM5P-Xep38xBH.js} +1 -1
  57. package/client/dist/assets/{wardleyDiagram-EHGQE667-ClOE-aae.js → wardleyDiagram-EHGQE667-DKWDpx6g.js} +1 -1
  58. package/client/dist/assets/{xychartDiagram-FW5EYKEG-Fa2pqWKw.js → xychartDiagram-FW5EYKEG-BGcwZTnu.js} +1 -1
  59. package/client/dist/index.html +27 -27
  60. package/lib/claude-cli.mjs +173 -173
  61. package/lib/preflight.mjs +252 -252
  62. package/lib/probe-path.mjs +84 -84
  63. package/lib/server.mjs +369 -369
  64. package/lib/util.mjs +157 -157
  65. package/lib/win32-spawn.mjs +253 -253
  66. package/package.json +1 -1
  67. package/scripts/deploy-procs.mjs +208 -208
  68. package/scripts/deploy-swap.mjs +276 -276
  69. package/scripts/kill-targets.js +140 -140
  70. package/scripts/repair-claude-json.mjs +295 -295
  71. package/server/dist/config/default-actions.json +90 -90
  72. package/server/dist/core/grade-runner.d.ts +4 -4
  73. package/server/dist/core/grade-runner.d.ts.map +1 -1
  74. package/server/dist/core/grade-runner.js +51 -26
  75. package/server/dist/core/grade-runner.js.map +1 -1
  76. package/server/dist/core/grade-target.d.ts +8 -0
  77. package/server/dist/core/grade-target.d.ts.map +1 -1
  78. package/server/dist/core/grade-target.js +10 -0
  79. package/server/dist/core/grade-target.js.map +1 -1
  80. package/server/dist/core/mission-context/association.d.ts +46 -0
  81. package/server/dist/core/mission-context/association.d.ts.map +1 -1
  82. package/server/dist/core/mission-context/association.js +69 -0
  83. package/server/dist/core/mission-context/association.js.map +1 -1
  84. package/server/dist/core/mission-context/resolver-iterate.d.ts +6 -0
  85. package/server/dist/core/mission-context/resolver-iterate.d.ts.map +1 -0
  86. package/server/dist/core/mission-context/resolver-iterate.js +202 -0
  87. package/server/dist/core/mission-context/resolver-iterate.js.map +1 -0
  88. package/server/dist/core/mission-context/resolver-parts.d.ts +20 -0
  89. package/server/dist/core/mission-context/resolver-parts.d.ts.map +1 -1
  90. package/server/dist/core/mission-context/resolver-parts.js +92 -0
  91. package/server/dist/core/mission-context/resolver-parts.js.map +1 -1
  92. package/server/dist/core/mission-context/resolver.d.ts +1 -1
  93. package/server/dist/core/mission-context/resolver.d.ts.map +1 -1
  94. package/server/dist/core/mission-context/resolver.js +17 -199
  95. package/server/dist/core/mission-context/resolver.js.map +1 -1
  96. package/server/dist/core/mission-context/run-id-recovery.d.ts +21 -5
  97. package/server/dist/core/mission-context/run-id-recovery.d.ts.map +1 -1
  98. package/server/dist/core/mission-context/run-id-recovery.js +32 -5
  99. package/server/dist/core/mission-context/run-id-recovery.js.map +1 -1
  100. package/server/dist/core/mission-context/scenario.d.ts +18 -11
  101. package/server/dist/core/mission-context/scenario.d.ts.map +1 -1
  102. package/server/dist/core/mission-context/scenario.js +40 -3
  103. package/server/dist/core/mission-context/scenario.js.map +1 -1
  104. package/server/dist/core/path-guard.d.ts +1 -1
  105. package/server/dist/core/path-guard.d.ts.map +1 -1
  106. package/server/dist/core/path-guard.js +9 -2
  107. package/server/dist/core/path-guard.js.map +1 -1
  108. package/server/dist/core/shipslog-docs-reader.d.ts +4 -0
  109. package/server/dist/core/shipslog-docs-reader.d.ts.map +1 -0
  110. package/server/dist/core/shipslog-docs-reader.js +181 -0
  111. package/server/dist/core/shipslog-docs-reader.js.map +1 -0
  112. package/server/dist/core/shipslog-docs-types.d.ts +15 -0
  113. package/server/dist/core/shipslog-docs-types.d.ts.map +1 -0
  114. package/server/dist/core/shipslog-docs-types.js +14 -0
  115. package/server/dist/core/shipslog-docs-types.js.map +1 -0
  116. package/server/dist/core/triage-cli-runner.d.ts.map +1 -1
  117. package/server/dist/core/triage-cli-runner.js +29 -10
  118. package/server/dist/core/triage-cli-runner.js.map +1 -1
  119. package/server/dist/core/uv-runner.d.ts +23 -0
  120. package/server/dist/core/uv-runner.d.ts.map +1 -0
  121. package/server/dist/core/uv-runner.js +39 -0
  122. package/server/dist/core/uv-runner.js.map +1 -0
  123. package/server/dist/external/design-review/serve.js +27 -27
  124. package/server/dist/external/file/exists-routes.d.ts +7 -0
  125. package/server/dist/external/file/exists-routes.d.ts.map +1 -0
  126. package/server/dist/external/file/exists-routes.js +91 -0
  127. package/server/dist/external/file/exists-routes.js.map +1 -0
  128. package/server/dist/external/mission-context/association-write.d.ts +22 -0
  129. package/server/dist/external/mission-context/association-write.d.ts.map +1 -0
  130. package/server/dist/external/mission-context/association-write.js +90 -0
  131. package/server/dist/external/mission-context/association-write.js.map +1 -0
  132. package/server/dist/external/mission-context/routes.d.ts.map +1 -1
  133. package/server/dist/external/mission-context/routes.js +18 -31
  134. package/server/dist/external/mission-context/routes.js.map +1 -1
  135. package/server/dist/external/org/audit-log.d.ts +27 -0
  136. package/server/dist/external/org/audit-log.d.ts.map +1 -0
  137. package/server/dist/external/org/audit-log.js +92 -0
  138. package/server/dist/external/org/audit-log.js.map +1 -0
  139. package/server/dist/external/org/beat-register.d.ts +15 -22
  140. package/server/dist/external/org/beat-register.d.ts.map +1 -1
  141. package/server/dist/external/org/beat-register.js +37 -32
  142. package/server/dist/external/org/beat-register.js.map +1 -1
  143. package/server/dist/external/org/file-read.d.ts +16 -0
  144. package/server/dist/external/org/file-read.d.ts.map +1 -1
  145. package/server/dist/external/org/file-read.js +86 -46
  146. package/server/dist/external/org/file-read.js.map +1 -1
  147. package/server/dist/external/org/file-write-core.d.ts +18 -0
  148. package/server/dist/external/org/file-write-core.d.ts.map +1 -0
  149. package/server/dist/external/org/file-write-core.js +97 -0
  150. package/server/dist/external/org/file-write-core.js.map +1 -0
  151. package/server/dist/external/org/file-write.d.ts +25 -0
  152. package/server/dist/external/org/file-write.d.ts.map +1 -1
  153. package/server/dist/external/org/file-write.js +82 -132
  154. package/server/dist/external/org/file-write.js.map +1 -1
  155. package/server/dist/external/org/last-run.d.ts +25 -16
  156. package/server/dist/external/org/last-run.d.ts.map +1 -1
  157. package/server/dist/external/org/last-run.js +78 -64
  158. package/server/dist/external/org/last-run.js.map +1 -1
  159. package/server/dist/external/org/lead-doc-read.d.ts +21 -0
  160. package/server/dist/external/org/lead-doc-read.d.ts.map +1 -0
  161. package/server/dist/external/org/lead-doc-read.js +84 -0
  162. package/server/dist/external/org/lead-doc-read.js.map +1 -0
  163. package/server/dist/external/org/mount.d.ts +12 -0
  164. package/server/dist/external/org/mount.d.ts.map +1 -0
  165. package/server/dist/external/org/mount.js +34 -0
  166. package/server/dist/external/org/mount.js.map +1 -0
  167. package/server/dist/external/org/org-chart-lookup.d.ts +13 -0
  168. package/server/dist/external/org/org-chart-lookup.d.ts.map +1 -1
  169. package/server/dist/external/org/org-chart-lookup.js +40 -5
  170. package/server/dist/external/org/org-chart-lookup.js.map +1 -1
  171. package/server/dist/external/org/org-chart.d.ts +21 -12
  172. package/server/dist/external/org/org-chart.d.ts.map +1 -1
  173. package/server/dist/external/org/org-chart.js +50 -32
  174. package/server/dist/external/org/org-chart.js.map +1 -1
  175. package/server/dist/external/org/role-extract.d.ts +8 -0
  176. package/server/dist/external/org/role-extract.d.ts.map +1 -0
  177. package/server/dist/external/org/role-extract.js +72 -0
  178. package/server/dist/external/org/role-extract.js.map +1 -0
  179. package/server/dist/external/org/usage.d.ts +15 -11
  180. package/server/dist/external/org/usage.d.ts.map +1 -1
  181. package/server/dist/external/org/usage.js +64 -54
  182. package/server/dist/external/org/usage.js.map +1 -1
  183. package/server/dist/external/routes.d.ts +1 -1
  184. package/server/dist/external/routes.d.ts.map +1 -1
  185. package/server/dist/external/routes.js +19 -17
  186. package/server/dist/external/routes.js.map +1 -1
  187. package/server/dist/external/shipslog-docs/routes.d.ts +10 -0
  188. package/server/dist/external/shipslog-docs/routes.d.ts.map +1 -0
  189. package/server/dist/external/shipslog-docs/routes.js +41 -0
  190. package/server/dist/external/shipslog-docs/routes.js.map +1 -0
  191. package/server/dist/routes/grade.d.ts.map +1 -1
  192. package/server/dist/routes/grade.js +3 -2
  193. package/server/dist/routes/grade.js.map +1 -1
  194. package/server/dist/routes/org-leads-composite.d.ts +21 -0
  195. package/server/dist/routes/org-leads-composite.d.ts.map +1 -0
  196. package/server/dist/routes/org-leads-composite.js +95 -0
  197. package/server/dist/routes/org-leads-composite.js.map +1 -0
  198. package/server/dist/routes/org.d.ts +15 -0
  199. package/server/dist/routes/org.d.ts.map +1 -0
  200. package/server/dist/routes/org.js +198 -0
  201. package/server/dist/routes/org.js.map +1 -0
  202. package/server/dist/terminal/pty-manager.d.ts +9 -0
  203. package/server/dist/terminal/pty-manager.d.ts.map +1 -1
  204. package/server/dist/terminal/pty-manager.js +15 -0
  205. package/server/dist/terminal/pty-manager.js.map +1 -1
  206. package/server/dist/terminal/replay-snapshot.d.ts +10 -1
  207. package/server/dist/terminal/replay-snapshot.d.ts.map +1 -1
  208. package/server/dist/terminal/replay-snapshot.js +36 -1
  209. package/server/dist/terminal/replay-snapshot.js.map +1 -1
  210. package/server/dist/terminal/ws-upgrade-handler.d.ts +17 -1
  211. package/server/dist/terminal/ws-upgrade-handler.d.ts.map +1 -1
  212. package/server/dist/terminal/ws-upgrade-handler.fixtures.d.ts +1 -0
  213. package/server/dist/terminal/ws-upgrade-handler.fixtures.d.ts.map +1 -1
  214. package/server/dist/terminal/ws-upgrade-handler.fixtures.js +3 -2
  215. package/server/dist/terminal/ws-upgrade-handler.fixtures.js.map +1 -1
  216. package/server/dist/terminal/ws-upgrade-handler.js +45 -4
  217. package/server/dist/terminal/ws-upgrade-handler.js.map +1 -1
  218. package/server/dist/test/python-spawn-guard-util.d.ts +14 -0
  219. package/server/dist/test/python-spawn-guard-util.d.ts.map +1 -0
  220. package/server/dist/test/python-spawn-guard-util.js +124 -0
  221. package/server/dist/test/python-spawn-guard-util.js.map +1 -0
  222. package/server/dist/types/org.d.ts +115 -0
  223. package/server/dist/types/org.d.ts.map +1 -0
  224. package/server/dist/types/org.js +16 -0
  225. package/server/dist/types/org.js.map +1 -0
  226. package/server/package.json +1 -1
  227. package/server/profiles/PROFILE_SCHEMA_VERSION +1 -1
  228. package/server/profiles/README.md +27 -27
  229. package/server/profiles/python-plugin-monorepo.json +35 -35
  230. package/server/profiles/supabase-nextjs.json +253 -253
  231. package/server/profiles/vite-hono.json +92 -92
  232. package/client/dist/assets/MarkdownEditorModal-CP5yG9OU.js +0 -212
  233. package/client/dist/assets/channel-BNXbCvDS.js +0 -1
  234. package/client/dist/assets/classDiagram-OUVF2IWQ-w-wCtLx3.js +0 -1
  235. package/client/dist/assets/classDiagram-v2-EOCWNBFH-w-wCtLx3.js +0 -1
  236. package/client/dist/assets/index-CU2QJgvx.js +0 -609
  237. package/client/dist/assets/index-ftvVcUT8.css +0 -1
  238. package/client/dist/assets/stateDiagram-v2-6OUMAXLB-DvwiHlJv.js +0 -1
  239. package/client/dist/assets/swimlanesDiagram-G3AALYLV-JTQZTlZ3.js +0 -8
@@ -10,27 +10,16 @@
10
10
  * source-mtime `rev` (resolver-parts.ts); merge is refreshed per call
11
11
  * (merge-refresh.ts) because it is the one field no source file tracks.
12
12
  */
13
- import { cache, CACHE_CAP, computeSourceRev, docFingerprint, integrityResult, readBounded, } from "./resolver-parts.js";
14
- export { _clearResolverCache } from "./resolver-parts.js";
13
+ import { buildRecoveryThunk, computeSourceRev, integrityResult, } from "./resolver-parts.js";
14
+ export { _clearResolverCache, _clearSupersessionMemo } from "./resolver-parts.js";
15
15
  // Re-exported so the detail endpoint keeps its single import site (§5.2).
16
16
  export { readDocumentBody } from "./document-read.js";
17
- import { loadFoldMap, SPEC_REL_PARTS, specPath } from "./fold-map.js";
18
- import { checkSquashMerged, extractPrMarker, readOriginSlug } from "./merge-check.js";
19
- import { refreshMerge } from "./merge-refresh.js";
20
- import { mintDocId } from "./doc-ids.js";
17
+ import { specPath } from "./fold-map.js";
18
+ import { eventsPath } from "./iterate-record.js";
21
19
  import { readIteratePointer } from "./pointer.js";
22
20
  import { detectScenario } from "./scenario.js";
23
- import { buildRequirementArtifact, buildSpecArtifact } from "./artifacts.js";
24
- import { buildCommitArtifact } from "./artifacts-commit.js";
25
- import { buildSlice2Artifacts, slice2RevPaths } from "./slice2-sources.js";
26
21
  import { buildNonIterateContext } from "./slice3-sources.js";
27
- import { eventsPath, iterateDocPath, readIterateDoc } from "./iterate-record.js";
28
- import { resolveWorkCompleted } from "./merged-events.js";
29
- import { campaignSpecCandidates, specCandidates, specHintCandidate, } from "./spec-candidates.js";
30
- import { recoverRunIdFromTranscript } from "./run-id-recovery.js";
31
- import { toMissionTests } from "./artifacts-tests.js";
32
- import { chooseRoot, readAllowedRootsCached, resolveFirstDoc } from "./worktree-roots.js";
33
- import { MISSION_CONTEXT_SCHEMA_VERSION, } from "./types.js";
22
+ import { resolveIterateContext } from "./resolver-iterate.js";
34
23
  /**
35
24
  * Resolve the Mission context. Pure read — the caller performs the association
36
25
  * write, because persistence needs the store's lock and this module stays
@@ -39,20 +28,17 @@ import { MISSION_CONTEXT_SCHEMA_VERSION, } from "./types.js";
39
28
  export async function resolveMissionContext(req, deps = {}) {
40
29
  const { projectRoot, sessionUuid } = req;
41
30
  const pointer = readIteratePointer(projectRoot, sessionUuid);
42
- // LAZY. The table calls this only if rules 1-4 all miss (scenario.ts rule 5),
43
- // so a pointer-, association-, pipeline- or campaign-identified task pays
44
- // nothing; a successful recovery is persisted below, so a task that does reach
45
- // it pays once and never again.
46
- //
47
- // "At most once per resolve" is pinned by a TEST over the table
48
- // (recovery-schedule.test.ts) rather than by a memo guard here. The external
49
- // plan review proposed the guard for a future rule that consulted the footer
50
- // twice — but a guard would make that mistake invisible, and this is a hot
51
- // read path where silence is exactly what produced the finding being fixed.
31
+ // LAZY. Called only if rules 1-4 all miss (rule 5) or rule 2b is checking an
32
+ // association for supersession — "at most once per resolve" is pinned by a
33
+ // TEST over the table (recovery-schedule.test.ts), not a guard here (a guard
34
+ // would make a future double-consult invisible, on a hot read path where
35
+ // silence is what produced the finding being fixed). Rule 2b's use is
36
+ // additionally throttled by transcript content — see `buildRecoveryThunk`
37
+ // in resolver-parts.ts for why and how (iterate-2026-08-31-mission-feed-gaps).
52
38
  const decision = detectScenario({
53
39
  pointer,
54
40
  association: req.association ?? null,
55
- recoverTranscriptRunId: () => recoverRunIdFromTranscript(projectRoot, req.transcript, sessionUuid),
41
+ recoverTranscriptRunId: buildRecoveryThunk(projectRoot, sessionUuid, req.transcript, req.association?.runId ?? null),
56
42
  actions: req.actions,
57
43
  runConfigStatus: req.runConfigStatus,
58
44
  phaseTaskId: req.phaseTaskId,
@@ -85,177 +71,9 @@ export async function resolveMissionContext(req, deps = {}) {
85
71
  associateSource: "iterate_active_pointer",
86
72
  };
87
73
  }
88
- const runId = decision.runId;
89
- const slug = pointer.status === "ok" ? pointer.pointer.slug : null;
90
- const worktreePath = pointer.status === "ok" ? pointer.pointer.worktreePath : null;
91
- const roots = await readAllowedRootsCached(projectRoot, { git: deps.git });
92
- // A worktree git does not know is simply NOT USED as a read root — that is
93
- // `chooseRoot`'s contract, and it is the normal post-Finalize state, not an
94
- // integrity failure. MEASURED 2026-07-21: git registered 0 of this project's
95
- // 20 live pointers' worktrees (removed at Finalize, directory left behind),
96
- // and the earlier hard failure here erased all six artifacts for every one of
97
- // them although every run had its record in the main root. See ADR.
98
- const chosen = chooseRoot(roots, worktreePath);
99
- // --- Records (the spec candidates below are built from them). The event
100
- // lookup is (mtime,size)-indexed: ahead of the cache check it is a Map hit.
101
- const iterateDoc = readIterateDoc(projectRoot, runId);
102
- // Working tree first, then — for a FINISHED run whose worktree is gone
103
- // (`!isWorktree`) and whose row is not local — the default remote ref where
104
- // the squash landed it. This is the "merged but not pulled" case that
105
- // otherwise leaves only Decisions on the rail (merged-events.ts).
106
- const { events, mergedRefMiss } = await resolveWorkCompleted(projectRoot, runId, chosen.isWorktree, { git: deps.git });
107
- const run = events.status === "found" ? events.run : null;
108
- // --- Spec: known layout, agent-doc hint, then that same campaign path rebuilt
109
- // from the never-evicted event log — APPENDED, so preference order is
110
- // unchanged and it only adds reach once the doc evicts (trg-92c0c36b).
111
- const hint = specHintCandidate(iterateDoc?.specHint);
112
- const candidates = [
113
- ...specCandidates(runId, slug),
114
- ...(hint ? [hint] : []),
115
- ...campaignSpecCandidates(chosen.root, run?.campaign, run?.subIterateId),
116
- ];
117
- const doc = resolveFirstDoc(chosen.root, candidates);
118
- // The rev covers EVERY source used, incl. the iterate + agent docs AND the
119
- // Slice-2 sources. An input missing from here is an input FROZEN by the cache.
120
- const rev = computeSourceRev([
121
- ...baseRevPaths,
122
- iterateDocPath(projectRoot, runId),
123
- ...slice2RevPaths(projectRoot, runId),
124
- ...(doc.ok ? [doc.absolute] : []),
125
- ], [runId, chosen.root, req.taskId]);
126
- // Task terminal state is server-owned input, not a filesystem revision. It
127
- // must participate in the cache identity so a completed task cannot reuse a
128
- // previously-live context while its worktree and event log are unchanged.
129
- const cacheKey = `${projectRoot}::${sessionUuid}::${runId}::${req.taskTerminal ? "terminal" : "active"}`;
130
- // Persist on a LIVE pointer, and on a corroborated transcript recovery — which
131
- // is the whole point of the recovery: pay the scan once. Read back off the
132
- // WINNING rule, so the id and its provenance cannot disagree; an id that came
133
- // from the store is not re-persisted.
134
- const associate = decision.runIdSource === "pointer" || decision.runIdSource === "transcript" ? runId : null;
135
- const associateSource = decision.runIdSource === "transcript" ? "transcript_run_id" : "iterate_active_pointer";
136
- const hit = cache.get(cacheKey);
137
- if (hit && hit.rev === rev) {
138
- // NOT returned verbatim — merge is the one time-varying field and must be
139
- // re-derived, or it freezes at "pending" forever. See merge-refresh.ts.
140
- return {
141
- context: await refreshMerge(hit.context, projectRoot, req.transcript, deps),
142
- associateRunId: associate,
143
- associateSource,
144
- };
145
- }
146
- let documentId = null, title = null, specText = null;
147
- if (doc.ok) {
148
- // BY INDEX — a suffix-compare against the realpath misses on a leaf-casing
149
- // normalisation and silently pairs candidates[0] with the OTHER file's
150
- // fingerprint (see resolveFirstDoc).
151
- // BY INDEX — what resolveFirstDoc returns it for. See
152
- // resolver.candidate-pairing.test.ts for why re-deriving it is a trap.
153
- const rel = candidates[doc.index].join("/");
154
- title = rel.slice(rel.lastIndexOf("/") + 1);
155
- documentId = mintDocId({
156
- t: req.taskId,
157
- s: sessionUuid,
158
- p: projectRoot,
159
- r: runId,
160
- root: chosen.root,
161
- rel,
162
- rev,
163
- f: docFingerprint(doc.absolute),
164
- });
165
- specText = readBounded(doc.absolute);
166
- }
167
- const foldMap = loadFoldMap(projectRoot);
168
- const requirementsDocument = mintDocId({
169
- t: req.taskId,
170
- s: sessionUuid,
171
- p: projectRoot,
172
- r: runId,
173
- root: projectRoot,
174
- rel: SPEC_REL_PARTS.join("/"),
175
- rev,
176
- f: docFingerprint(specPath(projectRoot)),
177
- });
178
- // --- Commit + merge -------------------------------------------------------
179
- // The marker must belong to THIS project's own origin repo (a sibling repo's
180
- // PR number would grep our origin/main), and merge is only checked once the
181
- // run completed — a per-poll git call mid-run is waste (§5.3).
182
- const marker = extractPrMarker(req.transcript, await readOriginSlug(projectRoot, deps.git));
183
- const merge = run && marker
184
- ? await checkSquashMerged(projectRoot, marker.number, { git: deps.git, ...deps.merge })
185
- : "unknown";
186
- const slice2 = await buildSlice2Artifacts({
187
- projectRoot,
188
- runId,
189
- events,
190
- commit: run?.commit?.trim() || null,
191
- git: deps.git,
192
- });
193
- // `runLive` retains its visual worktree meaning. Requirement planning has a
194
- // separate authority: the server-owned task state, which can mark a run
195
- // terminal while a worktree lingers (or active while root selection fell back).
196
- const runLive = chosen.isWorktree && !req.taskTerminal && events.status !== "found";
197
- const requirementLive = !req.taskTerminal && events.status !== "found";
198
- // CONTRACT §6 order: Spec · Requirement · Tests · Review · Decisions · Commit.
199
- const artifacts = [
200
- buildSpecArtifact({
201
- documentId,
202
- title,
203
- denied: !doc.ok && doc.reason === "denied",
204
- fromWorktree: chosen.isWorktree,
205
- intent: run?.intent ?? null,
206
- }),
207
- buildRequirementArtifact({
208
- foldMap,
209
- doc: iterateDoc,
210
- events,
211
- specText,
212
- runLive: requirementLive,
213
- sourceDocument: {
214
- documentId: requirementsDocument,
215
- title: "Requirements specification",
216
- },
217
- }),
218
- ...slice2.artifacts,
219
- buildCommitArtifact({ events, prNumber: marker?.number ?? null, prUrl: marker?.url ?? null, merge }),
220
- ];
221
- const requirement = artifacts[1];
222
- const servesFrId = requirement.kind === "requirement" && requirement.detail?.rows.length
223
- ? requirement.detail.rows[0].displayFrId
224
- : null;
225
- const context = {
226
- schemaVersion: MISSION_CONTEXT_SCHEMA_VERSION,
227
- scenario: "iterate",
228
- missionTabVisible: true,
229
- runId,
230
- // IN FLIGHT = git still registers the pointer's worktree AND the run has not
231
- // recorded completion. The worktree alone is a filesystem PROXY (external
232
- // plan review, openai MEDIUM): an abandoned or already-finished run can
233
- // leave a registered worktree behind, and "pending" for a run that is over
234
- // is the same lie in the other direction. A `work_completed` record is a
235
- // terminal fact, so it ends live-ness. Both inputs participate in `rev`
236
- // (`chosen.root` + the event log's mtime), so neither can freeze in cache.
237
- runLive,
238
- artifacts,
239
- // Shares artifacts-tests.ts's constructor so this never diverges from
240
- // the Tests artifact's own `detail.results` on the `{0,0}` edge case.
241
- tests: run ? toMissionTests(run.tests, run.ts) : null,
242
- servesFrId,
243
- sourceRev: rev,
244
- };
245
- // A TRANSIENT git failure is not cached: git's answer is not a statted file,
246
- // so it cannot participate in `rev`, and caching it would pin Tests at
247
- // "currently unavailable" until an unrelated source file changed. A merged-ref
248
- // MISS is excluded for the same reason — the run may land on the ref after a
249
- // later fetch, which `rev` would not see; re-resolving is cheap (the ref blob
250
- // is TTL-cached in merged-events). A merged-ref HIT is stable and caches.
251
- if (slice2.cacheable && !mergedRefMiss) {
252
- if (cache.size >= CACHE_CAP)
253
- cache.clear();
254
- cache.set(cacheKey, { rev, context });
255
- }
256
- // `associate` comes from EVIDENCE — a validated pointer or a corroborated
257
- // footer — never from the task's `state`, which decays to `idle` on a parked
258
- // design gate. See association.ts.
259
- return { context, associateRunId: associate, associateSource };
74
+ // The iterate-scenario body (spec/requirement/commit artifact assembly,
75
+ // caching, association) lives in resolver-iterate.ts — split out to stay
76
+ // under the file-size limit; this hand-off is the sole call site.
77
+ return resolveIterateContext(req, deps, decision, decision.runId, pointer, baseRevPaths);
260
78
  }
261
79
  //# sourceMappingURL=resolver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/core/mission-context/resolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/core/mission-context/resolver.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,19 @@ export declare const MAX_SCAN_CHARS: number;
15
15
  * point that adds evidence.
16
16
  */
17
17
  export declare function findRunIdFooter(transcript: string): string | null;
18
+ /**
19
+ * True only when `candidate` is PROVABLY newer than `current` by its embedded
20
+ * date — a same-day or unparseable id is NOT proof either way, and the caller
21
+ * (scenario.ts rule 2b) must fail toward the server-observed association
22
+ * rather than an ambiguous comparison (external code review, openai MEDIUM).
23
+ * This is what closes the KNOWN LIMITATION disclosed above `isUserTypeLine`:
24
+ * an assistant turn that merely NARRATES an older run's footer in prose can
25
+ * still survive `stripUserTypeLines` and be picked as "last" — previously
26
+ * that could only promote a session with NO association at all (rule 5, low
27
+ * stakes), but without this check it could DOWNGRADE a correct,
28
+ * server-observed association back to an older run.
29
+ */
30
+ export declare function isProvablyNewerRunId(candidate: string, current: string): boolean;
18
31
  /**
19
32
  * Does THIS project's own record set know `runId`?
20
33
  *
@@ -28,11 +41,14 @@ export declare function _clearRecoveryMemo(): void;
28
41
  /**
29
42
  * The recovered run id for this session, or null.
30
43
  *
31
- * Called ONLY from rule 5 of the ordered scenario table (scenario.ts), i.e. only
32
- * once rules 1-4 — custom-actions, pointer, association, pipeline, campaign —
33
- * have all missed. Every caller that reaches it therefore RESOLVES on the
34
- * answer, and the route persists that answer, so the scan is paid once per task
35
- * rather than once per poll.
44
+ * Called from rule 5 of the ordered scenario table (scenario.ts) once rules
45
+ * 1-4 — custom-actions, pointer, association, pipeline, campaign — have all
46
+ * missed, AND from rule 2b to check whether a stale association has been
47
+ * superseded (iterate-2026-08-31-mission-feed-gaps). Rule 5's caller RESOLVES
48
+ * on the answer and the route persists it, so that path pays the scan once
49
+ * per task. Rule 2b's use is separately throttled by transcript content in
50
+ * resolver-parts.ts (`buildRecoveryThunk`), so it likewise does not re-pay the
51
+ * scan on every unchanged poll.
36
52
  *
37
53
  * It was not always so: until iterate-2026-07-21-mission-recovery-memo-perf the
38
54
  * resolver computed this BEFORE the table, so a campaign- or pipeline-resolved
@@ -1 +1 @@
1
- {"version":3,"file":"run-id-recovery.d.ts","sourceRoot":"","sources":["../../../src/core/mission-context/run-id-recovery.ts"],"names":[],"mappings":"AAyCA;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAc,CAAC;AAkF1C;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAejE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAIxE;AAkCD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,4DAA4D;AAC5D,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,GAAG,IAAI,CAqBf"}
1
+ {"version":3,"file":"run-id-recovery.d.ts","sourceRoot":"","sources":["../../../src/core/mission-context/run-id-recovery.ts"],"names":[],"mappings":"AAyCA;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAc,CAAC;AAkF1C;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAejE;AAQD;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAKhF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAIxE;AAkCD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,4DAA4D;AAC5D,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,GAAG,IAAI,CAqBf"}
@@ -148,6 +148,30 @@ export function findRunIdFooter(transcript) {
148
148
  }
149
149
  return last;
150
150
  }
151
+ /** The `YYYY-MM-DD` embedded in a canonical `iterate-<date>-<slug>` run id, or null. */
152
+ function runIdDate(runId) {
153
+ const m = /^iterate-(\d{4}-\d{2}-\d{2})-/.exec(runId);
154
+ return m ? m[1] : null;
155
+ }
156
+ /**
157
+ * True only when `candidate` is PROVABLY newer than `current` by its embedded
158
+ * date — a same-day or unparseable id is NOT proof either way, and the caller
159
+ * (scenario.ts rule 2b) must fail toward the server-observed association
160
+ * rather than an ambiguous comparison (external code review, openai MEDIUM).
161
+ * This is what closes the KNOWN LIMITATION disclosed above `isUserTypeLine`:
162
+ * an assistant turn that merely NARRATES an older run's footer in prose can
163
+ * still survive `stripUserTypeLines` and be picked as "last" — previously
164
+ * that could only promote a session with NO association at all (rule 5, low
165
+ * stakes), but without this check it could DOWNGRADE a correct,
166
+ * server-observed association back to an older run.
167
+ */
168
+ export function isProvablyNewerRunId(candidate, current) {
169
+ const candidateDate = runIdDate(candidate);
170
+ const currentDate = runIdDate(current);
171
+ if (!candidateDate || !currentDate)
172
+ return false;
173
+ return candidateDate > currentDate;
174
+ }
151
175
  /**
152
176
  * Does THIS project's own record set know `runId`?
153
177
  *
@@ -202,11 +226,14 @@ export function _clearRecoveryMemo() {
202
226
  /**
203
227
  * The recovered run id for this session, or null.
204
228
  *
205
- * Called ONLY from rule 5 of the ordered scenario table (scenario.ts), i.e. only
206
- * once rules 1-4 — custom-actions, pointer, association, pipeline, campaign —
207
- * have all missed. Every caller that reaches it therefore RESOLVES on the
208
- * answer, and the route persists that answer, so the scan is paid once per task
209
- * rather than once per poll.
229
+ * Called from rule 5 of the ordered scenario table (scenario.ts) once rules
230
+ * 1-4 — custom-actions, pointer, association, pipeline, campaign — have all
231
+ * missed, AND from rule 2b to check whether a stale association has been
232
+ * superseded (iterate-2026-08-31-mission-feed-gaps). Rule 5's caller RESOLVES
233
+ * on the answer and the route persists it, so that path pays the scan once
234
+ * per task. Rule 2b's use is separately throttled by transcript content in
235
+ * resolver-parts.ts (`buildRecoveryThunk`), so it likewise does not re-pay the
236
+ * scan on every unchanged poll.
210
237
  *
211
238
  * It was not always so: until iterate-2026-07-21-mission-recovery-memo-perf the
212
239
  * resolver computed this BEFORE the table, so a campaign- or pipeline-resolved
@@ -1 +1 @@
1
- {"version":3,"file":"run-id-recovery.js","sourceRoot":"","sources":["../../../src/core/mission-context/run-id-recovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-id-recovery.js","sourceRoot":"","sources":["../../../src/core/mission-context/run-id-recovery.ts"],"names":[],"mappings":"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"}
@@ -39,17 +39,18 @@ export interface ScenarioInputs {
39
39
  * A run id recovered from this session's OWN transcript and already
40
40
  * corroborated by the project's records (`run-id-recovery.ts`).
41
41
  *
42
- * The last-resort identification source, for the tasks that ran before this
43
- * build shipped: measured 2026-07-21, only 19 of this project's 150 sessions
44
- * could be identified from a pointer or an association, because the pointer is
45
- * pruned at Finalize and the association is only written while the Mission tab
46
- * is open during the run.
42
+ * The last-resort identification source when NO association exists, for the
43
+ * tasks that ran before this build shipped: measured 2026-07-21, only 19 of
44
+ * this project's 150 sessions could be identified from a pointer or an
45
+ * association, because the pointer is pruned at Finalize and the
46
+ * association is only written while the Mission tab is open during the run.
47
47
  *
48
- * Ranked BELOW pipeline and campaign, unlike the association: an association
49
- * is a SERVER-OBSERVED fact (this session really was running that iterate),
50
- * whereas the footer is text the session happens to contain. Measured, a
48
+ * Ranked BELOW pipeline and campaign in THAT (no-association) branch: a
51
49
  * campaign session quotes its sub-iterates' footers — ranking this higher
52
- * would demote a genuine campaign to `iterate`.
50
+ * there would demote a genuine campaign to `iterate`. Rule 2b (above) also
51
+ * consults this thunk, but only to check whether a corroborated footer
52
+ * SUPERSEDES an existing, possibly stale, association — never to out-rank
53
+ * pipeline/campaign, since 2b's own branch is reached before 3/4 regardless.
53
54
  *
54
55
  * A THUNK, not a value, and that is the whole point (internal code review of
55
56
  * PR #309, PERF). Computing it eagerly meant a campaign- or pipeline-resolved
@@ -57,7 +58,10 @@ export interface ScenarioInputs {
57
58
  * the record lookup on every poll forever: it never reached rule 5, so nothing
58
59
  * ever persisted, and the negative memo does not cover a POSITIVE find.
59
60
  * Deferring removes that work instead of remembering it, and makes this table
60
- * the single place that decides whether the footer matters at all.
61
+ * the single place that decides whether the footer matters at all. The
62
+ * resolver additionally rate-limits its OWN invocation from rule 2b by
63
+ * transcript content, so a stable association is not re-scanned on every
64
+ * poll either (resolver.ts).
61
65
  */
62
66
  recoverTranscriptRunId?: (() => string | null) | null;
63
67
  /** Actions catalog facts, resolved SERVER-side from the project. */
@@ -111,7 +115,10 @@ export interface ScenarioDecision {
111
115
  * pointer and the transcript, never for the one it read back from the store —
112
116
  * deriving that from `pointer.status` plus a separately-computed candidate is
113
117
  * how the two could disagree (they did: the association branch reported
114
- * `transcript_run_id` beside a null id).
118
+ * `transcript_run_id` beside a null id). `"transcript"` now also covers rule
119
+ * 2b's supersession case — a corroborated footer overriding a stale
120
+ * association is exactly as persistence-worthy as one identifying a session
121
+ * with no association at all.
115
122
  */
116
123
  runIdSource: "pointer" | "association" | "transcript" | null;
117
124
  /** Set when a pointer existed but could not be trusted (§5.1e) → `unavailable`. */
@@ -1 +1 @@
1
- {"version":3,"file":"scenario.d.ts","sourceRoot":"","sources":["../../../src/core/mission-context/scenario.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAKjD,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,iBAAiB;AAC3B,gFAAgF;AAC9E,IAAI;AACN,sEAAsE;GACpE,SAAS;AACX,sFAAsF;GACpF,YAAY,CAAC;AAEjB,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,OAAO,EAAE,iBAAiB,CAAC;IAC3B;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAC/C;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,sBAAsB,CAAC,EAAE,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACtD,oEAAoE;IACpE,OAAO,EAAE;QACP,oEAAoE;QACpE,QAAQ,EAAE,OAAO,CAAC;QAClB,wEAAwE;QACxE,cAAc,EAAE,OAAO,CAAC;QACxB,gCAAgC;QAChC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;KAC9B,GAAG,IAAI,CAAC;IACT,iFAAiF;IACjF,eAAe,EAAE,iBAAiB,CAAC;IACnC,kDAAkD;IAClD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,4EAA4E;IAC5E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAmBxE;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,eAAe,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sEAAsE;IACtE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;;;;;OAMG;IACH,WAAW,EAAE,SAAS,GAAG,aAAa,GAAG,YAAY,GAAG,IAAI,CAAC;IAC7D,mFAAmF;IACnF,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,gBAAgB,CA4EvE"}
1
+ {"version":3,"file":"scenario.d.ts","sourceRoot":"","sources":["../../../src/core/mission-context/scenario.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGtD,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAKjD,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,iBAAiB;AAC3B,gFAAgF;AAC9E,IAAI;AACN,sEAAsE;GACpE,SAAS;AACX,sFAAsF;GACpF,YAAY,CAAC;AAEjB,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,OAAO,EAAE,iBAAiB,CAAC;IAC3B;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAC/C;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,sBAAsB,CAAC,EAAE,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACtD,oEAAoE;IACpE,OAAO,EAAE;QACP,oEAAoE;QACpE,QAAQ,EAAE,OAAO,CAAC;QAClB,wEAAwE;QACxE,cAAc,EAAE,OAAO,CAAC;QACxB,gCAAgC;QAChC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;KAC9B,GAAG,IAAI,CAAC;IACT,iFAAiF;IACjF,eAAe,EAAE,iBAAiB,CAAC;IACnC,kDAAkD;IAClD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,4EAA4E;IAC5E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAmBxE;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,eAAe,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sEAAsE;IACtE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;;;;;;;;OASG;IACH,WAAW,EAAE,SAAS,GAAG,aAAa,GAAG,YAAY,GAAG,IAAI,CAAC;IAC7D,mFAAmF;IACnF,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,gBAAgB,CA6GvE"}
@@ -8,12 +8,15 @@
8
8
  * 1. custom_actions — a VALIDATED custom-actions project → HIDE the Mission
9
9
  * tab entirely (only Files & Terminal).
10
10
  * 2. iterate — a VALIDATED `iterate_active` pointer, or the persisted
11
- * association once that pointer has been pruned.
11
+ * association once that pointer has been pruned — UNLESS a corroborated
12
+ * transcript footer (below) names a different, newer run, which
13
+ * supersedes a stale association (iterate-2026-08-31-mission-feed-gaps).
12
14
  * 3. pipeline — phaseTaskId + runId (run-config v2 phase_tasks).
13
15
  * 4. campaign — a `campaign:<slug>` title AND a real campaign record.
14
16
  * 5. iterate — a CORROBORATED `Run-ID` footer in this session's own
15
- * transcript (run-id-recovery.ts). Last resort, and deliberately ranked
16
- * below pipeline/campaign — see `recoverTranscriptRunId`.
17
+ * transcript (run-id-recovery.ts). Last resort when NO association
18
+ * exists, and deliberately ranked below pipeline/campaign — see
19
+ * `recoverTranscriptRunId`.
17
20
  * 6. plain — everything else (scenarios 1/4): narration, no rail.
18
21
  *
19
22
  * Two DECIDED asymmetries, both "fail toward showing the tab":
@@ -24,6 +27,7 @@
24
27
  * - A `campaign:` TITLE without a matching record is NOT a campaign. Titles
25
28
  * are user-editable; a record is evidence.
26
29
  */
30
+ import { isProvablyNewerRunId } from "./run-id-recovery.js";
27
31
  /** The four builtin action ids. Anything else is a user-defined custom action. */
28
32
  export const BUILTIN_ACTION_IDS = new Set([
29
33
  "new-task",
@@ -111,6 +115,39 @@ export function detectScenario(inputs) {
111
115
  // validation is a signal something is wrong, and quietly resolving via a
112
116
  // stored id would mask it.
113
117
  if (inputs.pointer.status === "absent" && inputs.association?.runId) {
118
+ // Before trusting the stored value, give the transcript one chance to
119
+ // SUPERSEDE it (iterate-2026-08-31-mission-feed-gaps). The association is
120
+ // only ever refreshed by catching a LIVE pointer (rule 2) — a narrow
121
+ // window that only opens while a worktree exists, between setup and
122
+ // Finalize. A task whose Mission tab is not open during that window keeps
123
+ // whatever association it last caught, forever, even after several more
124
+ // iterates finish: production evidence (a `new-plain` task with 9+
125
+ // completed PRs after its one caught association) showed a stale
126
+ // association can outlive the run it names by weeks.
127
+ //
128
+ // `recoverTranscriptRunId` finds the LAST `Run-ID:` footer in the
129
+ // transcript, corroborated against this project's OWN completed-run
130
+ // records (run-id-recovery.ts) — the same evidence rule 5 below trusts
131
+ // enough to identify a run with NO association at all. It is therefore
132
+ // not "quoted text" here either: when it names a DIFFERENT, corroborated,
133
+ // and PROVABLY NEWER run than the one on file (`isProvablyNewerRunId` —
134
+ // same-day or unparseable is not proof, external code review, openai
135
+ // MEDIUM), that is proof a newer run finished. The resolver rate-limits
136
+ // the actual scan per (session, association, transcript-content) so this
137
+ // does not reintroduce the "every poll forever" cost PR #309 removed (see
138
+ // resolver.ts), and the route persists the correction (association.ts
139
+ // `supersedeMissionContext`) so it survives instead of re-proving itself
140
+ // every poll.
141
+ const recovered = inputs.recoverTranscriptRunId?.() ?? null;
142
+ if (recovered && recovered !== inputs.association.runId && isProvablyNewerRunId(recovered, inputs.association.runId)) {
143
+ return {
144
+ scenario: "iterate",
145
+ missionTabVisible: true,
146
+ runId: recovered,
147
+ runIdSource: "transcript",
148
+ pointerInvalidReason: null,
149
+ };
150
+ }
114
151
  return {
115
152
  scenario: "iterate",
116
153
  missionTabVisible: true,
@@ -1 +1 @@
1
- {"version":3,"file":"scenario.js","sourceRoot":"","sources":["../../../src/core/mission-context/scenario.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scenario.js","sourceRoot":"","sources":["../../../src/core/mission-context/scenario.ts"],"names":[],"mappings":"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"}
@@ -36,5 +36,5 @@ export declare function pathGuard(projectRoot: string, relpath: string): PathGua
36
36
  * guard.absolute, though in practice fs reads against either produce the
37
37
  * same bytes as long as both land under the root).
38
38
  */
39
- export declare function realPathGuard(projectRoot: string, absoluteInsideRoot: string): PathGuardResult;
39
+ export declare function realPathGuard(projectRoot: string, absoluteInsideRoot: string, precomputedRealRoot?: string): PathGuardResult;
40
40
  //# sourceMappingURL=path-guard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"path-guard.d.ts","sourceRoot":"","sources":["../../src/core/path-guard.ts"],"names":[],"mappings":"AA0BA,MAAM,MAAM,eAAe,GACvB,WAAW,GACX,gBAAgB,GAChB,cAAc,GACd,gBAAgB,CAAC;AAErB,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAAC;AAE3C;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CA0E/E;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,kBAAkB,EAAE,MAAM,GACzB,eAAe,CAqCjB"}
1
+ {"version":3,"file":"path-guard.d.ts","sourceRoot":"","sources":["../../src/core/path-guard.ts"],"names":[],"mappings":"AA0BA,MAAM,MAAM,eAAe,GACvB,WAAW,GACX,gBAAgB,GAChB,cAAc,GACd,gBAAgB,CAAC;AAErB,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAAC;AAE3C;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CA0E/E;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,kBAAkB,EAAE,MAAM,EAC1B,mBAAmB,CAAC,EAAE,MAAM,GAC3B,eAAe,CA4CjB"}
@@ -112,12 +112,19 @@ export function pathGuard(projectRoot, relpath) {
112
112
  * guard.absolute, though in practice fs reads against either produce the
113
113
  * same bytes as long as both land under the root).
114
114
  */
115
- export function realPathGuard(projectRoot, absoluteInsideRoot) {
115
+ export function realPathGuard(projectRoot, absoluteInsideRoot, precomputedRealRoot) {
116
116
  const resolvedRoot = path.resolve(projectRoot);
117
117
  let realRoot;
118
118
  let realTarget;
119
119
  try {
120
- realRoot = realpathSync(resolvedRoot);
120
+ // A batch caller resolving many targets against the same project root
121
+ // (e.g. exists-routes.ts) can pass its own once-per-request realpath of
122
+ // that root here, instead of paying a redundant realpathSync(root) on
123
+ // every one of up to N iterations (doubt-review finding,
124
+ // iterate-2026-08-30-triage-file-viewer-followups). Single-path callers
125
+ // are unaffected — the parameter is optional and falls back to the
126
+ // original per-call resolution.
127
+ realRoot = precomputedRealRoot ?? realpathSync(resolvedRoot);
121
128
  realTarget = realpathSync(absoluteInsideRoot);
122
129
  }
123
130
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"path-guard.js","sourceRoot":"","sources":["../../src/core/path-guard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"path-guard.js","sourceRoot":"","sources":["../../src/core/path-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ShipsLogDocsBundle } from "./shipslog-docs-types.js";
2
+ export type { ShipsLogDocRow, ShipsLogDocsBundle } from "./shipslog-docs-types.js";
3
+ export declare function readShipsLogDocs(projectRoot: string): Promise<ShipsLogDocsBundle>;
4
+ //# sourceMappingURL=shipslog-docs-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shipslog-docs-reader.d.ts","sourceRoot":"","sources":["../../src/core/shipslog-docs-reader.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAkB,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnF,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAyInF,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAiBvF"}