elanous 0.2.38 → 0.2.40

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 (615) 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/{RrjXTwz-urRAbChP1bX02 → HjeK7zONHfR7op1hKXp4k}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{7954.4f7a8832663ee979.js → 1060.014f1f01a17aec26.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/{8911.bf5e712acb25fb6c.js → 1281.d81877e35b9068f4.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/{2104.70e086d5174a4736.js → 1350.59f40e39e02d91b1.js} +1 -1
  7. package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1452.162bb2d9d699e82a.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +286 -0
  10. package/apps/pwa/out/_next/static/chunks/1537-6bb97b5214928ea9.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +149 -0
  12. package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +90 -0
  14. package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +104 -0
  15. package/apps/pwa/out/_next/static/chunks/2047.8f23e210995d4548.js +2 -0
  16. package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/{1632.7d87f998e714bede.js → 2066.a77257c8c350770a.js} +1 -1
  18. package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/{8019.21ca554a821dad01.js → 2177.df8547f9d7215c4e.js} +3 -3
  20. package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/{3528.e4b8ab70d339f965.js → 2226.2cf61ec781827219.js} +2 -2
  22. package/apps/pwa/out/_next/static/chunks/2281-b8cede695c6c650e.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/{6493.27ad77de7aac7966.js → 2499.02fbfd18126c10c0.js} +1 -1
  24. package/apps/pwa/out/_next/static/chunks/{7628.6b16863ac3972333.js → 2522.f2766b76d22c8bdf.js} +1 -1
  25. package/apps/pwa/out/_next/static/chunks/{3086.fb14b60ce98b53d3.js → 2566.beaffc3a5e1fcd2e.js} +1 -1
  26. package/apps/pwa/out/_next/static/chunks/{9299.24e2a7d9b6d1f91b.js → 261.0d471e8aded799f3.js} +3 -3
  27. package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +27 -0
  30. package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/2774-719820e3f5b2a3eb.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/2829-734fe8bf2eee7347.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/{7524.ce973525d30b3d52.js → 3330.7443183b7e6fdbdf.js} +1 -1
  41. package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/{3124-561f7f037943cde2.js → 3746-f80a78f220bf37b5.js} +1 -1
  44. package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +24 -0
  45. package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +77 -0
  46. package/apps/pwa/out/_next/static/chunks/{bb6987f9.3647e1a23b0e3217.js → 3b355b3d.6f73c98bf6f9c749.js} +1 -1
  47. package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +36 -0
  48. package/apps/pwa/out/_next/static/chunks/{8994d93e.33ba491f95345fc2.js → 409c787b.e48c5bec8ec10456.js} +1 -1
  49. package/apps/pwa/out/_next/static/chunks/{5041-5aada92ca215ffdd.js → 413-24c8284bda08241d.js} +1 -1
  50. package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +287 -0
  52. package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4351.0f37a6db2b34d50b.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/{5638.107314dc479e2f37.js → 470.51a72a2348306455.js} +2 -2
  56. package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/{8487.291666583bebe640.js → 4769.9fd582071301f382.js} +1 -1
  58. package/apps/pwa/out/_next/static/chunks/{8509.3a54d4e61893d7cb.js → 483.725e4a61be922788.js} +1 -1
  59. package/apps/pwa/out/_next/static/chunks/{9fe1b809.738da85c8b17e3fb.js → 4864a2ca.1c1c280a7772c5e5.js} +1 -1
  60. package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +74 -0
  63. package/apps/pwa/out/_next/static/chunks/{8879.ac06755bcf3e44a1.js → 5383.bdfa5d886e39a826.js} +1 -1
  64. package/apps/pwa/out/_next/static/chunks/{6142.913b44e260a3f925.js → 5436.fdf6fa8ae3e9588d.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5622.94893f5aea7185d0.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +8 -0
  70. package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +62 -0
  72. package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +94 -0
  76. package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{7161-8f22db3ec5ed005e.js → 6051-0ae955eedb10adb9.js} +3 -3
  78. package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/{3291.f6c1005387d514bd.js → 6257.c0037b8949239f5e.js} +2 -2
  80. package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/6624.981ef7caeb680560.js +32 -0
  85. package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/{5203.51e5d8b5f1dcfe53.js → 6749.0744ce6eb08d40e9.js} +3 -3
  87. package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/{1938.0e6c60ee91c4d7f5.js → 6908.06008c67f6380ea9.js} +2 -2
  90. package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/{de8b930d.d94c0f42acf807fc.js → 6cc1d1d6.9a98dd4622f1afc6.js} +1 -1
  93. package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7219-15bdd9a80661af8e.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +93 -0
  96. package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7515.1ad6efe157fa4448.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +24 -0
  100. package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/7611.85f045bf232053ac.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8086.1ab9103c41be884f.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8099.1cccf31c1baa7e1c.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/{1026-44010f405704050c.js → 8272-025653884f9645d2.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/{5307.d7328020227880c2.js → 8357.1aaa713b052a78b1.js} +4 -4
  110. package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/{4199-f7c6eb40cd0322f8.js → 8639-92c11d069792429e.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/8d173e38.18a2f7b4e1848bdb.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/9069.657590a84afb8fac.js +41 -0
  115. package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9175.2de5209a5ce6f68a.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9184.45afbf44fec87574.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{eaad0cba.771200940c529df7.js → 9189505a.980427ac048c8c60.js} +1 -1
  119. package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/9992.07ce73c10bd5e6a1.js +79 -0
  123. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/botlab/{page-866aac5ff226a7f3.js → page-ba957ff875a026a0.js} +1 -1
  128. package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live/page-4edb8df90f4537ce.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/live-run/page-83d27757e2b8060a.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/morning/page-fca2e59a81744d9e.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/term/page-139d722de1dcd6c1.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/workspace/page-ccde99f07aaf71f7.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/{b7478fef.5917716286213fcc.js → b84cad00.594027ebe0531fe2.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/{b7459770.6539b11860eb8a9c.js → ca3702f8.2913182e73889fa2.js} +7 -7
  177. package/apps/pwa/out/_next/static/chunks/{3f0de3de-2340c532c00395db.js → d5d3cefc-373c4eb722ed848b.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/{89d6c04f-6b8ab341748e468a.js → d8de0de2-dd0f4ac8e5ab1832.js} +1 -1
  179. package/apps/pwa/out/_next/static/chunks/{framework-4b12a946f352cee2.js → framework-002b472a66935d31.js} +1 -1
  180. package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +1 -0
  184. package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.js +1 -0
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +22 -22
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +22 -22
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +22 -22
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +21 -21
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +21 -21
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +22 -22
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +21 -21
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +22 -22
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +22 -22
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +21 -21
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +22 -22
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +22 -22
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +22 -22
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +22 -22
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +21 -21
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +21 -21
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +22 -22
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +22 -22
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +22 -22
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +21 -21
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +21 -21
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +22 -22
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +22 -22
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +21 -21
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +21 -21
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +21 -21
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +22 -22
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +22 -22
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +21 -21
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +22 -22
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +22 -22
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +22 -22
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +22 -22
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +22 -22
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +21 -21
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +22 -22
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +22 -22
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +22 -22
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +22 -22
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +22 -22
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +22 -22
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +22 -22
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +22 -22
  278. package/graphs/demo/persona-marketer/fixtures/marketer-scenario.yaml +10 -0
  279. package/graphs/demo/persona-marketer/persona-marketer.yaml +25 -0
  280. package/graphs/demo/persona-marketer/recipes.yaml +19 -0
  281. package/graphs/video/explainer-line.yaml +4 -1
  282. package/package.json +1 -1
  283. package/scripts/dead-code/report.ts +169 -0
  284. package/scripts/lib/morning-report-options.ts +3 -4
  285. package/scripts/lib/tui-regress-evidence.ts +56 -0
  286. package/scripts/morning-report.ts +5 -1
  287. package/scripts/public-export.ts +15 -7
  288. package/scripts/release-loop/export-check-node.ts +21 -3
  289. package/scripts/release-loop/gate-node.ts +379 -48
  290. package/scripts/release-loop/gate-shard-dispatch.ts +128 -0
  291. package/scripts/release-loop/gate-shard-receipts.ts +89 -0
  292. package/scripts/release-loop/gate-wall.ts +5 -5
  293. package/scripts/release-loop/preflight.ts +6 -2
  294. package/scripts/release-loop/resume-release.ts +20 -5
  295. package/scripts/release-loop/resume.ts +48 -0
  296. package/scripts/release-loop/version-node.ts +7 -2
  297. package/scripts/release-story/draft.ts +1 -1
  298. package/scripts/research-bench/README.md +53 -0
  299. package/scripts/research-bench/questions.json +66 -0
  300. package/scripts/research-bench/rubric.md +33 -0
  301. package/scripts/research-bench/run.ts +523 -0
  302. package/scripts/tui-regress.ts +85 -10
  303. package/src/acp/core-turn-bridge.ts +8 -0
  304. package/src/agent/autonomous-tools.ts +10 -3
  305. package/src/agent/monad-agent-turn.ts +4 -1
  306. package/src/agent/registry.ts +26 -2
  307. package/src/agent/shared-app-tools.ts +1 -1
  308. package/src/agent/surface-ux/build.ts +12 -3
  309. package/src/agent/surface-ux/types.ts +1 -1
  310. package/src/agent/task-notification.ts +75 -6
  311. package/src/agent/types.ts +3 -0
  312. package/src/agent-mission/driver.ts +29 -3
  313. package/src/agent-mission/mission-cli.ts +2 -1
  314. package/src/agent-substrate/review-context-pack.ts +365 -0
  315. package/src/agent-substrate/self-review-cli.ts +226 -17
  316. package/src/ask-user-question/index.ts +6 -0
  317. package/src/ask-user-question/inline-resolver.ts +49 -0
  318. package/src/auto-research/question-ladder-contract.ts +22 -3
  319. package/src/auto-research/research-turn.ts +350 -17
  320. package/src/autopilot/agent-loop.ts +1 -1
  321. package/src/autopilot/pty-control-loop.ts +8 -1
  322. package/src/boot/daemon-tools/index.ts +4 -3
  323. package/src/boot/daemon-tools/self-implement.ts +270 -2
  324. package/src/boot/daemon-tools/types.ts +2 -0
  325. package/src/budget/llm-cost.ts +44 -5
  326. package/src/budget/unified-usage.ts +17 -1
  327. package/src/capture/tui-self-report.ts +14 -0
  328. package/src/chat/index.ts +33 -7
  329. package/src/cli/agent-cli.ts +43 -8
  330. package/src/cli/intake-cli.ts +22 -1
  331. package/src/cli/lesson-cli.ts +19 -3
  332. package/src/cli/log-event-names.ts +1 -0
  333. package/src/cli/pod-cli.ts +17 -2
  334. package/src/cli/pty-takeover-cli.ts +67 -7
  335. package/src/cli/release-cli.ts +52 -6
  336. package/src/cli/repo-cli.ts +2 -1
  337. package/src/cli/tasks-cli.ts +36 -9
  338. package/src/control-plane/ledger.ts +21 -4
  339. package/src/core-turn/run-core-turn.ts +44 -3
  340. package/src/core-turn/run-goal-loop.ts +152 -8
  341. package/src/core-turn/types.ts +9 -0
  342. package/src/dashboard/chat/acp-chat.ts +2 -2
  343. package/src/dashboard/classic-sigquit.ts +16 -0
  344. package/src/dashboard/index.ts +321 -27
  345. package/src/dashboard/input/chat-main-interaction-opts.ts +3 -0
  346. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +7 -2
  347. package/src/dashboard/input/chat-main-slash-command.ts +7 -0
  348. package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
  349. package/src/dashboard/input/dashboard-priority-key-route.ts +21 -5
  350. package/src/dashboard/input/external-input-host.ts +2 -0
  351. package/src/dashboard/sidetab-runtime.ts +228 -0
  352. package/src/dashboard/slash-runtime/ask-clarification.ts +7 -1
  353. package/src/dashboard/slash-runtime/dashboard-handlers.ts +20 -8
  354. package/src/dashboard/slash-runtime/help-from-registry.ts +2 -2
  355. package/src/dashboard/term-slash-runtime.ts +16 -18
  356. package/src/dashboard/turn-preamble.ts +2 -0
  357. package/src/domains/knowledge.ts +1 -1
  358. package/src/esc-abort-gate.ts +33 -1
  359. package/src/execution-loop/launch-gate.ts +206 -1
  360. package/src/graph-runner/graph-cli.ts +6 -4
  361. package/src/graph-runner/runner.ts +31 -9
  362. package/src/graph-wizard/generate.ts +16 -7
  363. package/src/graph-wizard/mission-compose.ts +201 -0
  364. package/src/grok/agent-search.ts +8 -2
  365. package/src/grok/credential.ts +5 -0
  366. package/src/grounding/ref-index.ts +11 -0
  367. package/src/grounding/ref-vector.ts +61 -0
  368. package/src/grounding/sources-cli.ts +2 -2
  369. package/src/grounding/sources.ts +15 -1
  370. package/src/harness/harness-cli-command.ts +38 -9
  371. package/src/harness/harness-pod-dispatch.ts +7 -1
  372. package/src/index.ts +18 -4
  373. package/src/input/external-input-queue.ts +10 -0
  374. package/src/intake-plane/collect-telegram-saved.ts +36 -1
  375. package/src/intake-plane/intake-to-tasks.ts +246 -3
  376. package/src/lessons/friction-ledger.ts +154 -0
  377. package/src/live-supply/collector.ts +149 -0
  378. package/src/live-supply/probes.ts +52 -0
  379. package/src/live-supply/snapshot.ts +40 -0
  380. package/src/llm.ts +431 -76
  381. package/src/loops/orchestrator/tick.ts +8 -0
  382. package/src/nexus/api/harness-api.ts +2 -1
  383. package/src/pty/snapshot.py +132 -0
  384. package/src/pty-shell/pty-control-ipc.ts +29 -2
  385. package/src/pty-shell/pty-manifest.ts +59 -3
  386. package/src/pty-shell/registry.ts +2 -0
  387. package/src/pty-shell/tui-run-state.ts +80 -3
  388. package/src/release-loop/gate-host-reservation.ts +13 -4
  389. package/src/release-loop/gate-shard-ledger.ts +68 -0
  390. package/src/release-loop/merged-pr-checklist.ts +25 -2
  391. package/src/release-loop/rehearsal-shard-plan.ts +6 -1
  392. package/src/release-loop/rehearsal.ts +27 -0
  393. package/src/research/edge-decision.ts +124 -15
  394. package/src/research/gap-followup.ts +249 -0
  395. package/src/research/lenses/counter-evidence.ts +100 -0
  396. package/src/research/lenses/working-backwards.ts +89 -0
  397. package/src/research/plugin-discovery.ts +242 -0
  398. package/src/research-bridge/invoke.ts +4 -2
  399. package/src/research-bridge/types.ts +2 -0
  400. package/src/self-dev/ask-launch-flow.ts +34 -106
  401. package/src/self-dev/dev-cli.ts +2 -0
  402. package/src/self-dev/dev-pipeline.ts +8 -4
  403. package/src/self-dev/graph-journey-route.ts +10 -2
  404. package/src/self-dev/launch-preflight-text.ts +2 -2
  405. package/src/self-dev/launch-preflight.ts +38 -7
  406. package/src/self-dev/orchestrate-cli.ts +1 -0
  407. package/src/self-dev/run-supervisor.ts +19 -0
  408. package/src/self-implement/device-first.ts +8 -2
  409. package/src/self-implement/doctor-visit.ts +76 -58
  410. package/src/self-implement/gate-artifacts.ts +3 -0
  411. package/src/self-implement/gate-baseline.ts +75 -4
  412. package/src/self-implement/gate-cli.ts +317 -9
  413. package/src/self-implement/gate-receipt-registry.ts +180 -0
  414. package/src/self-implement/gate-remote.ts +145 -22
  415. package/src/self-implement/goal-author-clarification.ts +178 -24
  416. package/src/self-implement/goal-author-decompose.ts +24 -15
  417. package/src/self-implement/goal-author.ts +9 -5
  418. package/src/self-implement/host-regate.ts +120 -45
  419. package/src/self-implement/impl-findings-feedback.ts +188 -0
  420. package/src/self-implement/knowhow-pack.ts +189 -10
  421. package/src/self-implement/off-diff-evidence.ts +124 -0
  422. package/src/self-implement/orchestrator.ts +85 -7
  423. package/src/self-implement/run-ledger.ts +46 -8
  424. package/src/self-implement/run-stop.ts +12 -0
  425. package/src/self-implement/seams.ts +6 -3
  426. package/src/self-implement/self-implement-cli.ts +4 -2
  427. package/src/session/chat.ts +89 -15
  428. package/src/session-runtime/provider-circuit.ts +140 -0
  429. package/src/shell-runner/file-engine.ts +1 -0
  430. package/src/shell-runner/types.ts +4 -0
  431. package/src/sidetab-core/model.ts +176 -0
  432. package/src/skills/tools/schedule-wakeup.ts +23 -1
  433. package/src/skills/tools/shell.ts +51 -5
  434. package/src/steward/directive-audit.ts +354 -0
  435. package/src/surface/child-process.ts +31 -0
  436. package/src/surface/tui-stderr-owner.ts +48 -0
  437. package/src/task-agent/cover.ts +30 -12
  438. package/src/task-agent/judge.ts +56 -0
  439. package/src/task-agent/postland-card.ts +35 -2
  440. package/src/task-agent/rejudge-on-head.ts +46 -2
  441. package/src/task-agent/repair-cycle.ts +1 -1
  442. package/src/task-agent/task-hand.ts +129 -24
  443. package/src/task-agent/tier-split.ts +105 -21
  444. package/src/task-orchestrator/surfaces/pod-command-job.ts +330 -2
  445. package/src/task-orchestrator/surfaces/pod-config-snapshot.ts +123 -0
  446. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +27 -2
  447. package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +11 -8
  448. package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +1 -1
  449. package/src/task-orchestrator/surfaces/pod-source-receive.ts +74 -6
  450. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +2 -1
  451. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +56 -15
  452. package/src/task-orchestrator/surfaces/self-implement-pod.ts +186 -33
  453. package/src/tool-runtime/skill-exec-runtime.ts +95 -5
  454. package/src/tui/entry.ts +15 -2
  455. package/src/tui/inline-choice.ts +188 -0
  456. package/src/tui/sidetab/list.ts +2 -176
  457. package/src/tui/slash/term.ts +12 -1
  458. package/src/tui-client/dashboard-session.ts +7 -1
  459. package/src/user-config.ts +34 -4
  460. package/src/ux-sim/classic-tui-seat-scenarios.ts +1 -7
  461. package/src/ux-sim/fake-land-queue.ts +88 -0
  462. package/src/ux-sim/gate-shard-host-reroute.ts +82 -0
  463. package/src/ux-sim/goal-interim-trace.ts +24 -0
  464. package/src/ux-sim/next-tui-seat-scenarios.ts +8 -13
  465. package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +4 -1
  466. package/src/version/packed-revision.json +1 -1
  467. package/src/video-pipeline/recipes/explainer.ts +54 -2
  468. package/src/web-search/grok.ts +32 -6
  469. package/src/web-search/index.ts +8 -7
  470. package/src/workflow-runtime/node-catalog.ts +53 -4
  471. package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +0 -27
  472. package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +0 -1
  473. package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +0 -1
  474. package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +0 -1
  475. package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +0 -1
  477. package/apps/pwa/out/_next/static/chunks/1923-5c1695332240246a.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +0 -1
  479. package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +0 -93
  481. package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +0 -104
  482. package/apps/pwa/out/_next/static/chunks/2415.738b777642a02233.js +0 -1
  483. package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +0 -1
  486. package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +0 -1
  487. package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +0 -1
  490. package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +0 -24
  492. package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +0 -1
  493. package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +0 -36
  494. package/apps/pwa/out/_next/static/chunks/3341-f09b9efbd7a82f70.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +0 -1
  496. package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +0 -287
  498. package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +0 -94
  504. package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +0 -1
  510. package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +0 -32
  514. package/apps/pwa/out/_next/static/chunks/4804.6012b5cd33c22792.js +0 -90
  515. package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +0 -79
  517. package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +0 -74
  520. package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/5255-1b60d50eabe9f057.js +0 -1
  522. package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +0 -286
  523. package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +0 -8
  527. package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +0 -1
  531. package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/7000.28157393caaf5343.js +0 -62
  539. package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/7488.966b116789f3d41a.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +0 -77
  544. package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +0 -149
  554. package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +0 -41
  555. package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +0 -24
  556. package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/9581.da63ddf41acfad46.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +0 -2
  560. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/intake/page-c348a3959c5b5fc6.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d1d1210f99f620ae.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/app/outputs/page-291ab19fe2acb173.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/app/share/page-a9d9a3e66459c1e0.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/app/term/page-6b140f77593576eb.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +0 -1
  615. /package/apps/pwa/out/_next/static/{RrjXTwz-urRAbChP1bX02 → HjeK7zONHfR7op1hKXp4k}/_ssgManifest.js +0 -0
@@ -0,0 +1,33 @@
1
+ # Blind scoring rubric
2
+
3
+ ## SCQA
4
+
5
+ **S** — 조사 답변은 출처가 있어도 깊이·범위·원인 설명·반대 근거·지연이 서로 다를 수 있다.
6
+
7
+ **C** — 단일 총점이나 인상 평가는 하니스 이름·문장 길이에 끌려 재현이 어렵다.
8
+
9
+ **Q** — 10개 답변을 어떻게 비교해 회귀와 강점을 구분할까?
10
+
11
+ **A** — 두 응답의 harness/model 표식을 지운 뒤 아래 품질 7개 축과 지연을 각각 0–3점으로 채점한다. 기준과 근거 위치를 기록하고, 두 명이 독립 채점한다. 불일치가 2점 이상이면 제3자 판정을 남긴다.
12
+
13
+ ## Dimensions (0–3 each)
14
+
15
+ | Dimension | 0 | 1 | 2 | 3 |
16
+ |---|---|---|---|---|
17
+ | 근거의 양·검증성 | 출처가 없거나 핵심 주장을 지지하지 않음 | 단일 출처 위주, 일부 핵심 주장만 연결 | 핵심 주장 대부분이 직접 출처와 연결되고 2종 이상 출처 사용 | 핵심 주장 전부 추적 가능, 1차 자료와 독립 확인을 교차 대조하고 날짜·단위를 보존 |
18
+ | 해상도 L0–L3 | 결론 한 줄조차 불명확 | L0 결론만 있음 | L1 자료 근거 또는 L2 원인 분해까지 도달 | L3 반대 근거·조건부 시나리오까지 근거와 함께 제시 |
19
+ | 데이터 폭 | 단일 출처·측정치 | 한 유형 또는 한 기간만 사용 | 여러 출처 유형·기간을 비교하나 주요 공백 존재 | 정의·표본·기간이 다른 자료를 분리하고 폭과 대표성 한계를 명시 |
20
+ | 원인 분해 | 결론만 말하거나 상관을 인과로 단정 | 요인을 나열 | 요인별 자료와 작동 경로를 나눔 | 대안 설명을 비교하고 어떤 자료가 원인을 가르는지 제시 |
21
+ | 반대 근거 | 없음 | 형식적 한 문장 | 실재하는 반대 자료나 대안 가설 하나 이상 | 가장 강한 반증을 찾아 주장·확신을 그에 맞게 조정 |
22
+ | 기억·맥락 활용 | 기준일·제공 맥락을 무시하거나 꾸밈 | 맥락 언급만 있고 답에 영향 없음 | 제공된 공통 맥락/과거 기준선을 정확히 사용 | 이전 결과와의 차이를 추적하고, 제공되지 않은 기억을 쓴 척하지 않음 |
23
+ | 출력의 풍부함·사용성 | 읽거나 행동으로 옮기기 어려움 | 장문/목록이지만 구조·다음 단계 약함 | 요약·표·출처가 명료하고 공백을 드러냄 | 핵심 판단→근거→대안→관측 지표로 이어지며 목적에 맞는 구조를 사용 |
24
+ | 지연(고정 timeout 대비) | timeout 또는 결과 없음 | 허용 시간의 75% 초과 | 25% 초과~75% 이하 | 25% 이하 |
25
+
26
+ ## Scoring controls
27
+
28
+ - 각 점수에 답변 내 근거 인용(문단/문장)과 출처 URL을 기록한다. 근거 없는 점수는 무효다.
29
+ - 인용 링크가 존재하는 것만으로 근거로 세지 않는다. 출처 본문이 실제 주장을 지지하는지 확인한다.
30
+ - 모델 이름·harness 이름은 검수자가 모르게 바꾼다. 실행 순서는 질문마다 번갈아 균형화한다.
31
+ - 불확실성·측정 불가를 정직하게 표시한 답은 그 이유만으로 감점하지 않는다.
32
+ - 품질 7축은 문항당 7–21점이다. 지연 점수는 별도로 내고 품질 합계에 섞지 않는다. 총계보다 축별 중앙값·범위·문항별 짝차를 먼저 보고한다.
33
+ - 적어도 2명 채점자의 가중치 없는 평균을 쓴다. 필요하면 차원별 Cohen's kappa를 함께 기록한다. 표본 10개를 모집단 일반화나 유의성 주장으로 부풀리지 않는다.
@@ -0,0 +1,523 @@
1
+ #!/usr/bin/env bun
2
+ import { createHash, randomUUID } from 'node:crypto';
3
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
4
+ import { spawn } from 'node:child_process';
5
+ import { dirname, isAbsolute, relative, resolve } from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+ import { estimateLlmCost } from '../../src/budget/llm-cost.js';
8
+
9
+ export interface ResearchQuestion {
10
+ id: string;
11
+ domain: 'finance' | 'technology' | 'market';
12
+ bloom: string[];
13
+ requiresHigherOrder: boolean;
14
+ prompt: string;
15
+ }
16
+
17
+ export interface HarnessAdapter {
18
+ command: string;
19
+ args: string[];
20
+ cwd?: string;
21
+ model: string;
22
+ toolPolicyId: string;
23
+ maxTurns: number;
24
+ timeoutMs: number;
25
+ usageSource: 'elanous-logs' | 'claude-stream-json';
26
+ usageCommand?: string;
27
+ usageArgs?: string[];
28
+ usageTimeoutMs?: number;
29
+ officialPricing?: { inputPerM: number; outputPerM: number; cacheReadPerM: number; cacheWritePerM: number; sourceUrl: string };
30
+ }
31
+
32
+ export interface AdapterConfig {
33
+ version: 2;
34
+ baselineProbe: { command: string; args: string[] };
35
+ cells: Record<string, { description: string; elanous: HarnessAdapter; claudeCode?: HarnessAdapter }>;
36
+ }
37
+
38
+ const ROOT = dirname(fileURLToPath(import.meta.url));
39
+ const QUESTIONS_PATH = resolve(ROOT, 'questions.json');
40
+ const CELL_DESIGNS = [
41
+ { id: 'A0', group: 'control', bloomCeiling: 0, layout: 'baseline', claudeCode: true },
42
+ { id: 'A1', group: 'bloom-ablation', bloomCeiling: 3, layout: 'baseline', claudeCode: true },
43
+ { id: 'A2', group: 'bloom-ablation', bloomCeiling: 5, layout: 'baseline', claudeCode: true },
44
+ { id: 'A3', group: 'bloom-ablation', bloomCeiling: 6, layout: 'baseline', claudeCode: true },
45
+ { id: 'B', group: 'product', bloomCeiling: 0, layout: 'product-default', claudeCode: true },
46
+ { id: 'P1', group: 'layout-ablation', bloomCeiling: 6, layout: 'linear-1-to-6', claudeCode: false },
47
+ { id: 'P5', group: 'layout-ablation', bloomCeiling: 6, layout: 'p5-front6-parallel-bottom-loop-4-5', claudeCode: false },
48
+ { id: 'P5-no-front6', group: 'layout-ablation', bloomCeiling: 6, layout: 'p5-without-front6', claudeCode: false },
49
+ ] as const;
50
+ const PLACEHOLDERS = ['{prompt}', '{questionId}', '{runId}', '{cellId}', '{bloomCeiling}', '{layout}'] as const;
51
+ const API_STOP_USD = 160;
52
+ const PRICE_SOURCES = ['https://platform.claude.com/docs/en/build-with-claude/prompt-caching', 'https://www.anthropic.com/claude/opus'];
53
+ const BLOOM_STAGE_INSTRUCTIONS: Record<number, string> = {
54
+ 3: 'Structure the work explicitly through Bloom stages 1–3: state relevant facts, explain the governing concepts, and apply them to the evidence.',
55
+ 5: 'Structure the work explicitly through Bloom stages 1–5: state relevant facts, explain concepts, apply evidence, decompose causes/gaps/contradictions, then evaluate source strength and strongest counterevidence.',
56
+ 6: 'Structure the work explicitly through Bloom stages 1–6: state facts, explain concepts, apply evidence, analyze causes/gaps/contradictions, evaluate source strength and counterevidence, then synthesize a conditional scenario/output.',
57
+ };
58
+ const LAYOUT_INSTRUCTIONS: Record<string, string> = {
59
+ 'linear-1-to-6': 'Follow one linear sequence exactly once: stages 1→2→3→4→5→6. Do not parallelize or loop back.',
60
+ 'p5-front6-parallel-bottom-loop-4-5': 'First reverse-design the target answer with stage 6 (define answer shape only, no speculative findings). Then establish stage 2 axes; gather stages 1 and 3 in parallel for each axis; run a central stage 4/5 loop that adds or deepens only evidence-backed gaps and records why it stops; finally synthesize with stage 6 from evaluated evidence only.',
61
+ 'p5-without-front6': 'Establish stage 2 axes; gather stages 1 and 3 in parallel for each axis; run a central stage 4/5 loop that adds or deepens only evidence-backed gaps and records why it stops; finally synthesize with stage 6 from evaluated evidence only. Do not reverse-design the output before research.',
62
+ };
63
+
64
+ export function validateQuestions(value: unknown): ResearchQuestion[] {
65
+ if (!Array.isArray(value) || value.length !== 10) throw new Error('questions.json must contain exactly 10 questions');
66
+ const questions = value as ResearchQuestion[];
67
+ const ids = new Set<string>();
68
+ const domains = new Set<string>();
69
+ const blooms = new Set<string>();
70
+ for (const q of questions) {
71
+ if (!q || typeof q.id !== 'string' || !q.id.trim() || ids.has(q.id)) throw new Error('question ids must be non-empty and unique');
72
+ if (!['finance', 'technology', 'market'].includes(q.domain)) throw new Error(`unsupported domain: ${q.domain}`);
73
+ if (!Array.isArray(q.bloom) || !q.bloom.length || typeof q.prompt !== 'string' || !q.prompt.trim()) throw new Error(`invalid question: ${q.id}`);
74
+ ids.add(q.id); domains.add(q.domain); q.bloom.forEach(stage => blooms.add(stage));
75
+ }
76
+ if (domains.size !== 3) throw new Error('questions must cover finance, technology, and market');
77
+ for (const stage of ['remember', 'understand', 'apply', 'analyze', 'evaluate', 'create']) {
78
+ if (!blooms.has(stage)) throw new Error(`questions omit Bloom stage: ${stage}`);
79
+ }
80
+ if (questions.filter(q => q.requiresHigherOrder && q.bloom.some(stage => stage === 'analyze' || stage === 'evaluate')).length < 4) throw new Error('at least four questions must require Bloom analyze/evaluate');
81
+ return questions;
82
+ }
83
+
84
+ export function validateConfig(config: AdapterConfig, totalCapUsd?: number): void {
85
+ if (config.version !== 2 || (totalCapUsd !== undefined && (!Number.isFinite(totalCapUsd) || totalCapUsd <= 0))) throw new Error('config version 2 and positive total cost cap are required');
86
+ if (!config.baselineProbe?.command || !Array.isArray(config.baselineProbe.args)) throw new Error('config requires a baseline version probe');
87
+ const requiredCells = CELL_DESIGNS.map(cell => cell.id);
88
+ for (const cellId of requiredCells) {
89
+ const cell = config.cells?.[cellId];
90
+ if (!cell?.elanous || !cell.elanous.command) throw new Error(`${cellId}: Elanous adapter is required`);
91
+ if (CELL_DESIGNS.find(item => item.id === cellId)!.claudeCode && (!cell.claudeCode || !cell.claudeCode.command)) throw new Error(`${cellId}: Claude Code adapter is required`);
92
+ for (const [name, adapter] of [['elanous', cell.elanous], ...(cell.claudeCode ? [['claudeCode', cell.claudeCode] as const] : [])] as const) {
93
+ if (!Array.isArray(adapter.args) || !adapter.args.some(arg => arg.includes('{prompt}'))) throw new Error(`${name} args must include the prompt placeholder`);
94
+ if (!Number.isInteger(adapter.maxTurns) || adapter.maxTurns < 1) throw new Error(`${name} requires positive maxTurns`);
95
+ if (!Number.isInteger(adapter.timeoutMs) || adapter.timeoutMs < 1000) throw new Error(`${name} timeoutMs must be at least 1000`);
96
+ if (name === 'elanous' && (adapter.usageSource !== 'elanous-logs' || !adapter.usageCommand || !adapter.usageArgs?.some(arg => arg.includes('{sessionId}')) || !adapter.args.some(arg => arg.startsWith('ELANOUS_STATE_DIR=')))) throw new Error('Elanous adapters must pass an isolated ELANOUS_STATE_DIR and read per-session llm-usage logs');
97
+ if (name === 'claudeCode' && adapter.usageSource !== 'claude-stream-json') throw new Error('Claude Code adapters must emit stream-json usage events');
98
+ }
99
+ }
100
+ for (const cellId of ['A0', 'A1', 'A2', 'A3'] as const) {
101
+ const cell = config.cells[cellId]; const a = cell.elanous; const b = cell.claudeCode!;
102
+ if (a.model !== b.model || a.toolPolicyId !== b.toolPolicyId || a.maxTurns !== b.maxTurns || a.timeoutMs !== b.timeoutMs || JSON.stringify(a.officialPricing) !== JSON.stringify(b.officialPricing)) throw new Error(`${cellId}: controlled arm requires matching model, tool, turn, timeout, and pricing conditions`);
103
+ if (cellId !== 'A0') {
104
+ const baseline = config.cells.A0.elanous;
105
+ if (a.model !== baseline.model || a.toolPolicyId !== baseline.toolPolicyId || a.maxTurns !== baseline.maxTurns || a.timeoutMs !== baseline.timeoutMs || JSON.stringify(a.officialPricing) !== JSON.stringify(baseline.officialPricing) || JSON.stringify(b.officialPricing) !== JSON.stringify(config.cells.A0.claudeCode!.officialPricing)) throw new Error(`${cellId}: Bloom ablation must match A0 model/tool/turn/timeout/pricing`);
106
+ }
107
+ }
108
+ if (totalCapUsd !== undefined && (!Number.isFinite(totalCapUsd) || totalCapUsd < API_STOP_USD || totalCapUsd > 200)) throw new Error('approved API spend cap must be between $160 stop threshold and $200 maximum');
109
+ }
110
+
111
+ export function makeRunPlan(questions: ResearchQuestion[], config: AdapterConfig, runId: string, pilot = false, smokePairs = 0) {
112
+ const selected = smokePairs > 0
113
+ ? (['finance', 'technology', 'market'] as const).slice(0, smokePairs).map(domain => questions.find(question => question.domain === domain)!).filter(Boolean)
114
+ : pilot
115
+ ? (['finance', 'technology', 'market'] as const).map(domain => questions.find(question => question.domain === domain)!).filter(Boolean)
116
+ : questions;
117
+ const designs = smokePairs > 0 ? CELL_DESIGNS.filter(design => design.id === 'A0') : CELL_DESIGNS;
118
+ return {
119
+ runId,
120
+ questionCount: selected.length,
121
+ ...(smokePairs > 0 ? { smokePairs: selected.length } : {}),
122
+ calls: selected.flatMap((question, questionIndex) => designs.flatMap((design, cellIndex) => {
123
+ const harnesses = design.claudeCode
124
+ ? ((questionIndex + cellIndex) % 2 === 0 ? ['elanous', 'claudeCode'] as const : ['claudeCode', 'elanous'] as const)
125
+ : ['elanous'] as const;
126
+ return harnesses.map(harness => ({ questionId: question.id, domain: question.domain, cell: design.id, group: design.group, bloomCeiling: design.bloomCeiling, layout: design.layout, harness }));
127
+ })),
128
+ apiCalls: selected.length * designs.length,
129
+ phase: smokePairs > 0 ? 'execution-validation-smoke' : pilot ? 'pilot' : 'full',
130
+ };
131
+ }
132
+
133
+ export function buildPrompt(question: ResearchQuestion, call: { cell: string; bloomCeiling: number; layout: string }, date: string): string {
134
+ const bloomDirective = call.bloomCeiling > 0 ? `\n\n${BLOOM_STAGE_INSTRUCTIONS[call.bloomCeiling] ?? BLOOM_STAGE_INSTRUCTIONS[6]}` : '';
135
+ const layoutDirective = LAYOUT_INSTRUCTIONS[call.layout] ? `\n\nExperimental procedure: ${LAYOUT_INSTRUCTIONS[call.layout]}` : '';
136
+ return `Date: ${date}. Research with web sources and cite original URLs for material claims. Mark unknowns instead of guessing. Do not create or edit files. Keep within eight tool turns.\n\n${question.prompt}${bloomDirective}${layoutDirective}`;
137
+ }
138
+
139
+ function interpolate(args: string[], values: Record<(typeof PLACEHOLDERS)[number], string>): string[] {
140
+ return args.map(arg => PLACEHOLDERS.reduce((result, marker) => result.replaceAll(marker, values[marker]), arg));
141
+ }
142
+
143
+ export function execute(command: string, args: string[], timeoutMs: number, cwd?: string): Promise<{ stdout: string; stderr: string; code: number | null; durationMs: number; timedOut: boolean }> {
144
+ return new Promise((resolvePromise, reject) => {
145
+ const startedAt = Date.now();
146
+ const envNames = new Set(['ELANOUS_STATE_DIR', 'ELANOUS_LLM_PROVIDER', 'ELANOUS_LLM_MODEL', 'ELANOUS_ESCALATE_PROVIDER', 'ELANOUS_ESCALATE_MODEL']);
147
+ const envAssignments = Object.fromEntries(args.flatMap(arg => {
148
+ const match = /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/.exec(arg);
149
+ return match && envNames.has(match[1]!) ? [[match[1]!, match[2]!]] : [];
150
+ }));
151
+ const launchArgs = command.split('/').at(-1) === 'env' ? args : args.filter(arg => !/^(ELANOUS_STATE_DIR|ELANOUS_LLM_PROVIDER|ELANOUS_LLM_MODEL|ELANOUS_ESCALATE_PROVIDER|ELANOUS_ESCALATE_MODEL)=/.test(arg));
152
+ const child = spawn(command, launchArgs, { shell: false, ...(cwd ? { cwd } : {}), env: { ...process.env, ...envAssignments }, stdio: ['ignore', 'pipe', 'pipe'] });
153
+ let stdout = '';
154
+ let stderr = '';
155
+ let timedOut = false;
156
+ let killTimer: ReturnType<typeof setTimeout> | undefined;
157
+ const timer = setTimeout(() => {
158
+ timedOut = true;
159
+ child.kill('SIGTERM');
160
+ killTimer = setTimeout(() => child.kill('SIGKILL'), 5_000);
161
+ }, timeoutMs);
162
+ child.stdout.setEncoding('utf8');
163
+ child.stdout.on('data', (part: string) => { stdout += part; if (stdout.length > 8_000_000) { child.kill('SIGTERM'); reject(new Error('adapter stdout exceeded 8 MB')); } });
164
+ child.stderr.setEncoding('utf8');
165
+ child.stderr.on('data', (part: string) => { stderr += part; if (stderr.length > 1_000_000) stderr = stderr.slice(-1_000_000); });
166
+ child.on('error', error => { clearTimeout(timer); if (killTimer) clearTimeout(killTimer); reject(error); });
167
+ child.on('close', code => { clearTimeout(timer); if (killTimer) clearTimeout(killTimer); resolvePromise({ stdout, stderr, code, durationMs: Date.now() - startedAt, timedOut }); });
168
+ });
169
+ }
170
+
171
+ async function latestSessionId(args: string[], startedAt: string): Promise<string | undefined> {
172
+ const stateRoot = args.find(arg => arg.startsWith('ELANOUS_STATE_DIR='))?.slice('ELANOUS_STATE_DIR='.length);
173
+ if (!stateRoot) return undefined;
174
+ try {
175
+ const sessions = JSON.parse(await readFile(resolve(stateRoot, 'sessions/index.json'), 'utf8')) as Array<{ id?: string; createdAt?: string }>;
176
+ return sessions.filter(session => typeof session.id === 'string' && typeof session.createdAt === 'string' && Date.parse(session.createdAt) >= Date.parse(startedAt))
177
+ .sort((left, right) => Date.parse(right.createdAt!) - Date.parse(left.createdAt!))[0]?.id;
178
+ } catch { return undefined; }
179
+ }
180
+
181
+ async function recoveredSessionAnswer(args: string[], sessionId: string): Promise<string | undefined> {
182
+ const stateRoot = args.find(arg => arg.startsWith('ELANOUS_STATE_DIR='))?.slice('ELANOUS_STATE_DIR='.length);
183
+ if (!stateRoot) return undefined;
184
+ try {
185
+ const lines = (await readFile(resolve(stateRoot, 'sessions', `${sessionId}.jsonl`), 'utf8')).split(/\r?\n/).filter(Boolean);
186
+ const assistantRows = lines.flatMap(line => {
187
+ try { const row = JSON.parse(line); return row.role === 'assistant' && typeof row.content === 'string' ? [row] : []; } catch { return []; }
188
+ });
189
+ return assistantRows.at(-1)?.content;
190
+ } catch { return undefined; }
191
+ }
192
+
193
+ function sha256(value: string): string { return createHash('sha256').update(value).digest('hex'); }
194
+
195
+ function parseJsonLines(value: string): Record<string, any>[] {
196
+ return value.split(/\r?\n/).flatMap(line => { try { const row = JSON.parse(line); return row && typeof row === 'object' ? [row] : []; } catch { return []; } });
197
+ }
198
+
199
+ export function usageCostUsd(usage: { model: string; inputTokens: number; outputTokens: number; cacheReadInputTokens?: number; cacheCreationInputTokens?: number }, officialPricing?: HarnessAdapter['officialPricing']): number {
200
+ if (officialPricing) return (usage.inputTokens * officialPricing.inputPerM + usage.outputTokens * officialPricing.outputPerM + (usage.cacheReadInputTokens ?? 0) * officialPricing.cacheReadPerM + (usage.cacheCreationInputTokens ?? 0) * officialPricing.cacheWritePerM) / 1_000_000;
201
+ const estimate = estimateLlmCost(usage);
202
+ if (estimate.kind === 'unknown' || estimate.kind === 'partial') throw new Error(`no complete catalog price for model ${usage.model}`);
203
+ return estimate.usd;
204
+ }
205
+
206
+ export async function verifyConfiguredBaseline(config: AdapterConfig, baselineSha: string): Promise<string> {
207
+ const probe = await execute(config.baselineProbe.command, config.baselineProbe.args, 20_000);
208
+ if (probe.timedOut || probe.code !== 0) throw new Error(`baseline version probe failed: ${probe.stderr.slice(-1200) || `exit ${probe.code}`}`);
209
+ const version = probe.stdout.trim();
210
+ if (!version.split(/\s+/).includes(baselineSha)) throw new Error(`baseline version probe did not report ${baselineSha}: ${version || '(empty)'}`);
211
+ return version;
212
+ }
213
+
214
+ export function validateCliArgs(argv: string[]): void {
215
+ const booleanFlags = new Set(['--dry-run', '--live', '--pilot', '--full', '--no-cost-cap']);
216
+ const valueFlags = new Set(['--config', '--max-total-cost-usd', '--out', '--approval-ref', '--baseline-sha', '--smoke-pairs', '--resume']);
217
+ for (let i = 0; i < argv.length; i++) {
218
+ const flag = argv[i];
219
+ if (booleanFlags.has(flag)) continue;
220
+ if (!valueFlags.has(flag)) throw new Error(`unknown argument: ${flag}`);
221
+ if (!argv[i + 1] || argv[i + 1].startsWith('--')) throw new Error(`${flag} requires a value`);
222
+ i++;
223
+ }
224
+ if (argv.includes('--pilot') && argv.includes('--full')) throw new Error('--pilot and --full are mutually exclusive');
225
+ if ((argv.includes('--pilot') || argv.includes('--full')) && argv.includes('--smoke-pairs')) throw new Error('--smoke-pairs conflicts with --pilot/--full');
226
+ if (argv.includes('--no-cost-cap') && argv.includes('--max-total-cost-usd')) throw new Error('--no-cost-cap conflicts with --max-total-cost-usd');
227
+ if (argv.includes('--no-cost-cap') && !argv.includes('--live')) throw new Error('--no-cost-cap requires --live');
228
+ if (argv.includes('--no-cost-cap') && !argv.includes('--approval-ref')) throw new Error('--no-cost-cap requires --approval-ref (for example OP#42096)');
229
+ if (argv.includes('--approval-ref') && !argv.includes('--no-cost-cap')) throw new Error('--approval-ref requires --no-cost-cap');
230
+ if (argv.includes('--resume') && !argv.includes('--live')) throw new Error('--resume requires --live');
231
+ if (argv.includes('--live') && !argv.includes('--no-cost-cap') && !argv.includes('--max-total-cost-usd')) throw new Error('--live requires --max-total-cost-usd or --no-cost-cap');
232
+ if (argv.includes('--live') && !argv.includes('--pilot') && !argv.includes('--full') && !argv.includes('--smoke-pairs')) throw new Error('--live requires exactly one of --pilot, --full, or --smoke-pairs');
233
+ if (argv.includes('--live') && argv.includes('--smoke-pairs')) {
234
+ const value = Number(argv[argv.indexOf('--smoke-pairs') + 1]);
235
+ if (!Number.isInteger(value) || value < 1 || value > 3) throw new Error('--smoke-pairs must be an integer from 1 to 3');
236
+ }
237
+ if (argv.includes('--live') && !/^[0-9a-f]{40}$/i.test(argv[argv.indexOf('--baseline-sha') + 1] ?? '')) throw new Error('--live requires --baseline-sha with a full 40-character commit SHA');
238
+ }
239
+
240
+ export function completedCallKeys(records: Array<Record<string, unknown>>): Set<string> {
241
+ return new Set(records.map(record => `${record.questionId}:${record.cell}:${record.harness}`));
242
+ }
243
+
244
+ export function claudeAuthSummary(stdout: string): Record<string, unknown> {
245
+ try {
246
+ const status = JSON.parse(stdout) as Record<string, unknown>;
247
+ return Object.fromEntries(['loggedIn', 'authMethod', 'subscriptionType', 'hasApiKey']
248
+ .filter(key => typeof status[key] === 'boolean' || typeof status[key] === 'string')
249
+ .map(key => [key, status[key]]));
250
+ } catch {
251
+ return { parseError: 'claude auth status returned non-JSON output' };
252
+ }
253
+ }
254
+
255
+ export function buildResumeEvent(records: Array<Record<string, unknown>>, ledger: TimeoutLedger, at = new Date().toISOString()): Record<string, unknown> {
256
+ return {
257
+ at,
258
+ savedCallCount: records.length,
259
+ savedFailureCount: records.filter(record => Number(record.exitCode) !== 0 || Boolean(record.error)).length,
260
+ apiSpendUsd: ledger.cumulativeApiSpendUsd,
261
+ accountingIncomplete: Boolean(ledger.accountingIncomplete),
262
+ };
263
+ }
264
+
265
+ export function nextClaudeExitOneCount(previousCount: number, exitCode: unknown): number {
266
+ return Number(exitCode) === 1 ? previousCount + 1 : 0;
267
+ }
268
+
269
+ export function shouldSkipCallAfterClaudeFailures(harness: string, cellId: string, skippedCells: ReadonlySet<string>): boolean {
270
+ return harness === 'claudeCode' && skippedCells.has(cellId);
271
+ }
272
+
273
+ async function claudeFailureDiagnostics(command: string): Promise<Record<string, unknown>> {
274
+ const [version, auth] = await Promise.all([
275
+ execute(command, ['--version'], 10_000),
276
+ execute(command, ['auth', 'status', '--json'], 10_000),
277
+ ]);
278
+ return {
279
+ sampledAt: new Date().toISOString(),
280
+ version: version.code === 0 ? version.stdout.trim().slice(0, 200) : `unavailable (exit ${version.code ?? 'null'})`,
281
+ auth: auth.code === 0 ? claudeAuthSummary(auth.stdout) : { unavailable: `exit ${auth.code ?? 'null'}` },
282
+ };
283
+ }
284
+
285
+ async function collectUsage(adapter: HarnessAdapter, stdout: string, fallbackSessionId?: string): Promise<{ usage: Array<Record<string, unknown>>; apiSpendUsd: number; sessionId?: string }> {
286
+ if (adapter.usageSource === 'claude-stream-json') {
287
+ const events = parseJsonLines(stdout);
288
+ const usage = events.flatMap(event => {
289
+ const raw = event.message?.usage ?? event.usage;
290
+ if (!raw) return [];
291
+ const reportedModel = event.message?.model ?? event.model;
292
+ const model = typeof reportedModel === 'string' ? reportedModel : 'unknown';
293
+ const inputTokens = raw.input_tokens ?? raw.inputTokens;
294
+ const outputTokens = raw.output_tokens ?? raw.outputTokens;
295
+ if (typeof inputTokens !== 'number' || typeof outputTokens !== 'number') return [];
296
+ const tokens = { model, inputTokens, outputTokens, cacheReadInputTokens: raw.cache_read_input_tokens ?? raw.cacheReadInputTokens ?? 0, cacheCreationInputTokens: raw.cache_creation_input_tokens ?? raw.cacheCreationInputTokens ?? 0 };
297
+ let apiEquivalentUsd: number | undefined;
298
+ try { apiEquivalentUsd = usageCostUsd(tokens, model === adapter.model ? adapter.officialPricing : undefined); } catch { /* retain the token record; mark its price unknown */ }
299
+ return [{ ...tokens, apiSpendUsd: 0, apiEquivalentUsd, billing: 'subscription' }];
300
+ });
301
+ if (!usage.length) throw new Error('Claude stream-json contained no token usage; refusing to advance the spend ledger');
302
+ return { usage, apiSpendUsd: 0 };
303
+ }
304
+ const response = parseJsonLines(stdout).find(row => typeof row.sessionId === 'string');
305
+ const sessionId = response?.sessionId ?? fallbackSessionId;
306
+ if (!sessionId) throw new Error('Elanous JSON response and isolated session index did not include sessionId');
307
+ const usageArgs = (adapter.usageArgs ?? []).map(arg => arg.replaceAll('{sessionId}', sessionId));
308
+ const result = await execute(adapter.usageCommand!, usageArgs, adapter.usageTimeoutMs ?? Math.min(adapter.timeoutMs, 30_000), adapter.cwd);
309
+ if (result.timedOut) throw new Error(`Elanous usage log query timed out after ${adapter.timeoutMs}ms`);
310
+ if (result.code !== 0) throw new Error(`Elanous usage log query exited ${result.code}: ${result.stderr.slice(-1200)}`);
311
+ const rows = parseJsonLines(result.stdout).filter(row => row.session_id === sessionId && row.event === 'llm-usage');
312
+ const usage = rows.map(row => {
313
+ const data = row.data ?? {}; const cost = data.cost ?? {};
314
+ if (typeof data.inputTokens !== 'number' || typeof data.outputTokens !== 'number') throw new Error('Elanous usage event omitted token counts');
315
+ const billing = data.billing ?? 'unknown';
316
+ const tokens = { model: data.model, inputTokens: data.inputTokens, outputTokens: data.outputTokens, cacheReadInputTokens: data.cacheReadInputTokens ?? 0, cacheCreationInputTokens: data.cacheCreationInputTokens ?? 0 };
317
+ let officialModelCost: number | undefined;
318
+ try { officialModelCost = usageCostUsd(tokens, data.model === adapter.model ? adapter.officialPricing : undefined); } catch { /* fall back to the provider's recorded model-catalog estimate below */ }
319
+ const knownCatalogCost = ['known', 'actual', 'included'].includes(cost.kind) && typeof cost.usd === 'number';
320
+ if (billing === 'api' && officialModelCost === undefined && !knownCatalogCost) throw new Error(`unknown API price for ${data.model}; refusing to advance the spend ledger`);
321
+ const apiSpendUsd = billing === 'api' ? (officialModelCost ?? cost.usd) : 0;
322
+ if (billing === 'unknown') throw new Error(`unknown billing route for ${data.model}; refusing to advance the spend ledger`);
323
+ return { ...tokens, apiSpendUsd, billing, apiEquivalentUsd: officialModelCost ?? cost.apiEquivalentUsd ?? (knownCatalogCost ? cost.usd : undefined), priceSource: adapter.officialPricing?.sourceUrl ?? cost.source ?? (knownCatalogCost ? 'model-catalog' : undefined) };
324
+ });
325
+ if (!usage.length) throw new Error('Elanous session had no llm-usage events; refusing to advance the spend ledger');
326
+ return { usage, apiSpendUsd: usage.reduce((sum, row) => sum + Number(row.apiSpendUsd ?? 0), 0), sessionId };
327
+ }
328
+
329
+ interface TimeoutLedger {
330
+ runId: string;
331
+ maxApiSpendUsd: number | null;
332
+ stopBeforeNextPairAtUsd: number | null;
333
+ cumulativeApiSpendUsd: number;
334
+ accountingIncomplete?: boolean;
335
+ records: unknown[];
336
+ }
337
+
338
+ export async function processTimedOutInvocation(input: {
339
+ adapter: HarnessAdapter;
340
+ args: string[];
341
+ call: object;
342
+ prompt: string;
343
+ startedAt: string;
344
+ result: Awaited<ReturnType<typeof execute>>;
345
+ outDir: string;
346
+ records: Record<string, unknown>[];
347
+ ledger: TimeoutLedger;
348
+ }): Promise<{ stop: boolean }> {
349
+ const { adapter, args, call, prompt, startedAt, result, outDir, records, ledger } = input;
350
+ const sessionId = adapter.usageSource === 'elanous-logs' ? await latestSessionId(args, startedAt) : undefined;
351
+ const recoveredAnswer = sessionId ? await recoveredSessionAnswer(args, sessionId) : undefined;
352
+ let usage: Awaited<ReturnType<typeof collectUsage>> | undefined;
353
+ let usageError: string | undefined;
354
+ try { usage = await collectUsage(adapter, result.stdout, sessionId); }
355
+ catch (error) { usageError = error instanceof Error ? error.message : String(error); }
356
+ if (usage) ledger.cumulativeApiSpendUsd += usage.apiSpendUsd;
357
+ const finishedAt = new Date().toISOString();
358
+ const record = {
359
+ ...call,
360
+ startedAt,
361
+ finishedAt,
362
+ elapsedMs: result.durationMs,
363
+ exitCode: result.code,
364
+ timedOut: true,
365
+ error: `adapter timed out after ${adapter.timeoutMs}ms`,
366
+ ...(usageError ? { usageError } : {}),
367
+ model: adapter.model,
368
+ promptSha256: sha256(prompt),
369
+ ...(usage ? { usage: usage.usage, apiSpendUsd: usage.apiSpendUsd, sessionId: usage.sessionId } : sessionId ? { sessionId } : {}),
370
+ stdout: result.stdout,
371
+ ...(recoveredAnswer ? { recoveredAnswer, recoveredAnswerSource: 'isolated-session-final-assistant-message' } : {}),
372
+ stderr: result.stderr.slice(-1200),
373
+ };
374
+ records.push(record);
375
+ ledger.records.push({
376
+ ...call,
377
+ finishedAt,
378
+ elapsedMs: result.durationMs,
379
+ timeout: true,
380
+ ...(usage ? { usage: usage.usage, apiSpendUsd: usage.apiSpendUsd } : { usageError }),
381
+ sessionId,
382
+ cumulativeApiSpendUsd: ledger.cumulativeApiSpendUsd,
383
+ });
384
+ if (usageError) ledger.accountingIncomplete = true;
385
+ await writeFile(resolve(outDir, `${ledger.runId}.results.json`), JSON.stringify(records, null, 2));
386
+ await writeFile(resolve(outDir, `${ledger.runId}.ledger.json`), JSON.stringify(ledger, null, 2));
387
+ return { stop: Boolean(usageError) };
388
+ }
389
+
390
+ async function main(argv: string[]): Promise<void> {
391
+ const dryRun = argv.includes('--dry-run');
392
+ const live = argv.includes('--live');
393
+ const pilot = argv.includes('--pilot');
394
+ const smokePairs = Number(argv.includes('--smoke-pairs') ? argv[argv.indexOf('--smoke-pairs') + 1] : 0);
395
+ const noCostCap = argv.includes('--no-cost-cap');
396
+ validateCliArgs(argv);
397
+ if (dryRun === live) {
398
+ throw new Error('usage: run.ts --dry-run | --live (--pilot|--full|--smoke-pairs <count>) --baseline-sha <sha> --config <json> (--max-total-cost-usd <usd>|--no-cost-cap --approval-ref <OP#id>) --out <seat-state/OP/evidence/path>');
399
+ }
400
+ const questions = validateQuestions(JSON.parse(await readFile(QUESTIONS_PATH, 'utf8')));
401
+ if (dryRun) {
402
+ process.stdout.write(`${JSON.stringify({ mode: 'dry-run', providerCalls: 0, questions: questions.map(({ id, domain, bloom, requiresHigherOrder }) => ({ id, domain, bloom, requiresHigherOrder })), cells: CELL_DESIGNS, smokePairCalls: 6, pilotCalls: 39, fullCalls: 130, elanousApiCallsPilot: 24, elanousApiCallsFull: 80, maxApiSpendUsd: 200, stopBeforeNextPairAtUsd: API_STOP_USD, controlArmConditionsRequired: ['same model', 'same tool policy', 'same turns', 'same timeout'], priceSources: PRICE_SOURCES, layoutCells: 'Elanous only; same Opus model' }, null, 2)}\n`);
403
+ return;
404
+ }
405
+ const getArg = (flag: string): string | undefined => { const i = argv.indexOf(flag); return i >= 0 ? argv[i + 1] : undefined; };
406
+ const configPath = getArg('--config'); const outDirArg = getArg('--out'); const cap = noCostCap ? undefined : Number(getArg('--max-total-cost-usd')); const approvalRef = getArg('--approval-ref'); const baselineSha = getArg('--baseline-sha')!;
407
+ if (!configPath || !outDirArg) throw new Error('--config and --out are required for live mode');
408
+ const outDir = resolve(outDirArg);
409
+ const evidenceRoot = resolve(process.env.HOME ?? '', 'elanous-hq/seat-state/OP/evidence');
410
+ const outRelative = relative(evidenceRoot, outDir);
411
+ if (!outRelative || outRelative.startsWith('..') || isAbsolute(outRelative)) throw new Error('--out must be under seat-state/OP/evidence');
412
+ const config = JSON.parse(await readFile(resolve(configPath), 'utf8')) as AdapterConfig;
413
+ validateConfig(config, cap);
414
+ const resumeId = getArg('--resume');
415
+ const runId = resumeId ?? randomUUID();
416
+ if (smokePairs > 3) throw new Error('--smoke-pairs must be an integer from 1 to 3');
417
+ const baselineVersion = await verifyConfiguredBaseline(config, baselineSha);
418
+ const plan = makeRunPlan(questions, config, runId, pilot, smokePairs);
419
+ await mkdir(outDir, { recursive: true });
420
+ const maxApiSpendUsd = cap ?? null;
421
+ const stopBeforeNextPairAtUsd = noCostCap ? null : API_STOP_USD;
422
+ const manifestPath = resolve(outDir, `${runId}.manifest.json`);
423
+ const resultsPath = resolve(outDir, `${runId}.results.json`);
424
+ const ledgerPath = resolve(outDir, `${runId}.ledger.json`);
425
+ const manifest = { ...plan, baselineSha, baselineVersion, maxApiSpendUsd, stopBeforeNextPairAtUsd, ...(approvalRef ? { uncappedApprovalRef: approvalRef } : {}), priceSources: PRICE_SOURCES, questionHashes: Object.fromEntries(questions.map(q => [q.id, sha256(q.prompt)])) };
426
+ if (resumeId) {
427
+ const priorManifest = JSON.parse(await readFile(manifestPath, 'utf8')) as typeof manifest & { runId: string; resumeEvents?: Record<string, unknown>[] };
428
+ if (priorManifest.runId !== resumeId || priorManifest.baselineSha !== baselineSha || JSON.stringify(priorManifest.calls) !== JSON.stringify(plan.calls)) throw new Error('--resume manifest does not match this baseline and call plan');
429
+ const resumeEvents = [...(priorManifest.resumeEvents ?? []), buildResumeEvent(JSON.parse(await readFile(resultsPath, 'utf8')), JSON.parse(await readFile(ledgerPath, 'utf8')) as TimeoutLedger)];
430
+ await writeFile(manifestPath, JSON.stringify({ ...priorManifest, resumeEvents }, null, 2));
431
+ } else {
432
+ await writeFile(manifestPath, JSON.stringify({ ...manifest, startedAt: new Date().toISOString() }, null, 2));
433
+ }
434
+ const records: Record<string, unknown>[] = resumeId ? JSON.parse(await readFile(resultsPath, 'utf8')) : [];
435
+ const ledger: TimeoutLedger = resumeId ? JSON.parse(await readFile(ledgerPath, 'utf8')) : { runId, maxApiSpendUsd, stopBeforeNextPairAtUsd, cumulativeApiSpendUsd: 0, records: [] };
436
+ if (ledger.runId !== runId) throw new Error('--resume ledger run id mismatch');
437
+ for (const record of records) {
438
+ if (record.harness === 'claudeCode' && Number(record.exitCode) !== 0 && !String(record.stderr ?? '').trim() && !record.claudeDiagnostics) {
439
+ record.claudeDiagnostics = await claudeFailureDiagnostics(config.cells[String(record.cell)]!.claudeCode!.command);
440
+ }
441
+ }
442
+ if (resumeId) await writeFile(resultsPath, JSON.stringify(records, null, 2));
443
+ const completedCalls = completedCallKeys(records);
444
+ const claudeExitOneCounts = new Map<string, number>();
445
+ const skippedCells = new Set<string>();
446
+ const teamclaudeStatuses = new Map<string, string>();
447
+ for (const record of records) {
448
+ const cell = String(record.cell ?? '');
449
+ if (typeof record.teamclaudeStatus === 'string') teamclaudeStatuses.set(cell, record.teamclaudeStatus);
450
+ if (record.harness === 'claudeCode') {
451
+ const next = nextClaudeExitOneCount(claudeExitOneCounts.get(cell) ?? 0, record.exitCode);
452
+ claudeExitOneCounts.set(cell, next);
453
+ if (next >= 3) skippedCells.add(cell);
454
+ }
455
+ }
456
+ let activePair = '';
457
+ let stoppedAtThreshold = false;
458
+ for (const call of plan.calls) {
459
+ if (completedCalls.has(`${call.questionId}:${call.cell}:${call.harness}`)) continue;
460
+ if (shouldSkipCallAfterClaudeFailures(call.harness, call.cell, skippedCells)) {
461
+ if (!teamclaudeStatuses.has(call.cell)) {
462
+ const status = await execute('teamclaude', ['status'], 10_000, config.cells[call.cell].claudeCode?.cwd);
463
+ teamclaudeStatuses.set(call.cell, (status.stdout || status.stderr).trim().split('\n').slice(0, 1).join(' ').slice(0, 500) || `teamclaude status exited ${status.code}`);
464
+ }
465
+ const row = { ...call, finishedAt: new Date().toISOString(), exitCode: null, skipped: true, error: 'configuration skipped after three Claude Code exit 1 failures', teamclaudeStatus: teamclaudeStatuses.get(call.cell) };
466
+ records.push(row);
467
+ completedCalls.add(`${call.questionId}:${call.cell}:${call.harness}`);
468
+ await writeFile(resultsPath, JSON.stringify(records, null, 2));
469
+ continue;
470
+ }
471
+ const pairKey = `${call.questionId}:${call.cell}`;
472
+ if (!noCostCap && activePair && pairKey !== activePair && ledger.cumulativeApiSpendUsd >= API_STOP_USD) { stoppedAtThreshold = true; break; }
473
+ activePair = pairKey;
474
+ const q = questions.find(item => item.id === call.questionId)!;
475
+ const adapter = config.cells[call.cell][call.harness]!;
476
+ const prompt = buildPrompt(q, call, new Date().toISOString().slice(0, 10));
477
+ const args = interpolate(adapter.args, { '{prompt}': prompt, '{questionId}': q.id, '{runId}': runId, '{cellId}': call.cell, '{bloomCeiling}': String(call.bloomCeiling), '{layout}': call.layout });
478
+ const startedAt = new Date().toISOString();
479
+ let rawResult: Awaited<ReturnType<typeof execute>> | undefined;
480
+ try {
481
+ const result = await execute(adapter.command, args, adapter.timeoutMs, adapter.cwd);
482
+ rawResult = result;
483
+ if (result.timedOut) {
484
+ const outcome = await processTimedOutInvocation({ adapter, args, call, prompt, startedAt, result, outDir, records, ledger });
485
+ if (outcome.stop) break;
486
+ continue;
487
+ }
488
+ if (result.code !== 0) throw new Error(`${call.harness} exited ${result.code}: ${result.stderr.slice(-1200)}`);
489
+ const usage = await collectUsage(adapter, result.stdout);
490
+ ledger.cumulativeApiSpendUsd += usage.apiSpendUsd;
491
+ const record = { ...call, startedAt, finishedAt: new Date().toISOString(), elapsedMs: result.durationMs, exitCode: result.code, model: adapter.model, promptSha256: sha256(prompt), usage: usage.usage, apiSpendUsd: usage.apiSpendUsd, sessionId: usage.sessionId, stdout: result.stdout };
492
+ records.push(record);
493
+ ledger.records.push({ ...call, finishedAt: record.finishedAt, elapsedMs: result.durationMs, usage: usage.usage, apiSpendUsd: usage.apiSpendUsd, cumulativeApiSpendUsd: ledger.cumulativeApiSpendUsd });
494
+ await writeFile(resultsPath, JSON.stringify(records, null, 2));
495
+ await writeFile(ledgerPath, JSON.stringify(ledger, null, 2));
496
+ } catch (error) {
497
+ const record: Record<string, unknown> = { ...call, startedAt, finishedAt: new Date().toISOString(), exitCode: rawResult?.code, error: error instanceof Error ? error.message : String(error), stdout: rawResult?.stdout, stderr: rawResult?.stderr?.slice(-1200) };
498
+ if (call.harness === 'claudeCode' && !String(record.stderr ?? '').trim()) record.claudeDiagnostics = await claudeFailureDiagnostics(adapter.command);
499
+ records.push(record);
500
+ ledger.records.push({ ...call, finishedAt: new Date().toISOString(), exitCode: rawResult?.code, failed: true, accounting: adapter.usageSource === 'claude-stream-json' ? 'subscription-billed; no API spend' : 'unknown' });
501
+ if (call.harness === 'claudeCode') {
502
+ const next = nextClaudeExitOneCount(claudeExitOneCounts.get(call.cell) ?? 0, rawResult?.code);
503
+ claudeExitOneCounts.set(call.cell, next);
504
+ if (next >= 3) {
505
+ skippedCells.add(call.cell);
506
+ const status = await execute('teamclaude', ['status'], 10_000, adapter.cwd);
507
+ record.teamclaudeStatus = (status.stdout || status.stderr).trim().split('\n').slice(0, 1).join(' ').slice(0, 500) || `teamclaude status exited ${status.code}`;
508
+ teamclaudeStatuses.set(call.cell, String(record.teamclaudeStatus));
509
+ }
510
+ }
511
+ if (adapter.usageSource !== 'claude-stream-json') ledger.accountingIncomplete = true;
512
+ await writeFile(resultsPath, JSON.stringify(records, null, 2));
513
+ await writeFile(ledgerPath, JSON.stringify(ledger, null, 2));
514
+ completedCalls.add(`${call.questionId}:${call.cell}:${call.harness}`);
515
+ continue;
516
+ }
517
+ }
518
+ process.stdout.write(`${JSON.stringify({ runId, completedCalls: records.length, cumulativeApiSpendUsd: ledger.cumulativeApiSpendUsd, accountingIncomplete: Boolean(ledger.accountingIncomplete), ...(ledger.accountingIncomplete ? { stopReason: 'usage-accounting-incomplete' } : {}), stoppedAt80Percent: stoppedAtThreshold, output: outDir })}\n`);
519
+ }
520
+
521
+ if (import.meta.main) {
522
+ main(process.argv.slice(2)).catch(error => { console.error(`research-bench: ${error instanceof Error ? error.message : String(error)}`); process.exitCode = 1; });
523
+ }