elanous 0.2.42 → 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 (685) 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/{X1ucLw10Cds_h614NoEnh → Om5xS9jpjSXJCeTNGYEi4}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{7a98bc80.fa935989e829f9c2.js → 0966f8a1.745fcd44f64a87ea.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/{73d2eb0e.4966ad55293c801a.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/{3507.97e1977bc4d5fb0a.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/1961.a81b12872c3e93a9.js +23 -0
  17. package/apps/pwa/out/_next/static/chunks/{53c73f84.373b6160adfa89a4.js → 1970cf59.2d4d8ce5d6c81853.js} +1 -1
  18. package/apps/pwa/out/_next/static/chunks/1971-8890f3962ba7ee0a.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/{9211-330b6736a63d4cb3.js → 2073-ba274e00e4f9efb4.js} +1 -1
  20. package/apps/pwa/out/_next/static/chunks/{7411.9b4b8b747dc7b802.js → 2144.25b292396712196d.js} +2 -2
  21. package/apps/pwa/out/_next/static/chunks/2268-53861f339e0b65a2.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2312.0c8b61e22d3136d7.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/{6632.0eac1c554f8f2ef3.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/{1262.e804feb8fd1acb8c.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/{2456.b6de0e1c05f28843.js → 3095.dc44586a5f83b86d.js} +1 -1
  29. package/apps/pwa/out/_next/static/chunks/{3207.a756c95e9ec8c3c8.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/3557ac4a.c8931684475018ad.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/{8505.fd803c6c33b54cc3.js → 360.ae9f9f4c33c395e8.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/3638.80412ea63aae8f3f.js +286 -0
  35. package/apps/pwa/out/_next/static/chunks/{b450776b.3db34d8d965f82d3.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/{8138.6c10b2a356d52fca.js → 4199.ce86b281fd0a60b7.js} +1 -1
  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/{2690.0521c738b7749931.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/{1945.7b54990d578c119b.js → 4894.fec2ca9e99caefa2.js} +1 -1
  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/{9427.96aa912ddb5801e0.js → 5564.9e72532188f57586.js} +16 -16
  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/{4043.6b91203436c9c86b.js → 5628.6ddb2d5ffba4ff4c.js} +4 -4
  63. package/apps/pwa/out/_next/static/chunks/{1319.b9b815ae0f181e06.js → 5730.43d7ccc09988e646.js} +1 -1
  64. package/apps/pwa/out/_next/static/chunks/{3482.a9ae9d2ad6a5bd97.js → 5789.2da35c258292e1e5.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/5824.da9527b15a3221e5.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5866.366966af47fdde5d.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/{1487.2f67b79444062da6.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/{3347.f846266b5e5f3ede.js → 6540.c7bef57ad8f90a87.js} +3 -3
  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/{8262.ddc03e06b733f184.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/{4770.769c9cd9c7034eba.js → 7483.427a2fe2049e388d.js} +2 -2
  88. package/apps/pwa/out/_next/static/chunks/{1147-5196d19c222051b3.js → 7502-be74718178e13e56.js} +1 -1
  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/{8673-bab689a55f7e13b9.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/868.6e953be05bcf6dca.js +41 -0
  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/{9656-374232558fd528d0.js → 8861-cc1fa1c7b920fa8e.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/{5440-4236de26c5ea5856.js → 8967-7dfebf710c9dec9d.js} +1 -1
  110. package/apps/pwa/out/_next/static/chunks/{1063.2fb8a9dc55c731f2.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/{4320.583cbab64db6be02.js → 923.2034d10ae91e9c20.js} +1 -1
  113. package/apps/pwa/out/_next/static/chunks/9312.bc1b89c5d4368033.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/{1574.878c18ecc97b1bd4.js → 943.39ae5e82f4f1893f.js} +1 -1
  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/aa57532f.510551854ff239b1.js +1 -0
  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-0f291d3c8fd55a3a.js → page-9ee28f7df07428ea.js} +1 -1
  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-79a8b5fee4c20871.js +1 -0
  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-ca2d09128c585ca4.js +1 -0
  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/c7945435-b44d4dbe90ba0dcb.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/{3d0154af.5331fec737ffe8c3.js → cb0f8df8.09a4a6be97e3fc5f.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/{e8543907.5b040a5f22a0b0e5.js → d96660fb.cbc21a2a88539dbb.js} +7 -7
  176. package/apps/pwa/out/_next/static/chunks/{50061469.0326382241ef3b2d.js → ea514caa.05a24f78d9dffe5f.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/fb7d20d5-6892502b6ee39ca6.js +1 -0
  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/d1f8bb401740a549.css +1 -0
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +23 -23
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +23 -23
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +23 -23
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +22 -22
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +22 -22
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +23 -23
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +22 -22
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +23 -23
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +23 -23
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +22 -22
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +23 -23
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +23 -23
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +23 -23
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +23 -23
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +22 -22
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +22 -22
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +23 -23
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +23 -23
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -23
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +22 -22
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +22 -22
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +23 -23
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +23 -23
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +22 -22
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +22 -22
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +22 -22
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +23 -23
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +23 -23
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +22 -22
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +23 -23
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +23 -23
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +23 -23
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +23 -23
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +23 -23
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +22 -22
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +23 -23
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +23 -23
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +23 -23
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +23 -23
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +23 -23
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +23 -23
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +23 -23
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +23 -23
  278. package/catalog/external-commands.yaml +5 -3
  279. package/catalog/meta/catalogVersion.yaml +2 -1
  280. package/catalog/signing/catalog-signing-public.pem +3 -0
  281. package/graphs/intake/intake-daily.yaml +16 -0
  282. package/graphs/intake/news-sources.yaml +1 -0
  283. package/graphs/intake/recipes.yaml +7 -0
  284. package/graphs/overlays/examples/research-runtime-empty-terminal.yaml +28 -0
  285. package/graphs/profiles/local.yaml +5 -0
  286. package/graphs/profiles/pod.yaml +4 -0
  287. package/package.json +6 -2
  288. package/plugins/demo-absorption-briefing/plugin.json +18 -0
  289. package/plugins/demo-absorption-briefing/skills/demo-absorption-briefing/SKILL.md +8 -0
  290. package/plugins/demo-browser-hand/plugin.json +13 -0
  291. package/plugins/demo-browser-hand/skills/demo-browser-hand/SKILL.md +8 -0
  292. package/plugins/demo-linear-secretary/plugin.json +15 -0
  293. package/plugins/demo-linear-secretary/skills/demo-linear-secretary/SKILL.md +8 -0
  294. package/plugins/demo-plugin-wizard/plugin.json +11 -0
  295. package/plugins/demo-plugin-wizard/skills/demo-plugin-wizard/SKILL.md +8 -0
  296. package/plugins/demo-research/plugin.json +16 -0
  297. package/plugins/demo-research/skills/demo-research/SKILL.md +8 -0
  298. package/plugins/demo-video-briefing/plugin.json +15 -0
  299. package/plugins/demo-video-briefing/skills/demo-video-briefing/SKILL.md +8 -0
  300. package/scripts/build-signed-catalog.ts +48 -0
  301. package/scripts/ci-typecheck-main-delta.sh +88 -0
  302. package/scripts/codex-fallback-live-probe.ts +1 -1
  303. package/scripts/demo/demo1104-parallel-scenes.ts +301 -0
  304. package/scripts/demo/demo1104-stage.config.ts +21 -0
  305. package/scripts/demo/demo1104-stage.ts +316 -0
  306. package/scripts/goal-method-audit.ts +17 -1
  307. package/scripts/graph-units/land-enqueue.ts +90 -0
  308. package/scripts/hooks/codex-notify.sh +32 -0
  309. package/scripts/install.sh +10 -38
  310. package/scripts/landing-heal/land-plan.ts +57 -0
  311. package/scripts/release-loop/auto-approve-node.ts +1 -1
  312. package/scripts/release-loop/gate-autoheal-sim-evidence.ts +60 -0
  313. package/scripts/release-loop/gate-method.ts +139 -0
  314. package/scripts/release-loop/gate-node.ts +180 -20
  315. package/scripts/release-loop/gate-traffic-mode.ts +151 -3
  316. package/scripts/release-loop/node-verdict.ts +38 -25
  317. package/scripts/release-loop/preflight.ts +362 -8
  318. package/scripts/release-loop/unattended-release.ts +20 -9
  319. package/scripts/rhythm/daily.ts +36 -4
  320. package/scripts/rhythm/linear-progress-sync.ts +298 -0
  321. package/scripts/video-pipeline.ts +9 -1
  322. package/scripts/warm-pool-provider-config.ts +29 -6
  323. package/src/acp/agent-manager.ts +1 -0
  324. package/src/acp/codex-app-server-agent.ts +33 -0
  325. package/src/acp/codex-app-server-client.ts +153 -16
  326. package/src/acp/core-turn-bridge.ts +17 -12
  327. package/src/acp/event-router.ts +20 -1
  328. package/src/acp/server.ts +6 -0
  329. package/src/agent-mission/browser-roundtrip-coordinator.ts +85 -0
  330. package/src/agent-mission/claude-headless.ts +4 -1
  331. package/src/agent-mission/codex-exec.ts +105 -0
  332. package/src/agent-mission/driver.ts +192 -11
  333. package/src/agent-mission/grok-auth-status.ts +47 -0
  334. package/src/agent-mission/hand-hooks.ts +101 -0
  335. package/src/agent-mission/mission-cli.ts +56 -21
  336. package/src/agent-mission/mission-hand-reply.ts +118 -0
  337. package/src/agent-mission/mission-line.ts +180 -0
  338. package/src/agent-mission/mission-out.ts +256 -18
  339. package/src/agent-mission/tool-install.ts +122 -11
  340. package/src/agents/general-purpose.md +1 -1
  341. package/src/auto-research/research-turn.ts +95 -10
  342. package/src/autopilot/pr-manager.ts +31 -3
  343. package/src/boot/daemon-tools/self-implement.ts +3 -1
  344. package/src/boot/daemon-tools/web-search.ts +1 -2
  345. package/src/briefing/brief-items.ts +55 -11
  346. package/src/cli/agent-cli.ts +2 -1
  347. package/src/cli/catalog-cli.ts +31 -0
  348. package/src/cli/connector-cli.ts +16 -0
  349. package/src/cli/doctor-fix.ts +2 -2
  350. package/src/cli/intake-source-cli.ts +44 -8
  351. package/src/cli/msg-cli.ts +32 -3
  352. package/src/cli/pr-cli.ts +21 -1
  353. package/src/cli/pr-land-heavy-remote.ts +44 -6
  354. package/src/cli/pr-land-overlap-evidence.ts +13 -1
  355. package/src/cli/pr-land-pod-shadow-job.ts +143 -5
  356. package/src/cli/pr-land-pod-shadow.ts +9 -2
  357. package/src/cli/release-checklist-read-cli.ts +44 -16
  358. package/src/cli/release-cli.ts +23 -3
  359. package/src/cli/research-cli.ts +9 -0
  360. package/src/cli/setup-cli.ts +166 -6
  361. package/src/cli/setup-keys.ts +187 -0
  362. package/src/cli/task-plugin-wizard-host.ts +114 -0
  363. package/src/cli/tasks-cli.ts +54 -9
  364. package/src/cli/tui-test-cli.ts +186 -0
  365. package/src/config.ts +4 -2
  366. package/src/connectors/linear-daily-progress.ts +228 -0
  367. package/src/connectors/linear-projector.ts +34 -12
  368. package/src/connectors/linear.ts +151 -7
  369. package/src/core-turn/deep-turn-bloom.ts +67 -0
  370. package/src/core-turn/research-policy.ts +37 -0
  371. package/src/core-turn/run-core-turn.ts +320 -30
  372. package/src/core-turn/types.ts +2 -0
  373. package/src/dashboard/chat/acp-chat.ts +10 -0
  374. package/src/dashboard/classic-sidetab-mission-job.ts +103 -0
  375. package/src/dashboard/classic-sidetab-mission-pair.ts +81 -0
  376. package/src/dashboard/classic-sidetab-mission-trio.ts +219 -0
  377. package/src/dashboard/classic-sidetab-mission.ts +167 -5
  378. package/src/dashboard/index.ts +378 -13
  379. package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
  380. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +8 -0
  381. package/src/dashboard/mission-cli-consumer.ts +20 -8
  382. package/src/dashboard/plugin-wizard-runtime.ts +50 -0
  383. package/src/dashboard/plugin-wizard-tool.ts +55 -0
  384. package/src/dashboard/sidetab-runtime.ts +1 -1
  385. package/src/dashboard/terminal-popup-runtime.ts +6 -3
  386. package/src/decisions/linear-progress-summary.ts +78 -0
  387. package/src/decisions/linear-progress-sync.ts +152 -0
  388. package/src/domains/outbound-alert.ts +49 -11
  389. package/src/domains/telegram-kind-route.ts +16 -9
  390. package/src/graph-runner/arg-allowance.ts +13 -0
  391. package/src/graph-runner/graph-run-api.ts +3 -1
  392. package/src/graph-runner/runner.ts +85 -17
  393. package/src/graph-wizard/mission-compose.ts +407 -12
  394. package/src/harness/dispatch-backpressure.ts +54 -1
  395. package/src/harness/dispatch-shadow-compare.ts +74 -0
  396. package/src/harness/harness-cli-command.ts +11 -1
  397. package/src/harness/skill-exec.ts +21 -9
  398. package/src/harness/skill-select.ts +1 -1
  399. package/src/hooks/error-report-cloud.ts +101 -0
  400. package/src/hooks/receiver.ts +29 -2
  401. package/src/index.ts +127 -10
  402. package/src/intake-plane/actions.ts +354 -0
  403. package/src/intake-plane/adapters/telegram-ambient.ts +34 -18
  404. package/src/intake-plane/intake-sources.ts +78 -8
  405. package/src/intake-plane/items.ts +14 -4
  406. package/src/intake-plane/linear-mission-sync.ts +80 -0
  407. package/src/intake-plane/linear-secretary-runtime.ts +178 -0
  408. package/src/intake-plane/linear-wish.ts +227 -1
  409. package/src/life/life-cli.ts +168 -0
  410. package/src/life/life-kinds.ts +160 -0
  411. package/src/live-supply/budget-consumer.ts +78 -0
  412. package/src/live-supply/read.ts +3 -0
  413. package/src/live-supply/snapshot.ts +45 -0
  414. package/src/llm/provider-credentials.ts +8 -2
  415. package/src/llm.ts +2 -1
  416. package/src/maturity/feature-maturity.ts +3 -3
  417. package/src/msg/msg-sse-server.ts +3 -3
  418. package/src/msg/msg-store.ts +177 -19
  419. package/src/native-tool-catalog.ts +36 -2
  420. package/src/nexus/api/http-server.ts +37 -1
  421. package/src/nexus/api/mcp-public-allowlist.ts +2 -0
  422. package/src/nexus/index.ts +7 -2
  423. package/src/nexus/outbound/format.ts +9 -0
  424. package/src/nexus/outbound/router.ts +98 -13
  425. package/src/nexus/setup-status.ts +9 -0
  426. package/src/nexus/state/state.ts +3 -0
  427. package/src/oauth/codex-account-store.ts +20 -7
  428. package/src/oauth/codex-owner-mirror.ts +44 -0
  429. package/src/oauth/codex.ts +17 -2
  430. package/src/oauth/fallback-chain.ts +47 -17
  431. package/src/onboarding/first-run-doctor.ts +8 -1
  432. package/src/onboarding/first-run.ts +85 -26
  433. package/src/onboarding/key-setup.ts +103 -0
  434. package/src/onboarding/menu-answer.ts +13 -0
  435. package/src/onboarding/secret-prompt.ts +37 -0
  436. package/src/plugins/install/plugin-install.ts +59 -0
  437. package/src/pr-tool/census.ts +130 -0
  438. package/src/pty-shell/pty-control-ipc.ts +4 -1
  439. package/src/registry/catalog-server.ts +232 -0
  440. package/src/registry/loader.ts +45 -1
  441. package/src/registry/types.ts +1 -2
  442. package/src/research/axis-fanout.ts +43 -28
  443. package/src/self-dev/ask-launch-flow.ts +72 -1
  444. package/src/self-dev/dev-cli.ts +4 -1
  445. package/src/self-dev/dev-pipeline.ts +5 -0
  446. package/src/self-dev/draft-residue.ts +64 -5
  447. package/src/self-dev/graph-front-nodes.ts +2 -1
  448. package/src/self-dev/graph-journey-route.ts +76 -21
  449. package/src/self-dev/launch-preflight.ts +58 -0
  450. package/src/self-dev/orchestrate.ts +1 -1
  451. package/src/self-dev/shard-aggregate.ts +4 -0
  452. package/src/self-dev/shard-run.ts +36 -15
  453. package/src/self-implement/abandoned-classification.ts +12 -3
  454. package/src/self-implement/budget-gate.ts +7 -0
  455. package/src/self-implement/child-llm-preference.ts +10 -1
  456. package/src/self-implement/doctor-visit.ts +30 -8
  457. package/src/self-implement/elanous-tui-spawn.ts +3 -0
  458. package/src/self-implement/fixtures/tdd-green-missing-passing-child-transcript.txt +2 -0
  459. package/src/self-implement/gate-artifacts.ts +2 -1
  460. package/src/self-implement/goal-author-cli.ts +4 -2
  461. package/src/self-implement/goal-author.ts +358 -4
  462. package/src/self-implement/graph-overlay-yaml.ts +30 -4
  463. package/src/self-implement/graph-overlay.ts +3 -1
  464. package/src/self-implement/graph-profile-yaml.ts +107 -0
  465. package/src/self-implement/graph-yaml.ts +26 -3
  466. package/src/self-implement/off-diff-evidence.ts +249 -5
  467. package/src/self-implement/orchestrator.ts +240 -15
  468. package/src/self-implement/run-chart.ts +6 -3
  469. package/src/self-implement/run-ledger.ts +51 -1
  470. package/src/self-implement/runtime-overlay-run-steps.ts +95 -0
  471. package/src/self-implement/tdd-evidence-tags.ts +9 -0
  472. package/src/self-implement/train-gate-receipt.ts +166 -0
  473. package/src/self-implement/train-gate-remote.ts +62 -18
  474. package/src/session/chat.ts +4 -2
  475. package/src/session/session-fanout.ts +2 -0
  476. package/src/session/streaming/acp-stream-sink.ts +2 -1
  477. package/src/session/streaming/chunk-producer.ts +6 -0
  478. package/src/session/streaming/stream-compositor.ts +3 -2
  479. package/src/session-runtime/index.ts +37 -1
  480. package/src/session-runtime/retry-policy.ts +1 -1
  481. package/src/setup/llm-env-detect.ts +3 -0
  482. package/src/setup/service-key-catalog.ts +46 -0
  483. package/src/setup/service-keys.ts +241 -0
  484. package/src/sidetab-core/visible-agent-mission.ts +98 -22
  485. package/src/skills/tools/agent.ts +23 -4
  486. package/src/skills/tools/omni-search.ts +123 -25
  487. package/src/task-agent/parent-host.ts +10 -0
  488. package/src/task-agent/repair-outcomes.ts +65 -0
  489. package/src/task-agent/task-hand.ts +20 -7
  490. package/src/task-orchestrator/dispatcher.ts +14 -1
  491. package/src/task-orchestrator/linear-capture-events.ts +55 -0
  492. package/src/task-orchestrator/store.ts +16 -5
  493. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +4 -0
  494. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +92 -1
  495. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
  496. package/src/task-orchestrator/surfaces/pod-source-receive.ts +23 -11
  497. package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
  498. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +35 -9
  499. package/src/task-orchestrator/surfaces/self-implement-pod.ts +172 -6
  500. package/src/task-orchestrator/surfaces/self-implement.ts +27 -3
  501. package/src/task-orchestrator/surfaces/warm-reuse-evidence.ts +169 -0
  502. package/src/task-orchestrator/types.ts +14 -0
  503. package/src/telegram.ts +14 -16
  504. package/src/terminal/coding-agent.ts +14 -5
  505. package/src/terminal/session-registry.ts +1 -1
  506. package/src/tool-hints/gate.ts +1 -0
  507. package/src/tool-runtime/agent-runtime.ts +1 -0
  508. package/src/tool-runtime/browser-hand-runtime.ts +381 -0
  509. package/src/tool-runtime/browser-runtime.ts +2 -1
  510. package/src/tool-runtime/elanous-linear-issue-runtime.ts +76 -0
  511. package/src/tool-runtime/elanous-linear-secretary-runtime.ts +57 -0
  512. package/src/tool-runtime/graph-mcp-runtimes.ts +240 -0
  513. package/src/tool-runtime/index.ts +6 -0
  514. package/src/tool-runtime/types.ts +3 -0
  515. package/src/tui/entry.ts +24 -1
  516. package/src/tui/sidetab/attach.ts +140 -11
  517. package/src/tui/sidetab/herdr-portal.ts +225 -0
  518. package/src/user-config.ts +34 -9
  519. package/src/user-intent/types.ts +4 -3
  520. package/src/ux-sim/browser-hand.ts +165 -0
  521. package/src/ux-sim/draft-inventory-builder.ts +198 -0
  522. package/src/ux-sim/fake-browser-page.ts +81 -0
  523. package/src/ux-sim/fake-linear-device.ts +31 -0
  524. package/src/ux-sim/graph-engine-sim.ts +47 -0
  525. package/src/ux-sim/linear-secretary.ts +216 -0
  526. package/src/ux-sim/mock-scenario-catalog.json +75 -23
  527. package/src/ux-sim/mock-scenario-catalog.ts +120 -2
  528. package/src/ux-sim/onboarding-first-run-device.ts +31 -21
  529. package/src/ux-sim/scenario.ts +70 -26
  530. package/src/ux-sim/service-key-setup.ts +50 -0
  531. package/src/ux-sim/term-slash-device.ts +74 -0
  532. package/src/ux-sim/turn-throw-sim.ts +31 -0
  533. package/src/version/packed-revision.json +1 -1
  534. package/src/web-search/exa.ts +77 -0
  535. package/src/web-search/index.ts +30 -9
  536. package/src/web-search/provider.ts +4 -1
  537. package/src/web-search/x-intent.ts +5 -0
  538. package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +0 -36
  540. package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/1455-530ca16c7e71baff.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +0 -32
  543. package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +0 -286
  548. package/apps/pwa/out/_next/static/chunks/2160.a097e7b138ae1c55.js +0 -23
  549. package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +0 -34
  552. package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/2974.595d1e29d040cb6a.js +0 -64
  557. package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +0 -93
  558. package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +0 -41
  559. package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +0 -24
  561. package/apps/pwa/out/_next/static/chunks/3741.9cf76acaa2ee5298.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +0 -77
  567. package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/4276.336d76d858fcdf1b.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +0 -74
  572. package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +0 -149
  573. package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +0 -27
  575. package/apps/pwa/out/_next/static/chunks/5431-72a1dbde59400691.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/5885.0a3e52c8faccec98.js +0 -287
  583. package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/6131.348b7d6bdcd267ce.js +0 -226
  586. package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +0 -90
  587. package/apps/pwa/out/_next/static/chunks/6377.bc7df239edbff244.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +0 -104
  594. package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +0 -94
  595. package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/7279-c199ea83f34338fa.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +0 -24
  602. package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +0 -8
  610. package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/8546-6f03f8ea34dd61d9.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/9249.976f1e69a9d80754.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/9353-12bfff0c130104cf.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/9415.69e4a21c60c7d2db.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/9633.ce5bddc56784da72.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +0 -62
  626. package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/9a852a62-6192a6ea9346ced3.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0e3d7b9421b79dac.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/term/page-bf067887b3307423.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +0 -1
  684. package/apps/pwa/out/_next/static/css/be9019f696217521.css +0 -1
  685. /package/apps/pwa/out/_next/static/{X1ucLw10Cds_h614NoEnh → Om5xS9jpjSXJCeTNGYEi4}/_ssgManifest.js +0 -0
@@ -8,34 +8,86 @@
8
8
  "artifact": "<test-state>/ux-sim/evidence/<scenario>-seed-<seed>-run-<runId>.json"
9
9
  },
10
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"], "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": "release-graph-rig", "name": "Release graph simulation rig", "implementation": ["src/ux-sim/release-sim-rig.ts"], "tests": ["src/ux-sim/release-sim-rig.test.ts", "scripts/release-loop/gate-flow-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"] },
21
- { "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"] },
22
- { "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"] },
23
- { "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"] },
24
- { "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"] },
25
- { "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"], "tests": ["src/ux-sim/aimock-local.test.ts", "src/ux-sim/in-process-cli.test.ts"], "target": "local fake LLM server and test CLI instance", "inputs": ["test state root", "fake endpoint response", "temporary git repository"], "observations": ["isolated CLI result", "server requests", "repository state"] }
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"]}
26
30
  ],
27
31
  "scenarios": [
28
- { "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" },
29
- { "id": "UX-MS-02", "name": "Release gate regression routing", "kind": "gate-regression", "device": "release-graph-rig", "implementation": ["src/ux-sim/release-sim-rig.ts"], "tests": ["src/ux-sim/release-sim-rig.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" },
30
- { "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" },
31
- { "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" },
32
- { "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" },
33
- { "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" },
34
- { "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" }
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."}
35
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
+ },
36
88
  "discovery": {
37
89
  "trackedRoot": "src/ux-sim/*.ts runtime modules",
38
- "candidateRoots": ["scripts/*sim*.ts", "scripts/release-loop/*sim*.ts", "scripts/lib/pwa-scenarios/*.ts", "test/**/*fake*", "test/**/*stub*", "test/scenarios/**/*"],
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"],
39
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."
40
92
  }
41
93
  }
@@ -23,6 +23,17 @@ export interface MockScenarioEntry {
23
23
  expected: string;
24
24
  }
25
25
 
26
+ export interface MockScenarioCandidate {
27
+ path: string;
28
+ disposition: 'device' | 'scenario' | 'already-indexed' | 'excluded';
29
+ entryCommand: string;
30
+ logsRecorded: 'yes' | 'no' | 'conditional' | 'runner-dependent';
31
+ logsDetail: string;
32
+ deviceId?: string;
33
+ scenarioIds?: string[];
34
+ excludeReason?: string;
35
+ }
36
+
26
37
  export interface MockScenarioCatalog {
27
38
  version: 1;
28
39
  runEvidence: {
@@ -34,6 +45,15 @@ export interface MockScenarioCatalog {
34
45
  };
35
46
  devices: MockScenarioDevice[];
36
47
  scenarios: MockScenarioEntry[];
48
+ candidateAudit: {
49
+ source: string;
50
+ baseCommit: string;
51
+ sourceRows: number;
52
+ existingPaths: number;
53
+ excludedPaths: number;
54
+ sourceExclusions: Array<{ path: string; reason: string }>;
55
+ candidates: MockScenarioCandidate[];
56
+ };
37
57
  discovery: { trackedRoot: string; candidateRoots: string[]; limits: string };
38
58
  }
39
59
 
@@ -99,15 +119,112 @@ export function parseMockScenarioCatalog(value: unknown): MockScenarioCatalog {
99
119
  expected: requireString(row.expected, `scenarios[${index}].expected`),
100
120
  };
101
121
  });
102
- if (!isRecord(value.runEvidence) || !isRecord(value.runEvidence.event)) throw new Error('runEvidence and runEvidence.event are required');
103
- if (!isRecord(value.discovery)) throw new Error('discovery is required');
122
+ if (!isRecord(value.candidateAudit) || !Array.isArray(value.candidateAudit.candidates) || !Array.isArray(value.candidateAudit.sourceExclusions)) {
123
+ throw new Error('candidateAudit and candidateAudit.candidates are required');
124
+ }
125
+ const knownScenarioIds = new Set(scenarios.map((scenario) => scenario.id));
126
+ const scenarioById = new Map(scenarios.map((scenario) => [scenario.id, scenario]));
127
+ const deviceById = new Map(devices.map((device) => [device.id, device]));
128
+ const candidatePaths = new Set<string>();
129
+ const sourceExclusions = value.candidateAudit.sourceExclusions.map((row, index) => {
130
+ if (!isRecord(row)) throw new Error(`candidateAudit.sourceExclusions[${index}] must be an object`);
131
+ const path = requireString(row.path, `candidateAudit.sourceExclusions[${index}].path`);
132
+ if (candidatePaths.has(path)) throw new Error(`candidateAudit.sourceExclusions contains duplicate path: ${path}`);
133
+ candidatePaths.add(path);
134
+ return { path, reason: requireString(row.reason, `candidateAudit.sourceExclusions[${index}].reason`) };
135
+ });
136
+ const candidates = value.candidateAudit.candidates.map((row, index): MockScenarioCandidate => {
137
+ if (!isRecord(row)) throw new Error(`candidateAudit.candidates[${index}] must be an object`);
138
+ const path = requireString(row.path, `candidateAudit.candidates[${index}].path`);
139
+ if (candidatePaths.has(path)) throw new Error(`candidateAudit.candidates contains duplicate path: ${path}`);
140
+ candidatePaths.add(path);
141
+ const disposition = requireString(row.disposition, `candidateAudit.candidates[${index}].disposition`);
142
+ if (!['device', 'scenario', 'already-indexed', 'excluded'].includes(disposition)) {
143
+ throw new Error(`candidateAudit.candidates[${index}].disposition is unknown: ${disposition}`);
144
+ }
145
+ const logsRecorded = requireString(row.logsRecorded, `candidateAudit.candidates[${index}].logsRecorded`);
146
+ if (!['yes', 'no', 'conditional', 'runner-dependent'].includes(logsRecorded)) {
147
+ throw new Error(`candidateAudit.candidates[${index}].logsRecorded is unknown: ${logsRecorded}`);
148
+ }
149
+ const deviceId = row.deviceId === undefined ? undefined : requireString(row.deviceId, `candidateAudit.candidates[${index}].deviceId`);
150
+ if (deviceId && !deviceIds.has(deviceId)) throw new Error(`candidateAudit.candidates[${index}] references unknown device: ${deviceId}`);
151
+ const scenarioIds = row.scenarioIds === undefined ? undefined : requireStringArray(row.scenarioIds, `candidateAudit.candidates[${index}].scenarioIds`);
152
+ for (const scenarioId of scenarioIds ?? []) {
153
+ if (!knownScenarioIds.has(scenarioId)) throw new Error(`candidateAudit.candidates[${index}] references unknown scenario: ${scenarioId}`);
154
+ }
155
+ const excludeReason = row.excludeReason === undefined ? undefined : requireString(row.excludeReason, `candidateAudit.candidates[${index}].excludeReason`);
156
+ if (disposition === 'excluded' && !excludeReason) throw new Error(`candidateAudit.candidates[${index}] excluded entries require excludeReason`);
157
+ if (disposition === 'excluded' && (deviceId || scenarioIds?.length)) {
158
+ throw new Error(`candidateAudit.candidates[${index}] excluded entries cannot have catalog links`);
159
+ }
160
+ if (disposition === 'device' && (!deviceId || !scenarioIds?.length)) {
161
+ throw new Error(`candidateAudit.candidates[${index}] device entries require deviceId and scenarioIds`);
162
+ }
163
+ if (disposition === 'scenario' && (!deviceId || !scenarioIds?.length)) {
164
+ throw new Error(`candidateAudit.candidates[${index}] scenario entries require deviceId and scenarioIds`);
165
+ }
166
+ if (disposition === 'already-indexed' && !deviceId && !scenarioIds?.length) {
167
+ throw new Error(`candidateAudit.candidates[${index}] already-indexed entries require a catalog link`);
168
+ }
169
+ if (scenarioIds?.length && !deviceId) {
170
+ throw new Error(`candidateAudit.candidates[${index}] scenarioIds require a deviceId`);
171
+ }
172
+ if (deviceId) {
173
+ const device = deviceById.get(deviceId)!;
174
+ if (![...device.implementation, ...device.tests].includes(path)) {
175
+ throw new Error(`candidateAudit.candidates[${index}] path is not registered by device ${deviceId}: ${path}`);
176
+ }
177
+ }
178
+ for (const scenarioId of scenarioIds ?? []) {
179
+ const scenario = scenarioById.get(scenarioId)!;
180
+ if (scenario.device !== deviceId) {
181
+ throw new Error(`candidateAudit.candidates[${index}] deviceId does not own scenario ${scenarioId}`);
182
+ }
183
+ if (![...scenario.implementation, ...scenario.tests].includes(path)) {
184
+ throw new Error(`candidateAudit.candidates[${index}] path is not registered by scenario ${scenarioId}: ${path}`);
185
+ }
186
+ }
187
+ return {
188
+ path,
189
+ disposition: disposition as MockScenarioCandidate['disposition'],
190
+ entryCommand: requireString(row.entryCommand, `candidateAudit.candidates[${index}].entryCommand`),
191
+ logsRecorded: logsRecorded as MockScenarioCandidate['logsRecorded'],
192
+ logsDetail: requireString(row.logsDetail, `candidateAudit.candidates[${index}].logsDetail`),
193
+ ...(deviceId ? { deviceId } : {}),
194
+ ...(scenarioIds ? { scenarioIds } : {}),
195
+ ...(excludeReason ? { excludeReason } : {}),
196
+ };
197
+ });
198
+ const candidateAudit = value.candidateAudit;
199
+ const sourceRows = candidateAudit.sourceRows;
200
+ const baseCommit = candidateAudit.baseCommit;
201
+ const existingPaths = candidateAudit.existingPaths;
202
+ const excludedPaths = candidateAudit.excludedPaths;
203
+ if (![sourceRows, existingPaths, excludedPaths].every((n) => Number.isInteger(n) && Number(n) >= 0)) {
204
+ throw new Error('candidateAudit counts must be non-negative integers');
205
+ }
206
+ if (sourceRows !== candidates.length + sourceExclusions.length || excludedPaths !== candidates.filter((candidate) => candidate.disposition === 'excluded').length) {
207
+ throw new Error('candidateAudit counts do not match the candidate rows');
208
+ }
209
+ if (Number(existingPaths) !== candidates.length) throw new Error('candidateAudit.existingPaths must equal the current candidate count');
104
210
  const runEvidence = value.runEvidence;
211
+ if (!isRecord(runEvidence) || !isRecord(runEvidence.event)) throw new Error('runEvidence and runEvidence.event are required');
212
+ if (!isRecord(value.discovery)) throw new Error('discovery is required');
105
213
  const event = runEvidence.event;
106
214
  const discovery = value.discovery;
107
215
  return {
108
216
  version: 1,
109
217
  devices,
110
218
  scenarios,
219
+ candidateAudit: {
220
+ source: requireString(candidateAudit.source, 'candidateAudit.source'),
221
+ baseCommit: requireString(baseCommit, 'candidateAudit.baseCommit'),
222
+ sourceRows: Number(sourceRows),
223
+ existingPaths: Number(existingPaths),
224
+ excludedPaths: Number(excludedPaths),
225
+ sourceExclusions,
226
+ candidates,
227
+ },
111
228
  runEvidence: {
112
229
  scope: requireString(runEvidence.scope, 'runEvidence.scope'),
113
230
  runId: requireString(runEvidence.runId, 'runEvidence.runId'),
@@ -133,6 +250,7 @@ export function renderMockScenarioList(catalog: MockScenarioCatalog): string[] {
133
250
  'Mock scenario catalog · reusable devices and scenario references',
134
251
  ...catalog.scenarios.map((scenario) => `${scenario.id}\t${scenario.kind}\t${scenario.name}`),
135
252
  `장치 ${catalog.devices.length} · 시나리오 ${catalog.scenarios.length} · 자세히: bun scripts/ux-sim.ts show <MS-id>`,
253
+ `후보 감사 ${catalog.candidateAudit.existingPaths}/${catalog.candidateAudit.sourceRows} 경로 확인 · 제외 ${catalog.candidateAudit.excludedPaths} · entry/logs 근거는 mock-scenario-catalog.json`,
136
254
  ];
137
255
  }
138
256
 
@@ -1,14 +1,13 @@
1
- // ux-sim device: the PRODUCTION first-run menu, driven under a real util-linux PTY.
1
+ // ux-sim device: the PRODUCTION fresh-install setup menu, driven under a real util-linux PTY.
2
2
  //
3
- // Why this exists: the menu re-ask loop of `src/onboarding/first-run.ts`
4
- // (`promptProviderMenu` → `parseMenuAnswer`) is only reachable when
3
+ // Why this exists: the fresh-install setup menu is only reachable when
5
4
  // `process.stdin.isTTY` is true. A plain pipe makes the CLI take the non-TTY
6
5
  // `needs-llm` shortcut instead, so the board (how many times the menu comes
7
6
  // back, which phrase ends the run, whether `onboarding.ready` is written) is
8
7
  // unmeasurable without a TTY. This device allocates one the same way the live
9
8
  // seat does — util-linux `script -q -e -c` — so the production entrypoint
10
9
  // `bin/elanous.mjs --test` runs its real `src/index.ts` → `runFirstRun` →
11
- // `promptProviderMenu` path.
10
+ // `runFirstRunProviderSetup` path.
12
11
  //
13
12
  // Isolation (K-MK-03): HOME/XDG/claude dirs are a fresh temp tree and the CLI
14
13
  // is spawned with `--test --config-dir <temp>`, so the run cannot touch a real
@@ -19,26 +18,30 @@ import { spawn } from 'node:child_process';
19
18
  import { mkdirSync, mkdtempSync, readFileSync, rmSync } from 'node:fs';
20
19
  import { tmpdir } from 'node:os';
21
20
  import { join, resolve } from 'node:path';
22
- import { formatProviderMenu, orderProviderChoices } from '../onboarding/first-run.js';
21
+ import { FIRST_RUN_PROVIDER_MENU_PROMPT, formatProviderMenu, orderProviderChoices } from '../onboarding/first-run.js';
22
+ import {
23
+ FIRST_RUN_PROVIDER_SETUP_MENU_CHOICES,
24
+ FIRST_RUN_PROVIDER_SETUP_MENU_HEADING,
25
+ FIRST_RUN_PROVIDER_SETUP_MENU_MAX_MISSES,
26
+ } from '../cli/setup-keys.js';
23
27
  import { spawnElanousSync } from '../instance/spawn-elanous.js';
24
28
  import { createFakeBins, utilLinuxScript, type FakeBinCall } from './fake-bin.js';
25
- /**
26
- * Text `promptProviderMenu` prints before every re-ask — one occurrence per render.
27
- * Every assertion on the re-ask count uses this marker, so it has one source.
28
- */
29
- export const FIRST_RUN_MENU_MARKER = 'Choose LLM';
30
- /**
31
- * Fixed choice line of the first-run menu, taken from the production renderer
32
- * itself (`formatProviderMenu` over the default choice order) rather than retyped.
33
- * Every assertion that the menu printed the expected wording — here and in
34
- * `src/onboarding/first-run.test.ts` — reads this, so production wording drift
35
- * turns into a failure instead of a stale expectation.
36
- */
29
+ /** English provider chooser and Korean fresh-install chooser headings. */
30
+ export const FIRST_RUN_MENU_MARKERS = [FIRST_RUN_PROVIDER_MENU_PROMPT, FIRST_RUN_PROVIDER_SETUP_MENU_HEADING] as const;
31
+
32
+ /** Count menu renders independently of the selected user-facing locale. */
33
+ export function countFirstRunMenuRenders(output: string): number {
34
+ const markerCounts = FIRST_RUN_MENU_MARKERS.map((marker) => output.split(marker).length - 1);
35
+ // A process keeps one locale; max also avoids counting one bilingual render twice.
36
+ return Math.max(...markerCounts);
37
+ }
38
+ /** Fixed provider-chooser choice line, taken from the production renderer. */
37
39
  export const FIRST_RUN_MENU_CHOICES = formatProviderMenu(orderProviderChoices());
40
+ export const FIRST_RUN_MENU_CHOICE_MARKERS = [FIRST_RUN_MENU_CHOICES, FIRST_RUN_PROVIDER_SETUP_MENU_CHOICES] as const;
38
41
  /** Line `runFirstRun` prints before a fresh install has to pick a provider. */
39
42
  export const FIRST_RUN_SETUP_HINT = 'eln setup llm 으로 고르세요';
40
- /** Misses the parser must reject and re-ask: out of range, exponent, full-width, then 1. */
41
- export const FIRST_RUN_MENU_ANSWERS = ['4', '1e0', '1', '1'] as const;
43
+ /** Misses the parser must reject: out of range, exponent, and full-width digits. */
44
+ export const FIRST_RUN_MENU_ANSWERS = ['4', '1e0', '1'] as const;
42
45
 
43
46
  const repoRoot = resolve(import.meta.dir, '../..');
44
47
  const cliEntry = join(repoRoot, 'bin', 'elanous.mjs');
@@ -196,6 +199,7 @@ export async function driveFirstRunMenu(
196
199
  let stdout = '';
197
200
  let stderr = '';
198
201
  let seen = 0;
202
+ let keyPasteAnswered = false;
199
203
  const answersSent: string[] = [];
200
204
  let closed = false;
201
205
  let timedOut = false;
@@ -209,13 +213,19 @@ export async function driveFirstRunMenu(
209
213
 
210
214
  child.stdout.on('data', (chunk: Buffer) => {
211
215
  stdout += chunk.toString('utf8');
212
- const count = stdout.split(FIRST_RUN_MENU_MARKER).length - 1;
216
+ const count = countFirstRunMenuRenders(stdout);
213
217
  while (seen < count) {
214
218
  seen += 1;
215
219
  setTimeout(() => {
216
220
  if (!closed) writeNext();
217
221
  }, answerDelayMs);
218
222
  }
223
+ if (!keyPasteAnswered && stdout.includes('.env 형식 키를 붙여 넣고 빈 줄로 끝내세요')) {
224
+ keyPasteAnswered = true;
225
+ setTimeout(() => {
226
+ if (!closed) child.stdin.write('\n');
227
+ }, answerDelayMs);
228
+ }
219
229
  });
220
230
  child.stderr.on('data', (chunk: Buffer) => {
221
231
  stderr += chunk.toString('utf8');
@@ -253,7 +263,7 @@ export async function driveFirstRunMenu(
253
263
  stderr,
254
264
  status,
255
265
  timedOut,
256
- menuRenderCount: Math.min(seen, stdout.split(FIRST_RUN_MENU_MARKER).length - 1),
266
+ menuRenderCount: Math.min(seen, countFirstRunMenuRenders(stdout)),
257
267
  answersSent,
258
268
  finalPhrase: stdout.includes(FIRST_RUN_SETUP_HINT) ? FIRST_RUN_SETUP_HINT : null,
259
269
  readyRecorded,