elanous 0.2.37 → 0.2.40

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 (727) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → HjeK7zONHfR7op1hKXp4k}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{1746.3563617ea64023a3.js → 1060.014f1f01a17aec26.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/{9151.a2c51e93f9156dae.js → 1281.d81877e35b9068f4.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/1350.59f40e39e02d91b1.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1452.162bb2d9d699e82a.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +286 -0
  10. package/apps/pwa/out/_next/static/chunks/1537-6bb97b5214928ea9.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +149 -0
  12. package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +90 -0
  14. package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +104 -0
  15. package/apps/pwa/out/_next/static/chunks/{3578.4e9f9948a9a6f2f4.js → 2047.8f23e210995d4548.js} +2 -2
  16. package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/{7424.c0fe2a595d4232b5.js → 2066.a77257c8c350770a.js} +1 -1
  18. package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/{4931.95cc6dbd230774ca.js → 2177.df8547f9d7215c4e.js} +16 -16
  20. package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/{6680.6a693c28aae4cd19.js → 2226.2cf61ec781827219.js} +2 -2
  22. package/apps/pwa/out/_next/static/chunks/2281-b8cede695c6c650e.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/2499.02fbfd18126c10c0.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/{6252.240578f10952e091.js → 2522.f2766b76d22c8bdf.js} +1 -1
  25. package/apps/pwa/out/_next/static/chunks/{1262.a89bb27a5b2f844e.js → 2566.beaffc3a5e1fcd2e.js} +1 -1
  26. package/apps/pwa/out/_next/static/chunks/261.0d471e8aded799f3.js +226 -0
  27. package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +27 -0
  30. package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{2318-450e75d07605b8fe.js → 2774-719820e3f5b2a3eb.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/{4725-34bed25720cc326b.js → 2829-734fe8bf2eee7347.js} +1 -1
  35. package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3330.7443183b7e6fdbdf.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3746-f80a78f220bf37b5.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +24 -0
  45. package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +77 -0
  46. package/apps/pwa/out/_next/static/chunks/{4337e36d.f42c3b391b3d8f20.js → 3b355b3d.6f73c98bf6f9c749.js} +1 -1
  47. package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +36 -0
  48. package/apps/pwa/out/_next/static/chunks/{58edce7d.f1b0c72acf13b123.js → 409c787b.e48c5bec8ec10456.js} +1 -1
  49. package/apps/pwa/out/_next/static/chunks/413-24c8284bda08241d.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +287 -0
  52. package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4351.0f37a6db2b34d50b.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/{5046.7fd5cbd859299448.js → 470.51a72a2348306455.js} +2 -2
  56. package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/{2375.bf364c85dbb6f085.js → 4769.9fd582071301f382.js} +1 -1
  58. package/apps/pwa/out/_next/static/chunks/483.725e4a61be922788.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/{de8446d3.31b73eb239fecd7b.js → 4864a2ca.1c1c280a7772c5e5.js} +1 -1
  60. package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +74 -0
  63. package/apps/pwa/out/_next/static/chunks/{4383.18e5c54db3a22c88.js → 5383.bdfa5d886e39a826.js} +1 -1
  64. package/apps/pwa/out/_next/static/chunks/5436.fdf6fa8ae3e9588d.js +64 -0
  65. package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5622.94893f5aea7185d0.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +8 -0
  70. package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +62 -0
  72. package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +94 -0
  76. package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{6745-5a63492933959dd9.js → 6051-0ae955eedb10adb9.js} +3 -3
  78. package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/{2283.edd9627b7bdfb546.js → 6257.c0037b8949239f5e.js} +2 -2
  80. package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/6624.981ef7caeb680560.js +32 -0
  85. package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/{6819.be5c9c4d67f22922.js → 6749.0744ce6eb08d40e9.js} +16 -16
  87. package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/6908.06008c67f6380ea9.js +148 -0
  90. package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/6cc1d1d6.9a98dd4622f1afc6.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7219-15bdd9a80661af8e.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +93 -0
  96. package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7515.1ad6efe157fa4448.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +24 -0
  100. package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/7611.85f045bf232053ac.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8086.1ab9103c41be884f.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8099.1cccf31c1baa7e1c.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/{2002-a43a3f380df873ec.js → 8272-025653884f9645d2.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/{7867.e8725745ddd1d940.js → 8357.1aaa713b052a78b1.js} +4 -4
  110. package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/8639-92c11d069792429e.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/8d173e38.18a2f7b4e1848bdb.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/9069.657590a84afb8fac.js +41 -0
  115. package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/{4313.76f232c304a15bde.js → 9175.2de5209a5ce6f68a.js} +1 -1
  117. package/apps/pwa/out/_next/static/chunks/9184.45afbf44fec87574.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{8c58d09b.e8724a299658d86f.js → 9189505a.980427ac048c8c60.js} +1 -1
  119. package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/9992.07ce73c10bd5e6a1.js +79 -0
  123. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/botlab/page-ba957ff875a026a0.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live/{page-3337c6a1328c2674.js → page-4edb8df90f4537ce.js} +1 -1
  143. package/apps/pwa/out/_next/static/chunks/app/live-run/page-83d27757e2b8060a.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/morning/{page-1e5da297557d2354.js → page-fca2e59a81744d9e.js} +1 -1
  148. package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/term/{page-ac2c1e6169cfce57.js → page-139d722de1dcd6c1.js} +1 -1
  167. package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/workspace/{page-c1c80e345fa9d6f5.js → page-ccde99f07aaf71f7.js} +1 -1
  173. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/{d9815f84.4918f682a45a8502.js → b84cad00.594027ebe0531fe2.js} +3 -3
  175. package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/{709a918c.4fd3b4e2a32cb4e3.js → ca3702f8.2913182e73889fa2.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/d5d3cefc-373c4eb722ed848b.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/{5f6af561-f90b7a67f4f75d13.js → d8de0de2-dd0f4ac8e5ab1832.js} +1 -1
  179. package/apps/pwa/out/_next/static/chunks/framework-002b472a66935d31.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +1 -0
  184. package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.js +1 -0
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +22 -22
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +22 -22
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +22 -22
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +21 -21
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +21 -21
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +22 -22
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +21 -21
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +22 -22
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +22 -22
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +21 -21
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +22 -22
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +22 -22
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +22 -22
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +22 -22
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +21 -21
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +21 -21
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +22 -22
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +22 -22
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +22 -22
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +21 -21
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +21 -21
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +22 -22
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +22 -22
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +21 -21
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +21 -21
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +21 -21
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +22 -22
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +22 -22
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +21 -21
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +22 -22
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +22 -22
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +22 -22
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +22 -22
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +22 -22
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +21 -21
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +22 -22
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +22 -22
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +22 -22
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +22 -22
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +22 -22
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +22 -22
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +22 -22
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +22 -22
  278. package/graphs/demo/persona-marketer/fixtures/marketer-scenario.yaml +10 -0
  279. package/graphs/demo/persona-marketer/persona-marketer.yaml +25 -0
  280. package/graphs/demo/persona-marketer/recipes.yaml +19 -0
  281. package/graphs/release/recipes.yaml +9 -0
  282. package/graphs/release/release-loop.yaml +26 -18
  283. package/graphs/video/explainer-line.yaml +4 -1
  284. package/package.json +1 -1
  285. package/scripts/ask-op-inbox-once.ts +17 -0
  286. package/scripts/brand/check.ts +13 -4
  287. package/scripts/dead-code/report.ts +169 -0
  288. package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
  289. package/scripts/gate-0226-failure-census.ts +39 -0
  290. package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
  291. package/scripts/lib/morning-report-options.ts +3 -4
  292. package/scripts/lib/tui-regress-evidence.ts +56 -0
  293. package/scripts/morning-report.ts +5 -1
  294. package/scripts/provision-export-redactions.ts +15 -0
  295. package/scripts/public-copy-lint.ts +122 -0
  296. package/scripts/public-export.ts +77 -2
  297. package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
  298. package/scripts/ratchets/train-side-invariants.sh +7 -1
  299. package/scripts/release-loop/cut-branch.ts +61 -12
  300. package/scripts/release-loop/export-check-node.ts +21 -3
  301. package/scripts/release-loop/gate-node.ts +527 -60
  302. package/scripts/release-loop/gate-partial.ts +82 -3
  303. package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
  304. package/scripts/release-loop/gate-radius-live.ts +4 -2
  305. package/scripts/release-loop/gate-shard-dispatch.ts +128 -0
  306. package/scripts/release-loop/gate-shard-receipts.ts +89 -0
  307. package/scripts/release-loop/gate-wall.ts +5 -5
  308. package/scripts/release-loop/preflight.ts +6 -2
  309. package/scripts/release-loop/resume-cap.ts +2 -1
  310. package/scripts/release-loop/resume-release.ts +317 -13
  311. package/scripts/release-loop/resume.ts +61 -5
  312. package/scripts/release-loop/traffic-node.ts +12 -4
  313. package/scripts/release-loop/traffic-transition.ts +53 -13
  314. package/scripts/release-loop/version-node.ts +35 -5
  315. package/scripts/release-story/draft.ts +1 -1
  316. package/scripts/research-bench/README.md +53 -0
  317. package/scripts/research-bench/questions.json +66 -0
  318. package/scripts/research-bench/rubric.md +33 -0
  319. package/scripts/research-bench/run.ts +523 -0
  320. package/scripts/tui-regress.ts +85 -10
  321. package/scripts/ux-sim.ts +1 -1
  322. package/scripts/video-pipeline.ts +2 -2
  323. package/src/acp/core-turn-bridge.ts +14 -1
  324. package/src/agent/autonomous-tools.ts +10 -3
  325. package/src/agent/monad-agent-turn.ts +4 -1
  326. package/src/agent/registry.ts +26 -2
  327. package/src/agent/run-context.ts +1 -1
  328. package/src/agent/shared-app-tools.ts +1 -1
  329. package/src/agent/surface-ux/build.ts +12 -3
  330. package/src/agent/surface-ux/types.ts +1 -1
  331. package/src/agent/task-notification.ts +78 -7
  332. package/src/agent/types.ts +3 -0
  333. package/src/agent-mission/driver.ts +29 -3
  334. package/src/agent-mission/mission-cli.ts +2 -1
  335. package/src/agent-substrate/review-context-pack.ts +365 -0
  336. package/src/agent-substrate/review-observation.ts +10 -0
  337. package/src/agent-substrate/self-review-cli.ts +419 -42
  338. package/src/ask-user-question/index.ts +6 -0
  339. package/src/ask-user-question/inline-resolver.ts +49 -0
  340. package/src/auto-research/question-ladder-contract.ts +156 -0
  341. package/src/auto-research/research-turn.ts +467 -0
  342. package/src/autopilot/agent-loop.ts +1 -1
  343. package/src/autopilot/discovery/doc-lint.ts +1 -1
  344. package/src/autopilot/pty-control-loop.ts +8 -1
  345. package/src/boot/daemon-tools/index.ts +4 -3
  346. package/src/boot/daemon-tools/self-implement.ts +270 -2
  347. package/src/boot/daemon-tools/types.ts +2 -0
  348. package/src/bots/screen-probe.ts +1 -1
  349. package/src/budget/llm-cost.ts +44 -5
  350. package/src/budget/unified-usage.ts +17 -1
  351. package/src/capture/tui-self-report.ts +24 -2
  352. package/src/chat/index.ts +34 -7
  353. package/src/chat/tool-render/dispatch.ts +8 -1
  354. package/src/cli/agent-cli.ts +43 -8
  355. package/src/cli/guardian-cli.ts +3 -1
  356. package/src/cli/intake-cli.ts +70 -13
  357. package/src/cli/lesson-cli.ts +86 -10
  358. package/src/cli/log-event-names.ts +1 -0
  359. package/src/cli/pod-cli.ts +17 -2
  360. package/src/cli/pr-land-overlap-evidence.ts +38 -5
  361. package/src/cli/pr-land-refusal.ts +1 -1
  362. package/src/cli/pty-takeover-cli.ts +125 -12
  363. package/src/cli/release-checklist-read-cli.ts +5 -2
  364. package/src/cli/release-cli.ts +99 -15
  365. package/src/cli/repo-cli.ts +2 -1
  366. package/src/cli/review-carry.ts +77 -0
  367. package/src/cli/self-update.ts +1 -1
  368. package/src/cli/tasks-card-show.ts +31 -1
  369. package/src/cli/tasks-cli.ts +98 -32
  370. package/src/cli/tasks-read-cli.ts +13 -5
  371. package/src/context-bus/context-now.ts +86 -2
  372. package/src/control-plane/ledger.ts +21 -4
  373. package/src/core-turn/run-core-turn.ts +51 -3
  374. package/src/core-turn/run-goal-loop.ts +152 -8
  375. package/src/core-turn/types.ts +12 -0
  376. package/src/dashboard/chat/acp-chat.ts +2 -2
  377. package/src/dashboard/classic-sigquit.ts +16 -0
  378. package/src/dashboard/index.ts +339 -44
  379. package/src/dashboard/input/chat-main-interaction-opts.ts +3 -0
  380. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +7 -2
  381. package/src/dashboard/input/chat-main-slash-command.ts +7 -0
  382. package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
  383. package/src/dashboard/input/dashboard-priority-key-route.ts +21 -5
  384. package/src/dashboard/input/external-input-host.ts +2 -0
  385. package/src/dashboard/input/terminal-modal-router.ts +8 -159
  386. package/src/dashboard/side-basic-runtime.ts +61 -0
  387. package/src/dashboard/sidetab-runtime.ts +228 -0
  388. package/src/dashboard/slash-runtime/ask-clarification.ts +7 -1
  389. package/src/dashboard/slash-runtime/dashboard-handlers.ts +22 -8
  390. package/src/dashboard/slash-runtime/help-from-registry.ts +2 -2
  391. package/src/dashboard/term-slash-runtime.ts +18 -18
  392. package/src/dashboard/turn-preamble.ts +30 -4
  393. package/src/domains/guardian-tick.ts +9 -0
  394. package/src/domains/knowledge.ts +1 -1
  395. package/src/esc-abort-gate.ts +33 -1
  396. package/src/execution-loop/launch-gate.ts +206 -1
  397. package/src/git-fs/watcher.ts +27 -22
  398. package/src/git-fs/worktree.ts +19 -3
  399. package/src/graph-runner/graph-cli.ts +6 -4
  400. package/src/graph-runner/graph-grow.ts +37 -9
  401. package/src/graph-runner/runner.ts +48 -11
  402. package/src/graph-wizard/generate.ts +16 -7
  403. package/src/graph-wizard/mission-compose.ts +201 -0
  404. package/src/grok/agent-search.ts +8 -2
  405. package/src/grok/credential.ts +112 -36
  406. package/src/grounding/ref-index.ts +11 -0
  407. package/src/grounding/ref-vector.ts +61 -0
  408. package/src/grounding/sources-cli.ts +2 -2
  409. package/src/grounding/sources.ts +15 -1
  410. package/src/harness/harness-cli-command.ts +38 -9
  411. package/src/harness/harness-pod-dispatch.ts +7 -1
  412. package/src/hq/fence-wrapper.ts +1 -1
  413. package/src/hq/transfer.ts +1 -1
  414. package/src/index.ts +60 -16
  415. package/src/input/external-input-queue.ts +10 -0
  416. package/src/intake-plane/collect-telegram-saved.ts +90 -6
  417. package/src/intake-plane/intake-to-tasks.ts +246 -3
  418. package/src/interactive-terminal-modal.ts +3 -0
  419. package/src/keybindings.ts +17 -22
  420. package/src/lessons/friction-ledger.ts +154 -0
  421. package/src/live-supply/collector.ts +149 -0
  422. package/src/live-supply/probes.ts +52 -0
  423. package/src/live-supply/snapshot.ts +40 -0
  424. package/src/llm/provider-credentials.ts +1 -1
  425. package/src/llm-tool-schema.ts +20 -0
  426. package/src/llm.ts +486 -61
  427. package/src/loops/orchestrator/inbox-once.ts +28 -0
  428. package/src/loops/orchestrator/inbox.ts +130 -1
  429. package/src/loops/orchestrator/tick.ts +14 -3
  430. package/src/maturity/feature-maturity.ts +1 -0
  431. package/src/nexus/api/channel-ask-op.ts +96 -0
  432. package/src/nexus/api/discord-trigger-bot.ts +28 -1
  433. package/src/nexus/api/harness-api.ts +2 -1
  434. package/src/nexus/api/telegram-trigger-bot.ts +24 -0
  435. package/src/nexus/api/terminals.ts +28 -6
  436. package/src/patents/ledger.ts +18 -1
  437. package/src/preview/terminal.ts +4 -2
  438. package/src/prompt-cache/anthropic.ts +2 -0
  439. package/src/prompt-enhance/enhance.ts +5 -0
  440. package/src/pty/snapshot.py +132 -0
  441. package/src/pty-shell/pty-control-ipc.ts +29 -2
  442. package/src/pty-shell/pty-manifest.ts +75 -5
  443. package/src/pty-shell/registry.ts +2 -0
  444. package/src/pty-shell/tui-run-state.ts +80 -3
  445. package/src/release-loop/gate-host-reservation.ts +13 -4
  446. package/src/release-loop/gate-shard-ledger.ts +68 -0
  447. package/src/release-loop/gate-shards.ts +61 -0
  448. package/src/release-loop/light-rc.ts +7 -4
  449. package/src/release-loop/merged-pr-checklist.ts +25 -2
  450. package/src/release-loop/rehearsal-shard-plan.ts +6 -1
  451. package/src/release-loop/rehearsal.ts +28 -1
  452. package/src/repl/index.ts +10 -0
  453. package/src/research/axis-fanout.ts +133 -0
  454. package/src/research/edge-decision.ts +197 -0
  455. package/src/research/gap-followup.ts +249 -0
  456. package/src/research/lenses/counter-evidence.ts +100 -0
  457. package/src/research/lenses/working-backwards.ts +89 -0
  458. package/src/research/output-router.ts +127 -0
  459. package/src/research/plugin-discovery.ts +242 -0
  460. package/src/research-bridge/format.ts +16 -1
  461. package/src/research-bridge/index.ts +1 -0
  462. package/src/research-bridge/invoke.ts +45 -7
  463. package/src/research-bridge/types.ts +2 -0
  464. package/src/self-dev/ask-launch-flow.ts +34 -106
  465. package/src/self-dev/decompose.ts +45 -9
  466. package/src/self-dev/dev-cli.ts +2 -0
  467. package/src/self-dev/dev-pipeline.ts +8 -4
  468. package/src/self-dev/draft-residue.ts +221 -2
  469. package/src/self-dev/draft-sweep.ts +29 -16
  470. package/src/self-dev/graph-journey-route.ts +10 -2
  471. package/src/self-dev/launch-preflight-text.ts +2 -2
  472. package/src/self-dev/launch-preflight.ts +38 -7
  473. package/src/self-dev/orchestrate-cli.ts +1 -0
  474. package/src/self-dev/orchestrate.ts +1 -0
  475. package/src/self-dev/run-supervisor.ts +41 -7
  476. package/src/self-dev/shard-run.ts +260 -3
  477. package/src/self-implement/comment-only-source.ts +54 -0
  478. package/src/self-implement/device-first.ts +8 -2
  479. package/src/self-implement/doctor-visit.ts +100 -57
  480. package/src/self-implement/gate-artifacts.ts +5 -2
  481. package/src/self-implement/gate-baseline.ts +119 -13
  482. package/src/self-implement/gate-cli.ts +466 -93
  483. package/src/self-implement/gate-failure-signature.ts +44 -0
  484. package/src/self-implement/gate-receipt-registry.ts +180 -0
  485. package/src/self-implement/gate-remote.ts +147 -22
  486. package/src/self-implement/goal-author-clarification.ts +178 -24
  487. package/src/self-implement/goal-author-decompose.ts +24 -15
  488. package/src/self-implement/goal-author.ts +82 -7
  489. package/src/self-implement/goal-doc/section.ts +22 -0
  490. package/src/self-implement/goal-supervisor-fill.ts +38 -4
  491. package/src/self-implement/host-regate.ts +120 -45
  492. package/src/self-implement/impl-findings-feedback.ts +188 -0
  493. package/src/self-implement/knowhow-pack.ts +301 -9
  494. package/src/self-implement/l8-merge-queue.ts +198 -32
  495. package/src/self-implement/off-diff-evidence.ts +147 -0
  496. package/src/self-implement/orchestrator.ts +137 -16
  497. package/src/self-implement/pod-inplace-worktree.ts +82 -0
  498. package/src/self-implement/pod-warm-pool-profile.ts +2 -2
  499. package/src/self-implement/premise-review.ts +7 -5
  500. package/src/self-implement/run-ledger.ts +304 -8
  501. package/src/self-implement/run-stop.ts +12 -0
  502. package/src/self-implement/seams.ts +39 -13
  503. package/src/self-implement/self-implement-cli.ts +30 -4
  504. package/src/session/channel-ask-op-envelope.ts +36 -0
  505. package/src/session/channel-op-reply-route.ts +200 -0
  506. package/src/session/chat.ts +92 -15
  507. package/src/session/index.ts +2 -0
  508. package/src/session-runtime/index.ts +9 -22
  509. package/src/session-runtime/provider-circuit.ts +140 -0
  510. package/src/shell-runner/file-engine.ts +1 -0
  511. package/src/shell-runner/types.ts +4 -0
  512. package/src/sidetab-core/model.ts +176 -0
  513. package/src/skills/runner.ts +7 -3
  514. package/src/skills/tools/dev-harness.ts +2 -2
  515. package/src/skills/tools/schedule-wakeup.ts +24 -7
  516. package/src/skills/tools/shell.ts +51 -5
  517. package/src/status/bar.ts +3 -3
  518. package/src/steward/directive-audit.ts +354 -0
  519. package/src/storage/file-lock.ts +17 -4
  520. package/src/surface/child-process.ts +31 -0
  521. package/src/surface/tui-stderr-owner.ts +48 -0
  522. package/src/task-agent/adopt-pr.ts +63 -2
  523. package/src/task-agent/cover.ts +30 -12
  524. package/src/task-agent/evidence-command-normalize.ts +42 -0
  525. package/src/task-agent/export-redactions-provision.ts +43 -0
  526. package/src/task-agent/judge.ts +56 -0
  527. package/src/task-agent/parent-host.ts +59 -12
  528. package/src/task-agent/postland-card.ts +35 -2
  529. package/src/task-agent/rejudge-on-head.ts +46 -2
  530. package/src/task-agent/repair-cycle.ts +68 -9
  531. package/src/task-agent/repair-worker.ts +37 -1
  532. package/src/task-agent/task-hand.ts +226 -33
  533. package/src/task-agent/tier-split.ts +142 -24
  534. package/src/task-orchestrator/surfaces/pod-command-job.ts +330 -2
  535. package/src/task-orchestrator/surfaces/pod-config-snapshot.ts +123 -0
  536. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +57 -5
  537. package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +11 -8
  538. package/src/task-orchestrator/surfaces/pod-pool.ts +27 -4
  539. package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +1 -1
  540. package/src/task-orchestrator/surfaces/pod-source-receive.ts +74 -6
  541. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +2 -1
  542. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +56 -15
  543. package/src/task-orchestrator/surfaces/self-implement-pod.ts +310 -79
  544. package/src/task-orchestrator/surfaces/self-implement.ts +33 -2
  545. package/src/terminal/session-registry.ts +1 -0
  546. package/src/terminal/terminal-modal-router.ts +156 -0
  547. package/src/tool-hints/gate.ts +6 -4
  548. package/src/tool-hints/signals.ts +33 -1
  549. package/src/tool-runtime/skill-exec-runtime.ts +95 -5
  550. package/src/tui/chat/background-job-status.ts +8 -2
  551. package/src/tui/entry.ts +483 -32
  552. package/src/tui/inline-choice.ts +188 -0
  553. package/src/tui/sidetab/attach.ts +304 -0
  554. package/src/tui/sidetab/list.ts +2 -0
  555. package/src/tui/sidetab/nl-tool.ts +136 -0
  556. package/src/tui/slash/resume-command.ts +23 -0
  557. package/src/tui/slash/resume.ts +3 -23
  558. package/src/tui/slash/term-next.ts +2 -1
  559. package/src/tui/slash/term.ts +12 -1
  560. package/src/tui-client/dashboard-session.ts +7 -1
  561. package/src/tui-client/local-chat-turn.ts +29 -8
  562. package/src/user-config.ts +42 -3
  563. package/src/ux-sim/classic-tui-seat-scenarios.ts +1 -7
  564. package/src/ux-sim/fake-land-queue.ts +88 -0
  565. package/src/ux-sim/fake-llm.ts +11 -5
  566. package/src/ux-sim/gate-shard-host-reroute.ts +82 -0
  567. package/src/ux-sim/goal-interim-trace.ts +24 -0
  568. package/src/ux-sim/next-tui-seat-scenarios.ts +61 -14
  569. package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +4 -1
  570. package/src/version/packed-revision.json +1 -1
  571. package/src/video-pipeline/recipes/explainer.ts +54 -2
  572. package/src/web-search/grok.ts +32 -6
  573. package/src/web-search/index.ts +8 -7
  574. package/src/workflow-runtime/node-catalog.ts +53 -4
  575. package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/1224.2ceca6c180d5130b.js +0 -62
  579. package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/1ed5e8af.cf424815c7c0efad.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/210.90b2cbd64926cf34.js +0 -32
  587. package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/2479-fe7e188bd9402d14.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +0 -148
  590. package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +0 -27
  594. package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/3199.6a1a9b0e6cd01dc6.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +0 -36
  601. package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/4036.d54e55e1ebf5acdc.js +0 -90
  603. package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +0 -226
  604. package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +0 -287
  605. package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/4833-7934c592c5569f00.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +0 -24
  612. package/apps/pwa/out/_next/static/chunks/4937-28d437999b77c9dd.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +0 -104
  615. package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +0 -93
  622. package/apps/pwa/out/_next/static/chunks/5952.294fc574a8625184.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +0 -74
  624. package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +0 -149
  627. package/apps/pwa/out/_next/static/chunks/6877-84d47b7e85d0c41e.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +0 -41
  631. package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +0 -24
  634. package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/757-4fbaf50942b8c424.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/7893-e444a1b0809cd1e4.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/7c5ed21f-f286708e57cf88f7.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +0 -8
  647. package/apps/pwa/out/_next/static/chunks/8080-40d781e7704d3671.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +0 -77
  649. package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +0 -286
  652. package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +0 -79
  656. package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +0 -94
  664. package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/958.53a8dcf4729e6997.js +0 -64
  666. package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/app/intake/page-5c112c6d7c33656e.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/app/live-run/page-89acd5d68c0bc560.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-fe986fe79b107546.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-88a1edbff62eaf1d.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/app/outputs/page-443364c9e4a23b31.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/app/page-b9af2ac1c4737ce8.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +0 -1
  705. package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +0 -1
  708. package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/app/share/page-fb9e639c107f5f72.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.js +0 -1
  725. package/scripts/migrate-monad-to-elanous.ts +0 -195
  726. package/scripts/rebrand-elanous.ts +0 -242
  727. /package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → HjeK7zONHfR7op1hKXp4k}/_ssgManifest.js +0 -0
@@ -442,6 +442,24 @@ function isRawSubtask(value: unknown): value is RawSubtask {
442
442
  return typeof value === 'object' && value !== null && !Array.isArray(value);
443
443
  }
444
444
 
445
+ function ensureSingleCompletionCriterion(feature: string, targetPaths: string[]): string {
446
+ const lines = feature.split(/\r?\n/);
447
+ const criteria = lines.filter((line) => /^\s*완료 기준\s*:/.test(line));
448
+ if (criteria.length === 0) {
449
+ return `${feature}\n완료 기준: ${targetPaths.join(' · ')}의 변경을 확인하고 관련 시험을 통과한다.`;
450
+ }
451
+ if (criteria.length === 1 && criteria[0]!.trim().length > '완료 기준:'.length) return feature;
452
+ const criterionText = criteria
453
+ .map((line) => line.replace(/^\s*완료 기준\s*:\s*/, '').trim())
454
+ .filter(Boolean)
455
+ .join(' · ');
456
+ const normalizedCriterion = criterionText || `${targetPaths.join(' · ')}의 변경을 확인하고 관련 시험을 통과한다.`;
457
+ const firstCriterionIndex = lines.findIndex((line) => /^\s*완료 기준\s*:/.test(line));
458
+ const withoutCriteria = lines.filter((line) => !/^\s*완료 기준\s*:/.test(line));
459
+ withoutCriteria.splice(Math.min(firstCriterionIndex, withoutCriteria.length), 0, `완료 기준: ${normalizedCriterion}`);
460
+ return withoutCriteria.join('\n');
461
+ }
462
+
445
463
  /**
446
464
  * G6 (1c) — 결정론적 hotPaths 추론. 분해된 sub-goal 의 feature 텍스트에서 repo 파일
447
465
  * 경로(src/…·docs/…·scripts/… + 확장자)를 뽑는다. LLM 이 hotPaths 를 안 채워도 hot-file
@@ -476,7 +494,8 @@ export function inheritDecomposedTargetPaths(parentFeature: string, goals: SelfD
476
494
  ? own[index]!
477
495
  : (goal.hotPaths ?? []).filter((path) => parentTargets.includes(path)));
478
496
  const claimedOwners = parentTargets.map((path) => goals.flatMap((_, index) => claims[index]!.includes(path) ? [index] : []));
479
- const conflictingClaims = claimedOwners.some((indices) => indices.length > 1);
497
+ const sharedExplicitTarget = own.length === 2 && own[0]!.some((path) => own[1]!.includes(path));
498
+ const conflictingClaims = sharedExplicitTarget || claimedOwners.some((indices) => indices.length > 1);
480
499
  const nameOwners = parentTargets.map((path) => {
481
500
  const stemWords = path.split('/').at(-1)!.replace(/\.[^.]+$/, '').toLowerCase().match(/[a-z0-9]+/g) ?? [];
482
501
  if (!stemWords.length || stemWords.join('').length < 4) return [];
@@ -507,24 +526,41 @@ export function inheritDecomposedTargetPaths(parentFeature: string, goals: SelfD
507
526
  // A named path wins over model order; if every path points at one child,
508
527
  // keep the old scope rather than inventing work for the other child.
509
528
  const partitions = goals.map((_, index) => parentTargets.filter((_, pathIndex) => owners[pathIndex] === index));
510
- const sharedOtherPaths = (goals[0]?.hotPaths ?? []).some((path) =>
511
- !parentTargets.includes(path) && (goals[1]?.hotPaths ?? []).includes(path));
512
529
  const conflictingParentReference = goals.some((goal, index) =>
513
530
  own[index]!.length > 0 && (goal.hotPaths ?? []).some((path) =>
514
531
  parentTargets.includes(path) && !own[index]!.includes(path)));
515
532
  if (partitions.every((paths) => paths.length > 0)
516
533
  && !conflictingClaims && !ambiguousName && !conflictingNameClaim && !conflictingUnclaimedHint
517
- && !sharedOtherPaths && !conflictingParentReference) return goals.map((goal, index) => {
534
+ && !conflictingParentReference) return goals.map((goal, index) => {
518
535
  const targets = partitions[index]!;
519
- return { ...goal, hotPaths: [...new Set([...(goal.hotPaths ?? []), ...targets])],
520
- feature: `${goal.feature}${own[index]!.length ? '' : `\n대상 경로: ${targets.join(' · ')}`}\n완료 기준: ${targets.join(' · ')}의 변경을 확인하고 관련 시험을 통과한다.` };
536
+ // A declared child target may add a helper outside the parent fence. Bare
537
+ // hotPaths outside that fence are references, so do not widen the write fence.
538
+ const explicitHelpers = own[index]!.filter((path) => !parentTargets.includes(path));
539
+ const feature = `${goal.feature}${own[index]!.length ? '' : `\n대상 경로: ${targets.join(' · ')}`}`;
540
+ return { ...goal, hotPaths: [...new Set([...targets, ...explicitHelpers])],
541
+ feature: ensureSingleCompletionCriterion(feature, targets) };
521
542
  });
522
543
  }
523
544
  }
524
- return goals.map((goal) => {
545
+ const explicitChildTargets = goals.map((goal) => declaredTargets(goal.feature ?? ''));
546
+ const explicitParentTargets = explicitChildTargets.map((paths) => paths.filter((path) => parentTargets.includes(path)));
547
+ const explicitTargetsArePartition = goals.length === 2
548
+ && explicitParentTargets.every((paths) => paths.length > 0)
549
+ && new Set(explicitChildTargets.flat()).size === explicitChildTargets.flat().length
550
+ && explicitParentTargets[0]!.every((path) => !explicitParentTargets[1]!.includes(path))
551
+ && new Set(explicitParentTargets.flat()).size === parentTargets.length
552
+ && parentTargets.every((path) => explicitParentTargets.flat().includes(path))
553
+ && goals.every((goal, index) => (goal.hotPaths ?? []).every((path) =>
554
+ !parentTargets.includes(path) || explicitChildTargets[index]!.includes(path)));
555
+ return goals.map((goal, index) => {
525
556
  // hotPaths also contains inferred references; only an explicit target line establishes child scope.
526
- const own = declaredTargets(goal.feature ?? '');
527
- if (own.length) return goal;
557
+ const own = explicitChildTargets[index]!;
558
+ if (own.length) {
559
+ if (explicitTargetsArePartition) {
560
+ return { ...goal, hotPaths: own, feature: ensureSingleCompletionCriterion(goal.feature ?? '', own) };
561
+ }
562
+ return goal;
563
+ }
528
564
  return { ...goal, hotPaths: [...new Set([...(goal.hotPaths ?? []), ...parentTargets])],
529
565
  feature: `${goal.feature}\n대상 경로: ${parentTargets.join(' · ')}` };
530
566
  });
@@ -1113,6 +1113,8 @@ export async function executeDevSelfRun(
1113
1113
  }
1114
1114
  await superviseRun({
1115
1115
  initial: [initialJob],
1116
+ // Pod worktree paths are not necessarily mounted in this parent process.
1117
+ knowhowRepo: process.cwd(),
1116
1118
  // A review-oscillation repair goal runs through the existing piece executor (fragment re-execution with the
1117
1119
  // authored goal as its feature). Without that executor the rerun could only replay the same goal — declare false.
1118
1120
  repairGoalExecution: supervise.executePiece !== undefined,
@@ -709,16 +709,16 @@ export function buildAgentMissionDevSpec(o: {
709
709
  export async function executeAgentMissionReroute(
710
710
  spec: DevPipelineSpec,
711
711
  agentBackend: AgentBackend,
712
- deps?: { runDevPipeline?: typeof runDevPipeline },
712
+ deps?: { runDevPipeline?: typeof runDevPipeline; signal?: AbortSignal },
713
713
  ): Promise<{ result: AgentMissionResult; exitCode: number }> {
714
714
  const run = deps?.runDevPipeline ?? runDevPipeline;
715
- const r = await run(spec, { resolveBackend: () => agentBackend });
715
+ const r = await run(spec, { resolveBackend: () => agentBackend, ...(deps?.signal ? { signal: deps.signal } : {}) });
716
716
  // ★ 잘못된 라우팅 즉시 표면화 — spec 이 external+pty 가 아니면 kind 불일치(무조건 캐스팅 금지).
717
717
  if (r.kind !== 'agent-mission') {
718
718
  throw new DevPipelineError(`executeAgentMissionReroute: 예상 밖 dispatch(kind=${r.kind}) — external+pty spec 이어야`);
719
719
  }
720
720
  const result = r.result;
721
- return { result, exitCode: result.ok ? 0 : 2 };
721
+ return { result, exitCode: result.reason === 'aborted' ? 130 : result.ok ? 0 : 2 };
722
722
  }
723
723
 
724
724
  // ── U4b: self implement 재라우팅 seam(테스트 가능) ──
@@ -2234,6 +2234,7 @@ async function runDevPipelineDispatch(
2234
2234
  const result = await run({
2235
2235
  ...toSelfImplementOptions(text, plan, seams),
2236
2236
  ...(spec.runId ? { runId: spec.runId } : {}),
2237
+ ...(deps.signal ? { signal: deps.signal } : {}),
2237
2238
  onNodeEntry: (node, round) => { walk.push({ node, round }); },
2238
2239
  });
2239
2240
  // ⛔ 「걸음이 비었다」와 「안 걸었다」를 가른다 — 빈 배열은 «싣지 않는다».
@@ -2252,5 +2253,8 @@ async function runDevPipelineDispatch(
2252
2253
  // agent-mission-pty
2253
2254
  const run = deps.runAgentMission ?? (await import('../agent-mission/driver.js')).runAgentMission;
2254
2255
  const resolveBackend = deps.resolveBackend ?? (await import('../agent-mission/driver.js')).resolveBackend;
2255
- return { plan, kind: 'agent-mission', result: await run(toAgentMissionSpec(text, plan, resolveBackend)) };
2256
+ return { plan, kind: 'agent-mission', result: await run({
2257
+ ...toAgentMissionSpec(text, plan, resolveBackend),
2258
+ ...(deps.signal ? { signal: deps.signal } : {}),
2259
+ }) };
2256
2260
  }
@@ -126,6 +126,8 @@ export interface DraftResidueAdapters {
126
126
  setLabels(repository: string, number: number, change: { add: string; remove: readonly string[] }): Promise<void> | void;
127
127
  comment(repository: string, number: number, body: string): Promise<void> | void;
128
128
  closePr(repository: string, number: number): Promise<void> | void;
129
+ /** Persist the existing `수확보류: harvest-deferred` PR-body marker after a verified close. */
130
+ editBody(repository: string, number: number, body: string): Promise<void> | void;
129
131
  /** Undefined means liveness could not be established, not that no branch is live. */
130
132
  listLiveBranches(repository: string): Promise<ReadonlySet<string> | undefined> | ReadonlySet<string> | undefined;
131
133
  /** Undefined means the prior run could not be identified as ended. */
@@ -133,11 +135,22 @@ export interface DraftResidueAdapters {
133
135
  }
134
136
  /** One close budget shared by every terminal replayed in a tick and the draft sweep that follows. */
135
137
  export interface DraftCloseBudget { remaining: number }
138
+ export type HarvestExistingPr = { number: number; url?: string; labels?: readonly string[] };
139
+ /** Injectable remote-branch / same-branch-PR / draft-create seams for timed-out-harvestable. */
140
+ export interface HarvestableDraftAdapters {
141
+ /** Override host repository for harvest lookups and creates. */
142
+ repository?: string;
143
+ remoteBranchExists(repository: string, branch: string): Promise<boolean | undefined> | boolean | undefined;
144
+ findExistingPr(repository: string, branch: string): Promise<HarvestExistingPr | null | undefined> | HarvestExistingPr | null | undefined;
145
+ createDraftPr(repository: string, branch: string): Promise<HarvestExistingPr> | HarvestExistingPr;
146
+ addHarvestableLabel(repository: string, number: number): Promise<void> | void;
147
+ }
136
148
  export interface DraftResidueContext {
137
149
  ledgerRunId: string;
138
150
  ledgerDir: string;
139
151
  adapters?: DraftResidueAdapters;
140
152
  closeBudget?: DraftCloseBudget;
153
+ harvest?: HarvestableDraftAdapters;
141
154
  }
142
155
  export type DraftResidueResult = { status: 'recorded' | 'skipped' | 'failed'; reason?: string; step?: string };
143
156
 
@@ -253,6 +266,7 @@ export function defaultAdapters(sources: ResidueRunStatusSources = defaultRunSta
253
266
  },
254
267
  comment: (repository, number, body) => { gh(['pr', 'comment', String(number), '-R', repository, '--body', body]); },
255
268
  closePr: (repository, number) => { gh(['pr', 'close', String(number), '-R', repository]); },
269
+ editBody: (repository, number, body) => { gh(['pr', 'edit', String(number), '-R', repository, '--body', body]); },
256
270
  listLiveBranches: (repository) => {
257
271
  if (repository.toLowerCase() !== hostRepository()?.toLowerCase()) return undefined;
258
272
  const root = findGitDir(process.cwd())?.root;
@@ -297,6 +311,117 @@ function hostRepository(): string | null {
297
311
  return match?.[1] ?? null;
298
312
  }
299
313
 
314
+ function harvestBranchOk(branch: string): boolean {
315
+ return /^[A-Za-z0-9._/-]+$/.test(branch) && !branch.includes('..');
316
+ }
317
+
318
+ /** Production harvest seams: remote branch via `git ls-remote --exit-code`, same-branch PR via `gh pr list --head`, draft via `gh pr create --draft`. */
319
+ export function defaultHarvestAdapters(record?: PrTerminalRecord): HarvestableDraftAdapters {
320
+ return {
321
+ remoteBranchExists: (repository, branch) => {
322
+ if (!harvestBranchOk(branch) || !/^[\w.-]+\/[\w.-]+$/.test(repository)) return undefined;
323
+ const root = findGitDir(process.cwd())?.root;
324
+ const remote = `https://github.com/${repository}.git`;
325
+ const result = spawnSync('git', ['ls-remote', '--exit-code', remote, `refs/heads/${branch}`], {
326
+ cwd: root ?? process.cwd(), encoding: 'utf8', timeout: 10_000,
327
+ });
328
+ if (result.status === 0) return true;
329
+ if (result.status === 2) return false;
330
+ return undefined;
331
+ },
332
+ findExistingPr: (repository, branch) => {
333
+ if (!harvestBranchOk(branch) || !/^[\w.-]+\/[\w.-]+$/.test(repository)) return undefined;
334
+ try {
335
+ const rows: unknown = JSON.parse(gh(['pr', 'list', '-R', repository, '--state', 'open', '--head', branch,
336
+ '--json', 'number,url,labels,headRefName', '--limit', '100']));
337
+ if (!Array.isArray(rows)) return undefined;
338
+ const matching = rows.filter((row): row is { number: number; url?: string; headRefName: string; labels?: Array<{ name: string } | string> } =>
339
+ !!row && typeof row === 'object' && typeof (row as { headRefName?: unknown }).headRefName === 'string'
340
+ && (row as { headRefName: string }).headRefName === branch
341
+ && typeof (row as { number?: unknown }).number === 'number'
342
+ && Number.isSafeInteger((row as { number: number }).number) && (row as { number: number }).number > 0);
343
+ if (matching.length === 0) return null;
344
+ if (matching.length !== 1) return undefined;
345
+ const row = matching[0]!;
346
+ const labels = (row.labels ?? []).map((label) => typeof label === 'string' ? label : label.name).filter((name): name is string => typeof name === 'string');
347
+ return { number: row.number, url: typeof row.url === 'string' ? row.url : undefined, labels };
348
+ } catch {
349
+ return undefined;
350
+ }
351
+ },
352
+ createDraftPr: (repository, branch) => {
353
+ const title = `Harvest timed-out ${record?.childRunId ?? branch}`;
354
+ const body = `Draft residue: timed-out-harvestable · owner=${record?.owner ?? 'unknown'}(${record?.ownerSource ?? 'unknown'}) · run=${record?.childRunId ?? 'unobserved'} · branch=${branch}`;
355
+ const out = gh(['pr', 'create', '-R', repository, '--head', branch, '--draft', '--title', title, '--body', body]);
356
+ const match = /https:\/\/github\.com\/([\w.-]+\/[\w.-]+)\/pull\/(\d+)/.exec(out);
357
+ if (!match || match[1]!.toLowerCase() !== repository.toLowerCase()) throw new Error('draft-create-unobserved');
358
+ return { number: Number(match[2]), url: match[0] };
359
+ },
360
+ addHarvestableLabel: (repository, number) => { gh(['pr', 'edit', String(number), '-R', repository, '--add-label', harvestable]); },
361
+ };
362
+ }
363
+
364
+ /** Open one draft PR for a timed-out-harvestable terminal when the remote branch exists and no same-branch PR is open. */
365
+ export async function harvestHarvestableDrafts(record: PrTerminalRecord, ctx: DraftResidueContext): Promise<DraftResidueResult> {
366
+ const adapters = ctx.adapters ?? defaultAdapters();
367
+ const harvest = ctx.harvest ?? defaultHarvestAdapters(record);
368
+ const fields = { childRunId: record.childRunId, prNumber: record.prNumber, terminalClass: record.terminalClass, owner: record.owner, ownerSource: record.ownerSource };
369
+ const log = (event: string, data: Record<string, unknown> = {}) => debug.log('draft.residue', event, { ...fields, ...data });
370
+ const skipped = (reason: string): DraftResidueResult => { log('skipped', { reason }); return { status: 'skipped', reason }; };
371
+ let step = 'ledger';
372
+ try {
373
+ if (record.terminalClass !== 'timed-out-harvestable') return skipped(record.terminalClass);
374
+ const branch = typeof record.branch === 'string' && record.branch.trim() ? record.branch.trim() : null;
375
+ if (!branch) return skipped('missing-branch');
376
+ const repository = harvest.repository ?? record.repository ?? hostRepository();
377
+ if (!repository) return skipped('host-repository-unobserved');
378
+ const ledger = adapters.loadLedger(ctx.ledgerRunId, ctx.ledgerDir);
379
+ if (ledger === undefined) throw new Error('Terminal ledger unavailable');
380
+ const rows = (ledger ?? []).filter((entry) => entry.data.childRunId === record.childRunId);
381
+ const completed = (effect: string, number: number): boolean => rows.some((entry) => entry.event === 'pr-terminal-effect'
382
+ && entry.data.effect === effect && entry.data.number === number);
383
+ const acknowledge = (effect: string, number: number): void => {
384
+ adapters.appendLedger({ runId: ctx.ledgerRunId, event: 'pr-terminal-effect', data: { childRunId: record.childRunId, effect, number } }, ctx.ledgerDir);
385
+ };
386
+ if (completed('complete', 0) || completed('complete', record.prNumber ?? 0)) return skipped('already-recorded');
387
+ step = 'remote-branch';
388
+ const exists = await harvest.remoteBranchExists(repository, branch);
389
+ if (exists === undefined) throw new Error('Remote branch lookup unavailable');
390
+ if (exists === false) {
391
+ acknowledge('complete', 0);
392
+ return skipped('missing-branch');
393
+ }
394
+ step = 'find-existing-pr';
395
+ const existing = await harvest.findExistingPr(repository, branch);
396
+ if (existing === undefined) throw new Error('Existing PR lookup unavailable');
397
+ let pr = existing;
398
+ if (!pr) {
399
+ step = 'create-draft-pr';
400
+ pr = await harvest.createDraftPr(repository, branch);
401
+ log('harvest-created', { number: pr?.number, branch, repository });
402
+ } else {
403
+ log('harvest-reused', { number: pr.number, branch, repository });
404
+ }
405
+ if (!pr || !Number.isSafeInteger(pr.number) || pr.number <= 0) throw new Error('draft-create-unobserved');
406
+ if (!completed('harvestable', pr.number)) {
407
+ if (!pr.labels?.includes(harvestable)) {
408
+ step = 'add-label';
409
+ await harvest.addHarvestableLabel(repository, pr.number);
410
+ log('harvestable-labeled', { prNumber: pr.number });
411
+ }
412
+ step = 'ledger';
413
+ acknowledge('harvestable', pr.number);
414
+ }
415
+ step = 'ledger';
416
+ acknowledge('complete', 0);
417
+ return { status: 'recorded' };
418
+ } catch (error) {
419
+ const reason = error instanceof Error ? error.message : String(error);
420
+ log('failed', { step, reason });
421
+ return { status: 'failed', step, reason };
422
+ }
423
+ }
424
+
300
425
  export interface DraftResidueReplayOptions {
301
426
  repository?: string;
302
427
  ledgerDir?: string;
@@ -385,7 +510,11 @@ export async function replayPodTerminals(options: DraftResidueReplayOptions = {}
385
510
  const outcome = await applyPodTerminal(record, { ledgerDir, ledgerRunId, adapters: replayAdapters, closeBudget });
386
511
  if (outcome.status === 'recorded' || outcome.reason === 'already-recorded') recovered++;
387
512
  else if (outcome.status === 'skipped' && outcome.reason === 'repository-unobserved') unresolved++;
388
- else if (outcome.status === 'skipped' && !['previous-run-unverified', 'previous-run-live', 'close-cap', 'host-repository-unobserved', 'restore-unverified'].includes(outcome.reason ?? '')) recovered++;
513
+ else if (outcome.status === 'skipped' && ![
514
+ 'previous-run-unverified', 'previous-run-live', 'close-cap', 'host-repository-unobserved', 'restore-unverified',
515
+ 'deferred-close-ownership-unverified', 'deferred-close-reopened', 'deferred-close-unverified',
516
+ 'deferred-close-run-unverified', 'deferred-close-raced',
517
+ ].includes(outcome.reason ?? '')) recovered++;
389
518
  else pending++;
390
519
  }
391
520
  }
@@ -409,12 +538,34 @@ export async function applyPodTerminal(record: PrTerminalRecord, ctx: DraftResid
409
538
  const acknowledge = (effect: string, number: number): void => {
410
539
  adapters.appendLedger({ runId: ctx.ledgerRunId, event: 'pr-terminal-effect', data: { childRunId: record.childRunId, effect, number } }, ctx.ledgerDir);
411
540
  };
541
+ const markDeferredBody = async (number: number, expectedBranch: string): Promise<void> => {
542
+ if (record.terminalClass !== 'merge-ready-not-merged' || completed('harvest-deferred-body', number)) return;
543
+ const latest = await adapters.getPr(number);
544
+ if (!latest || latest.state !== 'CLOSED' || latest.headSha?.toLowerCase() !== record.headSha?.toLowerCase()
545
+ || latest.branch !== expectedBranch || typeof latest.body !== 'string') {
546
+ throw new Error('harvest-deferred-body-unverified');
547
+ }
548
+ const marker = '수확보류: harvest-deferred';
549
+ if (!latest.body.split(/\r?\n/).includes(marker)) {
550
+ step = 'edit-body';
551
+ await adapters.editBody(record.repository!, number, `${latest.body.trimEnd()}\n${marker}\n`);
552
+ const verified = await adapters.getPr(number);
553
+ if (!verified || verified.state !== 'CLOSED' || verified.headSha?.toLowerCase() !== record.headSha?.toLowerCase()
554
+ || verified.branch !== expectedBranch || !verified.body?.split(/\r?\n/).includes(marker)) {
555
+ throw new Error('harvest-deferred-body-unverified');
556
+ }
557
+ }
558
+ step = 'ledger';
559
+ acknowledge('harvest-deferred-body', number);
560
+ };
412
561
  if (completed('complete', record.prNumber ?? 0) || completed('protected', record.prNumber ?? 0)) return skipped('already-recorded');
413
562
  if (!rows.some((entry) => entry.event === 'pr-terminal')) {
414
563
  adapters.appendLedger({ runId: ctx.ledgerRunId, event: 'pr-terminal', data: { ...record } }, ctx.ledgerDir);
415
564
  log('terminal-recorded');
416
565
  }
417
- // AUT-TIMEOUT-NO-HARVEST 첫 조각은 «분류만» — 그 branch 로 PR 을 여는 효과는 다음 조각(원격 가지 존재·기존 PR 확인 관문과 함께).
566
+ if (record.terminalClass === 'timed-out-harvestable') {
567
+ return harvestHarvestableDrafts(record, { ...ctx, adapters, harvest: ctx.harvest ?? defaultHarvestAdapters(record) });
568
+ }
418
569
  if (record.terminalClass === 'failed-no-pr' || record.terminalClass === 'failed-pr-unobserved' || record.prNumber === null) {
419
570
  acknowledge('complete', 0);
420
571
  return skipped(record.terminalClass);
@@ -441,6 +592,21 @@ export async function applyPodTerminal(record: PrTerminalRecord, ctx: DraftResid
441
592
  step = 'get-pr';
442
593
  const pr = await adapters.getPr(record.prNumber);
443
594
  if (!pr || pr.number !== record.prNumber || !Array.isArray(pr.labels) || !pr.branch || !Number.isFinite(Date.parse(pr.createdAt))) throw new Error('PR lookup unavailable');
595
+ const deferredCloseTerminal = record.terminalClass === 'failed-with-pr' || record.terminalClass === 'merge-ready-not-merged';
596
+ if (deferredCloseTerminal && completed('deferred-close', pr.number)) {
597
+ if (pr.state !== 'CLOSED' || !record.headSha
598
+ || pr.headSha?.toLowerCase() !== record.headSha.toLowerCase()
599
+ || (record.branch && pr.branch !== record.branch)) return skipped('deferred-close-reopened');
600
+ await markDeferredBody(pr.number, pr.branch);
601
+ step = 'ledger';
602
+ acknowledge('complete', pr.number);
603
+ return { status: 'recorded' };
604
+ }
605
+ // After a close intent without its receipt, GitHub cannot prove whether our close was applied and
606
+ // subsequently reversed by another owner. Leave that ambiguity for a human instead of closing again.
607
+ if (deferredCloseTerminal && completed('deferred-close-intent', pr.number)) {
608
+ return skipped('deferred-close-ownership-unverified');
609
+ }
444
610
  // Review r8: the PR may have merged or closed after this run's terminal — a failed terminal then writes nothing
445
611
  // (no harvestable label, no owner comment) and settles once.
446
612
  if (record.terminalClass !== 'landed' && pr.state !== undefined && pr.state !== 'OPEN') {
@@ -733,6 +899,59 @@ export async function applyPodTerminal(record: PrTerminalRecord, ctx: DraftResid
733
899
  }
734
900
  if (deferred) return skipped('previous-run-unverified');
735
901
  if (capped) return skipped('close-cap');
902
+ if (deferredCloseTerminal) {
903
+ if (budget.remaining <= 0) return skipped('close-cap');
904
+ const restore = `Draft residue: harvest deferred · run=${record.childRunId} · head=${record.headSha} · branch=${pr.branch}. Close does not delete this ref; verify it before restore.${record.terminalClass === 'merge-ready-not-merged' ? ' 다시 여는 법: gh pr reopen + land-enqueue.' : ''}`;
905
+ step = 'get-pr';
906
+ const latest = await adapters.getPr(pr.number);
907
+ if (!latest || latest.state !== 'OPEN' || latest.isDraft !== true || !record.headSha
908
+ || latest.headSha?.toLowerCase() !== record.headSha.toLowerCase()
909
+ || latest.branch !== pr.branch || (record.branch && latest.branch !== record.branch)
910
+ || !Array.isArray(latest.labels) || latest.labels.some((label) => PROTECTED_LABELS.has(label) || label.includes('harvest-claimed'))) {
911
+ return skipped('deferred-close-unverified');
912
+ }
913
+ step = 'list-live-branches';
914
+ const activeBranches = await adapters.listLiveBranches(record.repository);
915
+ step = 'get-run-status';
916
+ const runStatus = await adapters.getRunStatus(latest, record.repository);
917
+ if (!activeBranches || activeBranches.has(latest.branch)
918
+ || !['completed', 'failed', 'cancelled', 'abandoned', 'self-implement.result final'].includes(runStatus ?? '')) {
919
+ return skipped('deferred-close-run-unverified');
920
+ }
921
+ step = 'list-comments';
922
+ const comments = await adapters.getAllComments?.(record.repository, pr.number);
923
+ if (!Array.isArray(comments) || comments.some((comment) => typeof comment !== 'string'
924
+ || /landing-verified\s*:|land-enqueue\s*:/i.test(comment))) return skipped('deferred-close-unverified');
925
+ if (!comments.includes(restore)) { step = 'comment'; await adapters.comment(record.repository, pr.number, restore); }
926
+ step = 'get-pr';
927
+ const beforeClose = await adapters.getPr(pr.number);
928
+ step = 'list-comments';
929
+ const commentsBeforeClose = await adapters.getAllComments?.(record.repository, pr.number);
930
+ step = 'list-live-branches';
931
+ const liveBeforeClose = await adapters.listLiveBranches(record.repository);
932
+ step = 'get-run-status';
933
+ const statusBeforeClose = await adapters.getRunStatus(latest, record.repository);
934
+ if (!beforeClose || beforeClose.state !== 'OPEN' || beforeClose.isDraft !== true
935
+ || beforeClose.headSha?.toLowerCase() !== record.headSha.toLowerCase()
936
+ || beforeClose.branch !== latest.branch || !Array.isArray(beforeClose.labels)
937
+ || beforeClose.labels.some((label) => PROTECTED_LABELS.has(label) || label.includes('harvest-claimed'))
938
+ || !Array.isArray(commentsBeforeClose) || !commentsBeforeClose.includes(restore)
939
+ || commentsBeforeClose.some((comment) => typeof comment !== 'string'
940
+ || /landing-verified\s*:|land-enqueue\s*:/i.test(comment))
941
+ || !liveBeforeClose || liveBeforeClose.has(latest.branch)
942
+ || !['completed', 'failed', 'cancelled', 'abandoned', 'self-implement.result final'].includes(statusBeforeClose ?? '')) {
943
+ return skipped('deferred-close-raced');
944
+ }
945
+ step = 'ledger';
946
+ acknowledge('deferred-close-intent', pr.number);
947
+ step = 'close-pr';
948
+ await adapters.closePr(record.repository, pr.number);
949
+ budget.remaining--;
950
+ step = 'ledger';
951
+ acknowledge('deferred-close', pr.number);
952
+ log('deferred-closed', { branch: latest.branch, headSha: record.headSha });
953
+ await markDeferredBody(pr.number, latest.branch);
954
+ }
736
955
  step = 'ledger';
737
956
  acknowledge('complete', record.prNumber);
738
957
  return { status: 'recorded' };
@@ -938,25 +938,38 @@ async function applyDraftSweepPlan(repository: string, adapters: DraftSweepAdapt
938
938
  number, action, reason, ...(statusLabel ? { statusLabel } : {}), applied: false,
939
939
  })), counts: {}, closeCap: plan.closeCap, closeCapSource: plan.closeCapSource };
940
940
  const writable = plan.entries.filter((entry) => entry.action !== 'report' && (entry.action === 'close' || Boolean(entry.statusLabel)));
941
- const preflightEntries = new Map(writable.map((entry) => [entry.number, entry]));
942
- for (const entry of writable) if (entry.supersedeNewer) {
943
- const newer = plan.entries.find((candidate) => candidate.number === entry.supersedeNewer!.number);
944
- if (!newer) { result.error = `snapshot apply plan missing newer PR #${entry.supersedeNewer.number}`; return result; }
945
- preflightEntries.set(newer.number, newer);
941
+ for (const entry of writable) if (entry.supersedeNewer && !plan.entries.some((candidate) => candidate.number === entry.supersedeNewer!.number)) {
942
+ result.error = `snapshot apply plan missing newer PR #${entry.supersedeNewer.number}`;
943
+ return result;
946
944
  }
947
945
  if (!adapters.getDraftSnapshot) { result.error = 'draft snapshot preflight unavailable'; return result; }
948
- // Read and validate every target before the first mutation: one stale item blocks the whole write batch.
949
- const snapshots = await mapBounded([...preflightEntries.values()], DRAFT_SWEEP_CONCURRENCY, async (entry) => ({ entry,
950
- current: await adapters.getDraftSnapshot!(repository, entry.number) }));
951
- const drift = snapshots.find(({ entry, current }) => !current || current.number !== entry.number || current.state !== 'open'
952
- || current.draft !== true || current.headSha !== entry.headSha || current.branch !== entry.branch || current.updatedAt !== entry.updatedAt
953
- || current.labels.length !== entry.labels.length || [...current.labels].sort().join('\0') !== [...entry.labels].sort().join('\0'));
954
- if (drift) {
955
- const number = drift.entry.number;
956
- result.error = `draft snapshot drift at #${number}; no writes performed`;
957
- for (const entry of result.entries) if (writable.some((item) => item.number === entry.number)) entry.error = result.error;
946
+ // The frozen classification is one transaction boundary: every plan row must still match before any write.
947
+ const snapshots = await mapBounded(plan.entries, DRAFT_SWEEP_CONCURRENCY, async (entry) => {
948
+ try { return { entry, current: await adapters.getDraftSnapshot!(repository, entry.number), lookupError: undefined as string | undefined }; }
949
+ catch (error) { return { entry, current: undefined, lookupError: sweepFailureReason(error) }; }
950
+ });
951
+ const drift = snapshots.flatMap(({ entry, current, lookupError }) => {
952
+ if (lookupError) return [{ number: entry.number, reason: `snapshot lookup failed: ${lookupError}` }];
953
+ if (!current) return [{ number: entry.number, reason: 'snapshot unavailable' }];
954
+ const reasons: string[] = [];
955
+ if (current.number !== entry.number) reasons.push('number drift');
956
+ if (current.state !== 'open' && current.state !== 'closed') reasons.push('invalid state');
957
+ else if (current.state !== 'open') reasons.push(`state drift: expected open, got ${current.state}`);
958
+ if (current.draft !== true) reasons.push('draft state drift');
959
+ if (typeof current.headSha !== 'string' || current.headSha !== entry.headSha) reasons.push('head SHA drift');
960
+ if (typeof current.branch !== 'string' || current.branch !== entry.branch) reasons.push('branch drift');
961
+ if (typeof current.updatedAt !== 'string' || current.updatedAt !== entry.updatedAt) reasons.push('updatedAt drift');
962
+ if (!Array.isArray(current.labels) || current.labels.some((name) => typeof name !== 'string')
963
+ || current.labels.length !== entry.labels.length || [...current.labels].sort().join('\0') !== [...entry.labels].sort().join('\0')) reasons.push('labels drift');
964
+ return reasons.map((reason) => ({ number: entry.number, reason }));
965
+ });
966
+ if (drift.length) {
967
+ result.error = `draft snapshot drift at ${drift.map(({ number, reason }) => `#${number} (${reason})`).join(', ')}; no writes performed`;
968
+ for (const item of drift) result.entries.find((entry) => entry.number === item.number)!.error = item.reason;
958
969
  return result;
959
970
  }
971
+ const writableNumbers = new Set(writable.map((entry) => entry.number));
972
+ const snapshotsForApply = snapshots.filter(({ entry }) => writableNumbers.has(entry.number));
960
973
  const stopPlans = writable.filter((entry) => entry.stopRunRequired === true);
961
974
  const stoppedRuns = new Set<number>();
962
975
  if (stopPlans.length) {
@@ -986,7 +999,7 @@ async function applyDraftSweepPlan(repository: string, adapters: DraftSweepAdapt
986
999
  } catch (error) { result.error = `could not stop planned run at #${check.entry.number}: ${sweepFailureReason(error)}`; return result; }
987
1000
  }
988
1001
  }
989
- for (const { entry } of snapshots) {
1002
+ for (const { entry } of snapshotsForApply) {
990
1003
  const output = result.entries.find((item) => item.number === entry.number)!;
991
1004
  let mutated = false;
992
1005
  try {
@@ -122,6 +122,10 @@ export function readJourneyEdge(
122
122
  * 그 밖의 칸은 그 간선에 결속할 근거(예: 착지 거부 원문·cardId · LAND-REFUSAL-EDGES) — 간선 칸(from·to·taken…)을 덮지 못한다. */
123
123
  export interface JourneyEdgeFields {
124
124
  readonly moveId?: string;
125
+ readonly runId?: string;
126
+ readonly card?: string;
127
+ readonly pr?: number;
128
+ readonly head?: string;
125
129
  readonly [key: string]: unknown;
126
130
  }
127
131
 
@@ -140,11 +144,15 @@ export function recordJourneyEdge(route: JourneyRoute, taken: string, reason?: s
140
144
  graphId: 'self-implement', node: skipped.node, reason: 'condition', condition: skipped.condition,
141
145
  ...journeyJoinFields(),
142
146
  });
143
- // Evidence never overrides an edge field: the later spread wins, and `reason`/join keys are reserved.
144
- const { reason: _reservedReason, journeyKey: _reservedJourney, queueLaunchId: _reservedLaunch, ...evidence } = data ?? {};
147
+ // Evidence never overrides an edge field: the later spread wins. Explicit repair join keys win over ambient context.
148
+ const { reason: _reservedReason, journeyKey: _reservedJourney, queueLaunchId: _reservedLaunch,
149
+ runId, card, pr, head, moveId, ...evidence } = data ?? {};
145
150
  debug.log('self-implement', 'graph-edge-taken', {
146
151
  ...evidence, graphId: 'self-implement', ...route, taken, honored: route.to === null || route.to === taken,
147
152
  ...(reason === undefined ? {} : { reason }), ...journeyJoinFields(),
153
+ ...(runId === undefined ? {} : { runId }), ...(card === undefined ? {} : { card }),
154
+ ...(pr === undefined ? {} : { pr }), ...(head === undefined ? {} : { head }),
155
+ ...(moveId === undefined ? {} : { moveId }),
148
156
  });
149
157
  } catch { /* 관측은 fail-soft */ }
150
158
  }
@@ -22,8 +22,8 @@ export interface LaunchPreflightBlocker {
22
22
  readonly name: string;
23
23
  /** 왜 막혔는지 한 줄 — 경로와 수를 포함한다. */
24
24
  readonly detail: string;
25
- /** 골 판독 실패(`goal-unreadable`)와 traced-path 오류(`missing-traced-path`)를 가르는 사유 코드. */
26
- readonly reasonCode?: 'goal-unreadable' | 'missing-traced-path';
25
+ /** 골 판독 실패(`goal-unreadable`) · 골 해석 실패(`goal-parse`) · traced-path 오류(`missing-traced-path`)를 가르는 사유 코드. */
26
+ readonly reasonCode?: 'goal-unreadable' | 'goal-parse' | 'missing-traced-path';
27
27
  /** 어느 검사인지 — 경로를 접지 않은 검사 이름. */
28
28
  readonly checkName?: string;
29
29
  /** 잘리지 않은 대상 경로. 경로 없는 검사(빈 traced paths)는 생략한다. */
@@ -1112,14 +1112,31 @@ export function decideAskPreflight(
1112
1112
  const inspectionRoot = goalDocument === null || !hasAuthoredGoal
1113
1113
  ? undefined
1114
1114
  : opts.declaredPathsRoot?.trim() || process.cwd();
1115
- const authoredTracedPaths = goalDocument === null
1116
- ? []
1117
- : inspectableAuthoredTracedPaths(deps.tracedPaths(goalDocument), inspectionRoot);
1115
+ // ⛔ 골 «판독»(읽기) 실패와 골 «해석» 실패는 고칠 곳이 다르다 — 파서가 던진 예외를 사유 코드로 바꿔
1116
+ // 원장에 «어느 검사가» 막았는지 남긴다(AUT-PREFLIGHT-REASON-OPAQUE: 두 갈래가 한 문장으로 뭉개졌다).
1117
+ let goalParseFailure: { readonly checkName: string; readonly message: string } | undefined;
1118
+ const authoredTracedPaths = (() => {
1119
+ if (goalDocument === null) return [];
1120
+ try {
1121
+ return inspectableAuthoredTracedPaths(deps.tracedPaths(goalDocument), inspectionRoot);
1122
+ } catch (error) {
1123
+ goalParseFailure = { checkName: 'goal-parse', message: oneLineConfidenceFailureDetail(error) };
1124
+ return [];
1125
+ }
1126
+ })();
1118
1127
  const tracedPathsRaw = opts.pathsOverride ?? authoredTracedPaths;
1119
1128
  const tracedPaths = inspectionRoot && !opts.pathsOverride
1120
1129
  ? tracedPathsRaw.filter((path) => tracedPathExists(path, inspectionRoot) || isFileShapedTracedPath(path))
1121
1130
  : tracedPathsRaw;
1122
- const declaredNewPaths = goalDocument === null ? new Set<string>() : new Set(declaredNewFilePaths(goalDocument));
1131
+ const declaredNewPaths = (() => {
1132
+ if (goalDocument === null) return new Set<string>();
1133
+ try {
1134
+ return new Set(declaredNewFilePaths(goalDocument));
1135
+ } catch (error) {
1136
+ goalParseFailure ??= { checkName: 'goal-new-paths', message: oneLineConfidenceFailureDetail(error) };
1137
+ return new Set<string>();
1138
+ }
1139
+ })();
1123
1140
  const invalidTracedPaths: Array<{ path: string; reason: 'occupied-new' | 'not-file' | 'missing' | 'inaccessible' }> = inspectionRoot
1124
1141
  ? authoredTracedPaths.flatMap<{ path: string; reason: 'occupied-new' | 'not-file' | 'missing' | 'inaccessible' }>((path) => {
1125
1142
  const occupation = tracedPathOccupation(path, inspectionRoot);
@@ -1315,7 +1332,8 @@ export function decideAskPreflight(
1315
1332
  ...(recentChangesUnknownReason ? { recentChangesUnknownReason } : {}),
1316
1333
  });
1317
1334
  const missingTracedPathBlockers: LaunchPreflightBlocker[] = [
1318
- ...(hasAuthoredGoal && authoredTracedPaths.length === 0 ? [{
1335
+ // ⛔ 해석 실패를 「traced path 0」으로 한 번 더 뭉개지 않는다 — 그건 다른 갈래다.
1336
+ ...(hasAuthoredGoal && authoredTracedPaths.length === 0 && goalParseFailure === undefined ? [{
1319
1337
  kind: 'missing-traced-path' as const,
1320
1338
  name: '최종 골의 TRACED PATHS 경로 0',
1321
1339
  detail: '정리 후 보존된 traced 경로가 없다 — 실제 파일 또는 유효한 신설: 파일 경로를 골에 선언해야 발사할 수 있다',
@@ -1347,16 +1365,29 @@ export function decideAskPreflight(
1347
1365
  checkName: 'goal-read',
1348
1366
  targetPath: resolvedGoalFile,
1349
1367
  }] : [];
1368
+ const goalParseBlockers: LaunchPreflightBlocker[] = goalParseFailure ? [{
1369
+ kind: 'goal-unreadable',
1370
+ name: `골 문서 해석 실패: ${opts.goalFile}`,
1371
+ detail: `${goalParseFailure.checkName} 검사가 골 문서를 해석하지 못했다(${goalParseFailure.message}) — 골 판독 실패(goal-unreadable)도 traced path 오류(missing-traced-path)도 아닌 별개 갈래다 · 어느 검사가 막았는지는 checkName 이 가른다 — 골의 TRACED PATHS · 신설: 문면을 바로잡아야 한다`,
1372
+ reasonCode: 'goal-parse' as const,
1373
+ checkName: goalParseFailure.checkName,
1374
+ targetPath: resolvedGoalFile,
1375
+ }] : [];
1350
1376
  const decisionResult = {
1351
1377
  ...result,
1352
- blockers: [...result.blockers, ...missingTracedPathBlockers, ...goalReadBlockers],
1378
+ // ⛔ 해석 실패를 「대상 경로 0」 문면으로 덮지 않는다 — 사유 코드가 이미 그 자리를 말한다.
1379
+ blockers: [
1380
+ ...result.blockers.filter((blocker) => goalParseFailure === undefined || blocker.kind !== 'no-target-paths'),
1381
+ ...missingTracedPathBlockers, ...goalParseBlockers, ...goalReadBlockers,
1382
+ ],
1353
1383
  warnings: [...result.warnings, ...askMarkerWarnings],
1354
1384
  runningRunsConfidenceAppendix: runningRunsConfidence.appendix,
1355
1385
  };
1356
1386
  emittedAskMarkerObservations.add(decisionResult);
1357
1387
  return {
1358
1388
  result: decisionResult,
1359
- shouldLaunch: missingTracedPathBlockers.length === 0 && goalReadBlockers.length === 0 && (result.blockers.length === 0 || force),
1389
+ shouldLaunch: missingTracedPathBlockers.length === 0 && goalParseBlockers.length === 0 && goalReadBlockers.length === 0
1390
+ && (result.blockers.length === 0 || force),
1360
1391
  plannedBranchResolution,
1361
1392
  };
1362
1393
  }
@@ -451,6 +451,7 @@ export async function runSelfOrchestrateCliCommand(
451
451
  await recordRoundPrs(results);
452
452
  results = await superviseRun({
453
453
  initial: results,
454
+ knowhowRepo: deps.repositoryRoot ?? process.cwd(),
454
455
  // The add-repair-task branch below runs each authored review-oscillation repair goal as that goal's new
455
456
  // feature (a fresh piece, same goal id) — the supervisor records the repair text, so a second oscillation stops.
456
457
  repairGoalExecution: true,
@@ -1520,6 +1520,7 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
1520
1520
  ...(disp?.ok !== undefined ? { ok: disp.ok } : {}),
1521
1521
  ...(disp?.prUrl ? { prUrl: disp.prUrl } : {}),
1522
1522
  ...(disp?.prNumber !== undefined ? { prNumber: disp.prNumber } : {}),
1523
+ ...(disp?.goalPlanRevision ? { goalPlanRevision: disp.goalPlanRevision } : {}),
1523
1524
  ...(disp?.merged !== undefined ? { merged: disp.merged } : {}),
1524
1525
  ...(disp?.checkedHeadCommit ? { checkedHeadCommit: disp.checkedHeadCommit } : {}),
1525
1526
  ...(disp?.selfReview ? { selfReview: disp.selfReview } : {}),