elanous 0.2.35 → 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 (686) 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/{d06f9160.a3d9062f95de8ad7.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/{4346.8601952e73bf5803.js → 1201.afbfc5b1c5e5cbe4.js} +1 -1
  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/{3103.0df8da390948bb84.js → 2500.cbc1257b774aae52.js} +1 -1
  19. package/apps/pwa/out/_next/static/chunks/{7644.17e37ba6f1d4226e.js → 2683.c9773a0c589b031b.js} +3 -3
  20. package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +24 -0
  21. package/apps/pwa/out/_next/static/chunks/{4718-17d2af636796a330.js → 275-02ea4c2a33980422.js} +3 -3
  22. package/apps/pwa/out/_next/static/chunks/2812ca6a.3b9f4a7a08885744.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/{8714.ff0b7ce3ec3e3ae2.js → 2941.3c3546f96bc6efa7.js} +1 -1
  25. package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +24 -0
  26. package/apps/pwa/out/_next/static/chunks/{9214.63a510d39178e997.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/3136.30aaaa5fa03662a3.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/{3677-4215f826f6aa68e5.js → 3148-98efd4869d660a87.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +226 -0
  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/3324.a09703033abcbd2f.js +34 -0
  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/3538.a445e50bb359d068.js +32 -0
  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/{9512.5a76207a730e0491.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/{8557-e7898769499cd56f.js → 3757-180308bc61021b05.js} +1 -1
  44. package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +74 -0
  45. package/apps/pwa/out/_next/static/chunks/{359-2250789a2d3499e7.js → 3840-5825d56d46976a92.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/{da5176c6.6773b6c5994e1d99.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/{9952.5daf5f94063a2b3e.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/{938.66ad1ef0e5abae1c.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/5085-bce4904931767ca6.js +1 -0
  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/{6236.e18cced2d5ba6afb.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/{3408.21d1570602f4b6c0.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/5711.957b095705c12560.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/{1530.0e612369b6fd7ea0.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/599.c39c571b6733f2a2.js +41 -0
  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/6925.562d532110879886.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/{7385.50a308a477bdfc21.js → 6943.c6b24124853a47b2.js} +1 -1
  87. package/apps/pwa/out/_next/static/chunks/{630.fe5a46428d63b013.js → 727.7deb87749b0a343a.js} +1 -1
  88. package/apps/pwa/out/_next/static/chunks/{2018.a741297bce759490.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/{8444.4c26b379ca2b9596.js → 771.c3cdb6c1f7f47c02.js} +17 -17
  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/{3589.5444a06bcf6e775c.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/{b2f6ba4d.fb56fdbbf798df33.js → 873d6c12.09bd499f57171543.js} +1 -1
  101. package/apps/pwa/out/_next/static/chunks/{5101.e32282718f99ed6f.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/{5637.281e5dec4ea6ecf1.js → 914.8abefd48d579547b.js} +2 -2
  105. package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/{4705-194e64e47ca0fbdb.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/{8637.47f5b35afcae5e6b.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/{1674.2a65fd5668e1cc5f.js → 9789.60f723d18097ec30.js} +1 -1
  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-083747f1d4518f61.js +1 -0
  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/{0368f25d-ad84af92fefee68f.js → ccae1c4b-0cf414f5eff1b10d.js} +1 -1
  174. package/apps/pwa/out/_next/static/chunks/{cbe38a15.5a032598e39970c6.js → ceba0382.650712b56b85b582.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/{b6705a4f-b9a9047de9eecfd0.js → da5ecc5c-b005ad8cac737d57.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/{56d372f2.681ab4ec4c998fae.js → f9a61e4d.1fc2c1dbdd49fe46.js} +1 -1
  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/{T1mBQqmkwKDLGtyisDCOd → 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/docs/goal-context/05-authoring-lessons.jsonl +47 -0
  278. package/docs/goal-context/README.md +3 -0
  279. package/graphs/default-loop.yaml +6 -1
  280. package/graphs/implement-loop.yaml +24 -0
  281. package/graphs/release/recipes.yaml +6 -0
  282. package/graphs/release/release-loop.yaml +17 -4
  283. package/graphs/wizard/recipes.yaml +44 -0
  284. package/graphs/wizard/wizard-loop.yaml +44 -0
  285. package/graphs/work/research-report.yaml +2 -0
  286. package/package.json +1 -1
  287. package/scripts/ci-typecheck-changed.ts +139 -5
  288. package/scripts/coord-role-pack.ts +1 -1
  289. package/scripts/first10-gate.ts +416 -0
  290. package/scripts/fleet/wsl-node-setup.sh +432 -0
  291. package/scripts/release-loop/docs-node.ts +204 -8
  292. package/scripts/release-loop/gate-node.ts +249 -53
  293. package/scripts/release-loop/node-verdict.ts +2 -0
  294. package/scripts/release-loop/resume-cap.ts +14 -34
  295. package/scripts/release-loop/resume-release.ts +37 -11
  296. package/scripts/release-loop/traffic-node.ts +59 -0
  297. package/scripts/release-loop/traffic-transition.ts +159 -0
  298. package/scripts/rhythm/daily.ts +137 -3
  299. package/scripts/ux-sim.ts +53 -0
  300. package/skills/README.md +1 -0
  301. package/src/acp/core-turn-bridge.ts +48 -6
  302. package/src/agent/delegate-hint.ts +16 -0
  303. package/src/agent/runner.ts +82 -2
  304. package/src/agent/task-notification.ts +56 -10
  305. package/src/agent/types.ts +4 -0
  306. package/src/agent-substrate/pr-reviewer.ts +55 -3
  307. package/src/agent-substrate/review-intent.ts +29 -2
  308. package/src/agent-substrate/review-observation.ts +3 -0
  309. package/src/agent-substrate/self-review-cli.ts +168 -16
  310. package/src/autopilot/mission-codebase-gate.ts +141 -12
  311. package/src/autopilot/pr-manager.ts +25 -5
  312. package/src/boot/daemon-tools/self-implement.ts +1 -0
  313. package/src/budget/usage-outcomes.ts +8 -4
  314. package/src/capture/tui-self-report.ts +102 -0
  315. package/src/chat/goal-continue-verdict.ts +41 -0
  316. package/src/chat/index.ts +30 -4
  317. package/src/chat/internal-turn-origin.ts +1 -0
  318. package/src/chat/paste-fold.ts +86 -0
  319. package/src/chat/tool-render/block.ts +32 -0
  320. package/src/chat/tool-render/dispatch.ts +2 -20
  321. package/src/chat/tool-render/result-text.ts +98 -0
  322. package/src/chat/turn-typeahead.ts +70 -7
  323. package/src/cli/config-audit.ts +119 -0
  324. package/src/cli/doctor-cli.ts +22 -0
  325. package/src/cli/guardian-cli.ts +10 -0
  326. package/src/cli/herdr-cli.ts +34 -0
  327. package/src/cli/light-entry-route.ts +6 -3
  328. package/src/cli/log-event-names.ts +2 -0
  329. package/src/cli/make-cli.ts +247 -11
  330. package/src/cli/msg-cli.ts +117 -3
  331. package/src/cli/pr-cli.ts +29 -16
  332. package/src/cli/pr-land-base-read.ts +11 -2
  333. package/src/cli/pr-land-heavy-remote.ts +6 -3
  334. package/src/cli/pr-land-overlap-evidence.ts +23 -4
  335. package/src/cli/pr-land-recovery.ts +117 -1
  336. package/src/cli/pty-takeover-cli.ts +8 -7
  337. package/src/cli/release-cli.ts +21 -5
  338. package/src/cli/release-single-flight.ts +1 -1
  339. package/src/cli/tasks-card-show.ts +162 -0
  340. package/src/cli/tasks-cli.ts +574 -356
  341. package/src/cli/tasks-read-cli.ts +197 -0
  342. package/src/core-turn/run-core-turn.ts +4 -2
  343. package/src/core-turn/run-goal-loop.ts +73 -16
  344. package/src/core-turn/types.ts +6 -1
  345. package/src/dashboard/context/keys.ts +8 -31
  346. package/src/dashboard/index.ts +202 -49
  347. package/src/dashboard/input/agent-wake.ts +7 -1
  348. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +146 -3
  349. package/src/dashboard/input/chat-main-slash-command.ts +4 -2
  350. package/src/dashboard/input/goal-continue.ts +210 -0
  351. package/src/dashboard/input/goal-interim.ts +2 -0
  352. package/src/dashboard/input/internal-turn.ts +2 -8
  353. package/src/dashboard/input/seat-autowake.ts +9 -7
  354. package/src/dashboard/input/turn-autoheal.ts +52 -0
  355. package/src/dashboard/seat-boot-preamble.ts +132 -5
  356. package/src/dashboard/slash-runtime/chat-persona.ts +65 -8
  357. package/src/dashboard/slash-runtime/dashboard-handlers.ts +3 -2
  358. package/src/dashboard/slash-runtime/model-choices.ts +15 -0
  359. package/src/dashboard/stale-install-check.ts +3 -99
  360. package/src/debug/batch-queue.ts +119 -0
  361. package/src/debug/tui-log-tag.ts +67 -0
  362. package/src/display/agent-surface.ts +7 -0
  363. package/src/domains/standalone-log-sink.ts +15 -2
  364. package/src/esc-abort-gate.ts +69 -0
  365. package/src/git-fs/worktree.ts +95 -1
  366. package/src/graph-runner/graph-cli.ts +18 -0
  367. package/src/graph-runner/runner.ts +20 -11
  368. package/src/graph-wizard/generate.ts +108 -4
  369. package/src/graph-wizard/steps.ts +15 -0
  370. package/src/grounding/proactive-ground.ts +86 -0
  371. package/src/harness/control-inbox.ts +49 -1
  372. package/src/harness/harness-cli-command.ts +51 -7
  373. package/src/harness/harness-incidents.ts +52 -1
  374. package/src/harness/pod-control-send.ts +33 -5
  375. package/src/harness/self-send-remote.ts +69 -0
  376. package/src/harness/self-send-routing-guard.ts +6 -0
  377. package/src/harness/self-send-target.ts +4 -3
  378. package/src/index.ts +327 -12
  379. package/src/input-core/context-key-runtime.ts +21 -0
  380. package/src/light-cli.ts +6 -1
  381. package/src/llm-wellformed.ts +70 -0
  382. package/src/llm.ts +35 -4
  383. package/src/loops/msg-wake.ts +35 -39
  384. package/src/loops/orchestrator/inbox.ts +59 -11
  385. package/src/loops/orchestrator/knowhow-pack.ts +364 -0
  386. package/src/loops/orchestrator/tick.ts +5 -1
  387. package/src/maturity/feature-maturity.ts +1 -1
  388. package/src/models/prompts.ts +17 -2
  389. package/src/msg/msg-post-office.ts +116 -0
  390. package/src/mss/logging/log-store.ts +79 -22
  391. package/src/nexus/api/decisions-route.ts +38 -18
  392. package/src/nexus/api/graph-wizard-api.ts +20 -2
  393. package/src/nexus/boot/register-mcp-clients.ts +263 -38
  394. package/src/nexus/onboarding/first-boot-wizard.ts +56 -8
  395. package/src/onboarding/first-run.ts +37 -6
  396. package/src/onboarding/web-first.ts +43 -11
  397. package/src/ops/overview-collect.ts +12 -6
  398. package/src/ops/overview.ts +3 -3
  399. package/src/persona/loader.ts +11 -0
  400. package/src/persona/types.ts +8 -0
  401. package/src/prompt-library/session-guidance.ts +14 -0
  402. package/src/provider-summary.ts +8 -0
  403. package/src/pty-shell/herdr-agent-report.ts +118 -9
  404. package/src/pty-shell/herdr-prompt.ts +266 -0
  405. package/src/pty-shell/pty-control-ipc.ts +151 -8
  406. package/src/pty-shell/pty-special-keys.ts +42 -2
  407. package/src/pty-shell/stale-install-check.ts +99 -0
  408. package/src/pty-shell/tui-run-state.ts +14 -2
  409. package/src/release-loop/auto-start.ts +20 -2
  410. package/src/release-loop/checklist.ts +76 -4
  411. package/src/release-loop/rehearsal.ts +36 -20
  412. package/src/repl/index.ts +19 -1
  413. package/src/seat-loop/knowhow-lint.ts +1 -1
  414. package/src/self-dev/decompose-proposal.ts +172 -20
  415. package/src/self-dev/decompose.ts +61 -0
  416. package/src/self-dev/dev-cli.ts +37 -3
  417. package/src/self-dev/dev-pipeline.ts +8 -2
  418. package/src/self-dev/draft-triage-rules.ts +31 -0
  419. package/src/self-dev/glm-credential-guard.ts +77 -0
  420. package/src/self-dev/graph-journey-nodes.ts +1 -0
  421. package/src/self-dev/graph-journey-route.ts +12 -2
  422. package/src/self-dev/orchestrate-cli.ts +68 -3
  423. package/src/self-dev/orchestrate.ts +116 -17
  424. package/src/self-dev/run-supervisor.ts +55 -2
  425. package/src/self-dev/run-types.ts +1 -1
  426. package/src/self-health/autoheal.ts +153 -0
  427. package/src/self-health/signatures.ts +6 -0
  428. package/src/self-implement/device-first.ts +116 -0
  429. package/src/self-implement/doctor-visit.ts +239 -1
  430. package/src/self-implement/evidence-command-budget.ts +80 -0
  431. package/src/self-implement/goal-author-cli.ts +1 -0
  432. package/src/self-implement/goal-author-decompose.ts +265 -4
  433. package/src/self-implement/goal-author.ts +33 -8
  434. package/src/self-implement/goal-elaborate.ts +176 -22
  435. package/src/self-implement/goal-refine.ts +3 -0
  436. package/src/self-implement/graph-variant.ts +40 -6
  437. package/src/self-implement/headless-elanous-driver.ts +19 -3
  438. package/src/self-implement/off-diff-evidence.ts +58 -6
  439. package/src/self-implement/orchestrator.ts +222 -21
  440. package/src/self-implement/pod-warm-pool-profile.ts +1 -0
  441. package/src/self-implement/pwa-import-graph.ts +1 -1
  442. package/src/self-implement/rework-policy.ts +30 -0
  443. package/src/self-implement/run-ledger.ts +108 -0
  444. package/src/self-implement/run-ttl.ts +38 -24
  445. package/src/self-implement/scope-adjacency.ts +3 -1
  446. package/src/self-implement/seams.ts +60 -4
  447. package/src/self-implement/wiring-check.ts +358 -0
  448. package/src/shell-env-bootstrap.ts +11 -4
  449. package/src/skills/runner.ts +4 -2
  450. package/src/skills/tools/agent.ts +290 -48
  451. package/src/skills/tools/schedule-wakeup.ts +23 -4
  452. package/src/skills/tools/shell.ts +61 -6
  453. package/src/skills/tools/terminal-modal-inject.ts +1 -2
  454. package/src/skills/tools/terminal-modal.ts +10 -8
  455. package/src/skills/url-router.ts +41 -1
  456. package/src/smart-wizard/run.ts +66 -0
  457. package/src/status/bar.ts +34 -6
  458. package/src/status/status-provider-info.ts +37 -6
  459. package/src/steward/rejudge-tick.ts +10 -2
  460. package/src/steward/ta-repair-event-collect.ts +17 -6
  461. package/src/task-agent/actions.ts +3 -1
  462. package/src/task-agent/land-queue.ts +21 -8
  463. package/src/task-agent/live-moves.ts +22 -6
  464. package/src/task-agent/mission.ts +30 -0
  465. package/src/task-agent/rejudge-on-head.ts +15 -0
  466. package/src/task-agent/repair-cycle.ts +138 -32
  467. package/src/task-agent/repair-next-move.ts +31 -3
  468. package/src/task-agent/repair-outcomes.ts +29 -0
  469. package/src/task-agent/repair-worker.ts +14 -4
  470. package/src/task-agent/shadow.ts +41 -3
  471. package/src/task-agent/task-card-prefix.ts +2 -0
  472. package/src/task-agent/task-hand.ts +477 -22
  473. package/src/task-agent/task-parent-role-llm.ts +36 -0
  474. package/src/task-agent/tier-split.ts +78 -9
  475. package/src/task-orchestrator/surfaces/pod-account-broker.ts +9 -0
  476. package/src/task-orchestrator/surfaces/pod-child-reuse.ts +146 -0
  477. package/src/task-orchestrator/surfaces/pod-command-job.ts +86 -5
  478. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +215 -3
  479. package/src/task-orchestrator/surfaces/pod-launch-history.ts +133 -0
  480. package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +11 -0
  481. package/src/task-orchestrator/surfaces/pod-pool.ts +76 -4
  482. package/src/task-orchestrator/surfaces/pod-provenance.ts +8 -2
  483. package/src/task-orchestrator/surfaces/pod-repair-commit.ts +18 -3
  484. package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +16 -0
  485. package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +224 -0
  486. package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +201 -0
  487. package/src/task-orchestrator/surfaces/pod-si-warm-provider.ts +444 -0
  488. package/src/task-orchestrator/surfaces/pod-si-warm-runner.ts +387 -0
  489. package/src/task-orchestrator/surfaces/pod-si-warm-transport.ts +157 -0
  490. package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +4 -0
  491. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +485 -36
  492. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +3 -0
  493. package/src/task-orchestrator/surfaces/self-implement-pod.ts +396 -19
  494. package/src/task-orchestrator/surfaces/self-implement.ts +42 -2
  495. package/src/tool-runtime/index.ts +15 -2
  496. package/src/tool-runtime/mcp-proxy-bootstrap.ts +29 -0
  497. package/src/tty-foreground.ts +155 -0
  498. package/src/tui/chat/goal-interim.ts +173 -0
  499. package/src/tui/chat/log-view.ts +205 -18
  500. package/src/tui/chat/self-health-status.ts +232 -0
  501. package/src/tui/entry.ts +370 -81
  502. package/src/tui/input/composer.ts +8 -1
  503. package/src/tui/slash/compact-command.ts +7 -0
  504. package/src/tui/slash/compact.ts +1 -7
  505. package/src/tui/slash/resume.ts +75 -0
  506. package/src/tui-client/local-chat-turn.ts +45 -2
  507. package/src/tui-client/next-dashboard-runtime.ts +8 -0
  508. package/src/tui-client/next-loop-command.ts +70 -0
  509. package/src/tui-client/next-wakeup.ts +191 -0
  510. package/src/tui.ts +37 -0
  511. package/src/ui/modal-adapter.ts +2 -2
  512. package/src/ux-sim/classic-tui-seat-scenarios.ts +516 -0
  513. package/src/ux-sim/cli-config-audit-device.ts +121 -0
  514. package/src/ux-sim/dashboard-event-loop-stall-monitor-device.ts +238 -0
  515. package/src/ux-sim/event-monkey.ts +3 -2
  516. package/src/ux-sim/fake-bin.ts +45 -0
  517. package/src/ux-sim/fake-herdr.ts +238 -0
  518. package/src/ux-sim/fake-llm.ts +111 -6
  519. package/src/ux-sim/fault-glm-no-credential.ts +116 -0
  520. package/src/ux-sim/fault-nextmove-dispatch.ts +102 -1
  521. package/src/ux-sim/fault-scope-escape-lift.ts +33 -6
  522. package/src/ux-sim/fault-tui-400-autoheal.ts +297 -0
  523. package/src/ux-sim/goal-device.ts +619 -0
  524. package/src/ux-sim/in-process-cli.ts +22 -5
  525. package/src/ux-sim/mock-authoring-first-run-child.ts +35 -0
  526. package/src/ux-sim/mock-authoring-first-run.ts +97 -0
  527. package/src/ux-sim/mock-seat-pty-frame-child.ts +29 -0
  528. package/src/ux-sim/mock-seat-pty-frame.ts +297 -0
  529. package/src/ux-sim/mock-seat-pty-sequence-child.ts +21 -0
  530. package/src/ux-sim/mock-seat-pty-sequence.ts +206 -0
  531. package/src/ux-sim/next-tui-seat-scenarios.ts +631 -0
  532. package/src/ux-sim/onboarding-first-run-device.ts +269 -0
  533. package/src/ux-sim/pty-key-modifiers-device.ts +85 -0
  534. package/src/ux-sim/subagent-tools-device.ts +81 -0
  535. package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +250 -0
  536. package/src/ux-sim/tty-foreground-steal-child.ts +21 -0
  537. package/src/version/packed-revision.json +1 -1
  538. package/apps/pwa/out/_next/static/chunks/1165.bad13fc9151a7288.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/13.02a07436dec15f89.js +0 -32
  540. package/apps/pwa/out/_next/static/chunks/1540.af38731fa7c4a3e0.js +0 -41
  541. package/apps/pwa/out/_next/static/chunks/1850.f2b470ba5a471da0.js +0 -24
  542. package/apps/pwa/out/_next/static/chunks/193.62da94cd0b88323b.js +0 -74
  543. package/apps/pwa/out/_next/static/chunks/1975.260f6d249fac5f7c.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/1982-67cd8dfe8682325f.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/1993-c0007b7ad0c0ef41.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/1999-bb415351c8a2846c.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/1c735de4.f993a30bbd3c57c4.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/1dc5a567.9b092bfae3d7099b.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/2085.8f950b4bda1cbbc7.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/2159-6179a961376956b9.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/216.b5c2a421aa1d28a5.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/2251.49fbe369f74c372c.js +0 -148
  553. package/apps/pwa/out/_next/static/chunks/2286-2939577360d3dcc0.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/2625.5d870aa999f33db1.js +0 -34
  555. package/apps/pwa/out/_next/static/chunks/2668.34d21539e62bf111.js +0 -77
  556. package/apps/pwa/out/_next/static/chunks/2833-0fe47af99ed13c29.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/2930.d0edb4f108787ef7.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/2973.77318e7d85f59477.js +0 -62
  559. package/apps/pwa/out/_next/static/chunks/3123.2bee9ba15d320bd2.js +0 -90
  560. package/apps/pwa/out/_next/static/chunks/3162-6cf652bf7124d8cf.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/3577-7340009f7007a795.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/3618.f514792d6c59d7fd.js +0 -36
  563. package/apps/pwa/out/_next/static/chunks/3669.343f9119aa276001.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/3736.c2efad489604cc3b.js +0 -79
  565. package/apps/pwa/out/_next/static/chunks/3817.f9aeab2bb6675d73.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/3f7c4ee5.3dde54f01a816613.js +0 -122
  567. package/apps/pwa/out/_next/static/chunks/4182-0b9b1251c29cc0cf.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/4441-875b97f5821ed58a.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/4582.bd68683c076649e3.js +0 -286
  570. package/apps/pwa/out/_next/static/chunks/4605-6e623f55aec77422.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/4607.5cc27468628eb4bf.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/4627.f07508b3936fd6c0.js +0 -24
  573. package/apps/pwa/out/_next/static/chunks/4747-c22262c093e46807.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/4775-178215aed0daba61.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/4815-6ffb8c3c991cc45d.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/4834-beca8b47ad29a898.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/5023-fb4802b6d2492b02.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/5154.a118f3957ed14e36.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/5210-a2e0015e3d4d5d9c.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/5356.84ac712cc15928bf.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/5401.22352141b6fd336e.js +0 -23
  582. package/apps/pwa/out/_next/static/chunks/5483-dd5d7697f6bdb106.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/5662.02eaa029af05ad46.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/5760.22456f433c6f42c0.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/5852.db1f7449f4f74612.js +0 -287
  586. package/apps/pwa/out/_next/static/chunks/5891-0f11a7d7362a9072.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/5943.264d14a44ca32513.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/604-1b3c39df083c02aa.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/6121-5f97072330738caf.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/6193.07d8ca5af4b09086.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/6203-b3fea3a60d69ff14.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/6286.d638fb5953e2e757.js +0 -8
  593. package/apps/pwa/out/_next/static/chunks/6301.ae0245f507e4395e.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/6673.fbbe5699f6ea5991.js +0 -27
  595. package/apps/pwa/out/_next/static/chunks/6777-f6d301efb5de828d.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/6786.423f24c88de034c7.js +0 -93
  597. package/apps/pwa/out/_next/static/chunks/6854-cef64a948c5e122d.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/6866-79aa5b4e47cac6aa.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/6b89c8bd.24df687a820500b3.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/7037-fe27f001db30d323.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/7080.2d826860534fd88e.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/7118.8731be28c3ebb14b.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/7196.44241bc1df3e26fe.js +0 -149
  604. package/apps/pwa/out/_next/static/chunks/7235.c7c4e6cb5c693c2d.js +0 -104
  605. package/apps/pwa/out/_next/static/chunks/7706-58bfb1546637f217.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/7839.5b91455338c9fd3f.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/7857-31f13ee96f4011aa.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/81.f74cb60312fe4001.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/8219.baa715d1deee80e2.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/8256.e3ac8421a71f82f4.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/8310-444a6a895c402f12.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/8423.f7dda8aca4fcaae5.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/8437-8d5492094b166cfa.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/8496.75649af8652c74f4.js +0 -226
  615. package/apps/pwa/out/_next/static/chunks/8576.65bb654b524f3614.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/8609.558ce2f8f9aea2be.js +0 -64
  617. package/apps/pwa/out/_next/static/chunks/8614.caec96cfb91f4ae7.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/8732.367f44a916202353.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/9141-7fd1f73a5400bdc2.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/921.c4267d0d69a65404.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/9261.3962c3321b047691.js +0 -115
  622. package/apps/pwa/out/_next/static/chunks/936-26efd1a0efdd44d3.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/9627-4b9efe616b27e2e2.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/967-2aa39b2d04b4c690.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/9734.40eb1e558c29ccea.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/9908.3aa54f7a586a73dc.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/9954-ca8d29752bdbb45a.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/9974-507fa67cb94066dd.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-ce9e00f7fb45506a.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/app/approvals/page-fa59d6d17daa3389.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-53f68bbe7bd4b774.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/app/board/page-1c500fbb9f4a7a04.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/app/botlab/page-99d72673aa5c307c.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/app/bots/page-d2d5adc1e9484c88.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/app/ceo/page-c607c5aae637f1cc.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/app/chat/page-fa8c23596d555c0f.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/app/consult/page-bdab8c5e855c8416.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/app/control/page-406b47745b53f269.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/app/decisions/page-a4276386b7051f50.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/app/design-check/page-8a26bab9ad375f25.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/app/editor/page-775f48aa1dc7a2d5.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/app/exec/page-1c4dd5f959d0c558.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/app/field/page-c48938a8377c9f70.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/app/healthz/route-ce9e00f7fb45506a.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/app/inside/page-c6e7905859425aa9.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/app/intake/page-c280f4252452e830.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/app/layout-cf8c57498f20970a.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/app/live/page-ca3a17caf409fc83.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/app/live-run/page-26e6c18a1a750cf6.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/app/loops/page-3abc872cc6aeee39.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/app/market/page-f7481b7b2174fe3d.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1ae7ef8077680337.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/app/morning/page-47c5d4db587266bd.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/app/not-found-415f1e243c7ccb13.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/observatory/page-73f380f17b76f95c.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-2991073ad66ee2d9.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1f5a60f70cb4dd0c.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fbad60d1e358fb2c.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/outputs/page-bac7dee94e5eae4a.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/page-398047d6949e8ca5.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2d33a2231540ca89.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5bf1e6bf70bcb96c.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/sessions/page-ba59c19376a0917d.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-111f187139add30f.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/settings/page-acaae197d5be5779.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0df20b0f546a0d7d.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/setup/layout-ce9e00f7fb45506a.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/setup/page-27e1202d24b8fe35.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/share/page-bda78c50a78363e5.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/showroom/page-da592691293d9c9f.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f832994317a2e9f0.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/term/page-dc0a532f5b9196ec.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/today/page-cfccbbeae0473404.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/trace/page-527e2073af84c81b.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/vault/page-bac86e9112671357.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6d59dff410e9d76a.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/workflows/page-53a61f8be09f02d2.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/app/workspace/page-db8f559e763c17f9.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c02aa4cc66455093.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/framework-50e6acebc630849b.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/main-7a1ae342d5ed75e6.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/main-app-7ad7d505ba1f92b4.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/pages/_app-02edba75232cb235.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/pages/_error-97d6ebae3e8eee4a.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/webpack-e986adaa429163e8.js +0 -1
  686. /package/apps/pwa/out/_next/static/{T1mBQqmkwKDLGtyisDCOd → uC-N0emedeNOFuaBQFv-I}/_ssgManifest.js +0 -0
@@ -261,6 +261,13 @@ export async function collectPieceEvidence(pieces: readonly TaskCard[], read: Pi
261
261
  for (const piece of pieces) {
262
262
  const ref = pieceRef(piece);
263
263
  if (ref === undefined) { out[piece.id] = 'no-ref'; continue; }
264
+ // A verified component train landing closes the component PR; the integration PR is merged.
265
+ // rejudge-on-head writes this receipt only after verifiedTrainLanding checks the train ledger.
266
+ if (typeof ref === 'number' && piece.status === 'done' && piece.trainLanding?.componentPr === ref
267
+ && Number.isSafeInteger(piece.trainLanding.integrationPr) && /^[a-f0-9]{40}$/i.test(piece.trainLanding.mergeSha)) {
268
+ out[piece.id] = 'merged';
269
+ continue;
270
+ }
264
271
  let state: 'merged' | 'waiting' | 'blocked';
265
272
  try { state = await read(ref); } catch { state = 'waiting'; }
266
273
  out[piece.id] = state === 'merged' ? 'merged' : state === 'blocked' ? 'closed' : 'pending';
@@ -343,6 +350,21 @@ export async function advanceMission(missionId: string, opts: AdvanceMissionOpti
343
350
  }
344
351
  }
345
352
 
353
+ /** A confirmed landed piece wakes its own mission. Evidence is read again before any successor launch. */
354
+ export async function advanceLandedPieceMission(pieceId: string, opts: AdvanceMissionOptions = {}): Promise<AdvanceMissionResult | null> {
355
+ const path = opts.statePath ?? taskAgentStatePath();
356
+ const piece = readTaskCard(pieceId, path);
357
+ const missionId = piece?.mission;
358
+ if (!missionId) return null;
359
+ const mission = readTaskCard(missionId, path);
360
+ if (!mission?.pieces?.includes(pieceId) || mission.greenProposal) return null;
361
+ const launcher = opts.launcher ?? (await import('../cli/tasks-cli.js')).defaultTaskLauncher;
362
+ const result = await advanceMission(missionId, { ...opts, statePath: path, live: true, launcher });
363
+ try { debug.log('task-agent', 'mission-auto-advance', { missionId, pieceId, evidence: result.evidence, ready: result.ready,
364
+ handed: result.handed.map((item) => ({ pieceId: item.pieceId, launched: item.launched, error: item.error ?? null })), green: result.green }); } catch { /* fail-soft */ }
365
+ return result;
366
+ }
367
+
346
368
  /** `advanceMission` 이 실패했다 — `mission-advance` 관측은 이미 남겼다. */
347
369
  export class MissionAdvanceError extends Error {
348
370
  constructor(reason: string) {
@@ -403,6 +425,14 @@ async function advanceMissionOnce(missionId: string, opts: AdvanceMissionOptions
403
425
  const out = await handTask({
404
426
  text: claimed.text, id: pieceId, mission: missionId, after: claimed.after ?? [], landed,
405
427
  ...(claimed.seat ? { seat: claimed.seat } : {}), ...(claimed.checklistId ? { checklistId: claimed.checklistId } : {}),
428
+ ...(claimed.tier ? { tier: claimed.tier } : {}),
429
+ ...(claimed.tierSplit ? { tierSplit: claimed.tierSplit } : {}),
430
+ ...(claimed.childLlm ? { childLlm: `${claimed.childLlm.provider}/${claimed.childLlm.model}`,
431
+ ...(claimed.childLlm.effort ? { childLlmEffort: claimed.childLlm.effort } : {}) } : {}),
432
+ ...(claimed.parentRoleLlm?.length ? { parentRoleLlm: claimed.parentRoleLlm } : {}),
433
+ ...(claimed.project?.id ? { project: { id: claimed.project.id, target: claimed.project.target } } : {}),
434
+ ...(claimed.completion ? { completion: claimed.completion } : {}),
435
+ ...(claimed.taLand ? { taLand: true } : {}),
406
436
  cardFields: { handed: mark, ...(claimed.pr !== undefined ? { pr: claimed.pr } : {}), ...(claimed.goalId !== undefined ? { goalId: claimed.goalId } : {}) },
407
437
  live: mode === 'live', statePath: path, ...(opts.launcher ? { launcher: opts.launcher } : {}), ...(opts.now ? { now: opts.now } : {}),
408
438
  // claim 을 가진 동안만 쓴다 — 늦게 끝난 shadow 넘김이 live 표지·발사 기록을 덮지 않게.
@@ -44,6 +44,7 @@ import type { DetachedSpawn } from '../cli/tasks-cli.js';
44
44
  import { remoteLedgerMirrorDir } from './parent-host.js';
45
45
  import { appendLandOrderRow, joinLandOrderRow } from './land-order-ledger.js';
46
46
  import { recordLiveMoveHistory } from './live-move-history.js';
47
+ import { advanceLandedPieceMission } from './mission.js';
47
48
  import { runRepairCycle, type RepairLaunchRequest } from './repair-cycle.js';
48
49
  import { repairMustFixFromReview, repairReviewDigest } from './repair-review.js';
49
50
  import type { RepairCasOutcome, RepairCasRequest } from './repair-branch-cas.js';
@@ -112,6 +113,8 @@ export interface RejudgeDeps {
112
113
  readFile?: (path: string) => string;
113
114
  /** Verify a CLOSED component PR against the HQ train ledger and merged integration PR. */
114
115
  trainLanding?: (pr: number, cwd: string) => TrainLanding | null;
116
+ /** Confirmed merged component PR wakes successor pieces. */
117
+ advanceLandedPiece?: (pieceId: string, statePath: string) => Promise<unknown>;
115
118
  }
116
119
 
117
120
  /** PR binding alone does not mean a remote parent has stopped. Require its child edge and terminal ledger row. */
@@ -509,11 +512,19 @@ export async function rejudgeCardOnHead(cardId: string, deps: RejudgeDeps): Prom
509
512
  if (view.state === 'MERGED' || view.state === 'CLOSED') {
510
513
  const at = now().toISOString();
511
514
  const train = trustedTrain;
515
+ // TA-CARD-MERGE-RECONCILE — 사람이 손 병합한 실패 카드는 터미널 표시보다 먼저 실제 land 실행기로 정산한다.
516
+ // 정산이 성공하면 원장(status·hand-move 이력·merge sha 터미널)은 reconcile 이 이미 썼다 — 중복 터미널 쓰기 없이 판정으로 돌아간다.
517
+ if (view.state === 'MERGED' && card.status === 'failed' && deps.liveMoves.has('propose-land')) {
518
+ const landed = await executeLiveLand(card, pr, { runId: card.runId ?? null, cwd }, { ...live, ...(deps.log ? { log: deps.log } : {}) });
519
+ if (landed.ok && landed.executed) return target('landed-by-hand', landed.detail, pr, fromHead, toHead);
520
+ }
512
521
  updateTaskCard(statePath, card.id, (current) => {
513
522
  if (!current || cardPrNumber(current) !== pr || typeof current.pr !== 'object' || current.pr.url !== url) return undefined;
514
523
  const previous = boundPrTerminal(current);
515
524
  const alreadyLanded = train && current.trainLanding?.componentPr === pr
516
525
  && current.trainLanding.integrationPr === train.integrationPr && current.trainLanding.mergeSha === train.mergeSha;
526
+ // 손 병합 정산이 남긴 merge sha 터미널은 다음 틱이 가지 머리로 덮어쓰지 않는다(landed/landed-by-hand 는 이미 종결 상태).
527
+ if (previous && (current.status === 'landed' || current.status === 'landed-by-hand')) return undefined;
517
528
  if (previous?.state === view.state && previous.head === toHead && (!train || alreadyLanded) && (!train || current.status === 'done')) return undefined;
518
529
  return {
519
530
  ...current,
@@ -524,6 +535,10 @@ export async function rejudgeCardOnHead(cardId: string, deps: RejudgeDeps): Prom
524
535
  : { pr, url, head: toHead, state: view.state as 'MERGED' | 'CLOSED', at },
525
536
  };
526
537
  });
538
+ if (view.state === 'MERGED' || train) {
539
+ try { await (deps.advanceLandedPiece ?? ((pieceId, path) => advanceLandedPieceMission(pieceId, { statePath: path })))(card.id, statePath); }
540
+ catch (error) { try { log('task-agent', 'mission-auto-advance-error', { card: card.id, pr, error: String(error).slice(0, 250) }); } catch { /* fail-soft */ } }
541
+ }
527
542
  return train ? target('landed-via-train', `PR #${pr} via train #${train.integrationPr} merge ${train.mergeSha}`, pr, fromHead, toHead)
528
543
  : target('pr-not-open', `PR #${pr} is ${view.state}`, pr, fromHead, toHead);
529
544
  }
@@ -10,16 +10,21 @@ import { passJourneyNode } from '../self-dev/graph-journey-nodes.js';
10
10
  import { recordJourneyEdge } from '../self-dev/graph-journey-route.js';
11
11
  import { checklistHistory, listChecklist, parseOwner } from '../release-loop/checklist.js';
12
12
  import { applyRepairBundle, type RepairCasOutcome, type RepairCasRequest } from './repair-branch-cas.js';
13
- import { repairNextMove } from './repair-next-move.js';
13
+ import { pairMoveId, repairNextMove } from './repair-next-move.js';
14
14
  import { parseRepairWorkerResult } from './repair-worker.js';
15
15
  import { TASK_SEATS, readTaskCard, updateTaskCard, type TaskCard, type TaskChildLlm, type TaskSeat } from './task-hand.js';
16
16
 
17
17
  const WAIT_MS = 90 * 60_000;
18
+ const ESCALATE_MS = 6 * 60 * 60_000;
19
+ const ALERT_CLAIM_STALE_MS = 10 * 60_000;
18
20
  const safe = (value: string) => value.replace(/[^A-Za-z0-9._-]/g, '_');
19
21
 
20
22
  export interface RepairLaunchRequest {
21
23
  card: string; pr: number; head: string; repo: string; resultPath: string;
22
24
  goalFile: string; runId: string; model: TaskChildLlm; seat?: string;
25
+ parentRoleLlm?: string[];
26
+ /** HARNESS-FULL-GRAPH-NEXTMOVE — 이 발사를 고른 next-move 결정의 수 id(결정·graph-edge-taken 과 같은 값). */
27
+ moveId: string;
23
28
  }
24
29
 
25
30
  export interface RepairCycleInput {
@@ -29,7 +34,9 @@ export interface RepairCycleInput {
29
34
  request?: (input: RepairLaunchRequest) => Promise<void>;
30
35
  apply?: (input: RepairCasRequest) => RepairCasOutcome;
31
36
  notify?: (seat: string, body: string) => void;
32
- observeLaunch?: (move: string, runId: string) => void;
37
+ observeLaunch?: (move: string, runId: string, moveId: string) => void;
38
+ /** 시험 seam — next-move 결정의 수 id 발급기(기본 `mintMoveId`). 결정 순간 한 번만 불린다. */
39
+ mintMoveId?: () => string;
33
40
  resolveOwner?: (card: TaskCard) => RepairOwner;
34
41
  /** Shared only by one `tasks rejudge --all` invocation; a single-card rejudge has no cap. */
35
42
  repairBudget?: RepairTickBudget;
@@ -96,23 +103,21 @@ export async function repairModelAvailability(readInputs: () => Promise<Pick<Bud
96
103
  export function alternateRepairModel(card: TaskCard, availability: RepairModelAvailability = { codexSubscription: false, grokSubscription: false }): { from: string; to: TaskChildLlm } {
97
104
  const last = card.repairs?.at(-1);
98
105
  const from = last?.toModel ?? (card.childLlm ? `${card.childLlm.provider}/${card.childLlm.model}` : 'unknown');
99
- const glm: TaskChildLlm = { provider: 'openrouter', model: 'openrouter/z-ai/glm-5.3' };
106
+ // The Pod's named ZAI subscription is the primary GLM route. A failed
107
+ // glm-5.3 repair must never be retried with the smaller flash model.
108
+ const glm: TaskChildLlm = { provider: 'glm', model: 'glm-5.3' };
100
109
  const sol: TaskChildLlm = { provider: 'openai-codex', model: 'gpt-6-sol' };
101
110
  const grok: TaskChildLlm = { provider: 'grok', model: 'grok-4.6' };
102
- const luna: TaskChildLlm = { provider: 'openai-codex', model: 'gpt-6-luna' };
103
111
  const tier = card.tier ?? '중';
104
112
  const pr = typeof card.pr === 'number' ? card.pr : card.pr?.number;
105
113
  const mixEven = ((pr ?? [...card.id].reduce((sum, ch) => sum + ch.charCodeAt(0), 0)) % 2) === 0;
106
114
  let to: TaskChildLlm;
107
- if (tier === '특') to = sol;
115
+ if (tier === '특' || (last && from.includes('gpt-6-sol'))) to = sol;
116
+ else if (last && from.includes('grok-4.6')) to = grok;
108
117
  else if (tier === '상' && availability.codexSubscription && mixEven && !from.includes('gpt-6-sol')) to = sol;
109
- else if (tier === '상') to = availability.grokSubscription && from.includes('glm') ? grok
110
- : from.includes('glm-5.3-flash') ? glm
111
- : from.includes('glm-5.3') ? { provider: 'openrouter', model: 'openrouter/z-ai/glm-5.3-flash' } : glm;
112
- else if (tier === '하') to = from.includes('glm-5.3-flash') ? luna : from.includes('glm-5.3')
113
- ? { provider: 'openrouter', model: 'openrouter/z-ai/glm-5.3-flash' } : glm;
114
- else to = from.includes('glm-5.3-flash') ? glm : from.includes('glm-5.3')
115
- ? { provider: 'openrouter', model: 'openrouter/z-ai/glm-5.3-flash' } : glm;
118
+ else if (tier === '상') to = availability.grokSubscription && from.includes('glm') ? grok : glm;
119
+ else if (last && from.includes('gpt-6-luna')) to = { provider: 'openai-codex', model: 'gpt-6-luna' };
120
+ else to = glm;
116
121
  return { from, to };
117
122
  }
118
123
 
@@ -130,7 +135,8 @@ export async function defaultRequestRepair(input: RepairLaunchRequest): Promise<
130
135
  '--card', input.card, '--pr', String(input.pr), '--head', input.head, '--repo', input.repo,
131
136
  '--out', input.resultPath, '--goal-file', input.goalFile, '--run-id', input.runId,
132
137
  '--model-provider', input.model.provider, '--model-id', input.model.model,
133
- ...(input.seat ? ['--seat', input.seat] : [])];
138
+ ...(input.parentRoleLlm ?? []).flatMap((value) => ['--role-llm', value]),
139
+ ...(input.seat ? ['--seat', input.seat] : []), '--move-id', input.moveId];
134
140
  await spawnDetachedConfirmed(spawn as never, process.execPath, args, undefined, input.repo);
135
141
  }
136
142
 
@@ -176,9 +182,59 @@ export async function runRepairCycle(input: RepairCycleInput): Promise<RepairCyc
176
182
  let text: string | null = null;
177
183
  try { text = read(latest.resultPath); } catch { /* worker still running */ }
178
184
  const result = text === null ? null : parseRepairWorkerResult(text, pr, latest.head, latest.runId);
179
- if (!result && now.getTime() - Date.parse(latest.at) < WAIT_MS)
180
- return { decision: 'repair-pending', reason: `repair run ${latest.runId} pending` };
181
- let detail = result?.reason ?? 'repair worker produced no valid result before timeout';
185
+ if (!result) {
186
+ const ageMs = now.getTime() - Date.parse(latest.at);
187
+ const overdue = ageMs >= WAIT_MS;
188
+ // Pod admission plus the child deadline can exceed 90 minutes. A
189
+ // missing receipt is uncertainty, never evidence that the worker failed.
190
+ if (overdue) {
191
+ const failureType = text === null ? 'receipt-missing' : 'receipt-invalid';
192
+ const detail = JSON.stringify({ failureType, model: latest.toModel, resultPath: latest.resultPath });
193
+ let overdueRecorded = false;
194
+ try { updateTaskCard(statePath, card.id, (current) => current?.repairs?.some((entry) => entry.runId === latest.runId && entry.status === 'requested')
195
+ && !current.history?.some((entry) => entry.event === 'repair-receipt-overdue' && entry.runId === latest.runId)
196
+ ? (overdueRecorded = true, { ...current, history: [...(current.history ?? []), { at: now.toISOString(), event: 'repair-receipt-overdue',
197
+ pr, head: latest.head, runId: latest.runId, resultPath: latest.resultPath, detail }] }) : undefined);
198
+ } catch { /* an observation failure cannot consume a repair attempt */ }
199
+ if (overdueRecorded) try { debug.log('task-agent', 'repair-receipt-overdue', { card: card.id, pr, head: latest.head,
200
+ runId: latest.runId, failureType, model: latest.toModel, resultPath: latest.resultPath }); }
201
+ catch { /* diagnostics cannot consume a repair attempt */ }
202
+ if (ageMs >= ESCALATE_MS) {
203
+ let claimed = false;
204
+ try { updateTaskCard(statePath, card.id, (current) => {
205
+ const lastAlert = current?.history?.filter((entry) => entry.runId === latest.runId
206
+ && entry.event.startsWith('repair-receipt-alert-')).at(-1);
207
+ const staleClaim = lastAlert?.event === 'repair-receipt-alert-claimed'
208
+ && now.getTime() - Date.parse(lastAlert.at) >= ALERT_CLAIM_STALE_MS;
209
+ if (!current?.repairs?.some((entry) => entry.runId === latest.runId && entry.status === 'requested')
210
+ || lastAlert && lastAlert.event !== 'repair-receipt-alert-failed' && !staleClaim) return undefined;
211
+ claimed = true;
212
+ return { ...current, history: [...(current.history ?? []), { at: now.toISOString(),
213
+ event: 'repair-receipt-alert-claimed', pr, head: latest.head, runId: latest.runId,
214
+ resultPath: latest.resultPath, detail }] };
215
+ }); }
216
+ catch { /* the next tick can retry the alert claim */ }
217
+ if (claimed) {
218
+ const owner = (input.resolveOwner ?? resolveRepairOwner)(card);
219
+ let alertEvent = 'repair-receipt-alert-sent';
220
+ let alertDetail = detail;
221
+ try {
222
+ if (!owner.seat) throw new Error(`repair receipt owner unavailable: ${owner.reason ?? 'unknown'}`);
223
+ (input.notify ?? defaultNotify)(owner.seat, `repair receipt overdue: card ${card.id} PR #${pr} run ${latest.runId} · ${detail} · inspect worker/Pod terminal evidence before hand decision`);
224
+ } catch (error) {
225
+ alertEvent = 'repair-receipt-alert-failed';
226
+ alertDetail = `${detail} · ${String(error).slice(0, 200)}`;
227
+ }
228
+ try { updateTaskCard(statePath, card.id, (current) => current?.history?.some((entry) => entry.event === 'repair-receipt-alert-claimed' && entry.runId === latest.runId)
229
+ ? { ...current, history: [...current.history, { at: now.toISOString(), event: alertEvent, pr,
230
+ head: latest.head, runId: latest.runId, resultPath: latest.resultPath, detail: alertDetail }] } : undefined); }
231
+ catch { /* the claim still prevents duplicate owner messages */ }
232
+ }
233
+ }
234
+ }
235
+ return { decision: 'repair-pending', reason: `repair run ${latest.runId} ${overdue ? 'receipt overdue' : 'pending'} · ${latest.resultPath}` };
236
+ }
237
+ let detail = result.reason ?? 'repair worker failed';
182
238
  let applied: RepairCasOutcome | null = null;
183
239
  let claimedThisCycle = false;
184
240
  if (result?.ok && result.artifactDir && result.result) {
@@ -214,6 +270,15 @@ export async function runRepairCycle(input: RepairCycleInput): Promise<RepairCyc
214
270
  }
215
271
  }
216
272
  const status = applied?.ok ? 'applied' : applied?.unconfirmed ? 'unconfirmed' : 'failed';
273
+ // NEXTMOVE-GENERAL-RELAUNCH-MOVEID — 결과 파일의 수 id 를 카드(발사 순간 적은 값)와 짝짓는다. 못 짝지으면 관측만(소비는 그대로).
274
+ const pairing = pairMoveId(latest.moveId, result.moveId);
275
+ if (pairing.kind === 'unpaired') try { debug.log('task-agent', 'move-id-unpaired', { card: card.id, pr, head: latest.head,
276
+ runId: latest.runId, source: 'result-file', expected: pairing.expected, observed: pairing.observed }); } catch { /* fail-soft */ }
277
+ const pairedMoveId = pairing.kind === 'paired' ? { moveId: pairing.moveId } : {};
278
+ try { debug.log('task-agent', 'repair-attempt-result', { card: card.id, pr, head: latest.head,
279
+ runId: latest.runId, failureType: status === 'applied' || status === 'unconfirmed' ? null : result.ok ? 'artifact-or-cas' : 'worker',
280
+ model: latest.toModel, resultPath: latest.resultPath, artifactDir: result.artifactDir ?? null, status, detail });
281
+ } catch { /* diagnostics cannot change the result */ }
217
282
  try {
218
283
  updateTaskCard(statePath, card.id, (current) => current?.repairs?.some((entry) => entry.runId === latest.runId
219
284
  && (entry.status === 'requested' || (claimedThisCycle && entry.status === 'unconfirmed' && entry.commit === result?.result?.commit)))
@@ -222,7 +287,7 @@ export async function runRepairCycle(input: RepairCycleInput): Promise<RepairCyc
222
287
  bundleSha256: result.result.bundleSha256, bundlePath: join(resolve(result.artifactDir!), 'commit.bundle') } : {}),
223
288
  ...(applied?.ok ? { commit: applied.toHead } : {}) } : entry),
224
289
  history: [...(current.history ?? []), { at: now.toISOString(), event: 'repair-result', pr, head: latest.head,
225
- runId: latest.runId, effect: status, detail }] } : undefined);
290
+ runId: latest.runId, effect: status, detail, ...pairedMoveId }] } : undefined);
226
291
  } catch (error) { return { decision: 'repair-pending', reason: `repair card write failed after CAS: ${String(error).slice(-200)}` }; }
227
292
  const recorded = readTaskCard(card.id, statePath)?.repairs?.find((entry) => entry.runId === latest.runId)?.status === status;
228
293
  return recorded ? { decision: applied?.ok ? 'repair-applied' : applied?.unconfirmed ? 'repair-pending' : 'repair-failed', reason: detail,
@@ -231,14 +296,16 @@ export async function runRepairCycle(input: RepairCycleInput): Promise<RepairCyc
231
296
  }
232
297
  if (latest?.status === 'applied' && latest.head.toLowerCase() === head.toLowerCase())
233
298
  return { decision: 'repair-pending', reason: `repair pushed; await PR head ${latest.commit?.slice(0, 12) ?? '?'}` };
299
+ const failedAttempts = attempts.filter((entry) => entry.status === 'failed');
234
300
  const judged = repairNextMove({ pr, head, branch, mustFix: input.mustFix,
235
- priorNarrowAttempts: attempts.filter((entry) => entry.move === 'narrow-relaunch' || entry.move === 'salvage-relaunch').length,
236
- priorAlternativeAttempts: attempts.filter((entry) => entry.move === 'alternative').length });
301
+ priorNarrowAttempts: failedAttempts.filter((entry) => entry.move === 'narrow-relaunch' || entry.move === 'salvage-relaunch').length,
302
+ priorAlternativeAttempts: failedAttempts.filter((entry) => entry.move === 'alternative').length },
303
+ input.mintMoveId ? { mintMoveId: input.mintMoveId } : {});
237
304
  if (judged.kind === 'stop') {
238
- if (attempts.length >= 2) {
239
- const detail = `수리 수렴 실패: PR #${pr} head ${head.slice(0, 12)} · ${attempts.length}회 재발사 · ${judged.reason}`;
305
+ if (failedAttempts.length >= 2) {
306
+ const detail = `수리 수렴 실패: PR #${pr} head ${head.slice(0, 12)} · 실패 ${failedAttempts.length}회 · ${judged.reason}`;
240
307
  updateTaskCard(statePath, card.id, (current) => {
241
- if (!current || current.status !== 'launched' || (current.repairs ?? []).filter((entry) => entry.pr === pr).length < 2) return undefined;
308
+ if (!current || current.status !== 'launched' || (current.repairs ?? []).filter((entry) => entry.pr === pr && entry.status === 'failed').length < 2) return undefined;
242
309
  return { ...current, status: 'failed', history: [...(current.history ?? []),
243
310
  { at: now.toISOString(), event: 'repair-convergence-failed', pr, head, detail }] };
244
311
  });
@@ -281,10 +348,48 @@ export async function runRepairCycle(input: RepairCycleInput): Promise<RepairCyc
281
348
  requested: input.repairBudget.requested, capped: input.repairBudget.capped, move: judged.judgement.move }); } catch { /* fail-soft */ }
282
349
  return { decision: 'would-repair', reason };
283
350
  }
351
+ const lastModel = latest?.toModel ?? '';
352
+ const needsSubscriptionCheck = card.tier === '상' || card.tier === '특'
353
+ || lastModel.includes('gpt-6-sol') || lastModel.includes('grok-4.6');
354
+ const availability = input.modelAvailability ?? (needsSubscriptionCheck
355
+ ? await repairModelAvailability(input.readBudgetInputs) : { codexSubscription: false, grokSubscription: false });
356
+ if (latest?.status === 'failed' && (lastModel.includes('gpt-6-sol') && !availability.codexSubscription
357
+ || lastModel.includes('grok-4.6') && !availability.grokSubscription)) {
358
+ const reason = `repair model ${lastModel} subscription unavailable; retry deferred without downgrade`;
359
+ try { debug.log('task-agent', 'repair-model-unavailable', { card: card.id, pr, head,
360
+ failureType: 'subscription-unavailable', model: lastModel, resultPath: latest.resultPath }); } catch { /* fail-soft */ }
361
+ if (now.getTime() - Date.parse(latest.at) >= ESCALATE_MS) {
362
+ let alertClaimed = false;
363
+ try { updateTaskCard(statePath, card.id, (current) => {
364
+ const lastAlert = current?.history?.filter((entry) => entry.runId === latest.runId
365
+ && entry.event.startsWith('repair-model-alert-')).at(-1);
366
+ const staleClaim = lastAlert?.event === 'repair-model-alert-claimed'
367
+ && now.getTime() - Date.parse(lastAlert.at) >= ALERT_CLAIM_STALE_MS;
368
+ if (!current?.repairs?.some((entry) => entry.runId === latest.runId && entry.status === 'failed')
369
+ || lastAlert && lastAlert.event !== 'repair-model-alert-failed' && !staleClaim) return undefined;
370
+ alertClaimed = true;
371
+ return { ...current, history: [...(current.history ?? []), { at: now.toISOString(),
372
+ event: 'repair-model-alert-claimed', pr, head: latest.head, runId: latest.runId,
373
+ resultPath: latest.resultPath, detail: reason }] };
374
+ }); } catch { /* keep the failed repair eligible for a later tick */ }
375
+ if (alertClaimed) {
376
+ let event = 'repair-model-alert-sent';
377
+ let detail = reason;
378
+ try { (input.notify ?? defaultNotify)(owner.seat,
379
+ `repair model unavailable >6h: card ${card.id} PR #${pr} run ${latest.runId} · ${reason} · inspect subscription or hand off`); }
380
+ catch (error) { event = 'repair-model-alert-failed'; detail = `${reason} · ${String(error).slice(0, 200)}`; }
381
+ try { updateTaskCard(statePath, card.id, (current) => current?.history?.some((entry) => entry.event === 'repair-model-alert-claimed'
382
+ && entry.runId === latest.runId) ? { ...current, history: [...current.history, { at: now.toISOString(), event,
383
+ pr, head: latest.head, runId: latest.runId, resultPath: latest.resultPath, detail }] } : undefined); }
384
+ catch { /* a stale claim is retried on a later tick */ }
385
+ }
386
+ }
387
+ return { decision: 'would-repair', reason };
388
+ }
284
389
  const next = attempts.length + 1;
285
390
  const runId = mintRunId();
286
- const availability = input.modelAvailability ?? (card.tier === '특' || card.tier === '중' || card.tier === '하'
287
- ? { codexSubscription: false, grokSubscription: false } : await repairModelAvailability(input.readBudgetInputs));
391
+ // 결정 순간 만든 수 id — 아래 발사·카드·관측이 «이 값»만 쓴다(다시 만들지 않는다).
392
+ const moveId = judged.moveId;
288
393
  const { from, to } = alternateRepairModel(card, availability);
289
394
  const resultPath = repairResultPath(statePath, card.id, pr, head, next, runId);
290
395
  const goalFile = resultPath.replace(/\.json$/, '.goal.txt');
@@ -296,14 +401,15 @@ export async function runRepairCycle(input: RepairCycleInput): Promise<RepairCyc
296
401
  if (!current || current.status !== 'launched' || (current.repairs ?? []).length !== (card.repairs ?? []).length) return undefined;
297
402
  claimed = true;
298
403
  return { ...current, repairs: [...(current.repairs ?? []), { pr, head, branch, at: now.toISOString(),
299
- move: judged.judgement.move, runId, resultPath, fromModel: from, toModel: `${to.provider}/${to.model}`, status: 'requested' }],
404
+ move: judged.judgement.move, moveId, runId, resultPath, fromModel: from, toModel: `${to.provider}/${to.model}`, status: 'requested' }],
300
405
  history: [...(current.history ?? []), { at: now.toISOString(), event: 'repair-launched', pr, head, runId,
301
- effect: judged.judgement.move, detail: `source pr:${pr} · owner ${owner.seat} via ${owner.source} · must-fix ${input.mustFix.length} · childLlm ${from} → ${to.provider}/${to.model}` }] };
406
+ effect: judged.judgement.move, moveId, detail: `source pr:${pr} · owner ${owner.seat} via ${owner.source} · must-fix ${input.mustFix.length} · childLlm ${from} → ${to.provider}/${to.model}` }] };
302
407
  });
303
408
  if (!claimed) return { decision: 'repair-pending', reason: 'another tick claimed repair launch' };
304
409
  try {
305
410
  await (input.request ?? defaultRequestRepair)({ card: card.id, pr, head, repo, resultPath, goalFile,
306
- runId, model: to, seat: owner.seat });
411
+ runId, model: to, seat: owner.seat, moveId,
412
+ ...(card.parentRoleLlm?.length ? { parentRoleLlm: card.parentRoleLlm } : {}) });
307
413
  if (input.repairBudget) input.repairBudget.requested++;
308
414
  } catch (error) {
309
415
  const reason = `repair launch failed: ${error instanceof Error ? error.message : String(error)}`;
@@ -322,18 +428,18 @@ export async function runRepairCycle(input: RepairCycleInput): Promise<RepairCyc
322
428
  try { debug.log('task-agent', 'repair-role-llm-observation-failed', { card: card.id, pr, head, runId, error: String(error) }); } catch { /* fail-soft */ }
323
429
  }
324
430
  try {
325
- if (input.observeLaunch) input.observeLaunch(judged.judgement.move, runId);
431
+ if (input.observeLaunch) input.observeLaunch(judged.judgement.move, runId, moveId);
326
432
  else {
327
433
  passJourneyNode('next-move', { provenance: 'task-agent-repair', outcome: judged.judgement.move, runId,
328
- data: { card: card.id, source: `pr:${pr}`, pr, head, branch, mustFix: input.mustFix } });
329
- recordJourneyEdge(judged.route, 'dispatch');
434
+ data: { card: card.id, source: `pr:${pr}`, pr, head, branch, mustFix: input.mustFix, moveId } });
435
+ recordJourneyEdge(judged.route, 'dispatch', undefined, { moveId });
330
436
  }
331
437
  } catch (error) {
332
438
  const detail = `repair observation failed after worker launch: ${error instanceof Error ? error.message : String(error)}`;
333
439
  try { updateTaskCard(statePath, card.id, (current) => current
334
440
  ? { ...current, history: [...(current.history ?? []), { at: now.toISOString(), event: 'repair-observation-failed', pr, head, runId, detail }] } : undefined); }
335
441
  catch { /* launch remains requested even if its diagnostic cannot be persisted */ }
336
- return { decision: 'repair-requested', reason: `${judged.judgement.move} → dispatch · run ${runId} · ${detail}` };
442
+ return { decision: 'repair-requested', reason: `${judged.judgement.move} → dispatch · move ${moveId} · run ${runId} · ${detail}` };
337
443
  }
338
- return { decision: 'repair-requested', reason: `${judged.judgement.move} → dispatch · run ${runId} · ${from} → ${to.provider}/${to.model}` };
444
+ return { decision: 'repair-requested', reason: `${judged.judgement.move} → dispatch · move ${moveId} · run ${runId} · ${from} → ${to.provider}/${to.model}` };
339
445
  }
@@ -1,4 +1,5 @@
1
1
  /** Existing TA retry judgement, routed through the declared recover → dispatch graph edge. */
2
+ import { randomBytes } from 'node:crypto';
2
3
  import { judgeNextMove, type TaskJudgement } from './judge.js';
3
4
  import { readJourneyEdge, type JourneyRoute } from '../self-dev/graph-journey-route.js';
4
5
 
@@ -11,10 +12,37 @@ export interface RepairNextMoveInput {
11
12
  priorAlternativeAttempts: number;
12
13
  }
13
14
 
14
- export type RepairNextMove = { kind: 'dispatch'; judgement: TaskJudgement; route: JourneyRoute; source: `pr:${number}` }
15
+ /** HARNESS-FULL-GRAPH-NEXTMOVE — 수 한 건의 식별자. 결정 순간 «한 번» 만들고, 그 값을 결정·간선·발사에 그대로 내려보낸다(다시 계산 금지). */
16
+ export function mintMoveId(): string {
17
+ return `mv-${randomBytes(6).toString('hex')}`;
18
+ }
19
+
20
+ /**
21
+ * NEXTMOVE-GENERAL-RELAUNCH-MOVEID — 소비 쪽(결과 파일 · `ta.repair.completed`)이 카드에 적힌 수 id 와 받은 값을 짝짓는다.
22
+ * - `paired` : 둘 다 있고 같다 → 그 값을 카드 결과 줄에 싣는다.
23
+ * - `legacy` : 둘 다 없다(#30226 전 원장 줄 · 옛 worker) → 조용히 지나간다.
24
+ * - `unpaired` : 한쪽만 있거나 다르다 → 소비는 그대로 하고(fail-soft) 관측 줄만 남긴다.
25
+ */
26
+ export type MoveIdPairing = { kind: 'paired'; moveId: string } | { kind: 'legacy' }
27
+ | { kind: 'unpaired'; expected: string | null; observed: string | null };
28
+
29
+ export function pairMoveId(expected: unknown, observed: unknown): MoveIdPairing {
30
+ const want = typeof expected === 'string' && expected ? expected : null;
31
+ const got = typeof observed === 'string' && observed ? observed : null;
32
+ if (want === null && got === null) return { kind: 'legacy' };
33
+ if (want !== null && want === got) return { kind: 'paired', moveId: want };
34
+ return { kind: 'unpaired', expected: want, observed: got };
35
+ }
36
+
37
+ export interface RepairNextMoveDeps {
38
+ /** 시험 seam — 기본 `mintMoveId`. dispatch 결정일 때만 한 번 부른다. */
39
+ mintMoveId?: () => string;
40
+ }
41
+
42
+ export type RepairNextMove = { kind: 'dispatch'; judgement: TaskJudgement; route: JourneyRoute; source: `pr:${number}`; moveId: string }
15
43
  | { kind: 'stop'; judgement: TaskJudgement; route: JourneyRoute; reason: string };
16
44
 
17
- export function repairNextMove(input: RepairNextMoveInput): RepairNextMove {
45
+ export function repairNextMove(input: RepairNextMoveInput, deps: RepairNextMoveDeps = {}): RepairNextMove {
18
46
  const judged = judgeNextMove({ stopReason: 'needs-human', pr: input.pr, prState: 'OPEN', review: 'fail', mustFix: input.mustFix,
19
47
  failures: { 'narrow-relaunch': input.priorNarrowAttempts, alternative: input.priorAlternativeAttempts } });
20
48
  const route = readJourneyEdge('next-move', judged.move, { move: judged.move, source: `pr:${input.pr}`, head: input.head, branch: input.branch });
@@ -27,5 +55,5 @@ export function repairNextMove(input: RepairNextMoveInput): RepairNextMove {
27
55
  if (judged.move !== 'narrow-relaunch' && judged.move !== 'salvage-relaunch' && judged.move !== 'alternative') {
28
56
  return { kind: 'stop', judgement: judged, route, reason: `next move ${judged.move} is not a repair launch` };
29
57
  }
30
- return { kind: 'dispatch', judgement: judged, route, source: `pr:${input.pr}` };
58
+ return { kind: 'dispatch', judgement: judged, route, source: `pr:${input.pr}`, moveId: (deps.mintMoveId ?? mintMoveId)() };
31
59
  }
@@ -0,0 +1,29 @@
1
+ import type { TaskCard } from './task-hand.js';
2
+
3
+ /** Count confirmed repair-result transitions, not repeated rejudge decisions or current card status. */
4
+ export function measureRepairOutcomes(cards: readonly Pick<TaskCard, 'id' | 'history'>[], window: { since: number; until: number }) {
5
+ const affected = new Set<string>();
6
+ const latest = new Map<string, { effect: string | undefined; at: number; card: string }>();
7
+ const counts = { applied: 0, failed: 0, unconfirmed: 0, results: 0, missingRunId: 0, unknownEffect: 0 };
8
+ for (const card of cards) {
9
+ for (const entry of card.history) {
10
+ if (entry.event !== 'repair-result') continue;
11
+ const at = Date.parse(entry.at);
12
+ if (!Number.isFinite(at) || at < window.since || at >= window.until) continue;
13
+ // A repeated collector must not count a worker result twice.
14
+ if (!entry.runId) { counts.missingRunId++; continue; }
15
+ const key = `${card.id}\0${entry.runId}`;
16
+ if (at >= (latest.get(key)?.at ?? -Infinity)) latest.set(key, { effect: entry.effect, at, card: card.id });
17
+ }
18
+ }
19
+ for (const result of latest.values()) {
20
+ if (result.effect === 'applied' || result.effect === 'failed' || result.effect === 'unconfirmed') {
21
+ counts[result.effect]++;
22
+ } else {
23
+ counts.unknownEffect++;
24
+ }
25
+ counts.results++;
26
+ affected.add(result.card);
27
+ }
28
+ return { ...counts, cards: affected.size };
29
+ }
@@ -5,6 +5,7 @@ import { dirname } from 'node:path';
5
5
  import type { RepairCommitResult } from './repair-branch-cas.js';
6
6
  import type { TaskChildLlm } from './task-hand.js';
7
7
  import { publishInsideEvent } from '../nexus/api/inside-events.js';
8
+ import { taskParentRoleEnv } from './task-parent-role-llm.js';
8
9
 
9
10
  const SHA40 = /^[0-9a-f]{40}$/i;
10
11
  const SHA256 = /^[0-9a-f]{64}$/i;
@@ -14,10 +15,13 @@ export interface RepairWorkerRequest {
14
15
  card: string; pr: number; head: string; repo: string; resultPath: string;
15
16
  entry: string; configDir: string; runId: string; seat?: string;
16
17
  model: TaskChildLlm; goal: string;
18
+ parentRoleLlm?: string[];
19
+ /** HARNESS-FULL-GRAPH-NEXTMOVE — 이 발사를 고른 next-move 결정의 수 id(관측 조인 · 없으면 옛 발사). */
20
+ moveId?: string;
17
21
  }
18
22
 
19
23
  export interface RepairWorkerResult {
20
- pr: number; head: string; runId: string; ok: boolean; reason?: string;
24
+ pr: number; head: string; runId: string; ok: boolean; reason?: string; moveId?: string;
21
25
  job?: string; artifactDir?: string; result?: RepairCommitResult;
22
26
  }
23
27
 
@@ -31,6 +35,11 @@ export function repairHarnessArgs(request: RepairWorkerRequest): string[] {
31
35
  ...(request.model.effort ? ['--child-llm-effort', request.model.effort] : []), '--', request.goal];
32
36
  }
33
37
 
38
+ /** The harness-say parent reads role pins from env; its CLI has no --role-llm flag. */
39
+ export function repairWorkerEnv(request: RepairWorkerRequest): Record<string, string> {
40
+ return { ELANOUS_RUN_ID: request.runId, ...taskParentRoleEnv(request.parentRoleLlm ?? []) };
41
+ }
42
+
34
43
  export function parseRepairMarker(output: string, pr: number, head: string, runId: string): Pick<RepairWorkerResult, 'job' | 'artifactDir' | 'result'> | null {
35
44
  const line = output.split(/\r?\n/).reverse().find((entry: string) => entry.startsWith(MARKER));
36
45
  if (!line) return null;
@@ -46,11 +55,12 @@ export function parseRepairMarker(output: string, pr: number, head: string, runI
46
55
  }
47
56
 
48
57
  export async function runRepairWorker(request: RepairWorkerRequest): Promise<RepairWorkerResult> {
49
- const result: RepairWorkerResult = { pr: request.pr, head: request.head, runId: request.runId, ok: false };
58
+ const result: RepairWorkerResult = { pr: request.pr, head: request.head, runId: request.runId, ok: false,
59
+ ...(request.moveId ? { moveId: request.moveId } : {}) };
50
60
  try {
51
61
  const args = repairHarnessArgs(request);
52
62
  const child = spawn(process.execPath, args, {
53
- cwd: request.repo, env: { ...process.env, ELANOUS_RUN_ID: request.runId }, stdio: ['ignore', 'pipe', 'pipe'],
63
+ cwd: request.repo, env: { ...process.env, ...repairWorkerEnv(request) }, stdio: ['ignore', 'pipe', 'pipe'],
54
64
  });
55
65
  let output = '';
56
66
  const append = (data: Buffer) => { output = (output + data.toString('utf8')).slice(-512_000); };
@@ -74,7 +84,7 @@ export async function runRepairWorker(request: RepairWorkerRequest): Promise<Rep
74
84
  // The result file, rather than this best-effort notification, is the durable source.
75
85
  try {
76
86
  publishInsideEvent({ kind: 'ta.repair.completed', schema: 1, card: request.card,
77
- pr: request.pr, head: request.head, runId: request.runId,
87
+ pr: request.pr, head: request.head, runId: request.runId, ...(request.moveId ? { moveId: request.moveId } : {}),
78
88
  resultPath: request.resultPath, completedAt: new Date().toISOString() });
79
89
  } catch { /* a missing daemon cannot change the worker result */ }
80
90
  return result;
@@ -17,6 +17,7 @@ import { extname, join, relative, resolve } from 'node:path';
17
17
  import { debug } from '../debug/log.js';
18
18
  import { passJourneyNode } from '../self-dev/graph-journey-nodes.js';
19
19
  import { readJourneyEdge, recordJourneyEdge } from '../self-dev/graph-journey-route.js';
20
+ import { mintMoveId } from './repair-next-move.js';
20
21
  import { readTaskAgentState, readTaskCard, taskAgentStatePath, TASK_CARD_PREFIX, type CompletionKind, type TaskCard } from './task-hand.js';
21
22
  import type { SupervisorJobResult, SupervisorStopReason } from '../self-dev/run-supervisor.js';
22
23
  import { executeNextAction, type ActionDeps, type DeliveryKind, type NextAction } from './actions.js';
@@ -57,6 +58,8 @@ export interface TaskAgentShadowMove {
57
58
  liveMove?: LiveMoveResult;
58
59
  /** 원격 카드 결선이 미결일 때 런 원장 대기열 보존 결과. */
59
60
  cardBinding?: 'pending' | 'queue-failed';
61
+ /** NEXTMOVE-GENERAL-RELAUNCH-MOVEID — 실제로 발사를 시도한 일반 재발사의 수 id(그림자 수엔 없다). */
62
+ moveId?: string;
60
63
  }
61
64
 
62
65
  export interface TaskAgentShadowDeps {
@@ -82,6 +85,8 @@ export interface TaskAgentShadowDeps {
82
85
  env?: NodeJS.ProcessEnv;
83
86
  /** Remote pending-move ledger seam; defaults to the run ledger. */
84
87
  queueMove?: typeof appendRunLedgerEntry;
88
+ /** 시험 seam — 일반 재발사 결정의 수 id 발급기(기본 `mintMoveId` · #30226 과 같은 것). live 재발사로 갈 때 결정 순간 한 번만 불린다. */
89
+ mintMoveId?: () => string;
85
90
  }
86
91
 
87
92
  const execFileAsync = promisify(execFile);
@@ -104,6 +109,32 @@ export async function defaultPrFiles(pr: number, prUrl: string | undefined,
104
109
 
105
110
  export const REMOTE_CARD_MOVE_PENDING = 'task-agent-card-move-pending';
106
111
 
112
+ /** NEXTMOVE-GENERAL-RELAUNCH-MOVEID — 일반 재발사가 발사 명령을 «성공»으로 받은 뒤 그 카드 history 에 남기는 줄의 이름. */
113
+ export const RELAUNCH_LAUNCHED_EVENT = 'relaunch-launched';
114
+
115
+ /**
116
+ * 일반 재발사 한 건을 그 런의 카드 history 에 한 줄로 남긴다 — 결정·간선·발사 argv 와 같은 수 id.
117
+ * 카드·원장을 모르면 쓰지 않고 관측만 남긴다(fail-soft · 발사는 이미 됐다).
118
+ */
119
+ function recordRelaunchHistory(card: TaskCard | undefined, ledger: string | undefined,
120
+ input: { runId: string | null; move: string; moveId: string | undefined; deps: TaskAgentShadowDeps }): void {
121
+ const log = input.deps.log ?? ((category: string, event: string, data: Record<string, unknown>) => debug.log(category, event, data));
122
+ if (!input.moveId) return;
123
+ if (!card || !ledger) {
124
+ try { log('task-agent', 'relaunch-history-skipped', { runId: input.runId, move: input.move, moveId: input.moveId,
125
+ reason: !card ? 'card unknown' : 'card ledger unknown' }); } catch { /* fail-soft */ }
126
+ return;
127
+ }
128
+ try {
129
+ updateTaskCard(ledger, card.id, (current) => current ? { ...current, history: [...(current.history ?? []), {
130
+ at: new Date().toISOString(), event: RELAUNCH_LAUNCHED_EVENT, ...(input.runId ? { runId: input.runId } : {}),
131
+ effect: input.move, moveId: input.moveId }] } : undefined);
132
+ } catch (error) {
133
+ try { log('task-agent', 'relaunch-history-failed', { card: card.id, runId: input.runId, moveId: input.moveId,
134
+ reason: (error instanceof Error ? error.message : String(error)).slice(-300) }); } catch { /* fail-soft */ }
135
+ }
136
+ }
137
+
107
138
  /** 카드 조회 상태 파일 — 조회 경로 전부가 같은 파일을 본다. */
108
139
  function cardStatePath(deps: TaskAgentShadowDeps): string {
109
140
  return deps.statePath ?? deps.live?.statePath ?? taskAgentStatePath();
@@ -317,6 +348,7 @@ export async function recordTaskAgentShadowMove(input: TaskAgentShadowInput, dep
317
348
  const retryLaunches = { count: 0 };
318
349
  let executorResult: string | null = null;
319
350
  let wouldDo: string | null = null;
351
+ let generalMoveId: string | undefined;
320
352
  if (judgement.executorKind) {
321
353
  const action: NextAction = {
322
354
  kind: judgement.executorKind,
@@ -334,7 +366,10 @@ export async function recordTaskAgentShadowMove(input: TaskAgentShadowInput, dep
334
366
  { move: judgement.move, source: judgeInput.pr ? `pr:${judgeInput.pr}` : `run:${input.runId ?? 'unknown'}`, runId: input.runId }) : null;
335
367
  const liveRetry = retryMove && route?.source === 'graph' && route.to === 'dispatch'
336
368
  && deps.command !== undefined && deps.loadGate !== undefined && liveMoves.has(judgement.move as TaskAgentLiveMove);
337
- executorResult = await executeNextAction(action, {
369
+ // NEXTMOVE-GENERAL-RELAUNCH-MOVEID — live 재발사로 가는 결정 순간 수 id 를 «한 번» 만든다(이미 실린 값이 있으면 그것).
370
+ // 아래 발사 argv · 결정 노드 출구 · graph-edge-taken · 카드 history 가 이 값만 쓴다(다시 만들지 않는다).
371
+ if (liveRetry) generalMoveId = action.moveId ?? (deps.mintMoveId ?? mintMoveId)();
372
+ executorResult = await executeNextAction(generalMoveId ? { ...action, moveId: generalMoveId } : action, {
338
373
  mode: delivery ? (deps.mode ?? 'shadow') : liveRetry ? 'live' : 'shadow',
339
374
  command: deps.command ?? (async () => { throw new Error('task-agent shadow path must not run commands'); }),
340
375
  observe: (event, data) => {
@@ -348,8 +383,10 @@ export async function recordTaskAgentShadowMove(input: TaskAgentShadowInput, dep
348
383
  });
349
384
  if (liveRetry && executorResult === 'done' && route) {
350
385
  passJourneyNode('next-move', { provenance: 'task-agent-terminal', outcome: judgement.move,
351
- runId: input.runId ?? undefined, data: { source: judgeInput.pr ? `pr:${judgeInput.pr}` : `run:${input.runId ?? 'unknown'}`, pr: judgeInput.pr ?? null } });
352
- recordJourneyEdge(route, 'dispatch');
386
+ runId: input.runId ?? undefined, data: { source: judgeInput.pr ? `pr:${judgeInput.pr}` : `run:${input.runId ?? 'unknown'}`, pr: judgeInput.pr ?? null,
387
+ ...(generalMoveId ? { moveId: generalMoveId } : {}) } });
388
+ recordJourneyEdge(route, 'dispatch', undefined, generalMoveId ? { moveId: generalMoveId } : {});
389
+ recordRelaunchHistory(card, cardLedgerPath(deps), { runId: input.runId, move: judgement.move, moveId: generalMoveId, deps });
353
390
  }
354
391
  }
355
392
  const move: TaskAgentShadowMove = {
@@ -362,6 +399,7 @@ export async function recordTaskAgentShadowMove(input: TaskAgentShadowInput, dep
362
399
  executorResult,
363
400
  wouldDo,
364
401
  pr: delivery ? null : typeof judgeInput.pr === 'number' ? judgeInput.pr : null,
402
+ ...(generalMoveId ? { moveId: generalMoveId } : {}),
365
403
  };
366
404
  if (delivery && deps.mode !== 'live') {
367
405
  move.wouldDo = `${move.wouldDo ?? 'would wait'} → ${join(delivery.projectTarget, 'elanous-out', card!.id)} (${delivery.files.join(', ')})`;
@@ -0,0 +1,2 @@
1
+ /** 과제 카드 id 접두 — `task show <id>` 가 이 접두로 TOX 태스크와 갈린다(가벼운 읽기 경로가 task-hand 를 싣지 않고 쓴다). */
2
+ export const TASK_CARD_PREFIX = 'ta-';