elanous 0.2.37 → 0.2.38

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 (588) 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/{8kITumG9GAZ1LwT9POrAR → RrjXTwz-urRAbChP1bX02}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{2002-a43a3f380df873ec.js → 1026-44010f405704050c.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +27 -0
  6. package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/{7424.c0fe2a595d4232b5.js → 1632.7d87f998e714bede.js} +1 -1
  10. package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/{4937-28d437999b77c9dd.js → 1923-5c1695332240246a.js} +1 -1
  13. package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +148 -0
  14. package/apps/pwa/out/_next/static/chunks/2104.70e086d5174a4736.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +93 -0
  18. package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +104 -0
  19. package/apps/pwa/out/_next/static/chunks/{3199.6a1a9b0e6cd01dc6.js → 2415.738b777642a02233.js} +1 -1
  20. package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/{1262.a89bb27a5b2f844e.js → 3086.fb14b60ce98b53d3.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/3124-561f7f037943cde2.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +24 -0
  31. package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{2283.edd9627b7bdfb546.js → 3291.f6c1005387d514bd.js} +2 -2
  33. package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +36 -0
  34. package/apps/pwa/out/_next/static/chunks/{6877-84d47b7e85d0c41e.js → 3341-f09b9efbd7a82f70.js} +1 -1
  35. package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +287 -0
  38. package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/{6680.6a693c28aae4cd19.js → 3528.e4b8ab70d339f965.js} +1 -1
  40. package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +94 -0
  45. package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/3f0de3de-2340c532c00395db.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4199-f7c6eb40cd0322f8.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +32 -0
  57. package/apps/pwa/out/_next/static/chunks/{4036.d54e55e1ebf5acdc.js → 4804.6012b5cd33c22792.js} +2 -2
  58. package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +79 -0
  60. package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +74 -0
  63. package/apps/pwa/out/_next/static/chunks/5041-5aada92ca215ffdd.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/{6819.be5c9c4d67f22922.js → 5203.51e5d8b5f1dcfe53.js} +16 -16
  65. package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/{757-4fbaf50942b8c424.js → 5255-1b60d50eabe9f057.js} +1 -1
  67. package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +286 -0
  68. package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/{7867.e8725745ddd1d940.js → 5307.d7328020227880c2.js} +4 -4
  70. package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +8 -0
  73. package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/{5046.7fd5cbd859299448.js → 5638.107314dc479e2f37.js} +1 -1
  75. package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6142.913b44e260a3f925.js +64 -0
  80. package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6493.27ad77de7aac7966.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/{1224.2ceca6c180d5130b.js → 7000.28157393caaf5343.js} +1 -1
  88. package/apps/pwa/out/_next/static/chunks/{6745-5a63492933959dd9.js → 7161-8f22db3ec5ed005e.js} +3 -3
  89. package/apps/pwa/out/_next/static/chunks/{2479-fe7e188bd9402d14.js → 7311-60a7ea80d23c7521.js} +1 -1
  90. package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/{5952.294fc574a8625184.js → 7488.966b116789f3d41a.js} +1 -1
  93. package/apps/pwa/out/_next/static/chunks/7524.ce973525d30b3d52.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +77 -0
  95. package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/{6252.240578f10952e091.js → 7628.6b16863ac3972333.js} +1 -1
  97. package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/{1746.3563617ea64023a3.js → 7954.4f7a8832663ee979.js} +1 -1
  100. package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/{4931.95cc6dbd230774ca.js → 8019.21ca554a821dad01.js} +16 -16
  102. package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/{2375.bf364c85dbb6f085.js → 8487.291666583bebe640.js} +1 -1
  107. package/apps/pwa/out/_next/static/chunks/8509.3a54d4e61893d7cb.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/{4383.18e5c54db3a22c88.js → 8879.ac06755bcf3e44a1.js} +1 -1
  110. package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +149 -0
  111. package/apps/pwa/out/_next/static/chunks/{9151.a2c51e93f9156dae.js → 8911.bf5e712acb25fb6c.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/{58edce7d.f1b0c72acf13b123.js → 8994d93e.33ba491f95345fc2.js} +1 -1
  113. package/apps/pwa/out/_next/static/chunks/{5f6af561-f90b7a67f4f75d13.js → 89d6c04f-6b8ab341748e468a.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +41 -0
  115. package/apps/pwa/out/_next/static/chunks/9299.24e2a7d9b6d1f91b.js +226 -0
  116. package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +24 -0
  117. package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9581.da63ddf41acfad46.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +2 -0
  121. package/apps/pwa/out/_next/static/chunks/{de8446d3.31b73eb239fecd7b.js → 9fe1b809.738da85c8b17e3fb.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-866aac5ff226a7f3.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/{page-5c112c6d7c33656e.js → page-c348a3959c5b5fc6.js} +1 -1
  140. package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-88a1edbff62eaf1d.js → page-d1d1210f99f620ae.js} +1 -1
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-291ab19fe2acb173.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/{page-b9af2ac1c4737ce8.js → page-7f569e533ddeecba.js} +1 -1
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/{page-fb9e639c107f5f72.js → page-a9d9a3e66459c1e0.js} +1 -1
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-6b140f77593576eb.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{709a918c.4fd3b4e2a32cb4e3.js → b7459770.6539b11860eb8a9c.js} +7 -7
  174. package/apps/pwa/out/_next/static/chunks/{d9815f84.4918f682a45a8502.js → b7478fef.5917716286213fcc.js} +3 -3
  175. package/apps/pwa/out/_next/static/chunks/{4337e36d.f42c3b391b3d8f20.js → bb6987f9.3647e1a23b0e3217.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/de8b930d.d94c0f42acf807fc.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/{8c58d09b.e8724a299658d86f.js → eaad0cba.771200940c529df7.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/framework-4b12a946f352cee2.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +1 -0
  184. package/apps/pwa/out/approvals/index.html +1 -1
  185. package/apps/pwa/out/approvals/index.txt +22 -22
  186. package/apps/pwa/out/autopilot/index.html +1 -1
  187. package/apps/pwa/out/autopilot/index.txt +22 -22
  188. package/apps/pwa/out/board/index.html +1 -1
  189. package/apps/pwa/out/board/index.txt +22 -22
  190. package/apps/pwa/out/botlab/index.html +1 -1
  191. package/apps/pwa/out/botlab/index.txt +21 -21
  192. package/apps/pwa/out/bots/index.html +1 -1
  193. package/apps/pwa/out/bots/index.txt +21 -21
  194. package/apps/pwa/out/ceo/index.html +1 -1
  195. package/apps/pwa/out/ceo/index.txt +22 -22
  196. package/apps/pwa/out/chat/index.html +1 -1
  197. package/apps/pwa/out/chat/index.txt +21 -21
  198. package/apps/pwa/out/consult/index.html +1 -1
  199. package/apps/pwa/out/consult/index.txt +22 -22
  200. package/apps/pwa/out/control/index.html +1 -1
  201. package/apps/pwa/out/control/index.txt +22 -22
  202. package/apps/pwa/out/decisions/index.html +1 -1
  203. package/apps/pwa/out/decisions/index.txt +21 -21
  204. package/apps/pwa/out/design-check/index.html +1 -1
  205. package/apps/pwa/out/design-check/index.txt +22 -22
  206. package/apps/pwa/out/editor/index.html +1 -1
  207. package/apps/pwa/out/editor/index.txt +22 -22
  208. package/apps/pwa/out/exec/index.html +1 -1
  209. package/apps/pwa/out/exec/index.txt +22 -22
  210. package/apps/pwa/out/field/index.html +1 -1
  211. package/apps/pwa/out/field/index.txt +22 -22
  212. package/apps/pwa/out/healthz +1 -1
  213. package/apps/pwa/out/index.html +1 -1
  214. package/apps/pwa/out/index.txt +21 -21
  215. package/apps/pwa/out/inside/index.html +1 -1
  216. package/apps/pwa/out/inside/index.txt +21 -21
  217. package/apps/pwa/out/intake/index.html +1 -1
  218. package/apps/pwa/out/intake/index.txt +22 -22
  219. package/apps/pwa/out/live/index.html +1 -1
  220. package/apps/pwa/out/live/index.txt +22 -22
  221. package/apps/pwa/out/live-run/index.html +1 -1
  222. package/apps/pwa/out/live-run/index.txt +22 -22
  223. package/apps/pwa/out/loops/index.html +1 -1
  224. package/apps/pwa/out/loops/index.txt +21 -21
  225. package/apps/pwa/out/market/index.html +1 -1
  226. package/apps/pwa/out/market/index.txt +21 -21
  227. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  228. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  229. package/apps/pwa/out/morning/index.html +1 -1
  230. package/apps/pwa/out/morning/index.txt +22 -22
  231. package/apps/pwa/out/observatory/index.html +1 -1
  232. package/apps/pwa/out/observatory/index.txt +22 -22
  233. package/apps/pwa/out/ops/checklist/index.html +1 -1
  234. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  235. package/apps/pwa/out/ops/release/index.html +1 -1
  236. package/apps/pwa/out/ops/release/index.txt +21 -21
  237. package/apps/pwa/out/ops/seats/index.html +1 -1
  238. package/apps/pwa/out/ops/seats/index.txt +21 -21
  239. package/apps/pwa/out/outputs/index.html +1 -1
  240. package/apps/pwa/out/outputs/index.txt +21 -21
  241. package/apps/pwa/out/reflection/index.html +1 -1
  242. package/apps/pwa/out/reflection/index.txt +22 -22
  243. package/apps/pwa/out/scheduler/index.html +1 -1
  244. package/apps/pwa/out/scheduler/index.txt +22 -22
  245. package/apps/pwa/out/sessions/index.html +1 -1
  246. package/apps/pwa/out/sessions/index.txt +21 -21
  247. package/apps/pwa/out/settings/devices/index.html +1 -1
  248. package/apps/pwa/out/settings/devices/index.txt +22 -22
  249. package/apps/pwa/out/settings/index.html +1 -1
  250. package/apps/pwa/out/settings/index.txt +22 -22
  251. package/apps/pwa/out/setup/done/index.html +1 -1
  252. package/apps/pwa/out/setup/done/index.txt +22 -22
  253. package/apps/pwa/out/setup/index.html +1 -1
  254. package/apps/pwa/out/setup/index.txt +22 -22
  255. package/apps/pwa/out/share/index.html +1 -1
  256. package/apps/pwa/out/share/index.txt +22 -22
  257. package/apps/pwa/out/showroom/index.html +1 -1
  258. package/apps/pwa/out/showroom/index.txt +21 -21
  259. package/apps/pwa/out/tasks/index.html +1 -1
  260. package/apps/pwa/out/tasks/index.txt +22 -22
  261. package/apps/pwa/out/term/index.html +1 -1
  262. package/apps/pwa/out/term/index.txt +22 -22
  263. package/apps/pwa/out/today/index.html +1 -1
  264. package/apps/pwa/out/today/index.txt +22 -22
  265. package/apps/pwa/out/trace/index.html +1 -1
  266. package/apps/pwa/out/trace/index.txt +22 -22
  267. package/apps/pwa/out/vault/index.html +1 -1
  268. package/apps/pwa/out/vault/index.txt +22 -22
  269. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  270. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  271. package/apps/pwa/out/workflows/index.html +1 -1
  272. package/apps/pwa/out/workflows/index.txt +22 -22
  273. package/apps/pwa/out/workspace/index.html +1 -1
  274. package/apps/pwa/out/workspace/index.txt +22 -22
  275. package/apps/pwa/out/worktrees/index.html +1 -1
  276. package/apps/pwa/out/worktrees/index.txt +22 -22
  277. package/graphs/release/recipes.yaml +9 -0
  278. package/graphs/release/release-loop.yaml +26 -18
  279. package/package.json +1 -1
  280. package/scripts/ask-op-inbox-once.ts +17 -0
  281. package/scripts/brand/check.ts +13 -4
  282. package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
  283. package/scripts/gate-0226-failure-census.ts +39 -0
  284. package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
  285. package/scripts/provision-export-redactions.ts +15 -0
  286. package/scripts/public-copy-lint.ts +122 -0
  287. package/scripts/public-export.ts +69 -2
  288. package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
  289. package/scripts/ratchets/train-side-invariants.sh +7 -1
  290. package/scripts/release-loop/cut-branch.ts +61 -12
  291. package/scripts/release-loop/gate-node.ts +161 -25
  292. package/scripts/release-loop/gate-partial.ts +82 -3
  293. package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
  294. package/scripts/release-loop/gate-radius-live.ts +4 -2
  295. package/scripts/release-loop/resume-cap.ts +2 -1
  296. package/scripts/release-loop/resume-release.ts +297 -8
  297. package/scripts/release-loop/resume.ts +13 -5
  298. package/scripts/release-loop/traffic-node.ts +12 -4
  299. package/scripts/release-loop/traffic-transition.ts +53 -13
  300. package/scripts/release-loop/version-node.ts +29 -4
  301. package/scripts/ux-sim.ts +1 -1
  302. package/scripts/video-pipeline.ts +2 -2
  303. package/src/acp/core-turn-bridge.ts +6 -1
  304. package/src/agent/run-context.ts +1 -1
  305. package/src/agent/task-notification.ts +3 -1
  306. package/src/agent-substrate/review-observation.ts +10 -0
  307. package/src/agent-substrate/self-review-cli.ts +195 -27
  308. package/src/auto-research/question-ladder-contract.ts +137 -0
  309. package/src/auto-research/research-turn.ts +134 -0
  310. package/src/autopilot/discovery/doc-lint.ts +1 -1
  311. package/src/bots/screen-probe.ts +1 -1
  312. package/src/capture/tui-self-report.ts +10 -2
  313. package/src/chat/index.ts +1 -0
  314. package/src/chat/tool-render/dispatch.ts +8 -1
  315. package/src/cli/guardian-cli.ts +3 -1
  316. package/src/cli/intake-cli.ts +48 -12
  317. package/src/cli/lesson-cli.ts +69 -9
  318. package/src/cli/pr-land-overlap-evidence.ts +38 -5
  319. package/src/cli/pr-land-refusal.ts +1 -1
  320. package/src/cli/pty-takeover-cli.ts +58 -5
  321. package/src/cli/release-checklist-read-cli.ts +5 -2
  322. package/src/cli/release-cli.ts +47 -9
  323. package/src/cli/review-carry.ts +77 -0
  324. package/src/cli/self-update.ts +1 -1
  325. package/src/cli/tasks-card-show.ts +31 -1
  326. package/src/cli/tasks-cli.ts +62 -23
  327. package/src/cli/tasks-read-cli.ts +13 -5
  328. package/src/context-bus/context-now.ts +86 -2
  329. package/src/core-turn/run-core-turn.ts +9 -2
  330. package/src/core-turn/types.ts +3 -0
  331. package/src/dashboard/index.ts +18 -17
  332. package/src/dashboard/input/terminal-modal-router.ts +8 -159
  333. package/src/dashboard/side-basic-runtime.ts +61 -0
  334. package/src/dashboard/slash-runtime/dashboard-handlers.ts +2 -0
  335. package/src/dashboard/term-slash-runtime.ts +2 -0
  336. package/src/dashboard/turn-preamble.ts +28 -4
  337. package/src/domains/guardian-tick.ts +9 -0
  338. package/src/git-fs/watcher.ts +27 -22
  339. package/src/git-fs/worktree.ts +19 -3
  340. package/src/graph-runner/graph-grow.ts +37 -9
  341. package/src/graph-runner/runner.ts +17 -2
  342. package/src/grok/credential.ts +107 -36
  343. package/src/hq/fence-wrapper.ts +1 -1
  344. package/src/hq/transfer.ts +1 -1
  345. package/src/index.ts +44 -14
  346. package/src/intake-plane/collect-telegram-saved.ts +54 -5
  347. package/src/interactive-terminal-modal.ts +3 -0
  348. package/src/keybindings.ts +17 -22
  349. package/src/llm/provider-credentials.ts +1 -1
  350. package/src/llm-tool-schema.ts +20 -0
  351. package/src/llm.ts +81 -11
  352. package/src/loops/orchestrator/inbox-once.ts +28 -0
  353. package/src/loops/orchestrator/inbox.ts +130 -1
  354. package/src/loops/orchestrator/tick.ts +6 -3
  355. package/src/maturity/feature-maturity.ts +1 -0
  356. package/src/nexus/api/channel-ask-op.ts +96 -0
  357. package/src/nexus/api/discord-trigger-bot.ts +28 -1
  358. package/src/nexus/api/telegram-trigger-bot.ts +24 -0
  359. package/src/nexus/api/terminals.ts +28 -6
  360. package/src/patents/ledger.ts +18 -1
  361. package/src/preview/terminal.ts +4 -2
  362. package/src/prompt-cache/anthropic.ts +2 -0
  363. package/src/prompt-enhance/enhance.ts +5 -0
  364. package/src/pty-shell/pty-manifest.ts +16 -2
  365. package/src/release-loop/gate-shards.ts +61 -0
  366. package/src/release-loop/light-rc.ts +7 -4
  367. package/src/release-loop/rehearsal.ts +1 -1
  368. package/src/repl/index.ts +10 -0
  369. package/src/research/axis-fanout.ts +133 -0
  370. package/src/research/edge-decision.ts +88 -0
  371. package/src/research/output-router.ts +127 -0
  372. package/src/research-bridge/format.ts +16 -1
  373. package/src/research-bridge/index.ts +1 -0
  374. package/src/research-bridge/invoke.ts +41 -5
  375. package/src/self-dev/decompose.ts +45 -9
  376. package/src/self-dev/draft-residue.ts +221 -2
  377. package/src/self-dev/draft-sweep.ts +29 -16
  378. package/src/self-dev/orchestrate.ts +1 -0
  379. package/src/self-dev/run-supervisor.ts +22 -7
  380. package/src/self-dev/shard-run.ts +260 -3
  381. package/src/self-implement/comment-only-source.ts +54 -0
  382. package/src/self-implement/doctor-visit.ts +25 -0
  383. package/src/self-implement/gate-artifacts.ts +2 -2
  384. package/src/self-implement/gate-baseline.ts +44 -9
  385. package/src/self-implement/gate-cli.ts +151 -86
  386. package/src/self-implement/gate-failure-signature.ts +44 -0
  387. package/src/self-implement/gate-remote.ts +2 -0
  388. package/src/self-implement/goal-author.ts +74 -3
  389. package/src/self-implement/goal-doc/section.ts +22 -0
  390. package/src/self-implement/goal-supervisor-fill.ts +38 -4
  391. package/src/self-implement/knowhow-pack.ts +120 -7
  392. package/src/self-implement/l8-merge-queue.ts +198 -32
  393. package/src/self-implement/off-diff-evidence.ts +23 -0
  394. package/src/self-implement/orchestrator.ts +55 -12
  395. package/src/self-implement/pod-inplace-worktree.ts +82 -0
  396. package/src/self-implement/pod-warm-pool-profile.ts +2 -2
  397. package/src/self-implement/premise-review.ts +7 -5
  398. package/src/self-implement/run-ledger.ts +258 -0
  399. package/src/self-implement/seams.ts +33 -10
  400. package/src/self-implement/self-implement-cli.ts +26 -2
  401. package/src/session/channel-ask-op-envelope.ts +36 -0
  402. package/src/session/channel-op-reply-route.ts +200 -0
  403. package/src/session/chat.ts +3 -0
  404. package/src/session/index.ts +2 -0
  405. package/src/session-runtime/index.ts +9 -22
  406. package/src/skills/runner.ts +7 -3
  407. package/src/skills/tools/dev-harness.ts +2 -2
  408. package/src/skills/tools/schedule-wakeup.ts +1 -6
  409. package/src/status/bar.ts +3 -3
  410. package/src/storage/file-lock.ts +17 -4
  411. package/src/task-agent/adopt-pr.ts +63 -2
  412. package/src/task-agent/evidence-command-normalize.ts +42 -0
  413. package/src/task-agent/export-redactions-provision.ts +43 -0
  414. package/src/task-agent/parent-host.ts +59 -12
  415. package/src/task-agent/repair-cycle.ts +67 -8
  416. package/src/task-agent/repair-worker.ts +37 -1
  417. package/src/task-agent/task-hand.ts +98 -10
  418. package/src/task-agent/tier-split.ts +37 -3
  419. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +31 -4
  420. package/src/task-orchestrator/surfaces/pod-pool.ts +27 -4
  421. package/src/task-orchestrator/surfaces/self-implement-pod.ts +126 -48
  422. package/src/task-orchestrator/surfaces/self-implement.ts +33 -2
  423. package/src/terminal/session-registry.ts +1 -0
  424. package/src/terminal/terminal-modal-router.ts +156 -0
  425. package/src/tool-hints/gate.ts +6 -4
  426. package/src/tool-hints/signals.ts +33 -1
  427. package/src/tui/chat/background-job-status.ts +8 -2
  428. package/src/tui/entry.ts +469 -31
  429. package/src/tui/sidetab/attach.ts +304 -0
  430. package/src/tui/sidetab/list.ts +176 -0
  431. package/src/tui/sidetab/nl-tool.ts +136 -0
  432. package/src/tui/slash/resume-command.ts +23 -0
  433. package/src/tui/slash/resume.ts +3 -23
  434. package/src/tui/slash/term-next.ts +2 -1
  435. package/src/tui-client/local-chat-turn.ts +29 -8
  436. package/src/user-config.ts +11 -2
  437. package/src/ux-sim/fake-llm.ts +11 -5
  438. package/src/ux-sim/next-tui-seat-scenarios.ts +53 -1
  439. package/src/version/packed-revision.json +1 -1
  440. package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +0 -1
  441. package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +0 -1
  442. package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +0 -1
  443. package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +0 -1
  444. package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +0 -1
  445. package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +0 -1
  446. package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +0 -1
  447. package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +0 -1
  448. package/apps/pwa/out/_next/static/chunks/1ed5e8af.cf424815c7c0efad.js +0 -1
  449. package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +0 -1
  450. package/apps/pwa/out/_next/static/chunks/210.90b2cbd64926cf34.js +0 -32
  451. package/apps/pwa/out/_next/static/chunks/2318-450e75d07605b8fe.js +0 -1
  452. package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +0 -1
  453. package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +0 -148
  454. package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +0 -1
  455. package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +0 -1
  456. package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +0 -1
  457. package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +0 -27
  458. package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +0 -1
  459. package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +0 -1
  460. package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +0 -1
  461. package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +0 -1
  462. package/apps/pwa/out/_next/static/chunks/3578.4e9f9948a9a6f2f4.js +0 -2
  463. package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +0 -1
  464. package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +0 -36
  465. package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +0 -1
  466. package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +0 -226
  467. package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +0 -287
  468. package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +0 -1
  469. package/apps/pwa/out/_next/static/chunks/4313.76f232c304a15bde.js +0 -1
  470. package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +0 -1
  471. package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +0 -1
  472. package/apps/pwa/out/_next/static/chunks/4725-34bed25720cc326b.js +0 -1
  473. package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +0 -1
  474. package/apps/pwa/out/_next/static/chunks/4833-7934c592c5569f00.js +0 -1
  475. package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +0 -24
  477. package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +0 -104
  479. package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +0 -1
  481. package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +0 -1
  482. package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +0 -1
  483. package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +0 -93
  486. package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +0 -74
  487. package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +0 -149
  490. package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +0 -41
  493. package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +0 -1
  494. package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +0 -24
  496. package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +0 -1
  498. package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/7893-e444a1b0809cd1e4.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/7c5ed21f-f286708e57cf88f7.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +0 -8
  508. package/apps/pwa/out/_next/static/chunks/8080-40d781e7704d3671.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +0 -77
  510. package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +0 -286
  513. package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +0 -1
  515. package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +0 -79
  517. package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +0 -1
  522. package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +0 -94
  525. package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/958.53a8dcf4729e6997.js +0 -64
  527. package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +0 -1
  531. package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/app/live/page-3337c6a1328c2674.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/app/live-run/page-89acd5d68c0bc560.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-fe986fe79b107546.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/app/morning/page-1e5da297557d2354.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/app/outputs/page-443364c9e4a23b31.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/app/term/page-ac2c1e6169cfce57.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/workspace/page-c1c80e345fa9d6f5.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.js +0 -1
  586. package/scripts/migrate-monad-to-elanous.ts +0 -195
  587. package/scripts/rebrand-elanous.ts +0 -242
  588. /package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → RrjXTwz-urRAbChP1bX02}/_ssgManifest.js +0 -0
@@ -1,10 +1,10 @@
1
1
  import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, statfsSync, statSync, writeFileSync } from 'node:fs';
2
- import { availableParallelism, freemem, tmpdir } from 'node:os';
2
+ import { availableParallelism, freemem, loadavg, tmpdir, totalmem } from 'node:os';
3
3
  import { join } from 'node:path';
4
4
  import { debug, redactSecretText } from '../debug/log.js';
5
5
  import { prepareDeterministicChildEnvironment } from '../../scripts/lib/deterministic-env.js';
6
6
  import { withGateTestEnv } from '../../scripts/lib/gate-test-env.js';
7
- import { withBaselineWorktree } from '../self-implement/gate-baseline.js';
7
+ import { withBaselineWorktree, withBaselineWorktreeAsync } from '../self-implement/gate-baseline.js';
8
8
  import { aggregateGateTestShards, type GateShardAttempt, type GateShardAggregate } from './shard-aggregate.js';
9
9
  import { GateShardCapacityError, planFixedGateTestShards, planSelfGateSpawnSeparatedShards, type GateTestShard } from './shard-plan.js';
10
10
  import { isGateSpawnLaneFile } from './spawn-lane-files.js';
@@ -27,6 +27,15 @@ export interface ShardRunResult {
27
27
  unmeasuredByShard?: Record<string, string>;
28
28
  /** git stderr tail (redacted · ≤2KB · one line) when the baseline worktree could not be added. */
29
29
  baselineStderrTail?: string;
30
+ /** Effective live pool width and its host-load/memory decision, for gate artifacts and diagnosis. */
31
+ concurrency?: number;
32
+ concurrencyReason?: string;
33
+ /** Wall time spent in singleton RSS samples and current+baseline bundles, respectively. */
34
+ measurementMs?: number;
35
+ bundleMs?: number;
36
+ /** Sum of process wall times across bundles (overlaps under concurrency). */
37
+ currentProcessMs?: number;
38
+ baselineProcessMs?: number;
30
39
  }
31
40
 
32
41
  /** What a failed shard process leaves behind so «test failure vs runner error» can be told apart after the fact. */
@@ -50,9 +59,11 @@ export interface ShardRunMode {
50
59
  /** OP FU — sorted round-robin into `count` shards, zero pre-measurement runs. Default off: the measured planner. */
51
60
  fixedDistribution?: boolean;
52
61
  /** Measured on the executing host; override only for deterministic planning tests. */
53
- hostResources?: { cores: number; freeMemoryGiB: number; freeTmpGiB: number };
62
+ hostResources?: { cores: number; freeMemoryGiB: number; freeTmpGiB: number; load1?: number };
54
63
  /** Observation after each bundle's first current+baseline attempt; never controls retries or verdict. */
55
64
  onShardComplete?: (progress: ShardRunProgress) => void;
65
+ /** Maximum concurrently active shard bundles. The default is three, bounded to one through four. */
66
+ concurrency?: number;
56
67
  }
57
68
 
58
69
  export interface ShardRunProgress {
@@ -73,14 +84,37 @@ function hostResources(): ShardRunMode['hostResources'] | undefined {
73
84
  const availableKiB = /^MemAvailable:\s+(\d+)\s+kB/m.exec(readFileSync('/proc/meminfo', 'utf8'))?.[1];
74
85
  if (availableKiB) freeMemoryGiB = Number(availableKiB) / (1024 ** 2);
75
86
  }
87
+ if (process.platform === 'darwin') {
88
+ // macOS freemem excludes reclaimable cache; node-b reported 5 GiB free of 512 GiB while
89
+ // memory_pressure reported 91% available. A freemem cap would silently serialize the gate.
90
+ const pressure = Bun.spawnSync(['memory_pressure', '-Q'], { stdout: 'pipe', stderr: 'ignore', timeout: 2_000 });
91
+ const percent = /System-wide memory free percentage:\s*(\d+(?:\.\d+)?)%/.exec(Buffer.from(pressure.stdout).toString('utf8'))?.[1];
92
+ if (pressure.exitCode === 0 && percent !== undefined && Number(percent) >= 0 && Number(percent) <= 100) {
93
+ freeMemoryGiB = totalmem() / (1024 ** 3) * Number(percent) / 100;
94
+ }
95
+ }
76
96
  return {
77
97
  cores: availableParallelism(),
78
98
  freeMemoryGiB,
79
99
  freeTmpGiB: Number(tmp.bavail) * Number(tmp.bsize) / (1024 ** 3),
100
+ load1: loadavg()[0],
80
101
  };
81
102
  } catch { return undefined; }
82
103
  }
83
104
 
105
+ /** A conservative snapshot taken before sampling. Explicit 1 preserves the old serial child order. */
106
+ export function resolveShardConcurrency(configured: number | undefined, resources: ShardRunMode['hostResources'], budgetGiB: number): { count: number; reason: string } {
107
+ if (!resources || !Number.isFinite(resources.cores) || resources.cores < 1) return { count: Math.max(1, Math.min(4, configured ?? 3)), reason: configured === undefined ? 'default; host load unavailable' : 'configured; host load unavailable' };
108
+ const loadRatio = Number.isFinite(resources.load1) ? resources.load1! / resources.cores : null;
109
+ const target = configured ?? (loadRatio !== null && loadRatio >= 0.8 ? 2
110
+ : loadRatio !== null && loadRatio <= 0.35 && resources.cores >= 8 ? 4 : 3);
111
+ const cpuCap = Math.max(1, Math.floor(resources.cores));
112
+ const memoryCap = Number.isFinite(resources.freeMemoryGiB) && Number.isFinite(budgetGiB) && budgetGiB > 0
113
+ ? Math.max(1, Math.floor(resources.freeMemoryGiB / budgetGiB)) : 4;
114
+ const count = Math.max(1, Math.min(4, target, cpuCap, memoryCap));
115
+ return { count, reason: `${configured === undefined ? 'adaptive' : `configured ${configured}`} · host load/cores ${loadRatio === null ? '?' : loadRatio.toFixed(2)} · free ${resources.freeMemoryGiB.toFixed(1)} GiB · shard budget ${budgetGiB} GiB` };
116
+ }
117
+
84
118
  /** One expansion slot needs one CPU, one shard memory budget, and 1 GiB of free tmp space.
85
119
  * Explicitly requested shards remain the caller's choice; this only limits automatic growth. */
86
120
  export function maxAutomaticShardCount(requested: number, budgetGiB: number, resources: ShardRunMode['hostResources']): number {
@@ -104,6 +138,7 @@ export type ShardProcess = (cwd: string, files: readonly string[]) => {
104
138
  /** Present only when the process failed (exit≠0 · signal · no JUnit) — observation only, never part of the verdict. */
105
139
  failure?: ShardFailureOutput;
106
140
  };
141
+ export type AsyncShardProcess = (cwd: string, files: readonly string[]) => Promise<ReturnType<ShardProcess>>;
107
142
 
108
143
  export const SHARD_FAILURE_TAIL_BYTES = 64 * 1024;
109
144
 
@@ -113,6 +148,29 @@ function outputTail(bytes: Uint8Array | undefined): string {
113
148
  return redactSecretText(Buffer.from(tail).toString('utf8'));
114
149
  }
115
150
 
151
+ /** Drain a child pipe without retaining its entire output. Diagnostics need the opening context and failure tail. */
152
+ async function boundedChildOutput(stream: ReadableStream<Uint8Array>, abort: AbortSignal): Promise<Uint8Array> {
153
+ const reader = stream.getReader();
154
+ const cancel = () => { void reader.cancel('child output drain timed out').catch(() => {}); };
155
+ abort.addEventListener('abort', cancel, { once: true });
156
+ const headLimit = 1024;
157
+ let head = new Uint8Array(0);
158
+ let tail = new Uint8Array(0);
159
+ let total = 0;
160
+ try {
161
+ for (;;) {
162
+ const { done, value } = await reader.read();
163
+ if (done) break;
164
+ total += value.byteLength;
165
+ if (head.byteLength < headLimit) head = Buffer.concat([head, value.subarray(0, headLimit - head.byteLength)]);
166
+ tail = value.byteLength >= SHARD_FAILURE_TAIL_BYTES
167
+ ? value.slice(-SHARD_FAILURE_TAIL_BYTES)
168
+ : Buffer.concat([tail, value]).subarray(-SHARD_FAILURE_TAIL_BYTES);
169
+ }
170
+ } finally { abort.removeEventListener('abort', cancel); reader.releaseLock(); }
171
+ return total <= SHARD_FAILURE_TAIL_BYTES ? tail : Buffer.concat([head, tail]);
172
+ }
173
+
116
174
  /** `<shardId>.failure.json` per failed shard (shard ids are already `shard-<n>`). Top level = the latest current-side
117
175
  * failure (else the latest baseline one); `failures` keeps every failed side/attempt. Returns the written paths. */
118
176
  export function writeShardFailureEvidence(dir: string, evidence: readonly ShardFailureEvidence[]): string[] {
@@ -321,6 +379,146 @@ function runPlannedShards(
321
379
  };
322
380
  }
323
381
 
382
+ /** Runs planned bundles concurrently while retaining plan order in attempts and aggregate evidence. */
383
+ export async function runShardedGateTestsAsync(
384
+ cwd: string,
385
+ files: readonly string[],
386
+ baseRef: string,
387
+ count = 2,
388
+ run: AsyncShardProcess = runBunShardAsync,
389
+ baselineWorktree: typeof withBaselineWorktreeAsync = withBaselineWorktreeAsync,
390
+ budgetGiB = 8,
391
+ mode: ShardRunMode = {},
392
+ measure: AsyncShardProcess = run,
393
+ ): Promise<ShardRunResult> {
394
+ if (mode.concurrency !== undefined && (!Number.isSafeInteger(mode.concurrency) || mode.concurrency < 1 || mode.concurrency > 4)) throw new Error('invalid shard concurrency (expected 1–4)');
395
+ const resources = mode.hostResources ?? hostResources();
396
+ const selectedConcurrency = resolveShardConcurrency(mode.concurrency, resources, budgetGiB);
397
+ const concurrency = selectedConcurrency.count;
398
+ debug.log('self-dev.shard', 'concurrency', { concurrency, reason: selectedConcurrency.reason });
399
+ const measurementStartedAt = performance.now();
400
+ const samples = new Map<string, ReturnType<ShardProcess>>();
401
+ if (!mode.fixedDistribution) {
402
+ const unique = [...new Set(files)];
403
+ let nextSample = 0;
404
+ const sampleWorker = async () => {
405
+ for (;;) {
406
+ const index = nextSample++;
407
+ if (index >= unique.length) return;
408
+ const file = unique[index]!;
409
+ try { samples.set(file, await measure(cwd, [file])); }
410
+ catch (error) {
411
+ debug.log('self-dev.shard', 'rss-measurement-failed', { file, error: redactSecretText(String(error)).slice(0, 500) });
412
+ samples.set(file, { exitCode: null });
413
+ }
414
+ }
415
+ };
416
+ await Promise.all(Array.from({ length: Math.min(concurrency, unique.length) }, () => sampleWorker()));
417
+ }
418
+ const measurementMs = Math.round(performance.now() - measurementStartedAt);
419
+ // Reuse the established measured/fixed planner and its host-cap fallback. The callback supplies a
420
+ // planning-only aggregate, so this phase never launches a shard or creates a baseline worktree.
421
+ const planningOnlyBaseline = (() => ({ status: 'passed' as const, retryShardIds: [] })) as unknown as typeof withBaselineWorktree;
422
+ const planned = runShardedGateTests(cwd, files, baseRef, count, (_cwd, selected) => samples.get(selected[0]!) ?? { exitCode: null },
423
+ planningOnlyBaseline, budgetGiB, { ...mode, ...(resources ? { hostResources: resources } : {}) });
424
+ if (planned.reason) return { ...planned, concurrency, concurrencyReason: selectedConcurrency.reason, measurementMs, bundleMs: 0 };
425
+ const shards = planned.shards;
426
+ const attempts: GateShardAttempt[] = [];
427
+ const failureEvidence: ShardFailureEvidence[] = [];
428
+ const bundlesStartedAt = performance.now();
429
+ let currentProcessMs = 0;
430
+ let baselineProcessMs = 0;
431
+ const baseline = await baselineWorktree(cwd, baseRef, async (dir) => {
432
+ const treeReadable = (() => { try { return statSync(dir).isDirectory(); } catch { return false; } })();
433
+ // Baseline membership is invariant for both rounds. Cache it before launching children.
434
+ const atBase = new Map(shards.map((shard) => [shard.id,
435
+ treeReadable ? shard.files.filter((file) => !absentAtBaseline(join(dir, file))) : [...shard.files]]));
436
+ const baselinePassCache = new Map<string, ReturnType<ShardProcess>>();
437
+ const totalFiles = new Set(shards.flatMap((shard) => shard.files)).size;
438
+ let completedShards = 0;
439
+ let completedFiles = 0;
440
+ let pending = shards;
441
+ for (let round = 1; round <= 2 && pending.length; round++) {
442
+ const roundAttempts = new Array<GateShardAttempt>(pending.length);
443
+ const roundEvidence = new Array<ShardFailureEvidence[]>(pending.length);
444
+ let next = 0;
445
+ const runSafely = async (location: string, selected: readonly string[]): Promise<ReturnType<ShardProcess>> => {
446
+ try { return await run(location, selected); }
447
+ catch (error) {
448
+ debug.log('self-dev.shard', 'bundle-runner-failed', { location, files: selected,
449
+ error: redactSecretText(String(error)).slice(0, 500) });
450
+ return { exitCode: null };
451
+ }
452
+ };
453
+ const worker = async () => {
454
+ for (;;) {
455
+ const index = next++;
456
+ if (index >= pending.length) return;
457
+ const shard = pending[index]!;
458
+ const baselineFiles = atBase.get(shard.id)!;
459
+ if (baselineFiles.length < shard.files.length) {
460
+ debug.log('self-dev.shard', 'baseline-files-absent', { shardId: shard.id, round,
461
+ absent: shard.files.filter((file) => !baselineFiles.includes(file)) });
462
+ }
463
+ const currentStartedAt = performance.now();
464
+ const current = await runSafely(cwd, shard.files);
465
+ currentProcessMs += performance.now() - currentStartedAt;
466
+ const cached = concurrency > 1 && round > 1 ? baselinePassCache.get(shard.id) : undefined;
467
+ if (cached) debug.log('self-dev.shard', 'baseline-cache-hit', { shardId: shard.id, round });
468
+ const baselineStartedAt = performance.now();
469
+ const base = cached ?? (baselineFiles.length ? await runSafely(dir, baselineFiles) : { exitCode: 0 });
470
+ baselineProcessMs += performance.now() - baselineStartedAt;
471
+ if (concurrency > 1 && baselineFiles.length && base.exitCode === 0 && !base.signal && base.junit) baselinePassCache.set(shard.id, base);
472
+ roundAttempts[index] = {
473
+ shardId: shard.id, attempt: round, currentJUnit: current.junit, baselineJUnit: base.junit,
474
+ currentExitCode: current.exitCode, baselineExitCode: base.exitCode,
475
+ currentSignal: current.signal, baselineSignal: base.signal,
476
+ currentDiagnostic: current.diagnostic, baselineDiagnostic: base.diagnostic,
477
+ baselineFiles, currentRoot: cwd, baselineRoot: dir,
478
+ };
479
+ roundEvidence[index] = [];
480
+ for (const [side, result, selected] of [
481
+ ['current', current, shard.files], ['baseline', base, baselineFiles],
482
+ ] as const) {
483
+ if (result.failure) roundEvidence[index]!.push({ shardId: shard.id, side, attempt: round,
484
+ files: [...selected], exitCode: result.exitCode, signal: result.signal ?? null, ...result.failure });
485
+ }
486
+ if (round === 1 && mode.onShardComplete) {
487
+ completedShards++;
488
+ completedFiles += shard.files.length;
489
+ try { mode.onShardComplete({ shardId: shard.id, completedShards, totalShards: shards.length,
490
+ completedFiles, totalFiles }); } catch { /* observation only */ }
491
+ }
492
+ }
493
+ };
494
+ await Promise.all(Array.from({ length: Math.min(concurrency, pending.length) }, () => worker()));
495
+ attempts.push(...roundAttempts);
496
+ for (const evidence of roundEvidence) failureEvidence.push(...evidence);
497
+ const retry = new Set(aggregateGateTestShards(shards, attempts).retryShardIds);
498
+ pending = shards.filter((shard) => retry.has(shard.id));
499
+ }
500
+ return aggregateGateTestShards(shards, attempts);
501
+ });
502
+ const evidence = failureEvidence.length ? { failureEvidence } : {};
503
+ const bundleMs = Math.round(performance.now() - bundlesStartedAt);
504
+ if ('retryShardIds' in baseline) return {
505
+ ...planned, aggregate: baseline, attempts, ...evidence, concurrency, concurrencyReason: selectedConcurrency.reason, measurementMs, bundleMs,
506
+ currentProcessMs: Math.round(currentProcessMs), baselineProcessMs: Math.round(baselineProcessMs),
507
+ ...(baseline.retryShardIds.length ? { unmeasuredByShard: incompleteShardReasons(baseline.retryShardIds, attempts) } : {}),
508
+ };
509
+ const retryShardIds = shards.map((shard) => shard.id);
510
+ const stderrTail = baseline.gitStderrTail;
511
+ const stderrPart = stderrTail ? ` · git stderr: ${stderrTail}` : '';
512
+ return {
513
+ ...planned, aggregate: { status: 'unmeasured', retryShardIds }, attempts, concurrency, concurrencyReason: selectedConcurrency.reason, measurementMs, bundleMs,
514
+ currentProcessMs: Math.round(currentProcessMs), baselineProcessMs: Math.round(baselineProcessMs),
515
+ reason: baseline.log, ...evidence,
516
+ unmeasuredByShard: Object.fromEntries(retryShardIds.map((id) => [id,
517
+ `baseline worktree: ${redactSecretText(baseline.log).replace(/[\r\n\t\x00-\x1f\x7f]+/g, ' ').slice(0, 500)}${stderrPart}`])),
518
+ ...(stderrTail ? { baselineStderrTail: stderrTail } : {}),
519
+ };
520
+ }
521
+
324
522
  function incompleteShardReasons(shardIds: readonly string[], attempts: readonly GateShardAttempt[]): Record<string, string> {
325
523
  return Object.fromEntries(shardIds.map((id) => {
326
524
  const latest = attempts.filter((attempt) => attempt.shardId === id).at(-1);
@@ -381,6 +579,65 @@ export function runBunShardWithSpawn(cwd: string, files: readonly string[], spaw
381
579
  }
382
580
  }
383
581
 
582
+ /** Nonblocking child runner; each bundle still owns its own deterministic environment and JUnit path. */
583
+ export async function runBunShardAsync(cwd: string, files: readonly string[], drainTimeoutMs = 5_000): Promise<ReturnType<ShardProcess>> {
584
+ const timeout = selfGateShardTimeoutMs(files);
585
+ const spawnLane = timeout === 120_000;
586
+ const dir = mkdtempSync(join(tmpdir(), 'elanous-shard-junit-'));
587
+ const report = join(dir, 'result.xml');
588
+ const isolated = prepareDeterministicChildEnvironment('elanous-shard-test-env-', { env: withGateTestEnv(process.env) });
589
+ let timer: ReturnType<typeof setTimeout> | undefined;
590
+ let drainTimer: ReturnType<typeof setTimeout> | undefined;
591
+ const drainAbort = new AbortController();
592
+ try {
593
+ const args = ['test', ...(spawnLane ? ['--timeout=120000'] : []), '--reporter=junit', `--reporter-outfile=${report}`, ...files];
594
+ const started = performance.now();
595
+ const child = Bun.spawn(['bun', ...args], { cwd, env: isolated.env, stdout: 'pipe', stderr: 'pipe' });
596
+ let timedOut = false;
597
+ let drainTimedOut = false;
598
+ timer = setTimeout(() => { timedOut = true; child.kill('SIGKILL'); }, timeout);
599
+ const stdoutOutput = boundedChildOutput(child.stdout, drainAbort.signal);
600
+ const stderrOutput = boundedChildOutput(child.stderr, drainAbort.signal);
601
+ const exited = child.exited.then((code) => {
602
+ // Pipe draining can continue after process exit; a late timer must not relabel a clean exit as SIGKILL.
603
+ if (timer) clearTimeout(timer);
604
+ timer = undefined;
605
+ drainTimer = setTimeout(() => {
606
+ drainTimedOut = true;
607
+ debug.log('self-dev.shard', 'output-drain-timeout', { cwd, files, drainTimeoutMs });
608
+ drainAbort.abort();
609
+ }, drainTimeoutMs);
610
+ return code;
611
+ });
612
+ const [exitCode, stdoutBuffer, stderrBuffer] = await Promise.all([
613
+ exited,
614
+ stdoutOutput,
615
+ stderrOutput,
616
+ ]);
617
+ if (drainTimer) clearTimeout(drainTimer);
618
+ drainTimer = undefined;
619
+ const stdout = stdoutBuffer;
620
+ const stderr = stderrBuffer;
621
+ const durationMs = performance.now() - started;
622
+ const usage = child.resourceUsage();
623
+ const junit = existsSync(report) ? readFileSync(report, 'utf8') : undefined;
624
+ const signal = drainTimedOut ? 'DRAIN_TIMEOUT' : timedOut ? 'SIGKILL' : child.signalCode ? String(child.signalCode) : undefined;
625
+ const failed = exitCode !== 0 || !!signal || junit === undefined;
626
+ return {
627
+ exitCode, signal, junit,
628
+ ...(files.length === 1 ? { rssMb: usage ? usage.maxRSS / (1024 * 1024) : undefined, seconds: durationMs / 1000 } : {}),
629
+ ...(junit === undefined && (exitCode !== 0 || signal) ? { diagnostic: boundedDiagnostic(stdout, stderr) } : {}),
630
+ ...(failed ? { failure: { durationMs: Math.round(durationMs), stdoutTail: outputTail(stdout), stderrTail: outputTail(stderr) } } : {}),
631
+ };
632
+ } finally {
633
+ if (timer) clearTimeout(timer);
634
+ if (drainTimer) clearTimeout(drainTimer);
635
+ drainAbort.abort();
636
+ isolated.cleanup();
637
+ rmSync(dir, { recursive: true, force: true });
638
+ }
639
+ }
640
+
384
641
  /** GATE-REMOTE-SHARD-PLAN — identity of one remote shard. files/introducedFiles are optional: a caller that only relays
385
642
  * identity (CLI wiring) passes none, while a planner-produced shard carries its file-level attribution. */
386
643
  export interface RemoteShardSpec {
@@ -0,0 +1,54 @@
1
+ import ts from 'typescript';
2
+
3
+ /** Exclude importer expansion only when non-comment bytes and comment boundaries
4
+ * are identical. The TypeScript parser finds comments within JSDoc that a bare
5
+ * scanner can misread because their prose contains backticks. */
6
+ export function isCommentOnlySourceChange(before: string, after: string, path: string): boolean {
7
+ if (before === after || !/\.(?:[cm]?[jt]sx?)$/.test(path)) return false;
8
+ const kind = /\.(?:[cm]?[jt]sx)$/.test(path) ? ts.ScriptKind.TSX
9
+ : /\.(?:[cm]?js)$/.test(path) ? ts.ScriptKind.JS : ts.ScriptKind.TS;
10
+ const collect = (source: string): { masked: string; comments: string[] } | null => {
11
+ const file = ts.createSourceFile(path, source, ts.ScriptTarget.Latest, true, kind);
12
+ if (file.parseDiagnostics.length) return null;
13
+ const ranges = new Map<number, ts.CommentRange>();
14
+ const add = (found: ts.CommentRange[] | undefined) => {
15
+ for (const range of found ?? []) ranges.set(range.pos, range);
16
+ };
17
+ const visit = (node: ts.Node) => {
18
+ add(ts.getLeadingCommentRanges(source, node.getFullStart()));
19
+ add(ts.getTrailingCommentRanges(source, node.getEnd()));
20
+ ts.forEachChild(node, visit);
21
+ };
22
+ visit(file);
23
+ const comments: string[] = [];
24
+ let masked = '';
25
+ let end = 0;
26
+ for (const range of [...ranges.values()].sort((left, right) => left.pos - right.pos)) {
27
+ if (range.pos < end) return null;
28
+ const comment = source.slice(range.pos, range.end);
29
+ comments.push(comment);
30
+ masked += source.slice(end, range.pos) + `\u0000C${range.kind}:${comment.match(/\r\n|\r|\n/g)?.join('') ?? ''}\u0000`;
31
+ end = range.end;
32
+ }
33
+ return { masked: masked + source.slice(end), comments };
34
+ };
35
+ const old = collect(before);
36
+ const current = collect(after);
37
+ if (!old || !current || old.masked !== current.masked || old.comments.length !== current.comments.length) return false;
38
+ const directive = /^(?:\/\/\/|\/\/[#@])|@|(?:eslint|istanbul|coverage|#__PURE__|__NO_SIDE_EFFECTS__)/i;
39
+ // Any unquoted @ may be a TypeScript/JSDoc tag, including newly introduced ones.
40
+ // A backticked example username such as `@example_bot` is prose, not a tag.
41
+ const semanticText = (comment: string) => comment.trim().replace(/`[^`\r\n]*`/g, '');
42
+ let changed = false;
43
+ for (let index = 0; index < old.comments.length; index++) {
44
+ const prior = old.comments[index]!;
45
+ const next = current.comments[index]!;
46
+ if (prior === next) continue;
47
+ changed = true;
48
+ // Ordinary inline block comments and line comments stay in the importer set.
49
+ // This exemption is intentionally limited to JSDoc prose edits.
50
+ if (!prior.startsWith('/**') || !next.startsWith('/**')) return false;
51
+ if (directive.test(semanticText(prior)) || directive.test(semanticText(next))) return false;
52
+ }
53
+ return changed;
54
+ }
@@ -319,6 +319,12 @@ export function recordShadowDoctorReevaluation(runId: string, dir?: string): {
319
319
  const visit = entries[visitIndex]!;
320
320
 
321
321
  const evidence = typeof visit.data.evidence === 'string' ? visit.data.evidence.trim() : '';
322
+ // The pack selected for this run was observed before the visit. Keep its actual slice ids;
323
+ // an absent or malformed observation must remain unknown, never imply an empty pack.
324
+ const pack = entries.slice(0, visitIndex).reverse().find((entry) => entry.event === 'knowhow-pack');
325
+ const packIds = Array.isArray(pack?.data?.ids) && pack.data.ids.length > 0
326
+ && pack.data.ids.every((id: unknown) => typeof id === 'string' && id.length > 0)
327
+ ? pack.data.ids as string[] : 'unknown';
322
328
  const rx = evidence ? 're-evaluate-member' as const : null;
323
329
  const outcome = evidence ? 'shadow-recorded' as const : 'needs-evidence' as const;
324
330
  const data: Record<string, unknown> = {
@@ -326,6 +332,7 @@ export function recordShadowDoctorReevaluation(runId: string, dir?: string): {
326
332
  visitIndex,
327
333
  visit: { runId, from: visit.data.from, symptom: 'admit-starved', timestamp: visit.timestamp, evidence: evidence || null },
328
334
  diagnosis: evidence ? 'admit-starved-reported' : 'evidence-unmeasured',
335
+ knowhowPackSliceIds: packIds,
329
336
  rx,
330
337
  cost: { estimatedTokens: 0, usedTokens: 0 },
331
338
  outcome,
@@ -337,6 +344,24 @@ export function recordShadowDoctorReevaluation(runId: string, dir?: string): {
337
344
  return { status: 'recorded', ...(rx ? { rx } : {}), outcome, visitIndex };
338
345
  }
339
346
 
347
+ /** Guardian shadow tick: prescribe only for ledgers with an admit-starved visit. Repeated ticks are idempotent. */
348
+ export function recordPendingShadowDoctorReevaluations(dir?: string): { recorded: number; alreadyRecorded: number } {
349
+ let recorded = 0;
350
+ let alreadyRecorded = 0;
351
+ for (const ledger of listRunLedgers(dir ? { dir } : {}).matches) {
352
+ const visits = ledger.entries.flatMap((entry, index) => entry.event === 'doctor-visit' && entry.data.symptom === 'admit-starved' ? [index] : []);
353
+ if (visits.length === 0) continue;
354
+ const prescribed = new Set(ledger.entries.flatMap(entry => entry.event === 'doctor-rx' && entry.data.shadow === true
355
+ && typeof entry.data.visitIndex === 'number' ? [entry.data.visitIndex] : []));
356
+ if (visits.every(index => prescribed.has(index))) { alreadyRecorded++; continue; }
357
+ const result = recordShadowDoctorReevaluation(ledger.runId, ledger.ledgerDirectory);
358
+ if (result.status === 'recorded') recorded++;
359
+ else if (result.status === 'already-recorded') alreadyRecorded++;
360
+ }
361
+ debug.log('run-doctor', 'shadow-tick', { recorded, alreadyRecorded });
362
+ return { recorded, alreadyRecorded };
363
+ }
364
+
340
365
  /** OP 손판정 한 건 — 시각과 결과만 받는다(그 밖의 입력은 받지 않는다). */
341
366
  export interface DoctorOpJudgment {
342
367
  /** 손판정 시각(ISO). */
@@ -85,7 +85,7 @@ export interface GateArtifactSummary extends GateArtifactCounts {
85
85
  verdict: string | null;
86
86
  /** 판정 줄(`tests: …` / `[gate-baseline] …` / `shards: unmeasured (…)`) 그대로. */
87
87
  verdictLine?: string;
88
- timeoutRechecks?: readonly { name: string; file: string; result: 'pass' | 'timeout' | 'failure' | 'unknown'; elapsedMs: number; rawResultLine: string }[];
88
+ timeoutRechecks?: readonly { name: string; file: string; originalDiagnostic?: string; result: 'pass' | 'timeout' | 'failure' | 'unknown'; elapsedMs: number; rawResultLine: string }[];
89
89
  exitCode: number;
90
90
  /** 정수 칸 중 하나라도 null 일 때만 — 왜 못 셌나(한 줄). */
91
91
  countsUnavailableReason?: string;
@@ -130,7 +130,7 @@ export interface GateArtifactInput {
130
130
  testFiles: readonly string[];
131
131
  verdict: string | null;
132
132
  verdictLine?: string;
133
- timeoutRechecks?: readonly { name: string; file: string; result: 'pass' | 'timeout' | 'failure' | 'unknown'; elapsedMs: number; rawResultLine: string }[];
133
+ timeoutRechecks?: readonly { name: string; file: string; originalDiagnostic: string; result: 'pass' | 'timeout' | 'failure' | 'unknown'; elapsedMs: number; rawResultLine: string }[];
134
134
  exitCode: number;
135
135
  /** 판정 정수(못 센 칸은 null ⊕ countsUnavailableReason). 안 주면 다섯 다 null · 이유 'not recorded' — 칸은 «늘» 쓴다. */
136
136
  counts?: GateArtifactCounts;
@@ -9,7 +9,7 @@ import type { GitRunResult } from '../git-fs/retry.js';
9
9
  import { linkWorktreeDependencies, worktreeAddTimeoutForRepo } from '../git-fs/worktree.js';
10
10
  import { reapStaleGateWorktrees } from './gate-baseline-reap.js';
11
11
 
12
- export type GateFailureAttribution = 'introduced' | 'preexisting' | 'unknown' | 'precondition-unmet' | 'flaky-timeout' | 'flaky-rerun' | 'timeout-recheck-passed';
12
+ export type GateFailureAttribution = 'introduced' | 'preexisting' | 'unknown' | 'precondition-unmet' | 'flaky-timeout' | 'flaky-rerun' | 'load-timeout';
13
13
  export type GateBaselinePresence = 'present' | 'missing' | 'unknown';
14
14
  export type TimeoutVariability = 'may-vary' | 'same' | 'unknown';
15
15
 
@@ -73,12 +73,13 @@ export interface GateBaselineReport extends GateBaselineSummary {
73
73
  baselineStatus: BaselineProcessStatus;
74
74
  log: string;
75
75
  timeoutRechecks?: TimeoutRecheckRecord[];
76
- timeoutRecheckPassed?: number;
76
+ loadTimeout?: number;
77
77
  }
78
78
 
79
79
  export interface TimeoutRecheckRecord {
80
80
  name: string;
81
81
  file: string;
82
+ originalDiagnostic: string;
82
83
  result: 'pass' | 'timeout' | 'failure' | 'unknown';
83
84
  elapsedMs: number;
84
85
  rawResultLine: string;
@@ -707,7 +708,7 @@ function summarizeGateBaseline(failures: readonly GateTestFailure[]): GateBaseli
707
708
  if (failure.attribution === 'flaky-rerun') {
708
709
  return { ...withPresence, flakyRerun: withPresence.flakyRerun + 1 };
709
710
  }
710
- if (failure.attribution === 'timeout-recheck-passed') {
711
+ if (failure.attribution === 'load-timeout') {
711
712
  return withPresence;
712
713
  }
713
714
  const withTimeoutRegression = failure.timeoutRegression === 'passed-at-base'
@@ -741,10 +742,15 @@ export function recheckTimeoutOnlyIntroducedFailures(
741
742
  report: GateBaselineReport,
742
743
  run: (cwd: string, file: string, name: string, timeoutMs: number) => { observation?: TimeoutRerunObservation; elapsedMs: number; output: string } = runTimeoutRecheck,
743
744
  ): GateBaselineReport {
745
+ const timeoutOnlyDiagnostic = (diagnostic: string | undefined): boolean => {
746
+ if (!diagnostic) return false;
747
+ const lines = diagnostic.split('\n').map((line) => line.trim()).filter(Boolean);
748
+ return lines.length === 1 && /^\^ this test timed out after \d+ms\.?$/i.test(lines[0]!);
749
+ };
744
750
  const eligible = report.failures.length > 0
745
751
  && report.introduced === report.failures.length
746
752
  && report.failures.every((failure) => failure.attribution === 'introduced' && !!failure.file
747
- && /\bthis test timed out after \d+ms\b/i.test(failure.diagnostic ?? ''));
753
+ && timeoutOnlyDiagnostic(failure.diagnostic));
748
754
  if (!eligible) return report;
749
755
  const records: TimeoutRecheckRecord[] = [];
750
756
  const failures = report.failures.map((failure) => {
@@ -754,19 +760,19 @@ export function recheckTimeoutOnlyIntroducedFailures(
754
760
  const { observation, elapsedMs, output } = run(cwd, failure.file, name, 60_000);
755
761
  const result = observation ?? 'unknown';
756
762
  const record: TimeoutRecheckRecord = {
757
- name: failure.name, file: failure.file, result, elapsedMs,
763
+ name: failure.name, file: failure.file, originalDiagnostic: failure.diagnostic ?? '', result, elapsedMs,
758
764
  rawResultLine: flattenControlChars(redactSecretText(output)).slice(-500),
759
765
  };
760
766
  records.push(record);
761
767
  debug.log('gate.baseline', 'timeout-recheck', record);
762
- return result === 'pass' ? { ...failure, attribution: 'timeout-recheck-passed' as const } : failure;
768
+ return result === 'pass' ? { ...failure, attribution: 'load-timeout' as const } : failure;
763
769
  });
764
770
  return {
765
771
  ...report,
766
772
  ...summarizeGateBaseline(failures),
767
773
  failures,
768
774
  timeoutRechecks: records,
769
- timeoutRecheckPassed: failures.filter((failure) => failure.attribution === 'timeout-recheck-passed').length,
775
+ loadTimeout: failures.filter((failure) => failure.attribution === 'load-timeout').length,
770
776
  };
771
777
  }
772
778
 
@@ -1077,6 +1083,35 @@ export function withBaselineWorktree<T>(cwd: string, baseRef: string, run: (base
1077
1083
  }
1078
1084
  }
1079
1085
 
1086
+ /** Keep the baseline checkout attached until every asynchronous shard has settled. */
1087
+ export async function withBaselineWorktreeAsync<T>(cwd: string, baseRef: string, run: (baselineDir: string) => Promise<T>): Promise<T | BaselineProcessResult> {
1088
+ reapBeforeGateAdd(cwd);
1089
+ const baselineDir = mkdtempSync(join(tmpdir(), 'elanous-gate-baseline-'));
1090
+ let attached = false;
1091
+ try {
1092
+ const started = Date.now();
1093
+ const addTimeout = worktreeAddTimeoutForRepo(cwd, undefined, baseRef);
1094
+ const add = runGitCommand(cwd, gateWorktreeAddArgs(baselineDir, baseRef), { encoding: 'utf8', timeout: addTimeout.ms, killSignal: 'SIGKILL' });
1095
+ const elapsedMs = Date.now() - started;
1096
+ debug.log('self-implement.gate-baseline', 'worktree-add-result', {
1097
+ phase: 'baseline', status: add.status, signal: add.signal ?? null, errorCode: add.errorCode ?? null,
1098
+ elapsedMs, timeoutMs: addTimeout.ms, trackedFileCount: addTimeout.trackedFileCount,
1099
+ timeoutSource: addTimeout.source, parentRssBytes: process.memoryUsage().rss,
1100
+ cgroupMemoryCurrentBytes: cgroupMemoryBytes('memory.current'), cgroupMemoryLimitBytes: cgroupMemoryBytes('memory.max'),
1101
+ });
1102
+ if (add.status !== 0) return classifyBaselineWorktreeAddFailure(add, elapsedMs, addTimeout.ms, worktreeAddFailureContext(cwd, baselineDir, baseRef));
1103
+ attached = true;
1104
+ linkDependencies(cwd, baselineDir);
1105
+ return await run(baselineDir);
1106
+ } catch (error) {
1107
+ return { status: 'unknown', unknownReason: 'infrastructure-failure', childResponsibility: 'none', log: `baseline setup failed: ${String(error)}` };
1108
+ } finally {
1109
+ removeGateWorktree(cwd, baselineDir, !attached);
1110
+ try { rmSync(baselineDir, { recursive: true, force: true }); }
1111
+ catch (error) { debug.log('self-implement', 'gate.baseline.cleanup', { stage: 'exception', dir: baselineDir, error: String(error) }); }
1112
+ }
1113
+ }
1114
+
1080
1115
  function linkDependencies(cwd: string, dir: string): void {
1081
1116
  const dependencyLinks = linkWorktreeDependencies(cwd, dir, ['node_modules']);
1082
1117
  debug.log('self-implement', 'gate.baseline.dependencies', { cwd, dir, dependencyLinks });
@@ -1570,7 +1605,7 @@ export function formatGateBaselineNote(report: GateBaselineReport, unrunImporter
1570
1605
  + `, unknown=${report.unknown}, precondition-unmet=${report.preconditionUnmet}`
1571
1606
  + (report.timedOut > 0 ? `, timed-out=${report.timedOut}` : '')
1572
1607
  + (report.flakyRerun > 0 ? `, flaky-rerun=${report.flakyRerun}` : '')
1573
- + ((report.timeoutRecheckPassed ?? 0) > 0 ? `, timeout-recheck-passed=${report.timeoutRecheckPassed}` : '')
1608
+ + ((report.loadTimeout ?? 0) > 0 ? `, load-timeout=${report.loadTimeout}` : '')
1574
1609
  + (runId ? `, run=${runId}` : '')
1575
1610
  + (report.missingAtBase > 0 ? `, missing-at-base=${report.missingAtBase}` : '');
1576
1611
  const lines = report.failures.map((failure) => `- ${failure.attribution}: ${failure.name}`
@@ -1592,7 +1627,7 @@ export function formatGateBaselineNote(report: GateBaselineReport, unrunImporter
1592
1627
  ? `\n[gate-baseline] rerun not-run=${report.rerunNotRun}`
1593
1628
  : '';
1594
1629
  const timeoutRecheckLines = report.timeoutRechecks?.length
1595
- ? `\n[gate.baseline.timeout-recheck] ${report.timeoutRechecks.map((item) => `${item.name}: ${item.result} elapsed=${item.elapsedMs}ms · ${item.rawResultLine}`).join('\n')}`
1630
+ ? `\n[gate.baseline.timeout-recheck] ${report.timeoutRechecks.map((item) => `${item.name}: ${item.result} elapsed=${item.elapsedMs}ms · original=${flattenControlChars(item.originalDiagnostic).slice(-500)} · ${item.rawResultLine}`).join('\n')}`
1596
1631
  : '';
1597
1632
  return `${head}\n${lines.join('\n')}\n${report.log}`
1598
1633
  + timedOutLine