elanous 0.2.41 → 0.2.43

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 (796) 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/{GiOLWmt4MqDZePubBjA4Q → Om5xS9jpjSXJCeTNGYEi4}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{2fe2c302.41b517f88d6fe502.js → 0966f8a1.745fcd44f64a87ea.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/{385e4574.e9886ab32759eda3.js → 0ad6802e.ae7afb63fdcb4491.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/114.2b90424d1a3ce84c.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1151-5c2bb8f002ca2dd6.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1200.6a37c202f9f17e9a.js +226 -0
  9. package/apps/pwa/out/_next/static/chunks/1261-a616d5728e02e624.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/1313-19f737e0222c4444.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1357.3bbef3976c37f94a.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/1362-20adddfaf662b0fa.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/{6874.d5cf7eb8edb2cabe.js → 1406.a1dc2ab6f8449374.js} +2 -2
  14. package/apps/pwa/out/_next/static/chunks/1737-9491fc6ab29b9ec6.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1803-4f91a8e7dcaf042c.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/{5744.b9415e18ad623100.js → 1961.a81b12872c3e93a9.js} +1 -1
  17. package/apps/pwa/out/_next/static/chunks/1970cf59.2d4d8ce5d6c81853.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/1971-8890f3962ba7ee0a.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/2073-ba274e00e4f9efb4.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/{5471.1e611302ed3a7c53.js → 2144.25b292396712196d.js} +2 -2
  21. package/apps/pwa/out/_next/static/chunks/{3230-49298c3b73ef2268.js → 2268-53861f339e0b65a2.js} +1 -1
  22. package/apps/pwa/out/_next/static/chunks/{9834.63ab2bbc3153172e.js → 2312.0c8b61e22d3136d7.js} +1 -1
  23. package/apps/pwa/out/_next/static/chunks/{1800.f7ff51dc4978a958.js → 2573.387a707f6f9d720c.js} +2 -2
  24. package/apps/pwa/out/_next/static/chunks/273.f156eee28f11af77.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2873.d2140e5a82546401.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/{9048.212083de42d25be3.js → 3072.01338851ca21a6f7.js} +2 -2
  27. package/apps/pwa/out/_next/static/chunks/3091.a5a4143dea33d197.js +90 -0
  28. package/apps/pwa/out/_next/static/chunks/3095.dc44586a5f83b86d.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/{2263.e09b6edea33bad2d.js → 3113.d7472bbc27d580c7.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/3228-9650b6447b6fa288.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/3402.44b565b314f2263c.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{addc2b32.8c4ff8f0aefe987d.js → 3557ac4a.c8931684475018ad.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/360.ae9f9f4c33c395e8.js +79 -0
  34. package/apps/pwa/out/_next/static/chunks/3638.80412ea63aae8f3f.js +286 -0
  35. package/apps/pwa/out/_next/static/chunks/{a0a01613.6d1cca322238d7fe.js → 363bfab3.9623b9f89363541f.js} +1 -1
  36. package/apps/pwa/out/_next/static/chunks/3694.e0099884345f0198.js +64 -0
  37. package/apps/pwa/out/_next/static/chunks/3744.54f87db52acfd1ab.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3903.3ef4656c67572764.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3935.16701e33f8982dc9.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3955.6922286237f2ac2b.js +24 -0
  41. package/apps/pwa/out/_next/static/chunks/3969.272ee7f9fd6c62e5.js +34 -0
  42. package/apps/pwa/out/_next/static/chunks/4199.ce86b281fd0a60b7.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/4311-6dd3144002cc0c2d.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4426-2b230fad00c88930.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{530.d26346e18089640a.js → 4445.7990c76b3751a918.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/4447-14c5161fa59166c7.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4856-b0b8075bba8c53f4.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4870-de370d65e73c0bb5.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4885-2c989165c4b29fad.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4894.fec2ca9e99caefa2.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/5093.8f04b7f8cb899a95.js +94 -0
  52. package/apps/pwa/out/_next/static/chunks/5122-2bb177cebf89e19a.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/5154.5f56dc3902e3d275.js +36 -0
  54. package/apps/pwa/out/_next/static/chunks/529.64ff7257180b2ac9.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5394.5dabeb0c62293a28.js +93 -0
  56. package/apps/pwa/out/_next/static/chunks/5461.08bf2404ff38ec85.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/5474-22e08a85583209b2.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/{1219.7e17964e0e7cd8e5.js → 5564.9e72532188f57586.js} +3 -3
  59. package/apps/pwa/out/_next/static/chunks/5567-265df39ed8fe9dcb.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/5570-a94ae19811cb2046.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5574-b47c9ef2dceff1fd.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5628.6ddb2d5ffba4ff4c.js +309 -0
  63. package/apps/pwa/out/_next/static/chunks/5730.43d7ccc09988e646.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/{1178.1aa9cad0e7695427.js → 5789.2da35c258292e1e5.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/{4133.2056bb4d78f621af.js → 5824.da9527b15a3221e5.js} +1 -1
  66. package/apps/pwa/out/_next/static/chunks/5866.366966af47fdde5d.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/{4527.a69f2894d1bc9f4a.js → 5930.8b4df3b46c32b05a.js} +1 -1
  68. package/apps/pwa/out/_next/static/chunks/5963-c4d8469c52a0828b.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/6001.ec4049ceb3c43418.js +27 -0
  70. package/apps/pwa/out/_next/static/chunks/6120-471f03db1e299c0c.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6175-41479e643aca1878.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/6291.a2de4f9787637075.js +104 -0
  73. package/apps/pwa/out/_next/static/chunks/6400-6699907c3537436a.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/6428.1f4327d6ae5fdf9a.js +287 -0
  75. package/apps/pwa/out/_next/static/chunks/644.02cb026fa44bcd0a.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6466-6c87d60d3dd174fb.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{9507.7026657a2f47eb64.js → 6540.c7bef57ad8f90a87.js} +16 -16
  78. package/apps/pwa/out/_next/static/chunks/6773.d4264665ab31bec0.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6822.3c789f1a8443e774.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/{5574.f35accf4f132b29d.js → 6944.309f4e3ea54d1537.js} +1 -1
  81. package/apps/pwa/out/_next/static/chunks/7261-8ff69d3b2ee671fd.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/7266.084c6bbc70035140.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/7271.5c0100e7320aa856.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7429-bf5731358c8f2f68.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7464.01f7a0ae1215fbe7.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7479.0fcad5f37eb64f0c.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/7483.427a2fe2049e388d.js +148 -0
  88. package/apps/pwa/out/_next/static/chunks/7502-be74718178e13e56.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/7530.0889722b19572065.js +24 -0
  90. package/apps/pwa/out/_next/static/chunks/7645.5b2ee3ad45c55ea3.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7788.7d1c79f1a8e18946.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/7900.096f455c7c1efc53.js +77 -0
  93. package/apps/pwa/out/_next/static/chunks/7910-6f139bcafd238b9f.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7966.f71c8958d1637548.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{5947-135e26537d80a6b9.js → 8062-7cd0bcc7f01455ba.js} +3 -3
  96. package/apps/pwa/out/_next/static/chunks/8073.f6cf2f2c71aafbd0.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8201.190b94088980f430.js +74 -0
  98. package/apps/pwa/out/_next/static/chunks/8205.282ca4bb62d54a0a.js +62 -0
  99. package/apps/pwa/out/_next/static/chunks/8313-dfa1021bb58a46d6.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/837-81336ebaca8198a8.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8447.7963352ef5f71b76.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8574-868e8129525ef6d9.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8588.d1c6a2903727ce87.js +149 -0
  104. package/apps/pwa/out/_next/static/chunks/8637.90f92d5c8db4732c.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/{2743.5d3f76948be32b34.js → 868.6e953be05bcf6dca.js} +2 -2
  106. package/apps/pwa/out/_next/static/chunks/8706-e1fe0309343a2273.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8749-06384cdfc4520add.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/{5964-7e21164a8f2cf0ce.js → 8861-cc1fa1c7b920fa8e.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/8967-7dfebf710c9dec9d.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/{5159.115f1c2ca471386c.js → 8986.8e2e4efbfa655c59.js} +1 -1
  111. package/apps/pwa/out/_next/static/chunks/8997-3c564dbb3b58b055.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/923.2034d10ae91e9c20.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9312.bc1b89c5d4368033.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/943.39ae5e82f4f1893f.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9469.0500480de55fb205.js +32 -0
  116. package/apps/pwa/out/_next/static/chunks/9770.5f75bc6088b16109.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9810-2543267050e58b82.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9870.8419702475254745.js +8 -0
  119. package/apps/pwa/out/_next/static/chunks/9941-376d1b74d51b01a4.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9958.385434ab04241758.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/{b2271e54.c1de3347976e90b0.js → aa57532f.510551854ff239b1.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-deea1450b17cb8dc.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-70985b904f8650ef.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a2e15e33e56a4353.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-fc72ce2db12d6ca9.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-be03e41f9436ebd9.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-35a35999382da3f2.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-3ff5b1e6ca88b848.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-a65101300a0ee5c1.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-3aca5b6d67dba511.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-45b8ab0a71e61314.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-53046e282d4cda8e.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-17809e60e8354c17.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-fd2442d347bf5898.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-e9d720d6fc082e21.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-6b8b4267bab0a677.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-deea1450b17cb8dc.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-8bcf6233ac7c17af.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-7cc25591cfc2126f.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-053e871f35c9beba.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-eff819f0c2d5e084.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-4d7e9d8db5274a87.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-2b2d8f5aa5f69ad4.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-0b8f92c5062e68b1.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1bd9d0fdac2ced3d.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-9ee28f7df07428ea.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-44b7a1ff468c6648.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-cbc6523711dc1b65.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-fdad47899c2695be.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-40f9e19149024298.js → page-79a8b5fee4c20871.js} +1 -1
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-03e8ac9606aeaffb.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-4cd55c55ec287e2f.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-db17b4305404161e.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-30041d848350fd02.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c540da022dbf86b0.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9399efc538da057f.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-a142dfb0331a05f5.js → page-ca2d09128c585ca4.js} +1 -1
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-0e2635aecd343038.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ef7f4399b6b7726e.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-deea1450b17cb8dc.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-caf530535b875468.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-eaa20c1543a5fd8e.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c541eb1b75120f61.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-ab5e213eda9479f4.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-0a815f34367b6db6.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-e858ba0ed9393b68.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-1638ee9dd6e0582f.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-4cf5a399109391f2.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-b4396321238798ec.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-cb72bfd21006781a.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6135d0242afbc434.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a1dccf907eddb856.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{53aeb4ee-51c92f8d683f5220.js → c7945435-b44d4dbe90ba0dcb.js} +1 -1
  174. package/apps/pwa/out/_next/static/chunks/{2fdf2931.b431eee4fb468bc3.js → cb0f8df8.09a4a6be97e3fc5f.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/{c0c1a699.0ba79f97005965d4.js → d96660fb.cbc21a2a88539dbb.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/ea514caa.05a24f78d9dffe5f.js +122 -0
  177. package/apps/pwa/out/_next/static/chunks/{83184dcd-0ee6247ff41eb3f2.js → fb7d20d5-6892502b6ee39ca6.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/framework-e8a911e19b1be41f.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-7022f418fabba021.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-e5f15df755756a1e.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-4525f91e36940c9b.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-140f0e519c085b0f.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-8f22ef63dcb865b1.js +1 -0
  184. package/apps/pwa/out/_next/static/css/{b9d8151e48998417.css → 62c858ad53854f47.css} +1 -1
  185. package/apps/pwa/out/_next/static/css/d1f8bb401740a549.css +1 -0
  186. package/apps/pwa/out/approvals/index.html +1 -1
  187. package/apps/pwa/out/approvals/index.txt +23 -23
  188. package/apps/pwa/out/autopilot/index.html +1 -1
  189. package/apps/pwa/out/autopilot/index.txt +23 -23
  190. package/apps/pwa/out/board/index.html +1 -1
  191. package/apps/pwa/out/board/index.txt +23 -23
  192. package/apps/pwa/out/botlab/index.html +1 -1
  193. package/apps/pwa/out/botlab/index.txt +22 -22
  194. package/apps/pwa/out/bots/index.html +1 -1
  195. package/apps/pwa/out/bots/index.txt +22 -22
  196. package/apps/pwa/out/ceo/index.html +1 -1
  197. package/apps/pwa/out/ceo/index.txt +23 -23
  198. package/apps/pwa/out/chat/index.html +1 -1
  199. package/apps/pwa/out/chat/index.txt +22 -22
  200. package/apps/pwa/out/consult/index.html +1 -1
  201. package/apps/pwa/out/consult/index.txt +23 -23
  202. package/apps/pwa/out/control/index.html +1 -1
  203. package/apps/pwa/out/control/index.txt +23 -23
  204. package/apps/pwa/out/decisions/index.html +1 -1
  205. package/apps/pwa/out/decisions/index.txt +22 -22
  206. package/apps/pwa/out/design-check/index.html +1 -1
  207. package/apps/pwa/out/design-check/index.txt +23 -23
  208. package/apps/pwa/out/editor/index.html +1 -1
  209. package/apps/pwa/out/editor/index.txt +24 -25
  210. package/apps/pwa/out/exec/index.html +1 -1
  211. package/apps/pwa/out/exec/index.txt +23 -23
  212. package/apps/pwa/out/field/index.html +1 -1
  213. package/apps/pwa/out/field/index.txt +23 -23
  214. package/apps/pwa/out/healthz +1 -1
  215. package/apps/pwa/out/index.html +1 -1
  216. package/apps/pwa/out/index.txt +22 -22
  217. package/apps/pwa/out/inside/index.html +1 -1
  218. package/apps/pwa/out/inside/index.txt +23 -23
  219. package/apps/pwa/out/intake/index.html +1 -1
  220. package/apps/pwa/out/intake/index.txt +23 -23
  221. package/apps/pwa/out/live/index.html +1 -1
  222. package/apps/pwa/out/live/index.txt +24 -25
  223. package/apps/pwa/out/live-run/index.html +1 -1
  224. package/apps/pwa/out/live-run/index.txt +24 -25
  225. package/apps/pwa/out/loops/index.html +1 -1
  226. package/apps/pwa/out/loops/index.txt +22 -22
  227. package/apps/pwa/out/market/index.html +1 -1
  228. package/apps/pwa/out/market/index.txt +22 -22
  229. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  230. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  231. package/apps/pwa/out/morning/index.html +1 -1
  232. package/apps/pwa/out/morning/index.txt +23 -23
  233. package/apps/pwa/out/observatory/index.html +1 -1
  234. package/apps/pwa/out/observatory/index.txt +23 -23
  235. package/apps/pwa/out/ops/checklist/index.html +1 -1
  236. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  237. package/apps/pwa/out/ops/release/index.html +1 -1
  238. package/apps/pwa/out/ops/release/index.txt +22 -22
  239. package/apps/pwa/out/ops/seats/index.html +1 -1
  240. package/apps/pwa/out/ops/seats/index.txt +22 -22
  241. package/apps/pwa/out/outputs/index.html +1 -1
  242. package/apps/pwa/out/outputs/index.txt +22 -22
  243. package/apps/pwa/out/reflection/index.html +1 -1
  244. package/apps/pwa/out/reflection/index.txt +23 -23
  245. package/apps/pwa/out/scheduler/index.html +1 -1
  246. package/apps/pwa/out/scheduler/index.txt +23 -23
  247. package/apps/pwa/out/sessions/index.html +1 -1
  248. package/apps/pwa/out/sessions/index.txt +22 -22
  249. package/apps/pwa/out/settings/devices/index.html +1 -1
  250. package/apps/pwa/out/settings/devices/index.txt +23 -23
  251. package/apps/pwa/out/settings/index.html +1 -1
  252. package/apps/pwa/out/settings/index.txt +23 -23
  253. package/apps/pwa/out/setup/done/index.html +1 -1
  254. package/apps/pwa/out/setup/done/index.txt +23 -23
  255. package/apps/pwa/out/setup/index.html +1 -1
  256. package/apps/pwa/out/setup/index.txt +23 -23
  257. package/apps/pwa/out/share/index.html +1 -1
  258. package/apps/pwa/out/share/index.txt +23 -23
  259. package/apps/pwa/out/showroom/index.html +1 -1
  260. package/apps/pwa/out/showroom/index.txt +22 -22
  261. package/apps/pwa/out/tasks/index.html +1 -1
  262. package/apps/pwa/out/tasks/index.txt +23 -23
  263. package/apps/pwa/out/term/index.html +1 -1
  264. package/apps/pwa/out/term/index.txt +23 -23
  265. package/apps/pwa/out/today/index.html +1 -1
  266. package/apps/pwa/out/today/index.txt +23 -23
  267. package/apps/pwa/out/trace/index.html +1 -1
  268. package/apps/pwa/out/trace/index.txt +23 -23
  269. package/apps/pwa/out/vault/index.html +1 -1
  270. package/apps/pwa/out/vault/index.txt +23 -23
  271. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  272. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  273. package/apps/pwa/out/workflows/index.html +1 -1
  274. package/apps/pwa/out/workflows/index.txt +23 -23
  275. package/apps/pwa/out/workspace/index.html +1 -1
  276. package/apps/pwa/out/workspace/index.txt +23 -23
  277. package/apps/pwa/out/worktrees/index.html +1 -1
  278. package/apps/pwa/out/worktrees/index.txt +23 -23
  279. package/catalog/external-commands.yaml +5 -3
  280. package/catalog/meta/catalogVersion.yaml +2 -1
  281. package/catalog/signing/catalog-signing-public.pem +3 -0
  282. package/docs/goal-context/04-mock-scenarios.md +13 -0
  283. package/graphs/catalog/catalog.yaml +1 -1
  284. package/graphs/heal/heal-loop.yaml +1 -0
  285. package/graphs/intake/intake-daily.yaml +16 -0
  286. package/graphs/intake/news-sources.yaml +1 -0
  287. package/graphs/intake/recipes.yaml +7 -0
  288. package/graphs/overlays/examples/research-runtime-empty-terminal.yaml +28 -0
  289. package/graphs/overlays/stop-heal-ladder.yaml +113 -0
  290. package/graphs/profiles/local.yaml +5 -0
  291. package/graphs/profiles/pod.yaml +4 -0
  292. package/graphs/units/verbs/recipes.yaml +11 -11
  293. package/graphs/work/research-report.yaml +10 -2
  294. package/package.json +6 -2
  295. package/plugins/demo-absorption-briefing/plugin.json +18 -0
  296. package/plugins/demo-absorption-briefing/skills/demo-absorption-briefing/SKILL.md +8 -0
  297. package/plugins/demo-browser-hand/plugin.json +13 -0
  298. package/plugins/demo-browser-hand/skills/demo-browser-hand/SKILL.md +8 -0
  299. package/plugins/demo-linear-secretary/plugin.json +15 -0
  300. package/plugins/demo-linear-secretary/skills/demo-linear-secretary/SKILL.md +8 -0
  301. package/plugins/demo-plugin-wizard/plugin.json +11 -0
  302. package/plugins/demo-plugin-wizard/skills/demo-plugin-wizard/SKILL.md +8 -0
  303. package/plugins/demo-research/plugin.json +16 -0
  304. package/plugins/demo-research/skills/demo-research/SKILL.md +8 -0
  305. package/plugins/demo-video-briefing/plugin.json +15 -0
  306. package/plugins/demo-video-briefing/skills/demo-video-briefing/SKILL.md +8 -0
  307. package/scripts/build-signed-catalog.ts +48 -0
  308. package/scripts/ci-typecheck-main-delta.sh +88 -0
  309. package/scripts/codex-fallback-live-probe.ts +1 -1
  310. package/scripts/demo/demo1104-parallel-scenes.ts +301 -0
  311. package/scripts/demo/demo1104-stage.config.ts +21 -0
  312. package/scripts/demo/demo1104-stage.ts +316 -0
  313. package/scripts/goal-method-audit.ts +17 -1
  314. package/scripts/graph-units/land-enqueue.ts +90 -0
  315. package/scripts/heal/run-role.ts +99 -5
  316. package/scripts/hooks/codex-notify.sh +32 -0
  317. package/scripts/install.sh +10 -38
  318. package/scripts/land-global-checks.ts +6 -1
  319. package/scripts/landing-heal/land-plan.ts +57 -0
  320. package/scripts/lib/decompose-ab.ts +1 -0
  321. package/scripts/lib/fixtures/tui-regress/help-insufficient-commands.txt +15 -0
  322. package/scripts/lib/fixtures/tui-regress/help-live.txt +42 -0
  323. package/scripts/lib/fixtures/tui-regress/help-missing-keys.txt +21 -0
  324. package/scripts/lib/fixtures/tui-regress/help-original.txt +51 -0
  325. package/scripts/lib/fixtures/tui-regress/help-shifted-input.txt +26 -0
  326. package/scripts/lib/tui-regress-checks.ts +33 -13
  327. package/scripts/release-loop/auto-approve-node.ts +1 -1
  328. package/scripts/release-loop/gate-autoheal-sim-evidence.ts +60 -0
  329. package/scripts/release-loop/gate-baseline-receipt.ts +47 -9
  330. package/scripts/release-loop/gate-image-pin.ts +81 -0
  331. package/scripts/release-loop/gate-method.ts +139 -0
  332. package/scripts/release-loop/gate-node-sim.ts +207 -0
  333. package/scripts/release-loop/gate-node.ts +463 -64
  334. package/scripts/release-loop/gate-pod-image-sticky-plan.ts +99 -0
  335. package/scripts/release-loop/gate-radius-live.ts +97 -13
  336. package/scripts/release-loop/gate-shard-dispatch.ts +43 -0
  337. package/scripts/release-loop/gate-traffic-mode.ts +151 -3
  338. package/scripts/release-loop/gate-train-receipts.ts +122 -0
  339. package/scripts/release-loop/node-verdict.ts +38 -25
  340. package/scripts/release-loop/preflight.ts +362 -8
  341. package/scripts/release-loop/resume-release.ts +83 -8
  342. package/scripts/release-loop/unattended-release.ts +20 -9
  343. package/scripts/rhythm/daily.ts +36 -4
  344. package/scripts/rhythm/linear-progress-sync.ts +298 -0
  345. package/scripts/ux-sim.ts +18 -1
  346. package/scripts/video-pipeline.ts +9 -1
  347. package/scripts/warm-pool-provider-config.ts +286 -0
  348. package/skills/omni-crawl/SKILL.md +5 -2
  349. package/skills/omni-crawl/scripts/main.ts +84 -23
  350. package/src/acp/agent-manager.ts +1 -0
  351. package/src/acp/codex-app-server-agent.ts +33 -0
  352. package/src/acp/codex-app-server-client.ts +153 -16
  353. package/src/acp/core-turn-bridge.ts +27 -9
  354. package/src/acp/event-router.ts +20 -1
  355. package/src/acp/server.ts +6 -0
  356. package/src/agent/registry.ts +2 -0
  357. package/src/agent/task-notification.ts +25 -5
  358. package/src/agent/types.ts +6 -0
  359. package/src/agent-mission/browser-roundtrip-coordinator.ts +85 -0
  360. package/src/agent-mission/claude-headless.ts +4 -1
  361. package/src/agent-mission/codex-exec.ts +105 -0
  362. package/src/agent-mission/driver.ts +192 -11
  363. package/src/agent-mission/grok-auth-status.ts +47 -0
  364. package/src/agent-mission/hand-hooks.ts +101 -0
  365. package/src/agent-mission/mission-cli.ts +63 -4
  366. package/src/agent-mission/mission-hand-reply.ts +118 -0
  367. package/src/agent-mission/mission-line.ts +180 -0
  368. package/src/agent-mission/mission-out.ts +833 -0
  369. package/src/agent-mission/tool-install.ts +200 -3
  370. package/src/agent-substrate/context-strategy.ts +4 -4
  371. package/src/agent-substrate/self-review-cli.ts +178 -13
  372. package/src/agents/general-purpose.md +1 -1
  373. package/src/auto-research/research-turn.ts +211 -53
  374. package/src/autopilot/pr-manager.ts +69 -10
  375. package/src/autopilot/pty-control-loop.ts +2 -0
  376. package/src/boot/daemon-tools/self-implement.ts +3 -1
  377. package/src/boot/daemon-tools/web-search.ts +1 -2
  378. package/src/briefing/brief-items.ts +55 -11
  379. package/src/capture/tui-self-report.ts +22 -6
  380. package/src/chat/index.ts +1 -1
  381. package/src/cli/agent-cli.ts +2 -1
  382. package/src/cli/catalog-cli.ts +31 -0
  383. package/src/cli/connector-cli.ts +16 -0
  384. package/src/cli/doctor-fix.ts +2 -2
  385. package/src/cli/fixtures/review-loop-breaker/opwaiver-32646-1694ccc7a170.json +1 -0
  386. package/src/cli/fixtures/review-loop-breaker/opwaiver-32853-bd8f73595c83.json +1 -0
  387. package/src/cli/fixtures/review-loop-breaker/opwaiver-33097-1cc85900413c.json +1 -0
  388. package/src/cli/fixtures/review-loop-breaker/opwaiver-33106-972f31e4a3ca.json +1 -0
  389. package/src/cli/fixtures/review-loop-breaker/opwaiver-33113-3ab51f05968f.json +1 -0
  390. package/src/cli/fixtures/review-loop-breaker/pr-33097-1cc85900413c.json +1 -0
  391. package/src/cli/intake-source-cli.ts +44 -8
  392. package/src/cli/msg-cli.ts +32 -3
  393. package/src/cli/pr-cli.ts +21 -1
  394. package/src/cli/pr-land-heavy-remote.ts +75 -5
  395. package/src/cli/pr-land-overlap-evidence.ts +113 -2
  396. package/src/cli/pr-land-pod-shadow-job.ts +202 -4
  397. package/src/cli/pr-land-pod-shadow.ts +9 -2
  398. package/src/cli/release-checklist-read-cli.ts +57 -19
  399. package/src/cli/release-cli.ts +23 -3
  400. package/src/cli/research-cli.ts +13 -5
  401. package/src/cli/setup-cli.ts +166 -6
  402. package/src/cli/setup-keys.ts +187 -0
  403. package/src/cli/task-plugin-wizard-host.ts +114 -0
  404. package/src/cli/tasks-cli.ts +61 -9
  405. package/src/cli/tui-test-cli.ts +186 -0
  406. package/src/compact/auto.ts +8 -1
  407. package/src/config.ts +4 -2
  408. package/src/connectors/linear-daily-progress.ts +228 -0
  409. package/src/connectors/linear-projector.ts +34 -12
  410. package/src/connectors/linear.ts +151 -7
  411. package/src/control-plane/ledger.ts +52 -2
  412. package/src/control-plane/server.ts +16 -2
  413. package/src/core-turn/deep-turn-bloom.ts +67 -0
  414. package/src/core-turn/research-policy.ts +37 -0
  415. package/src/core-turn/run-core-turn.ts +606 -95
  416. package/src/core-turn/run-goal-loop.ts +18 -0
  417. package/src/core-turn/types.ts +4 -0
  418. package/src/dashboard/chat/acp-chat.ts +10 -0
  419. package/src/dashboard/classic-sidetab-mission-job.ts +161 -0
  420. package/src/dashboard/classic-sidetab-mission-pair.ts +81 -0
  421. package/src/dashboard/classic-sidetab-mission-trio.ts +219 -0
  422. package/src/dashboard/classic-sidetab-mission.ts +347 -0
  423. package/src/dashboard/index.ts +517 -18
  424. package/src/dashboard/input/agent-wake.ts +23 -1
  425. package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
  426. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +17 -0
  427. package/src/dashboard/mission-cli-consumer.ts +165 -0
  428. package/src/dashboard/plugin-wizard-runtime.ts +50 -0
  429. package/src/dashboard/plugin-wizard-tool.ts +55 -0
  430. package/src/dashboard/seat-boot-preamble.ts +171 -1
  431. package/src/dashboard/side-basic-runtime.ts +54 -1
  432. package/src/dashboard/sidetab-runtime.ts +90 -1
  433. package/src/dashboard/skill-catalog-preamble.ts +101 -0
  434. package/src/dashboard/skill-detection-runtime.ts +55 -15
  435. package/src/dashboard/slash-runtime/dashboard-handlers.ts +15 -0
  436. package/src/dashboard/terminal-popup-runtime.ts +6 -3
  437. package/src/dashboard/turn-preamble.ts +53 -15
  438. package/src/dashboard/turn-prompt-runtime.ts +4 -2
  439. package/src/decisions/linear-progress-summary.ts +78 -0
  440. package/src/decisions/linear-progress-sync.ts +152 -0
  441. package/src/domains/outbound-alert.ts +49 -11
  442. package/src/domains/telegram-kind-route.ts +16 -9
  443. package/src/graph-runner/arg-allowance.ts +13 -0
  444. package/src/graph-runner/graph-cli.ts +23 -7
  445. package/src/graph-runner/graph-run-api.ts +3 -1
  446. package/src/graph-runner/graph-tick.ts +10 -2
  447. package/src/graph-runner/runner.ts +86 -18
  448. package/src/graph-wizard/mission-compose.ts +407 -12
  449. package/src/grok/agent-search.ts +14 -4
  450. package/src/grok/credential.ts +28 -11
  451. package/src/harness/dispatch-backpressure.ts +54 -1
  452. package/src/harness/dispatch-shadow-compare.ts +74 -0
  453. package/src/harness/harness-cli-command.ts +11 -1
  454. package/src/harness/harness-pod-dispatch.ts +81 -15
  455. package/src/harness/harness-stop.ts +155 -11
  456. package/src/harness/skill-exec.ts +21 -9
  457. package/src/harness/skill-select.ts +1 -1
  458. package/src/hooks/error-report-cloud.ts +101 -0
  459. package/src/hooks/receiver.ts +29 -2
  460. package/src/index.ts +159 -13
  461. package/src/instance/spawn-elanous.ts +6 -4
  462. package/src/intake-plane/actions.ts +354 -0
  463. package/src/intake-plane/adapters/telegram-ambient.ts +34 -18
  464. package/src/intake-plane/intake-sources.ts +78 -8
  465. package/src/intake-plane/items.ts +14 -4
  466. package/src/intake-plane/linear-mission-sync.ts +80 -0
  467. package/src/intake-plane/linear-secretary-runtime.ts +178 -0
  468. package/src/intake-plane/linear-wish.ts +227 -1
  469. package/src/life/life-cli.ts +168 -0
  470. package/src/life/life-kinds.ts +160 -0
  471. package/src/live-supply/budget-consumer.ts +78 -0
  472. package/src/live-supply/read.ts +3 -0
  473. package/src/live-supply/snapshot.ts +45 -0
  474. package/src/llm/provider-credentials.ts +8 -2
  475. package/src/llm.ts +168 -9
  476. package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
  477. package/src/loops/orchestrator/tick.ts +13 -0
  478. package/src/maturity/feature-maturity.ts +4 -4
  479. package/src/msg/msg-sse-server.ts +3 -3
  480. package/src/msg/msg-store.ts +177 -19
  481. package/src/native-tool-catalog.ts +38 -4
  482. package/src/nexus/api/harness-traversal.ts +11 -0
  483. package/src/nexus/api/http-server.ts +37 -1
  484. package/src/nexus/api/mcp-public-allowlist.ts +2 -0
  485. package/src/nexus/index.ts +7 -2
  486. package/src/nexus/outbound/format.ts +9 -0
  487. package/src/nexus/outbound/router.ts +98 -13
  488. package/src/nexus/setup-status.ts +9 -0
  489. package/src/nexus/state/state.ts +3 -0
  490. package/src/oauth/codex-account-store.ts +20 -7
  491. package/src/oauth/codex-owner-mirror.ts +44 -0
  492. package/src/oauth/codex.ts +17 -2
  493. package/src/oauth/fallback-chain.ts +47 -17
  494. package/src/onboarding/first-run-doctor.ts +8 -1
  495. package/src/onboarding/first-run.ts +85 -26
  496. package/src/onboarding/key-setup.ts +103 -0
  497. package/src/onboarding/menu-answer.ts +13 -0
  498. package/src/onboarding/secret-prompt.ts +37 -0
  499. package/src/plugins/install/plugin-install.ts +59 -0
  500. package/src/pr-tool/census.ts +133 -2
  501. package/src/pty-shell/pty-control-ipc.ts +4 -1
  502. package/src/pty-shell/tui-run-state.ts +188 -2
  503. package/src/registry/catalog-server.ts +232 -0
  504. package/src/registry/loader.ts +45 -1
  505. package/src/registry/types.ts +1 -2
  506. package/src/release-loop/checklist-target-path-hint.ts +13 -0
  507. package/src/release-loop/checklist.ts +9 -1
  508. package/src/repl/index.ts +43 -2
  509. package/src/research/axis-fanout.ts +136 -16
  510. package/src/research/bloom-exemplars.ts +3 -1
  511. package/src/research/gap-followup.ts +13 -1
  512. package/src/research/plugin-discovery.ts +36 -14
  513. package/src/research-bridge/invoke.ts +22 -5
  514. package/src/research-bridge/types.ts +2 -0
  515. package/src/self-dev/ask-launch-flow.ts +72 -1
  516. package/src/self-dev/decompose.ts +119 -5
  517. package/src/self-dev/dev-cli.ts +4 -1
  518. package/src/self-dev/dev-pipeline.ts +5 -0
  519. package/src/self-dev/draft-residue.ts +64 -5
  520. package/src/self-dev/graph-front-nodes.ts +2 -1
  521. package/src/self-dev/graph-journey-route.ts +76 -21
  522. package/src/self-dev/launch-preflight-text.ts +5 -6
  523. package/src/self-dev/launch-preflight.ts +58 -0
  524. package/src/self-dev/orchestrate.ts +13 -3
  525. package/src/self-dev/review-provider-fallback.ts +9 -2
  526. package/src/self-dev/run-supervisor.ts +42 -4
  527. package/src/self-dev/run-types.ts +4 -0
  528. package/src/self-dev/shard-aggregate.ts +4 -0
  529. package/src/self-dev/shard-run.ts +36 -15
  530. package/src/self-implement/abandoned-classification.ts +12 -3
  531. package/src/self-implement/budget-gate.ts +7 -0
  532. package/src/self-implement/child-llm-preference.ts +10 -1
  533. package/src/self-implement/doctor-visit.ts +118 -8
  534. package/src/self-implement/elanous-tui-spawn.ts +3 -0
  535. package/src/self-implement/fixtures/tdd-green-missing-passing-child-transcript.txt +2 -0
  536. package/src/self-implement/gate-artifacts.ts +2 -1
  537. package/src/self-implement/goal-author-cli.ts +4 -2
  538. package/src/self-implement/goal-author.ts +684 -7
  539. package/src/self-implement/graph-overlay-yaml.ts +37 -4
  540. package/src/self-implement/graph-overlay.ts +3 -1
  541. package/src/self-implement/graph-profile-yaml.ts +107 -0
  542. package/src/self-implement/graph-yaml.ts +26 -3
  543. package/src/self-implement/headless-elanous-driver.ts +31 -2
  544. package/src/self-implement/heal-intake.ts +112 -4
  545. package/src/self-implement/heal-triage.ts +20 -0
  546. package/src/self-implement/host-regate.ts +27 -4
  547. package/src/self-implement/merge-train.ts +5 -0
  548. package/src/self-implement/off-diff-evidence.ts +249 -5
  549. package/src/self-implement/orchestrator.ts +365 -25
  550. package/src/self-implement/regate-detail.ts +38 -1
  551. package/src/self-implement/rework-child-provider.ts +25 -0
  552. package/src/self-implement/run-chart.ts +122 -0
  553. package/src/self-implement/run-ledger.ts +162 -11
  554. package/src/self-implement/run-stop.ts +188 -4
  555. package/src/self-implement/runtime-overlay-run-steps.ts +95 -0
  556. package/src/self-implement/stop-autoheal.ts +13 -0
  557. package/src/self-implement/tdd-evidence-tags.ts +9 -0
  558. package/src/self-implement/train-gate-receipt.ts +166 -0
  559. package/src/self-implement/train-gate-remote.ts +62 -18
  560. package/src/session/chat.ts +40 -4
  561. package/src/session/session-fanout.ts +2 -0
  562. package/src/session/streaming/acp-stream-sink.ts +2 -1
  563. package/src/session/streaming/chunk-producer.ts +6 -0
  564. package/src/session/streaming/stream-compositor.ts +3 -2
  565. package/src/session-runtime/index.ts +135 -5
  566. package/src/session-runtime/retry-policy.ts +1 -1
  567. package/src/session-runtime/tier-flip.ts +3 -3
  568. package/src/setup/llm-env-detect.ts +3 -0
  569. package/src/setup/service-key-catalog.ts +46 -0
  570. package/src/setup/service-keys.ts +241 -0
  571. package/src/sidetab-core/model.ts +19 -5
  572. package/src/sidetab-core/visible-agent-mission.ts +262 -0
  573. package/src/skills/name-match.ts +20 -0
  574. package/src/skills/tools/agent.ts +53 -6
  575. package/src/skills/tools/omni-search.ts +173 -13
  576. package/src/task-agent/parent-host.ts +10 -0
  577. package/src/task-agent/pod-distributor-entry.ts +3 -0
  578. package/src/task-agent/repair-outcomes.ts +65 -0
  579. package/src/task-agent/task-hand.ts +47 -7
  580. package/src/task-orchestrator/dispatcher.ts +14 -1
  581. package/src/task-orchestrator/linear-capture-events.ts +55 -0
  582. package/src/task-orchestrator/store.ts +16 -5
  583. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +4 -0
  584. package/src/task-orchestrator/surfaces/pod-distributor.ts +48 -0
  585. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +92 -1
  586. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
  587. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
  588. package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +33 -6
  589. package/src/task-orchestrator/surfaces/pod-source-bundle.ts +45 -9
  590. package/src/task-orchestrator/surfaces/pod-source-receive.ts +178 -16
  591. package/src/task-orchestrator/surfaces/pod-source-spec.ts +3 -3
  592. package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
  593. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +237 -41
  594. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +80 -3
  595. package/src/task-orchestrator/surfaces/self-implement-pod.ts +337 -51
  596. package/src/task-orchestrator/surfaces/self-implement.ts +27 -3
  597. package/src/task-orchestrator/surfaces/warm-reuse-evidence.ts +169 -0
  598. package/src/task-orchestrator/types.ts +14 -0
  599. package/src/telegram.ts +14 -16
  600. package/src/terminal/coding-agent.ts +14 -5
  601. package/src/terminal/session-registry.ts +1 -1
  602. package/src/tokens.ts +35 -2
  603. package/src/tool-hints/gate.ts +1 -0
  604. package/src/tool-runtime/agent-runtime.ts +2 -0
  605. package/src/tool-runtime/browser-hand-runtime.ts +381 -0
  606. package/src/tool-runtime/browser-runtime.ts +2 -1
  607. package/src/tool-runtime/elanous-linear-issue-runtime.ts +76 -0
  608. package/src/tool-runtime/elanous-linear-secretary-runtime.ts +57 -0
  609. package/src/tool-runtime/elanous-skills-list-runtime.ts +5 -1
  610. package/src/tool-runtime/graph-mcp-runtimes.ts +240 -0
  611. package/src/tool-runtime/index.ts +6 -0
  612. package/src/tool-runtime/skill-exec-runtime.ts +33 -13
  613. package/src/tool-runtime/types.ts +4 -0
  614. package/src/tui/entry.ts +38 -5
  615. package/src/tui/sidetab/attach.ts +177 -1
  616. package/src/tui/sidetab/herdr-portal.ts +225 -0
  617. package/src/tui-client/local-chat-turn.ts +26 -13
  618. package/src/tui.ts +22 -0
  619. package/src/user-config.ts +34 -9
  620. package/src/user-intent/types.ts +4 -3
  621. package/src/ux-sim/browser-hand.ts +165 -0
  622. package/src/ux-sim/draft-inventory-builder.ts +198 -0
  623. package/src/ux-sim/fake-browser-page.ts +81 -0
  624. package/src/ux-sim/fake-kubectl.ts +37 -3
  625. package/src/ux-sim/fake-linear-device.ts +31 -0
  626. package/src/ux-sim/fault-pool-cap.ts +11 -6
  627. package/src/ux-sim/graph-engine-sim.ts +47 -0
  628. package/src/ux-sim/linear-secretary.ts +216 -0
  629. package/src/ux-sim/mock-scenario-catalog.json +93 -0
  630. package/src/ux-sim/mock-scenario-catalog.ts +274 -0
  631. package/src/ux-sim/onboarding-first-run-device.ts +31 -21
  632. package/src/ux-sim/scenario.ts +185 -48
  633. package/src/ux-sim/service-key-setup.ts +50 -0
  634. package/src/ux-sim/term-slash-device.ts +74 -0
  635. package/src/ux-sim/turn-throw-sim.ts +31 -0
  636. package/src/version/packed-revision.json +1 -1
  637. package/src/voice/voice-tts-singleton.ts +18 -3
  638. package/src/web-search/exa.ts +77 -0
  639. package/src/web-search/grok.ts +5 -9
  640. package/src/web-search/index.ts +30 -9
  641. package/src/web-search/provider.ts +4 -1
  642. package/src/web-search/x-intent.ts +5 -0
  643. package/apps/pwa/out/_next/static/chunks/1115.434ae2ecb0ad986d.js +0 -149
  644. package/apps/pwa/out/_next/static/chunks/1121.667cec0bcdbb3fdb.js +0 -36
  645. package/apps/pwa/out/_next/static/chunks/1197-54da59d250a6e476.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/1245.1cfd13b26dbd71d6.js +0 -287
  647. package/apps/pwa/out/_next/static/chunks/1494-f93046ff5c5a124d.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/1609.2b312797599b8e45.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/1661.0dd330f3d89f73f3.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/167-0c121e4b47e0f9da.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/1700.cdc2bf8cc685e221.js +0 -90
  652. package/apps/pwa/out/_next/static/chunks/1703-78e46acad29f3cfc.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/1765.679b29625c8e88d4.js +0 -77
  654. package/apps/pwa/out/_next/static/chunks/1971-7efb628c471dc5a0.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/1999-8de7b7bb36801913.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/2073.689dcb2680113d76.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/2198-557d49184104d165.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/221-440ce67fa9f5c839.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/2427-8ed8e98624cbd664.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/2457-725c5827bc003795.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/2491-2718b15a5ccb75a5.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/2527-5c636a43c7cc5dde.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/2692-1027cb16fe4ccf49.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/2773.0e80b9d325fb5635.js +0 -32
  665. package/apps/pwa/out/_next/static/chunks/2873-0f3cb56c8e3528ea.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/3097.864e92bdaa2f4d15.js +0 -79
  667. package/apps/pwa/out/_next/static/chunks/3136-d6870ba63300a93e.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/3173-0289113d434e83b7.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/325-dd9208a1a0ab7ce4.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/3283.528f430dd043fb4e.js +0 -74
  671. package/apps/pwa/out/_next/static/chunks/3295.cc8cb13b8f0dae1a.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/3688-86e3b88abf18cb3b.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/3804-7220467a5473a8df.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/3808.3e1e247ce7bdf889.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/3927.b5473ad109da44c5.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/3934-98ea94832e194796.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/4156.ba4de4a3664f04b4.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/4297-239ca82f293faab0.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/4320-dcc5a7734126f4c9.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/4434.94b4c552a2d91e69.js +0 -148
  681. package/apps/pwa/out/_next/static/chunks/4579.03e4092f73950965.js +0 -226
  682. package/apps/pwa/out/_next/static/chunks/4667.97e31aa38c95c475.js +0 -309
  683. package/apps/pwa/out/_next/static/chunks/4702.4a4adc1f16d7c93b.js +0 -64
  684. package/apps/pwa/out/_next/static/chunks/4815.481501c57b3568d9.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/487-d16e698ef14662d9.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/4888-7a38bf522c9cc6fe.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/5034-30e429d6bb086881.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/5040-35c494e60dadd97d.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/50c6ab1e.81a96e419350909d.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/5154.4b6a836179356f30.js +0 -94
  691. package/apps/pwa/out/_next/static/chunks/5228-a8200df486278f2d.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/5379.97af106d09566f69.js +0 -8
  693. package/apps/pwa/out/_next/static/chunks/5479-b6372e762719f92f.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/5534-699c5cbcbc96c5d7.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/5701.9c4e8f250312eeee.js +0 -24
  696. package/apps/pwa/out/_next/static/chunks/5892.2526d962339662d8.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/5937.c2df9e3447e1f667.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/5941.8210cc93c9202c0a.js +0 -286
  699. package/apps/pwa/out/_next/static/chunks/5975.4004f820ae3cecd5.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/6142-7ccd48795d7abd55.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/6160.bf9177b8c1bfb243.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/6398.71ba0690c8027555.js +0 -27
  703. package/apps/pwa/out/_next/static/chunks/6492.2bd5c10edc1a064e.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/6552.a3840aa7da35ad68.js +0 -62
  705. package/apps/pwa/out/_next/static/chunks/6736.1e36d3ac5fa5e41d.js +0 -24
  706. package/apps/pwa/out/_next/static/chunks/6900.3ccbe069bdd4556a.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/71327eb4.add50b365f94bf3a.js +0 -122
  708. package/apps/pwa/out/_next/static/chunks/7136.deca3e3a2ddaa374.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/7139-ee9f8ed2677a40b3.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/7191.fdc955f7d96064a4.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/7423-e0aa5d9e2962120e.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/7453.afc1ea7e05d56a8c.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/7503-5e6a3d7fe67e4a0c.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/7761-476fd7bf768abd34.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/7975.eafb12097a0a9e62.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/8050-9b364bdef8f71927.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/8152.64e253c35cccfaae.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/8190.620f0231b3924bcb.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/8448.45b6b1f1a99eeb35.js +0 -104
  720. package/apps/pwa/out/_next/static/chunks/8464-e24f10451b658aac.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/8477.e4c944bb3aa5d2f3.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/8710.ca385257d5ca422e.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/8830.627ccf294ec2465c.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/8880.64c445592f04acaf.js +0 -1
  725. package/apps/pwa/out/_next/static/chunks/8981.c706964c8ba27aff.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/9053.bd0fffaff8d3f836.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/9161-c66e723d7ec9d682.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/9185.1ecdf9b65c0bb684.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/9356.fccd5f58086b4ff5.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/9446.dc0406109371d329.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/9506.dcf25d467a42627e.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/9541.eb8e2f8480c7feca.js +0 -93
  733. package/apps/pwa/out/_next/static/chunks/9577.ed7582186efa5482.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/9579.4a8169600fff2058.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/9642-ff2e039eb62e3b92.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/9659-8f2323348113ad80.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/9724.4c5623af2db43153.js +0 -34
  738. package/apps/pwa/out/_next/static/chunks/9869.81a1e24ca682d5a0.js +0 -1
  739. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-8d9d76ea322d855c.js +0 -1
  740. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed2c4e59f9f1fe21.js +0 -1
  741. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-2dc99e03c5d76ca0.js +0 -1
  742. package/apps/pwa/out/_next/static/chunks/app/board/page-b5a3a788330e920f.js +0 -1
  743. package/apps/pwa/out/_next/static/chunks/app/botlab/page-14949db884bfa672.js +0 -1
  744. package/apps/pwa/out/_next/static/chunks/app/bots/page-ea76c85b36388a97.js +0 -1
  745. package/apps/pwa/out/_next/static/chunks/app/ceo/page-01716d20af62d325.js +0 -1
  746. package/apps/pwa/out/_next/static/chunks/app/chat/page-62baf6881a64b1e9.js +0 -1
  747. package/apps/pwa/out/_next/static/chunks/app/consult/page-f89ba590c2af8afa.js +0 -1
  748. package/apps/pwa/out/_next/static/chunks/app/control/page-22f8b0f78d9637e5.js +0 -1
  749. package/apps/pwa/out/_next/static/chunks/app/decisions/page-817f9d7e6820be80.js +0 -1
  750. package/apps/pwa/out/_next/static/chunks/app/design-check/page-ffb9bc0d2650249a.js +0 -1
  751. package/apps/pwa/out/_next/static/chunks/app/editor/page-f6d0e64873c0f629.js +0 -1
  752. package/apps/pwa/out/_next/static/chunks/app/exec/page-8bfa0d4ba23a209d.js +0 -1
  753. package/apps/pwa/out/_next/static/chunks/app/field/page-f5060462249e32c7.js +0 -1
  754. package/apps/pwa/out/_next/static/chunks/app/healthz/route-8d9d76ea322d855c.js +0 -1
  755. package/apps/pwa/out/_next/static/chunks/app/inside/page-b2049f8b1ef79117.js +0 -1
  756. package/apps/pwa/out/_next/static/chunks/app/intake/page-1446c5fa93907f11.js +0 -1
  757. package/apps/pwa/out/_next/static/chunks/app/layout-b48a7a07c5204156.js +0 -1
  758. package/apps/pwa/out/_next/static/chunks/app/live/page-e974b8c4ca47614c.js +0 -1
  759. package/apps/pwa/out/_next/static/chunks/app/live-run/page-8a919b869bd28594.js +0 -1
  760. package/apps/pwa/out/_next/static/chunks/app/loops/page-d31b8de6bfcd72ed.js +0 -1
  761. package/apps/pwa/out/_next/static/chunks/app/market/page-64765f817909db29.js +0 -1
  762. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-d128c8569a36ee9b.js +0 -1
  763. package/apps/pwa/out/_next/static/chunks/app/morning/page-b2679d357e9b9270.js +0 -1
  764. package/apps/pwa/out/_next/static/chunks/app/not-found-6fabec98a9e7b269.js +0 -1
  765. package/apps/pwa/out/_next/static/chunks/app/observatory/page-048f30149dcf1349.js +0 -1
  766. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-9113181d6b5a2725.js +0 -1
  767. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-1e7a755a13227611.js +0 -1
  768. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3c8f8b67a203cf07.js +0 -1
  769. package/apps/pwa/out/_next/static/chunks/app/page-18032f5437215062.js +0 -1
  770. package/apps/pwa/out/_next/static/chunks/app/reflection/page-da3b739192fd0ee3.js +0 -1
  771. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d332545571bd6fd1.js +0 -1
  772. package/apps/pwa/out/_next/static/chunks/app/sessions/page-5237aa5b3f3b8ec5.js +0 -1
  773. package/apps/pwa/out/_next/static/chunks/app/settings/page-d16e56c3989c147e.js +0 -1
  774. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6b6593600869e2cd.js +0 -1
  775. package/apps/pwa/out/_next/static/chunks/app/setup/layout-8d9d76ea322d855c.js +0 -1
  776. package/apps/pwa/out/_next/static/chunks/app/setup/page-29e8b8a8396b55cb.js +0 -1
  777. package/apps/pwa/out/_next/static/chunks/app/share/page-b3414d856a1a7e2f.js +0 -1
  778. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c3affa52b7ce961b.js +0 -1
  779. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f21dddf9f95b6fab.js +0 -1
  780. package/apps/pwa/out/_next/static/chunks/app/term/page-f5a30a24745bf088.js +0 -1
  781. package/apps/pwa/out/_next/static/chunks/app/today/page-8c8569a09b4d4e34.js +0 -1
  782. package/apps/pwa/out/_next/static/chunks/app/trace/page-2ce32722c0243483.js +0 -1
  783. package/apps/pwa/out/_next/static/chunks/app/vault/page-4767b0d9c0a98c6c.js +0 -1
  784. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-116ee1339c387a75.js +0 -1
  785. package/apps/pwa/out/_next/static/chunks/app/workflows/page-35e8c50ca4ef7ffc.js +0 -1
  786. package/apps/pwa/out/_next/static/chunks/app/workspace/page-52e17113356bb891.js +0 -1
  787. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7458ae05ed2ac1a0.js +0 -1
  788. package/apps/pwa/out/_next/static/chunks/framework-ad6c9dd524ad6ef8.js +0 -1
  789. package/apps/pwa/out/_next/static/chunks/main-app-2ddd1f2b44d6aa59.js +0 -1
  790. package/apps/pwa/out/_next/static/chunks/main-e3d82bdc358d20c5.js +0 -1
  791. package/apps/pwa/out/_next/static/chunks/pages/_app-71d5aa3896e1655f.js +0 -1
  792. package/apps/pwa/out/_next/static/chunks/pages/_error-03ffc54e00438546.js +0 -1
  793. package/apps/pwa/out/_next/static/chunks/webpack-56bb89af5a611d0b.js +0 -1
  794. package/apps/pwa/out/_next/static/css/be9019f696217521.css +0 -1
  795. package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +0 -1
  796. /package/apps/pwa/out/_next/static/{GiOLWmt4MqDZePubBjA4Q → Om5xS9jpjSXJCeTNGYEi4}/_ssgManifest.js +0 -0
@@ -106,11 +106,12 @@ export function formatAutoMergeSuccessMessage(input: {
106
106
  import { GoalRunStore, insertGoalRunRecord, type GoalPriorRuns } from './goal-run-store.js';
107
107
  import { writeGoalRunRecordFragment } from './goal-execution-records.js';
108
108
  import { getUserConfig } from '../user-config.js';
109
- import { appendRunLedgerEntry, loadRunLedger, parseRunShardIdentity, queryRunChain, type RunChainShardSibling, type RunLedgerEntry, type RunLedgerWriter, type RunOriginData, type RunShardIdentity } from './run-ledger.js';
110
- import { classifyMergeHoldStop, classifyTerminalHarnessFailure, forgetRunStop, isRunStopClass, readRunStopRecord, recordRunStop, runStopRecorded } from './run-stop.js';
109
+ import { appendRunLedgerEntries, appendRunLedgerEntry, loadRunLedger, parseRunShardIdentity, pathSignatureOf, queryRunChain, runLedgerDir, type RunChainShardSibling, type RunLedgerBatchWriter, type RunLedgerEntry, type RunLedgerWriter, type RunOriginData, type RunShardIdentity } from './run-ledger.js';
110
+ import { buildRunStopTerminalEvidence, classifyMergeHoldStop, classifyTerminalHarnessFailure, forgetRunStop, isRunStopClass, readRunStopRecord, recordRunStop, runStopRecorded } from './run-stop.js';
111
111
  import { autohealFromStop, parseAutohealMode, pickAutohealAction, type AutohealActions, type AutohealResult } from './stop-autoheal.js';
112
112
  import { operationalAutohealActions } from './stop-autoheal-operational.js';
113
- import { recordParentNeedsOwnerVisit } from './doctor-visit.js';
113
+ import { recordParentNeedsOwnerVisit, runDoctorHandoff } from './doctor-visit.js';
114
+ import { readRunChart, recordRunChartDecision, RUN_DOCTOR_HANDOFF_INPUT_PREFIX } from './run-chart.js';
114
115
  import { emitSessionEvent, type SessionEventInput } from '../context-bus/session-events.js';
115
116
  import { decideLineageSupersede, lineageSupersedeCloseComment, type LineageSupersedeOpenDraft } from './lineage-supersede.js';
116
117
  import { basename, isAbsolute, join, relative, resolve, sep } from 'node:path';
@@ -227,7 +228,8 @@ import { formatGateFailedId, type PremiseReviewCard, type PremiseReviewInput } f
227
228
  import { runWorkflowToCompletion } from '../workflow-runtime/executor.js';
228
229
  import { mapReworkVerdict, supervisionObservationFields } from './supervision-vocabulary.js';
229
230
  import { resolveRunOutcome } from './run-outcome.js';
230
- import { authorLimitationCountFromGoal, authoredSignalExecution, harvestEvidenceLines, harvestedEvidenceObservation, MAX_HARVESTED_EVIDENCE_CHARS, parseOffDiffEvidence, judgeTddEvidence, requiredEvidenceFromGoal, createRequiredEvidenceBudget, coverRequiredEvidence, settleUncoveredEvidence, formatUncoveredEvidenceFeedback, type OffDiffEvidenceParse } from './off-diff-evidence.js';
231
+ import { authorLimitationCountFromGoal, authoredSignalExecution, harvestEvidenceLines, harvestedEvidenceObservation, MAX_HARVESTED_EVIDENCE_CHARS, parseOffDiffEvidence, judgeTddEvidence, receiveObservedTddRed, receiveObservedTddGreen, runTddBaseHeadTest, requiredEvidenceFromGoal, createRequiredEvidenceBudget, coverRequiredEvidence, settleUncoveredEvidence, formatUncoveredEvidenceFeedback, type OffDiffEvidenceParse } from './off-diff-evidence.js';
232
+ import type { TddRecordTag } from './tdd-evidence-tags.js';
231
233
  import { resolveEvidenceHeadCommit } from './evidence-command-budget.js';
232
234
  import { pressDecisionSignals, type DecisionSignalPressResult } from './decision-signal-press.js';
233
235
  import { inspectDecisionObservations, inspectDecisionSignalKinds, inspectDecisionSignalObservations } from '../../scripts/ask-marker-check.js';
@@ -319,6 +321,7 @@ import { createArtifactStore } from '../artifact/index.js';
319
321
  import { mapStageToRunStatus, type SelfImplementStage } from './run-status-mapping.js';
320
322
  import type { LifecycleScreenComparison } from './lifecycle-screen-scoreboard.js';
321
323
  import { buildRuntimeOverlayState } from './graph-overlay-condition.js';
324
+ import { runtimeOverlayRunSteps } from './runtime-overlay-run-steps.js';
322
325
  import { activeTemplate, decideTemplate, graphAuthorityFields, nodeNameForStage, overlayDecisionObservation, resolveGraphAuthorityForUserConfig, routeGate, visitBudgetOf } from './graph-authority.js';
323
326
  import type { GraphTemplate } from './graph-templates.js';
324
327
  import { defaultOverlaysDir, loadGraphOverlays, type GraphOverlaySpec } from './graph-overlay-yaml.js';
@@ -356,6 +359,9 @@ import {
356
359
  } from '../ask-user-question/tool.js';
357
360
  import { acquireClarificationResolverLease, decideClarificationResolverInstall } from './clarification-resolver-lease.js';
358
361
  import { inspectCodexRotation } from '../oauth/codex-account-store.js';
362
+ import { resolveGrokCredential } from '../grok/credential.js';
363
+ import { resolveChildLlmPreference } from './child-llm-preference.js';
364
+ import { reselectChildForRework } from './rework-child-provider.js';
359
365
  import { resolveDefaultProvider } from '../llm.js';
360
366
  import { createWidgetAskUserResolver } from '../expression/widget/adapters/ask-user-resolver.js';
361
367
  import { createNodeReadlineHost } from '../expression/widget/readline-host.js';
@@ -1064,6 +1070,8 @@ export type ImplementTerminalStatus = {
1064
1070
  export interface SelfImplementSeams {
1065
1071
  /** Run-observer ledger sink. Tests inject an in-memory sink to avoid touching user state. */
1066
1072
  writeRunLedger?: RunLedgerWriter;
1073
+ /** Atomic sink for one accepted runtime graph overlay's structural event batch. */
1074
+ writeRunLedgerBatch?: RunLedgerBatchWriter;
1067
1075
  checkUnwiredExports?: typeof findUnwiredExports;
1068
1076
  /** STOP-AUTOHEAL — heal action seams (live mode only runs actions given here; missing = needs-owner). */
1069
1077
  stopAutohealActions?: AutohealActions;
@@ -1077,6 +1085,8 @@ export interface SelfImplementSeams {
1077
1085
  emitContextEvent?: (input: SessionEventInput) => void;
1078
1086
  /** Registers this run as an ephemeral loop-agent asset; failures are observed but never affect execution. */
1079
1087
  registerLoopAgent?: (input: LoopAgentInput) => void;
1088
+ /** Executes a persisted run-doctor supervisor handoff; injectable to verify the parent delivery route. */
1089
+ runDoctorHandoff?: typeof runDoctorHandoff;
1080
1090
  /** Wraps implementation and gate promises with their effective wall-clock timeout; tests observe the actual stage budgets. */
1081
1091
  withStepTimeout?: <T>(promise: Promise<T>, ms: number, step: keyof StepTimeouts) => Promise<T>;
1082
1092
  /** Samples the one-minute machine load at the end of a gate observation. */
@@ -1222,6 +1232,8 @@ export interface SelfImplementSeams {
1222
1232
  headCommit?: (cwd: string) => string | undefined;
1223
1233
  /** Test seam for required evidence command execution; production uses its bounded shell runner. */
1224
1234
  evidenceCommandRunner?: (command: string, cwd: string) => Pick<ReturnType<typeof spawnSync>, 'status' | 'stdout' | 'stderr' | 'error'>;
1235
+ /** Replays the goal's changed Bun test on base and head when child RED output is absent. */
1236
+ runTddBaseHeadTest?: typeof runTddBaseHeadTest;
1225
1237
  /** `commit` pins the pushed state; without it the worktree HEAD is pushed. */
1226
1238
  preserveBlockedBranch?: (ctx: { cwd: string; branch: string; title: string; commit?: string }) => boolean | Promise<boolean>;
1227
1239
  /** DRAFT-NOT-ARCHIVE — `tools.selfImplement.draftOnStop` 읽기 seam. 생략하면 user-config(실패·부재 = 'always' · 종전). */
@@ -2208,6 +2220,8 @@ export interface SelfImplementOptions {
2208
2220
  runId?: string;
2209
2221
  /** Authored goal document's stable identity, carried into self-implement observations when present. */
2210
2222
  goalId?: string;
2223
+ /** Stable heal-cell identity propagated across supervisor reauthor retries. */
2224
+ healCellKey?: string;
2211
2225
  /** Optional opaque ID for joining this request with correlated execution records. */
2212
2226
  correlationId?: string;
2213
2227
  /** Optional opaque ID for the parent correlation in a nested request. */
@@ -2398,7 +2412,9 @@ export interface SelfImplementResult {
2398
2412
  /** Additive hard-cap disposition; outcome remains the stable public terminal contract. */
2399
2413
  salvage?: 'launched' | 'parked';
2400
2414
  /** Rework stopped on exclusively baseline/flaky/precondition failures; do not retry this goal against the same base. */
2401
- terminationReason?: 'blocked-by-baseline' | 'goal-only-rework-exhausted';
2415
+ terminationReason?: 'blocked-by-baseline' | 'goal-only-rework-exhausted' | 'tdd-evidence-missing';
2416
+ /** Structured TDD failure survives child JSON/result truncation and parent-ledger mapping. */
2417
+ tddEvidenceFailure?: { reason: 'tdd-evidence-missing'; round: number; missing: readonly TddRecordTag[] };
2402
2418
  sessionId?: string;
2403
2419
  worktreePath?: string;
2404
2420
  branch?: string;
@@ -2887,6 +2903,8 @@ type BlockedDraftPrState = {
2887
2903
  childSummaryArtifact?: ChildSummaryArtifactRef;
2888
2904
  terminalStatus?: ImplementTerminalStatus;
2889
2905
  planRevision?: ReworkPlanRevision;
2906
+ stopStage?: string;
2907
+ stopClass?: ReturnType<typeof classifyTerminalHarnessFailure>;
2890
2908
  /** Classifier output for this unfinished run. Omitted means the cause was not classified. */
2891
2909
  abandonedClassification?: AbandonedClassificationResult;
2892
2910
  };
@@ -2901,29 +2919,39 @@ export type BlockedDraftClassificationRecord = {
2901
2919
  readonly classification: string;
2902
2920
  readonly classificationBasis: string;
2903
2921
  readonly worktreeClean: boolean | null;
2922
+ readonly stop: { readonly class: ReturnType<typeof classifyTerminalHarnessFailure>; readonly stage: string };
2904
2923
  };
2905
2924
 
2906
2925
  export function blockedDraftClassificationRecord(
2907
2926
  classification: AbandonedClassificationResult | undefined,
2927
+ stop: { readonly stage?: string; readonly class?: ReturnType<typeof classifyTerminalHarnessFailure> } = {},
2908
2928
  ): BlockedDraftClassificationRecord {
2929
+ const stage = typeof stop.stage === 'string' && stop.stage.trim() ? stop.stage : 'unknown';
2930
+ const stopClass = stop.class ?? classifyTerminalHarnessFailure({
2931
+ stage,
2932
+ ...(classification ? { abandonedClassification: classification.classification } : {}),
2933
+ });
2909
2934
  if (!classification) {
2910
2935
  return {
2911
2936
  classification: BLOCKED_DRAFT_UNCLASSIFIED_CLASSIFICATION,
2912
2937
  classificationBasis: BLOCKED_DRAFT_UNCLASSIFIED_CLASSIFICATION,
2913
2938
  worktreeClean: null,
2939
+ stop: { class: stopClass, stage },
2914
2940
  };
2915
2941
  }
2916
2942
  return {
2917
2943
  classification: classification.classification,
2918
2944
  classificationBasis: classification.classificationBasis,
2919
2945
  worktreeClean: classification.worktreeClean ?? null,
2946
+ stop: { class: stopClass, stage },
2920
2947
  };
2921
2948
  }
2922
2949
 
2923
2950
  export function formatBlockedDraftClassificationSection(
2924
2951
  classification: AbandonedClassificationResult | undefined,
2952
+ stop: { readonly stage?: string; readonly class?: ReturnType<typeof classifyTerminalHarnessFailure> } = {},
2925
2953
  ): string[] {
2926
- const record = blockedDraftClassificationRecord(classification);
2954
+ const record = blockedDraftClassificationRecord(classification, stop);
2927
2955
  const human = record.classification === BLOCKED_DRAFT_UNCLASSIFIED_CLASSIFICATION
2928
2956
  ? `${record.classification} (분류를 못 함)`
2929
2957
  : record.classification;
@@ -2934,6 +2962,8 @@ export function formatBlockedDraftClassificationSection(
2934
2962
  `- classification: ${record.classification}`,
2935
2963
  `- classificationBasis: ${record.classificationBasis}`,
2936
2964
  `- worktreeClean: ${worktreeCleanText}`,
2965
+ `- stop.class: ${record.stop.class}`,
2966
+ `- stop.stage: ${record.stop.stage}`,
2937
2967
  '',
2938
2968
  '```json',
2939
2969
  JSON.stringify(record),
@@ -2959,7 +2989,7 @@ function blockedDraftPrBody(feature: string, implSummary: string, state: Blocked
2959
2989
  ...(state.childSummaryArtifact ? [`- child summary artifact: ${state.childSummaryArtifact.path}`] : []),
2960
2990
  ...(state.terminalStatus ? [`- child terminal status: reached=${state.terminalStatus.reached}; changed=${state.terminalStatus.changed}; toolCalls=${state.terminalStatus.toolCalls}; timedOut=${state.terminalStatus.timedOut}`] : []),
2961
2991
  '',
2962
- ...formatBlockedDraftClassificationSection(state.abandonedClassification),
2992
+ ...formatBlockedDraftClassificationSection(state.abandonedClassification, { stage: state.stopStage, class: state.stopClass }),
2963
2993
  '',
2964
2994
  '## 미배달 감독 수리 지시',
2965
2995
  ...(state.undeliveredSupervisorInputs.length
@@ -3095,10 +3125,12 @@ export function assembleBlockedDraftPrBody(
3095
3125
  persist?: SelfImplementSeams['persistPrBodyArtifact'],
3096
3126
  ): { body: string; truncated: boolean; originalChars: number } {
3097
3127
  const raw = blockedDraftPrBody(feature, implSummary, state, goalFile);
3098
- const classificationRecord = blockedDraftClassificationRecord(state.abandonedClassification);
3128
+ const classificationRecord = blockedDraftClassificationRecord(state.abandonedClassification, { stage: state.stopStage, class: state.stopClass });
3099
3129
  const essentialSuffix = [
3100
3130
  `- reason: ${state.reason}`,
3101
3131
  `- classification: ${classificationRecord.classification}`,
3132
+ `- stop.class: ${classificationRecord.stop.class}`,
3133
+ `- stop.stage: ${classificationRecord.stop.stage}`,
3102
3134
  JSON.stringify(classificationRecord),
3103
3135
  ...(state.reasonTruncated ? ['- reason truncated: true'] : []),
3104
3136
  ...(state.terminalStatus ? [`- child terminal status: reached=${state.terminalStatus.reached}; changed=${state.terminalStatus.changed}; toolCalls=${state.terminalStatus.toolCalls}; timedOut=${state.terminalStatus.timedOut}`] : []),
@@ -3580,6 +3612,9 @@ async function autohealRecordedStop(stopEntry: RunLedgerEntry, s: SelfImplementS
3580
3612
  try {
3581
3613
  const record = readRunStopRecord(stopEntry);
3582
3614
  if (!record) return;
3615
+ const chartDir = runLedgerDir();
3616
+ const chartBefore = readRunChart(stopEntry.runId, 'macrophage', chartDir);
3617
+ const chartStopKey = JSON.stringify([stopEntry.timestamp, record.site ?? '', record.class, record.cause, record.evidenceRef]);
3583
3618
  try { debug.log('harness.heal', 'symptom', { runId: stopEntry.runId, class: record.class, cause: record.cause, evidenceRef: record.evidenceRef }); } catch { /* observation is fail-soft */ }
3584
3619
  const pick = pickAutohealAction(record.class);
3585
3620
  try { debug.log('harness.heal', 'prescription', { runId: stopEntry.runId, class: record.class, action: pick.action, source: pick.source, ...(pick.overlayId ? { overlayId: pick.overlayId } : {}) }); } catch { /* observation is fail-soft */ }
@@ -3596,10 +3631,13 @@ async function autohealRecordedStop(stopEntry: RunLedgerEntry, s: SelfImplementS
3596
3631
  ...(s?.writeRunLedger ? { writeLedger: s.writeRunLedger } : {}),
3597
3632
  });
3598
3633
  try { debug.log('harness.heal', 'outcome', { runId: stopEntry.runId, class: result.class, action: result.action, mode: result.mode, outcome: result.outcome, ...(result.reason ? { reason: result.reason } : {}), ...(result.detail ? { detail: result.detail } : {}) }); } catch { /* observation is fail-soft */ }
3634
+ recordRunChartDecision({ runId: stopEntry.runId, device: 'macrophage', stopKey: chartStopKey,
3635
+ observed: `${record.class}: ${record.cause}`, verdict: result.action, action: result.outcome,
3636
+ handoff: result.action === 'needs-owner' ? 'outer-supervisor' : null,
3637
+ why: result.reason ?? result.detail ?? record.cause, readStopKeys: chartBefore.map((cell) => cell.stopKey), dir: chartDir });
3599
3638
  if (result.action === 'needs-owner') {
3600
3639
  try {
3601
- const stopKey = JSON.stringify([stopEntry.timestamp, record.site ?? '', record.class, record.cause, record.evidenceRef]);
3602
- const visit = recordParentNeedsOwnerVisit({ runId: stopEntry.runId, stopKey, evidence: result.reason ?? record.cause });
3640
+ const visit = recordParentNeedsOwnerVisit({ runId: stopEntry.runId, stopKey: chartStopKey, evidence: result.reason ?? record.cause });
3603
3641
  if (visit.status === 'missing-ledger') {
3604
3642
  debug.log('run-doctor', 'visit-failed', { runId: stopEntry.runId, from: 'parent', symptom: 'needs-owner', error: 'run-ledger-missing' });
3605
3643
  }
@@ -3626,11 +3664,23 @@ async function dispatchTerminalHarnessHeal(input: {
3626
3664
  if (runStopRecorded(runId)) return;
3627
3665
  const stopClass = mergeHeld ? classifyMergeHoldStop(result.mergeReason) : classifyTerminalHarnessFailure({
3628
3666
  stage: result.stage,
3667
+ cause: result.detail,
3629
3668
  mergeReason: result.mergeReason,
3630
3669
  abandonedClassification: result.abandonedClassification?.classification,
3631
3670
  providerErrorCategory: result.providerErrors?.category,
3632
3671
  supervisorVerdict: result.supervisorVerdict,
3633
3672
  });
3673
+ let priorLedger: RunLedgerEntry[] = [];
3674
+ try { priorLedger = loadRunLedger(runId) ?? []; } catch { /* terminal observation must not change the run result */ }
3675
+ const terminalEvidence = buildRunStopTerminalEvidence({
3676
+ stage: result.stage,
3677
+ node: result.node,
3678
+ outcome: result.outcome,
3679
+ detail: result.detail,
3680
+ terminationReason: result.terminationReason,
3681
+ providerErrorCategory: result.providerErrors?.category,
3682
+ entries: priorLedger,
3683
+ });
3634
3684
  let stopEntry: RunLedgerEntry | undefined;
3635
3685
  try {
3636
3686
  stopEntry = recordRunStop({
@@ -3639,9 +3689,11 @@ async function dispatchTerminalHarnessHeal(input: {
3639
3689
  shardIdentity,
3640
3690
  site: mergeHeld ? 'merge-hold' : `terminal-${result.stage}`,
3641
3691
  class: stopClass,
3642
- cause: mergeHeld ? `merge held: ${result.mergeReason}` : result.detail ?? `terminal failure: ${result.stage}`,
3692
+ // Never copy free-form provider/child text into the durable stop summary.
3693
+ cause: mergeHeld ? `merge held: ${result.mergeReason}` : `terminal failure: ${result.stage}; ${terminalEvidence.reasonCode}`,
3643
3694
  evidenceRef: result.prUrl ?? `run-ledger:${runId}:${result.stage}`,
3644
3695
  nextMove: `Existing heal ladder: ${stopClass}; failure disposition remains until its prescribed action resolves`,
3696
+ terminalEvidence,
3645
3697
  }, seams.writeRunLedger ?? appendRunLedgerEntry);
3646
3698
  } catch { /* stop observation cannot change the run outcome */ }
3647
3699
  if (stopEntry) await autohealRecordedStop(stopEntry, seams);
@@ -4175,6 +4227,49 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
4175
4227
  unjoinedNodes: unjoined,
4176
4228
  }, { category: 'graph.path' });
4177
4229
  }
4230
+ if (runGraphTemplate?.graphId === 'self-implement') {
4231
+ const profileIds = new Set<string>();
4232
+ let journeyEvidenceStatus: 'read' | 'missing' | 'read-error' = 'missing';
4233
+ let journeyEvidenceError: string | undefined;
4234
+ const journeySteps: Array<{ from: string; to: string; skipped?: string[] }> = [];
4235
+ try {
4236
+ // `recordJourneyEdge` appends graph.path synchronously to the canonical run ledger.
4237
+ // Reading that same append boundary avoids a potentially lagging debug LogStore mirror.
4238
+ const entries = loadRunLedger(runId, runLedgerDir());
4239
+ if (entries !== null) {
4240
+ journeyEvidenceStatus = 'read';
4241
+ for (const entry of entries) {
4242
+ if (entry.event !== 'graph.path') continue;
4243
+ const data = entry.data;
4244
+ if (Array.isArray(data.profileIds)) for (const id of data.profileIds) if (typeof id === 'string') profileIds.add(id);
4245
+ if (data.event !== 'edge-taken' || typeof data.from !== 'string' || typeof data.taken !== 'string') continue;
4246
+ const skipped = Array.isArray(data.skippedNodes)
4247
+ ? data.skippedNodes.flatMap((item) => item && typeof item === 'object'
4248
+ && typeof (item as { node?: unknown }).node === 'string' ? [(item as { node: string }).node] : [])
4249
+ : [];
4250
+ journeySteps.push({ from: data.from, to: data.taken, ...(skipped.length > 0 ? { skipped } : {}) });
4251
+ }
4252
+ }
4253
+ } catch (error) {
4254
+ journeyEvidenceStatus = 'read-error';
4255
+ journeyEvidenceError = error instanceof Error ? error.message : String(error);
4256
+ }
4257
+ const pathBasis = 'self-implement-pipeline-and-journey-v1';
4258
+ const pipelineNodes = traversedNodes.map(String);
4259
+ const pipelineSteps = pipelineNodes.slice(1).map((to, index) => ({ from: pipelineNodes[index]!, to }));
4260
+ const pathSteps = [...pipelineSteps, ...journeySteps];
4261
+ const visitedNodes = [
4262
+ ...pipelineNodes,
4263
+ ...journeySteps.flatMap((step) => [step.from, ...(step.skipped ?? []), step.to]),
4264
+ ];
4265
+ const pathSignature = pathSignatureOf(pathSteps);
4266
+ observeOuter('path-signature', {
4267
+ ...graphIdentityOf(runGraphTemplate), ...journeyJoinFields(), pathBasis,
4268
+ profileIds: [...profileIds].sort(), pathSignature, pathSteps, visitedNodes,
4269
+ journeyEdgeCount: journeySteps.length,
4270
+ journeyEvidenceStatus, ...(journeyEvidenceError ? { journeyEvidenceError } : {}),
4271
+ }, { category: 'graph.path' });
4272
+ }
4178
4273
  try {
4179
4274
  const checked = terminalNode
4180
4275
  ? (opts.seams.checkPipelineTraversal ?? checkPipelineTraversal)(traversedNodes, terminalNode)
@@ -4661,6 +4756,10 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
4661
4756
  summary: reworkCap
4662
4757
  ? reworkCapFailureSummary(opts.feature, reworkCap)
4663
4758
  : opts.feature.split(/\r?\n/, 1)[0]?.trim() || `Harness run ${runId} failed`,
4759
+ goalText: opts.feature,
4760
+ ...(opts.goalId ? { goalId: opts.goalId } : {}),
4761
+ ...(opts.goalFile ? { goalFile: opts.goalFile } : {}),
4762
+ ...(opts.healCellKey ? { cellKey: opts.healCellKey } : {}),
4664
4763
  at: new Date().toISOString(),
4665
4764
  });
4666
4765
  }
@@ -4865,6 +4964,7 @@ export function attachAbandonedClassification(
4865
4964
  ...(credentialFailure ? { credentialFailure: true } : {}),
4866
4965
  ...(providerError ? { providerError: true } : {}),
4867
4966
  ...(providerError && result.providerErrors?.category ? { providerErrorCategory: result.providerErrors.category } : {}),
4967
+ ...(result.terminationReason === 'tdd-evidence-missing' ? { terminationReason: result.terminationReason } : {}),
4868
4968
  worktreePorcelain: worktree.worktreePorcelain,
4869
4969
  ...(worktree.gitResidue ? { gitResidue: worktree.gitResidue } : {}),
4870
4970
  ...(result.completionDisposition ? { completionDisposition: result.completionDisposition } : {}),
@@ -4899,6 +4999,7 @@ export function observeRunOutcome(
4899
4999
  worktreePath: SelfImplementResult['worktreePath'] | undefined;
4900
5000
  review: SelfImplementResult['review'] | undefined;
4901
5001
  completionDisposition: SelfImplementResult['completionDisposition'] | undefined;
5002
+ terminationReason?: SelfImplementResult['terminationReason'];
4902
5003
  supervisorVerdict: SelfImplementResult['supervisorVerdict'] | undefined;
4903
5004
  goalCauseObserved?: SelfImplementResult['goalCauseObserved'];
4904
5005
  mergeApprovalReceived: SelfImplementResult['mergeApprovalReceived'] | undefined;
@@ -4940,6 +5041,7 @@ export function observeRunOutcome(
4940
5041
  ...(result.quotaExhaustionAssessment?.exhausted ? { quotaExhausted: true } : {}),
4941
5042
  ...(result.quotaExhaustionAssessment?.accountAvailability ? { quotaAccountAvailability: result.quotaExhaustionAssessment.accountAvailability } : {}),
4942
5043
  ...(result.providerErrors?.category ? { providerError: true, providerErrorCategory: result.providerErrors.category } : {}),
5044
+ ...(result.terminationReason === 'tdd-evidence-missing' ? { terminationReason: result.terminationReason } : {}),
4943
5045
  stage: result.stage,
4944
5046
  reviewResultObserved: result.review !== undefined,
4945
5047
  mustFixReported: (result.review?.mustFix.length ?? 0) > 0,
@@ -5287,6 +5389,7 @@ async function runSelfImplementInner(
5287
5389
  if (graphAuthority.enabled) onGraphTemplateResolved(graphTemplate);
5288
5390
  // ⛔ 선택을 «전부» 싣는다 — 얹힌 것만 실으면 「왜 안 얹혔나」를 사후에 못 묻는다.
5289
5391
  let reviewRepeat: number | undefined;
5392
+ const recordedRuntimeStructuralSteps = new Set<string>();
5290
5393
  /** ⭐ ③ «다이나믹» — 라운드마다 runtime 오버레이를 다시 고른다.
5291
5394
  * ⛔ **매번 «기준 선언»에서 다시 얹는다** — 이전 라운드 결과 위에 겹쳐 얹으면
5292
5395
  * 「이 걸음을 무엇이 만들었나」가 «누적»이 되어 사후에 못 푼다.
@@ -5307,6 +5410,7 @@ async function runSelfImplementInner(
5307
5410
  ...(stopClass === undefined ? {} : { stopClass }),
5308
5411
  ...(reviewRepeat === undefined ? {} : { reviewRepeat }),
5309
5412
  });
5413
+ const beforeRuntimeGraph = graphTemplate;
5310
5414
  const decision = decideTemplate({
5311
5415
  goalType: graphGoalType,
5312
5416
  authority: graphAuthority,
@@ -5315,7 +5419,41 @@ async function runSelfImplementInner(
5315
5419
  stage: 'runtime',
5316
5420
  ...(variantSpec ? { specs: { [variantSpec.graphId]: variantSpec } } : {}),
5317
5421
  });
5318
- if (decision.appliedIds.length > 0) graphTemplate = decision.template;
5422
+ if (decision.appliedIds.length > 0) {
5423
+ graphTemplate = decision.template;
5424
+ const structuralEvents = runtimeOverlayRunSteps({
5425
+ runId: runIdentity.runId,
5426
+ timestamp: new Date().toISOString(),
5427
+ before: beforeRuntimeGraph,
5428
+ after: graphTemplate,
5429
+ overlayIds: decision.appliedIds,
5430
+ round,
5431
+ });
5432
+ const pendingStructuralEvents = structuralEvents.map((entry) => ({
5433
+ entry,
5434
+ key: entry.event === 'node-added'
5435
+ ? `${entry.event}:${entry.data.node}`
5436
+ : `${entry.event}:${entry.data.from}:${entry.data.outcome}:${entry.data.was}:${entry.data.to}`,
5437
+ })).filter(({ key }) => !recordedRuntimeStructuralSteps.has(key));
5438
+ if (pendingStructuralEvents.length > 0) {
5439
+ try {
5440
+ const batch = pendingStructuralEvents.map(({ entry }) => entry);
5441
+ if (opts.seams.writeRunLedgerBatch) opts.seams.writeRunLedgerBatch(batch);
5442
+ else if (opts.seams.writeRunLedger) for (const entry of batch) opts.seams.writeRunLedger(entry);
5443
+ else appendRunLedgerEntries(batch);
5444
+ for (const { key } of pendingStructuralEvents) recordedRuntimeStructuralSteps.add(key);
5445
+ } catch (error) {
5446
+ const first = pendingStructuralEvents[0]!.entry;
5447
+ observe('graph-overlay-step-write-failed', {
5448
+ runId: runIdentity.runId,
5449
+ round,
5450
+ event: first.event,
5451
+ events: pendingStructuralEvents.map(({ entry }) => entry.event),
5452
+ error: error instanceof Error ? error.message : String(error),
5453
+ });
5454
+ }
5455
+ }
5456
+ }
5319
5457
  // ⭐ SELFIMPL-NODE-SEAMS-BACK — 같은 NodeContext 가 라운드로 이어진다: 체크포인트를 옮기고,
5320
5458
  // 부품이 도는 중에 다른 판으로 바뀌었으면 그 사실을 값으로 낸다(걸음과 신원이 갈리는 것을 막는다).
5321
5459
  if (nodeContext !== undefined) {
@@ -5690,8 +5828,8 @@ async function runSelfImplementInner(
5690
5828
  // 거짓 표시한다 · 리뷰 4R). 수확본이 비면 **요약에서 수확**한다 — 요약 원문을 통째로 싣지 않는다.
5691
5829
  const harvestedForPr = (): string | undefined => {
5692
5830
  if (!impl) return undefined;
5693
- const fromChild = impl.evidenceTranscript?.trim() ? impl.evidenceTranscript : undefined;
5694
- const picked = fromChild ?? harvestEvidenceLines(impl.summary);
5831
+ const fromChild = impl.evidenceTranscript?.trim() ? harvestEvidenceLines(impl.evidenceTranscript) : undefined;
5832
+ const picked = fromChild?.trim() ? fromChild : harvestEvidenceLines(impl.summary);
5695
5833
  return picked.trim() ? picked : undefined;
5696
5834
  };
5697
5835
  let offDiffEvidence: OffDiffEvidenceParse = { items: [], discardedMissingVerify: 0, discardedEmptyClaim: 0, missingResult: 0, orphanResult: 0, truncatedResult: 0, anchoredEvidence: 0 };
@@ -6112,6 +6250,7 @@ async function runSelfImplementInner(
6112
6250
  };
6113
6251
  let preservationBase = wt.resolvedBase;
6114
6252
  const runProviderName = opts.childLlm?.provider ?? (s.currentProviderName?.() ?? currentProviderName());
6253
+ let activeChildLlm = opts.childLlm;
6115
6254
  let cachedQuotaExhaustionAssessment: QuotaExhaustionAssessment | undefined;
6116
6255
  const quotaExhaustionAssessmentForRun = (): QuotaExhaustionAssessment => {
6117
6256
  cachedQuotaExhaustionAssessment ??= readQuotaExhausted(s.inspectCodexRotation, runProviderName);
@@ -6161,6 +6300,7 @@ async function runSelfImplementInner(
6161
6300
  };
6162
6301
  let blockedDraftNoChanges = false;
6163
6302
  let blockedDraftPrFailure: string | undefined;
6303
+ let blockedDraftPrFailureKind: 'blocked-draft-pr-guard' | undefined;
6164
6304
  let repairLink: { originalPr: number; salvageRef: string } | undefined;
6165
6305
  const reviewBlockedResult = (pr: { url: string; number: number } | undefined) => ({
6166
6306
  stage: blockedDraftNoChanges && podReviewBlockedDraft ? 'no-changes' as const : podReviewBlockedDraft && !pr ? 'aborted' as const : 'review-blocked' as const,
@@ -6231,14 +6371,26 @@ async function runSelfImplementInner(
6231
6371
  observe('blocked-draft-decision-signal-failed', { stage, error: decisionSignalObservation.error }, { level: 'warn' });
6232
6372
  }
6233
6373
  const abandonedClassification = classifyUnfinishedRun(stage, verdict, decomposition);
6234
- const classificationRecord = blockedDraftClassificationRecord(abandonedClassification);
6374
+ const stopClass = classifyTerminalHarnessFailure({
6375
+ stage,
6376
+ abandonedClassification: abandonedClassification.classification,
6377
+ ...(verdict ? { supervisorVerdict: verdict } : {}),
6378
+ });
6379
+ const classificationRecord = blockedDraftClassificationRecord(abandonedClassification, { stage, class: stopClass });
6235
6380
  observe('blocked-draft-classification', {
6236
6381
  stage,
6237
6382
  ...classificationRecord,
6238
6383
  }, { level: 'warn' });
6384
+ observe('draft-stop-classified', {
6385
+ stage,
6386
+ stop: classificationRecord.stop,
6387
+ classification: classificationRecord.classification,
6388
+ classificationBasis: classificationRecord.classificationBasis,
6389
+ }, { level: 'warn' });
6239
6390
  const observation = {
6240
6391
  branch: wt.branch,
6241
6392
  stage,
6393
+ stopClass: classificationRecord.stop.class,
6242
6394
  verdict: verdict ?? null,
6243
6395
  reason: reason.slice(0, 240),
6244
6396
  rounds: round,
@@ -6281,6 +6433,8 @@ async function runSelfImplementInner(
6281
6433
  reason,
6282
6434
  rounds: round,
6283
6435
  undeliveredSupervisorInputs: undeliveredSupervisorInputSnapshot(),
6436
+ stopStage: stage,
6437
+ stopClass,
6284
6438
  abandonedClassification,
6285
6439
  ...(decomposition ? { decomposition } : {}),
6286
6440
  ...(harvestedForPr() ? { evidence: harvestedForPr() as string } : {}),
@@ -6552,6 +6706,9 @@ async function runSelfImplementInner(
6552
6706
  ...(artifactPath ? { prBodyArtifactPath: artifactPath } : {}),
6553
6707
  ...(artifactError ? { prBodyArtifactError: artifactError } : {}),
6554
6708
  }, { level: 'warn' });
6709
+ blockedDraftPrFailureKind = /self-implement PR guard 실패/.test(prError) && /(?:same-cell|goal-only)/.test(prError)
6710
+ ? 'blocked-draft-pr-guard' : undefined;
6711
+ blockedDraftPrFailure = `draft PR 생성 실패: ${prError}`;
6555
6712
  // STOP-RECORD: a failed blocked-draft PR open (e.g. same-branch rerun with a PR already open) left no stop reason.
6556
6713
  let draftStopEntry: RunLedgerEntry | undefined;
6557
6714
  try {
@@ -7240,7 +7397,38 @@ async function runSelfImplementInner(
7240
7397
  if (fabricObservation) observe('rework-budget-fabric-shadow', fabricObservation);
7241
7398
  }
7242
7399
  } catch (error) {
7243
- if (judgmentStarted) throw error;
7400
+ if (judgmentStarted) {
7401
+ const failureKind = classifyReviewProviderFailure(safeErrorDescription(error));
7402
+ if (failureKind === 'credentials-unavailable') {
7403
+ const blockedStage = isReviewRework(reworkKind) ? 'review-blocked' : 'gate-failed';
7404
+ const reason = 'rework skipped: provider credentials unavailable';
7405
+ observe('rework-skipped-provider-unavailable', { round, kind: reworkKind, reason: failureKind }, { level: 'warn' });
7406
+ finalizeSupervisorDeliveries('rework-provider-credentials-unavailable');
7407
+ if (blockedStage === 'review-blocked') recordPendingReviewTriage('follow-up', 'review-blocked', effectiveMax);
7408
+ const pr = await preserveBlockedArtifacts({
7409
+ stage: blockedStage,
7410
+ reason,
7411
+ gate,
7412
+ failureKind,
7413
+ salvageStatusExpected: false,
7414
+ });
7415
+ const common = {
7416
+ ok: false as const,
7417
+ node: 'rework' as const,
7418
+ ...resolveRunOutcome({ termination: 'abandoned' }),
7419
+ sessionId,
7420
+ worktreePath: wt.path,
7421
+ branch: wt.branch,
7422
+ gate,
7423
+ ...(review ? { review } : {}),
7424
+ quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(),
7425
+ };
7426
+ return blockedStage === 'review-blocked'
7427
+ ? { ...common, ...reviewBlockedResult(pr), detail: reason }
7428
+ : { ...common, stage: 'gate-failed' as const, ...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: reason };
7429
+ }
7430
+ throw error;
7431
+ }
7244
7432
  consecutiveUnresolvedBudget = 0;
7245
7433
  }
7246
7434
  } else if (round > 0) {
@@ -7513,6 +7701,29 @@ async function runSelfImplementInner(
7513
7701
  let supervisorInputClosed = false;
7514
7702
  const closeSupervisorInput = (): void => { supervisorInputClosed = true; };
7515
7703
  try {
7704
+ if (round > 0 && activeChildLlm?.provider === 'grok') {
7705
+ const { readGrokQuotaForLaunch, defaultChildLlmModel } = await import('../self-dev/dev-cli.js');
7706
+ const grokQuota = readGrokQuotaForLaunch();
7707
+ const grokCredential = resolveGrokCredential() ? 'available' as const : 'unavailable' as const;
7708
+ let codexRotation: ReturnType<typeof inspectCodexRotation> | undefined;
7709
+ try { codexRotation = (s.inspectCodexRotation ?? inspectCodexRotation)(); } catch { codexRotation = undefined; }
7710
+ const preference = resolveChildLlmPreference(getUserConfig());
7711
+ const alternateSlot = preference.chain.find((slot) => slot.provider === 'openai-codex' && slot.provider !== activeChildLlm!.provider);
7712
+ const hasCodexCredential = (codexRotation?.knownAccountCount ?? 0) > 0;
7713
+ const codexQuota = readQuotaExhausted(s.inspectCodexRotation, 'openai-codex');
7714
+ const alternate = hasCodexCredential ? {
7715
+ provider: 'openai-codex', model: alternateSlot?.model ?? defaultChildLlmModel('openai-codex'), source: 'config' as const,
7716
+ } : undefined;
7717
+ const decision = reselectChildForRework({ current: activeChildLlm, grokQuota, grokCredential,
7718
+ ...(alternate ? { alternate } : {}), alternateCredential: hasCodexCredential ? 'available' : 'unavailable',
7719
+ alternateQuotaExhausted: codexQuota.exhausted });
7720
+ if (decision.action === 'reselect') {
7721
+ activeChildLlm = decision.selection;
7722
+ observe('rework-child-model-reselected', { round, previousProvider: decision.previous.provider, previousModel: decision.previous.model,
7723
+ provider: activeChildLlm.provider, model: activeChildLlm.model, reason: decision.reason, quota: grokQuota,
7724
+ grokCredential, alternateQuotaExhausted: codexQuota.exhausted ?? null });
7725
+ }
7726
+ }
7516
7727
  implementPromise = s.implement({
7517
7728
  sessionId, cwd: wt.path, feature, runId, shardIdentity, signal: implementAbortController.signal,
7518
7729
  ...(harnessSeededPaths.length ? { harnessSeededPaths } : {}),
@@ -7525,6 +7736,31 @@ async function runSelfImplementInner(
7525
7736
  updateDelivery?.('not-delivered', 'empty-supervisor-input');
7526
7737
  return;
7527
7738
  }
7739
+ if (normalized.startsWith(RUN_DOCTOR_HANDOFF_INPUT_PREFIX)) {
7740
+ const runIdMatch = /(?:^|\s)runId=([^\s]+)/u.exec(normalized);
7741
+ const stopKeyMatch = /(?:^|\s)stopKey=([^\s]+)/u.exec(normalized);
7742
+ if (!runIdMatch?.[1] || runIdMatch[1] !== runId || !stopKeyMatch?.[1]) {
7743
+ updateDelivery?.('not-delivered', 'invalid-run-doctor-handoff');
7744
+ return;
7745
+ }
7746
+ void (s.runDoctorHandoff ?? runDoctorHandoff)({ runId, stopKey: stopKeyMatch[1], dir: runLedgerDir(elanousStateRoot() || undefined),
7747
+ dispatch: (action, handoff) => {
7748
+ if (action !== 'reauthor-from-materialized') return { outcome: 'needs-human', detail: `prescription executor not wired: ${action}` };
7749
+ const accepted = recordFailureEvent({ source: 'harness-run', kind: 'run-supervisor-wait-streak', ref: runId,
7750
+ summary: `[implement aborted] run-supervisor wait streak ${String(handoff.waitCount ?? 'unknown')} · doctor reauthor handoff`,
7751
+ goalText: feature, ...(opts.goalId ? { goalId: opts.goalId } : {}), ...(opts.goalFile ? { goalFile: opts.goalFile } : {}),
7752
+ ...(opts.healCellKey ? { cellKey: opts.healCellKey } : {}), at: new Date().toISOString() });
7753
+ return { outcome: accepted.folded ? 'heal-event-already-present' : 'heal-graph-requested',
7754
+ detail: accepted.folded ? 'same-run heal event already recorded' : 'PR1 heal intake accepted the materialized reauthor action' };
7755
+ },
7756
+ }).then((result) => {
7757
+ updateDelivery?.(result.status === 'acted' || result.status === 'already-acted' ? 'delivered' : 'not-delivered',
7758
+ result.status === 'needs-human' ? result.outcome : result.status === 'missing-handoff' ? 'run-chart-handoff-missing' : undefined);
7759
+ }).catch((error: unknown) => {
7760
+ updateDelivery?.('not-delivered', error instanceof Error ? error.message.slice(0, 120) : String(error).slice(0, 120));
7761
+ });
7762
+ return;
7763
+ }
7528
7764
  if (supervisorInputClosed) {
7529
7765
  recordUndeliveredSupervisorInput(normalized, 'late-supervisor-input');
7530
7766
  updateDelivery?.('not-delivered', 'late-supervisor-input');
@@ -7540,7 +7776,7 @@ async function runSelfImplementInner(
7540
7776
  supervisorDeliveryUpdates.push({ text: normalized, update: updateDelivery });
7541
7777
  },
7542
7778
  ...(escalateTier !== 'none' ? { escalateTier } : {}),
7543
- ...(opts.childLlm ? { childLlm: opts.childLlm } : {}),
7779
+ ...(activeChildLlm ? { childLlm: activeChildLlm } : {}),
7544
7780
  ...(opts.documentReferences ? { documentReferences: opts.documentReferences } : {}),
7545
7781
  });
7546
7782
  } catch (error) {
@@ -7615,7 +7851,7 @@ async function runSelfImplementInner(
7615
7851
  ...(harnessSeededPaths.length ? { harnessSeededPaths } : {}),
7616
7852
  onSurfaceProgress: line => progress('implementing', line.trimEnd()),
7617
7853
  roundContext: { round: retryRound, effectiveMax, previousRoundFailure: retryNote },
7618
- ...(opts.childLlm ? { childLlm: opts.childLlm } : {}),
7854
+ ...(activeChildLlm ? { childLlm: activeChildLlm } : {}),
7619
7855
  ...(opts.documentReferences ? { documentReferences: opts.documentReferences } : {}),
7620
7856
  }), T.implement, 'implement');
7621
7857
  } catch (error) {
@@ -7686,7 +7922,61 @@ async function runSelfImplementInner(
7686
7922
  // ② 첫 조각 커밋의 피처 시험·구현 전 실행 RED 기록과 구현 뒤 같은 명령 GREEN 기록이
7687
7923
  // 없으면 수리 라운드 1회(완료 경계·기존 동작은 보존), 그래도 없으면 fail-closed.
7688
7924
  // ③ 관측 원장에 tdd-red/tdd-green 이벤트를 남긴다.
7689
- let tddJudgment = judgeTddEvidence(roundGoal, parseOffDiffEvidence(impl.evidenceTranscript?.trim() || impl.summary));
7925
+ let tddTranscript = [impl.evidenceTranscript, impl.summary].filter((part): part is string => Boolean(part?.trim())).join('\n');
7926
+ let tddJudgment = judgeTddEvidence(roundGoal, parseOffDiffEvidence(tddTranscript));
7927
+ const runHarnessBaseTddWhenRedMissing = (input: {
7928
+ readonly round: number;
7929
+ readonly goal: string;
7930
+ readonly transcript: string;
7931
+ readonly judgment: ReturnType<typeof judgeTddEvidence>;
7932
+ readonly implementation: typeof impl;
7933
+ }): { readonly transcript: string; readonly judgment: ReturnType<typeof judgeTddEvidence> } => {
7934
+ if (!input.judgment.planned || input.judgment.red.observed || !input.implementation.ok
7935
+ || input.implementation.terminalStatus?.reached !== true) {
7936
+ return { transcript: input.transcript, judgment: input.judgment };
7937
+ }
7938
+ if (!wt.resolvedBase) {
7939
+ observe('tdd-base-test', { round: input.round, status: 'unmeasured', reason: 'base-commit-unavailable' }, { level: 'warn' });
7940
+ return { transcript: input.transcript, judgment: input.judgment };
7941
+ }
7942
+ const result = (s.runTddBaseHeadTest ?? runTddBaseHeadTest)({ cwd: wt.path, baseSha: wt.resolvedBase, goal: input.goal });
7943
+ observe('tdd-base-test', {
7944
+ round: input.round, status: result.accepted ? 'red-green' : 'unmeasured', reason: result.reason,
7945
+ baseSha: wt.resolvedBase, command: result.command, baseResult: result.baseResult ?? null, headResult: result.headResult ?? null,
7946
+ }, result.accepted ? {} : { level: 'warn' });
7947
+ if (!result.accepted || !result.transcript) return { transcript: input.transcript, judgment: input.judgment };
7948
+ const transcript = `${result.transcript}\n${input.transcript}`;
7949
+ return { transcript, judgment: judgeTddEvidence(input.goal, parseOffDiffEvidence(transcript)) };
7950
+ };
7951
+ const baseTdd = runHarnessBaseTddWhenRedMissing({ round, goal: roundGoal, transcript: tddTranscript, judgment: tddJudgment, implementation: impl });
7952
+ tddTranscript = baseTdd.transcript;
7953
+ tddJudgment = baseTdd.judgment;
7954
+ const receivedTddRed = receiveObservedTddRed({
7955
+ goal: roundGoal, judgment: tddJudgment, transcript: tddTranscript,
7956
+ resultParsed: impl.ok && impl.terminalStatus?.reached === true,
7957
+ });
7958
+ debug.log('self-implement.tdd-evidence', 'red-receive', {
7959
+ round, source: 'child-tool-output', accepted: receivedTddRed.accepted, reason: receivedTddRed.reason,
7960
+ observedTestCommand: receivedTddRed.command ?? null, observedTestResult: receivedTddRed.result ?? null,
7961
+ });
7962
+ if (receivedTddRed.accepted) {
7963
+ tddTranscript = receivedTddRed.transcript;
7964
+ tddJudgment = judgeTddEvidence(roundGoal, parseOffDiffEvidence(tddTranscript));
7965
+ }
7966
+ const receivedTddGreen = receiveObservedTddGreen({
7967
+ goal: roundGoal, judgment: tddJudgment, transcript: tddTranscript,
7968
+ resultParsed: impl.ok && impl.terminalStatus?.reached === true,
7969
+ });
7970
+ debug.log('self-implement.tdd-evidence', 'green-receive', {
7971
+ round, source: 'child-tool-output', accepted: receivedTddGreen.accepted, reason: receivedTddGreen.reason,
7972
+ taggedGreenPresent: tddJudgment.green.observed, observedTestCommand: receivedTddGreen.command ?? null,
7973
+ observedTestResult: receivedTddGreen.result ?? null,
7974
+ });
7975
+ if (receivedTddGreen.accepted) {
7976
+ tddTranscript = receivedTddGreen.transcript;
7977
+ tddJudgment = judgeTddEvidence(roundGoal, parseOffDiffEvidence(tddTranscript));
7978
+ }
7979
+ let tddEvidenceFailure: SelfImplementResult['tddEvidenceFailure'];
7690
7980
  if (tddJudgment.needsRepair && impl.ok && round < effectiveMax && opts.goalFile
7691
7981
  && !hasCurrentProviderError() && !hasCurrentCredentialFailure()) {
7692
7982
  let goalDocument: string | undefined;
@@ -7716,21 +8006,62 @@ async function runSelfImplementInner(
7716
8006
  ...(harnessSeededPaths.length ? { harnessSeededPaths } : {}),
7717
8007
  onSurfaceProgress: (line) => progress('implementing', line.trimEnd()),
7718
8008
  roundContext: { round: tddRetryRound, effectiveMax, previousRoundFailure: tddRetryNote },
7719
- ...(opts.childLlm ? { childLlm: opts.childLlm } : {}),
8009
+ ...(activeChildLlm ? { childLlm: activeChildLlm } : {}),
7720
8010
  ...(opts.documentReferences ? { documentReferences: opts.documentReferences } : {}),
7721
8011
  }), T.implement, 'implement');
7722
8012
  } catch (error) {
7723
8013
  tddRetryAbort.abort();
7724
8014
  tddRetryImpl = { ...beforeTddRetry, ok: false, summary: `[구현 재작업 · tdd-evidence-missing] 수리 라운드 실패 — ${safeErrorDescription(error)}` };
7725
8015
  }
7726
- const tddRetryJudgment = judgeTddEvidence(roundGoal, parseOffDiffEvidence(tddRetryImpl.evidenceTranscript?.trim() || tddRetryImpl.summary));
8016
+ let tddRetryTranscript = [tddRetryImpl.evidenceTranscript, tddRetryImpl.summary]
8017
+ .filter((part): part is string => Boolean(part?.trim())).join('\n');
8018
+ let tddRetryJudgment = judgeTddEvidence(roundGoal, parseOffDiffEvidence(tddRetryTranscript));
8019
+ const retryBaseTdd = runHarnessBaseTddWhenRedMissing({
8020
+ round: tddRetryRound, goal: roundGoal, transcript: tddRetryTranscript, judgment: tddRetryJudgment, implementation: tddRetryImpl,
8021
+ });
8022
+ tddRetryTranscript = retryBaseTdd.transcript;
8023
+ tddRetryJudgment = retryBaseTdd.judgment;
8024
+ const retryTddRed = receiveObservedTddRed({
8025
+ goal: roundGoal, judgment: tddRetryJudgment, transcript: tddRetryTranscript,
8026
+ resultParsed: tddRetryImpl.ok && tddRetryImpl.terminalStatus?.reached === true,
8027
+ });
8028
+ debug.log('self-implement.tdd-evidence', 'red-receive', {
8029
+ round: tddRetryRound, source: 'child-tool-output', accepted: retryTddRed.accepted, reason: retryTddRed.reason,
8030
+ observedTestCommand: retryTddRed.command ?? null, observedTestResult: retryTddRed.result ?? null,
8031
+ });
8032
+ if (retryTddRed.accepted) {
8033
+ tddRetryTranscript = retryTddRed.transcript;
8034
+ tddRetryJudgment = judgeTddEvidence(roundGoal, parseOffDiffEvidence(tddRetryTranscript));
8035
+ }
8036
+ const retryTddGreen = receiveObservedTddGreen({
8037
+ goal: roundGoal, judgment: tddRetryJudgment, transcript: tddRetryTranscript,
8038
+ resultParsed: tddRetryImpl.ok && tddRetryImpl.terminalStatus?.reached === true,
8039
+ });
8040
+ debug.log('self-implement.tdd-evidence', 'green-receive', {
8041
+ round: tddRetryRound, source: 'child-tool-output', accepted: retryTddGreen.accepted, reason: retryTddGreen.reason,
8042
+ taggedGreenPresent: tddRetryJudgment.green.observed, observedTestCommand: retryTddGreen.command ?? null,
8043
+ observedTestResult: retryTddGreen.result ?? null,
8044
+ });
8045
+ if (retryTddGreen.accepted) {
8046
+ tddRetryTranscript = retryTddGreen.transcript;
8047
+ tddRetryJudgment = judgeTddEvidence(roundGoal, parseOffDiffEvidence(tddRetryTranscript));
8048
+ }
7727
8049
  if (tddRetryImpl.ok && !tddRetryJudgment.needsRepair) {
7728
- observe('implementation-tdd-rework', { status: 'succeeded', round: tddRetryRound, missing: [] });
8050
+ observe('implementation-tdd-rework', { status: 'succeeded', round: tddRetryRound, missing: [...tddRetryJudgment.missing] });
7729
8051
  tddJudgment = tddRetryJudgment;
7730
8052
  impl = tddRetryImpl;
7731
8053
  round = tddRetryRound;
7732
8054
  } else {
7733
8055
  observe('implementation-tdd-rework', { status: 'exhausted', round: tddRetryRound, missing: [...tddRetryJudgment.missing] }, { level: 'warn' });
8056
+ // Only an initially successful implementation can enter this one retry. Goal-only exhaustion
8057
+ // has impl.ok=false before this point, so these two terminal reason codes cannot compete.
8058
+ if (tddRetryJudgment.missing.length > 0) {
8059
+ tddEvidenceFailure = {
8060
+ reason: 'tdd-evidence-missing',
8061
+ round: tddRetryRound,
8062
+ missing: [...tddRetryJudgment.missing],
8063
+ };
8064
+ }
7734
8065
  impl = { ...beforeTddRetry, ok: false, summary: `[구현 재작업 · tdd-evidence-missing] RED/GREEN 기록 결손 — ${beforeTddRetry.summary}` };
7735
8066
  }
7736
8067
  }
@@ -7821,7 +8152,7 @@ async function runSelfImplementInner(
7821
8152
  // 창 밖으로 밀려 파서에 도달조차 못 하던 자리다. 미주입 seam 은 종전대로 요약에서 판다(무회귀).
7822
8153
  // ⛔ `??` 가 아니라 **빈 문자열도 폴백**이다 — 수확본이 비면 *"수확했다"* 가 아니라 *"없다"* 이고,
7823
8154
  // `??` 로 두면 관측이 `harvested` 라 **거짓을 말한다**(리뷰 3R).
7824
- const harvested = impl.evidenceTranscript?.trim() ? impl.evidenceTranscript : undefined;
8155
+ const harvested = impl.evidenceTranscript?.trim() ? harvestEvidenceLines(impl.evidenceTranscript) : undefined;
7825
8156
  const childEvidenceSource = harvested ?? impl.summary;
7826
8157
  let diffEvidence = '';
7827
8158
  let roundObservationMeasurementBasis: ObservationMeasurementBasis | undefined;
@@ -7911,8 +8242,13 @@ async function runSelfImplementInner(
7911
8242
  }, { compact: { stringMax: Math.max(MAX_HARVESTED_EVIDENCE_CHARS, harvestObs.harvestedEvidence?.length ?? 0) } });
7912
8243
  if (impl.ok) completionDisposition = finishedChildCommitMissing || finishedChildCommitted ? undefined : impl.completionDisposition;
7913
8244
  const effectiveDisposition = impl.ok ? completionDisposition : impl.completionDisposition;
7914
- observe('implemented', { ok: impl.ok, round, ...(effectiveDisposition ? { completionDisposition: effectiveDisposition } : {}) });
8245
+ let materializedPaths: readonly string[] | undefined;
8246
+ try { materializedPaths = (s.changedFilesForGateRoute ?? changedFiles)(wt.path); } catch { /* unknown diff is not path evidence */ }
8247
+ observe('implemented', { ok: impl.ok, round, ...(materializedPaths ? { materializedPaths: [...materializedPaths] } : {}),
8248
+ ...(effectiveDisposition ? { completionDisposition: effectiveDisposition } : {}) });
7915
8249
  progress('implemented', impl.ok ? (round === 0 ? '구현 완료' : `rework ${round} 완료`) : impl.completionDisposition ? '변경 없이 완료 검증' : '구현 실패(worktree 보존)');
8250
+ // TDD exhaustion marks impl failed above; this return precedes finished-child commit and gate handling,
8251
+ // so those success-only terminal paths cannot swallow the structured report-deficit facts.
7916
8252
  if (!impl.ok) {
7917
8253
  finalizeSupervisorDeliveries('next-round-implement-not-ok');
7918
8254
  const abort = buildImplementAbortRecord(impl.summary, impl.terminalStatus);
@@ -7936,7 +8272,11 @@ async function runSelfImplementInner(
7936
8272
  salvageStatusExpected: false,
7937
8273
  ...(abort.terminalStatus ? { terminalStatus: abort.terminalStatus } : {}),
7938
8274
  });
7939
- return { ok: false, stage: 'aborted', node: 'implement', ...resolveRunOutcome({ termination: 'abandoned' }), ...(goalOnlyReworkExhausted ? { terminationReason: 'goal-only-rework-exhausted' as const } : {}), sessionId, worktreePath: wt.path, branch: wt.branch, quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(), ...(impl.completionDisposition ? { completionDisposition: impl.completionDisposition } : {}), ...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: impl.summary };
8275
+ return { ok: false, stage: 'aborted', node: 'implement', ...resolveRunOutcome({ termination: 'abandoned' }),
8276
+ ...(tddEvidenceFailure ? { terminationReason: tddEvidenceFailure.reason, tddEvidenceFailure }
8277
+ : goalOnlyReworkExhausted ? { terminationReason: 'goal-only-rework-exhausted' as const } : {}),
8278
+ sessionId, worktreePath: wt.path, branch: wt.branch, quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(), ...(impl.completionDisposition ? { completionDisposition: impl.completionDisposition } : {}), ...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: blockedDraftPrFailure ?? impl.summary,
8279
+ ...(blockedDraftPrFailureKind ? { detailKind: blockedDraftPrFailureKind } : {}) };
7940
8280
  }
7941
8281
 
7942
8282
  if (finishedChildCommitMissing) {