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
@@ -50,6 +50,8 @@ export type GoalAuthorClarificationAnswerSource = 'injected' | 'recommended' | '
50
50
  export interface GoalAuthorClarificationProvenance {
51
51
  source: GoalAuthorClarificationAnswerSource;
52
52
  evidence?: string[];
53
+ assumption?: string;
54
+ assumptionSource?: 'resolver' | 'policy-default' | 'recommended';
53
55
  }
54
56
 
55
57
  export interface GoalAuthorClarificationResponse {
@@ -81,7 +83,7 @@ export interface GoalAuthorSelfResolutionContext {
81
83
  }
82
84
 
83
85
  export type GoalAuthorSelfResolution =
84
- | { answer: string; evidence: readonly string[]; declined?: undefined }
86
+ | { answer: string; evidence: readonly string[]; assumption?: string; declined?: undefined }
85
87
  | { answer?: undefined; evidence?: undefined; declined?: boolean };
86
88
 
87
89
  export interface GoalAuthorClarificationResolutionDeps {
@@ -125,8 +127,8 @@ function truncateAsk(ask: string): string {
125
127
  function selfResolutionPrompt(context: GoalAuthorSelfResolutionContext): string {
126
128
  return [
127
129
  'Answer this goal-author clarification using only the supplied repository evidence.',
128
- 'Do not delegate to an implementation agent. If the evidence cannot justify one single-line answer, return {"answer":null}.',
129
- 'Return JSON only: {"answer":"..."} or {"answer":null}.',
130
+ 'Do not delegate to an implementation agent. Choose the best supported candidate and state the assumption that makes it the best fit. If the evidence cannot justify one answer, return {"answer":null}.',
131
+ 'Return JSON only: {"answer":"...","assumption":"..."} or {"answer":null}.',
130
132
  ...(context.ask?.trim() ? [`Request being authored:\n${truncateAsk(context.ask.trim())}`] : []),
131
133
  `Question: ${context.question}`,
132
134
  `Options: ${context.options.join(' | ') || '(free input)'}`,
@@ -195,22 +197,31 @@ export async function defaultGoalAuthorSelfResolve(
195
197
  return context.questionId === 'preservation_contract' ? { declined: true } : {};
196
198
  }
197
199
  const controller = new AbortController();
200
+ const prompt = selfResolutionPrompt(context);
201
+ let rejectTimeout!: (reason: Error) => void;
202
+ const timeoutPromise = new Promise<never>((_, reject) => { rejectTimeout = reject; });
198
203
  const timeout = setTimeout(
199
- () => controller.abort(new Error(SELF_RESOLUTION_TIMEOUT_MESSAGE)),
204
+ () => {
205
+ const error = new Error(SELF_RESOLUTION_TIMEOUT_MESSAGE);
206
+ controller.abort(error);
207
+ rejectTimeout(error);
208
+ },
200
209
  selfResolutionTimeoutMs(deps.timeoutMs),
201
210
  );
202
- const prompt = selfResolutionPrompt(context);
203
211
  const onUsage = (usage: LLMUsage) => { usages.push(usage); };
204
212
  try {
205
- const result = await (deps.stream ?? (async (input, signal, reportUsage) => {
206
- const { streamLLM } = await import('../llm.js');
207
- return streamLLM([{ role: 'user', content: input }], () => {}, {
208
- model: process.env.ELANOUS_GOAL_AUTHOR_MODEL || tierModel('better'),
209
- reasoningEffort: 'high',
210
- signal,
211
- onUsage: reportUsage,
212
- });
213
- }))(prompt, controller.signal, onUsage);
213
+ const result = await Promise.race([
214
+ (deps.stream ?? (async (input, signal, reportUsage) => {
215
+ const { streamLLM } = await import('../llm.js');
216
+ return streamLLM([{ role: 'user', content: input }], () => {}, {
217
+ model: process.env.ELANOUS_GOAL_AUTHOR_MODEL || tierModel('better'),
218
+ reasoningEffort: 'high',
219
+ signal,
220
+ onUsage: reportUsage,
221
+ });
222
+ }))(prompt, controller.signal, onUsage),
223
+ timeoutPromise,
224
+ ]);
214
225
  let parsed: unknown;
215
226
  try {
216
227
  parsed = JSON.parse(result);
@@ -222,11 +233,15 @@ export async function defaultGoalAuthorSelfResolve(
222
233
  ? (parsed as { answer?: unknown }).answer
223
234
  : undefined;
224
235
  if (typeof answer === 'string') {
236
+ const assumptionValue = (parsed as { assumption?: unknown }).assumption;
237
+ const assumption = typeof assumptionValue === 'string' && assumptionValue.trim()
238
+ ? assumptionValue.trim()
239
+ : undefined;
225
240
  observeSelfResolve('self-resolve-answered', context, startedAt, {
226
241
  answerLength: answer.length,
227
242
  usage: deriveUsage(usages),
228
243
  });
229
- return { answer, evidence: context.evidence };
244
+ return { answer, evidence: context.evidence, ...(assumption ? { assumption } : {}) };
230
245
  }
231
246
  observeSelfResolve('self-resolve-unanswered', context, startedAt, {
232
247
  reason: answer === null ? 'declined' : 'shape-mismatch',
@@ -281,7 +296,11 @@ function responseFor(clarification: IntakeClarification, observe = false, selfRe
281
296
  ...deferredResponse(clarification),
282
297
  answer: automaticAnswer,
283
298
  status: 'ANSWERED',
284
- provenance: { source: 'recommended' },
299
+ provenance: {
300
+ source: 'recommended',
301
+ assumption: '저작기가 표시한 단일 recommended 후보를 우선 선택하는 정책을 적용한다',
302
+ assumptionSource: 'recommended',
303
+ },
285
304
  };
286
305
  }
287
306
 
@@ -331,11 +350,17 @@ export async function resolveGoalAuthorClarification(
331
350
  if (!answer || /[\r\n]/.test(answer) || evidence.length === 0) {
332
351
  return deterministic;
333
352
  }
353
+ const resolverAssumption = 'assumption' in resolution ? resolution.assumption?.trim() : undefined;
354
+ const assumption = resolverAssumption
355
+ || `정책 가정(resolver가 별도 가정을 생략함): 제공 근거와 요청에 가장 맞는 후보를 선택한다 (${answer})`;
334
356
  const response: GoalAuthorClarificationResponse = {
335
357
  ...deferredResponse(clarification),
336
358
  answer,
337
359
  status: 'ANSWERED',
338
- provenance: { source: 'self-authored', evidence },
360
+ provenance: {
361
+ source: 'self-authored', evidence, assumption,
362
+ assumptionSource: resolverAssumption ? 'resolver' : 'policy-default',
363
+ },
339
364
  };
340
365
  observeGoalAuthor('goal-author.clarify', 'self-answered', {
341
366
  questionId: clarification.questionId,
@@ -407,31 +432,58 @@ function parseRecord(raw: string): SerializedGoalAuthorClarification | null {
407
432
  && Array.isArray(provenance.evidence)
408
433
  && provenance.evidence.length > 0
409
434
  && provenance.evidence.every((item) => typeof item === 'string' && item.length > 0);
435
+ const selfAuthoredAssumption = typeof provenance?.assumption === 'string' && provenance.assumption.trim()
436
+ ? provenance.assumption.trim()
437
+ : undefined;
410
438
  const response = isSelfAuthored
411
439
  ? {
412
440
  ...deferredResponse(value.clarification),
413
441
  answer: value.response.answer!,
414
442
  status: 'ANSWERED' as const,
415
- provenance: { source: 'self-authored' as const, evidence: provenance.evidence },
443
+ provenance: {
444
+ source: 'self-authored' as const,
445
+ evidence: provenance.evidence,
446
+ ...(selfAuthoredAssumption ? { assumption: selfAuthoredAssumption } : {}),
447
+ ...(provenance.assumptionSource === 'resolver' || provenance.assumptionSource === 'policy-default'
448
+ ? { assumptionSource: provenance.assumptionSource }
449
+ : {}),
450
+ },
416
451
  }
417
452
  : expected;
418
453
  const responseProvenance = response.provenance;
419
454
  const serializedProvenance = value.response.provenance;
420
455
  const expectedProvenanceKeys = responseProvenance === undefined
421
456
  ? []
422
- : responseProvenance.evidence === undefined ? ['source'] : ['evidence', 'source'];
457
+ : [
458
+ ...(responseProvenance.assumption === undefined ? [] : ['assumption']),
459
+ ...(responseProvenance.assumptionSource === undefined ? [] : ['assumptionSource']),
460
+ ...(responseProvenance.evidence === undefined ? [] : ['evidence']),
461
+ 'source',
462
+ ];
423
463
  const serializedProvenanceKeys = serializedProvenance === undefined
424
464
  ? []
425
465
  : Object.keys(serializedProvenance).sort();
466
+ // Older serialized goal rows predate assumption provenance. Keep accepting those rows while
467
+ // still validating every field they actually contain; parsing upgrades them to the current
468
+ // deterministic response shape above.
469
+ const legacyAssumptionKeys = responseProvenance?.source === 'recommended'
470
+ ? ['assumption', 'assumptionSource']
471
+ : [];
472
+ const provenanceKeysMatch = (serializedProvenanceKeys.length === expectedProvenanceKeys.length
473
+ && expectedProvenanceKeys.every((key) => serializedProvenanceKeys.includes(key)))
474
+ || (legacyAssumptionKeys.length > 0
475
+ && expectedProvenanceKeys.filter((key) => !legacyAssumptionKeys.includes(key)).every((key) => serializedProvenanceKeys.includes(key))
476
+ && serializedProvenanceKeys.every((key) => expectedProvenanceKeys.includes(key)));
426
477
  const provenanceMatches = (serializedProvenance === undefined) === (responseProvenance === undefined)
427
- && serializedProvenanceKeys.length === expectedProvenanceKeys.length
428
- && serializedProvenanceKeys.every((key, index) => key === expectedProvenanceKeys[index])
478
+ && provenanceKeysMatch
429
479
  && serializedProvenance?.source === responseProvenance?.source
430
480
  && (responseProvenance?.evidence === undefined
431
481
  ? serializedProvenance?.evidence === undefined
432
482
  : Array.isArray(serializedProvenance?.evidence)
433
483
  && serializedProvenance.evidence.length === responseProvenance.evidence.length
434
- && serializedProvenance.evidence.every((item, index) => item === responseProvenance.evidence?.[index]));
484
+ && serializedProvenance.evidence.every((item, index) => item === responseProvenance.evidence?.[index]))
485
+ && (serializedProvenance?.assumption === undefined || serializedProvenance.assumption === responseProvenance?.assumption)
486
+ && (serializedProvenance?.assumptionSource === undefined || serializedProvenance.assumptionSource === responseProvenance?.assumptionSource);
435
487
  if (value.response.questionId !== response.questionId
436
488
  || value.response.answer !== response.answer
437
489
  || value.response.status !== response.status
@@ -469,6 +521,21 @@ export interface GoalDocumentClarification {
469
521
  provenanceLines?: number[];
470
522
  }
471
523
 
524
+ export type GoalClarificationDecisionCategory = 'money' | 'security' | 'irreversible';
525
+
526
+ /** Only questions that could authorize money, security, or irreversible external effects need a decision card. */
527
+ export function goalClarificationDecisionCategory(
528
+ clarification: Pick<GoalDocumentClarification, 'header' | 'question' | 'options'>,
529
+ ): GoalClarificationDecisionCategory | undefined {
530
+ const text = [clarification.header, clarification.question, ...clarification.options.flatMap((option) => [option.label, option.description])]
531
+ .join(' ')
532
+ .toLocaleLowerCase();
533
+ if (/\b(payment|purchase|spend|budget|credit|charge|price|cost|paid)\b|결제|구매|지출|예산|크레딧|과금|가격|비용/.test(text)) return 'money';
534
+ if (/\b(security|credential|token|secret|password|authorization|authentication|permission|access control)\b|보안|자격 증명|토큰|비밀키|비밀번호|인가|인증|권한/.test(text)) return 'security';
535
+ if (/\b(publish|publication|deploy|send|delete|release|irreversible|external side effect|production)\b|발행|게시|배포|전송|삭제|릴리스|되돌릴 수 없|외부 효과|운영 환경/.test(text)) return 'irreversible';
536
+ return undefined;
537
+ }
538
+
472
539
  interface GoalAuthorClarificationSeed {
473
540
  ask: string;
474
541
  parent: GoalAuthorParent;
@@ -576,6 +643,17 @@ export function parseGoalDocumentClarifications(document: string): GoalDocumentC
576
643
  readingOptions = false;
577
644
  continue;
578
645
  }
646
+ const provenanceAssumption = /^ - provenance\.assumption: (.*)$/.exec(line);
647
+ if (provenanceAssumption) {
648
+ provenanceLines.push(index);
649
+ readingOptions = false;
650
+ continue;
651
+ }
652
+ if (/^ - provenance\.assumption-source: (resolver|policy-default|recommended)$/.test(line)) {
653
+ provenanceLines.push(index);
654
+ readingOptions = false;
655
+ continue;
656
+ }
579
657
  if (/^ - evidence: /.test(line)) {
580
658
  provenanceLines.push(index);
581
659
  readingOptions = false;
@@ -747,6 +825,7 @@ export async function selfAnswerGoalDocumentClarifications(
747
825
  evidence?: readonly string[];
748
826
  resolver?: GoalClarificationSelfResolver;
749
827
  runId?: string;
828
+ skipQuestionIds?: ReadonlySet<string>;
750
829
  },
751
830
  ): Promise<{ document: string; asked: number; answered: number; unanswered: number; newlyAnswered: number }> {
752
831
  const clarifications = parseGoalDocumentClarifications(document);
@@ -761,7 +840,7 @@ export async function selfAnswerGoalDocumentClarifications(
761
840
  const evidence = options.evidence ?? document.split(/\r?\n/)
762
841
  .filter((line) => /^(?:\s*- (?:\[code:|\[document:|TRACED PATHS|evidence:|Evidence:)|\s*-?\s*`?(?:src|test|scripts)\/[^\s`]+:\d+)/i.test(line))
763
842
  .slice(0, 40);
764
- for (const item of pending) {
843
+ for (const item of pending.filter((entry) => !options.skipQuestionIds?.has(entry.questionId))) {
765
844
  if (parseGoalDocumentClarifications(updated).filter((entry) => entry.questionId === item.questionId).length !== 1) continue;
766
845
  let response: Awaited<ReturnType<typeof resolveGoalAuthorClarification>>;
767
846
  let declined = false;
@@ -789,7 +868,9 @@ export async function selfAnswerGoalDocumentClarifications(
789
868
  if (response.answer === null && item.questionId === 'preservation_contract'
790
869
  && declined) {
791
870
  const fallback = preservationDefault(options.ask ?? document);
792
- response = { ...response, answer: fallback.answer, status: 'ANSWERED', provenance: { source: 'default' } };
871
+ response = { ...response, answer: fallback.answer, status: 'ANSWERED', provenance: {
872
+ source: 'default', assumption: '기존 공개 동작 보존을 기본 가정으로 적용한다', assumptionSource: 'policy-default',
873
+ } };
793
874
  defaultExportCount = fallback.exportCount;
794
875
  }
795
876
  if (response.answer === null || (response.provenance?.source !== 'self-authored' && response.provenance?.source !== 'default')
@@ -806,6 +887,8 @@ export async function selfAnswerGoalDocumentClarifications(
806
887
  lines[answerLine] = ` - answer: ${response.answer}`;
807
888
  lines.splice(answerLine + 1, 0,
808
889
  ` - provenance.source: ${answerSource}`,
890
+ ...(response.provenance.assumption ? [` - provenance.assumption: ${response.provenance.assumption.replace(/[\r\n]/g, ' ')}`] : []),
891
+ ...(response.provenance.assumptionSource ? [` - provenance.assumption-source: ${response.provenance.assumptionSource}`] : []),
809
892
  ...(response.provenance.evidence ?? []).map((entry) => ` - evidence: ${entry.replace(/[\r\n]/g, ' ')}`));
810
893
  updateWhatToBuildRenderAnswers(lines, item.questionId, response.answer);
811
894
  if (hasWhatToBuildUnansweredRenderAnswer(lines, item.questionId)) continue;
@@ -836,6 +919,77 @@ export async function selfAnswerGoalDocumentClarifications(
836
919
  return { document: updated, asked, answered, unanswered, newlyAnswered };
837
920
  }
838
921
 
922
+ /** SelfImplement boundary: resolve pending questions itself and record a bounded policy assumption if that fails.
923
+ * Interactive callers must not turn an authoring clarification into a human popup. */
924
+ export async function selfAnswerOrAssumeGoalDocumentClarifications(
925
+ document: string,
926
+ options: Parameters<typeof selfAnswerGoalDocumentClarifications>[1],
927
+ ): Promise<Awaited<ReturnType<typeof selfAnswerGoalDocumentClarifications>> & {
928
+ assumed: number;
929
+ decisionRequired: Array<{ questionId: string; header: string; question: string; category: GoalClarificationDecisionCategory }>;
930
+ }> {
931
+ const safetyQuestions = parseGoalDocumentClarifications(document).filter((entry) => !entry.answered)
932
+ .map((entry) => ({ entry, category: goalClarificationDecisionCategory(entry) }))
933
+ .filter((item): item is { entry: GoalDocumentClarification; category: GoalClarificationDecisionCategory } => item.category !== undefined);
934
+ const attempted = await selfAnswerGoalDocumentClarifications(document, {
935
+ ...options,
936
+ skipQuestionIds: new Set(safetyQuestions.map((item) => item.entry.questionId)),
937
+ });
938
+ let updated = attempted.document;
939
+ let assumed = 0;
940
+ const decisionRequired: Array<{ questionId: string; header: string; question: string; category: GoalClarificationDecisionCategory }> =
941
+ safetyQuestions.map(({ entry, category }) => ({ questionId: entry.questionId, header: entry.header, question: entry.question, category }));
942
+ for (const item of parseGoalDocumentClarifications(updated).filter((entry) => !entry.answered)) {
943
+ const category = goalClarificationDecisionCategory(item);
944
+ if (category) continue;
945
+ const offered = item.options.filter((option) => option.label.trim() && !/[\r\n]/.test(option.label));
946
+ const useOfferedOption = !item.includeOther && offered.length > 0;
947
+ const answer = useOfferedOption
948
+ ? offered[0]!.label.trim()
949
+ : '근거가 부족하므로 요청에 명시된 범위만 진행한다고 가정한다';
950
+ const assumption = useOfferedOption
951
+ ? '자가 해소가 답을 내지 못해 자유 답변 없이 제시된 첫 후보를 정책 가정으로 선택했다'
952
+ : '자가 해소가 답을 내지 못해 추가 범위를 만들지 않고 요청에 명시된 범위만 진행한다고 가정했다';
953
+ try {
954
+ const current = findUnansweredGoalDocumentClarification(updated, item.questionId);
955
+ const lines = updated.split(/\r?\n/);
956
+ const provenanceLines = current.provenanceLines ?? [];
957
+ for (const line of [...provenanceLines].sort((left, right) => right - left)) lines.splice(line, 1);
958
+ const answerLine = current.answerLine - provenanceLines.filter((line) => line < current.answerLine).length;
959
+ lines[answerLine] = ` - answer: ${answer}`;
960
+ lines.splice(answerLine + 1, 0,
961
+ ' - provenance.source: default',
962
+ ` - provenance.assumption: ${assumption}`,
963
+ ' - provenance.assumption-source: policy-default',
964
+ );
965
+ updateWhatToBuildRenderAnswers(lines, item.questionId, answer);
966
+ if (hasWhatToBuildUnansweredRenderAnswer(lines, item.questionId)) continue;
967
+ const candidate = lines.join(updated.includes('\r\n') ? '\r\n' : '\n');
968
+ if (!parseGoalDocumentClarifications(candidate).some((entry) => entry.questionId === item.questionId
969
+ && entry.answered && entry.answer === answer && entry.provenanceSource === 'default')) continue;
970
+ updated = candidate;
971
+ assumed += 1;
972
+ observeGoalAuthor('goal-author.clarify', 'self-answer-assumed', {
973
+ runId: options.runId ?? process.env.ELANOUS_RUN_ID,
974
+ questionId: item.questionId,
975
+ assumptionSource: 'policy-default',
976
+ selectedOfferedOption: useOfferedOption,
977
+ });
978
+ } catch {
979
+ // Keep the pending question visible to the caller as a no-launch reason; never dispatch it to a popup.
980
+ }
981
+ }
982
+ return {
983
+ ...attempted,
984
+ document: updated,
985
+ answered: attempted.answered + assumed,
986
+ unanswered: Math.max(0, attempted.unanswered - assumed),
987
+ newlyAnswered: attempted.newlyAnswered + assumed,
988
+ assumed,
989
+ decisionRequired,
990
+ };
991
+ }
992
+
839
993
 
840
994
  export type ClarificationIntakeMode = 'none' | 'deferred-noninteractive' | 'ask';
841
995
 
@@ -471,6 +471,7 @@ export function createGoalAuthorDecomposeSteps(
471
471
  config: {
472
472
  adversarialReview?: boolean;
473
473
  adversarialReviewSource?: 'cli' | 'default' | 'unknown';
474
+ goalId?: string;
474
475
  recentStepCounts?: readonly number[];
475
476
  onSizedSlices?: (slices: SizedSlice[], redecomposed: number) => void;
476
477
  repositoryRoot?: string;
@@ -589,38 +590,46 @@ export function createGoalAuthorDecomposeSteps(
589
590
  return parsed ? { sizes: parsed, sizeSource: 'planner-estimate' as const }
590
591
  : { sizes: deriveGoalSliceSizes(slices), sizeSource: 'derived' as const };
591
592
  };
592
- const observe = (event: 'slice-sized' | 'slice-oversize', sizeSource: 'planner-estimate' | 'derived', data: Record<string, unknown>) => {
593
+ const observe = (event: 'slice-sized' | 'slice-oversize' | 'resplit' | 'slice-oversize-unavoidable', sizeSource: 'planner-estimate' | 'derived', data: Record<string, unknown>) => {
593
594
  try { debug.log('goal-author.decompose', event, { surface: 'goal-author', sizeSource, ...data,
594
595
  ...(options?.runId === undefined ? {} : { runId: options.runId }) }); } catch { /* observation is fail-soft */ }
595
596
  };
596
597
  let redecomposed = 0;
597
598
  let measured = await measure(candidate);
598
599
  let sizes = measured.sizes;
599
- if (sizes) observe('slice-sized', measured.sizeSource, { retry: 0, slices: sizes });
600
- const oversized = sizes?.flatMap((size, index) => size.tier === 'high' ? [index] : []) ?? [];
601
- if (oversized.length || !sizes) {
602
- observe('slice-oversize', measured.sizeSource, { retry: 0, indexes: oversized,
600
+ for (let retry = 0; ; retry++) {
601
+ if (sizes) observe('slice-sized', measured.sizeSource, { retry, slices: sizes });
602
+ const oversized = sizes?.flatMap((size, index) => size.tier === 'high' ? [index] : []) ?? [];
603
+ if (sizes && oversized.length === 0) break;
604
+ observe('slice-oversize', measured.sizeSource, { retry, indexes: oversized,
603
605
  reasons: sizes ? oversized.map((index) => sizes![index]!.unavoidableReason) : [],
604
606
  ...(sizes ? {} : { error: 'size metadata missing or inconsistent' }) });
607
+ if (retry === 2) {
608
+ if (!sizes) throw new Error('goal-author slice sizing: size metadata missing after 2 resplits');
609
+ const unavoidableReason = 'auto';
610
+ for (const index of oversized) sizes[index] = { ...sizes[index]!,
611
+ unavoidableReason: sizes[index]!.unavoidableReason ?? unavoidableReason };
612
+ observe('slice-oversize-unavoidable', measured.sizeSource, {
613
+ goalId: options?.goalId ?? config.goalId ?? null,
614
+ resplitCount: redecomposed,
615
+ slices: oversized.map((index) => ({ index, ...sizes![index]! })),
616
+ });
617
+ break;
618
+ }
619
+ observe('resplit', measured.sizeSource, { retry: retry + 1, indexes: oversized,
620
+ ...(sizes ? {} : { reason: 'size metadata missing or inconsistent' }) });
605
621
  const retryAsk = [objective, '', 'The previous goal-author proposal had missing size metadata or oversized slices.',
606
622
  `PREVIOUS_STEPS_JSON: ${JSON.stringify(candidate)}`,
607
623
  `OVERSIZED_INDEXES_JSON: ${JSON.stringify(oversized)}`,
608
- 'Regenerate the full plan once. Preserve fitting slices and split each oversized slice into dependent low/medium slices where possible.',
609
- 'If an oversized slice truly cannot split, leave it high and state a concrete unavoidable reason.'].join('\n');
624
+ `RESPLIT_ATTEMPT: ${retry + 1} of 2. Regenerate the full plan; preserve fitting slices and split every oversized slice into dependent low/medium slices. If any oversized slice remains after the second resplit, keep it as high tier; a concrete unavoidable reason is optional because the system marks it unavoidable=auto.`].join('\n');
610
625
  const regenerated = await decompose(retryAsk);
611
626
  if (!regenerated.length) throw new Error('goal-author slice sizing: regeneration produced no slices');
612
- redecomposed = 1;
627
+ redecomposed++;
613
628
  candidate = ensureDeviceFirstSteps(objective, regenerated, config.repositoryRoot).steps;
614
629
  rationale = decompositionRationale;
615
630
  measured = await measure(candidate);
616
631
  sizes = measured.sizes;
617
- if (!sizes) throw new Error('goal-author slice sizing: size metadata missing after one retry');
618
- observe('slice-sized', measured.sizeSource, { retry: 1, slices: sizes });
619
- const remaining = sizes.flatMap((size, index) => size.tier === 'high' ? [index] : []);
620
- if (remaining.length) observe('slice-oversize', measured.sizeSource, { retry: 1, indexes: remaining,
621
- reasons: remaining.map((index) => sizes![index]!.unavoidableReason) });
622
- if (remaining.some((index) => !sizes![index]!.unavoidableReason))
623
- throw new Error('goal-author slice sizing: high slice lacks unavoidable reason after one retry');
632
+ if (!sizes && retry === 1) throw new Error('goal-author slice sizing: size metadata missing after 2 resplits');
624
633
  }
625
634
  config.onSizedSlices?.(restoreSlicePaths(publicSizedSlices(candidate, sizes), objective), redecomposed);
626
635
  return finalize(candidate, rationale);
@@ -39,7 +39,7 @@ export function resolveGoalAuthorGrade(flag?: GoalAuthorGrade, configured?: unkn
39
39
  import type { ObserveOnlySource } from './observe-only.js';
40
40
  import type { Question } from '../ask-user-question/types.js';
41
41
  import { requestTestScenario as defaultRequestTestScenario, type TestScenarioRequestInput, type TestScenarioRequestResult } from './test-scenario-request.js';
42
- import { resolveGoalAuthorClarification, parseGoalDocumentClarifications, serializeGoalAuthorParent, type GoalAuthorClarificationResponse, type GoalAuthorParent, type GoalAuthorSelfResolution } from './goal-author-clarification.js';
42
+ import { defaultGoalAuthorSelfResolve, resolveGoalAuthorClarification, parseGoalDocumentClarifications, serializeGoalAuthorParent, type GoalAuthorClarificationResponse, type GoalAuthorParent, type GoalAuthorSelfResolution } from './goal-author-clarification.js';
43
43
  import { acquireLockSync } from '../storage/file-lock.js';
44
44
  import { createRepositoryReferencedFileReader, type ReferencedFileReadResult } from './goal-file-reader.js';
45
45
  import { extractGoalDocSections, type GoalDocSourceLine } from './goal-doc/section.js';
@@ -58,6 +58,9 @@ import { parseReleaseNoteSection } from '../release-loop/release-note.js';
58
58
  import { declaredNewFilePaths } from './goal-new-paths.js';
59
59
  import { classifyGoalCommandExecution, type GoalCommandExecutionResult } from './goal-command-execution.js';
60
60
  import { identityLines, repositoryIdentifiers } from './goal-author-identity.js';
61
+ import { selectRelevantAuthoringLessons } from './knowhow-pack.js';
62
+ import { elanousStateRoot } from '../autopilot/state-paths.js';
63
+ export { selectRelevantAuthoringLessons } from './knowhow-pack.js';
61
64
  export { formatSubmittedAt } from './goal-author-identity.js';
62
65
  import { hasUnmetRequirementOutsidePreservationClause } from './goal-author-preservation-obligation.js';
63
66
  export { hasUnmetRequirementOutsidePreservationClause } from './goal-author-preservation-obligation.js';
@@ -114,13 +117,17 @@ export interface GoalAuthorDeps {
114
117
  /** Optional externally decomposed plan steps rendered verbatim into the authored goal; the author never generates them. */
115
118
  steps?: readonly string[];
116
119
  /** Optional injected decomposition seam; omitted means authoring never invokes an LLM or decomposition. */
117
- decomposeSteps?: (objective: string, opts?: { context?: string; runId?: string }) => Promise<readonly string[]>;
120
+ decomposeSteps?: (objective: string, opts?: { context?: string; runId?: string; goalId?: string }) => Promise<readonly string[]>;
118
121
  /** Optional launch preflight result supplied by the caller; authoring never reads the ledger or logs itself. */
119
122
  launchPreflight?: LaunchPreflightResult;
120
123
  /** Optional in-process notification for each authored-goal phase transition. */
121
124
  onProgress?: (phase: GoalAuthorPhase, event: 'start' | 'end') => void;
122
125
  /** AUTHOR-TIMEBOX: budget for the `ground` phase. Omitted means `GOAL_AUTHOR_GROUND_TIMEBOX_MS`. */
123
126
  groundTimeboxMs?: number;
127
+ /** Stable IDs of bounded lessons carried as goal-head provenance. */
128
+ authoringLessonIds?: readonly string[];
129
+ /** Bounded prior lessons rendered as explicitly non-normative authoring context. */
130
+ authoringLessons?: string;
124
131
  }
125
132
 
126
133
  export type GoalAuthorGroundingPath = 'groundMissionInCodebase';
@@ -501,7 +508,7 @@ export function linesOutsideFencedCode(document: string): GoalDocSourceLine[] {
501
508
  return outside;
502
509
  }
503
510
 
504
- /** TA 완료 경계는 기존 정식 절 안의 세 독립 행이다. 원문에 없는 값을 저작기가 만들지 않는다. */
511
+ /** TA 완료 경계는 정식 절 안의 세 독립 행이다. 명시 행은 보존하고 누락 행은 태스크 넘김이 범위 기반 초안으로 보충한다. */
505
512
  export const GOAL_DONE_BOUNDARY_LABELS = ['완료 경계 코드', '완료 경계 실물', '완료 경계 증거 명령'] as const;
506
513
  export type GoalDoneBoundaryLabel = typeof GOAL_DONE_BOUNDARY_LABELS[number];
507
514
  // This is a declaration check, not a judgement of whether the proposed work
@@ -603,6 +610,39 @@ export function explicitGoalDoneBoundaryLines(ask: string): string[] {
603
610
  return GOAL_DONE_BOUNDARY_LABELS.flatMap((label) => values[label] ? [`- ${label}: ${values[label]}`] : []);
604
611
  }
605
612
 
613
+ /**
614
+ * A live hand must not silently drop a cell just because its prose omitted the three
615
+ * completion lines. Preserve explicit values and draft only the missing lines from
616
+ * declared target paths; the child can refine this visible draft against the ask.
617
+ */
618
+ export function draftMissingGoalDoneBoundary(document: string, targetPaths: readonly string[]): {
619
+ document: string;
620
+ added: GoalDoneBoundaryLabel[];
621
+ } {
622
+ const { values, missing } = inspectGoalDoneBoundary(document);
623
+ if (missing.length === 0) return { document, added: [] };
624
+
625
+ const scope = targetPaths.length > 0 ? targetPaths.join(' · ') : '요청 문면에 적힌 범위';
626
+ const explicitTests = targetPaths.filter((path) => /\.(?:test|spec)\.[cm]?[jt]sx?$/i.test(path));
627
+ const inferredTests = targetPaths.flatMap((path) => {
628
+ const match = /^(.*)\.([cm]?[jt]sx?)$/i.exec(path);
629
+ return match && !/\.(?:test|spec)$/i.test(match[1]!) ? [`${match[1]}.test.${match[2]}`] : [];
630
+ });
631
+ const evidencePaths = explicitTests.length > 0 ? explicitTests : inferredTests;
632
+ const quotePath = (path: string): string => /^[A-Za-z0-9_./:=@%+-]+$/.test(path) ? path : `'${path.replaceAll("'", `'\\''`)}'`;
633
+ const evidenceCommand = evidencePaths.length > 0
634
+ ? `bun test ${evidencePaths.map(quotePath).join(' ')}`
635
+ : 'bun test';
636
+ const drafts: Record<GoalDoneBoundaryLabel, string> = {
637
+ '완료 경계 코드': `자동 초안: ${scope}에 문면의 요청 동작을 구현하고 대상 밖의 기본 동작은 보존한다.`,
638
+ '완료 경계 실물': `자동 초안: 격리 시험에서 ${scope}의 생산 경로를 지나 요청 동작과 기존 동작을 함께 관측한다.`,
639
+ '완료 경계 증거 명령': evidenceCommand,
640
+ };
641
+ const lines = missing.map((label) => `- ${label}: ${drafts[label]}`);
642
+ const separator = document.length === 0 || document.endsWith('\n') ? '' : '\n';
643
+ return { document: `${document}${separator}${lines.join('\n')}`, added: missing };
644
+ }
645
+
606
646
  // CommonMark 펜스는 **한 종류의 문자**가 3개 이상 이어진 런이다 — `[`~]{3,}` 는 혼합(백틱+틸드)까지
607
647
  // 펜스로 인정해 진짜 진양성을 펜스 안으로 숨긴다(리뷰 must-fix). 열기/닫기 모두 이 하나를 쓴다.
608
648
  const FENCE_RUN = /^ {0,3}(`{3,}|~{3,})(.*)$/;
@@ -2908,6 +2948,21 @@ const INJECTION_LADDER: Record<InjectionLadderLevel, string> = {
2908
2948
  const VERIFICATION_MENU_DOC = join('docs', 'goal-context', '03-verification-menu.md');
2909
2949
  const MOCK_CATALOG_DOC = join('docs', 'goal-context', '04-mock-scenarios.md');
2910
2950
 
2951
+ /**
2952
+ * 새 무대의 식별자 — 카탈로그 `MS-xx` 가 없는 골도 «어느 무대인지»를 원장에 남긴다.
2953
+ *
2954
+ * ⛔ 0.2.38 실측(`GOAL-TDD-PLAN-REACHES-CHILD`): 카탈로그가 맞지 않는 골(표본 대부분)에서
2955
+ * `stage.id` 가 `null` 이었고, 그래서 `verification-plan` 이벤트의 `stageId` 칸이 비어
2956
+ * 원장만 보고는 ***「무대가 없었다」와 「무대를 안 적었다」를 가를 수 없었다.***
2957
+ * ⭐ 값은 «실제로 고른 갈래»에서 나온다 — 화면 무대(L2) · 기록된 실제 입력 fixture(L1) · 문서 문구 대조(L1).
2958
+ * ⇒ 같은 골을 두 번 저작하면 같은 id 가 나오고, 다른 갈래는 다른 id 를 갖는다.
2959
+ */
2960
+ const NEW_STAGE_IDS = {
2961
+ 'ux-sim': 'new-stage:ux-sim',
2962
+ fixture: 'new-stage:fixture',
2963
+ 'doc-phrase': 'new-stage:doc-phrase',
2964
+ } as const;
2965
+
2911
2966
  /** 저장소 안의 검증 메뉴·무대 카탈로그를 읽는다. 없으면 null(저작은 «새 무대»로 내려간다). */
2912
2967
  export function readVerificationMenuDocs(root: string | undefined): { menu: string | null; catalog: string | null } {
2913
2968
  const read = (relativePath: string): string | null => {
@@ -3064,7 +3119,7 @@ export function authorVerificationPlan(input: VerificationPlanInput): Verificati
3064
3119
  : `bun test ${testFile}`;
3065
3120
  const base = (input.targetPaths.find((path) => !/\.test\./u.test(path)) ?? testFile).split('/').pop()!.replace(/\.[^.]+$/u, '');
3066
3121
  const name = screen ? `${base} ux-sim 고정 입력` : `${base} 기록된 실제 입력 fixture`;
3067
- stage = { source: 'new-stage', id: null, level };
3122
+ stage = { source: 'new-stage', id: screen ? NEW_STAGE_IDS['ux-sim'] : NEW_STAGE_IDS.fixture, level };
3068
3123
  stageLine = `- ② 무대: 새 무대: ${name} — \`${command}\` · ${level} (${INJECTION_LADDER[level]})${input.catalog ? ' · 카탈로그(04-mock-scenarios.md)에 맞는 MS 없음' : ' · 카탈로그 문서 없음'}${operationalNote}`;
3069
3124
  }
3070
3125
  const docOnly = input.targetPaths.length > 0 && input.targetPaths.every((path) => /\.md$/iu.test(path));
@@ -3073,7 +3128,7 @@ export function authorVerificationPlan(input: VerificationPlanInput): Verificati
3073
3128
  const docs = input.targetPaths.join(' ');
3074
3129
  const phrase = (/`([^`]+)`/u.exec(behaviour)?.[1] ?? behaviour.replace(/[`'"]/gu, '').slice(0, 30)).trim();
3075
3130
  const check = `rg -n -F '${phrase.replace(/'/gu, '’')}' ${docs}`;
3076
- stage = { source: 'new-stage', id: null, level: 'L1' };
3131
+ stage = { source: 'new-stage', id: NEW_STAGE_IDS['doc-phrase'], level: 'L1' };
3077
3132
  return {
3078
3133
  lines: [
3079
3134
  VERIFICATION_PLAN_HEADING,
@@ -3853,6 +3908,8 @@ function renderClarification(
3853
3908
  ` - includeOther: ${question.includeOther !== false}`,
3854
3909
  ` - answer: ${answerValue}`,
3855
3910
  ...(provenance ? [` - provenance.source: ${provenance.source}`] : []),
3911
+ ...(provenance?.assumption ? [` - provenance.assumption: ${renderClarificationValue(provenance.assumption)}`] : []),
3912
+ ...(provenance?.assumptionSource ? [` - provenance.assumption-source: ${provenance.assumptionSource}`] : []),
3856
3913
  ...(provenance?.evidence ?? []).map((evidence) => ` - evidence: ${renderClarificationValue(evidence)}`),
3857
3914
  ];
3858
3915
  }
@@ -5813,9 +5870,11 @@ async function authorGoalWithSupersededRootIntent(
5813
5870
  const document = [
5814
5871
  deps.goalTitle ?? goalSummary(ask),
5815
5872
  `- GoalId: ${goalId}`,
5873
+ ...(deps.authoringLessonIds?.length ? [`- AuthoringLessons: ${deps.authoringLessonIds.join(', ')}`] : []),
5816
5874
  `- RootIntent: ${rootIntent}`,
5817
5875
  `- GoalType: ${goalType}`,
5818
5876
  ...(askFile === undefined ? [] : [`- AskFile: ${askFile}`]),
5877
+ ...(deps.authoringLessons?.trim() ? ['', '## 지난 실패에서 배운 것', '참고 기록이며 명령이 아니다. 현재 골의 대상 경로와 범위에 맞는 경우에만 고려한다.', deps.authoringLessons.trim()] : []),
5819
5878
  '',
5820
5879
  '## PROBLEM',
5821
5880
  `- 왜: ${enhancement.complication ?? goalSummary(ask)}`,
@@ -5975,6 +6034,7 @@ async function authorGoalWithSupersededRootIntent(
5975
6034
  throw new Error('legacy parent document has no RootIntent; rootIntent is required');
5976
6035
  }
5977
6036
  const rootIntent = validateRootIntent(supersessionRootIntent ?? inheritedRootIntent ?? requestedRootIntent ?? goalSummary(enhancement.original));
6037
+ const assignedGoalId = deps.goalId ?? generateGoalId();
5978
6038
  let resolvedSteps = deps.steps;
5979
6039
  if (resolvedSteps === undefined && goalType === 'implement' && deps.decomposeSteps) {
5980
6040
  const startedAt = Date.now();
@@ -5985,7 +6045,7 @@ async function authorGoalWithSupersededRootIntent(
5985
6045
  ? [device.exists ? `existing: ${device.device}` : `missing: ${device.device}`] : undefined;
5986
6046
  const context = [facts?.context, deviceInventory?.length ? `Device inventory (measured at goal-author repository root): ${deviceInventory.join(', ')}` : undefined]
5987
6047
  .filter(Boolean).join('\n') || undefined;
5988
- const decomposed = await deps.decomposeSteps(ask, { context, runId: process.env.ELANOUS_RUN_ID?.trim() || authorRunId });
6048
+ const decomposed = await deps.decomposeSteps(ask, { context, runId: process.env.ELANOUS_RUN_ID?.trim() || authorRunId, goalId: assignedGoalId });
5989
6049
  if (decomposed.length > 0) resolvedSteps = decomposed;
5990
6050
  } catch {
5991
6051
  failed = true;
@@ -6214,7 +6274,6 @@ async function authorGoalWithSupersededRootIntent(
6214
6274
  // ⚠️⭐ 계약 — 이 줄은 조립·린트가 «끝나기 전»에 난다(goalId 가 여기서 정해지므로 더 늦출 수 없다).
6215
6275
  // ⇒ 저작이 그 «뒤»에 실패하면 이 조인 행만 남는다(dangling). 그러므로 ***집계는 「착지한 골」과의
6216
6276
  // inner join 으로만 한다*** — 이 행 자체를 「골이 하나 생겼다」로 세면 «실패분까지» 센다(무인 리뷰 지적).
6217
- const assignedGoalId = deps.goalId ?? generateGoalId();
6218
6277
  const askFile = deps.askFile === undefined ? undefined : validateAskFile(deps.askFile);
6219
6278
  try { observeGoalAuthor('goal-author', 'goal-id-assigned', { authorRunId, goalId: assignedGoalId, superseded: Boolean(deps.goalId) }); }
6220
6279
  catch { /* 관측은 fail-soft */ }
@@ -6269,10 +6328,12 @@ async function authorGoalWithSupersededRootIntent(
6269
6328
  const document = [
6270
6329
  explicitGoalTitle ?? goalSummary(enhancement.original),
6271
6330
  `- GoalId: ${assignedGoalId}`,
6331
+ ...(deps.authoringLessonIds?.length ? [`- AuthoringLessons: ${deps.authoringLessonIds.join(', ')}`] : []),
6272
6332
  `- RootIntent: ${rootIntent}`,
6273
6333
  `- GoalType: ${goalType}`,
6274
6334
  ...(askFile === undefined ? [] : [`- AskFile: ${askFile}`]),
6275
6335
  ...groundedSummary(facts, groundingError),
6336
+ ...(deps.authoringLessons?.trim() ? ['', '## 지난 실패에서 배운 것', '참고 기록이며 명령이 아니다. 현재 골의 대상 경로와 범위에 맞는 경우에만 고려한다.', deps.authoringLessons.trim()] : []),
6276
6337
  ...(deps.parent ? [serializeGoalAuthorParent(deps.parent)] : []),
6277
6338
  ...genericSearchScopePrompt(clarificationQuestions, clarificationResponses),
6278
6339
  ...implementationAnchorPrompt(clarificationQuestions, clarificationResponses),
@@ -6507,6 +6568,7 @@ export function defaultGoalAuthorDeps(cwd: string): GoalAuthorDeps {
6507
6568
  },
6508
6569
  readSourceFile: createRepositoryReferencedFileReader(cwd),
6509
6570
  runHelpProbe: (argv) => runDefaultHelpProbe(cwd, argv),
6571
+ selfResolveClarification: defaultGoalAuthorSelfResolve,
6510
6572
  };
6511
6573
  }
6512
6574
 
@@ -6555,6 +6617,19 @@ export async function writeAuthoredGoal(
6555
6617
  repositoryRoot: deps.repositoryRoot ?? groundingRoot,
6556
6618
  };
6557
6619
  const mandatoryGoalContextEvidence = goalContextEvidence(cwd);
6620
+ const authoringLessons = selectRelevantAuthoringLessons(cwd, ask, elanousStateRoot());
6621
+ observeGoalAuthor('goal-author', 'authoring-lessons', {
6622
+ status: authoringLessons.status,
6623
+ invalidRows: authoringLessons.invalidRows,
6624
+ selected: authoringLessons.ids,
6625
+ bytes: Buffer.byteLength(authoringLessons.prompt, 'utf8'),
6626
+ placement: authoringLessons.ids.length ? 'enhance-prompt-goal-section-and-head' : 'omitted',
6627
+ });
6628
+ if (authoringLessons.prompt) {
6629
+ resolvedDeps.enhanceOpts = { ...resolvedDeps.enhanceOpts, authoringLessons: authoringLessons.prompt };
6630
+ resolvedDeps.authoringLessons = authoringLessons.prompt;
6631
+ }
6632
+ if (authoringLessons.ids.length) resolvedDeps.authoringLessonIds = authoringLessons.ids;
6558
6633
  const directoryMeasurement = askDirectoryMeasurementLine(observeAskDirectoryCounts(ask, groundingRoot));
6559
6634
  resolvedDeps.enhanceOpts = directoryMeasurement ? { ...resolvedDeps.enhanceOpts, directoryMeasurement } : resolvedDeps.enhanceOpts;
6560
6635
  observeGoalAuthor('goal-author', 'ask-directory-measurement-forwarded', { count: directoryMeasurement ? 1 : 0 });
@@ -10,6 +10,28 @@ export interface GoalDocSourceLine {
10
10
  readonly start: number;
11
11
  }
12
12
 
13
+ /** Parse the command on a goal's authored decision-signal Condition line. */
14
+ function authoredSignalCommandFromCondition(condition: string | undefined): string | undefined {
15
+ if (!condition?.trim()) return undefined;
16
+ return condition.trim()
17
+ .replace(/^`([^`]+)`(?=\s|를|$)/, '$1')
18
+ .replace(/\s*를\s*실행한다[.。]?$/, '')
19
+ .replace(/[.。]$/, '')
20
+ .trim();
21
+ }
22
+
23
+ export function authoredSignalCommandFromBody(value: string): string | undefined {
24
+ return authoredSignalCommandFromCondition(value.match(/^\s*- Condition:\s*(.+?)\s*$/m)?.[1]);
25
+ }
26
+
27
+ export function authoredSignalCommandFromGoal(goal: string): string | undefined {
28
+ const lines = goal.split(/\r?\n/);
29
+ const start = lines.findIndex((line) => line.trim() === '## 판정 신호');
30
+ if (start < 0) return undefined;
31
+ const next = lines.findIndex((line, index) => index > start && /^##\s/.test(line));
32
+ return authoredSignalCommandFromBody(lines.slice(start + 1, next < 0 ? lines.length : next).join('\n'));
33
+ }
34
+
13
35
  type GoalDocSectionOptions =
14
36
  | {
15
37
  readonly search: 'exact-trimmed-line';