elanous 0.2.41 → 0.2.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (796) 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/{GiOLWmt4MqDZePubBjA4Q → Om5xS9jpjSXJCeTNGYEi4}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{2fe2c302.41b517f88d6fe502.js → 0966f8a1.745fcd44f64a87ea.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/{385e4574.e9886ab32759eda3.js → 0ad6802e.ae7afb63fdcb4491.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/114.2b90424d1a3ce84c.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1151-5c2bb8f002ca2dd6.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1200.6a37c202f9f17e9a.js +226 -0
  9. package/apps/pwa/out/_next/static/chunks/1261-a616d5728e02e624.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/1313-19f737e0222c4444.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1357.3bbef3976c37f94a.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/1362-20adddfaf662b0fa.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/{6874.d5cf7eb8edb2cabe.js → 1406.a1dc2ab6f8449374.js} +2 -2
  14. package/apps/pwa/out/_next/static/chunks/1737-9491fc6ab29b9ec6.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1803-4f91a8e7dcaf042c.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/{5744.b9415e18ad623100.js → 1961.a81b12872c3e93a9.js} +1 -1
  17. package/apps/pwa/out/_next/static/chunks/1970cf59.2d4d8ce5d6c81853.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/1971-8890f3962ba7ee0a.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/2073-ba274e00e4f9efb4.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/{5471.1e611302ed3a7c53.js → 2144.25b292396712196d.js} +2 -2
  21. package/apps/pwa/out/_next/static/chunks/{3230-49298c3b73ef2268.js → 2268-53861f339e0b65a2.js} +1 -1
  22. package/apps/pwa/out/_next/static/chunks/{9834.63ab2bbc3153172e.js → 2312.0c8b61e22d3136d7.js} +1 -1
  23. package/apps/pwa/out/_next/static/chunks/{1800.f7ff51dc4978a958.js → 2573.387a707f6f9d720c.js} +2 -2
  24. package/apps/pwa/out/_next/static/chunks/273.f156eee28f11af77.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2873.d2140e5a82546401.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/{9048.212083de42d25be3.js → 3072.01338851ca21a6f7.js} +2 -2
  27. package/apps/pwa/out/_next/static/chunks/3091.a5a4143dea33d197.js +90 -0
  28. package/apps/pwa/out/_next/static/chunks/3095.dc44586a5f83b86d.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/{2263.e09b6edea33bad2d.js → 3113.d7472bbc27d580c7.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/3228-9650b6447b6fa288.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/3402.44b565b314f2263c.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{addc2b32.8c4ff8f0aefe987d.js → 3557ac4a.c8931684475018ad.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/360.ae9f9f4c33c395e8.js +79 -0
  34. package/apps/pwa/out/_next/static/chunks/3638.80412ea63aae8f3f.js +286 -0
  35. package/apps/pwa/out/_next/static/chunks/{a0a01613.6d1cca322238d7fe.js → 363bfab3.9623b9f89363541f.js} +1 -1
  36. package/apps/pwa/out/_next/static/chunks/3694.e0099884345f0198.js +64 -0
  37. package/apps/pwa/out/_next/static/chunks/3744.54f87db52acfd1ab.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3903.3ef4656c67572764.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3935.16701e33f8982dc9.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3955.6922286237f2ac2b.js +24 -0
  41. package/apps/pwa/out/_next/static/chunks/3969.272ee7f9fd6c62e5.js +34 -0
  42. package/apps/pwa/out/_next/static/chunks/4199.ce86b281fd0a60b7.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/4311-6dd3144002cc0c2d.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4426-2b230fad00c88930.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{530.d26346e18089640a.js → 4445.7990c76b3751a918.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/4447-14c5161fa59166c7.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4856-b0b8075bba8c53f4.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4870-de370d65e73c0bb5.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4885-2c989165c4b29fad.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4894.fec2ca9e99caefa2.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/5093.8f04b7f8cb899a95.js +94 -0
  52. package/apps/pwa/out/_next/static/chunks/5122-2bb177cebf89e19a.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/5154.5f56dc3902e3d275.js +36 -0
  54. package/apps/pwa/out/_next/static/chunks/529.64ff7257180b2ac9.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5394.5dabeb0c62293a28.js +93 -0
  56. package/apps/pwa/out/_next/static/chunks/5461.08bf2404ff38ec85.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/5474-22e08a85583209b2.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/{1219.7e17964e0e7cd8e5.js → 5564.9e72532188f57586.js} +3 -3
  59. package/apps/pwa/out/_next/static/chunks/5567-265df39ed8fe9dcb.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/5570-a94ae19811cb2046.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5574-b47c9ef2dceff1fd.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5628.6ddb2d5ffba4ff4c.js +309 -0
  63. package/apps/pwa/out/_next/static/chunks/5730.43d7ccc09988e646.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/{1178.1aa9cad0e7695427.js → 5789.2da35c258292e1e5.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/{4133.2056bb4d78f621af.js → 5824.da9527b15a3221e5.js} +1 -1
  66. package/apps/pwa/out/_next/static/chunks/5866.366966af47fdde5d.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/{4527.a69f2894d1bc9f4a.js → 5930.8b4df3b46c32b05a.js} +1 -1
  68. package/apps/pwa/out/_next/static/chunks/5963-c4d8469c52a0828b.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/6001.ec4049ceb3c43418.js +27 -0
  70. package/apps/pwa/out/_next/static/chunks/6120-471f03db1e299c0c.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6175-41479e643aca1878.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/6291.a2de4f9787637075.js +104 -0
  73. package/apps/pwa/out/_next/static/chunks/6400-6699907c3537436a.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/6428.1f4327d6ae5fdf9a.js +287 -0
  75. package/apps/pwa/out/_next/static/chunks/644.02cb026fa44bcd0a.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6466-6c87d60d3dd174fb.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{9507.7026657a2f47eb64.js → 6540.c7bef57ad8f90a87.js} +16 -16
  78. package/apps/pwa/out/_next/static/chunks/6773.d4264665ab31bec0.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6822.3c789f1a8443e774.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/{5574.f35accf4f132b29d.js → 6944.309f4e3ea54d1537.js} +1 -1
  81. package/apps/pwa/out/_next/static/chunks/7261-8ff69d3b2ee671fd.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/7266.084c6bbc70035140.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/7271.5c0100e7320aa856.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7429-bf5731358c8f2f68.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7464.01f7a0ae1215fbe7.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7479.0fcad5f37eb64f0c.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/7483.427a2fe2049e388d.js +148 -0
  88. package/apps/pwa/out/_next/static/chunks/7502-be74718178e13e56.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/7530.0889722b19572065.js +24 -0
  90. package/apps/pwa/out/_next/static/chunks/7645.5b2ee3ad45c55ea3.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7788.7d1c79f1a8e18946.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/7900.096f455c7c1efc53.js +77 -0
  93. package/apps/pwa/out/_next/static/chunks/7910-6f139bcafd238b9f.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7966.f71c8958d1637548.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{5947-135e26537d80a6b9.js → 8062-7cd0bcc7f01455ba.js} +3 -3
  96. package/apps/pwa/out/_next/static/chunks/8073.f6cf2f2c71aafbd0.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8201.190b94088980f430.js +74 -0
  98. package/apps/pwa/out/_next/static/chunks/8205.282ca4bb62d54a0a.js +62 -0
  99. package/apps/pwa/out/_next/static/chunks/8313-dfa1021bb58a46d6.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/837-81336ebaca8198a8.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8447.7963352ef5f71b76.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8574-868e8129525ef6d9.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8588.d1c6a2903727ce87.js +149 -0
  104. package/apps/pwa/out/_next/static/chunks/8637.90f92d5c8db4732c.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/{2743.5d3f76948be32b34.js → 868.6e953be05bcf6dca.js} +2 -2
  106. package/apps/pwa/out/_next/static/chunks/8706-e1fe0309343a2273.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8749-06384cdfc4520add.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/{5964-7e21164a8f2cf0ce.js → 8861-cc1fa1c7b920fa8e.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/8967-7dfebf710c9dec9d.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/{5159.115f1c2ca471386c.js → 8986.8e2e4efbfa655c59.js} +1 -1
  111. package/apps/pwa/out/_next/static/chunks/8997-3c564dbb3b58b055.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/923.2034d10ae91e9c20.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9312.bc1b89c5d4368033.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/943.39ae5e82f4f1893f.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9469.0500480de55fb205.js +32 -0
  116. package/apps/pwa/out/_next/static/chunks/9770.5f75bc6088b16109.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9810-2543267050e58b82.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9870.8419702475254745.js +8 -0
  119. package/apps/pwa/out/_next/static/chunks/9941-376d1b74d51b01a4.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9958.385434ab04241758.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/{b2271e54.c1de3347976e90b0.js → aa57532f.510551854ff239b1.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-deea1450b17cb8dc.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-70985b904f8650ef.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a2e15e33e56a4353.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-fc72ce2db12d6ca9.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-be03e41f9436ebd9.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-35a35999382da3f2.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-3ff5b1e6ca88b848.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-a65101300a0ee5c1.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-3aca5b6d67dba511.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-45b8ab0a71e61314.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-53046e282d4cda8e.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-17809e60e8354c17.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-fd2442d347bf5898.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-e9d720d6fc082e21.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-6b8b4267bab0a677.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-deea1450b17cb8dc.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-8bcf6233ac7c17af.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-7cc25591cfc2126f.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-053e871f35c9beba.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-eff819f0c2d5e084.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-4d7e9d8db5274a87.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-2b2d8f5aa5f69ad4.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-0b8f92c5062e68b1.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1bd9d0fdac2ced3d.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-9ee28f7df07428ea.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-44b7a1ff468c6648.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-cbc6523711dc1b65.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-fdad47899c2695be.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-40f9e19149024298.js → page-79a8b5fee4c20871.js} +1 -1
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-03e8ac9606aeaffb.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-4cd55c55ec287e2f.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-db17b4305404161e.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-30041d848350fd02.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c540da022dbf86b0.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9399efc538da057f.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-a142dfb0331a05f5.js → page-ca2d09128c585ca4.js} +1 -1
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-0e2635aecd343038.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ef7f4399b6b7726e.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-deea1450b17cb8dc.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-caf530535b875468.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-eaa20c1543a5fd8e.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c541eb1b75120f61.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-ab5e213eda9479f4.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-0a815f34367b6db6.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-e858ba0ed9393b68.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-1638ee9dd6e0582f.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-4cf5a399109391f2.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-b4396321238798ec.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-cb72bfd21006781a.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6135d0242afbc434.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a1dccf907eddb856.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{53aeb4ee-51c92f8d683f5220.js → c7945435-b44d4dbe90ba0dcb.js} +1 -1
  174. package/apps/pwa/out/_next/static/chunks/{2fdf2931.b431eee4fb468bc3.js → cb0f8df8.09a4a6be97e3fc5f.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/{c0c1a699.0ba79f97005965d4.js → d96660fb.cbc21a2a88539dbb.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/ea514caa.05a24f78d9dffe5f.js +122 -0
  177. package/apps/pwa/out/_next/static/chunks/{83184dcd-0ee6247ff41eb3f2.js → fb7d20d5-6892502b6ee39ca6.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/framework-e8a911e19b1be41f.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-7022f418fabba021.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-e5f15df755756a1e.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-4525f91e36940c9b.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-140f0e519c085b0f.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-8f22ef63dcb865b1.js +1 -0
  184. package/apps/pwa/out/_next/static/css/{b9d8151e48998417.css → 62c858ad53854f47.css} +1 -1
  185. package/apps/pwa/out/_next/static/css/d1f8bb401740a549.css +1 -0
  186. package/apps/pwa/out/approvals/index.html +1 -1
  187. package/apps/pwa/out/approvals/index.txt +23 -23
  188. package/apps/pwa/out/autopilot/index.html +1 -1
  189. package/apps/pwa/out/autopilot/index.txt +23 -23
  190. package/apps/pwa/out/board/index.html +1 -1
  191. package/apps/pwa/out/board/index.txt +23 -23
  192. package/apps/pwa/out/botlab/index.html +1 -1
  193. package/apps/pwa/out/botlab/index.txt +22 -22
  194. package/apps/pwa/out/bots/index.html +1 -1
  195. package/apps/pwa/out/bots/index.txt +22 -22
  196. package/apps/pwa/out/ceo/index.html +1 -1
  197. package/apps/pwa/out/ceo/index.txt +23 -23
  198. package/apps/pwa/out/chat/index.html +1 -1
  199. package/apps/pwa/out/chat/index.txt +22 -22
  200. package/apps/pwa/out/consult/index.html +1 -1
  201. package/apps/pwa/out/consult/index.txt +23 -23
  202. package/apps/pwa/out/control/index.html +1 -1
  203. package/apps/pwa/out/control/index.txt +23 -23
  204. package/apps/pwa/out/decisions/index.html +1 -1
  205. package/apps/pwa/out/decisions/index.txt +22 -22
  206. package/apps/pwa/out/design-check/index.html +1 -1
  207. package/apps/pwa/out/design-check/index.txt +23 -23
  208. package/apps/pwa/out/editor/index.html +1 -1
  209. package/apps/pwa/out/editor/index.txt +24 -25
  210. package/apps/pwa/out/exec/index.html +1 -1
  211. package/apps/pwa/out/exec/index.txt +23 -23
  212. package/apps/pwa/out/field/index.html +1 -1
  213. package/apps/pwa/out/field/index.txt +23 -23
  214. package/apps/pwa/out/healthz +1 -1
  215. package/apps/pwa/out/index.html +1 -1
  216. package/apps/pwa/out/index.txt +22 -22
  217. package/apps/pwa/out/inside/index.html +1 -1
  218. package/apps/pwa/out/inside/index.txt +23 -23
  219. package/apps/pwa/out/intake/index.html +1 -1
  220. package/apps/pwa/out/intake/index.txt +23 -23
  221. package/apps/pwa/out/live/index.html +1 -1
  222. package/apps/pwa/out/live/index.txt +24 -25
  223. package/apps/pwa/out/live-run/index.html +1 -1
  224. package/apps/pwa/out/live-run/index.txt +24 -25
  225. package/apps/pwa/out/loops/index.html +1 -1
  226. package/apps/pwa/out/loops/index.txt +22 -22
  227. package/apps/pwa/out/market/index.html +1 -1
  228. package/apps/pwa/out/market/index.txt +22 -22
  229. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  230. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  231. package/apps/pwa/out/morning/index.html +1 -1
  232. package/apps/pwa/out/morning/index.txt +23 -23
  233. package/apps/pwa/out/observatory/index.html +1 -1
  234. package/apps/pwa/out/observatory/index.txt +23 -23
  235. package/apps/pwa/out/ops/checklist/index.html +1 -1
  236. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  237. package/apps/pwa/out/ops/release/index.html +1 -1
  238. package/apps/pwa/out/ops/release/index.txt +22 -22
  239. package/apps/pwa/out/ops/seats/index.html +1 -1
  240. package/apps/pwa/out/ops/seats/index.txt +22 -22
  241. package/apps/pwa/out/outputs/index.html +1 -1
  242. package/apps/pwa/out/outputs/index.txt +22 -22
  243. package/apps/pwa/out/reflection/index.html +1 -1
  244. package/apps/pwa/out/reflection/index.txt +23 -23
  245. package/apps/pwa/out/scheduler/index.html +1 -1
  246. package/apps/pwa/out/scheduler/index.txt +23 -23
  247. package/apps/pwa/out/sessions/index.html +1 -1
  248. package/apps/pwa/out/sessions/index.txt +22 -22
  249. package/apps/pwa/out/settings/devices/index.html +1 -1
  250. package/apps/pwa/out/settings/devices/index.txt +23 -23
  251. package/apps/pwa/out/settings/index.html +1 -1
  252. package/apps/pwa/out/settings/index.txt +23 -23
  253. package/apps/pwa/out/setup/done/index.html +1 -1
  254. package/apps/pwa/out/setup/done/index.txt +23 -23
  255. package/apps/pwa/out/setup/index.html +1 -1
  256. package/apps/pwa/out/setup/index.txt +23 -23
  257. package/apps/pwa/out/share/index.html +1 -1
  258. package/apps/pwa/out/share/index.txt +23 -23
  259. package/apps/pwa/out/showroom/index.html +1 -1
  260. package/apps/pwa/out/showroom/index.txt +22 -22
  261. package/apps/pwa/out/tasks/index.html +1 -1
  262. package/apps/pwa/out/tasks/index.txt +23 -23
  263. package/apps/pwa/out/term/index.html +1 -1
  264. package/apps/pwa/out/term/index.txt +23 -23
  265. package/apps/pwa/out/today/index.html +1 -1
  266. package/apps/pwa/out/today/index.txt +23 -23
  267. package/apps/pwa/out/trace/index.html +1 -1
  268. package/apps/pwa/out/trace/index.txt +23 -23
  269. package/apps/pwa/out/vault/index.html +1 -1
  270. package/apps/pwa/out/vault/index.txt +23 -23
  271. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  272. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  273. package/apps/pwa/out/workflows/index.html +1 -1
  274. package/apps/pwa/out/workflows/index.txt +23 -23
  275. package/apps/pwa/out/workspace/index.html +1 -1
  276. package/apps/pwa/out/workspace/index.txt +23 -23
  277. package/apps/pwa/out/worktrees/index.html +1 -1
  278. package/apps/pwa/out/worktrees/index.txt +23 -23
  279. package/catalog/external-commands.yaml +5 -3
  280. package/catalog/meta/catalogVersion.yaml +2 -1
  281. package/catalog/signing/catalog-signing-public.pem +3 -0
  282. package/docs/goal-context/04-mock-scenarios.md +13 -0
  283. package/graphs/catalog/catalog.yaml +1 -1
  284. package/graphs/heal/heal-loop.yaml +1 -0
  285. package/graphs/intake/intake-daily.yaml +16 -0
  286. package/graphs/intake/news-sources.yaml +1 -0
  287. package/graphs/intake/recipes.yaml +7 -0
  288. package/graphs/overlays/examples/research-runtime-empty-terminal.yaml +28 -0
  289. package/graphs/overlays/stop-heal-ladder.yaml +113 -0
  290. package/graphs/profiles/local.yaml +5 -0
  291. package/graphs/profiles/pod.yaml +4 -0
  292. package/graphs/units/verbs/recipes.yaml +11 -11
  293. package/graphs/work/research-report.yaml +10 -2
  294. package/package.json +6 -2
  295. package/plugins/demo-absorption-briefing/plugin.json +18 -0
  296. package/plugins/demo-absorption-briefing/skills/demo-absorption-briefing/SKILL.md +8 -0
  297. package/plugins/demo-browser-hand/plugin.json +13 -0
  298. package/plugins/demo-browser-hand/skills/demo-browser-hand/SKILL.md +8 -0
  299. package/plugins/demo-linear-secretary/plugin.json +15 -0
  300. package/plugins/demo-linear-secretary/skills/demo-linear-secretary/SKILL.md +8 -0
  301. package/plugins/demo-plugin-wizard/plugin.json +11 -0
  302. package/plugins/demo-plugin-wizard/skills/demo-plugin-wizard/SKILL.md +8 -0
  303. package/plugins/demo-research/plugin.json +16 -0
  304. package/plugins/demo-research/skills/demo-research/SKILL.md +8 -0
  305. package/plugins/demo-video-briefing/plugin.json +15 -0
  306. package/plugins/demo-video-briefing/skills/demo-video-briefing/SKILL.md +8 -0
  307. package/scripts/build-signed-catalog.ts +48 -0
  308. package/scripts/ci-typecheck-main-delta.sh +88 -0
  309. package/scripts/codex-fallback-live-probe.ts +1 -1
  310. package/scripts/demo/demo1104-parallel-scenes.ts +301 -0
  311. package/scripts/demo/demo1104-stage.config.ts +21 -0
  312. package/scripts/demo/demo1104-stage.ts +316 -0
  313. package/scripts/goal-method-audit.ts +17 -1
  314. package/scripts/graph-units/land-enqueue.ts +90 -0
  315. package/scripts/heal/run-role.ts +99 -5
  316. package/scripts/hooks/codex-notify.sh +32 -0
  317. package/scripts/install.sh +10 -38
  318. package/scripts/land-global-checks.ts +6 -1
  319. package/scripts/landing-heal/land-plan.ts +57 -0
  320. package/scripts/lib/decompose-ab.ts +1 -0
  321. package/scripts/lib/fixtures/tui-regress/help-insufficient-commands.txt +15 -0
  322. package/scripts/lib/fixtures/tui-regress/help-live.txt +42 -0
  323. package/scripts/lib/fixtures/tui-regress/help-missing-keys.txt +21 -0
  324. package/scripts/lib/fixtures/tui-regress/help-original.txt +51 -0
  325. package/scripts/lib/fixtures/tui-regress/help-shifted-input.txt +26 -0
  326. package/scripts/lib/tui-regress-checks.ts +33 -13
  327. package/scripts/release-loop/auto-approve-node.ts +1 -1
  328. package/scripts/release-loop/gate-autoheal-sim-evidence.ts +60 -0
  329. package/scripts/release-loop/gate-baseline-receipt.ts +47 -9
  330. package/scripts/release-loop/gate-image-pin.ts +81 -0
  331. package/scripts/release-loop/gate-method.ts +139 -0
  332. package/scripts/release-loop/gate-node-sim.ts +207 -0
  333. package/scripts/release-loop/gate-node.ts +463 -64
  334. package/scripts/release-loop/gate-pod-image-sticky-plan.ts +99 -0
  335. package/scripts/release-loop/gate-radius-live.ts +97 -13
  336. package/scripts/release-loop/gate-shard-dispatch.ts +43 -0
  337. package/scripts/release-loop/gate-traffic-mode.ts +151 -3
  338. package/scripts/release-loop/gate-train-receipts.ts +122 -0
  339. package/scripts/release-loop/node-verdict.ts +38 -25
  340. package/scripts/release-loop/preflight.ts +362 -8
  341. package/scripts/release-loop/resume-release.ts +83 -8
  342. package/scripts/release-loop/unattended-release.ts +20 -9
  343. package/scripts/rhythm/daily.ts +36 -4
  344. package/scripts/rhythm/linear-progress-sync.ts +298 -0
  345. package/scripts/ux-sim.ts +18 -1
  346. package/scripts/video-pipeline.ts +9 -1
  347. package/scripts/warm-pool-provider-config.ts +286 -0
  348. package/skills/omni-crawl/SKILL.md +5 -2
  349. package/skills/omni-crawl/scripts/main.ts +84 -23
  350. package/src/acp/agent-manager.ts +1 -0
  351. package/src/acp/codex-app-server-agent.ts +33 -0
  352. package/src/acp/codex-app-server-client.ts +153 -16
  353. package/src/acp/core-turn-bridge.ts +27 -9
  354. package/src/acp/event-router.ts +20 -1
  355. package/src/acp/server.ts +6 -0
  356. package/src/agent/registry.ts +2 -0
  357. package/src/agent/task-notification.ts +25 -5
  358. package/src/agent/types.ts +6 -0
  359. package/src/agent-mission/browser-roundtrip-coordinator.ts +85 -0
  360. package/src/agent-mission/claude-headless.ts +4 -1
  361. package/src/agent-mission/codex-exec.ts +105 -0
  362. package/src/agent-mission/driver.ts +192 -11
  363. package/src/agent-mission/grok-auth-status.ts +47 -0
  364. package/src/agent-mission/hand-hooks.ts +101 -0
  365. package/src/agent-mission/mission-cli.ts +63 -4
  366. package/src/agent-mission/mission-hand-reply.ts +118 -0
  367. package/src/agent-mission/mission-line.ts +180 -0
  368. package/src/agent-mission/mission-out.ts +833 -0
  369. package/src/agent-mission/tool-install.ts +200 -3
  370. package/src/agent-substrate/context-strategy.ts +4 -4
  371. package/src/agent-substrate/self-review-cli.ts +178 -13
  372. package/src/agents/general-purpose.md +1 -1
  373. package/src/auto-research/research-turn.ts +211 -53
  374. package/src/autopilot/pr-manager.ts +69 -10
  375. package/src/autopilot/pty-control-loop.ts +2 -0
  376. package/src/boot/daemon-tools/self-implement.ts +3 -1
  377. package/src/boot/daemon-tools/web-search.ts +1 -2
  378. package/src/briefing/brief-items.ts +55 -11
  379. package/src/capture/tui-self-report.ts +22 -6
  380. package/src/chat/index.ts +1 -1
  381. package/src/cli/agent-cli.ts +2 -1
  382. package/src/cli/catalog-cli.ts +31 -0
  383. package/src/cli/connector-cli.ts +16 -0
  384. package/src/cli/doctor-fix.ts +2 -2
  385. package/src/cli/fixtures/review-loop-breaker/opwaiver-32646-1694ccc7a170.json +1 -0
  386. package/src/cli/fixtures/review-loop-breaker/opwaiver-32853-bd8f73595c83.json +1 -0
  387. package/src/cli/fixtures/review-loop-breaker/opwaiver-33097-1cc85900413c.json +1 -0
  388. package/src/cli/fixtures/review-loop-breaker/opwaiver-33106-972f31e4a3ca.json +1 -0
  389. package/src/cli/fixtures/review-loop-breaker/opwaiver-33113-3ab51f05968f.json +1 -0
  390. package/src/cli/fixtures/review-loop-breaker/pr-33097-1cc85900413c.json +1 -0
  391. package/src/cli/intake-source-cli.ts +44 -8
  392. package/src/cli/msg-cli.ts +32 -3
  393. package/src/cli/pr-cli.ts +21 -1
  394. package/src/cli/pr-land-heavy-remote.ts +75 -5
  395. package/src/cli/pr-land-overlap-evidence.ts +113 -2
  396. package/src/cli/pr-land-pod-shadow-job.ts +202 -4
  397. package/src/cli/pr-land-pod-shadow.ts +9 -2
  398. package/src/cli/release-checklist-read-cli.ts +57 -19
  399. package/src/cli/release-cli.ts +23 -3
  400. package/src/cli/research-cli.ts +13 -5
  401. package/src/cli/setup-cli.ts +166 -6
  402. package/src/cli/setup-keys.ts +187 -0
  403. package/src/cli/task-plugin-wizard-host.ts +114 -0
  404. package/src/cli/tasks-cli.ts +61 -9
  405. package/src/cli/tui-test-cli.ts +186 -0
  406. package/src/compact/auto.ts +8 -1
  407. package/src/config.ts +4 -2
  408. package/src/connectors/linear-daily-progress.ts +228 -0
  409. package/src/connectors/linear-projector.ts +34 -12
  410. package/src/connectors/linear.ts +151 -7
  411. package/src/control-plane/ledger.ts +52 -2
  412. package/src/control-plane/server.ts +16 -2
  413. package/src/core-turn/deep-turn-bloom.ts +67 -0
  414. package/src/core-turn/research-policy.ts +37 -0
  415. package/src/core-turn/run-core-turn.ts +606 -95
  416. package/src/core-turn/run-goal-loop.ts +18 -0
  417. package/src/core-turn/types.ts +4 -0
  418. package/src/dashboard/chat/acp-chat.ts +10 -0
  419. package/src/dashboard/classic-sidetab-mission-job.ts +161 -0
  420. package/src/dashboard/classic-sidetab-mission-pair.ts +81 -0
  421. package/src/dashboard/classic-sidetab-mission-trio.ts +219 -0
  422. package/src/dashboard/classic-sidetab-mission.ts +347 -0
  423. package/src/dashboard/index.ts +517 -18
  424. package/src/dashboard/input/agent-wake.ts +23 -1
  425. package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
  426. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +17 -0
  427. package/src/dashboard/mission-cli-consumer.ts +165 -0
  428. package/src/dashboard/plugin-wizard-runtime.ts +50 -0
  429. package/src/dashboard/plugin-wizard-tool.ts +55 -0
  430. package/src/dashboard/seat-boot-preamble.ts +171 -1
  431. package/src/dashboard/side-basic-runtime.ts +54 -1
  432. package/src/dashboard/sidetab-runtime.ts +90 -1
  433. package/src/dashboard/skill-catalog-preamble.ts +101 -0
  434. package/src/dashboard/skill-detection-runtime.ts +55 -15
  435. package/src/dashboard/slash-runtime/dashboard-handlers.ts +15 -0
  436. package/src/dashboard/terminal-popup-runtime.ts +6 -3
  437. package/src/dashboard/turn-preamble.ts +53 -15
  438. package/src/dashboard/turn-prompt-runtime.ts +4 -2
  439. package/src/decisions/linear-progress-summary.ts +78 -0
  440. package/src/decisions/linear-progress-sync.ts +152 -0
  441. package/src/domains/outbound-alert.ts +49 -11
  442. package/src/domains/telegram-kind-route.ts +16 -9
  443. package/src/graph-runner/arg-allowance.ts +13 -0
  444. package/src/graph-runner/graph-cli.ts +23 -7
  445. package/src/graph-runner/graph-run-api.ts +3 -1
  446. package/src/graph-runner/graph-tick.ts +10 -2
  447. package/src/graph-runner/runner.ts +86 -18
  448. package/src/graph-wizard/mission-compose.ts +407 -12
  449. package/src/grok/agent-search.ts +14 -4
  450. package/src/grok/credential.ts +28 -11
  451. package/src/harness/dispatch-backpressure.ts +54 -1
  452. package/src/harness/dispatch-shadow-compare.ts +74 -0
  453. package/src/harness/harness-cli-command.ts +11 -1
  454. package/src/harness/harness-pod-dispatch.ts +81 -15
  455. package/src/harness/harness-stop.ts +155 -11
  456. package/src/harness/skill-exec.ts +21 -9
  457. package/src/harness/skill-select.ts +1 -1
  458. package/src/hooks/error-report-cloud.ts +101 -0
  459. package/src/hooks/receiver.ts +29 -2
  460. package/src/index.ts +159 -13
  461. package/src/instance/spawn-elanous.ts +6 -4
  462. package/src/intake-plane/actions.ts +354 -0
  463. package/src/intake-plane/adapters/telegram-ambient.ts +34 -18
  464. package/src/intake-plane/intake-sources.ts +78 -8
  465. package/src/intake-plane/items.ts +14 -4
  466. package/src/intake-plane/linear-mission-sync.ts +80 -0
  467. package/src/intake-plane/linear-secretary-runtime.ts +178 -0
  468. package/src/intake-plane/linear-wish.ts +227 -1
  469. package/src/life/life-cli.ts +168 -0
  470. package/src/life/life-kinds.ts +160 -0
  471. package/src/live-supply/budget-consumer.ts +78 -0
  472. package/src/live-supply/read.ts +3 -0
  473. package/src/live-supply/snapshot.ts +45 -0
  474. package/src/llm/provider-credentials.ts +8 -2
  475. package/src/llm.ts +168 -9
  476. package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
  477. package/src/loops/orchestrator/tick.ts +13 -0
  478. package/src/maturity/feature-maturity.ts +4 -4
  479. package/src/msg/msg-sse-server.ts +3 -3
  480. package/src/msg/msg-store.ts +177 -19
  481. package/src/native-tool-catalog.ts +38 -4
  482. package/src/nexus/api/harness-traversal.ts +11 -0
  483. package/src/nexus/api/http-server.ts +37 -1
  484. package/src/nexus/api/mcp-public-allowlist.ts +2 -0
  485. package/src/nexus/index.ts +7 -2
  486. package/src/nexus/outbound/format.ts +9 -0
  487. package/src/nexus/outbound/router.ts +98 -13
  488. package/src/nexus/setup-status.ts +9 -0
  489. package/src/nexus/state/state.ts +3 -0
  490. package/src/oauth/codex-account-store.ts +20 -7
  491. package/src/oauth/codex-owner-mirror.ts +44 -0
  492. package/src/oauth/codex.ts +17 -2
  493. package/src/oauth/fallback-chain.ts +47 -17
  494. package/src/onboarding/first-run-doctor.ts +8 -1
  495. package/src/onboarding/first-run.ts +85 -26
  496. package/src/onboarding/key-setup.ts +103 -0
  497. package/src/onboarding/menu-answer.ts +13 -0
  498. package/src/onboarding/secret-prompt.ts +37 -0
  499. package/src/plugins/install/plugin-install.ts +59 -0
  500. package/src/pr-tool/census.ts +133 -2
  501. package/src/pty-shell/pty-control-ipc.ts +4 -1
  502. package/src/pty-shell/tui-run-state.ts +188 -2
  503. package/src/registry/catalog-server.ts +232 -0
  504. package/src/registry/loader.ts +45 -1
  505. package/src/registry/types.ts +1 -2
  506. package/src/release-loop/checklist-target-path-hint.ts +13 -0
  507. package/src/release-loop/checklist.ts +9 -1
  508. package/src/repl/index.ts +43 -2
  509. package/src/research/axis-fanout.ts +136 -16
  510. package/src/research/bloom-exemplars.ts +3 -1
  511. package/src/research/gap-followup.ts +13 -1
  512. package/src/research/plugin-discovery.ts +36 -14
  513. package/src/research-bridge/invoke.ts +22 -5
  514. package/src/research-bridge/types.ts +2 -0
  515. package/src/self-dev/ask-launch-flow.ts +72 -1
  516. package/src/self-dev/decompose.ts +119 -5
  517. package/src/self-dev/dev-cli.ts +4 -1
  518. package/src/self-dev/dev-pipeline.ts +5 -0
  519. package/src/self-dev/draft-residue.ts +64 -5
  520. package/src/self-dev/graph-front-nodes.ts +2 -1
  521. package/src/self-dev/graph-journey-route.ts +76 -21
  522. package/src/self-dev/launch-preflight-text.ts +5 -6
  523. package/src/self-dev/launch-preflight.ts +58 -0
  524. package/src/self-dev/orchestrate.ts +13 -3
  525. package/src/self-dev/review-provider-fallback.ts +9 -2
  526. package/src/self-dev/run-supervisor.ts +42 -4
  527. package/src/self-dev/run-types.ts +4 -0
  528. package/src/self-dev/shard-aggregate.ts +4 -0
  529. package/src/self-dev/shard-run.ts +36 -15
  530. package/src/self-implement/abandoned-classification.ts +12 -3
  531. package/src/self-implement/budget-gate.ts +7 -0
  532. package/src/self-implement/child-llm-preference.ts +10 -1
  533. package/src/self-implement/doctor-visit.ts +118 -8
  534. package/src/self-implement/elanous-tui-spawn.ts +3 -0
  535. package/src/self-implement/fixtures/tdd-green-missing-passing-child-transcript.txt +2 -0
  536. package/src/self-implement/gate-artifacts.ts +2 -1
  537. package/src/self-implement/goal-author-cli.ts +4 -2
  538. package/src/self-implement/goal-author.ts +684 -7
  539. package/src/self-implement/graph-overlay-yaml.ts +37 -4
  540. package/src/self-implement/graph-overlay.ts +3 -1
  541. package/src/self-implement/graph-profile-yaml.ts +107 -0
  542. package/src/self-implement/graph-yaml.ts +26 -3
  543. package/src/self-implement/headless-elanous-driver.ts +31 -2
  544. package/src/self-implement/heal-intake.ts +112 -4
  545. package/src/self-implement/heal-triage.ts +20 -0
  546. package/src/self-implement/host-regate.ts +27 -4
  547. package/src/self-implement/merge-train.ts +5 -0
  548. package/src/self-implement/off-diff-evidence.ts +249 -5
  549. package/src/self-implement/orchestrator.ts +365 -25
  550. package/src/self-implement/regate-detail.ts +38 -1
  551. package/src/self-implement/rework-child-provider.ts +25 -0
  552. package/src/self-implement/run-chart.ts +122 -0
  553. package/src/self-implement/run-ledger.ts +162 -11
  554. package/src/self-implement/run-stop.ts +188 -4
  555. package/src/self-implement/runtime-overlay-run-steps.ts +95 -0
  556. package/src/self-implement/stop-autoheal.ts +13 -0
  557. package/src/self-implement/tdd-evidence-tags.ts +9 -0
  558. package/src/self-implement/train-gate-receipt.ts +166 -0
  559. package/src/self-implement/train-gate-remote.ts +62 -18
  560. package/src/session/chat.ts +40 -4
  561. package/src/session/session-fanout.ts +2 -0
  562. package/src/session/streaming/acp-stream-sink.ts +2 -1
  563. package/src/session/streaming/chunk-producer.ts +6 -0
  564. package/src/session/streaming/stream-compositor.ts +3 -2
  565. package/src/session-runtime/index.ts +135 -5
  566. package/src/session-runtime/retry-policy.ts +1 -1
  567. package/src/session-runtime/tier-flip.ts +3 -3
  568. package/src/setup/llm-env-detect.ts +3 -0
  569. package/src/setup/service-key-catalog.ts +46 -0
  570. package/src/setup/service-keys.ts +241 -0
  571. package/src/sidetab-core/model.ts +19 -5
  572. package/src/sidetab-core/visible-agent-mission.ts +262 -0
  573. package/src/skills/name-match.ts +20 -0
  574. package/src/skills/tools/agent.ts +53 -6
  575. package/src/skills/tools/omni-search.ts +173 -13
  576. package/src/task-agent/parent-host.ts +10 -0
  577. package/src/task-agent/pod-distributor-entry.ts +3 -0
  578. package/src/task-agent/repair-outcomes.ts +65 -0
  579. package/src/task-agent/task-hand.ts +47 -7
  580. package/src/task-orchestrator/dispatcher.ts +14 -1
  581. package/src/task-orchestrator/linear-capture-events.ts +55 -0
  582. package/src/task-orchestrator/store.ts +16 -5
  583. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +4 -0
  584. package/src/task-orchestrator/surfaces/pod-distributor.ts +48 -0
  585. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +92 -1
  586. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
  587. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
  588. package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +33 -6
  589. package/src/task-orchestrator/surfaces/pod-source-bundle.ts +45 -9
  590. package/src/task-orchestrator/surfaces/pod-source-receive.ts +178 -16
  591. package/src/task-orchestrator/surfaces/pod-source-spec.ts +3 -3
  592. package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
  593. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +237 -41
  594. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +80 -3
  595. package/src/task-orchestrator/surfaces/self-implement-pod.ts +337 -51
  596. package/src/task-orchestrator/surfaces/self-implement.ts +27 -3
  597. package/src/task-orchestrator/surfaces/warm-reuse-evidence.ts +169 -0
  598. package/src/task-orchestrator/types.ts +14 -0
  599. package/src/telegram.ts +14 -16
  600. package/src/terminal/coding-agent.ts +14 -5
  601. package/src/terminal/session-registry.ts +1 -1
  602. package/src/tokens.ts +35 -2
  603. package/src/tool-hints/gate.ts +1 -0
  604. package/src/tool-runtime/agent-runtime.ts +2 -0
  605. package/src/tool-runtime/browser-hand-runtime.ts +381 -0
  606. package/src/tool-runtime/browser-runtime.ts +2 -1
  607. package/src/tool-runtime/elanous-linear-issue-runtime.ts +76 -0
  608. package/src/tool-runtime/elanous-linear-secretary-runtime.ts +57 -0
  609. package/src/tool-runtime/elanous-skills-list-runtime.ts +5 -1
  610. package/src/tool-runtime/graph-mcp-runtimes.ts +240 -0
  611. package/src/tool-runtime/index.ts +6 -0
  612. package/src/tool-runtime/skill-exec-runtime.ts +33 -13
  613. package/src/tool-runtime/types.ts +4 -0
  614. package/src/tui/entry.ts +38 -5
  615. package/src/tui/sidetab/attach.ts +177 -1
  616. package/src/tui/sidetab/herdr-portal.ts +225 -0
  617. package/src/tui-client/local-chat-turn.ts +26 -13
  618. package/src/tui.ts +22 -0
  619. package/src/user-config.ts +34 -9
  620. package/src/user-intent/types.ts +4 -3
  621. package/src/ux-sim/browser-hand.ts +165 -0
  622. package/src/ux-sim/draft-inventory-builder.ts +198 -0
  623. package/src/ux-sim/fake-browser-page.ts +81 -0
  624. package/src/ux-sim/fake-kubectl.ts +37 -3
  625. package/src/ux-sim/fake-linear-device.ts +31 -0
  626. package/src/ux-sim/fault-pool-cap.ts +11 -6
  627. package/src/ux-sim/graph-engine-sim.ts +47 -0
  628. package/src/ux-sim/linear-secretary.ts +216 -0
  629. package/src/ux-sim/mock-scenario-catalog.json +93 -0
  630. package/src/ux-sim/mock-scenario-catalog.ts +274 -0
  631. package/src/ux-sim/onboarding-first-run-device.ts +31 -21
  632. package/src/ux-sim/scenario.ts +185 -48
  633. package/src/ux-sim/service-key-setup.ts +50 -0
  634. package/src/ux-sim/term-slash-device.ts +74 -0
  635. package/src/ux-sim/turn-throw-sim.ts +31 -0
  636. package/src/version/packed-revision.json +1 -1
  637. package/src/voice/voice-tts-singleton.ts +18 -3
  638. package/src/web-search/exa.ts +77 -0
  639. package/src/web-search/grok.ts +5 -9
  640. package/src/web-search/index.ts +30 -9
  641. package/src/web-search/provider.ts +4 -1
  642. package/src/web-search/x-intent.ts +5 -0
  643. package/apps/pwa/out/_next/static/chunks/1115.434ae2ecb0ad986d.js +0 -149
  644. package/apps/pwa/out/_next/static/chunks/1121.667cec0bcdbb3fdb.js +0 -36
  645. package/apps/pwa/out/_next/static/chunks/1197-54da59d250a6e476.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/1245.1cfd13b26dbd71d6.js +0 -287
  647. package/apps/pwa/out/_next/static/chunks/1494-f93046ff5c5a124d.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/1609.2b312797599b8e45.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/1661.0dd330f3d89f73f3.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/167-0c121e4b47e0f9da.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/1700.cdc2bf8cc685e221.js +0 -90
  652. package/apps/pwa/out/_next/static/chunks/1703-78e46acad29f3cfc.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/1765.679b29625c8e88d4.js +0 -77
  654. package/apps/pwa/out/_next/static/chunks/1971-7efb628c471dc5a0.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/1999-8de7b7bb36801913.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/2073.689dcb2680113d76.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/2198-557d49184104d165.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/221-440ce67fa9f5c839.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/2427-8ed8e98624cbd664.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/2457-725c5827bc003795.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/2491-2718b15a5ccb75a5.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/2527-5c636a43c7cc5dde.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/2692-1027cb16fe4ccf49.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/2773.0e80b9d325fb5635.js +0 -32
  665. package/apps/pwa/out/_next/static/chunks/2873-0f3cb56c8e3528ea.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/3097.864e92bdaa2f4d15.js +0 -79
  667. package/apps/pwa/out/_next/static/chunks/3136-d6870ba63300a93e.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/3173-0289113d434e83b7.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/325-dd9208a1a0ab7ce4.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/3283.528f430dd043fb4e.js +0 -74
  671. package/apps/pwa/out/_next/static/chunks/3295.cc8cb13b8f0dae1a.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/3688-86e3b88abf18cb3b.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/3804-7220467a5473a8df.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/3808.3e1e247ce7bdf889.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/3927.b5473ad109da44c5.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/3934-98ea94832e194796.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/4156.ba4de4a3664f04b4.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/4297-239ca82f293faab0.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/4320-dcc5a7734126f4c9.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/4434.94b4c552a2d91e69.js +0 -148
  681. package/apps/pwa/out/_next/static/chunks/4579.03e4092f73950965.js +0 -226
  682. package/apps/pwa/out/_next/static/chunks/4667.97e31aa38c95c475.js +0 -309
  683. package/apps/pwa/out/_next/static/chunks/4702.4a4adc1f16d7c93b.js +0 -64
  684. package/apps/pwa/out/_next/static/chunks/4815.481501c57b3568d9.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/487-d16e698ef14662d9.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/4888-7a38bf522c9cc6fe.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/5034-30e429d6bb086881.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/5040-35c494e60dadd97d.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/50c6ab1e.81a96e419350909d.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/5154.4b6a836179356f30.js +0 -94
  691. package/apps/pwa/out/_next/static/chunks/5228-a8200df486278f2d.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/5379.97af106d09566f69.js +0 -8
  693. package/apps/pwa/out/_next/static/chunks/5479-b6372e762719f92f.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/5534-699c5cbcbc96c5d7.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/5701.9c4e8f250312eeee.js +0 -24
  696. package/apps/pwa/out/_next/static/chunks/5892.2526d962339662d8.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/5937.c2df9e3447e1f667.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/5941.8210cc93c9202c0a.js +0 -286
  699. package/apps/pwa/out/_next/static/chunks/5975.4004f820ae3cecd5.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/6142-7ccd48795d7abd55.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/6160.bf9177b8c1bfb243.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/6398.71ba0690c8027555.js +0 -27
  703. package/apps/pwa/out/_next/static/chunks/6492.2bd5c10edc1a064e.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/6552.a3840aa7da35ad68.js +0 -62
  705. package/apps/pwa/out/_next/static/chunks/6736.1e36d3ac5fa5e41d.js +0 -24
  706. package/apps/pwa/out/_next/static/chunks/6900.3ccbe069bdd4556a.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/71327eb4.add50b365f94bf3a.js +0 -122
  708. package/apps/pwa/out/_next/static/chunks/7136.deca3e3a2ddaa374.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/7139-ee9f8ed2677a40b3.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/7191.fdc955f7d96064a4.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/7423-e0aa5d9e2962120e.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/7453.afc1ea7e05d56a8c.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/7503-5e6a3d7fe67e4a0c.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/7761-476fd7bf768abd34.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/7975.eafb12097a0a9e62.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/8050-9b364bdef8f71927.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/8152.64e253c35cccfaae.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/8190.620f0231b3924bcb.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/8448.45b6b1f1a99eeb35.js +0 -104
  720. package/apps/pwa/out/_next/static/chunks/8464-e24f10451b658aac.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/8477.e4c944bb3aa5d2f3.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/8710.ca385257d5ca422e.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/8830.627ccf294ec2465c.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/8880.64c445592f04acaf.js +0 -1
  725. package/apps/pwa/out/_next/static/chunks/8981.c706964c8ba27aff.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/9053.bd0fffaff8d3f836.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/9161-c66e723d7ec9d682.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/9185.1ecdf9b65c0bb684.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/9356.fccd5f58086b4ff5.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/9446.dc0406109371d329.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/9506.dcf25d467a42627e.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/9541.eb8e2f8480c7feca.js +0 -93
  733. package/apps/pwa/out/_next/static/chunks/9577.ed7582186efa5482.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/9579.4a8169600fff2058.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/9642-ff2e039eb62e3b92.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/9659-8f2323348113ad80.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/9724.4c5623af2db43153.js +0 -34
  738. package/apps/pwa/out/_next/static/chunks/9869.81a1e24ca682d5a0.js +0 -1
  739. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-8d9d76ea322d855c.js +0 -1
  740. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed2c4e59f9f1fe21.js +0 -1
  741. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-2dc99e03c5d76ca0.js +0 -1
  742. package/apps/pwa/out/_next/static/chunks/app/board/page-b5a3a788330e920f.js +0 -1
  743. package/apps/pwa/out/_next/static/chunks/app/botlab/page-14949db884bfa672.js +0 -1
  744. package/apps/pwa/out/_next/static/chunks/app/bots/page-ea76c85b36388a97.js +0 -1
  745. package/apps/pwa/out/_next/static/chunks/app/ceo/page-01716d20af62d325.js +0 -1
  746. package/apps/pwa/out/_next/static/chunks/app/chat/page-62baf6881a64b1e9.js +0 -1
  747. package/apps/pwa/out/_next/static/chunks/app/consult/page-f89ba590c2af8afa.js +0 -1
  748. package/apps/pwa/out/_next/static/chunks/app/control/page-22f8b0f78d9637e5.js +0 -1
  749. package/apps/pwa/out/_next/static/chunks/app/decisions/page-817f9d7e6820be80.js +0 -1
  750. package/apps/pwa/out/_next/static/chunks/app/design-check/page-ffb9bc0d2650249a.js +0 -1
  751. package/apps/pwa/out/_next/static/chunks/app/editor/page-f6d0e64873c0f629.js +0 -1
  752. package/apps/pwa/out/_next/static/chunks/app/exec/page-8bfa0d4ba23a209d.js +0 -1
  753. package/apps/pwa/out/_next/static/chunks/app/field/page-f5060462249e32c7.js +0 -1
  754. package/apps/pwa/out/_next/static/chunks/app/healthz/route-8d9d76ea322d855c.js +0 -1
  755. package/apps/pwa/out/_next/static/chunks/app/inside/page-b2049f8b1ef79117.js +0 -1
  756. package/apps/pwa/out/_next/static/chunks/app/intake/page-1446c5fa93907f11.js +0 -1
  757. package/apps/pwa/out/_next/static/chunks/app/layout-b48a7a07c5204156.js +0 -1
  758. package/apps/pwa/out/_next/static/chunks/app/live/page-e974b8c4ca47614c.js +0 -1
  759. package/apps/pwa/out/_next/static/chunks/app/live-run/page-8a919b869bd28594.js +0 -1
  760. package/apps/pwa/out/_next/static/chunks/app/loops/page-d31b8de6bfcd72ed.js +0 -1
  761. package/apps/pwa/out/_next/static/chunks/app/market/page-64765f817909db29.js +0 -1
  762. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-d128c8569a36ee9b.js +0 -1
  763. package/apps/pwa/out/_next/static/chunks/app/morning/page-b2679d357e9b9270.js +0 -1
  764. package/apps/pwa/out/_next/static/chunks/app/not-found-6fabec98a9e7b269.js +0 -1
  765. package/apps/pwa/out/_next/static/chunks/app/observatory/page-048f30149dcf1349.js +0 -1
  766. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-9113181d6b5a2725.js +0 -1
  767. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-1e7a755a13227611.js +0 -1
  768. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3c8f8b67a203cf07.js +0 -1
  769. package/apps/pwa/out/_next/static/chunks/app/page-18032f5437215062.js +0 -1
  770. package/apps/pwa/out/_next/static/chunks/app/reflection/page-da3b739192fd0ee3.js +0 -1
  771. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d332545571bd6fd1.js +0 -1
  772. package/apps/pwa/out/_next/static/chunks/app/sessions/page-5237aa5b3f3b8ec5.js +0 -1
  773. package/apps/pwa/out/_next/static/chunks/app/settings/page-d16e56c3989c147e.js +0 -1
  774. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6b6593600869e2cd.js +0 -1
  775. package/apps/pwa/out/_next/static/chunks/app/setup/layout-8d9d76ea322d855c.js +0 -1
  776. package/apps/pwa/out/_next/static/chunks/app/setup/page-29e8b8a8396b55cb.js +0 -1
  777. package/apps/pwa/out/_next/static/chunks/app/share/page-b3414d856a1a7e2f.js +0 -1
  778. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c3affa52b7ce961b.js +0 -1
  779. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f21dddf9f95b6fab.js +0 -1
  780. package/apps/pwa/out/_next/static/chunks/app/term/page-f5a30a24745bf088.js +0 -1
  781. package/apps/pwa/out/_next/static/chunks/app/today/page-8c8569a09b4d4e34.js +0 -1
  782. package/apps/pwa/out/_next/static/chunks/app/trace/page-2ce32722c0243483.js +0 -1
  783. package/apps/pwa/out/_next/static/chunks/app/vault/page-4767b0d9c0a98c6c.js +0 -1
  784. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-116ee1339c387a75.js +0 -1
  785. package/apps/pwa/out/_next/static/chunks/app/workflows/page-35e8c50ca4ef7ffc.js +0 -1
  786. package/apps/pwa/out/_next/static/chunks/app/workspace/page-52e17113356bb891.js +0 -1
  787. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7458ae05ed2ac1a0.js +0 -1
  788. package/apps/pwa/out/_next/static/chunks/framework-ad6c9dd524ad6ef8.js +0 -1
  789. package/apps/pwa/out/_next/static/chunks/main-app-2ddd1f2b44d6aa59.js +0 -1
  790. package/apps/pwa/out/_next/static/chunks/main-e3d82bdc358d20c5.js +0 -1
  791. package/apps/pwa/out/_next/static/chunks/pages/_app-71d5aa3896e1655f.js +0 -1
  792. package/apps/pwa/out/_next/static/chunks/pages/_error-03ffc54e00438546.js +0 -1
  793. package/apps/pwa/out/_next/static/chunks/webpack-56bb89af5a611d0b.js +0 -1
  794. package/apps/pwa/out/_next/static/css/be9019f696217521.css +0 -1
  795. package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +0 -1
  796. /package/apps/pwa/out/_next/static/{GiOLWmt4MqDZePubBjA4Q → Om5xS9jpjSXJCeTNGYEi4}/_ssgManifest.js +0 -0
@@ -1,7 +1,10 @@
1
+ #!/usr/bin/env bun
2
+ import { readFileSync } from 'node:fs';
1
3
  import type { PoolKubectl } from '../task-orchestrator/surfaces/pod-pool.js';
2
4
 
3
5
  /** In-memory Kubernetes boundary for real pool admission and warm-provider tests. Unknown operations fail closed. */
4
- export function createFakeKubectl(options: { context: string; node: string; jobState?: 'running' | 'complete' }) {
6
+ export function createFakeKubectl(options: { context: string; node: string; jobState?: 'running' | 'complete';
7
+ failGetPods?: string; podReadinessOnCreate?: boolean }) {
5
8
  const jobs = new Map<string, Record<string, unknown>>();
6
9
  const pods = new Map<string, Record<string, any>>();
7
10
  const calls: string[][] = [];
@@ -9,6 +12,7 @@ export function createFakeKubectl(options: { context: string; node: string; jobS
9
12
  const jobCreates: string[] = [];
10
13
  const jobDeletes: string[] = [];
11
14
  let lease: { workerId: string; podUid: string; key: unknown; job?: string; state: 'idle' | 'leased' | 'released' | 'quarantined' } | null = null;
15
+ let loseNextLeaseResponse = false;
12
16
  const ok = (value: unknown) => ({ status: 0, stdout: JSON.stringify(value), stderr: '' });
13
17
  const missing = (kind: string) => ({ status: 1, stdout: '', stderr: `${kind} not found` });
14
18
  const kubectl: PoolKubectl = (args, input) => {
@@ -59,7 +63,10 @@ export function createFakeKubectl(options: { context: string; node: string; jobS
59
63
  if (query.includes('.status.conditions')) return { status: 0, stdout: (job.status as { conditions?: Array<{ type?: string }> })?.conditions?.map((condition) => condition.type).join(' ') ?? '', stderr: '' };
60
64
  return ok(job);
61
65
  }
62
- if (verb === 'get' && args[at + 1] === 'pods') return ok({ items: [...pods.values()] });
66
+ if (verb === 'get' && args[at + 1] === 'pods') {
67
+ if (options.failGetPods) return { status: 1, stdout: '', stderr: options.failGetPods };
68
+ return ok({ apiVersion: 'v1', kind: 'PodList', metadata: { resourceVersion: '1', continue: '' }, items: [...pods.values()] });
69
+ }
63
70
  if (verb === 'get' && (args[at + 1] === 'pod' || args[at + 1]?.startsWith('pod/'))) {
64
71
  const name = args[at + 1] === 'pod' ? args[at + 2] : args[at + 1]?.slice(4);
65
72
  const pod = pods.get(name ?? '');
@@ -70,7 +77,8 @@ export function createFakeKubectl(options: { context: string; node: string; jobS
70
77
  try { manifest = JSON.parse(input); } catch { return missing('invalid manifest'); }
71
78
  const name = manifest.metadata?.name;
72
79
  if (typeof name !== 'string' || pods.has(name)) return missing('existing or invalid pod');
73
- const created = { ...manifest, metadata: { ...manifest.metadata, uid: `${name}-uid`, resourceVersion: '1' } };
80
+ const created = { ...manifest, metadata: { ...manifest.metadata, uid: `${name}-uid`, resourceVersion: '1' },
81
+ ...(options.podReadinessOnCreate ? { status: { phase: 'Running', conditions: [{ type: 'Ready', status: 'True' }] } } : {}) };
74
82
  pods.set(name, created);
75
83
  return ok(created);
76
84
  }
@@ -102,6 +110,10 @@ export function createFakeKubectl(options: { context: string; node: string; jobS
102
110
  if (!lease || lease.state !== 'idle' || (lease.job && !jobs.has(lease.job)))
103
111
  return Response.json({ unavailable: true }, { status: 503 });
104
112
  lease.state = 'leased';
113
+ if (loseNextLeaseResponse) {
114
+ loseNextLeaseResponse = false;
115
+ throw new TypeError('simulated response lost after lease commit');
116
+ }
105
117
  return Response.json({ name: lease.workerId, attrs: { key: lease.key, leaseId: 'lease-1',
106
118
  generation: 1, podUid: lease.podUid, state: 'leased' } });
107
119
  }
@@ -127,6 +139,7 @@ export function createFakeKubectl(options: { context: string; node: string; jobS
127
139
  setWarmLease: (value: { workerId: string; podUid: string; key: unknown; job?: string }) => {
128
140
  lease = { ...value, state: 'idle' };
129
141
  },
142
+ loseNextLeaseResponse: () => { loseNextLeaseResponse = true; },
130
143
  warmLeaseState: () => lease?.state ?? null,
131
144
  putPod: (pod: Record<string, any>) => { pods.set(pod.metadata.name, structuredClone(pod)); },
132
145
  replacePodUid: (name: string, uid: string) => {
@@ -140,3 +153,24 @@ export function createFakeKubectl(options: { context: string; node: string; jobS
140
153
  hasJob: (name: string) => jobs.has(name),
141
154
  };
142
155
  }
156
+
157
+ if (import.meta.main) {
158
+ const endpoint = process.env.ELANOUS_FAKE_KUBECTL_URL;
159
+ if (!endpoint) {
160
+ process.stderr.write('fake-kubectl requires ELANOUS_FAKE_KUBECTL_URL\n');
161
+ process.exitCode = 2;
162
+ } else {
163
+ try {
164
+ const input = readFileSync(0, 'utf8');
165
+ const response = await fetch(endpoint, { method: 'POST', headers: { 'content-type': 'application/json' },
166
+ body: JSON.stringify({ args: process.argv.slice(2), input }) });
167
+ const result = await response.json() as { status: number | null; stdout: string; stderr: string };
168
+ if (result.stdout) process.stdout.write(result.stdout);
169
+ if (result.stderr) process.stderr.write(result.stderr);
170
+ process.exitCode = result.status ?? 2;
171
+ } catch (error) {
172
+ process.stderr.write(`fake-kubectl: ${error instanceof Error ? error.message : String(error)}\n`);
173
+ process.exitCode = 2;
174
+ }
175
+ }
176
+ }
@@ -0,0 +1,31 @@
1
+ import type { BrowserHandDeps } from '../tool-runtime/browser-hand-runtime.js';
2
+
3
+ interface FakeLinearAttachment {
4
+ issueId: string;
5
+ title: string;
6
+ url: string;
7
+ }
8
+
9
+ /** Fake Linear's network API while preserving the production coordinator's calls. */
10
+ export function createFakeLinearDevice() {
11
+ const uploads: Array<{ filename: string; contentType: string; body: Buffer }> = [];
12
+ const attachments: FakeLinearAttachment[] = [];
13
+ const comments: Array<{ issueId: string; body: string }> = [];
14
+
15
+ const deps: Pick<BrowserHandDeps, 'upload' | 'attach' | 'reflectSelection'> = {
16
+ upload: async input => {
17
+ uploads.push({ filename: input.filename, contentType: input.contentType, body: Buffer.from(input.body) });
18
+ return `https://linear-sim.invalid/files/${uploads.length}`;
19
+ },
20
+ attach: async input => {
21
+ attachments.push({ issueId: input.issueId, title: input.title, url: input.url });
22
+ return `linear-attachment-${attachments.length}`;
23
+ },
24
+ reflectSelection: async input => {
25
+ comments.push(input);
26
+ return true;
27
+ },
28
+ };
29
+
30
+ return { deps, uploads, attachments, comments };
31
+ }
@@ -18,12 +18,14 @@ export interface PoolCapScenario {
18
18
  readonly spec: string;
19
19
  /** 멤버(컨텍스트)마다 지금 Running 인 하니스 Pod 수 — 멤버마다 «반드시» 준다(빠지면 0 으로 꾸미지 않고 던진다). */
20
20
  readonly running: Readonly<Record<string, number>>;
21
+ /** Query failures for a context stay unknown and suppress the admission recommendation. */
22
+ readonly queryFailures?: Readonly<Record<string, string>>;
21
23
  }
22
24
 
23
25
  export interface PoolCapObservation {
24
26
  readonly scenario: PoolCapScenario;
25
- readonly members: ReadonlyArray<{ context: string; capacity: number; capacityDefaulted: boolean; running: number }>;
26
- readonly recommendation: PoolLeaseRecommendation;
27
+ readonly members: ReadonlyArray<{ context: string; capacity: number; capacityDefaulted: boolean; running?: number; queryError?: string }>;
28
+ readonly recommendation: PoolLeaseRecommendation | null;
27
29
  }
28
30
 
29
31
  /** 메모리·CPU 가 넉넉한 노드 한 대 — 승인이 상한(capacity)으로만 갈리게 한다. */
@@ -48,10 +50,13 @@ export function simPoolCap(scenario: PoolCapScenario): PoolCapObservation {
48
50
  const parsed = parsePodPool(scenario.spec);
49
51
  const members = parsed.map((m) => ({
50
52
  context: m.context, capacity: m.capacity, capacityDefaulted: (m as { capacityDefaulted?: boolean }).capacityDefaulted === true,
51
- running: runningOf(scenario, m.context),
53
+ ...(scenario.queryFailures?.[m.context]
54
+ ? { queryError: scenario.queryFailures[m.context] }
55
+ : { running: runningOf(scenario, m.context) }),
52
56
  }));
57
+ if (members.some((member) => member.queryError)) return { scenario, members, recommendation: null };
53
58
  const recommendation = recommendConcurrency(
54
- { members: members.map((m) => roomyMember(m.context, m.capacity, m.capacityDefaulted, m.running)) },
59
+ { members: members.map((m) => roomyMember(m.context, m.capacity, m.capacityDefaulted, m.running!)) },
55
60
  { capacity: members.reduce((sum, m) => sum + m.capacity, 0), accounts: -1, perAccount: -1 },
56
61
  );
57
62
  return { scenario, members, recommendation };
@@ -74,8 +79,8 @@ export function renderPoolCap(rows: readonly PoolCapObservation[]): string[] {
74
79
  return [
75
80
  'pool-cap · `:N` 없는 멤버 = 기본 상한 2(capacityDefaulted)',
76
81
  ...rows.map((r) => {
77
- const occ = r.members.map((m) => `${m.context} ${m.running}/${m.capacity}${m.capacityDefaulted ? '(기본)' : ''}`).join(' · ');
78
- return ` ${r.scenario.spec.padEnd(36)} ${occ.padEnd(40)} → 승인 ${String(r.recommendation.recommended)} · limitedBy=${String(r.recommendation.limitedBy)}`;
82
+ const occ = r.members.map((m) => `${m.context} ${m.running === undefined ? 'unknown' : m.running}/${m.capacity}${m.capacityDefaulted ? '(기본)' : ''}${m.queryError ? ` query-error=${m.queryError}` : ''}`).join(' · ');
83
+ return ` ${r.scenario.spec.padEnd(36)} ${occ.padEnd(40)} → 승인 ${String(r.recommendation?.recommended ?? 'unknown')} · limitedBy=${String(r.recommendation?.limitedBy ?? 'unknown')}`;
79
84
  }),
80
85
  ];
81
86
  }
@@ -0,0 +1,47 @@
1
+ import { nextNode, withGrowth } from '../graph-runner/runner.js';
2
+ import type { GraphGrowth } from '../graph-runner/graph-grow.js';
3
+ import type { GraphEdgeSpec, GraphTemplateSpec } from '../self-implement/graph-yaml.js';
4
+
5
+ /** Synthetic component result supplied to the simulator; no node executor or external effect is run. */
6
+ export interface GraphEngineSimExit {
7
+ readonly nodeId: string;
8
+ readonly outcome: 'success' | 'failure' | 'missing' | 'stuck' | 'budget-exceeded' | (string & {});
9
+ }
10
+
11
+ export interface GraphEngineSimObservation {
12
+ readonly from: string;
13
+ readonly outcome: string;
14
+ readonly to?: string;
15
+ readonly growthApplied: boolean;
16
+ readonly sourceGraphUnchanged: boolean;
17
+ }
18
+
19
+ /**
20
+ * GRAPH-ENGINE-SIM: inject only a component's exit label and run the production graph-growth and
21
+ * edge-selector functions. This is a selector device, not a simulated executor or live graph run.
22
+ */
23
+ export function simGraphEngineSelection(input: {
24
+ graph: GraphTemplateSpec;
25
+ exit: GraphEngineSimExit;
26
+ growth?: GraphGrowth;
27
+ }): GraphEngineSimObservation {
28
+ const sourceEdges = input.graph.edges;
29
+ const graph = input.growth ? withGrowth(input.graph, [input.growth]) : input.graph;
30
+ const isSuccess = input.exit.outcome === 'success';
31
+ const to = nextNode(graph.edges, input.exit.nodeId, isSuccess ? 'ok' : 'fail', input.exit.outcome);
32
+ return {
33
+ from: input.exit.nodeId,
34
+ outcome: input.exit.outcome,
35
+ ...(to === undefined ? {} : { to }),
36
+ growthApplied: graph !== input.graph,
37
+ sourceGraphUnchanged: input.graph.edges === sourceEdges,
38
+ };
39
+ }
40
+
41
+ /** Small receipt useful to command-line and test consumers. */
42
+ export function renderGraphEngineSim(observation: GraphEngineSimObservation): string {
43
+ return `${observation.from} --${observation.outcome}--> ${observation.to ?? '(no edge)'} · growth=${observation.growthApplied ? 'applied' : 'none'} · source-unchanged=${observation.sourceGraphUnchanged}`;
44
+ }
45
+
46
+ /** Keep the production selector's accepted edge shape visible to device authors. */
47
+ export type GraphEngineSimEdges = readonly GraphEdgeSpec[];
@@ -0,0 +1,216 @@
1
+ // Integrated, test-only scene 2 device. Production coordinators run against fake external I/O.
2
+ import { mkdtempSync, rmSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { randomUUID } from 'node:crypto';
6
+ import { createTelegramAmbientMessageHandler } from '../intake-plane/adapters/telegram-ambient.js';
7
+ import { createLinearSecretaryBreakdown, updateLinearSecretaryProgress, type LinearSecretaryPlan } from '../intake-plane/linear-wish.js';
8
+ import { submitIntakeWork } from '../intake-plane/submit-intake-work.js';
9
+ import { DecisionLedger } from '../decisions/decision-ledger.js';
10
+ import { DecisionCardService, type CardRef, type CardTransport, type CardView } from '../decisions/decision-cards.js';
11
+ import { LogStore } from '../mss/logging/log-store.js';
12
+ import { simBrowserHand } from './browser-hand.js';
13
+
14
+ const NOW = new Date('2026-10-31T00:00:00.000Z');
15
+ const REQUEST = 'https://example.test/demo/brief 11-04 데모 준비를 리니어로 정리해줘';
16
+ const PLAN: LinearSecretaryPlan = {
17
+ title: '11-04 데모 준비', rationale: '무대·흡수·브라우저·승인 경계를 근거가 보이게 나눴습니다.',
18
+ assigneeId: 'fake-owner', dueDate: '2026-11-05',
19
+ tasks: [
20
+ { title: '무대 자료 확인', intent: '요청의 공개 근거를 확인한다', refs: ['https://example.test/demo/brief'], assigneeId: 'fake-owner', dueDate: '2026-11-05' },
21
+ { title: '흡수 자료 연결', intent: '흡수한 자료를 하위 태스크에 연결한다', refs: ['https://example.test/demo/absorb'], assigneeId: 'fake-owner', dueDate: '2026-11-05' },
22
+ { title: '브라우저 캡처 첨부', intent: '승인된 브라우저 캡처를 같은 태스크에 붙인다', refs: ['https://example.test/demo/browser'], assigneeId: 'fake-owner', dueDate: '2026-11-05' },
23
+ ],
24
+ };
25
+
26
+ export interface LinearSecretarySimulationResult {
27
+ runId: string;
28
+ evidencePath: string;
29
+ cleanup(): void;
30
+ reply: string | null;
31
+ parentIssueId: string;
32
+ intakeIds: string[];
33
+ childIssueIds: string[];
34
+ completedIssueIds: string[];
35
+ childEvidence: Array<{ issueId: string; description: string }>;
36
+ linearAttachments: Array<{ issueId: string; url: string }>;
37
+ progressCommentCount: number;
38
+ browserAttachment: { issueId: string; url: string } | null;
39
+ approvalCard: { id: string; text: string; buttons: CardView['buttons'] } | null;
40
+ approvalCardStatus: string | null;
41
+ browserRunId: string | null;
42
+ browserActionRunIds: Array<string | null>;
43
+ externalCalls: number;
44
+ runEvents: string[];
45
+ runEvidence: { category: string; event: string; persisted: boolean };
46
+ }
47
+
48
+ export async function simLinearSecretary(): Promise<LinearSecretarySimulationResult> {
49
+ const root = mkdtempSync(join(tmpdir(), 'ux-sim-linear-secretary-'));
50
+ const runId = randomUUID();
51
+ const store = new LogStore(join(root, 'logs', 'logs.db'), { instance: 'ux-sim' });
52
+ let retainEvidence = false;
53
+ const eventNames: string[] = [];
54
+ const event = (name: string, data: Record<string, unknown> = {}): void => {
55
+ eventNames.push(name);
56
+ store.insertBatch([{ surface: 'ux-sim', rec: { ts: NOW.toISOString(), category: 'ux.sim.linear-secretary', event: name,
57
+ level: 'debug', data: { runId, ...data } } }]);
58
+ };
59
+ let externalCalls = 0;
60
+ const descriptions = new Map<string, string>();
61
+ const states = new Map<string, string>();
62
+ const attachments: Array<{ issueId: string; url: string }> = [];
63
+ const comments: Array<{ issueId: string; body: string }> = [];
64
+ const childEvidence: Array<{ issueId: string; description: string }> = [];
65
+ let nextIssue = 0;
66
+ let parentIssueId = '';
67
+ let intakeIds: string[] = [];
68
+ let childIssueIds: string[] = [];
69
+ let completedIssueIds: string[] = [];
70
+ let browserAttachment: { issueId: string; url: string } | null = null;
71
+ let reply: string | null = null;
72
+ let approvalCard: LinearSecretarySimulationResult['approvalCard'] = null;
73
+ let approvalCardStatus: string | null = null;
74
+ let approvalDecisionId: string | undefined;
75
+ let browserRunId: string | null = null;
76
+ let browserActionRunIds: Array<string | null> = [];
77
+ let failure: string | undefined;
78
+ const fakeFetch = (async (_url: string | URL | Request, init?: RequestInit) => {
79
+ externalCalls++;
80
+ if (typeof init?.body !== 'string') throw new Error('fake Linear expected a JSON GraphQL POST body');
81
+ let body: { query?: unknown; variables?: Record<string, unknown> };
82
+ try { body = JSON.parse(init.body) as typeof body; }
83
+ catch { throw new Error('fake Linear expected valid JSON GraphQL POST body'); }
84
+ if (typeof body.query !== 'string') throw new Error('fake Linear GraphQL body is missing its query');
85
+ const id = String(body.variables?.id ?? '');
86
+ if (body.query.includes('LinearIssueStatus')) return Response.json({ data: { issue: { state: { type: states.get(id) ?? 'started' } } } });
87
+ if (body.query.includes('DecisionIssueStates')) return Response.json({ data: { issue: { team: { states: { nodes: [
88
+ { id: 'todo', type: 'unstarted' }, { id: 'doing', type: 'started' }, { id: 'done', type: 'completed' },
89
+ ] } } } } });
90
+ if (body.query.includes('LinearAttachmentCreate')) {
91
+ const input = body.variables?.input as { issueId: string; url: string };
92
+ attachments.push({ issueId: input.issueId, url: input.url });
93
+ return Response.json({ data: { attachmentCreate: { success: true, attachment: { id: `attachment-${attachments.length}` } } } });
94
+ }
95
+ if (body.query.includes('DecisionComment')) {
96
+ const input = body.variables?.input as { issueId: string; body: string };
97
+ comments.push(input);
98
+ return Response.json({ data: { commentCreate: { success: true, comment: { id: `comment-${comments.length}` } } } });
99
+ }
100
+ if (body.query.includes('LinearIssueDescription($id')) return Response.json({ data: { issue: { description: descriptions.get(id) } } });
101
+ if (body.query.includes('LinearIssueDescriptionUpdate')) {
102
+ const input = body.variables?.input as { description: string };
103
+ descriptions.set(id, input.description);
104
+ return Response.json({ data: { issueUpdate: { success: true } } });
105
+ }
106
+ if (body.query.includes('DecisionIssueClose')) {
107
+ const input = body.variables?.input as { stateId: string };
108
+ states.set(id, input.stateId === 'done' ? 'completed' : 'started');
109
+ return Response.json({ data: { issueUpdate: { success: true } } });
110
+ }
111
+ throw new Error(`unexpected fake Linear query: ${body.query}`);
112
+ }) as typeof fetch;
113
+
114
+ try {
115
+ event('request-received');
116
+ const runSecretary = async (request: string) => {
117
+ try {
118
+ if (request !== REQUEST) throw new Error('unexpected request');
119
+ event('secretary-started');
120
+ const absorbed = await submitIntakeWork({ text: request, track: 'absorb', origin: {
121
+ kind: 'external', ledgerSource: 'telegram-bot', provider: 'telegram', ref: 'ux-sim:message-1',
122
+ } }, {
123
+ root: () => join(root, 'intake'), now: () => NOW.toISOString(),
124
+ ingest: (_root, _source, raws) => ({ shaped: raws.length, added: raws.length, merged: 0, seen: 0, skipped: 0, badLines: 0 }),
125
+ log: name => event(name === 'submitted' ? 'intake-submit-observed' : `intake-${name}`),
126
+ });
127
+ if (!absorbed.ok || absorbed.track !== 'absorb' || absorbed.ids.length !== 1) throw new Error('demo URL did not enter the absorb seam');
128
+ intakeIds = absorbed.ids;
129
+ const groundedPlan: LinearSecretaryPlan = { ...PLAN, tasks: PLAN.tasks.map((task, index) => index === 0
130
+ ? { ...task, refs: [`elanous:intake:${intakeIds[0]}`] } : task) };
131
+ event('intake-ledger-seam-completed', { intakeIds });
132
+ const result = await createLinearSecretaryBreakdown({ apiKey: 'ux-sim-key', teamKey: 'DEMO', request, plan: groundedPlan,
133
+ fetch: fakeFetch,
134
+ deps: {
135
+ createIssue: async input => {
136
+ const id = `00000000-0000-4000-8000-${String(++nextIssue).padStart(12, '0')}`;
137
+ if (input.parentId) { states.set(id, 'started'); childEvidence.push({ issueId: id, description: input.description ?? '' }); }
138
+ else { parentIssueId = id; states.set(id, 'started'); descriptions.set(id, input.description ?? ''); }
139
+ return id;
140
+ },
141
+ updateDescription: async input => { descriptions.set(input.issueId, input.description); },
142
+ } });
143
+ childIssueIds = result.childIssueIds;
144
+ event('breakdown-created', { parentIssueId, childIssueIds });
145
+
146
+ for (let index = 0; index < childIssueIds.length; index++) {
147
+ const issueId = childIssueIds[index]!;
148
+ const task = groundedPlan.tasks[index]!;
149
+ let captureUrl: string | undefined;
150
+ if (index === 1) {
151
+ const browser = await simBrowserHand('attach', issueId, runId);
152
+ browserRunId = browser.observedRunId;
153
+ browserActionRunIds = [...browser.observedBrowserActionRunIds];
154
+ if (!browserActionRunIds.includes(runId)) throw new Error('browser-act execution event did not consume the secretary runId');
155
+ const attached = browser.linear.attachments.find(item => item.issueId === issueId);
156
+ if (!attached) throw new Error('browser capture was not attached to its Linear child');
157
+ browserAttachment = { issueId, url: attached.url };
158
+ captureUrl = attached.url;
159
+ event('browser-capture-attached', { issueId, url: attached.url });
160
+ }
161
+ await updateLinearSecretaryProgress({ apiKey: 'ux-sim-key', parentIssueId, taskIssueId: issueId, taskTitle: task.title,
162
+ tasks: groundedPlan.tasks.map((item, taskIndex) => ({ issueId: childIssueIds[taskIndex]!, title: item.title })),
163
+ completedIssueIds, state: 'started', summary: `흡수 근거로 ${task.title}을 시작`, fetch: fakeFetch });
164
+ await updateLinearSecretaryProgress({ apiKey: 'ux-sim-key', parentIssueId, taskIssueId: issueId, taskTitle: task.title,
165
+ tasks: groundedPlan.tasks.map((item, taskIndex) => ({ issueId: childIssueIds[taskIndex]!, title: item.title })),
166
+ completedIssueIds, state: 'completed', summary: `${task.title} 완료`, ...(captureUrl ? { captureUrl } : {}), fetch: fakeFetch });
167
+ completedIssueIds = [...completedIssueIds, issueId];
168
+ event('subtask-absorbed', { issueId, completedIssueIds: [...completedIssueIds] });
169
+ }
170
+ const ledger = new DecisionLedger({ stateDir: join(root, 'state'), now: () => NOW,
171
+ resolveVersion: () => ({ released: '0.2.42', dev: '0.2.43-dev.0', codename: null }) });
172
+ const decision = ledger.raise({ title: '11-04 Linear 데모 게시 승인', category: 'publish',
173
+ scqa: { s: '데모 산출물이 준비됐다.', c: '외부 공개는 대표 승인이 필요하다.' },
174
+ options: [{ key: 'a', label: '승인', consequence: '공개를 진행한다' }, { key: 'b', label: '보류', consequence: '외부 공개를 멈춘다' }],
175
+ recommendation: { option: 'b', why: '이 장치는 승인 전 경계까지만 재현한다' }, raisedBy: { agent: 'OPT', track: 'O' },
176
+ refs: [parentIssueId, ...childIssueIds] });
177
+ const sent: Array<{ view: CardView }> = [];
178
+ const transport: CardTransport = {
179
+ platform: 'telegram', async ownerChats() { return ['fake-owner']; },
180
+ async send(_chat: string, view: CardView): Promise<CardRef> { sent.push({ view }); return { chat: 'fake-owner', message: String(sent.length) }; },
181
+ async edit() {}, async notify() {},
182
+ };
183
+ await new DecisionCardService({ transport, ownerIds: ['fake-owner'], ledger, now: () => NOW }).tick();
184
+ const card = sent.find(item => item.view.text.includes(decision.id));
185
+ if (!card) throw new Error('approval card did not reach the fake owner transport');
186
+ approvalDecisionId = decision.id;
187
+ approvalCard = { id: decision.id, text: card.view.text, buttons: card.view.buttons };
188
+ approvalCardStatus = ledger.show(decision.id).status;
189
+ if (approvalCardStatus !== 'open') throw new Error(`approval card was not left open: ${approvalCardStatus}`);
190
+ event('approval-card-opened', { decisionId: decision.id, status: approvalCardStatus });
191
+ return { replyCard: result.replyCard };
192
+ } catch (error) {
193
+ failure = error instanceof Error ? error.message : String(error);
194
+ event('failed', { message: failure });
195
+ throw error;
196
+ }
197
+ };
198
+ const handle = createTelegramAmbientMessageHandler({ runSecretary });
199
+ reply = await handle({ text: REQUEST, chatId: 'fake-chat', userId: 'fake-owner' });
200
+ if (reply === null) throw new Error('one-line Linear request was not routed');
201
+ if (failure) throw new Error(`integrated secretary scene failed: ${failure}`);
202
+ event('completed', { parentIssueId, childIssueIds, decisionId: approvalDecisionId });
203
+ const runRows = store.queryByDataKeys({ exactCategories: ['ux.sim.linear-secretary'], runIds: [runId] });
204
+ const linkedEvents = runRows.filter(row => row.event === 'completed');
205
+ const result: LinearSecretarySimulationResult = { runId, evidencePath: store.path, cleanup: () => rmSync(root, { recursive: true, force: true }),
206
+ reply, parentIssueId, intakeIds, childIssueIds, completedIssueIds,
207
+ childEvidence: childEvidence.map(item => ({ ...item, description: descriptions.get(item.issueId) ?? item.description })),
208
+ linearAttachments: attachments, progressCommentCount: comments.length, browserAttachment, browserRunId, browserActionRunIds, approvalCard, approvalCardStatus, externalCalls, runEvents: eventNames,
209
+ runEvidence: { category: 'ux.sim.linear-secretary', event: 'completed', persisted: linkedEvents.length === 1 } };
210
+ retainEvidence = true;
211
+ return result;
212
+ } finally {
213
+ try { store.close(); }
214
+ finally { if (!retainEvidence) rmSync(root, { recursive: true, force: true }); }
215
+ }
216
+ }
@@ -0,0 +1,93 @@
1
+ {
2
+ "version": 1,
3
+ "runEvidence": {
4
+ "scope": "ScenarioV0 YAML runs only; catalog entries reference reusable devices/tests, and list/show do not execute them",
5
+ "runId": "uuid per execution",
6
+ "event": { "category": "ux.sim.scenario", "name": "completed" },
7
+ "persistence": "the isolated test instance logs/logs.db; query by exact category and data.runId",
8
+ "artifact": "<test-state>/ux-sim/evidence/<scenario>-seed-<seed>-run-<runId>.json"
9
+ },
10
+ "devices": [
11
+ {"id": "fake-llm", "name": "Fake LLM", "implementation": ["src/ux-sim/fake-llm.ts"], "tests": ["src/ux-sim/fake-llm.test.ts"], "target": "LLM response and streaming boundary", "inputs": ["fixed or scripted response", "delay", "error/status"], "observations": ["captured calls", "stream chunks", "completion or failure"]},
12
+ {"id": "fake-executable", "name": "Fake executable and PATH", "implementation": ["src/ux-sim/fake-bin.ts"], "tests": ["src/ux-sim/fake-bin.test.ts"], "target": "external executable process boundary", "inputs": ["stdout", "stderr", "exit code", "signal", "delay", "argv"], "observations": ["spawn arguments", "output", "exit result"]},
13
+ {"id": "fake-github", "name": "Fake GitHub CLI and API", "implementation": ["src/ux-sim/fake-gh.ts"], "tests": ["src/ux-sim/fake-gh.test.ts"], "target": "PR list/edit/review/merge responses", "inputs": ["PR records", "pagination", "injected API failure"], "observations": ["requested operations", "deterministic response", "mutated fake state"]},
14
+ {"id": "fake-kubectl", "name": "Fake kubectl", "implementation": ["src/ux-sim/fake-kubectl.ts"], "tests": ["src/ux-sim/fake-kubectl.test.ts"], "target": "Pod and Job query/termination boundary", "inputs": ["Pod/Job fixtures", "query result or failure"], "observations": ["kubectl argv", "returned resource state", "failure"]},
15
+ {"id": "fake-herdr", "name": "Fake herdr", "implementation": ["src/ux-sim/fake-herdr.ts"], "tests": ["src/ux-sim/fake-herdr.test.ts"], "target": "pane lifecycle and report-agent handoff", "inputs": ["pane transitions", "missing report", "timeout"], "observations": ["pane state", "handoff result", "timeout classification"]},
16
+ {"id": "fake-clock", "name": "Fake clock", "implementation": ["src/ux-sim/fake-clock.ts"], "tests": ["src/ux-sim/fake-clock.test.ts"], "target": "process-local time and timer boundary", "inputs": ["clock advance", "scheduled callback"], "observations": ["elapsed time", "fired timers"]},
17
+ {"id": "temp-git-remote", "name": "Temporary Git remote", "implementation": ["src/ux-sim/temp-git-remote.ts"], "tests": ["src/ux-sim/temp-git-remote.test.ts"], "target": "real local git bare/clone boundary without GitHub", "inputs": ["temporary refs and commits"], "observations": ["local remote state", "branch and commit result"]},
18
+ {"id": "fake-land-queue", "name": "Fake landing queue", "implementation": ["src/ux-sim/fake-land-queue.ts"], "tests": ["src/ux-sim/fake-land-queue.test.ts"], "target": "landing train scheduling", "inputs": ["load", "gate verdict", "priority", "cut window", "conflict"], "observations": ["queue choice", "wait/reject reason", "slot availability"]},
19
+ {"id": "scenario-runner", "name": "Scenario file runner and human CLI", "implementation": ["src/ux-sim/scenario.ts", "src/ux-sim/mock-scenario-catalog.ts", "scripts/ux-sim.ts", "scenarios/ux-sim/provider-4xx-no-provider.yaml"], "tests": ["src/ux-sim/scenario.test.ts", "src/ux-sim/mock-scenario-catalog.test.ts"], "target": "registered test-only provider-response fault through the real Codex path; catalog list/show CLI", "inputs": ["scenario file", "seed", "registered HTTP/network fault", "MS-id"], "observations": ["widget snapshot", "debug event", "persistent logs.db row", "runId evidence artifact", "catalog listing/detail"]},
20
+ {"id": "draft-inventory", "name": "Draft triage inventory simulator", "implementation": ["src/ux-sim/draft-inventory-builder.ts", "src/ux-sim/scenario.ts"], "tests": ["src/ux-sim/draft-inventory-builder.test.ts", "src/ux-sim/scenario.test.ts"], "target": "production draft triage decision distribution and protected/running safety", "inputs": ["deterministic 200-draft inventory", "merged twins", "open duplicates", "harvest references", "file lineage", "labels", "run state", "age"], "observations": ["real decideDraft/draftClaimState decisions", "scenario screen summary", "runId-scoped logs.db events", "evidence artifact"]},
21
+ {"id": "linear-secretary", "name": "Integrated Linear secretary simulation", "implementation": ["src/ux-sim/linear-secretary.ts"], "tests": ["src/ux-sim/linear-secretary.test.ts"], "target": "test-only Telegram ambient intake through production intake/decision/browser coordinators with fake Linear and persisted isolated run evidence", "inputs": ["one-line request", "fake Linear GraphQL responses", "isolated browser capture"], "observations": ["child issues and progress", "browser attachment", "approval card", "runId-scoped event evidence", "external calls remain simulated"]},
22
+ {"id": "release-graph-rig", "name": "Release graph simulation rig", "implementation": ["src/ux-sim/release-sim-rig.ts", "scripts/release-loop/gate-node-sim.ts", "scripts/release-loop/gate-autoheal-sim-evidence.ts", "scenarios/ux-sim/release-sim-rig.yaml"], "tests": ["src/ux-sim/release-sim-rig.test.ts", "scripts/release-loop/gate-flow-sim.test.ts", "scripts/release-loop/gate-node-sim.test.ts"], "target": "release graph routing, resume and failure paths", "inputs": ["node outcome", "evidence", "resume state"], "observations": ["visited nodes", "unexpected edges", "ledger events", "final graph state"]},
23
+ {"id": "graph-engine-selector", "name": "Graph engine selection simulator", "implementation": ["src/ux-sim/graph-engine-sim.ts"], "tests": ["src/ux-sim/graph-engine-sim.test.ts"], "target": "production graph edge selection and growth policy from a synthetic component outcome", "inputs": ["graph", "component exit label", "optional growth"], "observations": ["selected edge", "growth applied", "source graph unchanged"]},
24
+ {"id": "tui-interaction", "name": "TUI interaction and rendering", "implementation": ["src/ux-sim/interaction.ts", "src/ux-sim/turn-states.ts", "src/ux-sim/render-frame.ts", "src/ux-sim/headless-tui.ts", "src/ux-sim/input-history.ts", "src/ux-sim/slash-menu-frames.ts", "src/ux-sim/mock-seat-pty-frame.ts", "src/ux-sim/mock-seat-pty-frame-child.ts", "src/ux-sim/mock-seat-pty-sequence.ts", "src/ux-sim/mock-seat-pty-sequence-child.ts", "src/ux-sim/pty-key-modifiers-device.ts", "src/ux-sim/tty-foreground-steal-child.ts"], "tests": ["src/ux-sim/interaction.test.ts", "src/ux-sim/turn-states.test.ts", "src/ux-sim/render-frame.test.ts", "src/ux-sim/headless-tui.test.ts", "src/ux-sim/input-history.test.ts", "src/ux-sim/slash-menu-frames.test.ts", "src/ux-sim/mock-seat-pty-frame.test.ts", "src/ux-sim/mock-seat-pty-sequence.test.ts", "src/ux-sim/pty-key-modifiers-device.test.ts"], "target": "TUI event, state, frame, input history and PTY boundaries", "inputs": ["keys", "turn phase", "PTY bytes", "frame dimensions", "queued input"], "observations": ["production renderer output", "state transitions", "PTY input/output", "event history"]},
25
+ {"id": "fault-injection", "name": "Fault injection devices", "implementation": ["src/ux-sim/fault-cred-expiry.ts", "src/ux-sim/fault-glm-no-credential.ts", "src/ux-sim/fault-needs-human-reason-repair.ts", "src/ux-sim/fault-nextmove-dispatch.ts", "src/ux-sim/fault-pod-child-result.ts", "src/ux-sim/fault-pod-codex-503.ts", "src/ux-sim/fault-pod-death.ts", "src/ux-sim/fault-pool-cap.ts", "src/ux-sim/fault-scope-escape-lift.ts", "src/ux-sim/fault-sqlite-busy.ts", "src/ux-sim/fault-tui-400-autoheal.ts", "src/ux-sim/gate-shard-host-reroute.ts"], "tests": ["src/ux-sim/fault-cred-expiry.test.ts", "src/ux-sim/fault-glm-no-credential.test.ts", "src/ux-sim/fault-needs-human-reason-repair.test.ts", "src/ux-sim/fault-nextmove-dispatch.test.ts", "src/ux-sim/fault-pod-child-result.test.ts", "src/ux-sim/fault-pod-codex-503.test.ts", "src/ux-sim/fault-pod-death.test.ts", "src/ux-sim/fault-pool-cap.test.ts", "src/ux-sim/fault-scope-escape-lift.test.ts", "src/ux-sim/fault-sqlite-busy.test.ts", "src/ux-sim/fault-tui-400-autoheal.test.ts", "src/ux-sim/gate-shard-host-reroute.test.ts"], "target": "credential, Pod, pool, routing, autoheal, scope and persistence failure boundaries", "inputs": ["explicit fault kind", "isolated fixture", "clock or resource outcome"], "observations": ["production decision function output", "reason/event", "recovery or refusal"]},
26
+ {"id": "product-devices", "name": "Product and task-agent devices", "implementation": ["src/ux-sim/boot-daemon-tools-pty-shell-device.ts", "src/ux-sim/cli-config-audit-device.ts", "src/ux-sim/computer-use.ts", "src/ux-sim/dashboard-event-loop-stall-monitor-device.ts", "src/ux-sim/event-monkey.ts", "src/ux-sim/goal-device.ts", "src/ux-sim/goal-interim-trace.ts", "src/ux-sim/onboarding-first-run-device.ts", "src/ux-sim/resume-picker-device.ts", "src/ux-sim/skills-tools-shell-device.ts", "src/ux-sim/subagent-tools-device.ts", "src/ux-sim/task-agent-parent-host-device.ts", "src/ux-sim/task-agent-rejudge-on-head-device.ts", "src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts"], "tests": ["src/ux-sim/boot-daemon-tools-pty-shell-device.test.ts", "src/ux-sim/cli-config-audit-device.test.ts", "src/ux-sim/computer-use.test.ts", "src/ux-sim/dashboard-event-loop-stall-monitor-device.test.ts", "src/ux-sim/event-monkey.test.ts", "src/ux-sim/goal-device.test.ts", "src/ux-sim/onboarding-first-run-device.test.ts", "src/ux-sim/resume-picker-device.test.ts", "src/ux-sim/self-implement-author-clarification.test.ts", "src/ux-sim/skills-tools-shell-device.test.ts", "src/ux-sim/subagent-tools-device.test.ts", "src/ux-sim/task-agent-parent-host-device.test.ts", "src/ux-sim/task-agent-rejudge-on-head-device.test.ts", "src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.test.ts"], "target": "selected product, PTY, agent and orchestration seams", "inputs": ["UI state", "task outcome", "host/review decision", "tool result"], "observations": ["rendered state", "decision result", "event sequence", "stop reason"]},
27
+ {"id": "turn-throw-sim", "name": "Delayed dashboard turn-body throw", "implementation": ["src/ux-sim/turn-throw-sim.ts", "src/dashboard/input/chat-main-plain-turn-runtime.ts", "src/dashboard/turn-busy-teardown.ts"], "tests": ["src/ux-sim/turn-throw-sim.test.ts", "src/dashboard/turn-busy-teardown.test.ts"], "target": "production plain-turn stage failure, turn-threw logging and busy teardown", "inputs": ["turn stage", "delay milliseconds", "queued external input"], "observations": ["tui.turn turn-threw phase=turn:<stage>", "turn.state idle", "one queued input delivered"]},
28
+ {"id": "first-run-and-seminar", "name": "First-run authoring and seminar scenarios", "implementation": ["src/ux-sim/mock-authoring-first-run.ts", "src/ux-sim/mock-authoring-first-run-child.ts", "src/ux-sim/seminar-rehearsal.ts", "src/ux-sim/classic-tui-seat-scenarios.ts", "src/ux-sim/next-tui-seat-scenarios.ts", "src/ux-sim/session-id-seed.ts"], "tests": ["src/ux-sim/mock-authoring-first-run.test.ts", "src/ux-sim/seminar-rehearsal.test.ts", "src/ux-sim/classic-tui-seat-scenarios.test.ts", "src/ux-sim/next-tui-seat-scenarios.test.ts"], "target": "first-run, authoring and scripted TUI flows", "inputs": ["mock author response", "scenario steps", "seeded session id"], "observations": ["step result", "TUI snapshot", "completion and failure markers"]},
29
+ {"id": "support-fakes", "name": "Additional fake and in-process CLI fixtures", "implementation": ["test/ux-sim/aimock-local.ts", "src/ux-sim/in-process-cli.ts", "src/ux-sim/browser-hand.ts", "src/ux-sim/fake-browser-page.ts", "src/ux-sim/fake-linear-device.ts", "src/ux-sim/service-key-setup.ts", "src/ux-sim/term-slash-device.ts"], "tests": ["src/ux-sim/aimock-local.test.ts", "src/ux-sim/in-process-cli.test.ts", "src/ux-sim/browser-hand.test.ts", "src/ux-sim/service-key-setup.test.ts", "src/ux-sim/term-slash-device.test.ts"], "target": "local fake LLM server, browser/linear fakes, service-key setup, terminal slash device and test CLI instance", "inputs": ["test state root", "fake endpoint response", "temporary git repository", "browser/page and service state"], "observations": ["isolated CLI result", "server requests", "repository state", "fake device interactions"]}
30
+ ],
31
+ "scenarios": [
32
+ {"id": "UX-MS-01", "name": "Child report deficit with later harvest", "kind": "report-deficit", "device": "fault-injection", "implementation": ["src/ux-sim/fault-pod-child-result.ts"], "tests": ["src/ux-sim/fault-pod-child-result.test.ts"], "trigger": "A child completes with report-deficit while a later child has a harvestable PR.", "observe": ["failure classification remains report-deficit", "Pod terminal data stays attached", "later harvest remains independent"], "expected": "report-deficit is preserved and harvest result is visible"},
33
+ {"id": "UX-MS-02", "name": "Release gate regression routing", "kind": "gate-regression", "device": "release-graph-rig", "implementation": ["src/ux-sim/release-sim-rig.ts", "scripts/release-loop/gate-node-sim.ts", "scripts/release-loop/gate-autoheal-sim-evidence.ts", "scenarios/ux-sim/release-sim-rig.yaml"], "tests": ["src/ux-sim/release-sim-rig.test.ts", "scripts/release-loop/gate-node-sim.test.ts", "scripts/release-loop/gate-flow-sim.test.ts"], "trigger": "Inject a regression verdict into the release gate node.", "observe": ["visited graph nodes", "unexpected edge list", "terminal status"], "expected": "failure follows the configured repair/review route, not publish"},
34
+ {"id": "UX-MS-03", "name": "Review cap and no-verdict boundary", "kind": "review-cap-no-verdict", "device": "product-devices", "implementation": ["src/ux-sim/task-agent-rejudge-on-head-device.ts"], "tests": ["src/ux-sim/task-agent-rejudge-on-head-device.test.ts"], "trigger": "Stored review count reaches the cap or a review result is absent.", "observe": ["review request count", "verdict classification", "decision reason"], "expected": "the cap blocks another request and missing verdict stays unmeasured"},
35
+ {"id": "UX-MS-04", "name": "Pod credential failure", "kind": "pod-auth-failure", "device": "fault-injection", "implementation": ["src/ux-sim/fault-glm-no-credential.ts", "src/ux-sim/fault-pod-codex-503.ts"], "tests": ["src/ux-sim/fault-glm-no-credential.test.ts", "src/ux-sim/fault-pod-codex-503.test.ts"], "trigger": "Remove the child credential or inject a Codex 401/503 response.", "observe": ["credential readiness", "provider error event", "launch/recovery disposition"], "expected": "credential absence and temporary provider unavailability remain distinguishable"},
36
+ {"id": "UX-MS-05", "name": "TUI and gate worker stall", "kind": "stall", "device": "product-devices", "implementation": ["src/ux-sim/dashboard-event-loop-stall-monitor-device.ts"], "tests": ["src/ux-sim/dashboard-event-loop-stall-monitor-device.test.ts", "scripts/release-loop/gate-pod-stall.test.ts"], "trigger": "Delay the UI event loop or stop gate shard output.", "observe": ["typing lag/stall sample", "stalled shard reason", "bounded completion"], "expected": "stall is named and unrelated work can finish"},
37
+ {"id": "UX-MS-06", "name": "Landing train rejection", "kind": "train-rejection", "device": "fake-land-queue", "implementation": ["src/ux-sim/fake-land-queue.ts"], "tests": ["src/ux-sim/fake-land-queue.test.ts"], "trigger": "Inject a full queue, failed gate, conflicting head or closed cut window.", "observe": ["queue decision", "rejection reason", "slot state"], "expected": "the queue refuses with a reason and does not grant a slot"},
38
+ {"id": "UX-MS-07", "name": "Pod pool capacity and query errors", "kind": "pod-pool-error", "device": "fault-injection", "implementation": ["src/ux-sim/fault-pool-cap.ts", "src/ux-sim/fake-kubectl.ts"], "tests": ["src/ux-sim/fault-pool-cap.test.ts", "src/ux-sim/fake-kubectl.test.ts"], "trigger": "Omit a pool limit, saturate members, or inject a kubectl query failure.", "observe": ["recommended concurrency", "limitedBy", "query error"], "expected": "known running counts are capped; a query failure preserves unknown occupancy and emits no concurrency recommendation"},
39
+ {"id": "UX-MS-08", "name": "Delayed dashboard turn throw and queue teardown", "kind": "turn-throw-teardown", "device": "turn-throw-sim", "implementation": ["src/ux-sim/turn-throw-sim.ts", "src/dashboard/input/chat-main-plain-turn-runtime.ts", "src/dashboard/turn-busy-teardown.ts"], "tests": ["src/ux-sim/turn-throw-sim.test.ts", "src/dashboard/turn-busy-teardown.test.ts"], "trigger": "Configure a turn:<stage> throw with an optional delay while one external input is queued.", "observe": ["tui.turn turn-threw phase=turn:<stage>", "turn.state idle", "one queued input delivered"], "expected": "the production plain-turn catch logs the configured stage, teardown restores idle, and the queued input is delivered once"},
40
+ {"id": "UX-MS-09", "name": "Draft triage 200-case safety inventory", "kind": "draft-inventory-triage", "device": "draft-inventory", "implementation": ["src/ux-sim/draft-inventory-builder.ts", "src/ux-sim/scenario.ts"], "tests": ["src/ux-sim/draft-inventory-builder.test.ts", "src/ux-sim/scenario.test.ts"], "trigger": "Evaluate deterministic twin, duplicate, harvest, landed-file, protected-label, running, and stale draft cases.", "observe": ["200 production decideDraft results", "draftClaimState for running samples", "protected/running close count", "runId-linked assessment and completion events"], "expected": "scenario completes PASS with the intended case distribution, no mismatches, and no protected/running draft closed"},
41
+ {"id": "UX-MS-11", "name": "Codex request-shape 400 recovery boundary", "kind": "provider-request-rejected", "device": "scenario-runner", "implementation": ["scenarios/ux-sim/provider-4xx-no-provider.yaml", "src/ux-sim/scenario.ts"], "tests": ["src/ux-sim/scenario.test.ts"], "trigger": "Run the test-universe ScenarioV0 fixture with two injected HTTP 400 responses for the Codex request-shape boundary.", "observe": ["llm.codex/request-rejected-shape debug event", "response status and count", "ScenarioV0 completion event and runId evidence artifact"], "expected": "The isolated scenario records one request-rejected-shape event and one runId-scoped completion row."}
42
+ ],
43
+ "candidateAudit": {
44
+ "source": "~/elanous-hq/seat-state/OP/MOCK-DEVICES-INVENTORY-1031.md §3",
45
+ "baseCommit": "0d483f46e1ab9ea081cff933f8bb840790c44dde",
46
+ "sourceRows": 34,
47
+ "existingPaths": 33,
48
+ "excludedPaths": 27,
49
+ "sourceExclusions": [
50
+ {"path": "scenarios/ux-sim/MK-MS-01.yaml", "reason": "Separately registered by open PR #34039 (MK-MS-01 E4 sequence); keep it outside this 33-candidate registration to avoid duplicate catalog ownership."}
51
+ ],
52
+ "candidates": [
53
+ {"path": "scripts/tui-sim-bench.ts", "disposition": "excluded", "entryCommand": "not-applicable: benchmark requires an explicitly selected goal and provider", "logsRecorded": "no", "logsDetail": "Benchmark is not run by catalog discovery.", "excludeReason": "Measurement/benchmark tool, not a mock device."},
54
+ {"path": "scripts/tui-sim.ts", "disposition": "excluded", "entryCommand": "bun scripts/tui-sim.ts start --id mock-catalog-example --test", "logsRecorded": "conditional", "logsDetail": "Writes its own simulation artifacts, not ScenarioV0 logs.", "excludeReason": "Standalone TUI driver; separate artifact contract."},
55
+ {"path": "scripts/ux-sim.ts", "disposition": "already-indexed", "entryCommand": "bun scripts/ux-sim.ts list", "logsRecorded": "conditional", "logsDetail": "ScenarioV0 runs log completion; list/show are read-only.", "deviceId": "scenario-runner"},
56
+ {"path": "scripts/voice-dogfood-sim.ts", "disposition": "excluded", "entryCommand": "bun run scripts/voice-dogfood-sim.ts", "logsRecorded": "no", "logsDetail": "No ScenarioV0 logs.db contract.", "excludeReason": "Product dogfood script, not a reusable fake-device contract."},
57
+ {"path": "scripts/voice-pwa-sim.ts", "disposition": "excluded", "entryCommand": "bun run scripts/voice-pwa-sim.ts", "logsRecorded": "no", "logsDetail": "No ScenarioV0 logs.db contract.", "excludeReason": "PWA voice dogfood script, not an isolated reusable device."},
58
+ {"path": "scripts/release-loop/gate-autoheal-sim-evidence.ts", "disposition": "device", "entryCommand": "bun scripts/release-loop/gate-autoheal-sim-evidence.ts", "logsRecorded": "yes", "logsDetail": "Writes release-loop events to isolated logs.db with runId.", "deviceId": "release-graph-rig", "scenarioIds": ["UX-MS-02"]},
59
+ {"path": "scripts/release-loop/gate-node-sim.ts", "disposition": "device", "entryCommand": "bun test scripts/release-loop/gate-node-sim.test.ts", "logsRecorded": "no", "logsDetail": "Pure decision result asserted by test; no persistent event.", "deviceId": "release-graph-rig", "scenarioIds": ["UX-MS-02"]},
60
+ {"path": "scripts/release-loop/tui-sim-node.ts", "disposition": "excluded", "entryCommand": "called by release-loop tui-sim graph node; no standalone CLI", "logsRecorded": "no", "logsDetail": "Node result/artifact only.", "excludeReason": "Graph-node adapter for TUI measurements, not an independent mock device."},
61
+ {"path": "scripts/lib/pwa-scenarios/acp-replay.ts", "disposition": "excluded", "entryCommand": "bun test scripts/lib/pwa-scenarios/acp-replay.test.ts", "logsRecorded": "no", "logsDetail": "Browser/E2E cell result, not ScenarioV0 logs.", "excludeReason": "Live-browser PWA runner support; not a mock device."},
62
+ {"path": "scripts/lib/pwa-scenarios/cdp-driver.ts", "disposition": "excluded", "entryCommand": "bun scripts/pwa-scenarios.ts --base-url http://127.0.0.1:31455 --shots ./shots", "logsRecorded": "no", "logsDetail": "Writes optional screenshots and cell output through the PWA runner; no logs.db row.", "excludeReason": "Live-browser PWA runner support; not a mock device."},
63
+ {"path": "scripts/lib/pwa-scenarios/runner.ts", "disposition": "excluded", "entryCommand": "bun test scripts/lib/pwa-scenarios/runner.test.ts", "logsRecorded": "no", "logsDetail": "Browser/E2E cell result, not ScenarioV0 logs.", "excludeReason": "Live-browser PWA runner support; not a mock device."},
64
+ {"path": "scripts/lib/pwa-scenarios/scenarios.ts", "disposition": "excluded", "entryCommand": "bun test scripts/lib/pwa-scenarios/scenarios.test.ts", "logsRecorded": "no", "logsDetail": "Browser/E2E cell result, not ScenarioV0 logs.", "excludeReason": "Live-browser PWA runner support; not a mock device."},
65
+ {"path": "test/fixtures/acp-initialize-stub.ts", "disposition": "excluded", "entryCommand": "bun test test/acp-client-observability.test.ts", "logsRecorded": "no", "logsDetail": "The consuming ACP test asserts protocol behavior; fixture emits no app logs.db row.", "excludeReason": "Protocol fixture only; no independent scenario entry."},
66
+ {"path": "test/fixtures/mock-lsp-server.ts", "disposition": "excluded", "entryCommand": "bun test test/lsp-client.test.ts test/lsp-operations-dispatch.test.ts", "logsRecorded": "no", "logsDetail": "The consuming LSP tests assert protocol behavior; fixture emits no app logs.db row.", "excludeReason": "Protocol fixture only; no independent scenario entry."},
67
+ {"path": "test/helpers/intake-fake-repo.ts", "disposition": "excluded", "entryCommand": "bun test test/intake-plane-check-common-name.test.ts", "logsRecorded": "no", "logsDetail": "The consumer test asserts temporary-repository behavior.", "excludeReason": "Test helper, not a simulation device."},
68
+ {"path": "test/ux-sim/aimock-local.ts", "disposition": "already-indexed", "entryCommand": "bun test src/ux-sim/aimock-local.test.ts", "logsRecorded": "no", "logsDetail": "Test server interactions are asserted by tests, not app logs.db.", "deviceId": "support-fakes"},
69
+ {"path": "scenarios/dashboard-default.yaml", "disposition": "excluded", "entryCommand": "not-applicable: consumed by the Playground renderer; no direct scenario CLI", "logsRecorded": "runner-dependent", "logsDetail": "No standalone command or UX ScenarioV0 completion contract.", "excludeReason": "Graph/playground scenario, outside UX mock-device scope."},
70
+ {"path": "scenarios/heap-graph.yaml", "disposition": "excluded", "entryCommand": "not-applicable: consumed by the Playground renderer; no direct scenario CLI", "logsRecorded": "runner-dependent", "logsDetail": "No standalone command or UX ScenarioV0 completion contract.", "excludeReason": "Graph/playground scenario, outside UX mock-device scope."},
71
+ {"path": "scenarios/iul-timeline-viewer.yaml", "disposition": "excluded", "entryCommand": "not-applicable: consumed by the IUL timeline viewer; no direct scenario CLI", "logsRecorded": "runner-dependent", "logsDetail": "No standalone command or UX ScenarioV0 completion contract.", "excludeReason": "Graph/playground scenario, outside UX mock-device scope."},
72
+ {"path": "scenarios/ux-sim/provider-4xx-no-provider.yaml", "disposition": "scenario", "entryCommand": "bun bin/elanous.mjs --test sim run scenarios/ux-sim/provider-4xx-no-provider.yaml", "logsRecorded": "yes", "logsDetail": "ux.sim.scenario/completed in test logs.db; expects llm.codex/request-rejected-shape.", "deviceId": "scenario-runner", "scenarioIds": ["UX-MS-11"]},
73
+ {"path": "scenarios/ux-sim/release-sim-rig.yaml", "disposition": "already-indexed", "entryCommand": "bun bin/elanous.mjs --test sim run scenarios/ux-sim/release-sim-rig.yaml", "logsRecorded": "yes", "logsDetail": "ScenarioV0 completion row is stored in isolated test logs.db; the evidence artifact is a separate JSON file.", "deviceId": "release-graph-rig", "scenarioIds": ["UX-MS-02"]},
74
+ {"path": "tests/scenarios/4provider-feature-impl.yaml", "disposition": "excluded", "entryCommand": "eln repl --new --json --scenario tests/scenarios/4provider-feature-impl.yaml", "logsRecorded": "runner-dependent", "logsDetail": "REPL logs are separate; some scenarios invoke live models.", "excludeReason": "REPL/provider workflow, not reusable mock device; separate runner or live model dependency."},
75
+ {"path": "tests/scenarios/capability-level-11.yaml", "disposition": "excluded", "entryCommand": "eln repl --new --json --scenario tests/scenarios/capability-level-11.yaml", "logsRecorded": "runner-dependent", "logsDetail": "REPL logs are separate; some scenarios invoke live models.", "excludeReason": "REPL/provider workflow, not reusable mock device; separate runner or live model dependency."},
76
+ {"path": "tests/scenarios/codex-baseline.yaml", "disposition": "excluded", "entryCommand": "eln repl --new --json --scenario tests/scenarios/codex-baseline.yaml", "logsRecorded": "runner-dependent", "logsDetail": "REPL logs are separate; some scenarios invoke live models.", "excludeReason": "REPL/provider workflow, not reusable mock device; separate runner or live model dependency."},
77
+ {"path": "tests/scenarios/codex-opus-2way.yaml", "disposition": "excluded", "entryCommand": "eln repl --new --json --scenario tests/scenarios/codex-opus-2way.yaml", "logsRecorded": "runner-dependent", "logsDetail": "REPL logs are separate; some scenarios invoke live models.", "excludeReason": "REPL/provider workflow, not reusable mock device; separate runner or live model dependency."},
78
+ {"path": "tests/scenarios/codex-variance-w5f.yaml", "disposition": "excluded", "entryCommand": "eln repl --new --json --scenario tests/scenarios/codex-variance-w5f.yaml", "logsRecorded": "runner-dependent", "logsDetail": "REPL logs are separate; some scenarios invoke live models.", "excludeReason": "REPL/provider workflow, not reusable mock device; separate runner or live model dependency."},
79
+ {"path": "tests/scenarios/multi-turn-cache-rate.yaml", "disposition": "excluded", "entryCommand": "eln repl --new --json --scenario tests/scenarios/multi-turn-cache-rate.yaml", "logsRecorded": "runner-dependent", "logsDetail": "REPL logs are separate; some scenarios invoke live models.", "excludeReason": "REPL/provider workflow, not reusable mock device; separate runner or live model dependency."},
80
+ {"path": "tests/scenarios/repl-rotation-chain.yaml", "disposition": "excluded", "entryCommand": "eln repl --new --json --scenario tests/scenarios/repl-rotation-chain.yaml", "logsRecorded": "runner-dependent", "logsDetail": "REPL logs are separate; some scenarios invoke live models.", "excludeReason": "REPL/provider workflow, not reusable mock device; separate runner or live model dependency."},
81
+ {"path": "tests/scenarios/repl-self-debug-arc.yaml", "disposition": "excluded", "entryCommand": "eln repl --new --json --scenario tests/scenarios/repl-self-debug-arc.yaml", "logsRecorded": "runner-dependent", "logsDetail": "REPL logs are separate; some scenarios invoke live models.", "excludeReason": "REPL/provider workflow, not reusable mock device; separate runner or live model dependency."},
82
+ {"path": "tests/scenarios/repl-tool-doom-recovery.yaml", "disposition": "excluded", "entryCommand": "eln repl --new --json --scenario tests/scenarios/repl-tool-doom-recovery.yaml", "logsRecorded": "runner-dependent", "logsDetail": "REPL logs are separate; some scenarios invoke live models.", "excludeReason": "REPL/provider workflow, not reusable mock device; separate runner or live model dependency."},
83
+ {"path": "src/playground-scenario/default-scenarios.ts", "disposition": "excluded", "entryCommand": "bun test src/playground-scenario/", "logsRecorded": "no", "logsDetail": "Scenario constants consumed by Playground tests.", "excludeReason": "Product demo inputs, not mock-device implementation."},
84
+ {"path": "src/playground-scenario/fake-harness.ts", "disposition": "excluded", "entryCommand": "bun test src/playground-scenario/", "logsRecorded": "no", "logsDetail": "In-memory test harness consumed by Playground tests.", "excludeReason": "Test helper, no independent reusable mock interface."},
85
+ {"path": "src/showroom/outbound/channels/stubs.ts", "disposition": "excluded", "entryCommand": "bun test src/showroom/outbound/channels/", "logsRecorded": "no", "logsDetail": "Stub results asserted by channel tests.", "excludeReason": "Outbound channel stub, not a UX simulation device."}
86
+ ]
87
+ },
88
+ "discovery": {
89
+ "trackedRoot": "src/ux-sim/*.ts runtime modules",
90
+ "candidateRoots": ["scripts/*sim*.ts", "scripts/release-loop/*sim*.ts", "scripts/lib/pwa-scenarios/*.ts", "test/**/*fake*", "test/**/*stub*", "test/scenarios/**/*", "scenarios/**/*.yaml", "src/playground-scenario/*.ts", "src/showroom/outbound/channels/stubs.ts"],
91
+ "limits": "The index records reviewed reusable simulation devices and named acceptance scenarios. Candidate paths outside the tracked root are surfaced for review; this is not proof that every repository fake/stub has scenario value."
92
+ }
93
+ }