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
@@ -0,0 +1,273 @@
1
+ /**
2
+ * GOAL-REFINE-FROM-FIRST-IMPL — E3 첫 구현 → 골 저작 역피드백(골 v2).
3
+ *
4
+ * 설계 = 내부 문서 `RFC-progressive-goal-elaboration-2026-10-21` §7 간선 ②③④ — ta-journey 의 author-dialogue 단위에서
5
+ * judge «findings» → author → «deliver vN+1» → implement 되돌이를 «한 번»(max_visits) 실행한다.
6
+ * 첫 라운드(구현 → gate → 리뷰) 뒤 «재그라운딩 노트»(지나간 생산 경로 · 건드린 파일 · 운영이 골 가정과 다른 점 ·
7
+ * 불가능/모호한 수용선과 바꿀 문면 · 남은 일)를 받아 골 v2 를 만든다.
8
+ *
9
+ * ⛔ 방향·KPI 줄은 바뀌지 않는다(사람 몫) — 바꾸려 들면 v2 를 «버리고» v1 을 유지한다 ⊕ 사유를 남긴다.
10
+ * ⭐ 바뀌어도 되는 칸은 셋뿐: 예상 구역(`대상 경로:`·`신설:`) · 수용선 문구(`완료 경계 코드:`·`완료 경계 실물:`·`수용선:`·`- Checkable requested criterion:`) ·
11
+ * 검증 무대(`검증 무대:`·`무대:`). 줄 머리 꼴은 저작 문법(goal-author.ts GOAL_DONE_BOUNDARY_LABELS ⊕ 칸 문면)을 따른다.
12
+ * `완료 경계 증거 명령`은 «재는 명령»이라 KPI 로 본다(E1 extractGoalFixedLayer 의 KPI 줄에서 수용선 문구만 뺀 것).
13
+ * ⭐ 순수 함수 ⊕ 주입한 LLM — 시험은 대본 응답(fake-llm)으로 돈다(주입 사다리 L2).
14
+ */
15
+ import { createHash } from 'node:crypto';
16
+
17
+ export type RefineCallLLM = (args: { prompt: string; systemPrompt?: string }) => Promise<string>;
18
+
19
+ /** 골 한 줄의 칸. fixed = 방향·KPI(불변) · zone/acceptance/stage = 바뀌어도 되는 칸 · other = 이 칸이 안 건드린다. */
20
+ export type GoalLineZone = 'direction' | 'kpi' | 'zone' | 'acceptance' | 'stage' | 'other';
21
+ const EDITABLE: ReadonlySet<GoalLineZone> = new Set(['zone', 'acceptance', 'stage']);
22
+
23
+ /**
24
+ * 편집 가능 칸의 줄 머리 — 분류기(classifyGoalLine)와 노트 프롬프트(buildRegroundingPrompt)가 «이 상수 하나»에서 만든다.
25
+ * `Checkable requested criterion` = 저작기가 쓰는 «요구된 수용 기준» 줄(REFUTE 인용 자격 줄 — reflect-mustfix.ts) · preservation 은 고정(other).
26
+ */
27
+ export const EDITABLE_GOAL_LABELS = {
28
+ zone: ['대상 경로', '신설', '예상 구역'],
29
+ acceptance: ['완료 경계 코드', '완료 경계 실물', '수용선', 'acceptance', 'Checkable requested criterion'],
30
+ stage: ['검증 무대', '무대', 'stage'],
31
+ } as const satisfies Record<'zone' | 'acceptance' | 'stage', readonly string[]>;
32
+ const EDITABLE_ZONE_NAMES: Record<keyof typeof EDITABLE_GOAL_LABELS, string> = { zone: '예상 구역', acceptance: '수용선 문구', stage: '검증 무대' };
33
+
34
+ const escapeRegExp = (text: string) => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
35
+ const LABEL = (labels: string) => new RegExp(`^\\s*(?:[-*]\\s*)?(?:${labels})\\s*[::]`, 'i');
36
+ const LABELS = (labels: readonly string[]) => LABEL(labels.map(escapeRegExp).join('|'));
37
+ const KPI_LABEL = LABEL('완료 경계 증거 명령|증거 명령|판정 신호(?:\\([^)]*\\))?|KPI|verify|반증');
38
+ const ACCEPTANCE_LABEL = LABELS(EDITABLE_GOAL_LABELS.acceptance);
39
+ const ZONE_LABEL = LABELS(EDITABLE_GOAL_LABELS.zone);
40
+ const STAGE_LABEL = LABELS(EDITABLE_GOAL_LABELS.stage);
41
+ const DIRECTION_LABEL = LABEL('바꿀 것|목표|무엇|왜|현재 계약|Goal|Why|What');
42
+ /** 라벨 없는 줄도 KPI 낱말을 품으면 고정으로 본다(보수 쪽). */
43
+ const KPI_WORD = /판정 신호|KPI/i;
44
+
45
+ export function classifyGoalLine(line: string): GoalLineZone {
46
+ if (KPI_LABEL.test(line)) return 'kpi';
47
+ if (ACCEPTANCE_LABEL.test(line)) return 'acceptance';
48
+ if (ZONE_LABEL.test(line)) return 'zone';
49
+ if (STAGE_LABEL.test(line)) return 'stage';
50
+ if (DIRECTION_LABEL.test(line)) return 'direction';
51
+ if (KPI_WORD.test(line)) return 'kpi';
52
+ return 'other';
53
+ }
54
+
55
+ function labelOf(line: string): string {
56
+ return /^\s*(?:[-*]\s*)?([^::]+)[::]/.exec(line)?.[1]?.trim() ?? '';
57
+ }
58
+
59
+ /** 방향·KPI 줄(원문 그대로 · 순서 보존) — v1·v2 대조의 정본. */
60
+ export function fixedGoalLines(goal: string): string[] {
61
+ return goal.split(/\r?\n/).filter((line) => {
62
+ const zone = classifyGoalLine(line);
63
+ return zone === 'direction' || zone === 'kpi';
64
+ });
65
+ }
66
+
67
+ export interface RegroundEdit { from: string; to: string; reason: string }
68
+ export interface RegroundingNote {
69
+ productionPath: string[];
70
+ touchedFiles: string[];
71
+ divergences: string[];
72
+ edits: RegroundEdit[];
73
+ remaining: string[];
74
+ }
75
+
76
+ export interface GoalChangedLine { index: number; zone: GoalLineZone; before: string; after: string; reason: string }
77
+ export type GoalKeptReason = 'no-provider' | 'provider-failed' | 'note-unparseable' | 'empty-note' | 'no-applicable-edits' | 'fixed-layer-edit' | 'max-visits';
78
+ export type GoalRefinement =
79
+ | { outcome: 'refined'; v1Hash: string; v2Hash: string; v2: string; changedLines: GoalChangedLine[]; reasons: string[]; rejectedEdits: string[]; note: RegroundingNote }
80
+ | { outcome: 'kept'; v1Hash: string; v2Hash: string; kept: GoalKeptReason; detail?: string; rejectedEdits: string[] };
81
+
82
+ export function goalHash(text: string): string {
83
+ return createHash('sha256').update(text).digest('hex');
84
+ }
85
+
86
+ function strings(value: unknown, max = 20): string[] {
87
+ if (!Array.isArray(value)) return [];
88
+ return value.filter((item): item is string => typeof item === 'string').map((item) => item.trim()).filter(Boolean).slice(0, max).map((item) => item.slice(0, 400));
89
+ }
90
+
91
+ function lastJsonObject(text: string): unknown {
92
+ const fenced = [...text.matchAll(/```(?:json)?\s*([\s\S]*?)```/g)].map((match) => match[1]!);
93
+ for (const candidate of [...fenced.reverse(), text]) {
94
+ const start = candidate.indexOf('{');
95
+ const end = candidate.lastIndexOf('}');
96
+ if (start === -1 || end <= start) continue;
97
+ try { return JSON.parse(candidate.slice(start, end + 1)); } catch { /* next */ }
98
+ }
99
+ return undefined;
100
+ }
101
+
102
+ export function parseRegroundingNote(text: string): { ok: true; note: RegroundingNote } | { ok: false; error: string } {
103
+ const raw = lastJsonObject(text);
104
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return { ok: false, error: 'no JSON object' };
105
+ const record = raw as Record<string, unknown>;
106
+ const edits: RegroundEdit[] = Array.isArray(record.edits)
107
+ ? record.edits.flatMap((edit) => {
108
+ const e = edit as Record<string, unknown> | null;
109
+ return e && typeof e.from === 'string' && typeof e.to === 'string'
110
+ ? [{ from: e.from, to: e.to, reason: typeof e.reason === 'string' && e.reason.trim() ? e.reason.trim().slice(0, 400) : '(이유 없음)' }]
111
+ : [];
112
+ }).slice(0, 20)
113
+ : [];
114
+ return { ok: true, note: { productionPath: strings(record.productionPath), touchedFiles: strings(record.touchedFiles, 40), divergences: strings(record.divergences), edits, remaining: strings(record.remaining) } };
115
+ }
116
+
117
+ function noteIsEmpty(note: RegroundingNote): boolean {
118
+ return !note.edits.length && !note.productionPath.length && !note.touchedFiles.length && !note.divergences.length && !note.remaining.length;
119
+ }
120
+
121
+ const REGROUND_NOTE_HEADER = '## 재그라운딩 노트 (골 v2 · 첫 라운드 실전 — 참고, 고정 층 아님)';
122
+
123
+ /**
124
+ * (v1 골 문면, 재그라운딩 노트) → v2 ⊕ 바뀐 줄·이유 ⊕ 해시.
125
+ * ⛔ 방향·KPI 줄을 겨눈 편집이 «하나라도» 있으면 v2 전체를 버린다(kept: fixed-layer-edit).
126
+ * 바뀌어도 되는 칸 밖(other)·없는 줄·칸 머리를 바꾼 편집은 그 편집만 버리고 이유를 rejectedEdits 에 남긴다.
127
+ */
128
+ export function applyRegroundingNote(v1: string, note: RegroundingNote): GoalRefinement {
129
+ const v1Hash = goalHash(v1);
130
+ const kept = (reason: GoalKeptReason, rejectedEdits: string[] = [], detail?: string): GoalRefinement =>
131
+ ({ outcome: 'kept', v1Hash, v2Hash: v1Hash, kept: reason, rejectedEdits, ...(detail ? { detail } : {}) });
132
+ if (noteIsEmpty(note)) return kept('empty-note');
133
+ const lines = v1.split('\n');
134
+ const rejected: string[] = [];
135
+ const changed: GoalChangedLine[] = [];
136
+ for (const edit of note.edits) {
137
+ const from = edit.from.trim();
138
+ const index = lines.findIndex((line, i) => line.trim() === from && !changed.some((c) => c.index === i));
139
+ if (index === -1) { rejected.push(`not-in-goal: ${from.slice(0, 120)}`); continue; }
140
+ const before = lines[index]!;
141
+ const zone = classifyGoalLine(before);
142
+ if (zone === 'direction' || zone === 'kpi') {
143
+ return kept('fixed-layer-edit', [...rejected, `${zone}: ${before.trim().slice(0, 160)}`], edit.reason);
144
+ }
145
+ const after = edit.to.replace(/\r?\n/g, ' ').trim();
146
+ if (!EDITABLE.has(zone)) { rejected.push(`out-of-zone(${zone}): ${before.trim().slice(0, 120)}`); continue; }
147
+ if (classifyGoalLine(after) !== zone || labelOf(after) !== labelOf(before.trim())) { rejected.push(`label-changed: ${before.trim().slice(0, 120)}`); continue; }
148
+ if (after === before.trim()) { rejected.push(`no-op: ${before.trim().slice(0, 120)}`); continue; }
149
+ const indent = /^\s*/.exec(before)![0];
150
+ lines[index] = `${indent}${after}`;
151
+ changed.push({ index, zone, before: before.trim(), after, reason: edit.reason });
152
+ }
153
+ if (!changed.length) return kept('no-applicable-edits', rejected);
154
+ const body = lines.join('\n');
155
+ // 방어 이중화 — 적용 뒤에도 방향·KPI 줄이 원문 그대로인가(줄 분류가 편집으로 바뀌는 경우까지 막는다).
156
+ if (JSON.stringify(fixedGoalLines(body)) !== JSON.stringify(fixedGoalLines(v1))) return kept('fixed-layer-edit', rejected, 'fixed lines differ after applying edits');
157
+ const section = (title: string, items: string[]) => (items.length ? [`### ${title}`, ...items.map((item) => `- ${item.replace(/\r?\n/g, ' ')}`)] : []);
158
+ const v2 = [
159
+ body.trimEnd(),
160
+ '',
161
+ REGROUND_NOTE_HEADER,
162
+ ...section('지나간 생산 경로', note.productionPath),
163
+ ...section('건드린 파일', note.touchedFiles),
164
+ ...section('운영이 골 가정과 다른 점', note.divergences),
165
+ ...section('바뀐 문면(v1 → v2)', changed.map((c) => `${c.before} → ${c.after} — ${c.reason}`)),
166
+ ...section('남은 일', note.remaining),
167
+ ].join('\n');
168
+ return { outcome: 'refined', v1Hash, v2Hash: goalHash(v2), v2, changedLines: changed, reasons: changed.map((c) => c.reason), rejectedEdits: rejected, note };
169
+ }
170
+
171
+ const NOTE_SYSTEM = 'You re-ground a software goal after its first implementation round. Reply with one JSON object only.';
172
+
173
+ export interface FirstRoundEvidence {
174
+ /** 첫 라운드 자식 요약(무엇을 해 봤나). */
175
+ implSummary?: string;
176
+ /** 첫 라운드 gate·리뷰가 돌려준 지적(must-fix 등). */
177
+ findings?: string;
178
+ /** 첫 라운드가 실제로 건드린 파일. */
179
+ changedFiles?: readonly string[];
180
+ /** SCOPE-ESCAPE-AS-REFINE — 대상 경로 밖에서 바뀌었고 수용된 파일(«구현이 알려준 새 범위» · 실패 아님). */
181
+ newScope?: readonly string[];
182
+ }
183
+
184
+ /** 내부 — 시험은 refineGoalFromFirstRound 가 LLM 에 넘긴 프롬프트로 본다. */
185
+ function buildRegroundingPrompt(v1: string, evidence: FirstRoundEvidence): string {
186
+ const fixed = fixedGoalLines(v1);
187
+ return [
188
+ '## 할 일 — 재그라운딩 노트(E3 · 첫 라운드 → 골 v2)',
189
+ '첫 라운드(구현 → gate → 리뷰) 실전에서 알게 된 것으로 골을 다시 접지한다. 방향·KPI 줄은 바꾸지 않는다(사람 몫).',
190
+ `바꿀 수 있는 줄은 셋뿐이다: ${(Object.keys(EDITABLE_GOAL_LABELS) as Array<keyof typeof EDITABLE_GOAL_LABELS>)
191
+ .map((zone) => `${EDITABLE_ZONE_NAMES[zone]}(${EDITABLE_GOAL_LABELS[zone].map((label) => `\`${label}:\``).join('·')})`).join(' · ')}. 줄 머리(라벨)는 그대로 두고 값만 고친다.`,
192
+ 'JSON 형식: {"productionPath": [실제로 지나간 생산 경로], "touchedFiles": [건드린 파일], "divergences": [운영이 골 가정과 다른 점], "edits": [{"from": "골 원문 한 줄 그대로", "to": "고친 한 줄", "reason": "왜(불가능·모호·경로 틀림)"}], "remaining": [남은 일]}',
193
+ '',
194
+ '## 고정 층(바꾸지 않는다 — 방향·KPI)',
195
+ ...(fixed.length ? fixed.map((line) => `- ${line.trim()}`) : ['- (없음)']),
196
+ '',
197
+ '## 첫 라운드 실전',
198
+ `- 자식 요약: ${(evidence.implSummary ?? '').replace(/\s+/g, ' ').trim().slice(0, 600) || '(없음)'}`,
199
+ `- 건드린 파일: ${evidence.changedFiles?.length ? evidence.changedFiles.slice(0, 40).join(', ') : '(관측 없음)'}`,
200
+ ...(evidence.newScope?.length ? [`- 구현이 알려준 새 범위(대상 경로 밖 편집 · 실패 아님 · 예상 구역에 넣을지 판단): ${evidence.newScope.slice(0, 40).join(', ')}`] : []),
201
+ '### gate·리뷰 지적',
202
+ (evidence.findings ?? '').trim().slice(0, 4000) || '(없음)',
203
+ '',
204
+ '## 골 v1 원문',
205
+ v1,
206
+ ].join('\n');
207
+ }
208
+
209
+ /** 노트 생성(LLM) → v2. 실패·빈 노트·상한 초과는 v1 유지(보수 쪽) ⊕ 사유 — 조용한 폴백은 없다(호출부가 사건으로 남긴다). */
210
+ export async function refineGoalFromFirstRound(
211
+ input: { v1: string; evidence: FirstRoundEvidence; visit: number; maxVisits?: number },
212
+ deps: { callLLM?: RefineCallLLM },
213
+ ): Promise<GoalRefinement> {
214
+ const v1Hash = goalHash(input.v1);
215
+ const kept = (reason: GoalKeptReason, detail?: string): GoalRefinement => ({ outcome: 'kept', v1Hash, v2Hash: v1Hash, kept: reason, rejectedEdits: [], ...(detail ? { detail } : {}) });
216
+ if (input.visit > (input.maxVisits ?? GOAL_REFINE_MAX_VISITS)) return kept('max-visits', `visit ${input.visit} > ${input.maxVisits ?? GOAL_REFINE_MAX_VISITS}`);
217
+ if (!deps.callLLM) return kept('no-provider');
218
+ let text: string;
219
+ try {
220
+ text = await deps.callLLM({ prompt: buildRegroundingPrompt(input.v1, input.evidence), systemPrompt: NOTE_SYSTEM });
221
+ } catch (error) {
222
+ return kept('provider-failed', (error instanceof Error ? error.message : String(error)).slice(0, 200));
223
+ }
224
+ const parsed = parseRegroundingNote(text);
225
+ if (!parsed.ok) return kept('note-unparseable', parsed.error);
226
+ return applyRegroundingNote(input.v1, parsed.note);
227
+ }
228
+
229
+ /** 되돌이 상한 — ta-journey author-dialogue 의 refine 왕복은 런당 한 번(첫 라운드 뒤). */
230
+ export const GOAL_REFINE_MAX_VISITS = 1;
231
+
232
+ /** 원장 `goal-refined` 사건 값 — v1·v2 해시 ⊕ 바뀐 줄 ⊕ 이유 ⊕ (유지면) kept 사유. */
233
+ export function goalRefinedEvent(refinement: GoalRefinement, round: number): Record<string, unknown> {
234
+ const base = { outcome: refinement.outcome, round, v1Hash: refinement.v1Hash, v2Hash: refinement.v2Hash,
235
+ ...(refinement.rejectedEdits.length ? { rejectedEdits: refinement.rejectedEdits } : {}) };
236
+ if (refinement.outcome === 'kept') return { ...base, changedLines: [], reasons: [], kept: refinement.kept, ...(refinement.detail ? { detail: refinement.detail } : {}) };
237
+ return { ...base, changedLines: refinement.changedLines, reasons: refinement.reasons };
238
+ }
239
+
240
+ /** PR 본문 «골 변경» 절 — v1→v2 바뀐 줄과 이유(유지면 그 사유). */
241
+ export function renderGoalChangeSection(refinement: GoalRefinement): string {
242
+ const head = ['## 골 변경', `- v1 ${refinement.v1Hash.slice(0, 12)} → v2 ${refinement.v2Hash.slice(0, 12)} (방향·KPI 줄 불변)`];
243
+ if (refinement.outcome === 'kept') return [...head, `- 시도 · v1 유지 · 사유 ${refinement.kept}${refinement.detail ? ` (${refinement.detail})` : ''}`,
244
+ ...refinement.rejectedEdits.map((edit) => `- 버린 편집: ${edit}`)].join('\n');
245
+ return [...head,
246
+ ...refinement.changedLines.flatMap((c) => [`- [${c.zone}] \`${c.before}\``, ` → \`${c.after}\``, ` 이유: ${c.reason}`]),
247
+ ...refinement.rejectedEdits.map((edit) => `- 버린 편집: ${edit}`)].join('\n');
248
+ }
249
+
250
+ /**
251
+ * orchestrator 호출점 한 곳 — 첫 라운드 뒤 · 둘째 라운드 프롬프트 직전.
252
+ * 관측 = 원장 `goal-refined`(observe → 런 원장 ⊕ debug.log 범주 `self-implement.goal-refine`).
253
+ * 돌려준 goal 이 다음 라운드 프롬프트의 골이다(유지면 v1).
254
+ */
255
+ export async function runFirstRoundRefine(input: {
256
+ goal: string;
257
+ evidence: FirstRoundEvidence;
258
+ round: number;
259
+ visit: number;
260
+ callLLM?: RefineCallLLM;
261
+ observe: (event: string, data: Record<string, unknown>, opt?: { category?: string; level?: 'warn' }) => void;
262
+ }): Promise<{ goal: string; refinement: GoalRefinement }> {
263
+ let refinement: GoalRefinement;
264
+ try {
265
+ refinement = await refineGoalFromFirstRound({ v1: input.goal, evidence: input.evidence, visit: input.visit }, { callLLM: input.callLLM });
266
+ } catch (error) {
267
+ const v1Hash = goalHash(input.goal);
268
+ refinement = { outcome: 'kept', v1Hash, v2Hash: v1Hash, kept: 'provider-failed', rejectedEdits: [], detail: (error instanceof Error ? error.message : String(error)).slice(0, 200) };
269
+ }
270
+ // ⚠️ 유지(kept)는 전부 warn — seam(callLLM) 부재로 늘 no-provider 인 런도 «조용히 꺼지지» 않는다(리뷰 r1 should-fix 4).
271
+ input.observe('goal-refined', goalRefinedEvent(refinement, input.round), { category: 'self-implement.goal-refine', ...(refinement.outcome === 'refined' ? {} : { level: 'warn' as const }) });
272
+ return { goal: refinement.outcome === 'refined' ? refinement.v2 : input.goal, refinement };
273
+ }
@@ -199,10 +199,21 @@ export function applyGraphOverlays(
199
199
  applied.push(overlay.overlayId);
200
200
  }
201
201
 
202
- // ⑵ 계약 없는 실행 노드를 거부한다. 원본부터 계약이 없는 종결 gate 는
203
- // 실행 권한을 갖지 않으므로 원본·결과 모두 recipe=none·출구 없음이고 선언이 그대로일 때만 허용한다.
202
+ // ⑵ 계약 없는 실행 노드를 거부한다. 기존 종결 gate 와 여정 선언은
203
+ // 원본 그대로일 때만 예외로 보존한다. 오버레이가 바꾼 노드에는 계약이 필요하다.
204
204
  for (const node of next.nodes) {
205
205
  const original = template.nodes.find((candidate) => candidate.nodeId === node.nodeId);
206
+ // 기존 무계약 여정 선언은 노드와 그 출입 간선·종결 지위가 모두 그대로일 때만 보존한다.
207
+ // 새 경로가 실행 권한 없는 노드를 노출하면 계약 검사를 다시 건다.
208
+ const touchesNode = (edge: GraphTemplateSpec['edges'][number]) => edge.from === node.nodeId
209
+ || edge.to === node.nodeId
210
+ || Object.values(edge.map ?? {}).includes(node.nodeId)
211
+ || (edge.fallback ?? []).some((fallback) => fallback.node === node.nodeId);
212
+ const untouchedJourneyDeclaration = original?.journeyStage !== undefined
213
+ && original.contract === undefined
214
+ && JSON.stringify(node) === JSON.stringify(original)
215
+ && JSON.stringify(next.edges.filter(touchesNode)) === JSON.stringify(template.edges.filter(touchesNode))
216
+ && next.terminalNodes.includes(node.nodeId) === template.terminalNodes.includes(node.nodeId);
206
217
  const existingTerminalGate = original?.kind === 'gate' && original.recipe === 'none'
207
218
  && original.contract === undefined
208
219
  && JSON.stringify(node) === JSON.stringify(original)
@@ -216,7 +227,7 @@ export function applyGraphOverlays(
216
227
  && typeof contract.tools === 'string' && contract.tools.trim() !== ''
217
228
  && Array.isArray(contract.outputs)
218
229
  && contract.outputs.every((output) => typeof output === 'string');
219
- if (!existingTerminalGate && !validContract) {
230
+ if (!untouchedJourneyDeclaration && !existingTerminalGate && !validContract) {
220
231
  rejections.push({ kind: 'node-without-contract', overlayId: applied.join(',') || '<none>', nodeId: node.nodeId });
221
232
  }
222
233
  }
@@ -3,6 +3,7 @@ import { applyGraphOverlays, type GraphOverlaySpec, type OverlayPatchOp, type Ov
3
3
  import { edgeMapOf, graphVersionHash, type GraphEdgeSpec, type GraphNodeSpec, type GraphTemplateSpec } from './graph-yaml.js';
4
4
  import { inspectPipelineGraph } from './pipeline-shape.js';
5
5
  import { hasNodeKind } from '../graph-kinds/registry.js';
6
+ import { GOAL_TYPES, type GoalType } from './goal-author.js';
6
7
 
7
8
  /** A proposed change to one existing outcome of a conditional route. Unconditional and fallback edges are protected. */
8
9
  export interface GraphVariantRoute {
@@ -24,6 +25,18 @@ export interface GraphVariantPlan {
24
25
  readonly growth?: GraphVariantGrowth;
25
26
  }
26
27
 
28
+ /** 골 분석 중 최초 변형 선택이 보는 «두» 입력 — 문서 전용·저작 등급 같은 원 칸의 다른 축은 이 조각에 없다. */
29
+ export interface GraphVariantGoalAnalysis {
30
+ readonly goalType: GoalType;
31
+ readonly targetPathCount: number;
32
+ }
33
+
34
+ /** 최초 graph variant 선택 — id·선택 이유가 런 원장 옆 .graph.yaml 에 함께 저장되고 재조회된다. */
35
+ export interface GraphVariantSelection {
36
+ readonly variantId: string;
37
+ readonly reason: string;
38
+ }
39
+
27
40
  export type GraphVariantRejection =
28
41
  | { readonly kind: 'invalid-goal' }
29
42
  | { readonly kind: 'unknown-node'; readonly node: string }
@@ -35,25 +48,46 @@ export type GraphVariantRejection =
35
48
  | { readonly kind: 'unreachable-terminal'; readonly node: string }
36
49
  | { readonly kind: 'invalid-graph'; readonly defects: ReturnType<typeof inspectPipelineGraph> }
37
50
  | { readonly kind: 'overlay-rejected'; readonly rejections: readonly OverlayRejection[] }
38
- | { readonly kind: 'invalid-growth'; readonly reason: string };
51
+ | { readonly kind: 'invalid-growth'; readonly reason: string }
52
+ | { readonly kind: 'invalid-goal-analysis' };
39
53
 
40
54
  export type GraphVariantResult =
41
- | { readonly ok: true; readonly overlay: GraphOverlaySpec; readonly template: GraphTemplateSpec; readonly patches: readonly OverlayPatchOp[] }
55
+ | { readonly ok: true; readonly overlay: GraphOverlaySpec; readonly template: GraphTemplateSpec; readonly patches: readonly OverlayPatchOp[]; readonly selection?: GraphVariantSelection }
42
56
  | { readonly ok: false; readonly rejections: readonly GraphVariantRejection[] };
43
57
 
58
+ /** 최초 변형 선택(id·선택 이유)의 결정론적 유도 — 같은 종류·대상 경로 수면 항상 같은 값을 낸다. */
59
+ export function initialGraphVariantSelection(analysis: GraphVariantGoalAnalysis): GraphVariantSelection {
60
+ const variantId = `variant-${analysis.goalType}-${createHash('sha256')
61
+ .update(JSON.stringify({ goalType: analysis.goalType, targetPathCount: analysis.targetPathCount }))
62
+ .digest('hex').slice(0, 12)}`;
63
+ return {
64
+ variantId,
65
+ reason: `initial graph variant selected from goal type ${analysis.goalType} with ${analysis.targetPathCount} target path${analysis.targetPathCount === 1 ? '' : 's'}`,
66
+ };
67
+ }
68
+
44
69
  /** Pure, deterministic variant authoring. Never mutates the supplied template and never writes an overlay. */
45
70
  export function createGraphVariant(input: {
46
71
  readonly template: GraphTemplateSpec;
47
72
  readonly goal: string;
48
73
  readonly plan: GraphVariantPlan;
74
+ readonly goalAnalysis?: GraphVariantGoalAnalysis;
49
75
  }): GraphVariantResult {
50
- const { template, goal, plan } = input;
76
+ const { template, goal, plan, goalAnalysis } = input;
51
77
  const known = new Set(template.nodes.map((node) => node.nodeId));
52
78
  const rejections: GraphVariantRejection[] = [];
53
79
  if (!/^g_[a-z0-9_-]+$/i.test(goal)) rejections.push({ kind: 'invalid-goal' });
80
+ let selection: GraphVariantSelection | undefined;
81
+ if (goalAnalysis !== undefined) {
82
+ if (!GOAL_TYPES.includes(goalAnalysis.goalType) || !Number.isSafeInteger(goalAnalysis.targetPathCount) || goalAnalysis.targetPathCount < 0) {
83
+ rejections.push({ kind: 'invalid-goal-analysis' });
84
+ } else {
85
+ selection = initialGraphVariantSelection(goalAnalysis);
86
+ }
87
+ }
54
88
  if (plan.growth) {
55
89
  const { node, from, outcome, returnTo } = plan.growth;
56
- if (!node || typeof node !== 'object') return { ok: false, rejections: [{ kind: 'invalid-growth', reason: 'growth requires one new contracted node' }] };
90
+ if (!node || typeof node !== 'object') return { ok: false, rejections: [...rejections, { kind: 'invalid-growth', reason: 'growth requires one new contracted node' }] };
57
91
  const edgeIndex = template.edges.findIndex((edge) => edge.from === from);
58
92
  const edge = template.edges[edgeIndex];
59
93
  if (!known.has(from) || known.has(node.nodeId) || template.terminalNodes.includes(from) ||
@@ -94,7 +128,7 @@ export function createGraphVariant(input: {
94
128
  }
95
129
  const unreachable = projected.terminalNodes.filter((terminal) => !reached.has(terminal) || (edges[terminal]?.length ?? 0) !== 0);
96
130
  if (unreachable.length) return { ok: false, rejections: unreachable.map((terminal) => ({ kind: 'unreachable-terminal', node: terminal })) };
97
- return { ok: true, overlay, template: projected, patches };
131
+ return { ok: true, overlay, template: projected, patches, ...(selection === undefined ? {} : { selection }) };
98
132
  }
99
133
  const patches: OverlayPatchOp[] = [];
100
134
 
@@ -167,5 +201,5 @@ export function createGraphVariant(input: {
167
201
  })) };
168
202
  const applied = applyGraphOverlays(validationTemplate, [overlay]);
169
203
  if (!applied.ok) return { ok: false, rejections: [{ kind: 'overlay-rejected', rejections: applied.rejections }] };
170
- return { ok: true, overlay, template: projected, patches };
204
+ return { ok: true, overlay, template: projected, patches, ...(selection === undefined ? {} : { selection }) };
171
205
  }
@@ -72,6 +72,12 @@ import { setEventLoopActivity } from '../debug/event-loop-watchdog.js';
72
72
  import { resolveEscalateTarget, resolveExplicitChildEscalateTarget } from './rework-policy.js';
73
73
  import { tailWithOmissionMarker } from './off-diff-evidence.js';
74
74
  import type { EscalateTier } from './rework-policy.js';
75
+
76
+ const VERIFIED_PR_SUPERVISOR_INPUT = 'PR source already verified. Implement the requested repair in this worktree now.';
77
+
78
+ function supervisorInputForSource(input: string, verifiedPrSource: boolean | undefined): string {
79
+ return verifiedPrSource ? VERIFIED_PR_SUPERVISOR_INPUT : input;
80
+ }
75
81
  import { readRunLifecycleFromStateDir } from '../signal/lifecycle-bridge.js';
76
82
  import { lifecycleRootReportEnv, lifecycleRootReportPath, readLifecycleRootReport, removeLifecycleRootReport } from '../signal/lifecycle-root-report.js';
77
83
  import { compareLifecycleToScreen, type LifecycleScreenComparison } from './lifecycle-screen-scoreboard.js';
@@ -967,6 +973,8 @@ export interface HeadlessGoalLoopPtyOptions {
967
973
  sendOutbound?: typeof sendOutbound;
968
974
  /** Queues an argv child supervisor input for the orchestrator's next-round prompt; never writes stdin. */
969
975
  onSupervisorInput?: (text: string, updateDelivery: (delivery: SupervisorDeliveryState, reason?: string) => void) => void;
976
+ /** The Pod has already checked out its pinned PR source. Supervisor input must not relaunch it. */
977
+ verifiedPrSource?: boolean;
970
978
  /** ★ 턴 abort 신호(#21) — /cancel 이 이 신호를 abort 하면 호스팅 PTY 를 즉시 kill + 폴 루프 조기 종료
971
979
  * (고아 자식 프로세스 방지). 미주입 시 종전대로 exit/GOAL-COMPLETE/타임아웃까지 폴. */
972
980
  signal?: AbortSignal;
@@ -1720,7 +1728,7 @@ export async function runHeadlessGoalLoopPty(opts: HeadlessGoalLoopPtyOptions):
1720
1728
  // pipeline with a synthetic wait, whose evidence is honestly `action-wait`; calling
1721
1729
  // the brain would violate the no-consultation boundary, while weakening brainCalls
1722
1730
  // would hide that boundary instead of preserving it.
1723
- const decision: ControlDecision = blockedWrite
1731
+ const suggestedDecision: ControlDecision = blockedWrite
1724
1732
  ? { action: 'wait' }
1725
1733
  : await Promise.race([
1726
1734
  Promise.resolve(opts.brain.decide(controlObs, controller.signal)),
@@ -1735,6 +1743,13 @@ export async function runHeadlessGoalLoopPty(opts: HeadlessGoalLoopPtyOptions):
1735
1743
  }),
1736
1744
  ...(parentAbort ? [parentAbort] : []),
1737
1745
  ]);
1746
+ // The supervisor suggestion is untrusted text. In a PR-source Pod the
1747
+ // source was verified before this process started, so any proposed
1748
+ // input is reduced to an implementation instruction before it can
1749
+ // reach either the child queue or the parent progress surface.
1750
+ const decision: ControlDecision = opts.verifiedPrSource && suggestedDecision.action === 'input'
1751
+ ? { action: 'input', text: supervisorInputForSource(suggestedDecision.text, opts.verifiedPrSource) }
1752
+ : suggestedDecision;
1738
1753
  const actionDetail = decision.action === 'input'
1739
1754
  ? decision.text.slice(0, 120)
1740
1755
  : decision.action === 'done' || decision.action === 'no-progress' ? decision.reason.slice(0, 120) : '';
@@ -2015,11 +2030,12 @@ export async function runHeadlessGoalLoopPty(opts: HeadlessGoalLoopPtyOptions):
2015
2030
  });
2016
2031
  if (artifactDecision.kind === 'escalate-terminal-success') {
2017
2032
  reachedCompletion = false;
2033
+ const restartPacket = supervisorInputForSource(artifactDecision.restartPacket, opts.verifiedPrSource);
2018
2034
  debug.log('self-implement', 'headless.output-artifact-intervention', {
2019
2035
  ptyId, runId, kind: artifactDecision.kind, missing: artifactDecision.missing,
2020
- diagnostic: artifactDecision.diagnostic, restartPacket: artifactDecision.restartPacket,
2036
+ diagnostic: artifactDecision.diagnostic, restartPacket,
2021
2037
  }, { level: 'warn' });
2022
- opts.onSupervisorInput?.(artifactDecision.restartPacket, () => {});
2038
+ opts.onSupervisorInput?.(restartPacket, () => {});
2023
2039
  }
2024
2040
  }
2025
2041
  if (exitReason === 'loop-exhausted-without-completion' && reachedCompletion) {
@@ -3,6 +3,7 @@
3
3
  import { requirePosixShellCommand } from '../platform/default-shell.js';
4
4
  import { spawnSync } from 'node:child_process';
5
5
  import { debug } from '../debug/log.js';
6
+ import { narrowerEvidenceCommand } from './evidence-command-budget.js';
6
7
  import { resolveRunIdentity } from '../harness/harness-space.js';
7
8
  //
8
9
  // ⛔ **왜 필요한가** — 리뷰어의 증거 채널은 워크트리 diff 하나다(`seams.ts` 의 `reviewDiff`).
@@ -320,14 +321,21 @@ export function authorLimitationCountFromGoal(goal: string): number {
320
321
  * 추론된다. 위 두 타입과 같은 규율이다(죽은 공개 표면은 계약처럼 읽힌다 · 리뷰 must-fix). */
321
322
  interface RequiredEvidenceCheckRun {
322
323
  readonly tag: string;
324
+ /** Command required by the authored goal, even if a diagnostic substitute ran. */
323
325
  readonly command: string;
326
+ /** Command actually run; absent when the timeout budget stopped execution. */
327
+ readonly executedCommand?: string;
324
328
  readonly exitCode: number | null;
325
329
  readonly stdout: string;
326
330
  /** EVIDENCE-WIRING-EXEMPT — `bun test` writes its «N pass / 0 fail» summary to stderr. */
327
331
  readonly stderr: string;
328
332
  readonly durationMs: number;
333
+ /** A narrower smoke check diagnoses the timeout but cannot prove the original requirement. */
334
+ readonly substitutedFor?: string;
329
335
  }
330
336
 
337
+ type EvidenceCommandRunner = (command: string, cwd: string) => Pick<ReturnType<typeof spawnSync>, 'status' | 'stdout' | 'stderr' | 'error'>;
338
+
331
339
  /**
332
340
  * ★ `I-24` / `RUN-T6` — 골에서 **요구된 증거**를 읽는다. **순수**.
333
341
  *
@@ -394,7 +402,7 @@ export function goalDeclaresNoWiring(goal: string): boolean {
394
402
 
395
403
  /** A `bun test` check that ran its tests and failed none: rc 0 ⊕ «N pass» (N ≥ 1) ⊕ «0 fail» in its output. */
396
404
  function bunTestCheckPassed(run: RequiredEvidenceCheckRun): boolean {
397
- if (run.exitCode !== 0 || !/(?:^|[\s;&|(])bun\s+(?:run\s+)?test\b/.test(run.command)) return false;
405
+ if (run.substitutedFor || run.exitCode !== 0 || !/(?:^|[\s;&|(])bun\s+(?:run\s+)?test\b/.test(run.executedCommand ?? run.command)) return false;
398
406
  const output = `${run.stdout}\n${run.stderr}`;
399
407
  return /(?:^|\n)\s*[1-9]\d*\s+pass\b/.test(output) && /(?:^|\n)\s*0\s+fail\b/.test(output);
400
408
  }
@@ -418,20 +426,46 @@ export function settleUncoveredEvidence(
418
426
  }
419
427
 
420
428
  /** 골 작성자가 요구 줄에 명시한 셸 체크를 하니스 worktree에서 관측한다. `bun test` 체크의 통과는
421
- * settleUncoveredEvidence 가 그 요구의 덮임으로 받는다(EVIDENCE-WIRING-EXEMPT). */
422
- export function runRequiredEvidenceChecks(goal: string, cwd: string, runId?: string): RequiredEvidenceCheckRun[] {
429
+ * settleUncoveredEvidence 가 그 요구의 덮임으로 받는다(EVIDENCE-WIRING-EXEMPT).
430
+ * 단독 호출에 timeoutCounts/headCommit을 주지 않으면 재시도 예산이 없다. 실제 라운드 호출자는
431
+ * run 단위 createRequiredEvidenceBudget을 써야 HEAD 미확인 때도 임시 예산이 적용된다. */
432
+ export function runRequiredEvidenceChecks(goal: string, cwd: string, runId?: string, options: {
433
+ timeoutCounts?: Map<string, number>;
434
+ headCommit?: string;
435
+ run?: EvidenceCommandRunner;
436
+ } = {}): RequiredEvidenceCheckRun[] {
423
437
  const identity = resolveRunIdentity({ explicit: runId });
424
438
  const checks = requiredEvidenceFromGoal(goal).flatMap(({ tag, verifyCommand }) => verifyCommand ? [{ tag, command: verifyCommand }] : []);
439
+ // Direct callers without a measured HEAD have no stable revision identity;
440
+ // the run-owned wrapper supplies a temporary identity when appropriate.
441
+ const timeoutCounts = options.headCommit ? options.timeoutCounts : undefined;
442
+ const budgetKey = (command: string) => `${options.headCommit ?? ''}\0${command}`;
425
443
  const runs = checks.map(({ tag, command }) => {
426
444
  const startedAt = Date.now();
427
- const result = spawnSync(requirePosixShellCommand('/bin/sh'), ['-c', command], { cwd, encoding: 'utf8', timeout: 180_000, maxBuffer: 32 * 1024 * 1024 });
445
+ const priorTimeouts = timeoutCounts?.get(budgetKey(command)) ?? 0;
446
+ const replacement = priorTimeouts >= 2 ? narrowerEvidenceCommand(command, cwd) : null;
447
+ const executedCommand = replacement ?? command;
448
+ const replacementTimeouts = replacement ? (timeoutCounts?.get(budgetKey(replacement)) ?? 0) : 0;
449
+ if (priorTimeouts >= 2 && (!replacement || replacementTimeouts >= 2)) {
450
+ try { debug.log('self-implement.evidence', 'command-budget-stop', { runId: identity.runId, command, replacement, timeoutCount: priorTimeouts, replacementTimeoutCount: replacementTimeouts }); } catch { /* observation is fail-soft */ }
451
+ return { tag, command, exitCode: null, stdout: '', stderr: 'Evidence command timed out twice; no further identical test run was attempted.', durationMs: 0 };
452
+ }
453
+ if (replacement) {
454
+ try { debug.log('self-implement.evidence', 'command-budget-switch', { runId: identity.runId, from: command, to: replacement, timeoutCount: priorTimeouts }); } catch { /* observation is fail-soft */ }
455
+ }
456
+ const result = options.run?.(executedCommand, cwd)
457
+ ?? spawnSync(requirePosixShellCommand('/bin/sh'), ['-c', executedCommand], { cwd, encoding: 'utf8', timeout: 180_000, maxBuffer: 32 * 1024 * 1024 });
458
+ const timedOut = result.error && 'code' in result.error && result.error.code === 'ETIMEDOUT';
459
+ if (timedOut && timeoutCounts) timeoutCounts.set(budgetKey(executedCommand), (timeoutCounts.get(budgetKey(executedCommand)) ?? 0) + 1);
428
460
  return {
429
461
  tag,
430
462
  command,
463
+ executedCommand,
431
464
  exitCode: result.status,
432
- stdout: tailWithOmissionMarker(result.stdout ?? '', MAX_OFF_DIFF_EVIDENCE_RESULT_CHARS),
433
- stderr: tailWithOmissionMarker(result.stderr ?? '', MAX_OFF_DIFF_EVIDENCE_RESULT_CHARS),
465
+ stdout: tailWithOmissionMarker(typeof result.stdout === 'string' ? result.stdout : result.stdout?.toString('utf8') ?? '', MAX_OFF_DIFF_EVIDENCE_RESULT_CHARS),
466
+ stderr: tailWithOmissionMarker(typeof result.stderr === 'string' ? result.stderr : result.stderr?.toString('utf8') ?? '', MAX_OFF_DIFF_EVIDENCE_RESULT_CHARS),
434
467
  durationMs: Date.now() - startedAt,
468
+ ...(replacement ? { substitutedFor: command } : {}),
435
469
  };
436
470
  });
437
471
  const observation = { count: runs.length, runs };
@@ -443,6 +477,24 @@ export function runRequiredEvidenceChecks(goal: string, cwd: string, runId?: str
443
477
  return runs;
444
478
  }
445
479
 
480
+ /** One self-implement run owns this state; a changed HEAD starts a fresh budget. */
481
+ export function createRequiredEvidenceBudget(options: { run?: EvidenceCommandRunner } = {}): (
482
+ goal: string, cwd: string, runId: string | undefined, headCommit: string | undefined,
483
+ ) => RequiredEvidenceCheckRun[] {
484
+ let previousHead: string | undefined;
485
+ const timeoutCounts = new Map<string, number>();
486
+ // This closure is created once per self-implement run. Its unresolved key
487
+ // bounds repeats within that run without pooling with another run or SHA.
488
+ const unresolvedRunHead = 'unresolved-head-within-this-run';
489
+ return (goal, cwd, runId, headCommit) => {
490
+ if (previousHead !== headCommit) {
491
+ timeoutCounts.clear();
492
+ previousHead = headCommit;
493
+ }
494
+ return runRequiredEvidenceChecks(goal, cwd, runId, { timeoutCounts, headCommit: headCommit ?? unresolvedRunHead, run: options.run });
495
+ };
496
+ }
497
+
446
498
  /** 자식 프롬프트에 실을 요구 목록. 요구가 없으면 **아무 줄도 안 붙인다**(빈 계약을 만들지 않는다). */
447
499
  export function renderRequiredEvidencePrompt(items: readonly RequiredEvidenceItem[]): string[] {
448
500
  if (!items.length) return [];