elanous 0.2.38 → 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 (615) 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/{RrjXTwz-urRAbChP1bX02 → HjeK7zONHfR7op1hKXp4k}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{7954.4f7a8832663ee979.js → 1060.014f1f01a17aec26.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/{8911.bf5e712acb25fb6c.js → 1281.d81877e35b9068f4.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/{2104.70e086d5174a4736.js → 1350.59f40e39e02d91b1.js} +1 -1
  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/2047.8f23e210995d4548.js +2 -0
  16. package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/{1632.7d87f998e714bede.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/{8019.21ca554a821dad01.js → 2177.df8547f9d7215c4e.js} +3 -3
  20. package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/{3528.e4b8ab70d339f965.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/{6493.27ad77de7aac7966.js → 2499.02fbfd18126c10c0.js} +1 -1
  24. package/apps/pwa/out/_next/static/chunks/{7628.6b16863ac3972333.js → 2522.f2766b76d22c8bdf.js} +1 -1
  25. package/apps/pwa/out/_next/static/chunks/{3086.fb14b60ce98b53d3.js → 2566.beaffc3a5e1fcd2e.js} +1 -1
  26. package/apps/pwa/out/_next/static/chunks/{9299.24e2a7d9b6d1f91b.js → 261.0d471e8aded799f3.js} +3 -3
  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/2774-719820e3f5b2a3eb.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/2829-734fe8bf2eee7347.js +1 -0
  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/{7524.ce973525d30b3d52.js → 3330.7443183b7e6fdbdf.js} +1 -1
  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/{3124-561f7f037943cde2.js → 3746-f80a78f220bf37b5.js} +1 -1
  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/{bb6987f9.3647e1a23b0e3217.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/{8994d93e.33ba491f95345fc2.js → 409c787b.e48c5bec8ec10456.js} +1 -1
  49. package/apps/pwa/out/_next/static/chunks/{5041-5aada92ca215ffdd.js → 413-24c8284bda08241d.js} +1 -1
  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/{5638.107314dc479e2f37.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/{8487.291666583bebe640.js → 4769.9fd582071301f382.js} +1 -1
  58. package/apps/pwa/out/_next/static/chunks/{8509.3a54d4e61893d7cb.js → 483.725e4a61be922788.js} +1 -1
  59. package/apps/pwa/out/_next/static/chunks/{9fe1b809.738da85c8b17e3fb.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/{8879.ac06755bcf3e44a1.js → 5383.bdfa5d886e39a826.js} +1 -1
  64. package/apps/pwa/out/_next/static/chunks/{6142.913b44e260a3f925.js → 5436.fdf6fa8ae3e9588d.js} +1 -1
  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/{7161-8f22db3ec5ed005e.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/{3291.f6c1005387d514bd.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/{5203.51e5d8b5f1dcfe53.js → 6749.0744ce6eb08d40e9.js} +3 -3
  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/{1938.0e6c60ee91c4d7f5.js → 6908.06008c67f6380ea9.js} +2 -2
  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/{de8b930d.d94c0f42acf807fc.js → 6cc1d1d6.9a98dd4622f1afc6.js} +1 -1
  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/{1026-44010f405704050c.js → 8272-025653884f9645d2.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/{5307.d7328020227880c2.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/{4199-f7c6eb40cd0322f8.js → 8639-92c11d069792429e.js} +1 -1
  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/9175.2de5209a5ce6f68a.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9184.45afbf44fec87574.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{eaad0cba.771200940c529df7.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-866aac5ff226a7f3.js → page-ba957ff875a026a0.js} +1 -1
  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-4edb8df90f4537ce.js +1 -0
  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-fca2e59a81744d9e.js +1 -0
  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-139d722de1dcd6c1.js +1 -0
  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-ccde99f07aaf71f7.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/{b7478fef.5917716286213fcc.js → b84cad00.594027ebe0531fe2.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/{b7459770.6539b11860eb8a9c.js → ca3702f8.2913182e73889fa2.js} +7 -7
  177. package/apps/pwa/out/_next/static/chunks/{3f0de3de-2340c532c00395db.js → d5d3cefc-373c4eb722ed848b.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/{89d6c04f-6b8ab341748e468a.js → d8de0de2-dd0f4ac8e5ab1832.js} +1 -1
  179. package/apps/pwa/out/_next/static/chunks/{framework-4b12a946f352cee2.js → framework-002b472a66935d31.js} +1 -1
  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/video/explainer-line.yaml +4 -1
  282. package/package.json +1 -1
  283. package/scripts/dead-code/report.ts +169 -0
  284. package/scripts/lib/morning-report-options.ts +3 -4
  285. package/scripts/lib/tui-regress-evidence.ts +56 -0
  286. package/scripts/morning-report.ts +5 -1
  287. package/scripts/public-export.ts +15 -7
  288. package/scripts/release-loop/export-check-node.ts +21 -3
  289. package/scripts/release-loop/gate-node.ts +379 -48
  290. package/scripts/release-loop/gate-shard-dispatch.ts +128 -0
  291. package/scripts/release-loop/gate-shard-receipts.ts +89 -0
  292. package/scripts/release-loop/gate-wall.ts +5 -5
  293. package/scripts/release-loop/preflight.ts +6 -2
  294. package/scripts/release-loop/resume-release.ts +20 -5
  295. package/scripts/release-loop/resume.ts +48 -0
  296. package/scripts/release-loop/version-node.ts +7 -2
  297. package/scripts/release-story/draft.ts +1 -1
  298. package/scripts/research-bench/README.md +53 -0
  299. package/scripts/research-bench/questions.json +66 -0
  300. package/scripts/research-bench/rubric.md +33 -0
  301. package/scripts/research-bench/run.ts +523 -0
  302. package/scripts/tui-regress.ts +85 -10
  303. package/src/acp/core-turn-bridge.ts +8 -0
  304. package/src/agent/autonomous-tools.ts +10 -3
  305. package/src/agent/monad-agent-turn.ts +4 -1
  306. package/src/agent/registry.ts +26 -2
  307. package/src/agent/shared-app-tools.ts +1 -1
  308. package/src/agent/surface-ux/build.ts +12 -3
  309. package/src/agent/surface-ux/types.ts +1 -1
  310. package/src/agent/task-notification.ts +75 -6
  311. package/src/agent/types.ts +3 -0
  312. package/src/agent-mission/driver.ts +29 -3
  313. package/src/agent-mission/mission-cli.ts +2 -1
  314. package/src/agent-substrate/review-context-pack.ts +365 -0
  315. package/src/agent-substrate/self-review-cli.ts +226 -17
  316. package/src/ask-user-question/index.ts +6 -0
  317. package/src/ask-user-question/inline-resolver.ts +49 -0
  318. package/src/auto-research/question-ladder-contract.ts +22 -3
  319. package/src/auto-research/research-turn.ts +350 -17
  320. package/src/autopilot/agent-loop.ts +1 -1
  321. package/src/autopilot/pty-control-loop.ts +8 -1
  322. package/src/boot/daemon-tools/index.ts +4 -3
  323. package/src/boot/daemon-tools/self-implement.ts +270 -2
  324. package/src/boot/daemon-tools/types.ts +2 -0
  325. package/src/budget/llm-cost.ts +44 -5
  326. package/src/budget/unified-usage.ts +17 -1
  327. package/src/capture/tui-self-report.ts +14 -0
  328. package/src/chat/index.ts +33 -7
  329. package/src/cli/agent-cli.ts +43 -8
  330. package/src/cli/intake-cli.ts +22 -1
  331. package/src/cli/lesson-cli.ts +19 -3
  332. package/src/cli/log-event-names.ts +1 -0
  333. package/src/cli/pod-cli.ts +17 -2
  334. package/src/cli/pty-takeover-cli.ts +67 -7
  335. package/src/cli/release-cli.ts +52 -6
  336. package/src/cli/repo-cli.ts +2 -1
  337. package/src/cli/tasks-cli.ts +36 -9
  338. package/src/control-plane/ledger.ts +21 -4
  339. package/src/core-turn/run-core-turn.ts +44 -3
  340. package/src/core-turn/run-goal-loop.ts +152 -8
  341. package/src/core-turn/types.ts +9 -0
  342. package/src/dashboard/chat/acp-chat.ts +2 -2
  343. package/src/dashboard/classic-sigquit.ts +16 -0
  344. package/src/dashboard/index.ts +321 -27
  345. package/src/dashboard/input/chat-main-interaction-opts.ts +3 -0
  346. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +7 -2
  347. package/src/dashboard/input/chat-main-slash-command.ts +7 -0
  348. package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
  349. package/src/dashboard/input/dashboard-priority-key-route.ts +21 -5
  350. package/src/dashboard/input/external-input-host.ts +2 -0
  351. package/src/dashboard/sidetab-runtime.ts +228 -0
  352. package/src/dashboard/slash-runtime/ask-clarification.ts +7 -1
  353. package/src/dashboard/slash-runtime/dashboard-handlers.ts +20 -8
  354. package/src/dashboard/slash-runtime/help-from-registry.ts +2 -2
  355. package/src/dashboard/term-slash-runtime.ts +16 -18
  356. package/src/dashboard/turn-preamble.ts +2 -0
  357. package/src/domains/knowledge.ts +1 -1
  358. package/src/esc-abort-gate.ts +33 -1
  359. package/src/execution-loop/launch-gate.ts +206 -1
  360. package/src/graph-runner/graph-cli.ts +6 -4
  361. package/src/graph-runner/runner.ts +31 -9
  362. package/src/graph-wizard/generate.ts +16 -7
  363. package/src/graph-wizard/mission-compose.ts +201 -0
  364. package/src/grok/agent-search.ts +8 -2
  365. package/src/grok/credential.ts +5 -0
  366. package/src/grounding/ref-index.ts +11 -0
  367. package/src/grounding/ref-vector.ts +61 -0
  368. package/src/grounding/sources-cli.ts +2 -2
  369. package/src/grounding/sources.ts +15 -1
  370. package/src/harness/harness-cli-command.ts +38 -9
  371. package/src/harness/harness-pod-dispatch.ts +7 -1
  372. package/src/index.ts +18 -4
  373. package/src/input/external-input-queue.ts +10 -0
  374. package/src/intake-plane/collect-telegram-saved.ts +36 -1
  375. package/src/intake-plane/intake-to-tasks.ts +246 -3
  376. package/src/lessons/friction-ledger.ts +154 -0
  377. package/src/live-supply/collector.ts +149 -0
  378. package/src/live-supply/probes.ts +52 -0
  379. package/src/live-supply/snapshot.ts +40 -0
  380. package/src/llm.ts +431 -76
  381. package/src/loops/orchestrator/tick.ts +8 -0
  382. package/src/nexus/api/harness-api.ts +2 -1
  383. package/src/pty/snapshot.py +132 -0
  384. package/src/pty-shell/pty-control-ipc.ts +29 -2
  385. package/src/pty-shell/pty-manifest.ts +59 -3
  386. package/src/pty-shell/registry.ts +2 -0
  387. package/src/pty-shell/tui-run-state.ts +80 -3
  388. package/src/release-loop/gate-host-reservation.ts +13 -4
  389. package/src/release-loop/gate-shard-ledger.ts +68 -0
  390. package/src/release-loop/merged-pr-checklist.ts +25 -2
  391. package/src/release-loop/rehearsal-shard-plan.ts +6 -1
  392. package/src/release-loop/rehearsal.ts +27 -0
  393. package/src/research/edge-decision.ts +124 -15
  394. package/src/research/gap-followup.ts +249 -0
  395. package/src/research/lenses/counter-evidence.ts +100 -0
  396. package/src/research/lenses/working-backwards.ts +89 -0
  397. package/src/research/plugin-discovery.ts +242 -0
  398. package/src/research-bridge/invoke.ts +4 -2
  399. package/src/research-bridge/types.ts +2 -0
  400. package/src/self-dev/ask-launch-flow.ts +34 -106
  401. package/src/self-dev/dev-cli.ts +2 -0
  402. package/src/self-dev/dev-pipeline.ts +8 -4
  403. package/src/self-dev/graph-journey-route.ts +10 -2
  404. package/src/self-dev/launch-preflight-text.ts +2 -2
  405. package/src/self-dev/launch-preflight.ts +38 -7
  406. package/src/self-dev/orchestrate-cli.ts +1 -0
  407. package/src/self-dev/run-supervisor.ts +19 -0
  408. package/src/self-implement/device-first.ts +8 -2
  409. package/src/self-implement/doctor-visit.ts +76 -58
  410. package/src/self-implement/gate-artifacts.ts +3 -0
  411. package/src/self-implement/gate-baseline.ts +75 -4
  412. package/src/self-implement/gate-cli.ts +317 -9
  413. package/src/self-implement/gate-receipt-registry.ts +180 -0
  414. package/src/self-implement/gate-remote.ts +145 -22
  415. package/src/self-implement/goal-author-clarification.ts +178 -24
  416. package/src/self-implement/goal-author-decompose.ts +24 -15
  417. package/src/self-implement/goal-author.ts +9 -5
  418. package/src/self-implement/host-regate.ts +120 -45
  419. package/src/self-implement/impl-findings-feedback.ts +188 -0
  420. package/src/self-implement/knowhow-pack.ts +189 -10
  421. package/src/self-implement/off-diff-evidence.ts +124 -0
  422. package/src/self-implement/orchestrator.ts +85 -7
  423. package/src/self-implement/run-ledger.ts +46 -8
  424. package/src/self-implement/run-stop.ts +12 -0
  425. package/src/self-implement/seams.ts +6 -3
  426. package/src/self-implement/self-implement-cli.ts +4 -2
  427. package/src/session/chat.ts +89 -15
  428. package/src/session-runtime/provider-circuit.ts +140 -0
  429. package/src/shell-runner/file-engine.ts +1 -0
  430. package/src/shell-runner/types.ts +4 -0
  431. package/src/sidetab-core/model.ts +176 -0
  432. package/src/skills/tools/schedule-wakeup.ts +23 -1
  433. package/src/skills/tools/shell.ts +51 -5
  434. package/src/steward/directive-audit.ts +354 -0
  435. package/src/surface/child-process.ts +31 -0
  436. package/src/surface/tui-stderr-owner.ts +48 -0
  437. package/src/task-agent/cover.ts +30 -12
  438. package/src/task-agent/judge.ts +56 -0
  439. package/src/task-agent/postland-card.ts +35 -2
  440. package/src/task-agent/rejudge-on-head.ts +46 -2
  441. package/src/task-agent/repair-cycle.ts +1 -1
  442. package/src/task-agent/task-hand.ts +129 -24
  443. package/src/task-agent/tier-split.ts +105 -21
  444. package/src/task-orchestrator/surfaces/pod-command-job.ts +330 -2
  445. package/src/task-orchestrator/surfaces/pod-config-snapshot.ts +123 -0
  446. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +27 -2
  447. package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +11 -8
  448. package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +1 -1
  449. package/src/task-orchestrator/surfaces/pod-source-receive.ts +74 -6
  450. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +2 -1
  451. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +56 -15
  452. package/src/task-orchestrator/surfaces/self-implement-pod.ts +186 -33
  453. package/src/tool-runtime/skill-exec-runtime.ts +95 -5
  454. package/src/tui/entry.ts +15 -2
  455. package/src/tui/inline-choice.ts +188 -0
  456. package/src/tui/sidetab/list.ts +2 -176
  457. package/src/tui/slash/term.ts +12 -1
  458. package/src/tui-client/dashboard-session.ts +7 -1
  459. package/src/user-config.ts +34 -4
  460. package/src/ux-sim/classic-tui-seat-scenarios.ts +1 -7
  461. package/src/ux-sim/fake-land-queue.ts +88 -0
  462. package/src/ux-sim/gate-shard-host-reroute.ts +82 -0
  463. package/src/ux-sim/goal-interim-trace.ts +24 -0
  464. package/src/ux-sim/next-tui-seat-scenarios.ts +8 -13
  465. package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +4 -1
  466. package/src/version/packed-revision.json +1 -1
  467. package/src/video-pipeline/recipes/explainer.ts +54 -2
  468. package/src/web-search/grok.ts +32 -6
  469. package/src/web-search/index.ts +8 -7
  470. package/src/workflow-runtime/node-catalog.ts +53 -4
  471. package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +0 -27
  472. package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +0 -1
  473. package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +0 -1
  474. package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +0 -1
  475. package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +0 -1
  477. package/apps/pwa/out/_next/static/chunks/1923-5c1695332240246a.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +0 -1
  479. package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +0 -93
  481. package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +0 -104
  482. package/apps/pwa/out/_next/static/chunks/2415.738b777642a02233.js +0 -1
  483. package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +0 -1
  486. package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +0 -1
  487. package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +0 -1
  490. package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +0 -24
  492. package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +0 -1
  493. package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +0 -36
  494. package/apps/pwa/out/_next/static/chunks/3341-f09b9efbd7a82f70.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +0 -1
  496. package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +0 -287
  498. package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +0 -94
  504. package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +0 -1
  510. package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +0 -32
  514. package/apps/pwa/out/_next/static/chunks/4804.6012b5cd33c22792.js +0 -90
  515. package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +0 -79
  517. package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +0 -74
  520. package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/5255-1b60d50eabe9f057.js +0 -1
  522. package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +0 -286
  523. package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +0 -8
  527. package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +0 -1
  531. package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/7000.28157393caaf5343.js +0 -62
  539. package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/7488.966b116789f3d41a.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +0 -77
  544. package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +0 -149
  554. package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +0 -41
  555. package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +0 -24
  556. package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/9581.da63ddf41acfad46.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +0 -2
  560. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/intake/page-c348a3959c5b5fc6.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d1d1210f99f620ae.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/app/outputs/page-291ab19fe2acb173.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/app/share/page-a9d9a3e66459c1e0.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/app/term/page-6b140f77593576eb.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +0 -1
  615. /package/apps/pwa/out/_next/static/{RrjXTwz-urRAbChP1bX02 → HjeK7zONHfR7op1hKXp4k}/_ssgManifest.js +0 -0
@@ -97,6 +97,7 @@ export function remoteSelfGateArgv(input: {
97
97
  shardConcurrency?: number;
98
98
  fixedShardDistribution?: boolean;
99
99
  includeImporters?: boolean;
100
+ noInherit?: boolean;
100
101
  artifactDir?: string;
101
102
  }, sha: (ref: string) => string): string[] {
102
103
  const shards = input.shards ?? (input.includeImporters ? 2 : undefined);
@@ -106,6 +107,7 @@ export function remoteSelfGateArgv(input: {
106
107
  ...(input.shardConcurrency !== undefined ? ['--shard-concurrency', String(input.shardConcurrency)] : []),
107
108
  ...(input.fixedShardDistribution ? ['--fixed-shard-distribution'] : []),
108
109
  ...(input.includeImporters ? ['--include-importers'] : []),
110
+ ...(input.noInherit ? ['--no-inherit'] : []),
109
111
  ...(input.artifactDir ? ['--artifact-dir', input.artifactDir] : [])];
110
112
  }
111
113
 
@@ -131,6 +133,8 @@ export function decideGateDispatch(input: { flags: Pick<GateRemoteFlags, 'remote
131
133
 
132
134
  export const SLOT_DIR = '/tmp/elanous-gate-remote-slots';
133
135
  const BUSY = '__GATE_REMOTE_BUSY';
136
+ const HEARTBEAT = '__GATE_REMOTE_HEARTBEAT=';
137
+ const REMOTE_RUN_LIMIT_SECONDS = 105 * 60;
134
138
 
135
139
  /** Shell lines that run "$W/run.sh" under the first free of `cap` slot locks, or print the busy marker and exit 98.
136
140
  * run.sh must create "$W/started" first: that is how a lock refusal is told apart from the run's own exit code. */
@@ -138,14 +142,14 @@ export type SlotLockTool = 'flock' | 'lockf';
138
142
  const SLOT_LOCK = { flock: 'flock -n', lockf: 'lockf -k -s -t 0' } as const;
139
143
 
140
144
  /** `tools` is the preference order (default: Linux flock, then BSD/macOS lockf); a test can pin one path. */
141
- function hostSlotScriptWithSlot(cap: number, dir: string, tools: readonly SlotLockTool[], passSlot: boolean): string[] {
145
+ function hostSlotScriptWithSlot(cap: number, dir: string, tools: readonly SlotLockTool[], passSlot: boolean, supervised = false): string[] {
142
146
  const n = Math.min(MAX_HOST_CAP, Math.max(1, Math.floor(cap)));
143
147
  const pick = tools.map((tool, i) => `${i ? 'elif' : 'if'} command -v ${tool} >/dev/null 2>&1; then GL="${SLOT_LOCK[tool]}"; `).join('');
144
148
  return [
145
149
  `GS=${quote(dir)}; mkdir -p "$GS" || infra slots`,
146
150
  `${pick}else infra lock-tool; fi`,
147
151
  'load1() { if [ -r /proc/loadavg ]; then awk \'NR==1 {print $1}\' /proc/loadavg; elif command -v sysctl >/dev/null 2>&1; then sysctl -n vm.loadavg 2>/dev/null | awk \'{gsub(/[{}]/, ""); print $1}\'; else echo unknown; fi; }',
148
- `n=1; while [ $n -le ${n} ]; do $GL "$GS/slot$n" ${passSlot ? 'env GATE_REMOTE_SLOT="$n" ' : ''}sh "$W/run.sh"; s=$?; [ -f "$W/started" ] && exit $s; n=$((n+1)); done`,
152
+ `n=1; while [ $n -le ${n} ]; do $GL "$GS/slot$n" ${passSlot ? 'env GATE_REMOTE_SLOT="$n" ' : ''}sh "$W/${supervised ? 'supervise.sh' : 'run.sh'}"; s=$?; ${supervised ? '[ -f "$W/supervisor-timeout" ] && infra run-timeout; [ -f "$W/supervisor-infra" ] && infra supervisor-lost; ' : ''}[ -f "$W/started" ] && exit $s; n=$((n+1)); done`,
149
153
  `echo "${BUSY}=$((n-1));load1=$(load1)" >&2; exit 98`,
150
154
  ];
151
155
  }
@@ -154,6 +158,53 @@ export function hostSlotScript(cap: number, dir = SLOT_DIR, tools: readonly Slot
154
158
  return hostSlotScriptWithSlot(cap, dir, tools, false);
155
159
  }
156
160
 
161
+ /** A slot holder owns exactly one new process group. On a lost SSH shell or wall limit it signals only that group,
162
+ * after checking its unreaped direct child's PGID. The heartbeat also detects a severed SSH output pipe while
163
+ * a silent test is running; runOnRemote removes only these transport lines from the tool's stderr. */
164
+ export function remoteSupervisorScript(limitSeconds = REMOTE_RUN_LIMIT_SECONDS): string {
165
+ const limit = Number.isSafeInteger(limitSeconds) && limitSeconds > 0 ? limitSeconds : REMOTE_RUN_LIMIT_SECONDS;
166
+ return [
167
+ '#!/bin/sh',
168
+ 'child=',
169
+ 'ready=0',
170
+ 'owned_group() {',
171
+ ' [ -n "$child" ] && kill -0 "$child" 2>/dev/null && [ "$(ps -p "$child" -o pgid= 2>/dev/null | tr -d " ")" = "$child" ] || return 1',
172
+ '}',
173
+ 'reap() {',
174
+ // Our direct child stays unreaped until the caller waits, so its PID/PGID cannot be reused here.
175
+ ' [ "$ready" -eq 1 ] && owned_group || return 0',
176
+ ' kill -TERM -- "-$child" 2>/dev/null || kill -TERM "-$child" 2>/dev/null || :',
177
+ ' sleep 2',
178
+ // The leader remains our unreaped child until the caller waits, so its PGID cannot be reused here. A TERM-ignoring
179
+ // grandchild may outlive the leader; rechecking only the leader would miss that member of the same owned group.
180
+ ' kill -KILL -- "-$child" 2>/dev/null || kill -KILL "-$child" 2>/dev/null || :',
181
+ '}',
182
+ 'trap \'reap\' HUP INT TERM EXIT',
183
+ 'perl -MPOSIX -e \'POSIX::setpgid(0,0) == 0 or die "setpgid: $!"; exec @ARGV\' sh "$W/run.sh" &',
184
+ 'child=$!',
185
+ // Set this only after spawning the worker so the worker keeps its normal SIGPIPE behavior.
186
+ 'trap \'\' PIPE',
187
+ // The SSH parent can disappear before the child has called setpgid. Wait briefly for the ownership proof first.
188
+ 'ready=0; attempt=0',
189
+ 'while [ "$attempt" -lt 20 ] && kill -0 "$child" 2>/dev/null; do',
190
+ ' if owned_group; then ready=1; break; fi',
191
+ ' attempt=$((attempt+1)); sleep 1',
192
+ 'done',
193
+ 'if [ "$ready" -eq 0 ] && kill -0 "$child" 2>/dev/null; then kill -TERM "$child" 2>/dev/null || :; wait "$child" 2>/dev/null || :; : > "$W/supervisor-infra"; exit 125; fi',
194
+ 'started=$(date +%s)',
195
+ 'while kill -0 "$child" 2>/dev/null; do',
196
+ ' if [ "$(($(date +%s) - started))" -ge ' + limit + ' ]; then reap; wait "$child" 2>/dev/null || :; : > "$W/supervisor-timeout"; exit 124; fi',
197
+ ' if ! kill -0 "$GATE_REMOTE_SSH_SHELL" 2>/dev/null; then reap; wait "$child" 2>/dev/null || :; : > "$W/supervisor-infra"; exit 125; fi',
198
+ ' if ! printf "\\n' + HEARTBEAT + '%s\\n" "$W" >&2; then reap; wait "$child" 2>/dev/null || :; : > "$W/supervisor-infra"; exit 125; fi',
199
+ ' sleep 5',
200
+ 'done',
201
+ 'wait "$child"; rc=$?',
202
+ 'trap - HUP INT TERM EXIT',
203
+ 'exit "$rc"',
204
+ '',
205
+ ].join('\n');
206
+ }
207
+
157
208
  // ── remote execution ───────────────────────────────────────────────
158
209
 
159
210
  export interface ExecResult { rc: number | null; stdout: string; stderr: string; error?: string }
@@ -217,7 +268,7 @@ export interface PayloadFile { env: string; content: string }
217
268
  export type RemoteArgv = string[] | ((sha: (ref: string) => string) => string[]);
218
269
 
219
270
  /** Build the remote shell script (exported for tests). Every setup failure ends in an INFRA marker, the tool's rc in an RC marker. */
220
- export function remoteScript(input: { mirror: string; commit: string; fetchShas: string[]; mainSha?: string; argv: string[]; installPwa: boolean; stableCheckout?: boolean; payloadFiles?: PayloadFile[]; hostCap?: number; slotDir?: string }): string {
271
+ export function remoteScript(input: { mirror: string; commit: string; fetchShas: string[]; mainSha?: string; argv: string[]; installPwa: boolean; stableCheckout?: boolean; payloadFiles?: PayloadFile[]; hostCap?: number; slotDir?: string; runLimitSeconds?: number }): string {
221
272
  const mirror = input.mirror.startsWith('~/') ? `"$HOME"/${quote(input.mirror.slice(2))}` : quote(input.mirror);
222
273
  const fetches = input.fetchShas.map((sha) => `refs/elanous/gate/${sha}:refs/elanous/gate/${sha}`).join(' ');
223
274
  const payloads = (input.payloadFiles ?? []).filter((file) => /^[A-Z_][A-Z0-9_]*$/.test(file.env));
@@ -280,11 +331,16 @@ export function remoteScript(input: { mirror: string; commit: string; fetchShas:
280
331
  'W=$(mktemp -d /var/tmp/elanous-gate-remote-XXXXXXXX) || infra mktemp',
281
332
  'export W',
282
333
  'trap \'rm -rf "$W"\' EXIT',
334
+ 'command -v perl >/dev/null 2>&1 && command -v ps >/dev/null 2>&1 || infra supervisor-tool',
335
+ 'GATE_REMOTE_SSH_SHELL=$$; export GATE_REMOTE_SSH_SHELL',
283
336
  ...payloadLines,
284
337
  `cat > "$W/run.sh" <<'${RUN}' || infra run-script`,
285
338
  ...work,
286
339
  RUN,
287
- ...hostSlotScriptWithSlot(input.hostCap ?? GATE_REMOTE_DEFAULTS.hostCap, input.slotDir ?? SLOT_DIR, ['flock', 'lockf'], !!input.stableCheckout),
340
+ 'cat > "$W/supervise.sh" <<\'__GATE_REMOTE_SUPERVISE__\' || infra supervise-script',
341
+ remoteSupervisorScript(input.runLimitSeconds),
342
+ '__GATE_REMOTE_SUPERVISE__',
343
+ ...hostSlotScriptWithSlot(input.hostCap ?? GATE_REMOTE_DEFAULTS.hostCap, input.slotDir ?? SLOT_DIR, ['flock', 'lockf'], !!input.stableCheckout, true),
288
344
  '}',
289
345
  '',
290
346
  ].join('\n');
@@ -340,11 +396,22 @@ export function runOnRemote(opts: RemoteRunOptions, runner: GateRemoteRunner = r
340
396
  env: { ...process.env, GIT_SSH_COMMAND: 'ssh -o BatchMode=yes -o ConnectTimeout=10', GIT_TERMINAL_PROMPT: '0' },
341
397
  });
342
398
  if (push.rc !== 0 || push.error) return { kind: 'infra', stage: 'push', rc: push.rc, stderr: push.stderr || push.error || '', reason: `push-failed rc=${push.rc}: ${(push.stderr || push.error || '').trim().split('\n').slice(-2).join(' | ')}` };
343
- const script = remoteScript({ mirror: opts.mirror, commit, fetchShas: shas, mainSha, argv, installPwa: opts.installPwa ?? false, stableCheckout: opts.stableCheckout, payloadFiles: opts.payloadFiles, hostCap: opts.hostCap, slotDir: opts.slotDir });
344
- const run = runner.ssh(opts.host, script, opts.timeoutMs ?? 120 * 60_000);
399
+ const sshTimeoutMs = opts.timeoutMs ?? 120 * 60_000;
400
+ const script = remoteScript({ mirror: opts.mirror, commit, fetchShas: shas, mainSha, argv, installPwa: opts.installPwa ?? false, stableCheckout: opts.stableCheckout, payloadFiles: opts.payloadFiles, hostCap: opts.hostCap, slotDir: opts.slotDir,
401
+ runLimitSeconds: Math.min(REMOTE_RUN_LIMIT_SECONDS, Math.max(1, Math.floor((sshTimeoutMs - 30_000) / 1000))) });
402
+ const run = runner.ssh(opts.host, script, sshTimeoutMs);
345
403
  // The script prints "\n<marker><rc>\n": everything before that leading newline is the tool's own stderr, byte for byte.
346
404
  const stdoutBytes = Buffer.from(run.stdout);
347
- const stderrBytes = Buffer.from(run.stderr);
405
+ const rawStderr = Buffer.from(run.stderr);
406
+ // Transport heartbeats may arrive after the RC marker when a short run races the supervisor's final poll.
407
+ // Strip only complete, run-scoped heartbeat lines as bytes so arbitrary tool stderr stays byte-identical.
408
+ const heartbeatLine = /\n__GATE_REMOTE_HEARTBEAT=\/var\/tmp\/elanous-gate-remote-[A-Za-z0-9]+\n/g;
409
+ const heartbeatRanges = [...rawStderr.toString('latin1').matchAll(heartbeatLine)].map((match) => [match.index!, match.index! + match[0].length] as const);
410
+ let previous = 0;
411
+ const kept: Buffer[] = [];
412
+ for (const [from, to] of heartbeatRanges) { kept.push(rawStderr.subarray(previous, from)); previous = to; }
413
+ kept.push(rawStderr.subarray(previous));
414
+ const stderrBytes = Buffer.concat(kept);
348
415
  const stderrText = stderrBytes.toString('utf8');
349
416
  const marker = stderrBytes.lastIndexOf(Buffer.from(`\n${RC}`));
350
417
  // Busy (98) and setup failure (97) are the script's own exits, each with its marker as the last stderr line. A completed
@@ -450,6 +517,11 @@ export interface DispatchOptions {
450
517
  reportRemoteHost?: boolean;
451
518
  /** Release gate host reservations shared by self gate and changed typecheck. */
452
519
  reservationRoot?: string;
520
+ /** Self gate only: hosts to try when the first host holds a release reservation (default: `host-e-wsl` for
521
+ * `node-b`, the same alternative the unmeasured hint names — a reservation is never a local fallback). */
522
+ reservationAltHosts?: string[];
523
+ /** Self gate only: bounded wait for the reservation release, in seconds (default: `settings.slotWaitSeconds`). */
524
+ reservationWaitSeconds?: number;
453
525
  runLocal: () => number | Promise<number>;
454
526
  /** Called once with the final remote outcome (never on a local decision), before its output passes through or the
455
527
  * local fallback runs — e.g. `self gate --artifact-dir` fetches (ran) or removes (infra) the host-side artifact dir.
@@ -469,6 +541,26 @@ export interface DispatchDeps {
469
541
  write?: { out: (data: string | Uint8Array) => void; err: (data: string | Uint8Array) => void };
470
542
  }
471
543
 
544
+ /** Hosts a reserved self gate may fall back to: an explicit list wins, otherwise `node-b` (the only host the old
545
+ * unmeasured hint named an alternative for) falls back to `host-e-wsl`. Invalid or duplicate entries are dropped. */
546
+ export function gateReservationAlternateHosts(reservedHost: string, explicit?: string[]): string[] {
547
+ const candidates = explicit ?? (reservedHost === 'node-b' ? ['host-e-wsl'] : []);
548
+ const seen = new Set<string>([reservedHost]);
549
+ const hosts: string[] = [];
550
+ for (const candidate of candidates) {
551
+ if (!candidate || seen.has(candidate) || !isValidGateHost(candidate)) continue;
552
+ seen.add(candidate);
553
+ hosts.push(candidate);
554
+ }
555
+ return hosts;
556
+ }
557
+
558
+ /** Reservation diagnostics stamp — ISO 시각 printed next to the claim owner (runId). Claims written before
559
+ * `reservedAt` existed fall back to the gate's own observation time. */
560
+ export function formatReservationStamp(ms: number): string {
561
+ return new Date(ms).toISOString();
562
+ }
563
+
472
564
  async function loadSettings(): Promise<GateRemoteSettings> {
473
565
  try {
474
566
  const { getUserConfig } = await import('../user-config.js');
@@ -498,26 +590,59 @@ export async function dispatchHeavyCheck(opts: DispatchOptions, deps: DispatchDe
498
590
  return opts.runLocal();
499
591
  }
500
592
  let host = decision.host!;
593
+ const sleep = deps.sleep ?? ((ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)));
594
+ const now = deps.now ?? Date.now;
501
595
  const reservationRoot = opts.tool === 'self-gate' || opts.tool === 'ci-typecheck-changed'
502
596
  ? opts.reservationRoot ?? (deps.runner ? undefined : gateHostReservationRoot()) : undefined;
503
597
  if (reservationRoot) {
504
598
  const reservationHost = host.split('@').at(-1)!;
505
599
  const first = inspectReleaseGateHost(reservationRoot, reservationHost);
506
600
  if (first.status !== 'free') {
507
- // Changed typecheck has a fixed node-b placement; a release reservation makes it unmeasured.
508
- const alternate = opts.tool === 'self-gate' && reservationHost === 'node-b' ? 'node-c' : null;
509
- const other = alternate ? inspectReleaseGateHost(reservationRoot, alternate) : null;
510
- if (alternate && other?.status === 'free') {
511
- debug.log('gate.remote', 'host-reserved-reroute', { from: host, to: alternate, reason: first.reason, status: first.status });
512
- write.err(`[gate.remote] ${host} reserved (${first.reason}) — using ${alternate}\n`);
513
- host = alternate;
601
+ // A reserved host is never a reason to run this check locally (반증: 예약 상태에서 --local 무거운 시험 금지).
602
+ // Self gate first tries another remote host, then waits bounded for the release, then ends unmeasured with
603
+ // the owner and the observation stamp.
604
+ const observedAt = formatReservationStamp(now());
605
+ const owner = first.runId || 'unknown';
606
+ // Owner (runId) plus 시각: the claim's own reservedAt when recorded, else the moment this gate observed it.
607
+ const stamp = first.reservedAt !== undefined
608
+ ? `reserved-at=${formatReservationStamp(first.reservedAt)}`
609
+ : `observed-at=${observedAt}`;
610
+ const alternates = opts.tool === 'self-gate'
611
+ ? gateReservationAlternateHosts(reservationHost, opts.reservationAltHosts) : [];
612
+ const alternate = alternates.find((candidate) => inspectReleaseGateHost(reservationRoot, candidate).status === 'free');
613
+ if (alternate) {
614
+ const rerouted = host.includes('@') ? `${host.slice(0, host.lastIndexOf('@'))}@${alternate}` : alternate;
615
+ debug.log('gate.remote', 'host-reserved-reroute', { tool: opts.tool, from: host, to: rerouted, owner, reason: first.reason, reservedAt: first.reservedAt, observedAt });
616
+ write.err(`[gate.remote] host-reserved: ${host} (${first.reason}) owner=${owner} ${stamp} — rerouting to ${rerouted}\n`);
617
+ host = rerouted;
514
618
  } else {
515
- const reason = `host-reserved: ${host} (${first.reason}); alternate ${alternate ?? '(none)'} ${other?.status ?? 'unavailable'}`;
516
- debug.log('gate.remote', 'host-reserved-unmeasured', { host, reason });
517
- write.err(opts.tool === 'self-gate'
518
- ? `[gate.remote] remote unmeasured on ${host} (stage=host-reserved, rc=unknown) — ${reason}\n`
519
- : `[gate.remote] remote unmeasured — ${reason}\n`);
520
- return 1;
619
+ const waitSeconds = opts.tool === 'self-gate' ? opts.reservationWaitSeconds ?? settings.slotWaitSeconds : 0;
620
+ const waitStart = now();
621
+ const deadline = waitStart + Math.max(0, waitSeconds) * 1000;
622
+ let latest = inspectReleaseGateHost(reservationRoot, reservationHost);
623
+ while (waitSeconds > 0 && latest.status !== 'free') {
624
+ const left = deadline - now();
625
+ if (left <= 0) break;
626
+ write.err(`[gate.remote] waiting for host-reserved release on ${host} — owner=${owner} ${stamp} elapsed=${Math.floor(Math.max(0, now() - waitStart) / 1000)}s/${waitSeconds}s\n`);
627
+ const before = now();
628
+ await sleep(Math.min(15_000, left));
629
+ if (now() <= before) break; // a frozen test clock must not spin past the bound
630
+ latest = inspectReleaseGateHost(reservationRoot, reservationHost);
631
+ }
632
+ const waitedMs = Math.max(0, now() - waitStart);
633
+ if (latest.status === 'free') {
634
+ debug.log('gate.remote', 'host-reserved-released', { tool: opts.tool, host, owner, waitedMs });
635
+ write.err(`[gate.remote] host-reserved released on ${host} after ${Math.floor(waitedMs / 1000)}s — proceeding remotely\n`);
636
+ } else {
637
+ const reason = `host-reserved: ${host} (${latest.reason})`;
638
+ const manualAlternative = reservationHost === 'node-b'
639
+ ? '; if available, non-PWA checks may explicitly select --remote host-e-wsl' : '';
640
+ debug.log('gate.remote', 'host-reserved-unmeasured', { host, reason, owner, reservedAt: latest.reservedAt ?? first.reservedAt, observedAt, waitedMs, alternates: alternates.length });
641
+ write.err(opts.tool === 'self-gate'
642
+ ? `[gate.remote] remote unmeasured on ${host} (stage=host-reserved, rc=unknown) — ${reason}; owner=${owner} ${stamp} waited=${Math.floor(waitedMs / 1000)}s${manualAlternative}\n`
643
+ : `[gate.remote] remote unmeasured — ${reason}\n`);
644
+ return 1;
645
+ }
521
646
  }
522
647
  }
523
648
  }
@@ -535,8 +660,6 @@ export async function dispatchHeavyCheck(opts: DispatchOptions, deps: DispatchDe
535
660
  };
536
661
  if (opts.localOnlyReason) return fallback(opts.localOnlyReason, { stage: 'reproducibility', rc: null });
537
662
  const hostCap = gateRemoteHostCap(settings, host);
538
- const sleep = deps.sleep ?? ((ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)));
539
- const now = deps.now ?? Date.now;
540
663
  const deadline = now() + settings.slotWaitSeconds * 1000;
541
664
  let waitStartedAt: number | undefined;
542
665
  const logWait = deps.log ?? ((event: string, data: Record<string, unknown>) => debug.log('gate.remote', event, data));
@@ -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