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
@@ -7,7 +7,7 @@ import { listChecklist, setItem } from './checklist.js';
7
7
  import { judgeLandedCell } from './landed-to-green.js';
8
8
  import { evidencePlan, landedButYellow, type MergedChecklistPr } from './landed-but-yellow.js';
9
9
  import { assignedVersions, evidenceAdd } from './feature-store.js';
10
- import { boundMergedTaskCells, candidateMergedTaskCells, closeMergedTaskCard } from '../task-agent/postland-card.js';
10
+ import { boundMergedTaskCells, candidateMergedTaskCells, closeMergedTaskCard, recordMergedTaskImplFindings } from '../task-agent/postland-card.js';
11
11
 
12
12
  export interface MergedPrChecklistDeps {
13
13
  readPr?: (number: number, cwd: string) => { state: string; baseRefName: string; title: string; body: string | null; mergedAt: string; url?: string; headRefOid?: string; files?: Array<{ path: string }> };
@@ -19,13 +19,19 @@ export interface MergedPrChecklistDeps {
19
19
  closeTaskCard?: typeof closeMergedTaskCard;
20
20
  boundTaskCells?: typeof boundMergedTaskCells;
21
21
  candidateTaskCells?: typeof candidateMergedTaskCells;
22
+ feedbackStatePath?: string;
23
+ feedbackFollowUp?: NonNullable<Parameters<typeof recordMergedTaskImplFindings>[2]>['followUp'];
22
24
  log?: typeof debug.log;
23
25
  }
24
26
 
27
+ function readMergedPr(number: number, cwd: string): NonNullable<MergedPrChecklistDeps['readPr']> extends (number: number, cwd: string) => infer T ? T : never {
28
+ return JSON.parse(execFileSync('gh', ['pr', 'view', String(number), '--json', 'state,baseRefName,title,body,mergedAt,url,headRefOid,files'], { cwd, encoding: 'utf8', timeout: 30_000 }));
29
+ }
30
+
25
31
  /** A confirmed main merge is the only entry. The existing checklist matcher owns PR-to-cell decisions. */
26
32
  export function syncMergedPrChecklist(number: number, cwd: string, goalFile?: string, deps: MergedPrChecklistDeps = {}): void {
27
33
  const log = deps.log ?? debug.log.bind(debug);
28
- const pr = (deps.readPr ?? ((n, dir) => JSON.parse(execFileSync('gh', ['pr', 'view', String(n), '--json', 'state,baseRefName,title,body,mergedAt,url,headRefOid,files'], { cwd: dir, encoding: 'utf8', timeout: 30_000 })) as ReturnType<NonNullable<MergedPrChecklistDeps['readPr']>>))(number, cwd);
34
+ const pr = (deps.readPr ?? readMergedPr)(number, cwd);
29
35
  if (pr.state !== 'MERGED' || pr.baseRefName !== 'main') return;
30
36
  const merged: MergedChecklistPr = { number, title: pr.title, body: pr.body, mergedAt: pr.mergedAt };
31
37
  const versions = deps.versions?.() ?? (() => {
@@ -116,6 +122,23 @@ export function syncMergedPrChecklist(number: number, cwd: string, goalFile?: st
116
122
  for (const id of missing) log('release.checklist', 'merged-pr-cell-not-found', { pr: number, id });
117
123
  }
118
124
 
125
+ /** Production merge entry: reconcile synchronously, then await idempotent PR-body feedback before returning. */
126
+ export async function syncMergedPrChecklistWithFeedback(
127
+ number: number,
128
+ cwd: string,
129
+ goalFile?: string,
130
+ deps: MergedPrChecklistDeps = {},
131
+ ): Promise<Awaited<ReturnType<typeof recordMergedTaskImplFindings>>> {
132
+ const pr = (deps.readPr ?? readMergedPr)(number, cwd);
133
+ syncMergedPrChecklist(number, cwd, goalFile, { ...deps, readPr: () => pr });
134
+ if (pr.url && pr.headRefOid) {
135
+ return await recordMergedTaskImplFindings({ ...pr, number, url: pr.url, headRefOid: pr.headRefOid }, cwd,
136
+ { ...(deps.feedbackStatePath ? { statePath: deps.feedbackStatePath } : {}),
137
+ ...(deps.feedbackFollowUp ? { followUp: deps.feedbackFollowUp } : {}) });
138
+ }
139
+ return null;
140
+ }
141
+
119
142
  const LABEL_IDS = '([A-Za-z0-9_-]+(?:[ \\t]*(?:,|·)[ \\t]*[A-Za-z0-9_-]+)*)';
120
143
  const LABEL_END = '(?=[ \\t]*$|[ \\t]+[—–·(-])';
121
144
  const DESIGNATION = new RegExp(`^ {0,3}(?:#{1,6}[ \\t]+|[-*][ \\t]+)?칸[ \\t]*:[ \\t]*${LABEL_IDS}${LABEL_END}`);
@@ -87,7 +87,12 @@ export function planRehearsalShards(version: string, root: string, checkout: str
87
87
  let gatePlanShards: number | null = null;
88
88
  try {
89
89
  const board = (deps.board ?? readGateShards)(gateShardsPath(version, root));
90
- gatePlanShards = board?.version === version && board.shards.length && new Set(board.shards.map(shard => shard.id)).size === board.shards.length ? board.shards.length : null;
90
+ if (board?.version === version && board.shards.length
91
+ && new Set(board.shards.map(shard => shard.id)).size === board.shards.length) {
92
+ // Split/retry/tail rows are observations, not extra planned shards. Older boards used arbitrary IDs.
93
+ const roots = board.shards.filter(shard => /^pod-\d+$/.test(shard.id));
94
+ gatePlanShards = roots.length || (board.shards.some(shard => /^pod-\d+/.test(shard.id)) ? null : board.shards.length);
95
+ }
91
96
  } catch (error) { reasons.push(`persisted gate shard plan unreadable: ${error instanceof Error ? error.message : String(error)}`); }
92
97
  let testFiles: number | null = null;
93
98
  let measuredFiles = 0;
@@ -67,6 +67,15 @@ export function planRehearsal(schedules: readonly ReleaseSchedule[], now: Date,
67
67
  return { status: 'not-yet', version, cutAt, nextStepAt: new Date(cut - open[0]!.minutes * minute).toISOString() };
68
68
  }
69
69
 
70
+ export interface RehearsalRecovery {
71
+ failedShard: string;
72
+ remeasuredFiles: number | null;
73
+ durationMs: number | null;
74
+ poolOverwriteApplied: boolean | null;
75
+ outcome: 'ok' | 'failed';
76
+ error?: string;
77
+ }
78
+
70
79
  export interface RehearsalStamp {
71
80
  version: string;
72
81
  step: StepId;
@@ -79,6 +88,7 @@ export interface RehearsalStamp {
79
88
  regressionFiles?: string[];
80
89
  result?: LightRcResult;
81
90
  hardGate?: HardGateResult;
91
+ recovery?: RehearsalRecovery;
82
92
  hardGateRunId?: string;
83
93
  hardGateLog?: string;
84
94
  /** B6: an unmeasured hard gate always retains a cause, run id and durable local evidence path. */
@@ -94,6 +104,7 @@ export interface RehearsalOptions {
94
104
  apply?: boolean;
95
105
  checkout?: string;
96
106
  ledgerRoot?: string;
107
+ recoveryRun?: string;
97
108
  shards?: number;
98
109
  remote?: string;
99
110
  }
@@ -109,6 +120,7 @@ export interface RehearsalDeps {
109
120
  notify?: (text: string) => void | boolean | Promise<void | boolean>;
110
121
  git?: (args: string[], cwd: string) => { rc: number | null; stdout: string; stderr?: string };
111
122
  leakCheck?: (checkout: string) => { status: number | null; detail?: string };
123
+ resumeGate?: (runId: string, checkout: string) => Promise<{ files: number; durationMs: number; poolOverwriteApplied: boolean; ok: boolean }>;
112
124
  }
113
125
 
114
126
  export type RehearsalTickResult = RehearsalPlan & { applied?: boolean; stamps?: RehearsalStamp[]; notificationFailures?: number };
@@ -520,6 +532,21 @@ export async function runRehearsalTick(opts: RehearsalOptions = {}, deps: Rehear
520
532
  console.error(line);
521
533
  } }, { cwd })))(plan.version, checkout, selection);
522
534
  stamp.result = result;
535
+ if (opts.recoveryRun && result.unmeasured !== null) {
536
+ const failedShard = result.unmeasured;
537
+ const started = Date.now();
538
+ try {
539
+ const recovered = await deps.resumeGate?.(opts.recoveryRun, checkout);
540
+ if (!recovered) throw new Error('release resume --from gate is unavailable for this rehearsal');
541
+ stamp.recovery = { failedShard, remeasuredFiles: recovered.files, durationMs: recovered.durationMs,
542
+ poolOverwriteApplied: recovered.poolOverwriteApplied, outcome: recovered.ok ? 'ok' : 'failed',
543
+ ...(!recovered.ok ? { error: 'resumed gate did not pass' } : {}) };
544
+ } catch (error) {
545
+ stamp.recovery = { failedShard, remeasuredFiles: null, durationMs: Math.max(0, Date.now() - started),
546
+ poolOverwriteApplied: null, outcome: 'failed',
547
+ error: oneLine(error instanceof Error ? error.message : String(error)) };
548
+ }
549
+ }
523
550
  if (regressionFiles.length) stamp.regressionFiles = regressionFiles;
524
551
  const shardMismatch = selection.shards !== undefined && result.shards !== selection.shards
525
552
  ? `selected shards ${selection.shards} but RC reported ${result.shards}` : null;
@@ -19,6 +19,12 @@ export interface ResearchEdgeDecision {
19
19
  action: ResearchEdgeAction;
20
20
  reason: string;
21
21
  evidence: readonly string[];
22
+ /** Ordinal-free, explicitly supplied strength on [0, 1]; never inferred from votes. */
23
+ evidenceStrength?: number;
24
+ /** Optional T3 record-only confidence; never changes the live edge decision. */
25
+ confidence?: number;
26
+ counterEvidenceRefs?: readonly string[];
27
+ outsideViewRefs?: readonly string[];
22
28
  proposal?: ResearchEdgeProposal;
23
29
  }
24
30
 
@@ -26,13 +32,24 @@ export interface ResolvedResearchEdgeDecision extends ResearchEdgeDecision {
26
32
  provider: string;
27
33
  }
28
34
 
35
+ /** T3 evidence is retained beside the current live decision, never applied to it. */
36
+ export interface ResearchEdgeDecisionEnvelope extends ResolvedResearchEdgeDecision {
37
+ recommendation?: ResolvedResearchEdgeDecision;
38
+ votes: readonly ResolvedResearchEdgeDecision[];
39
+ dissent: readonly ResolvedResearchEdgeDecision[];
40
+ counterEvidenceRefs: readonly string[];
41
+ outsideViewRefs: readonly string[];
42
+ agreesWithLive?: boolean;
43
+ mode: 'record-only';
44
+ }
45
+
29
46
  export type ResearchEdgeDecisionProvider = (
30
47
  assessment: BloomEdgeAssessment,
31
48
  ) => ResearchEdgeDecision | Promise<ResearchEdgeDecision>;
32
49
 
33
50
  export interface ResearchEdgeDecisionRegistry {
34
- register(provider: ResearchEdgeDecisionProvider, name?: string): () => void;
35
- decide(assessment: BloomEdgeAssessment): Promise<ResolvedResearchEdgeDecision>;
51
+ register(provider: ResearchEdgeDecisionProvider, name?: string, options?: { priority?: number }): () => void;
52
+ decide(assessment: BloomEdgeAssessment): Promise<ResearchEdgeDecisionEnvelope>;
36
53
  }
37
54
 
38
55
  const noOpDecision: ResearchEdgeDecision = {
@@ -43,25 +60,74 @@ const noOpDecision: ResearchEdgeDecision = {
43
60
 
44
61
  /** One registry belongs to one run. With no provider, the graph takes one round and stops. */
45
62
  export function createResearchEdgeDecisionRegistry(): ResearchEdgeDecisionRegistry {
46
- const providers = new Map<symbol, { name: string; decide: ResearchEdgeDecisionProvider }>();
63
+ const providers = new Map<symbol, { name: string; decide: ResearchEdgeDecisionProvider; priority?: number }>();
47
64
  return {
48
- register(provider, name = 'registered') {
65
+ register(provider, name = 'registered', options = {}) {
66
+ if (options.priority !== undefined && !Number.isFinite(options.priority)) {
67
+ throw new TypeError('research edge provider priority must be finite when supplied');
68
+ }
49
69
  const key = Symbol('research-edge-decision-provider');
50
- providers.set(key, { name, decide: provider });
70
+ providers.set(key, { name, decide: provider, ...(options.priority === undefined ? {} : { priority: options.priority }) });
51
71
  return () => { providers.delete(key); };
52
72
  },
53
73
  async decide(assessment) {
54
- const provider = [...providers.values()].at(-1);
55
- if (!provider) return { ...noOpDecision, provider: 'default-noop' };
56
- try {
57
- const decision = await provider.decide(assessment);
58
- if (!isResearchEdgeDecision(decision)) {
59
- return { action: 'stop', reason: 'edge decision provider returned an invalid decision', evidence: [], provider: provider.name };
74
+ const entries = [...providers.values()];
75
+ if (!entries.length) return envelope({ ...noOpDecision, provider: 'default-noop' }, []);
76
+ const results = await Promise.all(entries.map(async (entry) => {
77
+ try {
78
+ const decision = await entry.decide(assessment);
79
+ return isResearchEdgeDecision(decision)
80
+ ? { entry, decision }
81
+ : { entry, error: 'returned an invalid decision' };
82
+ } catch (error) {
83
+ return { entry, error: `failed: ${String(error)}` };
60
84
  }
61
- return { ...decision, evidence: [...decision.evidence], provider: provider.name };
62
- } catch (error) {
63
- return { action: 'stop', reason: `edge decision provider failed: ${String(error)}`, evidence: [], provider: provider.name };
85
+ }));
86
+ const valid = results.filter((result): result is { entry: typeof entries[number]; decision: ResearchEdgeDecision } => 'decision' in result);
87
+ const failures = results.filter((result): result is { entry: typeof entries[number]; error: string } => 'error' in result);
88
+ if (!valid.length) return envelope({ action: 'stop', reason: `all edge decision providers failed: ${failures.map(({ entry, error }) => `${entry.name} ${error}`).join('; ')}`, evidence: [], provider: 'composition' }, []);
89
+ if (valid.length === 1 && !failures.length) {
90
+ const [{ entry, decision }] = valid;
91
+ const live = { ...decision, evidence: [...decision.evidence], provider: entry.name };
92
+ return envelope(live, votes(valid));
64
93
  }
94
+
95
+ // Agreement composes evidence. Disagreement is resolved by declared evidence strength,
96
+ // then explicit provider priority; an unresolved tie fails closed instead of voting.
97
+ const actions = new Set(valid.map(({ decision }) => decision.action));
98
+ const proposalKeys = new Set(valid.filter(({ decision }) => decision.action === 'add')
99
+ .map(({ decision }) => JSON.stringify(decision.proposal)));
100
+ const conflict = actions.size > 1 || proposalKeys.size > 1;
101
+ let candidates = valid;
102
+ if (conflict) {
103
+ const ranked = valid.map((result) => ({ ...result,
104
+ strength: result.decision.evidenceStrength ?? -1,
105
+ })).sort((a, b) => b.strength - a.strength);
106
+ const top = ranked[0]!;
107
+ const tiedStrength = ranked.filter((item) => item.strength === top.strength);
108
+ if (tiedStrength.length > 1 && tiedStrength.some((item) => item.entry.priority === undefined)) return envelope({
109
+ action: 'stop', reason: `unresolved edge decision conflict: ${tiedStrength.map(({ entry }) => entry.name).join(', ')} (priority unspecified)`,
110
+ evidence: [...new Set(valid.flatMap(({ decision }) => decision.evidence))], provider: 'composition',
111
+ }, votes(valid));
112
+ tiedStrength.sort((a, b) => (b.entry.priority ?? 0) - (a.entry.priority ?? 0));
113
+ const winner = tiedStrength[0]!;
114
+ const tied = tiedStrength.filter((item) => item.entry.priority === winner.entry.priority);
115
+ if (tied.length > 1) return envelope({
116
+ action: 'stop', reason: `unresolved edge decision conflict: ${tied.map(({ entry }) => entry.name).join(', ')}`,
117
+ evidence: [...new Set(valid.flatMap(({ decision }) => decision.evidence))], provider: 'composition',
118
+ }, votes(valid));
119
+ candidates = [winner];
120
+ }
121
+ const winner = candidates[0]!;
122
+ const evidence = [...new Set(valid.flatMap(({ decision }) => decision.evidence))];
123
+ const contributors = valid.map(({ entry }) => entry.name).join(', ');
124
+ const notes = failures.map(({ entry, error }) => `${entry.name} ${error}`);
125
+ const reason = conflict
126
+ ? `conflict resolved by ${winner.entry.name} (strength=${winner.decision.evidenceStrength ?? 'unspecified'}, priority=${winner.entry.priority ?? 'unspecified'}); ${winner.decision.reason}`
127
+ : `composed ${contributors}: ${winner.decision.reason}`;
128
+ const evidenceNote = evidence.length ? `; evidence=${evidence.join(' | ')}` : '';
129
+ const live = { ...winner.decision, reason: [...notes, `${reason}${evidenceNote}`].join('; '), evidence, provider: conflict ? winner.entry.name : `composition[${contributors}]` };
130
+ return envelope(live, votes(valid));
65
131
  },
66
132
  };
67
133
  }
@@ -69,13 +135,56 @@ export function createResearchEdgeDecisionRegistry(): ResearchEdgeDecisionRegist
69
135
  function isResearchEdgeDecision(value: unknown): value is ResearchEdgeDecision {
70
136
  if (!isRecord(value) || !['add', 'prune', 'deepen', 'stop'].includes(String(value.action))
71
137
  || typeof value.reason !== 'string' || !value.reason.trim()
72
- || !Array.isArray(value.evidence) || !value.evidence.every((item) => typeof item === 'string')) {
138
+ || !Array.isArray(value.evidence) || !value.evidence.every((item) => typeof item === 'string')
139
+ || (value.evidenceStrength !== undefined && (typeof value.evidenceStrength !== 'number'
140
+ || !Number.isFinite(value.evidenceStrength) || value.evidenceStrength < 0 || value.evidenceStrength > 1))) {
73
141
  return false;
74
142
  }
75
143
  if (value.action === 'add') return isResearchEdgeProposal(value.proposal);
76
144
  return value.proposal === undefined;
77
145
  }
78
146
 
147
+ function votes(valid: readonly { entry: { name: string }; decision: ResearchEdgeDecision }[]): ResolvedResearchEdgeDecision[] {
148
+ return valid.map(({ entry, decision }) => {
149
+ const confidence = typeof decision.confidence === 'number' && Number.isFinite(decision.confidence)
150
+ && decision.confidence >= 0 && decision.confidence <= 1 ? decision.confidence : undefined;
151
+ const counterEvidenceRefs = Array.isArray(decision.counterEvidenceRefs)
152
+ ? decision.counterEvidenceRefs.filter((item): item is string => typeof item === 'string') : [];
153
+ const outsideViewRefs = Array.isArray(decision.outsideViewRefs)
154
+ ? decision.outsideViewRefs.filter((item): item is string => typeof item === 'string') : [];
155
+ return {
156
+ ...decision,
157
+ ...(confidence === undefined ? { confidence: undefined } : { confidence }),
158
+ counterEvidenceRefs,
159
+ outsideViewRefs,
160
+ evidence: [...decision.evidence],
161
+ provider: entry.name,
162
+ };
163
+ });
164
+ }
165
+
166
+ function envelope(live: ResolvedResearchEdgeDecision, recordedVotes: readonly ResolvedResearchEdgeDecision[]): ResearchEdgeDecisionEnvelope {
167
+ const scored = recordedVotes.filter((vote) => vote.confidence !== undefined);
168
+ const strongest = scored.length ? Math.max(...scored.map((vote) => vote.confidence!)) : undefined;
169
+ const leaders = strongest === undefined ? [] : scored.filter((vote) => vote.confidence === strongest);
170
+ const leaderActions = new Set(leaders.map(({ action }) => action));
171
+ const leaderPayloads = new Set(leaders.map(({ action, proposal }) => JSON.stringify({ action, proposal })));
172
+ const recommendation = !leaders.length ? undefined
173
+ : leaderActions.size > 1 || leaderPayloads.size > 1
174
+ ? { action: 'stop' as const, reason: 'conflicting strongest evidence', evidence: [...new Set(leaders.flatMap(({ evidence }) => evidence))], confidence: strongest, provider: 'evidence-composer' }
175
+ : leaders[0];
176
+ const sameLive = (vote: ResolvedResearchEdgeDecision) => vote.action === live.action && JSON.stringify(vote.proposal) === JSON.stringify(live.proposal);
177
+ return {
178
+ ...live,
179
+ votes: [...recordedVotes],
180
+ dissent: recommendation ? recordedVotes.filter((vote) => vote.action !== recommendation.action || JSON.stringify(vote.proposal) !== JSON.stringify(recommendation.proposal)) : [],
181
+ counterEvidenceRefs: [...new Set(recordedVotes.flatMap((vote) => vote.counterEvidenceRefs ?? []))],
182
+ outsideViewRefs: [...new Set(recordedVotes.flatMap((vote) => vote.outsideViewRefs ?? []))],
183
+ ...(recommendation ? { recommendation, agreesWithLive: sameLive(recommendation) } : {}),
184
+ mode: 'record-only',
185
+ };
186
+ }
187
+
79
188
  function isResearchEdgeProposal(value: unknown): value is ResearchEdgeProposal {
80
189
  return isRecord(value) && isRecord(value.node) && typeof value.node.nodeId === 'string'
81
190
  && typeof value.node.kind === 'string' && typeof value.node.recipe === 'string'
@@ -0,0 +1,249 @@
1
+ import type { BloomResearchQuestion, ResearchEvidenceEnvelope } from '../auto-research/question-ladder-contract.js';
2
+ import { invokeResearch } from '../research-bridge/invoke.js';
3
+ import type { SkillIndexEntry } from '../skills/index.js';
4
+ import { getSkillIndex } from '../skills/index.js';
5
+ import { detectSkillTrigger } from '../skills/router.js';
6
+ import { discoverResearchPlugin, rerunInstalledPluginResearch } from './plugin-discovery.js';
7
+ import { debug } from '../debug/log.js';
8
+
9
+ export const MAX_GAP_FOLLOWUP_ROUNDS = 1;
10
+ export const MAX_GAP_FOLLOWUP_MS = 120_000;
11
+ /** Default research-only skills permitted to auto-fill one evidence gap. */
12
+ export const READ_ONLY_AUTO_FOLLOWUP_SKILLS: ReadonlySet<string> = new Set([
13
+ 'omni-market', 'kr-flow', 'omni-crawl', 'social-pulse', 'omni-digest',
14
+ ]);
15
+ const MAX_GAP_TEXT = 8_000;
16
+
17
+ export interface ResearchGapFollowupInput {
18
+ request: string;
19
+ questions: readonly BloomResearchQuestion[];
20
+ evidence: readonly ResearchEvidenceEnvelope[];
21
+ /** Optional remaining time supplied by the owning turn; omitted uses the fixed 2-minute cap. */
22
+ remainingBudgetMs?: number;
23
+ roundsUsed?: number;
24
+ /** Test seam; production resolves the installed registry. */
25
+ skills?: readonly SkillIndexEntry[];
26
+ /** Production can widen/narrow the built-in read-only skill set. */
27
+ readOnlySkillAllowlist?: ReadonlySet<string>;
28
+ }
29
+
30
+ export type ResearchGapAction = 'auto-fill' | 'followup';
31
+ export type ResearchGapReason =
32
+ | 'auto-fill-eligible'
33
+ | 'round-limit'
34
+ | 'time-budget'
35
+ | 'no-skill-match'
36
+ | 'ambiguous-skill-match'
37
+ | 'skill-not-read-only'
38
+ | 'skill-not-allowlisted';
39
+
40
+ export interface ResearchGapClassification {
41
+ questionId: string;
42
+ gap: string;
43
+ action: ResearchGapAction;
44
+ reason: ResearchGapReason;
45
+ skill?: string;
46
+ }
47
+
48
+ export interface ResearchGapFollowupCall {
49
+ questionId: string;
50
+ skill: string;
51
+ query: string;
52
+ }
53
+
54
+ export interface ResearchGapFollowupPlan {
55
+ /** Zero or one. The bound is part of the public contract. */
56
+ rounds: 0 | 1;
57
+ timeBudgetMs: number;
58
+ classifications: ResearchGapClassification[];
59
+ followups: ResearchGapFollowupCall[];
60
+ }
61
+
62
+ export interface ResearchGapFollowupResult extends ResearchGapFollowupPlan {
63
+ followupEvidence: ResearchEvidenceEnvelope[];
64
+ discoveryCards?: string[];
65
+ }
66
+
67
+ export interface ResearchGapFollowupDeps {
68
+ runSkill?: (skill: string, query: string, signal: AbortSignal) => Promise<{ ok: boolean; output: string; error?: string }>;
69
+ discoverPlugin?: typeof discoverResearchPlugin;
70
+ rerunInstalled?: typeof rerunInstalledPluginResearch;
71
+ now?: () => number;
72
+ }
73
+
74
+ /**
75
+ * Use Bloom analyze/evaluate axes (4/5) to find explicit evidence gaps,
76
+ * match those gaps against the installed skill registry, and auto-fill only from
77
+ * the OP-approved research allowlist. Only explicit read-only declarations
78
+ * are auto-run; missing, write, or spawn declarations remain ask-first
79
+ * follow-ups. Cost metadata is not a gate.
80
+ */
81
+ export function planGapFollowup(input: ResearchGapFollowupInput): ResearchGapFollowupPlan {
82
+ const timeBudgetMs = Math.max(0, Math.min(MAX_GAP_FOLLOWUP_MS,
83
+ input.remainingBudgetMs === undefined ? MAX_GAP_FOLLOWUP_MS
84
+ : Number.isFinite(input.remainingBudgetMs) ? input.remainingBudgetMs : 0));
85
+ const allowlist = input.readOnlySkillAllowlist ?? READ_ONLY_AUTO_FOLLOWUP_SKILLS;
86
+ const skillIndex = [...(input.skills ?? getSkillIndex())];
87
+ const questions = new Map(input.questions.map((question) => [question.id, question]));
88
+ const gaps = findResearchGaps(input.questions, input.evidence);
89
+ const classifications: ResearchGapClassification[] = [];
90
+ const followups: ResearchGapFollowupCall[] = [];
91
+ const roundAvailable = (input.roundsUsed ?? 0) < MAX_GAP_FOLLOWUP_ROUNDS;
92
+
93
+ for (const gap of gaps) {
94
+ const question = questions.get(gap.questionId);
95
+ const routeText = [question?.prompt, gap.text].filter(Boolean).join('\n');
96
+ const query = [input.request, question?.prompt, gap.text].filter(Boolean).join('\n');
97
+ const match = detectSkillTrigger(routeText, skillIndex, { minScore: 1 });
98
+ const top = match.top;
99
+ const matchedSkill = top ? skillIndex.find((skill) => skill.name === top.name) : undefined;
100
+ let reason: ResearchGapReason;
101
+ if (!roundAvailable) reason = 'round-limit';
102
+ else if (timeBudgetMs <= 0) reason = 'time-budget';
103
+ else if (!top || top.matchedTriggers.length === 0) reason = 'no-skill-match';
104
+ else if (!match.unambiguous) reason = 'ambiguous-skill-match';
105
+ else if (matchedSkill?.sideEffects !== 'none') reason = 'skill-not-read-only';
106
+ else if (!allowlist.has(top.name)) reason = 'skill-not-allowlisted';
107
+ else reason = 'auto-fill-eligible';
108
+
109
+ if (reason === 'auto-fill-eligible' && top) {
110
+ followups.push({ questionId: gap.questionId, skill: top.name, query });
111
+ classifications.push({ questionId: gap.questionId, gap: gap.text, action: 'auto-fill', reason, skill: top.name });
112
+ } else {
113
+ classifications.push({ questionId: gap.questionId, gap: gap.text, action: 'followup', reason, ...(top ? { skill: top.name } : {}) });
114
+ }
115
+ }
116
+
117
+ return {
118
+ rounds: followups.length > 0 ? 1 : 0,
119
+ timeBudgetMs,
120
+ classifications,
121
+ followups,
122
+ };
123
+ }
124
+
125
+ /** Execute all eligible axes as one bounded round; timeout aborts each skill invocation. */
126
+ export async function runGapFollowup(
127
+ input: ResearchGapFollowupInput,
128
+ deps: ResearchGapFollowupDeps = {},
129
+ ): Promise<ResearchGapFollowupResult> {
130
+ const plan = planGapFollowup(input);
131
+ const startedAt = (deps.now ?? Date.now)();
132
+ const deadline = startedAt + plan.timeBudgetMs;
133
+ const discover = async (failedQuestions: ReadonlySet<string>): Promise<{ cards: string[]; evidence: ResearchEvidenceEnvelope[] }> => {
134
+ const gaps = plan.classifications.filter(item => item.reason === 'no-skill-match'
135
+ || (item.reason === 'auto-fill-eligible' && failedQuestions.has(item.questionId)));
136
+ const cards: string[] = [];
137
+ const evidence: ResearchEvidenceEnvelope[] = [];
138
+ for (const gap of gaps.slice(0, 2)) {
139
+ const remainingMs = deadline - (deps.now ?? Date.now)();
140
+ if (remainingMs <= 0) break;
141
+ const controller = new AbortController();
142
+ const timer = setTimeout(() => controller.abort(new Error('plugin discovery time budget exhausted')),
143
+ Math.min(10_000, remainingMs));
144
+ try {
145
+ const result = await (deps.discoverPlugin ?? discoverResearchPlugin)(gap.gap, { signal: controller.signal });
146
+ cards.push(result.card);
147
+ if (result.installed && !controller.signal.aborted && deadline > (deps.now ?? Date.now)()) {
148
+ const rerun = await (deps.rerunInstalled ?? rerunInstalledPluginResearch)(gap.gap, result.installed, controller.signal);
149
+ const output = Array.from(rerun.output).slice(0, MAX_GAP_TEXT).join('');
150
+ evidence.push({ questionId: gap.questionId, sourceKind: `plugin:${result.installed.name}`,
151
+ source: result.installed.name, observedAt: new Date((deps.now ?? Date.now)()).toISOString(),
152
+ content: output || rerun.error || 'installed plugin returned no research output',
153
+ outcome: rerun.ok && output ? 'complete' : 'failed',
154
+ truncated: Array.from(rerun.output).length > MAX_GAP_TEXT });
155
+ }
156
+ } catch (error) {
157
+ debug.log('research.plugin-discovery', 'followup-unavailable', {
158
+ questionId: gap.questionId, reason: error instanceof Error ? error.message.slice(0, 160) : String(error).slice(0, 160),
159
+ }, { level: 'warn' });
160
+ }
161
+ finally { clearTimeout(timer); }
162
+ }
163
+ return { cards, evidence };
164
+ };
165
+ if (plan.followups.length === 0) {
166
+ const discovered = await discover(new Set());
167
+ return { ...plan, followupEvidence: discovered.evidence, discoveryCards: discovered.cards };
168
+ }
169
+
170
+ const controller = new AbortController();
171
+ const timer = setTimeout(() => controller.abort(new Error('research gap follow-up time budget exhausted')),
172
+ Math.max(1, deadline - (deps.now ?? Date.now)()));
173
+ try {
174
+ const outcomes = await Promise.all(plan.followups.map(async (call): Promise<ResearchEvidenceEnvelope> => {
175
+ try {
176
+ const result = await (deps.runSkill ?? defaultRunSkill)(call.skill, call.query, controller.signal);
177
+ const output = Array.from(result.output).slice(0, MAX_GAP_TEXT).join('');
178
+ return {
179
+ questionId: call.questionId,
180
+ sourceKind: `skill:${call.skill}`,
181
+ source: call.skill,
182
+ observedAt: new Date((deps.now ?? Date.now)()).toISOString(),
183
+ content: output || result.error || 'skill returned no research output',
184
+ outcome: result.ok && output ? 'complete' : 'failed',
185
+ truncated: Array.from(result.output).length > MAX_GAP_TEXT,
186
+ };
187
+ } catch (error) {
188
+ return {
189
+ questionId: call.questionId,
190
+ sourceKind: `skill:${call.skill}`,
191
+ source: call.skill,
192
+ observedAt: new Date((deps.now ?? Date.now)()).toISOString(),
193
+ content: controller.signal.aborted ? 'follow-up exceeded its time budget' : errorText(error),
194
+ outcome: 'failed',
195
+ truncated: false,
196
+ };
197
+ }
198
+ }));
199
+ const discovered = await discover(new Set(outcomes.filter(item => item.outcome !== 'complete').map(item => item.questionId)));
200
+ return { ...plan, followupEvidence: [...outcomes, ...discovered.evidence], discoveryCards: discovered.cards };
201
+ } finally {
202
+ clearTimeout(timer);
203
+ }
204
+ }
205
+
206
+ function findResearchGaps(
207
+ questions: readonly BloomResearchQuestion[],
208
+ evidence: readonly ResearchEvidenceEnvelope[],
209
+ ): Array<{ questionId: string; text: string }> {
210
+ const byQuestion = new Map<string, ResearchEvidenceEnvelope[]>();
211
+ for (const item of evidence) byQuestion.set(item.questionId, [...(byQuestion.get(item.questionId) ?? []), item]);
212
+ const gaps: Array<{ questionId: string; text: string }> = [];
213
+ const seen = new Set<string>();
214
+ for (const question of questions) {
215
+ if (question.level !== 4 && question.level !== 5) continue;
216
+ const items = byQuestion.get(question.id) ?? [];
217
+ const questionGaps = new Set<string>();
218
+ if (items.length === 0) questionGaps.add(question.prompt);
219
+ for (const item of items) {
220
+ const sentences = item.content.split(/(?<=[.!?。!?])\s+|\n+/).map((sentence) => sentence.trim()).filter(Boolean);
221
+ const matches = sentences.filter(isExplicitGap);
222
+ const candidates = matches.length ? matches : item.outcome === 'complete' ? [] : [item.content.trim() || question.prompt];
223
+ for (const text of candidates) {
224
+ const normalized = text.toLowerCase();
225
+ if (text && !seen.has(`${question.id}\0${normalized}`)) {
226
+ seen.add(`${question.id}\0${normalized}`);
227
+ questionGaps.add(text);
228
+ }
229
+ }
230
+ }
231
+ if (questionGaps.size > 0) {
232
+ gaps.push({ questionId: question.id, text: Array.from([...questionGaps].join(' ')).slice(0, MAX_GAP_TEXT).join('') });
233
+ }
234
+ }
235
+ return gaps;
236
+ }
237
+
238
+ function isExplicitGap(text: string): boolean {
239
+ return /\b(?:unavailable|not available|missing|not found|no data|no evidence|unknown|unverified|could not find|failed to find|not provided|blank|empty|not covered)\b|\bno\b.{0,80}\b(?:data|evidence|records|series)\b.{0,80}\b(?:found|available|verified)\b|(?:미확인|확인되지 않|자료가 없|데이터가 없|자료 부족|데이터 부족|빈값|값이 비|시계열.{0,20}없|공백|찾지 못|미제공|미수집|검증되지 않|수급 미확인)/i.test(text);
240
+ }
241
+
242
+ async function defaultRunSkill(skill: string, query: string, signal: AbortSignal): Promise<{ ok: boolean; output: string; error?: string }> {
243
+ const result = await invokeResearch(query, { skill, signal });
244
+ return { ok: result.ok, output: result.output, ...(result.error ? { error: result.error } : {}) };
245
+ }
246
+
247
+ function errorText(error: unknown): string {
248
+ return error instanceof Error ? error.message : String(error);
249
+ }