elanous 0.2.42 → 0.2.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (685) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/{X1ucLw10Cds_h614NoEnh → Om5xS9jpjSXJCeTNGYEi4}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{7a98bc80.fa935989e829f9c2.js → 0966f8a1.745fcd44f64a87ea.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/{73d2eb0e.4966ad55293c801a.js → 0ad6802e.ae7afb63fdcb4491.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/114.2b90424d1a3ce84c.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1151-5c2bb8f002ca2dd6.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1200.6a37c202f9f17e9a.js +226 -0
  9. package/apps/pwa/out/_next/static/chunks/1261-a616d5728e02e624.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/1313-19f737e0222c4444.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1357.3bbef3976c37f94a.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/1362-20adddfaf662b0fa.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/{3507.97e1977bc4d5fb0a.js → 1406.a1dc2ab6f8449374.js} +2 -2
  14. package/apps/pwa/out/_next/static/chunks/1737-9491fc6ab29b9ec6.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1803-4f91a8e7dcaf042c.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/1961.a81b12872c3e93a9.js +23 -0
  17. package/apps/pwa/out/_next/static/chunks/{53c73f84.373b6160adfa89a4.js → 1970cf59.2d4d8ce5d6c81853.js} +1 -1
  18. package/apps/pwa/out/_next/static/chunks/1971-8890f3962ba7ee0a.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/{9211-330b6736a63d4cb3.js → 2073-ba274e00e4f9efb4.js} +1 -1
  20. package/apps/pwa/out/_next/static/chunks/{7411.9b4b8b747dc7b802.js → 2144.25b292396712196d.js} +2 -2
  21. package/apps/pwa/out/_next/static/chunks/2268-53861f339e0b65a2.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2312.0c8b61e22d3136d7.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/{6632.0eac1c554f8f2ef3.js → 2573.387a707f6f9d720c.js} +2 -2
  24. package/apps/pwa/out/_next/static/chunks/273.f156eee28f11af77.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2873.d2140e5a82546401.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/{1262.e804feb8fd1acb8c.js → 3072.01338851ca21a6f7.js} +2 -2
  27. package/apps/pwa/out/_next/static/chunks/3091.a5a4143dea33d197.js +90 -0
  28. package/apps/pwa/out/_next/static/chunks/{2456.b6de0e1c05f28843.js → 3095.dc44586a5f83b86d.js} +1 -1
  29. package/apps/pwa/out/_next/static/chunks/{3207.a756c95e9ec8c3c8.js → 3113.d7472bbc27d580c7.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/3228-9650b6447b6fa288.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/3402.44b565b314f2263c.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/3557ac4a.c8931684475018ad.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/{8505.fd803c6c33b54cc3.js → 360.ae9f9f4c33c395e8.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/3638.80412ea63aae8f3f.js +286 -0
  35. package/apps/pwa/out/_next/static/chunks/{b450776b.3db34d8d965f82d3.js → 363bfab3.9623b9f89363541f.js} +1 -1
  36. package/apps/pwa/out/_next/static/chunks/3694.e0099884345f0198.js +64 -0
  37. package/apps/pwa/out/_next/static/chunks/3744.54f87db52acfd1ab.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3903.3ef4656c67572764.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3935.16701e33f8982dc9.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3955.6922286237f2ac2b.js +24 -0
  41. package/apps/pwa/out/_next/static/chunks/3969.272ee7f9fd6c62e5.js +34 -0
  42. package/apps/pwa/out/_next/static/chunks/{8138.6c10b2a356d52fca.js → 4199.ce86b281fd0a60b7.js} +1 -1
  43. package/apps/pwa/out/_next/static/chunks/4311-6dd3144002cc0c2d.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4426-2b230fad00c88930.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{2690.0521c738b7749931.js → 4445.7990c76b3751a918.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/4447-14c5161fa59166c7.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4856-b0b8075bba8c53f4.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4870-de370d65e73c0bb5.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4885-2c989165c4b29fad.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/{1945.7b54990d578c119b.js → 4894.fec2ca9e99caefa2.js} +1 -1
  51. package/apps/pwa/out/_next/static/chunks/5093.8f04b7f8cb899a95.js +94 -0
  52. package/apps/pwa/out/_next/static/chunks/5122-2bb177cebf89e19a.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/5154.5f56dc3902e3d275.js +36 -0
  54. package/apps/pwa/out/_next/static/chunks/529.64ff7257180b2ac9.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5394.5dabeb0c62293a28.js +93 -0
  56. package/apps/pwa/out/_next/static/chunks/5461.08bf2404ff38ec85.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/5474-22e08a85583209b2.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/{9427.96aa912ddb5801e0.js → 5564.9e72532188f57586.js} +16 -16
  59. package/apps/pwa/out/_next/static/chunks/5567-265df39ed8fe9dcb.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/5570-a94ae19811cb2046.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5574-b47c9ef2dceff1fd.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/{4043.6b91203436c9c86b.js → 5628.6ddb2d5ffba4ff4c.js} +4 -4
  63. package/apps/pwa/out/_next/static/chunks/{1319.b9b815ae0f181e06.js → 5730.43d7ccc09988e646.js} +1 -1
  64. package/apps/pwa/out/_next/static/chunks/{3482.a9ae9d2ad6a5bd97.js → 5789.2da35c258292e1e5.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/5824.da9527b15a3221e5.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5866.366966af47fdde5d.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/{1487.2f67b79444062da6.js → 5930.8b4df3b46c32b05a.js} +1 -1
  68. package/apps/pwa/out/_next/static/chunks/5963-c4d8469c52a0828b.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/6001.ec4049ceb3c43418.js +27 -0
  70. package/apps/pwa/out/_next/static/chunks/6120-471f03db1e299c0c.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6175-41479e643aca1878.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/6291.a2de4f9787637075.js +104 -0
  73. package/apps/pwa/out/_next/static/chunks/6400-6699907c3537436a.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/6428.1f4327d6ae5fdf9a.js +287 -0
  75. package/apps/pwa/out/_next/static/chunks/644.02cb026fa44bcd0a.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6466-6c87d60d3dd174fb.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{3347.f846266b5e5f3ede.js → 6540.c7bef57ad8f90a87.js} +3 -3
  78. package/apps/pwa/out/_next/static/chunks/6773.d4264665ab31bec0.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6822.3c789f1a8443e774.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/{8262.ddc03e06b733f184.js → 6944.309f4e3ea54d1537.js} +1 -1
  81. package/apps/pwa/out/_next/static/chunks/7261-8ff69d3b2ee671fd.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/7266.084c6bbc70035140.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/7271.5c0100e7320aa856.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7429-bf5731358c8f2f68.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7464.01f7a0ae1215fbe7.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7479.0fcad5f37eb64f0c.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/{4770.769c9cd9c7034eba.js → 7483.427a2fe2049e388d.js} +2 -2
  88. package/apps/pwa/out/_next/static/chunks/{1147-5196d19c222051b3.js → 7502-be74718178e13e56.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/7530.0889722b19572065.js +24 -0
  90. package/apps/pwa/out/_next/static/chunks/7645.5b2ee3ad45c55ea3.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7788.7d1c79f1a8e18946.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/7900.096f455c7c1efc53.js +77 -0
  93. package/apps/pwa/out/_next/static/chunks/7910-6f139bcafd238b9f.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7966.f71c8958d1637548.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{8673-bab689a55f7e13b9.js → 8062-7cd0bcc7f01455ba.js} +3 -3
  96. package/apps/pwa/out/_next/static/chunks/8073.f6cf2f2c71aafbd0.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8201.190b94088980f430.js +74 -0
  98. package/apps/pwa/out/_next/static/chunks/8205.282ca4bb62d54a0a.js +62 -0
  99. package/apps/pwa/out/_next/static/chunks/8313-dfa1021bb58a46d6.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/837-81336ebaca8198a8.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8447.7963352ef5f71b76.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8574-868e8129525ef6d9.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8588.d1c6a2903727ce87.js +149 -0
  104. package/apps/pwa/out/_next/static/chunks/8637.90f92d5c8db4732c.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/868.6e953be05bcf6dca.js +41 -0
  106. package/apps/pwa/out/_next/static/chunks/8706-e1fe0309343a2273.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8749-06384cdfc4520add.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/{9656-374232558fd528d0.js → 8861-cc1fa1c7b920fa8e.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/{5440-4236de26c5ea5856.js → 8967-7dfebf710c9dec9d.js} +1 -1
  110. package/apps/pwa/out/_next/static/chunks/{1063.2fb8a9dc55c731f2.js → 8986.8e2e4efbfa655c59.js} +1 -1
  111. package/apps/pwa/out/_next/static/chunks/8997-3c564dbb3b58b055.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/{4320.583cbab64db6be02.js → 923.2034d10ae91e9c20.js} +1 -1
  113. package/apps/pwa/out/_next/static/chunks/9312.bc1b89c5d4368033.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/{1574.878c18ecc97b1bd4.js → 943.39ae5e82f4f1893f.js} +1 -1
  115. package/apps/pwa/out/_next/static/chunks/9469.0500480de55fb205.js +32 -0
  116. package/apps/pwa/out/_next/static/chunks/9770.5f75bc6088b16109.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9810-2543267050e58b82.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9870.8419702475254745.js +8 -0
  119. package/apps/pwa/out/_next/static/chunks/9941-376d1b74d51b01a4.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9958.385434ab04241758.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/aa57532f.510551854ff239b1.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-deea1450b17cb8dc.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-70985b904f8650ef.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a2e15e33e56a4353.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-fc72ce2db12d6ca9.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-be03e41f9436ebd9.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-35a35999382da3f2.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-3ff5b1e6ca88b848.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-a65101300a0ee5c1.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-3aca5b6d67dba511.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-45b8ab0a71e61314.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-53046e282d4cda8e.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-17809e60e8354c17.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-fd2442d347bf5898.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-e9d720d6fc082e21.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-6b8b4267bab0a677.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-deea1450b17cb8dc.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-8bcf6233ac7c17af.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-7cc25591cfc2126f.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-053e871f35c9beba.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-eff819f0c2d5e084.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-4d7e9d8db5274a87.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-2b2d8f5aa5f69ad4.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-0b8f92c5062e68b1.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1bd9d0fdac2ced3d.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/{page-0f291d3c8fd55a3a.js → page-9ee28f7df07428ea.js} +1 -1
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-44b7a1ff468c6648.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-cbc6523711dc1b65.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-fdad47899c2695be.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-79a8b5fee4c20871.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-03e8ac9606aeaffb.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-4cd55c55ec287e2f.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-db17b4305404161e.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-30041d848350fd02.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c540da022dbf86b0.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9399efc538da057f.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ca2d09128c585ca4.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-0e2635aecd343038.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ef7f4399b6b7726e.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-deea1450b17cb8dc.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-caf530535b875468.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-eaa20c1543a5fd8e.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c541eb1b75120f61.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-ab5e213eda9479f4.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-0a815f34367b6db6.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-e858ba0ed9393b68.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-1638ee9dd6e0582f.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-4cf5a399109391f2.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-b4396321238798ec.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-cb72bfd21006781a.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6135d0242afbc434.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a1dccf907eddb856.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/c7945435-b44d4dbe90ba0dcb.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/{3d0154af.5331fec737ffe8c3.js → cb0f8df8.09a4a6be97e3fc5f.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/{e8543907.5b040a5f22a0b0e5.js → d96660fb.cbc21a2a88539dbb.js} +7 -7
  176. package/apps/pwa/out/_next/static/chunks/{50061469.0326382241ef3b2d.js → ea514caa.05a24f78d9dffe5f.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/fb7d20d5-6892502b6ee39ca6.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/framework-e8a911e19b1be41f.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-7022f418fabba021.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-e5f15df755756a1e.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-4525f91e36940c9b.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-140f0e519c085b0f.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-8f22ef63dcb865b1.js +1 -0
  184. package/apps/pwa/out/_next/static/css/d1f8bb401740a549.css +1 -0
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +23 -23
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +23 -23
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +23 -23
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +22 -22
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +22 -22
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +23 -23
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +22 -22
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +23 -23
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +23 -23
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +22 -22
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +23 -23
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +23 -23
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +23 -23
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +23 -23
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +22 -22
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +22 -22
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +23 -23
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +23 -23
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -23
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +22 -22
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +22 -22
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +23 -23
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +23 -23
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +22 -22
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +22 -22
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +22 -22
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +23 -23
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +23 -23
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +22 -22
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +23 -23
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +23 -23
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +23 -23
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +23 -23
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +23 -23
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +22 -22
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +23 -23
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +23 -23
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +23 -23
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +23 -23
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +23 -23
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +23 -23
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +23 -23
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +23 -23
  278. package/catalog/external-commands.yaml +5 -3
  279. package/catalog/meta/catalogVersion.yaml +2 -1
  280. package/catalog/signing/catalog-signing-public.pem +3 -0
  281. package/graphs/intake/intake-daily.yaml +16 -0
  282. package/graphs/intake/news-sources.yaml +1 -0
  283. package/graphs/intake/recipes.yaml +7 -0
  284. package/graphs/overlays/examples/research-runtime-empty-terminal.yaml +28 -0
  285. package/graphs/profiles/local.yaml +5 -0
  286. package/graphs/profiles/pod.yaml +4 -0
  287. package/package.json +6 -2
  288. package/plugins/demo-absorption-briefing/plugin.json +18 -0
  289. package/plugins/demo-absorption-briefing/skills/demo-absorption-briefing/SKILL.md +8 -0
  290. package/plugins/demo-browser-hand/plugin.json +13 -0
  291. package/plugins/demo-browser-hand/skills/demo-browser-hand/SKILL.md +8 -0
  292. package/plugins/demo-linear-secretary/plugin.json +15 -0
  293. package/plugins/demo-linear-secretary/skills/demo-linear-secretary/SKILL.md +8 -0
  294. package/plugins/demo-plugin-wizard/plugin.json +11 -0
  295. package/plugins/demo-plugin-wizard/skills/demo-plugin-wizard/SKILL.md +8 -0
  296. package/plugins/demo-research/plugin.json +16 -0
  297. package/plugins/demo-research/skills/demo-research/SKILL.md +8 -0
  298. package/plugins/demo-video-briefing/plugin.json +15 -0
  299. package/plugins/demo-video-briefing/skills/demo-video-briefing/SKILL.md +8 -0
  300. package/scripts/build-signed-catalog.ts +48 -0
  301. package/scripts/ci-typecheck-main-delta.sh +88 -0
  302. package/scripts/codex-fallback-live-probe.ts +1 -1
  303. package/scripts/demo/demo1104-parallel-scenes.ts +301 -0
  304. package/scripts/demo/demo1104-stage.config.ts +21 -0
  305. package/scripts/demo/demo1104-stage.ts +316 -0
  306. package/scripts/goal-method-audit.ts +17 -1
  307. package/scripts/graph-units/land-enqueue.ts +90 -0
  308. package/scripts/hooks/codex-notify.sh +32 -0
  309. package/scripts/install.sh +10 -38
  310. package/scripts/landing-heal/land-plan.ts +57 -0
  311. package/scripts/release-loop/auto-approve-node.ts +1 -1
  312. package/scripts/release-loop/gate-autoheal-sim-evidence.ts +60 -0
  313. package/scripts/release-loop/gate-method.ts +139 -0
  314. package/scripts/release-loop/gate-node.ts +180 -20
  315. package/scripts/release-loop/gate-traffic-mode.ts +151 -3
  316. package/scripts/release-loop/node-verdict.ts +38 -25
  317. package/scripts/release-loop/preflight.ts +362 -8
  318. package/scripts/release-loop/unattended-release.ts +20 -9
  319. package/scripts/rhythm/daily.ts +36 -4
  320. package/scripts/rhythm/linear-progress-sync.ts +298 -0
  321. package/scripts/video-pipeline.ts +9 -1
  322. package/scripts/warm-pool-provider-config.ts +29 -6
  323. package/src/acp/agent-manager.ts +1 -0
  324. package/src/acp/codex-app-server-agent.ts +33 -0
  325. package/src/acp/codex-app-server-client.ts +153 -16
  326. package/src/acp/core-turn-bridge.ts +17 -12
  327. package/src/acp/event-router.ts +20 -1
  328. package/src/acp/server.ts +6 -0
  329. package/src/agent-mission/browser-roundtrip-coordinator.ts +85 -0
  330. package/src/agent-mission/claude-headless.ts +4 -1
  331. package/src/agent-mission/codex-exec.ts +105 -0
  332. package/src/agent-mission/driver.ts +192 -11
  333. package/src/agent-mission/grok-auth-status.ts +47 -0
  334. package/src/agent-mission/hand-hooks.ts +101 -0
  335. package/src/agent-mission/mission-cli.ts +56 -21
  336. package/src/agent-mission/mission-hand-reply.ts +118 -0
  337. package/src/agent-mission/mission-line.ts +180 -0
  338. package/src/agent-mission/mission-out.ts +256 -18
  339. package/src/agent-mission/tool-install.ts +122 -11
  340. package/src/agents/general-purpose.md +1 -1
  341. package/src/auto-research/research-turn.ts +95 -10
  342. package/src/autopilot/pr-manager.ts +31 -3
  343. package/src/boot/daemon-tools/self-implement.ts +3 -1
  344. package/src/boot/daemon-tools/web-search.ts +1 -2
  345. package/src/briefing/brief-items.ts +55 -11
  346. package/src/cli/agent-cli.ts +2 -1
  347. package/src/cli/catalog-cli.ts +31 -0
  348. package/src/cli/connector-cli.ts +16 -0
  349. package/src/cli/doctor-fix.ts +2 -2
  350. package/src/cli/intake-source-cli.ts +44 -8
  351. package/src/cli/msg-cli.ts +32 -3
  352. package/src/cli/pr-cli.ts +21 -1
  353. package/src/cli/pr-land-heavy-remote.ts +44 -6
  354. package/src/cli/pr-land-overlap-evidence.ts +13 -1
  355. package/src/cli/pr-land-pod-shadow-job.ts +143 -5
  356. package/src/cli/pr-land-pod-shadow.ts +9 -2
  357. package/src/cli/release-checklist-read-cli.ts +44 -16
  358. package/src/cli/release-cli.ts +23 -3
  359. package/src/cli/research-cli.ts +9 -0
  360. package/src/cli/setup-cli.ts +166 -6
  361. package/src/cli/setup-keys.ts +187 -0
  362. package/src/cli/task-plugin-wizard-host.ts +114 -0
  363. package/src/cli/tasks-cli.ts +54 -9
  364. package/src/cli/tui-test-cli.ts +186 -0
  365. package/src/config.ts +4 -2
  366. package/src/connectors/linear-daily-progress.ts +228 -0
  367. package/src/connectors/linear-projector.ts +34 -12
  368. package/src/connectors/linear.ts +151 -7
  369. package/src/core-turn/deep-turn-bloom.ts +67 -0
  370. package/src/core-turn/research-policy.ts +37 -0
  371. package/src/core-turn/run-core-turn.ts +320 -30
  372. package/src/core-turn/types.ts +2 -0
  373. package/src/dashboard/chat/acp-chat.ts +10 -0
  374. package/src/dashboard/classic-sidetab-mission-job.ts +103 -0
  375. package/src/dashboard/classic-sidetab-mission-pair.ts +81 -0
  376. package/src/dashboard/classic-sidetab-mission-trio.ts +219 -0
  377. package/src/dashboard/classic-sidetab-mission.ts +167 -5
  378. package/src/dashboard/index.ts +378 -13
  379. package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
  380. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +8 -0
  381. package/src/dashboard/mission-cli-consumer.ts +20 -8
  382. package/src/dashboard/plugin-wizard-runtime.ts +50 -0
  383. package/src/dashboard/plugin-wizard-tool.ts +55 -0
  384. package/src/dashboard/sidetab-runtime.ts +1 -1
  385. package/src/dashboard/terminal-popup-runtime.ts +6 -3
  386. package/src/decisions/linear-progress-summary.ts +78 -0
  387. package/src/decisions/linear-progress-sync.ts +152 -0
  388. package/src/domains/outbound-alert.ts +49 -11
  389. package/src/domains/telegram-kind-route.ts +16 -9
  390. package/src/graph-runner/arg-allowance.ts +13 -0
  391. package/src/graph-runner/graph-run-api.ts +3 -1
  392. package/src/graph-runner/runner.ts +85 -17
  393. package/src/graph-wizard/mission-compose.ts +407 -12
  394. package/src/harness/dispatch-backpressure.ts +54 -1
  395. package/src/harness/dispatch-shadow-compare.ts +74 -0
  396. package/src/harness/harness-cli-command.ts +11 -1
  397. package/src/harness/skill-exec.ts +21 -9
  398. package/src/harness/skill-select.ts +1 -1
  399. package/src/hooks/error-report-cloud.ts +101 -0
  400. package/src/hooks/receiver.ts +29 -2
  401. package/src/index.ts +127 -10
  402. package/src/intake-plane/actions.ts +354 -0
  403. package/src/intake-plane/adapters/telegram-ambient.ts +34 -18
  404. package/src/intake-plane/intake-sources.ts +78 -8
  405. package/src/intake-plane/items.ts +14 -4
  406. package/src/intake-plane/linear-mission-sync.ts +80 -0
  407. package/src/intake-plane/linear-secretary-runtime.ts +178 -0
  408. package/src/intake-plane/linear-wish.ts +227 -1
  409. package/src/life/life-cli.ts +168 -0
  410. package/src/life/life-kinds.ts +160 -0
  411. package/src/live-supply/budget-consumer.ts +78 -0
  412. package/src/live-supply/read.ts +3 -0
  413. package/src/live-supply/snapshot.ts +45 -0
  414. package/src/llm/provider-credentials.ts +8 -2
  415. package/src/llm.ts +2 -1
  416. package/src/maturity/feature-maturity.ts +3 -3
  417. package/src/msg/msg-sse-server.ts +3 -3
  418. package/src/msg/msg-store.ts +177 -19
  419. package/src/native-tool-catalog.ts +36 -2
  420. package/src/nexus/api/http-server.ts +37 -1
  421. package/src/nexus/api/mcp-public-allowlist.ts +2 -0
  422. package/src/nexus/index.ts +7 -2
  423. package/src/nexus/outbound/format.ts +9 -0
  424. package/src/nexus/outbound/router.ts +98 -13
  425. package/src/nexus/setup-status.ts +9 -0
  426. package/src/nexus/state/state.ts +3 -0
  427. package/src/oauth/codex-account-store.ts +20 -7
  428. package/src/oauth/codex-owner-mirror.ts +44 -0
  429. package/src/oauth/codex.ts +17 -2
  430. package/src/oauth/fallback-chain.ts +47 -17
  431. package/src/onboarding/first-run-doctor.ts +8 -1
  432. package/src/onboarding/first-run.ts +85 -26
  433. package/src/onboarding/key-setup.ts +103 -0
  434. package/src/onboarding/menu-answer.ts +13 -0
  435. package/src/onboarding/secret-prompt.ts +37 -0
  436. package/src/plugins/install/plugin-install.ts +59 -0
  437. package/src/pr-tool/census.ts +130 -0
  438. package/src/pty-shell/pty-control-ipc.ts +4 -1
  439. package/src/registry/catalog-server.ts +232 -0
  440. package/src/registry/loader.ts +45 -1
  441. package/src/registry/types.ts +1 -2
  442. package/src/research/axis-fanout.ts +43 -28
  443. package/src/self-dev/ask-launch-flow.ts +72 -1
  444. package/src/self-dev/dev-cli.ts +4 -1
  445. package/src/self-dev/dev-pipeline.ts +5 -0
  446. package/src/self-dev/draft-residue.ts +64 -5
  447. package/src/self-dev/graph-front-nodes.ts +2 -1
  448. package/src/self-dev/graph-journey-route.ts +76 -21
  449. package/src/self-dev/launch-preflight.ts +58 -0
  450. package/src/self-dev/orchestrate.ts +1 -1
  451. package/src/self-dev/shard-aggregate.ts +4 -0
  452. package/src/self-dev/shard-run.ts +36 -15
  453. package/src/self-implement/abandoned-classification.ts +12 -3
  454. package/src/self-implement/budget-gate.ts +7 -0
  455. package/src/self-implement/child-llm-preference.ts +10 -1
  456. package/src/self-implement/doctor-visit.ts +30 -8
  457. package/src/self-implement/elanous-tui-spawn.ts +3 -0
  458. package/src/self-implement/fixtures/tdd-green-missing-passing-child-transcript.txt +2 -0
  459. package/src/self-implement/gate-artifacts.ts +2 -1
  460. package/src/self-implement/goal-author-cli.ts +4 -2
  461. package/src/self-implement/goal-author.ts +358 -4
  462. package/src/self-implement/graph-overlay-yaml.ts +30 -4
  463. package/src/self-implement/graph-overlay.ts +3 -1
  464. package/src/self-implement/graph-profile-yaml.ts +107 -0
  465. package/src/self-implement/graph-yaml.ts +26 -3
  466. package/src/self-implement/off-diff-evidence.ts +249 -5
  467. package/src/self-implement/orchestrator.ts +240 -15
  468. package/src/self-implement/run-chart.ts +6 -3
  469. package/src/self-implement/run-ledger.ts +51 -1
  470. package/src/self-implement/runtime-overlay-run-steps.ts +95 -0
  471. package/src/self-implement/tdd-evidence-tags.ts +9 -0
  472. package/src/self-implement/train-gate-receipt.ts +166 -0
  473. package/src/self-implement/train-gate-remote.ts +62 -18
  474. package/src/session/chat.ts +4 -2
  475. package/src/session/session-fanout.ts +2 -0
  476. package/src/session/streaming/acp-stream-sink.ts +2 -1
  477. package/src/session/streaming/chunk-producer.ts +6 -0
  478. package/src/session/streaming/stream-compositor.ts +3 -2
  479. package/src/session-runtime/index.ts +37 -1
  480. package/src/session-runtime/retry-policy.ts +1 -1
  481. package/src/setup/llm-env-detect.ts +3 -0
  482. package/src/setup/service-key-catalog.ts +46 -0
  483. package/src/setup/service-keys.ts +241 -0
  484. package/src/sidetab-core/visible-agent-mission.ts +98 -22
  485. package/src/skills/tools/agent.ts +23 -4
  486. package/src/skills/tools/omni-search.ts +123 -25
  487. package/src/task-agent/parent-host.ts +10 -0
  488. package/src/task-agent/repair-outcomes.ts +65 -0
  489. package/src/task-agent/task-hand.ts +20 -7
  490. package/src/task-orchestrator/dispatcher.ts +14 -1
  491. package/src/task-orchestrator/linear-capture-events.ts +55 -0
  492. package/src/task-orchestrator/store.ts +16 -5
  493. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +4 -0
  494. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +92 -1
  495. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
  496. package/src/task-orchestrator/surfaces/pod-source-receive.ts +23 -11
  497. package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
  498. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +35 -9
  499. package/src/task-orchestrator/surfaces/self-implement-pod.ts +172 -6
  500. package/src/task-orchestrator/surfaces/self-implement.ts +27 -3
  501. package/src/task-orchestrator/surfaces/warm-reuse-evidence.ts +169 -0
  502. package/src/task-orchestrator/types.ts +14 -0
  503. package/src/telegram.ts +14 -16
  504. package/src/terminal/coding-agent.ts +14 -5
  505. package/src/terminal/session-registry.ts +1 -1
  506. package/src/tool-hints/gate.ts +1 -0
  507. package/src/tool-runtime/agent-runtime.ts +1 -0
  508. package/src/tool-runtime/browser-hand-runtime.ts +381 -0
  509. package/src/tool-runtime/browser-runtime.ts +2 -1
  510. package/src/tool-runtime/elanous-linear-issue-runtime.ts +76 -0
  511. package/src/tool-runtime/elanous-linear-secretary-runtime.ts +57 -0
  512. package/src/tool-runtime/graph-mcp-runtimes.ts +240 -0
  513. package/src/tool-runtime/index.ts +6 -0
  514. package/src/tool-runtime/types.ts +3 -0
  515. package/src/tui/entry.ts +24 -1
  516. package/src/tui/sidetab/attach.ts +140 -11
  517. package/src/tui/sidetab/herdr-portal.ts +225 -0
  518. package/src/user-config.ts +34 -9
  519. package/src/user-intent/types.ts +4 -3
  520. package/src/ux-sim/browser-hand.ts +165 -0
  521. package/src/ux-sim/draft-inventory-builder.ts +198 -0
  522. package/src/ux-sim/fake-browser-page.ts +81 -0
  523. package/src/ux-sim/fake-linear-device.ts +31 -0
  524. package/src/ux-sim/graph-engine-sim.ts +47 -0
  525. package/src/ux-sim/linear-secretary.ts +216 -0
  526. package/src/ux-sim/mock-scenario-catalog.json +75 -23
  527. package/src/ux-sim/mock-scenario-catalog.ts +120 -2
  528. package/src/ux-sim/onboarding-first-run-device.ts +31 -21
  529. package/src/ux-sim/scenario.ts +70 -26
  530. package/src/ux-sim/service-key-setup.ts +50 -0
  531. package/src/ux-sim/term-slash-device.ts +74 -0
  532. package/src/ux-sim/turn-throw-sim.ts +31 -0
  533. package/src/version/packed-revision.json +1 -1
  534. package/src/web-search/exa.ts +77 -0
  535. package/src/web-search/index.ts +30 -9
  536. package/src/web-search/provider.ts +4 -1
  537. package/src/web-search/x-intent.ts +5 -0
  538. package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +0 -36
  540. package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/1455-530ca16c7e71baff.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +0 -32
  543. package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +0 -286
  548. package/apps/pwa/out/_next/static/chunks/2160.a097e7b138ae1c55.js +0 -23
  549. package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +0 -34
  552. package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/2974.595d1e29d040cb6a.js +0 -64
  557. package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +0 -93
  558. package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +0 -41
  559. package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +0 -24
  561. package/apps/pwa/out/_next/static/chunks/3741.9cf76acaa2ee5298.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +0 -77
  567. package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/4276.336d76d858fcdf1b.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +0 -74
  572. package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +0 -149
  573. package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +0 -27
  575. package/apps/pwa/out/_next/static/chunks/5431-72a1dbde59400691.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/5885.0a3e52c8faccec98.js +0 -287
  583. package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/6131.348b7d6bdcd267ce.js +0 -226
  586. package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +0 -90
  587. package/apps/pwa/out/_next/static/chunks/6377.bc7df239edbff244.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +0 -104
  594. package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +0 -94
  595. package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/7279-c199ea83f34338fa.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +0 -24
  602. package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +0 -8
  610. package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/8546-6f03f8ea34dd61d9.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/9249.976f1e69a9d80754.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/9353-12bfff0c130104cf.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/9415.69e4a21c60c7d2db.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/9633.ce5bddc56784da72.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +0 -62
  626. package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/9a852a62-6192a6ea9346ced3.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0e3d7b9421b79dac.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/term/page-bf067887b3307423.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +0 -1
  684. package/apps/pwa/out/_next/static/css/be9019f696217521.css +0 -1
  685. /package/apps/pwa/out/_next/static/{X1ucLw10Cds_h614NoEnh → Om5xS9jpjSXJCeTNGYEi4}/_ssgManifest.js +0 -0
@@ -174,7 +174,7 @@ import { ZAI_POD_EGRESS_LABEL, checkZaiPodSecret, countActiveZaiJobs, decideZaiP
174
174
  import { ZAI_CODING_DEFAULT_MODEL, ZAI_OPENROUTER_FALLBACK_MODEL, zaiSettingsFromConfig, type ZaiCodingPlanSettings } from '../../llm/zai-coding-plan.js';
175
175
  import { normalizePlanningFallbackReason, selectEnhanceLlm } from '../../prompt-enhance/enhance.js';
176
176
  import { inferProviderFromModel } from '../../llm.js';
177
- import { classifyPodExit, extractPodFailureReason, podChildEvidenceLedgerRow, podChildFailureAttribution, podDeadlineResultMarker, podJobConditionReason, podTerminalRow, POD_TERMINATION_JOB_JSONPATH, POD_TERMINATION_PODS_JSONPATH, readPodTermination, type PodExitClass, type PodTermination } from './pod-failure-reason.js';
177
+ import { classifyPodExit, extractPodFailureReason, podChildEvidenceLedgerRow, podChildFailureAttribution, podChildProviderFailureFact, podDeadlineResultMarker, podJobConditionReason, podTerminalRow, POD_TERMINATION_JOB_JSONPATH, POD_TERMINATION_PODS_JSONPATH, readPodTermination, type PodExitClass, type PodTermination } from './pod-failure-reason.js';
178
178
  import { kubectlTransientReason, retryKubectlTransient } from './kubectl-transient-retry.js';
179
179
  import { OLD_DOOR_STAMP_ENV } from '../../self-dev/old-door.js';
180
180
  import { resolveDefaultSourceHead, seedMirrorOnce, type MirrorSeedResult } from './pod-mirror-seed.js';
@@ -409,7 +409,8 @@ async function measureHostBudgetSnapshot(childLlm: PodBudgetChildLlm, env: NodeJ
409
409
  const host = resolveHostId(env);
410
410
  const measuredAt = Date.now();
411
411
  const { readBudgetInputsLive, CODEX_PROVIDER, GROK_PROVIDER } = await import('../../self-implement/budget-gate.js');
412
- const inputs = await readBudgetInputsLive(inputDeps);
412
+ const { budgetInputsWithLiveSupply } = await import('../../live-supply/budget-consumer.js');
413
+ const inputs = budgetInputsWithLiveSupply(await readBudgetInputsLive(inputDeps));
413
414
  const { decision } = harnessLaunchBudgetDecision(inputs, { ...(childLlm.provider ? { childLlmProvider: childLlm.provider } : {}), ...(childLlm.model ? { childLlmModel: childLlm.model } : {}) });
414
415
  const provider = decision.provider ?? childLlm.provider ?? 'chain';
415
416
  const used = provider === GROK_PROVIDER
@@ -1618,6 +1619,22 @@ export function repairPodExitCode(input: { state: string; repairCommitOnly: bool
1618
1619
  return input.disposition?.stage !== 'host-regate-failed' && input.disposition?.ok !== false ? 0 : 1;
1619
1620
  }
1620
1621
 
1622
+ export function parsePodRepairExportEvidence(output: string): { exportExitCode: number | null; podExitCode: number | null; exported: boolean;
1623
+ reasonCode: 'none' | 'no-new-commit' | 'source-head-mismatch' | 'export-failed' } | null {
1624
+ const outcomes = [
1625
+ ...[...output.matchAll(/^ELANOUS_POD_REPAIR_FAILED ([^\r\n]+)$/gm)].map((match) => ({ index: match.index!, failure: match[1]! })),
1626
+ ...[...output.matchAll(/^ELANOUS_POD_REPAIR_COMMIT ([1-9]\d*) ([0-9a-f]{40}) ([0-9a-f]{40})$/gm)].map((match) => ({ index: match.index!, failure: null })),
1627
+ ].sort((a, b) => a.index - b.index);
1628
+ const outcome = outcomes.at(-1);
1629
+ if (!outcome) return null;
1630
+ const podRc = [...output.matchAll(/__ELANOUS_POD_DONE__[^\r\n]*\brc=(\d+)/g)].at(-1)?.[1];
1631
+ const reasonCode = outcome.failure === null ? 'none' : outcome.failure === 'repair made no new commit' ? 'no-new-commit'
1632
+ : outcome.failure === 'source-head-mismatch' ? 'source-head-mismatch' : 'export-failed';
1633
+ const exported = outcome.failure === null;
1634
+ return { exportExitCode: exported ? 0 : reasonCode === 'source-head-mismatch' ? null : 1,
1635
+ podExitCode: podRc === undefined ? null : Number(podRc), exported, reasonCode };
1636
+ }
1637
+
1621
1638
  export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplementJobSpawn {
1622
1639
  if (options.repairCommitOnly && (options.source?.kind !== 'pr' || options.source.number !== options.repairCommitOnly.pr || !/^[0-9a-f]{40}$/.test(options.repairCommitOnly.baseHead))) {
1623
1640
  throw new Error('repair commit-only requires a matching PR source and exact head');
@@ -1635,6 +1652,46 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
1635
1652
  const resultMarkerOn = options.resultMarker ?? !options.kubectl;
1636
1653
  const writeWarmLedger = options.siWarmLedger
1637
1654
  ?? ((entry: RunLedgerEntry) => appendRunLedgerEntry(entry, runLedgerDir(env.ELANOUS_STATE_DIR)));
1655
+ const recordFinalTaskFailure = (input: Parameters<SelfImplementJobSpawn>[0], result: SelfImplementJobDone,
1656
+ ledgerStartIndex: number): SelfImplementJobDone => {
1657
+ // Match createSelfImplementAdapter: a nonzero process exit is failed even if it also emitted an ok disposition.
1658
+ if (result.error?.code === 'aborted' || (result.exitCode === 0 && result.disposition?.ok !== false)) return result;
1659
+ const ledgerRunId = env.ELANOUS_RUN_ID ?? input.spaceId;
1660
+ const ledgerDir = runLedgerDir(env.ELANOUS_STATE_DIR);
1661
+ const job = podJobName(input.spaceId);
1662
+ try {
1663
+ const entries = loadRunLedger(ledgerRunId, ledgerDir) ?? [];
1664
+ const currentEntries = entries.slice(ledgerStartIndex);
1665
+ const childStart = currentEntries.slice().reverse().find((entry) => entry.event === 'pod-child-run' && entry.data?.job === job);
1666
+ const childRunId = typeof childStart?.data?.childRunId === 'string' ? childStart.data.childRunId : null;
1667
+ const attemptValue = childStart?.data?.attempt;
1668
+ const attempt = typeof attemptValue === 'number' && Number.isSafeInteger(attemptValue) && attemptValue > 0 ? attemptValue : 1;
1669
+ const evidence = childRunId ? currentEntries.slice().reverse().find((entry) => entry.event === 'pod-child-evidence'
1670
+ && entry.data?.job === job && entry.data?.childRunId === childRunId) : undefined;
1671
+ const childResult = evidence?.data?.childResult && typeof evidence.data.childResult === 'object'
1672
+ ? evidence.data.childResult as Record<string, unknown> : undefined;
1673
+ const rawError = typeof result.disposition?.error === 'string' && result.disposition.error.trim() ? result.disposition.error
1674
+ : typeof childResult?.error === 'string' && childResult.error.trim() ? childResult.error
1675
+ : result.error?.message ?? result.output;
1676
+ const podTermination = evidence?.data?.podTermination && typeof evidence.data.podTermination === 'object'
1677
+ ? evidence.data.podTermination : null;
1678
+ appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-task-failure', data: {
1679
+ spaceId: input.spaceId,
1680
+ taskId: input.taskId ?? null,
1681
+ job,
1682
+ attempt,
1683
+ childRunId,
1684
+ childStage: typeof result.disposition?.stage === 'string' ? result.disposition.stage
1685
+ : typeof childResult?.stage === 'string' ? childResult.stage : 'unknown',
1686
+ childError: redactSecretText(rawError).replace(/\s+/gu, ' ').trim().slice(0, 500) || 'unknown',
1687
+ podTermination,
1688
+ } }, ledgerDir);
1689
+ } catch (error) {
1690
+ debug.log('self-implement.pod', 'task-failure-write-failed', { job, childRunId: null,
1691
+ reason: error instanceof Error ? error.message : String(error) }, { level: 'warn' });
1692
+ }
1693
+ return result;
1694
+ };
1638
1695
  return (input) => {
1639
1696
  if (options.repairCommitOnly && (input.autoMerge || input.openPr || input.base !== `pr-${options.repairCommitOnly.pr}`)) {
1640
1697
  throw new Error('repair commit-only refuses auto merge, new PR, or a different base');
@@ -1642,6 +1699,19 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
1642
1699
  if (options.siWarmAttempt && !options.siWarmHostPostprocess) {
1643
1700
  throw new Error('si-v1 warm execution requires cold-path host postprocess parity');
1644
1701
  }
1702
+ const taskLedgerDir = runLedgerDir(env.ELANOUS_STATE_DIR);
1703
+ let taskLedgerStartIndex = Number.MAX_SAFE_INTEGER;
1704
+ try { taskLedgerStartIndex = (loadRunLedger(env.ELANOUS_RUN_ID ?? input.spaceId, taskLedgerDir) ?? []).length; }
1705
+ catch (error) { debug.log('self-implement.pod', 'task-failure-baseline-unavailable', {
1706
+ spaceId: input.spaceId, reason: error instanceof Error ? error.message : String(error),
1707
+ }, { level: 'warn' }); }
1708
+ const recordFailure = (result: SelfImplementJobDone) => recordFinalTaskFailure(input, result, taskLedgerStartIndex);
1709
+ const recordRejectedFailure = (error: unknown): never => {
1710
+ if (!input.signal?.aborted && !(error instanceof Error && error.name === 'AbortError')) {
1711
+ recordFailure({ exitCode: 1, output: '', error: { code: 'pod-promise-rejected', message: error instanceof Error ? error.message : String(error) } });
1712
+ }
1713
+ throw error;
1714
+ };
1645
1715
  let siWarmEnabled = true;
1646
1716
  const taskCard = env.ELANOUS_POD_TASK_CARD ?? env.ELANOUS_TASK_CARD_ID;
1647
1717
  if (taskCard) {
@@ -1956,7 +2026,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
1956
2026
  return { exitCode: 1, output: log.slice(-4096), disposition: hostDisposition,
1957
2027
  error: { code: 'si-warm-host-postprocess-failed', message } };
1958
2028
  }
1959
- })();
2029
+ })().then(recordFailure, recordRejectedFailure);
1960
2030
  return { address: `self-impl:${input.spaceId}`, done };
1961
2031
  }
1962
2032
  const name = podJobName(input.spaceId);
@@ -2122,6 +2192,23 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
2122
2192
  const detail = unfit.map((u) => `${u.context} ${Math.round(u.allocatableMemoryBytes / 2 ** 30 * 10) / 10}GiB`).join(' · ');
2123
2193
  return { exitCode: 1, output: '', error: { code: 'pod-pool-unfit', message: `모든 풀 멤버의 할당 가능 메모리가 이 Job 의 한도 ${memoryLimit} 보다 작다 — 영원히 배치될 수 없다(${detail}) · --pod-memory 를 낮추거나 다른 풀로` } };
2124
2194
  };
2195
+ // PRLAND-OOM-RETRY-POOL-FIT: whether the NEXT memory limit can ever be placed decides the retry before
2196
+ // anything is written or deleted. Read-only — an all-unfit pool ends the run here, so no retry intent
2197
+ // is journaled, the OOM Job stays, and no second Job is applied. A fit member leaves the single retry intact.
2198
+ const retryPoolFit = async (nextLimit: string, from: string): Promise<SelfImplementJobDone | null> => {
2199
+ const pool = options.pool as { unfitMembers?: (b: number) => Promise<Array<{ context: string; allocatableMemoryBytes: number }>>; members?: readonly PodPoolMember[] } | undefined;
2200
+ if (!pool || typeof pool.unfitMembers !== 'function' || !Array.isArray(pool.members) || !pool.members.length) return null;
2201
+ const limitBytes = memoryQuantityBytes(nextLimit);
2202
+ if (limitBytes === null) return null;
2203
+ const unfit = await pool.unfitMembers(limitBytes);
2204
+ const unfitContextsForRetry = new Set(unfit.map((u) => u.context));
2205
+ const fit = pool.members.filter((m) => !unfitContextsForRetry.has(m.context)).map((m) => m.context);
2206
+ debug.log('self-implement.pod', 'oom-retry-pool-fit', { job: name, from, to: nextLimit, fit, unfit: unfit.map((u) => u.context) }, { level: fit.length ? 'info' : 'warn' });
2207
+ if (fit.length) return null;
2208
+ const detail = unfit.map((u) => `${u.context} ${Math.round(u.allocatableMemoryBytes / 2 ** 30 * 10) / 10}GiB`).join(' · ');
2209
+ const poolLimit = `${Math.round(Math.max(...unfit.map((u) => u.allocatableMemoryBytes)) / 2 ** 30 * 10) / 10}GiB`;
2210
+ return { exitCode: 1, output: '', error: { code: 'pod-pool-unfit', message: `Job ${name} 이 OOMKilled(137) 로 ${from} 에서 죽었고 다음 한도는 ${nextLimit} 이지만 어느 풀 멤버도 그 한도를 받을 수 없다 — 재시도 Job 을 만들 수 없다(필요 ${nextLimit} · 풀 한계 ${poolLimit} · ${detail}) · --pod-memory 를 낮추거나 다른 풀로` } };
2211
+ };
2125
2212
  const acquireSlot = async (): Promise<PodPoolMember | null> => {
2126
2213
  if (!options.pool) return null;
2127
2214
  // Each actual acquisition is a separate observation, including the OOM retry in this
@@ -2184,8 +2271,9 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
2184
2271
  if (unfitDone) return unfitDone;
2185
2272
  // HARNESS-FULL-GRAPH — Pod 입장(입장 관문 ⊕ 멤버 슬롯)은 그래프 노드 pool-admit 이다.
2186
2273
  // 2판: decompose →(substrate=pod) pool-admit 간선은 «여기»(Pod 입장 직전 · 실제 단계 경계)에서 남긴다.
2187
- if (options.repairCommitOnly) routeJourneyEdge('dispatch', 'pr-source', { source: 'pr', substrate: 'pod' });
2188
- else routeJourneyEdge('decompose', 'pod', { substrate: 'pod' });
2274
+ const journeyRunId = parentRunId ?? childRunId;
2275
+ if (options.repairCommitOnly) routeJourneyEdge('dispatch', 'pr-source', { source: 'pr', substrate: 'pod' }, { runId: journeyRunId });
2276
+ else routeJourneyEdge('decompose', 'pod', { substrate: 'pod' }, { runId: journeyRunId });
2189
2277
  enterJourneyNode('pool-admit', { provenance: 'self-implement-pod', data: { spaceId: input.spaceId } });
2190
2278
  // ⛔ 감싸는 함수(async 래퍼)를 쓰지 않는다 — 마이크로태스크가 늘면 Job apply 순서가 밀린다(시험이 잡았다). 같은 자리 try/catch 로.
2191
2279
  const podAdmitError = (error: unknown): void => {
@@ -2300,6 +2388,11 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
2300
2388
  collectPodArtifacts(full.stdout, { dir: join(effectiveInstanceRoot(), 'pod-artifacts'), job: name, log: record });
2301
2389
  }
2302
2390
  catch (error) { record('self-implement.pod', 'artifact-collect-incomplete', { job: name, reason: error instanceof Error ? error.message : String(error) }); }
2391
+ const repairExportEvidence = options.repairCommitOnly ? parsePodRepairExportEvidence(full.stdout) : null;
2392
+ if (repairExportEvidence) {
2393
+ try { appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-repair-export', data: { job: name, ...repairExportEvidence } }, ledgerDir); }
2394
+ catch (error) { record('self-implement.pod', 'repair-export-ledger-incomplete', { job: name, reason: error instanceof Error ? error.message : String(error) }); }
2395
+ }
2303
2396
  for (const line of full.stdout.split(/\r?\n/)) {
2304
2397
  const bundle = /^ELANOUS_POD_SALVAGE_BUNDLE (pod-salvage\/[a-zA-Z0-9._-]+\.bundle) ([0-9]+) ([0-9]+)(?: ([0-9a-f]{40,64}))?$/.exec(line);
2305
2398
  if (bundle) {
@@ -3413,6 +3506,32 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
3413
3506
  for (const row of usagePlan.rows) debug.log(row.category, row.event, row.data);
3414
3507
  const parsed = parseSelfImplementJson(logs);
3415
3508
  const terminal = parseSelfImplementJson(logs.trimEnd().split('\n').at(-1) ?? '');
3509
+ const terminalObservation = podChildTerminalResultObservation(logs);
3510
+ const providerSignature = {
3511
+ grokUnavailableCount: logs.match(/Grok unavailable:\s*run `grok login`/gu)?.length ?? 0,
3512
+ structuredProviderErrors: terminal?.providerErrors ?? parsed?.providerErrors ?? null,
3513
+ };
3514
+ const childResultObservation = {
3515
+ job: name,
3516
+ childRunId: liveChildRunId,
3517
+ jobState: state,
3518
+ containerExitCode: containerExitCode ?? null,
3519
+ ledgerCompleteness,
3520
+ terminalResultObserved: terminalObservation.observed,
3521
+ terminalStage: terminalObservation.stage,
3522
+ terminalOk: terminalObservation.ok,
3523
+ terminalOutcome: terminalObservation.outcome,
3524
+ terminalFailureClassification: terminalObservation.failureClassification,
3525
+ providerSignature,
3526
+ };
3527
+ debug.log('self-implement.pod', 'child-terminal-result-observed', childResultObservation);
3528
+ try {
3529
+ appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-child-terminal-result-observation', data: childResultObservation }, ledgerDir);
3530
+ } catch (error) {
3531
+ debug.log('self-implement.pod', 'child-terminal-result-observation-write-failed', {
3532
+ job: name, childRunId: liveChildRunId, reason: error instanceof Error ? error.message : String(error),
3533
+ }, { level: 'warn' });
3534
+ }
3416
3535
  const nextAccount = codexAccounts?.find((candidate) => candidate !== account);
3417
3536
  if (state === 'failed' && containerExitCode === 7 && !input.signal?.aborted) {
3418
3537
  debug.log('self-implement.pod', 'gh-login-failed', { job: name, attempt: ghLoginRetried ? 2 : 1, tokenExpiresInSec: ghTokenExpiresAt === null ? null : Math.floor((ghTokenExpiresAt - now()) / 1000) });
@@ -3751,6 +3870,9 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
3751
3870
  }
3752
3871
  if (actual < (memoryGi(nextLimit) ?? actual)) {
3753
3872
  const from = reattachedMemoryLimit ?? memoryLimit;
3873
+ // A retry nobody can place is not a retry: decide pool fitness for the next limit first.
3874
+ const retryUnfit = await retryPoolFit(nextLimit, from);
3875
+ if (retryUnfit) return retryUnfit;
3754
3876
  appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-oom-retry-intent', data: { attempt: 2, from, to: nextLimit, tier: nextTier, reason: 'OOMKilled', job: name, executionKey, fromChildRunId: liveChildRunId } }, ledgerDir);
3755
3877
  debug.log('self-implement.pod', 'oom-retry', { from, to: nextLimit, tier: nextTier, reason: 'OOMKilled', job: name });
3756
3878
  const deleted = kubectl(['-n', namespace, 'delete', 'job', name, '--ignore-not-found', '--wait=true']);
@@ -3798,6 +3920,12 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
3798
3920
  }
3799
3921
  // The host still has the complete Pod log here. The CLI only retains a short stdout tail,
3800
3922
  // so preserve the parsed child facts in the parent ledger before that tail is returned.
3923
+ // OBS-GAP-BATCH-1030 — 자식 LLM 실패의 공급자·HTTP status 를 부모 원장 행에 붙인다.
3924
+ // 줄이 공급자를 이름하지 않으면 이 Pod 의 자식 provider(Pod 옵션 ⊕ 위임 플래그)를 정규 id 로만 쓴다.
3925
+ // ⛔ 본문·자격증명은 담지 않는다 — 귀속은 두 스칼라뿐이다.
3926
+ const childProviderFailure = podChildProviderFailureFact(logs, {
3927
+ providerHint: options.provider ?? podChildProviderOf(podDelegatedChildLlm(jobArgs)?.provider),
3928
+ });
3801
3929
  const childEvidenceRow = podChildEvidenceLedgerRow({
3802
3930
  job: name,
3803
3931
  childRunId: liveChildRunId,
@@ -3806,6 +3934,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
3806
3934
  noResultDiagnostic,
3807
3935
  noResultLogEvidence,
3808
3936
  podTermination,
3937
+ providerFailure: childProviderFailure,
3809
3938
  });
3810
3939
  if (childEvidenceRow) {
3811
3940
  // Every terminal attempt writes a marker, including one with no parseable child facts.
@@ -3927,7 +4056,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
3927
4056
  } finally {
3928
4057
  releaseAdmission?.();
3929
4058
  }
3930
- })();
4059
+ })().then(recordFailure, recordRejectedFailure);
3931
4060
  return { address, done };
3932
4061
  };
3933
4062
  }
@@ -4095,6 +4224,43 @@ export function readPodNoResultLogTail(args: {
4095
4224
  }
4096
4225
  }
4097
4226
 
4227
+ /** Keep the terminal result row separate from provider-error text in the same child log. */
4228
+ function podChildTerminalResultObservation(logs: string): {
4229
+ observed: boolean;
4230
+ stage: string | null;
4231
+ ok: boolean | null;
4232
+ outcome: string | null;
4233
+ failureClassification: string | null;
4234
+ } {
4235
+ const lines = logs.split(/\r\n|\n|\r/u);
4236
+ for (let index = lines.length - 1; index >= 0; index--) {
4237
+ const line = lines[index]!.trim();
4238
+ if (!line.startsWith('{')) continue;
4239
+ let value: unknown;
4240
+ try { value = JSON.parse(line); } catch { continue; }
4241
+ if (!value || typeof value !== 'object' || Array.isArray(value)) continue;
4242
+ const row = value as Record<string, unknown>;
4243
+ const terminal = podTerminalRow(row);
4244
+ if (!terminal) continue;
4245
+ const nested = (row.kind === 'self' || row.kind === 'external')
4246
+ && row.result && typeof row.result === 'object' && !Array.isArray(row.result)
4247
+ ? row.result as Record<string, unknown> : row;
4248
+ const abandoned = nested.abandonedClassification && typeof nested.abandonedClassification === 'object'
4249
+ && !Array.isArray(nested.abandonedClassification) ? nested.abandonedClassification as Record<string, unknown> : null;
4250
+ return {
4251
+ observed: true,
4252
+ stage: terminal.stage,
4253
+ ok: terminal.ok,
4254
+ outcome: typeof nested.outcome === 'string' ? nested.outcome
4255
+ : typeof nested.completionDisposition === 'string' ? nested.completionDisposition
4256
+ : typeof nested.terminationReason === 'string' ? nested.terminationReason : null,
4257
+ failureClassification: typeof nested.failureClassification === 'string' ? nested.failureClassification
4258
+ : typeof abandoned?.classification === 'string' ? abandoned.classification : null,
4259
+ };
4260
+ }
4261
+ return { observed: false, stage: null, ok: null, outcome: null, failureClassification: null };
4262
+ }
4263
+
4098
4264
  /** 사람용 런 결과 한 줄 — 수확 브랜치가 있으면 «수확할 브랜치: …» 를 붙인다. */
4099
4265
  export function podRunResultLine(logs: string, branches: readonly string[]): string {
4100
4266
  const result = logs.split('\n').filter((line) => !line.startsWith('ELANOUS_MEM ')).join('\n').slice(-4000);
@@ -31,6 +31,7 @@ import { isAbandonedClassification, type AbandonedClassificationResult } from '.
31
31
  import { createExecution, type Task, type TaskExecution } from '../types.js';
32
32
  import type { DispatchContext, DispatchResult } from '../surface-registry.js';
33
33
  import { nestedPodResult } from './pod-failure-reason.js';
34
+ import { isTddRecordTag, TDD_RECORD_TAGS, type TddRecordTag } from '../../self-implement/tdd-evidence-tags.js';
34
35
  import { SCOPE_EXPANSION_CAP, SCOPE_STOP_REASONS, isProtectedScopePath, type ScopeStopReason } from '../../self-implement/scope-adjacency.js';
35
36
 
36
37
  /** Result of one self-implement subprocess. */
@@ -145,6 +146,8 @@ export interface PodChildEvidence {
145
146
  supervisorVerdict?: unknown;
146
147
  goalCauseObserved?: true;
147
148
  terminationReason?: unknown;
149
+ /** TDD report-deficit facts carried as named fields, independent of clipped detail text. */
150
+ tddEvidenceFailure?: { reason: 'tdd-evidence-missing'; round: number; missing: TddRecordTag[] };
148
151
  accountAvailability?: Record<string, unknown>;
149
152
  prFailure?: {
150
153
  stage: 'pr-open-failed';
@@ -217,6 +220,20 @@ export function podChildEvidenceFromResult(o: Record<string, unknown>): PodChild
217
220
  if (o.ok !== false || typeof value !== 'string' || !value.trim()) return undefined;
218
221
  return redactSecretText(value).slice(0, 4_000);
219
222
  };
223
+ const rawTddEvidenceFailure = object(o.tddEvidenceFailure);
224
+ const rawTddMissing = rawTddEvidenceFailure?.missing;
225
+ const tddEvidenceFailure = o.ok === false && o.terminationReason === 'tdd-evidence-missing'
226
+ && rawTddEvidenceFailure?.reason === 'tdd-evidence-missing'
227
+ && typeof rawTddEvidenceFailure.round === 'number' && Number.isSafeInteger(rawTddEvidenceFailure.round) && rawTddEvidenceFailure.round >= 1
228
+ && Array.isArray(rawTddMissing) && rawTddMissing.length > 0 && rawTddMissing.length <= TDD_RECORD_TAGS.length
229
+ && rawTddMissing.every(isTddRecordTag)
230
+ && new Set(rawTddMissing).size === rawTddMissing.length
231
+ ? {
232
+ reason: 'tdd-evidence-missing' as const,
233
+ round: rawTddEvidenceFailure.round,
234
+ missing: rawTddMissing as TddRecordTag[],
235
+ }
236
+ : undefined;
220
237
  const failureExitCode = o.ok === false && typeof o.exitCode === 'number'
221
238
  && Number.isInteger(o.exitCode) && o.exitCode >= 0 && o.exitCode <= 255 ? o.exitCode : undefined;
222
239
  const outOfScopeEdits = scrubValue(o.outOfScopeEdits);
@@ -248,7 +265,10 @@ export function podChildEvidenceFromResult(o: Record<string, unknown>): PodChild
248
265
  ...(abandoned ? { abandonedClassification: abandoned } : {}),
249
266
  ...(o.supervisorVerdict !== undefined ? { supervisorVerdict: scrubValue(o.supervisorVerdict) } : {}),
250
267
  ...(o.goalCauseObserved === true ? { goalCauseObserved: true } : {}),
251
- ...(o.terminationReason !== undefined ? { terminationReason: scrubValue(o.terminationReason) } : {}),
268
+ ...(o.terminationReason === 'tdd-evidence-missing'
269
+ ? (tddEvidenceFailure ? { terminationReason: 'tdd-evidence-missing' } : {})
270
+ : o.terminationReason !== undefined ? { terminationReason: scrubValue(o.terminationReason) } : {}),
271
+ ...(tddEvidenceFailure ? { tddEvidenceFailure } : {}),
252
272
  ...(accountAvailability ? { accountAvailability } : {}),
253
273
  ...(o.harvestable === true && typeof o.branch === 'string' && o.branch.trim() ? { harvestable: true } : {}),
254
274
  ...(typeof o.prNumber === 'number' && Number.isSafeInteger(o.prNumber) && o.prNumber > 0 ? { prNumber: o.prNumber } : {}),
@@ -294,6 +314,8 @@ export interface SelfImplementJobSpawn {
294
314
  draft?: boolean;
295
315
  /** Distinct-per-job harness-space id → own screen/log buffer. */
296
316
  spaceId: string;
317
+ /** Orchestrator task identity, preserved with terminal Pod failure evidence. */
318
+ taskId?: string;
297
319
  signal?: AbortSignal;
298
320
  /** Optional TC-owned warm-worker command. The warm request is advisory; this feature Job remains authoritative. */
299
321
  warmWorkerCommand?: WarmWorkerCommand;
@@ -394,6 +416,7 @@ export function createSelfImplementAdapter(opts: SelfImplementAdapterOptions) {
394
416
  ...(surface.openPr !== undefined ? { openPr: surface.openPr } : {}),
395
417
  ...(surface.draft !== undefined ? { draft: surface.draft } : {}),
396
418
  spaceId,
419
+ taskId: task.id,
397
420
  ...(ctx.signal ? { signal: ctx.signal } : {}),
398
421
  });
399
422
  address = res.address;
@@ -606,8 +629,9 @@ export function reviewGateFields(o: Record<string, unknown>): Pick<SelfImplement
606
629
  export function reportUnmappedDispositionFields(
607
630
  raw: Record<string, unknown>,
608
631
  mapped: SelfImplementDisposition,
632
+ knownRawFields: readonly string[] = [],
609
633
  ): readonly string[] {
610
- const known = new Set(Object.keys(mapped));
634
+ const known = new Set([...Object.keys(mapped), ...knownRawFields]);
611
635
  const unmapped = Object.keys(raw).filter((key) => !known.has(key) && raw[key] !== undefined);
612
636
  if (unmapped.length > 0) {
613
637
  try {
@@ -716,7 +740,7 @@ export function parseSelfImplementJson(stdout: string): SelfImplementDisposition
716
740
  && ((o.review as { mustFix: unknown[] }).mustFix).every((item) => typeof item === 'string')
717
741
  ? { mustFix: (o.review as { mustFix: string[] }).mustFix } : {}),
718
742
  };
719
- reportUnmappedDispositionFields(o, mapped);
743
+ reportUnmappedDispositionFields(o, mapped, ['terminationReason', 'tddEvidenceFailure']);
720
744
  return mapped;
721
745
  } catch { /* not this line */ }
722
746
  }
@@ -0,0 +1,169 @@
1
+ /** Durable, fail-closed evidence written only from an observed warm-worker lease. */
2
+ import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, rmdirSync, statSync, writeFileSync } from 'node:fs';
3
+ import { randomUUID } from 'node:crypto';
4
+ import { dirname, join } from 'node:path';
5
+ import { effectiveInstanceRoot } from '../../instance/resolve.js';
6
+ import { debug } from '../../debug/log.js';
7
+ import type { WarmReuseEvidence, WarmReuseEvidenceByConsumer, WarmReuseConsumer } from './pod-warm-switch.js';
8
+
9
+ const SHA = /^[0-9a-f]{40}$/i;
10
+ const LOCK_HASH = /^[0-9a-f]{64}$/i;
11
+ const MAX_BYTES = 4 * 1024 * 1024;
12
+ const MAX_ROWS = 256;
13
+ export const WARM_REUSE_EVIDENCE_MAX_AGE_MS = 60 * 60_000;
14
+
15
+ export interface WarmReuseEvidenceRow {
16
+ schema: 1;
17
+ consumer: WarmReuseEvidenceConsumer;
18
+ pr?: number;
19
+ head: string;
20
+ main: string;
21
+ recordedAt: string;
22
+ /** Actual warm provider lease identity. Omitted on cold/fallback/timeout. */
23
+ leaseId?: string;
24
+ workerId?: string;
25
+ generation?: number;
26
+ expectedLockHash?: string;
27
+ workerLockHash?: string;
28
+ leaseValid?: boolean;
29
+ canaryPassed?: boolean;
30
+ agree?: boolean;
31
+ reason?: string;
32
+ }
33
+
34
+ export type WarmReuseEvidenceConsumer = 'gate-recheck' | 'land' | 'ta';
35
+
36
+ export interface ActualWarmLeaseEvidence {
37
+ workerId: string;
38
+ leaseId: string;
39
+ generation: number;
40
+ expectedLockHash: string;
41
+ workerLockHash: string;
42
+ leaseValid: boolean;
43
+ canaryPassed: boolean;
44
+ agree: boolean;
45
+ }
46
+
47
+ export function warmReuseEvidencePath(root = effectiveInstanceRoot()): string {
48
+ return join(root, 'warm-reuse-evidence.jsonl');
49
+ }
50
+
51
+ function validRow(value: unknown): value is WarmReuseEvidenceRow {
52
+ if (!value || typeof value !== 'object' || Array.isArray(value)) return false;
53
+ const row = value as Partial<WarmReuseEvidenceRow>;
54
+ return row.schema === 1 && ['gate-recheck', 'land', 'ta'].includes(row.consumer ?? '')
55
+ && (row.pr === undefined || typeof row.pr === 'number' && Number.isSafeInteger(row.pr) && row.pr > 0)
56
+ && typeof row.head === 'string' && SHA.test(row.head) && typeof row.main === 'string' && SHA.test(row.main)
57
+ && typeof row.recordedAt === 'string' && Number.isFinite(Date.parse(row.recordedAt))
58
+ && (row.leaseId === undefined || typeof row.leaseId === 'string' && row.leaseId.length > 0)
59
+ && (row.workerId === undefined || typeof row.workerId === 'string' && row.workerId.length > 0)
60
+ && (row.generation === undefined || typeof row.generation === 'number' && Number.isSafeInteger(row.generation) && row.generation > 0)
61
+ && (row.expectedLockHash === undefined || typeof row.expectedLockHash === 'string' && LOCK_HASH.test(row.expectedLockHash))
62
+ && (row.workerLockHash === undefined || typeof row.workerLockHash === 'string' && LOCK_HASH.test(row.workerLockHash))
63
+ && (row.leaseValid === undefined || typeof row.leaseValid === 'boolean')
64
+ && (row.canaryPassed === undefined || typeof row.canaryPassed === 'boolean')
65
+ && (row.agree === undefined || typeof row.agree === 'boolean')
66
+ && (row.reason === undefined || typeof row.reason === 'string');
67
+ }
68
+
69
+ /** Append a bounded JSONL observation. A missing/invalid warm lease is recorded as unmeasured, never green. */
70
+ export function recordWarmReuseEvidence(path: string, row: WarmReuseEvidenceRow): void {
71
+ if (!validRow(row)) throw new Error('invalid warm reuse evidence row');
72
+ mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
73
+ const lock = `${path}.lock`;
74
+ const deadline = Date.now() + 10_000;
75
+ for (;;) {
76
+ try { mkdirSync(lock); break; }
77
+ catch {
78
+ try { if (Date.now() - statSync(lock).mtimeMs > 30_000) { rmdirSync(lock); continue; } } catch { continue; }
79
+ if (Date.now() >= deadline) throw new Error('timed out locking warm reuse evidence');
80
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 10);
81
+ }
82
+ }
83
+ try {
84
+ let rows: string[] = [];
85
+ try {
86
+ const contents = readFileSync(path, 'utf8');
87
+ if (Buffer.byteLength(contents) <= MAX_BYTES) rows = contents.split(/\r?\n/).filter(Boolean).slice(-(MAX_ROWS - 1));
88
+ } catch { /* first write */ }
89
+ const safe = typeof row.leaseValid === 'boolean' && row.leaseId && row.workerId && row.generation && row.expectedLockHash
90
+ && row.workerLockHash && row.canaryPassed !== undefined && row.agree !== undefined
91
+ ? row
92
+ : { schema: 1 as const, consumer: row.consumer, ...(row.pr ? { pr: row.pr } : {}), head: row.head, main: row.main,
93
+ recordedAt: row.recordedAt, reason: row.reason ?? 'warm-lease-unmeasured' };
94
+ const body = [...rows, JSON.stringify(safe)].join('\n') + '\n';
95
+ const tempPath = `${path}.${process.pid}.${randomUUID()}.tmp`;
96
+ try { writeFileSync(tempPath, body, { mode: 0o600, flag: 'wx' }); renameSync(tempPath, path); }
97
+ catch (error) { rmSync(tempPath, { force: true }); throw error; }
98
+ } finally { try { rmdirSync(lock); } catch { /* best-effort release */ } }
99
+ }
100
+
101
+ /** Read only exact head/main rows. Invalid, oversized, or absent files produce no evidence. */
102
+ export function readWarmReuseEvidence(path: string, identity: { consumer: WarmReuseEvidenceConsumer; pr?: number; head: string; main: string }, limit = 32, now = Date.now()): WarmReuseEvidenceRow[] | undefined {
103
+ if (!['gate-recheck', 'land', 'ta'].includes(identity.consumer) || (identity.pr !== undefined && (!Number.isSafeInteger(identity.pr) || identity.pr <= 0)) || !SHA.test(identity.head) || !SHA.test(identity.main)
104
+ || !Number.isSafeInteger(limit) || limit < 1 || !Number.isFinite(now)) return undefined;
105
+ try {
106
+ if (!existsSync(path)) return undefined;
107
+ const contents = readFileSync(path, 'utf8');
108
+ if (Buffer.byteLength(contents) > MAX_BYTES) return undefined;
109
+ const lines = contents.split(/\r?\n/).filter(Boolean);
110
+ if (lines.length > MAX_ROWS) return undefined;
111
+ const rows: WarmReuseEvidenceRow[] = [];
112
+ for (const line of lines) {
113
+ let row: unknown;
114
+ try { row = JSON.parse(line); } catch { return undefined; }
115
+ if (!validRow(row)) return undefined;
116
+ if (row.consumer === identity.consumer && (identity.pr === undefined || row.pr === identity.pr)
117
+ && row.head === identity.head && row.main === identity.main) {
118
+ const recordedAt = Date.parse(row.recordedAt);
119
+ if (recordedAt > now) return undefined;
120
+ if (now - recordedAt <= WARM_REUSE_EVIDENCE_MAX_AGE_MS) rows.push(row);
121
+ }
122
+ }
123
+ rows.splice(0, Math.max(0, rows.length - limit));
124
+ return rows.length ? rows : undefined;
125
+ } catch { return undefined; }
126
+ }
127
+
128
+ /** Read exact source-pair evidence for each consumer and summarize only observed rows. */
129
+ export function loadWarmReuseEvidenceByConsumer(
130
+ identity: { head: string; main: string } | undefined, path = warmReuseEvidencePath(),
131
+ ): WarmReuseEvidenceByConsumer | undefined {
132
+ const result: WarmReuseEvidenceByConsumer = {};
133
+ const consumers: readonly WarmReuseEvidenceConsumer[] = ['gate-recheck', 'land', 'ta'];
134
+ const exactIdentity = identity && SHA.test(identity.head) && SHA.test(identity.main) ? identity : undefined;
135
+ for (const consumer of consumers) {
136
+ const rows = exactIdentity ? readWarmReuseEvidence(path, { consumer, ...exactIdentity }) : undefined;
137
+ const latest = rows?.[rows.length - 1];
138
+ if (!rows?.length || !latest) {
139
+ try { debug.log('pod.warm', 'evidence-supplied', { consumer, measured: false }); } catch { /* observation only */ }
140
+ continue;
141
+ }
142
+ const lock = latest.expectedLockHash ?? '';
143
+ let consecutiveMatchSamples = 0;
144
+ for (let index = rows.length - 1; index >= 0; index--) {
145
+ const row = rows[index]!;
146
+ const identityComplete = !!row.leaseId && !!row.workerId && Number.isSafeInteger(row.generation)
147
+ && !!row.expectedLockHash && !!row.workerLockHash;
148
+ if (!identityComplete || row.workerId !== latest.workerId || row.expectedLockHash !== lock || row.workerLockHash !== lock
149
+ || row.leaseValid !== true || row.canaryPassed !== true || row.agree !== true) break;
150
+ consecutiveMatchSamples++;
151
+ }
152
+ const evidence: WarmReuseEvidence = {
153
+ consecutiveMatchSamples,
154
+ recentMismatchCount: rows.filter((row) => row.agree === false).length,
155
+ ...(typeof latest.leaseValid === 'boolean'
156
+ ? { leaseValid: latest.leaseValid && !!latest.leaseId && !!latest.workerId && Number.isSafeInteger(latest.generation) }
157
+ : {}),
158
+ ...(typeof latest.canaryPassed === 'boolean' ? { canaryPassed: latest.canaryPassed } : {}),
159
+ expected: { head: exactIdentity!.head, main: exactIdentity!.main, lock },
160
+ worker: { head: exactIdentity!.head, main: exactIdentity!.main, lock: latest.workerLockHash ?? '' },
161
+ };
162
+ result[consumer as WarmReuseConsumer] = evidence;
163
+ const measured = typeof latest.leaseValid === 'boolean' && !!latest.leaseId && !!latest.workerId
164
+ && Number.isSafeInteger(latest.generation) && typeof latest.canaryPassed === 'boolean'
165
+ && !!latest.expectedLockHash && !!latest.workerLockHash && typeof latest.agree === 'boolean';
166
+ try { debug.log('pod.warm', 'evidence-supplied', { consumer, measured }); } catch { /* observation only */ }
167
+ }
168
+ return Object.keys(result).length ? result : undefined;
169
+ }
@@ -531,6 +531,17 @@ export type TaskExecutionStatus =
531
531
  | 'timeout'
532
532
  | 'cancelled';
533
533
 
534
+ /** Explicit browser capture provenance forwarded from the run-scoped harness event. */
535
+ export interface TaskCaptureArtifact {
536
+ path: string;
537
+ mimeType: string;
538
+ runId: string;
539
+ linearIssueId: string;
540
+ externalShare: boolean;
541
+ sensitivity: string;
542
+ createdAt: number;
543
+ }
544
+
534
545
  export interface TaskExecution {
535
546
  readonly id: string; // 'exec:<hex>'
536
547
  readonly taskId: string;
@@ -548,6 +559,9 @@ export interface TaskExecution {
548
559
  /** The agent ran, but its reported outcome needs human review rather than automatic completion. */
549
560
  reviewRequired?: boolean;
550
561
  outputPath?: string;
562
+ /** Harness run identity and approved captures observed during this exact execution window. */
563
+ runId?: string;
564
+ captureArtifacts?: TaskCaptureArtifact[];
551
565
  error?: { code: string; message: string; stack?: string };
552
566
  tokenUsage?: { input: number; output: number };
553
567
  costUsd?: number;
package/src/telegram.ts CHANGED
@@ -1820,23 +1820,21 @@ export class TelegramBot {
1820
1820
  if (!fromVoice && ctx.text && !ctx.text.startsWith('/')) {
1821
1821
  try {
1822
1822
  const ambientMode = this.slashContext?.userConfig.intake.telegram.ambientCapture ?? 'off';
1823
- if (ambientMode !== 'off') {
1824
- const { maybeHandleTelegramAmbientMessage } = await import('./intake-plane/adapters/telegram-ambient.js');
1825
- const ambientReply = await maybeHandleTelegramAmbientMessage({
1826
- text: ctx.text,
1827
- chatId: ctx.chatId,
1828
- userId: ctx.userId,
1829
- ...(ctx.userName ? { userName: ctx.userName } : {}),
1830
- ...(ctx.threadId != null ? { threadId: ctx.threadId } : {}),
1831
- ambientCapture: ambientMode,
1823
+ const { maybeHandleTelegramAmbientMessage } = await import('./intake-plane/adapters/telegram-ambient.js');
1824
+ const ambientReply = await maybeHandleTelegramAmbientMessage({
1825
+ text: ctx.text,
1826
+ chatId: ctx.chatId,
1827
+ userId: ctx.userId,
1828
+ ...(ctx.userName ? { userName: ctx.userName } : {}),
1829
+ ...(ctx.threadId != null ? { threadId: ctx.threadId } : {}),
1830
+ ambientCapture: ambientMode,
1831
+ });
1832
+ if (ambientReply) {
1833
+ await this.sendMessage(ctx.chatId, ambientReply, {
1834
+ replyTo: ctx.messageId,
1835
+ threadId: ctx.threadId,
1832
1836
  });
1833
- if (ambientReply) {
1834
- await this.sendMessage(ctx.chatId, ambientReply, {
1835
- replyTo: ctx.messageId,
1836
- threadId: ctx.threadId,
1837
- });
1838
- return;
1839
- }
1837
+ return;
1840
1838
  }
1841
1839
  } catch (err) {
1842
1840
  this.log(`telegram ambient-intake failed: ${err instanceof Error ? err.message : String(err)}`);