@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,219 @@
1
+ # Playwright Patterns
2
+
3
+ ## Locators
4
+
5
+ ```typescript
6
+ // Prefer semantic locators
7
+ page.getByRole('button', { name: 'Submit' })
8
+ page.getByLabel('Email')
9
+ page.getByText(/success/i)
10
+
11
+ // Avoid CSS selectors
12
+ page.locator('.btn-primary.text-red-500') // breaks on style changes
13
+ ```
14
+
15
+ ## Waiting
16
+
17
+ ```typescript
18
+ // Wait for real state
19
+ await page.getByRole('button', { name: 'Save' }).click();
20
+ await expect(page.getByText('Saved')).toBeVisible();
21
+
22
+ // No fixed sleeps
23
+ await page.waitForTimeout(3000); // flaky
24
+ ```
25
+
26
+ ## Assertions
27
+
28
+ ```typescript
29
+ // Assert on behavior
30
+ await expect(page.getByText(/invalid.*range/i)).toBeVisible();
31
+
32
+ // Don't assert CSS classes
33
+ await expect(page.locator('.text-red-500')).toBeVisible(); // implementation detail
34
+ ```
35
+
36
+ ## No Skips — Seed, Route, or Quarantine
37
+
38
+ The committed suite contains only tests that run. **Never** disable a test to get past a missing precondition or a failure — seed the state instead (full policy + per-case solutions map: [test-skipping.md](test-skipping.md)).
39
+
40
+ ```typescript
41
+ // ✗ All of these are banned — they remove the signal and read as "handled":
42
+ test.skip(); // naked
43
+ test.skip(true, 'issue #123'); // annotated, still a skip
44
+ if (!user) test.skip(); // conditional skip
45
+ if (!order) return; // disguised skip — WORST: reports PASSED, asserts nothing
46
+
47
+ // ✓ Seed the precondition, then assert against the real path.
48
+ const user = await factory.user({ role: 'admin' });
49
+ const order = await factory.order({ userId: user.id, status: 'pending' });
50
+ await login(page, user);
51
+ await page.goto(`/orders/${order.id}`);
52
+ // …assertions on the real, seeded path
53
+
54
+ // ✓ Only-valid-on-one-target → ROUTE via project config, don't skip in the body:
55
+ // playwright.config.ts → projects: [{ name: 'webkit', use: devices['Desktop Safari'] }]
56
+ // the test simply isn't *selected* off-target; it is never disabled.
57
+
58
+ // ✓ Un-sandboxable external / genuine flake → QUARANTINE lane (non-blocking job that
59
+ // still runs + reports; surface graded `Unverified`), never test.skip(). See ci-integration.md.
60
+ ```
61
+
62
+ ## Tier Examples
63
+
64
+ ### Tier 1 — Render-health
65
+
66
+ One test per route: navigate, verify no crash.
67
+
68
+ ```typescript
69
+ test.describe('Render-health: all routes load', () => {
70
+ for (const route of ['/', '/login', '/dashboard', '/settings']) {
71
+ test(`${route} loads`, async ({ page }) => {
72
+ const errors: string[] = [];
73
+ page.on('pageerror', (err) => errors.push(err.message));
74
+ await page.goto(route);
75
+ await expect(page.locator('body')).toBeVisible();
76
+ expect(errors).toEqual([]);
77
+ });
78
+ }
79
+ });
80
+ ```
81
+
82
+ ### Tier 2 — Functional
83
+
84
+ Cover success + failure + edge cases per feature.
85
+
86
+ ```typescript
87
+ test.describe('Date Range Filter', () => {
88
+ test('applies range and updates data', async ({ page }) => {
89
+ await page.goto('/dashboard');
90
+ await page.getByLabel('From').fill('2026-01-01');
91
+ await page.getByRole('button', { name: 'Apply' }).click();
92
+ await expect(page.getByTestId('data-table')).toBeVisible();
93
+ });
94
+
95
+ test('shows error for invalid range', async ({ page }) => {
96
+ await page.goto('/dashboard');
97
+ await page.getByLabel('From').fill('2026-12-31');
98
+ await page.getByLabel('To').fill('2026-01-01');
99
+ await page.getByRole('button', { name: 'Apply' }).click();
100
+ await expect(page.getByText(/invalid.*range/i)).toBeVisible();
101
+ });
102
+ });
103
+ ```
104
+
105
+ ### Tier 3 — Journey (golden paths)
106
+
107
+ Multi-step flow, real API calls. Mock only external third-party APIs. These are the golden paths; the do-not-ship subset is tagged `@smoke` for the smoke gate.
108
+
109
+ ```typescript
110
+ test('login then view dashboard then filter', async ({ page }) => {
111
+ await page.goto('/login');
112
+ await page.getByLabel('Token').fill(process.env.E2E_TOKEN!);
113
+ await page.getByRole('button', { name: 'Login' }).click();
114
+ await expect(page.getByRole('heading', { name: /dashboard/i })).toBeVisible();
115
+ await page.getByRole('button', { name: '7d' }).click();
116
+ const resp = await page.waitForResponse('**/api/data*');
117
+ expect(resp.status()).toBe(200);
118
+ });
119
+ ```
120
+
121
+ ## Route Mocking (Tier 2 only)
122
+
123
+ ```typescript
124
+ await page.route('**/api/data*', (route) => {
125
+ void route.fulfill({ status: 500, contentType: 'application/json',
126
+ body: JSON.stringify({ error: 'SERVER_ERROR', message: 'boom' }) });
127
+ });
128
+ await page.goto('/dashboard');
129
+ await expect(page.getByText(/failed to fetch/i)).toBeVisible();
130
+ ```
131
+
132
+ ## Presentation checks (ensure-coverage's Presentation axis)
133
+
134
+ A functional journey proves the page *works*; it does not prove a human can *see and use* it. The Presentation axis adds per-route render checks against the real page. The spine ships the **Spatial / overflow** invariant via `scripts/presentation-checks.mjs`. Tag the spec so the Coverage Ledger resolves it to the route's `presentation:spatial` obligation.
135
+
136
+ ```typescript
137
+ // @covers /dashboard
138
+ // @level browser-journey
139
+ // @level presentation:spatial
140
+ import { test, expect } from '@playwright/test';
141
+ import { assertNoHorizontalOverflow } from '../scripts/presentation-checks.mjs';
142
+
143
+ test('dashboard renders and has no horizontal overflow', async ({ page }) => {
144
+ await page.goto('/dashboard');
145
+ await expect(page.getByRole('heading', { name: /dashboard/i })).toBeVisible(); // journey
146
+ await assertNoHorizontalOverflow(page); // presentation:spatial, at 375 + 1280
147
+ });
148
+ ```
149
+
150
+ - It drives a **real browser** at both floor viewports (375, 1280). A DOM-only / JSDOM equivalent is graded `Over-mocked` by the ledger — it cannot see layout.
151
+ - Suppress *intentional* overflow (a scrolling carousel) with `assertNoHorizontalOverflow(page, { ignore: ['carousel'] })` — curate sparingly; the gated-allowlist seam later slices formalize.
152
+ - `presentation:spatial` is a **separate** obligation from `browser-journey` — a journey alone does not satisfy it.
153
+ - It also covers **overlap** via `assertNoOverlap(page)` (bounding-box intersection). Intentional z-stacks use a *gated* allowlist — `assertNoOverlap(page, { allowlist: [{ match: 'carousel', category: 'decorative', reason: 'z-stacked slides' }] })` — which returns a census of suppressions; an entry that would hide an overlap occluding an interactive control is rejected.
154
+
155
+ `presentation:perceivability` (contrast / invisible controls) uses `scripts/presentation-perceivability.mjs`:
156
+
157
+ ```typescript
158
+ // @covers /dashboard
159
+ // @level presentation:perceivability
160
+ import { assertContrast, assertHiddenFromWrongRole } from '../scripts/presentation-perceivability.mjs';
161
+
162
+ test('dashboard is perceivable', async ({ page }) => {
163
+ await page.goto('/dashboard');
164
+ await assertContrast(page); // axe color-contrast; throws on violation
165
+ // negative form: an admin-only control must not be visible to a non-admin
166
+ await assertHiddenFromWrongRole(page, page.getByRole('button', { name: 'Delete org' }));
167
+ });
168
+ ```
169
+
170
+ - On an axe **abstain** (`incomplete` — text over an image/gradient) `assertContrast` throws `AbstainError`: a **blocking Unverified**, resolved by reviewer attestation or escalation, never a silent pass.
171
+ - Disabled controls are skipped (WCAG-exempt), not false-flagged.
172
+
173
+ `presentation:reachability` (nav-orphan + affordance) uses `scripts/presentation-reachability.mjs`. This is **navigational** reachability (can a user click here from an entry point), distinct from guard-chain reachability:
174
+
175
+ ```typescript
176
+ import { assertNoNavOrphans, assertTargetSizes, assertFocusVisible } from '../scripts/presentation-reachability.mjs';
177
+
178
+ // once per app: every manifest route must be reachable by crawling nav from '/'
179
+ test('no navigational orphans', async ({ page }) => {
180
+ await assertNoNavOrphans(page, manifestRoutes, { ignore: ['/auth/callback', '/deep/*'] });
181
+ });
182
+
183
+ // @covers /dashboard
184
+ // @level presentation:reachability
185
+ test('dashboard controls are actionable', async ({ page }) => {
186
+ await page.goto('/dashboard');
187
+ await assertTargetSizes(page); // >=44px targets
188
+ await assertFocusVisible(page, page.getByRole('button', { name: 'Save' })); // focus ring present
189
+ });
190
+ ```
191
+
192
+ `presentation:temporal` (layout shift) uses `scripts/presentation-temporal.mjs`. First-party shift is a hermetic gate; third-party payfields runs in a non-blocking lane:
193
+
194
+ ```typescript
195
+ import { assertNoFirstPartyShift, assertNoThirdPartyShift, assertNoDynamicViewportShift } from '../scripts/presentation-temporal.mjs';
196
+
197
+ // @covers /dashboard
198
+ // @level presentation:temporal
199
+ test('dashboard layout holds still', async ({ page }) => {
200
+ await page.goto('/dashboard');
201
+ await assertNoFirstPartyShift(page, { // hermetic: no network
202
+ trigger: () => page.getByRole('button', { name: 'Load more' }).click(),
203
+ settle: page.getByTestId('row-50'), // stable condition, NOT a sleep
204
+ });
205
+ await assertNoDynamicViewportShift(page); // 100vh/dvh on mobile
206
+ });
207
+
208
+ // SEPARATE non-blocking lane (continue-on-error) — provider SANDBOX iframe:
209
+ test('@checkout payfields do not shift layout', async ({ page }) => {
210
+ await page.goto('/checkout');
211
+ await assertNoThirdPartyShift(page, {
212
+ container: 'stripe',
213
+ ready: page.frameLocator('iframe[name^="__privateStripeFrame"]').getByLabel('Card number'),
214
+ });
215
+ });
216
+ ```
217
+
218
+ - Top-page CLS can't see inside the cross-origin payment iframe — that's why the third-party check is before/after geometry gated on a provider-ready locator, not a `PerformanceObserver`.
219
+ - A third-party-lane failure is annotated and the surface stays `Unverified` until attested; it never hard-blocks the PR.
@@ -0,0 +1,44 @@
1
+ # No-Skip Policy
2
+
3
+ The committed suite contains **only tests that run and assert**. A test is never disabled to get past a missing precondition or a failure — not with `test.skip()`, not `describe.skip` / `xit` / `it.skip`, not a conditional/dynamic skip, and not a *disguised* skip (`if (!data) return` or any guard that turns the body into a no-op). **The agent has no discretion to skip** — every situation has a non-skip answer (the map below).
4
+
5
+ Disabling a test removes the signal while leaving a green-looking entry that reads as "handled" — the most dangerous false coverage. It doesn't even clear the gate: the ledger grades a disabled or guarded test **not-covered** and the sweep reports **blocked**, never `pass`. Disabling-to-green fails CI *and* lies to the reader.
6
+
7
+ **Why no allow-list.** "Skip when it's outside your control" is the exact rationalization that shipped false coverage — an agent reclassifies *"I didn't seed the data"* as *"environment blocker."* Removing the category removes the loophole. Every honest "I have to skip" case keeps either the **signal** (run it — blocking, or quarantined non-blocking) or an honest **`Unverified`** status.
8
+
9
+ ## The solutions map (every case → a non-skip path)
10
+
11
+ | Situation | Don't skip — instead |
12
+ |---|---|
13
+ | Missing data / row / tenant | **Seed it** — factory / seed script / SQL / API call that creates exactly what the assertion needs. |
14
+ | No authenticated session | **Seed auth** — the shared auth fixture or `E2E_AUTH_BYPASS`. |
15
+ | Schema not migrated | **Migrate** before the suite. |
16
+ | Feature flag off / wrong config | **Set it** in the test's setup or env. |
17
+ | Dynamic-route id needed (`/orders/[id]`) | **Seed the entity, use its id** (the sweep's `paramResolver` pattern). |
18
+ | A specific entity *state* (e.g. a `payment_live` merchant) | **Seed that state** — it's a column/enum value; create a row that has it. |
19
+ | Depends on a third-party service | **Sandbox at the boundary** — provider sandbox + test keys; fake only the external adapter (real internals, faked externals). |
20
+ | Un-sandboxable external (paid API, prod-only secret) **or** genuinely flaky | **Quarantine lane**, never skip — a separate **non-blocking** job that still *runs and reports* the test, with the surface graded blocking-but-attestable `Unverified` (not `verified: true`) and a dated exit. Run + report + don't-block ≠ stop running. (See [ci-integration.md](../ci-integration.md) → Quarantine lane.) |
21
+ | Only valid on a specific browser / OS / runtime | **Route it** — Playwright project / matrix / tag, so it runs where applicable and simply isn't *selected* elsewhere. Selection ≠ skip; the test is not disabled. |
22
+ | Behavior not built yet | **Land the test with its behavior** (TDD red→green in the same PR), or don't merge the test yet. Never merge a disabled placeholder for unbuilt code. |
23
+ | Test is obsolete / wrong / duplicate | **Delete it** (say why in the PR). A skip of a dead test is clutter that hides intent. |
24
+ | Flaky because the *test* is racy | **Fix the race** (explicit waits; never `waitForTimeout`) — flakiness is a defect, not a skip reason. Quarantine while fixing; don't disable. |
25
+ | Cannot execute in **any** environment we control | Then it isn't an automated test — **convert it to a documented manual-check** in the test plan / notes, tracked. Don't leave a `skip()` rotting in the suite. |
26
+
27
+ The throughline: you either want the signal (run it — blocking or quarantined) or the test is invalid (delete it). **"Stop running but keep the green test" is never the right tool.**
28
+
29
+ ## Annotation is not authorization
30
+
31
+ A `TODO` / issue link above a disabled test documents a gap; it does **not** make the skip acceptable. `TODO(#nnn): re-enable when we seed a payment_live merchant via /api/e2e/setup` is a *confession* that the state was seedable and the work was deferred — do the seed. There is no "skip + comment" compliant state.
32
+
33
+ ## Inherited (pre-existing) skips
34
+
35
+ A skip already present at the review base is pre-existing — per `review-pr` diff-discipline it's a note, not a PR blocker. But **a PR may not add a skip**, and any PR touching the area of an inherited skip should convert it via the map above rather than leave or extend it.
36
+
37
+ ## Enforcement
38
+
39
+ - The coverage gate is the real teeth: a disabled or guarded test grades **not-covered** (ledger) / **blocked** (sweep), so disabling-to-green can't clear CI regardless of how it's spelled — including `if (!x) return`.
40
+ - **`lint-tests.mjs`** (the static gate engine) is the fast tripwire on the explicit forms: `node <ensure-coverage>/scripts/lint-tests.mjs --diff "$BASE"` fails the build on a `test.skip` / `xit` / `describe.skip` / `.only` / `xfail` **added in the diff** (the `no-skip` rule; inherited skips left alone — diff-discipline). It also carries `no-fixed-timeout`. Run a subset with `--rules no-skip`. Wired as the `lint-tests` job in `assets/ci-gates.*`. The lint catches the greppable forms; the ledger catches the disguised ones.
41
+
42
+ The quarantine lane uses the **`@quarantine`** tag with a **dated exit**: `@quarantine(until=YYYY-MM-DD, issue=#nnn)`. The blocking `e2e` job runs `--grep-invert "@quarantine"`, the non-blocking lane runs `--grep "@quarantine"`. The exit **auto-resurfaces**: `check-quarantine-expiry.mjs` (run in the blocking lane) fails CI once `until=` is in the past, so a "temporary" quarantine can't rot green — by the date it must be fixed or the date extended with a reason (see [ci-integration.md](../ci-integration.md) → Quarantine lane).
43
+
44
+ **Canonical source:** `ensure-coverage` → `references/process/test-strategy.md` owns the no-skip policy; this doc is its **browser/E2E-specific application** (the `@quarantine` tag, the sweep/journey grading), not an independent copy. On any disagreement, `test-strategy.md` wins — fix this doc, don't fork it. Enforcement is already single-sourced (`lint-tests.mjs` + the ledger), so the only drift risk is the prose; edit the policy there first.
@@ -0,0 +1,121 @@
1
+ # CI Integration
2
+
3
+ Two things live here, with different force. The **coverage gates** ("start here" below) are the **required** CI contract, owned by ensure-coverage's `ci-contract.md` — blocking jobs. The **post-deploy dispatch pattern** further down (firing E2E against a deployed URL, PR-comment reporting) is **optional** — the skill works standalone without it. "Optional" does not apply to the gates.
4
+
5
+ ## The coverage gates (start here)
6
+
7
+ The required CI shape is defined by **ensure-coverage's `references/enforcement/ci-contract.md`**: each a *separate* blocking job, none standing in for another. The **per-PR floor** (the minimal gate every PR pays), numbered by ensure-coverage's **canonical gate IDs** (the gaps are deliberate — gates 4, 6, 7 are not per-PR-floor, covered just below) —
8
+
9
+ 1. **Inventory freshness** — regenerate inventory + route manifest, fail on drift.
10
+ 2. **Accounting** — `coverage-ledger.mjs validate` (static; proves a qualifying test was *authored*).
11
+ 3. **Presentation render sweep** — `presentation-sweep.mjs` opens every manifest route in a real browser (needs browser + seeded DB + auth bypass; proves the page *renders*). **NOT the functional suite** — a green functional run is not the presentation gate.
12
+ 5. **No over-mock** — `lint-tests.mjs --rules mock-internal-seam` (diff + whole-tree; zero-tolerance).
13
+ 8. **Curated E2E smoke** — drive the selected do-not-ship golden journeys against the real app, write `smoke-results.json`, then run `smoke.mjs verdict`; ALIVE/DEAD. The per-PR golden-path liveness floor. **NOT the functional suite below** — the curated handful against the real app with no first-party interception; for browser paths it runs through Playwright by tag/manifest selection (`@smoke` / smoke manifest), not by running the broad suite.
14
+
15
+ The **broad functional + journey E2E suite** (gate 4 — every form, error path, edge case) is **demoted off the per-PR critical path** to the **integration lane** (the integration-branch push; the `resolve-issues` epic gate runs there), required before release but not on every PR. Gate 8 stays per-PR because it is a tiny curated subset, not a second broad regression run. Plus the Review-Contract checklist validate (gate 6) and quarantine auto-resurface (gate 7).
16
+
17
+ Copy a ready template and fill the `<…>` placeholders:
18
+
19
+ - **Cloud Build**: [`assets/ci-gates.cloudbuild.yaml`](../assets/ci-gates.cloudbuild.yaml)
20
+ - **GitHub Actions**: [`assets/ci-gates.github.yml`](../assets/ci-gates.github.yml)
21
+
22
+ Then verify the wiring stays correct (nobody deleted the sweep/smoke or set `continue-on-error`) with the meta-gate: `node <ensure-coverage>/scripts/ci-audit.mjs --files <your ci configs>`. The post-deploy pattern below is complementary — it does not replace gate 3.
23
+
24
+ ### Branch protection: require ONE check, the umbrella
25
+
26
+ On GitHub Actions the gates are ~8 separate jobs; pointing branch protection at each by name is the failure mode — a renamed or added gate silently falls out of protection, and a conditionally-skipped job counts as passing. So the template ends with an **`all-gates` umbrella job** that `needs:` every blocking gate and fails on any `failure`/`cancelled` — **branch protection requires only `all-gates`**. (`skipped` is allowed by design: gate 4 is PR-skipped; the umbrella still reds on anything that ran and failed. The quarantine lane is deliberately not in `needs`.) On Cloud Build no umbrella is needed — the build's single status is the one check. `ci-audit.mjs` checks the umbrella and the PR-lane time budget as required conventions, and the pinned-Playwright-container as preferred.
27
+
28
+ ### The PR-lane time budget (≤5 min) and parallel golden paths
29
+
30
+ Every PR-lane job carries `timeout-minutes: 5` (GitHub) / `timeout: 300s` (Cloud Build) — the floor is only viable if it stays fast, and an unbounded job is how a 4-minute lane rots into a 25-minute one. The smoke gate's golden paths run **in parallel by default** (each `@smoke` journey is an independent spec; `E2E_WORKERS` > 1), so wall clock ≈ the slowest path; when even that can't fit, split across a job **matrix** from `smoke.mjs plan` output and reduce to one verdict (the commented `smoke-drive`/`smoke-verdict` variant in `assets/ci-gates.github.yml` — the umbrella then needs `smoke-verdict`, not the shards). Per-action/assertion timeouts are **15s** ([authoring/playwright-config.md](authoring/playwright-config.md)). Longer leashes belong to the integration-lane broad suite (30 min) and auxiliary quarantine/visual jobs — never the PR-lane gates.
31
+
32
+ ## Three lanes: PR lane, integration lane, release lane (production is read-only)
33
+
34
+ *PR lane* = the per-PR floor (gates 1, 2, 3, 5, 6, 7, 8) against a seeded test DB / ephemeral env. *Integration lane* = the broad functional + journey suite (gate 4), on the integration-branch push (nightly optional). *Release lane* = a **promotion to production**; you must not run the mutating suite against prod:
35
+
36
+ - **Don't re-run the heavy suite on prod.** Where the promotion fast-forwards, the promoted tip is the *exact SHA* the PR + integration gates already passed — gate the release on *"were the gates green at the promoted SHA?"*, a lookup, not a re-run. (Full mutating suite + sweep run pre-merge against integration/staging, never prod.) Under a single-branch model (GitHub Flow) the release branch is rebased before merging, so that lookup covers only *most* of the shipped SHA and demotes to a pre-filter — the real gate is the pre-exposure check below.
37
+ - **Against prod, smoke runs before traffic and under a read-only production profile:** the candidate is deployed at **0% traffic**, smoked read-only (health + `presentation:render-health` on key routes + GET-only journeys) under `prod-preview`/`prod-active`, and traffic shifts only on ALIVE. A read-only production profile excludes every mutating path *regardless of declared tenant* — against production a synthetic tenant is not sufficient, because the candidate is wired to the real production database. **No mutating journeys against production data.**
38
+ - **The post-deploy pattern below is the *integration* recorder, not the production gate.** It deploys at 100% and records a SHA-keyed verdict; production never uses that shape, because a smoke after traffic has shifted is a monitor rather than a gate. Production placement: `cloud-build` → Post-deploy smoke gate; sequencing: `resolve-release` step 4.
39
+
40
+ Full doctrine: `ensure-coverage` → `references/enforcement/ci-contract.md` (the release lane).
41
+
42
+ ## Pattern: Post-Deploy E2E via GitHub Actions
43
+
44
+ ```
45
+ CI/CD builds and deploys
46
+ → Post-deploy hook fires repository_dispatch
47
+ payload: { service_url, commit, env, pr_number }
48
+ → GitHub Actions runs E2E against deployed URL
49
+ → Posts PR comment with structured results
50
+ → Sets commit status (pass/fail)
51
+ ```
52
+
53
+ On the integration environment (`dev`), the commit status this sets is **load-bearing, SHA-keyed release evidence**: `resolve-release` pins its release candidate to a SHA whose post-deploy smoke recorded ALIVE (its principle 11), and the verdict stays valid after `dev` moves on because the artifact for a SHA is immutable. Keep the dev deploy unblocked — 100% traffic, smoke never fails the build (`cloud-build` → *Post-deploy smoke gate* has the placement); the verdict blocks at promotion instead.
54
+
55
+ ### Triggering from CI
56
+
57
+ Fire a `repository_dispatch` event to GitHub Actions post-deploy (implementation is CI-platform-specific). The payload shape must match:
58
+
59
+ ```json
60
+ {
61
+ "event_type": "deploy-complete",
62
+ "client_payload": {
63
+ "env": "dev",
64
+ "service_url": "https://your-deployed-service.example.com",
65
+ "commit": "<full-40-char-sha>",
66
+ "pr_number": "42"
67
+ }
68
+ }
69
+ ```
70
+
71
+ **Example: Google Cloud Build post-deploy step** — a `waitFor: ["deploy"]` bash step in the `cloud-sdk` image that: reads a GitHub PAT from `gcloud secrets` (e.g. secret `github-pat-e2e-dispatch`); derives `PR_NUMBER` by curling the commit's `/pulls` API and parsing `prs[0]['number']`, and `SERVICE_URL` from `gcloud run services describe`; then POSTs the payload above to `/repos/{owner}/{repo}/dispatches` fire-and-forget (`|| true`).
72
+
73
+ For other CI platforms, emit the same `repository_dispatch` payload via your platform's HTTP step or GitHub API action.
74
+
75
+ ### PR Comment Format
76
+
77
+ The workflow template (`templates/e2e-workflow.yml`) posts a structured results comment — a `🧪 E2E PASSED — <env>` heading over a metric table (Total, ✅ Passed, ❌ Failed, 🟡 Quarantined, ⏱️ Duration, 📊 Route coverage).
78
+
79
+ ### Blocking vs Non-Blocking (this post-deploy pattern only)
80
+
81
+ Applies to the **post-deploy reporting workflow above** — *not* the required per-PR gates (sweep, smoke, over-mock, ledger), which are always blocking and never carry `continue-on-error` (`ci-audit.mjs` enforces that).
82
+
83
+ - **Non-blocking (initially):** `continue-on-error: true` in the test step — results reported but don't block merge.
84
+ - **Blocking (once stable):** remove `continue-on-error` after 2+ weeks with no false-positives. This workflow fires on `repository_dispatch`, so it *can't* sit in the gates workflow's `all-gates` `needs:` — its `e2e` commit status is the one sanctioned **second** required check when blocking; everything inside the gates workflow still goes through `all-gates` only.
85
+
86
+ #### Quarantine lane (the only sanctioned non-blocking path)
87
+
88
+ Tests are **never skipped** (`authoring/test-skipping.md` is canonical). When a test genuinely cannot run hermetically — an **un-sandboxable external** (a provider with only a live/sandbox service, a prod-only secret) or a **genuine flake under active fix** — it goes here instead of being disabled. The lane keeps the *signal*: it **still runs and reports**, just doesn't hard-block. CI-specific wiring:
89
+
90
+ - A **distinct job with `continue-on-error: true`** — never hard-blocks a PR.
91
+ - On failure, **post a PR annotation/comment** and keep the surface **`Unverified`** in the Coverage Ledger (never `verified: true`) — surfaced and tracked, never a green skip.
92
+ - **Dated exit that auto-resurfaces:** tag `@quarantine(until=YYYY-MM-DD, issue=#nnn)`. Until the date it runs non-blocking; **on the date the holding is void and the item re-blocks** — the flake must be fixed, the external must have a sandbox or nightly secret-gated run, or the date extended with a stated reason. Enforce with `node <ensure-coverage>/scripts/check-quarantine-expiry.mjs --files <test globs>` in the **blocking** lane. The same `until=`/`issue=` convention applies to any deferred-but-tracked suppression (an accepted-with-expiry review finding).
93
+ - External **test keys** via secrets (e.g. `gcloud secrets`), never live keys. Everything hermetic stays in the blocking `e2e` lane.
94
+
95
+ **Example — the third-party / payfields temporal check** (`presentation:temporal`, Stripe/Adyen/Braintree sandbox iframe): touches an external service → quarantine lane; the hermetic first-party temporal checks stay in the blocking `e2e` lane.
96
+
97
+ ### Workflow Template
98
+
99
+ A reusable GitHub Actions workflow lives at `assets/e2e-workflow.yml` — copy to `.github/workflows/e2e.yml` and customize the marked sections. It handles: checkout at deployed commit; dependency install + Playwright browser setup; service readiness check; test execution with JSON reporter; PR comment posting (create/update); commit status reporting; Discord notification; artifact upload on failure.
100
+
101
+ ## Route Enforcement (PR Check)
102
+
103
+ Separate from post-deploy E2E, add a **PR check** that validates every app route has a manifest entry. Runs on every PR, not just after deployment.
104
+
105
+ A non-draft `pull_request` job (`.github/workflows/e2e-check.yml`, `types: [opened, synchronize, ready_for_review]`) that runs two steps after `actions/checkout`:
106
+
107
+ <!-- skill-script-path: consumer-copy -->
108
+ These paths are repo-relative on purpose, unlike the agent-invoked scripts elsewhere in this
109
+ skill: they run on a GitHub Actions runner, which has no `~/.agents/skills/` tree. The copy step
110
+ below is what puts them at `scripts/`.
111
+
112
+ - **Next.js** — `node scripts/validate-manifest.mjs --manifest e2e/route-manifest.json --e2e-dir e2e` then `node scripts/detect-routes-nextjs.mjs --app-dir src/app --manifest e2e/route-manifest.json`.
113
+ - **FastAPI** — `python3 scripts/detect-routes-fastapi.py --src-dir engine/api --manifest tests/e2e/endpoint-manifest.json`.
114
+
115
+ Copy the scripts from the e2e-test skill into each repo's `scripts/` directory (or reference a shared location).
116
+
117
+ ### Adoption strategy
118
+
119
+ 1. **Week 1:** Add with `--no-strict` (warn only, don't block)
120
+ 2. **Week 2:** Switch to strict (block PRs with untracked routes)
121
+ 3. **Ongoing:** every new route gets a manifest entry (route + tier) so the sweep visits it. Coverage is the ledger's job (`@covers`), not a manifest field — a route with no test still appears in the manifest and shows uncovered in the ledger/PR reports. (No `specs` escape hatch; `specs` is informational-only, per [route-manifest.md](route-manifest.md).)