@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,451 @@
1
+ # Coverage gates — GitHub Actions template (satisfies ensure-coverage references/enforcement/ci-contract.md).
2
+ #
3
+ # Each gate is its own BLOCKING job, none standing in for another. Two of the three
4
+ # lanes live in this file (the release lane lives in resolve-release):
5
+ # PR lane (every PR, fast): inventory, accounting, render sweep, no-over-mock, the
6
+ # Review-Contract checklist validate, the quarantine auto-resurface gate, and the
7
+ # curated E2E SMOKE golden-path liveness gate (gate 8) — the minimal valuable floor.
8
+ # Integration/nightly lane (heavy, before release): the broad functional + journey E2E
9
+ # suite (gate 4), demoted OFF the per-PR critical path via `if:` below — it runs on
10
+ # the integration-branch push and nightly, and is verified green before release.
11
+ # Plus the meta-gate that runs ci-audit against this file so the gates can't be silently
12
+ # dropped, and the `all-gates` UMBRELLA job branch protection points at. Copy to
13
+ # .github/workflows/coverage-gates.yml and replace <…>. Verify it stays wired with
14
+ # ensure-coverage's CI audit (see references/enforcement/ci-contract.md).
15
+ #
16
+ # Conventions this template encodes (see e2e-test references/ci-playwright-container.md
17
+ # and references/ci-integration.md):
18
+ # 1. DOCKER-PREFERRED: every browser job runs in the official pinned Playwright
19
+ # container (browsers + OS deps ship in the image — nothing to install per job).
20
+ # The plain-runner alternative (`npx playwright install --with-deps chromium` on
21
+ # ubuntu-latest) is documented but NOT the default. Keep every image pin in this
22
+ # file IDENTICAL and matching the repo's @playwright/test version.
23
+ # 2. SHARED DEPENDENCY INSTALL: one pnpm store cache (same key + restore-keys) is
24
+ # shared by every job and every run — after the first warm run, jobs restore
25
+ # instead of downloading, and a lockfile bump restores the previous store and
26
+ # only fetches the delta. (On the very first run after a bump, parallel jobs
27
+ # each miss and download — one save wins; steady-state is shared.)
28
+ # 3. TIME BUDGET: PR-lane jobs carry `timeout-minutes: 5` — the per-PR floor targets
29
+ # ≤5 min wall clock. Only the demoted integration-lane suite gets a longer leash.
30
+ # 4. UMBRELLA: branch protection requires ONLY the `all-gates` job (see bottom) — a
31
+ # renamed/added gate can never silently fall out of protection.
32
+
33
+ name: Coverage Gates
34
+ on:
35
+ pull_request:
36
+ push:
37
+ branches: [integration] # the resolve-issues epic integration branch — runs the heavy E2E lane (REQUIRED before release)
38
+ # OPTIONAL extra cadence — uncomment to also run the broad suite nightly. Not required:
39
+ # the integration-branch push above is the gate that blocks release. Nightly only adds
40
+ # a time-based catch for drift between integration pushes.
41
+ # schedule:
42
+ # - cron: '0 3 * * *'
43
+
44
+ # ONE pinned image for every browser job — keep the tag identical everywhere in this
45
+ # file and aligned with the repo's @playwright/test version (mismatch → either a
46
+ # network `playwright install` per run, or protocol failures). Bump both together.
47
+ # (GitHub Actions can't interpolate workflow env into `container.image`, so the tag is
48
+ # repeated below — this comment is the single place that says which tag is canonical.)
49
+ # Canonical pin: mcr.microsoft.com/playwright:v1.61.0-noble
50
+
51
+ jobs:
52
+ # Static test-lint gates — fails if this PR ADDS a banned pattern to a test file:
53
+ # a skip/focus/xfail (no-skip), a fixed sleep (no-fixed-timeout), an empty test
54
+ # (no-empty-test), or a mock of a first-party internal seam (mock-internal-seam,
55
+ # default-on). Decidable, deterministic, ~zero false positives. Inherited diff-mode
56
+ # violations are left alone; a PR may not introduce a new one. Add rules in lint-tests.mjs.
57
+ lint-tests:
58
+ runs-on: ubuntu-latest
59
+ timeout-minutes: 5
60
+ steps:
61
+ - uses: actions/checkout@v4
62
+ with: { fetch-depth: 0 } # need the base commit for the diff
63
+ - uses: actions/setup-node@v4
64
+ with: { node-version: 20 }
65
+ - run: node <ensure-coverage>/scripts/lint-tests.mjs --diff "origin/${{ github.base_ref }}"
66
+ # Gate 5 — no over-mock (depth axis), WHOLE-TREE lane: inherited first-party-seam
67
+ # mocks block until removed (the --diff run above already covers newly-added ones).
68
+ # Zero-tolerance, no waiver; ci-audit looks for `mock-internal-seam` by name.
69
+ - run: node <ensure-coverage>/scripts/lint-tests.mjs --rules mock-internal-seam
70
+
71
+ # Gate 1 — inventory freshness (a new route can't be silently uncovered).
72
+ inventory-freshness:
73
+ runs-on: ubuntu-latest
74
+ timeout-minutes: 5
75
+ steps:
76
+ - uses: actions/checkout@v4
77
+ - uses: actions/setup-node@v4
78
+ with: { node-version: 20 }
79
+ - run: node scripts/gen-inventory.mjs # INVENTORY-CONTRACT adapter → surface-inventory.json
80
+ - run: node <e2e-test>/scripts/project-route-manifest.mjs --inventory docs/tests/_generated/surface-inventory.json --overlay e2e/route-manifest.overlay.json --out e2e/route-manifest.json
81
+ - run: git diff --exit-code docs/tests/_generated/surface-inventory.json e2e/route-manifest.json
82
+
83
+ # Gate 2 — accounting (ledger). Static; proves a qualifying test was AUTHORED.
84
+ coverage-accounting:
85
+ runs-on: ubuntu-latest
86
+ timeout-minutes: 5
87
+ steps:
88
+ - uses: actions/checkout@v4
89
+ - uses: actions/setup-node@v4
90
+ with: { node-version: 20 }
91
+ - run: node <ensure-coverage>/scripts/coverage-ledger.mjs validate # fails on Missing/Over-mocked/Unverified
92
+
93
+ # Gate 6 — Review-Contract checklist validate. Static; the anti-ritual guard that
94
+ # every PASS/FAIL checklist row carries an evidence locator (file:line / `command` /
95
+ # #issue) and no gate row is left TODO. Doctrine: ensure-coverage hooks.md (CI tier) —
96
+ # it runs at the implement-and-pr gate step AND here. Point --target at the committed
97
+ # Review-Contract checklist doc (or the file the PR body's checklist is extracted to).
98
+ coverage-checklist:
99
+ runs-on: ubuntu-latest
100
+ timeout-minutes: 5
101
+ steps:
102
+ - uses: actions/checkout@v4
103
+ - uses: actions/setup-node@v4
104
+ with: { node-version: 20 }
105
+ - run: node <ensure-coverage>/scripts/coverage-checklist.mjs validate <docs/tests/CONTRACT-CHECKLIST.md>
106
+
107
+ # Gate 6b — Review-Contract evidence-block freshness. The block is stamped with the
108
+ # HEAD it describes and `validate` fails when the stamp isn't that HEAD.
109
+ # `implement-and-pr` already tells the producer to run it, but that is an instruction
110
+ # to do something last, and a fix round is exactly when a later commit appears. CI
111
+ # runs on the push that broke the stamp, so it can't be outrun. (Named incident: five
112
+ # docs-only "record round N evidence" commits on one PR, each invalidated by the next,
113
+ # generating evidence-fidelity findings for three consecutive rounds.)
114
+ #
115
+ # The `ref` below is load-bearing: actions/checkout defaults to the PR merge ref, so
116
+ # HEAD would be a synthetic merge commit, not the PR head the block was stamped at —
117
+ # without it this gate red-lights every correct PR, and a gate that cries wolf gets
118
+ # switched off within a day.
119
+ evidence-block:
120
+ runs-on: ubuntu-latest
121
+ timeout-minutes: 5
122
+ steps:
123
+ - uses: actions/checkout@v4
124
+ with:
125
+ ref: ${{ github.event.pull_request.head.sha || github.sha }}
126
+ fetch-depth: 0 # the block's base..head derivations need real history
127
+ - uses: actions/setup-node@v4
128
+ with: { node-version: 20 }
129
+ # validate resolves the current head with `git rev-parse HEAD`, so the checkout
130
+ # ref above is what makes the stamp comparison correct — no flag needed.
131
+ # --source is what lets it also re-derive the production-diff-emptiness claim.
132
+ - run: node <ensure-coverage>/scripts/evidence-block.mjs validate <docs/tests/evidence.json> --source <src,app,packages>
133
+
134
+ # Gate 7 — quarantine auto-resurface. BLOCKING (distinct from the non-blocking
135
+ # quarantine *lane* below): fails once any `@quarantine(until=…)` / `until=` exit
136
+ # date is in the past, so a deferred suppression can't rot green into a permanent
137
+ # skip. ci-audit looks for `check-quarantine-expiry` by name.
138
+ quarantine-expiry:
139
+ runs-on: ubuntu-latest
140
+ timeout-minutes: 5
141
+ steps:
142
+ - uses: actions/checkout@v4
143
+ - uses: actions/setup-node@v4
144
+ with: { node-version: 20 }
145
+ - run: node <ensure-coverage>/scripts/check-quarantine-expiry.mjs # exit 1 on any expired dated exit
146
+
147
+ # Gate 3 — render sweep. SEPARATE job: browser + seeded DB. Catches the crashing
148
+ # route a green functional suite sails past. NOT the functional suite.
149
+ # Runs in the pinned Playwright container (docker-preferred): browsers ship in the
150
+ # image, so there is no per-job `playwright install`. Inside a job container,
151
+ # services are reached by service label (postgres:5432), NOT localhost.
152
+ presentation-sweep:
153
+ runs-on: ubuntu-latest
154
+ timeout-minutes: 5
155
+ container:
156
+ image: mcr.microsoft.com/playwright:v1.61.0-noble # keep identical to every other pin in this file
157
+ options: --ipc=host
158
+ services:
159
+ postgres: { image: postgres:16, env: { POSTGRES_PASSWORD: postgres } }
160
+ env: { E2E_AUTH_BYPASS: '1', DATABASE_URL: 'postgres://postgres:postgres@postgres:5432/test' }
161
+ steps:
162
+ - uses: actions/checkout@v4
163
+ # Shared pnpm store — SAME cache key + restore-keys as every other job, so
164
+ # steady-state runs restore instead of downloading (see header convention 2).
165
+ - uses: actions/cache@v4
166
+ with: { path: ~/.pnpm-store, key: 'pnpm-store-${{ hashFiles(''pnpm-lock.yaml'') }}', restore-keys: pnpm-store- }
167
+ - run: corepack enable && pnpm config set store-dir ~/.pnpm-store && pnpm install --frozen-lockfile
168
+ - run: <seed + migrate>
169
+ - run: <boot app on $BASE_URL> &
170
+ - run: |
171
+ node <e2e-test>/scripts/presentation-sweep.mjs \
172
+ --manifest e2e/route-manifest.json --base-url "${BASE_URL:-http://127.0.0.1:3000}" \
173
+ --fixtures e2e/sweep-fixtures.mjs --out docs/tests/_generated/presentation-results.json
174
+ # NEVER add `continue-on-error: true` here — that turns the gate into theatre.
175
+
176
+ # Gate 8 — curated E2E smoke (golden-path liveness). PR-LANE FLOOR, blocking.
177
+ # Boots the REAL app and drives only the handful of do-not-ship journeys
178
+ # (sign in → core action → pay), writes smoke-results.json, then reduces those
179
+ # observations through smoke.mjs verdict. Any fail/blocked/missing path reds the
180
+ # build. This — NOT the broad functional suite below — is the per-PR liveness
181
+ # gate. It catches the integrated, render-time bug a green unit/functional suite
182
+ # sails past (#237: an invisible primary button, a crash on mount).
183
+ # ci-audit looks for `smoke … verdict` by name.
184
+ #
185
+ # PARALLEL BY DEFAULT: the golden paths run concurrently inside this job
186
+ # (E2E_WORKERS > 1 + fullyParallel — each @smoke journey is an independent spec),
187
+ # so wall clock ≈ the slowest single path, not the sum. If the curated set still
188
+ # can't fit the 5-minute budget in one job, fan the paths out across a matrix —
189
+ # see the commented `smoke-drive` variant below this job.
190
+ smoke:
191
+ runs-on: ubuntu-latest
192
+ timeout-minutes: 5
193
+ container:
194
+ image: mcr.microsoft.com/playwright:v1.61.0-noble # keep identical to every other pin in this file
195
+ options: --ipc=host
196
+ services:
197
+ postgres: { image: postgres:16, env: { POSTGRES_PASSWORD: postgres } }
198
+ env: { E2E_AUTH_BYPASS: '1', E2E_WORKERS: '4', DATABASE_URL: 'postgres://postgres:postgres@postgres:5432/test' }
199
+ steps:
200
+ - uses: actions/checkout@v4
201
+ - uses: actions/cache@v4
202
+ with: { path: ~/.pnpm-store, key: 'pnpm-store-${{ hashFiles(''pnpm-lock.yaml'') }}', restore-keys: pnpm-store- }
203
+ - run: corepack enable && pnpm config set store-dir ~/.pnpm-store && pnpm install --frozen-lockfile
204
+ - run: <seed + migrate>
205
+ - run: <boot app on $BASE_URL> &
206
+ # Validate + reconcile BEFORE gating: shape-checks the manifest and, via
207
+ # --journeys, verifies every browser path references a real @smoke-tagged
208
+ # journey AND every @smoke journey is in the manifest — a drift either way
209
+ # (esp. an @smoke journey missing from the manifest, a silent false-ALIVE)
210
+ # reds the build here instead of passing vacuously.
211
+ - run: node <smoke>/scripts/smoke.mjs validate --manifest smoke.manifest.json --journeys <e2e-journeys-dir>
212
+ - run: node <smoke>/scripts/smoke.mjs plan --manifest smoke.manifest.json --target local --json > smoke-plan.json
213
+ - run: <drive smoke-plan.json through Playwright/API/CLI (browser paths run in parallel via E2E_WORKERS) and write smoke-results.json>
214
+ - run: node <smoke>/scripts/smoke.mjs verdict --manifest smoke.manifest.json --target local --results smoke-results.json --out smoke-verdict.json
215
+ # NEVER add `continue-on-error: true` here — that turns the liveness floor into theatre.
216
+
217
+ # ── OPTIONAL smoke fan-out (only when in-job parallelism can't hit the 5-min budget):
218
+ # split the plan into a matrix so each golden path (or shard) gets its own job, then
219
+ # merge the per-path results and compute ONE verdict. The verdict job stays the single
220
+ # blocking reduction — the umbrella needs `smoke-verdict`, not the shards.
221
+ #
222
+ # smoke-plan:
223
+ # runs-on: ubuntu-latest
224
+ # timeout-minutes: 5
225
+ # outputs: { paths: '${{ steps.plan.outputs.paths }}' }
226
+ # steps:
227
+ # - uses: actions/checkout@v4
228
+ # - uses: actions/setup-node@v4
229
+ # with: { node-version: 20 }
230
+ # - run: node <smoke>/scripts/smoke.mjs validate --manifest smoke.manifest.json --journeys <e2e-journeys-dir>
231
+ # - id: plan
232
+ # run: |
233
+ # node <smoke>/scripts/smoke.mjs plan --manifest smoke.manifest.json --target local --json > smoke-plan.json
234
+ # echo "paths=$(node -e 'console.log(JSON.stringify(JSON.parse(require("fs").readFileSync("smoke-plan.json","utf8")).run.map(p=>p.id)))')" >> "$GITHUB_OUTPUT"
235
+ # smoke-drive:
236
+ # needs: smoke-plan
237
+ # strategy: { fail-fast: false, matrix: { path: '${{ fromJSON(needs.smoke-plan.outputs.paths) }}' } }
238
+ # runs-on: ubuntu-latest
239
+ # timeout-minutes: 5
240
+ # container: { image: 'mcr.microsoft.com/playwright:v1.61.0-noble', options: '--ipc=host' }
241
+ # services:
242
+ # postgres: { image: postgres:16, env: { POSTGRES_PASSWORD: postgres } }
243
+ # env: { E2E_AUTH_BYPASS: '1', DATABASE_URL: 'postgres://postgres:postgres@postgres:5432/test' }
244
+ # steps:
245
+ # - uses: actions/checkout@v4
246
+ # - uses: actions/cache@v4
247
+ # with: { path: ~/.pnpm-store, key: 'pnpm-store-${{ hashFiles(''pnpm-lock.yaml'') }}', restore-keys: pnpm-store- }
248
+ # - run: corepack enable && pnpm config set store-dir ~/.pnpm-store && pnpm install --frozen-lockfile
249
+ # - run: <seed + migrate>
250
+ # - run: <boot app on $BASE_URL> &
251
+ # - run: <drive ONLY path "${{ matrix.path }}" and write smoke-results-${{ matrix.path }}.json>
252
+ # - uses: actions/upload-artifact@v4
253
+ # with: { name: 'smoke-results-${{ matrix.path }}', path: 'smoke-results-*.json' }
254
+ # smoke-verdict:
255
+ # needs: smoke-drive
256
+ # if: always() # a failed shard must still reach the verdict (→ DEAD), not vanish
257
+ # runs-on: ubuntu-latest
258
+ # timeout-minutes: 5
259
+ # steps:
260
+ # - uses: actions/checkout@v4
261
+ # - uses: actions/setup-node@v4
262
+ # with: { node-version: 20 }
263
+ # - uses: actions/download-artifact@v4
264
+ # with: { pattern: 'smoke-results-*', merge-multiple: true }
265
+ # - run: node -e 'const fs=require("fs");const all=fs.readdirSync(".").filter(f=>/^smoke-results-.*\.json$/.test(f)).flatMap(f=>JSON.parse(fs.readFileSync(f,"utf8")));fs.writeFileSync("smoke-results.json",JSON.stringify(all,null,2))'
266
+ # - run: node <smoke>/scripts/smoke.mjs verdict --manifest smoke.manifest.json --target local --results smoke-results.json --out smoke-verdict.json
267
+
268
+ # Gate 4 — broad functional + journey suite (distinct from gate 3 and gate 8).
269
+ # HEAVY/INTEGRATION LANE, blocking — but DEMOTED off the per-PR critical path: the
270
+ # `if:` runs it only on the integration-branch push and the nightly schedule, never
271
+ # on a PR. The per-PR floor is the curated E2E smoke gate above; the full behavioral
272
+ # suite (every form, error path, edge case) is verified before release, not on every
273
+ # PR. A journey-only regression is caught here, at integration — the accepted cost of
274
+ # the demotion. Excludes @quarantine-tagged tests, which run in the non-blocking lane.
275
+ e2e:
276
+ if: github.event_name != 'pull_request'
277
+ runs-on: ubuntu-latest
278
+ timeout-minutes: 30 # integration lane — the one lane allowed past the 5-min PR budget
279
+ container:
280
+ image: mcr.microsoft.com/playwright:v1.61.0-noble # keep identical to every other pin in this file
281
+ options: --ipc=host
282
+ services:
283
+ postgres: { image: postgres:16, env: { POSTGRES_PASSWORD: postgres } }
284
+ env: { E2E_AUTH_BYPASS: '1', E2E_WORKERS: '4', DATABASE_URL: 'postgres://postgres:postgres@postgres:5432/test' }
285
+ steps:
286
+ - uses: actions/checkout@v4
287
+ - uses: actions/cache@v4
288
+ with: { path: ~/.pnpm-store, key: 'pnpm-store-${{ hashFiles(''pnpm-lock.yaml'') }}', restore-keys: pnpm-store- }
289
+ - run: corepack enable && pnpm config set store-dir ~/.pnpm-store && pnpm install --frozen-lockfile
290
+ - run: <seed + migrate>
291
+ - run: pnpm playwright test --grep-invert "@quarantine"
292
+
293
+ # Quarantine lane — the ONLY sanctioned non-blocking path (tests are never skipped).
294
+ # Un-sandboxable externals or a genuine flake under active fix go HERE: the test
295
+ # still RUNS and REPORTS, it just doesn't block. Keep the surface graded `Unverified`
296
+ # in the ledger (never `verified: true`), with a dated exit. run+report ≠ stop running.
297
+ # Deliberately NOT in the all-gates umbrella below.
298
+ quarantine:
299
+ runs-on: ubuntu-latest
300
+ timeout-minutes: 10
301
+ continue-on-error: true # the whole point — must never hard-block a PR
302
+ container:
303
+ image: mcr.microsoft.com/playwright:v1.61.0-noble # keep identical to every other pin in this file
304
+ options: --ipc=host
305
+ services:
306
+ postgres: { image: postgres:16, env: { POSTGRES_PASSWORD: postgres } }
307
+ env: { E2E_AUTH_BYPASS: '1', DATABASE_URL: 'postgres://postgres:postgres@postgres:5432/test' }
308
+ steps:
309
+ - uses: actions/checkout@v4
310
+ - uses: actions/cache@v4
311
+ with: { path: ~/.pnpm-store, key: 'pnpm-store-${{ hashFiles(''pnpm-lock.yaml'') }}', restore-keys: pnpm-store- }
312
+ - run: corepack enable && pnpm config set store-dir ~/.pnpm-store && pnpm install --frozen-lockfile
313
+ - run: <seed + migrate>
314
+ - run: pnpm playwright test --grep "@quarantine" --pass-with-no-tests # provider test keys via secrets, never live keys; green when nothing is quarantined
315
+ # On failure: post a PR annotation and keep the surface `Unverified` — surfaced + tracked, not a green skip.
316
+
317
+ # Visual regression GATE (presentation:visual) — OPT-IN, BLOCKING when present.
318
+ # Runs ONLY in the pinned Playwright container so baselines (minted by the regen job
319
+ # below) and this comparison share one rendering environment — a baseline minted on
320
+ # another OS reds on every glyph's anti-aliasing, which is how visual gates get
321
+ # disabled. Compares the rendered page against the COMMITTED baselines; it never
322
+ # writes them. Uploads the 3-up diff as an artifact on failure. Only needed when a
323
+ # surface declares `requiredLevels: [presentation:visual]`; harmless (no specs) if none.
324
+ visual-gate:
325
+ runs-on: ubuntu-latest
326
+ timeout-minutes: 10
327
+ container:
328
+ image: mcr.microsoft.com/playwright:v1.61.0-noble # keep identical to every other pin in this file — and to visual-baseline-regen
329
+ options: --ipc=host
330
+ services:
331
+ postgres: { image: postgres:16, env: { POSTGRES_PASSWORD: postgres } }
332
+ env: { E2E_AUTH_BYPASS: '1', DATABASE_URL: 'postgres://postgres:postgres@postgres:5432/test' }
333
+ steps:
334
+ - uses: actions/checkout@v4
335
+ - uses: actions/cache@v4
336
+ with: { path: ~/.pnpm-store, key: 'pnpm-store-${{ hashFiles(''pnpm-lock.yaml'') }}', restore-keys: pnpm-store- }
337
+ - run: corepack enable && pnpm config set store-dir ~/.pnpm-store && pnpm install --frozen-lockfile
338
+ - run: <seed + migrate>
339
+ - run: <boot app on $BASE_URL> &
340
+ # --pass-with-no-tests: a repo with no @visual specs must stay green — without it,
341
+ # Playwright exits 1 on "no tests found" and the all-gates umbrella bricks every PR.
342
+ - run: pnpm playwright test --grep "@visual" --pass-with-no-tests # toHaveScreenshot specs; fails on drift from committed baselines
343
+ # NEVER add `continue-on-error: true` here — that turns the gate into theatre.
344
+ - if: failure()
345
+ uses: actions/upload-artifact@v4
346
+ with: { name: visual-diff, path: 'test-results/**/*-diff.png', retention-days: 30 }
347
+
348
+ # Visual BASELINE-REGEN — ON-DEMAND only (PR label `update-visual-baselines`), the
349
+ # ONLY sanctioned writer of baselines. Same pinned image as the gate. Regenerates
350
+ # the PNGs, commits them back to the PR branch (a baseline change is reviewable
351
+ # evidence tied to a declared intended UI change — never a silent --update to green),
352
+ # then posts the durable baseline link + ephemeral diff URL to the issue AND PR and
353
+ # RETURNS both as a value (`--evidence-out`, plus stdout) for the resolve-issues
354
+ # orchestrator to record on the unit. This job never writes the run manifest itself —
355
+ # the orchestrator is its only writer (ADR 0001 decision 5). Never blocks; it's an
356
+ # explicit human/agent action.
357
+ visual-baseline-regen:
358
+ if: contains(github.event.pull_request.labels.*.name, 'update-visual-baselines')
359
+ runs-on: ubuntu-latest
360
+ timeout-minutes: 15
361
+ container:
362
+ image: mcr.microsoft.com/playwright:v1.61.0-noble # MUST match visual-gate's image (and every other pin in this file)
363
+ options: --ipc=host
364
+ permissions: { contents: write, issues: write, pull-requests: write }
365
+ services:
366
+ postgres: { image: postgres:16, env: { POSTGRES_PASSWORD: postgres } }
367
+ env: { E2E_AUTH_BYPASS: '1', DATABASE_URL: 'postgres://postgres:postgres@postgres:5432/test', GH_TOKEN: '${{ github.token }}' }
368
+ steps:
369
+ - uses: actions/checkout@v4
370
+ with: { ref: '${{ github.head_ref }}' }
371
+ - uses: actions/cache@v4
372
+ with: { path: ~/.pnpm-store, key: 'pnpm-store-${{ hashFiles(''pnpm-lock.yaml'') }}', restore-keys: pnpm-store- }
373
+ - run: corepack enable && pnpm config set store-dir ~/.pnpm-store && pnpm install --frozen-lockfile
374
+ - run: <seed + migrate>
375
+ - run: <boot app on $BASE_URL> &
376
+ - run: pnpm playwright test --grep "@visual" --update-snapshots
377
+ - run: |
378
+ git config user.name "github-actions[bot]"
379
+ git config user.email "github-actions[bot]@users.noreply.github.com"
380
+ git add '**/*-snapshots/**'
381
+ git diff --staged --quiet || git commit -m "chore(visual): regenerate baselines"
382
+ git push
383
+ - id: artifact
384
+ if: always()
385
+ uses: actions/upload-artifact@v4
386
+ with: { name: visual-preview, path: 'test-results/**', retention-days: 30 }
387
+ - run: |
388
+ node <e2e-test>/scripts/post-visual-evidence.mjs \
389
+ --unit "${{ github.event.pull_request.number }}" \
390
+ --repo "${{ github.repository }}" --sha "$(git rev-parse HEAD)" \
391
+ --issue "<linked issue #>" --pr "${{ github.event.pull_request.number }}" \
392
+ --diff-artifact "${{ steps.artifact.outputs.artifact-url }}" \
393
+ --results docs/tests/_generated/presentation-results.json \
394
+ --evidence-out visual-evidence.json
395
+ # The evidence is a RETURNED value, never a manifest write — resolve-issues'
396
+ # orchestrator records it (ADR 0001 decision 5). Upload it so the run can read it.
397
+ - if: always()
398
+ uses: actions/upload-artifact@v4
399
+ with: { name: visual-evidence, path: visual-evidence.json, retention-days: 30 }
400
+
401
+ # Meta-gate (bootstrap) — run ci-audit against THIS workflow so the gates above
402
+ # can't be silently deleted or weakened later. Without this job, nothing guards the
403
+ # gates; ci-audit's own META_GATE is exactly "is ci-audit run by CI?". Keep the
404
+ # --files list in sync with the gate files you actually ship.
405
+ gate-audit:
406
+ runs-on: ubuntu-latest
407
+ timeout-minutes: 5
408
+ steps:
409
+ - uses: actions/checkout@v4
410
+ - uses: actions/setup-node@v4
411
+ with: { node-version: 20 }
412
+ - run: node <ensure-coverage>/scripts/ci-audit.mjs --files .github/workflows/coverage-gates.yml
413
+
414
+ # UMBRELLA — the ONE status check branch protection requires. Protect the branch
415
+ # with only `all-gates`: every blocking gate is in `needs`, so adding or renaming a
416
+ # gate job (and adding it here) can never silently fall out of protection, and a
417
+ # protection config listing eight job names by hand is never needed. `skipped` is
418
+ # deliberately allowed (gate 4 is PR-skipped by design; a conditional job that
419
+ # branch protection required directly would otherwise pass vacuously — here the
420
+ # umbrella still fails on any failure/cancellation of what DID run).
421
+ # The quarantine lane is deliberately absent from `needs` — it is non-blocking.
422
+ all-gates:
423
+ if: always()
424
+ needs:
425
+ - lint-tests
426
+ - inventory-freshness
427
+ - coverage-accounting
428
+ - coverage-checklist
429
+ - evidence-block
430
+ - quarantine-expiry
431
+ - presentation-sweep
432
+ - smoke
433
+ - e2e
434
+ - visual-gate
435
+ - gate-audit
436
+ runs-on: ubuntu-latest
437
+ timeout-minutes: 5
438
+ steps:
439
+ # The check is an expression on needs.*.result — immune to a job OUTPUT that
440
+ # happens to contain the string "result": "failure" (toJSON(needs) includes
441
+ # outputs, so grepping it can false-fail).
442
+ - name: Fail if any required gate failed or was cancelled
443
+ if: contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')
444
+ env:
445
+ RESULTS: ${{ toJSON(needs) }}
446
+ run: |
447
+ echo "$RESULTS"
448
+ echo 'A required gate failed or was cancelled.'
449
+ exit 1
450
+ - name: All gates green
451
+ run: echo "All required gates passed (or were skipped by design)."