@ultimat3/cli 29.4.0 → 30.0.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 (448) hide show
  1. package/CLAUDE.md +64 -40
  2. package/README.md +61 -11
  3. package/package.json +42 -28
  4. package/src/affected-tests.ts +97 -0
  5. package/src/affected-unowned.ts +43 -0
  6. package/src/affected.ts +25 -6
  7. package/src/app-boundaries.ts +29 -1
  8. package/src/app-evals.ts +12 -4
  9. package/src/app-load-unresolved.ts +62 -0
  10. package/src/app-load.ts +30 -37
  11. package/src/app-mcp.ts +14 -2
  12. package/src/app-module-graph.ts +232 -0
  13. package/src/app-reload-graph.ts +2 -2
  14. package/src/app-root.ts +37 -1
  15. package/src/bin.ts +1 -0
  16. package/src/boundary-findings.ts +6 -0
  17. package/src/budgets-freshness.ts +32 -0
  18. package/src/budgets.ts +20 -1
  19. package/src/build-capture-env.ts +9 -0
  20. package/src/cdp-shot-a11y.ts +2 -39
  21. package/src/ci-tested.ts +243 -0
  22. package/src/client-emit-customer-runtime.ts +139 -0
  23. package/src/client-emit-customer.ts +108 -0
  24. package/src/client-emit-drift.ts +72 -0
  25. package/src/client-emit-header.ts +67 -0
  26. package/src/client-emit-schemas.ts +175 -0
  27. package/src/client-emit-types.ts +121 -0
  28. package/src/client-emit-vendor.ts +146 -0
  29. package/src/client-errors-routes.ts +229 -0
  30. package/src/client-errors-script.ts +74 -0
  31. package/src/client-vitals-route.ts +197 -0
  32. package/src/client-vitals-script.ts +56 -0
  33. package/src/cmd-affected.ts +23 -0
  34. package/src/cmd-build-spec.ts +7 -1
  35. package/src/cmd-build.ts +35 -9
  36. package/src/cmd-ci-spec.ts +42 -6
  37. package/src/cmd-ci.ts +99 -2
  38. package/src/cmd-client-customer.ts +134 -0
  39. package/src/cmd-client-source.ts +81 -0
  40. package/src/cmd-client-spec.ts +48 -0
  41. package/src/cmd-client-write.ts +41 -0
  42. package/src/cmd-client.ts +111 -0
  43. package/src/cmd-db-recount.ts +120 -0
  44. package/src/cmd-db-spec.ts +36 -6
  45. package/src/cmd-db.ts +11 -3
  46. package/src/cmd-deploy-compose.ts +61 -3
  47. package/src/cmd-deploy-drain.ts +10 -2
  48. package/src/cmd-deploy-helm.ts +11 -0
  49. package/src/cmd-deploy-preflight.ts +118 -0
  50. package/src/cmd-deploy-spec.ts +58 -6
  51. package/src/cmd-deploy-verify.ts +380 -0
  52. package/src/cmd-deploy.ts +42 -9
  53. package/src/cmd-docs.ts +34 -4
  54. package/src/cmd-doctor.ts +66 -9
  55. package/src/cmd-drill-spec.ts +25 -0
  56. package/src/cmd-drill.ts +176 -0
  57. package/src/cmd-env-init.ts +102 -0
  58. package/src/cmd-env-spec.ts +10 -3
  59. package/src/cmd-env.ts +15 -10
  60. package/src/cmd-errors-recent.ts +60 -0
  61. package/src/cmd-errors-spec.ts +9 -1
  62. package/src/cmd-errors.ts +4 -0
  63. package/src/cmd-exercise-spec.ts +19 -0
  64. package/src/cmd-exercise.ts +129 -0
  65. package/src/cmd-generate-spec.ts +9 -1
  66. package/src/cmd-generate.ts +32 -27
  67. package/src/cmd-graph-load.ts +97 -0
  68. package/src/cmd-graph-spec.ts +16 -0
  69. package/src/cmd-graph.ts +73 -0
  70. package/src/cmd-i18n.ts +4 -1
  71. package/src/cmd-impact-spec.ts +13 -0
  72. package/src/cmd-impact.ts +64 -0
  73. package/src/cmd-jobs-resolve.ts +76 -0
  74. package/src/cmd-jobs-spec.ts +21 -2
  75. package/src/cmd-jobs.ts +10 -6
  76. package/src/cmd-mail-spec.ts +28 -0
  77. package/src/cmd-mail.ts +70 -0
  78. package/src/cmd-mcp-lock.ts +69 -0
  79. package/src/cmd-mcp-spec.ts +23 -4
  80. package/src/cmd-mcp.ts +17 -3
  81. package/src/cmd-new-spec.ts +8 -1
  82. package/src/cmd-new.ts +61 -9
  83. package/src/cmd-planned.ts +0 -6
  84. package/src/cmd-repro-spec.ts +31 -0
  85. package/src/cmd-repro.ts +174 -0
  86. package/src/cmd-stop-spec.ts +21 -0
  87. package/src/cmd-stop.ts +166 -0
  88. package/src/cmd-test-spec.ts +17 -4
  89. package/src/cmd-test.ts +70 -14
  90. package/src/cmd-upgrade-spec.ts +26 -0
  91. package/src/cmd-upgrade.ts +274 -0
  92. package/src/cmd-verify-spec.ts +3 -3
  93. package/src/db-backfill.ts +6 -0
  94. package/src/db-diagnostics.ts +106 -0
  95. package/src/db-generate.ts +9 -0
  96. package/src/db-reset-template.ts +1 -1
  97. package/src/db-rolling.ts +45 -0
  98. package/src/db-seed-generate.ts +188 -0
  99. package/src/deploy-verify-findings.ts +98 -0
  100. package/src/deploy-verify-flags.ts +109 -0
  101. package/src/deploy-verify-grade.ts +185 -0
  102. package/src/deploy-verify-queues.ts +53 -0
  103. package/src/dev-boot.ts +35 -15
  104. package/src/dev-child-watch.ts +16 -4
  105. package/src/dev-dashboard-guard.ts +8 -1
  106. package/src/dev-dashboard.ts +7 -0
  107. package/src/dev-lock-identity.ts +61 -0
  108. package/src/dev-lock-port-holder.ts +80 -0
  109. package/src/dev-lock-steal.ts +124 -0
  110. package/src/dev-lock.ts +92 -120
  111. package/src/dev-mail-templates.ts +51 -0
  112. package/src/dev-rebuild.ts +26 -2
  113. package/src/dev-route-table.ts +17 -0
  114. package/src/dev-supervisor.ts +5 -2
  115. package/src/dev-watch-tree.ts +11 -10
  116. package/src/dev-watch.ts +1 -1
  117. package/src/dispatch.ts +29 -6
  118. package/src/docs-section.ts +69 -0
  119. package/src/docs-sources.ts +100 -0
  120. package/src/doctor-auth.ts +11 -2
  121. package/src/doctor-chart-alerts.ts +55 -0
  122. package/src/doctor-pooler.ts +107 -0
  123. package/src/doctor-rolling.ts +35 -0
  124. package/src/doctor-row-security.ts +40 -0
  125. package/src/document-options.ts +13 -0
  126. package/src/drill-sync-lane.ts +25 -0
  127. package/src/drill-targets.ts +39 -0
  128. package/src/duplicate-packages.ts +1 -1
  129. package/src/env-production.ts +93 -0
  130. package/src/error-codes-shot.ts +59 -0
  131. package/src/error-codes-tooling.ts +29 -0
  132. package/src/error-codes.ts +100 -54
  133. package/src/error-contract.ts +2 -2
  134. package/src/errors.ts +22 -3
  135. package/src/exercise-database.ts +99 -0
  136. package/src/exercise-findings.ts +159 -0
  137. package/src/exercise-overrides.ts +42 -0
  138. package/src/exercise-registration.ts +58 -0
  139. package/src/exercise-static.ts +88 -0
  140. package/src/exercise-subject.ts +69 -0
  141. package/src/failure-capture-boot.ts +30 -0
  142. package/src/framework-env.ts +7 -1
  143. package/src/framework-schema.ts +72 -5
  144. package/src/generate-catalog-locales.ts +19 -0
  145. package/src/generate-chart-alerts.ts +156 -0
  146. package/src/generate-feature-required.ts +65 -0
  147. package/src/generate-feature.ts +83 -6
  148. package/src/generate-files.ts +24 -0
  149. package/src/generate-format-written.ts +32 -0
  150. package/src/generate-kinds.ts +6 -0
  151. package/src/generate-sign-in-config.ts +100 -0
  152. package/src/generate-sign-in-manifest.ts +28 -0
  153. package/src/generate-sign-in-mode.ts +101 -0
  154. package/src/generate-sign-in.ts +250 -0
  155. package/src/generate-write.ts +44 -7
  156. package/src/hand-rolled-socket.ts +72 -0
  157. package/src/i18n-app-key-shapes.ts +29 -0
  158. package/src/i18n-audit.ts +10 -3
  159. package/src/i18n-registration.ts +18 -3
  160. package/src/index.ts +2 -0
  161. package/src/island-bundle.ts +4 -3
  162. package/src/island-disposer.ts +116 -0
  163. package/src/island-realtime-state.ts +34 -6
  164. package/src/island-realtime.ts +6 -2
  165. package/src/island-routes.ts +3 -2
  166. package/src/isr-query-advice.ts +6 -11
  167. package/src/isr-query-guard.ts +4 -3
  168. package/src/job-budget.ts +95 -0
  169. package/src/jobs-json.ts +11 -0
  170. package/src/lint-findings.ts +104 -0
  171. package/src/local-cli.ts +34 -4
  172. package/src/loopback-host.ts +2 -2
  173. package/src/mail-preview-findings.ts +24 -0
  174. package/src/mcp-errors.ts +82 -2
  175. package/src/mcp-host.ts +11 -1
  176. package/src/mcp-lock-findings.ts +57 -0
  177. package/src/measure-paths.ts +12 -4
  178. package/src/measure-scope.ts +27 -13
  179. package/src/messages-client.ts +23 -0
  180. package/src/messages-db.ts +56 -0
  181. package/src/messages-gate.ts +107 -0
  182. package/src/messages-repro.ts +11 -0
  183. package/src/messages-shot.ts +51 -0
  184. package/src/messages-upgrade.ts +45 -0
  185. package/src/messages.ts +53 -178
  186. package/src/metrics-endpoint.ts +23 -5
  187. package/src/new-shapes-generate.ts +71 -0
  188. package/src/new-shapes.ts +63 -0
  189. package/src/openapi-compile-ir.ts +68 -0
  190. package/src/openapi-compile-schema.ts +284 -0
  191. package/src/openapi-compile.ts +273 -0
  192. package/src/openapi-refuse.ts +45 -0
  193. package/src/otlp-export.ts +2 -1
  194. package/src/output-findings.ts +123 -0
  195. package/src/output.ts +32 -8
  196. package/src/package-boundaries.ts +110 -0
  197. package/src/page-pins.ts +23 -0
  198. package/src/plain-routes.ts +13 -0
  199. package/src/prerender-entries.ts +59 -0
  200. package/src/prerender-heaviest.ts +27 -0
  201. package/src/prerender-preload.ts +6 -0
  202. package/src/prerender-report.ts +12 -0
  203. package/src/prerender-seo-reads.ts +38 -0
  204. package/src/prerender-served.ts +22 -7
  205. package/src/prerender-vitals.ts +42 -0
  206. package/src/prerender.ts +61 -32
  207. package/src/pwa-artifacts.ts +4 -3
  208. package/src/pwa-manifest-locales.ts +1 -1
  209. package/src/registry.ts +18 -0
  210. package/src/repro-bundle.ts +65 -0
  211. package/src/repro-errors.ts +47 -0
  212. package/src/repro-job.ts +72 -0
  213. package/src/repro-literal.ts +41 -0
  214. package/src/repro-request.ts +48 -0
  215. package/src/repro-write.ts +100 -0
  216. package/src/retain-sweep.ts +27 -0
  217. package/src/retained-assets-boot.ts +113 -0
  218. package/src/retained-assets-layout.ts +110 -0
  219. package/src/retained-assets-read.ts +142 -0
  220. package/src/retained-assets-sweep.ts +70 -0
  221. package/src/retained-assets.ts +171 -0
  222. package/src/revalidated-response.ts +8 -5
  223. package/src/role-replicator.ts +7 -1
  224. package/src/role-start-devices.ts +119 -0
  225. package/src/role-start-types.ts +6 -0
  226. package/src/role-start.ts +22 -5
  227. package/src/role-sync.ts +7 -1
  228. package/src/route-islands.ts +42 -0
  229. package/src/route-table.ts +2 -1
  230. package/src/row-security-boot.ts +58 -0
  231. package/src/row-security-wanted.ts +32 -0
  232. package/src/runtime-admin.ts +0 -1
  233. package/src/runtime-assets-site-cache.ts +55 -0
  234. package/src/runtime-assets-site.ts +136 -0
  235. package/src/runtime-assets.ts +99 -55
  236. package/src/runtime-bindings.ts +19 -3
  237. package/src/runtime-cache.ts +23 -14
  238. package/src/runtime-isr-outcome.ts +114 -60
  239. package/src/runtime-purge.ts +14 -2
  240. package/src/runtime-queue.ts +31 -4
  241. package/src/runtime-render-document.ts +204 -0
  242. package/src/runtime-render.ts +48 -198
  243. package/src/runtime-replica-position.ts +62 -0
  244. package/src/runtime-replica.ts +18 -3
  245. package/src/runtime-s3-path-style.ts +17 -0
  246. package/src/runtime-services.ts +19 -6
  247. package/src/runtime-statement-bound.ts +22 -0
  248. package/src/runtime-storage-upload.ts +9 -0
  249. package/src/runtime-storage.ts +41 -81
  250. package/src/schema-diff-views.ts +54 -0
  251. package/src/schema-diff.ts +21 -3
  252. package/src/schema-drift.ts +28 -9
  253. package/src/schema-dump-drift.ts +91 -7
  254. package/src/script-csp.ts +1 -1
  255. package/src/seo-cards.ts +26 -0
  256. package/src/seo-routes.ts +22 -8
  257. package/src/serve-boot.ts +54 -21
  258. package/src/serve-drain.ts +1 -0
  259. package/src/serve-env.ts +26 -8
  260. package/src/serve-retire.ts +12 -6
  261. package/src/serve-web.ts +42 -4
  262. package/src/serve.ts +9 -7
  263. package/src/site-asset-routes.ts +7 -1
  264. package/src/site-config.ts +4 -0
  265. package/src/site-llms-pages.ts +106 -0
  266. package/src/site-llms.ts +64 -0
  267. package/src/site-seo-write.ts +4 -2
  268. package/src/site-seo.ts +55 -6
  269. package/src/source-mtime.ts +50 -0
  270. package/src/static-capture-errors.ts +41 -0
  271. package/src/static-capture.ts +56 -0
  272. package/src/static-cards-serve.ts +39 -0
  273. package/src/static-cards.ts +93 -0
  274. package/src/static-document.ts +14 -13
  275. package/src/static-images.ts +115 -0
  276. package/src/stream-hole-scope.ts +55 -0
  277. package/src/style-bundle.ts +1 -1
  278. package/src/style-routes.ts +3 -2
  279. package/src/sw-precache-plan.ts +2 -2
  280. package/src/sw-routes.ts +2 -2
  281. package/src/templates/action-tests.ts +306 -0
  282. package/src/templates/action.ts +81 -269
  283. package/src/templates/backfill.ts +1 -1
  284. package/src/templates/entity.ts +21 -5
  285. package/src/templates/github/ci.yml.ts +8 -9
  286. package/src/templates/guard-bare-error.ts +2 -2
  287. package/src/templates/guard-error-declared.ts +263 -0
  288. package/src/templates/guard-native-confirm.ts +132 -0
  289. package/src/templates/guard-raw-fetch.ts +151 -0
  290. package/src/templates/guard-raw-interval.ts +121 -0
  291. package/src/templates/guard-repo-raw-sql.ts +71 -2
  292. package/src/templates/job.ts +1 -1
  293. package/src/templates/naming.ts +5 -0
  294. package/src/templates/pinned/docker-compose.yml +6 -0
  295. package/src/templates/pinned-images.ts +8 -0
  296. package/src/templates/policy.ts +85 -2
  297. package/src/templates/query.ts +70 -13
  298. package/src/templates/resource-create.ts +3 -1
  299. package/src/templates/resource-form-island.ts +15 -4
  300. package/src/templates/resource-page-db.ts +83 -0
  301. package/src/templates/resource-page.ts +161 -52
  302. package/src/templates/route.ts +4 -6
  303. package/src/templates/scaffold-app.ts +3 -0
  304. package/src/templates/scaffold-auth.ts +2 -1
  305. package/src/templates/scaffold-bin.ts +5 -52
  306. package/src/templates/scaffold-claude-agents.ts +19 -19
  307. package/src/templates/scaffold-claude-commands.ts +28 -31
  308. package/src/templates/scaffold-claude.ts +26 -23
  309. package/src/templates/scaffold-container-compose.ts +6 -1
  310. package/src/templates/scaffold-container.ts +24 -4
  311. package/src/templates/scaffold-dashboard-bare.ts +3 -3
  312. package/src/templates/scaffold-dashboard-example-tests.ts +49 -9
  313. package/src/templates/scaffold-dashboard-example-view.ts +156 -0
  314. package/src/templates/scaffold-dashboard-example.ts +43 -131
  315. package/src/templates/scaffold-dashboard-shared.ts +3 -7
  316. package/src/templates/scaffold-db-client.ts +20 -6
  317. package/src/templates/scaffold-db-package.ts +5 -14
  318. package/src/templates/scaffold-docs.ts +73 -57
  319. package/src/templates/scaffold-domain-package.ts +18 -14
  320. package/src/templates/scaffold-entries.ts +7 -2
  321. package/src/templates/scaffold-exercise.ts +37 -0
  322. package/src/templates/scaffold-guards.ts +13 -1
  323. package/src/templates/scaffold-helm-alerts.ts +234 -0
  324. package/src/templates/scaffold-helm-templates.ts +7 -5
  325. package/src/templates/scaffold-helm.ts +46 -12
  326. package/src/templates/scaffold-i18n.ts +6 -2
  327. package/src/templates/scaffold-mcp-endpoint.ts +182 -0
  328. package/src/templates/scaffold-mcp-json.ts +31 -0
  329. package/src/templates/scaffold-mcp-package.ts +59 -56
  330. package/src/templates/scaffold-repo.ts +7 -2
  331. package/src/templates/scaffold-shell.ts +45 -79
  332. package/src/templates/scaffold-test-services.ts +13 -5
  333. package/src/templates/shapes/api-keys.ts +170 -0
  334. package/src/templates/shapes/api.ts +101 -0
  335. package/src/templates/shapes/blog-site.ts +340 -0
  336. package/src/templates/shapes/blog-slice.ts +265 -0
  337. package/src/templates/shapes/blog.ts +114 -0
  338. package/src/templates/shapes/dashboard-detail.ts +242 -0
  339. package/src/templates/shapes/dashboard.ts +53 -0
  340. package/src/templates/shapes/index.ts +17 -0
  341. package/src/templates/shapes/overlay.ts +99 -0
  342. package/src/templates/shapes/shared-edits.ts +46 -0
  343. package/src/templates/sign-in-action-tests.ts +237 -0
  344. package/src/templates/sign-in-authenticator.ts +112 -0
  345. package/src/templates/sign-in-oidc.ts +189 -0
  346. package/src/templates/sign-in-pages.ts +148 -0
  347. package/src/templates/sign-in-password.ts +216 -0
  348. package/src/templates/sign-in-shared.ts +268 -0
  349. package/src/templates/slice-foundation.ts +70 -15
  350. package/src/test-batches.ts +1 -1
  351. package/src/test-database.ts +1 -1
  352. package/src/test-shards.ts +7 -1
  353. package/src/test-workers.ts +18 -12
  354. package/src/tool-gate-names.ts +34 -0
  355. package/src/upgrade-agents-link.ts +49 -0
  356. package/src/upgrade-bun-floor.ts +225 -0
  357. package/src/upgrade-gate.ts +228 -0
  358. package/src/upgrade-pins.ts +63 -0
  359. package/src/upgrade-plan.ts +214 -0
  360. package/src/upgrade-registry.ts +53 -0
  361. package/src/upgrade-report.ts +139 -0
  362. package/src/upgrade-root.ts +74 -0
  363. package/src/verify-budgets-build.ts +118 -0
  364. package/src/verify-checks.ts +67 -24
  365. package/src/verify-coverage-run.ts +1 -1
  366. package/src/verify-e2e-lane.ts +41 -0
  367. package/src/verify-exercise.ts +64 -0
  368. package/src/verify-floor.ts +41 -0
  369. package/src/verify-merge.ts +19 -4
  370. package/src/verify-role-load.ts +2 -0
  371. package/src/verify-run.ts +28 -8
  372. package/src/verify-shard.ts +12 -2
  373. package/src/verify-skip-ceiling.ts +87 -0
  374. package/src/verify-step.ts +5 -0
  375. package/src/verify-tests.ts +25 -5
  376. package/src/view-drift.ts +55 -0
  377. package/src/worker-bundle.ts +3 -2
  378. package/src/workspace-graph.ts +38 -19
  379. package/src/write-generated.ts +43 -0
  380. package/src/zone-boot.ts +20 -0
  381. package/wiki/Actions.md +342 -0
  382. package/wiki/Admin-Dashboard.md +432 -0
  383. package/wiki/Agents.md +958 -0
  384. package/wiki/Auth.md +195 -0
  385. package/wiki/Bare-VM.md +111 -0
  386. package/wiki/Batching-And-Preloading.md +136 -0
  387. package/wiki/Building-Your-Own-Base.md +203 -0
  388. package/wiki/CI-Parallel-Gate.md +220 -0
  389. package/wiki/CLI-Reference.md +1894 -0
  390. package/wiki/Caching-And-Invalidation.md +255 -0
  391. package/wiki/Client-Data.md +194 -0
  392. package/wiki/Client-Navigation.md +513 -0
  393. package/wiki/Compared.md +93 -0
  394. package/wiki/Configuration.md +868 -0
  395. package/wiki/Contributing.md +12 -0
  396. package/wiki/Deploy-Recipes.md +122 -0
  397. package/wiki/Deployment.md +508 -0
  398. package/wiki/Entities-And-Migrations.md +1116 -0
  399. package/wiki/FAQ.md +175 -0
  400. package/wiki/Feature-Flags.md +65 -0
  401. package/wiki/Getting-Started.md +221 -0
  402. package/wiki/Home.md +160 -0
  403. package/wiki/I18n.md +239 -0
  404. package/wiki/Installation.md +206 -0
  405. package/wiki/Interface-Rules.md +339 -0
  406. package/wiki/Jobs-And-Workflows.md +783 -0
  407. package/wiki/Known-Gaps.md +185 -0
  408. package/wiki/MCP-And-AI.md +753 -0
  409. package/wiki/Mail.md +138 -0
  410. package/wiki/Migrating-An-Existing-App.md +594 -0
  411. package/wiki/Migrating-From-Django.md +54 -0
  412. package/wiki/Migrating-From-Laravel.md +53 -0
  413. package/wiki/Migrating-From-Node-Drizzle.md +53 -0
  414. package/wiki/Migrating-From-Rails.md +53 -0
  415. package/wiki/Migrations-And-Backfills.md +552 -0
  416. package/wiki/Money.md +338 -0
  417. package/wiki/N-Plus-One-Detection.md +197 -0
  418. package/wiki/Notify.md +208 -0
  419. package/wiki/Observability.md +245 -0
  420. package/wiki/Outbound-HTTP.md +109 -0
  421. package/wiki/PWA-And-Offline.md +343 -0
  422. package/wiki/Policies-And-Authz.md +251 -0
  423. package/wiki/Project-Layout.md +150 -0
  424. package/wiki/Queries-And-Live-Queries.md +429 -0
  425. package/wiki/Realtime.md +734 -0
  426. package/wiki/Resource-Management.md +121 -0
  427. package/wiki/Routes-And-Render-Modes.md +521 -0
  428. package/wiki/SEO.md +288 -0
  429. package/wiki/Scheduled-Tasks.md +175 -0
  430. package/wiki/Scraping.md +493 -0
  431. package/wiki/Shapes.md +63 -0
  432. package/wiki/Stability.md +97 -0
  433. package/wiki/Static-Assets.md +166 -0
  434. package/wiki/Storage-And-Uploads.md +404 -0
  435. package/wiki/Testing.md +1313 -0
  436. package/wiki/The-Eight-Primitives.md +247 -0
  437. package/wiki/Theming.md +362 -0
  438. package/wiki/Timezones-And-Dates.md +194 -0
  439. package/wiki/Troubleshooting.md +163 -0
  440. package/wiki/Tutorial-01-First-App.md +289 -0
  441. package/wiki/Tutorial-02-First-Feature.md +339 -0
  442. package/wiki/Tutorial-03-Auth-And-Admin.md +379 -0
  443. package/wiki/Tutorial-04-Jobs-And-Realtime.md +263 -0
  444. package/wiki/Tutorial-05-Deploy-Free.md +231 -0
  445. package/wiki/Tutorial-06-Growing-Up.md +158 -0
  446. package/wiki/UI-Components.md +156 -0
  447. package/wiki/Upgrading.md +3667 -0
  448. package/src/stored-object-headers.ts +0 -43
@@ -0,0 +1,203 @@
1
+ # Building your own base
2
+
3
+ **Ultimate ships mechanism; your app ships convention.** Ultimate's own conventions are structural —
4
+ file naming, the four surfaces, the tier order — and they ship as build errors. Your *business*
5
+ conventions are yours, and a primitive is a function returning a value, so you encode one by
6
+ wrapping and exporting your own factory. No fork, no monkey-patch, no plugin API, no release to
7
+ wait for.
8
+
9
+ Everything downstream treats the result identically — registry, manifest, projections, admin,
10
+ MCP, `x verify`.
11
+
12
+ **Re-run against 4.0.0** `As of 2026-08-20`: every fenced example on this page compiles under the
13
+ repository's own `tsconfig.base.json` (`strict`, `exactOptionalPropertyTypes`,
14
+ `noUncheckedIndexedAccess`, `verbatimModuleSyntax`), and both compile errors quoted under
15
+ [Two caveats](#two-caveats) are `tsc`'s verbatim words at that setting. The `tenantEntity` example
16
+ was executed as well, and again `As of 2026-11-03` — `getEntity('invoices').describe()` answers columns `id, memo, orgId,
17
+ createdAt`, one index `invoices_org_id_idx` on `org_id`, `orgScoped: true`, and
18
+ `invoices.$tenantColumn` is `'orgId'`. The projections are run too, on every gate:
19
+ `packages/cli/src/third-party-wrapper.test.ts` installs a factory-built entity, an MCP-exposed
20
+ action and a job from a package under `node_modules/`, re-exports them from an app, and asserts
21
+ `x entities`, the manifest and `tools/list` hold them, the action's policy refuses a caller without
22
+ the grant, and the job runs. It fails the day any of those learns where a primitive came from.
23
+
24
+ Put the factory in a surface both `app/` and `api/` may import — `apps/web/shared/base/` in the
25
+ generated layout ([Project layout](Project-Layout)).
26
+
27
+ ## A tenant entity
28
+
29
+ ```ts
30
+ // apps/web/shared/base/tenant-entity.ts
31
+ import { entity, timestamp, uuid, type ColumnMap, type EntityInit } from '@ultimat3/entity';
32
+
33
+ /** Every table in this app is org-scoped and stamped. Declared once, not at forty call sites. */
34
+ export const tenantEntity = <const C extends ColumnMap>(name: string, init: EntityInit<C>) =>
35
+ entity(name, {
36
+ ...init,
37
+ columns: { ...init.columns, orgId: uuid().tenant(), createdAt: timestamp().defaultNow() },
38
+ indexes: [...(init.indexes ?? []), { on: ['orgId'] }],
39
+ });
40
+ ```
41
+
42
+ ```ts
43
+ // apps/web/app/invoices/entity.ts
44
+ import { text, uuid } from '@ultimat3/entity';
45
+ import { tenantEntity } from '../../shared/base/tenant-entity';
46
+
47
+ export const invoices = tenantEntity('invoices', {
48
+ columns: { id: uuid().primaryKey(), memo: text() },
49
+ });
50
+
51
+ export type Invoice = typeof invoices.$row;
52
+ ```
53
+
54
+ What it buys:
55
+
56
+ | Before | After |
57
+ |---|---|
58
+ | every entity file remembers `orgId: uuid().tenant()` | tenancy is a property of the base, unforgettable |
59
+ | a forgotten tenant column is an unscoped read that ships | there is no way to declare an unscoped table through this factory |
60
+ | the `orgId` index is remembered per table, or is not | it arrives with the column |
61
+ | `createdAt` drifts in name and default across features | one spelling, one default |
62
+
63
+ The row type still derives from the merged column set: `Invoice` carries `orgId` and `createdAt`
64
+ without a second declaration. `invoices.$tenantColumn` is `'orgId'`, and a read built without an org
65
+ predicate throws `X_TENANCY_UNSCOPED` exactly as it would for a hand-written entity.
66
+
67
+ ## A mutator factory
68
+
69
+ The pattern is not entity-specific. Any primitive is a function returning a value, so any primitive
70
+ wraps:
71
+
72
+ ```ts
73
+ // apps/web/shared/base/audited-mutator.ts
74
+ import { mutator, type ActionPolicy, type LocalTx, type Mutator } from '@ultimat3/action';
75
+ import type { Ctx } from '@ultimat3/core';
76
+ import type { AnySchema, InferOutput } from '@ultimat3/schema';
77
+
78
+ interface AuditedDef<TIn extends AnySchema, TOut extends AnySchema> {
79
+ readonly input: TIn;
80
+ readonly output: TOut;
81
+ readonly policy: ActionPolicy;
82
+ readonly event: string;
83
+ local(tx: LocalTx, input: InferOutput<TIn>): void;
84
+ server(ctx: Ctx, input: InferOutput<TIn>): Promise<InferOutput<TOut>>;
85
+ }
86
+
87
+ /** Every write in this app records who did what. `conflict` is a house decision, made once. */
88
+ export const auditedMutator = <TIn extends AnySchema, TOut extends AnySchema>(
89
+ def: AuditedDef<TIn, TOut>,
90
+ ): Mutator<TIn, TOut> =>
91
+ mutator({
92
+ input: def.input,
93
+ output: def.output,
94
+ policy: def.policy,
95
+ idempotent: true, // required on every mutator — see Actions
96
+ conflict: 'server-wins',
97
+ local: def.local,
98
+ server: async (ctx, input) => {
99
+ const row = await def.server(ctx, input);
100
+ ctx.logger.info('audit', { event: def.event, actor: ctx.actor.id });
101
+ return row;
102
+ },
103
+ });
104
+ ```
105
+
106
+ The result is a `Mutator`, which **is** an `Action` — so it keeps its route, its OpenAPI operation,
107
+ its typed client method, its MCP tool, its job handle and its contract test, and its authz is still
108
+ the one evaluation. The same shape works over `action()`, `job()` and `query()`.
109
+
110
+ ## Why nothing downstream notices
111
+
112
+ | Machinery | Why the wrapper is invisible |
113
+ |---|---|
114
+ | the entity registry | `entity()` calls `registerEntity` itself, so registration happens whenever your factory calls it |
115
+ | `isAction()` | structural — a function, `kind === 'action'`, a stashed declaration. It asks whether `action()` built the value, never where |
116
+ | `registerActions(module)` | names the export **in place**, so `getAction('issueInvoice') === issueInvoice` by identity, not a copy |
117
+ | `x verify` | no step matches source text for `action(` / `entity(` / `mutator(`. Every primitive fact reaches the gate by importing the module and reading the runtime registries. The only text scanning is for `X_*` codes |
118
+ | manifest · admin CRUD · MCP · the five projections | all read those same registries |
119
+
120
+ ## Two caveats
121
+
122
+ Both will bite. Both are the app's job, one line each.
123
+
124
+ | Caveat | Fix |
125
+ |---|---|
126
+ | **A factory must add its own index for a column it injects.** `IndexInit` is keyed on the *caller's* columns — correctly, since a call site cannot name a column it did not declare. `tenantEntity('invoices', { indexes: [{ on: ['orgId'] }] })` is a compile error: `Type '"orgId"' is not assignable to type '"id" \| "memo"'` | put the index inside the factory, next to the column it belongs to — as `tenantEntity` above does |
127
+ | **A factory building a derived schema must be generic over `AnySchema`**, exported from `@ultimat3/schema`. `<TOut extends StandardSchemaV1>` is *not* assignable to `AnySchema`, so `t.object({ data: out })` fails with `Type 'TOut' is not assignable to type 'AnySchema'` | constrain to `AnySchema`. `StandardSchemaV1` is the interop contract; `AnySchema` is the framework's own supertype and the one `t.object` accepts |
128
+
129
+ ## An error code is declared, not wrapped
130
+
131
+ A primitive is wrapped; an error code is not. Declare each code at its own call site with
132
+ `defineError({ code: 'X_INVOICE_NOT_FOUND', title, status: 404, cause, fix })` from
133
+ `@ultimat3/core` — the title, the HTTP status and the class in one call. The `errors` step and the
134
+ manifest read the `code:` literal where it is written, so a factory that takes the code as a
135
+ parameter hides it (`X_ERROR_CODE_UNRESOLVED`). A family of codes is a prefix (`X_BILLING_*`),
136
+ never a base class: `guards/error-declared.ts` refuses `extends UltimateError`, and
137
+ `InvoiceNotFound.is(error)` matches the code where `instanceof` cannot — a browser's rebuilt
138
+ refusal included.
139
+
140
+ ## Publish it
141
+
142
+ A base that two of your apps share, or that strangers could use, is an npm package. Nothing
143
+ registers it: the app re-exports what it wants, and the framework sees primitives.
144
+
145
+ | Rule | Why |
146
+ |---|---|
147
+ | name it `ultimate-<name>`, unscoped, with the keyword `ultimate-package` | `npm search keywords:ultimate-package` is the directory. There is no marketplace, registry or plugin API (axiom 8). `@ultimat3/` is reserved for the framework |
148
+ | `@ultimat3/*` in `peerDependencies` at `^<major>`, for every package it imports — never `dependencies` | the app's own install is the one copy of each registry; a second copy is a second registry the app's gate never reads |
149
+ | ship JavaScript (or `.ts` Bun can run) with `exports` | a consumer's `bun install` is the whole integration |
150
+ | no `tier` | tiers order the framework's own packages (`scripts/lib/tiers.ts`); a third-party package sits beside the app, below nothing |
151
+ | guards are copied, not imported | an app's `guards/*.ts` are its own files and `x verify` runs only those. A package that ships a guard ships it as a file the README tells the author to copy |
152
+
153
+ ```json
154
+ {
155
+ "name": "ultimate-acme-log",
156
+ "version": "1.0.0",
157
+ "type": "module",
158
+ "exports": { ".": "./index.js" },
159
+ "keywords": ["ultimate-package"],
160
+ "peerDependencies": {
161
+ "@ultimat3/action": "^30.0.0",
162
+ "@ultimat3/entity": "^30.0.0",
163
+ "@ultimat3/jobs": "^30.0.0",
164
+ "@ultimat3/policy": "^30.0.0"
165
+ }
166
+ }
167
+ ```
168
+
169
+ The app takes what it wants by re-export, in the surface the primitive belongs to: one line,
170
+ `export { acmeLog } from 'ultimate-acme-log';`, in `apps/web/app/acme/entity.ts`.
171
+
172
+ What a consumer's `x verify` sees: the package's entity in `drift` (its table needs a migration,
173
+ `x db gen`), its actions and jobs in `manifest` and `contract-diff`, its permissions in `policy`
174
+ (the app's roles grant them), its MCP tools in the tool list. It
175
+ does **not** see the package's own tests, lint or guards: those are the package's to run.
176
+
177
+ A **starter** (a whole app shape, not a factory) is not a package: it is a repository a person
178
+ copies, and its README says so. Once one exists, a community list is a wiki page added by pull
179
+ request.
180
+
181
+ ## The honest limit
182
+
183
+ **The registry cannot tell that an entity came from your factory, and that erasure is the feature.**
184
+ `getEntity('invoices').describe()` reports columns, indexes and references — never `tenantEntity`.
185
+ A factory-built primitive is indistinguishable from a hand-written one, which is precisely why the
186
+ manifest, admin, MCP and the gate need no knowledge of your base.
187
+
188
+ The consequence for tooling: a subagent, a reviewer or a doc generator learns your house base **from
189
+ your source**, not from the registry. Name the factory for what it guarantees, keep it in one file
190
+ under `shared/base/`, and say so in your app's `AGENTS.md` — that file exists for conventions an
191
+ agent cannot infer.
192
+
193
+ This is not a gap awaiting a fix. A registry that recorded the factory would make your convention a
194
+ framework fact, and the next thing that read it would start depending on it.
195
+
196
+ ## Read next
197
+
198
+ | Page | Why |
199
+ |---|---|
200
+ | [The eight primitives](The-Eight-Primitives) | the vocabulary you are wrapping |
201
+ | [Entities and migrations](Entities-And-Migrations) | tenancy, invariants, what a merged column set migrates to |
202
+ | [Actions](Actions) | the six artifacts a wrapped action still projects |
203
+ | [`docs/idea/19-mechanism-not-convention.md`](https://github.com/developerz-ai/ultimate/blob/main/docs/idea/19-mechanism-not-convention.md) | axiom 8: which decisions are the framework's and which are yours |
@@ -0,0 +1,220 @@
1
+ # CI: the gate across parallel jobs
2
+
3
+ `x verify` is the gate on a laptop (its `budgets` step builds when the stats are stale): one
4
+ process tree, bounded to a memory budget. On CI, where wall time is what a pull request waits on,
5
+ the same gate splits across jobs — each step runnable on its own, the parallel test steps sharded —
6
+ and one aggregate job folds the parts back into the one verdict. Green means exactly what the local
7
+ gate's green means: every step, over the whole tree, passed.
8
+
9
+ ## Every step is its own command
10
+
11
+ `x verify --only <step>[,<step>…] --json` runs just those steps, in one process, paying nothing
12
+ for the others (no app load for a step that does not need one, no test run for a static step). Its
13
+ JSON is a *part*: `x verify merge` reads it back.
14
+
15
+ | Step | One job runs | Needs |
16
+ |---|---|---|
17
+ | `typecheck` | `x verify --only typecheck --json` | nothing |
18
+ | `lint` `boundaries` `filesize` `package-shape` `errors` | `x verify --only lint,boundaries,filesize,package-shape,errors --json` | nothing |
19
+ | `unit` | `x verify --only unit --shard i/n --json` | nothing (PGlite in process) |
20
+ | `contract` | `x verify --only contract --shard i/n --json` | nothing |
21
+ | `job` | `x verify --only job --shard i/n --json` | nothing |
22
+ | `live` | `x verify --only live --json` (or `--shard i/n`) | the test services (`docker/test-services.env`): Postgres (`TEST_DATABASE_URL`), the logical + TLS server (`TEST_REPLICATION_URL`, `TEST_TLS_REPLICATION_URL`), pooler, standby, Redis, NATS, S3 — one process per runner |
23
+ | `e2e` | `x verify --only e2e --json` (or `--shard i/n`) | the static build (`x build --target static --no-preflight`), Chrome — one process per runner |
24
+ | `eval` | `x verify --only eval --json` | nothing; baselines committed |
25
+ | `drift` `contract-diff` | `x verify --only drift,contract-diff --json` | nothing |
26
+ | `budgets` `seo` `i18n` `policy` | `x verify --only budgets,seo,i18n,policy --json` | the static build — `budgets` weighs `.x/build-stats.json` |
27
+ | `manifest` `roadmap` | `x verify --only manifest,roadmap --json` | nothing |
28
+
29
+ The grouping is yours: any split works as long as every step lands in exactly one part (or, for a
30
+ sharded step, in shards `1..n` exactly once). `x verify merge` refuses anything else.
31
+
32
+ ## `--shard i/n` — the parallel test steps
33
+
34
+ ```bash
35
+ x verify --only unit --shard 2/4 --json > part-unit-2.json
36
+ ```
37
+
38
+ - Only with `--only`, and only over the test steps: `unit`, `contract`, `live`, `job`, `e2e`
39
+ (any other step is `X_VERIFY_SHARD_INVALID`). `live` and `e2e` stay ONE process inside a shard —
40
+ serial means one replication slot and one browser per machine, and each runner starts its own
41
+ services — so when sharded, their shards split across runners, never across workers. `As of 2026-11-07` this
42
+ repository's CI still runs each as one part: its longest job is a `packages` coverage shard, so
43
+ a second live or e2e runner would cost runner minutes and save no wall clock.
44
+ - The split is a pure function of the step's **sorted** file list: round-robin by default, so job
45
+ 2 of 4 is the same files on every runner and on your laptop. `--timings <file>` (Bun's
46
+ `--timings` file, e.g. the `.x/test-timings.json` every parallel run refreshes — cache it
47
+ between CI runs) splits greedy longest-first instead; a file the timings do
48
+ not know is costed at their median.
49
+ - The part's JSON carries `data.shard` (`index`, `total`, and per step the `corpusHash` of the whole
50
+ list plus the `files` this shard ran), and each step carries the same facts as `steps[].shard`.
51
+ - A shard whose slice is empty, or ran only skipped tests, is not red: the zero-tests floor
52
+ (`x.verify.json`) is applied by `merge`, on the counts summed over every shard.
53
+ - An app's coverage floor is not judged by a shard — one slice cannot hold it. The shard is green
54
+ on coverage and carries what it covered in `data.coverage.unit.facts`; `merge` folds every shard and judges
55
+ once (`X_COVERAGE_BELOW_FLOOR`). Shards that carry nothing fold to 0%, never to a skip.
56
+ - Under `--json` each finished step is one line on stderr (`{"step":"unit","ok":true,"ms":61250}`),
57
+ so a cancelled job's log ends on the last step that finished. Redirect stdout only.
58
+ - A red shard reproduces locally with the same flags.
59
+
60
+ ## `x verify merge <part.json…>` — the verdict
61
+
62
+ ```bash
63
+ x verify merge parts/*.json --json
64
+ ```
65
+
66
+ Reads each part (the **last** JSON line of the file, so an older scaffold's `bun run check --json` output works too) and
67
+ answers the gate:
68
+
69
+ - every step of the gate appears — `X_VERIFY_MERGE_INCOMPLETE` names a step no part ran;
70
+ - a sharded step has shards `1..n` exactly once, all with one `corpusHash` — a missing shard, a
71
+ duplicate, or two corpora (jobs on different commits) is named;
72
+ - and their `files` partition that corpus: a file in two shards, or in none (the union does not
73
+ hash to `corpusHash` — shards split by two rules, one with `--timings` and one without), is named;
74
+ - the zero-tests floor is applied to each sharded step's summed counts;
75
+ - an app's coverage floor is applied to the fold of a sharded `unit` step's `data.coverage.unit.facts`;
76
+ - a red step in any part is red here, with its findings and output kept.
77
+
78
+ The merged document has no `notAGateRun` — it is the gate's answer — and its `durationMs` is the
79
+ slowest part's, which is the wall time CI waited. A part that is not an `x verify --json`
80
+ document is `X_VERIFY_MERGE_INPUT` — and so is a step whose `durationMs` is not a number or whose
81
+ `findings` are not each a `code`, `cause` and `fix`.
82
+
83
+ ## A GitHub Actions workflow
84
+
85
+ ```yaml
86
+ name: ci
87
+ on: [push, pull_request]
88
+
89
+ jobs:
90
+ part:
91
+ name: ${{ matrix.name }}
92
+ runs-on: ubuntu-latest
93
+ strategy:
94
+ fail-fast: false # every part must upload, red or green: merge decides
95
+ matrix:
96
+ include:
97
+ - { name: typecheck, only: typecheck }
98
+ - { name: static, only: 'lint,boundaries,filesize,package-shape,errors' }
99
+ - { name: unit-1, only: unit, shard: 1/4 }
100
+ - { name: unit-2, only: unit, shard: 2/4 }
101
+ - { name: unit-3, only: unit, shard: 3/4 }
102
+ - { name: unit-4, only: unit, shard: 4/4 }
103
+ - { name: contract-1, only: contract, shard: 1/2 }
104
+ - { name: contract-2, only: contract, shard: 2/2 }
105
+ - { name: job, only: job, shard: 1/1 }
106
+ - { name: tail, only: 'eval,drift,contract-diff,manifest,roadmap' }
107
+ - { name: built, only: 'e2e,budgets,seo,i18n,policy', build: true }
108
+ - { name: live, only: live, postgres: true }
109
+ env:
110
+ TEST_DATABASE_URL: ${{ matrix.postgres && 'postgres://postgres:postgres@localhost:5432/postgres' || '' }}
111
+ steps:
112
+ - uses: actions/checkout@v4
113
+ - uses: oven-sh/setup-bun@v2
114
+ - run: bun install --frozen-lockfile
115
+ - if: matrix.postgres # live needs logical replication: a service container cannot pass -c
116
+ run: |
117
+ docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=postgres postgres:17 -c wal_level=logical
118
+ until docker run --rm --network host postgres:17 pg_isready -h localhost; do sleep 1; done
119
+ - if: matrix.build
120
+ run: bunx x build --target static --no-preflight
121
+ - name: x verify (one part)
122
+ run: |
123
+ bunx x verify --only '${{ matrix.only }}' \
124
+ ${{ matrix.shard && format('--shard {0}', matrix.shard) || '' }} \
125
+ --json > "$RUNNER_TEMP/part.json" || true
126
+ # Outside the checkout: the file is open and empty while the part runs, and `lint` walks the tree.
127
+ - uses: actions/upload-artifact@v4
128
+ with: { name: 'part-${{ matrix.name }}', path: '${{ runner.temp }}/part.json' }
129
+
130
+ check: # the one required status check
131
+ needs: part
132
+ if: always()
133
+ runs-on: ubuntu-latest
134
+ steps:
135
+ - uses: actions/checkout@v4
136
+ - uses: oven-sh/setup-bun@v2
137
+ - run: bun install --frozen-lockfile
138
+ - uses: actions/download-artifact@v4
139
+ with: { pattern: 'part-*', path: parts }
140
+ - run: bunx x verify merge parts/*/part.json
141
+ ```
142
+
143
+ Make `check` the single required status. A job that crashed before uploading its part is not a
144
+ pass: its steps are missing and `merge` names them.
145
+
146
+ ## A push a green PR run already tested
147
+
148
+ Merging an up-to-date green pull request pushes a tree CI has already tested. `x ci tested` says
149
+ so — `data.tested` — and every job that run answered skips. As of 2026-11, 55 of this repository's
150
+ last 81 pushes to `main` were such a tree.
151
+
152
+ | `tested: true` needs | Why |
153
+ |---|---|
154
+ | the subject ends `(#N)` | only a merge of PR N is a candidate |
155
+ | PR N merged as **this** commit | a `(#N)` typed by hand proves nothing |
156
+ | its head is in this repository | a fork writes its own workflow; its green is not reused |
157
+ | its head tree is this tree | a base that moved after the run is an untested merge |
158
+ | the newest same-repository run on that head concluded `success`, under `--max-age` (default `24h`) | the runner image and the registry move |
159
+
160
+ Any doubt — a condition unmet, `gh` absent, an API that did not answer — is `false`: a full run.
161
+ The command exits 0 on every answer.
162
+
163
+ ```yaml
164
+ jobs:
165
+ tested:
166
+ runs-on: ubuntu-latest
167
+ permissions: { contents: read, actions: read, pull-requests: read }
168
+ outputs:
169
+ tested: ${{ steps.tested.outputs.tested }}
170
+ steps:
171
+ # Only a push asks. Never a release commit: what publishes is a run of everything.
172
+ - if: github.event_name == 'push' && !startsWith(github.event.head_commit.message, 'release')
173
+ uses: actions/checkout@v4
174
+ - if: github.event_name == 'push' && !startsWith(github.event.head_commit.message, 'release')
175
+ uses: oven-sh/setup-bun@v2
176
+ - if: github.event_name == 'push' && !startsWith(github.event.head_commit.message, 'release')
177
+ run: bun install --frozen-lockfile
178
+ - id: tested
179
+ if: github.event_name == 'push' && !startsWith(github.event.head_commit.message, 'release')
180
+ env: { GH_TOKEN: '${{ github.token }}' }
181
+ run: |
182
+ bunx x ci tested --repo "$GITHUB_REPOSITORY" --json > tested.json
183
+ echo "tested=$(jq -r .data.tested tested.json)" >> "$GITHUB_OUTPUT"
184
+
185
+ part:
186
+ needs: tested
187
+ if: ${{ !cancelled() && needs.tested.outputs.tested != 'true' }}
188
+ # … the matrix above, unchanged
189
+
190
+ check:
191
+ needs: [tested, part]
192
+ if: ${{ !cancelled() && needs.tested.outputs.tested != 'true' }}
193
+ # … unchanged
194
+ ```
195
+
196
+ Each reused job carries that **one** `if` and nothing else, so a skip has exactly one cause:
197
+ `tested` said true. `!cancelled()` is load-bearing: a bare `needs.…` condition implies
198
+ `success()`, and a red or timed-out `tested` would skip every job instead of running them. A
199
+ reader of a skipped check (a deploy, a required status) can then accept the skip only beside a
200
+ green `tested` check. On a
201
+ pull request every step of `tested` is skipped and nothing below it is. The cost: one near-empty
202
+ job's runner acquisition ahead of every other job, a few seconds.
203
+
204
+ ## Width and memory, per job
205
+
206
+ Each job sizes its own test width the same way the laptop does (`x verify` prints it on the step
207
+ line, e.g. `3 workers (budget 4.0 GB)`): a budget of `max(2.75 GiB, 25% of the runner's RAM)`,
208
+ 1.25 GiB planned per worker, never more workers than cores. On a 16 GB `ubuntu-latest` that is 3
209
+ workers; a 62 GB, 16-core workstation plans 12 (`As of 2026-11-07`, when the fixed 4 GiB cap went —
210
+ the machine-wide slot pool is what keeps two runs on one box inside one budget). `ULTIMATE_TEST_MEMORY_BUDGET=6g` or `ULTIMATE_TEST_MAX_WORKERS=4` override it; `--workers`
211
+ wins over both. The machine-wide slot pool (see [Testing](Testing#memory-width-and-isolation))
212
+ has nothing to share on a one-job VM; `ULTIMATE_TEST_SLOTS=0` turns it off.
213
+
214
+ ## Skipping the build's duplicate preflight
215
+
216
+ `x build` runs the six static steps before it builds (typecheck, lint, boundaries, filesize,
217
+ package-shape, errors) so a bare build never ships an artifact from a tree that does not typecheck.
218
+ In a gate that runs those steps anyway, `--no-preflight` skips them — `x verify`'s `budgets` step does
219
+ when it builds, and so does the `built` job above, whose build first leaves `budgets` fresh stats and
220
+ no second build. The default stays safe.