elanous 0.2.34 → 0.2.36

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 (802) 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/{abb4b98b.163e0f56e84ae35d.js → 053a429e.9a63436527cc751c.js} +1 -1
  4. package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +287 -0
  5. package/apps/pwa/out/_next/static/chunks/1201.afbfc5b1c5e5cbe4.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/190.285c832bd9626f8c.js +64 -0
  11. package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +36 -0
  12. package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +149 -0
  15. package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/2500.cbc1257b774aae52.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/{6086.913a69e6fa3e4a8b.js → 2683.c9773a0c589b031b.js} +4 -4
  20. package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +24 -0
  21. package/apps/pwa/out/_next/static/chunks/{5576-82d3703636d5c4b9.js → 275-02ea4c2a33980422.js} +3 -3
  22. package/apps/pwa/out/_next/static/chunks/{ffdc3a04.b9c23c1b28dd4a96.js → 2812ca6a.3b9f4a7a08885744.js} +1 -1
  23. package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2941.3c3546f96bc6efa7.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +24 -0
  26. package/apps/pwa/out/_next/static/chunks/{9550.d5f76828f972058c.js → 2986.45d7652e4f13557e.js} +2 -2
  27. package/apps/pwa/out/_next/static/chunks/3031-85328a92fcce4da6.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/{8817.61bb7ffbba502ecb.js → 3136.30aaaa5fa03662a3.js} +1 -1
  29. package/apps/pwa/out/_next/static/chunks/{9131-fce7256c4180c4a5.js → 3148-98efd4869d660a87.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/{3498.cf2a15a8a9e5b926.js → 3155.2587a55196ecb394.js} +3 -3
  31. package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/{3103.84470c8445962f04.js → 3324.a09703033abcbd2f.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +8 -0
  36. package/apps/pwa/out/_next/static/chunks/3410.7f9af5ab77cbe65f.js +115 -0
  37. package/apps/pwa/out/_next/static/chunks/{3819.163d4777f0a597f6.js → 3538.a445e50bb359d068.js} +2 -2
  38. package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +286 -0
  40. package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/{3414.172ad4ca2d9b08e8.js → 3727.7949ccaacaa71242.js} +2 -2
  42. package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3757-180308bc61021b05.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +74 -0
  45. package/apps/pwa/out/_next/static/chunks/3840-5825d56d46976a92.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/{9b48c871.204d5d13e7809bd0.js → 3a3d9966.cc4d4585a2708e7c.js} +1 -1
  48. package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4116.a84a92a2492c080e.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +104 -0
  51. package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/{6740.43de73fc427c9fe2.js → 4286.b70c4520306817e8.js} +1 -1
  53. package/apps/pwa/out/_next/static/chunks/4304.e9b2512834a9e23e.js +23 -0
  54. package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/{8548.036c344973968847.js → 4615.8525eb0add35eba6.js} +1 -1
  56. package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +148 -0
  57. package/apps/pwa/out/_next/static/chunks/{3411-f87314c6c66ebc73.js → 5085-bce4904931767ca6.js} +1 -1
  58. package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +93 -0
  59. package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/{3110.0a7065f25c841818.js → 528.38ce20ef8aa251ff.js} +16 -16
  61. package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +122 -0
  62. package/apps/pwa/out/_next/static/chunks/{1644.35dd25240ae24e4b.js → 552.b7d061ad91eeac51.js} +2 -2
  63. package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/{3837.722e053fb9f321ad.js → 5711.957b095705c12560.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/{2124.ed5bf480cea7f85b.js → 575.d929793a53f27c4b.js} +1 -1
  66. package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/{7562.948255cbc3e79d33.js → 599.c39c571b6733f2a2.js} +2 -2
  70. package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +79 -0
  71. package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/6466-92e65a48490b68a9.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/6566.926a1d1b7c911442.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +27 -0
  84. package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/{5446.edf141cff9ef647d.js → 6925.562d532110879886.js} +1 -1
  86. package/apps/pwa/out/_next/static/chunks/{7005.1623d2aea78eb85f.js → 6943.c6b24124853a47b2.js} +1 -1
  87. package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/{8368.014caa8de2f5af34.js → 7481.39f7a4654907bf6e.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/{2554.3b5e200f5f5cfcd6.js → 771.c3cdb6c1f7f47c02.js} +16 -16
  92. package/apps/pwa/out/_next/static/chunks/7784.1f0ac4a16d190cf4.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{3121.779fafe3e44612c5.js → 7891.03f910124a737985.js} +1 -1
  96. package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8037.e254fd797aa224d1.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +62 -0
  100. package/apps/pwa/out/_next/static/chunks/{9a8cb466.cc9fc9e6e46038aa.js → 873d6c12.09bd499f57171543.js} +1 -1
  101. package/apps/pwa/out/_next/static/chunks/{7431.3051e9b8a4372d2d.js → 8904.7d51af2dc033965c.js} +2 -2
  102. package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +90 -0
  104. package/apps/pwa/out/_next/static/chunks/914.8abefd48d579547b.js +94 -0
  105. package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/{1895-60ed0e341c658bd4.js → 9250-072df22eaadaa6b5.js} +1 -1
  107. package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +77 -0
  111. package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/{2547.dd27303624cb4da8.js → 9514.131c52cc75fe6439.js} +1 -1
  115. package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9789.60f723d18097ec30.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9f31e478.fefcbcd3c388ebc5.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/{page-4fb31eb476dcbad3.js → page-083747f1d4518f61.js} +1 -1
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-e2de2e59111c9aad.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-f2b2e4bf6e981450.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-2af16e62c12f22df.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-e7abc34a48a6f71e.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-c15958835534404b.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{5014f970-22bef0b5210f7d60.js → ccae1c4b-0cf414f5eff1b10d.js} +1 -1
  174. package/apps/pwa/out/_next/static/chunks/{4fa33ebd.21c1bd5b294496e6.js → ceba0382.650712b56b85b582.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/da5ecc5c-b005ad8cac737d57.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/f9a61e4d.1fc2c1dbdd49fe46.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +1 -0
  183. package/apps/pwa/out/_next/static/{L04y73dlwKeTW-GetaTF3 → uC-N0emedeNOFuaBQFv-I}/_buildManifest.js +1 -1
  184. package/apps/pwa/out/approvals/index.html +1 -1
  185. package/apps/pwa/out/approvals/index.txt +22 -22
  186. package/apps/pwa/out/autopilot/index.html +1 -1
  187. package/apps/pwa/out/autopilot/index.txt +22 -22
  188. package/apps/pwa/out/board/index.html +1 -1
  189. package/apps/pwa/out/board/index.txt +22 -22
  190. package/apps/pwa/out/botlab/index.html +1 -1
  191. package/apps/pwa/out/botlab/index.txt +21 -21
  192. package/apps/pwa/out/bots/index.html +1 -1
  193. package/apps/pwa/out/bots/index.txt +21 -21
  194. package/apps/pwa/out/ceo/index.html +1 -1
  195. package/apps/pwa/out/ceo/index.txt +22 -22
  196. package/apps/pwa/out/chat/index.html +1 -1
  197. package/apps/pwa/out/chat/index.txt +21 -21
  198. package/apps/pwa/out/consult/index.html +1 -1
  199. package/apps/pwa/out/consult/index.txt +22 -22
  200. package/apps/pwa/out/control/index.html +1 -1
  201. package/apps/pwa/out/control/index.txt +22 -22
  202. package/apps/pwa/out/decisions/index.html +1 -1
  203. package/apps/pwa/out/decisions/index.txt +21 -21
  204. package/apps/pwa/out/design-check/index.html +1 -1
  205. package/apps/pwa/out/design-check/index.txt +22 -22
  206. package/apps/pwa/out/editor/index.html +1 -1
  207. package/apps/pwa/out/editor/index.txt +22 -22
  208. package/apps/pwa/out/exec/index.html +1 -1
  209. package/apps/pwa/out/exec/index.txt +22 -22
  210. package/apps/pwa/out/field/index.html +1 -1
  211. package/apps/pwa/out/field/index.txt +22 -22
  212. package/apps/pwa/out/healthz +1 -1
  213. package/apps/pwa/out/index.html +1 -1
  214. package/apps/pwa/out/index.txt +21 -21
  215. package/apps/pwa/out/inside/index.html +1 -1
  216. package/apps/pwa/out/inside/index.txt +21 -21
  217. package/apps/pwa/out/intake/index.html +1 -1
  218. package/apps/pwa/out/intake/index.txt +22 -22
  219. package/apps/pwa/out/live/index.html +1 -1
  220. package/apps/pwa/out/live/index.txt +22 -22
  221. package/apps/pwa/out/live-run/index.html +1 -1
  222. package/apps/pwa/out/live-run/index.txt +22 -22
  223. package/apps/pwa/out/loops/index.html +1 -1
  224. package/apps/pwa/out/loops/index.txt +21 -21
  225. package/apps/pwa/out/market/index.html +1 -1
  226. package/apps/pwa/out/market/index.txt +21 -21
  227. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  228. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  229. package/apps/pwa/out/morning/index.html +1 -1
  230. package/apps/pwa/out/morning/index.txt +22 -22
  231. package/apps/pwa/out/observatory/index.html +1 -1
  232. package/apps/pwa/out/observatory/index.txt +22 -22
  233. package/apps/pwa/out/ops/checklist/index.html +1 -1
  234. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  235. package/apps/pwa/out/ops/release/index.html +1 -1
  236. package/apps/pwa/out/ops/release/index.txt +21 -21
  237. package/apps/pwa/out/ops/seats/index.html +1 -1
  238. package/apps/pwa/out/ops/seats/index.txt +21 -21
  239. package/apps/pwa/out/outputs/index.html +1 -1
  240. package/apps/pwa/out/outputs/index.txt +21 -21
  241. package/apps/pwa/out/reflection/index.html +1 -1
  242. package/apps/pwa/out/reflection/index.txt +22 -22
  243. package/apps/pwa/out/scheduler/index.html +1 -1
  244. package/apps/pwa/out/scheduler/index.txt +22 -22
  245. package/apps/pwa/out/sessions/index.html +1 -1
  246. package/apps/pwa/out/sessions/index.txt +21 -21
  247. package/apps/pwa/out/settings/devices/index.html +1 -1
  248. package/apps/pwa/out/settings/devices/index.txt +22 -22
  249. package/apps/pwa/out/settings/index.html +1 -1
  250. package/apps/pwa/out/settings/index.txt +22 -22
  251. package/apps/pwa/out/setup/done/index.html +1 -1
  252. package/apps/pwa/out/setup/done/index.txt +22 -22
  253. package/apps/pwa/out/setup/index.html +1 -1
  254. package/apps/pwa/out/setup/index.txt +22 -22
  255. package/apps/pwa/out/share/index.html +1 -1
  256. package/apps/pwa/out/share/index.txt +22 -22
  257. package/apps/pwa/out/showroom/index.html +1 -1
  258. package/apps/pwa/out/showroom/index.txt +21 -21
  259. package/apps/pwa/out/tasks/index.html +1 -1
  260. package/apps/pwa/out/tasks/index.txt +22 -22
  261. package/apps/pwa/out/term/index.html +1 -1
  262. package/apps/pwa/out/term/index.txt +22 -22
  263. package/apps/pwa/out/today/index.html +1 -1
  264. package/apps/pwa/out/today/index.txt +22 -22
  265. package/apps/pwa/out/trace/index.html +1 -1
  266. package/apps/pwa/out/trace/index.txt +22 -22
  267. package/apps/pwa/out/vault/index.html +1 -1
  268. package/apps/pwa/out/vault/index.txt +22 -22
  269. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  270. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  271. package/apps/pwa/out/workflows/index.html +1 -1
  272. package/apps/pwa/out/workflows/index.txt +22 -22
  273. package/apps/pwa/out/workspace/index.html +1 -1
  274. package/apps/pwa/out/workspace/index.txt +22 -22
  275. package/apps/pwa/out/worktrees/index.html +1 -1
  276. package/apps/pwa/out/worktrees/index.txt +22 -22
  277. package/bin/elanous.mjs +3 -2
  278. package/catalog/providers/opengateway.yaml +25 -0
  279. package/docs/goal-context/01-goal-authoring-checks.md +8 -0
  280. package/docs/goal-context/03-verification-menu.md +24 -0
  281. package/docs/goal-context/04-mock-scenarios.md +100 -0
  282. package/docs/goal-context/05-authoring-lessons.jsonl +47 -0
  283. package/docs/goal-context/README.md +7 -0
  284. package/graphs/catalog/catalog.yaml +1 -1
  285. package/graphs/default-loop.yaml +63 -4
  286. package/graphs/document-loop.yaml +51 -3
  287. package/graphs/implement-loop.yaml +77 -4
  288. package/graphs/journey/ta-journey.yaml +11 -1
  289. package/graphs/journey/units/author-dialogue/author-dialogue.yaml +42 -0
  290. package/graphs/journey/units/author-dialogue/observe.ts +96 -0
  291. package/graphs/journey/units/author-dialogue/recipes.yaml +10 -0
  292. package/graphs/operate-loop.yaml +51 -3
  293. package/graphs/release/recipes.yaml +6 -0
  294. package/graphs/release/release-loop.yaml +17 -4
  295. package/graphs/research-loop.yaml +137 -3
  296. package/graphs/test-diet/test-diet.yaml +3 -0
  297. package/graphs/wizard/recipes.yaml +44 -0
  298. package/graphs/wizard/wizard-loop.yaml +44 -0
  299. package/graphs/work/research-report.yaml +2 -0
  300. package/package.json +1 -1
  301. package/scripts/ci-typecheck-changed.ts +139 -5
  302. package/scripts/coord-role-pack.ts +19 -6
  303. package/scripts/first10-gate.ts +416 -0
  304. package/scripts/fleet/wsl-node-setup.sh +432 -0
  305. package/scripts/hq/standby-snapshot.ts +17 -12
  306. package/scripts/release-loop/docs-land-node.ts +21 -5
  307. package/scripts/release-loop/docs-node.ts +204 -8
  308. package/scripts/release-loop/gate-baseline-receipt.ts +155 -0
  309. package/scripts/release-loop/gate-node.ts +427 -72
  310. package/scripts/release-loop/gate-partial.ts +65 -11
  311. package/scripts/release-loop/gate-radius-live.ts +177 -0
  312. package/scripts/release-loop/gate-radius-shadow.ts +1 -1
  313. package/scripts/release-loop/node-verdict.ts +14 -1
  314. package/scripts/release-loop/npm-publish-node.ts +66 -12
  315. package/scripts/release-loop/probe-pod-host-dirs-live.ts +5 -0
  316. package/scripts/release-loop/pwa-remote.ts +166 -0
  317. package/scripts/release-loop/pwa-scenarios-node.ts +19 -3
  318. package/scripts/release-loop/resume-cap.ts +14 -34
  319. package/scripts/release-loop/resume-release.ts +78 -15
  320. package/scripts/release-loop/traffic-node.ts +59 -0
  321. package/scripts/release-loop/traffic-transition.ts +159 -0
  322. package/scripts/release-loop/unattended-release.ts +2 -0
  323. package/scripts/rhythm/daily.ts +137 -3
  324. package/scripts/test-diet/lib.ts +6 -1
  325. package/scripts/test-diet/node.ts +194 -13
  326. package/scripts/ux-sim.ts +92 -0
  327. package/skills/README.md +1 -0
  328. package/src/acp/core-turn-bridge.ts +48 -6
  329. package/src/agent/delegate-hint.ts +16 -0
  330. package/src/agent/runner.ts +82 -2
  331. package/src/agent/self-ambient-cache.ts +8 -0
  332. package/src/agent/task-notification.ts +56 -10
  333. package/src/agent/types.ts +4 -0
  334. package/src/agent-substrate/acp-reviewer.ts +39 -4
  335. package/src/agent-substrate/pr-reviewer.ts +72 -3
  336. package/src/agent-substrate/review-intent.ts +29 -2
  337. package/src/agent-substrate/review-observation.ts +3 -0
  338. package/src/agent-substrate/self-review-cli.ts +229 -28
  339. package/src/autopilot/mission-codebase-gate.ts +141 -12
  340. package/src/autopilot/pr-manager.ts +240 -41
  341. package/src/boot/daemon-tools/self-implement.ts +1 -0
  342. package/src/budget/run-usage-rollup.ts +1 -0
  343. package/src/budget/usage-outcomes.ts +8 -4
  344. package/src/capture/tui-self-report.ts +102 -0
  345. package/src/chat/goal-continue-verdict.ts +41 -0
  346. package/src/chat/index.ts +30 -6
  347. package/src/chat/internal-turn-origin.ts +1 -0
  348. package/src/chat/paste-fold.ts +86 -0
  349. package/src/chat/pickers/modal-runtime.ts +10 -27
  350. package/src/chat/tool-render/block.ts +32 -0
  351. package/src/chat/tool-render/dispatch.ts +2 -20
  352. package/src/chat/tool-render/result-text.ts +98 -0
  353. package/src/chat/turn-typeahead.ts +70 -7
  354. package/src/cli/agent-cli.ts +13 -2
  355. package/src/cli/config-audit.ts +119 -0
  356. package/src/cli/doctor-cli.ts +26 -1
  357. package/src/cli/guardian-cli.ts +10 -0
  358. package/src/cli/herdr-cli.ts +34 -0
  359. package/src/cli/light-entry-route.ts +50 -7
  360. package/src/cli/log-event-names.ts +2 -0
  361. package/src/cli/make-cli.ts +247 -11
  362. package/src/cli/msg-cli.ts +117 -3
  363. package/src/cli/pod-cli.ts +77 -3
  364. package/src/cli/pr-cli.ts +34 -18
  365. package/src/cli/pr-land-base-read.ts +11 -2
  366. package/src/cli/pr-land-heavy-remote.ts +6 -3
  367. package/src/cli/pr-land-overlap-evidence.ts +23 -4
  368. package/src/cli/pr-land-pod-shadow-job.ts +3 -0
  369. package/src/cli/pr-land-recovery.ts +117 -1
  370. package/src/cli/pty-takeover-cli.ts +8 -7
  371. package/src/cli/release-checklist-read-cli.ts +79 -0
  372. package/src/cli/release-cli.ts +92 -106
  373. package/src/cli/release-single-flight.ts +1 -1
  374. package/src/cli/remote-resolve.ts +1 -1
  375. package/src/cli/root-tui-entry.ts +48 -0
  376. package/src/cli/sim-cli.ts +22 -0
  377. package/src/cli/tasks-card-show.ts +162 -0
  378. package/src/cli/tasks-cli.ts +1065 -338
  379. package/src/cli/tasks-read-cli.ts +197 -0
  380. package/src/cli/usage-cli.ts +13 -11
  381. package/src/clipboard/history.ts +179 -13
  382. package/src/config.ts +8 -1
  383. package/src/core-turn/run-core-turn.ts +4 -2
  384. package/src/core-turn/run-goal-loop.ts +73 -16
  385. package/src/core-turn/types.ts +6 -1
  386. package/src/dashboard/chat/acp-chat.ts +8 -0
  387. package/src/dashboard/context/keys.ts +8 -31
  388. package/src/dashboard/index.ts +280 -59
  389. package/src/dashboard/input/agent-wake.ts +7 -1
  390. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +146 -3
  391. package/src/dashboard/input/chat-main-slash-command.ts +4 -2
  392. package/src/dashboard/input/goal-continue.ts +210 -0
  393. package/src/dashboard/input/goal-interim.ts +2 -0
  394. package/src/dashboard/input/internal-turn.ts +2 -8
  395. package/src/dashboard/input/seat-autowake.ts +9 -7
  396. package/src/dashboard/input/turn-autoheal.ts +52 -0
  397. package/src/dashboard/render/theme-resolver.ts +33 -4
  398. package/src/dashboard/seat-boot-preamble.ts +132 -5
  399. package/src/dashboard/slash-runtime/chat-persona.ts +65 -8
  400. package/src/dashboard/slash-runtime/dashboard-handlers.ts +3 -2
  401. package/src/dashboard/slash-runtime/model-choices.ts +15 -0
  402. package/src/dashboard/stale-install-check.ts +3 -99
  403. package/src/debug/batch-queue.ts +119 -0
  404. package/src/debug/tui-log-tag.ts +67 -0
  405. package/src/display/agent-surface.ts +7 -0
  406. package/src/domains/schedule-registry.ts +16 -2
  407. package/src/domains/standalone-log-sink.ts +15 -2
  408. package/src/esc-abort-gate.ts +69 -0
  409. package/src/git-fs/idle-refresh.ts +76 -0
  410. package/src/git-fs/index.ts +18 -7
  411. package/src/git-fs/worktree.ts +137 -5
  412. package/src/graph-kinds/registry.ts +2 -2
  413. package/src/graph-runner/graph-cli.ts +18 -0
  414. package/src/graph-runner/runner.ts +173 -21
  415. package/src/graph-wizard/generate.ts +108 -4
  416. package/src/graph-wizard/steps.ts +15 -0
  417. package/src/grok/credential.ts +10 -3
  418. package/src/grounding/proactive-ground.ts +86 -0
  419. package/src/harness/control-inbox.ts +49 -1
  420. package/src/harness/harness-cli-command.ts +163 -35
  421. package/src/harness/harness-incidents.ts +85 -1
  422. package/src/harness/launch-utterance-ledger.ts +208 -0
  423. package/src/harness/pod-control-send.ts +33 -5
  424. package/src/harness/self-send-remote.ts +69 -0
  425. package/src/harness/self-send-routing-guard.ts +6 -0
  426. package/src/harness/self-send-target.ts +4 -3
  427. package/src/impl-discipline/detector.ts +16 -4
  428. package/src/impl-discipline/system-prompt.ts +11 -0
  429. package/src/impl-discipline/types.ts +2 -2
  430. package/src/index.ts +822 -154
  431. package/src/input-core/context-key-runtime.ts +21 -0
  432. package/src/intake-plane/already-built-hint.ts +4 -2
  433. package/src/intake-plane/requirement-funnel.ts +29 -1
  434. package/src/light-cli.ts +32 -11
  435. package/src/llm/opengateway-models.ts +11 -0
  436. package/src/llm/provider-credentials.ts +14 -0
  437. package/src/llm/provider-detect.ts +8 -1
  438. package/src/llm/runtime-model-family.ts +2 -1
  439. package/src/llm-wellformed.ts +70 -0
  440. package/src/llm.ts +247 -59
  441. package/src/loops/msg-wake.ts +35 -39
  442. package/src/loops/orchestrator/inbox.ts +59 -11
  443. package/src/loops/orchestrator/knowhow-pack.ts +364 -0
  444. package/src/loops/orchestrator/tick.ts +5 -1
  445. package/src/maturity/feature-maturity.ts +1 -1
  446. package/src/model-tier/llm-tier-map.ts +15 -1
  447. package/src/models/prompts.ts +17 -2
  448. package/src/msg/msg-post-office.ts +116 -0
  449. package/src/mss/logging/log-store.ts +79 -22
  450. package/src/native-tool-catalog.ts +15 -1
  451. package/src/nexus/api/decisions-route.ts +38 -18
  452. package/src/nexus/api/graph-wizard-api.ts +20 -2
  453. package/src/nexus/api/loop-resources.ts +13 -1
  454. package/src/nexus/boot/register-mcp-clients.ts +263 -38
  455. package/src/nexus/onboarding/first-boot-wizard.ts +56 -8
  456. package/src/oauth/codex.ts +7 -0
  457. package/src/onboarding/first-run.ts +37 -6
  458. package/src/onboarding/web-first.ts +43 -11
  459. package/src/ops/overview-collect.ts +30 -9
  460. package/src/ops/overview.ts +22 -9
  461. package/src/persona/loader.ts +11 -0
  462. package/src/persona/types.ts +8 -0
  463. package/src/pr-tool/census.ts +261 -27
  464. package/src/prompt-library/session-guidance.ts +14 -0
  465. package/src/provider-summary.ts +8 -0
  466. package/src/pty-shell/herdr-agent-report.ts +118 -9
  467. package/src/pty-shell/herdr-prompt.ts +266 -0
  468. package/src/pty-shell/pty-control-ipc.ts +151 -8
  469. package/src/pty-shell/pty-manifest.ts +7 -0
  470. package/src/pty-shell/pty-special-keys.ts +42 -2
  471. package/src/pty-shell/stale-install-check.ts +99 -0
  472. package/src/pty-shell/tui-run-state.ts +14 -2
  473. package/src/release-loop/auto-start.ts +20 -2
  474. package/src/release-loop/checklist.ts +100 -4
  475. package/src/release-loop/landed-but-yellow.ts +129 -5
  476. package/src/release-loop/light-rc.ts +1 -0
  477. package/src/release-loop/rehearsal.ts +37 -21
  478. package/src/repl/index.ts +192 -17
  479. package/src/repl/ops-msg-bridge.ts +32 -0
  480. package/src/seat-loop/knowhow-lint.ts +1 -1
  481. package/src/self-dev/ask-launch-flow.ts +44 -5
  482. package/src/self-dev/cli-help-text.ts +17 -0
  483. package/src/self-dev/decompose-proposal.ts +172 -20
  484. package/src/self-dev/decompose.ts +61 -0
  485. package/src/self-dev/dev-cli.ts +48 -12
  486. package/src/self-dev/dev-pipeline.ts +8 -2
  487. package/src/self-dev/draft-residue.ts +37 -1
  488. package/src/self-dev/draft-sweep.ts +137 -11
  489. package/src/self-dev/draft-triage-rules.ts +138 -0
  490. package/src/self-dev/fleet-reduce.ts +3 -2
  491. package/src/self-dev/glm-credential-guard.ts +77 -0
  492. package/src/self-dev/graph-front-nodes.ts +112 -0
  493. package/src/self-dev/graph-journey-nodes.ts +2 -0
  494. package/src/self-dev/graph-journey-route.ts +12 -2
  495. package/src/self-dev/harness-run-cli.ts +3 -15
  496. package/src/self-dev/orchestrate-cli-text.ts +10 -0
  497. package/src/self-dev/orchestrate-cli.ts +68 -3
  498. package/src/self-dev/orchestrate.ts +116 -17
  499. package/src/self-dev/review-provider-fallback.ts +35 -1
  500. package/src/self-dev/run-supervisor.ts +55 -2
  501. package/src/self-dev/run-types.ts +1 -1
  502. package/src/self-dev/self-orchestrate-runtime.ts +1 -11
  503. package/src/self-dev/shard-aggregate.ts +42 -5
  504. package/src/self-dev/shard-run.ts +8 -1
  505. package/src/self-health/autoheal.ts +153 -0
  506. package/src/self-health/signatures.ts +6 -0
  507. package/src/self-implement/blocked-draft-policy.ts +20 -0
  508. package/src/self-implement/classify-shadow.ts +3 -7
  509. package/src/self-implement/device-first.ts +116 -0
  510. package/src/self-implement/doctor-visit.ts +257 -2
  511. package/src/self-implement/evidence-command-budget.ts +80 -0
  512. package/src/self-implement/gate-baseline.ts +56 -17
  513. package/src/self-implement/gate-cli.ts +1 -0
  514. package/src/self-implement/gate-remote.ts +31 -20
  515. package/src/self-implement/goal-author-cli.ts +1 -0
  516. package/src/self-implement/goal-author-decompose.ts +534 -45
  517. package/src/self-implement/goal-author.ts +282 -7
  518. package/src/self-implement/goal-elaborate.ts +449 -0
  519. package/src/self-implement/goal-refine.ts +273 -0
  520. package/src/self-implement/graph-overlay-yaml.ts +14 -3
  521. package/src/self-implement/graph-variant.ts +40 -6
  522. package/src/self-implement/headless-elanous-driver.ts +19 -3
  523. package/src/self-implement/off-diff-evidence.ts +58 -6
  524. package/src/self-implement/orchestrator.ts +370 -62
  525. package/src/self-implement/pod-warm-pool-profile.ts +1 -0
  526. package/src/self-implement/pwa-import-graph.ts +1 -1
  527. package/src/self-implement/rework-budget-judgment.ts +5 -8
  528. package/src/self-implement/rework-policy.ts +30 -0
  529. package/src/self-implement/run-ledger.ts +108 -0
  530. package/src/self-implement/run-stop.ts +10 -1
  531. package/src/self-implement/run-ttl.ts +38 -24
  532. package/src/self-implement/running-runs.ts +29 -1
  533. package/src/self-implement/scope-adjacency.ts +115 -0
  534. package/src/self-implement/seams.ts +187 -28
  535. package/src/self-implement/stop-autoheal.ts +87 -1
  536. package/src/self-implement/wiring-check.ts +358 -0
  537. package/src/session-runtime/index.ts +1 -1
  538. package/src/setup/llm-env-detect.ts +5 -0
  539. package/src/shell-env-bootstrap.ts +11 -4
  540. package/src/skills/runner.ts +4 -2
  541. package/src/skills/tools/agent.ts +408 -40
  542. package/src/skills/tools/msg-ask.ts +100 -0
  543. package/src/skills/tools/ops-ledger.ts +2 -1
  544. package/src/skills/tools/schedule-wakeup.ts +23 -4
  545. package/src/skills/tools/shell.ts +61 -6
  546. package/src/skills/tools/terminal-modal-inject.ts +1 -2
  547. package/src/skills/tools/terminal-modal.ts +10 -8
  548. package/src/skills/url-router.ts +41 -1
  549. package/src/smart-wizard/run.ts +66 -0
  550. package/src/status/bar.ts +34 -6
  551. package/src/status/status-provider-info.ts +37 -6
  552. package/src/steward/hold-hygiene.ts +24 -6
  553. package/src/steward/rejudge-tick.ts +10 -2
  554. package/src/steward/ta-repair-event-collect.ts +17 -6
  555. package/src/steward/triage-budget.ts +194 -0
  556. package/src/steward/triage.ts +20 -3
  557. package/src/task-agent/actions.ts +72 -2
  558. package/src/task-agent/green-sweep.ts +4 -0
  559. package/src/task-agent/land-queue.ts +21 -8
  560. package/src/task-agent/live-moves.ts +182 -10
  561. package/src/task-agent/mission.ts +30 -0
  562. package/src/task-agent/parent-host.ts +123 -3
  563. package/src/task-agent/rejudge-on-head.ts +15 -0
  564. package/src/task-agent/repair-cycle.ts +138 -32
  565. package/src/task-agent/repair-next-move.ts +31 -3
  566. package/src/task-agent/repair-outcomes.ts +29 -0
  567. package/src/task-agent/repair-worker.ts +14 -4
  568. package/src/task-agent/shadow.ts +48 -4
  569. package/src/task-agent/task-card-prefix.ts +2 -0
  570. package/src/task-agent/task-hand.ts +525 -57
  571. package/src/task-agent/task-parent-role-llm.ts +36 -0
  572. package/src/task-agent/tier-split.ts +196 -0
  573. package/src/task-agent/work-order-build.ts +2 -0
  574. package/src/task-agent/work-order.ts +3 -2
  575. package/src/task-orchestrator/generator-prompt.ts +60 -11
  576. package/src/task-orchestrator/surfaces/pod-account-broker.ts +42 -0
  577. package/src/task-orchestrator/surfaces/pod-child-providers.ts +1 -1
  578. package/src/task-orchestrator/surfaces/pod-child-reuse.ts +146 -0
  579. package/src/task-orchestrator/surfaces/pod-command-job.ts +130 -11
  580. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +215 -3
  581. package/src/task-orchestrator/surfaces/pod-image-source.ts +89 -1
  582. package/src/task-orchestrator/surfaces/pod-launch-history.ts +133 -0
  583. package/src/task-orchestrator/surfaces/pod-lease.ts +17 -8
  584. package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +19 -2
  585. package/src/task-orchestrator/surfaces/pod-pool.ts +76 -4
  586. package/src/task-orchestrator/surfaces/pod-provenance.ts +82 -0
  587. package/src/task-orchestrator/surfaces/pod-repair-commit.ts +18 -3
  588. package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +16 -0
  589. package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +224 -0
  590. package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +201 -0
  591. package/src/task-orchestrator/surfaces/pod-si-warm-provider.ts +444 -0
  592. package/src/task-orchestrator/surfaces/pod-si-warm-runner.ts +387 -0
  593. package/src/task-orchestrator/surfaces/pod-si-warm-transport.ts +157 -0
  594. package/src/task-orchestrator/surfaces/pod-source-receive.ts +18 -0
  595. package/src/task-orchestrator/surfaces/pod-warm-provenance.ts +81 -0
  596. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +6 -2
  597. package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +7 -0
  598. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +521 -40
  599. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +3 -0
  600. package/src/task-orchestrator/surfaces/self-implement-pod.ts +759 -50
  601. package/src/task-orchestrator/surfaces/self-implement.ts +65 -2
  602. package/src/tool-runtime/index.ts +15 -2
  603. package/src/tool-runtime/mcp-proxy-bootstrap.ts +29 -0
  604. package/src/tool-runtime/ops-ledger-runtimes.ts +10 -2
  605. package/src/tty-foreground.ts +155 -0
  606. package/src/tui/README.md +2 -0
  607. package/src/tui/chat/background-job-status.ts +54 -0
  608. package/src/tui/chat/goal-interim.ts +173 -0
  609. package/src/tui/chat/log-view.ts +267 -0
  610. package/src/tui/chat/self-health-status.ts +232 -0
  611. package/src/tui/entry.ts +695 -0
  612. package/src/tui/input/composer.ts +151 -0
  613. package/src/tui/seat-mail-boot.ts +59 -0
  614. package/src/tui/slash/compact-command.ts +7 -0
  615. package/src/tui/slash/compact.ts +94 -0
  616. package/src/tui/slash/new-session.ts +35 -0
  617. package/src/tui/slash/resume.ts +75 -0
  618. package/src/tui-client/local-chat-turn.ts +282 -0
  619. package/src/tui-client/local-harness-command.ts +63 -0
  620. package/src/tui-client/local-provider-command.ts +184 -0
  621. package/src/tui-client/next-dashboard-runtime.ts +8 -0
  622. package/src/tui-client/next-loop-command.ts +70 -0
  623. package/src/tui-client/next-wakeup.ts +191 -0
  624. package/src/tui.ts +37 -0
  625. package/src/ui/modal-adapter.ts +2 -2
  626. package/src/user-config.ts +4 -2
  627. package/src/ux-sim/classic-tui-seat-scenarios.ts +516 -0
  628. package/src/ux-sim/cli-config-audit-device.ts +121 -0
  629. package/src/ux-sim/dashboard-event-loop-stall-monitor-device.ts +238 -0
  630. package/src/ux-sim/event-monkey.ts +379 -0
  631. package/src/ux-sim/fake-bin.ts +87 -7
  632. package/src/ux-sim/fake-herdr.ts +238 -0
  633. package/src/ux-sim/fake-llm.ts +111 -6
  634. package/src/ux-sim/fault-glm-no-credential.ts +116 -0
  635. package/src/ux-sim/fault-nextmove-dispatch.ts +367 -0
  636. package/src/ux-sim/fault-pod-codex-503.ts +211 -0
  637. package/src/ux-sim/fault-scope-escape-lift.ts +216 -0
  638. package/src/ux-sim/fault-tui-400-autoheal.ts +297 -0
  639. package/src/ux-sim/goal-device.ts +619 -0
  640. package/src/ux-sim/in-process-cli.ts +22 -5
  641. package/src/ux-sim/mock-authoring-first-run-child.ts +35 -0
  642. package/src/ux-sim/mock-authoring-first-run.ts +97 -0
  643. package/src/ux-sim/mock-seat-pty-frame-child.ts +29 -0
  644. package/src/ux-sim/mock-seat-pty-frame.ts +297 -0
  645. package/src/ux-sim/mock-seat-pty-sequence-child.ts +21 -0
  646. package/src/ux-sim/mock-seat-pty-sequence.ts +206 -0
  647. package/src/ux-sim/next-tui-seat-scenarios.ts +631 -0
  648. package/src/ux-sim/onboarding-first-run-device.ts +269 -0
  649. package/src/ux-sim/pty-key-modifiers-device.ts +85 -0
  650. package/src/ux-sim/subagent-tools-device.ts +81 -0
  651. package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +250 -0
  652. package/src/ux-sim/tty-foreground-steal-child.ts +21 -0
  653. package/src/version/packed-revision.json +1 -1
  654. package/apps/pwa/out/_next/static/chunks/1162.c69abda138c7ce43.js +0 -79
  655. package/apps/pwa/out/_next/static/chunks/1449-1fede62af84c3e43.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/1598-13fc845935e816df.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/1639.62c5e16fa20d242f.js +0 -94
  658. package/apps/pwa/out/_next/static/chunks/1661-adb8b2babc9aaf8c.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/2147.107c0fc6146fb15a.js +0 -23
  660. package/apps/pwa/out/_next/static/chunks/2202-ef1c9b000c3074fc.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/2247.1e326638ee43e672.js +0 -115
  662. package/apps/pwa/out/_next/static/chunks/2268.56e1e3d58180abae.js +0 -8
  663. package/apps/pwa/out/_next/static/chunks/2469-606819c812414021.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/2593.e53c1620c0bb3599.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/2690.e96671114222676a.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/2898-79ee1a5cc0cd9d13.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/298.26099a9f65e5c8ff.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/2987-30cf9c2eb7b8bdd5.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/2992.51fc2a7295bd8139.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/3001-5a52788c813b6113.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/3014-291245fba9df7b5b.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/3068.ee78201f0251a18d.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/3083.cd399a17e9365f78.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/3117-e1c474683fd1f824.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/3251-2c17bd5a91f8de2e.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/326.3fb32322bb2ddf6d.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/3421-7ff7fbaa156985a7.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/381.f55dc63ea87735e6.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/4129-ab0a6189f1778633.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/4361.93d14ba594b3a035.js +0 -104
  681. package/apps/pwa/out/_next/static/chunks/4364.7a7eb19cceb67d2f.js +0 -286
  682. package/apps/pwa/out/_next/static/chunks/4406.d71f506f7c3ee9d3.js +0 -149
  683. package/apps/pwa/out/_next/static/chunks/4461.2ad1514180ae7e29.js +0 -148
  684. package/apps/pwa/out/_next/static/chunks/4479.bd309cbe0e3842ee.js +0 -64
  685. package/apps/pwa/out/_next/static/chunks/4522-05966f777d66d13b.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/4543-9a3e9812e845de65.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/4557.f8f1d84a0d90d590.js +0 -74
  688. package/apps/pwa/out/_next/static/chunks/4589-79b11542179ef58c.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/4633-9f8f9f88ffbb8f5c.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/4831.23af4d10c0697b5e.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/4983.5951b85724f61f2a.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/5028-f0722e6114c313e7.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/5249.96a848656b582a93.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/5311.16e0ffbfa5468b80.js +0 -62
  695. package/apps/pwa/out/_next/static/chunks/5489.ec2dd1b5272a19dc.js +0 -24
  696. package/apps/pwa/out/_next/static/chunks/559.df87695df637920c.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/5618-5c88f2f70178c4ad.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/5764.05487bf0b73ddb6b.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/5930.e678826c3f831aab.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/5dfb57f7.f2e3305326202474.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/6053-d893974de92e6198.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/6200-cefd6f33f59d765e.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/6314-edeba650ae686ac9.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/6316-bc9a9b74d7842d79.js +0 -1
  705. package/apps/pwa/out/_next/static/chunks/6476-13b9779b73528008.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/666-04db3ac4c8e3c66f.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/670.682e55106ef915a6.js +0 -77
  708. package/apps/pwa/out/_next/static/chunks/6816.b7ba9d0a1a4a46a7.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/690-fbbcc777f189af37.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/6989.0d3d4020e5cb3df6.js +0 -90
  711. package/apps/pwa/out/_next/static/chunks/7193-cf355cca5ba6c5d5.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/7217-d17393fe7af78fa6.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/7232.24edbd938a69c8d0.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/7295cd1e.b4b557908888eeee.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/7323.adb02de21991883c.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/7386.5d8e7e42e818dfb6.js +0 -287
  717. package/apps/pwa/out/_next/static/chunks/7448.478958ffbbba0ac0.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/7537.ba2208c5c656b8a3.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/7596-962ae6db6cfc9c83.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/7671.cff51beac212a2ba.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/7883.3916734ee16d3e58.js +0 -27
  722. package/apps/pwa/out/_next/static/chunks/7952.b192c31b6a0e00cc.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/801.5b24e81eded22d1b.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/8176.8c9a8613f5a01ac1.js +0 -36
  725. package/apps/pwa/out/_next/static/chunks/819e78a6.fa3dd7f7da19bf61.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/8220-78978450c3183d8d.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/8221-eb60b5bc692a3361.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/826.e9a26064f474949e.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/8459-a351487a4480f584.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/8482-75823d513a4ce151.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/8488.8da515248cda3f3a.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/8584.388a1779d9b203af.js +0 -1
  733. package/apps/pwa/out/_next/static/chunks/8637.a55e098e61ffefb8.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/9207-8e6a12db30373f32.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/9263-00ae932c62696a86.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/9318.caafc3a130e8769c.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/932.da3fb55951882562.js +0 -93
  738. package/apps/pwa/out/_next/static/chunks/9433.002f8426ac75b6b7.js +0 -1
  739. package/apps/pwa/out/_next/static/chunks/9464.dd631a5a14b1d660.js +0 -24
  740. package/apps/pwa/out/_next/static/chunks/9739.8d5f36ac67a3b236.js +0 -1
  741. package/apps/pwa/out/_next/static/chunks/9743.beeabb9d5f86abe4.js +0 -1
  742. package/apps/pwa/out/_next/static/chunks/9843-a23d3f32dc43f715.js +0 -1
  743. package/apps/pwa/out/_next/static/chunks/994-28211077c7c587d5.js +0 -1
  744. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-3b4c947f174e33d8.js +0 -1
  745. package/apps/pwa/out/_next/static/chunks/app/approvals/page-369d5ce99483f859.js +0 -1
  746. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-63c0ed0eb26e5fce.js +0 -1
  747. package/apps/pwa/out/_next/static/chunks/app/board/page-62802c6003bc85cc.js +0 -1
  748. package/apps/pwa/out/_next/static/chunks/app/botlab/page-ecb41560d4e77be9.js +0 -1
  749. package/apps/pwa/out/_next/static/chunks/app/bots/page-7b65ad8130c93e95.js +0 -1
  750. package/apps/pwa/out/_next/static/chunks/app/ceo/page-8755477c15a9060c.js +0 -1
  751. package/apps/pwa/out/_next/static/chunks/app/chat/page-5725447dd972c471.js +0 -1
  752. package/apps/pwa/out/_next/static/chunks/app/consult/page-b979de0591a69375.js +0 -1
  753. package/apps/pwa/out/_next/static/chunks/app/control/page-6d0796bf4633751a.js +0 -1
  754. package/apps/pwa/out/_next/static/chunks/app/decisions/page-59c31dc0394e67b4.js +0 -1
  755. package/apps/pwa/out/_next/static/chunks/app/design-check/page-12dfc95f6cc5c718.js +0 -1
  756. package/apps/pwa/out/_next/static/chunks/app/editor/page-25788244e66aa4dd.js +0 -1
  757. package/apps/pwa/out/_next/static/chunks/app/exec/page-a2555dc705466322.js +0 -1
  758. package/apps/pwa/out/_next/static/chunks/app/healthz/route-3b4c947f174e33d8.js +0 -1
  759. package/apps/pwa/out/_next/static/chunks/app/inside/page-578729adbeaa40cb.js +0 -1
  760. package/apps/pwa/out/_next/static/chunks/app/intake/page-a1d20fffbec35205.js +0 -1
  761. package/apps/pwa/out/_next/static/chunks/app/layout-4a558f94516b8004.js +0 -1
  762. package/apps/pwa/out/_next/static/chunks/app/live/page-9e3834705b86145e.js +0 -1
  763. package/apps/pwa/out/_next/static/chunks/app/live-run/page-d7bff0f0905a662c.js +0 -1
  764. package/apps/pwa/out/_next/static/chunks/app/loops/page-cb1c5fe746ea4014.js +0 -1
  765. package/apps/pwa/out/_next/static/chunks/app/market/page-9ee320507356582a.js +0 -1
  766. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-66fd183b74835886.js +0 -1
  767. package/apps/pwa/out/_next/static/chunks/app/morning/page-3272a064a01a9927.js +0 -1
  768. package/apps/pwa/out/_next/static/chunks/app/not-found-f281b7a7f6ef2529.js +0 -1
  769. package/apps/pwa/out/_next/static/chunks/app/observatory/page-d45a65f8b7124fcd.js +0 -1
  770. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-e9c1fe684dd19a66.js +0 -1
  771. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-b8322932fc6e34de.js +0 -1
  772. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-82c66d9af2290575.js +0 -1
  773. package/apps/pwa/out/_next/static/chunks/app/outputs/page-63c6752009c97b05.js +0 -1
  774. package/apps/pwa/out/_next/static/chunks/app/page-bb33d42ebc358aec.js +0 -1
  775. package/apps/pwa/out/_next/static/chunks/app/reflection/page-7e4c9379197d7214.js +0 -1
  776. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-38bf1e9a7001732b.js +0 -1
  777. package/apps/pwa/out/_next/static/chunks/app/sessions/page-2e5b752012389d56.js +0 -1
  778. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-398c0faa173203f7.js +0 -1
  779. package/apps/pwa/out/_next/static/chunks/app/settings/page-002f53a965b6445c.js +0 -1
  780. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-7f75997f61a26269.js +0 -1
  781. package/apps/pwa/out/_next/static/chunks/app/setup/layout-3b4c947f174e33d8.js +0 -1
  782. package/apps/pwa/out/_next/static/chunks/app/setup/page-05631753294f23fb.js +0 -1
  783. package/apps/pwa/out/_next/static/chunks/app/share/page-edd700fd2cc3d7f8.js +0 -1
  784. package/apps/pwa/out/_next/static/chunks/app/showroom/page-105f83ecb4594365.js +0 -1
  785. package/apps/pwa/out/_next/static/chunks/app/tasks/page-5823e87d2017f19c.js +0 -1
  786. package/apps/pwa/out/_next/static/chunks/app/term/page-df3445b207ceceab.js +0 -1
  787. package/apps/pwa/out/_next/static/chunks/app/today/page-b51ca09566c03de7.js +0 -1
  788. package/apps/pwa/out/_next/static/chunks/app/trace/page-8aacd5ded5dbac60.js +0 -1
  789. package/apps/pwa/out/_next/static/chunks/app/vault/page-bae3365a0b3c6a8e.js +0 -1
  790. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ed52b48ff1aa7fd.js +0 -1
  791. package/apps/pwa/out/_next/static/chunks/app/workflows/page-b6f8cad35fe00946.js +0 -1
  792. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6d25ceda500d2457.js +0 -1
  793. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-b6401a5f2c962fe8.js +0 -1
  794. package/apps/pwa/out/_next/static/chunks/ebf6cf5e.0d2f887b040e80fb.js +0 -122
  795. package/apps/pwa/out/_next/static/chunks/f09ec7d7-d29abe23edcbb193.js +0 -1
  796. package/apps/pwa/out/_next/static/chunks/framework-9322cb8a56ac081c.js +0 -1
  797. package/apps/pwa/out/_next/static/chunks/main-2fbab294e49a1561.js +0 -1
  798. package/apps/pwa/out/_next/static/chunks/main-app-f36729f56621a8f3.js +0 -1
  799. package/apps/pwa/out/_next/static/chunks/pages/_app-2a62e450b47c6114.js +0 -1
  800. package/apps/pwa/out/_next/static/chunks/pages/_error-5e17f7b445f34d43.js +0 -1
  801. package/apps/pwa/out/_next/static/chunks/webpack-b4263e2190ea7adf.js +0 -1
  802. /package/apps/pwa/out/_next/static/{L04y73dlwKeTW-GetaTF3 → uC-N0emedeNOFuaBQFv-I}/_ssgManifest.js +0 -0
@@ -2,14 +2,159 @@ import { debug } from '../debug/log.js';
2
2
  import { adversarialPlanCritique } from '../harness/adversarial-plan.js';
3
3
  import { classifyHeft, adversarialThreshold } from '../harness/harness-seams.js';
4
4
  import { llmDecomposeSteps } from '../harness/llm-decompose.js';
5
- import { GOAL_AUTHOR_COARSE_MAX_SLICES } from '../task-orchestrator/generator-prompt.js';
5
+ import { GOAL_AUTHOR_SIZE_SAFETY_MAX_SLICES } from '../task-orchestrator/generator-prompt.js';
6
6
  import { getDefaultLogStore } from '../mss/logging/log-store.js';
7
7
  import { emitDecision } from '../live/detail-switch.js';
8
8
  import { selectPlanningLlm } from '../prompt-enhance/enhance.js';
9
9
  import type { GoalAuthorDeps } from './goal-author.js';
10
+ import { ensureDeviceFirstSteps } from './device-first.js';
10
11
 
11
12
  const GOAL_STEPS_DECOMPOSED_EVENT = 'goal-steps-decomposed';
12
13
 
14
+ type GoalSliceTier = 'low' | 'medium' | 'high';
15
+ type GoalSliceSize = { files: number; actions: number; newFiles: number; tier: GoalSliceTier; unavoidableReason: string | null };
16
+
17
+ export type SliceTier = '하' | '중' | '상';
18
+ export interface SizedSlice {
19
+ goal: string;
20
+ files: number;
21
+ behaviours: number;
22
+ newFiles: number;
23
+ tier: SliceTier;
24
+ unavoidable?: string;
25
+ deviceFirst?: 'device-test' | 'feature';
26
+ }
27
+ export type TierSizedDecomposeResult =
28
+ | { ok: true; slices: SizedSlice[]; redecomposed: number }
29
+ | { ok: false; reason: string };
30
+
31
+ function publicSizedSlices(steps: readonly string[], sizes: readonly GoalSliceSize[]): SizedSlice[] {
32
+ return steps.map((goal, index) => {
33
+ const size = sizes[index]!;
34
+ return { goal, files: size.files, behaviours: size.actions, newFiles: size.newFiles,
35
+ tier: ({ low: '하', medium: '중', high: '상' } as const)[size.tier],
36
+ ...(/(?:^|\n|·\s*)동작:\s*DEVICE-FIRST-STAGE\b/u.test(goal)
37
+ ? { deviceFirst: 'device-test' as const }
38
+ : /(?:^|\n)선행:\s*DEVICE-FIRST-STAGE 조각 착지 뒤 발사(?:$|\n)/u.test(goal)
39
+ ? { deviceFirst: 'feature' as const } : {}),
40
+ ...(size.unavoidableReason ? { unavoidable: size.unavoidableReason } : {}) };
41
+ });
42
+ }
43
+
44
+ /** Keep a slice's file names grounded in the parent's explicit target/new paths. */
45
+ function restoreSlicePaths(slices: readonly SizedSlice[], parentGoal: string): SizedSlice[] {
46
+ const parentPaths = new Map<string, Set<string>>();
47
+ for (const line of parentGoal.split('\n')) {
48
+ if (!/^\s*(?:[-*]\s*)?(?:대상 경로|신설)\s*:/.test(line)) continue;
49
+ for (const match of line.matchAll(/(?:^|[\s,·`])([\w./-]+\.[A-Za-z][\w-]*)(?=$|[\s,·`])/g)) {
50
+ const path = match[1]!;
51
+ const name = path.slice(path.lastIndexOf('/') + 1);
52
+ const candidates = parentPaths.get(name) ?? new Set<string>();
53
+ candidates.add(path);
54
+ parentPaths.set(name, candidates);
55
+ }
56
+ }
57
+ return slices.flatMap((slice, sliceIndex) => {
58
+ let unresolved = false;
59
+ const goal = slice.goal.replace(/(^|[\n·])(\s*(?:[-*]\s*)?(?:대상 경로|신규 경로|신설)\s*:\s*)([^\n]+?)(?=\s*·\s*(?:동작|행동|작업|대상 경로|신규 경로|신설)\s*:|$)/gm,
60
+ (_whole, prefix: string, label: string, value: string) => {
61
+ const restored = value.replace(/(?<![\w./-])[\w./-]+\.[A-Za-z][\w-]*/g, (path) => {
62
+ if (path.includes('/')) return path;
63
+ const candidates = [...(parentPaths.get(path) ?? [])];
64
+ if (candidates.length === 1) return candidates[0]!;
65
+ unresolved = true;
66
+ try { debug.log('self-implement.decompose', 'slice-path-unresolved', { sliceIndex, path, candidates }); } catch { /* observation is fail-soft */ }
67
+ return path;
68
+ });
69
+ return `${prefix}${label}${restored}`;
70
+ });
71
+ return unresolved ? [] : [{ ...slice, goal }];
72
+ });
73
+ }
74
+
75
+ function expectedSliceTier(files: number, actions: number, newFiles: number): GoalSliceTier {
76
+ if (files <= 2 && actions <= 1 && newFiles <= 1) return 'low';
77
+ if (files <= 4 && actions <= 2 && newFiles <= 2) return 'medium';
78
+ return 'high';
79
+ }
80
+
81
+ /**
82
+ * 경계 분기(1 step ⊕ acceptance 3)의 크기 메타 — 경계 step 은 쪼개지 않고 «한 조각»으로 잰다.
83
+ * 동작 수는 1(묶은 step 자체)이고 상 로 갈리면 불가분 사유를 싣는다(완료 경계 3행은 acceptance 셋이라
84
+ * 나누면 코드 없는 실물·증거 조각이 생긴다).
85
+ */
86
+ function boundaryStepSize(step: string, rows: readonly CompletionBoundaryRow[]): GoalSliceSize {
87
+ const paths = new Set<string>();
88
+ for (const row of rows) for (const path of row.paths) paths.add(path);
89
+ for (const match of step.matchAll(/(?:^|[\s`·,()])([\w.@-]+(?:\/[\w.@-]+)+\.[A-Za-z][\w-]*)/gu)) paths.add(match[1]!);
90
+ const files = Math.max(1, paths.size);
91
+ const tier = expectedSliceTier(files, 1, 0);
92
+ return { files, actions: 1, newFiles: 0, tier,
93
+ unavoidableReason: tier === 'high'
94
+ ? '완료 경계 3행은 한 step 의 acceptance 셋 — 나누면 코드 없는 실물·증거 조각이 생긴다.'
95
+ : null };
96
+ }
97
+
98
+ /** Estimates are observations from the planner, checked against the declared tier before they guide retry. */
99
+ function parseGoalSliceSizes(raw: string, count: number): GoalSliceSize[] | null {
100
+ try {
101
+ const parsed = JSON.parse(raw) as { slices?: unknown };
102
+ if (!Array.isArray(parsed?.slices) || parsed.slices.length !== count) return null;
103
+ const result: GoalSliceSize[] = [];
104
+ for (const value of parsed.slices) {
105
+ if (!value || typeof value !== 'object' || Array.isArray(value)) return null;
106
+ const row = value as Record<string, unknown>;
107
+ const { files, newFiles, tier } = row;
108
+ const actions = row.actions ?? row.behaviours;
109
+ if (!Number.isSafeInteger(files) || !Number.isSafeInteger(actions) || !Number.isSafeInteger(newFiles)
110
+ || (files as number) < 1 || (actions as number) < 1 || (newFiles as number) < 0
111
+ || (newFiles as number) > (files as number)
112
+ || tier !== expectedSliceTier(files as number, actions as number, newFiles as number)) return null;
113
+ const unavoidableReason = typeof row.unavoidableReason === 'string' && row.unavoidableReason.trim()
114
+ ? row.unavoidableReason.trim() : null;
115
+ result.push({ files: files as number, actions: actions as number, newFiles: newFiles as number,
116
+ tier: tier as GoalSliceTier, unavoidableReason });
117
+ }
118
+ return result;
119
+ } catch { return null; }
120
+ }
121
+
122
+ /** Only explicit path and action lines can replace missing planner metadata. */
123
+ function deriveGoalSliceSizes(steps: readonly string[]): GoalSliceSize[] | null {
124
+ const result: GoalSliceSize[] = [];
125
+ for (const step of steps) {
126
+ const pathLines = [...step.matchAll(/(?:^|[\n·])\s*(대상 경로|신규 경로)\s*:\s*([^\n]+?)(?=\s*·\s*(?:동작|행동|대상 경로|신규 경로)\s*:|$)/g)];
127
+ const paths = new Set<string>();
128
+ const newPaths = new Set<string>();
129
+ for (const [, label, value] of pathLines) {
130
+ for (const match of value!.matchAll(/(?:^|[\s,·`])([\w./-]+\.[A-Za-z][\w-]*)(?=$|[\s,·`])/g)) {
131
+ paths.add(match[1]!);
132
+ if (label === '신규 경로') newPaths.add(match[1]!);
133
+ }
134
+ }
135
+ const actions = [...step.matchAll(/(?:^|[\n·])\s*(?:[-*]\s*)?(?:동작|행동)\s*:\s*([^\n·]+)/g)]
136
+ .filter((match) => !!match[1]?.trim()).length;
137
+ if (!paths.size || !actions) return null;
138
+ const files = paths.size;
139
+ const newFiles = newPaths.size;
140
+ result.push({ files, actions, newFiles, tier: expectedSliceTier(files, actions, newFiles), unavoidableReason: null });
141
+ }
142
+ return result;
143
+ }
144
+
145
+ function goalSliceSizePrompt(objective: string, steps: readonly string[]): string {
146
+ return [
147
+ 'GOAL_AUTHOR_SLICE_SIZE — estimate the size of each FINAL implementation slice.',
148
+ 'Reply with STRICT JSON only: {"slices":[{"files":1,"behaviours":1,"newFiles":0,"tier":"low","unavoidableReason":null}]}. Every slice MUST contain files, behaviours, newFiles, tier and unavoidableReason; do not omit a field.',
149
+ 'Example for two slices: {"slices":[{"files":2,"behaviours":1,"newFiles":0,"tier":"low","unavoidableReason":null},{"files":3,"behaviours":2,"newFiles":1,"tier":"medium","unavoidableReason":null}]}.',
150
+ 'One array item per slice in the same order. Count all target files including tests and runtime wiring; count distinct changed behaviors and newly created files.',
151
+ 'Use low for files<=2, behaviours<=1, newFiles<=1; medium for files<=4, behaviours<=2, newFiles<=2; otherwise high.',
152
+ 'For high, give a concrete one-line unavoidableReason only if splitting breaks an inseparable operation. Otherwise leave it null so the planner must split again.',
153
+ `OBJECTIVE: ${objective}`,
154
+ `STEPS_JSON: ${JSON.stringify(steps)}`,
155
+ ].join('\n');
156
+ }
157
+
13
158
  /** Injectable reader: failures remain distinguishable from a successful empty read. */
14
159
  export type RecentStepCountReader = () => readonly number[];
15
160
 
@@ -56,13 +201,19 @@ export function readRecentStepCountsFailOpen(reader: RecentStepCountReader = rea
56
201
 
57
202
  /**
58
203
  * ⭐ AUTHOR-SHADOW-FIRST-SPLIT ① (0.2.29 · 근거 사례 #26644 · 대표 10-12 «착지해야만 낼 수 있는 증거는
59
- * 처음 저작부터 쪼갰어야»). 골 문면에 «명시 표지» 한 줄이 있을 때만 처음부터 두 조각
60
- * (① 그림자 → ② live 스위치, 선행 간선 1)으로 낸다. 표지가 없으면 어떤 문면이든 종전 LLM 분해 그대로다.
204
+ * 처음 저작부터 쪼갰어야»). 골 문면에 «명시 표지» 한 줄이 있으면 처음부터 두 조각
205
+ * (① 그림자 → ② live 스위치, 선행 간선 1)으로 낸다.
61
206
  *
62
- * ⛔ 발동은 명시 표지 «하나»뿐이다 — 자연어 감지(자율 표지·운영 실증·부정어)는 쓰지 않는다.
63
- * 자연어 부정 판별은 수렴하지 않았고(리뷰 r4~r6), 오탐은 live 조각이 원 목표와 반대로 «켜라»를 지시하게 만든다.
64
- * 자연어 감지 발동은 후속 개선(OP 결정 10-15).
65
- * 런 슈퍼바이저 REVIEW-MUSTFIX-CLASSIFY ②가 «런 중간»에 같은 쪼개기를 한다 — 저작이 먼저 막고 그쪽은 놓친 것을 받는다.
207
+ * ⭐ 자연어 발동(0.2.35 must-fix ①) — 표지 줄이 없어도 «한 줄» 안에 그림자 우선 어휘(그림자 먼저·shadow first)와
208
+ * 요청형 분할 어휘(분할해·분할해서·분할하라·나눠·나누어·쪼개)가 «같이» 실린 자연어 요청은 발동한다.
209
+ * 오탐은 live 조각이 원 목표와 반대로 «켜라»를 지시하게 만드므로(리뷰 r4~r6) 닫힌 어휘쌍으로 보수적으로 본다:
210
+ * ⑴ 표지 콜론 형태(분할: …)와 그 변형·인용은 동사형이 아니어도 발동 제외(근접 오탐 방어 유지)
211
+ * ⑵ 같은 줄에 부정 어휘(말라·말고·마라·아니·않·금지·하면 안·안 되)가 있으면 발동 제외.
212
+ * 표지가 없고 자연어 어휘쌍도 없는 문면은 종전 LLM 분해 그대로다.
213
+ * 생산 소비자는 이 seam «하나»다 — `runGoalAuthorCli` 와 OP 디스패처(`dispatchSelfImplement`)가 기본 seam 으로 부른다.
214
+ * ⛔ 런 슈퍼바이저쪽에 «같은 쪼개기»는 아직 없다(REVIEW-MUSTFIX-CLASSIFY ②는 범위 축 in-scope/split/ask-owner 만 판정하고
215
+ * 이 표지를 다시 읽지 않는다 — `rg -l 'classifyShadowFirstSplit|SHADOW_FIRST_SPLIT|shadow-first-split' src/`의 결과는
216
+ * 이 파일 ⊕ 그 시험뿐). 저작 때 놓친 표지를 런 중간에 되받는 경로는 후속이다.
66
217
  */
67
218
  export const SHADOW_FIRST_SPLIT_MARKER = '분할: 그림자 먼저';
68
219
  /**
@@ -75,27 +226,242 @@ function hasShadowFirstSplitMarkerLine(objective: string): boolean {
75
226
 
76
227
  export type ShadowFirstSplitPiece = { id: 'shadow' | 'live'; step: string; dependsOn: readonly ('shadow' | 'live')[] };
77
228
 
229
+ /** 발동 근거 — 명시 표지 줄 또는 자연어 요청(0.2.35 must-fix ①). */
230
+ export type ShadowFirstSplitTrigger = 'explicit-marker' | 'natural-language';
231
+
78
232
  export type ShadowFirstSplitVerdict =
79
- | { kind: 'shadow-first-split'; pieces: readonly [ShadowFirstSplitPiece, ShadowFirstSplitPiece] }
233
+ | { kind: 'shadow-first-split'; pieces: readonly [ShadowFirstSplitPiece, ShadowFirstSplitPiece]; trigger: ShadowFirstSplitTrigger }
80
234
  | { kind: 'single-piece' };
81
235
 
82
- /** 순수 판정 — 골 문면의 명시 표지 줄만 본다(LLM·원장·자연어 감지 0 · 던지지 않는다). grounding context 는 읽지 않는다. */
236
+ // ⭐ AUTHOR-SHADOW-FIRST-SPLIT 자연어 발동(0.2.35 must-fix ①) — 닫힌 어휘쌍만 본다(오탐 방어 · 리뷰 r4~r6).
237
+ const SHADOW_FIRST_PHRASE_SOURCE = '그림자\\s+먼저|shadow[\\s-]+first';
238
+ const SHADOW_FIRST_NATURAL_LANGUAGE_LINE = new RegExp(
239
+ `(?:${SHADOW_FIRST_PHRASE_SOURCE})[^\\n]{0,16}(?:분할(?:해|해서|하여|하라|해라|하고|하며)|나눠|나누어|쪼개)`
240
+ + `|(?:분할(?:해|해서|하여|하라|해라|하고|하며)|나눠|나누어|쪼개)[^\\n]{0,16}(?:${SHADOW_FIRST_PHRASE_SOURCE})`,
241
+ 'i',
242
+ );
243
+ // ⛔ 부정·거절 어휘가 같은 줄에 있으면 발동하지 않는다 — live 조각의 «켜라» 오지시 방어(보수적 미발동).
244
+ // «안 되»는 실현형(된다·됩니다·돼·됐…)까지 본다 — 본문은 «안 된다» 꼴이 지배한다.
245
+ const SHADOW_FIRST_NATURAL_NEGATION = /말라|말고|마라|아니|않|금지|하면\s*안|안\s*(?:돼|되|된|됐|될|됨|됩|됫|됬)/i;
246
+ // ⛔ 표지 콜론 형태(분할: …)와 그 변형·인용 줄은 자연어 발동에서 제외한다(문서 ⑴ · 근접 오탐 방어 유지).
247
+ const SHADOW_FIRST_MARKER_COLON_LIKE = /분할\s*[::]/;
248
+
249
+ function hasShadowFirstSplitNaturalLanguageLine(objective: string): boolean {
250
+ return objective.split(/\r?\n/).some((line) => SHADOW_FIRST_NATURAL_LANGUAGE_LINE.test(line)
251
+ && !SHADOW_FIRST_NATURAL_NEGATION.test(line)
252
+ && !SHADOW_FIRST_MARKER_COLON_LIKE.test(line));
253
+ }
254
+
255
+ const SHADOW_FIRST_SPLIT_PIECES: readonly [ShadowFirstSplitPiece, ShadowFirstSplitPiece] = [
256
+ {
257
+ id: 'shadow',
258
+ step: '① 그림자 — 이 골의 배선이 자율 결정을 «기록만» 한다(자율 실행 0). 판정 = 시험 통과 ⊕ 그림자 관측 줄 모양(기록된 결정 1건 이상).',
259
+ dependsOn: [],
260
+ },
261
+ {
262
+ id: 'live',
263
+ step: '② live 스위치 — 선행 = ① 그림자 착지. 같은 배선의 자율 실행을 켠다. 판정 = ① 착지 뒤 그림자 로그에 기대 결정 1건 이상 ⊕ 스위치 켬 ⊕ 이 골의 원 판정.',
264
+ dependsOn: ['shadow'],
265
+ },
266
+ ];
267
+
268
+ /** 순수 판정 — 골 문면의 명시 표지 줄 ⊕ 자연어 요청 줄만 본다(LLM·원장 0 · 던지지 않는다). grounding context 는 읽지 않는다. */
83
269
  export function classifyShadowFirstSplit(objective: string): ShadowFirstSplitVerdict {
84
- if (!hasShadowFirstSplitMarkerLine(objective)) return { kind: 'single-piece' };
270
+ if (hasShadowFirstSplitMarkerLine(objective)) {
271
+ return { kind: 'shadow-first-split', pieces: SHADOW_FIRST_SPLIT_PIECES, trigger: 'explicit-marker' };
272
+ }
273
+ if (hasShadowFirstSplitNaturalLanguageLine(objective)) {
274
+ return { kind: 'shadow-first-split', pieces: SHADOW_FIRST_SPLIT_PIECES, trigger: 'natural-language' };
275
+ }
276
+ return { kind: 'single-piece' };
277
+ }
278
+
279
+ /**
280
+ * ⭐ DECOMPOSE-BOUNDARY-ONE-STEP(MK · 0.2.36) — 완료 경계 3행(코드 · 실물 · 증거 명령)은 «세 조각»이 아니라
281
+ * 한 step 의 acceptance 셋이다. 종전에는 경계 행이 문면에 그대로 있어도 LLM 쪼개기가 행마다 조각을 만들어
282
+ * «코드 없는 증거 조각»·«라이브 조각»이 생겼고, 그 조각들은 구현할 것이 없어 손으로 닫아야 했다
283
+ * (실측 10-17 UX 미션 ta-20261016-ddf426 · ta-20261016-179cbb).
284
+ * 판정은 순수 규칙이다 — 골 문면에서 `완료 경계 코드:`·`완료 경계 실물:`·`완료 경계 증거 명령:` 세 줄을 읽고,
285
+ * 셋이 다 있으면 step 1 ⊕ acceptance 3 으로 묶는다. 둘 이하면 종전 경로 그대로(동작 0 변화).
286
+ * 결과는 «직렬 카드 셋»(step 카드 + 경계 카드)으로도 나온다 — 코드 경로가 없는 실물·증거 행은
287
+ * 코드 없는 live/evidence 카드로 남는다(그 카드가 조각으로 승격되지 않는다는 것이 이 판정의 요점).
288
+ */
289
+ export const COMPLETION_BOUNDARY_LABELS = {
290
+ code: '완료 경계 코드',
291
+ live: '완료 경계 실물',
292
+ 'evidence-command': '완료 경계 증거 명령',
293
+ } as const;
294
+
295
+ export type CompletionBoundaryKind = keyof typeof COMPLETION_BOUNDARY_LABELS;
296
+
297
+ export type CompletionBoundaryRow = {
298
+ kind: CompletionBoundaryKind;
299
+ label: string;
300
+ /** 라벨 뒤 값 — 문면 그대로. */
301
+ text: string;
302
+ /** `완료 경계 코드` 행에서만 채운다(실물·증거 명령 행은 코드 없는 카드다). */
303
+ paths: readonly string[];
304
+ /** `완료 경계 증거 명령` 행에서만 채운다 — 명령 원문 그대로. */
305
+ command?: string;
306
+ };
307
+
308
+ export type GoalDecomposeCard = {
309
+ kind: 'step' | 'acceptance' | 'live' | 'evidence';
310
+ id: string;
311
+ title: string;
312
+ body: string;
313
+ paths?: readonly string[];
314
+ command?: string;
315
+ };
316
+
317
+ export type GoalDecomposeResult = {
318
+ /** 경계 3행을 step 1 ⊕ acceptance 3 으로 묶었나. */
319
+ bundled: boolean;
320
+ rows: readonly CompletionBoundaryRow[];
321
+ steps: readonly string[];
322
+ acceptance: readonly string[];
323
+ cards: readonly GoalDecomposeCard[];
324
+ };
325
+
326
+ const COMPLETION_BOUNDARY_LINE = /^\s*(?:[-*+]\s+|\d+[.)]\s+|>\s*)?완료\s*경계\s*(코드|실물|증거\s*명령)\s*[::]\s*(.+?)\s*$/u;
327
+ const COMPLETION_BOUNDARY_KIND_BY_TOKEN: Record<string, CompletionBoundaryKind> = {
328
+ 코드: 'code',
329
+ 실물: 'live',
330
+ 증거명령: 'evidence-command',
331
+ };
332
+
333
+ export const COMPLETION_BOUNDARY_STEP_PREFIX =
334
+ '① 완료 경계 3행(코드·실물·증거 명령) 한 step — 경계 행은 조각이 아니라 이 step 의 acceptance 다';
335
+
336
+ function completionBoundaryPaths(text: string): string[] {
337
+ const paths: string[] = [];
338
+ for (const match of text.matchAll(/(?:^|[\s`·,()])((?:[\w.@-]+\/)+[\w.@-]+\.[A-Za-z][\w-]*)/gu)) {
339
+ const path = match[1]!;
340
+ if (!paths.includes(path)) paths.push(path);
341
+ }
342
+ return paths;
343
+ }
344
+
345
+ /** 골 문면의 완료 경계 행 — 종류마다 첫 줄 하나(중복 라벨은 첫 줄이 이긴다). */
346
+ export function parseCompletionBoundaryRows(goal: string): CompletionBoundaryRow[] {
347
+ const rows: CompletionBoundaryRow[] = [];
348
+ const seen = new Set<CompletionBoundaryKind>();
349
+ for (const line of goal.split(/\r?\n/)) {
350
+ const match = COMPLETION_BOUNDARY_LINE.exec(line);
351
+ if (!match) continue;
352
+ const kind = COMPLETION_BOUNDARY_KIND_BY_TOKEN[match[1]!.replace(/\s+/gu, '')];
353
+ if (!kind || seen.has(kind)) continue;
354
+ const text = match[2]!.trim();
355
+ if (!text) continue;
356
+ seen.add(kind);
357
+ rows.push({
358
+ kind,
359
+ label: COMPLETION_BOUNDARY_LABELS[kind],
360
+ text,
361
+ paths: kind === 'code' ? completionBoundaryPaths(text) : [],
362
+ ...(kind === 'evidence-command' ? { command: text } : {}),
363
+ });
364
+ }
365
+ return rows;
366
+ }
367
+
368
+ /**
369
+ * 경계 3행 골도 «장치 먼저» RED 단계를 피하지 않는다 — 다만 그 단계를 별도 조각(step 2)으로 만들지
370
+ * 않고 «같은 런의 첫 동작» 으로 다시 써 이 step 안에 접어 넣는다(판정선: step 1 ⊕ acceptance 3).
371
+ *
372
+ * ⭐ must-fix(b) — 접힌 문면에서 다음 셋을 뺀다:
373
+ * ⑴ «운영 코드 변경 0» — 기능을 구현하라는 step 에 «운영 코드 변경 0» 을 섞으면 자식이 모순 지시를 받는다.
374
+ * ⑵ «선행: DEVICE-FIRST-STAGE 조각 착지 뒤 발사» — 자기 자신(이 step)을 선행으로 기다리라는 문구다.
375
+ * ⑶ «동작: DEVICE-FIRST-STAGE» 표지 — 이 표지가 남으면 `publicSizedSlices` 가 접힌 조각을
376
+ * `deviceFirst:'device-test'` 로 분류하고, `handTaskWithTierSplit` 이 «장치 시험 카드» 미션만
377
+ * 발사해 기능 카드가 0장이 된다(결함을 `outcome:'device-first-deferred'` 로 정답 처리하던 원전).
378
+ */
379
+ /** 접힌 경계 step 이 «장치 RED 를 같은 런의 첫 동작으로 싣고 있다»는 표지 — goal-author 의 재-staging 이 이를 알아본다. */
380
+ export const FOLDED_DEVICE_FIRST_ACTION_MARKER = '첫 동작(같은 런)';
381
+
382
+ function foldDeviceStageIntoBoundaryStep(goal: string, step: string, root?: string): string {
383
+ const staged = ensureDeviceFirstSteps(goal, [step], root);
384
+ if (staged.steps.length <= 1) {
385
+ // A boundary goal still starts with RED inside its single feature slice. Use
386
+ // the test path supplied by the completion boundary; never invent a device.
387
+ const rows = parseCompletionBoundaryRows(goal);
388
+ const declaredTest = [rows.find((row) => row.kind === 'evidence-command'), rows.find((row) => row.kind === 'code')]
389
+ .filter((row): row is CompletionBoundaryRow => row !== undefined)
390
+ .flatMap((row) => completionBoundaryPaths(row.text))
391
+ .find((path) => /\.(?:test|spec)\.[cm]?[jt]sx?$/u.test(path));
392
+ const firstAction = declaredTest
393
+ ? `${FOLDED_DEVICE_FIRST_ACTION_MARKER}: 완료 경계에 적힌 ${declaredTest}의 존재를 확인한다. 기존이면 mock 무대 시험 RED를 먼저 기록하고, 없으면 새 경로를 짐작하지 말고 신설: 선언 뒤 같은 시험의 RED를 기록한다.`
394
+ : `${FOLDED_DEVICE_FIRST_ACTION_MARKER}: 시험 경로 미확정 — 골의 증거 명령에서 시험 경로를 정한 뒤 mock 무대 시험 RED를 기록한다.`;
395
+ return `${firstAction} ⇒ ${step.replace(/\r?\n/gu, ' ')}`;
396
+ }
397
+ const decision = staged.decision;
398
+ const test = decision.device.replace(/\.ts$/u, '.test.ts');
399
+ const inventory = decision.inventoryMeasured
400
+ ? (decision.exists
401
+ ? `기존 ${decision.device} 를 써서`
402
+ : `신규 ${decision.device} 를 만들어`)
403
+ : `장치 재고를 대상 저장소에서 먼저 확인한 뒤 기존 장치를 쓰거나 없으면 ${decision.device} 로 새로 만들어`;
404
+ const deviceAction = `${FOLDED_DEVICE_FIRST_ACTION_MARKER}: ${inventory} ${test} 의 mock 무대 시험 RED 를 먼저 기록한다.`;
405
+ // «step 한 줄» 불변식 유지 — 원 step 의 개행을 치환해 붙인다(선행 문구는 아예 더하지 않는다).
406
+ return `${deviceAction} ⇒ ${step.replace(/\r?\n/gu, ' ')}`;
407
+ }
408
+
409
+ function bundledCompletionBoundaryStep(rows: readonly CompletionBoundaryRow[]): string {
410
+ return `${COMPLETION_BOUNDARY_STEP_PREFIX}: ${rows
411
+ .map((row, index) => `acceptance ${index + 1}[${row.label}] ${row.text}`)
412
+ .join(' ⇒ ')}`;
413
+ }
414
+
415
+ function completionBoundaryCards(rows: readonly CompletionBoundaryRow[], step: string): GoalDecomposeCard[] {
416
+ const codePaths = rows.find((row) => row.kind === 'code')?.paths ?? [];
417
+ const cards: GoalDecomposeCard[] = [
418
+ { kind: 'step', id: 'step-1', title: 'step 1 — 완료 경계 3행 한 step', body: step, paths: codePaths },
419
+ ];
420
+ for (const row of rows) {
421
+ if (row.kind === 'code') {
422
+ cards.push({ kind: 'acceptance', id: 'acceptance-code', title: row.label, body: row.text, paths: row.paths });
423
+ continue;
424
+ }
425
+ if (row.kind === 'live') {
426
+ cards.push({ kind: 'live', id: 'acceptance-live', title: row.label, body: row.text });
427
+ continue;
428
+ }
429
+ cards.push({ kind: 'evidence', id: 'acceptance-evidence-command', title: row.label, body: row.text,
430
+ ...(row.command === undefined ? {} : { command: row.command }) });
431
+ }
432
+ return cards;
433
+ }
434
+
435
+ /**
436
+ * 골 문면 → 직렬 카드 셋. `bundling: false` 는 반증 스위치다 — 같은 문면이 step 3 개로 흩어지는 모습을
437
+ * 시험이 그대로 만들 수 있게 한다(생산 경로는 이 스위치를 끄지 않는다).
438
+ */
439
+ export function decomposeGoal(goal: string, options: { bundling?: boolean } = {}): GoalDecomposeResult {
440
+ const rows = parseCompletionBoundaryRows(goal);
441
+ if (!rows.length) return { bundled: false, rows, steps: [], acceptance: [], cards: [] };
442
+ if (options.bundling === false) {
443
+ return {
444
+ bundled: false,
445
+ rows,
446
+ steps: rows.map((row) => `${row.label}: ${row.text}`),
447
+ acceptance: [],
448
+ cards: rows.map((row, index) => ({
449
+ kind: 'step',
450
+ id: `step-${index + 1}`,
451
+ title: `step ${index + 1} — ${row.label}`,
452
+ body: `${row.label}: ${row.text}`,
453
+ ...(row.kind === 'code' ? { paths: row.paths } : {}),
454
+ })),
455
+ };
456
+ }
457
+ if (rows.length < 3) return { bundled: false, rows, steps: [], acceptance: [], cards: [] };
458
+ const step = bundledCompletionBoundaryStep(rows);
85
459
  return {
86
- kind: 'shadow-first-split',
87
- pieces: [
88
- {
89
- id: 'shadow',
90
- step: '① 그림자 — 이 골의 배선이 자율 결정을 «기록만» 한다(자율 실행 0). 판정 = 시험 통과 ⊕ 그림자 관측 줄 모양(기록된 결정 1건 이상).',
91
- dependsOn: [],
92
- },
93
- {
94
- id: 'live',
95
- step: '② live 스위치 — 선행 = ① 그림자 착지. 같은 배선의 자율 실행을 켠다. 판정 = ① 착지 뒤 그림자 로그에 기대 결정 1건 이상 ⊕ 스위치 켬 ⊕ 이 골의 원 판정.',
96
- dependsOn: ['shadow'],
97
- },
98
- ],
460
+ bundled: true,
461
+ rows,
462
+ steps: [step],
463
+ acceptance: rows.map((row) => `${row.label}: ${row.text}`),
464
+ cards: completionBoundaryCards(rows, step),
99
465
  };
100
466
  }
101
467
 
@@ -106,6 +472,8 @@ export function createGoalAuthorDecomposeSteps(
106
472
  adversarialReview?: boolean;
107
473
  adversarialReviewSource?: 'cli' | 'default' | 'unknown';
108
474
  recentStepCounts?: readonly number[];
475
+ onSizedSlices?: (slices: SizedSlice[], redecomposed: number) => void;
476
+ repositoryRoot?: string;
109
477
  } = {},
110
478
  ): NonNullable<GoalAuthorDeps['decomposeSteps']> {
111
479
  return async (objective, options) => {
@@ -133,7 +501,7 @@ export function createGoalAuthorDecomposeSteps(
133
501
  debug.log('goal-author', 'shadow-first-split', {
134
502
  surface: 'goal-author',
135
503
  verdict: shadowSplit.kind,
136
- trigger: 'explicit-marker',
504
+ trigger: shadowSplit.trigger,
137
505
  pieces: shadowSplit.pieces.map((piece) => piece.id),
138
506
  edges: shadowSplit.pieces.reduce((n, piece) => n + piece.dependsOn.length, 0),
139
507
  ...(options?.runId === undefined ? {} : { runId: options.runId }),
@@ -141,7 +509,45 @@ export function createGoalAuthorDecomposeSteps(
141
509
  } catch { /* observation is fail-soft */ }
142
510
  return finalize(
143
511
  shadowSplit.pieces.map((piece) => piece.step),
144
- `명시 표지 «${SHADOW_FIRST_SPLIT_MARKER}» — 그림자 우선 두 조각(선행 간선 1).`,
512
+ shadowSplit.trigger === 'explicit-marker'
513
+ ? `명시 표지 «${SHADOW_FIRST_SPLIT_MARKER}» — 그림자 우선 두 조각(선행 간선 1).`
514
+ : '자연어 요청(그림자 우선 어휘 ⊕ 분할 지시) — 그림자 우선 두 조각(선행 간선 1).',
515
+ );
516
+ }
517
+ // ⭐ DECOMPOSE-BOUNDARY-ONE-STEP — 완료 경계 3행이 다 있는 골은 LLM 쪼개기 «전에» 한 step 으로 묶는다.
518
+ // 묶지 않으면 행마다 조각이 생겨 «코드 없는 증거/라이브 조각»이 나온다(실측 10-17 UX 미션 2건 손마감).
519
+ const boundary = decomposeGoal(objective);
520
+ if (boundary.bundled) {
521
+ try {
522
+ debug.log('goal-author', 'completion-boundary-bundled', {
523
+ surface: 'goal-author',
524
+ verdict: 'one-step-three-acceptance',
525
+ boundaryKind: 'completion-boundary',
526
+ rows: boundary.rows.map((row) => row.kind),
527
+ cards: boundary.cards.map((card) => card.kind),
528
+ steps: boundary.steps.length,
529
+ acceptance: boundary.acceptance.length,
530
+ ...(options?.runId === undefined ? {} : { runId: options.runId }),
531
+ });
532
+ } catch { /* observation is fail-soft */ }
533
+ // ⭐ 경계 분기도 finish() 와 같은 계약으로 크기 메타를 만들어 onSizedSlices 를 부른다
534
+ // (1조각 SizedSlice · restoreSlicePaths 포함 · redecomposed 0). 우회하면 생산 소비자
535
+ // `decomposeToTierSizedSlices`(tier-split 기본 seam)이 «no sized slices» 로 막힌다.
536
+ const boundarySteps = boundary.steps.map((step) => foldDeviceStageIntoBoundaryStep(objective, step, config.repositoryRoot));
537
+ const boundarySizes = boundarySteps.map((step) => boundaryStepSize(step, boundary.rows));
538
+ const declaredTargetLine = objective.split(/\r?\n/u)
539
+ .map((line) => line.trim())
540
+ .find((line) => /^대상\s*경로\s*[::]/u.test(line));
541
+ const boundarySlices = restoreSlicePaths(publicSizedSlices(boundarySteps, boundarySizes), objective);
542
+ // The authored step stays one line. The handed slice must start with the parent's
543
+ // declared target line: preflight reads only that line before tracing paths.
544
+ config.onSizedSlices?.(declaredTargetLine
545
+ ? boundarySlices.map((slice) => ({ ...slice, goal: slice.goal.startsWith(declaredTargetLine)
546
+ ? slice.goal : `${declaredTargetLine}\n${slice.goal}` }))
547
+ : boundarySlices, 0);
548
+ return finalize(
549
+ boundarySteps,
550
+ '완료 경계 3행(코드·실물·증거 명령) — step 1 의 acceptance 3 으로 묶음(경계 행은 조각이 아니다).',
145
551
  );
146
552
  }
147
553
  const { streamLLM } = await import('../llm.js');
@@ -149,15 +555,76 @@ export function createGoalAuthorDecomposeSteps(
149
555
  // «같은 규칙»으로 planning 노브(roleLlm.planning ⊕ ELANOUS_PROMPT_ENHANCE_MODEL/EFFORT)를 따른다.
150
556
  // 미설정이면 종전 그대로 — model 은 아예 전달하지 않는다(streamLLM 기본 모델) ⊕ effort 는 high.
151
557
  const { model, effort } = selectPlanningLlm();
152
- const llmOpts: { model?: string; reasoningEffort: 'low' | 'medium' | 'high' } = model === undefined
153
- ? { reasoningEffort: effort }
154
- : { model, reasoningEffort: effort };
558
+ const llmOpts: { model?: string; reasoningEffort: 'low' | 'medium' | 'high'; signal?: AbortSignal } = model === undefined
559
+ ? { reasoningEffort: effort, ...(signal ? { signal } : {}) }
560
+ : { model, reasoningEffort: effort, ...(signal ? { signal } : {}) };
155
561
  let decompositionRationale: string | undefined;
156
- const steps = await llmDecomposeSteps(
157
- objective,
158
- (input) => streamLLM([{ role: 'user', content: input.prompt }], () => {}, llmOpts).then((text) => ({ text })),
159
- { ...(options?.context ? { context: options.context } : {}), maxTasks: GOAL_AUTHOR_COARSE_MAX_SLICES, promptProfile: 'goal-author-coarse', ...(signal ? { signal } : {}), onRationale: (rationale) => { decompositionRationale = rationale; } },
160
- );
562
+ const decompose = (ask: string) => {
563
+ decompositionRationale = undefined;
564
+ return llmDecomposeSteps(
565
+ ask,
566
+ (input) => streamLLM([{ role: 'user', content: input.prompt }], () => {}, llmOpts).then((text) => ({ text })),
567
+ { ...(options?.context ? { context: options.context } : {}), maxTasks: GOAL_AUTHOR_SIZE_SAFETY_MAX_SLICES,
568
+ promptProfile: 'goal-author-coarse', ...(signal ? { signal } : {}),
569
+ onRationale: (rationale) => { decompositionRationale = rationale; } },
570
+ );
571
+ };
572
+ const steps = await decompose(objective);
573
+ const finish = async (rawCandidate: string[], rationale?: string): Promise<string[]> => {
574
+ if (!rawCandidate.length) return finalize(rawCandidate, rationale);
575
+ const staged = ensureDeviceFirstSteps(objective, rawCandidate, config.repositoryRoot);
576
+ let candidate = staged.steps;
577
+ if (staged.decision.required) {
578
+ try { debug.log('self-implement.decompose', 'device-first-slice', {
579
+ runId: options?.runId ?? null, firstSliceKind: staged.decision.firstSliceKind,
580
+ deviceCandidates: [staged.decision.device], deviceSource: staged.decision.deviceSource,
581
+ deviceExists: staged.decision.exists,
582
+ inventoryMeasured: staged.decision.inventoryMeasured,
583
+ featureSlices: Math.max(0, candidate.length - 1),
584
+ }); } catch { /* observation is fail-soft */ }
585
+ }
586
+ const measure = async (slices: string[]) => {
587
+ const parsed = parseGoalSliceSizes(await streamLLM(
588
+ [{ role: 'user', content: goalSliceSizePrompt(objective, slices) }], () => {}, llmOpts), slices.length);
589
+ return parsed ? { sizes: parsed, sizeSource: 'planner-estimate' as const }
590
+ : { sizes: deriveGoalSliceSizes(slices), sizeSource: 'derived' as const };
591
+ };
592
+ const observe = (event: 'slice-sized' | 'slice-oversize', sizeSource: 'planner-estimate' | 'derived', data: Record<string, unknown>) => {
593
+ try { debug.log('goal-author.decompose', event, { surface: 'goal-author', sizeSource, ...data,
594
+ ...(options?.runId === undefined ? {} : { runId: options.runId }) }); } catch { /* observation is fail-soft */ }
595
+ };
596
+ let redecomposed = 0;
597
+ let measured = await measure(candidate);
598
+ 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,
603
+ reasons: sizes ? oversized.map((index) => sizes![index]!.unavoidableReason) : [],
604
+ ...(sizes ? {} : { error: 'size metadata missing or inconsistent' }) });
605
+ const retryAsk = [objective, '', 'The previous goal-author proposal had missing size metadata or oversized slices.',
606
+ `PREVIOUS_STEPS_JSON: ${JSON.stringify(candidate)}`,
607
+ `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');
610
+ const regenerated = await decompose(retryAsk);
611
+ if (!regenerated.length) throw new Error('goal-author slice sizing: regeneration produced no slices');
612
+ redecomposed = 1;
613
+ candidate = ensureDeviceFirstSteps(objective, regenerated, config.repositoryRoot).steps;
614
+ rationale = decompositionRationale;
615
+ measured = await measure(candidate);
616
+ 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');
624
+ }
625
+ config.onSizedSlices?.(restoreSlicePaths(publicSizedSlices(candidate, sizes), objective), redecomposed);
626
+ return finalize(candidate, rationale);
627
+ };
161
628
  const heft = classifyHeft(objective);
162
629
  const adversarialReviewSource = config.adversarialReviewSource
163
630
  ?? (config.adversarialReview === undefined ? 'default' : 'unknown');
@@ -191,9 +658,10 @@ export function createGoalAuthorDecomposeSteps(
191
658
  reviewExecuted,
192
659
  reviewSkipReason,
193
660
  });
194
- if (!reviewExecuted) return finalize(steps, decompositionRationale);
661
+ if (!reviewExecuted) return finish(steps, decompositionRationale);
195
662
  const critic = (prompt: string) => streamLLM([{ role: 'user', content: prompt }], () => {}, llmOpts);
196
663
 
664
+ let revisedSteps: string[] | undefined;
197
665
  try {
198
666
  const critique = await adversarialPlanCritique(objective, steps, critic, options?.context);
199
667
  const sample = critique?.issues.slice(0, 3).map((issue) => issue.slice(0, 60)) ?? [];
@@ -208,20 +676,41 @@ export function createGoalAuthorDecomposeSteps(
208
676
  byAxis,
209
677
  reviewEnabled,
210
678
  });
211
- return finalize(critique.revisedSteps);
679
+ revisedSteps = critique.revisedSteps;
680
+ } else {
681
+ debug.log('goal-author', 'adversarial-sound', {
682
+ surface: 'goal-author',
683
+ heft,
684
+ issues: critique?.issues.length ?? 0,
685
+ sample,
686
+ byAxis,
687
+ reviewEnabled,
688
+ });
212
689
  }
213
-
214
- debug.log('goal-author', 'adversarial-sound', {
215
- surface: 'goal-author',
216
- heft,
217
- issues: critique?.issues.length ?? 0,
218
- sample,
219
- byAxis,
220
- reviewEnabled,
221
- });
222
690
  } catch {
223
691
  // The red-team is advisory; authoring must retain the LLM decomposition on failure.
224
692
  }
225
- return finalize(steps, decompositionRationale);
693
+ if (revisedSteps) return finish(revisedSteps);
694
+ return finish(steps, decompositionRationale);
226
695
  };
227
696
  }
697
+
698
+ /** Public goal-author sizing seam for a hand caller that needs per-slice tier metadata. */
699
+ export async function decomposeToTierSizedSlices(
700
+ goal: string,
701
+ opts?: { signal?: AbortSignal; repositoryRoot?: string },
702
+ ): Promise<TierSizedDecomposeResult> {
703
+ let result: { slices: SizedSlice[]; redecomposed: number } | undefined;
704
+ try {
705
+ const steps = await createGoalAuthorDecomposeSteps(opts?.signal, {
706
+ adversarialReview: false,
707
+ ...(opts?.repositoryRoot ? { repositoryRoot: opts.repositoryRoot } : {}),
708
+ onSizedSlices: (slices, redecomposed) => { result = { slices, redecomposed }; },
709
+ })(goal);
710
+ if (!steps.length || !result) return { ok: false, reason: 'goal-author slice sizing: no sized slices' };
711
+ if (result.slices.length === 0) return { ok: false, reason: 'slice-path-unresolved' };
712
+ return { ok: true, ...result };
713
+ } catch (error) {
714
+ return { ok: false, reason: error instanceof Error ? error.message : String(error) };
715
+ }
716
+ }