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
@@ -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';
@@ -59,6 +59,7 @@ 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
61
  import { selectRelevantAuthoringLessons } from './knowhow-pack.js';
62
+ import { elanousStateRoot } from '../autopilot/state-paths.js';
62
63
  export { selectRelevantAuthoringLessons } from './knowhow-pack.js';
63
64
  export { formatSubmittedAt } from './goal-author-identity.js';
64
65
  import { hasUnmetRequirementOutsidePreservationClause } from './goal-author-preservation-obligation.js';
@@ -116,7 +117,7 @@ export interface GoalAuthorDeps {
116
117
  /** Optional externally decomposed plan steps rendered verbatim into the authored goal; the author never generates them. */
117
118
  steps?: readonly string[];
118
119
  /** Optional injected decomposition seam; omitted means authoring never invokes an LLM or decomposition. */
119
- 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[]>;
120
121
  /** Optional launch preflight result supplied by the caller; authoring never reads the ledger or logs itself. */
121
122
  launchPreflight?: LaunchPreflightResult;
122
123
  /** Optional in-process notification for each authored-goal phase transition. */
@@ -3907,6 +3908,8 @@ function renderClarification(
3907
3908
  ` - includeOther: ${question.includeOther !== false}`,
3908
3909
  ` - answer: ${answerValue}`,
3909
3910
  ...(provenance ? [` - provenance.source: ${provenance.source}`] : []),
3911
+ ...(provenance?.assumption ? [` - provenance.assumption: ${renderClarificationValue(provenance.assumption)}`] : []),
3912
+ ...(provenance?.assumptionSource ? [` - provenance.assumption-source: ${provenance.assumptionSource}`] : []),
3910
3913
  ...(provenance?.evidence ?? []).map((evidence) => ` - evidence: ${renderClarificationValue(evidence)}`),
3911
3914
  ];
3912
3915
  }
@@ -6031,6 +6034,7 @@ async function authorGoalWithSupersededRootIntent(
6031
6034
  throw new Error('legacy parent document has no RootIntent; rootIntent is required');
6032
6035
  }
6033
6036
  const rootIntent = validateRootIntent(supersessionRootIntent ?? inheritedRootIntent ?? requestedRootIntent ?? goalSummary(enhancement.original));
6037
+ const assignedGoalId = deps.goalId ?? generateGoalId();
6034
6038
  let resolvedSteps = deps.steps;
6035
6039
  if (resolvedSteps === undefined && goalType === 'implement' && deps.decomposeSteps) {
6036
6040
  const startedAt = Date.now();
@@ -6041,7 +6045,7 @@ async function authorGoalWithSupersededRootIntent(
6041
6045
  ? [device.exists ? `existing: ${device.device}` : `missing: ${device.device}`] : undefined;
6042
6046
  const context = [facts?.context, deviceInventory?.length ? `Device inventory (measured at goal-author repository root): ${deviceInventory.join(', ')}` : undefined]
6043
6047
  .filter(Boolean).join('\n') || undefined;
6044
- 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 });
6045
6049
  if (decomposed.length > 0) resolvedSteps = decomposed;
6046
6050
  } catch {
6047
6051
  failed = true;
@@ -6270,7 +6274,6 @@ async function authorGoalWithSupersededRootIntent(
6270
6274
  // ⚠️⭐ 계약 — 이 줄은 조립·린트가 «끝나기 전»에 난다(goalId 가 여기서 정해지므로 더 늦출 수 없다).
6271
6275
  // ⇒ 저작이 그 «뒤»에 실패하면 이 조인 행만 남는다(dangling). 그러므로 ***집계는 「착지한 골」과의
6272
6276
  // inner join 으로만 한다*** — 이 행 자체를 「골이 하나 생겼다」로 세면 «실패분까지» 센다(무인 리뷰 지적).
6273
- const assignedGoalId = deps.goalId ?? generateGoalId();
6274
6277
  const askFile = deps.askFile === undefined ? undefined : validateAskFile(deps.askFile);
6275
6278
  try { observeGoalAuthor('goal-author', 'goal-id-assigned', { authorRunId, goalId: assignedGoalId, superseded: Boolean(deps.goalId) }); }
6276
6279
  catch { /* 관측은 fail-soft */ }
@@ -6565,6 +6568,7 @@ export function defaultGoalAuthorDeps(cwd: string): GoalAuthorDeps {
6565
6568
  },
6566
6569
  readSourceFile: createRepositoryReferencedFileReader(cwd),
6567
6570
  runHelpProbe: (argv) => runDefaultHelpProbe(cwd, argv),
6571
+ selfResolveClarification: defaultGoalAuthorSelfResolve,
6568
6572
  };
6569
6573
  }
6570
6574
 
@@ -6613,7 +6617,7 @@ export async function writeAuthoredGoal(
6613
6617
  repositoryRoot: deps.repositoryRoot ?? groundingRoot,
6614
6618
  };
6615
6619
  const mandatoryGoalContextEvidence = goalContextEvidence(cwd);
6616
- const authoringLessons = selectRelevantAuthoringLessons(cwd, ask);
6620
+ const authoringLessons = selectRelevantAuthoringLessons(cwd, ask, elanousStateRoot());
6617
6621
  observeGoalAuthor('goal-author', 'authoring-lessons', {
6618
6622
  status: authoringLessons.status,
6619
6623
  invalidRows: authoringLessons.invalidRows,
@@ -14,6 +14,7 @@ import { pwaGraph, pwaReach } from '../../scripts/ci-pwa-build-gate.js';
14
14
  import { changedPathPairs, changedTsFiles, readGitFile, requiredExportFieldsInChanges } from '../../scripts/ci-typecheck-changed.js';
15
15
  import { classifyMergeFailure, clipRegateDetail, parseConflictFiles, type HostRegateFailure } from './regate-detail.js';
16
16
  import { buildImporterTestIndex, isTestPath } from './importer-test-index.js';
17
+ import type { GateReceipt, GateReceiptIdentity } from './gate-receipt-registry.js';
17
18
 
18
19
  /** Use pr-land's PWA reachability (including its undecidable-graph build fallback), not a blanket src/** trigger. */
19
20
  export function needsPwaBuild(files: readonly string[], repoRoot: string, graph: (root: string) => ReturnType<typeof pwaGraph> = pwaGraph): boolean {
@@ -86,6 +87,10 @@ export type HostRegateDeps = {
86
87
  prodFreezeRoot?: string;
87
88
  runExposeGate?: typeof runExposeGate;
88
89
  syncMergedChecklist?: typeof import('../release-loop/merged-pr-checklist.js').syncMergedPrChecklist;
90
+ /** GATE-ONCE-PER-HEAD (OP 10-27 23:0x): persistent passed-receipt registry file. Default: <git-common-dir>/elanous-host-regate/gate-receipts.json. */
91
+ gateReceiptPath?: string;
92
+ /** Environment the receipt fingerprint reads; production uses the host process env. */
93
+ gateReceiptEnv?: NodeJS.ProcessEnv;
89
94
  };
90
95
 
91
96
  /**
@@ -308,6 +313,20 @@ function removeBrokenSlotRegistration(repoRoot: string, worktree: string): void
308
313
  }
309
314
  }
310
315
 
316
+ /** GATE-ONCE-PER-HEAD: 생산 등록부는 host-regate 슬롯과 같은 Git common directory 에 산다. 못 찾으면 승계 없이 원래 검사로 연다. */
317
+ function defaultGateReceiptPath(repoRoot: string, command: NonNullable<HostRegateDeps['command']>): string | undefined {
318
+ const r = command('git', ['rev-parse', '--path-format=absolute', '--git-common-dir'], repoRoot);
319
+ const dir = r.status === 0 ? r.stdout.trim() : '';
320
+ return dir ? join(dir, 'elanous-host-regate', 'gate-receipts.json') : undefined;
321
+ }
322
+
323
+ /** 영수증의 Bun 식별값 — 검사를 실제로 돌릴 그 Bun. 못 재면 null 로 승계를 닫는다(빈 값으로 흐리지 않는다). */
324
+ function commandBunVersion(command: NonNullable<HostRegateDeps['command']>, cwd: string): string | null {
325
+ const r = command('bun', ['--version'], cwd);
326
+ const version = r.status === 0 ? r.stdout.trim() : '';
327
+ return version || null;
328
+ }
329
+
311
330
  /** Callers: podSelfImplementSpawn in src/task-orchestrator/surfaces/self-implement-pod.ts calls
312
331
  * (options.hostRegate ?? runHostRegate)({ prNumber, headCommit, repoRoot: hostRoot, ... });
313
332
  * sweepFrozenMerges in frozen-merges.ts also calls runHostRegate(entry); landing queue serialization stays there. */
@@ -383,6 +402,7 @@ export async function runHostRegate(input: HostRegateInput, deps: HostRegateDeps
383
402
  let stalePrBase: string | undefined;
384
403
  const initialPrBase = baseCommit;
385
404
  let buildPwa = false;
405
+ let typecheckBase = '';
386
406
  // REGATE-PWA-DEPS-FOR-TSC (#26698 → #27484 must-fix): the typecheck gate picks its own changed set and its own
387
407
  // whole-repository promotion triggers — TSC_BASE_REF..HEAD — which can carry apps/pwa files that landed on
388
408
  // main after this PR branched, and root-file export changes that widen the inspection to the whole repository.
@@ -494,54 +514,109 @@ export async function runHostRegate(input: HostRegateInput, deps: HostRegateDeps
494
514
  // apps/pwa/ OR any of its whole-repository promotion triggers (필수 export 필드 추가 · exported 심볼 삭제 ·
495
515
  // exported 함수 매개변수 증가, in ANY changed file), even when buildPwa never turns on: without app deps
496
516
  // the gate fails such runs as «의존성 없음» for environment reasons, not code defects.
497
- const typecheckBase = input.verifyOnly ? baseCommit : base;
517
+ typecheckBase = input.verifyOnly ? baseCommit : base;
498
518
  typecheckTouchesPwa = typecheckGateTouchesPwa(worktree, typecheckBase, command);
499
519
  if ((buildPwa || typecheckTouchesPwa) && existsSync(join(worktree, 'apps/pwa'))) provide('apps/pwa', 'next');
500
520
  } catch (e) { return result('unmeasured', 'worktree', String(e)); }
501
- try {
502
- const interferenceOptions = { neighbors: !input.verifyOnly };
503
- const interference = await (deps.interference ?? ((f: readonly string[], c: string) => defaultInterference(f, c, interferenceOptions)))(files, worktree);
504
- if (interference.neighborsTrimmed || interference.importerTrimmed) interferenceNote = {
505
- ...(interference.neighborsTrimmed ? { neighborsTrimmed: interference.neighborsTrimmed } : {}),
506
- ...(interference.importerTrimmed ? { importerTrimmed: interference.importerTrimmed } : {}),
507
- interferenceDetail: (interference.detail ?? '').slice(0, 300),
508
- };
509
- if (!interference.passed) return result(interference.unmeasured ? 'unmeasured' : 'failed', 'test-interference', interference.detail);
510
- } catch (e) { return result('unmeasured', 'test-interference', String(e)); }
511
- // Landing can also be initiated by the host after the child gate; judge the checked PR here too.
512
- if (publicExposureFiles(files).length > 0) {
513
- const exposure = (deps.runExposeGate ?? runExposeGate)(worktree, files,
514
- getUserConfig().harness?.exposeGate === 'strict' ? 'strict' : 'warn',
515
- (bin, args, dir) => command(bin, args, dir));
516
- if (!exposure.passed) return result('failed', 'expose', exposure.log);
517
- }
518
- // The checked checkout is shared with interference/exposure gates. Verify dependencies at the
519
- // typecheck boundary as well: a missing PWA link here made #27414 fail as an unmeasured host regate.
520
- if ((buildPwa || typecheckTouchesPwa) && !existsSync(join(worktree, 'apps/pwa/node_modules'))) {
521
- let failure: string | null = null;
521
+ // GATE-ONCE-PER-HEAD (0.2.40 첫 조각 · OP 10-27 23:0x 지시): 입장 검사(PR open/ready·head/base 재검증)와
522
+ // 통합 후보 구성이 끝난 뒤, 지속 등록부에서 이 측정의 key 로 통과 영수증을 찾는다. 정확히 같은
523
+ // head·측정 base·Bun/lockfile·radius·검사 범위·환경의 통과 영수증만 아래 비용 큰 검사를 승계하고,
524
+ // 불일치·결손·불완전·실패/측정불가 영수증은 원래 검사를 그대로 실행한다 — 영수증이 커버하지 않는
525
+ // 검사는 승계하지 않는다. 등록부를 못 쓰는 경우도 검사 쪽으로 실패 열린다.
526
+ const gateReceiptPath = deps.gateReceiptPath ?? defaultGateReceiptPath(input.repoRoot, command);
527
+ // Gate receipt support is optional for this host path. Keep its registry and test-env helpers
528
+ // outside the Next TUI's static startup closure, loading them only when receipt lookup is enabled.
529
+ const gateReceiptRegistry = gateReceiptPath ? await import('./gate-receipt-registry.js') : null;
530
+ const gateChecks = [
531
+ `test-interference:${input.verifyOnly ? 'changed-only' : 'with-neighbours'}`,
532
+ ...(publicExposureFiles(files).length > 0 ? ['expose'] : []),
533
+ `typecheck@${typecheckBase}`,
534
+ ...((deps.command || existsSync(join(worktree, 'scripts/ci-isolation-hardcode-gate.ts'))) ? ['isolation-gate'] : []),
535
+ ...(buildPwa ? ['nexus-build'] : []),
536
+ ];
537
+ let gateReceiptIdentity: GateReceiptIdentity | undefined;
538
+ let gateReceiptKey = '';
539
+ let gateReceiptReused = false;
540
+ let gateReceiptDecline = 'gate receipt registry unavailable';
541
+ if (gateReceiptPath) {
522
542
  try {
523
- if (existsSync(join(worktree, 'apps/pwa'))) {
524
- provideCheckoutDependencies(worktree, input.repoRoot, 'apps/pwa', 'next', (cwd) => { run('bun', ['install', '--frozen-lockfile'], cwd); });
525
- } else failure = 'apps/pwa absent before typecheck';
526
- } catch (e) { failure = String(e); }
527
- const ready = existsSync(join(worktree, 'apps/pwa/node_modules'));
528
- if (!ready && !failure) failure = 'apps/pwa/node_modules absent after provision before typecheck';
529
- try { debug.log('harness.host-regate', 'pwa-dependencies-before-typecheck', { pr: input.prNumber, restored: ready, failure }); } catch { /* observation must not block regate */ }
530
- if (!ready) return result('unmeasured', 'dependencies', failure!);
531
- }
532
- // verifyOnly: 통합 후보는 «지금 main 끝»(baseCommit)에 얹은 것이다 — 옛 merge-base 로 비교하면 그사이 main 착지분
533
- // 수백 파일이 «이 PR 의 변경»으로 잡혀 저장소 전체 검사로 승격된다(2026-09-28 #21239 실측: 456파일 · PWA 636건).
534
- try { run('bun', ['scripts/ci-typecheck-changed.ts'], worktree, { ...process.env, TSC_BASE_REF: input.verifyOnly ? baseCommit : base }); }
535
- catch (e) { return result(String(e).includes('error TS') ? 'failed' : 'unmeasured', 'typecheck', String(e)); }
536
- // ⛔ 2026-09-28: a Pod landing brought `join(home, '.elanous', …)` into main without this gate, and every human
537
- // `pr land` after it failed the isolation gate regardless of its own files (#21336 → #21343).
538
- if (deps.command || existsSync(join(worktree, 'scripts/ci-isolation-hardcode-gate.ts'))) {
539
- try { run('bun', ['scripts/ci-isolation-hardcode-gate.ts', '--changed-files', ...files], worktree); }
540
- catch (e) { return result(/\[isolation-gate\] FAIL/.test(String(e)) ? 'failed' : 'unmeasured', 'isolation-gate', String(e)); }
543
+ const bunVersion = commandBunVersion(command, worktree);
544
+ if (bunVersion === null) gateReceiptDecline = 'bun version unavailable';
545
+ else {
546
+ gateReceiptIdentity = {
547
+ headCommit: input.headCommit,
548
+ baseCommit,
549
+ bunVersion,
550
+ lockfileHash: gateReceiptRegistry!.gateLockfileHash(worktree),
551
+ radiusFiles: [...new Set(files)].sort(),
552
+ checks: gateChecks,
553
+ envFingerprint: gateReceiptRegistry!.gateEnvFingerprint(deps.gateReceiptEnv ?? process.env),
554
+ };
555
+ gateReceiptKey = gateReceiptRegistry!.computeReceiptKey(gateReceiptIdentity, 'passed');
556
+ const registry = gateReceiptRegistry!.loadGateReceipts(gateReceiptPath);
557
+ const stored = registry[gateReceiptKey];
558
+ if (stored && gateReceiptRegistry!.gateReceiptSelfKey(stored) === gateReceiptKey) gateReceiptReused = true;
559
+ else gateReceiptDecline = stored ? 'stored receipt does not recompute to its own key' : gateReceiptRegistry!.describeGateReceiptDecline(gateReceiptIdentity, registry);
560
+ }
561
+ } catch (e) { gateReceiptDecline = `gate receipt lookup failed: ${String(e).slice(0, 200)}`; }
541
562
  }
542
- if (buildPwa) {
543
- try { run('bun', ['bin/elanous.mjs', '--test', 'nexus', 'build'], worktree); }
544
- catch (e) { return result(String(e).includes('command unavailable') ? 'unmeasured' : 'failed', 'nexus-build', String(e)); }
563
+ if (gateReceiptReused) debug.log('harness.host-regate', 'gate-receipt-reuse', { pr: input.prNumber, key: gateReceiptKey, checks: gateChecks });
564
+ else debug.log('harness.host-regate', 'gate-receipt-decline', { pr: input.prNumber, ...(gateReceiptKey ? { key: gateReceiptKey } : {}), reason: gateReceiptDecline });
565
+ if (!gateReceiptReused) {
566
+ try {
567
+ const interferenceOptions = { neighbors: !input.verifyOnly };
568
+ const interference = await (deps.interference ?? ((f: readonly string[], c: string) => defaultInterference(f, c, interferenceOptions)))(files, worktree);
569
+ if (interference.neighborsTrimmed || interference.importerTrimmed) interferenceNote = {
570
+ ...(interference.neighborsTrimmed ? { neighborsTrimmed: interference.neighborsTrimmed } : {}),
571
+ ...(interference.importerTrimmed ? { importerTrimmed: interference.importerTrimmed } : {}),
572
+ interferenceDetail: (interference.detail ?? '').slice(0, 300),
573
+ };
574
+ if (!interference.passed) return result(interference.unmeasured ? 'unmeasured' : 'failed', 'test-interference', interference.detail);
575
+ } catch (e) { return result('unmeasured', 'test-interference', String(e)); }
576
+ // Landing can also be initiated by the host after the child gate; judge the checked PR here too.
577
+ if (publicExposureFiles(files).length > 0) {
578
+ const exposure = (deps.runExposeGate ?? runExposeGate)(worktree, files,
579
+ getUserConfig().harness?.exposeGate === 'strict' ? 'strict' : 'warn',
580
+ (bin, args, dir) => command(bin, args, dir));
581
+ if (!exposure.passed) return result('failed', 'expose', exposure.log);
582
+ }
583
+ // The checked checkout is shared with interference/exposure gates. Verify dependencies at the
584
+ // typecheck boundary as well: a missing PWA link here made #27414 fail as an unmeasured host regate.
585
+ if ((buildPwa || typecheckTouchesPwa) && !existsSync(join(worktree, 'apps/pwa/node_modules'))) {
586
+ let failure: string | null = null;
587
+ try {
588
+ if (existsSync(join(worktree, 'apps/pwa'))) {
589
+ provideCheckoutDependencies(worktree, input.repoRoot, 'apps/pwa', 'next', (cwd) => { run('bun', ['install', '--frozen-lockfile'], cwd); });
590
+ } else failure = 'apps/pwa absent before typecheck';
591
+ } catch (e) { failure = String(e); }
592
+ const ready = existsSync(join(worktree, 'apps/pwa/node_modules'));
593
+ if (!ready && !failure) failure = 'apps/pwa/node_modules absent after provision before typecheck';
594
+ try { debug.log('harness.host-regate', 'pwa-dependencies-before-typecheck', { pr: input.prNumber, restored: ready, failure }); } catch { /* observation must not block regate */ }
595
+ if (!ready) return result('unmeasured', 'dependencies', failure!);
596
+ }
597
+ // verifyOnly: 통합 후보는 «지금 main 끝»(baseCommit)에 얹은 것이다 — 옛 merge-base 로 비교하면 그사이 main 착지분
598
+ // 수백 파일이 «이 PR 의 변경»으로 잡혀 저장소 전체 검사로 승격된다(2026-09-28 #21239 실측: 456파일 · PWA 636건).
599
+ try { run('bun', ['scripts/ci-typecheck-changed.ts'], worktree, { ...process.env, TSC_BASE_REF: typecheckBase }); }
600
+ catch (e) { return result(String(e).includes('error TS') ? 'failed' : 'unmeasured', 'typecheck', String(e)); }
601
+ // ⛔ 2026-09-28: a Pod landing brought `join(home, '.elanous', …)` into main without this gate, and every human
602
+ // `pr land` after it failed the isolation gate regardless of its own files (#21336 → #21343).
603
+ if (deps.command || existsSync(join(worktree, 'scripts/ci-isolation-hardcode-gate.ts'))) {
604
+ try { run('bun', ['scripts/ci-isolation-hardcode-gate.ts', '--changed-files', ...files], worktree); }
605
+ catch (e) { return result(/\[isolation-gate\] FAIL/.test(String(e)) ? 'failed' : 'unmeasured', 'isolation-gate', String(e)); }
606
+ }
607
+ if (buildPwa) {
608
+ try { run('bun', ['bin/elanous.mjs', '--test', 'nexus', 'build'], worktree); }
609
+ catch (e) { return result(String(e).includes('command unavailable') ? 'unmeasured' : 'failed', 'nexus-build', String(e)); }
610
+ }
611
+ // 원래 검사가 모두 통과했다 — 이 측정의 통과 영수증을 지속 등록부에 원자적으로 남긴다.
612
+ // 저장 실패는 영수증 최적화의 실패일 뿐 게이트 판정이 아니므로 관측만 남긴다.
613
+ if (gateReceiptPath && gateReceiptIdentity && gateReceiptRegistry) {
614
+ try {
615
+ const receipt: GateReceipt = { ...gateReceiptIdentity, schema: gateReceiptRegistry.GATE_RECEIPT_SCHEMA, key: gateReceiptRegistry.computeReceiptKey(gateReceiptIdentity, 'passed'), verdict: 'passed', savedAt: new Date().toISOString() };
616
+ gateReceiptRegistry.saveGateReceipt(gateReceiptPath, receipt);
617
+ debug.log('harness.host-regate', 'gate-receipt-saved', { pr: input.prNumber, key: receipt.key, checks: gateChecks });
618
+ } catch (e) { debug.log('harness.host-regate', 'gate-receipt-save-failed', { pr: input.prNumber, error: String(e).slice(0, 200) }); }
619
+ }
545
620
  }
546
621
  let current: PrView;
547
622
  try { current = readPr(); }
@@ -576,8 +651,8 @@ export async function runHostRegate(input: HostRegateInput, deps: HostRegateDeps
576
651
  if (merged.state !== 'MERGED') return result('unmeasured', 'merge-confirm', `PR state after merge is ${merged.state ?? 'unknown'}`);
577
652
  landed = true;
578
653
  try {
579
- const sync = deps.syncMergedChecklist ?? (await import('../release-loop/merged-pr-checklist.js')).syncMergedPrChecklist;
580
- sync(input.prNumber, input.repoRoot, input.goalFile);
654
+ const sync = deps.syncMergedChecklist ?? (await import('../release-loop/merged-pr-checklist.js')).syncMergedPrChecklistWithFeedback;
655
+ await sync(input.prNumber, input.repoRoot, input.goalFile);
581
656
  } catch (error) {
582
657
  debug.log('release.checklist', 'merged-pr-sync-failed', { pr: input.prNumber, error: String(error) });
583
658
  }
@@ -0,0 +1,188 @@
1
+ /**
2
+ * IMPL-FINDINGS-FEEDBACK — 병합 PR 본문의 «구현이 밝힌 요구사항»·«새 범위»·«남은 것» 절을
3
+ * idempotent 원장(`appendRunLedgerEntryChecked`)에 1회 기록하고, 관련 기록만 다음 저작
4
+ * (goal-author) 입력에 주입하며, 남은 것에서 후속 초안을 만든다(자동 발사 없음 — shadow 기본).
5
+ *
6
+ * 절 파싱은 `markdownSection`(goal-author)과 `remainingPiecesFromPrBody`(follow-up-goals)을
7
+ * 재사용하고, 관련 교훈 선택은 `selectRelevantAuthoringLessons`(knowhow-pack)을 재사용한다.
8
+ * 모든 관측은 `self-implement.impl-findings-feedback` 범주로 `debug.log` 에 남는다.
9
+ */
10
+ import { debug } from '../debug/log.js';
11
+ import { elanousStateRoot } from '../autopilot/state-paths.js';
12
+ import { markdownSection } from './goal-author.js';
13
+ import { selectRelevantAuthoringLessons, type SelectedAuthoringLessons } from './knowhow-pack.js';
14
+ import { appendRunLedgerEntryChecked, type RunLedgerCheckedAppendDecision, type RunLedgerEntry } from './run-ledger.js';
15
+ import { recordFollowUpOnMerge, remainingPiecesFromPrBody, type FollowUpDraftRecord, type FollowUpMergeInput, type FollowUpSeams } from './follow-up-goals.js';
16
+
17
+ /** 원장 이벤트 이름 — 같은 PR 의 되먹임 기록은 이 이벤트로 정확히 한 번만 남는다. */
18
+ export const IMPL_FINDINGS_LEDGER_EVENT = 'impl-findings-feedback';
19
+ export const IMPL_FINDINGS_REQUIREMENTS_SECTION = '구현이 밝힌 요구사항';
20
+ export const IMPL_FINDINGS_NEW_SCOPE_SECTION = '새 범위';
21
+ export const IMPL_FINDINGS_REMAINING_SECTION = '남은 것';
22
+
23
+ /** 병합 PR 본문에서 파싱한 세 절. */
24
+ export interface ImplFindings {
25
+ /** «구현이 밝힌 요구사항» 절 본문(verbatim trim). */
26
+ requirements: string;
27
+ /** «새 범위» 절 본문(verbatim trim). */
28
+ newScope: string;
29
+ /** «남은 것» 절(⊕ follow-up-goals 의 «남은 조각» 절)의 항목 — 순서 보존·중복 제거. */
30
+ remaining: string[];
31
+ }
32
+
33
+ function sectionBullets(body: string): string[] {
34
+ return body
35
+ .split(/\r?\n/)
36
+ .map((line) => line.match(/^\s*[-*]\s+(.+?)\s*$/)?.[1] ?? '')
37
+ .map((item) => item.trim())
38
+ .filter(Boolean);
39
+ }
40
+
41
+ /** 병합 PR 본문의 세 절을 exact-trimmed `## ` 제목으로 파싱한다 — 펜스 안 본문은 건너뛴다. */
42
+ export function parseImplFindings(prBody: string): ImplFindings {
43
+ const requirements = (markdownSection(prBody, IMPL_FINDINGS_REQUIREMENTS_SECTION) ?? '').trim();
44
+ const newScope = (markdownSection(prBody, IMPL_FINDINGS_NEW_SCOPE_SECTION) ?? '').trim();
45
+ const remainingSection = (markdownSection(prBody, IMPL_FINDINGS_REMAINING_SECTION) ?? '');
46
+ const remaining = [...sectionBullets(remainingSection), ...remainingPiecesFromPrBody(prBody)]
47
+ .map((item) => item.trim())
48
+ .filter(Boolean);
49
+ return { requirements, newScope, remaining: [...new Set(remaining)] };
50
+ }
51
+
52
+ export interface ImplFindingsFeedbackInput {
53
+ runId: string;
54
+ prNumber: number;
55
+ /** 병합 PR 본문 원문 — 세 절을 여기서 파싱한다. */
56
+ prBody: string;
57
+ /** 다음 저작 입력의 원문 ask — 관련 교훈 선택의 경로 힌트로 쓴다. */
58
+ ask: string;
59
+ goalId?: string;
60
+ }
61
+
62
+ export type ImplFindingsLog = (category: string, event: string, data?: unknown) => void;
63
+
64
+ export interface ImplFindingsFeedbackSeams {
65
+ /** 원장 디렉터리 — 생략하면 정본 run ledger dir. */
66
+ dir?: string;
67
+ log?: ImplFindingsLog;
68
+ /** 관련 교훈 선택 심 — 생략하면 정본 `selectRelevantAuthoringLessons`. */
69
+ selectLessons?: (root: string, ask: string) => SelectedAuthoringLessons;
70
+ /** 후속 초안 기록 심 — 생략하면 정본 `recordFollowUpOnMerge`(shadow 기본, 자동 발사 없음). */
71
+ followUp?: (input: FollowUpMergeInput, seams?: FollowUpSeams) => Promise<FollowUpDraftRecord | null>;
72
+ }
73
+
74
+ export interface ImplFindingsFeedbackResult {
75
+ findings: ImplFindings;
76
+ /** 이 호출로 원장에 새 기록을 남겼는가 — 같은 PR 재주입이면 false(중복 억제). */
77
+ appended: boolean;
78
+ refusal: 'ledger-write-refused' | null;
79
+ /** 다음 저작(goal-author `authoringLessons`) 입력에 싣는 프롬프트 — 관련 기록만 담는다. */
80
+ authoringInjection: string;
81
+ lessonIds: readonly string[];
82
+ /** 주입한 절 이름(비어 있지 않은 것만). */
83
+ injectedSections: readonly string[];
84
+ /** 생략한 절 이름(비어 있어 주입하지 않은 것). */
85
+ skippedSections: readonly string[];
86
+ /** 후속 초안 기록 — 자동 발사는 하지 않는다(`queued:false`). */
87
+ followUp: FollowUpDraftRecord | null;
88
+ }
89
+
90
+ /**
91
+ * 병합 PR 착지(postland) 때 구현이 밝힌 절을 되먹임한다:
92
+ * ① 세 절을 idempotent 원장에 1회 기록(같은 PR 재주입은 중복 억제),
93
+ * ② 비어 있지 않은 절(관련 기록)만 다음 저작 입력 프롬프트에 주입하고 선택·생략 수를 로그에 남긴다,
94
+ * ③ 남은 것에서 후속 초안을 만든다 — 자동 발사는 하지 않는다(`recordFollowUpOnMerge` shadow 기본).
95
+ */
96
+ export async function recordImplFindingsFeedback(
97
+ input: ImplFindingsFeedbackInput,
98
+ seams: ImplFindingsFeedbackSeams = {},
99
+ ): Promise<ImplFindingsFeedbackResult> {
100
+ const log = seams.log ?? ((category, event, data) => { debug.log(category, event, data); });
101
+ const findings = parseImplFindings(input.prBody);
102
+
103
+ // ① idempotent 원장 1회 기록 — 같은 PR 번호의 되먹임 기록이 이미 있으면 append 하지 않는다.
104
+ const decide = (entries: RunLedgerEntry[] | null): RunLedgerCheckedAppendDecision<'duplicate'> => {
105
+ const duplicate = (entries ?? []).some((entry) => entry.event === IMPL_FINDINGS_LEDGER_EVENT
106
+ && entry.data.prNumber === input.prNumber);
107
+ if (duplicate) return { append: false, result: 'duplicate' as const };
108
+ return {
109
+ append: true,
110
+ entry: {
111
+ timestamp: new Date().toISOString(),
112
+ runId: input.runId,
113
+ event: IMPL_FINDINGS_LEDGER_EVENT,
114
+ data: {
115
+ prNumber: input.prNumber,
116
+ paths: [...new Set(input.ask.match(/(?<![\w./~-])([\w.-]+(?:\/[\w.-]+)+\.[\w-]+)/gu)?.map((match) => match.replace(/[.,;:!?]+$/u, '')) ?? [])],
117
+ requirements: findings.requirements,
118
+ newScope: findings.newScope,
119
+ remaining: findings.remaining,
120
+ },
121
+ ...(input.goalId ? { goalId: input.goalId } : {}),
122
+ },
123
+ };
124
+ };
125
+ const outcome = appendRunLedgerEntryChecked(input.runId, decide, seams.dir);
126
+ log('self-implement.impl-findings-feedback', outcome.refusal ? 'ledger-write-refused' : outcome.appended ? 'recorded' : 'duplicate-suppressed', {
127
+ prNumber: input.prNumber,
128
+ appended: outcome.appended,
129
+ remainingCount: findings.remaining.length,
130
+ });
131
+
132
+ // ② 관련 기록만 다음 저작 입력에 주입 — 비어 있지 않은 절 ⊕ 관련 교훈 프롬프트.
133
+ const injectedSections: string[] = [];
134
+ const skippedSections: string[] = [];
135
+ const sectionTexts: string[] = [];
136
+ const sections: readonly (readonly [string, string])[] = [
137
+ [IMPL_FINDINGS_REQUIREMENTS_SECTION, findings.requirements],
138
+ [IMPL_FINDINGS_NEW_SCOPE_SECTION, findings.newScope],
139
+ ];
140
+ for (const [name, text] of sections) {
141
+ if (!text) { skippedSections.push(name); continue; }
142
+ injectedSections.push(name);
143
+ sectionTexts.push(`### ${name}\n${text}`);
144
+ }
145
+ const lessons = (seams.selectLessons ?? selectRelevantAuthoringLessons)(process.cwd(), input.ask, elanousStateRoot());
146
+ const authoringInjection = [
147
+ `## 구현이 밝힌 요구사항·새 범위(착지 PR #${input.prNumber})`,
148
+ ...sectionTexts,
149
+ ...(lessons.prompt ? [lessons.prompt] : []),
150
+ ].join('\n\n');
151
+ log('self-implement.impl-findings-feedback', 'authoring-injection', {
152
+ prNumber: input.prNumber,
153
+ injectedSections,
154
+ skippedSections,
155
+ selected: lessons.ids.length,
156
+ status: lessons.status,
157
+ invalidRows: lessons.invalidRows,
158
+ lessonIds: lessons.ids,
159
+ });
160
+
161
+ // ③ 남은 것에서 후속 초안 — 자동 발사 없음(shadow 기본, `queued:false`).
162
+ const followUpInput = {
163
+ prNumber: input.prNumber,
164
+ prBody: input.prBody,
165
+ feature: input.ask,
166
+ followUpMustFix: findings.remaining,
167
+ ...(input.goalId ? { cellId: input.goalId } : {}),
168
+ };
169
+ const followUp = await (seams.followUp
170
+ ? seams.followUp(followUpInput)
171
+ : recordFollowUpOnMerge(followUpInput, { mode: 'shadow' }));
172
+ log('self-implement.impl-findings-feedback', followUp ? 'follow-up-drafted' : 'follow-up-none', {
173
+ prNumber: input.prNumber,
174
+ remainingCount: findings.remaining.length,
175
+ queued: followUp?.queued ?? null,
176
+ });
177
+
178
+ return {
179
+ findings,
180
+ appended: outcome.appended,
181
+ refusal: outcome.refusal,
182
+ authoringInjection,
183
+ lessonIds: lessons.ids,
184
+ injectedSections,
185
+ skippedSections,
186
+ followUp,
187
+ };
188
+ }