@1aboveio/skills 0.10.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 (397) hide show
  1. package/LICENSE +3 -0
  2. package/README.md +90 -0
  3. package/bin/1aboveio-skills.mjs +18 -0
  4. package/package.json +28 -0
  5. package/runtime/skills/distribution/generated/recipes.json +1189 -0
  6. package/runtime/skills/distribution/scripts/bundles.mjs +280 -0
  7. package/runtime/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
  8. package/skills/backend/airflow-dag-develop/LICENSE +3 -0
  9. package/skills/backend/airflow-dag-develop/SKILL.md +111 -0
  10. package/skills/backend/app-debug/LICENSE +3 -0
  11. package/skills/backend/app-debug/SKILL.md +109 -0
  12. package/skills/backend/app-debug/references/common-errors.md +128 -0
  13. package/skills/backend/python-backend/LICENSE +3 -0
  14. package/skills/backend/python-backend/SKILL.md +326 -0
  15. package/skills/cicd-pipeline/cloud-build/LICENSE +3 -0
  16. package/skills/cicd-pipeline/cloud-build/SKILL.md +707 -0
  17. package/skills/cicd-pipeline/cloud-debug/LICENSE +3 -0
  18. package/skills/cicd-pipeline/cloud-debug/SKILL.md +316 -0
  19. package/skills/cicd-pipeline/cloud-debug/references/build-failures.md +238 -0
  20. package/skills/cicd-pipeline/cloud-debug/references/deploy-failures.md +376 -0
  21. package/skills/cicd-pipeline/cloud-debug/references/pipeline-failures.md +378 -0
  22. package/skills/cicd-pipeline/cloud-deploy/LICENSE +3 -0
  23. package/skills/cicd-pipeline/cloud-deploy/SKILL.md +229 -0
  24. package/skills/cicd-pipeline/cloud-deploy/references/config-templates.md +257 -0
  25. package/skills/cicd-pipeline/docker/LICENSE +3 -0
  26. package/skills/cicd-pipeline/docker/SKILL.md +126 -0
  27. package/skills/cicd-pipeline/google-cloud/LICENSE +3 -0
  28. package/skills/cicd-pipeline/google-cloud/SKILL.md +118 -0
  29. package/skills/cicd-pipeline/google-cloud/references/gcs.md +469 -0
  30. package/skills/cicd-pipeline/google-cloud/references/iam.md +451 -0
  31. package/skills/cicd-pipeline/google-cloud/references/project.md +349 -0
  32. package/skills/cicd-pipeline/google-cloud/references/secrets.md +336 -0
  33. package/skills/cicd-pipeline/google-cloud/references/vpc.md +312 -0
  34. package/skills/cicd-pipeline/google-cloud/scripts/create-sa.sh +36 -0
  35. package/skills/cicd-pipeline/google-cloud/scripts/gcp-config.sh +31 -0
  36. package/skills/cicd-pipeline/google-cloud/scripts/grant-iap.sh +41 -0
  37. package/skills/cicd-pipeline/google-cloud/scripts/setup-secrets.sh +48 -0
  38. package/skills/cicd-pipeline/mergify/LICENSE +3 -0
  39. package/skills/cicd-pipeline/mergify/SKILL.md +138 -0
  40. package/skills/cicd-pipeline/mergify/assets/templates/mergify.yml +237 -0
  41. package/skills/cicd-pipeline/mergify/assets/templates/ruleset.json +46 -0
  42. package/skills/cicd-pipeline/mergify/references/branch-protection.md +277 -0
  43. package/skills/cicd-pipeline/mergify/references/configuration.md +183 -0
  44. package/skills/cicd-pipeline/mergify/references/diagnosis.md +73 -0
  45. package/skills/cicd-pipeline/mergify/references/traps.md +78 -0
  46. package/skills/cicd-pipeline/mergify/references/watch-contract.md +218 -0
  47. package/skills/cicd-pipeline/mergify/scripts/audit-core.mjs +131 -0
  48. package/skills/cicd-pipeline/mergify/scripts/audit.mjs +4 -0
  49. package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery-core.mjs +663 -0
  50. package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery.mjs +4 -0
  51. package/skills/cicd-pipeline/podman/LICENSE +3 -0
  52. package/skills/cicd-pipeline/podman/SKILL.md +70 -0
  53. package/skills/cicd-pipeline/podman/agents/openai.yaml +4 -0
  54. package/skills/cicd-pipeline/podman/assets/templates/podman-compose-socket-directory.yml +6 -0
  55. package/skills/cicd-pipeline/podman/assets/templates/podman-service-override.conf +3 -0
  56. package/skills/cicd-pipeline/podman/references/compose-compatibility.md +70 -0
  57. package/skills/cicd-pipeline/podman/references/networking-and-ports.md +74 -0
  58. package/skills/cicd-pipeline/podman/references/rootless-services-and-sockets.md +156 -0
  59. package/skills/cicd-pipeline/podman/references/troubleshooting.md +98 -0
  60. package/skills/engineering/e2e-test/LICENSE +3 -0
  61. package/skills/engineering/e2e-test/SKILL.md +156 -0
  62. package/skills/engineering/e2e-test/assets/ci-gates.cloudbuild.yaml +272 -0
  63. package/skills/engineering/e2e-test/assets/ci-gates.github.yml +451 -0
  64. package/skills/engineering/e2e-test/assets/e2e-workflow.yml +282 -0
  65. package/skills/engineering/e2e-test/references/authoring/auth-flows.md +159 -0
  66. package/skills/engineering/e2e-test/references/authoring/playwright-config.md +71 -0
  67. package/skills/engineering/e2e-test/references/authoring/playwright-patterns.md +219 -0
  68. package/skills/engineering/e2e-test/references/authoring/test-skipping.md +44 -0
  69. package/skills/engineering/e2e-test/references/ci-integration.md +121 -0
  70. package/skills/engineering/e2e-test/references/ci-playwright-container.md +280 -0
  71. package/skills/engineering/e2e-test/references/debugging.md +36 -0
  72. package/skills/engineering/e2e-test/references/presentation-sweep.md +131 -0
  73. package/skills/engineering/e2e-test/references/reviewing.md +39 -0
  74. package/skills/engineering/e2e-test/references/route-discovery.md +50 -0
  75. package/skills/engineering/e2e-test/references/route-manifest.md +44 -0
  76. package/skills/engineering/e2e-test/scripts/detect-routes-fastapi.py +290 -0
  77. package/skills/engineering/e2e-test/scripts/detect-routes-nextjs.mjs +200 -0
  78. package/skills/engineering/e2e-test/scripts/post-visual-evidence.mjs +158 -0
  79. package/skills/engineering/e2e-test/scripts/presentation-checks.mjs +171 -0
  80. package/skills/engineering/e2e-test/scripts/presentation-perceivability.mjs +179 -0
  81. package/skills/engineering/e2e-test/scripts/presentation-reachability.mjs +154 -0
  82. package/skills/engineering/e2e-test/scripts/presentation-render-health.mjs +141 -0
  83. package/skills/engineering/e2e-test/scripts/presentation-sweep.mjs +148 -0
  84. package/skills/engineering/e2e-test/scripts/presentation-temporal.mjs +127 -0
  85. package/skills/engineering/e2e-test/scripts/presentation-visual.mjs +84 -0
  86. package/skills/engineering/e2e-test/scripts/project-route-manifest.mjs +75 -0
  87. package/skills/engineering/e2e-test/scripts/validate-manifest.mjs +106 -0
  88. package/skills/engineering/engineering-runtime/LICENSE +3 -0
  89. package/skills/engineering/engineering-runtime/SKILL.md +10 -0
  90. package/skills/engineering/engineering-runtime/agents/openai.yaml +6 -0
  91. package/skills/engineering/engineering-runtime/coherence/workflow.json +553 -0
  92. package/skills/engineering/engineering-runtime/scripts/exact-head-artifact.mjs +131 -0
  93. package/skills/engineering/engineering-runtime/scripts/head-check-set.mjs +398 -0
  94. package/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
  95. package/skills/engineering/engineering-runtime/scripts/mergify-yaml.mjs +11 -0
  96. package/skills/engineering/engineering-runtime/scripts/package-lock.json +43 -0
  97. package/skills/engineering/engineering-runtime/scripts/package.json +10 -0
  98. package/skills/engineering/engineering-runtime/scripts/required-check-plan.mjs +223 -0
  99. package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +576 -0
  100. package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +166 -0
  101. package/skills/engineering/ensure-coverage/LICENSE +3 -0
  102. package/skills/engineering/ensure-coverage/SKILL.md +136 -0
  103. package/skills/engineering/ensure-coverage/evals/evals.json +125 -0
  104. package/skills/engineering/ensure-coverage/references/breadth/coverage-ledger.md +91 -0
  105. package/skills/engineering/ensure-coverage/references/breadth/inventory-contract.md +83 -0
  106. package/skills/engineering/ensure-coverage/references/breadth/surface-baseline.md +44 -0
  107. package/skills/engineering/ensure-coverage/references/breadth/surface-discovery.md +16 -0
  108. package/skills/engineering/ensure-coverage/references/depth/characterization.md +68 -0
  109. package/skills/engineering/ensure-coverage/references/depth/coverage.config.example.json +25 -0
  110. package/skills/engineering/ensure-coverage/references/depth/grading.md +35 -0
  111. package/skills/engineering/ensure-coverage/references/depth/mock-policy.md +87 -0
  112. package/skills/engineering/ensure-coverage/references/depth/test-smells.md +23 -0
  113. package/skills/engineering/ensure-coverage/references/enforcement/ci-contract.md +164 -0
  114. package/skills/engineering/ensure-coverage/references/enforcement/hooks.md +85 -0
  115. package/skills/engineering/ensure-coverage/references/examples/coverage-ledger.md +109 -0
  116. package/skills/engineering/ensure-coverage/references/examples/refund-flow.md +33 -0
  117. package/skills/engineering/ensure-coverage/references/presentation/axis.md +78 -0
  118. package/skills/engineering/ensure-coverage/references/presentation/runner-contract.md +74 -0
  119. package/skills/engineering/ensure-coverage/references/process/audit-mode.md +33 -0
  120. package/skills/engineering/ensure-coverage/references/process/output-template.md +139 -0
  121. package/skills/engineering/ensure-coverage/references/process/review-contract-template.md +119 -0
  122. package/skills/engineering/ensure-coverage/references/process/scope-class.md +178 -0
  123. package/skills/engineering/ensure-coverage/references/process/test-strategy.md +55 -0
  124. package/skills/engineering/ensure-coverage/schemas/coverage-config.schema.json +45 -0
  125. package/skills/engineering/ensure-coverage/schemas/coverage-file.schema.json +93 -0
  126. package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.mjs +178 -0
  127. package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.mjs +101 -0
  128. package/skills/engineering/ensure-coverage/scripts/ci-audit.mjs +358 -0
  129. package/skills/engineering/ensure-coverage/scripts/coverage-checklist.mjs +494 -0
  130. package/skills/engineering/ensure-coverage/scripts/coverage-ledger.mjs +663 -0
  131. package/skills/engineering/ensure-coverage/scripts/design-parity.mjs +591 -0
  132. package/skills/engineering/ensure-coverage/scripts/evidence-block.mjs +367 -0
  133. package/skills/engineering/ensure-coverage/scripts/lint-tests.mjs +269 -0
  134. package/skills/engineering/ensure-coverage/scripts/mock-policy-config.mjs +176 -0
  135. package/skills/engineering/ensure-coverage/scripts/package-lock.json +76 -0
  136. package/skills/engineering/ensure-coverage/scripts/package.json +19 -0
  137. package/skills/engineering/ensure-coverage/scripts/scope-class.mjs +554 -0
  138. package/skills/engineering/harness-runtime/LICENSE +3 -0
  139. package/skills/engineering/harness-runtime/SKILL.md +18 -0
  140. package/skills/engineering/harness-runtime/agents/openai.yaml +6 -0
  141. package/skills/engineering/harness-runtime/bin/discover-models.mjs +4 -0
  142. package/skills/engineering/harness-runtime/bin/model-catalog.mjs +4 -0
  143. package/skills/engineering/harness-runtime/contracts.md +15 -0
  144. package/skills/engineering/harness-runtime/discover-models.mjs +392 -0
  145. package/skills/engineering/harness-runtime/fixtures/native-question-schemas.json +33 -0
  146. package/skills/engineering/harness-runtime/fixtures/question-responses.json +54 -0
  147. package/skills/engineering/harness-runtime/index.mjs +767 -0
  148. package/skills/engineering/harness-runtime/model-catalog.mjs +787 -0
  149. package/skills/engineering/harness-runtime/native-question-contracts.md +37 -0
  150. package/skills/engineering/harness-runtime/references/model-catalog-seed.json +159 -0
  151. package/skills/engineering/harness-runtime/references/model-catalog.md +57 -0
  152. package/skills/engineering/implement-and-pr/LICENSE +3 -0
  153. package/skills/engineering/implement-and-pr/SKILL.md +176 -0
  154. package/skills/engineering/implement-and-pr/references/ci-iteration.md +10 -0
  155. package/skills/engineering/implement-and-pr/references/closeout.md +27 -0
  156. package/skills/engineering/implement-and-pr/references/contract-complete-fix-rounds.md +34 -0
  157. package/skills/engineering/implement-and-pr/references/evidence-rules.md +39 -0
  158. package/skills/engineering/implement-and-pr/references/incremental-plan.md +16 -0
  159. package/skills/engineering/implement-and-pr/references/self-review.md +23 -0
  160. package/skills/engineering/implement-and-pr/references/tdd-mode.md +18 -0
  161. package/skills/engineering/resolve-issues/LICENSE +3 -0
  162. package/skills/engineering/resolve-issues/SKILL.md +167 -0
  163. package/skills/engineering/resolve-issues/generated/workflow-repair-policy.json +448 -0
  164. package/skills/engineering/resolve-issues/references/breaker.md +82 -0
  165. package/skills/engineering/resolve-issues/references/deliverables.md +27 -0
  166. package/skills/engineering/resolve-issues/references/delivery.md +108 -0
  167. package/skills/engineering/resolve-issues/references/evidence-lane.md +21 -0
  168. package/skills/engineering/resolve-issues/references/exact-head-ci.md +287 -0
  169. package/skills/engineering/resolve-issues/references/fan-out.md +33 -0
  170. package/skills/engineering/resolve-issues/references/finalization.md +68 -0
  171. package/skills/engineering/resolve-issues/references/guarantees.md +10 -0
  172. package/skills/engineering/resolve-issues/references/high-risk.md +29 -0
  173. package/skills/engineering/resolve-issues/references/incidents/848/README.md +156 -0
  174. package/skills/engineering/resolve-issues/references/intake.md +86 -0
  175. package/skills/engineering/resolve-issues/references/integration-gate.md +53 -0
  176. package/skills/engineering/resolve-issues/references/interference.md +87 -0
  177. package/skills/engineering/resolve-issues/references/loop.md +134 -0
  178. package/skills/engineering/resolve-issues/references/model-catalog.md +9 -0
  179. package/skills/engineering/resolve-issues/references/postmortem.md +27 -0
  180. package/skills/engineering/resolve-issues/references/pre-flight-model-slots.md +41 -0
  181. package/skills/engineering/resolve-issues/references/pre-flight-recording-and-checkout.md +48 -0
  182. package/skills/engineering/resolve-issues/references/pre-flight.md +41 -0
  183. package/skills/engineering/resolve-issues/references/regression-checklist.md +26 -0
  184. package/skills/engineering/resolve-issues/references/run-state.md +288 -0
  185. package/skills/engineering/resolve-issues/references/sandboxed-testing.md +48 -0
  186. package/skills/engineering/resolve-issues/references/spawn-contract.md +96 -0
  187. package/skills/engineering/resolve-issues/references/terminal-evidence-journal.md +40 -0
  188. package/skills/engineering/resolve-issues/references/why.md +653 -0
  189. package/skills/engineering/resolve-issues/schemas/fix-round.schema.json +49 -0
  190. package/skills/engineering/resolve-issues/scripts/combine-and-verify.mjs +721 -0
  191. package/skills/engineering/resolve-issues/scripts/component-candidate.mjs +962 -0
  192. package/skills/engineering/resolve-issues/scripts/contract-revision.mjs +220 -0
  193. package/skills/engineering/resolve-issues/scripts/detect-delivery-mode.mjs +420 -0
  194. package/skills/engineering/resolve-issues/scripts/detect-target-branch.mjs +256 -0
  195. package/skills/engineering/resolve-issues/scripts/detect-workspace-mode.mjs +168 -0
  196. package/skills/engineering/resolve-issues/scripts/discover-models.mjs +9 -0
  197. package/skills/engineering/resolve-issues/scripts/doctrine.mjs +62 -0
  198. package/skills/engineering/resolve-issues/scripts/evidence-lifecycle-contract.mjs +191 -0
  199. package/skills/engineering/resolve-issues/scripts/exact-head-ci.mjs +413 -0
  200. package/skills/engineering/resolve-issues/scripts/exact-head-github-provider.mjs +332 -0
  201. package/skills/engineering/resolve-issues/scripts/finalize.mjs +488 -0
  202. package/skills/engineering/resolve-issues/scripts/fix-rounds.mjs +3307 -0
  203. package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-circular-1001.json +16 -0
  204. package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-valid-sequencing.json +51 -0
  205. package/skills/engineering/resolve-issues/scripts/fixtures/fmm-express-830-component-candidate.json +17 -0
  206. package/skills/engineering/resolve-issues/scripts/fixtures/head-check-set-1081.json +166 -0
  207. package/skills/engineering/resolve-issues/scripts/gate-value-series.mjs +92 -0
  208. package/skills/engineering/resolve-issues/scripts/guide-index.mjs +73 -0
  209. package/skills/engineering/resolve-issues/scripts/head-check-set.mjs +159 -0
  210. package/skills/engineering/resolve-issues/scripts/interference.mjs +427 -0
  211. package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +9 -0
  212. package/skills/engineering/resolve-issues/scripts/next-operations.mjs +419 -0
  213. package/skills/engineering/resolve-issues/scripts/postmortem.mjs +909 -0
  214. package/skills/engineering/resolve-issues/scripts/preflight-questions.mjs +322 -0
  215. package/skills/engineering/resolve-issues/scripts/reconcile-contained-unit-prs.mjs +415 -0
  216. package/skills/engineering/resolve-issues/scripts/release-state-contract.mjs +697 -0
  217. package/skills/engineering/resolve-issues/scripts/report.mjs +494 -0
  218. package/skills/engineering/resolve-issues/scripts/required-check-plan.mjs +172 -0
  219. package/skills/engineering/resolve-issues/scripts/round-metadata.mjs +79 -0
  220. package/skills/engineering/resolve-issues/scripts/run-state-review6-cases.mjs +334 -0
  221. package/skills/engineering/resolve-issues/scripts/run-state.mjs +4784 -0
  222. package/skills/engineering/resolve-issues/scripts/sandbox-selftest.mjs +395 -0
  223. package/skills/engineering/resolve-issues/scripts/spawn-contract.mjs +290 -0
  224. package/skills/engineering/resolve-issues/scripts/terminal-dispositions.mjs +170 -0
  225. package/skills/engineering/resolve-issues/scripts/terminal-evidence-journal.mjs +293 -0
  226. package/skills/engineering/resolve-issues/scripts/unit-kind.mjs +197 -0
  227. package/skills/engineering/resolve-issues/scripts/unit-lifecycle.mjs +127 -0
  228. package/skills/engineering/resolve-issues/scripts/watch-delivery.mjs +893 -0
  229. package/skills/engineering/resolve-issues/scripts/workspaces.mjs +829 -0
  230. package/skills/engineering/resolve-issues/workflows/independent-review.workflow.js +290 -0
  231. package/skills/engineering/resolve-issues/workflows/prior-art-scan.workflow.js +80 -0
  232. package/skills/engineering/resolve-issues/workflows/workflow-smoke.mjs +102 -0
  233. package/skills/engineering/resolve-release/LICENSE +3 -0
  234. package/skills/engineering/resolve-release/SKILL.md +112 -0
  235. package/skills/engineering/resolve-release/references/assembly.md +137 -0
  236. package/skills/engineering/resolve-release/references/auto-when-green.md +56 -0
  237. package/skills/engineering/resolve-release/references/candidate.md +167 -0
  238. package/skills/engineering/resolve-release/references/exposure.md +178 -0
  239. package/skills/engineering/resolve-release/references/handoff.md +24 -0
  240. package/skills/engineering/resolve-release/references/postmortem.md +230 -0
  241. package/skills/engineering/resolve-release/references/preflight.md +207 -0
  242. package/skills/engineering/resolve-release/references/principles.md +94 -0
  243. package/skills/engineering/resolve-release/references/regression-checklist.md +36 -0
  244. package/skills/engineering/resolve-release/references/related-skills.md +12 -0
  245. package/skills/engineering/resolve-release/references/routing.md +149 -0
  246. package/skills/engineering/resolve-release/references/verified-sha-github-flow.md +285 -0
  247. package/skills/engineering/resolve-release/references/versioning.md +202 -0
  248. package/skills/engineering/resolve-release/references/why.md +53 -0
  249. package/skills/engineering/resolve-release/scripts/adapter-completion-artifact.mjs +389 -0
  250. package/skills/engineering/resolve-release/scripts/build-changes.mjs +209 -0
  251. package/skills/engineering/resolve-release/scripts/candidate-hygiene.mjs +407 -0
  252. package/skills/engineering/resolve-release/scripts/candidate-identity.mjs +904 -0
  253. package/skills/engineering/resolve-release/scripts/candidate-traffic.mjs +81 -0
  254. package/skills/engineering/resolve-release/scripts/checked-adapter-loader.mjs +612 -0
  255. package/skills/engineering/resolve-release/scripts/close-attempt.mjs +135 -0
  256. package/skills/engineering/resolve-release/scripts/closeout-release.mjs +161 -0
  257. package/skills/engineering/resolve-release/scripts/doctrine.mjs +106 -0
  258. package/skills/engineering/resolve-release/scripts/durable-processing.mjs +522 -0
  259. package/skills/engineering/resolve-release/scripts/ensure-target-green.mjs +659 -0
  260. package/skills/engineering/resolve-release/scripts/evidence-bundle.mjs +1014 -0
  261. package/skills/engineering/resolve-release/scripts/finalize-release.mjs +526 -0
  262. package/skills/engineering/resolve-release/scripts/fixtures/durable-processing-adapter.mjs +169 -0
  263. package/skills/engineering/resolve-release/scripts/green-gate.mjs +599 -0
  264. package/skills/engineering/resolve-release/scripts/isolated-adapter-evaluator.mjs +752 -0
  265. package/skills/engineering/resolve-release/scripts/metadata-pr-status.mjs +56 -0
  266. package/skills/engineering/resolve-release/scripts/metadata-sync.mjs +1538 -0
  267. package/skills/engineering/resolve-release/scripts/postmortem.mjs +381 -0
  268. package/skills/engineering/resolve-release/scripts/preflight-probes.mjs +498 -0
  269. package/skills/engineering/resolve-release/scripts/production-endpoints.mjs +326 -0
  270. package/skills/engineering/resolve-release/scripts/rc-circuit-breaker.mjs +272 -0
  271. package/skills/engineering/resolve-release/scripts/report.mjs +417 -0
  272. package/skills/engineering/resolve-release/scripts/reprobe-credentials.mjs +114 -0
  273. package/skills/engineering/resolve-release/scripts/revalidate-candidate.mjs +238 -0
  274. package/skills/engineering/resolve-release/scripts/review-packet.mjs +503 -0
  275. package/skills/engineering/resolve-release/scripts/rollback-floor.mjs +263 -0
  276. package/skills/engineering/resolve-release/scripts/version-assert.mjs +339 -0
  277. package/skills/engineering/resolve-release/scripts/version-postmortem.mjs +485 -0
  278. package/skills/engineering/resolve-release/scripts/version.mjs +1199 -0
  279. package/skills/engineering/resolve-release/scripts/watch-candidate-delivery.mjs +449 -0
  280. package/skills/engineering/resolve-release/vendor/ACORN-LICENSE +21 -0
  281. package/skills/engineering/resolve-release/vendor/README.md +60 -0
  282. package/skills/engineering/resolve-release/vendor/acorn.mjs +6233 -0
  283. package/skills/engineering/resolve-release/vendor/quickjs/core/LICENSE +21 -0
  284. package/skills/engineering/resolve-release/vendor/quickjs/core/README.md +341 -0
  285. package/skills/engineering/resolve-release/vendor/quickjs/core/README.template.md +70 -0
  286. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs +2 -0
  287. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs.map +1 -0
  288. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs +7 -0
  289. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs.map +1 -0
  290. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.mts +2033 -0
  291. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.ts +2033 -0
  292. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js +7 -0
  293. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js.map +1 -0
  294. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs +2 -0
  295. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs.map +1 -0
  296. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs +2 -0
  297. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs.map +1 -0
  298. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs +2 -0
  299. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs.map +1 -0
  300. package/skills/engineering/resolve-release/vendor/quickjs/core/package.json +49 -0
  301. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/LICENSE +21 -0
  302. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/README.md +5 -0
  303. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.mts +549 -0
  304. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.ts +549 -0
  305. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js +2 -0
  306. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js.map +1 -0
  307. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs +2 -0
  308. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs.map +1 -0
  309. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/package.json +36 -0
  310. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/LICENSE +47 -0
  311. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/README.md +82 -0
  312. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.d.ts +11 -0
  313. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.mjs +22 -0
  314. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cjs +21 -0
  315. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.cjs +21 -0
  316. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.d.ts +11 -0
  317. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.d.ts +11 -0
  318. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.mjs +25 -0
  319. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.wasm +0 -0
  320. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.mts +85 -0
  321. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.ts +85 -0
  322. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js +2 -0
  323. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js.map +1 -0
  324. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs +2 -0
  325. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs.map +1 -0
  326. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.mts +20 -0
  327. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.ts +20 -0
  328. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js +2 -0
  329. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js.map +1 -0
  330. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs +2 -0
  331. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs.map +1 -0
  332. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/package.json +61 -0
  333. package/skills/engineering/review-pr/LICENSE +3 -0
  334. package/skills/engineering/review-pr/SKILL.md +123 -0
  335. package/skills/engineering/review-pr/references/adversarial-reviewer-prompt.md +42 -0
  336. package/skills/engineering/review-pr/references/code-correctness.md +5 -0
  337. package/skills/engineering/review-pr/references/contract-freshness.md +9 -0
  338. package/skills/engineering/review-pr/references/coordination.md +18 -0
  339. package/skills/engineering/review-pr/references/domain-hazards.md +123 -0
  340. package/skills/engineering/review-pr/references/finding-themes.md +7 -0
  341. package/skills/engineering/review-pr/references/github-posting.md +98 -0
  342. package/skills/engineering/review-pr/references/golden-path-smoke.md +5 -0
  343. package/skills/engineering/review-pr/references/incremental-output.md +16 -0
  344. package/skills/engineering/review-pr/references/inputs-and-discovery.md +31 -0
  345. package/skills/engineering/review-pr/references/output-format.md +99 -0
  346. package/skills/engineering/review-pr/references/over-mock-screen.md +7 -0
  347. package/skills/engineering/review-pr/references/promotion-prs.md +16 -0
  348. package/skills/engineering/review-pr/references/re-review.md +18 -0
  349. package/skills/engineering/review-pr/references/review-method.md +199 -0
  350. package/skills/engineering/review-pr/references/review-mode.md +30 -0
  351. package/skills/engineering/review-pr/references/review-posture.md +53 -0
  352. package/skills/engineering/review-pr/references/round1-depth.md +62 -0
  353. package/skills/engineering/review-pr/references/scripts.md +17 -0
  354. package/skills/engineering/review-pr/references/workflow.md +16 -0
  355. package/skills/engineering/review-pr/schemas/findings.schema.json +282 -0
  356. package/skills/engineering/review-pr/scripts/finding-contract.mjs +285 -0
  357. package/skills/engineering/review-pr/scripts/post-review.mjs +405 -0
  358. package/skills/engineering/review-pr/scripts/pr-context.mjs +207 -0
  359. package/skills/engineering/review-pr/scripts/scan-diff.mjs +365 -0
  360. package/skills/engineering/review-pr/scripts/theme-contract.mjs +57 -0
  361. package/skills/engineering/smoke/LICENSE +3 -0
  362. package/skills/engineering/smoke/SKILL.md +131 -0
  363. package/skills/engineering/smoke/assets/smoke.manifest.example.json +53 -0
  364. package/skills/engineering/smoke/references/manifest.md +192 -0
  365. package/skills/engineering/smoke/scripts/smoke.mjs +713 -0
  366. package/skills/fullstack/better-auth/LICENSE +3 -0
  367. package/skills/fullstack/better-auth/SKILL.md +601 -0
  368. package/skills/fullstack/better-auth/references/feishu-api.md +270 -0
  369. package/skills/fullstack/monorepo/LICENSE +3 -0
  370. package/skills/fullstack/monorepo/SKILL.md +465 -0
  371. package/skills/fullstack/nextjs-fullstack/LICENSE +3 -0
  372. package/skills/fullstack/nextjs-fullstack/SKILL.md +210 -0
  373. package/skills/fullstack/nextjs-fullstack/conventions.md +318 -0
  374. package/skills/fullstack/nextjs-fullstack/frontend-conventions.md +61 -0
  375. package/skills/fullstack/nextjs-fullstack/nextjs16.md +287 -0
  376. package/skills/fullstack/nextjs-fullstack/server-actions.md +409 -0
  377. package/skills/fullstack/prisma-setup/LICENSE +3 -0
  378. package/skills/fullstack/prisma-setup/SKILL.md +180 -0
  379. package/skills/fullstack/prisma-setup/nextjs.md +258 -0
  380. package/skills/fullstack/prisma-setup/turborepo.md +301 -0
  381. package/skills/fullstack/shadcn/LICENSE +3 -0
  382. package/skills/fullstack/shadcn/SKILL.md +119 -0
  383. package/skills/fullstack/shadcn/assets/shadcn-small.png +0 -0
  384. package/skills/fullstack/shadcn/assets/shadcn.png +0 -0
  385. package/skills/fullstack/shadcn/cli.md +411 -0
  386. package/skills/fullstack/shadcn/customization.md +224 -0
  387. package/skills/fullstack/shadcn/evals/evals.json +90 -0
  388. package/skills/fullstack/shadcn/mcp.md +101 -0
  389. package/skills/fullstack/shadcn/rules/base-vs-radix.md +323 -0
  390. package/skills/fullstack/shadcn/rules/component-selection.md +67 -0
  391. package/skills/fullstack/shadcn/rules/composition.md +195 -0
  392. package/skills/fullstack/shadcn/rules/data-table.md +201 -0
  393. package/skills/fullstack/shadcn/rules/forms.md +255 -0
  394. package/skills/fullstack/shadcn/rules/icons.md +103 -0
  395. package/skills/fullstack/shadcn/rules/styling.md +167 -0
  396. package/skills/fullstack/zod-v4/LICENSE +3 -0
  397. package/skills/fullstack/zod-v4/SKILL.md +287 -0
@@ -0,0 +1,192 @@
1
+ # The smoke manifest (curated E2E golden-path format)
2
+
3
+ The manifest is the curated set of flows whose failure means **do not ship**. It is the gate's input — keep it small, keep it ruthless.
4
+
5
+ ## You author this per app — there is no shared default set
6
+
7
+ **The manifest is repo-specific, and the skill ships none.** One app's golden paths are wrong for another: a payments app's are checkout → pay → receipt; a docs app's are create → edit → share; an auth product's are sign-in / SSO / signup. A generic "login + dashboard" set gives a false **ALIVE** on an app whose real do-not-ship flow is checkout — which is why the gate takes a manifest instead of hardcoding paths. Whoever knows the product authors it once, with the same judgment that picks `e2e-test`'s Tier-3 journeys, just filtered harder (see [What earns a slot](#what-earns-a-slot)). The [example manifest](../assets/smoke.manifest.example.json) is for one consumer auth product and exists to be **adapted and deleted, not kept** — copying its paths into a different app is the mistake this warns against.
8
+
9
+ ## There is no fixed number of paths
10
+
11
+ Don't anchor on a count. The right size is **"every flow whose failure alone would block a release, and no more"** — 2 paths or 8. The bar is the filter, not a number. If the set creeps toward dozens, you've stopped curating and started re-deriving `e2e-test`'s journey tier; pull the non-do-not-ship flows back out and let e2e-test cover them.
12
+
13
+ ## Where candidates come from (discover, then curate)
14
+
15
+ Curation splits in two: **discovering candidates** (automatable) and **deciding the final set** (a product/release call that stays human — a *guessed* manifest gives a false ALIVE). These sources feed discovery, strongest first; an agent drafts, a human promotes.
16
+
17
+ 1. **The `@smoke`-taggable Tier-3 journeys (`e2e-test`).** The best pool, because it's *already curated* — Tier-3 journeys are critical business flows someone judged worth an end-to-end test. Selecting the do-not-ship subset is filtering an existing set, not authoring a new one. For browser paths this is the source; the smoke path just references the journey.
18
+
19
+ 2. **State transitions of core entities (`domain-modeling`).** The most *principled* generator. A core entity's state machine enumerates the transitions the product exists to perform — `Order: cart → placed → paid → fulfilled → refunded`, `User: anonymous → registered → verified → active`, `Subscription: trialing → active → past_due → canceled`. Each **user-driven** transition is a candidate, and the transition hands you the observable for free: *"the entity is now in the target state, and the user can see it."* The transitions that touch money or irreversible state are almost exactly [what earns a slot](#what-earns-a-slot). Walk the two or three entities the product is *about*; skip transitions that are admin-only, automatic/background, or rare-recovery.
20
+
21
+ 3. **ADRs — a ranking signal, not a generator.** ADRs mostly record *build* decisions (a DB, a framework), which aren't journeys, so they don't *enumerate* golden paths. But an ADR pinning a load-bearing invariant ("all payments go through the idempotency ledger," "auth is Feishu SSO") is evidence *that* flow is do-not-ship. Use ADRs to **justify and rank** candidates the first two sources surfaced.
22
+
23
+ 4. **The generated surface inventory (`suggest`) — the crude fallback.** When there's no domain model or journey suite yet, scan routes/APIs mechanically. It's keyword-and-shape scoring (auth/payment-looking routes, mutation routes, health endpoints), blind to product meaning:
24
+ ```bash
25
+ node <smoke>/scripts/smoke.mjs suggest \
26
+ --inventory docs/tests/_generated/surface-inventory.json \
27
+ --out smoke.candidates.json
28
+ ```
29
+ The output uses a `candidates` array, not `paths`, so it is deliberately not runnable — promote by hand.
30
+
31
+ **Whatever the source, the promotion step is the same:** keep only candidates whose failure *alone* would block a release, write a synthetic `tenant` for any that mutate, and — for browser candidates — make sure the `@smoke` Tier-3 journey they reference exists (author it in `e2e-test` if not). None of these sources decide the set; they stop you starting from memory.
32
+
33
+ ## What earns a slot
34
+
35
+ A path belongs only if **its failure alone would block a release** — a much higher bar than "has a test." A few **shapes** recur; use them as prompts to find *your* paths, not a set to copy:
36
+
37
+ - **Get in** — the primary auth a user hits first (sign in; sign up + verify).
38
+ - **The core action** — the one or two things the product exists to do (its revenue / trust journey).
39
+ - **It's up** — a health / liveness baseline.
40
+ - anything touching money, irreversible state, or the thing that pages you at 3am.
41
+
42
+ The archetype is the question ("what's our *get in*?"); the answer is your app's own routes and observables. Everything else is `e2e-test`'s job (per-route tiers + the presentation sweep over the whole manifest). The smoke set is deliberately *not* a route census — a route that only needs "does it render" is covered by the presentation sweep, not here.
43
+
44
+ ## Format
45
+
46
+ JSON (`smoke.manifest.json`). A repo may author in YAML and project to JSON — the gate reads JSON, the same way `e2e-test`'s `route-manifest.json` is a generated projection.
47
+
48
+ ```json
49
+ {
50
+ "profiles": {
51
+ "pr-local": { "gate": "pull-request", "environment": "local", "endpoint": "local", "prerequisites": ["boot", "seed"], "evidencePolicy": "per-PR screens", "mutationPolicy": "isolated-writes" },
52
+ "prod-preview": { "gate": "pre-promotion", "environment": "prod", "endpoint": "preview", "prerequisites": ["candidate-revision"], "evidencePolicy": "attested identity tuple", "mutationPolicy": "read-only" }
53
+ },
54
+ "paths": [
55
+ {
56
+ "id": "login-to-dashboard",
57
+ "surface": "browser",
58
+ "journey": "@smoke login-to-dashboard",
59
+ "mutates": false,
60
+ "profiles": ["pr-local", "prod-preview"]
61
+ },
62
+ {
63
+ "id": "health",
64
+ "surface": "api",
65
+ "start": "GET /healthz",
66
+ "observable": "200 with body { status: \"ok\" }",
67
+ "mutates": false,
68
+ "profiles": ["pr-local", "prod-preview"]
69
+ }
70
+ ]
71
+ }
72
+ ```
73
+
74
+ ### Fields
75
+
76
+ | Field | Required | Meaning |
77
+ |---|---|---|
78
+ | `id` | yes | unique, stable slug — the drive step reports results keyed by it |
79
+ | `surface` | yes | `browser` \| `api` \| `cli` — picks the driver (see below) |
80
+ | `journey` | **browser only** | the `@smoke`-tagged e2e Tier-3 journey (by its `@covers` id) that **drives** this path. A browser path *references* the journey — it does not re-specify `start`/`observable`; the spec owns the steps and asserted observable. The flow is authored once, in e2e-test. |
81
+ | `start` | api/cli | where the path begins: a request (`api`, e.g. `GET /healthz`). `cli` uses `command` instead. Not used by `browser` (the journey owns it). |
82
+ | `command` | cli | the command to run, for `cli` paths (alternative to `start`) |
83
+ | `observable` | api/cli | the **concrete thing that proves the path worked** — the 200 body, the exit code. Required for `api`/`cli` (e2e-test doesn't cover them); for `browser` the referenced journey's assertions *are* the observable. |
84
+ | `intent` | no | optional one-line human summary of what the browser journey proves — documentation only, not enforced. |
85
+ | `mutates` | no | `true` if the path writes durable state. Forces a `tenant` and gates it out of read-only profiles. Under a **read-only profile** (any production profile), a tenant grants nothing: every `mutates:true` path is excluded regardless (`resolve-release` principle 4). |
86
+ | `tenant` | when `mutates` | a **synthetic/test tenant** id so the mutating path can run under a `synthetic-tenant` profile (e.g. `dev-active`) without touching real data. A `mutates:true` path with no `tenant` is excluded from a `synthetic-tenant` profile. This is **not** a production permit: the production database is real whether or not the revision serves traffic, so the read-only production profiles exclude the path either way. Name it with the **`e2e-` prefix** (`e2e-synthetic`) per the e2e-* account convention (`e2e-test` → `references/authoring/auth-flows.md`) — `validate` warns on an unprefixed tenant, because that's the one mistaken for live data. |
87
+ | `profiles` | **when a `profiles` registry exists** | the [Validation Profiles](#validation-profiles-the-profiles-registry) this path is required in — a non-empty array of names from the registry. A path is only ever selected in a profile it declares; a path that declares none is a silent non-runner, so `validate` **fails closed** on it once a registry is present. (A per-path array, rather than the inverse profile→paths mapping, so a path's selection facts — `mutates`, `tenant`, `profiles` — all sit together on the path they govern.) |
88
+
89
+ For `api`/`cli`, `observable` is the load-bearing field — what separates this gate from a vacuous one. "Renders" is too weak (the #237 button *rendered* — it was just invisible); write the perceivable, capturable fact: *"200 with body `{status:ok}`"*, *"exit 0 and the migration count printed."* For `browser`, that discipline lives in the journey spec's assertions — smoke selects the journey, doesn't restate it.
90
+
91
+ ## Validation Profiles (the `profiles` registry)
92
+
93
+ **Selection is by a named profile, not a caller-assembled target.** A run picks one Validation Profile (`--profile pr-local`), and that name decides both *which* paths run and *whether* writes are allowed — so the run and the verdict, driven by the same name, cannot disagree about the selected set. This replaces the free-form `--target`/`--no-mutations` pair, whose two independent assemblies could diverge and false-DEAD a healthy release (`resolve-release` #440). `--target` remains, but only as the **address** to drive against (a candidate/service URL); it no longer participates in selection.
94
+
95
+ A profile binds **three axes plus policy**:
96
+
97
+ | Key | Meaning | Values |
98
+ |---|---|---|
99
+ | `gate` | **why** evidence is required — the lifecycle moment | `pull-request` \| `merge-queue` \| `trunk-integration` \| `pre-promotion` \| `post-promotion` |
100
+ | `environment` | **where** the app runs | `local` \| `dev` \| `prod` |
101
+ | `endpoint` | **which** revision (a split that only exists once deployed) | `local` \| `preview` \| `active` |
102
+ | `prerequisites` | the set the profile requires in place before it can run | array of strings |
103
+ | `evidencePolicy` | what evidence the profile demands | string |
104
+ | `mutationPolicy` | whether (and how) writes are allowed — a property of the **profile**, not the invocation | `isolated-writes` \| `synthetic-tenant` \| `read-only` |
105
+
106
+ **`validate` fails closed on an invalid binding.** The gate pins exactly one valid `(environment, endpoint)` per `gate` — the PR/queue gates run `local`/`local`; `trunk-integration` runs `dev`/`active` (dev auto-deploys at 100% traffic); `pre-promotion` is the production candidate at 0% traffic, `prod`/`preview`; `post-promotion` is the live production service, `prod`/`active`. Any other pairing (e.g. `pull-request` in `prod`, or `pre-promotion` against `active`) is rejected. And **production is mechanically read-only**: a `prod` profile with any `mutationPolicy` other than `read-only` fails — that is principle 4 enforced by the profile, not by a `--no-mutations` flag the caller must remember. `isolated-writes` is local-only; `synthetic-tenant` is dev-only.
107
+
108
+ **How `mutationPolicy` selects a `mutates:true` path:**
109
+
110
+ - `read-only` (the production profiles) — **excluded, tenant or not.** The candidate/service is wired to the real production database; a synthetic tenant grants nothing, and a revision at 0% traffic is not a reason a write is safe.
111
+ - `synthetic-tenant` (`dev-active`) — runs **only if the path declares a synthetic `tenant`**; a tenant-less mutating path is excluded.
112
+ - `isolated-writes` (the local profiles) — runs (a disposable local store).
113
+
114
+ Read-only paths always run in any profile they declare.
115
+
116
+ ### The five initial profiles
117
+
118
+ | Name | gate | environment | endpoint | mutationPolicy |
119
+ |---|---|---|---|---|
120
+ | `pr-local` | `pull-request` | `local` | `local` | `isolated-writes` |
121
+ | `queue-local` | `merge-queue` | `local` | `local` | `isolated-writes` |
122
+ | `dev-active` | `trunk-integration` | `dev` | `active` | `synthetic-tenant` |
123
+ | `prod-preview` | `pre-promotion` | `prod` | `preview` | `read-only` |
124
+ | `prod-active` | `post-promotion` | `prod` | `active` | `read-only` |
125
+
126
+ `resolve-release` consumes `prod-preview` at step 4a (validate the candidate at 0% traffic) and `prod-active` at step 4b (re-validate the live service after the shift). Each smoke **path** declares the profiles it is required in (`"profiles": ["pr-local", "prod-preview"]`); a path selected by zero eligible paths under a profile yields the existing **EMPTY** verdict — a gate that proves nothing must not look like a pass.
127
+
128
+ **Recommended, not mandatory (for now).** A manifest with no `profiles` registry still `validate`s (legacy manifests don't break) but `validate` warns, and `plan`/`verdict --profile` cannot run against it. The moment a registry is present it is fully checked, and every path must declare its profiles.
129
+
130
+ **Reserved names are pinned to their gate.** The five shipped names are consumed by `resolve-release` (and the other lanes) by **hardcoded string** — step 4a drives `--profile prod-preview`, 4b drives `prod-active` — so the name is itself a safety key, not just a label. `validate` therefore **pins each reserved name to its gate**: `pr-local`→`pull-request`, `queue-local`→`merge-queue`, `dev-active`→`trunk-integration`, `prod-preview`→`pre-promotion`, `prod-active`→`post-promotion`. From the gate, the `(environment, endpoint)` table and the prod-read-only rule force the rest — so an entry *named* `prod-preview` but *bound* to a writable dev gate **fails closed**, instead of letting `plan --profile prod-preview` inherit a `synthetic-tenant` write policy against the production candidate.
131
+
132
+ | Hazard | Failure mode | What to prove |
133
+ |---|---|---|
134
+ | **prod-profile-name-drift** | A safety property keyed to a NAME (profile, tenant, env) consumed by another skill/lane, where the name→binding map is repo-authored data no validator pins — rename or rebind and the consumer silently inherits the wrong policy. | Validate the reserved names' bindings, or select by the semantic key (gate), never the label. |
135
+
136
+ ## The `setup` block (prerequisites — co-located with the gate)
137
+
138
+ A smoke run needs things in place *before* it can drive a path: how to boot, env/secrets, an auth-bypass, seed data, synthetic test tenants. These belong **in the manifest, next to the paths** — not in `AGENTS.md` or scattered prose. Co-locating means a run loads one file and sees the whole picture, and `validate` can *check* the prerequisites are declared instead of trusting prose that drifts.
139
+
140
+ Add an optional `setup` object above `paths`:
141
+
142
+ ```json
143
+ {
144
+ "setup": {
145
+ "boot": "use the run skill (else: pnpm --filter app dev)",
146
+ "env": ["DATABASE_URL", "AUTH_SECRET"],
147
+ "authBypass": "E2E_AUTH_BYPASS=1 (see e2e-test global-setup)",
148
+ "seed": "pnpm seed:smoke",
149
+ "fixtures": "reuse e2e-test's Playwright fixtures — do not recreate auth here",
150
+ "tenants": ["e2e-synthetic"]
151
+ },
152
+ "paths": [ ... ]
153
+ }
154
+ ```
155
+
156
+ | Field | Meaning |
157
+ |---|---|
158
+ | `boot` | how to start the app for a `local` run — a command, or `"use the run skill"`. The one field `validate` insists on when a `setup` block is present (a run that can't boot can't gate). |
159
+ | `env` | env vars / secrets that must be set to boot (names, not values). |
160
+ | `authBypass` | the mechanism for logging in without a real credential (e.g. an `E2E_AUTH_BYPASS` flag) — usually the same one `e2e-test` uses. |
161
+ | `seed` | a command that loads the data the golden paths assume. |
162
+ | `fixtures` | a **pointer** to where the browser fixtures live (the `e2e-test` Playwright harness). Point, don't recopy — duplicated auth setup is the thing that drifts. |
163
+ | `tenants` | the synthetic/test tenants the mutating paths use. Must cover every `tenant` a path declares, or `validate` warns the registry is incomplete. Entries carry the **`e2e-` prefix** (`validate` warns otherwise). |
164
+
165
+ **Reuse, don't restate.** Most of the auth/seed prerequisite already lives in `e2e-test`'s harness (global-setup, fixtures, `E2E_AUTH_BYPASS`) and the boot path in the `run` skill. The `setup` block should *reference* those and only spell out what's genuinely smoke-specific — the env, the tenants, the seed.
166
+
167
+ **Recommended, not mandatory.** A manifest with no `setup` block still validates (legacy manifests don't break), but `validate` warns, because then the prerequisites live nowhere checkable. A present block is shape-checked, and any path tenant the `tenants` registry omits is flagged. Keep a one-line pointer in `AGENTS.md` ("smoke prerequisites live in the manifest's `setup` block"); keep the details here.
168
+
169
+ ## Surface → driver
170
+
171
+ The manifest declares **what**; the drive step picks **how**, by surface:
172
+
173
+ - **`browser`** → **don't re-author the flow here — run the referenced `@smoke` Tier-3 journey** through `e2e-test`'s Playwright runner. The `journey` field points at that spec (by its `@covers` id); the spec owns the steps, assertions, and render-health checks (no `pageerror` / `console.error` / error-boundary / 5xx). Smoke adds only *selection* (this journey is do-not-ship), the *binary verdict*, and *target-safety* (`mutates`/`tenant`). The spec holds the real-render discipline: no first-party interception — stub only true external boundaries (a CDN SDK, a third-party provider endpoint), never the app's own routes or the component under test; reuse the repo's auth fixtures / `E2E_AUTH_BYPASS`. If the do-not-ship journey doesn't exist, author it in `e2e-test` and tag it `@smoke` — smoke selects, it doesn't create browser specs.
174
+
175
+ This reference is *checked*, not just asserted: `validate --journeys <specs-dir>` reconciles both directions — a browser path pointing at a journey that isn't `@smoke`-tagged fails (the gate couldn't drive it), and a spec tagged `@smoke` that no path references *also* fails (it would silently never run — a false ALIVE). Without `--journeys` the link is unenforced, so wire it into CI wherever the specs are available.
176
+ - **`api`** → send the request, capture the response, assert the `observable` (status + body shape). Read-only by default; a writing endpoint needs `mutates`/`tenant`.
177
+ - **`cli`** → run the `command`, capture the pane, assert the `observable` (output + exit code). Isolate shared state (`tmux -L`, a `mktemp -d` workdir).
178
+
179
+ ## Results contract
180
+
181
+ The drive step emits a JSON array the runner reduces into the verdict:
182
+
183
+ ```json
184
+ [
185
+ { "id": "login-to-dashboard", "status": "pass", "evidence": "screenshots/login.png" },
186
+ { "id": "feishu-qr-mount", "status": "fail", "note": "NotFoundError: removeChild on unmount when switching to password" }
187
+ ]
188
+ ```
189
+
190
+ `status` ∈ `pass` | `fail` | `blocked` | `cannot-run`. A path with no reported result is `missing`. **Only `pass` is alive** — `fail` means the candidate broke the path and makes the build **DEAD**; `blocked`, `cannot-run`, and `missing` mean the gate itself could not run and make the verdict **CANNOT-RUN** (issue #823), so a misconfigured secret/auth does not discard a healthy candidate. Carry `evidence` (a capturable artifact path) on pass and a `note` (what broke, or why the gate could not run) on the rest.
191
+
192
+ A consumer may also report the overall verdict as `CANNOT-RUN` or `BLOCKED` when the gate as a whole could not produce a result; `smoke.mjs` reduces path-level `cannot-run`/`blocked`/`missing` into that top-level verdict.