@parity/product-lab 0.0.1-placeholder → 0.1.0

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 (2987) hide show
  1. package/CHANGELOG.md +993 -0
  2. package/LICENSE +204 -0
  3. package/README.md +325 -2
  4. package/adapters/browser/playwright/README.md +214 -0
  5. package/adapters/browser/playwright/src/axe-scan.d.ts +6 -0
  6. package/adapters/browser/playwright/src/axe-scan.js +41 -0
  7. package/adapters/browser/playwright/src/bytes.d.ts +1 -0
  8. package/adapters/browser/playwright/src/bytes.js +5 -0
  9. package/adapters/browser/playwright/src/conditioned-socket.d.ts +28 -0
  10. package/adapters/browser/playwright/src/conditioned-socket.js +40 -0
  11. package/adapters/browser/playwright/src/devices.d.ts +14 -0
  12. package/adapters/browser/playwright/src/devices.js +24 -0
  13. package/adapters/browser/playwright/src/errors.d.ts +2 -0
  14. package/adapters/browser/playwright/src/errors.js +6 -0
  15. package/adapters/browser/playwright/src/evidence-url.d.ts +4 -0
  16. package/adapters/browser/playwright/src/evidence-url.js +29 -0
  17. package/adapters/browser/playwright/src/faithful-web-socket.d.ts +2 -0
  18. package/adapters/browser/playwright/src/faithful-web-socket.js +9 -0
  19. package/adapters/browser/playwright/src/free-loopback-port.d.ts +2 -0
  20. package/adapters/browser/playwright/src/free-loopback-port.js +13 -0
  21. package/adapters/browser/playwright/src/headless-app-surface.d.ts +30 -0
  22. package/adapters/browser/playwright/src/headless-app-surface.js +68 -0
  23. package/adapters/browser/playwright/src/index.d.ts +16 -0
  24. package/adapters/browser/playwright/src/index.js +18 -0
  25. package/adapters/browser/playwright/src/native-rtc.d.ts +11 -0
  26. package/adapters/browser/playwright/src/native-rtc.js +89 -0
  27. package/adapters/browser/playwright/src/network-evidence.d.ts +25 -0
  28. package/adapters/browser/playwright/src/network-evidence.js +575 -0
  29. package/adapters/browser/playwright/src/page-conditions.d.ts +37 -0
  30. package/adapters/browser/playwright/src/page-conditions.js +81 -0
  31. package/adapters/browser/playwright/src/page-console-watch.d.ts +12 -0
  32. package/adapters/browser/playwright/src/page-console-watch.js +43 -0
  33. package/adapters/browser/playwright/src/page-frame-capture.d.ts +32 -0
  34. package/adapters/browser/playwright/src/page-frame-capture.js +87 -0
  35. package/adapters/browser/playwright/src/page-video.d.ts +15 -0
  36. package/adapters/browser/playwright/src/page-video.js +25 -0
  37. package/adapters/browser/playwright/src/playwright-browser-context.d.ts +20 -0
  38. package/adapters/browser/playwright/src/playwright-browser-context.js +44 -0
  39. package/adapters/browser/playwright/src/playwright-browser-launcher.d.ts +9 -0
  40. package/adapters/browser/playwright/src/playwright-browser-launcher.js +53 -0
  41. package/adapters/browser/playwright/src/playwright-browser.d.ts +57 -0
  42. package/adapters/browser/playwright/src/playwright-browser.js +71 -0
  43. package/adapters/browser/playwright/src/playwright-page.d.ts +68 -0
  44. package/adapters/browser/playwright/src/playwright-page.js +111 -0
  45. package/adapters/browser/playwright/src/playwright-route.d.ts +13 -0
  46. package/adapters/browser/playwright/src/playwright-route.js +29 -0
  47. package/adapters/browser/playwright/src/playwright-slide-renderer.d.ts +11 -0
  48. package/adapters/browser/playwright/src/playwright-slide-renderer.js +26 -0
  49. package/adapters/browser/playwright/src/playwright-web-socket-route.d.ts +16 -0
  50. package/adapters/browser/playwright/src/playwright-web-socket-route.js +27 -0
  51. package/adapters/browser/playwright/src/press-target.d.ts +76 -0
  52. package/adapters/browser/playwright/src/press-target.js +186 -0
  53. package/adapters/browser/playwright/src/socket-routes.d.ts +14 -0
  54. package/adapters/browser/playwright/src/socket-routes.js +20 -0
  55. package/adapters/browser/playwright/src/wire-delivery.d.ts +10 -0
  56. package/adapters/browser/playwright/src/wire-delivery.js +31 -0
  57. package/adapters/browser/playwright/src/worker-hold.d.ts +26 -0
  58. package/adapters/browser/playwright/src/worker-hold.js +115 -0
  59. package/adapters/chain/papi/README.md +203 -0
  60. package/adapters/chain/papi/src/chain-access.d.ts +178 -0
  61. package/adapters/chain/papi/src/chain-access.js +530 -0
  62. package/adapters/chain/papi/src/errors.d.ts +15 -0
  63. package/adapters/chain/papi/src/errors.js +29 -0
  64. package/adapters/chain/papi/src/extrinsic-decoder.d.ts +21 -0
  65. package/adapters/chain/papi/src/extrinsic-decoder.js +396 -0
  66. package/adapters/chain/papi/src/extrinsic-signer.d.ts +2 -0
  67. package/adapters/chain/papi/src/extrinsic-signer.js +14 -0
  68. package/adapters/chain/papi/src/index.d.ts +5 -0
  69. package/adapters/chain/papi/src/index.js +7 -0
  70. package/adapters/chain/papi/src/plain-value.d.ts +7 -0
  71. package/adapters/chain/papi/src/plain-value.js +58 -0
  72. package/adapters/chain/papi/src/signer.d.ts +27 -0
  73. package/adapters/chain/papi/src/signer.js +51 -0
  74. package/adapters/chain/papi/src/statement-store-reader.d.ts +12 -0
  75. package/adapters/chain/papi/src/statement-store-reader.js +146 -0
  76. package/adapters/chain/papi/src/track-transaction.d.ts +47 -0
  77. package/adapters/chain/papi/src/track-transaction.js +97 -0
  78. package/adapters/chain/papi/src/transaction-submitter.d.ts +87 -0
  79. package/adapters/chain/papi/src/transaction-submitter.js +132 -0
  80. package/adapters/deploy/bulletin/README.md +148 -0
  81. package/adapters/deploy/bulletin/src/bulletin-deployer.d.ts +82 -0
  82. package/adapters/deploy/bulletin/src/bulletin-deployer.js +234 -0
  83. package/adapters/deploy/bulletin/src/bytes.d.ts +6 -0
  84. package/adapters/deploy/bulletin/src/bytes.js +25 -0
  85. package/adapters/deploy/bulletin/src/content/bulletin-content-reader.d.ts +35 -0
  86. package/adapters/deploy/bulletin/src/content/bulletin-content-reader.js +58 -0
  87. package/adapters/deploy/bulletin/src/content/car.d.ts +27 -0
  88. package/adapters/deploy/bulletin/src/content/car.js +112 -0
  89. package/adapters/deploy/bulletin/src/content/cid.d.ts +31 -0
  90. package/adapters/deploy/bulletin/src/content/cid.js +114 -0
  91. package/adapters/deploy/bulletin/src/content/dag.d.ts +27 -0
  92. package/adapters/deploy/bulletin/src/content/dag.js +157 -0
  93. package/adapters/deploy/bulletin/src/content/ipfs-gateway-source.d.ts +10 -0
  94. package/adapters/deploy/bulletin/src/content/ipfs-gateway-source.js +14 -0
  95. package/adapters/deploy/bulletin/src/content/retrieve-content.d.ts +3 -0
  96. package/adapters/deploy/bulletin/src/content/retrieve-content.js +18 -0
  97. package/adapters/deploy/bulletin/src/content/site.d.ts +16 -0
  98. package/adapters/deploy/bulletin/src/content/site.js +56 -0
  99. package/adapters/deploy/bulletin/src/deployment-check.d.ts +25 -0
  100. package/adapters/deploy/bulletin/src/deployment-check.js +51 -0
  101. package/adapters/deploy/bulletin/src/dotns/dotns-registrar.d.ts +31 -0
  102. package/adapters/deploy/bulletin/src/dotns/dotns-registrar.js +53 -0
  103. package/adapters/deploy/bulletin/src/dotns/dotns-resolver.d.ts +41 -0
  104. package/adapters/deploy/bulletin/src/dotns/dotns-resolver.js +148 -0
  105. package/adapters/deploy/bulletin/src/dotns/manifest-freshness.d.ts +66 -0
  106. package/adapters/deploy/bulletin/src/dotns/manifest-freshness.js +76 -0
  107. package/adapters/deploy/bulletin/src/dotns/read-only-rpc.d.ts +17 -0
  108. package/adapters/deploy/bulletin/src/dotns/read-only-rpc.js +23 -0
  109. package/adapters/deploy/bulletin/src/endpoints.d.ts +20 -0
  110. package/adapters/deploy/bulletin/src/endpoints.js +36 -0
  111. package/adapters/deploy/bulletin/src/errors.d.ts +13 -0
  112. package/adapters/deploy/bulletin/src/errors.js +13 -0
  113. package/adapters/deploy/bulletin/src/gateway/deployed-content-gateway.d.ts +46 -0
  114. package/adapters/deploy/bulletin/src/gateway/deployed-content-gateway.js +126 -0
  115. package/adapters/deploy/bulletin/src/gateway/gateway-destinations.d.ts +35 -0
  116. package/adapters/deploy/bulletin/src/gateway/gateway-destinations.js +45 -0
  117. package/adapters/deploy/bulletin/src/gateway/gateway-program.d.ts +79 -0
  118. package/adapters/deploy/bulletin/src/gateway/gateway-program.js +181 -0
  119. package/adapters/deploy/bulletin/src/index.d.ts +27 -0
  120. package/adapters/deploy/bulletin/src/index.js +29 -0
  121. package/adapters/deploy/bulletin/src/launch/deployed-local-launcher.d.ts +77 -0
  122. package/adapters/deploy/bulletin/src/launch/deployed-local-launcher.js +90 -0
  123. package/adapters/deploy/bulletin/src/launch/launch-mode.d.ts +12 -0
  124. package/adapters/deploy/bulletin/src/launch/launch-mode.js +23 -0
  125. package/adapters/deploy/bulletin/src/platform/bulletin-store.d.ts +17 -0
  126. package/adapters/deploy/bulletin/src/platform/bulletin-store.js +28 -0
  127. package/adapters/deploy/bulletin/src/platform/chain-ports.d.ts +69 -0
  128. package/adapters/deploy/bulletin/src/platform/chain-ports.js +69 -0
  129. package/adapters/deploy/bulletin/src/platform/platform-requirements.d.ts +34 -0
  130. package/adapters/deploy/bulletin/src/platform/platform-requirements.js +12 -0
  131. package/adapters/deploy/bulletin/src/platform/revive-contracts.d.ts +53 -0
  132. package/adapters/deploy/bulletin/src/platform/revive-contracts.js +86 -0
  133. package/adapters/deploy/bulletin/src/platform/statement-store.d.ts +50 -0
  134. package/adapters/deploy/bulletin/src/platform/statement-store.js +96 -0
  135. package/adapters/deploy/bulletin/src/tool/bulletin-deploy-library.d.ts +64 -0
  136. package/adapters/deploy/bulletin/src/tool/bulletin-deploy-library.js +33 -0
  137. package/adapters/deploy/bulletin/src/tool/bulletin-deploy-tool.d.ts +18 -0
  138. package/adapters/deploy/bulletin/src/tool/bulletin-deploy-tool.js +73 -0
  139. package/adapters/deploy/bulletin/src/tool/environment-file.d.ts +34 -0
  140. package/adapters/deploy/bulletin/src/tool/environment-file.js +36 -0
  141. package/adapters/environment/attached/README.md +75 -0
  142. package/adapters/environment/attached/src/index.d.ts +54 -0
  143. package/adapters/environment/attached/src/index.js +123 -0
  144. package/adapters/environment/attached/src/live-network.d.ts +62 -0
  145. package/adapters/environment/attached/src/live-network.js +96 -0
  146. package/adapters/environment/attached/src/versions.d.ts +29 -0
  147. package/adapters/environment/attached/src/versions.js +51 -0
  148. package/adapters/environment/chopsticks/README.md +200 -0
  149. package/adapters/environment/chopsticks/src/chopsticks-environment-factory.d.ts +140 -0
  150. package/adapters/environment/chopsticks/src/chopsticks-environment-factory.js +55 -0
  151. package/adapters/environment/chopsticks/src/chopsticks-topology.d.ts +176 -0
  152. package/adapters/environment/chopsticks/src/chopsticks-topology.js +287 -0
  153. package/adapters/environment/chopsticks/src/constants.d.ts +11 -0
  154. package/adapters/environment/chopsticks/src/constants.js +15 -0
  155. package/adapters/environment/chopsticks/src/dev-authority.d.ts +21 -0
  156. package/adapters/environment/chopsticks/src/dev-authority.js +66 -0
  157. package/adapters/environment/chopsticks/src/environment.d.ts +133 -0
  158. package/adapters/environment/chopsticks/src/environment.js +358 -0
  159. package/adapters/environment/chopsticks/src/extensions.d.ts +27 -0
  160. package/adapters/environment/chopsticks/src/extensions.js +60 -0
  161. package/adapters/environment/chopsticks/src/general-extrinsic-support.d.ts +17 -0
  162. package/adapters/environment/chopsticks/src/general-extrinsic-support.js +58 -0
  163. package/adapters/environment/chopsticks/src/index.d.ts +15 -0
  164. package/adapters/environment/chopsticks/src/index.js +17 -0
  165. package/adapters/environment/chopsticks/src/options.d.ts +75 -0
  166. package/adapters/environment/chopsticks/src/options.js +56 -0
  167. package/adapters/environment/chopsticks/src/plan.d.ts +49 -0
  168. package/adapters/environment/chopsticks/src/plan.js +68 -0
  169. package/adapters/environment/chopsticks/src/provider.d.ts +43 -0
  170. package/adapters/environment/chopsticks/src/provider.js +78 -0
  171. package/adapters/environment/chopsticks/src/spec-proxy.d.ts +16 -0
  172. package/adapters/environment/chopsticks/src/spec-proxy.js +109 -0
  173. package/adapters/environment/chopsticks/src/sqlite-support.d.ts +15 -0
  174. package/adapters/environment/chopsticks/src/sqlite-support.js +32 -0
  175. package/adapters/environment/chopsticks/src/time.d.ts +18 -0
  176. package/adapters/environment/chopsticks/src/time.js +96 -0
  177. package/adapters/environment/chopsticks/src/topology-options-schema.d.ts +119 -0
  178. package/adapters/environment/chopsticks/src/topology-options-schema.js +58 -0
  179. package/adapters/environment/chopsticks/src/topology.d.ts +11 -0
  180. package/adapters/environment/chopsticks/src/topology.js +64 -0
  181. package/adapters/environment/chopsticks/src/upstream.d.ts +22 -0
  182. package/adapters/environment/chopsticks/src/upstream.js +58 -0
  183. package/adapters/environment/chopsticks/src/versions.d.ts +31 -0
  184. package/adapters/environment/chopsticks/src/versions.js +58 -0
  185. package/adapters/environment/engine/README.md +123 -0
  186. package/adapters/environment/engine/engine.example.json +9 -0
  187. package/adapters/environment/engine/src/engine/approval-pin.d.ts +106 -0
  188. package/adapters/environment/engine/src/engine/approval-pin.js +98 -0
  189. package/adapters/environment/engine/src/engine/chain-clock.d.ts +55 -0
  190. package/adapters/environment/engine/src/engine/chain-clock.js +66 -0
  191. package/adapters/environment/engine/src/engine/checkout-lock.d.ts +52 -0
  192. package/adapters/environment/engine/src/engine/checkout-lock.js +136 -0
  193. package/adapters/environment/engine/src/engine/drain.d.ts +54 -0
  194. package/adapters/environment/engine/src/engine/drain.js +74 -0
  195. package/adapters/environment/engine/src/engine/engine-config.d.ts +97 -0
  196. package/adapters/environment/engine/src/engine/engine-config.js +55 -0
  197. package/adapters/environment/engine/src/engine/engine-health.d.ts +99 -0
  198. package/adapters/environment/engine/src/engine/engine-health.js +217 -0
  199. package/adapters/environment/engine/src/engine/engine-ports.d.ts +13 -0
  200. package/adapters/environment/engine/src/engine/engine-ports.js +60 -0
  201. package/adapters/environment/engine/src/engine/engine-prepare.d.ts +55 -0
  202. package/adapters/environment/engine/src/engine/engine-prepare.js +86 -0
  203. package/adapters/environment/engine/src/engine/engine-setup-jobs.d.ts +16 -0
  204. package/adapters/environment/engine/src/engine/engine-setup-jobs.js +63 -0
  205. package/adapters/environment/engine/src/engine/engine-start-phases.d.ts +65 -0
  206. package/adapters/environment/engine/src/engine/engine-start-phases.js +230 -0
  207. package/adapters/environment/engine/src/engine/eth-rpc-probe.d.ts +17 -0
  208. package/adapters/environment/engine/src/engine/eth-rpc-probe.js +23 -0
  209. package/adapters/environment/engine/src/engine/finality-stall.d.ts +41 -0
  210. package/adapters/environment/engine/src/engine/finality-stall.js +61 -0
  211. package/adapters/environment/engine/src/engine/fork-bundle.d.ts +59 -0
  212. package/adapters/environment/engine/src/engine/fork-bundle.js +159 -0
  213. package/adapters/environment/engine/src/engine/fork-freshness.d.ts +154 -0
  214. package/adapters/environment/engine/src/engine/fork-freshness.js +238 -0
  215. package/adapters/environment/engine/src/engine/fork-isolation.d.ts +19 -0
  216. package/adapters/environment/engine/src/engine/fork-isolation.js +44 -0
  217. package/adapters/environment/engine/src/engine/fork-refresh.d.ts +75 -0
  218. package/adapters/environment/engine/src/engine/fork-refresh.js +193 -0
  219. package/adapters/environment/engine/src/engine/fork-setup.d.ts +59 -0
  220. package/adapters/environment/engine/src/engine/fork-setup.js +87 -0
  221. package/adapters/environment/engine/src/engine/fork-snapshot.d.ts +6 -0
  222. package/adapters/environment/engine/src/engine/fork-snapshot.js +42 -0
  223. package/adapters/environment/engine/src/engine/fork-toml.d.ts +110 -0
  224. package/adapters/environment/engine/src/engine/fork-toml.js +260 -0
  225. package/adapters/environment/engine/src/engine/fork-topology.d.ts +65 -0
  226. package/adapters/environment/engine/src/engine/fork-topology.js +61 -0
  227. package/adapters/environment/engine/src/engine/fork-updates.d.ts +61 -0
  228. package/adapters/environment/engine/src/engine/fork-updates.js +148 -0
  229. package/adapters/environment/engine/src/engine/ipfs-isolation.d.ts +38 -0
  230. package/adapters/environment/engine/src/engine/ipfs-isolation.js +62 -0
  231. package/adapters/environment/engine/src/engine/live-network.d.ts +32 -0
  232. package/adapters/environment/engine/src/engine/live-network.js +41 -0
  233. package/adapters/environment/engine/src/engine/network-adoption.d.ts +56 -0
  234. package/adapters/environment/engine/src/engine/network-adoption.js +195 -0
  235. package/adapters/environment/engine/src/engine/network-plan.d.ts +71 -0
  236. package/adapters/environment/engine/src/engine/network-plan.js +158 -0
  237. package/adapters/environment/engine/src/engine/network-reset.d.ts +18 -0
  238. package/adapters/environment/engine/src/engine/network-reset.js +21 -0
  239. package/adapters/environment/engine/src/engine/network-seed.d.ts +82 -0
  240. package/adapters/environment/engine/src/engine/network-seed.js +183 -0
  241. package/adapters/environment/engine/src/engine/network-snapshots.d.ts +64 -0
  242. package/adapters/environment/engine/src/engine/network-snapshots.js +161 -0
  243. package/adapters/environment/engine/src/engine/network-template.d.ts +65 -0
  244. package/adapters/environment/engine/src/engine/network-template.js +98 -0
  245. package/adapters/environment/engine/src/engine/node-isolation.d.ts +83 -0
  246. package/adapters/environment/engine/src/engine/node-isolation.js +164 -0
  247. package/adapters/environment/engine/src/engine/node-temp-dir.d.ts +27 -0
  248. package/adapters/environment/engine/src/engine/node-temp-dir.js +31 -0
  249. package/adapters/environment/engine/src/engine/owned-engine.d.ts +312 -0
  250. package/adapters/environment/engine/src/engine/owned-engine.js +595 -0
  251. package/adapters/environment/engine/src/engine/owned-environment.d.ts +24 -0
  252. package/adapters/environment/engine/src/engine/owned-environment.js +84 -0
  253. package/adapters/environment/engine/src/engine/persisted-data.d.ts +67 -0
  254. package/adapters/environment/engine/src/engine/persisted-data.js +147 -0
  255. package/adapters/environment/engine/src/engine/persisted-isolation.d.ts +33 -0
  256. package/adapters/environment/engine/src/engine/persisted-isolation.js +91 -0
  257. package/adapters/environment/engine/src/engine/persistent-network.d.ts +354 -0
  258. package/adapters/environment/engine/src/engine/persistent-network.js +580 -0
  259. package/adapters/environment/engine/src/engine/plan-ports.d.ts +83 -0
  260. package/adapters/environment/engine/src/engine/plan-ports.js +165 -0
  261. package/adapters/environment/engine/src/engine/published-bundle.d.ts +117 -0
  262. package/adapters/environment/engine/src/engine/published-bundle.js +250 -0
  263. package/adapters/environment/engine/src/engine/runtime-upgrade.d.ts +131 -0
  264. package/adapters/environment/engine/src/engine/runtime-upgrade.js +202 -0
  265. package/adapters/environment/engine/src/engine/saved-tooling.d.ts +10 -0
  266. package/adapters/environment/engine/src/engine/saved-tooling.js +32 -0
  267. package/adapters/environment/engine/src/engine/turn-relay.d.ts +80 -0
  268. package/adapters/environment/engine/src/engine/turn-relay.js +103 -0
  269. package/adapters/environment/engine/src/errors.d.ts +140 -0
  270. package/adapters/environment/engine/src/errors.js +131 -0
  271. package/adapters/environment/engine/src/evidence/engine-logs.d.ts +4 -0
  272. package/adapters/environment/engine/src/evidence/engine-logs.js +20 -0
  273. package/adapters/environment/engine/src/evidence/engine-progress.d.ts +18 -0
  274. package/adapters/environment/engine/src/evidence/engine-progress.js +102 -0
  275. package/adapters/environment/engine/src/index.d.ts +52 -0
  276. package/adapters/environment/engine/src/index.js +54 -0
  277. package/adapters/environment/engine/src/saved-fork/saved-fork-tooling.d.ts +20 -0
  278. package/adapters/environment/engine/src/saved-fork/saved-fork-tooling.js +66 -0
  279. package/adapters/environment/engine/src/saved-fork/saved-fork.d.ts +118 -0
  280. package/adapters/environment/engine/src/saved-fork/saved-fork.js +298 -0
  281. package/adapters/environment/engine/src/session/chain-observation.d.ts +30 -0
  282. package/adapters/environment/engine/src/session/chain-observation.js +23 -0
  283. package/adapters/environment/engine/src/session/engine-networks.d.ts +8 -0
  284. package/adapters/environment/engine/src/session/engine-networks.js +6 -0
  285. package/adapters/environment/engine/src/session/network-lock.d.ts +107 -0
  286. package/adapters/environment/engine/src/session/network-lock.js +125 -0
  287. package/adapters/environment/engine/src/session/readiness.d.ts +181 -0
  288. package/adapters/environment/engine/src/session/readiness.js +251 -0
  289. package/adapters/environment/engine/src/session/runtime-dependency.d.ts +188 -0
  290. package/adapters/environment/engine/src/session/runtime-dependency.js +20 -0
  291. package/adapters/environment/engine/src/session/session.d.ts +243 -0
  292. package/adapters/environment/engine/src/session/session.js +98 -0
  293. package/adapters/environment/engine/src/setup/engine-build.d.ts +13 -0
  294. package/adapters/environment/engine/src/setup/engine-build.js +24 -0
  295. package/adapters/environment/engine/src/setup/patch-catalogue.d.ts +20 -0
  296. package/adapters/environment/engine/src/setup/patch-catalogue.js +15 -0
  297. package/adapters/environment/engine/src/setup/patches.d.ts +37 -0
  298. package/adapters/environment/engine/src/setup/patches.js +48 -0
  299. package/adapters/environment/engine/src/setup/prepare-engine.d.ts +86 -0
  300. package/adapters/environment/engine/src/setup/prepare-engine.js +186 -0
  301. package/adapters/environment/engine/src/setup/setup-command.d.ts +11 -0
  302. package/adapters/environment/engine/src/setup/setup-command.js +17 -0
  303. package/adapters/environment/engine/src/setup/sync-command.d.ts +3 -0
  304. package/adapters/environment/engine/src/setup/sync-command.js +10 -0
  305. package/adapters/environment/engine/src/testing/engine-dashboard.d.ts +37 -0
  306. package/adapters/environment/engine/src/testing/engine-dashboard.js +83 -0
  307. package/adapters/environment/engine/src/topology/engine-environment-factory.d.ts +107 -0
  308. package/adapters/environment/engine/src/topology/engine-environment-factory.js +37 -0
  309. package/adapters/environment/engine/src/topology/engine-plan.d.ts +35 -0
  310. package/adapters/environment/engine/src/topology/engine-plan.js +84 -0
  311. package/adapters/environment/engine/src/topology/engine-provider.d.ts +25 -0
  312. package/adapters/environment/engine/src/topology/engine-provider.js +109 -0
  313. package/adapters/environment/engine/src/topology/engine-run.d.ts +63 -0
  314. package/adapters/environment/engine/src/topology/engine-run.js +129 -0
  315. package/adapters/environment/engine/src/topology/engine-topology.d.ts +131 -0
  316. package/adapters/environment/engine/src/topology/engine-topology.js +236 -0
  317. package/adapters/environment/engine/src/topology/topology-options-schema.d.ts +79 -0
  318. package/adapters/environment/engine/src/topology/topology-options-schema.js +57 -0
  319. package/adapters/environment/engine/src/versions/engine-versions.d.ts +90 -0
  320. package/adapters/environment/engine/src/versions/engine-versions.js +138 -0
  321. package/adapters/environment/relayless/README.md +199 -0
  322. package/adapters/environment/relayless/src/chain-readiness.d.ts +37 -0
  323. package/adapters/environment/relayless/src/chain-readiness.js +51 -0
  324. package/adapters/environment/relayless/src/fast-baseline.d.ts +43 -0
  325. package/adapters/environment/relayless/src/fast-baseline.js +56 -0
  326. package/adapters/environment/relayless/src/index.d.ts +15 -0
  327. package/adapters/environment/relayless/src/index.js +17 -0
  328. package/adapters/environment/relayless/src/manual-seal-session.d.ts +125 -0
  329. package/adapters/environment/relayless/src/manual-seal-session.js +82 -0
  330. package/adapters/environment/relayless/src/owned-people-node.d.ts +55 -0
  331. package/adapters/environment/relayless/src/owned-people-node.js +199 -0
  332. package/adapters/environment/relayless/src/prepare-people-genesis.d.ts +87 -0
  333. package/adapters/environment/relayless/src/prepare-people-genesis.js +119 -0
  334. package/adapters/environment/relayless/src/topology/dev-chain-spec.d.ts +44 -0
  335. package/adapters/environment/relayless/src/topology/dev-chain-spec.js +131 -0
  336. package/adapters/environment/relayless/src/topology/dev-node.d.ts +21 -0
  337. package/adapters/environment/relayless/src/topology/dev-node.js +41 -0
  338. package/adapters/environment/relayless/src/topology/locked-artifacts.d.ts +35 -0
  339. package/adapters/environment/relayless/src/topology/locked-artifacts.js +87 -0
  340. package/adapters/environment/relayless/src/topology/relayless-environment-factory.d.ts +106 -0
  341. package/adapters/environment/relayless/src/topology/relayless-environment-factory.js +38 -0
  342. package/adapters/environment/relayless/src/topology/relayless-environment.d.ts +152 -0
  343. package/adapters/environment/relayless/src/topology/relayless-environment.js +443 -0
  344. package/adapters/environment/relayless/src/topology/relayless-plan.d.ts +43 -0
  345. package/adapters/environment/relayless/src/topology/relayless-plan.js +85 -0
  346. package/adapters/environment/relayless/src/topology/relayless-provider.d.ts +60 -0
  347. package/adapters/environment/relayless/src/topology/relayless-provider.js +231 -0
  348. package/adapters/environment/relayless/src/topology/relayless-snapshots.d.ts +24 -0
  349. package/adapters/environment/relayless/src/topology/relayless-snapshots.js +112 -0
  350. package/adapters/environment/relayless/src/topology/relayless-time.d.ts +66 -0
  351. package/adapters/environment/relayless/src/topology/relayless-time.js +124 -0
  352. package/adapters/environment/relayless/src/topology/relayless-topology.d.ts +122 -0
  353. package/adapters/environment/relayless/src/topology/relayless-topology.js +178 -0
  354. package/adapters/environment/relayless/src/topology/spec-cache.d.ts +24 -0
  355. package/adapters/environment/relayless/src/topology/spec-cache.js +53 -0
  356. package/adapters/environment/relayless/src/topology/statement-store.d.ts +20 -0
  357. package/adapters/environment/relayless/src/topology/statement-store.js +60 -0
  358. package/adapters/environment/relayless/src/topology/topology-options-schema.d.ts +79 -0
  359. package/adapters/environment/relayless/src/topology/topology-options-schema.js +57 -0
  360. package/adapters/environment/relayless/src/topology/workspace-record.d.ts +30 -0
  361. package/adapters/environment/relayless/src/topology/workspace-record.js +49 -0
  362. package/adapters/features/cucumber/README.md +85 -0
  363. package/adapters/features/cucumber/src/cucumber-child.d.ts +1 -0
  364. package/adapters/features/cucumber/src/cucumber-child.js +53 -0
  365. package/adapters/features/cucumber/src/cucumber-feature-runner.d.ts +49 -0
  366. package/adapters/features/cucumber/src/cucumber-feature-runner.js +114 -0
  367. package/adapters/features/cucumber/src/cucumber-installation.d.ts +14 -0
  368. package/adapters/features/cucumber/src/cucumber-installation.js +44 -0
  369. package/adapters/features/cucumber/src/cucumber-report.d.ts +11 -0
  370. package/adapters/features/cucumber/src/cucumber-report.js +121 -0
  371. package/adapters/features/cucumber/src/cucumber-run.d.ts +38 -0
  372. package/adapters/features/cucumber/src/cucumber-run.js +126 -0
  373. package/adapters/features/cucumber/src/glob-feature-source.d.ts +9 -0
  374. package/adapters/features/cucumber/src/glob-feature-source.js +31 -0
  375. package/adapters/features/cucumber/src/in-process-cucumber-run.d.ts +20 -0
  376. package/adapters/features/cucumber/src/in-process-cucumber-run.js +119 -0
  377. package/adapters/features/cucumber/src/index.d.ts +9 -0
  378. package/adapters/features/cucumber/src/index.js +11 -0
  379. package/adapters/features/cucumber/src/plain-format.d.ts +11 -0
  380. package/adapters/features/cucumber/src/plain-format.js +20 -0
  381. package/adapters/features/cucumber/src/plain-run.d.ts +153 -0
  382. package/adapters/features/cucumber/src/plain-run.js +207 -0
  383. package/adapters/features/cucumber/src/run-log.d.ts +16 -0
  384. package/adapters/features/cucumber/src/run-log.js +50 -0
  385. package/adapters/features/cucumber/src/steps/feature-session-settings.d.ts +7 -0
  386. package/adapters/features/cucumber/src/steps/feature-session-settings.js +15 -0
  387. package/adapters/features/cucumber/src/steps/register-feature-steps.d.ts +144 -0
  388. package/adapters/features/cucumber/src/steps/register-feature-steps.js +276 -0
  389. package/adapters/features/cucumber/src/support/bundled-support.d.ts +1 -0
  390. package/adapters/features/cucumber/src/support/bundled-support.js +69 -0
  391. package/adapters/host/dotli/README.md +135 -0
  392. package/adapters/host/dotli/src/dotli-build.d.ts +85 -0
  393. package/adapters/host/dotli/src/dotli-build.js +169 -0
  394. package/adapters/host/dotli/src/dotli-host-factory.d.ts +66 -0
  395. package/adapters/host/dotli/src/dotli-host-factory.js +82 -0
  396. package/adapters/host/dotli/src/dotli-host.d.ts +182 -0
  397. package/adapters/host/dotli/src/dotli-host.js +327 -0
  398. package/adapters/host/dotli/src/dotli-server.d.ts +9 -0
  399. package/adapters/host/dotli/src/dotli-server.js +135 -0
  400. package/adapters/host/dotli/src/framing.d.ts +10 -0
  401. package/adapters/host/dotli/src/framing.js +20 -0
  402. package/adapters/host/dotli/src/index.d.ts +40 -0
  403. package/adapters/host/dotli/src/index.js +21 -0
  404. package/adapters/host/dotli/src/interception.d.ts +59 -0
  405. package/adapters/host/dotli/src/interception.js +115 -0
  406. package/adapters/host/dotli/src/page-console.d.ts +40 -0
  407. package/adapters/host/dotli/src/page-console.js +44 -0
  408. package/adapters/host/dotli/src/routing.d.ts +119 -0
  409. package/adapters/host/dotli/src/routing.js +157 -0
  410. package/adapters/host/truapi-cli/README.md +807 -0
  411. package/adapters/host/truapi-cli/host.lock.json +33 -0
  412. package/adapters/host/truapi-cli/src/acquire.d.ts +81 -0
  413. package/adapters/host/truapi-cli/src/acquire.js +213 -0
  414. package/adapters/host/truapi-cli/src/attest-provision.d.ts +49 -0
  415. package/adapters/host/truapi-cli/src/attest-provision.js +181 -0
  416. package/adapters/host/truapi-cli/src/build.d.ts +45 -0
  417. package/adapters/host/truapi-cli/src/build.js +234 -0
  418. package/adapters/host/truapi-cli/src/capability-probes.d.ts +66 -0
  419. package/adapters/host/truapi-cli/src/capability-probes.js +272 -0
  420. package/adapters/host/truapi-cli/src/checkout.d.ts +25 -0
  421. package/adapters/host/truapi-cli/src/checkout.js +33 -0
  422. package/adapters/host/truapi-cli/src/cli-identity.d.ts +12 -0
  423. package/adapters/host/truapi-cli/src/cli-identity.js +31 -0
  424. package/adapters/host/truapi-cli/src/cli-session.d.ts +12 -0
  425. package/adapters/host/truapi-cli/src/cli-session.js +245 -0
  426. package/adapters/host/truapi-cli/src/conditioned-routing.d.ts +17 -0
  427. package/adapters/host/truapi-cli/src/conditioned-routing.js +48 -0
  428. package/adapters/host/truapi-cli/src/host-cache.d.ts +25 -0
  429. package/adapters/host/truapi-cli/src/host-cache.js +131 -0
  430. package/adapters/host/truapi-cli/src/host-link.d.ts +16 -0
  431. package/adapters/host/truapi-cli/src/host-link.js +87 -0
  432. package/adapters/host/truapi-cli/src/host-lock.d.ts +59 -0
  433. package/adapters/host/truapi-cli/src/host-lock.js +81 -0
  434. package/adapters/host/truapi-cli/src/host-options.d.ts +65 -0
  435. package/adapters/host/truapi-cli/src/host-options.js +61 -0
  436. package/adapters/host/truapi-cli/src/host-process.d.ts +79 -0
  437. package/adapters/host/truapi-cli/src/host-process.js +160 -0
  438. package/adapters/host/truapi-cli/src/host-records.d.ts +73 -0
  439. package/adapters/host/truapi-cli/src/host-records.js +16 -0
  440. package/adapters/host/truapi-cli/src/host-requests.d.ts +24 -0
  441. package/adapters/host/truapi-cli/src/host-requests.js +75 -0
  442. package/adapters/host/truapi-cli/src/host-temp-dir.d.ts +26 -0
  443. package/adapters/host/truapi-cli/src/host-temp-dir.js +31 -0
  444. package/adapters/host/truapi-cli/src/host-types.d.ts +115 -0
  445. package/adapters/host/truapi-cli/src/host-types.js +3 -0
  446. package/adapters/host/truapi-cli/src/host-verification.d.ts +20 -0
  447. package/adapters/host/truapi-cli/src/host-verification.js +101 -0
  448. package/adapters/host/truapi-cli/src/host.d.ts +14 -0
  449. package/adapters/host/truapi-cli/src/host.js +186 -0
  450. package/adapters/host/truapi-cli/src/identity-fingerprint.d.ts +3 -0
  451. package/adapters/host/truapi-cli/src/identity-fingerprint.js +6 -0
  452. package/adapters/host/truapi-cli/src/index.d.ts +26 -0
  453. package/adapters/host/truapi-cli/src/index.js +28 -0
  454. package/adapters/host/truapi-cli/src/launch.d.ts +113 -0
  455. package/adapters/host/truapi-cli/src/launch.js +244 -0
  456. package/adapters/host/truapi-cli/src/navigation.d.ts +23 -0
  457. package/adapters/host/truapi-cli/src/navigation.js +111 -0
  458. package/adapters/host/truapi-cli/src/network-config.d.ts +35 -0
  459. package/adapters/host/truapi-cli/src/network-config.js +41 -0
  460. package/adapters/host/truapi-cli/src/network-guard.d.ts +37 -0
  461. package/adapters/host/truapi-cli/src/network-guard.js +72 -0
  462. package/adapters/host/truapi-cli/src/official-behaviours.d.ts +33 -0
  463. package/adapters/host/truapi-cli/src/official-behaviours.js +57 -0
  464. package/adapters/host/truapi-cli/src/official-release.d.ts +18 -0
  465. package/adapters/host/truapi-cli/src/official-release.js +57 -0
  466. package/adapters/host/truapi-cli/src/patch-catalogue.d.ts +8 -0
  467. package/adapters/host/truapi-cli/src/patch-catalogue.js +9 -0
  468. package/adapters/host/truapi-cli/src/patch-manifest.d.ts +78 -0
  469. package/adapters/host/truapi-cli/src/patch-manifest.js +103 -0
  470. package/adapters/host/truapi-cli/src/patches.d.ts +36 -0
  471. package/adapters/host/truapi-cli/src/patches.js +7 -0
  472. package/adapters/host/truapi-cli/src/probe-script.d.ts +21 -0
  473. package/adapters/host/truapi-cli/src/probe-script.js +85 -0
  474. package/adapters/host/truapi-cli/src/probe-stub.d.ts +41 -0
  475. package/adapters/host/truapi-cli/src/probe-stub.js +187 -0
  476. package/adapters/host/truapi-cli/src/product-config.d.ts +17 -0
  477. package/adapters/host/truapi-cli/src/product-config.js +35 -0
  478. package/adapters/host/truapi-cli/src/provision.d.ts +88 -0
  479. package/adapters/host/truapi-cli/src/provision.js +172 -0
  480. package/adapters/host/truapi-cli/src/rebase-check.d.ts +218 -0
  481. package/adapters/host/truapi-cli/src/rebase-check.js +366 -0
  482. package/adapters/host/truapi-cli/src/resolved-host.d.ts +23 -0
  483. package/adapters/host/truapi-cli/src/resolved-host.js +31 -0
  484. package/adapters/host/truapi-cli/src/route-release.d.ts +65 -0
  485. package/adapters/host/truapi-cli/src/route-release.js +133 -0
  486. package/adapters/host/truapi-cli/src/sandbox-spec.d.ts +4 -0
  487. package/adapters/host/truapi-cli/src/sandbox-spec.js +14 -0
  488. package/adapters/host/truapi-cli/src/script-account-read.d.ts +48 -0
  489. package/adapters/host/truapi-cli/src/script-account-read.js +98 -0
  490. package/adapters/host/truapi-cli/src/serve-persisted.d.ts +47 -0
  491. package/adapters/host/truapi-cli/src/serve-persisted.js +115 -0
  492. package/adapters/host/truapi-cli/src/signing-evidence.d.ts +4 -0
  493. package/adapters/host/truapi-cli/src/signing-evidence.js +71 -0
  494. package/adapters/host/truapi-cli/src/signing-host-flags.d.ts +9 -0
  495. package/adapters/host/truapi-cli/src/signing-host-flags.js +24 -0
  496. package/adapters/host/truapi-cli/src/truapi-cli-host-factory.d.ts +210 -0
  497. package/adapters/host/truapi-cli/src/truapi-cli-host-factory.js +345 -0
  498. package/adapters/host/truapi-wasm/README.md +228 -0
  499. package/adapters/host/truapi-wasm/src/bulletin-read-probe.d.ts +42 -0
  500. package/adapters/host/truapi-wasm/src/bulletin-read-probe.js +69 -0
  501. package/adapters/host/truapi-wasm/src/config.d.ts +79 -0
  502. package/adapters/host/truapi-wasm/src/config.js +80 -0
  503. package/adapters/host/truapi-wasm/src/endpoint-chains.d.ts +5 -0
  504. package/adapters/host/truapi-wasm/src/endpoint-chains.js +30 -0
  505. package/adapters/host/truapi-wasm/src/entropy-patch.d.ts +27 -0
  506. package/adapters/host/truapi-wasm/src/entropy-patch.js +23 -0
  507. package/adapters/host/truapi-wasm/src/framing.d.ts +10 -0
  508. package/adapters/host/truapi-wasm/src/framing.js +20 -0
  509. package/adapters/host/truapi-wasm/src/host-package.d.ts +38 -0
  510. package/adapters/host/truapi-wasm/src/host-package.js +119 -0
  511. package/adapters/host/truapi-wasm/src/host-page-layout.d.ts +12 -0
  512. package/adapters/host/truapi-wasm/src/host-page-layout.js +16 -0
  513. package/adapters/host/truapi-wasm/src/identity.d.ts +3 -0
  514. package/adapters/host/truapi-wasm/src/identity.js +8 -0
  515. package/adapters/host/truapi-wasm/src/index.d.ts +25 -0
  516. package/adapters/host/truapi-wasm/src/index.js +15 -0
  517. package/adapters/host/truapi-wasm/src/own-script.d.ts +4 -0
  518. package/adapters/host/truapi-wasm/src/own-script.js +4 -0
  519. package/adapters/host/truapi-wasm/src/provider.d.ts +190 -0
  520. package/adapters/host/truapi-wasm/src/provider.js +496 -0
  521. package/adapters/host/truapi-wasm/src/ring-vrf-member.d.ts +4 -0
  522. package/adapters/host/truapi-wasm/src/ring-vrf-member.js +47 -0
  523. package/adapters/host/truapi-wasm/src/route-release.d.ts +29 -0
  524. package/adapters/host/truapi-wasm/src/route-release.js +47 -0
  525. package/adapters/host/truapi-wasm/src/shared-host.d.ts +94 -0
  526. package/adapters/host/truapi-wasm/src/shared-host.js +63 -0
  527. package/adapters/host/truapi-wasm/src/shared-page.d.ts +1 -0
  528. package/adapters/host/truapi-wasm/src/shared-page.js +336 -0
  529. package/adapters/host/truapi-wasm/src/sign-in.d.ts +44 -0
  530. package/adapters/host/truapi-wasm/src/sign-in.js +38 -0
  531. package/adapters/host/truapi-wasm/src/truapi-pairing.d.ts +7 -0
  532. package/adapters/host/truapi-wasm/src/truapi-pairing.js +23 -0
  533. package/adapters/host/truapi-wasm/src/truapi-wasm-host-factory.d.ts +111 -0
  534. package/adapters/host/truapi-wasm/src/truapi-wasm-host-factory.js +99 -0
  535. package/adapters/keys/sr25519/README.md +53 -0
  536. package/adapters/keys/sr25519/src/index.d.ts +3 -0
  537. package/adapters/keys/sr25519/src/index.js +5 -0
  538. package/adapters/keys/sr25519/src/sr25519-key-derivation.d.ts +34 -0
  539. package/adapters/keys/sr25519/src/sr25519-key-derivation.js +66 -0
  540. package/adapters/keys/sr25519/src/sr25519-product-accounts.d.ts +8 -0
  541. package/adapters/keys/sr25519/src/sr25519-product-accounts.js +95 -0
  542. package/adapters/lab/module/src/config-path.d.ts +2 -0
  543. package/adapters/lab/module/src/config-path.js +10 -0
  544. package/adapters/lab/module/src/definition-lab-source.d.ts +11 -0
  545. package/adapters/lab/module/src/definition-lab-source.js +16 -0
  546. package/adapters/lab/module/src/index.d.ts +6 -0
  547. package/adapters/lab/module/src/index.js +8 -0
  548. package/adapters/lab/module/src/module-host-tools.d.ts +11 -0
  549. package/adapters/lab/module/src/module-host-tools.js +37 -0
  550. package/adapters/lab/module/src/module-lab-source.d.ts +16 -0
  551. package/adapters/lab/module/src/module-lab-source.js +50 -0
  552. package/adapters/lab/module/src/reload-hook.mjs +24 -0
  553. package/adapters/lab/module/src/source-fingerprint.d.ts +8 -0
  554. package/adapters/lab/module/src/source-fingerprint.js +48 -0
  555. package/adapters/lab/module/src/transpiled-client-bundles.d.ts +8 -0
  556. package/adapters/lab/module/src/transpiled-client-bundles.js +57 -0
  557. package/adapters/notify/file/README.md +5 -0
  558. package/adapters/notify/file/src/file-notifier.d.ts +11 -0
  559. package/adapters/notify/file/src/file-notifier.js +45 -0
  560. package/adapters/notify/file/src/index.d.ts +2 -0
  561. package/adapters/notify/file/src/index.js +4 -0
  562. package/adapters/notify/file/src/noop-notifier.d.ts +6 -0
  563. package/adapters/notify/file/src/noop-notifier.js +8 -0
  564. package/adapters/storage/filesystem/README.md +41 -0
  565. package/adapters/storage/filesystem/src/directory-fixture-source.d.ts +19 -0
  566. package/adapters/storage/filesystem/src/directory-fixture-source.js +83 -0
  567. package/adapters/storage/filesystem/src/file-breakpoint-store.d.ts +4 -0
  568. package/adapters/storage/filesystem/src/file-breakpoint-store.js +5 -0
  569. package/adapters/storage/filesystem/src/file-environment-option-choices.d.ts +11 -0
  570. package/adapters/storage/filesystem/src/file-environment-option-choices.js +44 -0
  571. package/adapters/storage/filesystem/src/file-evidence-journal.d.ts +10 -0
  572. package/adapters/storage/filesystem/src/file-evidence-journal.js +19 -0
  573. package/adapters/storage/filesystem/src/file-fixture-archives.d.ts +17 -0
  574. package/adapters/storage/filesystem/src/file-fixture-archives.js +250 -0
  575. package/adapters/storage/filesystem/src/file-fixture-store.d.ts +29 -0
  576. package/adapters/storage/filesystem/src/file-fixture-store.js +209 -0
  577. package/adapters/storage/filesystem/src/file-journey-docs.d.ts +9 -0
  578. package/adapters/storage/filesystem/src/file-journey-docs.js +113 -0
  579. package/adapters/storage/filesystem/src/file-json-document.d.ts +7 -0
  580. package/adapters/storage/filesystem/src/file-json-document.js +30 -0
  581. package/adapters/storage/filesystem/src/file-lab-settings-store.d.ts +4 -0
  582. package/adapters/storage/filesystem/src/file-lab-settings-store.js +5 -0
  583. package/adapters/storage/filesystem/src/file-lock-store.d.ts +23 -0
  584. package/adapters/storage/filesystem/src/file-lock-store.js +55 -0
  585. package/adapters/storage/filesystem/src/file-recording-store.d.ts +22 -0
  586. package/adapters/storage/filesystem/src/file-recording-store.js +161 -0
  587. package/adapters/storage/filesystem/src/file-rpc-choices.d.ts +11 -0
  588. package/adapters/storage/filesystem/src/file-rpc-choices.js +46 -0
  589. package/adapters/storage/filesystem/src/file-run-bundle-archives.d.ts +8 -0
  590. package/adapters/storage/filesystem/src/file-run-bundle-archives.js +200 -0
  591. package/adapters/storage/filesystem/src/file-run-manifest-store.d.ts +17 -0
  592. package/adapters/storage/filesystem/src/file-run-manifest-store.js +26 -0
  593. package/adapters/storage/filesystem/src/file-suite-evidence-bundles.d.ts +16 -0
  594. package/adapters/storage/filesystem/src/file-suite-evidence-bundles.js +168 -0
  595. package/adapters/storage/filesystem/src/file-visual-baselines.d.ts +10 -0
  596. package/adapters/storage/filesystem/src/file-visual-baselines.js +42 -0
  597. package/adapters/storage/filesystem/src/index.d.ts +18 -0
  598. package/adapters/storage/filesystem/src/index.js +20 -0
  599. package/adapters/storage/filesystem/src/lock-running-lab-record.d.ts +13 -0
  600. package/adapters/storage/filesystem/src/lock-running-lab-record.js +63 -0
  601. package/adapters/storage/filesystem/src/node-file-system.d.ts +21 -0
  602. package/adapters/storage/filesystem/src/node-file-system.js +122 -0
  603. package/adapters/storage/filesystem/src/running-lab.d.ts +2 -0
  604. package/adapters/storage/filesystem/src/running-lab.js +4 -0
  605. package/adapters/storage/filesystem/src/tar-archive.d.ts +73 -0
  606. package/adapters/storage/filesystem/src/tar-archive.js +401 -0
  607. package/adapters/storage/filesystem/src/workspace-store.d.ts +33 -0
  608. package/adapters/storage/filesystem/src/workspace-store.js +51 -0
  609. package/adapters/system/node/README.md +141 -0
  610. package/adapters/system/node/src/app-proxy/bridge-script.d.ts +21 -0
  611. package/adapters/system/node/src/app-proxy/bridge-script.js +186 -0
  612. package/adapters/system/node/src/app-proxy/next-turbopack-updates.d.ts +2 -0
  613. package/adapters/system/node/src/app-proxy/next-turbopack-updates.js +13 -0
  614. package/adapters/system/node/src/app-proxy/next-webpack-updates.d.ts +2 -0
  615. package/adapters/system/node/src/app-proxy/next-webpack-updates.js +19 -0
  616. package/adapters/system/node/src/app-proxy/node-app-proxy.d.ts +15 -0
  617. package/adapters/system/node/src/app-proxy/node-app-proxy.js +395 -0
  618. package/adapters/system/node/src/app-proxy/vite-updates.d.ts +2 -0
  619. package/adapters/system/node/src/app-proxy/vite-updates.js +8 -0
  620. package/adapters/system/node/src/app-proxy/web-socket-tunnel.d.ts +28 -0
  621. package/adapters/system/node/src/app-proxy/web-socket-tunnel.js +479 -0
  622. package/adapters/system/node/src/app-proxy/webpack-dev-server-updates.d.ts +2 -0
  623. package/adapters/system/node/src/app-proxy/webpack-dev-server-updates.js +13 -0
  624. package/adapters/system/node/src/console-logger.d.ts +25 -0
  625. package/adapters/system/node/src/console-logger.js +31 -0
  626. package/adapters/system/node/src/file-lock-manager.d.ts +26 -0
  627. package/adapters/system/node/src/file-lock-manager.js +103 -0
  628. package/adapters/system/node/src/git-change-source.d.ts +37 -0
  629. package/adapters/system/node/src/git-change-source.js +127 -0
  630. package/adapters/system/node/src/http-json-rpc-client.d.ts +20 -0
  631. package/adapters/system/node/src/http-json-rpc-client.js +25 -0
  632. package/adapters/system/node/src/index.d.ts +35 -0
  633. package/adapters/system/node/src/index.js +37 -0
  634. package/adapters/system/node/src/json-rpc-reply.d.ts +6 -0
  635. package/adapters/system/node/src/json-rpc-reply.js +18 -0
  636. package/adapters/system/node/src/linux-namespace-sandbox.d.ts +53 -0
  637. package/adapters/system/node/src/linux-namespace-sandbox.js +143 -0
  638. package/adapters/system/node/src/linux-network-namespace.mjs +177 -0
  639. package/adapters/system/node/src/lsof-connection-monitor.d.ts +50 -0
  640. package/adapters/system/node/src/lsof-connection-monitor.js +208 -0
  641. package/adapters/system/node/src/node-chain-gates.d.ts +10 -0
  642. package/adapters/system/node/src/node-chain-gates.js +173 -0
  643. package/adapters/system/node/src/node-command-runner.d.ts +17 -0
  644. package/adapters/system/node/src/node-command-runner.js +143 -0
  645. package/adapters/system/node/src/node-conditioned-links.d.ts +4 -0
  646. package/adapters/system/node/src/node-conditioned-links.js +140 -0
  647. package/adapters/system/node/src/node-document-headers.d.ts +28 -0
  648. package/adapters/system/node/src/node-document-headers.js +38 -0
  649. package/adapters/system/node/src/node-http-probe.d.ts +21 -0
  650. package/adapters/system/node/src/node-http-probe.js +39 -0
  651. package/adapters/system/node/src/node-machine-metrics.d.ts +61 -0
  652. package/adapters/system/node/src/node-machine-metrics.js +109 -0
  653. package/adapters/system/node/src/node-os-ports.d.ts +24 -0
  654. package/adapters/system/node/src/node-os-ports.js +82 -0
  655. package/adapters/system/node/src/node-owned-processes.d.ts +96 -0
  656. package/adapters/system/node/src/node-owned-processes.js +440 -0
  657. package/adapters/system/node/src/node-process-runner.d.ts +51 -0
  658. package/adapters/system/node/src/node-process-runner.js +110 -0
  659. package/adapters/system/node/src/node-process-sandbox.d.ts +51 -0
  660. package/adapters/system/node/src/node-process-sandbox.js +79 -0
  661. package/adapters/system/node/src/node-source-watcher.d.ts +7 -0
  662. package/adapters/system/node/src/node-source-watcher.js +91 -0
  663. package/adapters/system/node/src/node-stdio-worker.d.ts +11 -0
  664. package/adapters/system/node/src/node-stdio-worker.js +133 -0
  665. package/adapters/system/node/src/node-sync-command-runner.d.ts +8 -0
  666. package/adapters/system/node/src/node-sync-command-runner.js +96 -0
  667. package/adapters/system/node/src/node-terminal-command-runner.d.ts +14 -0
  668. package/adapters/system/node/src/node-terminal-command-runner.js +23 -0
  669. package/adapters/system/node/src/node-tree-cloner.d.ts +16 -0
  670. package/adapters/system/node/src/node-tree-cloner.js +46 -0
  671. package/adapters/system/node/src/owned-group-anchor.mjs +72 -0
  672. package/adapters/system/node/src/port-blocks.d.ts +32 -0
  673. package/adapters/system/node/src/port-blocks.js +132 -0
  674. package/adapters/system/node/src/process-environment-variables.d.ts +8 -0
  675. package/adapters/system/node/src/process-environment-variables.js +14 -0
  676. package/adapters/system/node/src/process-group.d.ts +35 -0
  677. package/adapters/system/node/src/process-group.js +81 -0
  678. package/adapters/system/node/src/process-table.d.ts +25 -0
  679. package/adapters/system/node/src/process-table.js +8 -0
  680. package/adapters/system/node/src/process.d.ts +7 -0
  681. package/adapters/system/node/src/process.js +9 -0
  682. package/adapters/system/node/src/ps-process-table.d.ts +34 -0
  683. package/adapters/system/node/src/ps-process-table.js +87 -0
  684. package/adapters/system/node/src/random-id-generator.d.ts +5 -0
  685. package/adapters/system/node/src/random-id-generator.js +8 -0
  686. package/adapters/system/node/src/recorded-members.d.ts +10 -0
  687. package/adapters/system/node/src/recorded-members.js +24 -0
  688. package/adapters/system/node/src/request-head.d.ts +9 -0
  689. package/adapters/system/node/src/request-head.js +37 -0
  690. package/adapters/system/node/src/system-clock.d.ts +7 -0
  691. package/adapters/system/node/src/system-clock.js +25 -0
  692. package/adapters/system/node/src/tcp-port-allocator.d.ts +56 -0
  693. package/adapters/system/node/src/tcp-port-allocator.js +117 -0
  694. package/adapters/system/node/src/web-socket-json-rpc-client.d.ts +23 -0
  695. package/adapters/system/node/src/web-socket-json-rpc-client.js +54 -0
  696. package/adapters/versions/chain/README.md +40 -0
  697. package/adapters/versions/chain/src/deployed-runtime-source.d.ts +43 -0
  698. package/adapters/versions/chain/src/deployed-runtime-source.js +97 -0
  699. package/adapters/versions/chain/src/index.d.ts +1 -0
  700. package/adapters/versions/chain/src/index.js +3 -0
  701. package/adapters/versions/github/README.md +108 -0
  702. package/adapters/versions/github/src/fetch-http-client.d.ts +15 -0
  703. package/adapters/versions/github/src/fetch-http-client.js +23 -0
  704. package/adapters/versions/github/src/github-release-artifacts.d.ts +36 -0
  705. package/adapters/versions/github/src/github-release-artifacts.js +166 -0
  706. package/adapters/versions/github/src/github-release-fixture-source.d.ts +51 -0
  707. package/adapters/versions/github/src/github-release-fixture-source.js +193 -0
  708. package/adapters/versions/github/src/github-version-source.d.ts +78 -0
  709. package/adapters/versions/github/src/github-version-source.js +281 -0
  710. package/adapters/versions/github/src/index.d.ts +4 -0
  711. package/adapters/versions/github/src/index.js +6 -0
  712. package/adapters/versions/npm/README.md +32 -0
  713. package/adapters/versions/npm/src/index.d.ts +1 -0
  714. package/adapters/versions/npm/src/index.js +3 -0
  715. package/adapters/versions/npm/src/npm-version-source.d.ts +53 -0
  716. package/adapters/versions/npm/src/npm-version-source.js +151 -0
  717. package/adapters/video/ffmpeg/README.md +39 -0
  718. package/adapters/video/ffmpeg/src/ffmpeg-video-editor.d.ts +40 -0
  719. package/adapters/video/ffmpeg/src/ffmpeg-video-editor.js +105 -0
  720. package/adapters/video/ffmpeg/src/index.d.ts +1 -0
  721. package/adapters/video/ffmpeg/src/index.js +3 -0
  722. package/adapters/visual/pixelmatch/README.md +29 -0
  723. package/adapters/visual/pixelmatch/src/index.d.ts +1 -0
  724. package/adapters/visual/pixelmatch/src/index.js +3 -0
  725. package/adapters/visual/pixelmatch/src/pixelmatch-comparison.d.ts +10 -0
  726. package/adapters/visual/pixelmatch/src/pixelmatch-comparison.js +19 -0
  727. package/composition/README.md +281 -0
  728. package/composition/src/actor-conditions.d.ts +14 -0
  729. package/composition/src/actor-conditions.js +36 -0
  730. package/composition/src/actor-funds.d.ts +18 -0
  731. package/composition/src/actor-funds.js +17 -0
  732. package/composition/src/adapter-catalogue.d.ts +39 -0
  733. package/composition/src/adapter-catalogue.js +59 -0
  734. package/composition/src/app-readiness.d.ts +32 -0
  735. package/composition/src/app-readiness.js +141 -0
  736. package/composition/src/app-server.d.ts +52 -0
  737. package/composition/src/app-server.js +124 -0
  738. package/composition/src/app-updates.d.ts +1 -0
  739. package/composition/src/app-updates.js +3 -0
  740. package/composition/src/artifacts.d.ts +3 -0
  741. package/composition/src/artifacts.js +6 -0
  742. package/composition/src/attached/attached-lab-runtime.d.ts +13 -0
  743. package/composition/src/attached/attached-lab-runtime.js +112 -0
  744. package/composition/src/attached/attached-runs.d.ts +47 -0
  745. package/composition/src/attached/attached-runs.js +119 -0
  746. package/composition/src/attached/following-lab-runtime.d.ts +10 -0
  747. package/composition/src/attached/following-lab-runtime.js +41 -0
  748. package/composition/src/attached/headless-lab.d.ts +20 -0
  749. package/composition/src/attached/headless-lab.js +65 -0
  750. package/composition/src/attached/lab-window-launcher.d.ts +33 -0
  751. package/composition/src/attached/lab-window-launcher.js +78 -0
  752. package/composition/src/attached/window-client.d.ts +21 -0
  753. package/composition/src/attached/window-client.js +72 -0
  754. package/composition/src/chain-connections.d.ts +39 -0
  755. package/composition/src/chain-connections.js +52 -0
  756. package/composition/src/checkout.d.ts +4 -0
  757. package/composition/src/checkout.js +11 -0
  758. package/composition/src/chopsticks-of-fast.d.ts +34 -0
  759. package/composition/src/chopsticks-of-fast.js +91 -0
  760. package/composition/src/create-lab-runtime.d.ts +70 -0
  761. package/composition/src/create-lab-runtime.js +248 -0
  762. package/composition/src/cucumber.d.ts +8 -0
  763. package/composition/src/cucumber.js +8 -0
  764. package/composition/src/default-dev-server.d.ts +20 -0
  765. package/composition/src/default-dev-server.js +52 -0
  766. package/composition/src/default-lab.d.ts +79 -0
  767. package/composition/src/default-lab.js +597 -0
  768. package/composition/src/default-session-browser.d.ts +7 -0
  769. package/composition/src/default-session-browser.js +17 -0
  770. package/composition/src/default-session-keep.d.ts +60 -0
  771. package/composition/src/default-session-keep.js +86 -0
  772. package/composition/src/default-session-page.d.ts +35 -0
  773. package/composition/src/default-session-page.js +40 -0
  774. package/composition/src/default-session-persons.d.ts +51 -0
  775. package/composition/src/default-session-persons.js +42 -0
  776. package/composition/src/default-session.d.ts +12 -0
  777. package/composition/src/default-session.js +594 -0
  778. package/composition/src/demo-ports.d.ts +8 -0
  779. package/composition/src/demo-ports.js +21 -0
  780. package/composition/src/deployed-app-server.d.ts +36 -0
  781. package/composition/src/deployed-app-server.js +62 -0
  782. package/composition/src/deployed-local-app.d.ts +30 -0
  783. package/composition/src/deployed-local-app.js +48 -0
  784. package/composition/src/device-browsers.d.ts +6 -0
  785. package/composition/src/device-browsers.js +16 -0
  786. package/composition/src/engine-setup.d.ts +1 -0
  787. package/composition/src/engine-setup.js +37 -0
  788. package/composition/src/feature-runtime.d.ts +5 -0
  789. package/composition/src/feature-runtime.js +12 -0
  790. package/composition/src/fixture-sharing.d.ts +12 -0
  791. package/composition/src/fixture-sharing.js +62 -0
  792. package/composition/src/fork-attach.d.ts +31 -0
  793. package/composition/src/fork-attach.js +80 -0
  794. package/composition/src/fork-live.d.ts +13 -0
  795. package/composition/src/fork-live.js +70 -0
  796. package/composition/src/gateway-program.d.ts +1 -0
  797. package/composition/src/gateway-program.js +24 -0
  798. package/composition/src/gateway-shutdown.d.ts +4 -0
  799. package/composition/src/gateway-shutdown.js +13 -0
  800. package/composition/src/host-tool-services.d.ts +21 -0
  801. package/composition/src/host-tool-services.js +27 -0
  802. package/composition/src/host-words.d.ts +3 -0
  803. package/composition/src/host-words.js +16 -0
  804. package/composition/src/identity-funding.d.ts +37 -0
  805. package/composition/src/identity-funding.js +92 -0
  806. package/composition/src/index.d.ts +38 -0
  807. package/composition/src/index.js +40 -0
  808. package/composition/src/machine-inputs.d.ts +67 -0
  809. package/composition/src/machine-inputs.js +98 -0
  810. package/composition/src/network-copies.d.ts +19 -0
  811. package/composition/src/network-copies.js +44 -0
  812. package/composition/src/node-system.d.ts +69 -0
  813. package/composition/src/node-system.js +89 -0
  814. package/composition/src/observe-browser-page.d.ts +15 -0
  815. package/composition/src/observe-browser-page.js +39 -0
  816. package/composition/src/old-environment-state.d.ts +13 -0
  817. package/composition/src/old-environment-state.js +138 -0
  818. package/composition/src/people-dev/genesis.d.ts +20 -0
  819. package/composition/src/people-dev/genesis.js +6 -0
  820. package/composition/src/people-dev/member-key.d.ts +58 -0
  821. package/composition/src/people-dev/member-key.js +110 -0
  822. package/composition/src/people-dev/onboarding.d.ts +142 -0
  823. package/composition/src/people-dev/onboarding.js +220 -0
  824. package/composition/src/people-dev/people-chunks.json +14 -0
  825. package/composition/src/people-dev/readings.d.ts +15 -0
  826. package/composition/src/people-dev/readings.js +35 -0
  827. package/composition/src/people-dev/xcm-stand-in.d.ts +163 -0
  828. package/composition/src/people-dev/xcm-stand-in.js +183 -0
  829. package/composition/src/people-keep/discard.d.ts +29 -0
  830. package/composition/src/people-keep/discard.js +59 -0
  831. package/composition/src/people-keep/kept-people.d.ts +53 -0
  832. package/composition/src/people-keep/kept-people.js +56 -0
  833. package/composition/src/people-keep/lifecycle.d.ts +48 -0
  834. package/composition/src/people-keep/lifecycle.js +69 -0
  835. package/composition/src/people-keep/saved-people.d.ts +35 -0
  836. package/composition/src/people-keep/saved-people.js +56 -0
  837. package/composition/src/platform/index.d.ts +1 -0
  838. package/composition/src/platform/index.js +3 -0
  839. package/composition/src/platform/platform-integration.d.ts +41 -0
  840. package/composition/src/platform/platform-integration.js +251 -0
  841. package/composition/src/platform/reported-ports.d.ts +4 -0
  842. package/composition/src/platform/reported-ports.js +31 -0
  843. package/composition/src/pre-onboarded-identities.d.ts +12 -0
  844. package/composition/src/pre-onboarded-identities.js +42 -0
  845. package/composition/src/process.d.ts +22 -0
  846. package/composition/src/process.js +27 -0
  847. package/composition/src/product-versions.d.ts +40 -0
  848. package/composition/src/product-versions.js +51 -0
  849. package/composition/src/public-identities.d.ts +44 -0
  850. package/composition/src/public-identities.js +88 -0
  851. package/composition/src/recording-browsers.d.ts +3 -0
  852. package/composition/src/recording-browsers.js +9 -0
  853. package/composition/src/recordings-directory.d.ts +1 -0
  854. package/composition/src/recordings-directory.js +10 -0
  855. package/composition/src/redact-console.d.ts +5 -0
  856. package/composition/src/redact-console.js +10 -0
  857. package/composition/src/root-call-support.d.ts +3 -0
  858. package/composition/src/root-call-support.js +16 -0
  859. package/composition/src/running-lab-variable.d.ts +8 -0
  860. package/composition/src/running-lab-variable.js +14 -0
  861. package/composition/src/session-frames.d.ts +5 -0
  862. package/composition/src/session-frames.js +12 -0
  863. package/composition/src/session-hosts.d.ts +66 -0
  864. package/composition/src/session-hosts.js +217 -0
  865. package/composition/src/session-placement.d.ts +25 -0
  866. package/composition/src/session-placement.js +21 -0
  867. package/composition/src/versions/lab-version-ports.d.ts +27 -0
  868. package/composition/src/versions/lab-version-ports.js +57 -0
  869. package/composition/src/versions/version-source-catalogue.d.ts +90 -0
  870. package/composition/src/versions/version-source-catalogue.js +134 -0
  871. package/contracts/browser/README.md +65 -0
  872. package/contracts/browser/src/index.d.ts +2 -0
  873. package/contracts/browser/src/index.js +4 -0
  874. package/contracts/browser/src/kit.d.ts +83 -0
  875. package/contracts/browser/src/kit.js +493 -0
  876. package/contracts/browser/src/runner.d.ts +71 -0
  877. package/contracts/browser/src/runner.js +156 -0
  878. package/contracts/chain/README.md +81 -0
  879. package/contracts/chain/src/cases/access.d.ts +3 -0
  880. package/contracts/chain/src/cases/access.js +68 -0
  881. package/contracts/chain/src/cases/history.d.ts +3 -0
  882. package/contracts/chain/src/cases/history.js +82 -0
  883. package/contracts/chain/src/cases/keys.d.ts +3 -0
  884. package/contracts/chain/src/cases/keys.js +131 -0
  885. package/contracts/chain/src/cases/submit.d.ts +3 -0
  886. package/contracts/chain/src/cases/submit.js +223 -0
  887. package/contracts/chain/src/cases/validator.d.ts +3 -0
  888. package/contracts/chain/src/cases/validator.js +59 -0
  889. package/contracts/chain/src/context.d.ts +51 -0
  890. package/contracts/chain/src/context.js +125 -0
  891. package/contracts/chain/src/index.d.ts +2 -0
  892. package/contracts/chain/src/index.js +4 -0
  893. package/contracts/chain/src/kit.d.ts +36 -0
  894. package/contracts/chain/src/kit.js +33 -0
  895. package/contracts/chain/src/runner.d.ts +71 -0
  896. package/contracts/chain/src/runner.js +156 -0
  897. package/contracts/chain/src/subject.d.ts +75 -0
  898. package/contracts/chain/src/subject.js +25 -0
  899. package/contracts/environment/README.md +90 -0
  900. package/contracts/environment/src/cases/declared-options.d.ts +3 -0
  901. package/contracts/environment/src/cases/declared-options.js +103 -0
  902. package/contracts/environment/src/cases/lifecycle.d.ts +3 -0
  903. package/contracts/environment/src/cases/lifecycle.js +130 -0
  904. package/contracts/environment/src/cases/options.d.ts +3 -0
  905. package/contracts/environment/src/cases/options.js +123 -0
  906. package/contracts/environment/src/cases/probe.d.ts +3 -0
  907. package/contracts/environment/src/cases/probe.js +63 -0
  908. package/contracts/environment/src/cases/topology.d.ts +3 -0
  909. package/contracts/environment/src/cases/topology.js +101 -0
  910. package/contracts/environment/src/checks.d.ts +31 -0
  911. package/contracts/environment/src/checks.js +93 -0
  912. package/contracts/environment/src/context.d.ts +23 -0
  913. package/contracts/environment/src/context.js +51 -0
  914. package/contracts/environment/src/index.d.ts +2 -0
  915. package/contracts/environment/src/index.js +4 -0
  916. package/contracts/environment/src/kit.d.ts +32 -0
  917. package/contracts/environment/src/kit.js +34 -0
  918. package/contracts/environment/src/runner.d.ts +71 -0
  919. package/contracts/environment/src/runner.js +156 -0
  920. package/contracts/environment/src/subject.d.ts +83 -0
  921. package/contracts/environment/src/subject.js +14 -0
  922. package/contracts/host/README.md +71 -0
  923. package/contracts/host/src/cases/approvals.d.ts +3 -0
  924. package/contracts/host/src/cases/approvals.js +112 -0
  925. package/contracts/host/src/cases/conditions.d.ts +3 -0
  926. package/contracts/host/src/cases/conditions.js +43 -0
  927. package/contracts/host/src/cases/hostile.d.ts +3 -0
  928. package/contracts/host/src/cases/hostile.js +131 -0
  929. package/contracts/host/src/cases/identity-navigation.d.ts +3 -0
  930. package/contracts/host/src/cases/identity-navigation.js +85 -0
  931. package/contracts/host/src/cases/network.d.ts +3 -0
  932. package/contracts/host/src/cases/network.js +46 -0
  933. package/contracts/host/src/cases/sessions.d.ts +3 -0
  934. package/contracts/host/src/cases/sessions.js +113 -0
  935. package/contracts/host/src/context.d.ts +85 -0
  936. package/contracts/host/src/context.js +145 -0
  937. package/contracts/host/src/derivation.d.ts +19 -0
  938. package/contracts/host/src/derivation.js +76 -0
  939. package/contracts/host/src/index.d.ts +6 -0
  940. package/contracts/host/src/index.js +8 -0
  941. package/contracts/host/src/kit.d.ts +27 -0
  942. package/contracts/host/src/kit.js +128 -0
  943. package/contracts/host/src/module-host-verifier.d.ts +19 -0
  944. package/contracts/host/src/module-host-verifier.js +80 -0
  945. package/contracts/host/src/probe/channels.d.ts +18 -0
  946. package/contracts/host/src/probe/channels.js +11 -0
  947. package/contracts/host/src/probe/page.d.ts +89 -0
  948. package/contracts/host/src/probe/page.js +253 -0
  949. package/contracts/host/src/probe/server.d.ts +23 -0
  950. package/contracts/host/src/probe/server.js +102 -0
  951. package/contracts/host/src/probe/truapi-version.d.ts +5 -0
  952. package/contracts/host/src/probe/truapi-version.js +20 -0
  953. package/contracts/host/src/targets.d.ts +49 -0
  954. package/contracts/host/src/targets.js +39 -0
  955. package/core/application/README.md +517 -0
  956. package/core/application/src/actors/actor-bindings.d.ts +18 -0
  957. package/core/application/src/actors/actor-bindings.js +38 -0
  958. package/core/application/src/actors/actor-view.d.ts +35 -0
  959. package/core/application/src/actors/actor-view.js +40 -0
  960. package/core/application/src/actors/bind-actors.d.ts +82 -0
  961. package/core/application/src/actors/bind-actors.js +156 -0
  962. package/core/application/src/actors/binding-error.d.ts +4 -0
  963. package/core/application/src/actors/binding-error.js +5 -0
  964. package/core/application/src/actors/manage-actors.d.ts +64 -0
  965. package/core/application/src/actors/manage-actors.js +147 -0
  966. package/core/application/src/apps/app-gate.d.ts +43 -0
  967. package/core/application/src/apps/app-gate.js +106 -0
  968. package/core/application/src/apps/app-reloads.d.ts +74 -0
  969. package/core/application/src/apps/app-reloads.js +470 -0
  970. package/core/application/src/apps/app-update-hub.d.ts +33 -0
  971. package/core/application/src/apps/app-update-hub.js +116 -0
  972. package/core/application/src/apps/inspect-app-framing.d.ts +9 -0
  973. package/core/application/src/apps/inspect-app-framing.js +25 -0
  974. package/core/application/src/bisect/bisect-regression.d.ts +52 -0
  975. package/core/application/src/bisect/bisect-regression.js +168 -0
  976. package/core/application/src/bisect/probe-session.d.ts +52 -0
  977. package/core/application/src/bisect/probe-session.js +208 -0
  978. package/core/application/src/builder/build-scenarios.d.ts +55 -0
  979. package/core/application/src/builder/build-scenarios.js +261 -0
  980. package/core/application/src/environment/account-watch.d.ts +41 -0
  981. package/core/application/src/environment/account-watch.js +117 -0
  982. package/core/application/src/environment/active-environment.d.ts +165 -0
  983. package/core/application/src/environment/active-environment.js +361 -0
  984. package/core/application/src/environment/advance-environment-time.d.ts +37 -0
  985. package/core/application/src/environment/advance-environment-time.js +52 -0
  986. package/core/application/src/environment/chain-day-ended.d.ts +7 -0
  987. package/core/application/src/environment/chain-day-ended.js +8 -0
  988. package/core/application/src/environment/confirmations.d.ts +15 -0
  989. package/core/application/src/environment/confirmations.js +23 -0
  990. package/core/application/src/environment/endpoint-heads.d.ts +4 -0
  991. package/core/application/src/environment/endpoint-heads.js +26 -0
  992. package/core/application/src/environment/endpoint-services.d.ts +13 -0
  993. package/core/application/src/environment/endpoint-services.js +35 -0
  994. package/core/application/src/environment/environment-option-picker.d.ts +38 -0
  995. package/core/application/src/environment/environment-option-picker.js +62 -0
  996. package/core/application/src/environment/environment-option-views.d.ts +30 -0
  997. package/core/application/src/environment/environment-option-views.js +22 -0
  998. package/core/application/src/environment/environment-request-error.d.ts +1 -0
  999. package/core/application/src/environment/environment-request-error.js +3 -0
  1000. package/core/application/src/environment/environment-retention.d.ts +11 -0
  1001. package/core/application/src/environment/environment-retention.js +16 -0
  1002. package/core/application/src/environment/environment-rpc.d.ts +17 -0
  1003. package/core/application/src/environment/environment-rpc.js +39 -0
  1004. package/core/application/src/environment/keep-between-starts.d.ts +18 -0
  1005. package/core/application/src/environment/keep-between-starts.js +44 -0
  1006. package/core/application/src/environment/prepare-environment-tooling.d.ts +21 -0
  1007. package/core/application/src/environment/prepare-environment-tooling.js +65 -0
  1008. package/core/application/src/environment/public-writes.d.ts +5 -0
  1009. package/core/application/src/environment/public-writes.js +9 -0
  1010. package/core/application/src/environment/read-chain-console.d.ts +23 -0
  1011. package/core/application/src/environment/read-chain-console.js +117 -0
  1012. package/core/application/src/environment/reset-environment.d.ts +12 -0
  1013. package/core/application/src/environment/reset-environment.js +38 -0
  1014. package/core/application/src/environment/running-labs.d.ts +13 -0
  1015. package/core/application/src/environment/running-labs.js +22 -0
  1016. package/core/application/src/environment/show-environment.d.ts +19 -0
  1017. package/core/application/src/environment/show-environment.js +63 -0
  1018. package/core/application/src/environment/start-environment.d.ts +85 -0
  1019. package/core/application/src/environment/start-environment.js +223 -0
  1020. package/core/application/src/environment/stop-environment.d.ts +11 -0
  1021. package/core/application/src/environment/stop-environment.js +33 -0
  1022. package/core/application/src/environment/switch-environment.d.ts +62 -0
  1023. package/core/application/src/environment/switch-environment.js +175 -0
  1024. package/core/application/src/explore/exploration-runs.d.ts +21 -0
  1025. package/core/application/src/explore/exploration-runs.js +54 -0
  1026. package/core/application/src/explore/explore-lab.d.ts +30 -0
  1027. package/core/application/src/explore/explore-lab.js +185 -0
  1028. package/core/application/src/explore/what-if-lab.d.ts +27 -0
  1029. package/core/application/src/explore/what-if-lab.js +166 -0
  1030. package/core/application/src/features/breakpoint-error.d.ts +4 -0
  1031. package/core/application/src/features/breakpoint-error.js +5 -0
  1032. package/core/application/src/features/check-host-network.d.ts +29 -0
  1033. package/core/application/src/features/check-host-network.js +82 -0
  1034. package/core/application/src/features/check-host-requests.d.ts +5 -0
  1035. package/core/application/src/features/check-host-requests.js +22 -0
  1036. package/core/application/src/features/coverage-lab.d.ts +9 -0
  1037. package/core/application/src/features/coverage-lab.js +74 -0
  1038. package/core/application/src/features/expand-outline.d.ts +9 -0
  1039. package/core/application/src/features/expand-outline.js +16 -0
  1040. package/core/application/src/features/feature-calls.d.ts +49 -0
  1041. package/core/application/src/features/feature-calls.js +104 -0
  1042. package/core/application/src/features/feature-plan-error.d.ts +16 -0
  1043. package/core/application/src/features/feature-plan-error.js +19 -0
  1044. package/core/application/src/features/feature-run-error.d.ts +6 -0
  1045. package/core/application/src/features/feature-run-error.js +10 -0
  1046. package/core/application/src/features/feature-run.d.ts +75 -0
  1047. package/core/application/src/features/feature-run.js +231 -0
  1048. package/core/application/src/features/feature-scenario.d.ts +156 -0
  1049. package/core/application/src/features/feature-scenario.js +623 -0
  1050. package/core/application/src/features/feature-step-error.d.ts +17 -0
  1051. package/core/application/src/features/feature-step-error.js +17 -0
  1052. package/core/application/src/features/feature-step-gate.d.ts +54 -0
  1053. package/core/application/src/features/feature-step-gate.js +93 -0
  1054. package/core/application/src/features/feature-step-times.d.ts +16 -0
  1055. package/core/application/src/features/feature-step-times.js +30 -0
  1056. package/core/application/src/features/feature-steps.d.ts +3 -0
  1057. package/core/application/src/features/feature-steps.js +22 -0
  1058. package/core/application/src/features/inspect-pause.d.ts +27 -0
  1059. package/core/application/src/features/inspect-pause.js +176 -0
  1060. package/core/application/src/features/inspect-scenario.d.ts +14 -0
  1061. package/core/application/src/features/inspect-scenario.js +98 -0
  1062. package/core/application/src/features/lab-feature-session.d.ts +67 -0
  1063. package/core/application/src/features/lab-feature-session.js +264 -0
  1064. package/core/application/src/features/lint-lab.d.ts +15 -0
  1065. package/core/application/src/features/lint-lab.js +204 -0
  1066. package/core/application/src/features/list-features.d.ts +26 -0
  1067. package/core/application/src/features/list-features.js +92 -0
  1068. package/core/application/src/features/manage-breakpoints.d.ts +45 -0
  1069. package/core/application/src/features/manage-breakpoints.js +105 -0
  1070. package/core/application/src/features/no-funds.d.ts +3 -0
  1071. package/core/application/src/features/no-funds.js +13 -0
  1072. package/core/application/src/features/pause-inspection-error.d.ts +4 -0
  1073. package/core/application/src/features/pause-inspection-error.js +5 -0
  1074. package/core/application/src/features/plan-feature-scenario.d.ts +28 -0
  1075. package/core/application/src/features/plan-feature-scenario.js +66 -0
  1076. package/core/application/src/features/plan-mutants.d.ts +9 -0
  1077. package/core/application/src/features/plan-mutants.js +33 -0
  1078. package/core/application/src/features/prepared-characters.d.ts +13 -0
  1079. package/core/application/src/features/prepared-characters.js +52 -0
  1080. package/core/application/src/features/read-scenario-conditions.d.ts +29 -0
  1081. package/core/application/src/features/read-scenario-conditions.js +38 -0
  1082. package/core/application/src/features/reconcile-host-bypass.d.ts +7 -0
  1083. package/core/application/src/features/reconcile-host-bypass.js +20 -0
  1084. package/core/application/src/features/resolve-run-devices.d.ts +14 -0
  1085. package/core/application/src/features/resolve-run-devices.js +31 -0
  1086. package/core/application/src/features/run-feature-steps.d.ts +41 -0
  1087. package/core/application/src/features/run-feature-steps.js +37 -0
  1088. package/core/application/src/features/run-features.d.ts +112 -0
  1089. package/core/application/src/features/run-features.js +397 -0
  1090. package/core/application/src/features/run-scoped-values.d.ts +17 -0
  1091. package/core/application/src/features/run-scoped-values.js +37 -0
  1092. package/core/application/src/features/scenario-actor-creation.d.ts +60 -0
  1093. package/core/application/src/features/scenario-actor-creation.js +107 -0
  1094. package/core/application/src/features/scenario-conditions.d.ts +13 -0
  1095. package/core/application/src/features/scenario-conditions.js +64 -0
  1096. package/core/application/src/features/scenario-inspection.d.ts +5 -0
  1097. package/core/application/src/features/scenario-inspection.js +34 -0
  1098. package/core/application/src/features/scenario-race.d.ts +8 -0
  1099. package/core/application/src/features/scenario-race.js +8 -0
  1100. package/core/application/src/features/scenario-step-checks.d.ts +22 -0
  1101. package/core/application/src/features/scenario-step-checks.js +114 -0
  1102. package/core/application/src/features/step-checks.d.ts +49 -0
  1103. package/core/application/src/features/step-checks.js +42 -0
  1104. package/core/application/src/features/watch-features.d.ts +23 -0
  1105. package/core/application/src/features/watch-features.js +80 -0
  1106. package/core/application/src/fixtures/build-fixture.d.ts +22 -0
  1107. package/core/application/src/fixtures/build-fixture.js +69 -0
  1108. package/core/application/src/fixtures/check-fixtures.d.ts +15 -0
  1109. package/core/application/src/fixtures/check-fixtures.js +80 -0
  1110. package/core/application/src/fixtures/download-fixture.d.ts +19 -0
  1111. package/core/application/src/fixtures/download-fixture.js +92 -0
  1112. package/core/application/src/fixtures/export-fixture.d.ts +16 -0
  1113. package/core/application/src/fixtures/export-fixture.js +87 -0
  1114. package/core/application/src/fixtures/fixture-characters.d.ts +10 -0
  1115. package/core/application/src/fixtures/fixture-characters.js +24 -0
  1116. package/core/application/src/fixtures/fixture-checkout.d.ts +15 -0
  1117. package/core/application/src/fixtures/fixture-checkout.js +25 -0
  1118. package/core/application/src/fixtures/fixture-context.d.ts +79 -0
  1119. package/core/application/src/fixtures/fixture-context.js +139 -0
  1120. package/core/application/src/fixtures/fixture-maintenance-service.d.ts +23 -0
  1121. package/core/application/src/fixtures/fixture-maintenance-service.js +26 -0
  1122. package/core/application/src/fixtures/fixture-run-guard.d.ts +17 -0
  1123. package/core/application/src/fixtures/fixture-run-guard.js +42 -0
  1124. package/core/application/src/fixtures/fixture-sharing-ports.d.ts +17 -0
  1125. package/core/application/src/fixtures/fixture-sharing-ports.js +3 -0
  1126. package/core/application/src/fixtures/fixture-sharing-service.d.ts +22 -0
  1127. package/core/application/src/fixtures/fixture-sharing-service.js +28 -0
  1128. package/core/application/src/fixtures/import-fixture.d.ts +42 -0
  1129. package/core/application/src/fixtures/import-fixture.js +212 -0
  1130. package/core/application/src/fixtures/isolate-scenario.d.ts +23 -0
  1131. package/core/application/src/fixtures/isolate-scenario.js +104 -0
  1132. package/core/application/src/fixtures/keep-run-start.d.ts +36 -0
  1133. package/core/application/src/fixtures/keep-run-start.js +77 -0
  1134. package/core/application/src/fixtures/list-fixtures.d.ts +16 -0
  1135. package/core/application/src/fixtures/list-fixtures.js +91 -0
  1136. package/core/application/src/fixtures/prepare-scenario-fixture.d.ts +42 -0
  1137. package/core/application/src/fixtures/prepare-scenario-fixture.js +157 -0
  1138. package/core/application/src/fixtures/push-fixture.d.ts +15 -0
  1139. package/core/application/src/fixtures/push-fixture.js +43 -0
  1140. package/core/application/src/fixtures/refresh-fixture.d.ts +27 -0
  1141. package/core/application/src/fixtures/refresh-fixture.js +141 -0
  1142. package/core/application/src/fixtures/restore-fixture.d.ts +36 -0
  1143. package/core/application/src/fixtures/restore-fixture.js +129 -0
  1144. package/core/application/src/fixtures/save-fixture.d.ts +35 -0
  1145. package/core/application/src/fixtures/save-fixture.js +137 -0
  1146. package/core/application/src/fixtures/start-from-fixture.d.ts +23 -0
  1147. package/core/application/src/fixtures/start-from-fixture.js +43 -0
  1148. package/core/application/src/hosts/acquire-host.d.ts +23 -0
  1149. package/core/application/src/hosts/acquire-host.js +59 -0
  1150. package/core/application/src/hosts/host-request-error.d.ts +6 -0
  1151. package/core/application/src/hosts/host-request-error.js +10 -0
  1152. package/core/application/src/hosts/verify-host.d.ts +37 -0
  1153. package/core/application/src/hosts/verify-host.js +93 -0
  1154. package/core/application/src/index.d.ts +96 -0
  1155. package/core/application/src/index.js +96 -0
  1156. package/core/application/src/lab/before-close.d.ts +12 -0
  1157. package/core/application/src/lab/before-close.js +14 -0
  1158. package/core/application/src/lab/check-extensions.d.ts +5 -0
  1159. package/core/application/src/lab/check-extensions.js +12 -0
  1160. package/core/application/src/lab/check-lab.d.ts +35 -0
  1161. package/core/application/src/lab/check-lab.js +82 -0
  1162. package/core/application/src/lab/lab-state.d.ts +87 -0
  1163. package/core/application/src/lab/lab-state.js +38 -0
  1164. package/core/application/src/lab/load-lab.d.ts +15 -0
  1165. package/core/application/src/lab/load-lab.js +35 -0
  1166. package/core/application/src/lab/runtime-events.d.ts +7 -0
  1167. package/core/application/src/lab/runtime-events.js +17 -0
  1168. package/core/application/src/lab-runtime-ports.d.ts +297 -0
  1169. package/core/application/src/lab-runtime-ports.js +3 -0
  1170. package/core/application/src/lab-runtime-service.d.ts +281 -0
  1171. package/core/application/src/lab-runtime-service.js +520 -0
  1172. package/core/application/src/lab-runtime-use-cases.d.ts +3 -0
  1173. package/core/application/src/lab-runtime-use-cases.js +280 -0
  1174. package/core/application/src/load/run-load.d.ts +23 -0
  1175. package/core/application/src/load/run-load.js +88 -0
  1176. package/core/application/src/navigation/resolve-navigation-destination.d.ts +8 -0
  1177. package/core/application/src/navigation/resolve-navigation-destination.js +39 -0
  1178. package/core/application/src/orchestration/activity/monitor.d.ts +16 -0
  1179. package/core/application/src/orchestration/activity/monitor.js +49 -0
  1180. package/core/application/src/orchestration/activity/types.d.ts +1 -0
  1181. package/core/application/src/orchestration/activity/types.js +3 -0
  1182. package/core/application/src/orchestration/capabilities.d.ts +8 -0
  1183. package/core/application/src/orchestration/capabilities.js +3 -0
  1184. package/core/application/src/orchestration/chain/account-queue.d.ts +26 -0
  1185. package/core/application/src/orchestration/chain/account-queue.js +61 -0
  1186. package/core/application/src/orchestration/chain/activity-ids.d.ts +14 -0
  1187. package/core/application/src/orchestration/chain/activity-ids.js +11 -0
  1188. package/core/application/src/orchestration/chain/batch-failed-error.d.ts +13 -0
  1189. package/core/application/src/orchestration/chain/batch-failed-error.js +14 -0
  1190. package/core/application/src/orchestration/chain/batch-submission.d.ts +60 -0
  1191. package/core/application/src/orchestration/chain/batch-submission.js +77 -0
  1192. package/core/application/src/orchestration/chain/chain-connection.d.ts +78 -0
  1193. package/core/application/src/orchestration/chain/chain-connection.js +82 -0
  1194. package/core/application/src/orchestration/chain/dispatch-failed-error.d.ts +12 -0
  1195. package/core/application/src/orchestration/chain/dispatch-failed-error.js +16 -0
  1196. package/core/application/src/orchestration/chain/events.d.ts +56 -0
  1197. package/core/application/src/orchestration/chain/events.js +97 -0
  1198. package/core/application/src/orchestration/chain/funding-batch.d.ts +40 -0
  1199. package/core/application/src/orchestration/chain/funding-batch.js +100 -0
  1200. package/core/application/src/orchestration/chain/index.d.ts +14 -0
  1201. package/core/application/src/orchestration/chain/index.js +15 -0
  1202. package/core/application/src/orchestration/chain/root-call-failed-error.d.ts +6 -0
  1203. package/core/application/src/orchestration/chain/root-call-failed-error.js +8 -0
  1204. package/core/application/src/orchestration/chain/root-call-refused-error.d.ts +6 -0
  1205. package/core/application/src/orchestration/chain/root-call-refused-error.js +8 -0
  1206. package/core/application/src/orchestration/chain/root-caller.d.ts +56 -0
  1207. package/core/application/src/orchestration/chain/root-caller.js +54 -0
  1208. package/core/application/src/orchestration/chain/scenario-journal.d.ts +27 -0
  1209. package/core/application/src/orchestration/chain/scenario-journal.js +28 -0
  1210. package/core/application/src/orchestration/chain/signing-queues.d.ts +28 -0
  1211. package/core/application/src/orchestration/chain/signing-queues.js +93 -0
  1212. package/core/application/src/orchestration/chain/statement-reader.d.ts +79 -0
  1213. package/core/application/src/orchestration/chain/statement-reader.js +108 -0
  1214. package/core/application/src/orchestration/chain/transaction-executor.d.ts +85 -0
  1215. package/core/application/src/orchestration/chain/transaction-executor.js +184 -0
  1216. package/core/application/src/orchestration/chain/unreadable-blocks-error.d.ts +15 -0
  1217. package/core/application/src/orchestration/chain/unreadable-blocks-error.js +17 -0
  1218. package/core/application/src/orchestration/definitions.d.ts +2 -0
  1219. package/core/application/src/orchestration/definitions.js +5 -0
  1220. package/core/application/src/orchestration/host/chain-gate-source.d.ts +34 -0
  1221. package/core/application/src/orchestration/host/chain-gate-source.js +65 -0
  1222. package/core/application/src/orchestration/host/destinations.d.ts +6 -0
  1223. package/core/application/src/orchestration/host/destinations.js +3 -0
  1224. package/core/application/src/orchestration/host/host-registry.d.ts +93 -0
  1225. package/core/application/src/orchestration/host/host-registry.js +255 -0
  1226. package/core/application/src/orchestration/host/host-routes.d.ts +14 -0
  1227. package/core/application/src/orchestration/host/host-routes.js +11 -0
  1228. package/core/application/src/orchestration/host/host-session-registry.d.ts +79 -0
  1229. package/core/application/src/orchestration/host/host-session-registry.js +150 -0
  1230. package/core/application/src/orchestration/host/index.d.ts +8 -0
  1231. package/core/application/src/orchestration/host/index.js +10 -0
  1232. package/core/application/src/orchestration/host/lab-navigation.d.ts +103 -0
  1233. package/core/application/src/orchestration/host/lab-navigation.js +188 -0
  1234. package/core/application/src/orchestration/host/navigation-bridge.d.ts +82 -0
  1235. package/core/application/src/orchestration/host/navigation-bridge.js +123 -0
  1236. package/core/application/src/orchestration/host/port.d.ts +12 -0
  1237. package/core/application/src/orchestration/host/port.js +3 -0
  1238. package/core/application/src/orchestration/host/session-records.d.ts +11 -0
  1239. package/core/application/src/orchestration/host/session-records.js +23 -0
  1240. package/core/application/src/orchestration/identity/index.d.ts +1 -0
  1241. package/core/application/src/orchestration/identity/index.js +3 -0
  1242. package/core/application/src/orchestration/identity/port.d.ts +11 -0
  1243. package/core/application/src/orchestration/identity/port.js +3 -0
  1244. package/core/application/src/orchestration/index.d.ts +52 -0
  1245. package/core/application/src/orchestration/index.js +46 -0
  1246. package/core/application/src/orchestration/integrations/chain-event-assertion.d.ts +49 -0
  1247. package/core/application/src/orchestration/integrations/chain-event-assertion.js +33 -0
  1248. package/core/application/src/orchestration/integrations/define.d.ts +472 -0
  1249. package/core/application/src/orchestration/integrations/define.js +64 -0
  1250. package/core/application/src/orchestration/integrations/generic-sentences.d.ts +1 -0
  1251. package/core/application/src/orchestration/integrations/generic-sentences.js +3 -0
  1252. package/core/application/src/orchestration/integrations/integration-registry.d.ts +53 -0
  1253. package/core/application/src/orchestration/integrations/integration-registry.js +261 -0
  1254. package/core/application/src/orchestration/integrations/integration-scenarios.d.ts +17 -0
  1255. package/core/application/src/orchestration/integrations/integration-scenarios.js +48 -0
  1256. package/core/application/src/orchestration/integrations/integration-sentences.d.ts +78 -0
  1257. package/core/application/src/orchestration/integrations/integration-sentences.js +214 -0
  1258. package/core/application/src/orchestration/integrations/known-submission-error.d.ts +16 -0
  1259. package/core/application/src/orchestration/integrations/known-submission-error.js +22 -0
  1260. package/core/application/src/orchestration/integrations/ui-chain-check.d.ts +104 -0
  1261. package/core/application/src/orchestration/integrations/ui-chain-check.js +191 -0
  1262. package/core/application/src/orchestration/lab/block-availability.d.ts +20 -0
  1263. package/core/application/src/orchestration/lab/block-availability.js +30 -0
  1264. package/core/application/src/orchestration/lab/checked-environment-time.d.ts +29 -0
  1265. package/core/application/src/orchestration/lab/checked-environment-time.js +52 -0
  1266. package/core/application/src/orchestration/lab/compile.d.ts +66 -0
  1267. package/core/application/src/orchestration/lab/compile.js +54 -0
  1268. package/core/application/src/orchestration/lab/declared-lab-catalog.d.ts +132 -0
  1269. package/core/application/src/orchestration/lab/declared-lab-catalog.js +343 -0
  1270. package/core/application/src/orchestration/lab/define.d.ts +377 -0
  1271. package/core/application/src/orchestration/lab/define.js +18 -0
  1272. package/core/application/src/orchestration/lab/environment-actors.d.ts +18 -0
  1273. package/core/application/src/orchestration/lab/environment-actors.js +22 -0
  1274. package/core/application/src/orchestration/lab/environment-fixtures.d.ts +14 -0
  1275. package/core/application/src/orchestration/lab/environment-fixtures.js +43 -0
  1276. package/core/application/src/orchestration/lab/environment-options.d.ts +20 -0
  1277. package/core/application/src/orchestration/lab/environment-options.js +26 -0
  1278. package/core/application/src/orchestration/lab/environment-registry.d.ts +50 -0
  1279. package/core/application/src/orchestration/lab/environment-registry.js +124 -0
  1280. package/core/application/src/orchestration/lab/environment-view.d.ts +12 -0
  1281. package/core/application/src/orchestration/lab/environment-view.js +73 -0
  1282. package/core/application/src/orchestration/lab/environments.d.ts +74 -0
  1283. package/core/application/src/orchestration/lab/environments.js +98 -0
  1284. package/core/application/src/orchestration/lab/holding-browsers.d.ts +16 -0
  1285. package/core/application/src/orchestration/lab/holding-browsers.js +18 -0
  1286. package/core/application/src/orchestration/lab/integration-availability.d.ts +39 -0
  1287. package/core/application/src/orchestration/lab/integration-availability.js +51 -0
  1288. package/core/application/src/orchestration/lab/kept-placements.d.ts +11 -0
  1289. package/core/application/src/orchestration/lab/kept-placements.js +17 -0
  1290. package/core/application/src/orchestration/lab/lab-rpc.d.ts +30 -0
  1291. package/core/application/src/orchestration/lab/lab-rpc.js +153 -0
  1292. package/core/application/src/orchestration/lab/loaded-lab.d.ts +42 -0
  1293. package/core/application/src/orchestration/lab/loaded-lab.js +48 -0
  1294. package/core/application/src/orchestration/lab/product-lab-config.d.ts +244 -0
  1295. package/core/application/src/orchestration/lab/product-lab-config.js +8 -0
  1296. package/core/application/src/orchestration/lab/registry.d.ts +25 -0
  1297. package/core/application/src/orchestration/lab/registry.js +168 -0
  1298. package/core/application/src/orchestration/lab/root-call-access.d.ts +46 -0
  1299. package/core/application/src/orchestration/lab/root-call-access.js +50 -0
  1300. package/core/application/src/orchestration/lab/scenario-conditions.d.ts +25 -0
  1301. package/core/application/src/orchestration/lab/scenario-conditions.js +31 -0
  1302. package/core/application/src/orchestration/lab/session-ports.d.ts +63 -0
  1303. package/core/application/src/orchestration/lab/session-ports.js +132 -0
  1304. package/core/application/src/orchestration/lab/source-lab-loader.d.ts +60 -0
  1305. package/core/application/src/orchestration/lab/source-lab-loader.js +57 -0
  1306. package/core/application/src/orchestration/lab/start-lab-environment.d.ts +6 -0
  1307. package/core/application/src/orchestration/lab/start-lab-environment.js +609 -0
  1308. package/core/application/src/orchestration/lab/topology-overrides.d.ts +3 -0
  1309. package/core/application/src/orchestration/lab/topology-overrides.js +42 -0
  1310. package/core/application/src/orchestration/lab/validate.d.ts +36 -0
  1311. package/core/application/src/orchestration/lab/validate.js +235 -0
  1312. package/core/application/src/orchestration/managed-environment.d.ts +7 -0
  1313. package/core/application/src/orchestration/managed-environment.js +109 -0
  1314. package/core/application/src/orchestration/run/index.d.ts +8 -0
  1315. package/core/application/src/orchestration/run/index.js +3 -0
  1316. package/core/application/src/orchestration/run/resources.d.ts +8 -0
  1317. package/core/application/src/orchestration/run/resources.js +3 -0
  1318. package/core/application/src/orchestration/secrets/dev-account-source.d.ts +10 -0
  1319. package/core/application/src/orchestration/secrets/dev-account-source.js +18 -0
  1320. package/core/application/src/orchestration/secrets/env-source.d.ts +10 -0
  1321. package/core/application/src/orchestration/secrets/env-source.js +19 -0
  1322. package/core/application/src/orchestration/secrets/secret-error.d.ts +5 -0
  1323. package/core/application/src/orchestration/secrets/secret-error.js +10 -0
  1324. package/core/application/src/orchestration/secrets/secret-resolver.d.ts +53 -0
  1325. package/core/application/src/orchestration/secrets/secret-resolver.js +92 -0
  1326. package/core/application/src/orchestration/secrets/secret-source.d.ts +18 -0
  1327. package/core/application/src/orchestration/secrets/secret-source.js +12 -0
  1328. package/core/application/src/orchestration/secrets/sources.d.ts +27 -0
  1329. package/core/application/src/orchestration/secrets/sources.js +42 -0
  1330. package/core/application/src/orchestration/services/authority-error.d.ts +7 -0
  1331. package/core/application/src/orchestration/services/authority-error.js +9 -0
  1332. package/core/application/src/orchestration/services/authorized-service.d.ts +54 -0
  1333. package/core/application/src/orchestration/services/authorized-service.js +59 -0
  1334. package/core/application/src/orchestration/services/define.d.ts +61 -0
  1335. package/core/application/src/orchestration/services/define.js +49 -0
  1336. package/core/application/src/orchestration/services/service-container.d.ts +85 -0
  1337. package/core/application/src/orchestration/services/service-container.js +320 -0
  1338. package/core/application/src/orchestration/services/service-error.d.ts +7 -0
  1339. package/core/application/src/orchestration/services/service-error.js +10 -0
  1340. package/core/application/src/orchestration/services/service-lifetime-scope.d.ts +22 -0
  1341. package/core/application/src/orchestration/services/service-lifetime-scope.js +22 -0
  1342. package/core/application/src/orchestration/services/stale-generation-error.d.ts +5 -0
  1343. package/core/application/src/orchestration/services/stale-generation-error.js +9 -0
  1344. package/core/application/src/orchestration/steps.d.ts +28 -0
  1345. package/core/application/src/orchestration/steps.js +36 -0
  1346. package/core/application/src/orchestration/topology.d.ts +7 -0
  1347. package/core/application/src/orchestration/topology.js +6 -0
  1348. package/core/application/src/orchestration/types.d.ts +4 -0
  1349. package/core/application/src/orchestration/types.js +3 -0
  1350. package/core/application/src/recordings/check-step-speed.d.ts +10 -0
  1351. package/core/application/src/recordings/check-step-speed.js +43 -0
  1352. package/core/application/src/recordings/console-collector.d.ts +21 -0
  1353. package/core/application/src/recordings/console-collector.js +43 -0
  1354. package/core/application/src/recordings/console-log.d.ts +19 -0
  1355. package/core/application/src/recordings/console-log.js +29 -0
  1356. package/core/application/src/recordings/deadline.d.ts +16 -0
  1357. package/core/application/src/recordings/deadline.js +23 -0
  1358. package/core/application/src/recordings/demo-markup.d.ts +66 -0
  1359. package/core/application/src/recordings/demo-markup.js +90 -0
  1360. package/core/application/src/recordings/demo-recording.d.ts +32 -0
  1361. package/core/application/src/recordings/demo-recording.js +213 -0
  1362. package/core/application/src/recordings/frame-sources.d.ts +9 -0
  1363. package/core/application/src/recordings/frame-sources.js +14 -0
  1364. package/core/application/src/recordings/health-sampler.d.ts +33 -0
  1365. package/core/application/src/recordings/health-sampler.js +71 -0
  1366. package/core/application/src/recordings/host-logs.d.ts +17 -0
  1367. package/core/application/src/recordings/host-logs.js +43 -0
  1368. package/core/application/src/recordings/list-recordings.d.ts +11 -0
  1369. package/core/application/src/recordings/list-recordings.js +23 -0
  1370. package/core/application/src/recordings/open-recording.d.ts +17 -0
  1371. package/core/application/src/recordings/open-recording.js +41 -0
  1372. package/core/application/src/recordings/read-run-step-health.d.ts +18 -0
  1373. package/core/application/src/recordings/read-run-step-health.js +39 -0
  1374. package/core/application/src/recordings/record-runs.d.ts +121 -0
  1375. package/core/application/src/recordings/record-runs.js +426 -0
  1376. package/core/application/src/recordings/recording-draft.d.ts +108 -0
  1377. package/core/application/src/recordings/recording-draft.js +214 -0
  1378. package/core/application/src/recordings/recording-stores.d.ts +18 -0
  1379. package/core/application/src/recordings/recording-stores.js +21 -0
  1380. package/core/application/src/recordings/step-chain-reader.d.ts +54 -0
  1381. package/core/application/src/recordings/step-chain-reader.js +176 -0
  1382. package/core/application/src/recordings/step-host-request-reader.d.ts +18 -0
  1383. package/core/application/src/recordings/step-host-request-reader.js +63 -0
  1384. package/core/application/src/recordings/write-journey-docs.d.ts +17 -0
  1385. package/core/application/src/recordings/write-journey-docs.js +119 -0
  1386. package/core/application/src/redaction/bip39-english.d.ts +1 -0
  1387. package/core/application/src/redaction/bip39-english.js +132 -0
  1388. package/core/application/src/redaction/secret-redactor.d.ts +21 -0
  1389. package/core/application/src/redaction/secret-redactor.js +104 -0
  1390. package/core/application/src/runs/activity-log.d.ts +49 -0
  1391. package/core/application/src/runs/activity-log.js +199 -0
  1392. package/core/application/src/runs/after-failure-checks.d.ts +56 -0
  1393. package/core/application/src/runs/after-failure-checks.js +89 -0
  1394. package/core/application/src/runs/after-failure-words.d.ts +9 -0
  1395. package/core/application/src/runs/after-failure-words.js +63 -0
  1396. package/core/application/src/runs/bundles/bundle-paths.d.ts +12 -0
  1397. package/core/application/src/runs/bundles/bundle-paths.js +59 -0
  1398. package/core/application/src/runs/bundles/bundle-recording.d.ts +44 -0
  1399. package/core/application/src/runs/bundles/bundle-recording.js +288 -0
  1400. package/core/application/src/runs/bundles/open-run-bundle.d.ts +23 -0
  1401. package/core/application/src/runs/bundles/open-run-bundle.js +50 -0
  1402. package/core/application/src/runs/bundles/reproduce-run.d.ts +44 -0
  1403. package/core/application/src/runs/bundles/reproduce-run.js +173 -0
  1404. package/core/application/src/runs/bundles/run-bundle-ports.d.ts +7 -0
  1405. package/core/application/src/runs/bundles/run-bundle-ports.js +3 -0
  1406. package/core/application/src/runs/bundles/run-bundle-sources.d.ts +18 -0
  1407. package/core/application/src/runs/bundles/run-bundle-sources.js +43 -0
  1408. package/core/application/src/runs/bundles/run-bundles-service.d.ts +20 -0
  1409. package/core/application/src/runs/bundles/run-bundles-service.js +22 -0
  1410. package/core/application/src/runs/bundles/start-state.d.ts +7 -0
  1411. package/core/application/src/runs/bundles/start-state.js +5 -0
  1412. package/core/application/src/runs/cancelled-error.d.ts +4 -0
  1413. package/core/application/src/runs/cancelled-error.js +5 -0
  1414. package/core/application/src/runs/check-stores.d.ts +28 -0
  1415. package/core/application/src/runs/check-stores.js +103 -0
  1416. package/core/application/src/runs/check-transaction-landed.d.ts +59 -0
  1417. package/core/application/src/runs/check-transaction-landed.js +202 -0
  1418. package/core/application/src/runs/collect-evidence.d.ts +11 -0
  1419. package/core/application/src/runs/collect-evidence.js +48 -0
  1420. package/core/application/src/runs/declared-writes.d.ts +17 -0
  1421. package/core/application/src/runs/declared-writes.js +34 -0
  1422. package/core/application/src/runs/explain-failure.d.ts +4 -0
  1423. package/core/application/src/runs/explain-failure.js +95 -0
  1424. package/core/application/src/runs/failure-rules.d.ts +15 -0
  1425. package/core/application/src/runs/failure-rules.js +197 -0
  1426. package/core/application/src/runs/host-bypass-monitor.d.ts +56 -0
  1427. package/core/application/src/runs/host-bypass-monitor.js +420 -0
  1428. package/core/application/src/runs/judge-negative-control.d.ts +4 -0
  1429. package/core/application/src/runs/judge-negative-control.js +8 -0
  1430. package/core/application/src/runs/node-route-identities.d.ts +9 -0
  1431. package/core/application/src/runs/node-route-identities.js +32 -0
  1432. package/core/application/src/runs/plan-error.d.ts +4 -0
  1433. package/core/application/src/runs/plan-error.js +5 -0
  1434. package/core/application/src/runs/quarantined-resource-error.d.ts +6 -0
  1435. package/core/application/src/runs/quarantined-resource-error.js +12 -0
  1436. package/core/application/src/runs/resource-locks.d.ts +44 -0
  1437. package/core/application/src/runs/resource-locks.js +104 -0
  1438. package/core/application/src/runs/run-console.d.ts +35 -0
  1439. package/core/application/src/runs/run-console.js +43 -0
  1440. package/core/application/src/runs/run-failure-message.d.ts +4 -0
  1441. package/core/application/src/runs/run-failure-message.js +28 -0
  1442. package/core/application/src/runs/run-scenario.d.ts +69 -0
  1443. package/core/application/src/runs/run-scenario.js +240 -0
  1444. package/core/application/src/runs/run-transactions.d.ts +17 -0
  1445. package/core/application/src/runs/run-transactions.js +117 -0
  1446. package/core/application/src/runs/scenario-inputs.d.ts +6 -0
  1447. package/core/application/src/runs/scenario-inputs.js +26 -0
  1448. package/core/application/src/runs/scenario-run.d.ts +244 -0
  1449. package/core/application/src/runs/scenario-run.js +600 -0
  1450. package/core/application/src/runs/scheduler.d.ts +235 -0
  1451. package/core/application/src/runs/scheduler.js +400 -0
  1452. package/core/application/src/runs/settle-failed-step.d.ts +27 -0
  1453. package/core/application/src/runs/settle-failed-step.js +110 -0
  1454. package/core/application/src/runs/statement-window.d.ts +37 -0
  1455. package/core/application/src/runs/statement-window.js +76 -0
  1456. package/core/application/src/runs/step-timeout-error.d.ts +4 -0
  1457. package/core/application/src/runs/step-timeout-error.js +5 -0
  1458. package/core/application/src/runs/submission-window.d.ts +102 -0
  1459. package/core/application/src/runs/submission-window.js +233 -0
  1460. package/core/application/src/settings/manage-lab-settings.d.ts +10 -0
  1461. package/core/application/src/settings/manage-lab-settings.js +70 -0
  1462. package/core/application/src/suites/compare-suite-runs.d.ts +15 -0
  1463. package/core/application/src/suites/compare-suite-runs.js +55 -0
  1464. package/core/application/src/suites/observed-versions-file.d.ts +30 -0
  1465. package/core/application/src/suites/observed-versions-file.js +30 -0
  1466. package/core/application/src/suites/row-combination.d.ts +9 -0
  1467. package/core/application/src/suites/row-combination.js +36 -0
  1468. package/core/application/src/suites/row-host-route.d.ts +26 -0
  1469. package/core/application/src/suites/row-host-route.js +30 -0
  1470. package/core/application/src/suites/run-suite.d.ts +76 -0
  1471. package/core/application/src/suites/run-suite.js +367 -0
  1472. package/core/application/src/suites/run-timings-file.d.ts +21 -0
  1473. package/core/application/src/suites/run-timings-file.js +39 -0
  1474. package/core/application/src/suites/run-workers.d.ts +19 -0
  1475. package/core/application/src/suites/run-workers.js +118 -0
  1476. package/core/application/src/suites/start-together.d.ts +15 -0
  1477. package/core/application/src/suites/start-together.js +30 -0
  1478. package/core/application/src/suites/suite-metrics.d.ts +8 -0
  1479. package/core/application/src/suites/suite-metrics.js +67 -0
  1480. package/core/application/src/suites/summarize-suite-run.d.ts +6 -0
  1481. package/core/application/src/suites/summarize-suite-run.js +57 -0
  1482. package/core/application/src/tools/runtime-tool-context.d.ts +5 -0
  1483. package/core/application/src/tools/runtime-tool-context.js +40 -0
  1484. package/core/application/src/tools/save-scenario.d.ts +18 -0
  1485. package/core/application/src/tools/save-scenario.js +49 -0
  1486. package/core/application/src/tools/tool-catalog.d.ts +27 -0
  1487. package/core/application/src/tools/tool-catalog.js +157 -0
  1488. package/core/application/src/tools/tool-context.d.ts +34 -0
  1489. package/core/application/src/tools/tool-context.js +3 -0
  1490. package/core/application/src/tools/tool-reports.d.ts +56 -0
  1491. package/core/application/src/tools/tool-reports.js +253 -0
  1492. package/core/application/src/tools/tool-runner.d.ts +67 -0
  1493. package/core/application/src/tools/tool-runner.js +423 -0
  1494. package/core/application/src/versions/check-recovery.d.ts +20 -0
  1495. package/core/application/src/versions/check-recovery.js +14 -0
  1496. package/core/application/src/versions/lab-artifacts.d.ts +27 -0
  1497. package/core/application/src/versions/lab-artifacts.js +72 -0
  1498. package/core/application/src/versions/lab-versions-service.d.ts +87 -0
  1499. package/core/application/src/versions/lab-versions-service.js +93 -0
  1500. package/core/application/src/versions/lock-proposal-body.d.ts +5 -0
  1501. package/core/application/src/versions/lock-proposal-body.js +59 -0
  1502. package/core/application/src/versions/lock-proposal-evidence.d.ts +28 -0
  1503. package/core/application/src/versions/lock-proposal-evidence.js +158 -0
  1504. package/core/application/src/versions/lock-writer.d.ts +13 -0
  1505. package/core/application/src/versions/lock-writer.js +24 -0
  1506. package/core/application/src/versions/pin-version.d.ts +21 -0
  1507. package/core/application/src/versions/pin-version.js +23 -0
  1508. package/core/application/src/versions/policy-reader.d.ts +16 -0
  1509. package/core/application/src/versions/policy-reader.js +21 -0
  1510. package/core/application/src/versions/propose-lock.d.ts +23 -0
  1511. package/core/application/src/versions/propose-lock.js +100 -0
  1512. package/core/application/src/versions/resolve-versions.d.ts +52 -0
  1513. package/core/application/src/versions/resolve-versions.js +85 -0
  1514. package/core/application/src/versions/run-versions.d.ts +15 -0
  1515. package/core/application/src/versions/run-versions.js +3 -0
  1516. package/core/application/src/versions/show-versions.d.ts +19 -0
  1517. package/core/application/src/versions/show-versions.js +51 -0
  1518. package/core/application/src/versions/update-lock.d.ts +24 -0
  1519. package/core/application/src/versions/update-lock.js +49 -0
  1520. package/core/application/src/versions/verify-lock.d.ts +21 -0
  1521. package/core/application/src/versions/verify-lock.js +53 -0
  1522. package/core/application/src/versions/version-sources.d.ts +18 -0
  1523. package/core/application/src/versions/version-sources.js +33 -0
  1524. package/core/domain/README.md +197 -0
  1525. package/core/domain/src/accounts/account-address.d.ts +48 -0
  1526. package/core/domain/src/accounts/account-address.js +153 -0
  1527. package/core/domain/src/accounts/account-format-error.d.ts +12 -0
  1528. package/core/domain/src/accounts/account-format-error.js +14 -0
  1529. package/core/domain/src/accounts/account-functions.d.ts +15 -0
  1530. package/core/domain/src/accounts/account-functions.js +16 -0
  1531. package/core/domain/src/accounts/ambiguous-account-error.d.ts +9 -0
  1532. package/core/domain/src/accounts/ambiguous-account-error.js +13 -0
  1533. package/core/domain/src/accounts/expected-account.d.ts +19 -0
  1534. package/core/domain/src/accounts/expected-account.js +35 -0
  1535. package/core/domain/src/accounts/hashes.d.ts +4 -0
  1536. package/core/domain/src/accounts/hashes.js +131 -0
  1537. package/core/domain/src/accounts/index.d.ts +5 -0
  1538. package/core/domain/src/accounts/index.js +7 -0
  1539. package/core/domain/src/actors/actor-alias.d.ts +13 -0
  1540. package/core/domain/src/actors/actor-alias.js +24 -0
  1541. package/core/domain/src/actors/actor-id.d.ts +13 -0
  1542. package/core/domain/src/actors/actor-id.js +24 -0
  1543. package/core/domain/src/actors/actor-roster.d.ts +19 -0
  1544. package/core/domain/src/actors/actor-roster.js +36 -0
  1545. package/core/domain/src/actors/actor.d.ts +122 -0
  1546. package/core/domain/src/actors/actor.js +49 -0
  1547. package/core/domain/src/actors/host-color.d.ts +4 -0
  1548. package/core/domain/src/actors/host-color.js +6 -0
  1549. package/core/domain/src/actors/host-options.d.ts +74 -0
  1550. package/core/domain/src/actors/host-options.js +100 -0
  1551. package/core/domain/src/actors/index.d.ts +8 -0
  1552. package/core/domain/src/actors/index.js +10 -0
  1553. package/core/domain/src/actors/principal.d.ts +42 -0
  1554. package/core/domain/src/actors/principal.js +33 -0
  1555. package/core/domain/src/actors/session.d.ts +20 -0
  1556. package/core/domain/src/actors/session.js +35 -0
  1557. package/core/domain/src/agreement/agreement-judge.d.ts +66 -0
  1558. package/core/domain/src/agreement/agreement-judge.js +272 -0
  1559. package/core/domain/src/agreement/agreement-mode.d.ts +14 -0
  1560. package/core/domain/src/agreement/agreement-mode.js +16 -0
  1561. package/core/domain/src/agreement/agreement-record.d.ts +142 -0
  1562. package/core/domain/src/agreement/agreement-record.js +14 -0
  1563. package/core/domain/src/agreement/agreement-sample.d.ts +65 -0
  1564. package/core/domain/src/agreement/agreement-sample.js +3 -0
  1565. package/core/domain/src/agreement/agreement-settings.d.ts +36 -0
  1566. package/core/domain/src/agreement/agreement-settings.js +55 -0
  1567. package/core/domain/src/agreement/claims.d.ts +9 -0
  1568. package/core/domain/src/agreement/claims.js +55 -0
  1569. package/core/domain/src/agreement/index.d.ts +7 -0
  1570. package/core/domain/src/agreement/index.js +9 -0
  1571. package/core/domain/src/agreement/ui-chain-disagreement-error.d.ts +18 -0
  1572. package/core/domain/src/agreement/ui-chain-disagreement-error.js +22 -0
  1573. package/core/domain/src/apps/app-account-source.d.ts +29 -0
  1574. package/core/domain/src/apps/app-account-source.js +41 -0
  1575. package/core/domain/src/apps/app-announcement-window.d.ts +17 -0
  1576. package/core/domain/src/apps/app-announcement-window.js +30 -0
  1577. package/core/domain/src/apps/app-build-message.d.ts +75 -0
  1578. package/core/domain/src/apps/app-build-message.js +42 -0
  1579. package/core/domain/src/apps/app-deployed-source.d.ts +62 -0
  1580. package/core/domain/src/apps/app-deployed-source.js +100 -0
  1581. package/core/domain/src/apps/app-dev-server.d.ts +115 -0
  1582. package/core/domain/src/apps/app-dev-server.js +186 -0
  1583. package/core/domain/src/apps/app-framing.d.ts +70 -0
  1584. package/core/domain/src/apps/app-framing.js +133 -0
  1585. package/core/domain/src/apps/app-readiness.d.ts +102 -0
  1586. package/core/domain/src/apps/app-readiness.js +138 -0
  1587. package/core/domain/src/apps/app-watch.d.ts +62 -0
  1588. package/core/domain/src/apps/app-watch.js +106 -0
  1589. package/core/domain/src/apps/dev-server-socket.d.ts +27 -0
  1590. package/core/domain/src/apps/dev-server-socket.js +76 -0
  1591. package/core/domain/src/apps/host-bypass-policy.d.ts +5 -0
  1592. package/core/domain/src/apps/host-bypass-policy.js +12 -0
  1593. package/core/domain/src/apps/html-script.d.ts +9 -0
  1594. package/core/domain/src/apps/html-script.js +21 -0
  1595. package/core/domain/src/apps/index.d.ts +15 -0
  1596. package/core/domain/src/apps/index.js +17 -0
  1597. package/core/domain/src/apps/next-turbopack-announcement.d.ts +8 -0
  1598. package/core/domain/src/apps/next-turbopack-announcement.js +62 -0
  1599. package/core/domain/src/apps/next-webpack-announcement.d.ts +5 -0
  1600. package/core/domain/src/apps/next-webpack-announcement.js +42 -0
  1601. package/core/domain/src/apps/vite-app-announcement.d.ts +2 -0
  1602. package/core/domain/src/apps/vite-app-announcement.js +30 -0
  1603. package/core/domain/src/apps/webpack-dev-server-announcement.d.ts +12 -0
  1604. package/core/domain/src/apps/webpack-dev-server-announcement.js +56 -0
  1605. package/core/domain/src/builder/builder-check.d.ts +81 -0
  1606. package/core/domain/src/builder/builder-check.js +253 -0
  1607. package/core/domain/src/builder/builder-document.d.ts +95 -0
  1608. package/core/domain/src/builder/builder-document.js +16 -0
  1609. package/core/domain/src/builder/builder-edit.d.ts +70 -0
  1610. package/core/domain/src/builder/builder-edit.js +190 -0
  1611. package/core/domain/src/builder/builder-error.d.ts +8 -0
  1612. package/core/domain/src/builder/builder-error.js +11 -0
  1613. package/core/domain/src/builder/builder-palette.d.ts +101 -0
  1614. package/core/domain/src/builder/builder-palette.js +90 -0
  1615. package/core/domain/src/builder/feature-reader.d.ts +4 -0
  1616. package/core/domain/src/builder/feature-reader.js +326 -0
  1617. package/core/domain/src/builder/feature-writer.d.ts +51 -0
  1618. package/core/domain/src/builder/feature-writer.js +230 -0
  1619. package/core/domain/src/builder/index.d.ts +8 -0
  1620. package/core/domain/src/builder/index.js +10 -0
  1621. package/core/domain/src/builder/round-trip-error.d.ts +6 -0
  1622. package/core/domain/src/builder/round-trip-error.js +10 -0
  1623. package/core/domain/src/checks/index.d.ts +3 -0
  1624. package/core/domain/src/checks/index.js +5 -0
  1625. package/core/domain/src/checks/side-reading.d.ts +96 -0
  1626. package/core/domain/src/checks/side-reading.js +105 -0
  1627. package/core/domain/src/checks/step-check-error.d.ts +4 -0
  1628. package/core/domain/src/checks/step-check-error.js +5 -0
  1629. package/core/domain/src/checks/step-checks.d.ts +115 -0
  1630. package/core/domain/src/checks/step-checks.js +120 -0
  1631. package/core/domain/src/conditions/condition-error.d.ts +4 -0
  1632. package/core/domain/src/conditions/condition-error.js +8 -0
  1633. package/core/domain/src/conditions/condition-profiles.d.ts +15 -0
  1634. package/core/domain/src/conditions/condition-profiles.js +42 -0
  1635. package/core/domain/src/conditions/condition-step.d.ts +29 -0
  1636. package/core/domain/src/conditions/condition-step.js +45 -0
  1637. package/core/domain/src/conditions/conditioned-traffic.d.ts +25 -0
  1638. package/core/domain/src/conditions/conditioned-traffic.js +31 -0
  1639. package/core/domain/src/conditions/conditioned-wire.d.ts +21 -0
  1640. package/core/domain/src/conditions/conditioned-wire.js +38 -0
  1641. package/core/domain/src/conditions/cpu-slowdown.d.ts +4 -0
  1642. package/core/domain/src/conditions/cpu-slowdown.js +9 -0
  1643. package/core/domain/src/conditions/index.d.ts +7 -0
  1644. package/core/domain/src/conditions/index.js +9 -0
  1645. package/core/domain/src/conditions/network-condition.d.ts +18 -0
  1646. package/core/domain/src/conditions/network-condition.js +25 -0
  1647. package/core/domain/src/devices/device-profile.d.ts +43 -0
  1648. package/core/domain/src/devices/device-profile.js +70 -0
  1649. package/core/domain/src/devices/index.d.ts +2 -0
  1650. package/core/domain/src/devices/index.js +4 -0
  1651. package/core/domain/src/devices/synthetic-media.d.ts +15 -0
  1652. package/core/domain/src/devices/synthetic-media.js +7 -0
  1653. package/core/domain/src/explore/exploration-alphabet.d.ts +30 -0
  1654. package/core/domain/src/explore/exploration-alphabet.js +88 -0
  1655. package/core/domain/src/explore/failure-signature.d.ts +13 -0
  1656. package/core/domain/src/explore/failure-signature.js +14 -0
  1657. package/core/domain/src/explore/index.d.ts +6 -0
  1658. package/core/domain/src/explore/index.js +8 -0
  1659. package/core/domain/src/explore/seeded-random.d.ts +11 -0
  1660. package/core/domain/src/explore/seeded-random.js +27 -0
  1661. package/core/domain/src/explore/shrink-steps.d.ts +15 -0
  1662. package/core/domain/src/explore/shrink-steps.js +42 -0
  1663. package/core/domain/src/explore/what-if-branches.d.ts +34 -0
  1664. package/core/domain/src/explore/what-if-branches.js +62 -0
  1665. package/core/domain/src/explore/what-if-plan-error.d.ts +5 -0
  1666. package/core/domain/src/explore/what-if-plan-error.js +10 -0
  1667. package/core/domain/src/features/cleanup-report.d.ts +22 -0
  1668. package/core/domain/src/features/cleanup-report.js +23 -0
  1669. package/core/domain/src/features/feature-file.d.ts +111 -0
  1670. package/core/domain/src/features/feature-file.js +290 -0
  1671. package/core/domain/src/features/feature-path.d.ts +7 -0
  1672. package/core/domain/src/features/feature-path.js +19 -0
  1673. package/core/domain/src/features/index.d.ts +8 -0
  1674. package/core/domain/src/features/index.js +10 -0
  1675. package/core/domain/src/features/plain-output.d.ts +43 -0
  1676. package/core/domain/src/features/plain-output.js +47 -0
  1677. package/core/domain/src/features/scenario-conditions.d.ts +28 -0
  1678. package/core/domain/src/features/scenario-conditions.js +51 -0
  1679. package/core/domain/src/features/scenario-environments.d.ts +47 -0
  1680. package/core/domain/src/features/scenario-environments.js +47 -0
  1681. package/core/domain/src/features/step-breakpoints.d.ts +48 -0
  1682. package/core/domain/src/features/step-breakpoints.js +75 -0
  1683. package/core/domain/src/features/tag-expression.d.ts +1 -0
  1684. package/core/domain/src/features/tag-expression.js +45 -0
  1685. package/core/domain/src/fixtures/fixture-bundle.d.ts +123 -0
  1686. package/core/domain/src/fixtures/fixture-bundle.js +183 -0
  1687. package/core/domain/src/fixtures/fixture-catalog.d.ts +49 -0
  1688. package/core/domain/src/fixtures/fixture-catalog.js +91 -0
  1689. package/core/domain/src/fixtures/fixture-declaration.d.ts +22 -0
  1690. package/core/domain/src/fixtures/fixture-declaration.js +60 -0
  1691. package/core/domain/src/fixtures/fixture-import-incomplete-error.d.ts +10 -0
  1692. package/core/domain/src/fixtures/fixture-import-incomplete-error.js +10 -0
  1693. package/core/domain/src/fixtures/fixture-key.d.ts +57 -0
  1694. package/core/domain/src/fixtures/fixture-key.js +129 -0
  1695. package/core/domain/src/fixtures/fixture-record.d.ts +89 -0
  1696. package/core/domain/src/fixtures/fixture-record.js +105 -0
  1697. package/core/domain/src/fixtures/fixture-refused-error.d.ts +11 -0
  1698. package/core/domain/src/fixtures/fixture-refused-error.js +13 -0
  1699. package/core/domain/src/fixtures/fixture-source-declaration.d.ts +21 -0
  1700. package/core/domain/src/fixtures/fixture-source-declaration.js +36 -0
  1701. package/core/domain/src/fixtures/index.d.ts +9 -0
  1702. package/core/domain/src/fixtures/index.js +11 -0
  1703. package/core/domain/src/fixtures/scenario-fixture.d.ts +34 -0
  1704. package/core/domain/src/fixtures/scenario-fixture.js +33 -0
  1705. package/core/domain/src/identity/identity.d.ts +50 -0
  1706. package/core/domain/src/identity/identity.js +47 -0
  1707. package/core/domain/src/identity/index.d.ts +2 -0
  1708. package/core/domain/src/identity/index.js +4 -0
  1709. package/core/domain/src/identity/pre-onboarded-actor.d.ts +34 -0
  1710. package/core/domain/src/identity/pre-onboarded-actor.js +66 -0
  1711. package/core/domain/src/index.d.ts +27 -0
  1712. package/core/domain/src/index.js +29 -0
  1713. package/core/domain/src/lab/capability-policy.d.ts +37 -0
  1714. package/core/domain/src/lab/capability-policy.js +50 -0
  1715. package/core/domain/src/lab/capability.d.ts +4 -0
  1716. package/core/domain/src/lab/capability.js +13 -0
  1717. package/core/domain/src/lab/chain-pace.d.ts +20 -0
  1718. package/core/domain/src/lab/chain-pace.js +19 -0
  1719. package/core/domain/src/lab/confirmation-required-error.d.ts +8 -0
  1720. package/core/domain/src/lab/confirmation-required-error.js +10 -0
  1721. package/core/domain/src/lab/environment-options.d.ts +43 -0
  1722. package/core/domain/src/lab/environment-options.js +39 -0
  1723. package/core/domain/src/lab/environment-request-error.d.ts +10 -0
  1724. package/core/domain/src/lab/environment-request-error.js +5 -0
  1725. package/core/domain/src/lab/host-capabilities.d.ts +60 -0
  1726. package/core/domain/src/lab/host-capabilities.js +15 -0
  1727. package/core/domain/src/lab/index.d.ts +24 -0
  1728. package/core/domain/src/lab/index.js +26 -0
  1729. package/core/domain/src/lab/integration-readiness.d.ts +37 -0
  1730. package/core/domain/src/lab/integration-readiness.js +35 -0
  1731. package/core/domain/src/lab/lab-configuration-error.d.ts +5 -0
  1732. package/core/domain/src/lab/lab-configuration-error.js +10 -0
  1733. package/core/domain/src/lab/offer.d.ts +47 -0
  1734. package/core/domain/src/lab/offer.js +62 -0
  1735. package/core/domain/src/lab/public-target.d.ts +94 -0
  1736. package/core/domain/src/lab/public-target.js +114 -0
  1737. package/core/domain/src/lab/requirement-check.d.ts +23 -0
  1738. package/core/domain/src/lab/requirement-check.js +30 -0
  1739. package/core/domain/src/lab/requirement-functions.d.ts +14 -0
  1740. package/core/domain/src/lab/requirement-functions.js +13 -0
  1741. package/core/domain/src/lab/requirements.d.ts +25 -0
  1742. package/core/domain/src/lab/requirements.js +29 -0
  1743. package/core/domain/src/lab/resolved-config.d.ts +81 -0
  1744. package/core/domain/src/lab/resolved-config.js +91 -0
  1745. package/core/domain/src/lab/rpc-selection.d.ts +62 -0
  1746. package/core/domain/src/lab/rpc-selection.js +95 -0
  1747. package/core/domain/src/lab/run-manifest.d.ts +36 -0
  1748. package/core/domain/src/lab/run-manifest.js +24 -0
  1749. package/core/domain/src/lab/running-lab.d.ts +6 -0
  1750. package/core/domain/src/lab/running-lab.js +5 -0
  1751. package/core/domain/src/lab/runtime-wire.d.ts +21 -0
  1752. package/core/domain/src/lab/runtime-wire.js +87 -0
  1753. package/core/domain/src/lab/topology-error.d.ts +5 -0
  1754. package/core/domain/src/lab/topology-error.js +10 -0
  1755. package/core/domain/src/lab/topology-functions.d.ts +66 -0
  1756. package/core/domain/src/lab/topology-functions.js +159 -0
  1757. package/core/domain/src/lab/topology-issues.d.ts +16 -0
  1758. package/core/domain/src/lab/topology-issues.js +45 -0
  1759. package/core/domain/src/lab/topology.d.ts +188 -0
  1760. package/core/domain/src/lab/topology.js +53 -0
  1761. package/core/domain/src/lab/value-tones.d.ts +30 -0
  1762. package/core/domain/src/lab/value-tones.js +66 -0
  1763. package/core/domain/src/load/index.d.ts +3 -0
  1764. package/core/domain/src/load/index.js +5 -0
  1765. package/core/domain/src/load/load-guard.d.ts +14 -0
  1766. package/core/domain/src/load/load-guard.js +13 -0
  1767. package/core/domain/src/load/load-plan.d.ts +26 -0
  1768. package/core/domain/src/load/load-plan.js +32 -0
  1769. package/core/domain/src/load/load-report.d.ts +64 -0
  1770. package/core/domain/src/load/load-report.js +73 -0
  1771. package/core/domain/src/navigation/app-routes.d.ts +27 -0
  1772. package/core/domain/src/navigation/app-routes.js +85 -0
  1773. package/core/domain/src/navigation/app-url.d.ts +9 -0
  1774. package/core/domain/src/navigation/app-url.js +22 -0
  1775. package/core/domain/src/navigation/index.d.ts +7 -0
  1776. package/core/domain/src/navigation/index.js +9 -0
  1777. package/core/domain/src/navigation/named-destination.d.ts +43 -0
  1778. package/core/domain/src/navigation/named-destination.js +49 -0
  1779. package/core/domain/src/navigation/navigation-evidence.d.ts +20 -0
  1780. package/core/domain/src/navigation/navigation-evidence.js +3 -0
  1781. package/core/domain/src/navigation/navigation-expectation.d.ts +16 -0
  1782. package/core/domain/src/navigation/navigation-expectation.js +40 -0
  1783. package/core/domain/src/navigation/navigation-request.d.ts +16 -0
  1784. package/core/domain/src/navigation/navigation-request.js +13 -0
  1785. package/core/domain/src/navigation/navigation-resolution.d.ts +69 -0
  1786. package/core/domain/src/navigation/navigation-resolution.js +37 -0
  1787. package/core/domain/src/network/endpoint-locality.d.ts +14 -0
  1788. package/core/domain/src/network/endpoint-locality.js +39 -0
  1789. package/core/domain/src/network/environment-endpoints.d.ts +36 -0
  1790. package/core/domain/src/network/environment-endpoints.js +49 -0
  1791. package/core/domain/src/network/host-network-routes.d.ts +73 -0
  1792. package/core/domain/src/network/host-network-routes.js +138 -0
  1793. package/core/domain/src/network/host-route-closures.d.ts +9 -0
  1794. package/core/domain/src/network/host-route-closures.js +23 -0
  1795. package/core/domain/src/network/index.d.ts +8 -0
  1796. package/core/domain/src/network/index.js +10 -0
  1797. package/core/domain/src/network/loopback-url.d.ts +33 -0
  1798. package/core/domain/src/network/loopback-url.js +63 -0
  1799. package/core/domain/src/network/mixed-endpoints-error.d.ts +12 -0
  1800. package/core/domain/src/network/mixed-endpoints-error.js +17 -0
  1801. package/core/domain/src/network/network-policy.d.ts +98 -0
  1802. package/core/domain/src/network/network-policy.js +157 -0
  1803. package/core/domain/src/network/observed-endpoints.d.ts +17 -0
  1804. package/core/domain/src/network/observed-endpoints.js +47 -0
  1805. package/core/domain/src/network/worker-hold.d.ts +24 -0
  1806. package/core/domain/src/network/worker-hold.js +14 -0
  1807. package/core/domain/src/products/index.d.ts +3 -0
  1808. package/core/domain/src/products/index.js +5 -0
  1809. package/core/domain/src/products/product-config-policy.d.ts +19 -0
  1810. package/core/domain/src/products/product-config-policy.js +18 -0
  1811. package/core/domain/src/products/product-config-refused.d.ts +4 -0
  1812. package/core/domain/src/products/product-config-refused.js +8 -0
  1813. package/core/domain/src/products/product-config.d.ts +40 -0
  1814. package/core/domain/src/products/product-config.js +75 -0
  1815. package/core/domain/src/recordings/demo-cut.d.ts +91 -0
  1816. package/core/domain/src/recordings/demo-cut.js +179 -0
  1817. package/core/domain/src/recordings/demo-refused-error.d.ts +9 -0
  1818. package/core/domain/src/recordings/demo-refused-error.js +10 -0
  1819. package/core/domain/src/recordings/index.d.ts +16 -0
  1820. package/core/domain/src/recordings/index.js +18 -0
  1821. package/core/domain/src/recordings/journey-document.d.ts +69 -0
  1822. package/core/domain/src/recordings/journey-document.js +93 -0
  1823. package/core/domain/src/recordings/journey-markdown.d.ts +21 -0
  1824. package/core/domain/src/recordings/journey-markdown.js +37 -0
  1825. package/core/domain/src/recordings/journeys-declaration.d.ts +16 -0
  1826. package/core/domain/src/recordings/journeys-declaration.js +17 -0
  1827. package/core/domain/src/recordings/recording-data.d.ts +476 -0
  1828. package/core/domain/src/recordings/recording-data.js +3 -0
  1829. package/core/domain/src/recordings/recording-format-error.d.ts +5 -0
  1830. package/core/domain/src/recordings/recording-format-error.js +9 -0
  1831. package/core/domain/src/recordings/recording-health.d.ts +77 -0
  1832. package/core/domain/src/recordings/recording-health.js +108 -0
  1833. package/core/domain/src/recordings/recording-not-found-error.d.ts +5 -0
  1834. package/core/domain/src/recordings/recording-not-found-error.js +9 -0
  1835. package/core/domain/src/recordings/recording-retention.d.ts +35 -0
  1836. package/core/domain/src/recordings/recording-retention.js +53 -0
  1837. package/core/domain/src/recordings/recording-settings.d.ts +50 -0
  1838. package/core/domain/src/recordings/recording-settings.js +81 -0
  1839. package/core/domain/src/recordings/run-recording.d.ts +65 -0
  1840. package/core/domain/src/recordings/run-recording.js +321 -0
  1841. package/core/domain/src/recordings/step-chain-windows.d.ts +35 -0
  1842. package/core/domain/src/recordings/step-chain-windows.js +50 -0
  1843. package/core/domain/src/recordings/step-console-errors.d.ts +38 -0
  1844. package/core/domain/src/recordings/step-console-errors.js +37 -0
  1845. package/core/domain/src/recordings/step-machine.d.ts +6 -0
  1846. package/core/domain/src/recordings/step-machine.js +15 -0
  1847. package/core/domain/src/recordings/step-speed-limits.d.ts +59 -0
  1848. package/core/domain/src/recordings/step-speed-limits.js +69 -0
  1849. package/core/domain/src/releases/index.d.ts +1 -0
  1850. package/core/domain/src/releases/index.js +3 -0
  1851. package/core/domain/src/releases/release-notes.d.ts +49 -0
  1852. package/core/domain/src/releases/release-notes.js +115 -0
  1853. package/core/domain/src/resources/generation.d.ts +15 -0
  1854. package/core/domain/src/resources/generation.js +26 -0
  1855. package/core/domain/src/resources/index.d.ts +3 -0
  1856. package/core/domain/src/resources/index.js +5 -0
  1857. package/core/domain/src/resources/resource-functions.d.ts +6 -0
  1858. package/core/domain/src/resources/resource-functions.js +12 -0
  1859. package/core/domain/src/resources/resource.d.ts +17 -0
  1860. package/core/domain/src/resources/resource.js +42 -0
  1861. package/core/domain/src/root-calls/index.d.ts +2 -0
  1862. package/core/domain/src/root-calls/index.js +4 -0
  1863. package/core/domain/src/root-calls/known-networks.d.ts +13 -0
  1864. package/core/domain/src/root-calls/known-networks.js +23 -0
  1865. package/core/domain/src/root-calls/root-call-policy.d.ts +44 -0
  1866. package/core/domain/src/root-calls/root-call-policy.js +59 -0
  1867. package/core/domain/src/runs/checkpoint.d.ts +20 -0
  1868. package/core/domain/src/runs/checkpoint.js +22 -0
  1869. package/core/domain/src/runs/evidence.d.ts +66 -0
  1870. package/core/domain/src/runs/evidence.js +126 -0
  1871. package/core/domain/src/runs/failure-description.d.ts +2 -0
  1872. package/core/domain/src/runs/failure-description.js +23 -0
  1873. package/core/domain/src/runs/failure-marker.d.ts +6 -0
  1874. package/core/domain/src/runs/failure-marker.js +32 -0
  1875. package/core/domain/src/runs/failure-reason.d.ts +52 -0
  1876. package/core/domain/src/runs/failure-reason.js +36 -0
  1877. package/core/domain/src/runs/host-bypass-assertion.d.ts +5 -0
  1878. package/core/domain/src/runs/host-bypass-assertion.js +18 -0
  1879. package/core/domain/src/runs/host-bypass-evidence.d.ts +106 -0
  1880. package/core/domain/src/runs/host-bypass-evidence.js +3 -0
  1881. package/core/domain/src/runs/host-bypass-verdict.d.ts +13 -0
  1882. package/core/domain/src/runs/host-bypass-verdict.js +30 -0
  1883. package/core/domain/src/runs/host-request-limits.d.ts +32 -0
  1884. package/core/domain/src/runs/host-request-limits.js +30 -0
  1885. package/core/domain/src/runs/index.d.ts +28 -0
  1886. package/core/domain/src/runs/index.js +30 -0
  1887. package/core/domain/src/runs/lab-failure.d.ts +11 -0
  1888. package/core/domain/src/runs/lab-failure.js +16 -0
  1889. package/core/domain/src/runs/merge-host-bypass-evidence.d.ts +3 -0
  1890. package/core/domain/src/runs/merge-host-bypass-evidence.js +112 -0
  1891. package/core/domain/src/runs/negative-control.d.ts +108 -0
  1892. package/core/domain/src/runs/negative-control.js +123 -0
  1893. package/core/domain/src/runs/race-jitter.d.ts +29 -0
  1894. package/core/domain/src/runs/race-jitter.js +36 -0
  1895. package/core/domain/src/runs/race-seed.d.ts +16 -0
  1896. package/core/domain/src/runs/race-seed.js +35 -0
  1897. package/core/domain/src/runs/run-bundle-data.d.ts +142 -0
  1898. package/core/domain/src/runs/run-bundle-data.js +6 -0
  1899. package/core/domain/src/runs/run-bundle-format-error.d.ts +5 -0
  1900. package/core/domain/src/runs/run-bundle-format-error.js +10 -0
  1901. package/core/domain/src/runs/run-bundle-refused-error.d.ts +7 -0
  1902. package/core/domain/src/runs/run-bundle-refused-error.js +12 -0
  1903. package/core/domain/src/runs/run-bundle-reproduction.d.ts +46 -0
  1904. package/core/domain/src/runs/run-bundle-reproduction.js +57 -0
  1905. package/core/domain/src/runs/run-bundle.d.ts +28 -0
  1906. package/core/domain/src/runs/run-bundle.js +166 -0
  1907. package/core/domain/src/runs/run-transition-error.d.ts +4 -0
  1908. package/core/domain/src/runs/run-transition-error.js +8 -0
  1909. package/core/domain/src/runs/run.d.ts +45 -0
  1910. package/core/domain/src/runs/run.js +91 -0
  1911. package/core/domain/src/runs/scenario-input-error.d.ts +13 -0
  1912. package/core/domain/src/runs/scenario-input-error.js +12 -0
  1913. package/core/domain/src/runs/step-failure.d.ts +18 -0
  1914. package/core/domain/src/runs/step-failure.js +69 -0
  1915. package/core/domain/src/runs/step-submissions.d.ts +73 -0
  1916. package/core/domain/src/runs/step-submissions.js +85 -0
  1917. package/core/domain/src/runs/stored-content.d.ts +17 -0
  1918. package/core/domain/src/runs/stored-content.js +47 -0
  1919. package/core/domain/src/runs/submitted-transaction.d.ts +63 -0
  1920. package/core/domain/src/runs/submitted-transaction.js +108 -0
  1921. package/core/domain/src/runs/transaction-landing.d.ts +82 -0
  1922. package/core/domain/src/runs/transaction-landing.js +76 -0
  1923. package/core/domain/src/runs/workers.d.ts +48 -0
  1924. package/core/domain/src/runs/workers.js +83 -0
  1925. package/core/domain/src/sentences/ambiguous-sentence-error.d.ts +7 -0
  1926. package/core/domain/src/sentences/ambiguous-sentence-error.js +13 -0
  1927. package/core/domain/src/sentences/ambiguous-split-error.d.ts +6 -0
  1928. package/core/domain/src/sentences/ambiguous-split-error.js +14 -0
  1929. package/core/domain/src/sentences/assertion-mutants.d.ts +77 -0
  1930. package/core/domain/src/sentences/assertion-mutants.js +112 -0
  1931. package/core/domain/src/sentences/characters.d.ts +29 -0
  1932. package/core/domain/src/sentences/characters.js +71 -0
  1933. package/core/domain/src/sentences/generic-sentences.d.ts +67 -0
  1934. package/core/domain/src/sentences/generic-sentences.js +66 -0
  1935. package/core/domain/src/sentences/index.d.ts +16 -0
  1936. package/core/domain/src/sentences/index.js +18 -0
  1937. package/core/domain/src/sentences/missing-sentence-error.d.ts +6 -0
  1938. package/core/domain/src/sentences/missing-sentence-error.js +11 -0
  1939. package/core/domain/src/sentences/output-reference.d.ts +14 -0
  1940. package/core/domain/src/sentences/output-reference.js +38 -0
  1941. package/core/domain/src/sentences/scenario-outputs.d.ts +33 -0
  1942. package/core/domain/src/sentences/scenario-outputs.js +36 -0
  1943. package/core/domain/src/sentences/scenario-plan.d.ts +54 -0
  1944. package/core/domain/src/sentences/scenario-plan.js +92 -0
  1945. package/core/domain/src/sentences/sentence-book.d.ts +132 -0
  1946. package/core/domain/src/sentences/sentence-book.js +387 -0
  1947. package/core/domain/src/sentences/sentence-error.d.ts +10 -0
  1948. package/core/domain/src/sentences/sentence-error.js +18 -0
  1949. package/core/domain/src/sentences/sentence-pattern.d.ts +42 -0
  1950. package/core/domain/src/sentences/sentence-pattern.js +139 -0
  1951. package/core/domain/src/sentences/table-error.d.ts +6 -0
  1952. package/core/domain/src/sentences/table-error.js +11 -0
  1953. package/core/domain/src/sentences/table-shape.d.ts +42 -0
  1954. package/core/domain/src/sentences/table-shape.js +121 -0
  1955. package/core/domain/src/sentences/time-advance.d.ts +36 -0
  1956. package/core/domain/src/sentences/time-advance.js +60 -0
  1957. package/core/domain/src/sentences/unresolved-reference-error.d.ts +5 -0
  1958. package/core/domain/src/sentences/unresolved-reference-error.js +9 -0
  1959. package/core/domain/src/shared/adapter-options.d.ts +17 -0
  1960. package/core/domain/src/shared/adapter-options.js +8 -0
  1961. package/core/domain/src/shared/block-unavailable-error.d.ts +15 -0
  1962. package/core/domain/src/shared/block-unavailable-error.js +11 -0
  1963. package/core/domain/src/shared/development-authority.d.ts +12 -0
  1964. package/core/domain/src/shared/development-authority.js +6 -0
  1965. package/core/domain/src/shared/index.d.ts +12 -0
  1966. package/core/domain/src/shared/index.js +14 -0
  1967. package/core/domain/src/shared/json-rpc-error.d.ts +14 -0
  1968. package/core/domain/src/shared/json-rpc-error.js +15 -0
  1969. package/core/domain/src/shared/missing-capability-error.d.ts +4 -0
  1970. package/core/domain/src/shared/missing-capability-error.js +8 -0
  1971. package/core/domain/src/shared/missing-host-tools-error.d.ts +5 -0
  1972. package/core/domain/src/shared/missing-host-tools-error.js +10 -0
  1973. package/core/domain/src/shared/missing-route-error.d.ts +6 -0
  1974. package/core/domain/src/shared/missing-route-error.js +12 -0
  1975. package/core/domain/src/shared/pending-check-error.d.ts +9 -0
  1976. package/core/domain/src/shared/pending-check-error.js +11 -0
  1977. package/core/domain/src/shared/secret-uri.d.ts +27 -0
  1978. package/core/domain/src/shared/secret-uri.js +46 -0
  1979. package/core/domain/src/shared/sibling-module.d.ts +6 -0
  1980. package/core/domain/src/shared/sibling-module.js +9 -0
  1981. package/core/domain/src/shared/unsupported-capability-error.d.ts +6 -0
  1982. package/core/domain/src/shared/unsupported-capability-error.js +11 -0
  1983. package/core/domain/src/shared/unsupported-host-operation.d.ts +7 -0
  1984. package/core/domain/src/shared/unsupported-host-operation.js +14 -0
  1985. package/core/domain/src/statements/content-check.d.ts +16 -0
  1986. package/core/domain/src/statements/content-check.js +52 -0
  1987. package/core/domain/src/statements/index.d.ts +2 -0
  1988. package/core/domain/src/statements/index.js +4 -0
  1989. package/core/domain/src/statements/statement.d.ts +44 -0
  1990. package/core/domain/src/statements/statement.js +118 -0
  1991. package/core/domain/src/suites/bisect-plan.d.ts +87 -0
  1992. package/core/domain/src/suites/bisect-plan.js +76 -0
  1993. package/core/domain/src/suites/bisection.d.ts +73 -0
  1994. package/core/domain/src/suites/bisection.js +113 -0
  1995. package/core/domain/src/suites/change-scopes.d.ts +38 -0
  1996. package/core/domain/src/suites/change-scopes.js +70 -0
  1997. package/core/domain/src/suites/compatibility-notice.d.ts +23 -0
  1998. package/core/domain/src/suites/compatibility-notice.js +115 -0
  1999. package/core/domain/src/suites/compatibility.d.ts +129 -0
  2000. package/core/domain/src/suites/compatibility.js +291 -0
  2001. package/core/domain/src/suites/index.d.ts +15 -0
  2002. package/core/domain/src/suites/index.js +17 -0
  2003. package/core/domain/src/suites/mode-data.d.ts +32 -0
  2004. package/core/domain/src/suites/mode-data.js +3 -0
  2005. package/core/domain/src/suites/path-glob.d.ts +1 -0
  2006. package/core/domain/src/suites/path-glob.js +21 -0
  2007. package/core/domain/src/suites/suite-budget.d.ts +2 -0
  2008. package/core/domain/src/suites/suite-budget.js +15 -0
  2009. package/core/domain/src/suites/suite-config-error.d.ts +4 -0
  2010. package/core/domain/src/suites/suite-config-error.js +8 -0
  2011. package/core/domain/src/suites/suite-config.d.ts +48 -0
  2012. package/core/domain/src/suites/suite-config.js +184 -0
  2013. package/core/domain/src/suites/suite-data.d.ts +52 -0
  2014. package/core/domain/src/suites/suite-data.js +3 -0
  2015. package/core/domain/src/suites/suite-evidence-error.d.ts +20 -0
  2016. package/core/domain/src/suites/suite-evidence-error.js +14 -0
  2017. package/core/domain/src/suites/suite-plan.d.ts +88 -0
  2018. package/core/domain/src/suites/suite-plan.js +123 -0
  2019. package/core/domain/src/suites/suite-run-summary.d.ts +70 -0
  2020. package/core/domain/src/suites/suite-run-summary.js +22 -0
  2021. package/core/domain/src/suites/suite-verdict.d.ts +22 -0
  2022. package/core/domain/src/suites/suite-verdict.js +32 -0
  2023. package/core/domain/src/tools/index.d.ts +1 -0
  2024. package/core/domain/src/tools/index.js +3 -0
  2025. package/core/domain/src/tools/tool-command.d.ts +18 -0
  2026. package/core/domain/src/tools/tool-command.js +61 -0
  2027. package/core/domain/src/versions/component-id.d.ts +17 -0
  2028. package/core/domain/src/versions/component-id.js +40 -0
  2029. package/core/domain/src/versions/digest.d.ts +28 -0
  2030. package/core/domain/src/versions/digest.js +51 -0
  2031. package/core/domain/src/versions/environment-versions.d.ts +41 -0
  2032. package/core/domain/src/versions/environment-versions.js +38 -0
  2033. package/core/domain/src/versions/fork-snapshot.d.ts +16 -0
  2034. package/core/domain/src/versions/fork-snapshot.js +3 -0
  2035. package/core/domain/src/versions/host-route.d.ts +89 -0
  2036. package/core/domain/src/versions/host-route.js +74 -0
  2037. package/core/domain/src/versions/index.d.ts +21 -0
  2038. package/core/domain/src/versions/index.js +23 -0
  2039. package/core/domain/src/versions/lab-lock.d.ts +48 -0
  2040. package/core/domain/src/versions/lab-lock.js +98 -0
  2041. package/core/domain/src/versions/lock-promotion.d.ts +48 -0
  2042. package/core/domain/src/versions/lock-promotion.js +63 -0
  2043. package/core/domain/src/versions/lock-proposal-refusal.d.ts +21 -0
  2044. package/core/domain/src/versions/lock-proposal-refusal.js +41 -0
  2045. package/core/domain/src/versions/locked-component.d.ts +80 -0
  2046. package/core/domain/src/versions/locked-component.js +146 -0
  2047. package/core/domain/src/versions/recovery-policy.d.ts +33 -0
  2048. package/core/domain/src/versions/recovery-policy.js +26 -0
  2049. package/core/domain/src/versions/release-artifact.d.ts +46 -0
  2050. package/core/domain/src/versions/release-artifact.js +70 -0
  2051. package/core/domain/src/versions/release-version.d.ts +17 -0
  2052. package/core/domain/src/versions/release-version.js +52 -0
  2053. package/core/domain/src/versions/resolved-runtime.d.ts +103 -0
  2054. package/core/domain/src/versions/resolved-runtime.js +107 -0
  2055. package/core/domain/src/versions/snapshot-freshness.d.ts +26 -0
  2056. package/core/domain/src/versions/snapshot-freshness.js +25 -0
  2057. package/core/domain/src/versions/version-drift.d.ts +29 -0
  2058. package/core/domain/src/versions/version-drift.js +37 -0
  2059. package/core/domain/src/versions/version-error.d.ts +17 -0
  2060. package/core/domain/src/versions/version-error.js +10 -0
  2061. package/core/domain/src/versions/version-policy.d.ts +19 -0
  2062. package/core/domain/src/versions/version-policy.js +37 -0
  2063. package/core/domain/src/versions/version-resolution.d.ts +103 -0
  2064. package/core/domain/src/versions/version-resolution.js +111 -0
  2065. package/core/domain/src/versions/version-selector.d.ts +58 -0
  2066. package/core/domain/src/versions/version-selector.js +134 -0
  2067. package/core/domain/src/versions/version-workspace-key.d.ts +18 -0
  2068. package/core/domain/src/versions/version-workspace-key.js +41 -0
  2069. package/core/domain/src/versions/versioned-workspace.d.ts +43 -0
  2070. package/core/domain/src/versions/versioned-workspace.js +63 -0
  2071. package/core/lab/README.md +1012 -0
  2072. package/core/lab/src/activity/types.d.ts +1 -0
  2073. package/core/lab/src/activity/types.js +3 -0
  2074. package/core/lab/src/chain/index.d.ts +2 -0
  2075. package/core/lab/src/chain/index.js +4 -0
  2076. package/core/lab/src/chain/transaction-mode-schema.d.ts +11 -0
  2077. package/core/lab/src/chain/transaction-mode-schema.js +5 -0
  2078. package/core/lab/src/host/index.d.ts +1 -0
  2079. package/core/lab/src/host/index.js +3 -0
  2080. package/core/lab/src/identity/index.d.ts +1 -0
  2081. package/core/lab/src/identity/index.js +3 -0
  2082. package/core/lab/src/index.d.ts +2 -0
  2083. package/core/lab/src/index.js +4 -0
  2084. package/core/lab/src/run/index.d.ts +1 -0
  2085. package/core/lab/src/run/index.js +3 -0
  2086. package/core/lab/src/steps.d.ts +1 -0
  2087. package/core/lab/src/steps.js +3 -0
  2088. package/core/lab/src/topology.d.ts +128 -0
  2089. package/core/lab/src/topology.js +58 -0
  2090. package/core/ports/README.md +458 -0
  2091. package/core/ports/src/driven/browser/app-surface.d.ts +41 -0
  2092. package/core/ports/src/driven/browser/app-surface.js +3 -0
  2093. package/core/ports/src/driven/browser/browser.d.ts +79 -0
  2094. package/core/ports/src/driven/browser/browser.js +3 -0
  2095. package/core/ports/src/driven/browser/conditions.d.ts +24 -0
  2096. package/core/ports/src/driven/browser/conditions.js +3 -0
  2097. package/core/ports/src/driven/browser/index.d.ts +6 -0
  2098. package/core/ports/src/driven/browser/index.js +3 -0
  2099. package/core/ports/src/driven/browser/locator.d.ts +55 -0
  2100. package/core/ports/src/driven/browser/locator.js +3 -0
  2101. package/core/ports/src/driven/browser/page.d.ts +71 -0
  2102. package/core/ports/src/driven/browser/page.js +3 -0
  2103. package/core/ports/src/driven/browser/route.d.ts +45 -0
  2104. package/core/ports/src/driven/browser/route.js +3 -0
  2105. package/core/ports/src/driven/chain/bulletin-reader.d.ts +9 -0
  2106. package/core/ports/src/driven/chain/bulletin-reader.js +3 -0
  2107. package/core/ports/src/driven/chain/chain-access.d.ts +37 -0
  2108. package/core/ports/src/driven/chain/chain-access.js +3 -0
  2109. package/core/ports/src/driven/chain/chain-history.d.ts +170 -0
  2110. package/core/ports/src/driven/chain/chain-history.js +3 -0
  2111. package/core/ports/src/driven/chain/chain-readers.d.ts +8 -0
  2112. package/core/ports/src/driven/chain/chain-readers.js +3 -0
  2113. package/core/ports/src/driven/chain/index.d.ts +11 -0
  2114. package/core/ports/src/driven/chain/index.js +3 -0
  2115. package/core/ports/src/driven/chain/key-derivation.d.ts +22 -0
  2116. package/core/ports/src/driven/chain/key-derivation.js +3 -0
  2117. package/core/ports/src/driven/chain/receipt-validator.d.ts +17 -0
  2118. package/core/ports/src/driven/chain/receipt-validator.js +3 -0
  2119. package/core/ports/src/driven/chain/receipt.d.ts +33 -0
  2120. package/core/ports/src/driven/chain/receipt.js +3 -0
  2121. package/core/ports/src/driven/chain/runtime-fingerprint.d.ts +12 -0
  2122. package/core/ports/src/driven/chain/runtime-fingerprint.js +3 -0
  2123. package/core/ports/src/driven/chain/signer.d.ts +16 -0
  2124. package/core/ports/src/driven/chain/signer.js +3 -0
  2125. package/core/ports/src/driven/chain/statement-store-reader.d.ts +53 -0
  2126. package/core/ports/src/driven/chain/statement-store-reader.js +3 -0
  2127. package/core/ports/src/driven/chain/transaction-submitter.d.ts +104 -0
  2128. package/core/ports/src/driven/chain/transaction-submitter.js +3 -0
  2129. package/core/ports/src/driven/deploy/content-archiver.d.ts +21 -0
  2130. package/core/ports/src/driven/deploy/content-archiver.js +3 -0
  2131. package/core/ports/src/driven/deploy/deployer.d.ts +101 -0
  2132. package/core/ports/src/driven/deploy/deployer.js +3 -0
  2133. package/core/ports/src/driven/deploy/destination-directory.d.ts +15 -0
  2134. package/core/ports/src/driven/deploy/destination-directory.js +3 -0
  2135. package/core/ports/src/driven/deploy/destination-server.d.ts +25 -0
  2136. package/core/ports/src/driven/deploy/destination-server.js +3 -0
  2137. package/core/ports/src/driven/deploy/index.d.ts +5 -0
  2138. package/core/ports/src/driven/deploy/index.js +3 -0
  2139. package/core/ports/src/driven/deploy/name-resolver.d.ts +11 -0
  2140. package/core/ports/src/driven/deploy/name-resolver.js +3 -0
  2141. package/core/ports/src/driven/environment/environment-adapter-factory.d.ts +21 -0
  2142. package/core/ports/src/driven/environment/environment-adapter-factory.js +3 -0
  2143. package/core/ports/src/driven/environment/environment-time.d.ts +110 -0
  2144. package/core/ports/src/driven/environment/environment-time.js +3 -0
  2145. package/core/ports/src/driven/environment/environment-tooling.d.ts +51 -0
  2146. package/core/ports/src/driven/environment/environment-tooling.js +3 -0
  2147. package/core/ports/src/driven/environment/index.d.ts +6 -0
  2148. package/core/ports/src/driven/environment/index.js +3 -0
  2149. package/core/ports/src/driven/environment/running-environment.d.ts +267 -0
  2150. package/core/ports/src/driven/environment/running-environment.js +3 -0
  2151. package/core/ports/src/driven/environment/start-phases.d.ts +34 -0
  2152. package/core/ports/src/driven/environment/start-phases.js +3 -0
  2153. package/core/ports/src/driven/environment/topology-adapter-factory.d.ts +52 -0
  2154. package/core/ports/src/driven/environment/topology-adapter-factory.js +3 -0
  2155. package/core/ports/src/driven/factory/adapter-flag.d.ts +21 -0
  2156. package/core/ports/src/driven/factory/adapter-flag.js +3 -0
  2157. package/core/ports/src/driven/factory/index.d.ts +2 -0
  2158. package/core/ports/src/driven/factory/index.js +3 -0
  2159. package/core/ports/src/driven/factory/options-schema.d.ts +21 -0
  2160. package/core/ports/src/driven/factory/options-schema.js +3 -0
  2161. package/core/ports/src/driven/features/custom-step-source.d.ts +33 -0
  2162. package/core/ports/src/driven/features/custom-step-source.js +3 -0
  2163. package/core/ports/src/driven/features/feature-runner.d.ts +193 -0
  2164. package/core/ports/src/driven/features/feature-runner.js +3 -0
  2165. package/core/ports/src/driven/features/feature-source.d.ts +22 -0
  2166. package/core/ports/src/driven/features/feature-source.js +3 -0
  2167. package/core/ports/src/driven/features/index.d.ts +3 -0
  2168. package/core/ports/src/driven/features/index.js +3 -0
  2169. package/core/ports/src/driven/host/host-adapter-factory.d.ts +111 -0
  2170. package/core/ports/src/driven/host/host-adapter-factory.js +3 -0
  2171. package/core/ports/src/driven/host/host-provider.d.ts +71 -0
  2172. package/core/ports/src/driven/host/host-provider.js +3 -0
  2173. package/core/ports/src/driven/host/host-session.d.ts +289 -0
  2174. package/core/ports/src/driven/host/host-session.js +3 -0
  2175. package/core/ports/src/driven/host/host-tool-source.d.ts +19 -0
  2176. package/core/ports/src/driven/host/host-tool-source.js +3 -0
  2177. package/core/ports/src/driven/host/host-upstream.d.ts +24 -0
  2178. package/core/ports/src/driven/host/host-upstream.js +3 -0
  2179. package/core/ports/src/driven/host/host-verifier.d.ts +95 -0
  2180. package/core/ports/src/driven/host/host-verifier.js +3 -0
  2181. package/core/ports/src/driven/host/index.d.ts +7 -0
  2182. package/core/ports/src/driven/host/index.js +3 -0
  2183. package/core/ports/src/driven/identity/identity-provisioner.d.ts +23 -0
  2184. package/core/ports/src/driven/identity/identity-provisioner.js +3 -0
  2185. package/core/ports/src/driven/identity/index.d.ts +2 -0
  2186. package/core/ports/src/driven/identity/index.js +3 -0
  2187. package/core/ports/src/driven/identity/product-account-derivation.d.ts +23 -0
  2188. package/core/ports/src/driven/identity/product-account-derivation.js +3 -0
  2189. package/core/ports/src/driven/lab/client-bundles.d.ts +13 -0
  2190. package/core/ports/src/driven/lab/client-bundles.js +3 -0
  2191. package/core/ports/src/driven/lab/index.d.ts +7 -0
  2192. package/core/ports/src/driven/lab/index.js +3 -0
  2193. package/core/ports/src/driven/lab/lab-configuration.d.ts +86 -0
  2194. package/core/ports/src/driven/lab/lab-configuration.js +3 -0
  2195. package/core/ports/src/driven/lab/lab-definition-source.d.ts +16 -0
  2196. package/core/ports/src/driven/lab/lab-definition-source.js +3 -0
  2197. package/core/ports/src/driven/lab/lab-environment.d.ts +505 -0
  2198. package/core/ports/src/driven/lab/lab-environment.js +3 -0
  2199. package/core/ports/src/driven/lab/lab-sentences.d.ts +113 -0
  2200. package/core/ports/src/driven/lab/lab-sentences.js +3 -0
  2201. package/core/ports/src/driven/lab/loaded-lab.d.ts +297 -0
  2202. package/core/ports/src/driven/lab/loaded-lab.js +3 -0
  2203. package/core/ports/src/driven/lab/scenario.d.ts +137 -0
  2204. package/core/ports/src/driven/lab/scenario.js +3 -0
  2205. package/core/ports/src/driven/notify/index.d.ts +1 -0
  2206. package/core/ports/src/driven/notify/index.js +3 -0
  2207. package/core/ports/src/driven/notify/notifier.d.ts +32 -0
  2208. package/core/ports/src/driven/notify/notifier.js +3 -0
  2209. package/core/ports/src/driven/recording/console-watch.d.ts +28 -0
  2210. package/core/ports/src/driven/recording/console-watch.js +3 -0
  2211. package/core/ports/src/driven/recording/demo-ports.d.ts +53 -0
  2212. package/core/ports/src/driven/recording/demo-ports.js +3 -0
  2213. package/core/ports/src/driven/recording/frame-capture.d.ts +92 -0
  2214. package/core/ports/src/driven/recording/frame-capture.js +3 -0
  2215. package/core/ports/src/driven/recording/index.d.ts +6 -0
  2216. package/core/ports/src/driven/recording/index.js +3 -0
  2217. package/core/ports/src/driven/recording/journey-docs-store.d.ts +35 -0
  2218. package/core/ports/src/driven/recording/journey-docs-store.js +3 -0
  2219. package/core/ports/src/driven/recording/recording-store.d.ts +39 -0
  2220. package/core/ports/src/driven/recording/recording-store.js +3 -0
  2221. package/core/ports/src/driven/recording/step-check-ports.d.ts +29 -0
  2222. package/core/ports/src/driven/recording/step-check-ports.js +3 -0
  2223. package/core/ports/src/driven/storage/breakpoint-store.d.ts +13 -0
  2224. package/core/ports/src/driven/storage/breakpoint-store.js +3 -0
  2225. package/core/ports/src/driven/storage/environment-option-choices.d.ts +4 -0
  2226. package/core/ports/src/driven/storage/environment-option-choices.js +3 -0
  2227. package/core/ports/src/driven/storage/evidence-journal.d.ts +10 -0
  2228. package/core/ports/src/driven/storage/evidence-journal.js +3 -0
  2229. package/core/ports/src/driven/storage/fixture-archives.d.ts +61 -0
  2230. package/core/ports/src/driven/storage/fixture-archives.js +3 -0
  2231. package/core/ports/src/driven/storage/fixture-source.d.ts +53 -0
  2232. package/core/ports/src/driven/storage/fixture-source.js +3 -0
  2233. package/core/ports/src/driven/storage/fixture-store.d.ts +69 -0
  2234. package/core/ports/src/driven/storage/fixture-store.js +3 -0
  2235. package/core/ports/src/driven/storage/index.d.ts +12 -0
  2236. package/core/ports/src/driven/storage/index.js +3 -0
  2237. package/core/ports/src/driven/storage/lab-settings-store.d.ts +8 -0
  2238. package/core/ports/src/driven/storage/lab-settings-store.js +3 -0
  2239. package/core/ports/src/driven/storage/rpc-choices.d.ts +11 -0
  2240. package/core/ports/src/driven/storage/rpc-choices.js +3 -0
  2241. package/core/ports/src/driven/storage/run-bundle-archives.d.ts +46 -0
  2242. package/core/ports/src/driven/storage/run-bundle-archives.js +3 -0
  2243. package/core/ports/src/driven/storage/run-manifest-store.d.ts +18 -0
  2244. package/core/ports/src/driven/storage/run-manifest-store.js +3 -0
  2245. package/core/ports/src/driven/storage/running-lab.d.ts +42 -0
  2246. package/core/ports/src/driven/storage/running-lab.js +3 -0
  2247. package/core/ports/src/driven/storage/suite-evidence-bundles.d.ts +55 -0
  2248. package/core/ports/src/driven/storage/suite-evidence-bundles.js +3 -0
  2249. package/core/ports/src/driven/system/app-proxy.d.ts +123 -0
  2250. package/core/ports/src/driven/system/app-proxy.js +3 -0
  2251. package/core/ports/src/driven/system/chain-gate.d.ts +41 -0
  2252. package/core/ports/src/driven/system/chain-gate.js +3 -0
  2253. package/core/ports/src/driven/system/change-source.d.ts +69 -0
  2254. package/core/ports/src/driven/system/change-source.js +3 -0
  2255. package/core/ports/src/driven/system/clock.d.ts +13 -0
  2256. package/core/ports/src/driven/system/clock.js +3 -0
  2257. package/core/ports/src/driven/system/command-runner.d.ts +33 -0
  2258. package/core/ports/src/driven/system/command-runner.js +3 -0
  2259. package/core/ports/src/driven/system/conditioned-links.d.ts +20 -0
  2260. package/core/ports/src/driven/system/conditioned-links.js +3 -0
  2261. package/core/ports/src/driven/system/connection-monitor.d.ts +40 -0
  2262. package/core/ports/src/driven/system/connection-monitor.js +3 -0
  2263. package/core/ports/src/driven/system/document-headers.d.ts +9 -0
  2264. package/core/ports/src/driven/system/document-headers.js +3 -0
  2265. package/core/ports/src/driven/system/environment-variables.d.ts +9 -0
  2266. package/core/ports/src/driven/system/environment-variables.js +3 -0
  2267. package/core/ports/src/driven/system/file-system.d.ts +41 -0
  2268. package/core/ports/src/driven/system/file-system.js +3 -0
  2269. package/core/ports/src/driven/system/http-probe.d.ts +20 -0
  2270. package/core/ports/src/driven/system/http-probe.js +3 -0
  2271. package/core/ports/src/driven/system/id-generator.d.ts +5 -0
  2272. package/core/ports/src/driven/system/id-generator.js +3 -0
  2273. package/core/ports/src/driven/system/index.d.ts +27 -0
  2274. package/core/ports/src/driven/system/index.js +3 -0
  2275. package/core/ports/src/driven/system/json-rpc-client.d.ts +15 -0
  2276. package/core/ports/src/driven/system/json-rpc-client.js +3 -0
  2277. package/core/ports/src/driven/system/lock-manager.d.ts +55 -0
  2278. package/core/ports/src/driven/system/lock-manager.js +3 -0
  2279. package/core/ports/src/driven/system/logger.d.ts +8 -0
  2280. package/core/ports/src/driven/system/logger.js +3 -0
  2281. package/core/ports/src/driven/system/machine-metrics.d.ts +38 -0
  2282. package/core/ports/src/driven/system/machine-metrics.js +3 -0
  2283. package/core/ports/src/driven/system/os-ports.d.ts +12 -0
  2284. package/core/ports/src/driven/system/os-ports.js +3 -0
  2285. package/core/ports/src/driven/system/port-allocator.d.ts +46 -0
  2286. package/core/ports/src/driven/system/port-allocator.js +3 -0
  2287. package/core/ports/src/driven/system/process-runner.d.ts +133 -0
  2288. package/core/ports/src/driven/system/process-runner.js +3 -0
  2289. package/core/ports/src/driven/system/process-sandbox.d.ts +61 -0
  2290. package/core/ports/src/driven/system/process-sandbox.js +3 -0
  2291. package/core/ports/src/driven/system/redactor.d.ts +12 -0
  2292. package/core/ports/src/driven/system/redactor.js +3 -0
  2293. package/core/ports/src/driven/system/source-watcher.d.ts +29 -0
  2294. package/core/ports/src/driven/system/source-watcher.js +3 -0
  2295. package/core/ports/src/driven/system/stdio-worker.d.ts +21 -0
  2296. package/core/ports/src/driven/system/stdio-worker.js +3 -0
  2297. package/core/ports/src/driven/system/sync-command-runner.d.ts +20 -0
  2298. package/core/ports/src/driven/system/sync-command-runner.js +3 -0
  2299. package/core/ports/src/driven/system/system-ports.d.ts +90 -0
  2300. package/core/ports/src/driven/system/system-ports.js +3 -0
  2301. package/core/ports/src/driven/system/terminal-command-runner.d.ts +22 -0
  2302. package/core/ports/src/driven/system/terminal-command-runner.js +3 -0
  2303. package/core/ports/src/driven/system/tree-cloner.d.ts +19 -0
  2304. package/core/ports/src/driven/system/tree-cloner.js +3 -0
  2305. package/core/ports/src/driven/versions/artifact-store.d.ts +47 -0
  2306. package/core/ports/src/driven/versions/artifact-store.js +3 -0
  2307. package/core/ports/src/driven/versions/http-client.d.ts +22 -0
  2308. package/core/ports/src/driven/versions/http-client.js +3 -0
  2309. package/core/ports/src/driven/versions/index.d.ts +6 -0
  2310. package/core/ports/src/driven/versions/index.js +3 -0
  2311. package/core/ports/src/driven/versions/lab-versions-declaration.d.ts +55 -0
  2312. package/core/ports/src/driven/versions/lab-versions-declaration.js +3 -0
  2313. package/core/ports/src/driven/versions/lock-store.d.ts +29 -0
  2314. package/core/ports/src/driven/versions/lock-store.js +3 -0
  2315. package/core/ports/src/driven/versions/version-policy-source.d.ts +12 -0
  2316. package/core/ports/src/driven/versions/version-policy-source.js +3 -0
  2317. package/core/ports/src/driven/versions/version-source.d.ts +58 -0
  2318. package/core/ports/src/driven/versions/version-source.js +3 -0
  2319. package/core/ports/src/driving/activity.d.ts +244 -0
  2320. package/core/ports/src/driving/activity.js +3 -0
  2321. package/core/ports/src/driving/app-builds.d.ts +91 -0
  2322. package/core/ports/src/driving/app-builds.js +3 -0
  2323. package/core/ports/src/driving/bisect.d.ts +42 -0
  2324. package/core/ports/src/driving/bisect.js +3 -0
  2325. package/core/ports/src/driving/breakpoints.d.ts +148 -0
  2326. package/core/ports/src/driving/breakpoints.js +3 -0
  2327. package/core/ports/src/driving/builder.d.ts +92 -0
  2328. package/core/ports/src/driving/builder.js +3 -0
  2329. package/core/ports/src/driving/chain-console.d.ts +52 -0
  2330. package/core/ports/src/driving/chain-console.js +3 -0
  2331. package/core/ports/src/driving/demo.d.ts +47 -0
  2332. package/core/ports/src/driving/demo.js +3 -0
  2333. package/core/ports/src/driving/environment-rpc.d.ts +16 -0
  2334. package/core/ports/src/driving/environment-rpc.js +3 -0
  2335. package/core/ports/src/driving/environment-tooling.d.ts +40 -0
  2336. package/core/ports/src/driving/environment-tooling.js +3 -0
  2337. package/core/ports/src/driving/exploration.d.ts +58 -0
  2338. package/core/ports/src/driving/exploration.js +3 -0
  2339. package/core/ports/src/driving/feature-session.d.ts +269 -0
  2340. package/core/ports/src/driving/feature-session.js +3 -0
  2341. package/core/ports/src/driving/features.d.ts +260 -0
  2342. package/core/ports/src/driving/features.js +3 -0
  2343. package/core/ports/src/driving/fixture-maintenance.d.ts +95 -0
  2344. package/core/ports/src/driving/fixture-maintenance.js +3 -0
  2345. package/core/ports/src/driving/fixture-sharing.d.ts +159 -0
  2346. package/core/ports/src/driving/fixture-sharing.js +3 -0
  2347. package/core/ports/src/driving/fixtures.d.ts +149 -0
  2348. package/core/ports/src/driving/fixtures.js +3 -0
  2349. package/core/ports/src/driving/hosts.d.ts +49 -0
  2350. package/core/ports/src/driving/hosts.js +3 -0
  2351. package/core/ports/src/driving/index.d.ts +36 -0
  2352. package/core/ports/src/driving/index.js +3 -0
  2353. package/core/ports/src/driving/journeys.d.ts +45 -0
  2354. package/core/ports/src/driving/journeys.js +3 -0
  2355. package/core/ports/src/driving/lab-coverage.d.ts +47 -0
  2356. package/core/ports/src/driving/lab-coverage.js +3 -0
  2357. package/core/ports/src/driving/lab-lint.d.ts +47 -0
  2358. package/core/ports/src/driving/lab-lint.js +3 -0
  2359. package/core/ports/src/driving/lab-mutations.d.ts +16 -0
  2360. package/core/ports/src/driving/lab-mutations.js +3 -0
  2361. package/core/ports/src/driving/lab-registry.d.ts +236 -0
  2362. package/core/ports/src/driving/lab-registry.js +3 -0
  2363. package/core/ports/src/driving/lab-runtime.d.ts +656 -0
  2364. package/core/ports/src/driving/lab-runtime.js +3 -0
  2365. package/core/ports/src/driving/lab-settings.d.ts +29 -0
  2366. package/core/ports/src/driving/lab-settings.js +3 -0
  2367. package/core/ports/src/driving/lab-snapshot.d.ts +361 -0
  2368. package/core/ports/src/driving/lab-snapshot.js +3 -0
  2369. package/core/ports/src/driving/load.d.ts +22 -0
  2370. package/core/ports/src/driving/load.js +3 -0
  2371. package/core/ports/src/driving/navigation-view.d.ts +23 -0
  2372. package/core/ports/src/driving/navigation-view.js +3 -0
  2373. package/core/ports/src/driving/recordings.d.ts +103 -0
  2374. package/core/ports/src/driving/recordings.js +3 -0
  2375. package/core/ports/src/driving/reports.d.ts +411 -0
  2376. package/core/ports/src/driving/reports.js +3 -0
  2377. package/core/ports/src/driving/resolved-config.d.ts +52 -0
  2378. package/core/ports/src/driving/resolved-config.js +3 -0
  2379. package/core/ports/src/driving/run-bundles.d.ts +135 -0
  2380. package/core/ports/src/driving/run-bundles.js +3 -0
  2381. package/core/ports/src/driving/suites.d.ts +188 -0
  2382. package/core/ports/src/driving/suites.js +3 -0
  2383. package/core/ports/src/driving/tools.d.ts +279 -0
  2384. package/core/ports/src/driving/tools.js +3 -0
  2385. package/core/ports/src/driving/ui-extensions.d.ts +77 -0
  2386. package/core/ports/src/driving/ui-extensions.js +3 -0
  2387. package/core/ports/src/driving/versions.d.ts +280 -0
  2388. package/core/ports/src/driving/versions.js +3 -0
  2389. package/core/ports/src/driving/what-if.d.ts +64 -0
  2390. package/core/ports/src/driving/what-if.js +3 -0
  2391. package/core/ports/src/driving/workers.d.ts +52 -0
  2392. package/core/ports/src/driving/workers.js +3 -0
  2393. package/core/ports/src/index.d.ts +15 -0
  2394. package/core/ports/src/index.js +17 -0
  2395. package/entrypoints/cli/README.md +895 -0
  2396. package/entrypoints/cli/ai-kit/agents/product-lab-e2e-debugger.yaml +32 -0
  2397. package/entrypoints/cli/ai-kit/agents/product-lab-scenario-author.yaml +44 -0
  2398. package/entrypoints/cli/ai-kit/agents-md.md +52 -0
  2399. package/entrypoints/cli/ai-kit/mcp.json +11 -0
  2400. package/entrypoints/cli/ai-kit/skills/product-lab-app/SKILL.md +101 -0
  2401. package/entrypoints/cli/ai-kit/skills/product-lab-debug/SKILL.md +54 -0
  2402. package/entrypoints/cli/ai-kit/skills/product-lab-integration/SKILL.md +116 -0
  2403. package/entrypoints/cli/ai-kit/skills/product-lab-integration/references/notes-example.md +192 -0
  2404. package/entrypoints/cli/ai-kit/skills/product-lab-integration/references/notes-lab.md +5700 -0
  2405. package/entrypoints/cli/ai-kit/skills/product-lab-scenario/SKILL.md +122 -0
  2406. package/entrypoints/cli/ai-kit/skills/product-lab-setup/SKILL.md +113 -0
  2407. package/entrypoints/cli/ai-kit/skills/product-lab-setup/references/minimal-lab.md +480 -0
  2408. package/entrypoints/cli/ai-kit/skills/product-lab-test-ids/SKILL.md +79 -0
  2409. package/entrypoints/cli/bin/esbuild-own-session.sh +8 -0
  2410. package/entrypoints/cli/bin/esbuild-session.mjs +70 -0
  2411. package/entrypoints/cli/bin/product-lab.mjs +42 -0
  2412. package/entrypoints/cli/src/agents.d.ts +65 -0
  2413. package/entrypoints/cli/src/agents.js +96 -0
  2414. package/entrypoints/cli/src/ai/command.d.ts +3 -0
  2415. package/entrypoints/cli/src/ai/command.js +79 -0
  2416. package/entrypoints/cli/src/ai/doctor.d.ts +17 -0
  2417. package/entrypoints/cli/src/ai/doctor.js +117 -0
  2418. package/entrypoints/cli/src/ai/examples.d.ts +18 -0
  2419. package/entrypoints/cli/src/ai/examples.js +69 -0
  2420. package/entrypoints/cli/src/ai/init.d.ts +41 -0
  2421. package/entrypoints/cli/src/ai/init.js +229 -0
  2422. package/entrypoints/cli/src/ai/kit-reference.d.ts +46 -0
  2423. package/entrypoints/cli/src/ai/kit-reference.js +300 -0
  2424. package/entrypoints/cli/src/ai/kit.d.ts +37 -0
  2425. package/entrypoints/cli/src/ai/kit.js +73 -0
  2426. package/entrypoints/cli/src/ai/policy.d.ts +28 -0
  2427. package/entrypoints/cli/src/ai/policy.js +56 -0
  2428. package/entrypoints/cli/src/ai/render.d.ts +68 -0
  2429. package/entrypoints/cli/src/ai/render.js +200 -0
  2430. package/entrypoints/cli/src/ai/status.d.ts +21 -0
  2431. package/entrypoints/cli/src/ai/status.js +41 -0
  2432. package/entrypoints/cli/src/ai/sync.d.ts +39 -0
  2433. package/entrypoints/cli/src/ai/sync.js +256 -0
  2434. package/entrypoints/cli/src/bisect-command.d.ts +4 -0
  2435. package/entrypoints/cli/src/bisect-command.js +109 -0
  2436. package/entrypoints/cli/src/breakpoints-command.d.ts +4 -0
  2437. package/entrypoints/cli/src/breakpoints-command.js +67 -0
  2438. package/entrypoints/cli/src/bundle-command.d.ts +5 -0
  2439. package/entrypoints/cli/src/bundle-command.js +74 -0
  2440. package/entrypoints/cli/src/checkout.d.ts +6 -0
  2441. package/entrypoints/cli/src/checkout.js +12 -0
  2442. package/entrypoints/cli/src/cli-app.d.ts +57 -0
  2443. package/entrypoints/cli/src/cli-app.js +506 -0
  2444. package/entrypoints/cli/src/cli-host-release.d.ts +22 -0
  2445. package/entrypoints/cli/src/cli-host-release.js +23 -0
  2446. package/entrypoints/cli/src/commands/chain-day-ended.d.ts +12 -0
  2447. package/entrypoints/cli/src/commands/chain-day-ended.js +33 -0
  2448. package/entrypoints/cli/src/commands/check.d.ts +13 -0
  2449. package/entrypoints/cli/src/commands/check.js +36 -0
  2450. package/entrypoints/cli/src/commands/dev.d.ts +149 -0
  2451. package/entrypoints/cli/src/commands/dev.js +327 -0
  2452. package/entrypoints/cli/src/config-command.d.ts +7 -0
  2453. package/entrypoints/cli/src/config-command.js +69 -0
  2454. package/entrypoints/cli/src/coverage-command.d.ts +4 -0
  2455. package/entrypoints/cli/src/coverage-command.js +75 -0
  2456. package/entrypoints/cli/src/demo-command.d.ts +4 -0
  2457. package/entrypoints/cli/src/demo-command.js +102 -0
  2458. package/entrypoints/cli/src/env-command.d.ts +90 -0
  2459. package/entrypoints/cli/src/env-command.js +203 -0
  2460. package/entrypoints/cli/src/env-files.d.ts +6 -0
  2461. package/entrypoints/cli/src/env-files.js +46 -0
  2462. package/entrypoints/cli/src/environment.d.ts +5 -0
  2463. package/entrypoints/cli/src/environment.js +3 -0
  2464. package/entrypoints/cli/src/every-control.d.ts +74 -0
  2465. package/entrypoints/cli/src/every-control.js +129 -0
  2466. package/entrypoints/cli/src/explore-command.d.ts +4 -0
  2467. package/entrypoints/cli/src/explore-command.js +133 -0
  2468. package/entrypoints/cli/src/fixture-command.d.ts +8 -0
  2469. package/entrypoints/cli/src/fixture-command.js +365 -0
  2470. package/entrypoints/cli/src/fixture-refresh-command.d.ts +11 -0
  2471. package/entrypoints/cli/src/fixture-refresh-command.js +245 -0
  2472. package/entrypoints/cli/src/fixture-setup-marker.d.ts +22 -0
  2473. package/entrypoints/cli/src/fixture-setup-marker.js +52 -0
  2474. package/entrypoints/cli/src/fixture-sharing-command.d.ts +16 -0
  2475. package/entrypoints/cli/src/fixture-sharing-command.js +192 -0
  2476. package/entrypoints/cli/src/fixture-source-command.d.ts +3 -0
  2477. package/entrypoints/cli/src/fixture-source-command.js +161 -0
  2478. package/entrypoints/cli/src/host-command.d.ts +5 -0
  2479. package/entrypoints/cli/src/host-command.js +213 -0
  2480. package/entrypoints/cli/src/init-command.d.ts +49 -0
  2481. package/entrypoints/cli/src/init-command.js +349 -0
  2482. package/entrypoints/cli/src/init-lock.d.ts +48 -0
  2483. package/entrypoints/cli/src/init-lock.js +50 -0
  2484. package/entrypoints/cli/src/journeys-after-test.d.ts +2 -0
  2485. package/entrypoints/cli/src/journeys-after-test.js +13 -0
  2486. package/entrypoints/cli/src/journeys-command.d.ts +5 -0
  2487. package/entrypoints/cli/src/journeys-command.js +61 -0
  2488. package/entrypoints/cli/src/lab-flags.d.ts +54 -0
  2489. package/entrypoints/cli/src/lab-flags.js +53 -0
  2490. package/entrypoints/cli/src/lab-window-closed.d.ts +4 -0
  2491. package/entrypoints/cli/src/lab-window-closed.js +10 -0
  2492. package/entrypoints/cli/src/lint-command.d.ts +4 -0
  2493. package/entrypoints/cli/src/lint-command.js +82 -0
  2494. package/entrypoints/cli/src/load-command.d.ts +5 -0
  2495. package/entrypoints/cli/src/load-command.js +111 -0
  2496. package/entrypoints/cli/src/load-env.d.ts +1 -0
  2497. package/entrypoints/cli/src/load-env.js +4 -0
  2498. package/entrypoints/cli/src/machine-fit.d.ts +60 -0
  2499. package/entrypoints/cli/src/machine-fit.js +63 -0
  2500. package/entrypoints/cli/src/main.d.ts +14 -0
  2501. package/entrypoints/cli/src/main.js +31 -0
  2502. package/entrypoints/cli/src/mcp-command.d.ts +6 -0
  2503. package/entrypoints/cli/src/mcp-command.js +28 -0
  2504. package/entrypoints/cli/src/mutate-command.d.ts +34 -0
  2505. package/entrypoints/cli/src/mutate-command.js +84 -0
  2506. package/entrypoints/cli/src/own-running-record.d.ts +1 -0
  2507. package/entrypoints/cli/src/own-running-record.js +10 -0
  2508. package/entrypoints/cli/src/parse-args-errors.d.ts +2 -0
  2509. package/entrypoints/cli/src/parse-args-errors.js +7 -0
  2510. package/entrypoints/cli/src/plain-output.d.ts +98 -0
  2511. package/entrypoints/cli/src/plain-output.js +179 -0
  2512. package/entrypoints/cli/src/recordings-command.d.ts +15 -0
  2513. package/entrypoints/cli/src/recordings-command.js +232 -0
  2514. package/entrypoints/cli/src/release/notices.d.ts +87 -0
  2515. package/entrypoints/cli/src/release/notices.js +182 -0
  2516. package/entrypoints/cli/src/release/upgrade-command.d.ts +35 -0
  2517. package/entrypoints/cli/src/release/upgrade-command.js +240 -0
  2518. package/entrypoints/cli/src/report-command.d.ts +3 -0
  2519. package/entrypoints/cli/src/report-command.js +207 -0
  2520. package/entrypoints/cli/src/reports/compatibility-html.d.ts +2 -0
  2521. package/entrypoints/cli/src/reports/compatibility-html.js +76 -0
  2522. package/entrypoints/cli/src/reports/evidence-report.d.ts +46 -0
  2523. package/entrypoints/cli/src/reports/evidence-report.js +31 -0
  2524. package/entrypoints/cli/src/reports/host-bypass.d.ts +3 -0
  2525. package/entrypoints/cli/src/reports/host-bypass.js +17 -0
  2526. package/entrypoints/cli/src/reports/html.d.ts +6 -0
  2527. package/entrypoints/cli/src/reports/html.js +178 -0
  2528. package/entrypoints/cli/src/reports/junit.d.ts +2 -0
  2529. package/entrypoints/cli/src/reports/junit.js +93 -0
  2530. package/entrypoints/cli/src/reports/markdown.d.ts +2 -0
  2531. package/entrypoints/cli/src/reports/markdown.js +62 -0
  2532. package/entrypoints/cli/src/reports/metrics-text.d.ts +19 -0
  2533. package/entrypoints/cli/src/reports/metrics-text.js +72 -0
  2534. package/entrypoints/cli/src/reports/pr-comment.d.ts +20 -0
  2535. package/entrypoints/cli/src/reports/pr-comment.js +61 -0
  2536. package/entrypoints/cli/src/reports/write-reports.d.ts +8 -0
  2537. package/entrypoints/cli/src/reports/write-reports.js +30 -0
  2538. package/entrypoints/cli/src/reproduce-command.d.ts +4 -0
  2539. package/entrypoints/cli/src/reproduce-command.js +69 -0
  2540. package/entrypoints/cli/src/rerun-failures.d.ts +8 -0
  2541. package/entrypoints/cli/src/rerun-failures.js +59 -0
  2542. package/entrypoints/cli/src/rpc-flags.d.ts +3 -0
  2543. package/entrypoints/cli/src/rpc-flags.js +23 -0
  2544. package/entrypoints/cli/src/setup-commands.d.ts +36 -0
  2545. package/entrypoints/cli/src/setup-commands.js +344 -0
  2546. package/entrypoints/cli/src/shared-controls.d.ts +6 -0
  2547. package/entrypoints/cli/src/shared-controls.js +49 -0
  2548. package/entrypoints/cli/src/start-progress.d.ts +96 -0
  2549. package/entrypoints/cli/src/start-progress.js +256 -0
  2550. package/entrypoints/cli/src/startup-notices.d.ts +9 -0
  2551. package/entrypoints/cli/src/startup-notices.js +25 -0
  2552. package/entrypoints/cli/src/stop-signals.d.ts +27 -0
  2553. package/entrypoints/cli/src/stop-signals.js +60 -0
  2554. package/entrypoints/cli/src/suite-run-command.d.ts +17 -0
  2555. package/entrypoints/cli/src/suite-run-command.js +48 -0
  2556. package/entrypoints/cli/src/test-command.d.ts +15 -0
  2557. package/entrypoints/cli/src/test-command.js +597 -0
  2558. package/entrypoints/cli/src/test-in-window.d.ts +11 -0
  2559. package/entrypoints/cli/src/test-in-window.js +27 -0
  2560. package/entrypoints/cli/src/test-output.d.ts +9 -0
  2561. package/entrypoints/cli/src/test-output.js +17 -0
  2562. package/entrypoints/cli/src/tool-run.d.ts +3 -0
  2563. package/entrypoints/cli/src/tool-run.js +29 -0
  2564. package/entrypoints/cli/src/tui/agents-menu.d.ts +18 -0
  2565. package/entrypoints/cli/src/tui/agents-menu.js +108 -0
  2566. package/entrypoints/cli/src/tui/app.d.ts +46 -0
  2567. package/entrypoints/cli/src/tui/app.js +483 -0
  2568. package/entrypoints/cli/src/tui/frame.d.ts +23 -0
  2569. package/entrypoints/cli/src/tui/frame.js +24 -0
  2570. package/entrypoints/cli/src/tui/model.d.ts +188 -0
  2571. package/entrypoints/cli/src/tui/model.js +487 -0
  2572. package/entrypoints/cli/src/tui/mouse.d.ts +50 -0
  2573. package/entrypoints/cli/src/tui/mouse.js +91 -0
  2574. package/entrypoints/cli/src/tui/scroll.d.ts +28 -0
  2575. package/entrypoints/cli/src/tui/scroll.js +29 -0
  2576. package/entrypoints/cli/src/tui/start.d.ts +54 -0
  2577. package/entrypoints/cli/src/tui/start.js +168 -0
  2578. package/entrypoints/cli/src/tui/starting.d.ts +52 -0
  2579. package/entrypoints/cli/src/tui/starting.js +67 -0
  2580. package/entrypoints/cli/src/versions-command.d.ts +22 -0
  2581. package/entrypoints/cli/src/versions-command.js +230 -0
  2582. package/entrypoints/cli/src/what-if-command.d.ts +7 -0
  2583. package/entrypoints/cli/src/what-if-command.js +103 -0
  2584. package/entrypoints/cucumber/README.md +53 -0
  2585. package/entrypoints/cucumber/src/ci/change-scope.d.ts +4 -0
  2586. package/entrypoints/cucumber/src/ci/change-scope.js +8 -0
  2587. package/entrypoints/cucumber/src/ci/coverage.d.ts +4 -0
  2588. package/entrypoints/cucumber/src/ci/coverage.js +44 -0
  2589. package/entrypoints/cucumber/src/ci/fast-plan.d.ts +29 -0
  2590. package/entrypoints/cucumber/src/ci/fast-plan.js +79 -0
  2591. package/entrypoints/cucumber/src/ci/owned-command.d.ts +11 -0
  2592. package/entrypoints/cucumber/src/ci/owned-command.js +85 -0
  2593. package/entrypoints/cucumber/src/cucumber/hooks.d.ts +50 -0
  2594. package/entrypoints/cucumber/src/cucumber/hooks.js +132 -0
  2595. package/entrypoints/cucumber/src/cucumber/navigation.d.ts +26 -0
  2596. package/entrypoints/cucumber/src/cucumber/navigation.js +44 -0
  2597. package/entrypoints/cucumber/src/cucumber/rows.d.ts +5 -0
  2598. package/entrypoints/cucumber/src/cucumber/rows.js +26 -0
  2599. package/entrypoints/cucumber/src/cucumber/world.d.ts +11 -0
  2600. package/entrypoints/cucumber/src/cucumber/world.js +41 -0
  2601. package/entrypoints/cucumber/src/index.d.ts +9 -0
  2602. package/entrypoints/cucumber/src/index.js +11 -0
  2603. package/entrypoints/cucumber/src/main.d.ts +44 -0
  2604. package/entrypoints/cucumber/src/main.js +55 -0
  2605. package/entrypoints/cucumber/src/negative/control-result.d.ts +31 -0
  2606. package/entrypoints/cucumber/src/negative/control-result.js +56 -0
  2607. package/entrypoints/mcp/README.md +204 -0
  2608. package/entrypoints/mcp/src/args.d.ts +10 -0
  2609. package/entrypoints/mcp/src/args.js +63 -0
  2610. package/entrypoints/mcp/src/chain.d.ts +75 -0
  2611. package/entrypoints/mcp/src/chain.js +185 -0
  2612. package/entrypoints/mcp/src/deferred-runtime.d.ts +26 -0
  2613. package/entrypoints/mcp/src/deferred-runtime.js +72 -0
  2614. package/entrypoints/mcp/src/describe-sections.d.ts +14 -0
  2615. package/entrypoints/mcp/src/describe-sections.js +38 -0
  2616. package/entrypoints/mcp/src/index.d.ts +7 -0
  2617. package/entrypoints/mcp/src/index.js +9 -0
  2618. package/entrypoints/mcp/src/load-gate.d.ts +27 -0
  2619. package/entrypoints/mcp/src/load-gate.js +65 -0
  2620. package/entrypoints/mcp/src/logs.d.ts +41 -0
  2621. package/entrypoints/mcp/src/logs.js +138 -0
  2622. package/entrypoints/mcp/src/main.d.ts +24 -0
  2623. package/entrypoints/mcp/src/main.js +42 -0
  2624. package/entrypoints/mcp/src/output.d.ts +8 -0
  2625. package/entrypoints/mcp/src/output.js +69 -0
  2626. package/entrypoints/mcp/src/resources.d.ts +18 -0
  2627. package/entrypoints/mcp/src/resources.js +139 -0
  2628. package/entrypoints/mcp/src/server.d.ts +37 -0
  2629. package/entrypoints/mcp/src/server.js +68 -0
  2630. package/entrypoints/mcp/src/session-core.d.ts +42 -0
  2631. package/entrypoints/mcp/src/session-core.js +80 -0
  2632. package/entrypoints/mcp/src/session-debug.d.ts +219 -0
  2633. package/entrypoints/mcp/src/session-debug.js +393 -0
  2634. package/entrypoints/mcp/src/session-discover.d.ts +342 -0
  2635. package/entrypoints/mcp/src/session-discover.js +212 -0
  2636. package/entrypoints/mcp/src/session-environment.d.ts +807 -0
  2637. package/entrypoints/mcp/src/session-environment.js +250 -0
  2638. package/entrypoints/mcp/src/session-host.d.ts +8 -0
  2639. package/entrypoints/mcp/src/session-host.js +40 -0
  2640. package/entrypoints/mcp/src/session-run.d.ts +127 -0
  2641. package/entrypoints/mcp/src/session-run.js +417 -0
  2642. package/entrypoints/mcp/src/session-shared.d.ts +181 -0
  2643. package/entrypoints/mcp/src/session-shared.js +89 -0
  2644. package/entrypoints/mcp/src/session.d.ts +9 -0
  2645. package/entrypoints/mcp/src/session.js +38 -0
  2646. package/entrypoints/mcp/src/stdio.d.ts +62 -0
  2647. package/entrypoints/mcp/src/stdio.js +114 -0
  2648. package/entrypoints/mcp/src/tools.d.ts +20 -0
  2649. package/entrypoints/mcp/src/tools.js +382 -0
  2650. package/entrypoints/panel/README.md +1773 -0
  2651. package/entrypoints/panel/src/agent-routes.d.ts +32 -0
  2652. package/entrypoints/panel/src/agent-routes.js +32 -0
  2653. package/entrypoints/panel/src/builder-input.d.ts +7 -0
  2654. package/entrypoints/panel/src/builder-input.js +66 -0
  2655. package/entrypoints/panel/src/bundle-routes.d.ts +16 -0
  2656. package/entrypoints/panel/src/bundle-routes.js +59 -0
  2657. package/entrypoints/panel/src/chain-console-routes.d.ts +9 -0
  2658. package/entrypoints/panel/src/chain-console-routes.js +18 -0
  2659. package/entrypoints/panel/src/client/activity.d.ts +5 -0
  2660. package/entrypoints/panel/src/client/activity.js +173 -0
  2661. package/entrypoints/panel/src/client/address-bar.css +36 -0
  2662. package/entrypoints/panel/src/client/address-bar.d.ts +62 -0
  2663. package/entrypoints/panel/src/client/address-bar.js +311 -0
  2664. package/entrypoints/panel/src/client/after-failure-view.d.ts +8 -0
  2665. package/entrypoints/panel/src/client/after-failure-view.js +24 -0
  2666. package/entrypoints/panel/src/client/agents-tools.d.ts +5 -0
  2667. package/entrypoints/panel/src/client/agents-tools.js +31 -0
  2668. package/entrypoints/panel/src/client/app-builds.d.ts +16 -0
  2669. package/entrypoints/panel/src/client/app-builds.js +38 -0
  2670. package/entrypoints/panel/src/client/app-tiles.d.ts +30 -0
  2671. package/entrypoints/panel/src/client/app-tiles.js +484 -0
  2672. package/entrypoints/panel/src/client/bindings.d.ts +39 -0
  2673. package/entrypoints/panel/src/client/bindings.js +120 -0
  2674. package/entrypoints/panel/src/client/builder-blocks.d.ts +26 -0
  2675. package/entrypoints/panel/src/client/builder-blocks.js +346 -0
  2676. package/entrypoints/panel/src/client/builder-chrome.d.ts +27 -0
  2677. package/entrypoints/panel/src/client/builder-chrome.js +144 -0
  2678. package/entrypoints/panel/src/client/builder-view.d.ts +86 -0
  2679. package/entrypoints/panel/src/client/builder-view.js +334 -0
  2680. package/entrypoints/panel/src/client/builder.d.ts +34 -0
  2681. package/entrypoints/panel/src/client/builder.js +620 -0
  2682. package/entrypoints/panel/src/client/bundle-actions.d.ts +9 -0
  2683. package/entrypoints/panel/src/client/bundle-actions.js +124 -0
  2684. package/entrypoints/panel/src/client/chain-console.css +31 -0
  2685. package/entrypoints/panel/src/client/chain-console.d.ts +13 -0
  2686. package/entrypoints/panel/src/client/chain-console.js +77 -0
  2687. package/entrypoints/panel/src/client/chain-day.d.ts +29 -0
  2688. package/entrypoints/panel/src/client/chain-day.js +43 -0
  2689. package/entrypoints/panel/src/client/checkpoint.d.ts +5 -0
  2690. package/entrypoints/panel/src/client/checkpoint.js +8 -0
  2691. package/entrypoints/panel/src/client/client.d.ts +1 -0
  2692. package/entrypoints/panel/src/client/client.js +634 -0
  2693. package/entrypoints/panel/src/client/components.css +219 -0
  2694. package/entrypoints/panel/src/client/confirm-dialogs.d.ts +11 -0
  2695. package/entrypoints/panel/src/client/confirm-dialogs.js +54 -0
  2696. package/entrypoints/panel/src/client/detached-tiles.d.ts +39 -0
  2697. package/entrypoints/panel/src/client/detached-tiles.js +106 -0
  2698. package/entrypoints/panel/src/client/dock-status.d.ts +17 -0
  2699. package/entrypoints/panel/src/client/dock-status.js +30 -0
  2700. package/entrypoints/panel/src/client/dock.d.ts +21 -0
  2701. package/entrypoints/panel/src/client/dock.js +74 -0
  2702. package/entrypoints/panel/src/client/dom.d.ts +8 -0
  2703. package/entrypoints/panel/src/client/dom.js +28 -0
  2704. package/entrypoints/panel/src/client/environment-lifecycle.d.ts +19 -0
  2705. package/entrypoints/panel/src/client/environment-lifecycle.js +164 -0
  2706. package/entrypoints/panel/src/client/environment-options.d.ts +18 -0
  2707. package/entrypoints/panel/src/client/environment-options.js +33 -0
  2708. package/entrypoints/panel/src/client/environment.d.ts +189 -0
  2709. package/entrypoints/panel/src/client/environment.js +521 -0
  2710. package/entrypoints/panel/src/client/evidence-controls.d.ts +14 -0
  2711. package/entrypoints/panel/src/client/evidence-controls.js +37 -0
  2712. package/entrypoints/panel/src/client/evidence-model.d.ts +65 -0
  2713. package/entrypoints/panel/src/client/evidence-model.js +179 -0
  2714. package/entrypoints/panel/src/client/evidence-view.css +82 -0
  2715. package/entrypoints/panel/src/client/evidence-view.d.ts +9 -0
  2716. package/entrypoints/panel/src/client/evidence-view.js +56 -0
  2717. package/entrypoints/panel/src/client/extensions.d.ts +21 -0
  2718. package/entrypoints/panel/src/client/extensions.js +345 -0
  2719. package/entrypoints/panel/src/client/features.d.ts +88 -0
  2720. package/entrypoints/panel/src/client/features.js +247 -0
  2721. package/entrypoints/panel/src/client/fixtures.d.ts +16 -0
  2722. package/entrypoints/panel/src/client/fixtures.js +155 -0
  2723. package/entrypoints/panel/src/client/fonts/inter.OFL.txt +93 -0
  2724. package/entrypoints/panel/src/client/fonts/inter.woff2 +0 -0
  2725. package/entrypoints/panel/src/client/fonts/jetbrains-mono.OFL.txt +93 -0
  2726. package/entrypoints/panel/src/client/fonts/jetbrains-mono.woff2 +0 -0
  2727. package/entrypoints/panel/src/client/fonts/unbounded.OFL.txt +93 -0
  2728. package/entrypoints/panel/src/client/fonts/unbounded.woff2 +0 -0
  2729. package/entrypoints/panel/src/client/fonts.css +24 -0
  2730. package/entrypoints/panel/src/client/forms.d.ts +3 -0
  2731. package/entrypoints/panel/src/client/forms.js +58 -0
  2732. package/entrypoints/panel/src/client/frame.css +515 -0
  2733. package/entrypoints/panel/src/client/gallery.css +68 -0
  2734. package/entrypoints/panel/src/client/gallery.d.ts +1 -0
  2735. package/entrypoints/panel/src/client/gallery.html +17 -0
  2736. package/entrypoints/panel/src/client/gallery.js +81 -0
  2737. package/entrypoints/panel/src/client/gherkin-view.d.ts +149 -0
  2738. package/entrypoints/panel/src/client/gherkin-view.js +223 -0
  2739. package/entrypoints/panel/src/client/gherkin.css +88 -0
  2740. package/entrypoints/panel/src/client/host-bypass-model.d.ts +68 -0
  2741. package/entrypoints/panel/src/client/host-bypass-model.js +131 -0
  2742. package/entrypoints/panel/src/client/host-bypass.d.ts +13 -0
  2743. package/entrypoints/panel/src/client/host-bypass.js +50 -0
  2744. package/entrypoints/panel/src/client/host-request-words.d.ts +6 -0
  2745. package/entrypoints/panel/src/client/host-request-words.js +32 -0
  2746. package/entrypoints/panel/src/client/identity-words.d.ts +23 -0
  2747. package/entrypoints/panel/src/client/identity-words.js +46 -0
  2748. package/entrypoints/panel/src/client/index.html +326 -0
  2749. package/entrypoints/panel/src/client/integrations.d.ts +16 -0
  2750. package/entrypoints/panel/src/client/integrations.js +32 -0
  2751. package/entrypoints/panel/src/client/island.css +21 -0
  2752. package/entrypoints/panel/src/client/island.d.ts +99 -0
  2753. package/entrypoints/panel/src/client/island.js +199 -0
  2754. package/entrypoints/panel/src/client/keep-switch.d.ts +7 -0
  2755. package/entrypoints/panel/src/client/keep-switch.js +24 -0
  2756. package/entrypoints/panel/src/client/keep-words.d.ts +24 -0
  2757. package/entrypoints/panel/src/client/keep-words.js +22 -0
  2758. package/entrypoints/panel/src/client/lab-actions.d.ts +9 -0
  2759. package/entrypoints/panel/src/client/lab-actions.js +16 -0
  2760. package/entrypoints/panel/src/client/lab-document.d.ts +10 -0
  2761. package/entrypoints/panel/src/client/lab-document.js +37 -0
  2762. package/entrypoints/panel/src/client/lab-menu.css +11 -0
  2763. package/entrypoints/panel/src/client/lab-menu.d.ts +44 -0
  2764. package/entrypoints/panel/src/client/lab-menu.js +105 -0
  2765. package/entrypoints/panel/src/client/landing.d.ts +4 -0
  2766. package/entrypoints/panel/src/client/landing.js +24 -0
  2767. package/entrypoints/panel/src/client/lanes.d.ts +41 -0
  2768. package/entrypoints/panel/src/client/lanes.js +100 -0
  2769. package/entrypoints/panel/src/client/lucide.LICENSE +43 -0
  2770. package/entrypoints/panel/src/client/lucide.d.ts +95 -0
  2771. package/entrypoints/panel/src/client/lucide.js +95 -0
  2772. package/entrypoints/panel/src/client/navigation-activity.d.ts +34 -0
  2773. package/entrypoints/panel/src/client/navigation-activity.js +97 -0
  2774. package/entrypoints/panel/src/client/navigation-controls.d.ts +18 -0
  2775. package/entrypoints/panel/src/client/navigation-controls.js +29 -0
  2776. package/entrypoints/panel/src/client/operation-phases.d.ts +16 -0
  2777. package/entrypoints/panel/src/client/operation-phases.js +70 -0
  2778. package/entrypoints/panel/src/client/own-window.d.ts +9 -0
  2779. package/entrypoints/panel/src/client/own-window.js +113 -0
  2780. package/entrypoints/panel/src/client/panel-snapshot.d.ts +25 -0
  2781. package/entrypoints/panel/src/client/panel-snapshot.js +3 -0
  2782. package/entrypoints/panel/src/client/panel-tabs.d.ts +21 -0
  2783. package/entrypoints/panel/src/client/panel-tabs.js +41 -0
  2784. package/entrypoints/panel/src/client/pause-inspector.d.ts +14 -0
  2785. package/entrypoints/panel/src/client/pause-inspector.js +104 -0
  2786. package/entrypoints/panel/src/client/principals.d.ts +18 -0
  2787. package/entrypoints/panel/src/client/principals.js +21 -0
  2788. package/entrypoints/panel/src/client/recordings.d.ts +38 -0
  2789. package/entrypoints/panel/src/client/recordings.js +481 -0
  2790. package/entrypoints/panel/src/client/registry.d.ts +53 -0
  2791. package/entrypoints/panel/src/client/registry.js +415 -0
  2792. package/entrypoints/panel/src/client/release-notice.d.ts +2 -0
  2793. package/entrypoints/panel/src/client/release-notice.js +36 -0
  2794. package/entrypoints/panel/src/client/replace-kept.d.ts +21 -0
  2795. package/entrypoints/panel/src/client/replace-kept.js +21 -0
  2796. package/entrypoints/panel/src/client/replay-chain.d.ts +20 -0
  2797. package/entrypoints/panel/src/client/replay-chain.js +31 -0
  2798. package/entrypoints/panel/src/client/request-error.d.ts +11 -0
  2799. package/entrypoints/panel/src/client/request-error.js +17 -0
  2800. package/entrypoints/panel/src/client/request.d.ts +1 -0
  2801. package/entrypoints/panel/src/client/request.js +16 -0
  2802. package/entrypoints/panel/src/client/reset-words.d.ts +9 -0
  2803. package/entrypoints/panel/src/client/reset-words.js +13 -0
  2804. package/entrypoints/panel/src/client/resize.d.ts +18 -0
  2805. package/entrypoints/panel/src/client/resize.js +137 -0
  2806. package/entrypoints/panel/src/client/root-call-confirm.d.ts +11 -0
  2807. package/entrypoints/panel/src/client/root-call-confirm.js +35 -0
  2808. package/entrypoints/panel/src/client/run-mode.d.ts +105 -0
  2809. package/entrypoints/panel/src/client/run-mode.js +49 -0
  2810. package/entrypoints/panel/src/client/run-outcome.d.ts +28 -0
  2811. package/entrypoints/panel/src/client/run-outcome.js +110 -0
  2812. package/entrypoints/panel/src/client/run-preludes.d.ts +54 -0
  2813. package/entrypoints/panel/src/client/run-preludes.js +46 -0
  2814. package/entrypoints/panel/src/client/run-progress.d.ts +117 -0
  2815. package/entrypoints/panel/src/client/run-progress.js +322 -0
  2816. package/entrypoints/panel/src/client/run-steps.d.ts +105 -0
  2817. package/entrypoints/panel/src/client/run-steps.js +319 -0
  2818. package/entrypoints/panel/src/client/run-writes.d.ts +66 -0
  2819. package/entrypoints/panel/src/client/run-writes.js +76 -0
  2820. package/entrypoints/panel/src/client/scenario-environment.d.ts +15 -0
  2821. package/entrypoints/panel/src/client/scenario-environment.js +34 -0
  2822. package/entrypoints/panel/src/client/selection.d.ts +7 -0
  2823. package/entrypoints/panel/src/client/selection.js +32 -0
  2824. package/entrypoints/panel/src/client/settings.d.ts +35 -0
  2825. package/entrypoints/panel/src/client/settings.js +178 -0
  2826. package/entrypoints/panel/src/client/shell-kit.d.ts +89 -0
  2827. package/entrypoints/panel/src/client/shell-kit.js +38 -0
  2828. package/entrypoints/panel/src/client/shell.css +355 -0
  2829. package/entrypoints/panel/src/client/show-cursor.css +55 -0
  2830. package/entrypoints/panel/src/client/show-cursor.d.ts +10 -0
  2831. package/entrypoints/panel/src/client/show-cursor.js +69 -0
  2832. package/entrypoints/panel/src/client/status-actions.d.ts +21 -0
  2833. package/entrypoints/panel/src/client/status-actions.js +40 -0
  2834. package/entrypoints/panel/src/client/step-evidence.css +11 -0
  2835. package/entrypoints/panel/src/client/step-evidence.d.ts +6 -0
  2836. package/entrypoints/panel/src/client/step-evidence.js +62 -0
  2837. package/entrypoints/panel/src/client/switch-run.d.ts +34 -0
  2838. package/entrypoints/panel/src/client/switch-run.js +67 -0
  2839. package/entrypoints/panel/src/client/tile-device.d.ts +55 -0
  2840. package/entrypoints/panel/src/client/tile-device.js +70 -0
  2841. package/entrypoints/panel/src/client/tile-grid.d.ts +54 -0
  2842. package/entrypoints/panel/src/client/tile-grid.js +67 -0
  2843. package/entrypoints/panel/src/client/tile-strip.d.ts +13 -0
  2844. package/entrypoints/panel/src/client/tile-strip.js +66 -0
  2845. package/entrypoints/panel/src/client/timeline.d.ts +82 -0
  2846. package/entrypoints/panel/src/client/timeline.js +195 -0
  2847. package/entrypoints/panel/src/client/tokens.css +206 -0
  2848. package/entrypoints/panel/src/client/tool-report.d.ts +15 -0
  2849. package/entrypoints/panel/src/client/tool-report.js +61 -0
  2850. package/entrypoints/panel/src/client/tools-page.css +168 -0
  2851. package/entrypoints/panel/src/client/ui-calls.d.ts +41 -0
  2852. package/entrypoints/panel/src/client/ui-calls.js +42 -0
  2853. package/entrypoints/panel/src/client/ui.d.ts +251 -0
  2854. package/entrypoints/panel/src/client/ui.js +493 -0
  2855. package/entrypoints/panel/src/client/unawaited.d.ts +5 -0
  2856. package/entrypoints/panel/src/client/unawaited.js +14 -0
  2857. package/entrypoints/panel/src/client/view-builder.css +372 -0
  2858. package/entrypoints/panel/src/client/view-characters.d.ts +3 -0
  2859. package/entrypoints/panel/src/client/view-characters.js +20 -0
  2860. package/entrypoints/panel/src/client/view-config.css +23 -0
  2861. package/entrypoints/panel/src/client/view-config.d.ts +6 -0
  2862. package/entrypoints/panel/src/client/view-config.js +41 -0
  2863. package/entrypoints/panel/src/client/view-environment.css +193 -0
  2864. package/entrypoints/panel/src/client/view-environment.d.ts +42 -0
  2865. package/entrypoints/panel/src/client/view-environment.js +240 -0
  2866. package/entrypoints/panel/src/client/view-identities.css +100 -0
  2867. package/entrypoints/panel/src/client/view-identities.d.ts +21 -0
  2868. package/entrypoints/panel/src/client/view-identities.js +288 -0
  2869. package/entrypoints/panel/src/client/view-recordings.css +9 -0
  2870. package/entrypoints/panel/src/client/view-replay.css +127 -0
  2871. package/entrypoints/panel/src/client/view-report.css +31 -0
  2872. package/entrypoints/panel/src/client/view-run-steps.css +98 -0
  2873. package/entrypoints/panel/src/client/view-runs.css +123 -0
  2874. package/entrypoints/panel/src/client/view-runs.d.ts +9 -0
  2875. package/entrypoints/panel/src/client/view-runs.js +443 -0
  2876. package/entrypoints/panel/src/client/view-scenarios.css +164 -0
  2877. package/entrypoints/panel/src/client/view-scenarios.d.ts +126 -0
  2878. package/entrypoints/panel/src/client/view-scenarios.js +510 -0
  2879. package/entrypoints/panel/src/client/view-settings.css +27 -0
  2880. package/entrypoints/panel/src/client/view-timeline.css +66 -0
  2881. package/entrypoints/panel/src/client/view-timeline.d.ts +22 -0
  2882. package/entrypoints/panel/src/client/view-timeline.js +136 -0
  2883. package/entrypoints/panel/src/client/view-tools.css +114 -0
  2884. package/entrypoints/panel/src/client/view-tools.d.ts +16 -0
  2885. package/entrypoints/panel/src/client/view-tools.js +285 -0
  2886. package/entrypoints/panel/src/client/views.d.ts +47 -0
  2887. package/entrypoints/panel/src/client/views.js +105 -0
  2888. package/entrypoints/panel/src/client/watch-layout.d.ts +47 -0
  2889. package/entrypoints/panel/src/client/watch-layout.js +79 -0
  2890. package/entrypoints/panel/src/client/window-bindings.d.ts +21 -0
  2891. package/entrypoints/panel/src/client/window-bindings.js +61 -0
  2892. package/entrypoints/panel/src/client/window-switch.d.ts +15 -0
  2893. package/entrypoints/panel/src/client/window-switch.js +19 -0
  2894. package/entrypoints/panel/src/client/workspace-shell.d.ts +20 -0
  2895. package/entrypoints/panel/src/client/workspace-shell.js +637 -0
  2896. package/entrypoints/panel/src/controls.d.ts +51 -0
  2897. package/entrypoints/panel/src/controls.js +119 -0
  2898. package/entrypoints/panel/src/device-list.d.ts +5 -0
  2899. package/entrypoints/panel/src/device-list.js +9 -0
  2900. package/entrypoints/panel/src/extensions.d.ts +5 -0
  2901. package/entrypoints/panel/src/extensions.js +28 -0
  2902. package/entrypoints/panel/src/feature-bindings.d.ts +9 -0
  2903. package/entrypoints/panel/src/feature-bindings.js +40 -0
  2904. package/entrypoints/panel/src/feature-control.d.ts +14 -0
  2905. package/entrypoints/panel/src/feature-control.js +25 -0
  2906. package/entrypoints/panel/src/feature-events.d.ts +10 -0
  2907. package/entrypoints/panel/src/feature-events.js +32 -0
  2908. package/entrypoints/panel/src/frame-check.d.ts +28 -0
  2909. package/entrypoints/panel/src/frame-check.js +69 -0
  2910. package/entrypoints/panel/src/index.d.ts +4 -0
  2911. package/entrypoints/panel/src/index.js +5 -0
  2912. package/entrypoints/panel/src/main.d.ts +3 -0
  2913. package/entrypoints/panel/src/main.js +40 -0
  2914. package/entrypoints/panel/src/react/browser.d.ts +9 -0
  2915. package/entrypoints/panel/src/react/browser.js +32 -0
  2916. package/entrypoints/panel/src/react/prepare.d.ts +10 -0
  2917. package/entrypoints/panel/src/react/prepare.js +49 -0
  2918. package/entrypoints/panel/src/rebuild-rule.d.ts +9 -0
  2919. package/entrypoints/panel/src/rebuild-rule.js +18 -0
  2920. package/entrypoints/panel/src/runtime-routes.d.ts +29 -0
  2921. package/entrypoints/panel/src/runtime-routes.js +143 -0
  2922. package/entrypoints/panel/src/served-assets.d.ts +7 -0
  2923. package/entrypoints/panel/src/served-assets.js +39 -0
  2924. package/entrypoints/panel/src/server.d.ts +95 -0
  2925. package/entrypoints/panel/src/server.js +653 -0
  2926. package/entrypoints/panel/src/tool-routes.d.ts +19 -0
  2927. package/entrypoints/panel/src/tool-routes.js +98 -0
  2928. package/entrypoints/panel/src/visible/app-reload.d.ts +6 -0
  2929. package/entrypoints/panel/src/visible/app-reload.js +22 -0
  2930. package/entrypoints/panel/src/visible/app-ui.d.ts +44 -0
  2931. package/entrypoints/panel/src/visible/app-ui.js +189 -0
  2932. package/entrypoints/panel/src/visible/detached-conditions.d.ts +9 -0
  2933. package/entrypoints/panel/src/visible/detached-conditions.js +37 -0
  2934. package/entrypoints/panel/src/visible/detached-identities.d.ts +82 -0
  2935. package/entrypoints/panel/src/visible/detached-identities.js +243 -0
  2936. package/entrypoints/panel/src/visible/detached-surface.d.ts +38 -0
  2937. package/entrypoints/panel/src/visible/detached-surface.js +182 -0
  2938. package/entrypoints/panel/src/visible/detached-window.d.ts +71 -0
  2939. package/entrypoints/panel/src/visible/detached-window.js +161 -0
  2940. package/entrypoints/panel/src/visible/device-catalogue.d.ts +12 -0
  2941. package/entrypoints/panel/src/visible/device-catalogue.js +40 -0
  2942. package/entrypoints/panel/src/visible/embedded-host.d.ts +6 -0
  2943. package/entrypoints/panel/src/visible/embedded-host.js +8 -0
  2944. package/entrypoints/panel/src/visible/frame-locations.d.ts +15 -0
  2945. package/entrypoints/panel/src/visible/frame-locations.js +29 -0
  2946. package/entrypoints/panel/src/visible/index.d.ts +13 -0
  2947. package/entrypoints/panel/src/visible/index.js +15 -0
  2948. package/entrypoints/panel/src/visible/mirror.d.ts +41 -0
  2949. package/entrypoints/panel/src/visible/mirror.js +100 -0
  2950. package/entrypoints/panel/src/visible/png-parts.d.ts +33 -0
  2951. package/entrypoints/panel/src/visible/png-parts.js +38 -0
  2952. package/entrypoints/panel/src/visible/png-work.d.ts +14 -0
  2953. package/entrypoints/panel/src/visible/png-work.js +15 -0
  2954. package/entrypoints/panel/src/visible/png-worker.mjs +13 -0
  2955. package/entrypoints/panel/src/visible/run-view.d.ts +37 -0
  2956. package/entrypoints/panel/src/visible/run-view.js +65 -0
  2957. package/entrypoints/panel/src/visible/runner.d.ts +192 -0
  2958. package/entrypoints/panel/src/visible/runner.js +450 -0
  2959. package/entrypoints/panel/src/visible/surface-session.d.ts +14 -0
  2960. package/entrypoints/panel/src/visible/surface-session.js +10 -0
  2961. package/entrypoints/panel/src/visible/tile-conditions.d.ts +33 -0
  2962. package/entrypoints/panel/src/visible/tile-conditions.js +94 -0
  2963. package/entrypoints/panel/src/visible/tile-placement.d.ts +61 -0
  2964. package/entrypoints/panel/src/visible/tile-placement.js +155 -0
  2965. package/entrypoints/panel/src/visible/tile-ready.d.ts +25 -0
  2966. package/entrypoints/panel/src/visible/tile-ready.js +78 -0
  2967. package/entrypoints/panel/src/visible/ui-activity.d.ts +60 -0
  2968. package/entrypoints/panel/src/visible/ui-activity.js +91 -0
  2969. package/entrypoints/panel/src/visible/ui-timing.d.ts +95 -0
  2970. package/entrypoints/panel/src/visible/ui-timing.js +32 -0
  2971. package/entrypoints/panel/src/visible/verified-typing.d.ts +39 -0
  2972. package/entrypoints/panel/src/visible/verified-typing.js +76 -0
  2973. package/entrypoints/panel/src/visible/viewport-shot.d.ts +29 -0
  2974. package/entrypoints/panel/src/visible/viewport-shot.js +83 -0
  2975. package/entrypoints/panel/src/visible/visible-ui.d.ts +132 -0
  2976. package/entrypoints/panel/src/visible/visible-ui.js +429 -0
  2977. package/entrypoints/panel/src/visible/window-frames.d.ts +35 -0
  2978. package/entrypoints/panel/src/visible/window-frames.js +128 -0
  2979. package/entrypoints/panel/src/visible/window-hold.d.ts +21 -0
  2980. package/entrypoints/panel/src/visible/window-hold.js +29 -0
  2981. package/entrypoints/panel/src/visible/window-video.d.ts +17 -0
  2982. package/entrypoints/panel/src/visible/window-video.js +21 -0
  2983. package/entrypoints/panel/src/visible/window.d.ts +99 -0
  2984. package/entrypoints/panel/src/visible/window.js +184 -0
  2985. package/entrypoints/panel/src/words.d.ts +6 -0
  2986. package/entrypoints/panel/src/words.js +8 -0
  2987. package/package.json +561 -3
@@ -0,0 +1,1773 @@
1
+ # @product-lab/shell
2
+
3
+ Failed steps and their Details show optional `abortDetail` beside the original error for configured and feature runs. This display field does not change failure classification or negative-control verdicts.
4
+
5
+ The loopback control plane (`serveLab`), full-width app workspace, bottom controls
6
+ and supporting overlay drawer.
7
+
8
+ ```ts
9
+ import { serveLab } from '@product-lab/shell';
10
+
11
+ // runtime: a LabRuntime (@product-lab/ports/driving) whose environment is running,
12
+ // for example one the composition root built (createLabRuntime), then runtime.startEnvironment().
13
+ const server = await serveLab(runtime, 5202, navigation);
14
+ ```
15
+
16
+ Standalone, without the CLI: `src/main.ts` (refactor step 8, also `@product-lab/shell/main`) is the
17
+ only file of this package that imports the composition root. It builds one `LabRuntime` through
18
+ `createLabRuntime`, starts the selected environment and serves the panel over it; `serveLab` itself
19
+ knows only the runtime. Once it listens, `serveLab` records the lab it serves at its address
20
+ (`LabRuntime.claimRunningLab`, B1 step a, backlog B2), so another way into the lab's folder (the MCP server)
21
+ finds the window; closing gives the record back (`tests/running-lab-claim.test.ts`). The record carries a token new
22
+ at every start (file mode 600): `src/runtime-routes.ts` serves the runtime's live calls to whoever presents it
23
+ (`POST /api/runtime` for calls, runs and long-polls; `GET /api/runtime/events`, the runtime's events as server-sent
24
+ events; B1, [the MCP README's Tools](../mcp/README.md#tools)), so an agent's run shows in the window
25
+ (`tests/attached-runtime-contract.test.ts`: the same behaviours on a lab of its own and through the window).
26
+
27
+ ```sh
28
+ node --import tsx entrypoints/panel/src/main.ts [--config lab.config.ts] [--environment id] [--port 5202]
29
+ ```
30
+
31
+ - `src/server.ts` binds to `127.0.0.1`, validates Host/Origin and accepts only
32
+ registered actions. It transpiles the panel's TypeScript once per file (cached by modification time, warmed when
33
+ the server starts). In the published package the client is compiled JavaScript (tools/eval/src/build.ts): `.js`
34
+ is served with only its domain imports rewritten (`rewriteBrowserImports`, which also reads the package's own
35
+ `@parity/product-lab…` specifiers), each module found with `siblingModule`, and the domain's actors in the form
36
+ they import each other (`.js` compiled; `tests/compiled-assets.test.ts`, tools/eval/tests/pack-build.test.ts). Until `client.ts` has built the app-first shell (`html[data-shell="ready"]`), `shell.css`
37
+ paints only a "Starting the lab…" bar, never the unstyled pre-shell controls (`tests/boot-cover.test.ts`). Since
38
+ refactor step 6 it only translates requests into `LabRuntime` calls: the
39
+ runtime plans and enforces switching, checks every confirmation token and
40
+ redacts every snapshot, evidence and observation it serves.
41
+ - `src/client/` is the browser panel. Its only runtime imports are the domain's pure helpers (refactor
42
+ step 9; everything else it imports is types): `@product-lab/domain/actors` (`Actor.isRunning`,
43
+ `ActorRoster.removalBlockedReason`), served file by file under `/domain/actors/`;
44
+ `@product-lab/domain/runs` (`describeFailure`), served from `core/domain/src/runs/failure-description.ts`
45
+ as `/errors.js`; and `@product-lab/domain/navigation` (`routeFields`, for the tile address bar's pages list), served from
46
+ `core/domain/src/navigation/app-routes.ts` as `/navigation.js`. The server rewrites the bare specifiers to
47
+ those paths; any other runtime import from core or the domain fails loudly. The server itself validates
48
+ navigation (`validateNavigation`) and frame origins (`Actor.origin`) with the same domain code.
49
+ The Identities footer (`view-identities.ts`) shows a compact ready count when the environment
50
+ reports `identityReserve`; these hidden identities are never rows or picker options.
51
+ Pre-onboarded identities (backlog A3): an existing account's row has an `existing` chip and no Delete; a declared
52
+ one not open yet is a row with `not open` and an Open button (`POST /api/actors { preOnboarded }`, through
53
+ `client.ts`). On a public network (backlog A6, `snapshot.public`) the Environment view shows a warning banner
54
+ (`.environment-public`: nothing resets, or read only, with the reason and the finality timeout) instead of the
55
+ public target's notice among the notes (`tests/live-targets-served.test.ts`). On a read-only public target New
56
+ identity and Reset are disabled up front with the target's reason ("Creating an identity writes to <network>, and
57
+ this environment is read-only"; "Nothing resets on <network>…"); on a read-write one Reset says the same and New
58
+ identity is not offered (the default session creates none); a local environment keeps both.
59
+ - `src/client/client.ts` holds the panel's state and controller (`render`, `action`, `startRun`, `poll`, the remaining
60
+ button handlers). Split by responsibility since 28 September 2026 (q10-panel),
61
+ each module served by `src/server.ts` as `/<name>.js`:
62
+ `dom.ts` (`element`, `text`, `replaceOptions`), `request.ts` (the loopback request), `window-bindings.ts`
63
+ (`runnerBinding`; `installRunnerOverlay` defines `__productLabRing` and `__productLabReveal`), `app-tiles.ts`
64
+ (`createAppTiles`: the tiles, frames and address bars), `run-progress.ts` (the legacy step list and the Runs model: one entry per run, step states, the dock's line),
65
+ `confirm-dialogs.ts` (delete identity, reset), `evidence-controls.ts` (evidence, landing, observation), `after-failure-view.ts`, `lab-actions.ts` and
66
+ `status-actions.ts` ([A failure never blocks](#a-failure-never-blocks))
67
+ and `panel-snapshot.ts` (the `LabSnapshot` type; types only, never loaded). Every file stays under the 600-line
68
+ `architecture/file-size` budget, which has no exception.
69
+ - Work the panel starts without awaiting it (a button's action, the poll, a list a render asks for) goes through
70
+ `unawaited(report)` (`src/client/unawaited.ts`): a rejection shows in the status line (`client.ts`,
71
+ `features.ts`, `builder.ts`, `environment-lifecycle.ts`) or in the extension's own box (`extensions.ts`), never as
72
+ an unhandled rejection only a developer console would show; a failure inside a success handler (for example a
73
+ transaction report the panel cannot render) is shown the same way. The lab window's bindings
74
+ (`__productLabRun`, `__productLabFeatureRun`, `__productLabBuilderRun`, `__productLabRing`, `__productLabReveal`, `__productLabUiCalls`) are typed once, in
75
+ `src/client/run-mode.ts` (`labWindow()`). Tests: `tests/unawaited.test.ts`, `tests/client-unawaited.test.ts`
76
+ (headless Chromium, fails on any page error; each case was checked failing without the change).
77
+
78
+ - The panel shows the lab registry (`compileLab` → `LabEnvironment.registry`,
79
+ served in `/api/lab`): every app with its availability and, when
80
+ unavailable, the exact reason (missing chain, service or capability, unusable
81
+ secret, failed operator). Each integration action is a block with a form
82
+ generated from its registry input descriptions; blocks that cannot run are
83
+ disabled with their reason (`src/client/registry.ts`). Secrets appear by name
84
+ and kind only. The panel is closed by default and the app fills the window.
85
+ - Every integration is also a row of its own (`src/client/integrations.ts`):
86
+ ready, idle, unavailable, failed (with the error class, for example an
87
+ operator's `AuthorityError`) or blocked by a dependency, with the apps
88
+ that use it; app cards name the integrations blocking them.
89
+ - The Environment section (`src/client/view-environment.ts`, `src/client/environment.ts`, since 28 September
90
+ 2026) reads top to bottom: a header card (the configured label, the snapshot's `environment`: the one name the
91
+ bottom bar, the environment picker, the stop and switch dialogs and this header all show, never the session's own
92
+ `name`, since 29 September 2026; local or public, what stopping keeps, health, and
93
+ Start/Stop from `src/client/environment-lifecycle.ts`). Since 6 October 2026 (backlog D1) the whole Environment
94
+ section sits above the Run, Scenarios and Recordings tabs, outside their panels: one `<details id="environment-section">`
95
+ whose heading (`#environment-summary`: the section's icon, "Environment", the arrow) opens and closes it, open or
96
+ closed as the person left it across tab switches and reloads (`localStorage`, open the first time). Open, it takes at
97
+ most 40% of the panel and scrolls under its heading. The Lab menu's Environment entries (and the environment picker's)
98
+ open it where it is and leave the tab as it was. What stopping keeps reads "kept between starts" when this start kept its chains (backlog A5,
99
+ `keptChains`: `keepBetweenStarts.running` and the provider's `chains` words); that chip opens the environment
100
+ menu with the switch, and the section's rows and facts say the same. At a narrow panel (backlog D2) a fact's value
101
+ wraps between words only and goes under its label, a count beside an (i) ("5 notes") stays on one line, and Reset
102
+ takes its own line (`tests/environment-section.test.ts`, at the default width and 280 px). Then the fork's freshness as one line with a status dot and a
103
+ "Why?" tooltip; the chains table (finalized and best heads, the endpoint with copy, a health dot) and services (since 5 October
104
+ 2026 each with the lab's own probe, server-side, said in words on the row: "answers" (green; the tooltip gives its
105
+ HTTP status), "not answering" (red; the tooltip says why), "not checked" for an endpoint that is not HTTP or a lab
106
+ without a probe;
107
+ `tests/environment-polish.test.ts`);
108
+ the apps; every configured environment as a row with Switch (disabled with the plan's reason; with one
109
+ environment, a hint that more come from `lab.config.ts`); the workspace's processes (one summary line, Stop/Start
110
+ workspace, groups Setup, Nodes, Collators, Services and Identity sessions); and Advanced: the resolved topology,
111
+ versions and provenance as facts (paths relative to the lab, ids short, each with copy), and Reset. Switching
112
+ selects another configured environment (its own state; the current one is stopped, never rewritten). While a
113
+ switch starts the new environment, the drawer's status names the operation once with its active phase, and a
114
+ vertical checklist (`#operation-phases`, `src/client/operation-phases.ts`) lists each phase the environment
115
+ reports with a status mark, its detail, count and time; the bottom bar shows the same summary (`Switching to … ·
116
+ Chains answering · 3/5 phases · 26s`). Leaving a disposable environment needs the session's `leave` token. The
117
+ runtime computes every plan (`SwitchEnvironment`) and the retention of the current environment
118
+ (`EnvironmentRetention`); the snapshot carries them (`switchPlans`, `retention`, `confirmations`) and the panel
119
+ only shows them. Reset and identity deletion send the tokens from `snapshot.confirmations`; both dialogs name
120
+ what they remove (Reset, A4: the environment's own words for its chains, `capabilities.resetDiscards`, and each
121
+ person by name, `reset-words.ts`; a disabled Reset's tooltip gives the real reason: a public network, the running
122
+ scenario or operation, or the environment's `capabilities.resetUnsupported`). The environment card says the chains' pace and
123
+ how long the chain's day has left ("Fast pace · the chain's day ends in 40 min", or "Real time · never goes stale",
124
+ `chain-day.ts`, from `snapshot.chainDays`, in `@product-lab/domain/lab/chain-pace`'s words, served as
125
+ `/chain-pace.js`), in the words the lab stops runs with at the crossing ("the chain's day has ended"), greys "Real
126
+ time not set · add `pace: "real-time"`" while a chain runs at another pace, and, with keeping on at the fast pace,
127
+ says once that a kept chain goes stale (so does the Keep switch's hover). A start or switch refused because the kept
128
+ chain's day had ended shows why and "Replace the kept chain" (`replace-kept.ts`; `lastFailure.chainDayEnded`,
129
+ `operation.chainDayEnded`), which starts it again with `replaceKept`. Editing is read-only in v1, except each environment's RPC per chain (3 October 2026): an
130
+ environment whose provider takes one (`EnvironmentProvider.rpc`) has an RPC disclosure under its row with a field
131
+ per chain, where each value comes from now (remembered, lab.config, a secret, the provider default; a secret and a
132
+ URL with a token show as scheme://host only) and, for an `endpoint` RPC on an environment that is not a public
133
+ target, a reason field. Remember posts `POST /api/environment-rpc` (`{ environment, action: "remember", rpc:
134
+ { chains, reason? } }`, `rememberEnvironmentRpc`); it applies on the environment's next start. Clear posts
135
+ `action: "clear"`. The field refuses a URL with credentials (naming the chain only) and a URL off this machine
136
+ without a reason, and the runtime refuses the same, plus a chain the provider does not list.
137
+ `/api/environment-start` and `/api/environment` also take `rpc` for one start (`tests/environment-rpc.test.ts`).
138
+ - "Keep chain and people between starts" (backlog 183, `src/client/keep-switch.ts`; its words in `keep-words.ts`, which
139
+ the terminal app shares through `./words`) in the environment menu: a switch
140
+ with an (i), what this start did and why, what the next start will do once the switch changed, and one line per part
141
+ (chains: the environment's `keeps`; people: the lab's `keepBetweenStarts`), a part that keeps nothing greyed with why
142
+ (`snapshot.keepBetweenStarts`). Turning it saves `keepBetweenStarts` in the lab's settings (`setKeepBetweenStarts`);
143
+ it applies at the next start. Greyed, with why, in a lab that is not the interactive one (tests, CI, agents).
144
+ - An environment's options (backlog 184, `src/client/environment-options.ts`): in the environment picker, under an
145
+ environment with options, one row per option (`.environment-way[data-environment][data-option]`) with its
146
+ description and a chip: "Runs now", "Picked" or "Your choice" (the next start's, why as its tooltip), "Next start" on
147
+ the running environment, "Needs more". An option this machine is too small for is greyed, its tooltip naming what it
148
+ needs, and stays choosable. Choosing one posts `POST /api/environment-option` (`{ environment, option }`,
149
+ `chooseEnvironmentOption`), then opens the switch to that environment; a refusal shows under the rows
150
+ (`tests/environment-options-served.test.ts`).
151
+ - An environment that cannot start (its declaration has problems, for example a pre-onboarded actor's secret not set on
152
+ a live network) is greyed in the environment picker (`.environment-option.is-unavailable`, since 6 October 2026), with
153
+ a "can't start" chip whose tooltip is the reason, naming the variable and `.env` (`src/client/workspace-shell.ts`).
154
+ - The Identities section (`src/client/view-identities.ts`): one view-mode control (Focus · Compare · Follow acting,
155
+ also in the identity picker) and one row per identity: avatar (the selected one in an accent ring), name,
156
+ username, its status (running as a green dot alone; starting, stopped, failed with its error in words), an Acting
157
+ chip while it acts (the selected row's outline says which one the stage shows), and beside
158
+ it Stop or Start, Delete (danger, confirmed by name: the dialog says what is lost for good, what stays on chain and,
159
+ while people are kept between starts, that the person will not come back; `deleteWords` in `identity-words.ts`, the
160
+ terminal app's prompt too, and the delete is sent with `from: "window"` so the environment records who asked) and More
161
+ (Reload app, Copy account address). Clicking a row
162
+ selects the identity; the row's buttons select it and press the legacy `#stop-identity`, `#start-identity`,
163
+ `#delete-identity` or `#restart`, so the rules in `client.ts` still decide. A disabled button says why in its
164
+ tooltip (`ActorRoster.removalBlockedReason`, an active run, a stopped workspace). Each row shows the identity's host
165
+ pill (CLI, WASM), as its tile does (`ui.ts` `hostIcon`). Every host chip (a tile's host pill, an Identities row's, New
166
+ identity's host menu, in the lab's own window too) is drawn in its host's colour (`ActorSession.host.color`,
167
+ `EnvironmentHost.color`; `ui.ts` `hostHued` sets `--host-hue`, and `components.css` `.host-hued` mixes its fill, border
168
+ and text with the theme's surface and ink, 5 October 2026); a host without one is slate (`HOST_COLOR_FALLBACK`). Tests:
169
+ `tests/host-colors.test.ts` (both themes, the lab's own window, 4.5:1 text on fill) and `tests/host-chip-contrast.test.ts`
170
+ (every adapter's colour, distinct, 4.5:1 in both themes, without a browser). New identity is a split button when the lab declares
171
+ several hosts (`snapshot.hosts`, 5 October 2026): New identity creates on the default host, and ▾ (`#new-identity-host`,
172
+ at least 32 px) opens "New identity on", exactly the declared hosts, the default one checked and the only filled row
173
+ (hover only outlines a row), each with one line (the lab's `description` for it, else its adapter's label; the default
174
+ says "Default ·"), an unavailable one disabled with its reason as that line; choosing one posts
175
+ `/api/actors` with `host`, which the runtime refuses for a host the lab does not declare. A lab with one host shows a
176
+ plain New identity. Test: `tests/new-identity-host.test.ts`. Backlog 185: under each host the options its adapter
177
+ declares (`EnvironmentHost.options`), at the lab's values: a small switch (`[data-host-option]`, `role="switch"`), or a
178
+ list for a choice; one the lab config sets only is shown fixed, its tooltip naming where it is set. Since 6 October
179
+ 2026 (C2, C3) each host is a card (`.new-identity-host-group` when it has options) holding its button
180
+ (`#new-identity-on-<host id>`, what a test clicks) and its switches, lined up under the host's name; each option's
181
+ tooltip is its adapter's `why`. The picked card (`data-picked`) is highlighted: the default host's, until a switch of
182
+ another host is touched; the other cards' options are greyed (opacity), never disabled. The menu fits the panel at
183
+ 280 px. Choosing the host posts
184
+ `/api/actors` with `host` and `hostOptions` (the values the person changed), and the identity's host chip names the
185
+ options on for it ("truAPI CLI · network locked", `data-host-options`). No option is named in the panel's code.
186
+ Test: `tests/host-options-served.test.ts` (a phone adapter the panel has never heard of).
187
+ - Manual-mode actor binding (`src/client/bindings.ts`, tx-landed): a scenario
188
+ that declares actors (`snapshot.scenarios[].actors`, for example Ada and
189
+ Grace) shows one picker per actor: the saved identities (stopped ones
190
+ disabled) and Create new identity, defaulting to distinct running identities. A lab that declares several hosts
191
+ (the user's variant A, 5 October 2026) puts one actor per row with its host beside it:
192
+ - a new identity gets a host select listing exactly the declared hosts, the default preselected and an unavailable
193
+ one disabled with its reason;
194
+ - a saved identity shows its host read-only;
195
+ - a host the feature scenario's own step names (`actorHosts` in `/api/features`) is shown locked, "set by the
196
+ scenario";
197
+ - each host is drawn in its colour (`hostHued`).
198
+ A host other than the default is sent as `{ new: { host } }`: in `/api/run`'s `actors`, and as
199
+ `inProcess.hosts` for a feature or builder run. The runtime refuses an undeclared host, naming the declared ones.
200
+ Test: `tests/binding-host.test.ts`.
201
+ Run posts `/api/run` with `actors` instead of `actor`; the runtime binds them
202
+ (`BindActors`: a shared identity is refused before anything runs, a new one is
203
+ created for and named after its actor) and fixes them for the run. The run
204
+ shows under every identity that played in it, with who played whom
205
+ (`#bindings-summary`); the viewed identity is only a view. The lab window's
206
+ Watch runs them too (since 28 September 2026; before, it refused them): the runner's `__productLabRun`
207
+ accepts `actors` and hands the runtime every identity's displayed frame (`RunScenarioRequest.surface`), so each
208
+ step runs in the frame of the identity it acts as (`ScenarioStep.actor`, else the run's actor), checked when the
209
+ step starts, as feature and builder runs do. Background and every other tab run them headless.
210
+ - A watched run that involves two or more actors (a registered scenario that binds several, a feature or builder
211
+ scenario with several actors) switches the view to Grid while it runs, so every acting identity's frame is on
212
+ screen, and gives back the view the person had when it ends, unless they chose a view during the run; a
213
+ one-actor run never changes it (`src/client/watch-layout.ts`). Tests: `tests/watch-layout.test.ts`,
214
+ `tests/watch-multi.test.ts` (the lab window, two fixture apps), `tests/visible-builder.test.ts` (Grid during a
215
+ two-actor builder run); live: `examples/notes` `bun run e2e:watch-multi`.
216
+ - A run started outside the lab window (an agent over MCP, the terminal app: a process attached to this lab through
217
+ `src/runtime-routes.ts`) looks as the same scenario started from the window's own Run: the lab window follows it in
218
+ its snapshots and begins the same watch layout with the same count of people, so it shows Grid and the same tiles
219
+ while it runs, and the person's view after (`src/client/watch-layout.ts`, `follow`). A run is counted by the larger
220
+ of its scenario's people in the Scenarios list (by `path:line`, or by its name filter read as Cucumber reads it, a
221
+ regular expression: MCP's `name`, "…window$") and the people it has made or acted as so far (`runPeople` in
222
+ `src/client/views.ts`), so a run the list cannot count (several files, tags only, a name the list does not have)
223
+ shows Grid once it plays two people, and every person it makes or acts as has a mounted tile for the window's runner
224
+ to act and read in. Tests: `tests/outside-runs.test.ts` (a
225
+ three-person feature run, inside and outside, snapshot for snapshot, with today's window as the control),
226
+ `tests/watch-multi.test.ts` (the lab window: a run from its card and one started with the window's runtime).
227
+ - Such a run also acts in the window's tiles as the window's own Run does. With the lab window open, the routes'
228
+ `run-scenario` and `run-features` go through the window's runner (`LabRunner.outside` in `src/visible/runner.ts`,
229
+ given to the routes by `product-lab dev` through `attachWindow`): each person acts and is read in their tile, the
230
+ run's network conditions apply in the tile, and the window's journal and UI calls have the run. With no window open
231
+ (a headless lab, CI) the runtime runs it as before. The terminal app inside `product-lab dev` does the same
232
+ (`throughWindow` in `entrypoints/cli/src/tui/start.ts`). Tests: `tests/watch-conditions.test.ts` (inside and outside,
233
+ step for step: each step's surface, what the tile showed, the UI calls and the conditions; the request handed to the
234
+ runtime as the routes did before is the control), `tests/attached-runtime-contract.test.ts` (with the window
235
+ attached, through its runner; with none, the runtime).
236
+ - "Did its transactions land?" (`src/client/landing.ts`) under Execution
237
+ evidence calls `GET /api/transactions?job=<run>[&step=<n>]`
238
+ (`LabRuntime.checkTransactions`): one line per transaction the run recorded
239
+ or its evidence names, succeeded, failed, not included or unknown, with block,
240
+ index and reason. A step that failed after submitting shows `submission
241
+ <outcome>` (the Scheduler's reconciliation); a step that declares
242
+ `reportsSubmission` and failed before reporting shows `nothing submitted`.
243
+ When a failed step may have sent a transaction, the step shows the lab's own check of the chain and then
244
+ its answer; nothing is to press and nothing is blocked ([A failure never blocks](#a-failure-never-blocks)).
245
+
246
+ - Scenario builder (Phase 5; redesigned in panel-builder, 28 September 2026):
247
+ `src/client/builder.ts` (the controller),
248
+ `builder-view.ts` (pure helpers: roles, slot labels, the actor roster, local edits), `builder-blocks.ts` (the
249
+ canvas blocks, fields and table editors), `builder-chrome.ts` (picker, library, read-only line, Background,
250
+ source) and `view-builder.css`. It looks like the Gherkin viewer (`gherkin-view.ts`): a top bar with the document
251
+ picker (`folder › file.feature › Scenario`, a popover with a sticky search and the lab's scenarios under their
252
+ folder; a repeated title shows its file), New scenario, Source, Save (file path and Replace behind its caret),
253
+ Pause after each step and Run; below, three columns: the step library, the canvas and the Gherkin source.
254
+ - Library: `GET /api/builder`'s palette grouped by role, Context (Given), Action (When) and Outcome (Then), from
255
+ `PaletteBlock.class`, each integration a small muted header inside. Parameters are neutral dashed slots with
256
+ human labels (`someone` for an actor, else the field's label); only a small icon says a step acts on chain or in
257
+ the app. The phase colours are the same in the library, the canvas section labels, keyword chips and rail dots.
258
+ - Canvas: the blocks as cards on the viewer's rail, one Context/Action/Outcome label per role (consecutive steps of
259
+ one role share it; a Context step after an action gets a quiet hint). Each block's generated fields (the
260
+ scenario's actors as a choice, an input's choices, text and numbers), a table editor, a toolbar on hover
261
+ (move, duplicate, checkpoint, remove), and a pick box for Repeat, Run together (saved as the
262
+ `these steps run together:` table, or since backlog 113 as its doc string when a block has its own table; a group
263
+ with a composed part is kept as written, its doc string shown on the locked block) and At the same time (since 29 September 2026: the same group saved as one step,
264
+ `<block> and <block> at the same time`; each button shows only when the lab registers the sentence it saves as,
265
+ `BuilderPaletteView.together` / `atTheSameTime`), and the runtime's gate refuses a group that could not overlap. A step that introduces an actor (`these actors exist:`, `{actor} is a new actor`)
266
+ has a free name field: new rows and blocks get the next unused roster name (Ada, Grace, Alan, Barbara, Edsger…,
267
+ the domain's `ACTOR_ROSTER`), and a name already in the cast is marked and blocks Save and Run. Add actors
268
+ extends the one actors table and refuses a name already in the cast. Tables stay tables (compact for more than
269
+ four columns, header names in `<th>`, a table that still does not fit scrolls in its own frame); below 480px
270
+ of card each row becomes a two-column card; more than 12 rows show the first 8 and Show all.
271
+ - A loaded file: a feature's Background is shown read-only at the top (one collapsed line with its step count);
272
+ its actors are in scope (`POST /api/builder/check` takes `bound`, the load's `backgroundActors`). Steps the
273
+ builder cannot edit are locked cards; custom steps (`step()` in the lab's step files, found by the runner's
274
+ preflight) show a Custom chip and run as written; only an undefined step warns. What the builder cannot keep is
275
+ one quiet line (`Read-only · runs as written`, the reasons behind Details); custom steps alone say
276
+ `3 custom steps · run as written`.
277
+ - Edits show at once: the controller applies each edit locally, sends it to the runtime's `ScenarioBuilder`
278
+ (`POST /api/builder/edit|check|save|load|run`), coalesces value edits and checks once after a burst
279
+ (250 ms); the runtime's answer replaces the local view. Run is the same in-process Cucumber run as the feature
280
+ scenarios, so Continue, Step, Pause and Cancel (`/api/continue`, `/api/pause`, `/api/cancel`) and its progress
281
+ are the same, shown on the canvas's rail. A background run keeps the builder open; the lab window's Watch
282
+ (its guarded `BUILDER_BINDING`, which supplies each executing actor's actual iframe) shows the app. Watch over
283
+ HTTP is refused. Request bodies may be up to 256 KB (builder documents). `src/builder-input.ts` checks nested
284
+ scenario blocks, each edit operation and `bound` before posted JSON reaches the builder.
285
+ - Authoring also works from the declared catalog while the environment is stopped; Run stays disabled until an
286
+ environment starts. Optional table columns are chosen under Columns (a table with only optional columns starts
287
+ with the first, never with none), with other cell values preserved. Palette and check responses from an older
288
+ environment cannot replace the current editor state.
289
+ - Tests: `tests/builder.test.ts` (served panel, headless: library by role, roster names, Add actors refusal, a
290
+ duplicate name blocking Save, save and load, run, a Background with a 10-column, 25-row register),
291
+ `tests/visible-builder.test.ts` (the lab window), `examples/notes/tests/e2e/panel-builder.test.ts` (real chain).
292
+
293
+ - View modes and activity lanes (Phase 5, `src/client/views.ts`, `src/client/lanes.ts`): Identities and the identity
294
+ picker offer Focus (the selected identity), Compare (one tile per running identity, or while a run is on only its
295
+ people, so the lab's own idle identity steps aside until it ends: `runPeople`, `tests/run-tiles.test.ts`; the selected tile glows, and
296
+ clicking a tile or inside its app selects its identity, `tests/tile-selection.test.ts`) and Follow acting (the
297
+ default: whose step runs now, or acted last in the active run). A tile's caption is its avatar and name, its host
298
+ and device pills and one session dot (pulsing while it acts); under it the condition strip says "Acting · waiting
299
+ for finality" in words while it acts (`.tile-island`, never cut mid-word), beside the network condition and the
300
+ address bar; the app is named only when the lab has several. In the
301
+ lab window a stopped selected identity shows why, with Start. Choosing a
302
+ view sends nothing to the lab; tiles that stay are not re-created (`syncTiles`); in the lab window each actor in the active run remains visible alongside the requested view, including between steps when no action is marked running. An executing actor has an Acting marker in its existing header. Several actors' frames share one page, so the runner has one input lane per window (`VisibleOptions.input`, [Visible input lane](#visible-input-lane)): it holds only the frame checks, bringing the frame and target into view, the hit test and the trusted Playwright input; readiness waits (the frame appearing and following the actor's active app, the target becoming visible) and highlight delays run outside it, so one actor's slow app never holds another actor's input. A fill types its whole text before the next input starts. Run-together domain calls remain concurrent: a watched `… and … at the same time` step (or `these steps run together:`) drives each part in its own actor's frame while waits for finality overlap. Each acting identity has its own highlight ring (`__productLabRing(box, actor)`), placed inside its tile so it scrolls with the tile, so concurrent actors never move each other's ring. "Activity lanes" in Current run (`#lanes-table`) has one row per actor and
303
+ a shared row (shared resources, run-together groups), one column per Gherkin step of the current feature run (or
304
+ the latest run), from each step's `actor`, `role`, `resources` and `together`.
305
+
306
+ - UI extensions (Phase 5 (d), `src/extensions.ts` on the server, `src/client/extensions.ts` in the panel; design
307
+ section 16, levels 2 and 3): the input renderers, result renderers and panels a lab's integrations declare
308
+ (`LabRuntime.extensions()`, each already through the client-bundle check: the `ClientBundleChecker` port,
309
+ `TranspiledClientBundles` in `adapters/lab/module`, which `product-lab lint` runs too). `GET /api/extensions` lists
310
+ each module with its URL or the reason it is refused: a bundle may import only files of its entry's
311
+ folder (type-only and unused imports are erased first); a package import (a signer library, the lab's own
312
+ packages), a path outside the folder, or a file containing one of the lab's secret values (the runtime's redactor)
313
+ refuses it. `/ext/<n>/<path>` serves only transpiled files of accepted bundles. `GET /api/resource?id=&actor=`
314
+ reads a published resource (`LabRuntime.readResource`, redacted). Panels appear in the closed-by-default
315
+ Extensions section (hidden when the lab declares no UI) and mount when opened; an input renderer hides the
316
+ generated field and writes its value, so the server validates it as before; a result renderer shows under the
317
+ evidence of a finished run of its action (the run's redacted evidence from `/api/evidence`; when that read fails,
318
+ the renderer's box shows the failure instead of mounting without the evidence). Each module gets a
319
+ `PanelApi` (`resource(id).read/subscribe`, `runAction`, `actors`, `selectedActor`, `onActivity`); `runAction`
320
+ starts the same run as the block's Run button (`/api/run`: same record, trace and Cancel). Every extension is
321
+ mounted inside an error boundary: a failing mount, subscriber or activity listener shows its error in its own box
322
+ and nothing else stops. Tests: `tests/extensions.test.ts` (headless, fixture lab `tests/fixtures/extensions/` with a
323
+ working panel, a panel that fails during a run, and two leaky panels that must be refused).
324
+ - Extension API version: new modules should export `{ apiVersion: 1, mount(element, api) { ... } }`.
325
+ Existing modules with no `apiVersion` continue as legacy v1. Any other explicit value is refused in
326
+ the extension's own error box before `mount` is called; it does not affect other extensions or runs.
327
+ The version identifies the mount/API contract rather than the npm package, and adds no UI-library dependency.
328
+ - Optional React helpers: `@product-lab/shell/react` exports `React`, `defineReactPanel`,
329
+ `defineReactInputRenderer` and `defineReactResultRenderer`; components receive `{ api }` and factories
330
+ return v1 modules. Their React root returns an idempotent unmount and catches rendering errors in its
331
+ own visible boundary. The ordinary panel does not import React. A lab without extensions requests no
332
+ React asset. As with plain modules, event handlers own their asynchronous errors.
333
+ Browser modules **do not import the package directly**: run the Node-only
334
+ `prepareReactUi({ directory })` from `@product-lab/shell/react/prepare` to create `react-ui.js`,
335
+ `react-ui.d.ts` and a digest manifest inside the consumer UI folder, conventionally its `dist/` subfolder.
336
+ Then import `{ React, defineReactPanel }` from `./dist/react-ui.js` in that UI module.
337
+ Preparation bundles only the fixed framework helper with pinned React/ReactDOM; it never accepts a
338
+ consumer source entry. It requires no environment variables, preserves unchanged files, and repairs a
339
+ modified generated asset. The original consumer graph and the generated asset both pass the normal
340
+ client-bundle checker before serving. Its manifest records API major, dependency versions, bytes and SHA256.
341
+ TSX/JSX use classic `React.createElement`/`React.Fragment`, with relative local imports and no injected
342
+ `react/jsx-runtime` package. Relative extensionless imports resolve `.ts`, `.tsx`, `.js` or `.jsx` within
343
+ the checked file list. Tests: `tests/react-prepare.test.ts`, `tests/react-extensions.test.ts`.
344
+ - Extension lifetime: hiding the outer Lab drawer keeps mounts alive. Closing an extension's own panel,
345
+ replacing or detaching an input/result renderer, changing the environment, or stopping it disposes that
346
+ mount and its activity/resource subscriptions. Pending imports cannot mount after disposal; an asynchronous
347
+ mount's eventual cleanup runs once even if its owner has already closed. Stale extension lists and evidence
348
+ responses cannot replace the current environment or result. Calls through a disposed API cannot start actions
349
+ or deliver subscribed updates; detached input callbacks cannot change the generated control. Extension code
350
+ still owns its own asynchronous work and should return its cleanup. The lab cannot cancel arbitrary module
351
+ promises. Tests: `tests/extension-lifecycle.test.ts` uses real checked modules in Chromium and the actual
352
+ client's stop path; `tests/resource-watch-lifecycle.test.ts` checks disconnects before and during watch setup.
353
+ - Resource change notifications (Phase 5 rest, design section 16): a resource declared with `watch` is served over
354
+ `GET /api/resource/watch?id=&actor=` (the same Host/Origin checks as every other route), server-sent events: the
355
+ current redacted value first, then one `resource` event per change (`LabRuntime.watchResource`, which re-reads
356
+ and redacts exactly like `readResource` on every notification), or one `static` event and the stream closes for a
357
+ resource without `watch`. `PanelApi.resource(id).subscribe` (`src/client/extensions.ts`) opens an `EventSource`
358
+ and falls back to its former 1.5 s poll on a `static` event or a connection error, never silently. Tests:
359
+ `tests/extensions.test.ts` (a resource with `watch`, one SSE connection instead of a request per tick, the pushed
360
+ value redacted like a read one; a negative control, bypassing the redactor on the push path only, was run and
361
+ reverted, see `docs/verification/2026-09-25-phase5.md`) and `core/lab/tests/ui-extensions.test.ts` (`watch()`
362
+ compiled: `undefined` without it, a kept-open scope released on stop). `examples/notes`'s `notes.account` resource
363
+ declares `watch` (a short poll of the chain's finalized head); proven live over a real chain in
364
+ `examples/notes/tests/e2e/panel-builder.test.ts` and, in the lab window, `visible-shell.test.ts`.
365
+ - Extensions in the lab window (Phase 5 rest): the same served bundles, the same `/api/extensions`,
366
+ `/ext/<n>/<path>` and `/api/resource(/watch)` routes and the same error boundary as a normal panel tab (none of
367
+ these routes were ever gated on `options.visible`); `PanelApi.runAction` reaches the app through the window's
368
+ runner binding (Watch) or the server (Background) exactly as a generated block's Run button does (both go through the client's `startRun`).
369
+ `examples/notes/tests/e2e/visible-shell.test.ts` (`e2e:visible`) proves it: the note-input.ts input renderer
370
+ mounts and its value reaches the run, and the Notes account panel opens, shows the actor's account, publishes
371
+ through its own button, and its shown finalized block updates from the `watch` push, all inside the real lab
372
+ window, headless.
373
+
374
+ ## Tile address bar
375
+
376
+ Every running actor's app tile has a compact, browser-like address bar in the condition strip under its header
377
+ (`src/client/address-bar.ts`, `src/client/tile-strip.ts`; Grid shows one per tile). It replaced the drawer's former App navigation form
378
+ (Page select, route fields, Open in app, "Last opened by lab").
379
+
380
+ - **Address**: the frame's address after its origin (for example `/#/`). The origin and whether the address is
381
+ live or the one the lab opened appear on hover or focus, and in the field's tooltip. Type a subpath (`/#/claim/ada`,
382
+ `/deep/path`, `#/inside`, `?q=1`, resolved like a link on the page shown, or a full URL on the same origin) and press
383
+ **Enter** to open it in *that* actor's frame. **Escape** puts the current address back (and never closes the lab
384
+ drawer); leaving the field does the same.
385
+ - **Host launch parameters are hidden**: the query of the address the host session opened the app at
386
+ (`ActorSession.appUrl`, or a followed app's active URL) is the session's launch parameters, which host and app URL
387
+ builders append to a query-less app URL: a deployed app's `?bridge=<its bootstrap.js>` on a truAPI CLI session (the
388
+ Bulletin gateway's `bridgeParam`, `examples/notes/lab/actors.ts`; an app served by its dev server carries no such
389
+ parameter since backlog item 64, because the lab's proxy adds the script), the WASM host page's `product`, `mock`,
390
+ `runtimeConfig` and so on. The bar hides exactly those name=value pairs (deployed Notes shows `/`, not
391
+ `/?bridge=…`), keeps every other query part as written, shows the full
392
+ URL in the tooltip, and adds any missing launch pair back to what it opens, so the app still boots in its host. A
393
+ parameter of the same name with another value is the app's or the person's, and is shown and kept.
394
+ - **Pages** (the chevron, or **ArrowDown** in the field): the app's declared routes (`defineLab({ navigation })`,
395
+ `GET /api/navigation`), each with its path and parameter names (`/#/claim/:username`). **ArrowUp/ArrowDown** move,
396
+ **Enter** or a click fills the address; defaults are filled in and the first parameter without one is selected, so
397
+ typing replaces it. Enter then opens it; a `:name` still in place is refused ("Write Username in place of
398
+ :username"). The list is offered only while the frame shows the actor's own app (a followed navigation to another
399
+ app has no declared pages here) and hidden when the lab declares none.
400
+ - **Reload** loads the address shown again as a new document in the same host session. A frame re-created on
401
+ purpose (the bar, Restart app) carries a per-actor generation in its tile key, so later snapshot polls keep it
402
+ instead of loading it a second time.
403
+ - **Refusals are inline and nothing navigates**: an address off the origin the frame shows (another port, a
404
+ protocol-relative `//host`, `javascript:`, credentials) is refused by the bar and again by the client's
405
+ `openAddress`; a stopped identity has no bar; in the lab window, a frame whose step runs now (Acting) is not
406
+ navigated away from its step ("pause the run first"). The refusal is text only (`pointer-events: none`), so it never
407
+ covers a frame for the visible runner's hit test, and an acting frame's open pages list closes. Opening a page is a
408
+ location change only: no signer, scenario or chain access; the app's own route guards still run. Each actor keeps its
409
+ last opened address while you switch views or identities; a scenario that replaces the actor's app URL wins, and an
410
+ environment change discards them.
411
+ - **Truthful location**: the apps are cross-origin to the panel, so a normal browser tab cannot see where an app went
412
+ after the lab opened it. There the bar shows the address the lab last opened, marked "opened by lab" (hover, focus,
413
+ tooltip). In the lab window (`bun run lab`, `product-lab [dev]`), `openLabWindow` calls
414
+ `reportFrameLocations`, which listens to Playwright's `framenavigated` for the shell's actor iframes (new documents,
415
+ hash changes, history pushes) and dispatches `product-lab:frame-location` (`{ actor, frame, url }`) on the shell
416
+ window; the bar then shows that address, marked "live". A report is applied only to the iframe element it names
417
+ (`data-frame`), so a re-created frame never receives an old frame's address. The bar never shows a guessed location.
418
+
419
+ Tests: `node --import tsx --test entrypoints/panel/tests/address-bar.test.ts` (served shell, headless Chromium,
420
+ loopback fixture apps on ephemeral ports; a normal tab and the lab window via `openLabWindow`, including real
421
+ `framenavigated` reports and the acting guard). Optional `ADDRESS_BAR_SCREENS=<directory>` writes review screenshots
422
+ (unset: none).
423
+
424
+ ## Visible execution: `@product-lab/shell/visible`
425
+
426
+ Node-side, loads Playwright (the panel server does not). Promoted from the
427
+ browser spike.
428
+
429
+ - `openLabWindow({ url, runtime, headless?, viewport?, deviceScaleFactor?, videoDir?, reducedMotion?, cursor?, launch? })` launches Chromium on
430
+ the shell (`bun run lab`, `product-lab [dev]` without `--browser`) and attaches
431
+ the lab runner before the shell loads. It returns once the shell is built (`html[data-shell="ready"]`, at most 60 s),
432
+ not at the document's load event, which also waits for every tile's app frame (backlog 225: 22-26 s, and past
433
+ Playwright's 30 s under load, while a cold dev server compiled; `tests/window-open-ready.test.ts`). `launch` opens the browser instead of Chromium's own launch; the tests pass
434
+ `launchBrowser` (`tests/shared-browser.ts`) so the window and its detached windows open as GitHub's runner opens them. Its `close()` (`closeLabWindow`) closes the context, then the browser, and
435
+ rejects with both failures if either fails; a browser that already went away is not a failure
436
+ (`tests/window-close.test.ts`).
437
+ The window always runs Chromium's synthetic camera and microphone and accepts their media requests
438
+ (`LAB_WINDOW_MEDIA_ARGS`, the domain's `SYNTHETIC_MEDIA_ARGS`, built into every launch by `labWindowArgs` and
439
+ `withSyntheticMedia`, also when the caller passes its own `launch`), including from cross-origin actor frames that
440
+ delegate camera and microphone, and in every detached window (a context of the window's browser). No app in the
441
+ window can reach the machine's own camera or microphone, so a device held by another app (a video call) cannot fail
442
+ a run. Until 22 October 2026 this was the opt-in `syntheticMedia` (CLI `--synthetic-media`, still accepted and now
443
+ changing nothing); the default used the machine's devices (`tests/window-media.test.ts`). `videoDir` finalizes the
444
+ Playwright recording when the window closes.
445
+ `reducedMotion: "reduce"` is an opt-in browser preference that reaches cross-origin app frames;
446
+ Playwright's `page.emulateMedia` can change that preference in an already mounted frame;
447
+ apps can use their own accessible reduced-motion route. The default uses the browser's ordinary preference.
448
+ `cursor` (CLI `--cursor`, `--cursor-speed`) sets show mode ([Identity cursors](#identity-cursors)); absent, a headed
449
+ window opens with it on and a headless one with it off (`labWindowCursor`); `false` turns it off.
450
+ `deviceScaleFactor` (headless only; `startDev`'s option of the same name) opens the window at that pixel ratio, for
451
+ example 2 for sharp captures. Playwright then keeps it in the shell and every app frame, where an override sent from
452
+ another DevTools session was put back to 1x (`tests/address-bar.test.ts`).
453
+ - **One journey: Watch | Background, and every tab runs** (`src/client/run-mode.ts`).
454
+ In the lab window a toggle beside the dock's Run (`#run-mode`, default Watch)
455
+ picks where a run happens: Watch calls the window's bindings (below) and drives
456
+ the displayed app frames; Background posts to `/api/run`, `/api/feature-run` or
457
+ `/api/builder/run` like any tab. Any other tab has no binding, so no toggle, and
458
+ runs in the background; while a lab window is open it says so in
459
+ `#runner-status` ("Runs in the background here; watch it in the lab window").
460
+ The server accepts those HTTP runs in every mode (`serveLab(…, { visible: true })`
461
+ only reports `shell.visible`): they run headless through the actor sessions and
462
+ never touch the window. A request that asks to be watched over HTTP
463
+ (`watch: true`) is refused 403 with `WATCH_REFUSAL`, or `NO_WINDOW_WATCH_REFUSAL`
464
+ when no window is open (`--browser`). Known limit: while a background run acts,
465
+ the lab window still keeps its acting frames shown and refuses address-bar
466
+ navigation in them, as for a watched run (the snapshot does not say which runs
467
+ are watched).
468
+ - The runner (`attachLabRunner`) is a `page.exposeBinding`. The panel's Watch
469
+ calls it; calls from the app iframe (the binding is installed in every frame)
470
+ or from another origin are refused and recorded, and a normal browser tab has
471
+ no binding. Runs are serialized
472
+ (keyboard focus is page-global) and go through `runtime.runScenario`, so
473
+ validation, the Scheduler, progress, evidence and cancellation are the usual ones.
474
+ - Before a run the actor's iframe must be displayed, uncovered and showing that
475
+ actor's app origin; each primitive then proves its target is on screen inside
476
+ that iframe (`elementFromPoint`), draws the highlight ring in the shell, acts
477
+ with real input events, and clears the ring. A hidden or covered frame fails.
478
+ Since 28 September 2026 the runner first brings the acting identity's frame into view, at the start and (since
479
+ 29 September, inside the input lane) before each proof and gesture, including identities the run itself creates: the shell's `__productLabReveal(actor)` (`src/client/window-bindings.ts`)
480
+ scrolls the actor's tile into view (a grid that scrolls under its scale floor, a clipped grid) and closes a lab
481
+ overlay that covers it (the drawer, the Lab menu, a picker); a primitive whose target is still not visible asks
482
+ once more (`VisibleOptions.reveal`), then refuses. Only the shell's own layout changes: anything else covering
483
+ the frame still fails. Since the redesign no Run closes the lab: every Run (the bottom bar's, a scenario's, the
484
+ builder's) opens the Run tab beside the people (`tests/run-keeps-panel.test.ts`); the reveal still closes the lab
485
+ where it covers a tile (a phone-width window, the full size). The reveal measures the layout the shell settles on:
486
+ it first ends the drawer's slide-in and the stage's move aside, so a drawer opened just before a run stays docked
487
+ beside the people at desktop width and closes at phone width, whatever the timing (until 5 October 2026 it was
488
+ measured mid-slide and closed or not by timing; `tests/watch-multi.test.ts`). Before, a watched
489
+ `count-mismatch.feature` whose new identity Ada acted in a frame under the drawer failed with `Target is not
490
+ visible inside #application iframe[data-actor="Ada…"]`.
491
+ - Feature scenarios (Phase 4): the Lab panel's "Feature scenarios" section (`src/client/features.ts`) lists the lab's
492
+ `.feature` scenarios (`GET /api/features`: file, name, tags and the actors its identity steps introduce; since
493
+ panel-gherkin every field the domain's `parseFeature` keeps, `PanelFeatureScenario`: `kind`, `ownTags`,
494
+ `featureTags`, `description`, `rule`, `backgroundName`, steps with tables and `docString`, `examplesBlocks`,
495
+ `markers`, an outline's `variants` named as Cucumber names them, and `feature`: name, description, tags, line; since
496
+ 6 October 2026 read again within about a second of a save in any editor: `GET /api/features/events`,
497
+ `src/feature-events.ts`, streams the runtime's `features-changed` events from `LabRuntime.watchFeatures`, and
498
+ `followFeatureFiles` in features.ts reads the list again, keeping the chosen and the open scenario by file and name,
499
+ `tests/feature-hot-reload.test.ts`), lets the
500
+ person pick who plays each actor (manual binding; "Create new identity" leaves it to the scenario) and whether to
501
+ pause after each step, and runs it in the lab process through `runtime.runFeatures({ inProcess })`: the same
502
+ Cucumber and generated steps as CI, against the running environment. A listed scenario is selected by `path:line`
503
+ (`featureSelection`): the request's `name` (an outline's raw name, or a variant's), `line` (a scenario's, or an
504
+ Examples row's for one variant) or `example` (an outline's 1-based variant) becomes the scenario's or row's line,
505
+ because Cucumber names an outline's scenarios with the placeholders filled in and a filter on the raw name ran
506
+ nothing; a name the listing does not know keeps the
507
+ exact name filter (`exactName`). `POST /api/feature-run` starts it from a
508
+ normal tab or the lab window's Background (in the background; Watch over HTTP is refused); the lab window's Watch uses the runner's second binding
509
+ (`FEATURE_BINDING`, `runFeature`) starts it with a surface for each executing actor’s displayed iframe, including actors created by the feature. The run waits after a step at the `AfterStep` pause gate;
510
+ Continue, Step (`POST /api/continue` with `checkpointMode`), Pause and Cancel reach it through the runtime, and the
511
+ snapshot's `featureRun` carries its progress and checkpoint. Reports go to `<lab>/.product-lab/panel-features/`.
512
+ - Actions reach the app through the Browser port's `AppSurface`: the runner
513
+ starts the run with the actor's iframe (`visibleAppSurface`) and the action
514
+ receives it as `ActionContext.ui` (scenario steps as `ScenarioContext.ui`).
515
+ Without a visible run `ui` is absent and the action uses the actor's own
516
+ headless page (CI, Cucumber). The action code is the same.
517
+ - Visible primitives recheck the environment generation, actor account/status, current app origin and uncovered frame. The generation is the run's environment session or one that continues it (`LabSnapshot.environmentLineage`: a fixture save or restore reopened it, as an `@isolated` scenario does before and after it; 7 October 2026), with the identity running on the same account (`src/visible/surface-session.ts`, `tests/surface-session.test.ts`); a start, switch or reset is not, and the surface is refused as stale. Before acting, a surface waits (up to 30 s by default, `FOLLOW_TIMEOUT_MS`, outside the input lane) for the displayed frame to show the actor's current active app, because the panel follows a navigation on a later snapshot; whatever it shows when that time runs out is refused, never replaced by a provider page. `openLabWindow` accepts `followTimeoutMs` for a bounded fixture wait; the visible-builder fixture uses 5 s and still checks both permanent refusal and a frame that follows after 1 s. `screenshot()` returns PNG bytes of that exact iframe; it has no storage path or provider-page fallback. Consumers requiring an image must reject surfaces without the optional capability. This is on-demand step evidence, not recording or replay.
518
+ - Focused fixture: `node --import tsx --test entrypoints/panel/tests/visible-builder.test.ts`. It uses the real builder/application/session and served panel with fake external apps and runner I/O; it is not a real-chain journey. The real-chain journey (F1) passed live on 26 September 2026.
519
+
520
+ ```ts
521
+ async run({ actor, ui: shown }, inputs) {
522
+ const ui = shown ?? new HeadlessAppSurface(actorPage); // @product-lab/browser-playwright
523
+ await ui.fill(ui.app.getByLabel("Note"), text);
524
+ await ui.click(ui.app.getByTestId("note-publish"));
525
+ }
526
+ ```
527
+
528
+
529
+ ## Visible input lane
530
+
531
+ `visibleAppSurface.press` sends trusted keyboard input through the same serialized lane and records a `press` UI
532
+ timing. It proves the owned actor/document and displayed, uncovered frame before input, and bounds locator calls by
533
+ `laneTimeoutMs`. Ordinary focusable app controls use native focus without a pointer click. Prefer those controls for
534
+ existing shortcuts. A tall document body can be targeted only with explicit `{ allowDocumentFocusClick: true }`:
535
+ the surface chooses a visible neutral background point, proves it from the shell, rechecks it before a trusted
536
+ pointer-focus click, verifies app/document focus, then sends the keys in the same lane. A changed point, absent
537
+ capability or no neutral point refuses before key input. Semantic controls, inline handlers and pointer cursors are
538
+ excluded, but geometry cannot rule out arbitrary delegated click handlers. The fallback refuses nested, animated or
539
+ scaled document geometry rather than guessing a point. No app focusability attribute or synthetic event is added.
540
+ `tests/visible-input-lanes.test.ts` covers trusted input, focus isolation, serialized gestures and these refusals.
541
+
542
+ Disabled, inert and ordinary unfocusable keyboard targets refuse before keys can reach another actor's old focus.
543
+
544
+ The lab window's runner (`attachLabRunner`, `src/visible/runner.ts`) gives every actor its own surface over its
545
+ displayed iframe (`visibleAppSurface`), and all of them share one serial input lane, because the page's mouse,
546
+ keyboard focus and layout (the grid's scroll, the drawer) are shared. Per UI call:
547
+
548
+ | Phase | Where | What |
549
+ | --- | --- | --- |
550
+ | Readiness | outside the lane | the actor's frame is shown (bounded 10 s), displays the actor's active app (bounded `followTimeoutMs`, default 30 s), and the target is visible |
551
+
552
+ A feature's `{actor} is a new actor` step ends only once that actor's tile is ready (`AppSurface.ready`,
553
+ `src/visible/tile-ready.ts`, 5 October 2026): the shell gets `TILE_SHOWN_MS` (5 s) to show the tile (a view that
554
+ shows no tile for the actor has nothing to wait for, including a truAPI WASM person's tile kept mounted out of view,
555
+ hidden, because it holds their session), then the readiness above, the tile's document loaded, the app's
556
+ declared `apps.<id>.ready` steps performed in the tile and its signal there (with the default, the host's report,
557
+ which belongs to the session page, the document only). Before, a person who went offline before her tile loaded kept
558
+ a blank tile to the end of the run. `tests/tile-ready.test.ts`; the feature session awaits it
559
+ (`core/application/tests/feature-conditions.test.ts`).
560
+ | Gesture (click, fill) | in the lane, one hold | the identity check (`verify`: same identity and environment, the displayed document on the actor's active app origin), the target scrolled into view and measured inside its frame, then one shell call: the tile brought into view (`tile`), the frame check (one match, a box, its centre not covered), the target placed in page coordinates and hit-tested from the shell (the element at its centre must be the actor's iframe), the actor's own ring and the cursor's glide; one reveal and a second try if the target is not hit; `visibleDelayMs` for the highlight; then trusted Playwright input: `click`, or click, clear and `pressSequentially` for a fill (the whole text in the same hold, in calls of 16 keys, `TYPED_CHUNK`, each bounded by the target wait plus each key's delay and `TYPED_KEY_MS`, 300 ms: a key's two round trips to the page, measured under load on 23 October 2026; a page that stops answering fails the fill within one call's bound, and typing stops at a call's end when focus left the field, read in the field's own root so a field in a shadow root counts as focused; every read of the field is bounded too), read back after typing (`verified-typing.ts`, 5 October 2026): when focus moved away mid-typing (a click in the window) the field is focused again and only what is missing typed, once, and the call's `note` says so; else the fill fails before any click, naming what the field holds and what took focus (`tests/verified-typing.test.ts`, `tests/visible-fill-focus.test.ts`) |
561
+ | Release | outside the lane | `visibleDelayMs`, then the ring clears |
562
+
563
+ **A person on a host that embeds its app (backlog 108, 5 October 2026).** The WASM test host runs its core inside its
564
+ host page, which frames the app; a tile loading the bare app has no host and waits at "Connecting to the host…". The
565
+ lab window therefore places such a person's session in their tile (`src/visible/tile-placement.ts`, `TilePlacements`;
566
+ `LabRuntime.placeSessions` when the window opens, `undefined` when it closes, a macrotask after its page went so that
567
+ an owner stopping the lab with its window starts closing the runtime first, which then moves no session): each tile is a `SessionPlacement`, a
568
+ Browser (the port) whose one context is the tile and whose one tab is the tile's document, resolved on every call.
569
+ The host's scripts go on the window's page (each acts only in its own tagged host page), its routes take only
570
+ requests from its own tile's frames, and its sockets cannot be routed for one person in the shared page. C4 (6 October
571
+ 2026): the placement says so (`network.sockets`, `TILE_SOCKETS_OPEN`), so a locked host blocks and lists the tile's
572
+ requests (its pages' and their worker's) and leaves sockets open. A route tells a tile's requests by its frames alone:
573
+ the shell names a hosted tile's iframe (`tileFrameName`) before it loads, so no route asks the window's document (one
574
+ that did deadlocked the window's own reload). C7: the window's page is observed from the moment it opens
575
+ (`LabRuntime.observeWindowNetwork`, when the runtime was composed with it), and each tile's tab reads its own traffic
576
+ by its frame's name (`networkEvidence`: its host page, the app inside it and their workers), so the host check sees
577
+ the tile; such a tile's placement says its sockets are observed and listed, not blocked (`TILE_SOCKETS_OBSERVED`).
578
+ The window's debugging port (lane wasm, 6 October 2026; `src/visible/window-hold.ts`): the window's browser opens it
579
+ on 127.0.0.1, at a port the system chose and never logged, so the observer holds each new worker until it watches it,
580
+ only when `LabRuntime.workerHold()` says everything at stake is the lab's own (a local environment, only lab-made
581
+ identities); every local process of every user on the machine can reach it while it is open. A switch to an
582
+ environment that needs it off (a public network) asks first in the switch's own confirm ("Using <network> needs the
583
+ lab window without its debugging port: the window reopens (your runs and recordings stay), then switches. Reopen and
584
+ switch?", `#environment-switch-reopen`, `src/client/window-switch.ts`): yes closes the window's browser, launches one
585
+ without the port, restores the tab (its address, storage and open section) and then switches; Stay changes nothing.
586
+ A switch made elsewhere (MCP, the terminal) reopens the window without the port as that environment starts. The
587
+ `LabWindow` stays the same object across a reopen (`browser`, `page`, `runner` are the current ones, `holding` says
588
+ whether the port is open) and `closed` resolves only when the window really goes. Back on a local environment the
589
+ window stays without the port until it is opened again. Settings shows "Hold worker starts", set in lab.config.ts
590
+ (`workerHold: false` turns it off), greyed with why when off. `tests/window-hold.test.ts`: the port on a local
591
+ environment, the confirm's words, Stay changing nothing, the reopened browser without a port (the old port no longer
592
+ answers), the tab restored, the window not closed, Settings' row on and off, and a switch from outside. The shell shows a hosted tile at the
593
+ host page's address (`TILE_HOSTED_EVENT`, and `__productLabHostedTiles` for a shell that loads later), keeps it mounted
594
+ (hidden) while the view does not show it, names the app's address in its bar (`reportFrameLocations` reads the app
595
+ frame inside), and shows the session's network note in its strip ("network partly locked: sockets open", with why),
596
+ from the person's host (`ActorHost.network`), the same words their row shows; a person with no note shows none. The runner drives the app frame
597
+ inside a hosted tile (`displayedFrame(page, selector, inner)`, `visibleAppSurface({ inner })`, `appFrameSelector`), so
598
+ steps act on and screen checks read what the person sees. `tests/wasm-tile.test.ts` (a fixture embedding host: two
599
+ people each signed in as themselves, the run acting inside, Stop and Start, the window's close taking every session
600
+ back, a control without placement, and C4: Ada locked, her app's request blocked and listed before and after the
601
+ window is refreshed, Grace's same request not hers to block, her row and tile in the same words, and C6's limit chip
602
+ on her row). Backlog 153 (6 October 2026): a person whose host embeds its app (`ActorHost.embedsApp`, from the host's `placement` capability) whose tile shows the app without the host page is refused by a Watch run at once, in plain words with what to do (`src/visible/embedded-host.ts`, `tests/embedded-host.test.ts`), instead of waiting 120 s for an account the app never gets.
603
+
604
+ **The run view before the first gesture (30 September 2026, backlog 4b).** The shell learns about a run from its
605
+ snapshot poll (about every 1.5 s) and then shows the run's tiles (the run view: its identities beside the requested
606
+ view, Grid for a watched run with several actors). A gesture checked before that poll placed its ring and cursor in the
607
+ old layout, which the switch then moved (the input still landed right). Now the first gesture of each new set of active
608
+ runs asks the shell to draw the run view at once (`src/visible/run-view.ts`, `runViewSync`; the shell's
609
+ `__productLabRunView` reads `/api/lab` and renders it), in the input lane because it moves the layout, bounded by
610
+ `runViewTimeoutMs` (default 5 s); concurrent gestures share the request, later gestures of the same runs skip it, and a
611
+ feature run's steps (one run each) ask once per step. A shell without the function, a timeout or a failure is recorded
612
+ in `runner.runViews` and not retried for that set; the gesture's own checks still guard the input. Its time counts as
613
+ follow time in the call's timing. Follow action in the lab window keeps the run's identities in the run's order while a
614
+ run acts (`visibleRunTiles`), so following the step that runs now no longer reorders the tiles under a gesture. Tests:
615
+ `tests/run-view.test.ts` (the sync), `tests/views-lanes.test.ts` (the order), `tests/run-view-switch.test.ts` (the lab
616
+ window: every ring of a two-identity run started from Follow view is drawn in the run view).
617
+
618
+ The checks run right before the input and no other actor can move the layout in between, so a gesture takes the lane
619
+ once. (Until 30 September 2026 it took it twice, a proof with the highlight delay outside the lane and then the
620
+ gesture repeating every check; in a live three-actor capture that doubled each hold, 3 to 10 s per click under
621
+ load, and two of three runs missed the app's reporting deadline; a verification record of 29 September 2026.) Reads and waits take only the proof (checks and ring in
622
+ the lane, the highlight delay outside it); a screenshot's capture and a reload's frame check run in the lane (a
623
+ capture scrolls the frame into view). Nothing is dispatched from the DOM: the app sees `isTrusted` events.
624
+
625
+ **Three page calls per check (30 September 2026, backlog 4a).** Each browser call made from the lane waits for the
626
+ page's main thread, which the shell and every app frame share; with busy apps each call costs a frame or more, and the
627
+ calls, not the input, made up most of a hold (live three-actor captures: 1.6 to 3.8 s median per click outside the input). The
628
+ checks now make three calls where they made about ten:
629
+
630
+ - Identity: `displayedFrame` resolves the iframe element's frame once and marks the element; later checks confirm with
631
+ one page call that the selector still matches exactly that element and read the frame's address locally (Playwright
632
+ updates it from the browser's navigation events). Another element, several matches or a detached frame resolve again.
633
+ The runner and the primitives share one cache per surface (`VisibleOptions.displayed`); `verify` receives the frame.
634
+ - Target: one call inside the frame (`Locator.evaluate`) scrolls the target to its nearest edge (nothing moves when it
635
+ is fully in view) and measures it there, with the mark of its document. A target whose document is not the actor's
636
+ frame's document is refused ("Target is not inside ..."), since it is placed from that frame's box.
637
+ - Shell: one call reveals the tile, checks the frame, waits until the frame's box holds still for a frame (bounded by
638
+ `laneTimeoutMs`; a shell transition slides or widens the tiles), places and hit-tests the target, draws the ring and
639
+ starts the cursor. A frame resized since the target was measured measures it again.
640
+ - The old way (Playwright's wait for a stable box, then the browser's own box of the target) remains for a target in
641
+ a nested frame, a scaled frame, a target that a finite CSS animation moves, and a surface without `displayed`.
642
+ - Playwright's input itself still waits for a stable, visible, enabled target and checks that the frame and the
643
+ target receive the event at the input point, right before it acts.
644
+
645
+ Every wait for the target inside the lane (scroll into view, its box, the click, the field for a fill) is bounded by
646
+ `VisibleOptions.laneTimeoutMs` (default `LANE_TARGET_TIMEOUT_MS`, 5 s; typing adds its own length times the delay).
647
+ Readiness already waited for the target outside the lane; a target that changed since (re-rendered or relabelled)
648
+ fails the call quickly instead of holding every other actor's input for the page's default timeout. Before 30
649
+ September 2026 those waits used the page default: in a live three-actor capture one actor's vanished button held
650
+ the lane 34.3 s while the others queued (the same record).
651
+ `tests/visible-input-lanes.test.ts` checks the bound (a changed target fails within it and the next actor's input
652
+ lands).
653
+
654
+ ### UI call timing
655
+
656
+ Every call of a lab-runner surface is timed (`src/visible/ui-timing.ts`), so a capture can tell a slow app from input
657
+ contention. The run's `runner.journal` entry carries `calls` (one `UiCallTiming` per call, in the order they
658
+ settled) and `callSummary` (`summarizeUiCalls`); `openLabWindow({ onUiCall })` / `LabRunnerOptions.onUiCall` receives
659
+ each call as it settles, for a live log. Times are milliseconds since the runner attached (the journal's clock).
660
+
661
+ | Field | Meaning |
662
+ | --- | --- |
663
+ | `actor`, `call` | the actor session id of the surface; `click`, `fill`, `read`, `waitFor`, `screenshot` or `reload` |
664
+ | `startedMs`, `durationMs` | when the call started; its whole wall time |
665
+ | `readyMs` | readiness outside the lane: the frame shown, the target visible (without `followMs`) |
666
+ | `followMs` | waiting for the displayed frame to show the actor's active app (the bounded follow) |
667
+ | `laneWaitMs` | waiting to acquire the shared input lane (summed, if a call takes it more than once) |
668
+ | `laneHoldMs` | holding the lane: the checks, the highlight delay of a gesture, and the input |
669
+ | `inputMs`, `inputAtMs` | the physical input alone (a fill's click, clear and whole text) and when it started |
670
+ | `ok`, `error` | the call's outcome |
671
+ | `target` | what the call acted on, as its locator describes itself (`getByLabel('Note')`), when it says |
672
+ | `segments` | where the time went, in order (the [run timeline](#run-timeline)'s app strip): `follow`, `ready`, `lane-wait`, `lane-hold` (with `input` inside it) and `hold` (the highlight delay), each `{ phase, startMs, endMs }`; each phase's stretches add up to its sum above |
673
+ | `laneSteps` | where the lane holds went, ms per step (`LaneStep`): `identify` (the identity check; also re-reading a reloaded document's mark), `scroll` (the target brought into view and measured in its frame), `hit` (the shell call: reveal, frame check, stable frame, hit test, ring, cursor glide), `delay` (the highlight delay inside a gesture), `cursor` (sending the click ripple), `input`, and on the old way or a retry `reveal`, `frame`, `box`, `ring`, `capture` (a screenshot). Steps not taken are absent. Records from before 30 September 2026 have no `laneSteps`; the instrumented base (`22d8b9cd`) records `reveal`, `frame`, `box` and `ring` as their own calls |
674
+
675
+ `callSummary.actors` sums them per actor (`calls`, `failed`, `firstCallMs`, `firstInputMs`, the sums, `maxLaneWaitMs`,
676
+ `maxLaneHoldMs`), `entrySpreadMs` is the spread of the actors' first inputs, and `laneWaitMs`/`maxLaneWaitMs` cover
677
+ all actors. A fill's `laneHoldMs` minus `inputMs` and `laneSteps.delay` is its checks; its `inputMs` grows with the text
678
+ and `typingDelayMs`.
679
+
680
+ Tests: `tests/visible-input-lanes.test.ts` (one page, two frames: a slow readiness holds no other input; the lane holds
681
+ the checks, scroll and gesture; the timing fields; a target in another frame's document is refused; the frame cache
682
+ resolves another element under the selector again; the identity check sees a navigation between two gestures; a
683
+ moving target and a sliding frame are waited for, so the ring ends where the input lands; with a tile, a frame whose
684
+ centre is covered is refused and the tile is revealed before a frame check), `tests/ui-timing.test.ts` (the summary)
685
+ and `tests/visible-multi-actor.test.ts` (the lab window, three fixture actors in one run-together group, at 1440 px and
686
+ in the scrolling grid at 700×500 px: a slow actor's readiness holds no other actor's input, every fill's text arrives
687
+ whole with trusted events, each ring stays over its own tile, every call takes the three-call checks, and a covered
688
+ frame or a frame showing another app is refused while the other actor completes). Their negative controls (readiness
689
+ routed through the lane, typing outside it, fixed rings, the origin check removed;
690
+ the document mark, the frame cache's element check,
691
+ the stable-box fallback, the frame stability wait, the reveal, the frame check and verifying every gesture removed)
692
+ each make them fail.
693
+
694
+ For measuring the lane, `visible-multi-actor.test.ts` reads two optional variables: `VISIBLE_MULTI_ACTOR_CPU_RATE`
695
+ (default 1: the lab page's CPU throttled this many times through Chromium's emulation) and
696
+ `VISIBLE_MULTI_ACTOR_APP_BUSY_MS` (default 0: each fixture app keeps the main thread busy this many ms every animation
697
+ frame, like an animated app); its `timing` diagnostic lists every call's lane wait, hold, input and `laneSteps`.
698
+
699
+ ## Run timeline
700
+
701
+ Backlog item 10 (29 September 2026). Runs > Timeline
702
+ (`src/client/view-timeline.ts`, `view-timeline.css`, model `src/client/timeline.ts`) draws the run Current shows as a
703
+ waterfall: one row per identity that acted, plus Setup for the lab's own setup work, on one time axis; one bar per step
704
+ (a lab run's step; a feature run's Gherkin action step), from when it started to when it ended, live while it runs (the
705
+ bar grows and shows the phase it is in). Each bar has two strips:
706
+
707
+ | Strip | Stretches | From |
708
+ | --- | --- | --- |
709
+ | App | navigation follow, readiness wait, input-lane wait, lane checks, input, highlight hold; the step's waits | the lab window's UI calls (`UiCallTiming.segments`), the activity's `waits` |
710
+ | Chain | signing (until broadcast), submitted (until included), finality lag (included until finalized), a failure; striped: a transaction the identity's app sent by itself during the step | the activity's transactions: `startedAt`, `submittedAt` (new), `includedAt`, `finishedAt`, `block`; the activity's `observed` (the account watch) |
711
+
712
+ Choosing a bar lists its stretches with offsets and facts (target, block numbers); "As a table" lists every bar with
713
+ what each kind took. Nothing is estimated: a kind the run did not record is absent, and the timeline says what it cannot
714
+ show (another tab or a Background run has no UI phases; a recording holds no UI calls).
715
+
716
+ - UI calls reach the shell from the lab window's Node side (`src/visible/ui-activity.ts`, `uiActivityFeed`): each
717
+ phase a call enters and each call that settles is pushed as a `product-lab:ui-call` window event, in wall-clock
718
+ milliseconds (the window runs in the lab's own process, so they line up with the runtime's times); pushes are queued
719
+ and never awaited by the call. A (re)loaded shell reads the bounded history (2000 calls) once through the guarded
720
+ `__productLabUiCalls` binding (`src/client/ui-calls.ts`). A call belongs to the bar of the same identity that was
721
+ running when it started. Since backlog 110 the feed also keeps the settled calls in the order they settled
722
+ (`settledSince(cursor)`), which the window's frame source offers run recordings as `FrameCapture.uiCalls`
723
+ (`src/visible/window-frames.ts`, forwarded by `detachedFrameCapture`): a recording keeps each step's calls
724
+ (`tests/ui-activity-recorded.test.ts`).
725
+ - A recording's frame from the lab window is taken once the tile holds still (backlog 110, `steadyFrameBox` in
726
+ `src/visible/window-frames.ts`): its box must stay the same across rendered frames with no animation running on
727
+ it, within `STEADY_MS` (2 s, at most half the capture's limit), and be the same after the image, else the image is
728
+ taken again once; tiles that keep moving give an unavailable frame saying so (`tests/window-frames.test.ts`).
729
+ - The image is one capture of the whole window, never a clip (a headed window shows a clip alone for a frame:
730
+ `src/visible/viewport-shot.ts`), and each frame's part is cut and encoded in the PNG worker (`png-worker.mjs`, body
731
+ `png-work.ts`, pixels `png-parts.ts`): parts of one capture asked for together share a decode, and the lab's main
732
+ thread does no PNG work, which held up the highlight holds' timers (the cursor test's 457 and 486 ms holds on Linux).
733
+ The worker holds its process open only while it has work; a worker that fails or stops fails the frames it holds with
734
+ its message (`tests/png-worker.test.ts`, `tests/viewport-shot.test.ts`).
735
+ - Recordings (backlog 192): a replay whose run kept its hosts' logs names each above "Where the time went", by its whole
736
+ path where the store keeps it, saying when only its tail was kept (`hostLogsNode`, `src/client/recordings.ts`; test
737
+ `tests/host-logs-served.test.ts`).
738
+ - Recordings: the replay viewer's "Where the time went" draws the same waterfall from the recording's steps and
739
+ transactions (which keep `submittedAt` and `includedAt` since this change; older recordings show each transaction as
740
+ one stretch and say so). Choosing a bar selects that recorded step.
741
+
742
+ Tests: `tests/timeline-model.test.ts` (rows and Setup, UI phases and transaction states per bar, totals, notes, a
743
+ recording), `tests/timeline.test.ts` (browser: a finished Background run and a recording's replay over a served
744
+ runtime; a live Watch run in the lab window where the waiting bar grows, the finished bars hold both identities' UI
745
+ phases and transaction states, and a reloaded shell gets the calls back), `tests/visible-input-lanes.test.ts`
746
+ (segments add up to the sums).
747
+
748
+ ## Release notice
749
+
750
+ 2 October 2026. `ServeOptions.release` (a `ReleaseNotice` from
751
+ `@product-lab/domain/releases`, which `product-lab dev` passes when its command said what is new or that a newer
752
+ version is published) is served as `shell.release` with its lines (`releaseNoticeLines`), and
753
+ `src/client/release-notice.ts` shows it in a card above the dock (`#release-notice`, fixed so the app frame and the
754
+ island never cover it): the first line as its title, breaking changes marked, and Dismiss, kept per version in the
755
+ browser's `localStorage`. Without a notice nothing is shown. `tests/release-notice.test.ts` (browser).
756
+
757
+ ## Live activity bar
758
+
759
+ Backlog item 11 (29 September 2026). "The island"
760
+ (`src/client/island.ts`, `island.css`) says what the lab does now. Its own row above the apps is gone since the redesign
761
+ (the user found it unreadable); the same facts live
762
+ where people look. Per acting principal (an identity, or Setup) `islandState` (pure) knows:
763
+
764
+ - its step (number and title) and how long it has run, against how long the same step (same title) took before in
765
+ this session (`stepEstimate`: the median of the earlier completed runs, with how many; absent when there were none);
766
+ - what it does now (typing into, clicking a target) and what it waits for, each with its kind: `app` (an app element to
767
+ appear, or its frame to follow its app: the lab window's live UI call phases), `lane` (another identity's input),
768
+ `lock` (a run-together step waiting for resources an earlier step holds: `ExecutionStep.waitsFor`), `block`
769
+ (inclusion, or finality: "finality of #21: finalized #19, 2 behind"), `host` (host onboarding: the environment
770
+ operation that runs during the run, or an identity whose session is starting), or a step's own wait;
771
+ - its transaction's state with block numbers and how far finality lags (the chain heads the lab observed).
772
+ - Transactions an identity's app sent by itself ([App-sent transactions](#app-sent-transactions)): on the acting
773
+ step's item when the lab sent none ("App sent: Ada · included #22 · 3 behind finality"), else on that identity's
774
+ tile until 15 s after they were finalized; the live region names them too.
775
+
776
+ Where it shows: each acting identity's tile header has a short form in words (`.tile-island`, `tileWords`: "typing…",
777
+ "waiting for the app", "waiting for finality", "Publish included #21"), its title the whole detail (step, time and
778
+ estimate, the target, the waits, the transaction); a Playwright locator never appears in a headline. The bottom bar
779
+ says the run's line beside a spinner (`#compact-progress`, `src/client/dock-status.ts` `runLineText`: "Running step 4
780
+ of 7 · 0:21", else Ready, Paused · step N, Passed · time, Failed at step N), with the run's own waits in its title. The
781
+ environment pill's title carries the chains' heads ("People #23 · finalized #19"); the environment picker does not
782
+ (since 5 October 2026: it chooses an environment, and each chain's heads are the Environment section's table). The
783
+ pill shows its whole name: in the bar the run's line gives way first and in the pill its detail; the name shortens
784
+ only when the bar has no room left, its title naming it whole (`tests/environment-polish.test.ts`, 1440, 1024, 760
785
+ and 300 px). A polite live region
786
+ (`#island-live`) announces a change of step, transaction state or wait, never the passing seconds;
787
+ `prefers-reduced-motion` stills the spinner. Nothing in it acts: it reads the snapshot and the lab window's UI calls.
788
+
789
+ Tests: `tests/island-model.test.ts` (items, waits of every kind, transaction text, estimates, the live-region sentence),
790
+ `tests/island.test.ts` (the lab window, two fixture identities: a transaction included in #21 with finality at #19,
791
+ an identity waiting for its app's element; the same facts on the tiles, the bottom bar, the environment pill and the
792
+ live region, no locator in a headline, an estimate on the second run, reduced motion; control: without the chains'
793
+ heads on the pill it fails).
794
+
795
+ ## App-sent transactions
796
+
797
+ Backlog item 12 (29 September 2026). An app may sign
798
+ and submit a transaction without the lab (a person publishing by hand in the lab window, or an app's own background
799
+ work); the lab never sees those through its own reports. The runtime's account watch (`AccountWatch` in
800
+ `@product-lab/application`, over the environment's `chains()`: new blocks, the pool, nonces) records each one as
801
+ `activity.observed` (`ObservedTransactionActivity`: chain, hash, the identity, `pending`/`included`/`finalized`/
802
+ `retracted`, block and index, dispatch result, when first seen, the run and step acting as that identity then). The
803
+ panel shows them as "sent by the app": in the activity bar, on the run timeline's chain strip (striped), and under
804
+ Evidence > Transactions ("Sent by the app, seen on chain"). They are never the lab's transactions: the run's
805
+ Transactions count, receipts, landing and reconciliation do not include them, and one whose hash the lab reported as
806
+ its own is not shown.
807
+
808
+ ## Devices
809
+
810
+ `src/visible/device-catalogue.ts` (backlogs 31a and 31b, 3 October 2026): Playwright's named devices as the domain's
811
+ `DeviceProfile`s (`deviceCatalogue`, with the desktop window "Desktop"), `deviceNames` (phones, then tablets, then
812
+ desktops; landscape after portrait; `deviceKind`: a mobile device whose shorter side is 600 CSS pixels or more is a
813
+ tablet), `deviceFor` (a name or a written-out profile through the domain's `resolveDevice`: an unknown name throws with
814
+ the nearest names, never another device) and `deviceContextOptions` (the Playwright context options of a profile). The
815
+ browser is Chromium whatever a device is called. Test: `tests/device-catalogue.test.ts`. `@product-lab/shell/visible`
816
+ exports `deviceCatalogue` so `tools/verify/tests/device-catalogues.test.ts` can check it against the browser adapter's
817
+ copy (`playwrightDevices`, used by `product-lab test --devices`, backlog 31c): every device the panel names is the
818
+ adapter's, with the same profile.
819
+
820
+ ## Detached identity windows
821
+
822
+ Window videos (backlog 18b, the window half, 4 October 2026): with
823
+ `LabWindowOptions.recordingVideos` (the runtime's `RecordingListing.videos`, set by `dev` when
824
+ `PRODUCT_LAB_RECORDINGS_VIDEO=on`) the lab window and each detached window (`DetachedWindowOptions.recordVideo`, at
825
+ the window's opening size: a phone's or tablet's with its device frame, as the person saw it) record into the
826
+ recordings' `videos/`. The window's frame capture names them
827
+ (`FrameCapture.video`): `windowFrameCapture` the window's one video (`lab-window`, scope `window`: no identity), and
828
+ `detachedFrameCapture` a detached identity's own window (`detached-window`), bounded like its frames. `window-video.ts`
829
+ notes when each page opened and refuses a video recorded outside the recordings (`videoDir`, `--video <dir>`, which wins
830
+ for the lab window) with why; it is a small copy of the Playwright adapter's helper, since an entry point never imports
831
+ an adapter (`tests/window-video.test.ts`, `tests/window-video-recording.test.ts`).
832
+
833
+ Backlog 31b (3 October 2026; live on Notes:
834
+ `bunx nx run notes:e2e:detached`). In the lab window an identity can run in a window of its own, emulating a device,
835
+ while its tile mirrors that window:
836
+
837
+ - **Choosing.** `product-lab dev --detach "Ada=Pixel 7"` (repeatable; the lab window's `detach` option) detaches an
838
+ identity of that name once it runs and no run is going on (one a run creates moves when that run ends), once: a
839
+ reattached one stays in its tile. A tile's caption has one **Device** menu (backlog 31a: the device its
840
+ tile shows the app as) and **Open in own window**, which opens the identity's window as that device (Desktop when the
841
+ tile fills its space; in a narrow tile only its icon); a detached tile shows the device and **Reattach**. An app that
842
+ refuses framing (backlog 66) keeps the menu in its caption and gets **Open in own window** in its refusal. An identity
843
+ moves only between runs, the lab window's own in-process runs included (`LabSnapshot.featureRun`): during a run
844
+ both are refused ("Refused: a run is going on; detach Ada between runs"). An
845
+ unknown device is refused with the nearest names. A window the person closes brings its identity back to its tile.
846
+ - **The window** (`src/visible/detached-window.ts`; detached-fix, 5 October 2026):
847
+ a browser context of its own in the lab window's
848
+ browser, opening the address the tile would show. It is the same host session and identity (the app through the
849
+ lab's proxy with the session's bridge); the app starts fresh in it, as after Restart app.
850
+ - A desktop device is a normal window: it opens at the device's size and the app follows the window when the person
851
+ resizes it (no fixed viewport).
852
+ - A phone or tablet is shown in its device frame (`#device`, `iframe#app`), centred and scaled to fit the window
853
+ (`data-scale`); the app inside has the device's own viewport, pixel ratio, touch and user agent
854
+ (`device-catalogue.ts`), whatever the window's size. The pixel ratio is set once when the window opens, on the
855
+ page and on the app's frame (a renderer of its own), never around a capture. `DetachedWindow.app` is the app's
856
+ frame and `appBox()` where the frame shows it.
857
+ - An app that refuses framing (X-Frame-Options, CSP `frame-ancestors`) is opened without the frame, at the device's
858
+ exact emulation, and its tile says so: "Ada's Pixel 7 window is shown without the device frame: the app refuses
859
+ framing" (`FRAMING_REFUSED`).
860
+ - `capture()` is a step's frame: the app alone, no device frame, its whole viewport at the pixels the window draws
861
+ (the display's when headed; 1 headless). It is one whole-window capture through a CDP session that emulates
862
+ nothing, with no clip (`viewport-shot.ts`'s rule): a clipped capture, or one through the session holding the pixel
863
+ ratio, is drawn on screen for a frame, and Playwright's own capture also dropped the device's pixel ratio for the
864
+ rest of the window's life. The app's part is cut, and fitted to its viewport, in the PNG worker (see the lab window's recording frames).
865
+ - **Running** (`detached-surface.ts`, `runner.ts`): a detached identity's steps act on its window's page, in an input
866
+ lane of its own, with the tile's checks: the identity's active app, the target in view and on top at its centre
867
+ (`elementFromPoint`, a read), then trusted input at that point (a touchscreen tap when the device has touch, else a
868
+ mouse click). Nothing is injected into the app: its document is unchanged by the lab (a test plants an injection and
869
+ fails). A window closed during a step fails that step, "Ada's detached window was closed", never retried in the tile.
870
+ Run recordings take a detached identity's frames from its window (`detachedFrameCapture`): each screenshot is
871
+ bounded by the recorder's own limit (`timeoutMs` of the capture; 5 s, `DETACHED_CAPTURE_TIMEOUT_MS`, when it names
872
+ none) and a late one fails its frame by name, never a silent stall. `AppSurface.device` is
873
+ the device; `AppSurface.conditions` throttles its CPU alone (`detached-conditions.ts`); its network is named
874
+ unavailable until backlog 31's routed conditions (Chromium's own emulation would also cut the link to the host).
875
+ - **Conditions on a tile** (lab-window finding 2d, 4 October 2026; `tile-conditions.ts`): before, Watch refused every
876
+ condition step ("The lab window's surfaces cannot apply a network condition") while a background run applied it. A
877
+ tile's surface now carries a network control: every request whose frame sits in that identity's tile
878
+ (`iframe[data-actor]`, nested frames included) goes through the domain's `trafficDecision` on the lab window's own
879
+ routes, the identity's local links to its host exempt (the runtime passes its session's); the lab's requests and
880
+ other tiles are untouched. The runtime applies the same condition to the identity's session beside it, since the
881
+ host's own connections (a native host's links) carry the tile's chain traffic. The Watch runner tells the plan what
882
+ each surface can apply (`surfaceConditions`): a tile its network, a detached window its CPU. Limits: a tile's own
883
+ WebSockets are not conditioned (Playwright's socket route names no frame, so one tile's socket cannot be told from
884
+ another's or the lab's); CPU is refused on a tile, "CPU per tile needs the detached window" (every tile shares the
885
+ lab window's renderer: all are 127.0.0.1, one site); a detached window's network stays unavailable.
886
+ `tests/watch-conditions.test.ts`: Grace offline in Watch, her tile's fetch fails and her session is told; Ada's tile
887
+ stays online; back online Grace reaches the server; a slower tile is refused with the reason; with the tile routing
888
+ disabled, Grace's tile still answered while offline (the control).
889
+ - **The condition strip** (redesign step 3; `client/tile-strip.ts`): under each tile's header, the condition the lab
890
+ window applies to that tile ("online"; "offline" red with its seconds; "slow" amber with its delay and rate in the
891
+ mono face), then the address bar and the pop-out ("Open in own window"). `TileConditions` reports each change to the
892
+ shell (`product-lab:tile-condition`) and keeps a record on the window (`__productLabTileConditions`); a reloaded
893
+ shell is told again. A condition a scenario step set on the identity's session (a Background run, or any run in a
894
+ tab that is not the lab window) comes with the snapshot (`LabSnapshot.actorConditions`) and shows when no tile
895
+ report does: named by its profile ("slow 3G", the CPU slowdown beside it), back to "online" when the scenario ends;
896
+ a step's throttle reported by the tile is named by its profile too.
897
+ `tests/tile-conditions-served.test.ts`: offline, slow, back online and a reload, driven by `TileConditions` on a
898
+ served shell; Grace's tile stays online and reaches its server while Ada's fails (the control); a step's slow-3g
899
+ from the snapshot, and online once it is gone.
900
+ - **The mirror** (`mirror.ts`, `client/detached-tiles.ts`): Chromium's DevTools screencast of the window, at most ten
901
+ JPEG frames a second, newest first, every frame acknowledged; Chromium only, refused by name elsewhere. The tile shows
902
+ the frames (`img[data-mirror]`), the ring of each gesture's target scaled onto them, and "mirror stopped: …" or "no
903
+ frame for 5 s" instead of an old frame shown as live. A framed window's mirror is cropped to the app
904
+ (`object-view-box`, `data-crop="app"`). The mirror only shows: input goes to the window.
905
+ - **Wiring** (`detached-identities.ts`): the registry the lab window creates (`LabWindow.detached`), the shell's
906
+ `__productLabDetach` binding (list, devices, detach, reattach; from the shell's main frame only) and the events the
907
+ shell listens to (`product-lab:detached`, `product-lab:mirror-frame`, `product-lab:mirror-ring`).
908
+
909
+ Tests: `tests/detached-window.test.ts` (the device the app sees, a desktop window the app follows when resized, a
910
+ phone in its frame scaled to fit with the app's viewport and pixel ratio unchanged by the window or a capture, an app
911
+ refusing framing, tap and click, the unchanged document, refusals, a window closed mid-call, the mirror, CPU) and `tests/detached-lab-window.test.ts` (in the lab window: `detach` by name,
912
+ a scenario mixing a detached phone and a tile, the mirror and its ring, refusals during a run, Reattach, a closed
913
+ window, backlog 66). Not yet: a lab's own `defineLab({ windows })`, hot reload of a detached window, and input from
914
+ the mirror.
915
+
916
+ ## Lab menu and Settings
917
+
918
+ Panel redesign step 6 (`src/client/lab-menu.ts`, `lab-menu.css`, `src/client/settings.ts`, `view-settings.css`;
919
+ lab-mockups `6-lab-menu`, `8-settings`; tools-page `9-tools-menu`). The bottom bar's Lab button opens the menu: Current
920
+ run (R), Scenarios (S), Recordings and replays (P), Builder (B), Chain console (C, the Environment view's console,
921
+ opened), Environments (E), Tools (T) and Settings (,), then More: Identities, Run timeline, Past runs, Evidence & reports,
922
+ Config and Find anything (⌘K). Config (`src/client/view-config.ts`, `view-config.css`; config redesign, 6 October 2026)
923
+ shows the loader's resolved config (`registry.config`) grouped and worded as `product-lab config` prints it
924
+ (`@product-lab/domain/lab/resolved-config`, served as `/resolved-config.js`): one card per group, each value with a
925
+ source chip (yours, default, detected, advanced), its key and why, "Change it:" with the line to write (copyable) and the
926
+ other values it takes, greyed; a search narrows it; a value from a secret shows its variable's name only
927
+ (`tests/config-view.test.ts`, docked right and bottom at the default width and 280 px, over a fixture and over the
928
+ loader's real resolved config; controls: no config shows the empty state, a squeezed value is caught as cut). While no
929
+ environment runs (before the first start, or after Stop; backlog 194, 8 October 2026) the client reads `/api/config` once
930
+ per stop: `LabRuntime.registry()`'s config, from the catalog's registry when nothing runs, or `null`, which draws the
931
+ empty state ("a stopped lab", over the real loader; control: a stopped lab whose loader gives none). What a
932
+ product config leaves off or unset (`offConfigItems`, `configEntryOff`) is shown greyed with the loader's line, never
933
+ hidden: in Config ("Turn it on:", "Set it:", a set or not set chip on entries naming variables), in the Environments
934
+ list and the chain picker under "Not on in this lab" (the local dev chain turned off, Local copy of Previewnet,
935
+ Chopsticks, a live network not listed, one with no people, one whose person's variable is unset: "Not set · run
936
+ export …"), and in New identity's host menu (a host turned off, dot.li), the config's line winning over the session's.
937
+ Each line sits in a block of its own under its words, the copy button at its right (`configLine`), its tokens wrapping
938
+ whole (`codeTokens`: never at a hyphen; a token breaks only when it alone is wider than the block; the Config view's line too)
939
+ (`tests/greyed-config.test.ts`, over the real loader's resolved config, docked right and bottom at the default width and
940
+ 280 px, with the copy button on the code block's row and no token broken; controls: a hidden row, one at full strength,
941
+ the copy button pushed under the code, a token broken mid-word and an entry gone each fail). An older definition keeps
942
+ the kind-based rows (`ENVIRONMENT_KINDS`). The Environment view's Advanced facts name a topology's profile in people's words (`profileWords`: the local dev chain adapter
943
+ is the "Local dev chain (Omni Node)"). Actions & blocks, Extensions and Characters are tabs of Tools ([the Tools page](#the-tools-page),
944
+ user decision, 5 October 2026); `src/controls.ts`'s `openSection` reaches a tab through Tools. A key opens its place anywhere in the lab, its own window included, unless it is typed into a
945
+ field or a dialog or carries a modifier (an app's keys stay in its frame); Escape or a press outside closes the menu.
946
+ Settings is a sectioned list, one row per setting: Lab window (Show cursor, Cursor speed; outside the lab window they
947
+ say why they cannot change) and Appearance (Theme: dark, light or system, which follows the system's preference live;
948
+ nothing saved follows the system). Choices are kept in the lab's local state through the lab server (GET and POST
949
+ `/api/settings`; `LabRuntime.settings()`, `<lab>/.product-lab/settings.json` by the composition root), read when the
950
+ window starts, so they outlive the lab window's fresh browser context on every launch; a saved choice wins over the
951
+ default. A change the server refuses is shown under the list and holds for that page only. Tests: `tests/lab-menu-model.test.ts` (keys, theme),
952
+ `tests/lab-menu.test.ts` (the served menu and Settings in the lab window), `tests/cursor.test.ts`,
953
+ `tests/cursor-mode.test.ts` (the default).
954
+
955
+ ## Identity cursors
956
+
957
+ Backlog item 48, show mode (29 September 2026). For
958
+ demos and for following several identities at once: each acting identity gets its own cursor over its tile, named and
959
+ in the identity's colour (`--actor-tone`), which glides to the target while the highlight is held and ripples at the
960
+ real click (`src/client/show-cursor.ts`, `show-cursor.css`). It is drawn by the shell, never inside the app, with
961
+ `pointer-events: none` and `aria-hidden`, so hit tests and the app's own events are unchanged; a cursor that has not
962
+ moved for 4 s fades. It is drawn above its identity's highlight ring (both in the tile, the ring one `z-index` below)
963
+ and under the lab's menus, dialogs and toasts, since the tile is its own stacking context (`tests/cursor.test.ts`). On by default in the visible, headed lab window
964
+ a person watches; off in a headless one (tests, CI) and in Background runs, which act on headless pages
965
+ (`labWindowCursor`, docs/panel-redesign.md "Decisions"). `openLabWindow({ cursor: true | false | { speed } })` (CLI
966
+ `--cursor`, `--cursor-speed slow|normal|fast|<ms>`) sets it, and [Settings](#lab-menu-and-settings) turns it on or off
967
+ while the window runs: Show cursor, and Cursor speed slow (700 ms), normal (350 ms) or fast (150 ms). A choice saved
968
+ in Settings wins over the window's mode at the next load. Settings talks to the runner through the window binding `__productLabCursorMode`
969
+ (`CURSOR_BINDING`, `parseCursorMode` refuses a malformed request); the runner reads the mode before each gesture, so a
970
+ change applies to the next one.
971
+
972
+ - Timing: the glide is `cursorGlideMs(speed, visibleDelayMs)`, never longer than the highlight delay it runs in; it
973
+ starts in the lane's shell call with the ring (no call of its own, since 30 September 2026), and the ripple is a
974
+ `page.evaluate` the runner does not await, so input is never later than without the cursor. Off, the runner sends
975
+ nothing to the page for cursors (`VisibleOptions.cursor` returns undefined).
976
+ - Reduced motion: the cursor moves without gliding and the ripple is a still ring.
977
+ - Tests: `tests/cursor-mode.test.ts` (the cap, the request checks), `tests/cursor.test.ts` (the lab window, two
978
+ fixture identities acting at once: off sends no call; on, each cursor in its own tile with its name and colour, the
979
+ glide capped at the 300 ms delay, the ripple at the button's centre before the app's click, the point still hitting
980
+ the app frame, holds not lengthened, the speed item, reduced motion, off again removes the cursors).
981
+
982
+ ## Package
983
+
984
+ | | |
985
+ | --- | --- |
986
+ | Nx project | `shell` (folder `entrypoints/panel`, the target name; the package keeps its pre-refactor name) |
987
+ | Tags | `scope:core`, `layer:shell`, `type:driving` |
988
+ | Exports | `.` (`src/index.ts`: `serveLab`, `WATCH_REFUSAL`, `NO_WINDOW_WATCH_REFUSAL`, `ServeOptions`; Phase 4: `panelFeatures`, `featureControl` (whether a run is a control its tags judge: `{}` for a tagged scenario or file), `featureBindings`, `exactName`, `PanelFeatureScenario`; backlog 182: `panelRunsDirectory` (where the window's feature runs keep their reports, which the terminal app's runs share); Phase 5 (d): `extensionViews`; panel-gherkin: `featureSelection`, `PanelFeatureSelection`), `./visible` (`src/visible/index.ts`: `openLabWindow`, `attachLabRunner`, `attachRunner`, `visibleAppSurface`, `VisibleSurfaceOptions`, `summarizeUiCalls`, `UiCallTiming`, `UiCallSummary`, `UiActorTiming`, `UiCall`, `UiCallSegment`, `UiPhase`, `uiActivityFeed`, `UiActivityFeed`, `UiActivityCall`, `UiActivitySegment`, `UI_CALL_EVENT`, `UI_CALLS_BINDING`, `describeTarget`, `visibleUi`, `showRing`, `assertFrameDisplayed`, `actorFrameSelector`, `reportFrameLocations`, `FRAME_LOCATION_EVENT`, `FrameLocation`, `labWindowFrameReloader`, `FRAME_RELOAD_TIMEOUT_MS`, `RUNNER_BINDING`, `FEATURE_BINDING`, `BUILDER_BINDING`, `CURSOR_BINDING`, `parseCursorMode`, `CursorMode`, `CURSOR_SPEEDS`, `cursorGlideMs`, `CursorSpec`, `CursorSpeed`, `LabBuilderRunRequest`, `LabFeatureRunRequest`, `LabFeatureRunResult`), `./main` (`src/main.ts`: `main`, `PANEL_USAGE`, the standalone panel entry), `./controls` (`src/controls.ts`: the lab window driven through its own visible controls, `openSection`, `closePanel`, `openScenario`, `featureScenarioId`, `runScenario`, `openBuilderDocument`, `openRecording` and the rest; the panel's browser tests and the capture scripts share it, so a control that moves changes in one place), `./rebuild-rule` (`src/rebuild-rule.ts`: `REBUILD_RULE`, `SHOWS_ATTRIBUTE`, the rebuild counters' one rule, for the panel's and examples' tests), `./host-bypass-words` (`src/client/host-bypass-model.ts`: `hostBypassAudit`, `CATEGORY_WORDS`, the evidence view's host-bypass words, pure; the CLI's HTML report says its summary with them, backlog 148), `./words` (`src/words.ts`: the window's words other views say the same way, `personLabel`, `clockWords`, `originWords`, `originHelp`, `runWrites`, `writesHeadline`, `wroteNothing`, `environmentFit`, `needsWords`, `isNegativeControl`, `keepWords`, `turned`, `KEEP_TITLE`, `KEEP_ABOUT`; the CLI's terminal app reads them, backlog 182), `./react` (optional browser factories and React), `./react/prepare` (Node-only `prepareReactUi`) |
989
+ | Depends on | `@product-lab/composition`, `@product-lab/domain` (the pure helpers the browser panel and the server share), `@product-lab/ports` (the Browser port and `LabRuntime`), `@product-lab/core` and `@product-lab/application` (tests only: `compileLab` fixtures and `LabRuntimeService.adopt` over fixture environments), `typescript` (transpiles the panel on request), `playwright` 1.63.0 (`./visible` and the `Page` type of `./controls` only), `react`/`react-dom` 19.3.0 (optional `./react` helper only), `esbuild` 0.28.2 (Node-only `./react/prepare`) |
990
+ | Used by | `@product-lab/cli`, `examples/notes` and another example, `tools/spikes/browser` |
991
+ | May not be used by | `layer:core` projects (domain, ports, core, contracts) or `layer:mcp` |
992
+
993
+ Tests: `bunx nx run shell:test` runs both `shell:test:unit` and
994
+ `shell:test:browser` as independently cached Nx prerequisites. Each target
995
+ hashes the exact discovered test files it runs, plus shared panel source,
996
+ fixtures and production dependencies, including the Playwright browser adapter
997
+ loaded by extension-lifecycle fixtures. A unit-only test edit can reuse the
998
+ browser result. The same full suite runs with `bun run test` from this package.
999
+ The runner discovers every `tests/*.test.ts` file, so a new file is always
1000
+ covered; browser fixtures are listed in `tests/run-tests.mjs` for the browser
1001
+ target, and since 6 October 2026 the runner refuses a file that launches a browser but is not listed
1002
+ (`tests/browser-launch.ts`). Node runs up to three unit files at once; browser files run at half the CPUs, between three and eight, within
1003
+ memory (`tests/browser-concurrency.ts`; `PANEL_BROWSER_CONCURRENCY=<1-16>` overrides; 109 s at three, 48-64 s at eight on a
1004
+ 16-CPU machine, backlog 30). `PANEL_BROWSER_SHARD=<n>/<count>` runs one share of the browser files, dealt by
1005
+ their measured seconds (CI's three browser runners). Browser tests share one headless Chromium per file worker and
1006
+ open separate page contexts. `boot-cover.test.ts` and `release-notice.test.ts` keep their own launch
1007
+ (`launchBrowser`) for a distinct `handleSIGINT` option; the visible-window fixtures launch
1008
+ through `openLabWindow({ launch: launchBrowser })`.
1009
+
1010
+ Every test page opens as GitHub's Linux runner opens it, on any machine: English (United States) at UTC
1011
+ (`tests/shared-browser.ts`, `PAGE_DEFAULTS`; `tests/page-defaults.test.ts`). A test that checks another locale or time
1012
+ zone passes its own `locale` or `timezoneId`. Text is a little wider on the runner than on macOS (the same fonts, drawn
1013
+ by Linux's Chromium): `PANEL_BROWSER_TEXT=wide` spaces every letter 0.03 em wider, so a row that only just fits here
1014
+ fails here as it fails there. Run the wrap and cut tests so before a change to the panel's layout:
1015
+ `PANEL_BROWSER_TEXT=wide node --import tsx --test tests/text-wrap.test.ts tests/identity-rows.test.ts tests/tile-header-fit.test.ts`.
1016
+
1017
+ ## The grid of tiles (backlog 125)
1018
+
1019
+ In the grid (two or more tiles) each app is shown whole instead of cut. A fill tile at least the minimum layout
1020
+ (480×280, `FIT_REFERENCE`; within 5% of it, `FULL_SIZE_FROM`) shows its app at 100% in the tile's own size; a smaller one lays the app out at that minimum
1021
+ in the tile's aspect (so the app fills the tile) and draws it scaled from the top left (`fitStage`); a device tile fits
1022
+ by its device's viewport (below). The grid takes the column count that gives the largest scale across its tiles (a tie: fewer empty
1023
+ cells, then more columns), never with tiles narrower than 220 px (`MIN_TILE_WIDTH`, so the header keeps the name and
1024
+ both pills: fewer columns instead). Under 30% (`SCALE_FLOOR`) it stops shrinking: as many columns as keep every app at 30%,
1025
+ rows of that height (never taller than the stage), and the stage scrolls; the runner's reveal scrolls an acting tile
1026
+ into view. The header says the scale of a scaled app ("56%", `.tile-scale-chip`; none at 100%); when the room left would cut the name, the chip gives way first, then the name's
1027
+ ellipsis; the avatar stays. One tile (the single views) fills its space at scale 1, as before. The narrow window's
1028
+ side-scrolling row is gone: the same rule lays out every width. Measured at 1024×768 with the panel docked: four people
1029
+ 2×2 at 56% (before: one column of 143 px tiles); at 1440×900, 2×2 at 100% as before. `src/client/tile-grid.ts` (`gridLayout`,
1030
+ `fitStage`), `layoutGrid` in `src/client/app-tiles.ts`; tests `tests/tile-grid.test.ts` (unit) and
1031
+ `tests/tile-grid-window.test.ts` (the lab window: two to six people at 760, 1024 and 1440 px, panel open and closed;
1032
+ every name shows six characters or in full; control: the old auto-fit), `tests/window-frames.test.ts` (a step frame of a scaled tile is its scaled box).
1033
+
1034
+ ## Device-sized tiles (backlog 31a)
1035
+
1036
+ A tile can show its identity's app at a device's exact CSS viewport, scaled down to fit (never up). The device is the
1037
+ app's declared one (`defineLab({ apps: { <id>: { device } } })`), else the identity's choice in the tile's device menu,
1038
+ which lists `GET /api/devices` (`src/visible/device-catalogue.ts`, Playwright's registry, loaded on request) and keeps
1039
+ the choice in that browser per lab, environment and identity. The caption shows the device, its viewport and the
1040
+ scale (`Pixel 7 · 412×839 · 64%`); a change reloads the app ("Reloaded as Pixel 7") and is refused while that
1041
+ identity's step runs. A phone (a profile marked `mobile`) is drawn as one, as in the design: a 10 px bezel with a
1042
+ notch (`--phone-bezel`), centred in the tile with room around it, the screen scaled into the bezel (`PHONE_BEZEL`,
1043
+ `PHONE_ROOM`). Clicks, the target ring and the cursor place the target from the frame's box times its scale in a frame scaled
1044
+ evenly (`visible-ui.ts`, since backlog 125); any other transform uses Playwright's own box of the target (`transformed`). Pixel ratio, touch and the user agent are not emulated in a tile (backlog 31b). The menu is
1045
+ the header's device pill (a monitor or phone icon and the device's name), beside the host pill (`ActorSession.host`'s
1046
+ label, "truAPI CLI" or "truAPI WASM", or the lab's own `hosts.<id>.label`; none when the lab does not know the host). An identity that plays a scenario actor under
1047
+ another name in the latest run (a lab bound its own "Person 1" to "Ada") reads "Person 1 · as Ada" after its name, muted
1048
+ and smaller, and it gives way before the pills; an identity named after its actor reads just its name (`playedRoles` in
1049
+ `src/client/views.ts`, from the run's `bindings`; tests `tests/played-roles.test.ts` and `tests/tile-role.test.ts`). In a tile narrower than 560px the caption's device
1050
+ text hides; narrower than 320px, or on a phone (a window under 760px), both pills show their icon only, and the device
1051
+ pill still opens the same list. The strip shows the app's origin and path in the mono face ("127.0.0.1:5173/").
1052
+ `src/client/tile-device.ts`; tests `tests/tile-device.test.ts` (unit) and `tests/tile-device-served.test.ts` (browser:
1053
+ the device's viewport in the tile, a Watch click in the scaled app's bottom-right corner, refused during a step, fill
1054
+ back, the icon menu in a narrow tile).
1055
+
1056
+ Each identity row says where the identity came from and when ("Opened when the lab started, at 23:40", "New identity,
1057
+ made at …", "Made by a run of …", "Came with the saved state …"; its tooltip says how to make one, `identity-words.ts`),
1058
+ its username only when it has one, and its host by name. New identity's host menu lists the hosts the lab could add but
1059
+ does not declare (`unconfiguredHosts`), greyed, each with what it is and the config that turns it on
1060
+ (`tests/identity-rows.test.ts`).
1061
+
1062
+ ## UI audit fixes (September 2026)
1063
+
1064
+ Optional feature scenarios and the builder stay hidden when their runtime capability is absent. The panel API
1065
+ marks this case with `UNSUPPORTED_CAPABILITY`; other list or palette failures show a retry message instead of
1066
+ appearing empty. A failed extension list shows an inline alert. Switching environments clears the old lists and
1067
+ palette while the new requests run, and late replies from the old environment cannot replace them.
1068
+
1069
+ Feature and builder results show failed steps, hook errors and runner failures inline, with full errors in
1070
+ expandable details. A tagged negative control without an expected step/reason verdict is never counted as verified
1071
+ (Runs above: "Failed at one step · reason not checked"); a red run alone does not count. Feature/builder bindings prefer fresh identities when creation is available and
1072
+ explain that choosing a saved identity keeps its app and chain state. Sessions that cannot create another identity
1073
+ disable that choice. Ordinary action bindings still default to saved identities.
1074
+
1075
+ The toolbar follows feature/builder status and checkpoints as well as actions. Long labels preserve their status prefix; narrow screens show the execution state, with full detail in the title. Identity rows label app session status separately from execution. Short durations show milliseconds,
1076
+ and running step durations refresh between snapshots. Builder headers and fields wrap within the panel; a table too
1077
+ wide for its card scrolls in its own frame. Environment switching uses adapter prerequisite problems before offering a switch.
1078
+
1079
+ Focused regression: `node --import tsx --test entrypoints/panel/tests/ui-functional.test.ts` from the repository root
1080
+ (served panel and headless Chromium on an ephemeral port; fixture records, not chain verification).
1081
+
1082
+ ## A failure never blocks
1083
+
1084
+ 6 October 2026, backlog 154 to 156. It replaces
1085
+ Reconcile (5 October 2026): a failed run never blocks
1086
+ the lab, so there is nothing to reconcile.
1087
+
1088
+ - **The failed step** (`src/client/after-failure-view.ts`, `.rs-after-failure[data-state]` under its error,
1089
+ `run-steps.ts`): when it may have sent a transaction, the lab checks the chain by itself after the run. The line
1090
+ shows `checking` with a spinner and "This step may have sent a transaction. The lab is checking the chain; other
1091
+ scenarios can run meanwhile.", then `answered` with what it found ("It did send: … landed in finalized people #N",
1092
+ "Nothing was sent: …", "The lab cannot tell whether it sent anything: <why>. Check the chain before repeating it.").
1093
+ The words wrap. Its Chain card shows the step's reconciliation (`#5 final`, `did not land`, `unknown`).
1094
+ - **Run scenario and New identity stay enabled** after any failed run: only the environment itself disables them
1095
+ (`blockedReason`: its setup or cleanup failed, or it lost what it runs). Then the status line says so plainly with
1096
+ one button, Reset. A run that would act as an identity whose failed step is still being checked is refused with
1097
+ the reason in the status line, and runs a few seconds later.
1098
+ - **Any status message** that names Reset or Restart offers that button when the window can do it now
1099
+ (`status-actions.ts` `namedActions`, `#status-<action>`; every button carries `data-lab-action`, one listener in
1100
+ `lab-actions.ts` presses the window's own control); Restart (`environment-lifecycle.ts`) confirms, stops and
1101
+ starts the environment (starts it when a failed start left it stopped). A list that failed to load (features,
1102
+ builder: `RetryableError`; extensions in its own box) offers Try again. A tool report's paragraph that names them
1103
+ offers them too (Explore's "Reset it, then explore again").
1104
+ - **The Shared activity lane** names a held account by who it is (`lanes.ts` `resourceName`: "Grace's account", the
1105
+ address on hover) and keeps each chip on one line with an ellipsis, the full text as its title.
1106
+ - Tests: `tests/status-actions.test.ts`, `tests/lanes-shared.test.ts`, `tests/bindings.test.ts` (served: the failed
1107
+ step's check then answer, no Reconcile anywhere, Run and New identity enabled, the next run at once),
1108
+ `tests/client-list-errors.test.ts` (Try again).
1109
+
1110
+ ## Runs: Current, History, Evidence
1111
+
1112
+ The Runs group (`src/client/view-runs.ts`, styles in `src/client/view-runs.css`, model in `src/client/run-progress.ts`)
1113
+ is a presentation over the existing controllers: it reads the snapshot and clicks the legacy buttons
1114
+ (`#continue`, `#pause`, `#cancel`, `#feature-continue`, `#feature-step`, `#feature-pause-now`, `#feature-cancel`),
1115
+ which stay in the document, hidden, as do `#steps`, `#feature-status`, `#feature-outcome` and `#feature-progress`.
1116
+
1117
+ - **Current** shows the latest run (a configured run or a feature run, whichever started last), or the one chosen in
1118
+ History: its heading is the scenario's name and where it is written ("team.feature:4"), then its steps, with no box
1119
+ around them. The run's state is said by its steps and the bottom bar; a run picked in History and a negative
1120
+ control's verdict keep a status chip. The controls are the bottom bar's (`#dock-run`, `#dock-step`, …); in the lab's
1121
+ own window, which has no bottom bar beside it, the card shows them. A feature run's steps are drawn by `renderGherkin` (Background first) with each step's
1122
+ live state: the running step shows what it waits for (a wait, a transaction in flight, the identity being created),
1123
+ a paused run marks the next step, a failed step says why in plain words (no class name, no stack). The recorded
1124
+ error and a terminal command are under "Details". Configured runs use the same timeline without keywords.
1125
+ Continue, Step, Pause and Stop (click twice) are icon buttons in the card; transactions and activity lanes
1126
+ (`#lanes-table`, one row per actor, a chip per thing it did) are disclosures; a failed step that may have sent a transaction
1127
+ shows the lab's check, then its answer ([A failure never blocks](#a-failure-never-blocks)).
1128
+ - **Negative controls** are never shown as a plain failure or a pass. The file's `@negative-control` tag makes it a
1129
+ control, everywhere (since 6 October 2026: before, its folder or a declaration alone did, so a file whose tag was
1130
+ removed still read "expected to fail"; `src/feature-control.ts`, `tests/negative-control-tag.test.ts`). Its tags judge
1131
+ it (tag-only controls, 6 October 2026: `@fails-at-step-N`, `@fails-with:<reason>`) when the panel or the terminal
1132
+ runs it, in the background or in Watch: `/api/feature-run`, the lab window's feature binding and the TUI pass
1133
+ `featureControl(listing, path, selection)` as the run's `control`, from the selected
1134
+ scenario's own tags (one scenario of a file whose other scenarios are not controls runs unjudged; Watch did not judge
1135
+ before 4 October 2026, `tests/watch-negative-control.test.ts`, with a planted `@fails-with` control). Under the
1136
+ verdict, the failure it judged: `<reason>: <message>` (`.run-control-failure`, `.run-why-failure`,
1137
+ `data-control-reason`), and the "Judge it from a terminal" command is `product-lab test <file> --negative-control`.
1138
+ The tags are the only declaration (config redesign, step 8: lab.config.ts `negativeControls`, its warning chip and
1139
+ the `--expect-*` command are gone; a run bundle's rerun alone is still judged at the step and text its run failed
1140
+ with). A judged control
1141
+ it reads **"Failed as intended"** (at its step, for its reason; since 6 October 2026 its failed step says "The lab caught
1142
+ it: the negative control failed here, at its step and for its reason" in the control's info tone, `data-caught` and
1143
+ `.rs-caught`, and "Why?" opens with "The lab caught it") or **"Failed for another reason"** (danger, with
1144
+ "Why?" naming what did not match). A control run that was not judged and failed at exactly one scenario step
1145
+ reads **"Failed at one step · reason not checked"** (warning; "Why?" says to run it as a control, its tags saying where and why). Anything
1146
+ else (it passed, it failed in a hook or the runner, several steps failed) reads "Control not verified".
1147
+ - **Timeline** (29 September 2026): the same run as a waterfall, per identity and step ([Run timeline](#run-timeline)).
1148
+ - **History** (`#session-history`, rows `.run-list-item`) has one row per run: a feature run is one entry, never one
1149
+ per step, grouped from the feature run records the page saw and, for runs from before it loaded, from their step
1150
+ runs (`feature:<scenario>#<step>`). No internal ids are shown. Choosing a row shows the run in Current and Evidence.
1151
+ - **Evidence** has Steps, Transactions, Navigation (the "Follow navigation" switch, `#follow-navigation`, and
1152
+ `#navigation-events`, a row per request with its outcome chip; the whole request is the row's tooltip) and Receipts
1153
+ (`#load-evidence` and `#check-transactions`, pointed at the run shown; a feature run picks one of its step runs;
1154
+ `#landing`; the run record `#evidence` as JSON). "Chain observations" (`#observe`) stays at the bottom.
1155
+ - **The dock's line** (`#compact-progress`, `data-compact`) is short, its first word (the state) bold: "Running step
1156
+ 3 of 10 · 0:21", "Paused after step 3 · your turn", "Passed · 12s", "Failed at step 3", "Failed at one step", "Replay
1157
+ <run>" (read only is said once, by the replay's banner); the whole sentence (a pause names the step it waits after) is its tooltip. An environment
1158
+ operation of its own (a switch) writes its phase there.
1159
+ - **The status lines under the tabs** (`.drawer-status`): the lab's own errors on every tab; the busy notice
1160
+ ("Ada · running. The shared environment runs one scenario at a time…") outside the Run tab, whose steps already
1161
+ say what runs; a failed run's own line (`#status[data-run]`) is left to its steps and the dock's line.
1162
+ - **The dock's controls** follow the run's state (lab-mockups 1 to 4, `tests/dock-controls.test.ts`): Run when ready;
1163
+ Pause and Stop while a run runs; Continue, Step and Stop (its square alone) while paused; after a failure Replay (the
1164
+ newest recording, in the Recordings tab), Rerun and a bug button that opens the run's Evidence; in a replay, the
1165
+ previous step, Play and the next step. Each one clicks the control its view owns (`features.ts`, `client.ts`,
1166
+ `recordings.ts`), so the rules about when it may act stay there. Watch | Background stays pressed, not faded, while
1167
+ the choice is locked. Recordings sits beside it, apart: it opens the session's recorded runs to replay and runs
1168
+ nothing (0e's first-time-user audit, 6 October 2026, item 11).
1169
+ - **No step caption over a tile** (the redesign): the step running now is in the Run tab's steps, and its place in
1170
+ the dock's line ("Running step 3 of 7").
1171
+ - **A step's checks in words** (`src/client/run-steps.ts`, 5 October 2026, the user's feedback): under the selected
1172
+ step a heading says where it was verified (`checksHeading`: "Verified on Grace's screen and on the chain"; a side
1173
+ under way or failed says so, "…; checking on the chain"; a side with nothing to check, "…; no chain check for this
1174
+ step"), not "Checked twice". Each UI call is a sentence with its target named as a person would (`callWords`:
1175
+ "clicked Publish", "typed "Grace was here" into Note", "waited for the Publish button"): the name the lab read in
1176
+ the app when the call found its target (`nameTarget` in `src/visible/app-ui.ts`, and the detached window's surface:
1177
+ the accessible name or label, a button's text, else the test id in words; recorded as `UiCallTiming.targetName`,
1178
+ `targetRole`, a fill's `typed` text shortened to 24 characters, never a password's or one-time code's,
1179
+ `typedHidden`), else the locator's own words, else its test id in words. The locator itself is only under Evidence.
1180
+ A row whose words already name its person later, beside a role ("Grace (Person 2) publishes"), opens with the
1181
+ avatar alone, so the name is said once (`stepLead`).
1182
+ - **Setup** (29 September 2026): a run the setup
1183
+ principal owns (a feature step whose calls include a sentence declared `actor: "none"`, once the scenario has actors;
1184
+ `Execution.owner` setup, `actorId` empty) is labelled "Setup" in the busy notice, the status line and Cancel, and
1185
+ "Setup" joins the names in Current, History and Evidence. Its setup steps say "Setup" where a step names who acts,
1186
+ have an activity lane of their own ("Setup"), and their `principal:setup` lock is that lane's, like `actor:<id>`.
1187
+ Setup work belongs to no identity: an identity's run list shows such a run only when one of its steps acted as
1188
+ that identity, Show active points at no identity for it, and Follow action follows nobody while
1189
+ a setup step runs. `src/client/principals.ts` applies the domain's rules (`@product-lab/domain/actors`,
1190
+ `principal.ts`, served as it is).
1191
+
1192
+ Tests: `tests/runs-model.test.ts` (the model), `tests/ui-functional.test.ts` (the served card: failure, control,
1193
+ runner error, configured run), `tests/views-lanes.test.ts` (Continue in the card, lanes), `tests/setup-principal-views.test.ts`
1194
+ (Setup in the labels, lanes, identity views and Follow action), `tests/bindings.test.ts`
1195
+ (Receipts, a failure that blocks nothing), `tests/navigation-follow.test.ts`, `tests/workspace-shell.test.ts` (the dock's line).
1196
+
1197
+ ## Breakpoints and the pause inspector
1198
+
1199
+ Backlog 17 (30 September 2026). In the scenario detail
1200
+ (`src/client/view-scenarios.ts`) each step's rail is a toggle (`button.gk-break`, `aria-pressed`,
1201
+ `li[data-breakpoint]`; `renderGherkin`'s `breakpoints` option in `src/client/gherkin-view.ts`): it sets or clears a
1202
+ breakpoint on that step, and a bar above the steps counts them, says why one is stale (its step changed since it was
1203
+ set) and clears them all. Breakpoints are the lab's local state (`LabRuntime.breakpoints()`, stored in
1204
+ `<lab>/.product-lab/breakpoints.json` by the composition root), never written into the feature file; the CLI's
1205
+ `product-lab breakpoints` edits the same list.
1206
+
1207
+ A feature run the panel starts (Watch through the lab window, `executeFeature`, or Background, `/api/feature-run`)
1208
+ passes `inProcess.breakpoints`, so it pauses **before** each breakpoint at the feature pause gate; a builder run or a
1209
+ fixture build does not. While it waits, Runs > Current shows the pause inspector (`src/client/pause-inspector.ts`,
1210
+ `#feature-inspect`, styles `.pause-*` in `view-runs.css`), read from `LabRuntime.inspectPause`: where it waits
1211
+ ("Paused before step 3 (breakpoint)", `src/client/checkpoint.ts`), the next step's calls with their values (an output
1212
+ reference with what it resolves to now), the outputs so far, each identity the scenario bound (its nonce and balances
1213
+ on every chain, its app, the app the host shows now, and a fresh frame served by `GET /api/pause/frame`), the newest
1214
+ finalized blocks' events (those naming an identity first, the rest in a disclosure) and notes on anything that could not
1215
+ be read. Refresh reads it again; Continue, Step and Cancel are the dock's alone (until 5 October 2026 the inspection
1216
+ repeated them). Its headings are in sentence case, and step text and scenario names are in typographic quotes (“…”), so
1217
+ a step's own straight quotes read as its own; the breakpoint list and its reasons quote the same way. A run that stops at
1218
+ a breakpoint brings the Runs section forward. The inspection sits on the paused step, under its words (mockup 2; `RunStepsOptions.pausedDetail`), and the
1219
+ step's words are scrolled into the panel's view once per pause, so the step it waits at is shown without scrolling
1220
+ however tall the inspection is (until 5 October 2026 it sat above the steps and pushed the paused step out of view).
1221
+ While paused, the run card renders again only when what it shows changes: its key no longer holds the run's duration,
1222
+ which rebuilt the card every second and pulled a person's scroll back. It still rebuilds when a chain check settles, a
1223
+ transaction's age moves or a control's state changes; the card is emptied and refilled in one task, so the scroll
1224
+ holds (a real Notes lab, 5 October 2026: 11 rebuilds at two pauses, no movement; docs/verification/2026-10-05-paused-step.md). After the run `#feature-breakpoints` lists each
1225
+ breakpoint, before the steps: hit, missed (the run was cancelled before it, or an earlier step failed) or stale.
1226
+
1227
+ Routes: `GET /api/breakpoints?path&scenario`, `POST /api/breakpoints` (`{ action: "set" | "clear", path, scenario,
1228
+ index? }`, answers the list), `GET /api/pause` (`frames=0`, `blocks=n`), `GET /api/pause/frame?identity=` (PNG).
1229
+ Tests: `tests/breakpoints.test.ts` (lab window: the rail sets one, a Watch run pauses before it with the inspection
1230
+ on the paused step, the step in view and the panel's scroll held for 3 s, also across a forced rebuild of the card (a guard against a rebuild that lays out an empty card in between), Continue passes; control: a Background run's breakpoint on a step that never runs is reported missed with why).
1231
+
1232
+ ## Runs: Recordings (read-only replay)
1233
+
1234
+ Phase 9. The Recordings tab of the Runs group
1235
+ (`src/client/recordings.ts`, `src/client/view-recordings.css`, `src/client/view-replay.css`) lists the lab's recorded
1236
+ runs (`GET /api/recordings`, newest first) and opens one in a replay viewer (`GET /api/recordings/<id>`), laid out as
1237
+ the redesign's mockup 4. The panel keeps its normal width and lists the recorded steps (how each ended, who acted, how
1238
+ long it took), then the selected step's failure; its chain notes, compact (`src/client/replay-chain.ts`): a row per
1239
+ chain, "people #161 → #173 · final", with when each head was observed as its tooltip; a line per transaction, long ids
1240
+ (accounts, hashes) shortened with the full label as tooltip and a copy button; the blocks no transaction line names; and
1241
+ its redacted evidence; "Where the time went" draws the recording as a [run timeline](#run-timeline). The stage shows a tile per
1242
+ identity (`#replay-stage`, in the live app's place) with its frame before or after the selected step (`GET
1243
+ /api/recordings/<id>/frames/<frame>`, the stored PNG; a frame that is unavailable, failed or missing shows its reason,
1244
+ never another identity's image), the acting identity's tile outlined. In the stage's slots: a banner over the tiles
1245
+ (`#replay-ribbon` in `#stage-banner`: the step and its title, wrapped rather than cut; the before/after switch
1246
+ `#replay-side`; "Read only" with a lock, said nowhere else; an (i) `#replay-about` whose tooltip holds when and where it
1247
+ was recorded and the capture notes, synthetic camera and microphone media included (said there only, not on each tile
1248
+ nor in the panel's title); Back to live `#replay-back`, the only one) and a step
1249
+ scrubber under them (`#replay-scrubber` in `#stage-scrubber`: a dot per step at its time in the run, and the saved
1250
+ screenshots' controls `#replay-frame-previous`, `#replay-play`, `#replay-frame-next`, `#replay-frame-position`; Play
1251
+ shows them one by one, 1.5 s apart, each on its identity's tile). A step row, a scrubber dot, the arrow keys and the
1252
+ bottom bar's previous, Play and next (`RecordingsView.controls()`) step through it.
1253
+
1254
+ - **Read-only.** The server has only GET routes under `/api/recordings` (a POST is "Unknown action"); they read the
1255
+ store through `LabRuntime.recordings()`, `recording(id)` and `recordingFrame` and need no running environment. The
1256
+ view sends nothing else.
1257
+ - **Visibly a replay.** The banner over the tiles and `body[data-replay="true"]`. The live app stays mounted (inert and hidden under the recorded tiles), never replaced.
1258
+ - **Back to live** (`#replay-back`, in the banner) closes the replay and the drawer; the app frames are never
1259
+ replaced (the same iframe node, its unsaved input kept).
1260
+ - **Stopped environment.** The stopped cover has "Recorded runs" (`#environment-offline-recordings`), and the view's
1261
+ controls stay enabled offline (`environment-lifecycle.ts` exempts `#recordings`).
1262
+ - **Frames of Watch runs.** While a run the lab window started runs (`attachLabRunner`'s queue), the window registers
1263
+ `windowFrameCapture` (`src/visible/window-frames.ts`, source `lab-window`) with `runtime.captureFramesFrom` and releases
1264
+ it when the run ends; a Background run keeps the environment's headless pages. The capture only reads pixels: the
1265
+ visible part of the identity's displayed frame, from a clipped page screenshot, outside the input lane; it never
1266
+ scrolls or reveals, so a frame that is not shown (another identity's tile, covered, below the fold) is recorded
1267
+ unavailable with the reason. Media is `synthetic` (`device` in recordings made before 22 October 2026 without `--synthetic-media`). A visual check's capture
1268
+ asks it to wait for the lab's `settled` selectors first (isolation-92b): `settle` (`window-frames.ts`) waits inside the
1269
+ identity's frame (a detached window's capture, `detached-identities.ts`, inside its page) and names the selector and
1270
+ the wait when one never shows; it only reads. Masks are not applied in the lab window's capture.
1271
+ - **Run bundle actions** (backlogs 20 and 26, 3 October 2026):
1272
+ a feature scenario's replay has its own block (`#bundle-actions`, `src/client/bundle-actions.ts`), the only part of
1273
+ the viewer that acts, and only when clicked.
1274
+ - "Download bundle" (`#bundle-download`) calls `POST /api/bundles` (`LabRunBundles.bundleRecording`) and saves the
1275
+ file from `GET /api/bundles/<id>.plbundle`. The server (`src/bundle-routes.ts`) serves only files that window bundled.
1276
+ - "Reproduce" (`#bundle-reproduce`) bundles, then asks first when an environment runs: reproducing replaces its
1277
+ state. It sends that session's reset or fixture-restore confirmation to `POST /api/bundles/reproduce`, which calls
1278
+ `LabRunBundles.reproduce`, the use case `product-lab reproduce` runs. A refusal is a 409 with every reason, shown
1279
+ one per line; the outcome shows the expected failure and the rerun's.
1280
+ - Backlog 110: whether the run can be reproduced is said before the click (`#bundle-reproducible`), read from
1281
+ `GET /api/bundles/reproducibility?recording=<id>` (`LabRunBundles.reproducibility`, which reads only): "Reproduce
1282
+ elsewhere: not available for this run. It started on your saved Previewnet fork, whose starting state was not saved
1283
+ with it. Replay works here.", with the bundle's own terms as the button's tooltip. Reproduce is off when it cannot;
1284
+ Download bundle stays.
1285
+ - **Two checks on every step** (backlogs 160-162, 6 October 2026):
1286
+ the Run tab's step cards (`stepChecks`, `src/client/run-steps.ts`) read a step's readings (`attached.readings`,
1287
+ and for a step that ran no lab run, a new identity, the snapshot's `featureStepReadings`) beside its UI calls, chain
1288
+ waits and the transactions the app sent: each chain row names where it read and at which block ("Bulletin · #481
1289
+ (finalized)"). The lab's own transactions in the step (an XCM stand-in, funding, a root call) sit on their own card,
1290
+ "Submitted by the lab (not a check)" (`data-kind="lab"`), and never make a step verified on the chain. Every finished
1291
+ step line carries one short summary (`sidesSummary`: "screen ✓ · chain ✓ Bulletin #481"); a step that changes nothing
1292
+ (`mutates: false`) says "changes nothing on chain", one whose action declares `screenCheck.none` gives that reason,
1293
+ and a passed step that changes something but lacks a side says so (`.rs-checks-missing`). The replay's Evidence view
1294
+ shows each chain side's block ("At"), and its new-identity rows list their readings (`.rec-step-readings`). The
1295
+ Transactions tab lists every write the run caused (`src/client/run-writes.ts`): the lab's transactions, the apps',
1296
+ the hosts' and declared services' writes from the finalized host-bypass ledger, and the steps' recorded writes
1297
+ (`attached.writes`: a statement is "not a transaction"); "Nothing was written" only when every list is empty.
1298
+ - **The evidence view** (backlog 110, 5 October 2026; mockups in `_artifacts/evidence-redesign/`, outside git): a
1299
+ replay's evidence is on the stage (`#replay-evidence`, `src/client/evidence-view.ts`, `evidence-view.css`), a column
1300
+ beside the recorded frames, above them when the window is under 1200 px; the drawer keeps the steps, with the Gherkin
1301
+ steps that ran no lab run (`.rec-step.is-static`, from `RunRecordingData.featureSteps`). A failed run opens at its
1302
+ failed step with the verdict (`#evidence-verdict`): where it failed, what each side found, which side disagreed, and
1303
+ "Go to step N". For the selected step: where it was verified (the Run tab's `checksHeading`), each side's Expected and
1304
+ Found from its check's readings (`attached.readings`; red only for the side that disagreed), what the person's screen
1305
+ did in the Run tab's words (`callWords`, from `RunRecordingData.uiCalls`), what the step reported itself ("The step
1306
+ reported: typed and clicked: 148 ms · …", never checked by the lab), and the host lane: what the app asked its host
1307
+ (the host's approvals in plain words, counted, `src/client/host-request-words.ts`; the host's own words on hover),
1308
+ the connections around the host (endpoints by chain) and what landed on the chain during the step, each section seen,
1309
+ not observed or not recorded with its source and an (i) saying why it is there. Locators and JSON are under "The
1310
+ step's full record (JSON)"; the older blocks (chains, console, health, the run's host-bypass audit) under "Chains, console and
1311
+ health". The model is pure (`src/client/evidence-model.ts`; `tests/evidence-model.test.ts`); the view's browser test
1312
+ (`tests/evidence-view.test.ts`) checks the layout at 1440 and 1024 px and its readability (13 px or more, no all-caps,
1313
+ no ellipsis), with a control.
1314
+ - **Step evidence** (backlogs 22, 23, 25 and 41, 3 October 2026): the replay's selected step shows, under its chain
1315
+ observations, its chain changes (window, events with the identities they mention, account change, a window shared
1316
+ with another step), its identity's console (unexpected and known errors, warnings, unwatched apps), machine and chain
1317
+ health (findings with the numbers, from `RecordingView.health`; since backlog 241 the machine line has the CPUs' idle
1318
+ share, the memory pressure and the lab's loop, in `describeStepMachine`'s words, served as `/step-machine.js`)
1319
+ and what its apps asked their hosts. A recording
1320
+ without one of these blocks says "Not recorded" for it; one that looked and found nothing says so
1321
+ (`src/client/step-evidence.ts`, `step-evidence.css`; `tests/step-evidence.test.ts`).
1322
+ - **Chain console** (backlog 24, 3 October 2026): in
1323
+ the environment view under the chains, `#chain-console` (`src/client/chain-console.ts`, `chain-console.css`), closed
1324
+ by default. Open, it asks `GET /api/chain-console?since=<cursor>` (`src/chain-console-routes.ts`,
1325
+ `LabRuntime.chainConsole`) every 2 s for what changed: the running identities' events newest first ("Mine"), or every
1326
+ extrinsic event ("All"); each block says whether it is final, and a best block replaced at its height is struck
1327
+ through with "replaced …: its events did not happen". Closed, it asks nothing. `tests/chain-console.test.ts`.
1328
+
1329
+ Tests: `tests/bundle-actions.test.ts` (browser: the download saves the bundled bytes, and no other path is served;
1330
+ reproducing asks, sends the session's reset confirmation, lists every refusal reason, then shows the outcome; control:
1331
+ a window that does not send the confirmation fails it; backlog 110: the sentence before the click in both cases, Reproduce off and Download on when it cannot, nothing posted; control: a Reproduce left on fails it), `tests/recordings.test.ts` (browser: the frames of the selected step and identity by their pixels, the replay
1332
+ marks, Back to live keeping the frame and its input, only recording GETs and no runtime method that acts, with a
1333
+ negative control that plants a run request; reopening after the environment stops; the routes' GET-only and path
1334
+ refusals; the timeline's lanes and a CSP console error), `tests/window-frames.test.ts` (browser: the window's capture
1335
+ refuses a frame below the fold, covered or missing without scrolling; a Watch run is recorded from `lab-window`, a
1336
+ Background run from the environment's capture; control: without the registration the Watch run has no `lab-window`
1337
+ frame).
1338
+
1339
+ ### Hot reload of app code
1340
+
1341
+ Backlog item 5. When `product-lab dev` watches the apps'
1342
+ sources (`LabRuntime.watchApps`), the runtime reloads each running identity's app between that identity's steps.
1343
+
1344
+ - **The lab window's frames** (`src/visible/app-reload.ts`): `openLabWindow` registers `labWindowFrameReloader` with
1345
+ `runtime.reloadFramesWith`; the runtime calls it inside the identity's step boundary together with the session's own
1346
+ `reloadApp`. It reloads the identity's frames in place (Playwright `frame.goto` of the frame's current address, so a
1347
+ host bridge in the address is kept) and waits for `load` (`FRAME_RELOAD_TIMEOUT_MS`, 60 s); the session checks the
1348
+ app is ready with the same account. A frame not yet on the app has nothing to reload.
1349
+ - **What the panel shows** (`src/client/app-builds.ts`): each settled build's line in the status bar ("Notes
1350
+ reloaded (build 3, 1.2 s)", "Notes build 3 is ready: it reloads after Person 1: Publish", a restart path's "not
1351
+ reloaded: … Stop and Start each identity", a failed build), and `html[data-app-builds]` (`<app>:<build>:<state>`
1352
+ per watched app). A tab other than the lab window mounts its running identities' frames again on a newer build;
1353
+ it drives no step, so any moment is safe.
1354
+ - **The dev server's own updates** (backlog item 65): a
1355
+ frame loads its app through the identity's proxy, so an update the runtime lets through reaches the frame in place,
1356
+ like the identity's own page. Such a build has the state `updated` ("Notes updated in place by its dev server
1357
+ (build 4)") and names the identities whose pages took it (`AppBuildView.updated`): a plain tab does not mount those
1358
+ identities' frames again.
1359
+
1360
+ Tests: `tests/hot-reload.test.ts` (browser, headless lab window, two loopback fixture apps serving one source file:
1361
+ an edit reaches both frames while each keeps its session and account and the environment is the same; controls: a
1362
+ running step holds its identity's reload while the other identity reloads at once, and records the build it ran
1363
+ against; a changed manifest reloads nothing and says so; a plain tab follows the new build).
1364
+
1365
+ ### Apps that refuse framing
1366
+
1367
+ Backlog item 66. A tile shows its identity's app in an
1368
+ `iframe`. An app may forbid that (`X-Frame-Options`, the `frame-ancestors` directive of its
1369
+ `Content-Security-Policy`); the browser then leaves the frame empty and says nothing.
1370
+
1371
+ - **The check** (`src/frame-check.ts`, `FrameChecks`): when `/api/lab` is asked, the server requests the document of
1372
+ every running identity's app address (and of a followed app's active address), reads the two headers and decides as
1373
+ a browser would for a frame in this window (the domain's `framingRefusal`, with the lab window's own origin as the
1374
+ framing page). Loopback addresses only: a redirect is followed by hand, one hop at a time, and only to a loopback
1375
+ address, so neither an app's redirect nor an address a page reported makes the lab ask another machine. An answer stands for 10 s (an app's headers change with its code), "did not
1376
+ answer" for 2 s; the first snapshot that names an address waits up to 400 ms for its answer, so a tile is not mounted
1377
+ as a frame first. The snapshot carries the refusals by origin (`frames`). The header is only read, never removed.
1378
+ - **The tile** (`src/client/app-tiles.ts`): instead of an empty frame it shows the sentence, with the header and its
1379
+ value, and what still works (runs in the background on a host that opens the app as a page of its own). The element
1380
+ carries `data-frame-refused` (the sentence), `data-header` and `data-value`. It is the seam for backlog item 31b:
1381
+ "Open in its own window" goes there.
1382
+ - **Watch** (`src/visible/visible-ui.ts`): a Watch step on that identity fails with the same sentence, not with "No
1383
+ displayed app frame matches".
1384
+
1385
+ Tests: `tests/frame-check.test.ts` (the decision, the two lifetimes, a non-loopback address never asked) and
1386
+ `tests/frame-refusal.test.ts` (browser: six fixture apps; `DENY`, `SAMEORIGIN`, `frame-ancestors 'none'` and `'self'`
1387
+ get the sentence and no frame, and a Watch step is refused with it; controls: a policy that names the lab window,
1388
+ beside an `X-Frame-Options: DENY` that a browser then ignores, and an app that sends neither header, are shown).
1389
+
1390
+ ## The Tools page
1391
+
1392
+ Lab menu > Tools (T) (5 October 2026, tools-page mockups 9 to 17).
1393
+ Its tabs (`shell-kit.ts`'s Tools group): **Find problems**, **Characters**, **Actions**, **Extensions**.
1394
+
1395
+ - **Find problems** (`src/client/view-tools.ts`; it says "Reading the lab's tools…" from the moment it is shown until the
1396
+ catalog comes, then draws the list at once): race hunting, explore, what if, test the tests, load and hostile apps
1397
+ (a menu of the hosts product-lab's own targets modules define, run on the lab's environment),
1398
+ then the newest-releases tools, nightly and bisect, each a card with one sentence and its latest result in a pill. A
1399
+ tool's page says what it is for and what it needs, each need checked now by the runtime (`ToolNeed`: met, not met with
1400
+ why, or a note); its options are plain controls with the CLI's defaults; "Copy the command" copies the CLI command of
1401
+ exactly those options (`GET /api/tool-command`, the domain's `toolCommand`). Start is disabled while a need is unmet,
1402
+ and the runtime refuses such a start too (`status: "refused"`, nothing runs). While it runs: a progress bar, one line
1403
+ per run, phase, branch, change or probe (`ToolProgressItem`), each with its replay once recorded, and Stop. When it
1404
+ ends, its report opens as a sheet over the stage (`src/client/tool-report.ts`, inside `#application`; the tiles stay
1405
+ mounted): the verdict first, then tables of words, the smallest failing scenario as Gherkin with its failing step
1406
+ marked, the commands that run it again, and "Open the replay" per finding (the Recordings tab). A narrow sheet shows
1407
+ each table row as labelled lines. Times are in seconds with one decimal; dates in the lab's format (`ui.ts`'s
1408
+ `dateTime`, as Recordings); the elapsed time is the runtime's (`ToolRunView.elapsedMs`). Nightly says plainly that
1409
+ nothing runs it at night here.
1410
+ - **Save as a feature** (backlog 119): an exploration
1411
+ that found a failure offers it beside "Copy the scenario". The runtime writes the smallest failing scenario into the
1412
+ folder the lab's first features glob names (`features/explored-seed-<seed>.feature`, `-2`, `-3` beside a file already
1413
+ there), and refuses with why when that folder is outside the lab's directory or the lab's features would not list the
1414
+ file. The report then says where it was saved, shows the file's first lines as written, and offers "Open in
1415
+ Scenarios" (the library, read again, with the file chosen). A reopened report shows it saved, not Save again.
1416
+ - **Watch** (backlog 117): in the lab window, race hunting
1417
+ and test the tests (`ToolDescription.watch`) offer "Show the people", Watch or Background, the same choice as the
1418
+ dock's (`run-mode.ts`'s `setRunMode`). Watched, the page starts the tool through the window's `TOOL_BINDING`
1419
+ (`src/visible/runner.ts`): `LabRuntime.startTool` with `inProcess` (the tiles as each actor's surface, as a feature run
1420
+ has them, never pausing), holding the window's run queue until the tool run ends; the stage shows every person in the
1421
+ grid (`watch-layout.ts`) and the dock shows Watch, fixed until it ends (`setToolRun`). Background, and every other
1422
+ tool or tab, starts it with `POST /api/tool-start`.
1423
+ - **Agents beside the lab** (`src/client/agents-tools.ts`, `src/agent-routes.ts`; the terminal app's `a`): Claude Code
1424
+ and Codex, each with the command that opens it in the lab's folder (Copy the command) and Open where the lab's
1425
+ terminal can open it beside the lab (a tmux split, a new tab or window of the same terminal app); one not installed
1426
+ is greyed with its install line (Copy the install line). `GET /api/agents` (`{ directory, agents }`, each an
1427
+ `AgentView`), `POST /api/agents/open` (`{ id }`: 200 `{ done }`, 409 with why, 400 without an id), served by `ToolRoutes`. The CLI gives the
1428
+ launcher (`ServeOptions.agents`, an `AgentsService`); a lab served without one says so (`NO_AGENTS`, 501 on open).
1429
+ Hooks: `.tools-agent[data-agent]`, `#agent-copy-<id>`, `#agent-open-<id>`.
1430
+ - **Characters** (`src/client/view-characters.ts`): each character the lab declares, its sentence and steps, every
1431
+ scenario step that makes someone one, and the fixtures holding identities ready as one.
1432
+ - Routes (`src/tool-routes.ts`, through `LabRuntime.tools`, `startTool`, `toolRun`, `toolRuns`, `stopTool`,
1433
+ `saveToolScenario`): `GET /api/tools`, `GET /api/tool-runs`, `GET /api/tool-runs/<id>`,
1434
+ `GET /api/tool-command?tool=&options=`, `POST /api/tool-start`, `POST /api/tool-stop`, `POST /api/tool-save` (`{ id }`:
1435
+ the `SavedToolScenario`, or 409 with why). A runtime without tools answers 501 with why.
1436
+ - Styles: `src/client/tools-page.css` (body text 13 px or more). Hooks: `.tool-card[data-tool]`, `#tool-form[data-tool]`,
1437
+ `#tool-field-<key>`, `#tool-show`, `#tool-watching`, `.tool-need[data-met]`, `#tool-copy-command`, `#tool-start`, `#tool-progress[data-status]`,
1438
+ `.tool-item[data-state]`, `#tool-stop`, `#tool-report`, `.tool-verdict[data-tone]`, `.tool-replay[data-recording]`,
1439
+ `#tool-save-scenario`, `#tool-saved[data-path]`, `.tool-saved-lines`, `#tool-open-saved`, `.tool-save-error`,
1440
+ `.character[data-character]`.
1441
+ - Tests: `tests/tools-page.test.ts` (served panel over the real `ToolRunner` and a fake host: every tool's start,
1442
+ progress, report and copy-command, a failure, the refused what-if control, Characters; screenshots at 1440 and 1024 in
1443
+ both themes with `PRODUCT_LAB_SCREENSHOTS_DIR`), `tests/tools-watch.test.ts` (the lab window: Watch's runs in the tiles
1444
+ and the grid, the window's journal, the dock's mode; Background in no tile), `tests/tools-save.test.ts` (a lab folder
1445
+ on disk: Save, the first lines, Open in Scenarios; no failure has no Save, a second save is `-2`; screenshots at 1440
1446
+ in both themes), `tests/lab-menu.test.ts`,
1447
+ `tests/lab-menu-model.test.ts`.
1448
+
1449
+ ## Tools: Actions & blocks and Extensions
1450
+
1451
+ The Tools tabs render with the design system (`src/client/ui.ts`); their rules live in
1452
+ `src/client/view-tools.css`.
1453
+
1454
+ - **Actions** (`src/client/registry.ts`, `src/client/integrations.ts`): one line of help, then the actions grouped by
1455
+ app. Each app header shows an availability chip, plus chips for any integrations blocking it. An unavailable app
1456
+ also gets a one-line banner with the reason. Each action is a row: a kind tile (`via`: chain, ui, check, lab), its
1457
+ title and "N inputs". An action that cannot run shows an Unavailable chip, whose title is the full reason, and a
1458
+ short reason as its subtitle. Only the row shows until it is opened. Opening it shows the generated form
1459
+ (`src/client/forms.ts`) and one primary Run, which is disabled with the reason beside it. The row's chip shows the
1460
+ latest run (Running, Paused, Passed, Failed or Cancelled). The opened row shows that run's banner and its evidence
1461
+ as JSON behind an Evidence disclosure. A JSON text input becomes a monospaced editor that says when the text is not
1462
+ JSON. An input that takes a table with an actor column (the action's sentence table, read from the builder
1463
+ palette) becomes a picker of the lab's identities. It writes the same JSON into the generated control, so the
1464
+ server validates it exactly as before. Integrations and secrets are rows with status dots and chips.
1465
+ - **Extensions** (`src/client/extensions.ts`): one line of help, then each panel in a card that mounts when opened.
1466
+ Refused extensions appear in one warning banner with their reasons. With no panel, an empty state links to
1467
+ [how to add one](../../README.md#custom-panels); the panel links the package README's "Custom panels"
1468
+ section on the npm page (`HOW_TO_ADD_A_PANEL`), since the repository is private.
1469
+
1470
+ Hooks kept for tests and controllers: `form[data-block]` (`data-expanded`, `data-runnable`),
1471
+ `button[data-block-run]`, `[data-block-reason]`, `article[data-app]`, `[data-app-reason]`, `[data-app-blocked-by]`,
1472
+ `article[data-integration-row]`, `[data-integration-reason]`, `[data-secret]`, `#extension-panels details[data-extension]`,
1473
+ `.extension-box`, `.extension-error` and `#extension-refused li[data-extension]`. Tests open an action with
1474
+ `openBlock(page, id)` (`tests/panel-controls.ts`).
1475
+
1476
+ ## Production workspace
1477
+
1478
+ Since the redesign's step 2a the lab panel is docked beside the people
1479
+ on arrival, like DevTools: left by default, or bottom or right (`src/client/dock.ts`, the three buttons beside the
1480
+ brand in the panel's head; `body[data-dock]`; remembered on this machine as `product-lab-dock`). Docking only moves the
1481
+ panel: the app frames are never remounted, so sessions and typed input are kept (`tests/dock-modes.test.ts`, with a
1482
+ remount control). Below 760 px the panel waits to be opened, as before, and covers the stage when open. The stage has
1483
+ a header (`.stage-head`: how many people, the app and mode, the grid button `#stage-grid`, and `#stage-whole`, which
1484
+ sets the lab aside; Escape and the panel's close button still do) over a dotted grid. Its words and chip (`#stage-chip`)
1485
+ follow the run: Watch while a watched run drives the apps, "Paused · you can click inside any app" and Hands on while
1486
+ paused, "Stopped at the failure · state kept" after a failure (the failure itself is the bottom bar's and the
1487
+ failed step's to say), "Replay · <run>" and no chip in a replay (its banner says read only; `tests/dock-controls.test.ts`,
1488
+ `tests/recordings.test.ts`), and "the lab is in its own window" with Lab detached while it is
1489
+ (`tests/own-window.test.ts`). Two slots run across the stage for a view to fill: `#stage-banner` between the header and
1490
+ the tiles and `#stage-scrubber` under them (shown only while filled; the tiles shrink, never covered). The brand is Polkadot's dot
1491
+ mark (`logo()`, `brand()`) with the wordmark in Unbounded. Since step 2b the panel is resized from its edge toward
1492
+ the people (`src/client/resize.ts`, `.lab-resize`: a labelled separator, arrow keys move it 16 px, 64 px with Shift,
1493
+ Home and End go to the bounds, a double-click resets): width docked left or right, height docked bottom, at least
1494
+ 280 px wide or 180 px tall, and the stage keeps 40% of the room. Each mode's size is remembered on this machine
1495
+ (`product-lab-panel-size-<mode>`); only a CSS variable changes, so the frames are never remounted during a drag
1496
+ (`tests/panel-resize.test.ts`, with remount and bounds controls). Today's sizes are presets in the menu beside the dock
1497
+ buttons (`.panel-size`): normal (the default), wide, and full (the lab over the whole frame, `body[data-panel-preset]`).
1498
+ A scenario's detail and the timeline keep the width the person chose; only the builder, an editor in three columns,
1499
+ takes the whole frame and gives the chosen width back when left (0e's first-time-user audit, 6 October 2026;
1500
+ `tests/inventory-gaps.test.ts`, "panel width"). Since step 2c the fourth dock
1501
+ button puts the lab in a window of its own (`src/client/own-window.ts`, `body[data-dock="window"]`): the panel's node
1502
+ moves into a same-origin window, the people take the whole lab window, and the panel's code keeps running in the lab
1503
+ window, so its controls, run bindings, views and unsaved input carry over and the app frames are never reloaded. The
1504
+ styles are copied rule for rule into the window's own constructed sheets and its fonts into its own font faces (the
1505
+ window requests nothing: with a route on the lab page, as a conditioned tile's network installs, an about:blank
1506
+ window's requests stall, which left a person's lab window unstyled on 5 October 2026) and the html and body attributes (theme, dock, panel state)
1507
+ mirrored. Lookups by id,
1508
+ document-wide keys and clicks, focus and dialogs reach the panel in either document through `src/client/lab-document.ts`
1509
+ (`findById`, `labQuery`, `onLabDocuments`, `showModal`). The choice is remembered (a reload opens the window again);
1510
+ closing the window, or choosing a docked mode in it, docks the lab back where it was (`product-lab-dock-return`); a
1511
+ browser that refuses the window leaves the lab docked and says so (`tests/own-window.test.ts`, with dock-back and
1512
+ remount controls). Since 5 October 2026 the bottom bar and its Lab menu go with the lab (`openOwnWindow`'s `along`):
1513
+ the lab's window has the bar at its bottom in two rows (Lab, the environment and the whole run line above; Watch,
1514
+ Background, Replay and Run, Pause or Stop below) under the panel, and the people's window is the stage only, down to its
1515
+ bottom, its chip saying "Lab detached · <the run's line>" (without the clock) while a run is on. The quick picker opens
1516
+ in the window of the control that opened it; the Lab menu's keys work from either window; docking back brings the bar
1517
+ home (`tests/detached-bar.test.ts`, with a control: the bar left behind fails it). What follows describes the panel's
1518
+ contents, unchanged.
1519
+
1520
+ The app fills the window above one bottom dock. The side panel docks beside the app
1521
+ and the app narrows to make room (`body[data-panel="open"]`, `--panel-width`; the
1522
+ panel is `normal` or `wide`); it never covers the app, and changing sections does not
1523
+ remount it. Only the scenario builder takes the whole frame (`data-panel-size="full"`).
1524
+ The dock holds the Lab menu ([Lab menu and Settings](#lab-menu-and-settings)), the
1525
+ identity and environment pickers, and one run control: the chosen scenario and its
1526
+ live state in one piece beside Run. The environment picker lists each environment's fixtures under it
1527
+ (`src/client/fixtures.ts`, backlog 1h, 30 September 2026):
1528
+ each is Ready, Stale (every reason listed), Not
1529
+ saved, or Saved (another environment's, not checked), with its age and origin (its setup feature, or "saved from the
1530
+ running state"). Picking a ready fixture of the running environment asks once, then restores it with the session's
1531
+ `restoreFixture` confirmation (`POST /api/fixture` `restore`); Build (or Rebuild) runs a declared fixture's setup in
1532
+ this process and saves the state (`build`, `LabRuntime.buildFixture`; the row follows `snapshot.fixtureBuild`); "Save
1533
+ current state as fixture…" saves the running state under a new name (`save`, `saveFixture({ fromCurrentState })`).
1534
+ Every refusal is the runtime's reason. `GET /api/fixtures` lists them (`LabRuntime.fixtures()`). Test:
1535
+ `tests/fixtures-picker-served.test.ts` (browser; a stale fixture and another environment's cannot be picked). On a desktop the dock is one line (the scenario
1536
+ name gives way first); below 760px it is two rows, and below 480px Run is icon-only.
1537
+ Command/Ctrl-K opens a searchable command palette, Escape dismisses overlays, and the
1538
+ theme preference changes the lab controls independently of the embedded product.
1539
+
1540
+ In compare (grid) view the selected identity's tile has the accent ring (its "Selected" element stays in the header
1541
+ for what reads it, and is not shown since the redesign: the ring says it; `tests/tile-header-fit.test.ts`). Pressing a tile's caption or clicking inside its app selects that
1542
+ identity; focus the runner moves into a frame (`__productLabReveal`/`__productLabRing`
1543
+ in the last 3 seconds, `window-bindings.ts` `drivenByRunner`) never changes it.
1544
+
1545
+ ### Design system
1546
+
1547
+ One brand across every view: `src/client/tokens.css` (colours, type, radii, shadows,
1548
+ motion; light and dark; since the redesign's step 1, the approved design's values: Polkadot pink `#ff2670` for the
1549
+ primary action, the active state and selection, `--font-display` (Unbounded) for headings and names, and the radius
1550
+ system `--radius-control` 999px, `--radius-tile` 18px, `--radius-card` 14px, `--radius-row` 12px),
1551
+ `src/client/fonts.css` with the vendored variable fonts in `src/client/fonts/` (Inter, Unbounded, JetBrains Mono,
1552
+ Latin subset, SIL Open Font License beside each; served as `font/woff2` by the lab, so nothing is fetched from a CDN
1553
+ and the lab looks the same offline), `src/client/lucide.ts` (the Lucide icons the views draw, ISC licence in
1554
+ `lucide.LICENSE`, generated by `scripts/gen-lucide.mjs` from an unpacked `lucide-static`; `ui.ts`'s `icon()` draws
1555
+ today's names through it; `tests/design-assets.test.ts`), `ui.ts` + `components.css` (DOM factories: button, chip,
1556
+ row, card, dataTable, codeBlock, disclosure, tabs, searchField and more), and
1557
+ `gherkin-view.ts` + `gherkin.css`, the one renderer for any Gherkin (Background, Rule,
1558
+ Outline and Examples blocks, data tables, doc strings, markers, live step states) that
1559
+ the library, runs and the builder share. Wide tables become labelled cards when their
1560
+ columns stop fitting (5-6 columns below 480px, 7 or more below 720px); a cell that
1561
+ names an actor shows the actor's avatar. A table cell's colour comes from its value (`cellTone`): the lab's declared
1562
+ tones first (`LabRegistry.valueTones`, from its integrations' `valueTones`), else the panel's product-neutral defaults
1563
+ (`DEFAULT_VALUE_TONES`: yes, true, passed, ok, included; no, false, failed, blocked; none, n/a, dashes, empty), else
1564
+ none; the views pass the snapshot's registry tones to the renderer (`GherkinOptions.valueTones`).
1565
+ `frame.css` holds the dock, panel, menus and
1566
+ pickers; each view's styles live in its `view-*.css`. The served `/gallery.html` shows
1567
+ every component, a sample scenario with every construct, and the lab's own scenarios.
1568
+
1569
+ Views update in place (backlog 157). The panel polls a
1570
+ snapshot every 1.5 s and redraws live times every second; a view builds its nodes as before (`h`) and hands them to
1571
+ `ui.ts`'s `patchChildren(parent, nodes)` instead of `replaceChildren`. It keeps every node that still stands for the same
1572
+ thing: a child keyed by `data-key` or `id` keeps its node wherever it moves, the others are matched in order by tag, and
1573
+ attributes, text and handlers change only where they differ, so a snapshot that changes nothing changes nothing on the
1574
+ page (an open disclosure, a focused field and a scroll position survive it). Rules for a view: register handlers with
1575
+ `h`'s `on<event>` props or `on(node, type, handler)` (never `addEventListener` on a node a patch may replace) and read the
1576
+ node from `event.currentTarget`; give a node the view keeps in a variable an `id` or `data-key`, or pass it through
1577
+ `keep`; inside a subtree built anew, put a kept node in as `ref(node)` so it stays where it is; mark a `<details>` whose
1578
+ `open` the view decides with `data-managed-open` (otherwise the person's choice stays). `dom.ts`'s `setText` changes a
1579
+ text only when it differs, as a text edit. `tests/no-flicker.test.ts` watches the whole page with a MutationObserver
1580
+ (at rest in every section, a run whose only change is time, a new identity), with chains whose blocks keep coming,
1581
+ provider notices and a finished feature run in the snapshot; `tests/patch.test.ts` covers the helper.
1582
+
1583
+ The rebuild counters' one rule (6 October 2026, `src/rebuild-rule.ts`, export `./rebuild-rule`)
1584
+ applies to `tests/no-flicker.test.ts` and Notes' user
1585
+ path alike. A container that shows one thing names it in `data-shows`:
1586
+ - the run card and the Evidence body: `run:<key>`;
1587
+ - the holder of the latest run's live parts (`#runs-legacy`): `run:<key>`;
1588
+ - the replay stage: `recording:<id>`;
1589
+ - the drawer's title and tabs: `section:<id>`.
1590
+
1591
+ When that id changes, nodes added or removed inside the container in the same batch of mutations are another run's
1592
+ content. The counters tally them apart (`excused`), never as rebuilt. A rebuild under the same id still counts
1593
+ (`tests/rebuild-rule.test.ts` and its controls). `REBUILD_RULE` is in-page code that defines `window.__rebuildRule`
1594
+ (`options`, `changed(records)`, `excused(node, changed)`).
1595
+
1596
+ Text wraps everywhere (backlog 158). `#command-center` sets `overflow-wrap: anywhere`, so a content id, hash, address or
1597
+ error breaks rather than running past the panel's edge; a one-line label keeps `white-space: nowrap`. Text cut on
1598
+ purpose outside the panel (an ellipsis) carries the whole of it as a `title` on the element that cuts it or its
1599
+ parent: a tile's name, the stage line. `tests/text-wrap.test.ts` reads every visible text at the panel's default width
1600
+ (420 px) and its narrowest (280 px, `resize.ts` `MIN_SIZE`) in every section, before and after failed runs with long
1601
+ words (`tests/long-words.ts`), and fails on text past the panel's edge or cut without its tooltip.
1602
+
1603
+ Inside the panel no text is cut at all (F2). `tests/text-cut.test.ts` opens every place a person reads (Run and its
1604
+ tabs, Scenarios, Recordings, Environment details with Advanced open, the New identity menu, the tools and their tabs)
1605
+ at both widths and fails on any visible text whose box is narrower than it (`scrollWidth` over `clientWidth`), that a
1606
+ box further out clips, or whose ordinary words split mid-word, naming the box and the text; an ellipsis or a clamp
1607
+ counts even with its tooltip. Only a box meant to scroll sideways is exempt, by the marker `data-scrolls` on it or an
1608
+ ancestor. So a scenario's description shows whole, a timeline bar holds its step's number (its title is the bar's
1609
+ tooltip, the detail's and the table's), and an identity's name wraps in the timeline.
1610
+
1611
+ A tile's host pill follows the person's host (backlog 159, `app-tiles.ts` `syncHostPill`): a saved identity reopened
1612
+ can be listed before the lab knows its host; the pill appears in the same tile once it does
1613
+ (`tests/tile-host-switch.test.ts`).
1614
+
1615
+ The shell reuses the existing controller elements, capabilities and visible-window
1616
+ bindings. Existing live progress, observations, reports and session history remain
1617
+ the source of displayed evidence. Recording and visual replay are deferred until
1618
+ after publication; the production shell has no simulated replay or chain rewind.
1619
+
1620
+ `src/client/workspace-shell.ts` composes these controls. The served-browser
1621
+ regression `tests/workspace-shell.test.ts` checks stable app/dock bounds, unchanged
1622
+ iframe identity and typed input, section navigation, keyboard/theme and mobile width.
1623
+ `tests/inventory-gaps.test.ts` (the redesign's step 0b) covers what no other
1624
+ browser test did: the Identities actions (reserve count, Stop, Start, Delete with its dialog, Reload app, Copy account
1625
+ address), Environment > Advanced's notes and provenance, the busy notice of a run in progress with its step in the Run tab and its count in the bottom bar, the
1626
+ run's host-bypass summary in Evidence, and the panel sizes (normal, wide, full).
1627
+
1628
+ Environment controls call the runtime's existing start/stop lifecycle. Stopping is
1629
+ confirmed against the current session; disposable state requires explicit discard
1630
+ confirmation, and active runs must finish or be cancelled first. The stopped view
1631
+ removes app frames, blocks actions and marks live chain observations unavailable.
1632
+ Restart creates a new frame session even when actor ids and URLs are reused. Within
1633
+ one running session, focus/compare retains unsaved input; hidden obsolete app URLs
1634
+ are disposed when the snapshot changes.
1635
+
1636
+ Visual fidelity is being corrected against the frozen approved v3 reference. The
1637
+ Lab menu and drawer section switcher use anchored menus; a scenario row opens its
1638
+ detail with its actual metadata and the existing input/binding controllers. Actions and
1639
+ integration blocks remain accessible in their own section. Functional verification
1640
+ of the earlier shell does not constitute approval of this visual correction.
1641
+
1642
+ The Lab menu opens every section (see [Lab menu and Settings](#lab-menu-and-settings)).
1643
+ A scenario row opens its detail (see Scenario library below). Current run
1644
+ drives the original pause/continue/step/cancel controls (see Runs: Current, History, Evidence). Past runs lists the
1645
+ current environment session only; it is not a durable recording or visual replay.
1646
+ Environment summarizes actual registry data and provider observations, with missing
1647
+ head telemetry explicit; Start/Stop sit in its header and the detailed configuration is under Advanced.
1648
+
1649
+ ### Scenario library (`src/client/view-scenarios.ts`, `view-scenarios.css`)
1650
+
1651
+ - **Library**: a search field (name, path, group, description, tags, actors, apps and every step's text) and toggle
1652
+ filter chips with counts (Multi-actor, Negative controls, Ready, Fast = `@fast-ci`, then one per app that tells
1653
+ scenarios apart; a chip nothing matches is not offered, nor an app every scenario uses). In a lab with several apps
1654
+ each row names the apps its steps use (`appsOf`: an app counts when its integration owns one of the scenario's
1655
+ sentences, from the listing's `inspection.integrations`), so a notes lab's one shop journey reads "Shop".
1656
+ Configured runs come first, then one collapsible group per first folder below `features/` (`groupOfPath`,
1657
+ `groupEntries`). A group of more than six (`SECTION_THRESHOLD`) shows its second folder level as muted sub-headers;
1658
+ a smaller one prefixes each row's file with it. A folder is a category even with one scenario; only four or more
1659
+ one-scenario folders (`OTHER_THRESHOLD`) join a last "Other" group. The groups come
1660
+ from every entry, so a search only removes rows. Each scenario is one `row` (the design's one-line rows): the last
1661
+ run's dot, the title (two lines at most), `section · file.feature · N people · N steps` (Background included) with
1662
+ the last run's outcome and time, then only what is not the usual: unavailable or missing readiness, variants,
1663
+ "expected to fail", the apps of a lab with several. The actors, inputs and tags are the detail's.
1664
+ The library renders again only when what it shows changes (a key of the entries, their last runs, the search,
1665
+ filters and selection): a snapshot poll with the same content keeps every node, so hover, focus and selection
1666
+ survive. Collapsing a group renders nothing (the `<details>` already shows it); the collapsed set is kept for the
1667
+ next rebuild. Until 5 October 2026 a group's `toggle` cleared the key, and since a group created open fires `toggle`
1668
+ once inserted, every poll rebuilt the list (`tests/scenario-library-served.test.ts`, "keeps its nodes across polls").
1669
+ - **Readiness** (`readiness`): ready (available and complete), unavailable (danger), a missing capability or a plan
1670
+ issue (warning), and otherwise "partly checked" (neutral): an inspection that is merely incomplete is not a problem.
1671
+ A row says neither "ready" nor "partly checked"; the detail does.
1672
+ - **Examples blocks not for this chain** (29 September 2026):
1673
+ a condition written only on an Examples block leaves the outline listed and its fitting rows runnable. The
1674
+ inspection's `examplesNotFor` names each unfit block; the detail marks that block's head with a neutral "not for
1675
+ this chain" chip (tooltip: the reason, `data-not-for`) and its rows (`is-not-for`), the requirements list it
1676
+ (`data-examples-not-for`), and choosing one of its rows disables Run with the reason (the runtime refuses that row
1677
+ too). An outline whose every block is unfit is not for this chain as a whole (hidden, Run disabled).
1678
+ `runNotForText` (`src/client/features.ts`) decides; `tests/scenario-conditions-served.test.ts` covers it.
1679
+ - **Where a scenario runs** (backlogs 163-165, 6 October 2026): from the inspection's
1680
+ `runsOn` (`src/client/scenario-environment.ts`, `environmentFit`). A scenario tied to environments carries a chip
1681
+ naming them (`.scn-env-chip`, `data-environment-fit`): "paseo-copy" when it runs here, "runs on paseo-copy" when it runs
1682
+ on another local environment, "live network only" (or "no environment fits") when the lab window cannot run it. That
1683
+ last row is greyed out, never hidden, its Run disabled; the chip's tooltip and the detail's line (`.scn-env-line`)
1684
+ say what it does, why, and the configuration or command that runs it (`product-lab test <file> --environment
1685
+ <live id>`). Run on a scenario for another local environment (the detail's button reads "Run on paseo-copy") warns
1686
+ first (`src/client/switch-run.ts`, `#switch-run-dialog`): where it runs, then what the switch costs from the runtime's
1687
+ own switch plan (the identities it stops, what the environment it leaves keeps, what it starts in) and the time a
1688
+ start takes; "Stay in …" switches nothing. The warning names environments by their labels ("Run on Local copy of
1689
+ Paseo?", "Switch to Local copy of Paseo and run"; the id joins a label two environments share, 22's audit, item 9).
1690
+ An environment with more than one way to run (backlog 184) is named with the way it starts and why, from the plan's
1691
+ `option` (the target's pick): "Switch to Local copy of Paseo (Light) and run" (both buttons name the target this short way since 6 October 2026), and a cost line "… starts as Light,
1692
+ picked automatically: this machine has 4 cores and 8 GB; Full needs 8 cores and 16 GB". A switch that discards the
1693
+ environment it leaves names where it goes too, in short labels (each label's head, `shortLabel`): "Discard Fast local
1694
+ chain, switch to Local copy of Paseo (Light) and run".
1695
+ Confirmed, the switch is the run's first step (`src/client/run-preludes.ts`, `.rs-prelude`: "Switch to Local copy of
1696
+ Paseo", the run's first step, from fast, its start's progress and
1697
+ how long it took; a failed switch is a failed run that says why), then the scenario runs on the new environment,
1698
+ watched (a fresh environment shows no identity yet: the window's feature runner then starts with none shown,
1699
+ `src/visible/runner.ts`). While a switch or a reset runs (`snapshot().operation.leaving`), each tile closes its app
1700
+ ("Ada's app is closed", `.tile[data-leaving]`, `src/client/app-tiles.ts`), so no app keeps calling a host that stops;
1701
+ the apps open again once the environment runs. "Can run here" (the library filter) counts scenarios this environment
1702
+ runs now, so a scenario tied to another environment or a live network is not one; the bottom bar counts the same way
1703
+ ("41 of 45 can run here", `scenarioCountWords`).
1704
+ - **Root calls from the lab window** (backlog 180, 6 October 2026): Run on a
1705
+ scenario that makes root calls (its `runsOn.needs.rootCalls`), where the environment declares them and this session has
1706
+ not confirmed them (`snapshot().rootCalls.confirmed`), asks first (`src/client/root-call-confirm.ts`,
1707
+ `#root-calls-dialog`): what a root call does, the calls the lab allows, that the environment is a local copy with a
1708
+ development sudo key, that a mainnet or a public network is still refused, how long it lasts and the CLI's
1709
+ `--root-calls`. "Allow root calls and run" posts the session's token (`/api/root-calls`, `LabRuntime.allowRootCalls`)
1710
+ and runs; "Don't allow" runs nothing.
1711
+ - **Not for this chain** (scenario conditions, 28 September 2026): a scenario whose inspection has `notFor` (a tag that
1712
+ does not fit the running environment, from the lab's integrations' `scenarioConditions`) reads "not for this chain",
1713
+ a neutral chip whose tooltip is the reason ("Not for this chain: this chain's identity threshold is 1 (@policy-3)",
1714
+ for example). The library hides such scenarios until "Show N not for this chain" (`.scn-not-for-toggle`, below the
1715
+ groups; its tooltip lists the reasons) shows them, so the list holds what can run here; a search that only they
1716
+ match says so and offers the same toggle. Decision: hide by default rather than a filter, because a whole set of a
1717
+ lab's scenarios may be for another chain configuration and none of them can run. A negative control
1718
+ (`@negative-control`) is never hidden (6 October 2026): it stays in its group, greyed (`data-not-for` on the row; title,
1719
+ subtitle and Run at 0.55 opacity, as an unrunnable row) with the reason, so what the lab
1720
+ can prove shows on every host (the Notes host-check control on a host that locks the network, for example). The row's Run, the detail's `#feature-run`
1721
+ (and so the dock's Run) are disabled with the reason as their title, and the detail's requirements line says
1722
+ "Not for this chain" with the reason (`data-not-for` names the tags). The runtime refuses such a run anyway (400
1723
+ with the reason; nothing starts). While nothing runs, or when the conditions cannot be read, nothing is marked.
1724
+ - **Detail**: a row opens it; the panel becomes wide (`body[data-panel-size="wide"]`) and the detail slides in; Back,
1725
+ or reopening Scenarios from the menu or its tab, returns to the library at normal width. It shows the group, the file
1726
+ (with a copy button for its path), the title with filled placeholders, the chips, the requirements on one line
1727
+ (chains, services and capabilities as chips; reasons, unchecked steps and plan issues behind Details) and the
1728
+ scenario drawn by `renderGherkin`. The Run setup is one line at the bottom of the panel: the actors' summary ("New
1729
+ identities", or who plays whom), which opens each actor's choice, the Pause switch and the one primary Run. The
1730
+ Run is the controller's own `#feature-run` / `#run`; the bar lays out `#features` and `#scenario-form` as they are.
1731
+ Clicking an outline's Examples row fills the steps and makes the Run "Run example N": `features.ts` then sends
1732
+ `line` and `example` (1-based across every block, `exampleNumber`) so only that variant runs.
1733
+ - **Dock picker** (`scenarioPicker`): search, the same groups, a check on the chosen scenario, Open library.
1734
+ - **Older servers**: a lab whose server lists only the merged `examples` (no `examplesBlocks`, `variants`, tag
1735
+ levels, Rule or descriptions) still draws, numbers and runs its variants.
1736
+ - **Hooks**: `[data-scenario="scenario:<id>" | "feature:<option>"] .scenario-title` (with `aria-expanded`) is the
1737
+ row's title and the detail's heading; `.run-small` is the row's Run and the detail's; the library's rows leave the
1738
+ page while a detail is open, so each hook is unique. `tests/panel-controls.ts` `chooseScenario` opens the detail and
1739
+ its Run setup.
1740
+ - **Tests**: `tests/scenario-library.test.ts` (grouping, readiness, variant numbering, phases);
1741
+ `tests/scenario-library-served.test.ts` (served fixture with every Gherkin field, then an older server's listing:
1742
+ groups, filters, search, the wide detail, the one-line Run setup, a one-variant run request, the picker);
1743
+ `tests/scenario-requirements.test.ts` (requirements, coverage and the environment-response race).
1744
+
1745
+ The requirements line does not run support modules or replace runtime preflight; intentional negative controls remain selectable and runnable. Metadata is refreshed for environment/session and registry changes; stale responses are discarded, including returning to a previously loaded environment while another request remains pending. A stopped lab displays declared-default inspection.
1746
+
1747
+ Every panel test binds its fixture servers and the served shell on ephemeral loopback ports (`tests/ports.ts`:
1748
+ `listenEphemeral`, which rejects on a listen error, and `freePort` for `serveLab`), so overlapping panel runs, in one
1749
+ worktree or several, cannot collide; fixed ports (27300 in `tests/watch-multi.test.ts`, 26000 in the address bar
1750
+ test, ...) once hung a gate; `tests/window-media.test.ts` kept
1751
+ 43020/43021 until 29 September 2026 and failed with `EADDRINUSE` in overlapping runs. A fixture that stands in for a
1752
+ server reply answers what the server answers (the scenario library's feature run returns the lab snapshot; an empty
1753
+ reply made the client's error reopen the panel, a load-dependent timeout). Tests reach the lab window's
1754
+ globals inside `page.evaluate` through `TestLabWindow` (`tests/lab-window.ts`), not a double type assertion.
1755
+
1756
+ The Node test target runs at most three test files concurrently. This bounds browser memory on machines whose CPU count is large relative to RAM; the Linux qualification record contains the reproduced uncapped OOM and passing capped run.
1757
+
1758
+ Browser tests read related layout positions in one page evaluation, so panel transitions cannot move the layout
1759
+ between the measurements. Tests that resize the lab window first flush recording frame captures and then check
1760
+ `window.innerWidth` and `window.innerHeight`; screenshot viewport restoration cannot silently undo a resize. The
1761
+ builder test keeps its edit route until the preview confirms both queued edits, before removing the route.
1762
+
1763
+ The lab window's Evidence view, Past runs and the recording drawer show run and step host-bypass evidence in words, titled "Host check: the whole run" and "Host check: this step" with an (i) saying what the check does (0e's lab-window audit, 6 October 2026) (`src/client/host-bypass.ts`, its model `host-bypass-model.ts`; backlog 110, the user on 5 October 2026: "the evidence tab is still a dump of text"): one verdict line for the run ("Nothing went around the host · not complete: the lab could not fully read 2 entries in the blocks") with why it is incomplete one click away, each gap said once; the explained extrinsics as a count per kind that opens ("28 the chain wrote itself (each block's time and bookkeeping): expected"), each kind's reason on hover and first when opened; one row per extrinsic the lab could not attribute or not read in full (chain, block, step, why), rows that share a reason folded into one ("4 extrinsics not read in full (…): people #36, #45 (step 3), #47, #56 (step 4)") that opens on them; each person by name with their host, their policy and their app's traffic around the host counted by chain; the record itself under "The full record (JSON)". A step's audit is one line ("Host check: this step incomplete the run's check says why") unless the step has an extrinsic or traffic of its own, never the run's audit again. An extrinsic the lab could not read in full is "cannot be told", not a finding; absent evidence reads coverage unknown. `tests/host-bypass.test.ts` (control: the old dump shows the 28 explained extrinsics as 28 lines).
1764
+
1765
+ Run and step host-bypass views include an overall verdict chip. An unexplained foreign extrinsic produces an overall warning while clean app verdicts and unknown transaction attribution remain intact; incomplete coverage and strict failures retain their own tones.
1766
+
1767
+ The server explicitly serves the host-bypass view and the pure domain verdict helper (every client module a file imports must have its route: `tests/assets.test.ts`); browser imports use the dedicated `@product-lab/domain/runs/host-bypass-verdict` subpath.
1768
+
1769
+ Framing reuse (item82): the framing section above retains the original item66 behavior and its evidence. Current `FrameChecks` invokes the optional driving runtime `inspectAppFraming`; it performs no Node fetch or adapter construction. Its10s successful/2s retry cache and400ms first wait remain local to the panel. `/api/lab` keeps the existing refusal map and lists serializable `frameInspections` for allowed/refused/unknown results. A missing inspection capability or failed reader is unknown, never evidence that the document allows framing.
1770
+
1771
+ The drawer puts its existing tabs in a full-width row below the title and Close control. Tabs wrap at narrow widths, keeping Recordings reachable without replacing the live app frame. Watch controls the displayed app in a window opened through `openLabWindow`; the server can keep running in the background while that window remains visible.
1772
+
1773
+ Opening a recording displays its captured screenshots over the mounted app, with Play/Pause and previous/next screenshot controls. The viewer labels its fixed1.5s image cadence and absence of video; it cannot recover typing or clicks between captures. Back to live restores the app and run controls. Active runs are checked before and after loading the recording, using the latest panel snapshot. The run audit remains available even with zero recorded steps, and incomplete audits explicitly explain that proof is missing.