elanous 0.2.24 → 0.2.25

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 (551) 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/chunks/1027.a0f04663d24c2779.js +1 -0
  4. package/apps/pwa/out/_next/static/chunks/1038.676007ae505822e7.js +1 -0
  5. package/apps/pwa/out/_next/static/chunks/1113.a37eadf7f740d955.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/112-fa7c526c20ce1405.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1144.5fa1fa1d48dbcd12.js +36 -0
  8. package/apps/pwa/out/_next/static/chunks/1146.80d15ea7c6e6ee95.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/1157.f08bf2b70915e176.js +148 -0
  10. package/apps/pwa/out/_next/static/chunks/119b405e.8fdd0e44d1ff37aa.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1296.04560d98e73fbf51.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/1314-f604ba013ec535b0.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1454-37fd16f479f5554a.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/1464.f3209af0d8ae4ff2.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/{8532.a86e99acf9b761cb.js → 1516.83dd2c1b86b4e507.js} +2 -2
  16. package/apps/pwa/out/_next/static/chunks/{89849432.9eaa2f4c9c010965.js → 16e57f67.3ea19e893461e611.js} +3 -3
  17. package/apps/pwa/out/_next/static/chunks/1729-d73dd25e564679d4.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/{1505.5826671109111e75.js → 1743.563d3168e95825ef.js} +2 -2
  19. package/apps/pwa/out/_next/static/chunks/1843.5924c24295243261.js +27 -0
  20. package/apps/pwa/out/_next/static/chunks/1987.e28149724b92918b.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2066-5ca18ffa5a4be68b.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2240.d10a66695155fd93.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/2391.e2cbc98d4abbb41a.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2528.3868070ef1be69f9.js +24 -0
  25. package/apps/pwa/out/_next/static/chunks/2566-734cb83bbd405886.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/2697.76ca2ac3efef6f3b.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/275.0e6bad414729bfa0.js +32 -0
  28. package/apps/pwa/out/_next/static/chunks/2803-33bdae771855a8d1.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/2846.d6a433b8663819a5.js +309 -0
  30. package/apps/pwa/out/_next/static/chunks/3143.257997a5f1ed79df.js +34 -0
  31. package/apps/pwa/out/_next/static/chunks/{5967-c0a80f8ffe5d4050.js → 3259-86f3be56e43eaf6a.js} +1 -1
  32. package/apps/pwa/out/_next/static/chunks/3280-e177c33bfbdcfb0a.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/3294-2b6a6d45a46a6c1c.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/3309.364573ceedbdfd5f.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/3522.758840fc5e7fe630.js +287 -0
  36. package/apps/pwa/out/_next/static/chunks/3525-a7c989c1a661e880.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3694.b1a66387756458c0.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/370.124f9e678a76fc01.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3797-9643105335e660fe.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/{5578.ac963634373b28c6.js → 4084.15ecaf4240bd9e77.js} +2 -2
  41. package/apps/pwa/out/_next/static/chunks/4089-b3382b8843114eee.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/{8438.ee7f0df3b3f6fcb4.js → 4204.a409ab6250c0f6a8.js} +1 -1
  43. package/apps/pwa/out/_next/static/chunks/4293.928a8d573c16aab7.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4402.f9238a3b18a7bd43.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/4490-9b090b0f9427f902.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/4548.13502d0ca3b4f862.js +8 -0
  47. package/apps/pwa/out/_next/static/chunks/4565-67e4c620597965c8.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/{7905.b230b9d06cb4ad5d.js → 4593.10f5b9bd702d4a6c.js} +1 -1
  49. package/apps/pwa/out/_next/static/chunks/4599-548bc96cda44a5a7.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4625.206574e33a9e7ae8.js +104 -0
  51. package/apps/pwa/out/_next/static/chunks/4862-392c9a71f0d8dfb4.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/5054.2906d1b02542edc5.js +149 -0
  53. package/apps/pwa/out/_next/static/chunks/{8569.b853a8daa8f31d12.js → 5081.a240b63fad28663a.js} +1 -1
  54. package/apps/pwa/out/_next/static/chunks/5102-c822bbbee5a022a4.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5194-8c93f2e7e4b6f717.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/5305-bacd7eca0b9a5848.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/5311.9071ee3f44fd7ff5.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/5369.9f34353442daa421.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/{2528.0af5c0e1fad88df6.js → 5408.377c8c543635b81f.js} +1 -1
  60. package/apps/pwa/out/_next/static/chunks/{9502-32c5dc22e8f120f5.js → 5492-e05e26a033ba80d2.js} +3 -3
  61. package/apps/pwa/out/_next/static/chunks/5785-ea8d2c633b6688e3.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/589-49d730cb8138b397.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/5904-264a6412ae3c9028.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/5980.728531d5c566535c.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/599-a914cc0468f56143.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/6011.f525002e21bef0ac.js +23 -0
  67. package/apps/pwa/out/_next/static/chunks/6132.4381ab93683f1acf.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/6149.2e698635e454d8f6.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/{5974.360f8441eb0ac1ec.js → 6196.34d6b229079e9e28.js} +1 -1
  70. package/apps/pwa/out/_next/static/chunks/6356-0afafc4230cf9767.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6406.64756073f7df35b8.js +77 -0
  72. package/apps/pwa/out/_next/static/chunks/6479-16e62aedafa0e310.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/6599.b5246b46a2453329.js +64 -0
  74. package/apps/pwa/out/_next/static/chunks/{ce383d63.d2ede338788ed18e.js → 65ebff95.081daeff622d238e.js} +1 -1
  75. package/apps/pwa/out/_next/static/chunks/6610.5c26eec011565acb.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/666.37d18474edc1c552.js +2 -0
  77. package/apps/pwa/out/_next/static/chunks/6904.a0b5b1ed4f2d2c20.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/{83cfc5c8.349535543c1548b6.js → 6def8a8e.c81f9ca41028eccf.js} +1 -1
  79. package/apps/pwa/out/_next/static/chunks/7247-1f4aba94aba50d9f.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/7274-e71a7c5b7760cd02.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/7290.1fcaeef3adb5d0d4.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/7477-2c64e42760f82f33.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/{2721.bc9a8f36bd85c07a.js → 7483.ba01c6c209b81bba.js} +1 -1
  84. package/apps/pwa/out/_next/static/chunks/7505-47002b76ff1aef6c.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7600-11884ca4da68e5d9.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7607.40d8bb3689697ccb.js +62 -0
  87. package/apps/pwa/out/_next/static/chunks/{6702.ebbd165d5e4a4a14.js → 7752.5cbdd0b433c54af9.js} +1 -1
  88. package/apps/pwa/out/_next/static/chunks/7763.f51fcc19ca1414ec.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/7785.846140c859b1adf6.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/7807-a0fdac6393e0bf36.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7837-20a63b4b7e9342b1.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/800.7815414cf280545d.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/{8925-2abfb48af477fb7f.js → 8085-1e5fce59500a2cc2.js} +1 -1
  94. package/apps/pwa/out/_next/static/chunks/8100.415f2105faa63e97.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/8290.701aa42ed13aa767.js +226 -0
  96. package/apps/pwa/out/_next/static/chunks/{b4e12462-5fab4a813a63dadd.js → 83a80514-b897b64df43ce108.js} +1 -1
  97. package/apps/pwa/out/_next/static/chunks/8444.d9c74214a3145a43.js +93 -0
  98. package/apps/pwa/out/_next/static/chunks/8569.98c915534928c7f9.js +24 -0
  99. package/apps/pwa/out/_next/static/chunks/{8264.00e434fbd02e9311.js → 8578.dff22d988cc2b106.js} +3 -3
  100. package/apps/pwa/out/_next/static/chunks/8591.b1c7f876e5ec7cfb.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8715-f63756021d3ab989.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8879.776c2ec7732aa114.js +115 -0
  103. package/apps/pwa/out/_next/static/chunks/8881.ddca15b3c82c490c.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8946.5da5c87f32a2e1a8.js +41 -0
  105. package/apps/pwa/out/_next/static/chunks/9117.080b9b75be90e14d.js +74 -0
  106. package/apps/pwa/out/_next/static/chunks/9167.f3ecb28f367d6e69.js +94 -0
  107. package/apps/pwa/out/_next/static/chunks/9224.66095370ee28c93b.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/9238-0682b013c83d6449.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/{7518.49161e8f5814abdb.js → 9311.24c8f5ea793253dd.js} +1 -1
  110. package/apps/pwa/out/_next/static/chunks/{9976.8f28864317639fe6.js → 94.4cfed21c0b781a06.js} +3 -3
  111. package/apps/pwa/out/_next/static/chunks/9449.d3ed795da4befb1c.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/949.1e7d45ccb71580aa.js +90 -0
  113. package/apps/pwa/out/_next/static/chunks/9638-d268329f2c6f4f8d.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/{0e3acd34.d42b2ef87fdf4234.js → 973cbf1b.3bbcf2b41548eca7.js} +1 -1
  115. package/apps/pwa/out/_next/static/chunks/9842-d6644eb53d3dc6bf.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9863.94ca3263e760696e.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/{6571-926ddf024a6ad5df.js → 9917-9e26abc5f7772735.js} +1 -1
  118. package/apps/pwa/out/_next/static/chunks/9938.b23e4d4dfa0114cd.js +79 -0
  119. package/apps/pwa/out/_next/static/chunks/{740.90b31555290236a9.js → 9974.e77b4ff4884557b3.js} +2 -2
  120. package/apps/pwa/out/_next/static/chunks/{4c5e95ce.83e9b16add6fcd8c.js → ab4d57c2.e90bc2cb31949045.js} +7 -7
  121. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d9babd8795f396a5.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/app/approvals/page-9360b1285b2a346e.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f08f6529d09ffae1.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/board/page-f000d54d258f9ef6.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/botlab/{page-24282bf9f90031a5.js → page-b12149c51f7d04b1.js} +1 -1
  126. package/apps/pwa/out/_next/static/chunks/app/bots/page-22f674e7e4c2c9d5.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/ceo/page-8888733e40cea6d1.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/chat/page-9717ec6964b92276.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/consult/page-44eaad486bc98a45.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/control/page-97fa6cf3d34c7eb9.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/decisions/page-305cd294e754906e.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/design-check/page-dea4b795741126fd.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/editor/page-35e05d7450461a67.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/exec/page-45889e7070d11126.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/field/page-16a2e893f83ae4d0.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/healthz/route-d9babd8795f396a5.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/inside/page-b2638013c0bf7dfd.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/intake/page-56888bc744e08dac.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/layout-c44f93a41167536f.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/live/page-952c6ceec6d9de38.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live-run/page-6d0202af568f4c63.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/loops/page-1b810474507f3702.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/market/page-74366ae2693a7d95.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-4fb6fc34e20c07b7.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/morning/page-e9502921f4f01b1f.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/not-found-b6169ea2f09cf287.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/observatory/page-6a14333d1b1b3967.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-8c91a9a66c9ec90a.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-1d809a87139dd024.js → page-4e634c5b98fd4e93.js} +1 -1
  150. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ed3070d637850548.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/outputs/{page-b92caddb5c715f30.js → page-b9cc8a10bc6078b4.js} +1 -1
  152. package/apps/pwa/out/_next/static/chunks/app/page-3d3fc73dd187ed52.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/reflection/page-128458c8d86fbb5f.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-9c04dac0831c2bbb.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/sessions/page-cf0c2b0183991d09.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-04de9ca6d52a3893.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/page-62527677bbc2fdc4.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-9a2e09c4a311764c.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/layout-d9babd8795f396a5.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/page-bfeb35d69e8b24bb.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/share/page-89cb33bced824e4a.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/showroom/page-b008aff96be56654.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/tasks/page-814394dcbae789b1.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/term/page-6a87325c87f09dd2.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/today/page-6445ac4cbb8dd869.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/trace/page-852170303c6cd755.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/vault/page-087ceeb975ef272b.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-97c7361cc2a19319.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/page-20162174b77f96cf.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workspace/page-8c6901833f897496.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-05a4b2c9b91034aa.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/dcf24383-2f82e35f2d827393.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{53746282.1be36038d1abd949.js → e117f801.e92bf10242653497.js} +1 -1
  174. package/apps/pwa/out/_next/static/chunks/e87d89b9.2e71c0ae475d28a1.js +122 -0
  175. package/apps/pwa/out/_next/static/chunks/{0673cc54.8e2ef1c23e49e190.js → f4dfbfc0.a69fb12f854882aa.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/framework-bf135b997155e90e.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/main-5571537543bea91c.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/main-app-25c51c7df7f3a442.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/pages/_app-e3b2c1f5d82abd65.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/pages/_error-083f2e23e9bc3641.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/webpack-e94d22b7a028217b.js +1 -0
  182. package/apps/pwa/out/_next/static/{Q-7iofoxOEv1WX18S35of → dRS6lEhSRRBr1abbzp7fJ}/_buildManifest.js +1 -1
  183. package/apps/pwa/out/approvals/index.html +1 -1
  184. package/apps/pwa/out/approvals/index.txt +22 -22
  185. package/apps/pwa/out/autopilot/index.html +1 -1
  186. package/apps/pwa/out/autopilot/index.txt +22 -22
  187. package/apps/pwa/out/board/index.html +1 -1
  188. package/apps/pwa/out/board/index.txt +22 -22
  189. package/apps/pwa/out/botlab/index.html +1 -1
  190. package/apps/pwa/out/botlab/index.txt +21 -21
  191. package/apps/pwa/out/bots/index.html +1 -1
  192. package/apps/pwa/out/bots/index.txt +21 -21
  193. package/apps/pwa/out/ceo/index.html +1 -1
  194. package/apps/pwa/out/ceo/index.txt +22 -22
  195. package/apps/pwa/out/chat/index.html +1 -1
  196. package/apps/pwa/out/chat/index.txt +21 -21
  197. package/apps/pwa/out/consult/index.html +1 -1
  198. package/apps/pwa/out/consult/index.txt +22 -22
  199. package/apps/pwa/out/control/index.html +1 -1
  200. package/apps/pwa/out/control/index.txt +22 -22
  201. package/apps/pwa/out/decisions/index.html +1 -1
  202. package/apps/pwa/out/decisions/index.txt +21 -21
  203. package/apps/pwa/out/design-check/index.html +1 -1
  204. package/apps/pwa/out/design-check/index.txt +22 -22
  205. package/apps/pwa/out/editor/index.html +1 -1
  206. package/apps/pwa/out/editor/index.txt +22 -22
  207. package/apps/pwa/out/exec/index.html +1 -1
  208. package/apps/pwa/out/exec/index.txt +22 -22
  209. package/apps/pwa/out/field/index.html +1 -1
  210. package/apps/pwa/out/field/index.txt +22 -22
  211. package/apps/pwa/out/healthz +1 -1
  212. package/apps/pwa/out/index.html +1 -1
  213. package/apps/pwa/out/index.txt +21 -21
  214. package/apps/pwa/out/inside/index.html +1 -1
  215. package/apps/pwa/out/inside/index.txt +21 -21
  216. package/apps/pwa/out/intake/index.html +1 -1
  217. package/apps/pwa/out/intake/index.txt +22 -22
  218. package/apps/pwa/out/live/index.html +1 -1
  219. package/apps/pwa/out/live/index.txt +22 -22
  220. package/apps/pwa/out/live-run/index.html +1 -1
  221. package/apps/pwa/out/live-run/index.txt +22 -22
  222. package/apps/pwa/out/loops/index.html +1 -1
  223. package/apps/pwa/out/loops/index.txt +21 -21
  224. package/apps/pwa/out/market/index.html +1 -1
  225. package/apps/pwa/out/market/index.txt +21 -21
  226. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  227. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  228. package/apps/pwa/out/morning/index.html +1 -1
  229. package/apps/pwa/out/morning/index.txt +22 -22
  230. package/apps/pwa/out/observatory/index.html +1 -1
  231. package/apps/pwa/out/observatory/index.txt +22 -22
  232. package/apps/pwa/out/ops/checklist/index.html +1 -1
  233. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  234. package/apps/pwa/out/ops/release/index.html +1 -1
  235. package/apps/pwa/out/ops/release/index.txt +21 -21
  236. package/apps/pwa/out/ops/seats/index.html +1 -1
  237. package/apps/pwa/out/ops/seats/index.txt +21 -21
  238. package/apps/pwa/out/outputs/index.html +1 -1
  239. package/apps/pwa/out/outputs/index.txt +21 -21
  240. package/apps/pwa/out/reflection/index.html +1 -1
  241. package/apps/pwa/out/reflection/index.txt +22 -22
  242. package/apps/pwa/out/scheduler/index.html +1 -1
  243. package/apps/pwa/out/scheduler/index.txt +22 -22
  244. package/apps/pwa/out/sessions/index.html +1 -1
  245. package/apps/pwa/out/sessions/index.txt +21 -21
  246. package/apps/pwa/out/settings/devices/index.html +1 -1
  247. package/apps/pwa/out/settings/devices/index.txt +22 -22
  248. package/apps/pwa/out/settings/index.html +1 -1
  249. package/apps/pwa/out/settings/index.txt +22 -22
  250. package/apps/pwa/out/setup/done/index.html +1 -1
  251. package/apps/pwa/out/setup/done/index.txt +22 -22
  252. package/apps/pwa/out/setup/index.html +1 -1
  253. package/apps/pwa/out/setup/index.txt +22 -22
  254. package/apps/pwa/out/share/index.html +1 -1
  255. package/apps/pwa/out/share/index.txt +22 -22
  256. package/apps/pwa/out/showroom/index.html +1 -1
  257. package/apps/pwa/out/showroom/index.txt +21 -21
  258. package/apps/pwa/out/tasks/index.html +1 -1
  259. package/apps/pwa/out/tasks/index.txt +22 -22
  260. package/apps/pwa/out/term/index.html +1 -1
  261. package/apps/pwa/out/term/index.txt +22 -22
  262. package/apps/pwa/out/today/index.html +1 -1
  263. package/apps/pwa/out/today/index.txt +22 -22
  264. package/apps/pwa/out/trace/index.html +1 -1
  265. package/apps/pwa/out/trace/index.txt +22 -22
  266. package/apps/pwa/out/vault/index.html +1 -1
  267. package/apps/pwa/out/vault/index.txt +22 -22
  268. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  269. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  270. package/apps/pwa/out/workflows/index.html +1 -1
  271. package/apps/pwa/out/workflows/index.txt +22 -22
  272. package/apps/pwa/out/workspace/index.html +1 -1
  273. package/apps/pwa/out/workspace/index.txt +22 -22
  274. package/apps/pwa/out/worktrees/index.html +1 -1
  275. package/apps/pwa/out/worktrees/index.txt +22 -22
  276. package/graphs/release/release-loop.yaml +5 -5
  277. package/graphs/steward/recipes.yaml +4 -0
  278. package/graphs/steward/steward.yaml +10 -1
  279. package/package.json +1 -1
  280. package/scripts/bench-report.ts +46 -1
  281. package/scripts/ci-typecheck-changed.ts +7 -5
  282. package/scripts/release-loop/auto-approve-node.ts +6 -0
  283. package/scripts/release-loop/gate-closure.ts +286 -0
  284. package/scripts/release-loop/gate-node.ts +73 -13
  285. package/scripts/release-loop/gate-partial.ts +34 -6
  286. package/scripts/release-loop/ops-upgrade-node.ts +63 -42
  287. package/scripts/release-loop/publish-node.ts +6 -0
  288. package/scripts/release-loop/resume-release.ts +37 -10
  289. package/scripts/release-loop/resume.ts +69 -4
  290. package/scripts/tsc-baseline-cache.ts +28 -3
  291. package/scripts/usage-rollup.ts +27 -13
  292. package/scripts/ux-sim.ts +30 -1
  293. package/skills/youtube-master/scripts/main.ts +4 -1
  294. package/skills/youtube-master/src/obsidian.ts +9 -0
  295. package/src/agent-substrate/acp-implementer.ts +14 -7
  296. package/src/agent-substrate/pr-reviewer.ts +30 -10
  297. package/src/agent-substrate/self-review-cli.ts +126 -10
  298. package/src/budget/cost-tier-advisor.ts +91 -0
  299. package/src/budget/shadow-arms.ts +77 -0
  300. package/src/budget/types.ts +5 -3
  301. package/src/budget/unified-usage.ts +172 -8
  302. package/src/cli/doctor-cli.ts +21 -0
  303. package/src/cli/friendly-errors.ts +113 -0
  304. package/src/cli/intake-cli.ts +3 -1
  305. package/src/cli/memory-cli.ts +182 -0
  306. package/src/cli/model-watch-cli.ts +4 -1
  307. package/src/cli/pr-land-pod-shadow.ts +54 -0
  308. package/src/cli/release-cli.ts +9 -7
  309. package/src/cli/release-run-if-ready.ts +11 -0
  310. package/src/cli/resource-cli.ts +48 -0
  311. package/src/cli/retro-cli.ts +12 -3
  312. package/src/cli/seat-requests-cli.ts +25 -0
  313. package/src/cli/tasks-cli.ts +31 -7
  314. package/src/cli/usage-cli.ts +3 -1
  315. package/src/compact/verify-probe.ts +23 -3
  316. package/src/context-card/index.ts +50 -0
  317. package/src/control/control-status.ts +30 -1
  318. package/src/dashboard/slash-runtime/dashboard-handlers.ts +4 -138
  319. package/src/dashboard/slash-runtime/shell-slash.ts +145 -0
  320. package/src/debug/log-diet.ts +16 -4
  321. package/src/domains/morning-essential.ts +18 -3
  322. package/src/domains/release-tool.ts +4 -0
  323. package/src/execution-loop/launch-gate.ts +158 -2
  324. package/src/fleet/host-doctor.ts +375 -0
  325. package/src/goals/judge.ts +20 -6
  326. package/src/graph-runner/runner.ts +9 -5
  327. package/src/graph-wizard/archetypes.ts +14 -8
  328. package/src/graph-wizard/generate.ts +77 -1
  329. package/src/grok.ts +13 -7
  330. package/src/harness/harness-cli-command.ts +56 -47
  331. package/src/harness/harness-stop.ts +82 -12
  332. package/src/index.ts +17 -175
  333. package/src/intake-plane/collect-github.ts +7 -2
  334. package/src/intake-plane/lens.ts +46 -4
  335. package/src/intake-plane/requirement-funnel.ts +53 -1
  336. package/src/intelligence-map/catalog-feed.ts +119 -0
  337. package/src/intelligence-map/model-watch-intake.ts +40 -0
  338. package/src/intelligence-map/model-watch-mission.ts +14 -1
  339. package/src/llm/open-weight-discipline.ts +21 -0
  340. package/src/llm.ts +4 -8
  341. package/src/maturity/feature-maturity.ts +1 -1
  342. package/src/nexus/api/http-server.ts +22 -0
  343. package/src/oauth/codex-account-rotation.ts +4 -1
  344. package/src/oauth/codex-account-store.ts +20 -7
  345. package/src/oauth/codex-quota-policy.ts +33 -4
  346. package/src/preview/terminal.ts +15 -5
  347. package/src/project/project-store.ts +20 -0
  348. package/src/release-loop/auto-start.ts +7 -5
  349. package/src/release-loop/checklist.ts +11 -1
  350. package/src/release-loop/gate-shards.ts +4 -0
  351. package/src/release-loop/light-rc.ts +84 -13
  352. package/src/release-loop/merged-pr-checklist.ts +35 -5
  353. package/src/release-loop/rehearsal.ts +1 -1
  354. package/src/seat-loop/duty-ledger.ts +64 -0
  355. package/src/self-dev/decompose.ts +37 -3
  356. package/src/self-dev/dev-pipeline.ts +32 -7
  357. package/src/self-dev/draft-residue.ts +16 -6
  358. package/src/self-dev/draft-sweep.ts +52 -4
  359. package/src/self-dev/fabric-decompose-adapter.ts +9 -2
  360. package/src/self-dev/run-supervisor.ts +37 -7
  361. package/src/self-implement/gate-cli.ts +29 -10
  362. package/src/self-implement/gate-remote.ts +4 -1
  363. package/src/self-implement/goal-author.ts +12 -2
  364. package/src/self-implement/goal-new-paths.ts +42 -0
  365. package/src/self-implement/host-regate.ts +124 -30
  366. package/src/self-implement/importer-test-index.ts +3 -1
  367. package/src/self-implement/l8-merge-queue.ts +80 -2
  368. package/src/self-implement/merge-train.ts +19 -0
  369. package/src/self-implement/off-diff-evidence.ts +40 -1
  370. package/src/self-implement/orchestrator.ts +88 -19
  371. package/src/self-implement/premise-review.ts +159 -0
  372. package/src/self-implement/regate-detail.ts +79 -0
  373. package/src/self-implement/review-deferred-to-host.ts +21 -0
  374. package/src/self-implement/rework-budget-judgment.ts +23 -3
  375. package/src/self-implement/running-runs.ts +2 -2
  376. package/src/self-implement/scope-adjacency.ts +23 -0
  377. package/src/self-implement/seams.ts +42 -7
  378. package/src/skills/tools/agent.ts +16 -1
  379. package/src/skills/tools/persistent-grounding.ts +11 -1
  380. package/src/skills/tools/shell.ts +33 -1
  381. package/src/steward/rejudge-tick.ts +142 -0
  382. package/src/task-agent/board.ts +92 -3
  383. package/src/task-agent/card-evidence.ts +88 -1
  384. package/src/task-agent/cover.ts +65 -0
  385. package/src/task-agent/parent-host.ts +27 -3
  386. package/src/task-agent/rejudge-on-head.ts +151 -7
  387. package/src/task-agent/review-result-capture.ts +3 -1
  388. package/src/task-agent/shadow.ts +12 -0
  389. package/src/task-agent/task-hand.ts +4 -1
  390. package/src/task-orchestrator/surfaces/pod-command-job.ts +14 -0
  391. package/src/task-orchestrator/surfaces/pod-host-acp-review.ts +122 -0
  392. package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +23 -0
  393. package/src/task-orchestrator/surfaces/pod-pool.ts +53 -0
  394. package/src/task-orchestrator/surfaces/self-implement-pod.ts +235 -28
  395. package/src/user-config.ts +18 -4
  396. package/src/ux-sim/fault-cred-expiry.ts +100 -0
  397. package/src/ux-sim/fault-pod-death.ts +74 -0
  398. package/src/ux-sim/fault-pool-cap.ts +81 -0
  399. package/src/version/packed-revision.json +1 -1
  400. package/src/webclone/qa-table.ts +22 -0
  401. package/apps/pwa/out/_next/static/chunks/0a09e062-34f747a17d8d8c2e.js +0 -1
  402. package/apps/pwa/out/_next/static/chunks/1168.a0fb3d9db76c00bd.js +0 -77
  403. package/apps/pwa/out/_next/static/chunks/1325-dc3f3c21eb181cb4.js +0 -1
  404. package/apps/pwa/out/_next/static/chunks/1357.a843c41d2cd7ec31.js +0 -34
  405. package/apps/pwa/out/_next/static/chunks/1430.53f49882b17607c2.js +0 -24
  406. package/apps/pwa/out/_next/static/chunks/1459-be6509b3419d8a9f.js +0 -1
  407. package/apps/pwa/out/_next/static/chunks/153.0a4e3cd516930491.js +0 -1
  408. package/apps/pwa/out/_next/static/chunks/1572.7bc291352e241a45.js +0 -1
  409. package/apps/pwa/out/_next/static/chunks/1593-d07ad068c120dfb0.js +0 -1
  410. package/apps/pwa/out/_next/static/chunks/1608.b7c900baa56cab32.js +0 -1
  411. package/apps/pwa/out/_next/static/chunks/1615-4d8156febaac4b35.js +0 -1
  412. package/apps/pwa/out/_next/static/chunks/1646.e03f0fbc26bc72f6.js +0 -1
  413. package/apps/pwa/out/_next/static/chunks/1669-da843ed73aa301f5.js +0 -1
  414. package/apps/pwa/out/_next/static/chunks/176.13ba0659e3e96fd4.js +0 -1
  415. package/apps/pwa/out/_next/static/chunks/1990.9c60f495ef33c070.js +0 -36
  416. package/apps/pwa/out/_next/static/chunks/2042e469.f86158dd5c1e51a1.js +0 -122
  417. package/apps/pwa/out/_next/static/chunks/2543-28ec6aeb80a5e1e1.js +0 -1
  418. package/apps/pwa/out/_next/static/chunks/2561.43c99d6ee914ee6a.js +0 -62
  419. package/apps/pwa/out/_next/static/chunks/2638.b39ab2f674caa1a5.js +0 -1
  420. package/apps/pwa/out/_next/static/chunks/272-0eed0fb0aab716b6.js +0 -1
  421. package/apps/pwa/out/_next/static/chunks/2778.67e0c1d484189ccf.js +0 -1
  422. package/apps/pwa/out/_next/static/chunks/2841.10ff309f6a3168af.js +0 -1
  423. package/apps/pwa/out/_next/static/chunks/2886-9639f97d523d752a.js +0 -1
  424. package/apps/pwa/out/_next/static/chunks/2978.57fb87ce21cc5a85.js +0 -1
  425. package/apps/pwa/out/_next/static/chunks/3664.15f968c39d15bd28.js +0 -149
  426. package/apps/pwa/out/_next/static/chunks/3786-935eb3fcde90e496.js +0 -1
  427. package/apps/pwa/out/_next/static/chunks/3813.df4a01ae89c6f63f.js +0 -1
  428. package/apps/pwa/out/_next/static/chunks/3961-aaae04ed1d32622f.js +0 -1
  429. package/apps/pwa/out/_next/static/chunks/3992.f79c70480e8c4077.js +0 -309
  430. package/apps/pwa/out/_next/static/chunks/40-413e8641de9ed1e5.js +0 -1
  431. package/apps/pwa/out/_next/static/chunks/4054-521f11a503daed64.js +0 -1
  432. package/apps/pwa/out/_next/static/chunks/4315.e7356f34c7d8ec79.js +0 -1
  433. package/apps/pwa/out/_next/static/chunks/4489-bf629de6f04f7681.js +0 -1
  434. package/apps/pwa/out/_next/static/chunks/4540.557733cc88c6a82b.js +0 -1
  435. package/apps/pwa/out/_next/static/chunks/462.0275b4338c5b6337.js +0 -1
  436. package/apps/pwa/out/_next/static/chunks/4658-7ed9266098a787e4.js +0 -1
  437. package/apps/pwa/out/_next/static/chunks/4945-0f4046cfc3228ea3.js +0 -1
  438. package/apps/pwa/out/_next/static/chunks/5105-18b4165c5d3a86b0.js +0 -1
  439. package/apps/pwa/out/_next/static/chunks/5205-6992210fe31f45f4.js +0 -1
  440. package/apps/pwa/out/_next/static/chunks/5287-72898b126d722457.js +0 -1
  441. package/apps/pwa/out/_next/static/chunks/5313.1697309c532b9856.js +0 -2
  442. package/apps/pwa/out/_next/static/chunks/5474.991b90688c3cb321.js +0 -1
  443. package/apps/pwa/out/_next/static/chunks/5544-871146192d095594.js +0 -1
  444. package/apps/pwa/out/_next/static/chunks/5935.d5e8ca3e096772e8.js +0 -1
  445. package/apps/pwa/out/_next/static/chunks/6006.84e8b418a7a0db97.js +0 -1
  446. package/apps/pwa/out/_next/static/chunks/6013-1267ba7454d6764b.js +0 -1
  447. package/apps/pwa/out/_next/static/chunks/6038-1e0f7ee1086da4cf.js +0 -1
  448. package/apps/pwa/out/_next/static/chunks/617.709dd0019fe99796.js +0 -1
  449. package/apps/pwa/out/_next/static/chunks/6261.fb9bf94947094636.js +0 -74
  450. package/apps/pwa/out/_next/static/chunks/6411.1966866fae31ffa9.js +0 -1
  451. package/apps/pwa/out/_next/static/chunks/6481-b829d99aa8d158f5.js +0 -1
  452. package/apps/pwa/out/_next/static/chunks/6541.2b7daa043100d0fa.js +0 -1
  453. package/apps/pwa/out/_next/static/chunks/6597.2d7a6d77ab485b27.js +0 -64
  454. package/apps/pwa/out/_next/static/chunks/67.5dd2dc543c2fa3de.js +0 -1
  455. package/apps/pwa/out/_next/static/chunks/6777-312496b0d774719b.js +0 -1
  456. package/apps/pwa/out/_next/static/chunks/681.0116f7036cfb4e8d.js +0 -32
  457. package/apps/pwa/out/_next/static/chunks/6871.30b2bf23b3126e36.js +0 -24
  458. package/apps/pwa/out/_next/static/chunks/6882.737d366d54e29d83.js +0 -1
  459. package/apps/pwa/out/_next/static/chunks/7035.54c2c535164b1c9b.js +0 -1
  460. package/apps/pwa/out/_next/static/chunks/7086-8bfa7e8f796a03d9.js +0 -1
  461. package/apps/pwa/out/_next/static/chunks/7126.5e5599f251726b67.js +0 -93
  462. package/apps/pwa/out/_next/static/chunks/7203-47ff0740a293e284.js +0 -1
  463. package/apps/pwa/out/_next/static/chunks/7268.017f49dafb5f0ff3.js +0 -1
  464. package/apps/pwa/out/_next/static/chunks/7355.5d65a87e9567ae08.js +0 -1
  465. package/apps/pwa/out/_next/static/chunks/7392.4018c2a62177f296.js +0 -1
  466. package/apps/pwa/out/_next/static/chunks/7471.3a3d1be50559cfb8.js +0 -148
  467. package/apps/pwa/out/_next/static/chunks/7500.73489a345cef2201.js +0 -226
  468. package/apps/pwa/out/_next/static/chunks/7565.c2f72a15c1ed0396.js +0 -27
  469. package/apps/pwa/out/_next/static/chunks/7651.6d1c984d3d8587a4.js +0 -1
  470. package/apps/pwa/out/_next/static/chunks/7713.7ab863ed59b2d661.js +0 -1
  471. package/apps/pwa/out/_next/static/chunks/7793.d7cd2026767ddd54.js +0 -115
  472. package/apps/pwa/out/_next/static/chunks/7837.c7c267e5dceadb11.js +0 -1
  473. package/apps/pwa/out/_next/static/chunks/7891.09266382daf70d1c.js +0 -1
  474. package/apps/pwa/out/_next/static/chunks/7990-cbf6a01bcbdcb7e6.js +0 -1
  475. package/apps/pwa/out/_next/static/chunks/8119-819c549e0c197786.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/8186-74ea19a3700d04a8.js +0 -1
  477. package/apps/pwa/out/_next/static/chunks/8267-e7b3262b735ae106.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/8386.86518e55b75f7cf5.js +0 -8
  479. package/apps/pwa/out/_next/static/chunks/8437.ba6eeeb29590042f.js +0 -23
  480. package/apps/pwa/out/_next/static/chunks/8469-1500be57e582296f.js +0 -1
  481. package/apps/pwa/out/_next/static/chunks/8483-7164cecdaf178ca6.js +0 -1
  482. package/apps/pwa/out/_next/static/chunks/8722-4c940f02c496ad36.js +0 -1
  483. package/apps/pwa/out/_next/static/chunks/887-41d0dcf5af48c628.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/9039.da86361496797522.js +0 -90
  485. package/apps/pwa/out/_next/static/chunks/905.d5745a25884754d4.js +0 -94
  486. package/apps/pwa/out/_next/static/chunks/9089-d909f3d4478b0628.js +0 -1
  487. package/apps/pwa/out/_next/static/chunks/9096.dc5c7a267f83790c.js +0 -41
  488. package/apps/pwa/out/_next/static/chunks/93.a567257b6bdb7fe4.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/9320.419acb9665b46597.js +0 -287
  490. package/apps/pwa/out/_next/static/chunks/9356.b8ceda6634612ff8.js +0 -79
  491. package/apps/pwa/out/_next/static/chunks/94.e9e1043b35cd3eed.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/9400-7498ea90b2e6ee8f.js +0 -1
  493. package/apps/pwa/out/_next/static/chunks/9930-58644af9c813d6e1.js +0 -1
  494. package/apps/pwa/out/_next/static/chunks/9932.367cf4725fedd6e2.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/9935.1628b904cdc8ce0e.js +0 -104
  496. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-a2aa8709d193ee0d.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/app/approvals/page-3b9fc39362473ae7.js +0 -1
  498. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f2b62c19ca68fef8.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/app/board/page-d7602d489edf5f37.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/app/bots/page-8b7c5ab6b5bc8d64.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/app/ceo/page-4eb84d454f8c3415.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/app/chat/page-b2e494bdad57fcb5.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/app/consult/page-c0ab229673a8b0eb.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/app/control/page-3e2b45f3c36dbac4.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/app/decisions/page-c22aa511b28743ad.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/app/design-check/page-26345242e4049f55.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/app/editor/page-bf88c0f558d8ef54.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/app/exec/page-52fec523e5b5d3ad.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/app/field/page-67723dfdcde92b31.js +0 -1
  510. package/apps/pwa/out/_next/static/chunks/app/healthz/route-a2aa8709d193ee0d.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/app/inside/page-22725e2570f1126b.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/app/intake/page-1891335950d68b70.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/app/layout-3267af1ebdc73cf5.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/app/live/page-c314b75c11234998.js +0 -1
  515. package/apps/pwa/out/_next/static/chunks/app/live-run/page-9f9c85415f61782b.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/app/loops/page-c1d4276059085587.js +0 -1
  517. package/apps/pwa/out/_next/static/chunks/app/market/page-833aab587f26ad4c.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-8526c17ae38e6a50.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/app/morning/page-f998637a8402115c.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/app/not-found-b7bb53828b17b335.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/app/observatory/page-1b1850de0257e46d.js +0 -1
  522. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6f23159fedb41f67.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-da9e570234d481fd.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/app/page-8ce3a38e210b810a.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/app/reflection/page-57ffeeb6019440fd.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-abbb417bf514630b.js +0 -1
  527. package/apps/pwa/out/_next/static/chunks/app/sessions/page-2c2b3f29cec1efa4.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-9369279f72fc7b51.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/app/settings/page-64861f14039499c3.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ddc4c93efd8ab94b.js +0 -1
  531. package/apps/pwa/out/_next/static/chunks/app/setup/layout-a2aa8709d193ee0d.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/app/setup/page-901a1391b81053bc.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/app/share/page-68d9bbaac9841a58.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/app/showroom/page-b5c0c996f329371e.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/app/tasks/page-89881ccbcf728978.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/app/term/page-0e87a803b3d7165e.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/app/today/page-58d4e5cb30ef4871.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/app/trace/page-02ce4c3b5f39e4d2.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/app/vault/page-e620d1bb8eadcec2.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-acf868c64d77f950.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/app/workflows/page-54fa605fa6dba457.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/app/workspace/page-bc79f0833533fa84.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-d5c4398eea03d8f3.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/cd39fa05.fac4545f42a3ef70.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/framework-b2763b10dc6b3836.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/main-app-27893e93b0ec193d.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/main-f280047194e1daf8.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/pages/_app-e90eff2d0b70564c.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/pages/_error-70f2d654b3435d34.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/webpack-4794f053bd5e4230.js +0 -1
  551. /package/apps/pwa/out/_next/static/{Q-7iofoxOEv1WX18S35of → dRS6lEhSRRBr1abbzp7fJ}/_ssgManifest.js +0 -0
@@ -18,6 +18,7 @@ import {
18
18
  parseGateLogTestRuns,
19
19
  type PrEvidenceInput,
20
20
  } from './pr-evidence-artifact.js';
21
+ import { REVIEW_DEFERRED_TO_HOST_MERGE_REASON } from './review-deferred-to-host.js';
21
22
  import { assessImplementationArtifactCompleteness } from './implementation-artifact-completeness.js';
22
23
  import { runContractAtNode, type RunContract } from './graph-run-contract.js';
23
24
  export {
@@ -91,6 +92,7 @@ import { classifyError } from '../session-runtime/retry-policy.js';
91
92
  import { decomposeSelfDevGoal, inferHotPaths, type SelfDevDecomposeOptions } from '../self-dev/decompose.js';
92
93
  import { boundaryGlobs, boundaryViolations } from './goal-boundary.js';
93
94
  import { askAtExecution, type ExecutionClarificationResult } from './execution-clarification.js';
95
+ import { classifyOutOfScope } from './scope-adjacency.js';
94
96
  import { targetScopedGoalText } from './goal-text-path-scope.js';
95
97
  import { dropStaleReverts, type RevertGuardResult } from './revert-guard.js';
96
98
  import type { SelfDevGoalType } from '../self-dev/orchestrate.js';
@@ -157,10 +159,11 @@ import { resolveAdaptiveMaxReworkDecision, resolveEscalateTier, resolveEscalateT
157
159
  import type { SupervisionReworkSource } from './supervision-vocabulary.js';
158
160
  import { classifyReworkBudgetShadow } from './classify-shadow.js';
159
161
  import { createReworkBudgetJudgment, REWORK_BUDGET_JUDGMENT, reworkBudgetEvidenceForObservation, reworkBudgetWorkflow } from './rework-budget-judgment.js';
162
+ import { formatGateFailedId, type PremiseReviewCard, type PremiseReviewInput } from './premise-review.js';
160
163
  import { runWorkflowToCompletion } from '../workflow-runtime/executor.js';
161
164
  import { mapReworkVerdict, supervisionObservationFields } from './supervision-vocabulary.js';
162
165
  import { resolveRunOutcome } from './run-outcome.js';
163
- import { authorLimitationCountFromGoal, harvestEvidenceLines, harvestedEvidenceObservation, MAX_HARVESTED_EVIDENCE_CHARS, parseOffDiffEvidence, requiredEvidenceFromGoal, runRequiredEvidenceChecks, coverRequiredEvidence, formatUncoveredEvidenceFeedback, type OffDiffEvidenceParse } from './off-diff-evidence.js';
166
+ import { authorLimitationCountFromGoal, harvestEvidenceLines, harvestedEvidenceObservation, MAX_HARVESTED_EVIDENCE_CHARS, parseOffDiffEvidence, requiredEvidenceFromGoal, runRequiredEvidenceChecks, coverRequiredEvidence, settleUncoveredEvidence, formatUncoveredEvidenceFeedback, type OffDiffEvidenceParse } from './off-diff-evidence.js';
164
167
  import { pressDecisionSignals, type DecisionSignalPressResult } from './decision-signal-press.js';
165
168
  import { inspectDecisionObservations, inspectDecisionSignalKinds, inspectDecisionSignalObservations } from '../../scripts/ask-marker-check.js';
166
169
 
@@ -580,6 +583,8 @@ export interface SelfImplementReview {
580
583
  reviewed: boolean;
581
584
  /** 리뷰가 실행되지 않은 실패 사유. 리뷰 엔진이 제공한 경우에만 관측으로 전달한다. */
582
585
  failureReason?: string;
586
+ /** REVIEW-ACP-POD ②-b — 리뷰를 발사 호스트(Claude ACP)로 미뤘다. `reviewed` 는 거짓 그대로다(통과가 아니다). */
587
+ deferredToHost?: true;
583
588
  /** 리뷰 엔진이 실제로 사용한 diff 예산. 없는 값은 미검토/no-diff 등으로, 완전한 diff의 증거가 아니다. */
584
589
  diffTruncated?: boolean;
585
590
  diffShownChars?: number;
@@ -817,11 +822,20 @@ function declaredPathsFromGoalDocumentText(document: string): { readable: boolea
817
822
  if (originalAsk === null) return { readable: false, paths: [] };
818
823
  const declared = parseDeclaredTargetPathsFromAsk(originalAsk);
819
824
  if (!declared.readable) return declared;
820
- const newFiles = originalAsk.split(/\r?\n/).flatMap((line) => {
825
+ const newFiles = declaredNewFilePaths(originalAsk);
826
+ return newFiles.length > 0 ? { readable: true, paths: [...new Set([...declared.paths, ...newFiles])] } : declared;
827
+ }
828
+
829
+ function declaredNewFilePaths(askText: string): readonly string[] {
830
+ return askText.split(/\r?\n/).flatMap((line) => {
821
831
  const match = DECLARED_NEW_FILES_LINE.exec(line);
822
832
  return match ? parseDeclaredTargetPathsFromAsk(`대상 경로: ${match[1]}`).paths : [];
823
833
  });
824
- return newFiles.length > 0 ? { readable: true, paths: [...new Set([...declared.paths, ...newFiles])] } : declared;
834
+ }
835
+
836
+ /** P3 전제의 경계 — ask 머리줄 «대상 경로:» ⊕ «신설:» 줄의 합집합. 못 읽으면 빈 목록(그때 P3 는 unknown). */
837
+ function declaredPremiseScopePaths(askText: string): string[] {
838
+ return [...new Set([...parseDeclaredTargetPathsFromAsk(askText).paths, ...declaredNewFilePaths(askText)])];
825
839
  }
826
840
 
827
841
  /** Only paths explicitly designated as targets in the ask or piece text protect an intentional revert. */
@@ -6446,7 +6460,21 @@ async function runSelfImplementInner(
6446
6460
  judgmentStarted = true;
6447
6461
  const judgmentCallLLM = s.judgmentCallLLM;
6448
6462
  if (diagnosedDecision?.verdict !== 'CONTRACT-CONFLICT' && !judgmentCallLLM) throw new Error('rework-budget@v1 requires a judgment provider');
6449
- const judgmentProvider = judgmentCallLLM ? createReworkBudgetJudgment(judgmentCallLLM) : undefined;
6463
+ // FLEX-RFC §A-③ — UNCONVERGEABLE 직전의 전제 되짚기 입력. 이 루프 뒤쪽 «flex-signals» 관측(6895~)과 같은
6464
+ // 실제 런 값으로 조립한다. 이 생산 배선이 없으면 카드는 시험에서만 세워지고 원장에는 남지 않는다.
6465
+ const premiseLatestEntry = roundSummaryEntries[roundSummaryEntries.length - 1];
6466
+ const premiseInput: PremiseReviewInput = {
6467
+ runId,
6468
+ gateFailedIdsByRound: premiseLatestEntry?.kind === 'gate'
6469
+ ? roundSummaryEntries.filter((entry) => entry.kind === 'gate').map((entry) => entry.failedIds)
6470
+ : [],
6471
+ failureAttributions: reworkKind === 'gate' && gate ? gate.baselineFailures?.map(({ attribution }) => attribution) : undefined,
6472
+ reviewRepeat,
6473
+ round,
6474
+ plannedRounds: effectiveMax,
6475
+ targetPaths: declaredPremiseScopePaths(opts.feature),
6476
+ };
6477
+ const judgmentProvider = judgmentCallLLM ? createReworkBudgetJudgment(judgmentCallLLM, { premiseInput }) : undefined;
6450
6478
  try {
6451
6479
  const result = diagnosedDecision?.verdict === 'CONTRACT-CONFLICT'
6452
6480
  ? undefined
@@ -6628,6 +6656,17 @@ async function runSelfImplementInner(
6628
6656
  : { evidence: null };
6629
6657
  observe('rework-budget', { round, verdict: parsedDecision.verdict, reason: parsedDecision.reason.slice(0, 240), effectiveMaxBefore: before, effectiveMaxAfter: effectiveMax, carriedBudgetBefore, carriedBudgetAfter: judgedEffectiveMax, historyRounds: priorHistory.length, kind: reworkKind, applied: budgetDecision.applied, stopped: budgetDecision.stop, exit: budgetDecision.exit, shadowed: budgetDecision.shadowed === true, repeatedBlockingFindingCount: repeatedBlockingIds?.length ?? null, repeatedBlockingFindingIds: repeatedBlockingIds ?? null, normalizedRepeatedReviewFindingCount: recurrence?.normalizedRepeatedReviewFindingCount ?? null, ordinaryRepeatedReviewFindingCount: recurrence?.ordinaryRepeatedReviewFindingCount ?? null, previouslyDismissedRepeatedReviewFindingCount: recurrence?.previouslyDismissedRepeatedReviewFindingCount ?? null, citedReviewSymbolRepeatCount: recurrence?.citedReviewSymbolRepeatCount ?? null, citedReviewSymbolBaseNameRepeatCount: recurrence?.citedReviewSymbolBaseNameRepeatCount ?? null, reviewFindingComparableCount: recurrence?.comparableFindings ?? null, reviewFindingKeyRepeatCount: recurrence?.reviewFindingKeyRepeatCount ?? null, ...recurrenceDisagreementObservation, ...evidenceObservation, judgePredictedBefore: predictionAccuracyForObservation.predicted, judgeFulfilledBefore: predictionAccuracyForObservation.fulfilled, judgeMissedBefore: predictionAccuracyForObservation.missed, judgePendingBefore: predictionAccuracyForObservation.pending, ...(budgetDecision.shadowed ? { wouldExit: budgetDecision.wouldExit } : {}), ...(budgetDecision.contractConflictDisposition ? { contractConflictDisposition: budgetDecision.contractConflictDisposition } : {}), ...(pendingPlanRevision?.relaxation ? { contractConflictRelaxation: { ...pendingPlanRevision.relaxation, reason: pendingPlanRevision.reason, application: pendingPlanRevision.application?.status ?? 'failed' } } : {}), ...supervisionObservation }, { ...(budgetDecision.exit === 'blocked' ? { level: 'warn' as const } : {}), compact: { stringMax: 256, arrayMax: 6, maxDepth: 5 } });
6630
6658
  if (parsedDecision.verdict === 'UNCONVERGEABLE' && budgetDecision.stop && budgetDecision.exit === 'blocked') {
6659
+ // FLEX-RFC §A-③(0.2.25 FLEX-PREMISE-REVIEW) — 확정된 UNCONVERGEABLE 의 전제 되짚기 카드를
6660
+ // «별도 원장 사건»으로 남긴다. 카드는 판정 provider 가 UNCONVERGEABLE 을 «내기 전에» 세웠다
6661
+ // (createReworkBudgetJudgment 가 premiseInput 으로 buildPremiseCard 를 부른다) — 이 자리는 그
6662
+ // 카드를 원장에 옮기기만 한다. 카드가 없으면 사건도 없다.
6663
+ const evidenceRecord: unknown = evidenceObservation.evidence;
6664
+ const premiseReview = typeof evidenceRecord === 'object' && evidenceRecord !== null
6665
+ ? (evidenceRecord as { premiseReview?: PremiseReviewCard }).premiseReview
6666
+ : undefined;
6667
+ if (premiseReview) {
6668
+ observe('premise-review', { round, runId: premiseReview.runId, findings: premiseReview.findings, proposal: premiseReview.proposal ?? null }, { level: 'warn' as const, compact: { stringMax: 256, arrayMax: 6, maxDepth: 5 } });
6669
+ }
6631
6670
  try {
6632
6671
  const shadow = inferDecompositionShadow(opts.feature);
6633
6672
  observe('decomposition-shadow', { round, ...shadow });
@@ -7130,8 +7169,12 @@ async function runSelfImplementInner(
7130
7169
  offDiffEvidence = parseOffDiffEvidence(evidenceText);
7131
7170
  const requiredEvidence = requiredEvidenceFromGoal(opts.feature);
7132
7171
  const limitationCount = authorLimitationCountFromGoal(opts.feature);
7133
- runRequiredEvidenceChecks(opts.feature, wt.path, runId);
7134
- const coverage = coverRequiredEvidence(requiredEvidence, offDiffEvidence.items);
7172
+ const evidenceChecks = runRequiredEvidenceChecks(opts.feature, wt.path, runId);
7173
+ const tagCoverage = coverRequiredEvidence(requiredEvidence, offDiffEvidence.items);
7174
+ // EVIDENCE-WIRING-EXEMPT — a requirement whose own `|| bun test …` check passed is covered by what the harness measured.
7175
+ const settledByCheck = settleUncoveredEvidence(tagCoverage.uncovered, { checks: evidenceChecks, required: requiredEvidence });
7176
+ if (settledByCheck.coveredByCheck.length) debug.log('self-implement.evidence', 'covered-by-check', { round, tags: settledByCheck.coveredByCheck });
7177
+ const coverage = { ...tagCoverage, uncovered: settledByCheck.uncovered, uncoveredCount: settledByCheck.uncovered.length };
7135
7178
  evidenceCoverage = requiredEvidence.length || limitationCount
7136
7179
  ? {
7137
7180
  required: requiredEvidence.length,
@@ -7226,21 +7269,35 @@ async function runSelfImplementInner(
7226
7269
  // 🩸 10-09: 범위 타입검사 임시 tsconfig(.elanous-typecheck-scope-*.json · scoped-typecheck-config.ts)가 옛 가지에 커밋된 뒤 지워지면
7227
7270
  // «추적 파일 삭제» 라 impact=critical → 결정 카드가 «irreversible» 로 대표에게 갔다(D-20·35·43·80). 하니스 임시물은 범위 판정 밖이다.
7228
7271
  const scope = detectDeclaredScopeDiff({ goalDocument, changedFiles: gateRouteFiles?.filter(file => !harnessSeededPaths.includes(file) && !isHarnessTempArtifact(file)), nameCap: gateRouteFiles?.length });
7229
- if (scope.status === 'known' && scope.outsideCount !== null && scope.outsideCount > 0) {
7230
- const result: ExecutionClarificationResult = await (s.askExecutionClarification ?? askAtExecution)({
7272
+ // SCOPE-HELD-DELIVER — no declared target means the declaration was unreadable (e.g. paths listed with spaces), not
7273
+ // that every edit is outside it: treat it like an unknown declaration and go on to the gate.
7274
+ if (scope.status === 'known' && scope.declaredCount === 0 && (scope.outsideCount ?? 0) > 0) {
7275
+ observe('execution-scope-undeclared', { outsideCount: scope.outsideCount });
7276
+ progress('implementing', `⚠️ 대상 경로를 하나도 못 읽었다 — 범위 밖 ${scope.outsideCount}개를 묻지 않고 게이트로 간다`);
7277
+ } else if (scope.status === 'known' && scope.outsideCount !== null && scope.outsideCount > 0) {
7278
+ const impact = scope.outsideNames.some(file => {
7279
+ if (existsSync(join(wt.path, file))) return false;
7280
+ const tracked = runGitCommand(wt.path, ['ls-files', '--error-unmatch', '--', file], { encoding: 'utf8', timeout: 20_000 });
7281
+ return tracked.status === 0;
7282
+ }) ? 'critical' : 'high';
7283
+ const declaredPaths = declaredPathsFromGoalDocumentText(goalDocument!).paths;
7284
+ const { adjacent, other } = classifyOutOfScope(scope.outsideNames, declaredPaths);
7285
+ // Only edits next to a declared file, none of them a deletion: the gate judges them — nobody has to answer first.
7286
+ const adjacentOnly = impact !== 'critical' && !scope.nameCapReached && other.length === 0 && adjacent.length === scope.outsideCount;
7287
+ if (adjacentOnly) {
7288
+ observe('execution-scope-adjacent-accepted', { outsideCount: scope.outsideCount, adjacent });
7289
+ progress('implementing', `범위 밖 인접 편집 ${adjacent.length}개(대상과 같은 폴더) — 묻지 않고 게이트로 간다: ${adjacent.join(' · ')}`);
7290
+ }
7291
+ const result: ExecutionClarificationResult = adjacentOnly ? { choice: 'Expand scope', by: 'assumed' } : await (s.askExecutionClarification ?? askAtExecution)({
7231
7292
  id: 'execution_scope', decision: 'Changing files outside the authored target paths',
7232
7293
  prompt: 'Implementation changed files outside the authored target paths. Keep the original scope or expand it?',
7233
7294
  whyNow: 'Continuing to gate or publish these edits would expand the requested scope.',
7234
- impact: scope.outsideNames.some(file => {
7235
- if (existsSync(join(wt.path, file))) return false;
7236
- const tracked = runGitCommand(wt.path, ['ls-files', '--error-unmatch', '--', file], { encoding: 'utf8', timeout: 20_000 });
7237
- return tracked.status === 0;
7238
- }) ? 'critical' : 'high',
7295
+ impact,
7239
7296
  options: [
7240
7297
  { label: 'Stay in scope', description: 'Do not accept out-of-scope changes.', recommended: true },
7241
7298
  { label: 'Expand scope', description: 'Accept the changed files outside the target paths.' },
7242
7299
  ],
7243
- }, { runId, outsideFiles: scope.outsideNames, outsideCount: scope.outsideCount, declaredPaths: declaredPathsFromGoalDocumentText(goalDocument!).paths }, { writeRunLedger: s.writeRunLedger });
7300
+ }, { runId, outsideFiles: scope.outsideNames, outsideCount: scope.outsideCount, declaredPaths }, { writeRunLedger: s.writeRunLedger });
7244
7301
  if ('parked' in result || 'deferred' in result || result.choice !== 'Expand scope') {
7245
7302
  finalizeSupervisorDeliveries('execution-scope-not-approved');
7246
7303
  observe('execution-scope-held', { outsideCount: scope.outsideCount, disposition: 'parked' in result ? 'parked' : 'in-scope-only' });
@@ -7487,7 +7544,7 @@ async function runSelfImplementInner(
7487
7544
  }
7488
7545
  lastGateUnverifiedKey = unverifiedRepeatKey(gate.unverified);
7489
7546
  roundSummaryEntries.push({ round, kind: 'gate', tried: impl.summary.replace(/\s+/g, ' ').trim().slice(0, 200),
7490
- failedIds: gate.baselineFailures?.map(({ name, file, attribution }) => `${name}@${file ?? '?'} (${attribution})`),
7547
+ failedIds: gate.baselineFailures?.map(formatGateFailedId),
7491
7548
  filesTouched: gateRouteFiles,
7492
7549
  });
7493
7550
  round++;
@@ -7831,6 +7888,14 @@ async function runSelfImplementInner(
7831
7888
  continue;
7832
7889
  }
7833
7890
  }
7891
+ // EVIDENCE-WIRING-EXEMPT — a commandless [preservation] is covered once the changed-file gate passed.
7892
+ if (gate.passed && evidenceCoverage?.uncoveredCount) {
7893
+ const settledByGate = settleUncoveredEvidence(evidenceCoverage.uncovered, { gatePassed: true, required: requiredEvidenceFromGoal(opts.feature) });
7894
+ if (settledByGate.coveredByGate.length) {
7895
+ debug.log('self-implement.evidence', 'covered-by-gate', { round, tags: settledByGate.coveredByGate });
7896
+ evidenceCoverage = { ...evidenceCoverage, uncovered: settledByGate.uncovered, uncoveredCount: settledByGate.uncovered.length };
7897
+ }
7898
+ }
7834
7899
  if (gate.passed && autoMergeEnabled(opts) && evidenceCoverage?.uncoveredCount && !uncoveredFeedbackUsed && round < effectiveMax) {
7835
7900
  const uncovered = [...evidenceCoverage.uncovered];
7836
7901
  const nextRound = round + 1;
@@ -7869,8 +7934,11 @@ async function runSelfImplementInner(
7869
7934
  ? { completionDisposition }
7870
7935
  : {};
7871
7936
  const reviewReal = !!review?.reviewed;
7937
+ // REVIEW-ACP-POD ②-b — 호스트가 병합하는(mergeByHost) 런에서만 «미룬 리뷰»를 merge-ready 로 받는다. 판정은 호스트 ACP 리뷰가 한다.
7938
+ // ⛔ 그 밖의 런에선 종전 그대로 no-real-review(HITL) — 리뷰 없이 병합하는 길을 새로 열지 않는다.
7939
+ const reviewDeferredToHost = !reviewReal && review?.deferredToHost === true && opts.mergeByHost === true && review.mustFix.length === 0;
7872
7940
  const reviewedHeadResult = reviewReal && reviewedHeadCommit ? { reviewedHeadCommit } : {};
7873
- const reviewDiffComplete = review?.diffTruncated === false;
7941
+ const reviewDiffComplete = review?.diffTruncated === false || reviewDeferredToHost;
7874
7942
  const requiredEvidenceMissing = evidenceCoverage !== undefined && evidenceCoverage.uncoveredCount > 0;
7875
7943
  const { latestSignalIncomplete } = signalIncompleteState(roundClassifications);
7876
7944
  const autoMerge = autoMergeEnabled(opts);
@@ -7880,7 +7948,7 @@ async function runSelfImplementInner(
7880
7948
  // 종전 `verdict !== 'fail'` 만 보던 이 자리에서 auto 가 됐다(#25914 · #25934 · #25918 실물).
7881
7949
  // ⭐ 반사가 must-fix 를 «전부» 기각하면 위에서 `review.mustFix = []` 로 비우므로 그 길은 종전 그대로다.
7882
7950
  const reviewMustFixCount = review?.mustFix?.length ?? 0;
7883
- let canAuto = !gateTimeoutUnmeasured && autoMerge && reviewReal && review!.verdict !== 'fail' && reviewMustFixCount === 0 && reviewDiffComplete && !requiredEvidenceMissing && !latestSignalIncomplete && !decisionSignalRed;
7951
+ let canAuto = !gateTimeoutUnmeasured && autoMerge && (reviewReal || reviewDeferredToHost) && review!.verdict !== 'fail' && reviewMustFixCount === 0 && reviewDiffComplete && !requiredEvidenceMissing && !latestSignalIncomplete && !decisionSignalRed;
7884
7952
  // ⭐⭐ 통과의 «이유»를 둘로 가른다 — ⛔ 막지는 «않는다»(대표 판단 2026-08-11: ⓐ 문면만).
7885
7953
  // 📏 근거(`JDG-T36` · merge-decision 300건 전수): `verifyByBreaking` 이 실린 8건의 auto 중 ***5건***이
7886
7954
  // ***ran=true 인데 distinguishes=0***(아무것도 안 가르는 자기검증)이었고, 그 다섯이 «전부»
@@ -7891,7 +7959,8 @@ async function runSelfImplementInner(
7891
7959
  // 그건 `skippedReason` 이 이미 가른다. 그래서 여기 조건에 넣지 않는다.
7892
7960
  const verifyInconclusive = gate.verifyByBreaking?.ran === true && (gate.verifyByBreaking.distinguishes ?? 0) === 0;
7893
7961
  const verifyNothingAtBase = verifyInconclusive && (gate.verifyByBreaking?.missingAtBase ?? 0) > 0;
7894
- let mergeReason = canAuto ? (verifyNothingAtBase ? 'review-clean-verify-nothing-at-base' : verifyInconclusive ? 'review-clean-verify-inconclusive' : 'review-clean-armed')
7962
+ let mergeReason = canAuto && reviewDeferredToHost ? REVIEW_DEFERRED_TO_HOST_MERGE_REASON
7963
+ : canAuto ? (verifyNothingAtBase ? 'review-clean-verify-nothing-at-base' : verifyInconclusive ? 'review-clean-verify-inconclusive' : 'review-clean-armed')
7895
7964
  : gateTimeoutUnmeasured ? GATE_TIMEOUT_UNMEASURED_MERGE_REASON
7896
7965
  : !autoMerge ? 'no-auto-flag'
7897
7966
  : requiredEvidenceMissing ? 'required-evidence-uncovered'
@@ -8311,7 +8380,7 @@ async function runSelfImplementInner(
8311
8380
  if (opts.mergeByHost) {
8312
8381
  observe('merge-ready', { number: pr.number, checkedHeadCommit });
8313
8382
  progress('pr-opened', `호스트 재게이트 대기 (#${pr.number})`);
8314
- return { ok: true, stage: 'merge-ready', node: 'open-pr', ...resolveRunOutcome({ termination: 'completed' }), ...decisionSignalResult, ...preservedCompletionResult, ...(completionStatus ? { completionStatus } : {}), sessionId, worktreePath: wt.path, branch: wt.branch, gate, ...(review ? { review } : {}), ...reviewedHeadResult, checkedHeadCommit: checkedHeadCommit!, prUrl: pr.url, prNumber: pr.number };
8383
+ return { ok: true, stage: 'merge-ready', node: 'open-pr', ...resolveRunOutcome({ termination: 'completed' }), ...decisionSignalResult, ...preservedCompletionResult, ...(completionStatus ? { completionStatus } : {}), sessionId, worktreePath: wt.path, branch: wt.branch, gate, ...(review ? { review } : {}), ...reviewedHeadResult, ...(reviewDeferredToHost ? { mergeReason } : {}), checkedHeadCommit: checkedHeadCommit!, prUrl: pr.url, prNumber: pr.number };
8315
8384
  }
8316
8385
  // Landing freeze: the in-flight marker is written before the freeze is read, so a `freeze on` racing this merge waits.
8317
8386
  // The resume sweep merges from the repository that owns the run worktree (the worktree itself may be cleaned up).
@@ -0,0 +1,159 @@
1
+ /**
2
+ * 전제 다섯 되짚기 — premise-review 카드 순수 계산(FLEX-RFC §A-③).
3
+ *
4
+ * P1 골 · P2 자(판정 시험) · P3 범위(대상 경로) · P4 쪼갬 · P5 환경.
5
+ * ⛔ LLM 없이 잴 수 있는 둘만 판정한다 — P3(범위) · P2(preexisting 자).
6
+ * ⛔ unknown 은 «맞다(ok)»가 아니다 — 못 잰 전제는 ok 로 지어내지 않는다.
7
+ */
8
+
9
+ import type { FlexSignalsInput } from './flex-signals.js';
10
+
11
+ /** 못 잰 근거의 표기 — P1·P4·P5 는 이 값으로 unknown 으로만 나간다. */
12
+ const UNMEASURED = '못 잼';
13
+
14
+ export type PremiseKey = 'P1' | 'P2' | 'P3' | 'P4' | 'P5';
15
+ export type PremiseVerdict = 'ok' | 'wrong' | 'unknown';
16
+
17
+ export interface PremiseFinding {
18
+ premise: PremiseKey;
19
+ verdict: PremiseVerdict;
20
+ evidence: string;
21
+ }
22
+
23
+ /** `computeFlexSignals` 와 같은 꼴의 값 객체 + 카드가 가리킬 run 식별자와 P3 판정의 경계. */
24
+ export interface PremiseReviewInput extends FlexSignalsInput {
25
+ runId: string;
26
+ /** 이 골이 선언한 대상 경로 — 없으면 P3 는 unknown(경계를 못 잼). */
27
+ targetPaths?: readonly string[] | undefined;
28
+ }
29
+
30
+ export interface PremiseReviewCard {
31
+ runId: string;
32
+ findings: PremiseFinding[];
33
+ /** wrong 이 있을 때만 «가장 좁은 것» 하나 — wrong 이 없으면 undefined. */
34
+ proposal: PremiseFinding | undefined;
35
+ }
36
+
37
+ /** 최신 라운드의 실패 id 목록 — `gateFailedIdsByRound` 의 마지막 칸이 최신(`computeFlexSignals` 와 같은 순서). */
38
+ function latestFailingIds(input: FlexSignalsInput): readonly string[] | undefined {
39
+ const latest = input.gateFailedIdsByRound.length === 0
40
+ ? undefined
41
+ : input.gateFailedIdsByRound[input.gateFailedIdsByRound.length - 1];
42
+ return latest !== undefined && latest.length > 0 ? latest : undefined;
43
+ }
44
+
45
+ /**
46
+ * 게이트 실패 id — 생산자(orchestrator 의 roundSummaryEntries.failedIds)와 P3 파서가 «같은 꼴»을 쓰도록
47
+ * 둘 다 이 함수 짝을 거친다. 꼴: `${name}@${file ?? '?'} (${attribution})`.
48
+ */
49
+ export function formatGateFailedId(failure: { name: string; file?: string | undefined; attribution: string }): string {
50
+ return `${failure.name}@${failure.file ?? '?'} (${failure.attribution})`;
51
+ }
52
+
53
+ /**
54
+ * 실패 id 에서 시험 파일을 뽑는다 — `name@` 접두와 ` (귀속)` 접미를 뗀다. 이름에 `@` 가 섞여도
55
+ * (`user@example.com`·`@scope/pkg`)·경로에 `@`(`src/@scope/x.ts`)가 있어도 가른다: 경로 안의 `@` 는
56
+ * 세그먼트 머리(맨 앞 또는 `/` 바로 뒤)에만 온다. 그래서 «공백 없고 · 확장자로 끝나고 · 안의 `@` 가 전부
57
+ * 세그먼트 머리인» 후보를 처음 주는 `@` 가 구분자다. 그런 `@` 가 없거나 파일이 `?`·빈 값이면 undefined
58
+ * (못 잼) — fail-closed. 남는 모호함: 이름이 `/` 로 끝나면(`a/@src/x.ts`) 구분자를 경로로 읽는다.
59
+ */
60
+ export function gateFailedIdFile(id: string): string | undefined {
61
+ const withoutAttribution = id.replace(/\s*\([^)]*\)\s*$/, '');
62
+ for (let at = withoutAttribution.indexOf('@'); at >= 0; at = withoutAttribution.indexOf('@', at + 1)) {
63
+ const file = withoutAttribution.slice(at + 1);
64
+ if (file === '' || file === '?' || /\s/.test(file)) continue;
65
+ if (!/\.[A-Za-z0-9]+$/.test(file)) continue;
66
+ if (/[^/]@/.test(file)) continue;
67
+ return file;
68
+ }
69
+ return undefined;
70
+ }
71
+
72
+ /**
73
+ * 시험 파일 → 짝 소스. `dir/x.test.ts` → `dir/x.ts`(같은 폴더). 시험 전용 폴더(`test/`·`__tests__/`)의 시험은
74
+ * 짝을 추측하지 않는다(undefined · fail-closed). 시험 꼴이 아닌 파일은 그 자신이 소스다.
75
+ */
76
+ export function pairedSourceOf(file: string): string | undefined {
77
+ const normalized = file.replace(/^\.\//, '');
78
+ const testMatch = /^(.*)\.test\.([cm]?[jt]sx?)$/.exec(normalized);
79
+ if (!testMatch) return normalized;
80
+ if (/(^|\/)(test|tests|__tests__)\//.test(normalized)) return undefined;
81
+ return `${testMatch[1]}.${testMatch[2]}`;
82
+ }
83
+
84
+ function insideTargets(path: string, targets: readonly string[]): boolean {
85
+ return targets.some((target) => {
86
+ const t = target.replace(/^\.\//, '').replace(/\/+$/, '');
87
+ return path === t || path.startsWith(`${t}/`);
88
+ });
89
+ }
90
+
91
+ /** P2 자 — 판정 시험이 base 에서도 실패(preexisting)면 wrong. 귀속을 못 잼·하나라도 unknown 이면 unknown. */
92
+ function judgeP2(input: PremiseReviewInput): PremiseFinding {
93
+ const attributions = input.failureAttributions;
94
+ if (attributions === undefined || attributions.length === 0) {
95
+ return { premise: 'P2', verdict: 'unknown', evidence: UNMEASURED };
96
+ }
97
+ const preexistingIndex = attributions.indexOf('preexisting');
98
+ if (preexistingIndex >= 0) {
99
+ const latest = latestFailingIds(input);
100
+ const evidence = latest !== undefined && preexistingIndex < latest.length
101
+ ? latest[preexistingIndex]!
102
+ : 'preexisting';
103
+ return { premise: 'P2', verdict: 'wrong', evidence };
104
+ }
105
+ if (attributions.includes('unknown')) {
106
+ return { premise: 'P2', verdict: 'unknown', evidence: UNMEASURED };
107
+ }
108
+ return { premise: 'P2', verdict: 'ok', evidence: `preexisting 0/${attributions.length}` };
109
+ }
110
+
111
+ /**
112
+ * P3 범위 — 실패 시험 파일을 짝 소스로 옮겨 대상 경로와 견준다. 짝지은 소스(또는 시험 파일 자체)가
113
+ * 대상 경로 안이면 in · 짝은 지었는데 밖이면 wrong(그 시험 파일을 근거로). 파일을 못 읽거나 짝을 못 지은
114
+ * 실패가 하나라도 있고 wrong 이 없으면 unknown — 추측으로 ok 를 만들지 않는다.
115
+ */
116
+ function judgeP3(input: PremiseReviewInput): PremiseFinding {
117
+ const latest = latestFailingIds(input);
118
+ const targets = input.targetPaths;
119
+ if (latest === undefined) return { premise: 'P3', verdict: 'unknown', evidence: UNMEASURED };
120
+ if (targets === undefined || targets.length === 0) return { premise: 'P3', verdict: 'unknown', evidence: UNMEASURED };
121
+ let unmeasured: string | undefined;
122
+ for (const id of latest) {
123
+ const file = gateFailedIdFile(id);
124
+ if (file === undefined) { unmeasured ??= `${UNMEASURED}: 실패 파일 없음 (${id})`; continue; }
125
+ if (insideTargets(file, targets)) continue;
126
+ const source = pairedSourceOf(file);
127
+ if (source === undefined) { unmeasured ??= `${UNMEASURED}: 짝 소스 없음 (${file})`; continue; }
128
+ if (!insideTargets(source, targets)) return { premise: 'P3', verdict: 'wrong', evidence: file };
129
+ }
130
+ if (unmeasured !== undefined) return { premise: 'P3', verdict: 'unknown', evidence: unmeasured };
131
+ return { premise: 'P3', verdict: 'ok', evidence: `failing files all inside target paths (${latest.length})` };
132
+ }
133
+
134
+ /**
135
+ * wrong 이 여럿이면 «가장 좁은 것» 하나만 제안한다(RFC §A-③ — F6 카드 → F7 조치). 좁음 = 수정 폭:
136
+ * P2 자가 가장 좁다(판정 자만 고친다 · 골을 안 건드린다) → P5 환경(재무대) → P4 쪼갬 → P3 범위(경계를 넓힌다)
137
+ * → P1 골(요구 자체를 바꾼다)이 가장 넓다. findings 배열 순서에 우연히 맡기지 않고 이 rank 로 고른다.
138
+ */
139
+ const NARROWEST_FIRST: readonly PremiseKey[] = ['P2', 'P5', 'P4', 'P3', 'P1'];
140
+
141
+ export function narrowestWrong(findings: readonly PremiseFinding[]): PremiseFinding | undefined {
142
+ for (const premise of NARROWEST_FIRST) {
143
+ const wrong = findings.find((finding) => finding.premise === premise && finding.verdict === 'wrong');
144
+ if (wrong !== undefined) return wrong;
145
+ }
146
+ return undefined;
147
+ }
148
+
149
+ /** 전제 다섯을 되짚어 카드를 세운다 — 순수 계산, LLM 을 부르지 않는다. */
150
+ export function buildPremiseCard(input: PremiseReviewInput): PremiseReviewCard {
151
+ const findings: PremiseFinding[] = [
152
+ { premise: 'P1', verdict: 'unknown', evidence: UNMEASURED },
153
+ judgeP2(input),
154
+ judgeP3(input),
155
+ { premise: 'P4', verdict: 'unknown', evidence: UNMEASURED },
156
+ { premise: 'P5', verdict: 'unknown', evidence: UNMEASURED },
157
+ ];
158
+ return { runId: input.runId, findings, proposal: narrowestWrong(findings) };
159
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * HOST-REGATE-REASON-LOST (2nd · 2026-10-12): a host-regate failure must say «why» on the ledger.
3
+ *
4
+ * The first repair (#26215) put `hostRegateFailure` on the pr-terminal row but kept only the first 300 characters,
5
+ * and the gate's own `run()` cut every git/gh error to its first 300 characters as well. A git merge lists one
6
+ * `CONFLICT` line per file and gh puts the GraphQL reason at the end, so a head cut loses exactly the cause
7
+ * (run-caaf045f · PR #26472: the autopsy could not tell a conflict from a gate failure).
8
+ *
9
+ * The detail is bounded (ledger rows are append-only and replayed) but keeps both ends.
10
+ */
11
+ export const HOST_REGATE_DETAIL_MAX = 4096;
12
+
13
+ /** Keep `text` within `max` characters, preserving its head (an eighth) and its tail (the rest). */
14
+ export function clipRegateDetail(text: string, max = HOST_REGATE_DETAIL_MAX): string {
15
+ if (text.length <= max) return text;
16
+ const marker = ` …[${text.length - max} chars elided]… `;
17
+ const head = Math.floor(max / 8);
18
+ const tail = Math.max(0, max - head - marker.length);
19
+ return text.slice(0, head) + marker + text.slice(text.length - tail);
20
+ }
21
+
22
+ /** Files named by `git merge` CONFLICT lines (`CONFLICT (content): Merge conflict in <path>` and the rename/delete forms). */
23
+ export function parseConflictFiles(text: string): string[] {
24
+ const files = new Set<string>();
25
+ for (const raw of text.split('\n')) {
26
+ const line = /^CONFLICT \(([^)]*)\): (.*)$/.exec(raw);
27
+ if (!line) continue;
28
+ const rest = line[2]!;
29
+ const inPath = /Merge conflict in (.+)$/.exec(rest);
30
+ // modify/delete · rename/delete · file/directory name the path first; other free text is not a path.
31
+ const path = inPath ? inPath[1] : /^(?:modify\/delete|rename\/delete)$/.test(line[1]!)
32
+ ? /^(.+?) (?:deleted|renamed) in /.exec(rest)?.[1]
33
+ : undefined;
34
+ if (path) files.add(path);
35
+ }
36
+ return [...files].sort();
37
+ }
38
+
39
+ export type MergeFailureKind = 'base-modified' | 'head-moved' | 'conflict' | 'branch-policy' | 'other';
40
+
41
+ /** Classify a `gh pr merge` failure so a reader can tell a race from a conflict from a policy block without the raw text. */
42
+ export function classifyMergeFailure(detail: string, expectedHead?: string, actualHead?: string | null): MergeFailureKind {
43
+ if (/base branch was modified/i.test(detail)) return 'base-modified';
44
+ if (/head branch was modified/i.test(detail)) return 'head-moved';
45
+ if (expectedHead && actualHead && expectedHead !== actualHead) return 'head-moved';
46
+ if (/required status|review is required|protected branch|branch policy|not authorized|merge queue/i.test(detail)) return 'branch-policy';
47
+ if (/\bconflicts?\b/i.test(detail) && !/\bno conflicts?\b/i.test(detail)) return 'conflict';
48
+ return 'other';
49
+ }
50
+
51
+ /** One host-regate failure. The optional facts are filled for the pr-head, merge-conflict and merge steps. */
52
+ export interface HostRegateFailure {
53
+ step: string;
54
+ detail: string;
55
+ expectedHead?: string;
56
+ actualHead?: string | null;
57
+ conflictFiles?: string[];
58
+ /** Number omitted from conflictFiles when the ledger's 200-path bound is reached. */
59
+ conflictFilesOmitted?: number;
60
+ mergeFailureKind?: MergeFailureKind;
61
+ }
62
+
63
+ /** The optional facts of a failure, copied only when well-formed (ledger rows come back from disk). */
64
+ export function regateFailureFacts(failure: unknown): Omit<HostRegateFailure, 'step' | 'detail'> {
65
+ if (!failure || typeof failure !== 'object') return {};
66
+ const f = failure as Record<string, unknown>;
67
+ const sha = (value: unknown): value is string => typeof value === 'string' && /^[0-9a-f]{40}$/i.test(value);
68
+ const kinds: readonly MergeFailureKind[] = ['base-modified', 'head-moved', 'conflict', 'branch-policy', 'other'];
69
+ const conflictFiles = Array.isArray(f.conflictFiles) ? f.conflictFiles.filter((p): p is string => typeof p === 'string') : undefined;
70
+ const priorOmitted = Number.isSafeInteger(f.conflictFilesOmitted) && (f.conflictFilesOmitted as number) > 0 ? f.conflictFilesOmitted as number : 0;
71
+ const conflictFilesOmitted = Math.max(0, (conflictFiles?.length ?? 0) - 200) + priorOmitted;
72
+ return {
73
+ ...(sha(f.expectedHead) ? { expectedHead: f.expectedHead } : {}),
74
+ ...(sha(f.actualHead) || f.actualHead === null ? { actualHead: f.actualHead as string | null } : {}),
75
+ ...(conflictFiles ? { conflictFiles: conflictFiles.slice(0, 200) } : {}),
76
+ ...(conflictFilesOmitted > 0 ? { conflictFilesOmitted } : {}),
77
+ ...(typeof f.mergeFailureKind === 'string' && kinds.includes(f.mergeFailureKind as MergeFailureKind) ? { mergeFailureKind: f.mergeFailureKind as MergeFailureKind } : {}),
78
+ };
79
+ }
@@ -0,0 +1,21 @@
1
+ // REVIEW-ACP-POD ②-b — Pod 안 리뷰를 «호스트 리뷰로 미룸».
2
+ //
3
+ // S ②-a(#26457)로 호스트가 Pod merge-ready PR 을 Claude ACP 로 리뷰한다. 그런데 Pod 안 하니스 리뷰는 그대로 api 로 돌아
4
+ // 켜면 리뷰가 «둘»(돈 두 번)이다.
5
+ // C 오케스트레이터는 «실제 리뷰»(`reviewed=true`)가 있어야 merge-ready 를 낸다 — 그냥 끄면 `no-real-review` 로 멎는다.
6
+ // Q Pod 안 리뷰를 어떻게 «정직하게» 비우나?
7
+ // A 발사 호스트가 ACP 리뷰를 맡을 때만 자식 env 에 표지를 싣는다. 자식은 api 리뷰를 부르지 않고
8
+ // `reviewed=false` ⊕ `failureReason=deferred-to-host` 를 낸다(⛔ verdict 를 clean 으로 꾸미지 않는다).
9
+ // 오케스트레이터는 «호스트 병합(mergeByHost)» 런에서만 그 상태를 merge-ready 로 받고 `mergeReason` 에 적어 호스트로 돌려보낸다.
10
+ // 호스트는 그 표지를 보면 ACP 리뷰를 «반드시» 하고, 못 하면(refused) 병합하지 않는다(fail-closed).
11
+
12
+ /** 발사 호스트 → Pod 자식: 「리뷰는 호스트가 Claude ACP 로 한다 — Pod 안 api 리뷰를 부르지 마라」. 값 `1` 만 켠다. */
13
+ export const REVIEW_DEFERRED_TO_HOST_ENV = 'ELANOUS_REVIEW_DEFERRED_TO_HOST';
14
+ /** 미룬 리뷰의 `failureReason`(`reviewed=false` 의 «왜»). */
15
+ export const REVIEW_DEFERRED_TO_HOST_FAILURE = 'deferred-to-host';
16
+ /** 자식 merge-ready 결과의 `mergeReason` — 호스트가 이 값으로 «Pod 리뷰 없음»을 안다. */
17
+ export const REVIEW_DEFERRED_TO_HOST_MERGE_REASON = 'review-deferred-to-host';
18
+
19
+ export function reviewDeferredToHostFromEnv(env: Readonly<Record<string, string | undefined>>): boolean {
20
+ return env[REVIEW_DEFERRED_TO_HOST_ENV]?.trim() === '1';
21
+ }
@@ -1,4 +1,5 @@
1
1
  import { executeClassifyNode } from '../workflow-runtime/nodes/classify.js';
2
+ import { buildPremiseCard, type PremiseReviewCard, type PremiseReviewInput } from './premise-review.js';
2
3
  import { SUPERVISION_REWORK_SOURCES, type SupervisionReworkSource } from './supervision-vocabulary.js';
3
4
  import type { ClassifyNode, JudgmentContext, JudgmentResult, NodeExecContext, WorkflowDefinition, WorkflowDeps } from '../workflow-runtime/types.js';
4
5
 
@@ -22,6 +23,8 @@ interface ObservedValue {
22
23
  interface ReworkBudgetEvidence {
23
24
  observations: Record<'goal' | 'outcome' | 'history' | 'kind', ObservedValue>;
24
25
  modelReasoning: string;
26
+ /** UNCONVERGEABLE 직전에 세운 premise-review 카드(FLEX-RFC §A-③). 카드를 안 만든 판정에는 키가 없다. */
27
+ premiseReview?: PremiseReviewCard | undefined;
25
28
  }
26
29
 
27
30
  type EvidencedJudgmentResult = JudgmentResult & { evidence: ReworkBudgetEvidence };
@@ -108,7 +111,13 @@ export function reworkBudgetEvidenceForObservation(readEvidence: () => unknown):
108
111
  }
109
112
  }
110
113
 
111
- export function createReworkBudgetJudgment(callLLM: WorkflowDeps['callLLM']) {
114
+ /** `createReworkBudgetJudgment` 의 선택 인자 — 주지 않으면 카드 없이 지금 동작 그대로. */
115
+ export interface ReworkBudgetJudgmentOpts {
116
+ /** UNCONVERGEABLE 판정 직전에 세울 premise-review 카드의 입력(값 객체). */
117
+ premiseInput?: PremiseReviewInput | undefined;
118
+ }
119
+
120
+ export function createReworkBudgetJudgment(callLLM: WorkflowDeps['callLLM'], opts: ReworkBudgetJudgmentOpts = {}) {
112
121
  let latestEvidence: ReworkBudgetEvidence | undefined;
113
122
  const provider = async (contractId: string, ctx: JudgmentContext): Promise<JudgmentResult> => {
114
123
  if (contractId !== REWORK_BUDGET_JUDGMENT) {
@@ -145,6 +154,7 @@ export function createReworkBudgetJudgment(callLLM: WorkflowDeps['callLLM']) {
145
154
  toolPolicy: {},
146
155
  };
147
156
  let modelReasoning = '';
157
+ let premiseReview: PremiseReviewCard | undefined;
148
158
  const result = await executeClassifyNode(node, execContext, {
149
159
  callLLM: async (args) => {
150
160
  modelReasoning = await callLLM(args);
@@ -152,7 +162,11 @@ export function createReworkBudgetJudgment(callLLM: WorkflowDeps['callLLM']) {
152
162
  },
153
163
  runBash: async () => ({ stdout: '', stderr: '', exitCode: 0 }),
154
164
  });
155
- const evidence = (): ReworkBudgetEvidence => ({ observations, modelReasoning });
165
+ const evidence = (): ReworkBudgetEvidence => ({
166
+ observations,
167
+ modelReasoning,
168
+ ...(premiseReview === undefined ? {} : { premiseReview }),
169
+ });
156
170
  const evidenced = (judgment: JudgmentResult): EvidencedJudgmentResult => {
157
171
  const resultWithEvidence = withEvidence(judgment, evidence());
158
172
  latestEvidence = resultWithEvidence.evidence;
@@ -172,7 +186,13 @@ export function createReworkBudgetJudgment(callLLM: WorkflowDeps['callLLM']) {
172
186
  + ` expected one of EXTEND|SUFFICIENT|UNCONVERGEABLE`,
173
187
  });
174
188
  }
175
- return evidenced({ ok: true, output: picked, verdict: mapReworkBudgetVerdict(picked, kind) });
189
+ const verdict = mapReworkBudgetVerdict(picked, kind);
190
+ // FLEX-RFC §A-③ — UNCONVERGEABLE 을 «내기 전에» 전제를 되짚는다. 카드는 기존 증거 관측에 실려
191
+ // 원장('rework-budget' 사건)으로 나간다 — 사건 형식은 그대로, 카드는 증거 안의 추가 칸이다.
192
+ if (picked === 'UNCONVERGEABLE' && opts.premiseInput !== undefined) {
193
+ premiseReview = buildPremiseCard(opts.premiseInput);
194
+ }
195
+ return evidenced({ ok: true, output: picked, verdict });
176
196
  };
177
197
  return Object.assign(provider, { evidenceForObservation: () => latestEvidence });
178
198
  }
@@ -566,7 +566,7 @@ export function queryRunningRuns(options: { includeTest?: boolean; runIds?: read
566
566
  }
567
567
  }
568
568
 
569
- function isPartialRunningRuns(result: RunningRunsResult): boolean {
569
+ export function isPartialRunningRuns(result: RunningRunsResult): boolean {
570
570
  return (result.count !== undefined && typeof result.count !== 'number' && result.count.count === null)
571
571
  || result.completeness === 'partial' || hasUnreadableLedgerObservation(result.ledger) || (result.unreadable?.length ?? 0) > 0;
572
572
  }
@@ -624,7 +624,7 @@ function formatElapsed(ms: number): string {
624
624
  export function renderRunProgressTable(result: RunningRunsResult, nowMs: number = Date.now()): string {
625
625
  const partial = isPartialRunningRuns(result);
626
626
  const header = partial
627
- ? `부분 관측 — 최소 ${runningRunsLowerBound(result)} (읽지 못한 원장: ${runningRunsUnreadable(result).map((item) => `${item.dir}:${item.reason}`).join(',') || '없음'})`
627
+ ? `부분 관측 — 최소 ${runningRunsLowerBound(result)} (읽지 못한 원장: ${runningRunsUnreadable(result).map((item) => `${item.dir}:${item.reason}`).join(',') || '목록 미관측'})`
628
628
  : `도는 런 ${result.counts.running + result.counts['probable-running']} (확인 ${result.counts.running} · 추정 ${result.counts['probable-running']})`;
629
629
  const rows = buildRunProgressRows(result, nowMs).map((row) => {
630
630
  const phaseUnreadable = row.phaseObservation === 'unreadable' || row.phaseObservation === 'partially-unreadable';
@@ -0,0 +1,23 @@
1
+ // SCOPE-HELD-DELIVER (0.2.25) — which out-of-scope edits sit right next to a declared target.
2
+ // 10-11~12: 34 scope-held runs auto-answered «Stay in scope» after 30 unanswered minutes and threw away finished work;
3
+ // the outside files were a declared file's same-folder neighbours (its other tests, a sibling helper, the folder's
4
+ // plugin.json). Those are adjacent: the run goes on to its gate instead of parking on a question nobody answers.
5
+
6
+ const normalize = (path: string): string => path.replace(/\\/g, '/').replace(/^\.\//, '').replace(/\/+$/, '');
7
+ const dirOf = (path: string): string => { const at = path.lastIndexOf('/'); return at < 0 ? '' : path.slice(0, at); };
8
+
9
+ /** Split out-of-scope files into those adjacent to a declared target and the rest. A file is adjacent when it sits in
10
+ * the same folder as a declared file. A declared folder adds nothing (its contents are already in scope), and a
11
+ * declared repo-root file adds nothing (the root holds the whole repo's config). */
12
+ export function classifyOutOfScope(outsideFiles: readonly string[], declaredPaths: readonly string[]): { adjacent: string[]; other: string[] } {
13
+ const folders = new Set<string>();
14
+ for (const declared of declaredPaths.map(normalize)) {
15
+ const dir = dirOf(declared);
16
+ // A path with an extension names a file; without one it names a folder.
17
+ if (dir && /\.[A-Za-z0-9]+$/.test(declared.slice(dir.length + 1))) folders.add(dir);
18
+ }
19
+ const adjacent: string[] = [];
20
+ const other: string[] = [];
21
+ for (const file of outsideFiles) (folders.has(dirOf(normalize(file))) ? adjacent : other).push(file);
22
+ return { adjacent, other };
23
+ }