elanous 0.2.43 → 0.2.44

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 (544) 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/{Om5xS9jpjSXJCeTNGYEi4 → HMXsxdy5MIIcHPMHv1wD4}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{3557ac4a.c8931684475018ad.js → 08334415.f0e80896acbef722.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/1032-78ba4f6391258cab.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1082-53f86a26e03d309d.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1109-7d0e264f6f2edbc7.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1124-7c26330402481143.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/118.2a89982fe4276880.js +23 -0
  10. package/apps/pwa/out/_next/static/chunks/1244.6c435dbf1bf21d8a.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1252.9e665904d3aa3b1a.js +32 -0
  12. package/apps/pwa/out/_next/static/chunks/1266.a46cc33cb6a72d75.js +104 -0
  13. package/apps/pwa/out/_next/static/chunks/{3955.6922286237f2ac2b.js → 1306.967240ede9a0f757.js} +2 -2
  14. package/apps/pwa/out/_next/static/chunks/1344.3b95f3bd1b77a3fe.js +94 -0
  15. package/apps/pwa/out/_next/static/chunks/{5628.6ddb2d5ffba4ff4c.js → 1401.22dfe92640a2b1ac.js} +4 -4
  16. package/apps/pwa/out/_next/static/chunks/1431-f7c78bd5be21e011.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/1451-cdd35a8a0b31834b.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/{2573.387a707f6f9d720c.js → 1694.18debfd77562e56d.js} +2 -2
  19. package/apps/pwa/out/_next/static/chunks/1708-f03d587b7a7545c8.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/1775-fa7152bdeff6c95f.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/178-4da509cd7266672a.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/{7910-6f139bcafd238b9f.js → 1850-522de4ee34957210.js} +1 -1
  23. package/apps/pwa/out/_next/static/chunks/1876-c6f6e0ddcc76c6a1.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/1976.097066b072432242.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/{1406.a1dc2ab6f8449374.js → 1978.eeb60a606dc5deac.js} +2 -2
  26. package/apps/pwa/out/_next/static/chunks/{3402.44b565b314f2263c.js → 2043.e233e3b5a3e790f5.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/2150.71b94e3348107c83.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2158.ebc6fc5a10280ab7.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/{3694.e0099884345f0198.js → 2216.802962c04f40a26e.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/2294.7890edcfa046c97d.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/235.c89aaae4bcd6233a.js +74 -0
  32. package/apps/pwa/out/_next/static/chunks/239.de075467b5523469.js +287 -0
  33. package/apps/pwa/out/_next/static/chunks/{1200.6a37c202f9f17e9a.js → 249.ba7051590d603c8f.js} +3 -3
  34. package/apps/pwa/out/_next/static/chunks/2571.a6ac4e26c8618403.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/2610.e149cd564a08913e.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/2705.9816f3c244f8b85f.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/2801.afeb8a4dae22f85f.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/{3935.16701e33f8982dc9.js → 2954.bbefc95d6b20e0d8.js} +1 -1
  39. package/apps/pwa/out/_next/static/chunks/{aa57532f.510551854ff239b1.js → 2e0f720a.a0697c08e3806a60.js} +1 -1
  40. package/apps/pwa/out/_next/static/chunks/3042.96ec235fe41c8d4e.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3097-8e358f158acef46b.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3205-93b1abe28b4fb16a.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3273.b4434f0dcae7eb29.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3311.9cbc43ea0c90d60c.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{5930.8b4df3b46c32b05a.js → 3349.b5f09ee474d9533e.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/{5866.366966af47fdde5d.js → 3503.a47a9755fb4d97b0.js} +1 -1
  47. package/apps/pwa/out/_next/static/chunks/3506-5f429b3b7e1392b0.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/{7900.096f455c7c1efc53.js → 3843.bad404d008893291.js} +2 -2
  49. package/apps/pwa/out/_next/static/chunks/3877-4b40e530b47e3bf9.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/435-ce2958253cf7de61.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/{8588.d1c6a2903727ce87.js → 4393.28fa5228d0eec217.js} +3 -3
  52. package/apps/pwa/out/_next/static/chunks/4404.7281c847c6e10dfc.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/{8062-7cd0bcc7f01455ba.js → 4415-b9d6a90960920a4a.js} +3 -3
  54. package/apps/pwa/out/_next/static/chunks/{8313-dfa1021bb58a46d6.js → 447-5b304de1fe098f43.js} +1 -1
  55. package/apps/pwa/out/_next/static/chunks/4484-8ebea83d431e6fae.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/{6944.309f4e3ea54d1537.js → 4502.bdcc877abd437a05.js} +1 -1
  57. package/apps/pwa/out/_next/static/chunks/4599-f95790fc5c65b8df.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/{3072.01338851ca21a6f7.js → 46.57c783fa4884714f.js} +2 -2
  59. package/apps/pwa/out/_next/static/chunks/463-b9114e411f33728e.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/4659.a57d1f0c5d754cd2.js +36 -0
  61. package/apps/pwa/out/_next/static/chunks/4722-a847e7a28115035f.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/{8986.8e2e4efbfa655c59.js → 4757.67c6d7473a038e78.js} +1 -1
  63. package/apps/pwa/out/_next/static/chunks/4874-c86f878ec4502ad3.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/4891.3f80ba517a3b2373.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/{8205.282ca4bb62d54a0a.js → 4998.810ca8833084caa9.js} +2 -2
  66. package/apps/pwa/out/_next/static/chunks/4f98febc.ea5841d4d616bfb2.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/{5789.2da35c258292e1e5.js → 5052.7dbb12a55d4f18f5.js} +1 -1
  68. package/apps/pwa/out/_next/static/chunks/5166-ca73b3e361085a6d.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/5180-039f4a18b07ad387.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/5232.5a2ce4daf7a9e11d.js +115 -0
  71. package/apps/pwa/out/_next/static/chunks/{9770.5f75bc6088b16109.js → 5439.3fec6dbce29ecb36.js} +1 -1
  72. package/apps/pwa/out/_next/static/chunks/{1313-19f737e0222c4444.js → 5612-074d9a5e00dfac6a.js} +1 -1
  73. package/apps/pwa/out/_next/static/chunks/5675-01989d524a84c505.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/5751.af641a1adf5ec697.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/5758-c6cb98714d18ab0c.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/578eded8.b582637306e16964.js +122 -0
  77. package/apps/pwa/out/_next/static/chunks/{3969.272ee7f9fd6c62e5.js → 5790.5eb06a653ebd8571.js} +1 -1
  78. package/apps/pwa/out/_next/static/chunks/5853-4033e5bd5afbe06b.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/5904.97d70bb7f46b2db7.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/{6540.c7bef57ad8f90a87.js → 5989.7ecd362c5c44b747.js} +3 -3
  81. package/apps/pwa/out/_next/static/chunks/{0ad6802e.ae7afb63fdcb4491.js → 5a34fb2f.52f1b4e1baebb48a.js} +3 -3
  82. package/apps/pwa/out/_next/static/chunks/{0966f8a1.745fcd44f64a87ea.js → 5a5078f8.2099200e5ea95e16.js} +1 -1
  83. package/apps/pwa/out/_next/static/chunks/6036-c302c34ff0b3d410.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/606.ef81c313381f4264.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/616.1af54a928b1ba704.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/6201.bc936f71f613a8e9.js +41 -0
  87. package/apps/pwa/out/_next/static/chunks/6204-fdc86e0e64c4f92d.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/{2144.25b292396712196d.js → 6245.1182e007e9d230d9.js} +2 -2
  89. package/apps/pwa/out/_next/static/chunks/{363bfab3.9623b9f89363541f.js → 63699a35.17262e162bc514b2.js} +1 -1
  90. package/apps/pwa/out/_next/static/chunks/6420.494801a80030160c.js +27 -0
  91. package/apps/pwa/out/_next/static/chunks/{d96660fb.cbc21a2a88539dbb.js → 6549dad0.2740b25e51bf8f05.js} +7 -7
  92. package/apps/pwa/out/_next/static/chunks/{5564.9e72532188f57586.js → 6881.9e7955847640c7fe.js} +4 -4
  93. package/apps/pwa/out/_next/static/chunks/6931.fcdfb94141e67b3d.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/6991-8e081c6ce38c0ba1.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{3903.3ef4656c67572764.js → 7010.1bbd17a7f2b3e376.js} +1 -1
  96. package/apps/pwa/out/_next/static/chunks/7029.d1466acf55fae2ed.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/7152-a123aa8e129c131f.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7455.196168fffac3b9c4.js +24 -0
  99. package/apps/pwa/out/_next/static/chunks/7638.6ca4770dd1129138.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/7649-f37d76260e5e2a5a.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/{2312.0c8b61e22d3136d7.js → 7679.32c40cdd14f20b4a.js} +1 -1
  102. package/apps/pwa/out/_next/static/chunks/7751.04bfbd16b4c6cd0a.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/7864.b1ff31d4030b8994.js +148 -0
  104. package/apps/pwa/out/_next/static/chunks/7869-c47bd2c075c1fefa.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/{4199.ce86b281fd0a60b7.js → 8442.2f09ca969d631615.js} +1 -1
  106. package/apps/pwa/out/_next/static/chunks/8445.2738dbd59a78c78c.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8447.5510c439f9938c6d.js +286 -0
  108. package/apps/pwa/out/_next/static/chunks/8551.f762945c2cda2e95.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/8635-57a9d8d9db70f4f1.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/{fb7d20d5-6892502b6ee39ca6.js → 86961958-4b0689a5048f756b.js} +1 -1
  111. package/apps/pwa/out/_next/static/chunks/8709.3c6019bb18f8554f.js +8 -0
  112. package/apps/pwa/out/_next/static/chunks/8759.c999528a0a907bf6.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/87f498e5-0881de09f2e44707.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/8843.c3197f904c952b81.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/{cb0f8df8.09a4a6be97e3fc5f.js → 892fd990.456232f326cc39c2.js} +1 -1
  116. package/apps/pwa/out/_next/static/chunks/{837-81336ebaca8198a8.js → 8965-135a2c9eaa2464cb.js} +1 -1
  117. package/apps/pwa/out/_next/static/chunks/8971-8d3b9c96f8a6c958.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9059.c8598d96f8e5e9cd.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9115.90447ae198b84eae.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9147.d9b0a02e0babc9b4.js +93 -0
  121. package/apps/pwa/out/_next/static/chunks/9204-83075f4b70c61cdc.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/9244-c32ef14b5dc72bdf.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/930.2a9a30f964350c66.js +90 -0
  124. package/apps/pwa/out/_next/static/chunks/{8637.90f92d5c8db4732c.js → 9398.1f56e3f17795f43f.js} +1 -1
  125. package/apps/pwa/out/_next/static/chunks/9527.3e5ad31c891c5fcb.js +79 -0
  126. package/apps/pwa/out/_next/static/chunks/9571-4ac933e774d1225c.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-9fc644de2d8edae3.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/approvals/page-0c9dace2db62bee8.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f5e65c3dc9d89f2a.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/board/page-2a9c19b9a140b7b1.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/botlab/page-61533ad92141adfb.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/bots/page-112004ced6fd0329.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/ceo/page-f733318c237a49d8.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/chat/page-51ea677d2d33bbc0.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/consult/page-428b41f2f9566e3c.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/control/page-1b29396ea90a61e5.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/decisions/page-cf83ec613ac904bf.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/design-check/page-3f4c0ecbc284bb5f.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/editor/page-b63c322f54f70cc6.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/exec/page-fe328c4ee9aac6b4.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/field/page-bfb855c584f0fb98.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/healthz/route-9fc644de2d8edae3.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/inside/page-47b1710c110eabd7.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/intake/page-42895214458bc6d2.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/layout-d03de0ebd8366e23.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/live/page-3ed6c47e4b1c61c2.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/live-run/page-ae653e9bf261c738.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/loops/page-23f3f0a0209c0ac4.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/market/page-88c691273aae66f9.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e187ac52a95538b3.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/morning/page-6e45828daed1295e.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/not-found-edb5d7287bb46186.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/observatory/page-4a7eaacd93c3f6a5.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3ca073d43d74cc84.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1e9fee67b1199436.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-df1283ea963c6816.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/outputs/page-19fcf8d8301ccd18.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/page-5ab699e0303bbb40.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/reflection/page-7cde0d29756984c5.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-9d4c598e8ee22f7a.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/sessions/page-cc1609a71f44ec62.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-7659a9a1345bfaa9.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/settings/page-0afef60ecc0c4af5.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-a3553949f8f34f5f.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/setup/layout-9fc644de2d8edae3.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/setup/page-057a69702f3c67c7.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/share/page-c0f0e570f3f74c73.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/showroom/page-1825071ae34e3b89.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/tasks/page-6244e3e135d8ccfc.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/term/{page-0a815f34367b6db6.js → page-da787e8a10b8a82e.js} +1 -1
  171. package/apps/pwa/out/_next/static/chunks/app/today/page-1316d32498e2be42.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/trace/page-4df94572e343de2e.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/vault/page-708969f7475e88c1.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-c58add08c919a1dc.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/app/workflows/page-a24847f45e5d5bf9.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/app/workspace/page-acfec65a3a60e22e.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-3dfc598e6fbde245.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/framework-c658a626118411b7.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-4c73685fd891445b.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-6310f7e5de7dd01d.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-51c326bf48610be1.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-d0beadf754da59b0.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-acd243bfbf3f6732.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/overlays/README.md +6 -0
  278. package/graphs/release/release-loop.yaml +33 -17
  279. package/graphs/units/verbs/make-doc.yaml +1 -0
  280. package/package.json +1 -1
  281. package/scripts/bench-metering-plan.ts +229 -0
  282. package/scripts/demo/demo1104-parallel-host.ts +56 -0
  283. package/scripts/demo/demo1104-parallel.ts +72 -0
  284. package/scripts/public-leak-baseline.txt +0 -1
  285. package/scripts/release-loop/docs-node.ts +4 -2
  286. package/scripts/release-loop/gate-image-pin.ts +116 -2
  287. package/scripts/release-loop/gate-node.ts +217 -25
  288. package/scripts/release-loop/gate-progress-sim.ts +73 -0
  289. package/scripts/release-loop/notes-repair.ts +18 -1
  290. package/scripts/release-loop/preflight.ts +188 -8
  291. package/scripts/release-loop/render-warm-control-manifest.ts +22 -0
  292. package/scripts/release-loop/resume-release.ts +9 -7
  293. package/scripts/release-loop/resume.ts +13 -4
  294. package/scripts/release-loop/warm-control-forward.ts +178 -0
  295. package/scripts/retro-cycle.ts +30 -8
  296. package/scripts/rhythm/daily.ts +4 -1
  297. package/scripts/rhythm/linear-progress-sync.ts +28 -15
  298. package/scripts/ux-sim.ts +7 -1
  299. package/scripts/warm-pool-provider-config.ts +6 -1
  300. package/src/agent-mission/grok-auth-status.ts +78 -18
  301. package/src/agent-mission/mission-out.ts +2 -2
  302. package/src/agent-substrate/pr-reviewer.ts +147 -11
  303. package/src/agent-substrate/self-review-cli.ts +10 -2
  304. package/src/auto-research/research-fanout.ts +221 -0
  305. package/src/auto-research/research-turn.ts +282 -36
  306. package/src/autopilot/mission-codebase-gate.ts +7 -3
  307. package/src/cli/control-cli.ts +15 -6
  308. package/src/cli/log-event-names.ts +8 -0
  309. package/src/cli/setup-keys.ts +20 -8
  310. package/src/cli/tui-test-cli.ts +9 -5
  311. package/src/control-plane/ledger.ts +42 -4
  312. package/src/control-plane/member-tokens.ts +25 -2
  313. package/src/control-plane/ports.ts +8 -3
  314. package/src/control-plane/server.ts +26 -5
  315. package/src/core-turn/research-policy.ts +7 -1
  316. package/src/core-turn/run-core-turn.ts +186 -39
  317. package/src/core-turn/types.ts +2 -0
  318. package/src/dashboard/classic-sidetab-mission-job.ts +113 -24
  319. package/src/dashboard/classic-sidetab-mission-pair.ts +3 -2
  320. package/src/dashboard/classic-sidetab-mission-trio.ts +35 -12
  321. package/src/dashboard/classic-sidetab-mission.ts +2 -0
  322. package/src/dashboard/index.ts +9 -1
  323. package/src/dashboard/sidetab-runtime.ts +2 -0
  324. package/src/dashboard/visible-mission-diagnostics.ts +16 -0
  325. package/src/domains/retro-cycle-observation.ts +43 -0
  326. package/src/domains/retro-cycle.ts +13 -2
  327. package/src/domains/retro-proposals.ts +92 -0
  328. package/src/domains/retro-report.ts +6 -1
  329. package/src/graph-runner/graph-cli.ts +24 -1
  330. package/src/graph-runner/graph-grow-llm.ts +3 -1
  331. package/src/graph-runner/runner.ts +226 -30
  332. package/src/harness/harness-cli-command.ts +4 -2
  333. package/src/harness/harness-pod-dispatch.ts +3 -0
  334. package/src/index.ts +2 -2
  335. package/src/llm/child-first-llm-observation.ts +112 -0
  336. package/src/llm/provider-credentials.ts +60 -4
  337. package/src/llm/provider-failure-evidence.ts +44 -0
  338. package/src/llm.ts +170 -11
  339. package/src/mcp/client.ts +7 -0
  340. package/src/mcp/proxy-runtime.ts +6 -1
  341. package/src/mcp/server.ts +54 -0
  342. package/src/native-tool-catalog.ts +2 -2
  343. package/src/nexus/api/consult-requests.ts +18 -6
  344. package/src/nexus/api/discord-trigger-bot.ts +6 -6
  345. package/src/nexus/api/graphs-api.ts +4 -2
  346. package/src/nexus/api/grokbot-trigger-bot.ts +206 -0
  347. package/src/nexus/api/telegram-trigger-bot.ts +6 -6
  348. package/src/nexus/boot/register-mcp-clients.ts +114 -8
  349. package/src/nexus/index.ts +15 -0
  350. package/src/nexus/outbound/grokbot-adapter.ts +71 -0
  351. package/src/nexus/outbound/router.ts +33 -13
  352. package/src/oauth/codex-owner-mirror.ts +47 -10
  353. package/src/onboarding/first-run.ts +44 -6
  354. package/src/preview/terminal.ts +22 -7
  355. package/src/prompt-enhance/enhance.ts +10 -0
  356. package/src/pty-shell/pty-write-provenance.ts +21 -3
  357. package/src/pty-shell/registry.ts +9 -2
  358. package/src/release-loop/proposal-auto-place.ts +83 -0
  359. package/src/research/axis-fanout.ts +40 -5
  360. package/src/research/lenses/second-order.ts +312 -0
  361. package/src/self-dev/dev-cli.ts +3 -1
  362. package/src/self-dev/draft-sweep.ts +31 -10
  363. package/src/self-dev/draft-triage-rules.ts +60 -3
  364. package/src/self-dev/run-supervisor.ts +152 -2
  365. package/src/self-implement/goal-author.ts +208 -23
  366. package/src/self-implement/graph-overlay-yaml.ts +151 -0
  367. package/src/self-implement/graph-yaml.ts +68 -2
  368. package/src/self-implement/orchestrator.ts +62 -15
  369. package/src/self-implement/test-scenario-request.ts +37 -6
  370. package/src/session/chat.ts +2 -2
  371. package/src/session-runtime/index.ts +37 -5
  372. package/src/sidetab-core/model.ts +205 -10
  373. package/src/sidetab-core/visible-agent-mission-pair.ts +51 -0
  374. package/src/sidetab-core/visible-agent-mission.ts +105 -47
  375. package/src/skills/tools/omni-search.ts +4 -2
  376. package/src/task-agent/parent-host.ts +19 -1
  377. package/src/task-agent/recall-inject.ts +98 -0
  378. package/src/task-agent/task-hand.ts +26 -7
  379. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +19 -1
  380. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +15 -0
  381. package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +21 -9
  382. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +1 -1
  383. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +460 -96
  384. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +45 -3
  385. package/src/task-orchestrator/surfaces/self-implement-pod.ts +38 -8
  386. package/src/tool-hints/gate.ts +45 -14
  387. package/src/tool-hints/signals.ts +1 -1
  388. package/src/tool-hints/types.ts +2 -0
  389. package/src/tool-runtime/browser-hand-runtime.ts +11 -1
  390. package/src/tool-runtime/browser-runtime.ts +31 -18
  391. package/src/tool-runtime/elanous-linear-secretary-runtime.ts +152 -36
  392. package/src/tool-runtime/types.ts +2 -0
  393. package/src/tui/entry.ts +27 -7
  394. package/src/tui/sidetab/attach.ts +112 -0
  395. package/src/tui/sidetab/list.ts +3 -2
  396. package/src/tui-client/next-dashboard-runtime.ts +52 -0
  397. package/src/ux-sim/draft-inventory-builder.ts +2 -1
  398. package/src/ux-sim/linear-secretary.ts +4 -12
  399. package/src/ux-sim/mock-scenario-catalog.json +32 -29
  400. package/src/ux-sim/mock-scenario-catalog.ts +55 -3
  401. package/src/ux-sim/release-sim-rig.ts +62 -18
  402. package/src/ux-sim/service-key-setup.ts +63 -0
  403. package/src/version/packed-revision.json +1 -1
  404. package/apps/pwa/out/_next/static/chunks/114.2b90424d1a3ce84c.js +0 -1
  405. package/apps/pwa/out/_next/static/chunks/1151-5c2bb8f002ca2dd6.js +0 -1
  406. package/apps/pwa/out/_next/static/chunks/1261-a616d5728e02e624.js +0 -1
  407. package/apps/pwa/out/_next/static/chunks/1357.3bbef3976c37f94a.js +0 -1
  408. package/apps/pwa/out/_next/static/chunks/1362-20adddfaf662b0fa.js +0 -1
  409. package/apps/pwa/out/_next/static/chunks/1737-9491fc6ab29b9ec6.js +0 -1
  410. package/apps/pwa/out/_next/static/chunks/1803-4f91a8e7dcaf042c.js +0 -1
  411. package/apps/pwa/out/_next/static/chunks/1961.a81b12872c3e93a9.js +0 -23
  412. package/apps/pwa/out/_next/static/chunks/1970cf59.2d4d8ce5d6c81853.js +0 -1
  413. package/apps/pwa/out/_next/static/chunks/1971-8890f3962ba7ee0a.js +0 -1
  414. package/apps/pwa/out/_next/static/chunks/2073-ba274e00e4f9efb4.js +0 -1
  415. package/apps/pwa/out/_next/static/chunks/2268-53861f339e0b65a2.js +0 -1
  416. package/apps/pwa/out/_next/static/chunks/273.f156eee28f11af77.js +0 -1
  417. package/apps/pwa/out/_next/static/chunks/2873.d2140e5a82546401.js +0 -1
  418. package/apps/pwa/out/_next/static/chunks/3091.a5a4143dea33d197.js +0 -90
  419. package/apps/pwa/out/_next/static/chunks/3095.dc44586a5f83b86d.js +0 -1
  420. package/apps/pwa/out/_next/static/chunks/3113.d7472bbc27d580c7.js +0 -1
  421. package/apps/pwa/out/_next/static/chunks/3228-9650b6447b6fa288.js +0 -1
  422. package/apps/pwa/out/_next/static/chunks/360.ae9f9f4c33c395e8.js +0 -79
  423. package/apps/pwa/out/_next/static/chunks/3638.80412ea63aae8f3f.js +0 -286
  424. package/apps/pwa/out/_next/static/chunks/3744.54f87db52acfd1ab.js +0 -1
  425. package/apps/pwa/out/_next/static/chunks/4311-6dd3144002cc0c2d.js +0 -1
  426. package/apps/pwa/out/_next/static/chunks/4426-2b230fad00c88930.js +0 -1
  427. package/apps/pwa/out/_next/static/chunks/4445.7990c76b3751a918.js +0 -115
  428. package/apps/pwa/out/_next/static/chunks/4447-14c5161fa59166c7.js +0 -1
  429. package/apps/pwa/out/_next/static/chunks/4856-b0b8075bba8c53f4.js +0 -1
  430. package/apps/pwa/out/_next/static/chunks/4870-de370d65e73c0bb5.js +0 -1
  431. package/apps/pwa/out/_next/static/chunks/4885-2c989165c4b29fad.js +0 -1
  432. package/apps/pwa/out/_next/static/chunks/4894.fec2ca9e99caefa2.js +0 -1
  433. package/apps/pwa/out/_next/static/chunks/5093.8f04b7f8cb899a95.js +0 -94
  434. package/apps/pwa/out/_next/static/chunks/5122-2bb177cebf89e19a.js +0 -1
  435. package/apps/pwa/out/_next/static/chunks/5154.5f56dc3902e3d275.js +0 -36
  436. package/apps/pwa/out/_next/static/chunks/529.64ff7257180b2ac9.js +0 -1
  437. package/apps/pwa/out/_next/static/chunks/5394.5dabeb0c62293a28.js +0 -93
  438. package/apps/pwa/out/_next/static/chunks/5461.08bf2404ff38ec85.js +0 -1
  439. package/apps/pwa/out/_next/static/chunks/5474-22e08a85583209b2.js +0 -1
  440. package/apps/pwa/out/_next/static/chunks/5567-265df39ed8fe9dcb.js +0 -1
  441. package/apps/pwa/out/_next/static/chunks/5570-a94ae19811cb2046.js +0 -1
  442. package/apps/pwa/out/_next/static/chunks/5574-b47c9ef2dceff1fd.js +0 -1
  443. package/apps/pwa/out/_next/static/chunks/5730.43d7ccc09988e646.js +0 -1
  444. package/apps/pwa/out/_next/static/chunks/5824.da9527b15a3221e5.js +0 -1
  445. package/apps/pwa/out/_next/static/chunks/5963-c4d8469c52a0828b.js +0 -1
  446. package/apps/pwa/out/_next/static/chunks/6001.ec4049ceb3c43418.js +0 -27
  447. package/apps/pwa/out/_next/static/chunks/6120-471f03db1e299c0c.js +0 -1
  448. package/apps/pwa/out/_next/static/chunks/6175-41479e643aca1878.js +0 -1
  449. package/apps/pwa/out/_next/static/chunks/6291.a2de4f9787637075.js +0 -104
  450. package/apps/pwa/out/_next/static/chunks/6400-6699907c3537436a.js +0 -1
  451. package/apps/pwa/out/_next/static/chunks/6428.1f4327d6ae5fdf9a.js +0 -287
  452. package/apps/pwa/out/_next/static/chunks/644.02cb026fa44bcd0a.js +0 -1
  453. package/apps/pwa/out/_next/static/chunks/6466-6c87d60d3dd174fb.js +0 -1
  454. package/apps/pwa/out/_next/static/chunks/6773.d4264665ab31bec0.js +0 -1
  455. package/apps/pwa/out/_next/static/chunks/6822.3c789f1a8443e774.js +0 -1
  456. package/apps/pwa/out/_next/static/chunks/7261-8ff69d3b2ee671fd.js +0 -1
  457. package/apps/pwa/out/_next/static/chunks/7266.084c6bbc70035140.js +0 -1
  458. package/apps/pwa/out/_next/static/chunks/7271.5c0100e7320aa856.js +0 -1
  459. package/apps/pwa/out/_next/static/chunks/7429-bf5731358c8f2f68.js +0 -1
  460. package/apps/pwa/out/_next/static/chunks/7464.01f7a0ae1215fbe7.js +0 -1
  461. package/apps/pwa/out/_next/static/chunks/7479.0fcad5f37eb64f0c.js +0 -1
  462. package/apps/pwa/out/_next/static/chunks/7483.427a2fe2049e388d.js +0 -148
  463. package/apps/pwa/out/_next/static/chunks/7502-be74718178e13e56.js +0 -1
  464. package/apps/pwa/out/_next/static/chunks/7530.0889722b19572065.js +0 -24
  465. package/apps/pwa/out/_next/static/chunks/7645.5b2ee3ad45c55ea3.js +0 -1
  466. package/apps/pwa/out/_next/static/chunks/7788.7d1c79f1a8e18946.js +0 -1
  467. package/apps/pwa/out/_next/static/chunks/7966.f71c8958d1637548.js +0 -1
  468. package/apps/pwa/out/_next/static/chunks/8073.f6cf2f2c71aafbd0.js +0 -1
  469. package/apps/pwa/out/_next/static/chunks/8201.190b94088980f430.js +0 -74
  470. package/apps/pwa/out/_next/static/chunks/8447.7963352ef5f71b76.js +0 -1
  471. package/apps/pwa/out/_next/static/chunks/8574-868e8129525ef6d9.js +0 -1
  472. package/apps/pwa/out/_next/static/chunks/868.6e953be05bcf6dca.js +0 -41
  473. package/apps/pwa/out/_next/static/chunks/8706-e1fe0309343a2273.js +0 -1
  474. package/apps/pwa/out/_next/static/chunks/8749-06384cdfc4520add.js +0 -1
  475. package/apps/pwa/out/_next/static/chunks/8861-cc1fa1c7b920fa8e.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/8967-7dfebf710c9dec9d.js +0 -1
  477. package/apps/pwa/out/_next/static/chunks/8997-3c564dbb3b58b055.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/923.2034d10ae91e9c20.js +0 -1
  479. package/apps/pwa/out/_next/static/chunks/9312.bc1b89c5d4368033.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/943.39ae5e82f4f1893f.js +0 -1
  481. package/apps/pwa/out/_next/static/chunks/9469.0500480de55fb205.js +0 -32
  482. package/apps/pwa/out/_next/static/chunks/9810-2543267050e58b82.js +0 -1
  483. package/apps/pwa/out/_next/static/chunks/9870.8419702475254745.js +0 -8
  484. package/apps/pwa/out/_next/static/chunks/9941-376d1b74d51b01a4.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/9958.385434ab04241758.js +0 -1
  486. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-deea1450b17cb8dc.js +0 -1
  487. package/apps/pwa/out/_next/static/chunks/app/approvals/page-70985b904f8650ef.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a2e15e33e56a4353.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/app/board/page-fc72ce2db12d6ca9.js +0 -1
  490. package/apps/pwa/out/_next/static/chunks/app/botlab/page-be03e41f9436ebd9.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/app/bots/page-35a35999382da3f2.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/app/ceo/page-3ff5b1e6ca88b848.js +0 -1
  493. package/apps/pwa/out/_next/static/chunks/app/chat/page-a65101300a0ee5c1.js +0 -1
  494. package/apps/pwa/out/_next/static/chunks/app/consult/page-3aca5b6d67dba511.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/app/control/page-45b8ab0a71e61314.js +0 -1
  496. package/apps/pwa/out/_next/static/chunks/app/decisions/page-53046e282d4cda8e.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/app/design-check/page-17809e60e8354c17.js +0 -1
  498. package/apps/pwa/out/_next/static/chunks/app/editor/page-fd2442d347bf5898.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/app/exec/page-e9d720d6fc082e21.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/app/field/page-6b8b4267bab0a677.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/app/healthz/route-deea1450b17cb8dc.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/app/inside/page-8bcf6233ac7c17af.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/app/intake/page-7cc25591cfc2126f.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/app/layout-053e871f35c9beba.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/app/live/page-eff819f0c2d5e084.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/app/live-run/page-4d7e9d8db5274a87.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/app/loops/page-2b2d8f5aa5f69ad4.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/app/market/page-0b8f92c5062e68b1.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1bd9d0fdac2ced3d.js +0 -1
  510. package/apps/pwa/out/_next/static/chunks/app/morning/page-9ee28f7df07428ea.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/app/not-found-44b7a1ff468c6648.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/app/observatory/page-cbc6523711dc1b65.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-fdad47899c2695be.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-79a8b5fee4c20871.js +0 -1
  515. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-03e8ac9606aeaffb.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/app/outputs/page-4cd55c55ec287e2f.js +0 -1
  517. package/apps/pwa/out/_next/static/chunks/app/page-db17b4305404161e.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/app/reflection/page-30041d848350fd02.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c540da022dbf86b0.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9399efc538da057f.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ca2d09128c585ca4.js +0 -1
  522. package/apps/pwa/out/_next/static/chunks/app/settings/page-0e2635aecd343038.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ef7f4399b6b7726e.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/app/setup/layout-deea1450b17cb8dc.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/app/setup/page-caf530535b875468.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/app/share/page-eaa20c1543a5fd8e.js +0 -1
  527. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c541eb1b75120f61.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/app/tasks/page-ab5e213eda9479f4.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/app/today/page-e858ba0ed9393b68.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/app/trace/page-1638ee9dd6e0582f.js +0 -1
  531. package/apps/pwa/out/_next/static/chunks/app/vault/page-4cf5a399109391f2.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-b4396321238798ec.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/app/workflows/page-cb72bfd21006781a.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6135d0242afbc434.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a1dccf907eddb856.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/c7945435-b44d4dbe90ba0dcb.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/ea514caa.05a24f78d9dffe5f.js +0 -122
  538. package/apps/pwa/out/_next/static/chunks/framework-e8a911e19b1be41f.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/main-7022f418fabba021.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/main-app-e5f15df755756a1e.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/pages/_app-4525f91e36940c9b.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/pages/_error-140f0e519c085b0f.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/webpack-8f22ef63dcb865b1.js +0 -1
  544. /package/apps/pwa/out/_next/static/{Om5xS9jpjSXJCeTNGYEi4 → HMXsxdy5MIIcHPMHv1wD4}/_ssgManifest.js +0 -0
@@ -43,6 +43,157 @@ export interface OverlayParseResult {
43
43
  readonly errors: readonly GraphParseIssue[];
44
44
  }
45
45
 
46
+ /** Injected ARG promotion evidence used by the graph-promote rehearsal.
47
+ * This input is deliberately separate from the production run ledger: a fixture
48
+ * can exercise the decision path, but its output is always labelled mock-only. */
49
+ export interface ArgPromotionEvidenceEvent {
50
+ readonly runId: string;
51
+ readonly timestamp: string;
52
+ readonly trigger: string;
53
+ readonly phase: 'adaptation' | 'baseline' | 'shadow';
54
+ readonly landed?: boolean;
55
+ readonly shadowAccepted?: boolean;
56
+ }
57
+
58
+ export interface ArgPromotionCandidate {
59
+ readonly overlayId: string;
60
+ readonly target: string;
61
+ readonly appliesWhen: string;
62
+ readonly patch: readonly OverlayPatchOp[];
63
+ }
64
+
65
+ export interface ArgPromotionEvaluation {
66
+ readonly mockOnly: true;
67
+ readonly verdict: 'eligible-for-human-pr' | 'held';
68
+ readonly blockers: readonly string[];
69
+ readonly metrics: {
70
+ readonly trigger: string;
71
+ readonly adaptationRuns: number;
72
+ readonly adaptationLandingRate: number | null;
73
+ readonly baselineRuns: number;
74
+ readonly baselineLandingRate: number | null;
75
+ readonly landingDelta: number | null;
76
+ readonly adaptationWindowDays: number | null;
77
+ readonly shadowObservations: number;
78
+ readonly shadowWindowDays: number | null;
79
+ };
80
+ readonly proposal?: {
81
+ readonly action: 'proposal-only';
82
+ readonly promoted_from: readonly string[];
83
+ readonly evidence: Readonly<Record<string, unknown>>;
84
+ readonly overlay: {
85
+ readonly overlay_id: string;
86
+ readonly target: string;
87
+ readonly stage: 'launch';
88
+ readonly applies_when: string;
89
+ readonly patch: readonly OverlayPatchOp[];
90
+ };
91
+ readonly rollback: 'open a human-reviewed demotion PR if the 7-day landing rate declines';
92
+ readonly patentReview: 'ELA-53 human review pending';
93
+ };
94
+ }
95
+
96
+ const PROMOTION_DAY_MS = 24 * 60 * 60 * 1000;
97
+
98
+ function promotionSpanDays(events: readonly ArgPromotionEvidenceEvent[]): number | null {
99
+ if (events.length < 2) return null;
100
+ const times = events.map((event) => Date.parse(event.timestamp));
101
+ if (times.some((time) => !Number.isFinite(time))) return null;
102
+ return (Math.max(...times) - Math.min(...times)) / PROMOTION_DAY_MS;
103
+ }
104
+
105
+ /** Evaluate injected evidence without reading a production ledger, writing an overlay, or opening a PR. */
106
+ export function evaluateArgPromotionFixture(input: {
107
+ readonly trigger: string;
108
+ readonly candidate: ArgPromotionCandidate;
109
+ readonly events: readonly ArgPromotionEvidenceEvent[];
110
+ }): ArgPromotionEvaluation {
111
+ if (input === null || typeof input !== 'object' || Array.isArray(input)) throw new Error('ARG promotion fixture root must be an object');
112
+ const { trigger, candidate, events } = input;
113
+ if (typeof trigger !== 'string' || typeof candidate !== 'object' || candidate === null || Array.isArray(candidate)
114
+ || typeof candidate.overlayId !== 'string' || typeof candidate.target !== 'string' || typeof candidate.appliesWhen !== 'string'
115
+ || !Array.isArray(candidate.patch) || !Array.isArray(events)) {
116
+ throw new Error('ARG promotion fixture requires trigger, candidate object, patch array and events array');
117
+ }
118
+ if (!trigger.trim() || !candidate.overlayId.trim() || !candidate.target.trim() || !candidate.appliesWhen.trim()) {
119
+ throw new Error('ARG promotion fixture requires trigger, overlayId, target and appliesWhen');
120
+ }
121
+ if (candidate.patch.length === 0) throw new Error('ARG promotion candidate patch must not be empty');
122
+ for (const operation of candidate.patch) {
123
+ if (operation === null || typeof operation !== 'object' || !['add', 'replace', 'remove'].includes(operation.op)
124
+ || typeof operation.path !== 'string' || !operation.path.startsWith('/')
125
+ || (operation.op !== 'remove' && !('value' in operation))) {
126
+ throw new Error('ARG promotion candidate contains an invalid JSON Patch operation');
127
+ }
128
+ }
129
+ const runIds = new Set<string>();
130
+ for (const rawEvent of events) {
131
+ if (rawEvent === null || typeof rawEvent !== 'object' || Array.isArray(rawEvent)) throw new Error('ARG promotion fixture contains a non-object event');
132
+ const event = rawEvent as ArgPromotionEvidenceEvent;
133
+ if (typeof event.runId !== 'string' || !event.runId.trim() || typeof event.timestamp !== 'string'
134
+ || !Number.isFinite(Date.parse(event.timestamp)) || typeof event.trigger !== 'string' || !event.trigger.trim()
135
+ || !['adaptation', 'baseline', 'shadow'].includes(event.phase)) {
136
+ throw new Error('ARG promotion fixture contains an invalid event');
137
+ }
138
+ if (runIds.has(event.runId)) throw new Error(`ARG promotion fixture repeats runId ${event.runId}`);
139
+ runIds.add(event.runId);
140
+ if ((event.phase === 'adaptation' || event.phase === 'baseline') && typeof event.landed !== 'boolean') {
141
+ throw new Error(`ARG promotion ${event.phase} event requires landed`);
142
+ }
143
+ if (event.phase === 'shadow' && typeof event.shadowAccepted !== 'boolean') {
144
+ throw new Error('ARG promotion shadow event requires shadowAccepted');
145
+ }
146
+ }
147
+
148
+ const matching = events.filter((event) => event.trigger === trigger);
149
+ const adaptations = matching.filter((event) => event.phase === 'adaptation');
150
+ const baseline = matching.filter((event) => event.phase === 'baseline');
151
+ const shadow = matching.filter((event) => event.phase === 'shadow');
152
+ const rate = (rows: readonly ArgPromotionEvidenceEvent[]): number | null => rows.length === 0
153
+ ? null : rows.filter((event) => event.landed === true).length / rows.length;
154
+ const adaptationLandingRate = rate(adaptations);
155
+ const baselineLandingRate = rate(baseline);
156
+ const landingDelta = adaptationLandingRate === null || baselineLandingRate === null
157
+ ? null : adaptationLandingRate - baselineLandingRate;
158
+ const adaptationSpanDays = promotionSpanDays(adaptations);
159
+ const baselineSpanDays = promotionSpanDays(baseline);
160
+ const adaptationWindowDays = adaptationSpanDays === null || baselineSpanDays === null
161
+ ? null : Math.min(adaptationSpanDays, baselineSpanDays);
162
+ const shadowWindowDays = promotionSpanDays(shadow);
163
+ const evidenceEnd = Math.max(...[...adaptations, ...baseline].map((event) => Date.parse(event.timestamp)));
164
+ const shadowStart = Math.min(...shadow.map((event) => Date.parse(event.timestamp)));
165
+ const blockers: string[] = [];
166
+ if (adaptations.length < 5) blockers.push('same-trigger-adaptations-below-5');
167
+ if (baseline.length === 0) blockers.push('same-trigger-baseline-missing');
168
+ if (landingDelta === null || landingDelta < 0.2 - Number.EPSILON) blockers.push('landing-improvement-below-20pp');
169
+ if (adaptationWindowDays === null || adaptationWindowDays < 7) blockers.push('adaptation-evidence-window-under-7-days');
170
+ if (shadow.length < 2 || shadowWindowDays === null || shadowWindowDays < 7) blockers.push('shadow-window-under-7-days');
171
+ if (!Number.isFinite(evidenceEnd) || !Number.isFinite(shadowStart) || shadowStart < evidenceEnd) blockers.push('shadow-starts-before-evidence-window');
172
+ if (shadow.some((event) => event.shadowAccepted !== true)) blockers.push('shadow-evaluation-declined');
173
+
174
+ const metrics = { trigger, adaptationRuns: adaptations.length, adaptationLandingRate,
175
+ baselineRuns: baseline.length, baselineLandingRate, landingDelta, adaptationWindowDays,
176
+ shadowObservations: shadow.length, shadowWindowDays };
177
+ if (blockers.length > 0) return { mockOnly: true, verdict: 'held', blockers, metrics };
178
+ const promotedFrom = adaptations.map((event) => event.runId).sort();
179
+ return {
180
+ mockOnly: true, verdict: 'eligible-for-human-pr', blockers, metrics,
181
+ proposal: {
182
+ action: 'proposal-only', promoted_from: promotedFrom,
183
+ evidence: {
184
+ source: 'injected-mock-fixture', trigger, adaptationRuns: promotedFrom,
185
+ baselineRuns: baseline.map((event) => event.runId).sort(),
186
+ adaptationLandingRate, baselineLandingRate, landingDelta,
187
+ adaptationWindowDays, shadowRunIds: shadow.map((event) => event.runId).sort(), shadowWindowDays,
188
+ },
189
+ overlay: { overlay_id: candidate.overlayId, target: candidate.target, stage: 'launch',
190
+ applies_when: candidate.appliesWhen, patch: candidate.patch },
191
+ rollback: 'open a human-reviewed demotion PR if the 7-day landing rate declines',
192
+ patentReview: 'ELA-53 human review pending',
193
+ },
194
+ };
195
+ }
196
+
46
197
  const STAGES = new Set<OverlayStage>(['launch', 'runtime', 'heal']);
47
198
  const OPS = new Set(['add', 'replace', 'remove']);
48
199
 
@@ -50,6 +50,11 @@ export interface GraphEdgeSpec {
50
50
  /** 조건부 엣지 — 라우터가 읽는 «상태 키». ⛔ 값은 코드가 낸다(RFC §4.3 ⑵). */
51
51
  readonly on?: string;
52
52
  readonly map?: Readonly<Record<string, string>>;
53
+ /** Explicit fan-out destinations keyed by outcome. Each selected branch runs concurrently and joins at `join`. */
54
+ readonly branches?: Readonly<Record<string, readonly string[]>>;
55
+ readonly join?: string;
56
+ /** Failed warning branches remain visible in the join output but do not fail the barrier. */
57
+ readonly warningBranches?: readonly string[];
53
58
  /** 심이 «주입 안 됐을 때» 내려가는 순서. `requires` 는 그 심 이름들. */
54
59
  readonly fallback?: readonly { readonly node: string; readonly requires: readonly string[]; readonly observed?: number }[];
55
60
  readonly observed?: number;
@@ -273,14 +278,19 @@ export function parseGraphTemplateYaml(source: string, label = '<inline>'): Grap
273
278
  if (!known.has(from)) { errors.push({ path: `${at}/from`, message: `'${from}' 은 선언된 노드가 아니다` }); continue; }
274
279
  const hasTo = typeof e.to === 'string';
275
280
  const hasMap = e.map !== null && typeof e.map === 'object';
281
+ const hasBranches = e.branches !== null && typeof e.branches === 'object' && !Array.isArray(e.branches);
276
282
  if (e.when !== undefined && (typeof e.when !== 'string' || !parseOverlayCondition(e.when).ok))
277
283
  errors.push({ path: `${at}/when`, message: 'when 은 오버레이 조건 한 개(key op literal)여야 한다' });
278
284
  if (e.when !== undefined && (L1_PROTECTED_ROUTE_NODES.has(from) || nodes.some(node => node.nodeId === from && node.kind === 'gate') || terminalNodes.includes(from)))
279
285
  errors.push({ path: `${at}/when`, message: `'${from}' 의 필수 검증·착지 결과는 when 간선으로 덮을 수 없다` });
280
286
  if (e.when !== undefined && (!hasTo || hasMap || e.on !== undefined))
281
287
  errors.push({ path: `${at}/when`, message: 'when 은 to 간선에서만 쓴다' });
282
- if (hasTo === hasMap) {
283
- errors.push({ path: at, message: 'to 와 map 중 «정확히 하나»를 써야 한다' });
288
+ if (!hasTo && !hasMap && !hasBranches) {
289
+ errors.push({ path: at, message: 'to 또는 map/branches 조합을 써야 한다' });
290
+ continue;
291
+ }
292
+ if (hasTo && (hasMap || hasBranches)) {
293
+ errors.push({ path: at, message: 'to 는 map·branches 와 함께 쓸 수 없다' });
284
294
  continue;
285
295
  }
286
296
  const map: Record<string, string> = {};
@@ -292,6 +302,35 @@ export function parseGraphTemplateYaml(source: string, label = '<inline>'): Grap
292
302
  }
293
303
  if (typeof e.on !== 'string') errors.push({ path: `${at}/on`, message: 'map 을 쓰면 on(라우터가 읽는 상태 키)이 필요하다' });
294
304
  }
305
+ let branches: Record<string, readonly string[]> | undefined;
306
+ let warningBranches: readonly string[] | undefined;
307
+ if (hasBranches) {
308
+ branches = {};
309
+ for (const [outcome, destinations] of Object.entries(e.branches as Record<string, unknown>)) {
310
+ if (!Array.isArray(destinations) || destinations.length < 2 || !destinations.every((value) => typeof value === 'string')) {
311
+ errors.push({ path: `${at}/branches/${outcome}`, message: 'branches 목적지는 두 개 이상의 노드 id 목록이어야 한다' });
312
+ continue;
313
+ }
314
+ if (new Set(destinations).size !== destinations.length)
315
+ errors.push({ path: `${at}/branches/${outcome}`, message: 'branches 목적지는 중복될 수 없다' });
316
+ for (const [index, destination] of destinations.entries()) {
317
+ if (!known.has(destination)) errors.push({ path: `${at}/branches/${outcome}/${index}`, message: `'${destination}' 는 선언된 노드가 아니다` });
318
+ }
319
+ branches[outcome] = destinations as string[];
320
+ }
321
+ if (typeof e.on !== 'string' || typeof e.join !== 'string' || !known.has(e.join))
322
+ errors.push({ path: at, message: 'branches 에는 on 과 선언된 join 노드가 필요하다' });
323
+ if (e.fallback !== undefined || e.when !== undefined) errors.push({ path: at, message: 'branches 는 fallback·when 과 함께 쓸 수 없다' });
324
+ if (hasMap && Object.keys(map).some((outcome) => Object.hasOwn(e.branches as object, outcome)))
325
+ errors.push({ path: `${at}/branches`, message: 'map 과 branches 의 outcome 키는 겹칠 수 없다' });
326
+ if (e.warning_branches !== undefined) {
327
+ if (!Array.isArray(e.warning_branches) || e.warning_branches.some((branch) => typeof branch !== 'string' || !branch.trim()) ||
328
+ new Set(e.warning_branches).size !== e.warning_branches.length ||
329
+ e.warning_branches.some((branch) => !Object.values(branches!).some((destinations) => destinations.includes(branch as string)))) {
330
+ errors.push({ path: `${at}/warning_branches`, message: 'warning_branches 는 중복 없는 branches 목적지 목록이어야 한다' });
331
+ } else warningBranches = e.warning_branches as string[];
332
+ }
333
+ }
295
334
  if (hasTo && !known.has(e.to as string)) { errors.push({ path: `${at}/to`, message: `'${String(e.to)}' 는 선언된 노드가 아니다` }); continue; }
296
335
 
297
336
  const fallback = asArray(e.fallback).flatMap((f, fi) => {
@@ -309,6 +348,7 @@ export function parseGraphTemplateYaml(source: string, label = '<inline>'): Grap
309
348
  from,
310
349
  ...(hasTo ? { to: e.to as string } : {}),
311
350
  ...(hasMap ? { on: String(e.on), map } : {}),
351
+ ...(branches ? { on: String(e.on), branches, join: String(e.join), ...(warningBranches ? { warningBranches } : {}) } : {}),
312
352
  ...(fallback.length > 0 ? { fallback } : {}),
313
353
  ...(typeof e.observed === 'number' ? { observed: e.observed } : {}),
314
354
  ...(typeof e.when === 'string' ? { when: e.when } : {}),
@@ -326,6 +366,25 @@ export function parseGraphTemplateYaml(source: string, label = '<inline>'): Grap
326
366
  if (!edges.some(candidate => candidate.from === edge.from && candidate.when === undefined))
327
367
  errors.push({ path: `${label}/edges/${edge.from}/when`, message: 'when 간선에는 모호·미관측 때 탈 무조건 기본 간선이 필요하다' });
328
368
  }
369
+ const fanOutDestinations = new Map<string, string>();
370
+ const fanOutJoins = new Map<string, string>();
371
+ for (const edge of edges) {
372
+ if (!edge.branches || !edge.join) continue;
373
+ const sourceNode = nodes.find(node => node.nodeId === edge.from);
374
+ if (sourceNode && sourceNode.maxVisits !== 1) errors.push({ path: `${label}/edges/${edge.from}/branches`, message: 'fan-out 출발 노드는 재방문할 수 없어 max_visits: 1 이어야 한다' });
375
+ if (fanOutJoins.has(edge.join) && fanOutJoins.get(edge.join) !== edge.from) errors.push({ path: `${label}/edges/${edge.from}/join`, message: 'join 노드는 하나의 fan-out barrier만 소유할 수 있다' });
376
+ fanOutJoins.set(edge.join, edge.from);
377
+ if (edge.join === edge.from || Object.values(edge.branches).some((branches) => branches.includes(edge.join!)))
378
+ errors.push({ path: `${label}/edges/${edge.from}/join`, message: 'join 노드는 fan-out source나 branch 목적지일 수 없다' });
379
+ for (const branch of new Set(Object.values(edge.branches).flat())) {
380
+ if (fanOutDestinations.has(branch) && fanOutDestinations.get(branch) !== edge.from) errors.push({ path: `${label}/edges/${edge.from}/branches`, message: `branch '${branch}' 는 하나의 fan-out source 에서만 실행할 수 있다` });
381
+ fanOutDestinations.set(branch, edge.from);
382
+ if (edges.some(candidate => candidate.from === branch)) errors.push({ path: `${label}/edges/${edge.from}/branches`, message: `branch '${branch}' 는 단일 노드만 지원하며 후속 간선은 허용되지 않는다` });
383
+ }
384
+ const joinEdge = edges.find((candidate) => candidate.from === edge.join && candidate.on === 'outcome');
385
+ if (!joinEdge?.map || !Object.hasOwn(joinEdge.map, 'ok') || !Object.hasOwn(joinEdge.map, 'fail'))
386
+ errors.push({ path: `${label}/edges/${edge.join}`, message: 'fan-out join 은 ok·fail 출구를 모두 선언해야 한다' });
387
+ }
329
388
 
330
389
  if (entryNode !== undefined && !known.has(entryNode)) errors.push({ path: `${label}/entry_node`, message: `'${entryNode}' 는 선언된 노드가 아니다` });
331
390
  for (const t of terminalNodes) if (!known.has(t)) errors.push({ path: `${label}/terminal_nodes`, message: `'${t}' 는 선언된 노드가 아니다` });
@@ -535,6 +594,13 @@ export function edgeMapOf(template: GraphTemplateSpec): Record<string, string[]>
535
594
  const push = (t: string) => { if (!targets.includes(t)) targets.push(t); };
536
595
  if (edge.to) push(edge.to);
537
596
  for (const t of Object.values(edge.map ?? {})) push(t);
597
+ for (const destinations of Object.values(edge.branches ?? {})) for (const destination of destinations) {
598
+ push(destination);
599
+ if (edge.join) {
600
+ const branchTargets = edges[destination] ?? (edges[destination] = []);
601
+ if (!branchTargets.includes(edge.join)) branchTargets.push(edge.join);
602
+ }
603
+ }
538
604
  for (const fb of edge.fallback ?? []) push(fb.node);
539
605
  }
540
606
  return edges;
@@ -117,7 +117,7 @@ import { decideLineageSupersede, lineageSupersedeCloseComment, type LineageSuper
117
117
  import { basename, isAbsolute, join, relative, resolve, sep } from 'node:path';
118
118
  import { homedir } from 'node:os';
119
119
  import { enqueueControlMemo, readSoftStopRequestStatus, type SoftStopRequestRead } from '../harness/control-inbox.js';
120
- import { debug } from '../debug/log.js';
120
+ import { debug, redactSecretText } from '../debug/log.js';
121
121
  import { enterJourneyNode, exitJourneyNode, journeyJoinFields, withJourneyNode } from '../self-dev/graph-journey-nodes.js';
122
122
  import { classifyGateEnvDeficit, DEFAULT_GATE_ENV_RETRY, GATE_ENV_DEFICIT_HARVESTABLE_MARK, type GateEnvDeficitKind } from './gate-env-retry.js';
123
123
  import { recordFailureEvent } from './heal-intake.js';
@@ -2412,7 +2412,9 @@ export interface SelfImplementResult {
2412
2412
  /** Additive hard-cap disposition; outcome remains the stable public terminal contract. */
2413
2413
  salvage?: 'launched' | 'parked';
2414
2414
  /** Rework stopped on exclusively baseline/flaky/precondition failures; do not retry this goal against the same base. */
2415
- terminationReason?: 'blocked-by-baseline' | 'goal-only-rework-exhausted' | 'tdd-evidence-missing';
2415
+ terminationReason?: string;
2416
+ /** Child's concrete stop summary when implementation did not converge before TDD evidence adjudication. */
2417
+ terminationDetail?: string;
2416
2418
  /** Structured TDD failure survives child JSON/result truncation and parent-ledger mapping. */
2417
2419
  tddEvidenceFailure?: { reason: 'tdd-evidence-missing'; round: number; missing: readonly TddRecordTag[] };
2418
2420
  sessionId?: string;
@@ -3035,6 +3037,15 @@ type PreparedPrBody = {
3035
3037
  const PR_BODY_TRUNCATION_MARKER_MAX_CHARS = 1_024;
3036
3038
 
3037
3039
  type ChildProviderErrorQueryResult = Exclude<Awaited<ReturnType<NonNullable<SelfImplementSeams['queryChildProviderErrors']>>>, undefined>;
3040
+ type ChildProviderErrorDetail = {
3041
+ provider?: string;
3042
+ model?: string;
3043
+ message?: string;
3044
+ observedAt?: string;
3045
+ httpStatus?: number;
3046
+ providerErrorCode?: string;
3047
+ providerErrorType?: string;
3048
+ };
3038
3049
 
3039
3050
  /** Aggregates only router-produced structured records; provider messages are never reparsed. */
3040
3051
  export function queryStructuredChildProviderErrors(
@@ -3054,8 +3065,8 @@ export function queryStructuredChildProviderErrors(
3054
3065
  });
3055
3066
  if (rows.length === 0) return { status: 'none' };
3056
3067
  let credentialFailureCount = 0;
3057
- let lastProviderError: { provider?: string; model?: string; message?: string; observedAt?: string } | undefined;
3058
- let lastCredentialFailure: { provider?: string; model?: string; message?: string; observedAt?: string } | undefined;
3068
+ let lastProviderError: ChildProviderErrorDetail | undefined;
3069
+ let lastCredentialFailure: ChildProviderErrorDetail | undefined;
3059
3070
  for (const row of rows) {
3060
3071
  let data: Record<string, unknown> | undefined;
3061
3072
  try {
@@ -3067,6 +3078,9 @@ export function queryStructuredChildProviderErrors(
3067
3078
  ...(typeof data?.model === 'string' ? { model: data.model } : {}),
3068
3079
  ...(typeof data?.message === 'string' ? { message: data.message } : {}),
3069
3080
  ...(typeof row.ts === 'string' ? { observedAt: row.ts } : {}),
3081
+ ...(typeof data?.httpStatus === 'number' ? { httpStatus: data.httpStatus } : {}),
3082
+ ...(typeof data?.providerErrorCode === 'string' ? { providerErrorCode: data.providerErrorCode } : {}),
3083
+ ...(typeof data?.providerErrorType === 'string' ? { providerErrorType: data.providerErrorType } : {}),
3070
3084
  };
3071
3085
  lastProviderError = detail;
3072
3086
  if (data?.authRejected === true) {
@@ -3878,8 +3892,8 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
3878
3892
  const latestVerdictSeq = (): number => Math.max(lastFailedGateSeq, lastMustFixReviewSeq);
3879
3893
  const hasCurrentProviderError = (): boolean => providerErrorCount > 0 && lastProviderErrorSeq > latestVerdictSeq();
3880
3894
  const hasCurrentCredentialFailure = (): boolean => credentialFailureCount > 0 && lastCredentialFailureSeq > latestVerdictSeq();
3881
- let lastProviderError: { provider?: string; model?: string; message?: string; observedAt?: string } | undefined;
3882
- let lastCredentialFailure: { provider?: string; model?: string; message?: string; observedAt?: string } | undefined;
3895
+ let lastProviderError: ChildProviderErrorDetail | undefined;
3896
+ let lastCredentialFailure: ChildProviderErrorDetail | undefined;
3883
3897
  let childProviderErrorQueryStatus: 'found' | 'none' | 'unavailable' | 'not-configured' = 'not-configured';
3884
3898
  let queriedProviderErrorCount = 0;
3885
3899
  let queriedCredentialFailureCount = 0;
@@ -3929,8 +3943,22 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
3929
3943
  credentialFailureCount,
3930
3944
  queriedProviderErrorCount,
3931
3945
  queriedCredentialFailureCount,
3932
- lastProviderError: lastProviderError ? { provider: lastProviderError.provider ?? null, model: lastProviderError.model ?? null, observedAt: lastProviderError.observedAt ?? null } : null,
3933
- lastCredentialFailure: lastCredentialFailure ? { provider: lastCredentialFailure.provider ?? null, model: lastCredentialFailure.model ?? null, observedAt: lastCredentialFailure.observedAt ?? null } : null,
3946
+ lastProviderError: lastProviderError ? {
3947
+ provider: lastProviderError.provider ?? null,
3948
+ model: lastProviderError.model ?? null,
3949
+ observedAt: lastProviderError.observedAt ?? null,
3950
+ ...(typeof lastProviderError.httpStatus === 'number' ? { httpStatus: lastProviderError.httpStatus } : {}),
3951
+ ...(typeof lastProviderError.providerErrorCode === 'string' ? { providerErrorCode: lastProviderError.providerErrorCode } : {}),
3952
+ ...(typeof lastProviderError.providerErrorType === 'string' ? { providerErrorType: lastProviderError.providerErrorType } : {}),
3953
+ } : null,
3954
+ lastCredentialFailure: lastCredentialFailure ? {
3955
+ provider: lastCredentialFailure.provider ?? null,
3956
+ model: lastCredentialFailure.model ?? null,
3957
+ observedAt: lastCredentialFailure.observedAt ?? null,
3958
+ ...(typeof lastCredentialFailure.httpStatus === 'number' ? { httpStatus: lastCredentialFailure.httpStatus } : {}),
3959
+ ...(typeof lastCredentialFailure.providerErrorCode === 'string' ? { providerErrorCode: lastCredentialFailure.providerErrorCode } : {}),
3960
+ ...(typeof lastCredentialFailure.providerErrorType === 'string' ? { providerErrorType: lastCredentialFailure.providerErrorType } : {}),
3961
+ } : null,
3934
3962
  lastProviderErrorSeq,
3935
3963
  lastCredentialFailureSeq,
3936
3964
  lastFailedGateSeq,
@@ -3945,7 +3973,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
3945
3973
  if (record.category !== 'llm.router.error') return;
3946
3974
  const data = record.data;
3947
3975
  if (!data || typeof data !== 'object') return;
3948
- const { provider, model, message } = data as Record<string, unknown>;
3976
+ const { provider, model, message, httpStatus, providerErrorCode, providerErrorType } = data as Record<string, unknown>;
3949
3977
  providerErrorCount++;
3950
3978
  lastProviderErrorSeq = ++failureSequence;
3951
3979
  lastProviderError = {
@@ -3953,6 +3981,9 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
3953
3981
  ...(typeof model === 'string' ? { model } : {}),
3954
3982
  ...(typeof message === 'string' ? { message } : {}),
3955
3983
  ...(typeof record.ts === 'string' ? { observedAt: record.ts } : {}),
3984
+ ...(typeof httpStatus === 'number' ? { httpStatus } : {}),
3985
+ ...(typeof providerErrorCode === 'string' ? { providerErrorCode } : {}),
3986
+ ...(typeof providerErrorType === 'string' ? { providerErrorType } : {}),
3956
3987
  };
3957
3988
  // ⛔⭐⭐⭐ 자격 거부는 「프로바이더 오류」의 부분집합이지만 ***사람이 할 다음 행동이 다르다***
3958
3989
  // (2026-08-14 실측 · `[T]` 83차): grok 자식 «둘»이 401 로 죽었는데 부모가 남긴 것은
@@ -4798,6 +4829,14 @@ function safeErrorDescription(error: unknown): string {
4798
4829
  }
4799
4830
  }
4800
4831
 
4832
+ function safePreservationFailure(error: unknown): string {
4833
+ const detail = redactSecretText(safeErrorDescription(error))
4834
+ .replace(/[\r\n\t\x00-\x1f\x7f]+/g, ' ')
4835
+ .trim()
4836
+ .slice(0, 400);
4837
+ return detail || '[empty preservation error]';
4838
+ }
4839
+
4801
4840
 
4802
4841
  /** ⛔ 회전 스냅샷이 «이미 갖고 있는» 값을 증거 칸으로 옮기는 순수 사상.
4803
4842
  *
@@ -6489,7 +6528,7 @@ async function runSelfImplementInner(
6489
6528
  }
6490
6529
  }
6491
6530
  } catch (error) {
6492
- pushError = error instanceof Error ? error : new Error(String(error));
6531
+ pushError = new Error(safePreservationFailure(error));
6493
6532
  }
6494
6533
  }
6495
6534
  observe('rework-blocked-draft-pr', {
@@ -6503,9 +6542,10 @@ async function runSelfImplementInner(
6503
6542
  }, pushError ? { level: 'warn' } : undefined);
6504
6543
  if (pushError) {
6505
6544
  const failure = preservationErrorStep === 'worktree' ? '워크트리 부재로 보존 실패' : preservationErrorStep === 'commit' ? '로컬 브랜치 커밋 실패' : '원격 브랜치 보존 실패';
6506
- progress('aborted', `환경 탓 중단 — ${failure}: ${wt.branch} (${pushError.message}; worktree: ${wt.path})`);
6545
+ const failedStep = preservationErrorStep ?? 'push';
6546
+ progress('aborted', `환경 탓 중단 — ${failure}: ${wt.branch} (stage=${failedStep}; error=${pushError.message}; worktree: ${wt.path})`);
6507
6547
  if (preservationErrorStep === 'worktree') return undefined;
6508
- throw new Error(`환경 탓 중단 — ${failure}: ${wt.branch} (worktree: ${wt.path})`, { cause: pushError });
6548
+ throw new Error(`환경 탓 중단 — ${failure}: ${wt.branch} (stage=${failedStep}; error=${pushError.message}; worktree: ${wt.path})`, { cause: pushError });
6509
6549
  }
6510
6550
  if (worktreeOnly) {
6511
6551
  progress(stage, artifactPath
@@ -7931,8 +7971,13 @@ async function runSelfImplementInner(
7931
7971
  readonly judgment: ReturnType<typeof judgeTddEvidence>;
7932
7972
  readonly implementation: typeof impl;
7933
7973
  }): { readonly transcript: string; readonly judgment: ReturnType<typeof judgeTddEvidence> } => {
7934
- if (!input.judgment.planned || input.judgment.red.observed || !input.implementation.ok
7935
- || input.implementation.terminalStatus?.reached !== true) {
7974
+ const skippedReason = !input.judgment.planned ? 'not-planned'
7975
+ : input.judgment.red.observed ? 'child-red-present'
7976
+ : !input.implementation.ok ? 'impl-not-ok'
7977
+ : input.implementation.terminalStatus?.reached !== true ? 'terminal-not-reached' : undefined;
7978
+ if (skippedReason) {
7979
+ observe('tdd-base-test', { round: input.round, status: 'skipped', reason: skippedReason,
7980
+ ...(skippedReason === 'impl-not-ok' ? { implementationFailure: input.implementation.summary.slice(0, 240) } : {}) }, { level: 'warn' });
7936
7981
  return { transcript: input.transcript, judgment: input.judgment };
7937
7982
  }
7938
7983
  if (!wt.resolvedBase) {
@@ -8272,9 +8317,11 @@ async function runSelfImplementInner(
8272
8317
  salvageStatusExpected: false,
8273
8318
  ...(abort.terminalStatus ? { terminalStatus: abort.terminalStatus } : {}),
8274
8319
  });
8320
+ const implementationStop = impl.summary.split(/\r?\n/u, 1)[0]?.trim().slice(0, 240);
8275
8321
  return { ok: false, stage: 'aborted', node: 'implement', ...resolveRunOutcome({ termination: 'abandoned' }),
8276
8322
  ...(tddEvidenceFailure ? { terminationReason: tddEvidenceFailure.reason, tddEvidenceFailure }
8277
- : goalOnlyReworkExhausted ? { terminationReason: 'goal-only-rework-exhausted' as const } : {}),
8323
+ : goalOnlyReworkExhausted ? { terminationReason: 'goal-only-rework-exhausted' as const }
8324
+ : { terminationReason: implementationStop || 'implementation-did-not-converge', terminationDetail: implementationStop || 'implementation did not converge' }),
8278
8325
  sessionId, worktreePath: wt.path, branch: wt.branch, quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(), ...(impl.completionDisposition ? { completionDisposition: impl.completionDisposition } : {}), ...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: blockedDraftPrFailure ?? impl.summary,
8279
8326
  ...(blockedDraftPrFailureKind ? { detailKind: blockedDraftPrFailureKind } : {}) };
8280
8327
  }
@@ -28,6 +28,8 @@ export interface TestScenarioRequestInput {
28
28
  readonly registeredMethodologies: readonly string[];
29
29
  /** 라이브 명령의 «출처» — 보통 저작 중인 골 문서의 경로. 없으면 measured 로 못 간다. */
30
30
  readonly commandSource?: string;
31
+ /** Multiple authoritative source candidates are retained for review, never chosen by priority. */
32
+ readonly commandSourceCandidates?: readonly string[];
31
33
  }
32
34
 
33
35
  export type TestScenarioLiveStatus = 'measured' | 'unmeasured';
@@ -61,7 +63,25 @@ export function requestTestScenario(input: TestScenarioRequestInput): TestScenar
61
63
  const canLaunch = input.launch !== null
62
64
  && (input.launch.port !== undefined || (input.launch.entrypoint ?? '').trim() !== '');
63
65
  const methodologyAvailable = input.registeredMethodologies.includes(LAUNCH_METHODOLOGY);
64
- const commandSource = input.commandSource?.trim();
66
+ const commandSourceCandidates = [...new Set((input.commandSourceCandidates ?? [])
67
+ .map((candidate) => candidate.trim())
68
+ .filter((candidate) => /^[^:\s]+:[^:\s]+$/u.test(candidate)))];
69
+ const explicitCommandSource = input.commandSource?.trim() || undefined;
70
+ const candidateConflict = commandSourceCandidates.length > 1
71
+ || (commandSourceCandidates.length === 1 && explicitCommandSource !== undefined && commandSourceCandidates[0] !== explicitCommandSource);
72
+ const commandSource = candidateConflict
73
+ ? undefined
74
+ : explicitCommandSource || commandSourceCandidates[0];
75
+ // Ambiguous declarations must use file:key tokens. Preserve a legacy explicit
76
+ // document path as a labeled source token rather than emitting a malformed item.
77
+ const explicitAmbiguityCandidate = explicitCommandSource
78
+ ? (/^[^:\s]+:[^:\s]+$/u.test(explicitCommandSource) ? explicitCommandSource : `${explicitCommandSource}:explicit-command-source`)
79
+ : undefined;
80
+ const ambiguityCandidates = [...new Set([
81
+ ...commandSourceCandidates,
82
+ ...(candidateConflict && explicitAmbiguityCandidate ? [explicitAmbiguityCandidate] : []),
83
+ ])];
84
+ const commandSourceAmbiguous = candidateConflict || (!commandSource && commandSourceCandidates.length > 1);
65
85
 
66
86
  if (canLaunch && methodologyAvailable && commandSource) {
67
87
  return {
@@ -76,15 +96,17 @@ export function requestTestScenario(input: TestScenarioRequestInput): TestScenar
76
96
  }
77
97
 
78
98
  // ⛔ 사유를 «가장 바깥 원인»으로 고른다 — 선언이 없으면 방법론·명령출처를 따질 자리가 아니다.
79
- const reason = !canLaunch
80
- ? 'no-launch-declaration'
99
+ const reason = commandSourceAmbiguous
100
+ ? 'ambiguous-command-source'
101
+ : !canLaunch
102
+ ? 'no-launch-declaration'
81
103
  : !methodologyAvailable
82
104
  ? 'no-methodology'
83
105
  : 'no-command-source';
84
106
  return {
85
107
  sections: [
86
108
  scenarioSection(UNKNOWN_DELIVERABLE, input.acceptanceCriteria),
87
- unmeasuredLiveSection(reason),
109
+ unmeasuredLiveSection(reason, reason === 'ambiguous-command-source' ? ambiguityCandidates : [], reason === 'ambiguous-command-source' && candidateConflict ? explicitCommandSource : undefined),
88
110
  resultReportSection(),
89
111
  ],
90
112
  deliverableType: UNKNOWN_DELIVERABLE,
@@ -138,13 +160,22 @@ function measuredLiveSection(methodology: string, commandSource: string, launch:
138
160
  }
139
161
 
140
162
  /** L 층(측정 불가) — ⛔ 방법론·명령출처·기동·눈·기대를 «싣지 않는다»(파서가 금지한다). */
141
- function unmeasuredLiveSection(reason: string): string {
163
+ function unmeasuredLiveSection(reason: string, candidates: readonly string[] = [], explicitSource?: string): string {
164
+ const prerequisite = reason === 'no-launch-declaration'
165
+ ? '골이 `## 산출물을 어떻게 켜나` 절에 `Port:` 또는 `Entrypoint:` 를 선언했으면 됐다'
166
+ : reason === 'ambiguous-command-source'
167
+ ? '골이 후보 중 하나를 권위 있는 명령 출처로 확정했으면 됐다'
168
+ : reason === 'no-methodology'
169
+ ? '호출자가 등록 방법론 레지스트리에 `deliverable-verify` 를 등록했으면 됐다'
170
+ : '골이 권위 있는 명령 출처를 선언했으면 됐다';
142
171
  return [
143
172
  '## L. 라이브',
144
173
  '',
145
174
  '### 상태 `unmeasured`',
146
175
  `- 사유: \`${reason}\``,
147
- '- 무엇이 있었으면 됐나: 골이 `## 산출물을 어떻게 켜나` 절에 `Port:` 또는 `Entrypoint:` 를 선언했으면 됐다',
176
+ ...(reason.startsWith('ambiguous-') ? [`- 후보 목록: ${candidates.join(', ')}`] : []),
177
+ ...(explicitSource ? [`- 원래 명시 출처(후보와 별도): \`${explicitSource}\``] : []),
178
+ `- 무엇이 있었으면 됐나: ${prerequisite}`,
148
179
  '',
149
180
  '> ⚠️ ⛔ 「측정 불가」는 「결함 없음」이 «아니다». 이 골은 라이브 층을 «안 본 채» 끝난다.',
150
181
  ].join('\n');
@@ -20,7 +20,7 @@ import { debug } from '../debug/log.js';
20
20
  import { createRequestSizeGuard, formatRequestSizeStatus, type RequestSizeGuard } from './request-size-guard.js';
21
21
  import type { InputSourceKind } from '../input/input-source-kind.js';
22
22
  import {
23
- getProviderForConfig, streamLLMWithTools, type LLMMessage, type LLMOpts, type LLMProvider,
23
+ getProviderForConfigAsync, streamLLMWithTools, type LLMMessage, type LLMOpts, type LLMProvider,
24
24
  type LLMToolSpec, type ContentBlock,
25
25
  } from '../llm.js';
26
26
  import type { UserConfig } from '../user-config.js';
@@ -407,7 +407,7 @@ export async function runTurn(opts: RunTurnOpts): Promise<RunTurnResult> {
407
407
  reasoningEffort: llmOpts?.reasoningEffort ?? null,
408
408
  });
409
409
  }
410
- const provider = opts.provider ?? getProviderForConfig(opts.userConfig, llmOpts?.model);
410
+ const provider = opts.provider ?? await getProviderForConfigAsync(opts.userConfig, llmOpts?.model);
411
411
 
412
412
  // 2) Assemble, trim, call. When images are attached for THIS turn,
413
413
  // swap the string content of the latest user message for
@@ -1,4 +1,5 @@
1
1
  import { buildGitSnapshot } from '../git-fs/index.js';
2
+ import { classifyTuiChatIntent } from '../core-turn/short-question.js';
2
3
  import { debug } from '../debug/log.js';
3
4
  import { isResearchAgentIntent } from '../tool-hints/signals.js';
4
5
  import { resolve } from 'node:path';
@@ -225,6 +226,16 @@ interface SessionToolFamilyRule {
225
226
  isAvailable?(toolName: string): boolean;
226
227
  }
227
228
 
229
+ // Keep generic approvals (for example, Herdr session approvals) out of the decision-ledger lookup.
230
+ const DECISION_PENDING_LOOKUP_TERMS = [
231
+ '결정 카드', '결정카드', '미결 결정', '열린 결정', '대기 결정', '결정 대기', '결정 승인 대기',
232
+ 'pending decision', 'open decision', 'decision inbox',
233
+ ] as const;
234
+ const OPS_SEATS_LOOKUP_TERMS = [
235
+ '자리 현황', '자리별 현황', '자리 상태', '자리별 상태', '좌석 현황',
236
+ 'seat status', 'seat overview',
237
+ ] as const;
238
+
228
239
  const SESSION_TOOL_FAMILY_RULES: SessionToolFamilyRule[] = [
229
240
  {
230
241
  id: 'structural-search',
@@ -1871,13 +1882,34 @@ export function buildSessionRuntimeToolSpecs(opts: {
1871
1882
  optionalTools: opts.optionalTools ?? [],
1872
1883
  toolAvailability: opts.toolAvailability,
1873
1884
  });
1885
+ // These owner-read facts tools are valid ACP lookup targets, but are too
1886
+ // specific to carry on every dashboard turn. Keep the advertised catalog
1887
+ // aligned with the current question so a routed lookup can actually call it.
1888
+ const lookupRoute = classifyTuiChatIntent(opts.userText).route === '조회';
1889
+ const normalizedIntentText = opts.userText.toLowerCase();
1890
+ const intentHostNames = lookupRoute ? [
1891
+ ...(hasAny(normalizedIntentText, DECISION_PENDING_LOOKUP_TERMS) ? ['decisions_pending'] : []),
1892
+ ...(hasAny(normalizedIntentText, OPS_SEATS_LOOKUP_TERMS) ? ['ops_seats'] : []),
1893
+ ] : [];
1894
+ const hostByName = new Map(opts.hostTools.map(tool => [tool.name, tool] as const));
1895
+ const intentHostSpecs = intentHostNames
1896
+ .filter(name => isToolAvailable(name, opts.toolAvailability))
1897
+ .map(name => hostByName.get(name))
1898
+ .filter((tool): tool is LLMToolDef => !!tool)
1899
+ .map(toSpec);
1874
1900
  const droppedNames = new Set(['Edit', 'Write']);
1875
- const finalSpecs: LLMToolSpec[] = hasDevHarnessIntent(opts.userText)
1876
- ? essentialSpecs.filter(spec => !droppedNames.has(spec.name))
1877
- : essentialSpecs;
1878
- if (finalSpecs.length !== essentialSpecs.length) {
1901
+ const dropWriteTools = hasDevHarnessIntent(opts.userText);
1902
+ const droppedWriteSpecs = dropWriteTools
1903
+ ? essentialSpecs.filter(spec => droppedNames.has(spec.name))
1904
+ : [];
1905
+ const finalSpecs: LLMToolSpec[] = [...new Map(
1906
+ [...essentialSpecs, ...intentHostSpecs]
1907
+ .filter(spec => !dropWriteTools || !droppedNames.has(spec.name))
1908
+ .map(spec => [spec.name, spec] as const),
1909
+ ).values()];
1910
+ if (droppedWriteSpecs.length > 0) {
1879
1911
  debug.log('session-runtime.tools', 'harness-phrase-write-tools-dropped', {
1880
- dropped: ['Edit', 'Write'],
1912
+ dropped: droppedWriteSpecs.map(spec => spec.name),
1881
1913
  });
1882
1914
  }
1883
1915
  // Forensic — final tool list returned to streamLLMWithTools. Lets