elanous 0.2.40 → 0.2.42

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 (685) hide show
  1. package/README.md +7 -7
  2. package/apps/pwa/out/404/index.html +1 -1
  3. package/apps/pwa/out/404.html +1 -1
  4. package/apps/pwa/out/_next/static/{HjeK7zONHfR7op1hKXp4k → X1ucLw10Cds_h614NoEnh}/_buildManifest.js +1 -1
  5. package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/{4769.9fd582071301f382.js → 1063.2fb8a9dc55c731f2.js} +1 -1
  7. package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +36 -0
  8. package/apps/pwa/out/_next/static/chunks/1147-5196d19c222051b3.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/{470.51a72a2348306455.js → 1262.e804feb8fd1acb8c.js} +2 -2
  10. package/apps/pwa/out/_next/static/chunks/1319.b9b815ae0f181e06.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/{7219-15bdd9a80661af8e.js → 1455-530ca16c7e71baff.js} +1 -1
  13. package/apps/pwa/out/_next/static/chunks/{1281.d81877e35b9068f4.js → 1487.2f67b79444062da6.js} +1 -1
  14. package/apps/pwa/out/_next/static/chunks/1574.878c18ecc97b1bd4.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +32 -0
  16. package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/1945.7b54990d578c119b.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +286 -0
  22. package/apps/pwa/out/_next/static/chunks/2160.a097e7b138ae1c55.js +23 -0
  23. package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +34 -0
  26. package/apps/pwa/out/_next/static/chunks/{1350.59f40e39e02d91b1.js → 2456.b6de0e1c05f28843.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/2690.0521c738b7749931.js +115 -0
  32. package/apps/pwa/out/_next/static/chunks/{5436.fdf6fa8ae3e9588d.js → 2974.595d1e29d040cb6a.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/{5383.bdfa5d886e39a826.js → 3207.a756c95e9ec8c3c8.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +93 -0
  35. package/apps/pwa/out/_next/static/chunks/{2177.df8547f9d7215c4e.js → 3347.f846266b5e5f3ede.js} +3 -3
  36. package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +41 -0
  37. package/apps/pwa/out/_next/static/chunks/{9184.45afbf44fec87574.js → 3482.a9ae9d2ad6a5bd97.js} +1 -1
  38. package/apps/pwa/out/_next/static/chunks/3507.97e1977bc4d5fb0a.js +2 -0
  39. package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +24 -0
  41. package/apps/pwa/out/_next/static/chunks/{8099.1cccf31c1baa7e1c.js → 3741.9cf76acaa2ee5298.js} +1 -1
  42. package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{4864a2ca.1c1c280a7772c5e5.js → 3d0154af.5331fec737ffe8c3.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4043.6b91203436c9c86b.js +309 -0
  48. package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +77 -0
  49. package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/{3330.7443183b7e6fdbdf.js → 4276.336d76d858fcdf1b.js} +1 -1
  51. package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4320.583cbab64db6be02.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4770.769c9cd9c7034eba.js +148 -0
  55. package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +74 -0
  56. package/apps/pwa/out/_next/static/chunks/{3b355b3d.6f73c98bf6f9c749.js → 50061469.0326382241ef3b2d.js} +1 -1
  57. package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +149 -0
  58. package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +27 -0
  60. package/apps/pwa/out/_next/static/chunks/{8d173e38.18a2f7b4e1848bdb.js → 53c73f84.373b6160adfa89a4.js} +1 -1
  61. package/apps/pwa/out/_next/static/chunks/{1537-6bb97b5214928ea9.js → 5431-72a1dbde59400691.js} +1 -1
  62. package/apps/pwa/out/_next/static/chunks/5440-4236de26c5ea5856.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/5885.0a3e52c8faccec98.js +287 -0
  70. package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/{261.0d471e8aded799f3.js → 6131.348b7d6bdcd267ce.js} +3 -3
  73. package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +90 -0
  74. package/apps/pwa/out/_next/static/chunks/{9175.2de5209a5ce6f68a.js → 6377.bc7df239edbff244.js} +1 -1
  75. package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{2226.2cf61ec781827219.js → 6632.0eac1c554f8f2ef3.js} +2 -2
  78. package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +104 -0
  82. package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +94 -0
  83. package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7279-c199ea83f34338fa.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/{b84cad00.594027ebe0531fe2.js → 73d2eb0e.4966ad55293c801a.js} +3 -3
  90. package/apps/pwa/out/_next/static/chunks/{6257.c0037b8949239f5e.js → 7411.9b4b8b747dc7b802.js} +2 -2
  91. package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +24 -0
  92. package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/{9189505a.980427ac048c8c60.js → 7a98bc80.fa935989e829f9c2.js} +1 -1
  98. package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/8138.6c10b2a356d52fca.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/{2566.beaffc3a5e1fcd2e.js → 8262.ddc03e06b733f184.js} +1 -1
  101. package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +8 -0
  103. package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8505.fd803c6c33b54cc3.js +79 -0
  105. package/apps/pwa/out/_next/static/chunks/{8272-025653884f9645d2.js → 8546-6f03f8ea34dd61d9.js} +1 -1
  106. package/apps/pwa/out/_next/static/chunks/{6051-0ae955eedb10adb9.js → 8673-bab689a55f7e13b9.js} +3 -3
  107. package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/9211-330b6736a63d4cb3.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/{4351.0f37a6db2b34d50b.js → 9249.976f1e69a9d80754.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9353-12bfff0c130104cf.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9415.69e4a21c60c7d2db.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{6749.0744ce6eb08d40e9.js → 9427.96aa912ddb5801e0.js} +16 -16
  119. package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/{7611.85f045bf232053ac.js → 9633.ce5bddc56784da72.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/{3746-f80a78f220bf37b5.js → 9656-374232558fd528d0.js} +1 -1
  123. package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +62 -0
  124. package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/9a852a62-6192a6ea9346ced3.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/live-run/{page-83d27757e2b8060a.js → page-0e3d7b9421b79dac.js} +1 -1
  147. package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/morning/page-0f291d3c8fd55a3a.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/term/{page-139d722de1dcd6c1.js → page-bf067887b3307423.js} +1 -1
  170. package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/{409c787b.e48c5bec8ec10456.js → b450776b.3db34d8d965f82d3.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/{ca3702f8.2913182e73889fa2.js → e8543907.5b040a5f22a0b0e5.js} +7 -7
  179. package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +1 -0
  184. package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +1 -0
  185. package/apps/pwa/out/_next/static/css/{b9d8151e48998417.css → 62c858ad53854f47.css} +1 -1
  186. package/apps/pwa/out/approvals/index.html +1 -1
  187. package/apps/pwa/out/approvals/index.txt +22 -22
  188. package/apps/pwa/out/autopilot/index.html +1 -1
  189. package/apps/pwa/out/autopilot/index.txt +22 -22
  190. package/apps/pwa/out/board/index.html +1 -1
  191. package/apps/pwa/out/board/index.txt +22 -22
  192. package/apps/pwa/out/botlab/index.html +1 -1
  193. package/apps/pwa/out/botlab/index.txt +21 -21
  194. package/apps/pwa/out/bots/index.html +1 -1
  195. package/apps/pwa/out/bots/index.txt +21 -21
  196. package/apps/pwa/out/ceo/index.html +1 -1
  197. package/apps/pwa/out/ceo/index.txt +22 -22
  198. package/apps/pwa/out/chat/index.html +1 -1
  199. package/apps/pwa/out/chat/index.txt +21 -21
  200. package/apps/pwa/out/consult/index.html +1 -1
  201. package/apps/pwa/out/consult/index.txt +22 -22
  202. package/apps/pwa/out/control/index.html +1 -1
  203. package/apps/pwa/out/control/index.txt +22 -22
  204. package/apps/pwa/out/decisions/index.html +1 -1
  205. package/apps/pwa/out/decisions/index.txt +21 -21
  206. package/apps/pwa/out/design-check/index.html +1 -1
  207. package/apps/pwa/out/design-check/index.txt +22 -22
  208. package/apps/pwa/out/editor/index.html +1 -1
  209. package/apps/pwa/out/editor/index.txt +23 -24
  210. package/apps/pwa/out/exec/index.html +1 -1
  211. package/apps/pwa/out/exec/index.txt +22 -22
  212. package/apps/pwa/out/field/index.html +1 -1
  213. package/apps/pwa/out/field/index.txt +22 -22
  214. package/apps/pwa/out/healthz +1 -1
  215. package/apps/pwa/out/index.html +1 -1
  216. package/apps/pwa/out/index.txt +21 -21
  217. package/apps/pwa/out/inside/index.html +1 -1
  218. package/apps/pwa/out/inside/index.txt +22 -22
  219. package/apps/pwa/out/intake/index.html +1 -1
  220. package/apps/pwa/out/intake/index.txt +22 -22
  221. package/apps/pwa/out/live/index.html +1 -1
  222. package/apps/pwa/out/live/index.txt +23 -24
  223. package/apps/pwa/out/live-run/index.html +1 -1
  224. package/apps/pwa/out/live-run/index.txt +23 -24
  225. package/apps/pwa/out/loops/index.html +1 -1
  226. package/apps/pwa/out/loops/index.txt +21 -21
  227. package/apps/pwa/out/market/index.html +1 -1
  228. package/apps/pwa/out/market/index.txt +21 -21
  229. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  230. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  231. package/apps/pwa/out/morning/index.html +1 -1
  232. package/apps/pwa/out/morning/index.txt +22 -22
  233. package/apps/pwa/out/observatory/index.html +1 -1
  234. package/apps/pwa/out/observatory/index.txt +22 -22
  235. package/apps/pwa/out/ops/checklist/index.html +1 -1
  236. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  237. package/apps/pwa/out/ops/release/index.html +1 -1
  238. package/apps/pwa/out/ops/release/index.txt +21 -21
  239. package/apps/pwa/out/ops/seats/index.html +1 -1
  240. package/apps/pwa/out/ops/seats/index.txt +21 -21
  241. package/apps/pwa/out/outputs/index.html +1 -1
  242. package/apps/pwa/out/outputs/index.txt +21 -21
  243. package/apps/pwa/out/reflection/index.html +1 -1
  244. package/apps/pwa/out/reflection/index.txt +22 -22
  245. package/apps/pwa/out/scheduler/index.html +1 -1
  246. package/apps/pwa/out/scheduler/index.txt +22 -22
  247. package/apps/pwa/out/sessions/index.html +1 -1
  248. package/apps/pwa/out/sessions/index.txt +21 -21
  249. package/apps/pwa/out/settings/devices/index.html +1 -1
  250. package/apps/pwa/out/settings/devices/index.txt +22 -22
  251. package/apps/pwa/out/settings/index.html +1 -1
  252. package/apps/pwa/out/settings/index.txt +22 -22
  253. package/apps/pwa/out/setup/done/index.html +1 -1
  254. package/apps/pwa/out/setup/done/index.txt +22 -22
  255. package/apps/pwa/out/setup/index.html +1 -1
  256. package/apps/pwa/out/setup/index.txt +22 -22
  257. package/apps/pwa/out/share/index.html +1 -1
  258. package/apps/pwa/out/share/index.txt +22 -22
  259. package/apps/pwa/out/showroom/index.html +1 -1
  260. package/apps/pwa/out/showroom/index.txt +21 -21
  261. package/apps/pwa/out/tasks/index.html +1 -1
  262. package/apps/pwa/out/tasks/index.txt +22 -22
  263. package/apps/pwa/out/term/index.html +1 -1
  264. package/apps/pwa/out/term/index.txt +22 -22
  265. package/apps/pwa/out/today/index.html +1 -1
  266. package/apps/pwa/out/today/index.txt +22 -22
  267. package/apps/pwa/out/trace/index.html +1 -1
  268. package/apps/pwa/out/trace/index.txt +22 -22
  269. package/apps/pwa/out/vault/index.html +1 -1
  270. package/apps/pwa/out/vault/index.txt +22 -22
  271. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  272. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  273. package/apps/pwa/out/workflows/index.html +1 -1
  274. package/apps/pwa/out/workflows/index.txt +22 -22
  275. package/apps/pwa/out/workspace/index.html +1 -1
  276. package/apps/pwa/out/workspace/index.txt +22 -22
  277. package/apps/pwa/out/worktrees/index.html +1 -1
  278. package/apps/pwa/out/worktrees/index.txt +22 -22
  279. package/bin/elanous.mjs +6 -1
  280. package/catalog/models/openai/gpt-6.1-sol.yaml +16 -0
  281. package/catalog/models/openai/gpt-6.1-terra.yaml +16 -0
  282. package/docs/goal-context/04-mock-scenarios.md +13 -0
  283. package/graphs/catalog/catalog.yaml +1 -1
  284. package/graphs/demo/persona-teacher/lesson-pack.yaml +16 -0
  285. package/graphs/demo/persona-teacher/recipes.yaml +17 -0
  286. package/graphs/demo/persona-teacher/weekly-lesson.yaml +36 -0
  287. package/graphs/heal/heal-loop.yaml +1 -0
  288. package/graphs/overlays/stop-heal-ladder.yaml +136 -2
  289. package/graphs/release/release-loop.yaml +3 -1
  290. package/graphs/units/gate/gate.yaml +20 -0
  291. package/graphs/units/git/git.yaml +26 -0
  292. package/graphs/units/implement/implement.yaml +19 -0
  293. package/graphs/units/landing/landing.yaml +18 -0
  294. package/graphs/units/review/review.yaml +20 -0
  295. package/graphs/units/verbs/recipes.yaml +13 -10
  296. package/graphs/units/verbs/research.yaml +20 -0
  297. package/graphs/work/research-report.yaml +21 -3
  298. package/package.json +1 -1
  299. package/scripts/disk-steward.ts +46 -0
  300. package/scripts/fleet/node-setup.sh +50 -0
  301. package/scripts/graph-units/verbs/research.ts +55 -0
  302. package/scripts/heal/run-role.ts +99 -5
  303. package/scripts/land-global-checks.ts +6 -1
  304. package/scripts/lib/decompose-ab.ts +1 -0
  305. package/scripts/lib/fixtures/tui-regress/help-insufficient-commands.txt +15 -0
  306. package/scripts/lib/fixtures/tui-regress/help-live.txt +42 -0
  307. package/scripts/lib/fixtures/tui-regress/help-missing-keys.txt +21 -0
  308. package/scripts/lib/fixtures/tui-regress/help-original.txt +51 -0
  309. package/scripts/lib/fixtures/tui-regress/help-shifted-input.txt +26 -0
  310. package/scripts/lib/tui-regress-checks.ts +33 -13
  311. package/scripts/llm-cost-ledger.ts +179 -8
  312. package/scripts/measure-nl-routing-corpus.ts +10 -2
  313. package/scripts/persona-teacher/weekly-lesson-node.ts +172 -0
  314. package/scripts/public-copy-lint.ts +163 -19
  315. package/scripts/ratchets/train-side-invariants.sh +0 -1
  316. package/scripts/release-loop/gate-autoheal.ts +117 -0
  317. package/scripts/release-loop/gate-baseline-receipt.ts +55 -10
  318. package/scripts/release-loop/gate-diff.ts +22 -3
  319. package/scripts/release-loop/gate-image-pin.ts +81 -0
  320. package/scripts/release-loop/gate-node-sim.ts +207 -0
  321. package/scripts/release-loop/gate-node.ts +489 -62
  322. package/scripts/release-loop/gate-pod-image-sticky-plan.ts +99 -0
  323. package/scripts/release-loop/gate-radius-live.ts +97 -13
  324. package/scripts/release-loop/gate-shard-dispatch.ts +43 -0
  325. package/scripts/release-loop/gate-shard-load-flaky.ts +256 -0
  326. package/scripts/release-loop/gate-train-receipts.ts +122 -0
  327. package/scripts/release-loop/gate-triage-node.ts +70 -10
  328. package/scripts/release-loop/resume-release.ts +330 -23
  329. package/scripts/release-loop/traffic-node.ts +6 -3
  330. package/scripts/release-loop/unattended-release.ts +4 -2
  331. package/scripts/shadow-authoring-probe.ts +20 -0
  332. package/scripts/ux-sim.ts +37 -3
  333. package/scripts/warm-pool-provider-config.ts +263 -0
  334. package/skills/omni-crawl/SKILL.md +5 -2
  335. package/skills/omni-crawl/scripts/main.ts +84 -23
  336. package/src/acp/core-turn-bridge.ts +99 -4
  337. package/src/agent/registry.ts +2 -0
  338. package/src/agent/task-notification.ts +25 -5
  339. package/src/agent/types.ts +6 -0
  340. package/src/agent-mission/mission-cli.ts +24 -0
  341. package/src/agent-mission/mission-out.ts +595 -0
  342. package/src/agent-mission/tool-install.ts +88 -2
  343. package/src/agent-substrate/context-strategy.ts +4 -4
  344. package/src/agent-substrate/self-review-cli.ts +267 -40
  345. package/src/auto-research/research-turn.ts +133 -51
  346. package/src/autopilot/discovery/wiki-claim-proposer.ts +22 -1
  347. package/src/autopilot/pr-manager.ts +38 -7
  348. package/src/autopilot/pty-control-loop.ts +2 -0
  349. package/src/boot/daemon-tools/self-implement.ts +46 -9
  350. package/src/budget/shadow-arms.ts +52 -0
  351. package/src/capture/tui-self-report.ts +22 -6
  352. package/src/chat/index.ts +1 -1
  353. package/src/chat/pickers/state.ts +7 -1
  354. package/src/cli/fixtures/review-loop-breaker/opwaiver-32646-1694ccc7a170.json +1 -0
  355. package/src/cli/fixtures/review-loop-breaker/opwaiver-32853-bd8f73595c83.json +1 -0
  356. package/src/cli/fixtures/review-loop-breaker/opwaiver-33097-1cc85900413c.json +1 -0
  357. package/src/cli/fixtures/review-loop-breaker/opwaiver-33106-972f31e4a3ca.json +1 -0
  358. package/src/cli/fixtures/review-loop-breaker/opwaiver-33113-3ab51f05968f.json +1 -0
  359. package/src/cli/fixtures/review-loop-breaker/pr-33097-1cc85900413c.json +1 -0
  360. package/src/cli/log-event-names.ts +5 -0
  361. package/src/cli/mcp-login.ts +8 -18
  362. package/src/cli/msg-cli.ts +57 -1
  363. package/src/cli/pr-land-heavy-remote.ts +47 -9
  364. package/src/cli/pr-land-overlap-evidence.ts +100 -1
  365. package/src/cli/pr-land-pod-shadow-job.ts +60 -0
  366. package/src/cli/release-checklist-read-cli.ts +20 -10
  367. package/src/cli/release-cli.ts +27 -1
  368. package/src/cli/research-cli.ts +4 -5
  369. package/src/cli/sim-cli.ts +7 -1
  370. package/src/cli/tasks-cli.ts +12 -4
  371. package/src/codex/models.ts +30 -15
  372. package/src/compact/auto.ts +8 -1
  373. package/src/control-plane/ledger.ts +52 -2
  374. package/src/control-plane/server.ts +16 -2
  375. package/src/core-turn/run-core-turn.ts +313 -89
  376. package/src/core-turn/run-goal-loop.ts +106 -2
  377. package/src/core-turn/types.ts +2 -0
  378. package/src/dashboard/acp-boot.ts +72 -3
  379. package/src/dashboard/classic-sidetab-mission-job.ts +58 -0
  380. package/src/dashboard/classic-sidetab-mission.ts +185 -0
  381. package/src/dashboard/index.ts +155 -15
  382. package/src/dashboard/input/agent-wake.ts +23 -1
  383. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +9 -0
  384. package/src/dashboard/mission-cli-consumer.ts +153 -0
  385. package/src/dashboard/seat-boot-preamble.ts +171 -1
  386. package/src/dashboard/side-basic-runtime.ts +54 -1
  387. package/src/dashboard/sidetab-runtime.ts +90 -1
  388. package/src/dashboard/skill-catalog-preamble.ts +101 -0
  389. package/src/dashboard/skill-detection-runtime.ts +55 -15
  390. package/src/dashboard/slash-runtime/dashboard-handlers.ts +15 -0
  391. package/src/dashboard/turn-preamble.ts +65 -16
  392. package/src/dashboard/turn-prompt-runtime.ts +4 -2
  393. package/src/disk-steward/judge.ts +73 -0
  394. package/src/disk-steward/ledger.ts +122 -0
  395. package/src/disk-steward/steward.ts +373 -0
  396. package/src/domains/guardian-tick.ts +191 -2
  397. package/src/graph-runner/graph-cli.ts +44 -7
  398. package/src/graph-runner/graph-tick.ts +10 -2
  399. package/src/graph-runner/in-process-registry.ts +37 -0
  400. package/src/graph-runner/runner.ts +34 -4
  401. package/src/grok/agent-search.ts +14 -4
  402. package/src/grok/credential.ts +28 -11
  403. package/src/grounding/ref-index.ts +19 -0
  404. package/src/grounding/sources-cli.ts +9 -1
  405. package/src/harness/harness-cli-command.ts +267 -14
  406. package/src/harness/harness-incidents.ts +312 -7
  407. package/src/harness/harness-pod-dispatch.ts +81 -15
  408. package/src/harness/harness-space.ts +15 -1
  409. package/src/harness/harness-stop.ts +155 -11
  410. package/src/harness/progress-worker-entry.ts +59 -0
  411. package/src/harness/progress-worker-runtime.ts +11 -0
  412. package/src/index.ts +52 -7
  413. package/src/instance/dev-project.ts +25 -0
  414. package/src/instance/spawn-elanous.ts +6 -4
  415. package/src/intelligence-map/model-alias.ts +6 -5
  416. package/src/intelligence-map/model-catalog.ts +59 -2
  417. package/src/llm/model-defaults.ts +4 -4
  418. package/src/llm.ts +208 -19
  419. package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
  420. package/src/loops/orchestrator/tick.ts +61 -0
  421. package/src/maturity/feature-maturity.ts +1 -1
  422. package/src/mcp/mcp-oauth.ts +3 -1
  423. package/src/model-tier/llm-tier-map.ts +9 -9
  424. package/src/model-tier/turn-tier.ts +1 -1
  425. package/src/msg/msg-mirror-github.ts +80 -0
  426. package/src/msg/msg-mirror-policy.ts +61 -0
  427. package/src/msg/msg-mirror-runner.ts +219 -0
  428. package/src/msg/msg-mirror-state.ts +33 -0
  429. package/src/msg/msg-store.ts +11 -0
  430. package/src/native-tool-catalog.ts +2 -2
  431. package/src/nexus/api/harness-traversal.ts +11 -0
  432. package/src/output-truncation.ts +41 -12
  433. package/src/pr-tool/census.ts +3 -2
  434. package/src/project/project-store.ts +48 -1
  435. package/src/pty-shell/tui-run-state.ts +188 -2
  436. package/src/release-loop/checklist-target-path-hint.ts +13 -0
  437. package/src/release-loop/checklist.ts +9 -1
  438. package/src/release-loop/gate-host-reservation.ts +144 -0
  439. package/src/release-loop/release-schedule.ts +90 -1
  440. package/src/repl/index.ts +43 -2
  441. package/src/research/axis-fanout.ts +121 -16
  442. package/src/research/bloom-exemplars.ts +137 -0
  443. package/src/research/gap-followup.ts +13 -1
  444. package/src/research/plugin-discovery.ts +36 -14
  445. package/src/research-bridge/invoke.ts +22 -5
  446. package/src/research-bridge/types.ts +2 -0
  447. package/src/self-dev/ask-launch-flow.ts +39 -25
  448. package/src/self-dev/decompose.ts +119 -5
  449. package/src/self-dev/dev-cli.ts +17 -17
  450. package/src/self-dev/graph-front-nodes.ts +23 -0
  451. package/src/self-dev/launch-preflight-text.ts +5 -6
  452. package/src/self-dev/launch-preflight.ts +9 -4
  453. package/src/self-dev/orchestrate.ts +27 -2
  454. package/src/self-dev/review-provider-fallback.ts +9 -2
  455. package/src/self-dev/run-supervisor.ts +226 -6
  456. package/src/self-dev/run-types.ts +7 -0
  457. package/src/self-implement/doctor-visit.ts +88 -0
  458. package/src/self-implement/gate-artifacts.ts +13 -0
  459. package/src/self-implement/gate-cli.ts +54 -24
  460. package/src/self-implement/gate-remote.ts +23 -5
  461. package/src/self-implement/goal-author-clarification.ts +31 -12
  462. package/src/self-implement/goal-author.ts +403 -8
  463. package/src/self-implement/graph-overlay-yaml.ts +7 -0
  464. package/src/self-implement/graph-stage-units.ts +172 -0
  465. package/src/self-implement/graph-templates.ts +162 -1
  466. package/src/self-implement/graph-variant.ts +37 -4
  467. package/src/self-implement/headless-elanous-driver.ts +31 -2
  468. package/src/self-implement/heal-intake.ts +112 -4
  469. package/src/self-implement/heal-triage.ts +20 -0
  470. package/src/self-implement/host-regate.ts +31 -8
  471. package/src/self-implement/knowhow-pack.ts +38 -0
  472. package/src/self-implement/merge-train.ts +5 -0
  473. package/src/self-implement/orchestrator.ts +359 -30
  474. package/src/self-implement/regate-detail.ts +38 -1
  475. package/src/self-implement/rework-child-provider.ts +25 -0
  476. package/src/self-implement/run-chart.ts +119 -0
  477. package/src/self-implement/run-ledger.ts +176 -17
  478. package/src/self-implement/run-stop.ts +208 -5
  479. package/src/self-implement/running-runs.ts +35 -12
  480. package/src/self-implement/self-implement-cli.ts +36 -4
  481. package/src/self-implement/stop-autoheal-operational.ts +43 -0
  482. package/src/self-implement/stop-autoheal.ts +28 -6
  483. package/src/session/chat.ts +69 -58
  484. package/src/session/request-size-guard.ts +123 -0
  485. package/src/session-runtime/index.ts +98 -4
  486. package/src/session-runtime/tier-flip.ts +3 -3
  487. package/src/sidetab-core/model.ts +150 -0
  488. package/src/sidetab-core/visible-agent-mission.ts +186 -0
  489. package/src/skills/name-match.ts +20 -0
  490. package/src/skills/tools/agent.ts +30 -2
  491. package/src/skills/tools/omni-search.ts +67 -5
  492. package/src/task-agent/parent-host.ts +14 -1
  493. package/src/task-agent/pod-distributor-entry.ts +3 -0
  494. package/src/task-agent/task-hand.ts +31 -1
  495. package/src/task-orchestrator/surfaces/pod-distributor.ts +48 -0
  496. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +43 -0
  497. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
  498. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +29 -4
  499. package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +33 -6
  500. package/src/task-orchestrator/surfaces/pod-source-bundle.ts +45 -9
  501. package/src/task-orchestrator/surfaces/pod-source-receive.ts +163 -13
  502. package/src/task-orchestrator/surfaces/pod-source-spec.ts +3 -3
  503. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +209 -39
  504. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +80 -3
  505. package/src/task-orchestrator/surfaces/self-implement-pod.ts +280 -60
  506. package/src/task-orchestrator/surfaces/self-implement.ts +18 -0
  507. package/src/tokens.ts +35 -2
  508. package/src/tool-runtime/agent-runtime.ts +1 -0
  509. package/src/tool-runtime/elanous-skills-list-runtime.ts +5 -1
  510. package/src/tool-runtime/skill-exec-runtime.ts +33 -13
  511. package/src/tool-runtime/types.ts +1 -0
  512. package/src/tui/entry.ts +24 -7
  513. package/src/tui/sidetab/attach.ts +47 -0
  514. package/src/tui/sidetab/list.ts +45 -0
  515. package/src/tui/sidetab/nl-tool.ts +2 -136
  516. package/src/tui/sidetab/peek.ts +52 -0
  517. package/src/tui-client/dashboard-session.ts +3 -0
  518. package/src/tui-client/local-chat-turn.ts +26 -13
  519. package/src/tui.ts +22 -0
  520. package/src/user-config.ts +11 -5
  521. package/src/ux-sim/fake-kubectl.ts +37 -3
  522. package/src/ux-sim/fault-needs-human-reason-repair.ts +107 -0
  523. package/src/ux-sim/fault-pod-child-result.ts +42 -0
  524. package/src/ux-sim/fault-pool-cap.ts +11 -6
  525. package/src/ux-sim/mock-scenario-catalog.json +41 -0
  526. package/src/ux-sim/mock-scenario-catalog.ts +156 -0
  527. package/src/ux-sim/release-sim-rig.ts +262 -0
  528. package/src/ux-sim/scenario.ts +116 -23
  529. package/src/ux-sim/seminar-rehearsal.ts +109 -0
  530. package/src/ux-sim/subagent-tools-device.ts +2 -2
  531. package/src/version/packed-revision.json +1 -1
  532. package/src/voice/voice-tts-singleton.ts +18 -3
  533. package/src/web-search/grok.ts +5 -9
  534. package/apps/pwa/out/_next/static/chunks/1060.014f1f01a17aec26.js +0 -115
  535. package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/1452.162bb2d9d699e82a.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +0 -286
  538. package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +0 -149
  539. package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +0 -90
  541. package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +0 -104
  542. package/apps/pwa/out/_next/static/chunks/2047.8f23e210995d4548.js +0 -2
  543. package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/2066.a77257c8c350770a.js +0 -23
  545. package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/2281-b8cede695c6c650e.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/2499.02fbfd18126c10c0.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/2522.f2766b76d22c8bdf.js +0 -34
  550. package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +0 -27
  553. package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/2774-719820e3f5b2a3eb.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/2829-734fe8bf2eee7347.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +0 -24
  566. package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +0 -77
  567. package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +0 -36
  568. package/apps/pwa/out/_next/static/chunks/413-24c8284bda08241d.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +0 -287
  571. package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/483.725e4a61be922788.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +0 -74
  578. package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/5622.94893f5aea7185d0.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +0 -8
  583. package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +0 -62
  585. package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +0 -94
  589. package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/6624.981ef7caeb680560.js +0 -32
  596. package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/6908.06008c67f6380ea9.js +0 -148
  600. package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/6cc1d1d6.9a98dd4622f1afc6.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +0 -93
  605. package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/7515.1ad6efe157fa4448.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +0 -24
  609. package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/8086.1ab9103c41be884f.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/8357.1aaa713b052a78b1.js +0 -309
  616. package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/8639-92c11d069792429e.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/9069.657590a84afb8fac.js +0 -41
  620. package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/9992.07ce73c10bd5e6a1.js +0 -79
  625. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/app/botlab/page-ba957ff875a026a0.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/app/live/page-4edb8df90f4537ce.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/app/morning/page-fca2e59a81744d9e.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/workspace/page-ccde99f07aaf71f7.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/d5d3cefc-373c4eb722ed848b.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/d8de0de2-dd0f4ac8e5ab1832.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/framework-002b472a66935d31.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.js +0 -1
  683. package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +0 -1
  684. package/scripts/ratchets/next-tui-entry-budget.ts +0 -124
  685. /package/apps/pwa/out/_next/static/{HjeK7zONHfR7op1hKXp4k → X1ucLw10Cds_h614NoEnh}/_ssgManifest.js +0 -0
@@ -106,10 +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, forgetRunStop, isRunStopClass, readRunStopRecord, recordRunStop, runStopRecorded } from './run-stop.js';
111
- import { autohealFromStop, parseAutohealMode, type AutohealActions, type AutohealResult } from './stop-autoheal.js';
112
- import { recordParentNeedsOwnerVisit } from './doctor-visit.js';
109
+ import { appendRunLedgerEntry, loadRunLedger, parseRunShardIdentity, queryRunChain, runLedgerDir, type RunChainShardSibling, 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
+ import { autohealFromStop, parseAutohealMode, pickAutohealAction, type AutohealActions, type AutohealResult } from './stop-autoheal.js';
112
+ import { operationalAutohealActions } from './stop-autoheal-operational.js';
113
+ import { recordParentNeedsOwnerVisit, runDoctorHandoff } from './doctor-visit.js';
114
+ import { readRunChart, recordRunChartDecision, RUN_DOCTOR_HANDOFF_INPUT_PREFIX } from './run-chart.js';
113
115
  import { emitSessionEvent, type SessionEventInput } from '../context-bus/session-events.js';
114
116
  import { decideLineageSupersede, lineageSupersedeCloseComment, type LineageSupersedeOpenDraft } from './lineage-supersede.js';
115
117
  import { basename, isAbsolute, join, relative, resolve, sep } from 'node:path';
@@ -136,7 +138,7 @@ import { boundaryGlobs, boundaryViolations } from './goal-boundary.js';
136
138
  import { askAtExecution, type ExecutionClarificationResult } from './execution-clarification.js';
137
139
  import { decideScopeExpansion, renderScopeExpansionSection, SCOPE_EXPANSION_CAP, type ScopeExpansion, type ScopeStopReason } from './scope-adjacency.js';
138
140
  import { targetScopedGoalText } from './goal-text-path-scope.js';
139
- import { selectKnowhowPack } from './knowhow-pack.js';
141
+ import { selectKnowhowPack, selectHealKnowhowPack } from './knowhow-pack.js';
140
142
  import { declaredNewFilePaths } from './goal-new-paths.js';
141
143
  import { dropStaleReverts, type RevertGuardResult } from './revert-guard.js';
142
144
  import type { SelfDevGoalType } from '../self-dev/orchestrate.js';
@@ -321,7 +323,14 @@ import { buildRuntimeOverlayState } from './graph-overlay-condition.js';
321
323
  import { activeTemplate, decideTemplate, graphAuthorityFields, nodeNameForStage, overlayDecisionObservation, resolveGraphAuthorityForUserConfig, routeGate, visitBudgetOf } from './graph-authority.js';
322
324
  import type { GraphTemplate } from './graph-templates.js';
323
325
  import { defaultOverlaysDir, loadGraphOverlays, type GraphOverlaySpec } from './graph-overlay-yaml.js';
324
- import { graphIdentityOf, measureL0Coverage, pipelineNodeEntryPayload } from './graph-templates.js';
326
+ import { defaultGraphsDir, graphIdentityOf, measureL0Coverage, pipelineNodeEntryPayload } from './graph-templates.js';
327
+ import {
328
+ buildStageNodeContext,
329
+ resolveGraphStageUnits,
330
+ stageNodeContextObservation,
331
+ stageUnitDrift,
332
+ type StageNodeContext,
333
+ } from './graph-stage-units.js';
325
334
  import { AMBIGUOUS_STAGES, checkPipelineTraversal, nodesForStage, pipelineGraphIdentity, TERMINAL_STAGES_BY_NODE, type PipelineNodeId, type PipelineTraversalCheck } from './pipeline-shape.js';
326
335
  import { appendGateWorktreeFreshnessEvidence, gateEvidenceNote } from '../harness/review-adapter.js';
327
336
  import { diffHeaderPaths } from '../agent-substrate/self-review-cli.js';
@@ -348,6 +357,9 @@ import {
348
357
  } from '../ask-user-question/tool.js';
349
358
  import { acquireClarificationResolverLease, decideClarificationResolverInstall } from './clarification-resolver-lease.js';
350
359
  import { inspectCodexRotation } from '../oauth/codex-account-store.js';
360
+ import { resolveGrokCredential } from '../grok/credential.js';
361
+ import { resolveChildLlmPreference } from './child-llm-preference.js';
362
+ import { reselectChildForRework } from './rework-child-provider.js';
351
363
  import { resolveDefaultProvider } from '../llm.js';
352
364
  import { createWidgetAskUserResolver } from '../expression/widget/adapters/ask-user-resolver.js';
353
365
  import { createNodeReadlineHost } from '../expression/widget/readline-host.js';
@@ -1061,12 +1073,16 @@ export interface SelfImplementSeams {
1061
1073
  stopAutohealActions?: AutohealActions;
1062
1074
  /** STOP-AUTOHEAL — one-attempt guard reader. Default: real run ledger, or none when `writeRunLedger` is injected. */
1063
1075
  stopAutohealLoadLedger?: (runId: string) => readonly RunLedgerEntry[] | null;
1076
+ /** Supervisor heal delivery history reader; defaults to the run ledger unless a test injects a writer. */
1077
+ healPackLoadLedger?: (runId: string) => readonly RunLedgerEntry[] | null;
1064
1078
  /** STOP-AUTOHEAL — observes each dispatcher result (tests). */
1065
1079
  onStopAutoheal?: (result: AutohealResult) => void;
1066
1080
  /** Optional context-journal sink for isolated runs. */
1067
1081
  emitContextEvent?: (input: SessionEventInput) => void;
1068
1082
  /** Registers this run as an ephemeral loop-agent asset; failures are observed but never affect execution. */
1069
1083
  registerLoopAgent?: (input: LoopAgentInput) => void;
1084
+ /** Executes a persisted run-doctor supervisor handoff; injectable to verify the parent delivery route. */
1085
+ runDoctorHandoff?: typeof runDoctorHandoff;
1070
1086
  /** Wraps implementation and gate promises with their effective wall-clock timeout; tests observe the actual stage budgets. */
1071
1087
  withStepTimeout?: <T>(promise: Promise<T>, ms: number, step: keyof StepTimeouts) => Promise<T>;
1072
1088
  /** Samples the one-minute machine load at the end of a gate observation. */
@@ -1083,7 +1099,7 @@ export interface SelfImplementSeams {
1083
1099
  * store, the orchestrator must not claim the child had zero provider failures.
1084
1100
  */
1085
1101
  queryChildProviderErrors?: (input: { runId: string; sinceMs: number; untilMs: number }) => Promise<
1086
- | { status: 'found'; providerErrorCount: number; credentialFailureCount: number; lastProviderError?: { provider?: string; message?: string }; lastCredentialFailure?: { provider?: string; message?: string } }
1102
+ | { status: 'found'; providerErrorCount: number; credentialFailureCount: number; lastProviderError?: { provider?: string; model?: string; message?: string; observedAt?: string }; lastCredentialFailure?: { provider?: string; model?: string; message?: string; observedAt?: string } }
1087
1103
  | { status: 'none' }
1088
1104
  | { status: 'unavailable'; reason?: string }
1089
1105
  >;
@@ -2198,6 +2214,8 @@ export interface SelfImplementOptions {
2198
2214
  runId?: string;
2199
2215
  /** Authored goal document's stable identity, carried into self-implement observations when present. */
2200
2216
  goalId?: string;
2217
+ /** Stable heal-cell identity propagated across supervisor reauthor retries. */
2218
+ healCellKey?: string;
2201
2219
  /** Optional opaque ID for joining this request with correlated execution records. */
2202
2220
  correlationId?: string;
2203
2221
  /** Optional opaque ID for the parent correlation in a nested request. */
@@ -3014,8 +3032,8 @@ export function queryStructuredChildProviderErrors(
3014
3032
  });
3015
3033
  if (rows.length === 0) return { status: 'none' };
3016
3034
  let credentialFailureCount = 0;
3017
- let lastProviderError: { provider?: string; message?: string } | undefined;
3018
- let lastCredentialFailure: { provider?: string; message?: string } | undefined;
3035
+ let lastProviderError: { provider?: string; model?: string; message?: string; observedAt?: string } | undefined;
3036
+ let lastCredentialFailure: { provider?: string; model?: string; message?: string; observedAt?: string } | undefined;
3019
3037
  for (const row of rows) {
3020
3038
  let data: Record<string, unknown> | undefined;
3021
3039
  try {
@@ -3024,7 +3042,9 @@ export function queryStructuredChildProviderErrors(
3024
3042
  } catch { /* malformed payload is still a structured router-error record */ }
3025
3043
  const detail = {
3026
3044
  ...(typeof data?.provider === 'string' ? { provider: data.provider } : {}),
3045
+ ...(typeof data?.model === 'string' ? { model: data.model } : {}),
3027
3046
  ...(typeof data?.message === 'string' ? { message: data.message } : {}),
3047
+ ...(typeof row.ts === 'string' ? { observedAt: row.ts } : {}),
3028
3048
  };
3029
3049
  lastProviderError = detail;
3030
3050
  if (data?.authRejected === true) {
@@ -3568,19 +3588,32 @@ async function autohealRecordedStop(stopEntry: RunLedgerEntry, s: SelfImplementS
3568
3588
  try {
3569
3589
  const record = readRunStopRecord(stopEntry);
3570
3590
  if (!record) return;
3591
+ const chartDir = runLedgerDir();
3592
+ const chartBefore = readRunChart(stopEntry.runId, 'macrophage', chartDir);
3593
+ const chartStopKey = JSON.stringify([stopEntry.timestamp, record.site ?? '', record.class, record.cause, record.evidenceRef]);
3594
+ try { debug.log('harness.heal', 'symptom', { runId: stopEntry.runId, class: record.class, cause: record.cause, evidenceRef: record.evidenceRef }); } catch { /* observation is fail-soft */ }
3595
+ const pick = pickAutohealAction(record.class);
3596
+ 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 */ }
3571
3597
  const mode = parseAutohealMode((await import('../user-config.js')).getUserConfig().tools.selfImplement.autoheal?.mode);
3572
3598
  const loadLedger = s?.stopAutohealLoadLedger ?? (s?.writeRunLedger ? () => null : undefined);
3599
+ // A test ledger must never trigger a production host gate. Explicit seams override operational hands.
3600
+ const actions = s?.writeRunLedger ? s.stopAutohealActions
3601
+ : { ...operationalAutohealActions({ repoRoot: process.cwd() }), ...s?.stopAutohealActions };
3573
3602
  const result = await autohealFromStop({ runId: stopEntry.runId, ...(stopEntry.goalId ? { goalId: stopEntry.goalId } : {}), record }, {
3574
3603
  mode,
3575
3604
  knowhowCandidateDir: join(effectiveInstanceRoot(), 'self-implement', 'knowhow-candidates'),
3576
- ...(s?.stopAutohealActions ? { actions: s.stopAutohealActions } : {}),
3605
+ ...(actions ? { actions } : {}),
3577
3606
  ...(loadLedger ? { loadLedger } : {}),
3578
3607
  ...(s?.writeRunLedger ? { writeLedger: s.writeRunLedger } : {}),
3579
3608
  });
3609
+ 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 */ }
3610
+ recordRunChartDecision({ runId: stopEntry.runId, device: 'macrophage', stopKey: chartStopKey,
3611
+ observed: `${record.class}: ${record.cause}`, verdict: result.action, action: result.outcome,
3612
+ handoff: result.action === 'needs-owner' ? 'outer-supervisor' : null,
3613
+ why: result.reason ?? result.detail ?? record.cause, readStopKeys: chartBefore.map((cell) => cell.stopKey), dir: chartDir });
3580
3614
  if (result.action === 'needs-owner') {
3581
3615
  try {
3582
- const stopKey = JSON.stringify([stopEntry.timestamp, record.site ?? '', record.class, record.cause, record.evidenceRef]);
3583
- const visit = recordParentNeedsOwnerVisit({ runId: stopEntry.runId, stopKey, evidence: result.reason ?? record.cause });
3616
+ const visit = recordParentNeedsOwnerVisit({ runId: stopEntry.runId, stopKey: chartStopKey, evidence: result.reason ?? record.cause });
3584
3617
  if (visit.status === 'missing-ledger') {
3585
3618
  debug.log('run-doctor', 'visit-failed', { runId: stopEntry.runId, from: 'parent', symptom: 'needs-owner', error: 'run-ledger-missing' });
3586
3619
  }
@@ -3594,6 +3627,54 @@ async function autohealRecordedStop(stopEntry: RunLedgerEntry, s: SelfImplementS
3594
3627
  }
3595
3628
  }
3596
3629
 
3630
+ async function dispatchTerminalHarnessHeal(input: {
3631
+ result: SelfImplementResult;
3632
+ runId: string;
3633
+ goalId?: string;
3634
+ shardIdentity: RunShardIdentity;
3635
+ seams: SelfImplementSeams;
3636
+ }): Promise<void> {
3637
+ const { result, runId, goalId, shardIdentity, seams } = input;
3638
+ const mergeHeld = Boolean(result.mergeReason && result.mergeReason !== 'auto');
3639
+ if (result.outcome !== 'abandoned' && result.outcome !== 'budget-exhausted' && result.stage !== 'timed-out' && !mergeHeld) return;
3640
+ if (runStopRecorded(runId)) return;
3641
+ const stopClass = mergeHeld ? classifyMergeHoldStop(result.mergeReason) : classifyTerminalHarnessFailure({
3642
+ stage: result.stage,
3643
+ cause: result.detail,
3644
+ mergeReason: result.mergeReason,
3645
+ abandonedClassification: result.abandonedClassification?.classification,
3646
+ providerErrorCategory: result.providerErrors?.category,
3647
+ supervisorVerdict: result.supervisorVerdict,
3648
+ });
3649
+ let priorLedger: RunLedgerEntry[] = [];
3650
+ try { priorLedger = loadRunLedger(runId) ?? []; } catch { /* terminal observation must not change the run result */ }
3651
+ const terminalEvidence = buildRunStopTerminalEvidence({
3652
+ stage: result.stage,
3653
+ node: result.node,
3654
+ outcome: result.outcome,
3655
+ detail: result.detail,
3656
+ terminationReason: result.terminationReason,
3657
+ providerErrorCategory: result.providerErrors?.category,
3658
+ entries: priorLedger,
3659
+ });
3660
+ let stopEntry: RunLedgerEntry | undefined;
3661
+ try {
3662
+ stopEntry = recordRunStop({
3663
+ runId,
3664
+ ...(goalId ? { goalId } : {}),
3665
+ shardIdentity,
3666
+ site: mergeHeld ? 'merge-hold' : `terminal-${result.stage}`,
3667
+ class: stopClass,
3668
+ // Never copy free-form provider/child text into the durable stop summary.
3669
+ cause: mergeHeld ? `merge held: ${result.mergeReason}` : `terminal failure: ${result.stage}; ${terminalEvidence.reasonCode}`,
3670
+ evidenceRef: result.prUrl ?? `run-ledger:${runId}:${result.stage}`,
3671
+ nextMove: `Existing heal ladder: ${stopClass}; failure disposition remains until its prescribed action resolves`,
3672
+ terminalEvidence,
3673
+ }, seams.writeRunLedger ?? appendRunLedgerEntry);
3674
+ } catch { /* stop observation cannot change the run outcome */ }
3675
+ if (stopEntry) await autohealRecordedStop(stopEntry, seams);
3676
+ }
3677
+
3597
3678
  export function measureReviewRework(counts: readonly number[], findings: readonly (readonly RecurrenceFinding[])[]): ReviewRework {
3598
3679
  const deltas = counts.slice(1).map((count, index) => Math.sign(count - counts[index]!));
3599
3680
  const directions = deltas.filter((delta) => delta !== 0);
@@ -3761,17 +3842,20 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
3761
3842
  let lastCredentialFailureSeq = 0;
3762
3843
  let lastFailedGateSeq = 0;
3763
3844
  let lastMustFixReviewSeq = 0;
3845
+ let providerErrorAtLastGate: string | undefined;
3764
3846
  const recordFailureVerdict = async (kind: 'gate' | 'review'): Promise<void> => {
3765
3847
  // Capture child errors at the verdict boundary, not when terminal reporting eventually reads them.
3766
3848
  await mergeChildProviderErrors();
3849
+ providerErrorAtLastGate = lastProviderErrorSeq > Math.max(lastFailedGateSeq, lastMustFixReviewSeq)
3850
+ ? lastProviderError?.message : undefined;
3767
3851
  if (kind === 'gate') lastFailedGateSeq = ++failureSequence;
3768
3852
  else lastMustFixReviewSeq = ++failureSequence;
3769
3853
  };
3770
3854
  const latestVerdictSeq = (): number => Math.max(lastFailedGateSeq, lastMustFixReviewSeq);
3771
3855
  const hasCurrentProviderError = (): boolean => providerErrorCount > 0 && lastProviderErrorSeq > latestVerdictSeq();
3772
3856
  const hasCurrentCredentialFailure = (): boolean => credentialFailureCount > 0 && lastCredentialFailureSeq > latestVerdictSeq();
3773
- let lastProviderError: { provider?: string; message?: string } | undefined;
3774
- let lastCredentialFailure: { provider?: string; message?: string } | undefined;
3857
+ let lastProviderError: { provider?: string; model?: string; message?: string; observedAt?: string } | undefined;
3858
+ let lastCredentialFailure: { provider?: string; model?: string; message?: string; observedAt?: string } | undefined;
3775
3859
  let childProviderErrorQueryStatus: 'found' | 'none' | 'unavailable' | 'not-configured' = 'not-configured';
3776
3860
  let queriedProviderErrorCount = 0;
3777
3861
  let queriedCredentialFailureCount = 0;
@@ -3808,18 +3892,43 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
3808
3892
  childProviderErrorQueryStatus = 'unavailable';
3809
3893
  }
3810
3894
  };
3895
+ const observeFailureClassificationInputs = (result: SelfImplementResult): void => {
3896
+ if (!isAbandonedClassificationOutcome(result.outcome)) return;
3897
+ observeOuter('failure-classification-inputs', {
3898
+ stage: result.stage,
3899
+ node: result.node,
3900
+ outcome: result.outcome,
3901
+ classification: result.abandonedClassification?.classification ?? null,
3902
+ classificationBasis: result.abandonedClassification?.classificationBasis ?? null,
3903
+ childProviderErrorQueryStatus,
3904
+ providerErrorCount,
3905
+ credentialFailureCount,
3906
+ queriedProviderErrorCount,
3907
+ queriedCredentialFailureCount,
3908
+ lastProviderError: lastProviderError ? { provider: lastProviderError.provider ?? null, model: lastProviderError.model ?? null, observedAt: lastProviderError.observedAt ?? null } : null,
3909
+ lastCredentialFailure: lastCredentialFailure ? { provider: lastCredentialFailure.provider ?? null, model: lastCredentialFailure.model ?? null, observedAt: lastCredentialFailure.observedAt ?? null } : null,
3910
+ lastProviderErrorSeq,
3911
+ lastCredentialFailureSeq,
3912
+ lastFailedGateSeq,
3913
+ lastMustFixReviewSeq,
3914
+ currentProviderError: hasCurrentProviderError(),
3915
+ currentCredentialFailure: hasCurrentCredentialFailure(),
3916
+ });
3917
+ };
3811
3918
  const unregisterProviderErrorSink = debug.registerSink({
3812
3919
  name: `self-implement-provider-error-${runId}`,
3813
3920
  emit(record) {
3814
3921
  if (record.category !== 'llm.router.error') return;
3815
3922
  const data = record.data;
3816
3923
  if (!data || typeof data !== 'object') return;
3817
- const { provider, message } = data as Record<string, unknown>;
3924
+ const { provider, model, message } = data as Record<string, unknown>;
3818
3925
  providerErrorCount++;
3819
3926
  lastProviderErrorSeq = ++failureSequence;
3820
3927
  lastProviderError = {
3821
3928
  ...(typeof provider === 'string' ? { provider } : {}),
3929
+ ...(typeof model === 'string' ? { model } : {}),
3822
3930
  ...(typeof message === 'string' ? { message } : {}),
3931
+ ...(typeof record.ts === 'string' ? { observedAt: record.ts } : {}),
3823
3932
  };
3824
3933
  // ⛔⭐⭐⭐ 자격 거부는 「프로바이더 오류」의 부분집합이지만 ***사람이 할 다음 행동이 다르다***
3825
3934
  // (2026-08-14 실측 · `[T]` 83차): grok 자식 «둘»이 401 로 죽었는데 부모가 남긴 것은
@@ -4108,6 +4217,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
4108
4217
  }
4109
4218
  };
4110
4219
  let terminalResult: SelfImplementResult | undefined;
4220
+ let uncaughtTerminalStop: SelfImplementResult | undefined;
4111
4221
  let reviewReflectRejectedCount: number | undefined;
4112
4222
  const attachReviewReflectionOutcome = <T extends Omit<SelfImplementResult, 'runId'>>(result: T): T & Pick<SelfImplementResult, 'completionStatus' | 'reviewReflectRejectedCount'> => ({
4113
4223
  ...result,
@@ -4287,6 +4397,11 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
4287
4397
  (sessionId) => { terminalSessionId = sessionId; },
4288
4398
  (contract) => { runContract = contract; },
4289
4399
  recordFailureVerdict,
4400
+ () => {
4401
+ const error = providerErrorAtLastGate;
4402
+ providerErrorAtLastGate = undefined;
4403
+ return error;
4404
+ },
4290
4405
  () => providerErrorCount > 0,
4291
4406
  () => credentialFailureCount > 0,
4292
4407
  hasCurrentProviderError,
@@ -4307,6 +4422,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
4307
4422
  opts.seams.inspectCodexRotation,
4308
4423
  runProviderName,
4309
4424
  );
4425
+ observeFailureClassificationInputs(addressedResult);
4310
4426
  if (isAbandonedClassificationOutcome(addressedResult.outcome)) logQuotaProvider(addressedResult.quotaExhaustionAssessment);
4311
4427
  observeOuter('child-provider-error-query', { status: childProviderErrorQueryStatus });
4312
4428
  if (lastProviderError) {
@@ -4318,20 +4434,24 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
4318
4434
  }
4319
4435
  terminalResult = withEvidenceCoverage(withMeasuredRework(addressedResult));
4320
4436
  // runSelfImplement is the terminal caller: retain every existing PR/ledger/log observation and append one stop fact.
4321
- if ((addressedResult.stage === 'aborted' || (addressedResult.mergeReason && addressedResult.mergeReason !== 'auto')) && !runStopRecorded(runId)) {
4437
+ const envDeficitStop = addressedResult.stage === 'gate-failed' && addressedResult.harvestable === true
4438
+ && addressedResult.detail?.includes(GATE_ENV_DEFICIT_HARVESTABLE_MARK) === true;
4439
+ if ((addressedResult.stage === 'aborted' || envDeficitStop || (addressedResult.mergeReason && addressedResult.mergeReason !== 'auto')) && !runStopRecorded(runId)) {
4322
4440
  const reason = addressedResult.mergeReason;
4323
4441
  const aborted = addressedResult.stage === 'aborted';
4324
4442
  let stopEntry: RunLedgerEntry | undefined;
4325
4443
  try {
4326
4444
  stopEntry = recordRunStop({ runId, ...(opts.goalId ? { goalId: opts.goalId } : {}), shardIdentity,
4327
- site: aborted ? 'implement-aborted' : 'merge-hold',
4328
- class: aborted ? 'unclassified' : classifyMergeHoldStop(reason), cause: aborted ? 'implement aborted' : `merge held: ${reason}`,
4445
+ site: envDeficitStop ? 'gate-env-deficit' : aborted ? 'implement-aborted' : 'merge-hold',
4446
+ class: envDeficitStop ? 'env-unrelated' : aborted ? 'unclassified' : classifyMergeHoldStop(reason),
4447
+ cause: envDeficitStop ? addressedResult.detail ?? 'gate environment deficit' : aborted ? 'implement aborted' : `merge held: ${reason}`,
4329
4448
  evidenceRef: addressedResult.prUrl ?? `run-ledger:${runId}:${aborted ? 'implemented' : 'merge-decision'}`,
4330
- nextMove: aborted ? 'Inspect preserved worktree and child summary' : 'Review merge decision and PR before landing',
4449
+ nextMove: envDeficitStop ? 'Measure the preserved PR head in a clean checkout' : aborted ? 'Inspect preserved worktree and child summary' : 'Review merge decision and PR before landing',
4331
4450
  }, opts.seams.writeRunLedger ?? appendRunLedgerEntry);
4332
4451
  } catch { /* stop observation cannot change the run outcome */ }
4333
4452
  if (stopEntry) await autohealRecordedStop(stopEntry, opts.seams);
4334
4453
  }
4454
+ await dispatchTerminalHarnessHeal({ result: addressedResult, runId, ...(opts.goalId ? { goalId: opts.goalId } : {}), shardIdentity, seams: opts.seams });
4335
4455
  observeDeclaredScopeDiff(observeOuter, {
4336
4456
  goalFile: opts.goalFile,
4337
4457
  changedFiles: opts.goalFile && addressedResult.worktreePath
@@ -4420,6 +4540,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
4420
4540
  terminalNode = result.node;
4421
4541
  await mergeChildProviderErrors();
4422
4542
  const addressedResult = attachAbandonedClassification(attachReviewReflectionOutcome({ ...result, ...providerErrorsForResult() }), opts.goalFile, hasCurrentProviderError(), hasCurrentCredentialFailure(), opts.seams.inspectCodexRotation, runProviderName);
4543
+ observeFailureClassificationInputs(addressedResult);
4423
4544
  logQuotaProvider(addressedResult.quotaExhaustionAssessment);
4424
4545
  observeOuter('child-provider-error-query', { status: childProviderErrorQueryStatus });
4425
4546
  if (lastProviderError) {
@@ -4429,6 +4550,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
4429
4550
  observeOuter('credential-failure-observed', { count: credentialFailureCount, ...lastCredentialFailure });
4430
4551
  }
4431
4552
  terminalResult = withMeasuredRework(addressedResult); // ⛔ 이 분기(StepTimeoutError)는 스코프가 달라 달성 근사값은 «없다»(0 으로 채우지 않는다)
4553
+ await dispatchTerminalHarnessHeal({ result: addressedResult, runId, ...(opts.goalId ? { goalId: opts.goalId } : {}), shardIdentity, seams: opts.seams });
4432
4554
  observeDeclaredScopeDiff(observeOuter, {
4433
4555
  goalFile: opts.goalFile,
4434
4556
  changedFiles: opts.goalFile && addressedResult.worktreePath
@@ -4489,9 +4611,12 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
4489
4611
  ...terminalDetail(terminalSessionId),
4490
4612
  },
4491
4613
  });
4614
+ uncaughtTerminalStop = { runId, ok: false, stage: 'aborted', node: terminalNode ?? 'implement', outcome: 'abandoned', detail: safeErrorDescription(e) };
4492
4615
  throw e;
4493
4616
  } finally {
4494
4617
  if (loopRegistered) registerRunLoop('ended');
4618
+ // Persist the outer-exception stop and its prescription before the crashed run-status below.
4619
+ if (uncaughtTerminalStop) await dispatchTerminalHarnessHeal({ result: uncaughtTerminalStop, runId, ...(opts.goalId ? { goalId: opts.goalId } : {}), shardIdentity, seams: opts.seams });
4495
4620
  const terminalStage = terminalResult?.stage ?? 'crashed';
4496
4621
  // A blocked draft may be opened on the first failed attempt, before the
4497
4622
  // normal outcome observer has written its terminal status. Persist the
@@ -4564,6 +4689,10 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
4564
4689
  summary: reworkCap
4565
4690
  ? reworkCapFailureSummary(opts.feature, reworkCap)
4566
4691
  : opts.feature.split(/\r?\n/, 1)[0]?.trim() || `Harness run ${runId} failed`,
4692
+ goalText: opts.feature,
4693
+ ...(opts.goalId ? { goalId: opts.goalId } : {}),
4694
+ ...(opts.goalFile ? { goalFile: opts.goalFile } : {}),
4695
+ ...(opts.healCellKey ? { cellKey: opts.healCellKey } : {}),
4567
4696
  at: new Date().toISOString(),
4568
4697
  });
4569
4698
  }
@@ -4952,6 +5081,38 @@ function reworkCapFailureSummary(feature: string, decision: ReworkCapHealDecisio
4952
5081
  return `${title} [${decision.defectClass} → ${decision.nextAction}] ${evidence}`;
4953
5082
  }
4954
5083
 
5084
+ /** ⭐ SELFIMPL-NODE-SEAMS-BACK — 등록 부품(구현·gate·리뷰·git·착지)을 graphs/units 에서 해석하고
5085
+ * 합성 선언을 평탄화해 «하나의 NodeContext» 로 묶는다. ⛔ 실패는 값(reason)으로 낸다 — 실행을 막지 않는다. */
5086
+ export function resolveRunStageNodeContext(input: {
5087
+ readonly graphId: string;
5088
+ readonly graphVersion: string;
5089
+ readonly graphsDir: string;
5090
+ readonly runId: string;
5091
+ readonly attempts?: number;
5092
+ readonly round?: number;
5093
+ readonly goalId?: string;
5094
+ readonly goalType?: string;
5095
+ }): { readonly nodeContext?: StageNodeContext; readonly reason?: string } {
5096
+ const resolution = resolveGraphStageUnits(input.graphId, input.graphsDir);
5097
+ if (resolution.units.length === 0) {
5098
+ return { reason: resolution.reason ?? 'no-unit-resolved' };
5099
+ }
5100
+ return {
5101
+ nodeContext: buildStageNodeContext({
5102
+ resolution,
5103
+ graphId: input.graphId,
5104
+ graphVersion: input.graphVersion,
5105
+ runId: input.runId,
5106
+ ...(input.attempts === undefined ? {} : { attempts: input.attempts }),
5107
+ ...(input.round === undefined ? {} : { round: input.round }),
5108
+ ...(input.goalId === undefined ? {} : { goalId: input.goalId }),
5109
+ ...(input.goalType === undefined ? {} : { goalType: input.goalType }),
5110
+ }),
5111
+ ...(resolution.reason === undefined ? {} : { reason: resolution.reason }),
5112
+ };
5113
+ }
5114
+
5115
+ /** 라운드마다 같은 부품이 «그 파일·그 판»인지 — 도는 중에 바뀌면 걸음과 신원이 갈린다. */
4955
5116
  async function runSelfImplementInner(
4956
5117
  opts: SelfImplementOptions,
4957
5118
  identity?: { runId: string; source: ReturnType<typeof resolveRunIdentity>['source'] },
@@ -4988,13 +5149,14 @@ async function runSelfImplementInner(
4988
5149
  hasCredentialFailure: () => boolean = () => false,
4989
5150
  providerErrorCategory: () => NonNullable<SelfImplementResult['providerErrors']>['category'] | undefined = () => undefined,
4990
5151
  onReviewReflectRejected: (rejectedCount: number) => void = () => {},
4991
- observe: ReturnType<typeof makeRunObserver> = makeRunObserver(identity?.runId ?? resolveRunIdentity({ explicit: opts.runId }).runId, opts.goalId, debug.log.bind(debug), opts.seams.writeRunLedger, shardIdentity),
5152
+ observe?: ReturnType<typeof makeRunObserver>,
4992
5153
  /** ⭐ 「이 런이 «실제로» 어느 두뇌로 돌았나」를 원장까지 나른다 — ⛔ 기록 «시점»에 다시 읽지 않는다
4993
5154
  * (그러면 「런이 끝날 무렵의 provider」가 되어 `F45` 를 그대로 밟는다). 시작 시점 값을 넘긴다. */
4994
5155
  onActiveProvider: (active: { provider?: string; model?: string; auth?: string }) => void = () => {},
4995
5156
  onSessionCreated: (sessionId: string) => void = () => {},
4996
5157
  onRunContractResolved: (contract: RunContract) => void = () => {},
4997
5158
  onFailureVerdict: (kind: 'gate' | 'review') => Promise<void> = async () => {},
5159
+ providerErrorAtLastGate: () => string | undefined = () => undefined,
4998
5160
  hasObservedProviderError: () => boolean = hasProviderError,
4999
5161
  hasObservedCredentialFailure: () => boolean = hasCredentialFailure,
5000
5162
  hasCurrentProviderError: () => boolean = hasProviderError,
@@ -5005,7 +5167,23 @@ async function runSelfImplementInner(
5005
5167
  onPrAttributed: (number: number) => void = () => {},
5006
5168
  onPrAttributionMismatch: () => void = () => {},
5007
5169
  ): Promise<Omit<SelfImplementResult, 'runId'>> {
5170
+ const runIdentity = identity ?? resolveRunIdentity({ explicit: opts.runId });
5171
+ observe ??= makeRunObserver(runIdentity.runId, opts.goalId, debug.log.bind(debug), opts.seams.writeRunLedger, shardIdentity);
5008
5172
  const s = opts.seams;
5173
+ const deliveredHealPacks = new Set<string>();
5174
+ const healRunId = identity?.runId ?? resolveRunIdentity({ explicit: opts.runId }).runId;
5175
+ try {
5176
+ const entries = (s.healPackLoadLedger ?? (s.writeRunLedger ? () => null : loadRunLedger))(healRunId);
5177
+ for (const entry of entries ?? []) {
5178
+ if (entry.runId !== healRunId || entry.event !== 'supervisor-heal-pack'
5179
+ || !['matched', 'already-delivered'].includes(String(entry.data?.decision))) continue;
5180
+ const { signature, packIds } = entry.data;
5181
+ if (typeof signature !== 'string' || !Array.isArray(packIds)) continue;
5182
+ for (const id of packIds) {
5183
+ if (typeof id === 'string') deliveredHealPacks.add(`${healRunId}:${signature}:${id}`);
5184
+ }
5185
+ }
5186
+ } catch { /* An unavailable history contributes no invented deliveries. */ }
5009
5187
  const pipelineStartedAtMs = Date.now();
5010
5188
  // Graph authority is always ON; retain the resolved event with default provenance.
5011
5189
  // For research documents, its declared docs-only routing intentionally skips the gate.
@@ -5046,9 +5224,16 @@ async function runSelfImplementInner(
5046
5224
  : undefined;
5047
5225
  if (launch && !launch.ok) throw new Error(`graph variant rejected: ${JSON.stringify(launch.rejections)}`);
5048
5226
  const sourceSpec = launch?.ok ? launch.template : baseSpec;
5227
+ // ⭐ unit 선언 근거 — 이 런이 읽은 «대상 경로»(단위 선언) 원문의 내용 해시만 남긴다.
5228
+ // ⛔ 본문은 로그에도 원장에도 복제하지 않는다(goalContentHash 와 같은 해시-only 예비).
5229
+ // ⛔ 읽지 못한 경로(신설 파일 등)는 해시를 지어내지 않고 근거에서 뺀다.
5230
+ const unitDeclarations = declaredPremiseScopePaths(opts.feature).flatMap(path => {
5231
+ try { return [{ path, content: readFileSync(resolve(process.cwd(), path), 'utf8') }]; } catch { return []; }
5232
+ });
5049
5233
  // ⭐ 최초 변형 선택 — 골 종류(graphGoalType)·대상 경로 수(declaredPremiseScopePaths) 두 입력만으로
5050
5234
  // 결정론적으로 id·선택 이유를 유도해 검증 결과에 싣는다(종류를 못 읽었으면 지어내지 않는다).
5051
5235
  const variant = createGraphVariant({ template: sourceSpec, goal: `g_${variantRunId.replace(/[^a-z0-9_-]/gi, '_')}`, plan: opts.graphVariantPlan,
5236
+ ...(unitDeclarations.length === 0 ? {} : { unitDeclarations }),
5052
5237
  ...(graphGoalType === undefined ? {} : { goalAnalysis: { goalType: graphGoalType, targetPathCount: declaredPremiseScopePaths(opts.feature).length } }) });
5053
5238
  if (!variant.ok) throw new Error(`graph variant rejected: ${JSON.stringify(variant.rejections)}`);
5054
5239
  variantSpec = variant.template;
@@ -5056,6 +5241,9 @@ async function runSelfImplementInner(
5056
5241
  const graphFile = saveRunGraphVariant(variantRunId, stringify({
5057
5242
  graph_id: variantSpec.graphId, version: variantSpec.version,
5058
5243
  ...(variant.selection === undefined ? {} : { variant_id: variant.selection.variantId, reason: variant.selection.reason }),
5244
+ // 추가 키 — 한 런이 어느 unit 선언 «버전»을 읽었는지. 경로·내용 해시뿐이고 본문은 없다.
5245
+ ...(variant.selection?.unitDeclarations === undefined ? {}
5246
+ : { unit_declarations: variant.selection.unitDeclarations.map(entry => ({ path: entry.path, content_hash: entry.contentHash })) }),
5059
5247
  entry_node: variantSpec.entryNode, terminal_nodes: variantSpec.terminalNodes,
5060
5248
  ...(variantSpec.journeyStages ? { journey_stages: variantSpec.journeyStages } : {}),
5061
5249
  ...(variantSpec.runContract ? { run_contract: variantSpec.runContract } : {}),
@@ -5080,13 +5268,15 @@ async function runSelfImplementInner(
5080
5268
  // ⭐ 저장·diff — 방금 원장 옆에 쓴 선택(id·이유)을 다시 읽어 «같은지» 확인한다(다르면 이 런의 그래프 신원이 거짓).
5081
5269
  if (variant.selection !== undefined) {
5082
5270
  const persisted = loadRunGraphVariant(variantRunId);
5083
- if (persisted === null || persisted.variantId !== variant.selection.variantId || persisted.reason !== variant.selection.reason) {
5271
+ if (persisted === null || persisted.variantId !== variant.selection.variantId || persisted.reason !== variant.selection.reason
5272
+ || JSON.stringify(persisted.unitDeclarations ?? null) !== JSON.stringify(variant.selection.unitDeclarations ?? null)) {
5084
5273
  throw new Error(`graph variant rejected: persisted selection mismatch: ${JSON.stringify(persisted)}`);
5085
5274
  }
5086
5275
  }
5087
5276
  observe('graph-variant-applied', { graphId: variant.template.graphId, overlayId: variant.overlay.overlayId,
5088
5277
  graphFile, patches: variant.patches,
5089
- ...(variant.selection === undefined ? {} : { variantId: variant.selection.variantId, variantReason: variant.selection.reason }) });
5278
+ ...(variant.selection === undefined ? {} : { variantId: variant.selection.variantId, variantReason: variant.selection.reason }),
5279
+ ...(variant.selection?.unitDeclarations === undefined ? {} : { unitDeclarations: variant.selection.unitDeclarations }) });
5090
5280
  }
5091
5281
  /** 단계 이름 → 그 템플릿의 노드 이름. */
5092
5282
  const node = (stage: PipelineNodeId): PipelineNodeId => nodeNameForStage(stage, graphTemplate) as PipelineNodeId;
@@ -5103,6 +5293,28 @@ async function runSelfImplementInner(
5103
5293
  onRunContractResolved(runContract);
5104
5294
  observe('graph-run-contract-resolved', { ...graphIdentityOf(graphTemplate), ...runContract, ...runContractAtNode(runContract) });
5105
5295
  }
5296
+ // ⭐ SELFIMPL-NODE-SEAMS-BACK — 등록 부품을 «생산 진입점»에서 해석·평탄화해 하나의 NodeContext 로 만든다.
5297
+ // ⛔ 이 줄이 없으면 부품은 선언만 있고 걸음에서 안 불린다. 실패는 값으로 남기고 실행은 안 막는다.
5298
+ let nodeContext: StageNodeContext | undefined;
5299
+ {
5300
+ const unitResolution = resolveRunStageNodeContext({
5301
+ graphId: graphTemplate.graphId,
5302
+ graphVersion: graphTemplate.version,
5303
+ graphsDir: defaultGraphsDir(),
5304
+ runId: runIdentity.runId,
5305
+ ...(typeof attemptOrdinal === 'number' ? { attempts: attemptOrdinal } : {}),
5306
+ ...(opts.goalId === undefined ? {} : { goalId: opts.goalId }),
5307
+ ...(graphGoalType === undefined ? {} : { goalType: graphGoalType }),
5308
+ });
5309
+ nodeContext = unitResolution.nodeContext;
5310
+ if (nodeContext === undefined) {
5311
+ if (graphTemplate.graphId === 'self-implement') {
5312
+ observe('graph-stage-units-unresolved', { ...graphIdentityOf(graphTemplate), reason: unitResolution.reason ?? 'no-unit-resolved' });
5313
+ }
5314
+ } else {
5315
+ observe('graph-stage-units-resolved', stageNodeContextObservation(nodeContext));
5316
+ }
5317
+ }
5106
5318
  // ⛔ 승격이 꺼져 있으면 «심지 않는다» — 그러면 예산 관측도 안 난다(운영 원장이 오늘과 같다).
5107
5319
  if (graphAuthority.enabled) onGraphTemplateResolved(graphTemplate);
5108
5320
  // ⛔ 선택을 «전부» 싣는다 — 얹힌 것만 실으면 「왜 안 얹혔나」를 사후에 못 묻는다.
@@ -5116,7 +5328,7 @@ async function runSelfImplementInner(
5116
5328
  // ⛔ 「지금 아는 것」만 준다 — 없는 값을 0 으로 지어내지 않는다(key-absent 가 그것을 말한다).
5117
5329
  let stopClass: import('./run-stop.js').RunStopClass | undefined;
5118
5330
  try {
5119
- const { runId } = identity ?? resolveRunIdentity({ explicit: opts.runId });
5331
+ const { runId } = runIdentity;
5120
5332
  const entries = loadRunLedger(runId);
5121
5333
  const lastStop = entries?.slice().reverse().find((entry) => entry.event === 'stop');
5122
5334
  if (lastStop && isRunStopClass(lastStop.data.class)) stopClass = readRunStopRecord(lastStop)?.class;
@@ -5136,6 +5348,16 @@ async function runSelfImplementInner(
5136
5348
  ...(variantSpec ? { specs: { [variantSpec.graphId]: variantSpec } } : {}),
5137
5349
  });
5138
5350
  if (decision.appliedIds.length > 0) graphTemplate = decision.template;
5351
+ // ⭐ SELFIMPL-NODE-SEAMS-BACK — 같은 NodeContext 가 라운드로 이어진다: 체크포인트를 옮기고,
5352
+ // 부품이 도는 중에 다른 판으로 바뀌었으면 그 사실을 값으로 낸다(걸음과 신원이 갈리는 것을 막는다).
5353
+ if (nodeContext !== undefined) {
5354
+ nodeContext = { ...nodeContext, checkpoint: { ...nodeContext.checkpoint, round } };
5355
+ const drift = stageUnitDrift(nodeContext.grounding.units, defaultGraphsDir());
5356
+ observe('graph-stage-units-drift', {
5357
+ graphId: nodeContext.goal.graphId, graphVersion: nodeContext.goal.graphVersion,
5358
+ round, missing: drift.missing, changed: drift.changed,
5359
+ });
5360
+ }
5139
5361
  // ⛔⭐ 승격이 켜져 있으면 «언제나» 낸다 — 후보가 0이어도 낸다.
5140
5362
  // 🩸 안 내면 「얹을 게 없었다」와 「이 배선이 «안 돌았다»」가 원장에서 «같은 값»(0건)이 된다.
5141
5363
  // ⇒ `considered` 가 그 둘을 가른다: 배선이 돌면 이 줄이 있고, 그 수가 «본 오버레이 수»다.
@@ -5174,7 +5396,7 @@ async function runSelfImplementInner(
5174
5396
  roundClassifications.push(classification);
5175
5397
  onRoundClassification(classification);
5176
5398
  };
5177
- const { runId, source: runIdSource } = identity ?? resolveRunIdentity({ explicit: opts.runId });
5399
+ const { runId, source: runIdSource } = runIdentity;
5178
5400
  const branch = opts.branchName ?? plannedSelfImplBranch(opts.feature, opts.goalId, runId);
5179
5401
  try {
5180
5402
  debug.log('run-identity', 'own', {
@@ -5922,6 +6144,7 @@ async function runSelfImplementInner(
5922
6144
  };
5923
6145
  let preservationBase = wt.resolvedBase;
5924
6146
  const runProviderName = opts.childLlm?.provider ?? (s.currentProviderName?.() ?? currentProviderName());
6147
+ let activeChildLlm = opts.childLlm;
5925
6148
  let cachedQuotaExhaustionAssessment: QuotaExhaustionAssessment | undefined;
5926
6149
  const quotaExhaustionAssessmentForRun = (): QuotaExhaustionAssessment => {
5927
6150
  cachedQuotaExhaustionAssessment ??= readQuotaExhausted(s.inspectCodexRotation, runProviderName);
@@ -7050,7 +7273,38 @@ async function runSelfImplementInner(
7050
7273
  if (fabricObservation) observe('rework-budget-fabric-shadow', fabricObservation);
7051
7274
  }
7052
7275
  } catch (error) {
7053
- if (judgmentStarted) throw error;
7276
+ if (judgmentStarted) {
7277
+ const failureKind = classifyReviewProviderFailure(safeErrorDescription(error));
7278
+ if (failureKind === 'credentials-unavailable') {
7279
+ const blockedStage = isReviewRework(reworkKind) ? 'review-blocked' : 'gate-failed';
7280
+ const reason = 'rework skipped: provider credentials unavailable';
7281
+ observe('rework-skipped-provider-unavailable', { round, kind: reworkKind, reason: failureKind }, { level: 'warn' });
7282
+ finalizeSupervisorDeliveries('rework-provider-credentials-unavailable');
7283
+ if (blockedStage === 'review-blocked') recordPendingReviewTriage('follow-up', 'review-blocked', effectiveMax);
7284
+ const pr = await preserveBlockedArtifacts({
7285
+ stage: blockedStage,
7286
+ reason,
7287
+ gate,
7288
+ failureKind,
7289
+ salvageStatusExpected: false,
7290
+ });
7291
+ const common = {
7292
+ ok: false as const,
7293
+ node: 'rework' as const,
7294
+ ...resolveRunOutcome({ termination: 'abandoned' }),
7295
+ sessionId,
7296
+ worktreePath: wt.path,
7297
+ branch: wt.branch,
7298
+ gate,
7299
+ ...(review ? { review } : {}),
7300
+ quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(),
7301
+ };
7302
+ return blockedStage === 'review-blocked'
7303
+ ? { ...common, ...reviewBlockedResult(pr), detail: reason }
7304
+ : { ...common, stage: 'gate-failed' as const, ...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: reason };
7305
+ }
7306
+ throw error;
7307
+ }
7054
7308
  consecutiveUnresolvedBudget = 0;
7055
7309
  }
7056
7310
  } else if (round > 0) {
@@ -7278,6 +7532,30 @@ async function runSelfImplementInner(
7278
7532
  }
7279
7533
  throw error;
7280
7534
  }
7535
+ // Only the preceding round's observed error or gate evidence can authorize a remedy.
7536
+ let healInput = '';
7537
+ if (round > 0) {
7538
+ const failure = reworkKind === 'gate' && gate?.passed === false ? gate : undefined;
7539
+ const failures = failure?.baselineFailures;
7540
+ const facts = failure?.reflectGateFacts;
7541
+ const providerMessage = providerErrorAtLastGate();
7542
+ const signature = providerMessage && /\b1310\b.*\blimit\b|\blimit\b.*\b1310\b/i.test(providerMessage) ? 'provider-1310'
7543
+ : failure && facts?.introduced === 0 && facts.preexisting !== undefined && facts.preexisting > 0
7544
+ && facts.unknown === 0 && failures?.length && failures.every(item => item.attribution === 'preexisting')
7545
+ ? 'preexisting'
7546
+ : failure && failures?.some(item => item.timeoutVariability === 'may-vary'
7547
+ && /\b(?:order|time)[ -]dependent\b/i.test(`${item.name} ${item.diagnostic ?? ''}`))
7548
+ ? 'order-time-dependent' : 'unknown';
7549
+ const pack = signature === 'unknown' ? { text: '', ids: [], bytes: 0 } : selectHealKnowhowPack(wt.path, signature);
7550
+ const freshIds = pack.ids.filter(id => !deliveredHealPacks.has(`${healRunId}:${signature}:${id}`));
7551
+ const decision = !pack.ids.length ? 'unknown' : freshIds.length ? 'matched' : 'already-delivered';
7552
+ if (decision === 'matched') {
7553
+ for (const id of freshIds) deliveredHealPacks.add(`${healRunId}:${signature}:${id}`);
7554
+ healInput = `[SUPERVISOR-HEAL-PACK signature=${signature} ids=${freshIds.join(',')}]\n${pack.text.split('\n').slice(1).filter(line => freshIds.some(id => line.startsWith(`${id}:`))).join('\n')}`;
7555
+ }
7556
+ observe('supervisor-heal-pack', { runId: healRunId, round, signature, packIds: decision === 'matched' ? freshIds : decision === 'already-delivered' ? pack.ids : [], decision,
7557
+ ...(decision === 'unknown' ? { missingEvidence: signature === 'unknown' ? 'observed-signature-unavailable' : 'matching-active-pack-unavailable' } : {}) });
7558
+ }
7281
7559
  const implementAbortController = new AbortController();
7282
7560
  const abortImplementation = (): void => implementAbortController.abort(opts.signal?.reason);
7283
7561
  if (opts.signal?.aborted) abortImplementation();
@@ -7299,18 +7577,66 @@ async function runSelfImplementInner(
7299
7577
  let supervisorInputClosed = false;
7300
7578
  const closeSupervisorInput = (): void => { supervisorInputClosed = true; };
7301
7579
  try {
7580
+ if (round > 0 && activeChildLlm?.provider === 'grok') {
7581
+ const { readGrokQuotaForLaunch, defaultChildLlmModel } = await import('../self-dev/dev-cli.js');
7582
+ const grokQuota = readGrokQuotaForLaunch();
7583
+ const grokCredential = resolveGrokCredential() ? 'available' as const : 'unavailable' as const;
7584
+ let codexRotation: ReturnType<typeof inspectCodexRotation> | undefined;
7585
+ try { codexRotation = (s.inspectCodexRotation ?? inspectCodexRotation)(); } catch { codexRotation = undefined; }
7586
+ const preference = resolveChildLlmPreference(getUserConfig());
7587
+ const alternateSlot = preference.chain.find((slot) => slot.provider === 'openai-codex' && slot.provider !== activeChildLlm!.provider);
7588
+ const hasCodexCredential = (codexRotation?.knownAccountCount ?? 0) > 0;
7589
+ const codexQuota = readQuotaExhausted(s.inspectCodexRotation, 'openai-codex');
7590
+ const alternate = hasCodexCredential ? {
7591
+ provider: 'openai-codex', model: alternateSlot?.model ?? defaultChildLlmModel('openai-codex'), source: 'config' as const,
7592
+ } : undefined;
7593
+ const decision = reselectChildForRework({ current: activeChildLlm, grokQuota, grokCredential,
7594
+ ...(alternate ? { alternate } : {}), alternateCredential: hasCodexCredential ? 'available' : 'unavailable',
7595
+ alternateQuotaExhausted: codexQuota.exhausted });
7596
+ if (decision.action === 'reselect') {
7597
+ activeChildLlm = decision.selection;
7598
+ observe('rework-child-model-reselected', { round, previousProvider: decision.previous.provider, previousModel: decision.previous.model,
7599
+ provider: activeChildLlm.provider, model: activeChildLlm.model, reason: decision.reason, quota: grokQuota,
7600
+ grokCredential, alternateQuotaExhausted: codexQuota.exhausted ?? null });
7601
+ }
7602
+ }
7302
7603
  implementPromise = s.implement({
7303
7604
  sessionId, cwd: wt.path, feature, runId, shardIdentity, signal: implementAbortController.signal,
7304
7605
  ...(harnessSeededPaths.length ? { harnessSeededPaths } : {}),
7305
7606
  onSurfaceProgress: (line) => progress('implementing', line.trimEnd()),
7306
7607
  onLifecycleScreenClassification: recordRoundClassification,
7307
- ...(round > 0 ? { roundContext: { round, effectiveMax, previousRoundFailure: reworkPromptNote, ...(landedSiblings ? { landedSiblings } : {}) } } : {}),
7608
+ ...(round > 0 ? { roundContext: { round, effectiveMax, previousRoundFailure: healInput ? `${reworkPromptNote}\n\n${healInput}` : reworkPromptNote, ...(landedSiblings ? { landedSiblings } : {}) } } : {}),
7308
7609
  onSupervisorInput: (text, updateDelivery) => {
7309
7610
  const normalized = text.trim();
7310
7611
  if (!normalized) {
7311
7612
  updateDelivery?.('not-delivered', 'empty-supervisor-input');
7312
7613
  return;
7313
7614
  }
7615
+ if (normalized.startsWith(RUN_DOCTOR_HANDOFF_INPUT_PREFIX)) {
7616
+ const runIdMatch = /(?:^|\s)runId=([^\s]+)/u.exec(normalized);
7617
+ const stopKeyMatch = /(?:^|\s)stopKey=([^\s]+)/u.exec(normalized);
7618
+ if (!runIdMatch?.[1] || runIdMatch[1] !== runId || !stopKeyMatch?.[1]) {
7619
+ updateDelivery?.('not-delivered', 'invalid-run-doctor-handoff');
7620
+ return;
7621
+ }
7622
+ void (s.runDoctorHandoff ?? runDoctorHandoff)({ runId, stopKey: stopKeyMatch[1], dir: runLedgerDir(elanousStateRoot() || undefined),
7623
+ dispatch: (action, handoff) => {
7624
+ if (action !== 'reauthor-from-materialized') return { outcome: 'needs-human', detail: `prescription executor not wired: ${action}` };
7625
+ const accepted = recordFailureEvent({ source: 'harness-run', kind: 'run-supervisor-wait-streak', ref: runId,
7626
+ summary: `[implement aborted] run-supervisor wait streak ${String(handoff.waitCount ?? 'unknown')} · doctor reauthor handoff`,
7627
+ goalText: feature, ...(opts.goalId ? { goalId: opts.goalId } : {}), ...(opts.goalFile ? { goalFile: opts.goalFile } : {}),
7628
+ ...(opts.healCellKey ? { cellKey: opts.healCellKey } : {}), at: new Date().toISOString() });
7629
+ return { outcome: accepted.folded ? 'heal-event-already-present' : 'heal-graph-requested',
7630
+ detail: accepted.folded ? 'same-run heal event already recorded' : 'PR1 heal intake accepted the materialized reauthor action' };
7631
+ },
7632
+ }).then((result) => {
7633
+ updateDelivery?.(result.status === 'acted' || result.status === 'already-acted' ? 'delivered' : 'not-delivered',
7634
+ result.status === 'needs-human' ? result.outcome : result.status === 'missing-handoff' ? 'run-chart-handoff-missing' : undefined);
7635
+ }).catch((error: unknown) => {
7636
+ updateDelivery?.('not-delivered', error instanceof Error ? error.message.slice(0, 120) : String(error).slice(0, 120));
7637
+ });
7638
+ return;
7639
+ }
7314
7640
  if (supervisorInputClosed) {
7315
7641
  recordUndeliveredSupervisorInput(normalized, 'late-supervisor-input');
7316
7642
  updateDelivery?.('not-delivered', 'late-supervisor-input');
@@ -7326,7 +7652,7 @@ async function runSelfImplementInner(
7326
7652
  supervisorDeliveryUpdates.push({ text: normalized, update: updateDelivery });
7327
7653
  },
7328
7654
  ...(escalateTier !== 'none' ? { escalateTier } : {}),
7329
- ...(opts.childLlm ? { childLlm: opts.childLlm } : {}),
7655
+ ...(activeChildLlm ? { childLlm: activeChildLlm } : {}),
7330
7656
  ...(opts.documentReferences ? { documentReferences: opts.documentReferences } : {}),
7331
7657
  });
7332
7658
  } catch (error) {
@@ -7401,7 +7727,7 @@ async function runSelfImplementInner(
7401
7727
  ...(harnessSeededPaths.length ? { harnessSeededPaths } : {}),
7402
7728
  onSurfaceProgress: line => progress('implementing', line.trimEnd()),
7403
7729
  roundContext: { round: retryRound, effectiveMax, previousRoundFailure: retryNote },
7404
- ...(opts.childLlm ? { childLlm: opts.childLlm } : {}),
7730
+ ...(activeChildLlm ? { childLlm: activeChildLlm } : {}),
7405
7731
  ...(opts.documentReferences ? { documentReferences: opts.documentReferences } : {}),
7406
7732
  }), T.implement, 'implement');
7407
7733
  } catch (error) {
@@ -7502,7 +7828,7 @@ async function runSelfImplementInner(
7502
7828
  ...(harnessSeededPaths.length ? { harnessSeededPaths } : {}),
7503
7829
  onSurfaceProgress: (line) => progress('implementing', line.trimEnd()),
7504
7830
  roundContext: { round: tddRetryRound, effectiveMax, previousRoundFailure: tddRetryNote },
7505
- ...(opts.childLlm ? { childLlm: opts.childLlm } : {}),
7831
+ ...(activeChildLlm ? { childLlm: activeChildLlm } : {}),
7506
7832
  ...(opts.documentReferences ? { documentReferences: opts.documentReferences } : {}),
7507
7833
  }), T.implement, 'implement');
7508
7834
  } catch (error) {
@@ -7697,7 +8023,10 @@ async function runSelfImplementInner(
7697
8023
  }, { compact: { stringMax: Math.max(MAX_HARVESTED_EVIDENCE_CHARS, harvestObs.harvestedEvidence?.length ?? 0) } });
7698
8024
  if (impl.ok) completionDisposition = finishedChildCommitMissing || finishedChildCommitted ? undefined : impl.completionDisposition;
7699
8025
  const effectiveDisposition = impl.ok ? completionDisposition : impl.completionDisposition;
7700
- observe('implemented', { ok: impl.ok, round, ...(effectiveDisposition ? { completionDisposition: effectiveDisposition } : {}) });
8026
+ let materializedPaths: readonly string[] | undefined;
8027
+ try { materializedPaths = (s.changedFilesForGateRoute ?? changedFiles)(wt.path); } catch { /* unknown diff is not path evidence */ }
8028
+ observe('implemented', { ok: impl.ok, round, ...(materializedPaths ? { materializedPaths: [...materializedPaths] } : {}),
8029
+ ...(effectiveDisposition ? { completionDisposition: effectiveDisposition } : {}) });
7701
8030
  progress('implemented', impl.ok ? (round === 0 ? '구현 완료' : `rework ${round} 완료`) : impl.completionDisposition ? '변경 없이 완료 검증' : '구현 실패(worktree 보존)');
7702
8031
  if (!impl.ok) {
7703
8032
  finalizeSupervisorDeliveries('next-round-implement-not-ok');