@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,290 @@
1
+ export const meta = {
2
+ name: 'resolve-issues-independent-review',
3
+ description: "Fan step 2 (independent review) out across an epic's units — one adversarial reviewer per unit's PR, each on the review model (≠ implementation model), emitting schema'd findings + a calibrated verdict + the previous-findings reconciliation on re-reviews. Read-only: writes no code, posts nothing, asks the human nothing.",
4
+ phases: [
5
+ { title: 'Review', detail: 'one review-pr reviewer per unit, on the review model' },
6
+ ],
7
+ }
8
+
9
+ // This is the review step of resolve-issues, fanned out across the units that
10
+ // need a (re-)review this round. It preserves both independence guarantees:
11
+ // - Fresh context: each reviewer is a new subagent.
12
+ // - Model diversity: each runs on `reviewModel` via opts.model, which MUST
13
+ // differ from the model that wrote that unit's diff (u.implementationModel
14
+ // when set — e.g. a spawn-time substitute — else the run-level implementationModel).
15
+ // It is launched by the main-loop orchestrator, so the reviewers sit at the one
16
+ // nesting level the harness allows (they are leaves — they never sub-spawn, so
17
+ // there is no depth-2 cap to degrade them to a same-model self-review). The fix
18
+ // step that consumes these verdicts stays in the main loop (it writes code).
19
+ // The reviewer computes its own diff facts with review-pr's pr-context.mjs —
20
+ // diff-discipline as code, no caller-supplied SHA plumbing.
21
+ //
22
+ // args: {
23
+ // units: [{
24
+ // id: string, prRef: string, baseRef: string, contractPath?: string,
25
+ // highRisk?: boolean, // unit touches auth/money/tenancy/migration → the
26
+ // // reviewer also runs references/high-risk.md's additions
27
+ // implementationModel?: string, // the model that wrote THIS unit's diff, when it differs from the
28
+ // // run-level implementationModel (e.g. a substitute re-confirmed on
29
+ // // a spawn-time miss) — the diversity guard compares per unit
30
+ // lastReviewedSha?: string, // re-reviews only: the HEAD the prior verdict was rendered
31
+ // // against — scopes the fresh four-axis scan to the
32
+ // // <sha>...HEAD delta (review-pr § Re-review). OMIT to force
33
+ // // a full-scope re-review (high-risk, round 3+, delta outside
34
+ // // the original files, or a rebase — the CALLER decides).
35
+ // priorFindings?: [{ title: string, axis: string, file: string, line_start: number,
36
+ // line_count: number, confidence: number, why: string, consequence: string,
37
+ // recommendation: string, theme: object, hazard_candidate?: object }]
38
+ // // present on re-reviews; carry each prior finding's hazard_candidate
39
+ // // VERBATIM so the two-locator rule remains enforceable.
40
+ // }]
41
+ // reviewModel: string // the review model (confirmed upstream)
42
+ // reviewEffort?: string // the effort of the banked OPERATING POINT the human
43
+ // // picked for this slot (models.reviewEffort), default high.
44
+ // // Never asked per run: points are confirmed once, when
45
+ // // the model is classified (model-catalog.md `tiers`).
46
+ // implementationModel: string // run-level default implementer; the diversity guard compares
47
+ // // per unit, with u.implementationModel overriding this
48
+ // reviewSkillPath: string // ABSOLUTE path to review-pr SKILL.md (resolved at pre-flight)
49
+ // }
50
+ const {
51
+ units = [],
52
+ reviewModel,
53
+ reviewEffort = 'high',
54
+ implementationModel,
55
+ reviewSkillPath,
56
+ } = args || {}
57
+
58
+ if (!units.length) {
59
+ throw new Error('resolve-issues-independent-review: args.units is empty — nothing to review.')
60
+ }
61
+ if (!reviewModel) {
62
+ throw new Error('resolve-issues-independent-review: args.reviewModel is required — the review must run on a named model so the handoff can prove it differs from the implementer.')
63
+ }
64
+ if (!reviewSkillPath || !reviewSkillPath.startsWith('/')) {
65
+ // A relative default like 'skills/engineering/review-pr/SKILL.md' only resolves inside the
66
+ // skills repo itself; in a consumer repo the reviewer's read fails silently and it improvises
67
+ // a lookalike review from memory. Force the orchestrator to pass the resolved absolute path.
68
+ throw new Error('resolve-issues-independent-review: args.reviewSkillPath must be the ABSOLUTE path to review-pr/SKILL.md (e.g. ~/.claude/skills/review-pr/SKILL.md resolved) — a relative path breaks outside the skills repo and degrades the review to a memory-reconstructed lookalike.')
69
+ }
70
+ const boundaryKinds = ['head', 'ci', 'contract', 'integration']
71
+ const unitFieldFailures = units.flatMap((u, i) =>
72
+ ['id', 'prRef', 'baseRef', 'authorizationBoundary'].filter((f) => f === 'authorizationBoundary'
73
+ ? !(u?.[f] && typeof u[f] === 'object' && boundaryKinds.includes(u[f].kind) && typeof u[f].value === 'string' && u[f].value.trim())
74
+ : typeof u?.[f] !== 'string' || !u[f].trim()).map((f) => `units[${i}]: ${f} is required`))
75
+ if (unitFieldFailures.length) {
76
+ throw new Error(`resolve-issues-independent-review: ${unitFieldFailures.join('; ')}`)
77
+ }
78
+
79
+ // The diversity guard (resolve-issues "Pre-flight"): a same-model review is NOT
80
+ // independent. We do not silently pass it off as one.
81
+ // Per-unit: a unit's diff may have been written by a spawn-time substitute,
82
+ // not the run-level implementationModel — the guard must compare against the model
83
+ // that actually wrote THAT unit's diff (u.implementationModel overrides).
84
+ const unitImplModel = (u) => u.implementationModel || implementationModel
85
+ const notIndependent = units.some((u) => reviewModel === unitImplModel(u))
86
+ if (notIndependent) {
87
+ log(`WARNING: reviewModel (${reviewModel}) equals the implementation model for at least one unit. Those reviews are NOT INDEPENDENT — same model. Each result is tagged so the handoff reports it as a gap, not a real review.`)
88
+ }
89
+
90
+ const REVIEW = {
91
+ type: 'object',
92
+ additionalProperties: false,
93
+ required: ['unitId', 'verdict', 'headSha', 'reviewSubject', 'authorizationBoundary', 'findings', 'overMockFindings', 'previousFindingsResolution', 'reviewModel', 'independent', 'contractValidates'],
94
+ properties: {
95
+ unitId: { type: 'string' },
96
+ headSha: { type: 'string', pattern: '^[0-9a-f]{7,64}$', description: 'Exact reviewed HEAD from pr-context.mjs.' },
97
+ reviewSubject: { type: 'string', enum: ['code', 'evidence'], description: 'Independent round subject; evidence only for a constrained evidence review.' },
98
+ evidenceClasses: {
99
+ type: 'array', minItems: 1, uniqueItems: true,
100
+ items: { type: 'string', enum: ['stale-locator', 'unrun-gate-row', 'stale-stamp', 'contract-drift', 'checklist-row', 'other'] },
101
+ description: 'Required exactly when reviewSubject is evidence.',
102
+ },
103
+ reopenReason: { type: 'string', enum: ['ci-red', 'head-rewritten', 'contract-revised', 'integration-finding', 'external-review'] },
104
+ authorizationBoundary: {
105
+ type: 'object', additionalProperties: false, required: ['kind', 'value'],
106
+ properties: { kind: { type: 'string', enum: ['head', 'ci', 'contract', 'integration'] }, value: { type: 'string', minLength: 1, pattern: '\\S' } },
107
+ },
108
+ verdict: {
109
+ type: 'string',
110
+ enum: ['PASS', 'NEEDS_CHANGES', 'FAIL', 'BLOCKED'],
111
+ description: 'review-pr verdict against the current HEAD. PASS = merge-ready (or merge-ready with only non-blocking notes).',
112
+ },
113
+ findings: {
114
+ type: 'array',
115
+ // GENERATED FROM review-pr/scripts/finding-contract.mjs. The workflow
116
+ // harness is intentionally import-free, so parity is checked by tests.
117
+ items: {
118
+ type: 'object',
119
+ additionalProperties: false,
120
+ required: ['title', 'axis', 'file', 'line_start', 'confidence', 'why', 'priority'],
121
+ properties: {
122
+ title: { type: 'string', minLength: 1, pattern: '\\S', maxLength: 120 },
123
+ axis: { type: 'string', enum: ['spec', 'coverage', 'correctness', 'standards'] },
124
+ subject: { type: 'string', enum: ['code', 'evidence'], default: 'code' },
125
+ in_scope: { type: 'boolean', default: true },
126
+ priority: { type: 'integer', minimum: 0, maximum: 3 },
127
+ file: { type: 'string', minLength: 1, pattern: '\\S' },
128
+ line_start: { type: 'integer', minimum: 1 },
129
+ line_count: { type: 'integer', minimum: 1 },
130
+ confidence: { type: 'number', minimum: 0, maximum: 1 },
131
+ why: { type: 'string', minLength: 1, pattern: '\\S' },
132
+ consequence: { type: 'string', minLength: 1, pattern: '\\S' },
133
+ recommendation: { type: 'string', minLength: 1, pattern: '\\S' },
134
+ theme: {
135
+ type: 'object',
136
+ additionalProperties: false,
137
+ required: ['id', 'kind', 'contract'],
138
+ properties: {
139
+ id: { type: 'string', pattern: '^[a-z][a-z0-9-]*$' },
140
+ kind: { type: 'string', enum: ['other', 'state-machine', 'concurrency'] },
141
+ contract: { type: 'string', minLength: 1, pattern: '\\S' },
142
+ stateSpace: {
143
+ type: 'object',
144
+ additionalProperties: false,
145
+ required: ['states', 'taskKinds'],
146
+ properties: {
147
+ states: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'string', minLength: 1, pattern: '\\S' } },
148
+ taskKinds: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'string', minLength: 1, pattern: '\\S' } },
149
+ },
150
+ },
151
+ },
152
+ allOf: [{
153
+ if: { properties: { kind: { enum: ['state-machine', 'concurrency'] } } },
154
+ then: { required: ['stateSpace'] },
155
+ }, {
156
+ if: { properties: { kind: { const: 'other' } } },
157
+ then: { not: { required: ['stateSpace'] } },
158
+ }],
159
+ },
160
+ hazard_candidate: {
161
+ type: 'object',
162
+ additionalProperties: false,
163
+ anyOf: [
164
+ { required: ['section', 'id', 'rule', 'prove'] },
165
+ { required: ['covered_by'] },
166
+ ],
167
+ properties: {
168
+ section: { type: 'string', enum: ['auth', 'money', 'tenancy', 'migration', 'cross-cutting'] },
169
+ id: { type: 'string', pattern: '^[a-z][a-z0-9-]*$' },
170
+ rule: { type: 'string', minLength: 1, pattern: '\\S' },
171
+ prove: { type: 'string', minLength: 1, pattern: '\\S' },
172
+ covered_by: { type: 'string', minLength: 1, pattern: '\\S' },
173
+ },
174
+ },
175
+ },
176
+ },
177
+ },
178
+ overMockFindings: {
179
+ type: 'array',
180
+ description: "Verbatim `findings` channel of review-pr's `scripts/scan-diff.mjs` over the base...HEAD diff — the decidable over-mock screen. Every entry is a zero-tolerance blocker (a vi/jest/vitest.mock of a first-party internal seam), no waiver. An empty array is valid ONLY when it is the script's actual output, never a stand-in for 'I checked the mocks'. A review that omits this field did not run the screen and does not satisfy the step.",
181
+ items: {
182
+ type: 'object',
183
+ additionalProperties: false,
184
+ required: ['file', 'line', 'target'],
185
+ properties: {
186
+ file: { type: 'string' },
187
+ line: { type: 'integer' },
188
+ target: { type: 'string', description: 'the mocked first-party seam, e.g. @/lib/intake/case-store' },
189
+ },
190
+ },
191
+ },
192
+ previousFindingsResolution: {
193
+ type: 'array',
194
+ description: 'Re-reviews only: one row per prior finding, reconciled against the CURRENT tree. A finding the PR claims fixed but with no verifiable locator stays Unresolved.',
195
+ items: {
196
+ type: 'object',
197
+ additionalProperties: false,
198
+ required: ['finding', 'themeId', 'status', 'evidence'],
199
+ properties: {
200
+ finding: { type: 'string' },
201
+ themeId: { type: 'string' },
202
+ status: { type: 'string', enum: ['Resolved', 'Unresolved', 'Partially resolved'] },
203
+ evidence: { type: 'string', description: 'file:line proving the resolution, or why it is still open' },
204
+ },
205
+ },
206
+ },
207
+ reviewModel: { type: 'string', pattern: '\\S' },
208
+ independent: { type: 'boolean', description: 'false when reviewModel === implementationModel' },
209
+ contractValidates: { type: 'boolean', description: 'result of running coverage-checklist.mjs validate on the Review Contract' },
210
+ round1Depth: {
211
+ // HIGH-RISK UNITS ONLY (references/high-risk.md): live-endpoint probing +
212
+ // shared-consumer impact, recorded with evidence. Lean-lane reviews omit it.
213
+ type: 'object',
214
+ additionalProperties: false,
215
+ required: ['liveEndpointProbing', 'sharedConsumerImpact'],
216
+ properties: {
217
+ liveEndpointProbing: {
218
+ type: 'object', additionalProperties: false, required: ['status', 'evidence'],
219
+ properties: { status: { type: 'string', enum: ['completed', 'not-applicable'] }, evidence: { type: 'string', minLength: 1, pattern: '\\S' } },
220
+ },
221
+ sharedConsumerImpact: {
222
+ type: 'object', additionalProperties: false, required: ['status', 'evidence'],
223
+ properties: { status: { type: 'string', enum: ['completed', 'not-applicable'] }, evidence: { type: 'string', minLength: 1, pattern: '\\S' } },
224
+ },
225
+ },
226
+ },
227
+ },
228
+ allOf: [{
229
+ if: { properties: { reviewSubject: { const: 'evidence' } }, required: ['reviewSubject'] },
230
+ then: { required: ['evidenceClasses'] },
231
+ else: { not: { required: ['evidenceClasses'] } },
232
+ }],
233
+ }
234
+
235
+ phase('Review')
236
+ log(`Reviewing ${units.length} unit(s) on ${reviewModel}${notIndependent ? ' (some units NOT INDEPENDENT — same model)' : ` (impl: ${implementationModel || 'unknown'})`}`)
237
+
238
+ const results = (await parallel(
239
+ units.map((u) => () => {
240
+ // Re-review is signaled by EITHER prior findings to reconcile OR a recorded
241
+ // lastReviewedSha (a round-2+ unit can carry the SHA with no prior findings —
242
+ // a CI-only fix, or a clean round followed by a new commit — and still owes
243
+ // the delta-scope contract, not a "first review").
244
+ const priorFindings = Array.isArray(u.priorFindings) ? u.priorFindings : []
245
+ const isRereview = Boolean(u.lastReviewedSha) || priorFindings.length > 0
246
+ const unitNotIndependent = reviewModel === unitImplModel(u)
247
+ return agent(
248
+ `Apply the review-pr skill (read ${reviewSkillPath}) adversarially to ONE pull request, READ-ONLY (do not push, comment, or change anything):\n\n` +
249
+ ` unit: ${u.id}\n` +
250
+ ` PR: ${u.prRef}\n` +
251
+ ` base: ${u.baseRef}\n` +
252
+ ` contract: ${u.contractPath || '(none — note its absence as a finding)'}\n\n` +
253
+ `Scope to the net ${u.baseRef}...HEAD diff (compute the merge-base and range with review-pr's scripts/pr-context.mjs — diff-discipline as code, no hand-typed SHAs). Search adversarially across the four axes; return schema'd findings — each with a title, axis, a real file + line_start, a numeric confidence, a priority (integer 0-3, the ONE severity scale — required), and why it breaks (consequence/recommendation/line_count welcome but optional). Set in_scope to false only when the finding is NOT about this diff (pre-existing / out-of-scope code); it defaults true. Do NOT emit a 'blocking' field or any [P1]/F-/N- label prefix in the title — the label (BLOCK-n/NOTE-n) and the verdict are RENDERED mechanically from {priority, in_scope} by post-review.mjs; a finding blocks the PR only when in_scope && priority<=1. Set subject to 'evidence' when the fix would touch no source file (contract wording, checklist rows, evidence locators, @level tags) and 'code' otherwise; omitting it means 'code'. The caller routes an unmoved-diff round on this, so misclassifying a code defect as evidence skips its adversarial re-review — when unsure, leave it 'code'. A state-machine/concurrency finding also carries a durable stable theme (kebab-case theme.id, kind, the general violated contract, and declare the full stateSpace) — a recurrence keeps its theme.id; do not mint a new id for an adjacent counterexample; other findings may omit theme. ` +
254
+ `Run \`coverage-checklist.mjs validate\` on the Review Contract and set contractValidates. ` +
255
+ `Run review-pr's mechanized over-mock screen (\`scripts/scan-diff.mjs\` over the ${u.baseRef}...HEAD diff) and set overMockFindings to its decidable \`findings\` channel VERBATIM — empty array only if that is the script's actual output, never a stand-in for "I checked the mocks". Every entry is a zero-tolerance blocker (no waiver). ` +
256
+ `Specifically hunt for over-mock (a vi/jest/vitest.mock of a first-party internal seam — store/engine/action/DB — or first-party page.route/route.fulfill/MSW interception in a journey), skip-to-green, weakened assertions, fixed-timeouts, and assertions made against 404/empty/error pages — these fail the review regardless of CI color. Do NOT reason inside the mocked boundary: a well-asserted unit test that stubs an internal seam is Over-mocked, not covered. ` +
257
+ `Return a calibrated verdict (PASS only when merge-ready against the CURRENT HEAD): a blocker must map to a named review-pr blocking class; anything else is a note inside a PASS.\n\n` +
258
+ (u.highRisk
259
+ // The additions are inlined right here, so the reference is provenance,
260
+ // not something the spawn must resolve — but it is still a repo-relative
261
+ // skills path in a spawn prompt, which is the shape the absolute-path rule
262
+ // exists to keep out of prompts entirely. Named descriptively instead, the
263
+ // way high-risk.md's own reviewer section does.
264
+ ? `This unit is HIGH-RISK (auth/money/tenancy/migration) — apply resolve-issues' high-risk reviewer additions: read the repo hazards file (docs/domain-hazards.md, via the "Domain hazards" index in AGENTS.md/CLAUDE.md) plus review-pr's domain-hazards catalog and adversarially hunt the diff against every item — any hit is a blocking code-correctness finding with a hazard_candidate (the ready-to-paste row, or covered_by; you are read-only). Also complete round-1 depth: probe each changed live endpoint against the real running surface and trace the changed contract through every shared first-party consumer; record round1Depth with completed + concrete evidence, or not-applicable + a specific reason — never a silent deferral.\n\n`
265
+ : `This unit is lean-lane: no hazard hunt, no round1Depth — omit that field.\n\n`) +
266
+ (isRereview
267
+ ? `This is a RE-REVIEW. Reconcile EVERY prior finding against the current tree and fill previousFindingsResolution. A finding the PR claims resolved but whose fix has no verifiable locator — or is still present — stays Unresolved; it does not clear on the producer's say-so. A prior finding that carried a hazard_candidate needs BOTH locators to reach Resolved: the code fix AND its docs/domain-hazards.md row (or an explicit covered-by) — code-only is Partially resolved. ` +
268
+ (u.lastReviewedSha
269
+ ? `DELTA SCOPE (review-pr § Re-review): run the fresh four-axis scan on the ${u.lastReviewedSha}...HEAD delta only — the commits added since the prior verdict — plus the prior-findings reconciliation; the decidable screens (scan-diff, checklist validate) still run over the full ${u.baseRef}...HEAD diff, and the verdict still covers the whole PR. `
270
+ : `FULL SCOPE: no lastReviewedSha was provided — re-review the whole ${u.baseRef}...HEAD diff. `) +
271
+ (priorFindings.length
272
+ ? `Prior findings:\n${JSON.stringify(priorFindings)}\n\n`
273
+ : `There are no prior findings to reconcile (the prior round ended clean) — previousFindingsResolution is an empty array; the scope instruction above still applies.\n\n`)
274
+ : `This is a first review — previousFindingsResolution is an empty array.\n\n`) +
275
+ `Return headSha as the exact reviewed HEAD from pr-context.mjs. Set reviewSubject to evidence only when this was explicitly constrained to evidence; otherwise code. An evidence subject MUST return one or more evidenceClasses from stale-locator|unrun-gate-row|stale-stamp|contract-drift|checklist-row|other; a code subject MUST omit evidenceClasses. Echo authorizationBoundary=${JSON.stringify(u.authorizationBoundary)} exactly — it is caller authorization, never reviewer inference. ${u.reopenReason ? `Echo reopenReason=${JSON.stringify(u.reopenReason)} exactly; it is caller authorization, never reviewer inference. ` : 'Omit reopenReason; the caller did not authorize a post-PASS reopen. '}` +
276
+ `Set reviewModel="${reviewModel}" and independent=${!unitNotIndependent}.` +
277
+ (unitNotIndependent ? ` (independent is false because the review model equals the model that wrote this unit's diff — say so plainly; do not present this as a real independent review.)` : ''),
278
+ { label: `review:${u.id}`, phase: 'Review', model: reviewModel, effort: reviewEffort, schema: REVIEW }
279
+ )
280
+ })
281
+ )).filter(Boolean)
282
+
283
+ const pass = results.filter((r) => r.verdict === 'PASS').length
284
+ const dependentCount = results.filter((r) => !r.independent).length
285
+ log(`Reviewed ${results.length}/${units.length}: ${pass} PASS, ${results.length - pass} need work${dependentCount ? ` — ${dependentCount} NOT independent (same-model)` : ''}`)
286
+ // `independent` is computed from the UNITS (deterministic — the same units.some()
287
+ // guard as above), never from the agents' self-reported flags: a same-model unit
288
+ // whose reviewer errored out would vanish from `results` and make a self-reported
289
+ // aggregate read independent when the wave was not.
290
+ return { results, reviewModel, implementationModel: implementationModel || null, independent: !notIndependent }
@@ -0,0 +1,80 @@
1
+ export const meta = {
2
+ name: 'resolve-issues-prior-art-scan',
3
+ description: "Fan the prior-art check out across an epic's units — one read-only investigator per unit checking open/merged PRs, the codebase, and issue state, then routing each unit (skip / resume PR / scope-remaining / proceed). Read-only: writes no code, opens no PRs, asks the human nothing.",
4
+ phases: [
5
+ { title: 'Scan', detail: 'one prior-art investigator per work unit' },
6
+ ],
7
+ }
8
+
9
+ // This is the intake prior-art check of resolve-issues, fanned out across the epic's units. It is
10
+ // READ-ONLY investigation: agents run `gh`/`git` queries only, write no code,
11
+ // open/close no PRs, and never hit a human gate. The scheduler in the main loop
12
+ // consumes the routing verdicts to decide which units enter the delivery loop
13
+ // (and where each enters it). See resolve-issues SKILL.md, "Intake & scheduling".
14
+ //
15
+ // args: {
16
+ // units: [{ id: string, title: string, slug?: string, acSummary?: string }]
17
+ // defaultBranch?: string // e.g. "main" — helps the merged/landed check
18
+ // }
19
+ const { units = [], defaultBranch = 'main' } = args || {}
20
+
21
+ if (!units.length) {
22
+ throw new Error(
23
+ 'resolve-issues-prior-art-scan: args.units is empty. The main-loop scheduler must normalize the ' +
24
+ 'epic to work units BEFORE fanning out — the workflow does not enumerate sub-issues itself.'
25
+ )
26
+ }
27
+
28
+ const PRIOR_ART = {
29
+ type: 'object',
30
+ additionalProperties: false,
31
+ required: ['unitId', 'finding', 'locators', 'recommendation', 'enterAtStep'],
32
+ properties: {
33
+ unitId: { type: 'string' },
34
+ finding: {
35
+ type: 'string',
36
+ enum: ['merged', 'open-pr', 'partial', 'nothing'],
37
+ description: 'merged/landed in codebase | an open PR exists | partially implemented | nothing found',
38
+ },
39
+ locators: {
40
+ type: 'array',
41
+ items: { type: 'string' },
42
+ description: 'evidence: PR #, branch name, commit SHA, or file:line where existing work lives',
43
+ },
44
+ recommendation: {
45
+ type: 'string',
46
+ description: 'skip (already done — recommend closing the issue) | resume PR #N | scope remaining work only | proceed fresh',
47
+ },
48
+ enterAtStep: {
49
+ type: 'string',
50
+ enum: ['skip', 'review', 'implement-remaining', 'implement'],
51
+ description: 'where this unit enters the delivery loop: skip | resume an open PR at the review step | implement only the remaining gap | implement fresh',
52
+ },
53
+ },
54
+ }
55
+
56
+ phase('Scan')
57
+ log(`Prior-art scan across ${units.length} unit(s)`)
58
+
59
+ const results = (await parallel(
60
+ units.map((u) => () =>
61
+ agent(
62
+ `READ-ONLY prior-art check for one work unit (resolve-issues intake). Do NOT write code, open PRs, or change anything — only investigate, using read-only \`gh\`/\`git\` queries.\n\n` +
63
+ ` unit: ${u.id} — ${u.title}\n` +
64
+ ` slug: ${u.slug || '(none)'}\n` +
65
+ ` ACs: ${u.acSummary || '(none provided — search by title/slug)'}\n\n` +
66
+ `Check all three places and route on what you find:\n` +
67
+ ` 1. Open / merged PRs — \`gh pr list --state all --search "${u.id} OR ${u.slug || u.title}"\` and \`gh pr list --search "in:body Closes #${u.id}"\`; scan branch names referencing the issue.\n` +
68
+ ` 2. The codebase — search for the symbols/routes/endpoints/behavior the ACs describe; \`git log --oneline --grep "#${u.id}"\` against ${defaultBranch}.\n` +
69
+ ` 3. Issue state — already closed, or linked to a merged PR?\n\n` +
70
+ `Return the finding (merged | open-pr | partial | nothing), the evidence locators (PR #, branch, commit, or file:line), a recommendation, and where the unit should enter the delivery loop. ` +
71
+ `If you are unsure whether existing work truly satisfies the unit, say so in the recommendation and route to "implement" rather than silently assuming done.`,
72
+ { label: `prior-art:${u.id}`, phase: 'Scan', schema: PRIOR_ART }
73
+ )
74
+ )
75
+ )).filter(Boolean)
76
+
77
+ const skip = results.filter((r) => r.enterAtStep === 'skip').length
78
+ const resume = results.filter((r) => r.enterAtStep === 'review').length
79
+ log(`Scanned ${results.length}/${units.length}: ${skip} already done, ${resume} resumable open PR(s)`)
80
+ return { results }
@@ -0,0 +1,102 @@
1
+ // Shared smoke-test helpers for .workflow.js harness scripts (consumed by
2
+ // resolve-issues' workflows.test.mjs).
3
+ //
4
+ // The scripts only fully run inside the Workflow harness (agent/parallel/etc.
5
+ // are injected globals), so these helpers pin the decidable floor instead:
6
+ // - the file parses (a syntax error would otherwise surface mid-run);
7
+ // - `meta` is a PURE literal with name/description/phases (the harness contract);
8
+ // - every phase('X') call uses a title declared in meta.phases;
9
+ // - the input guards throw informative errors instead of running agents on
10
+ // an empty work-list (the main loop must scout inputs first).
11
+
12
+ import { test } from 'node:test'
13
+ import assert from 'node:assert/strict'
14
+ import fs from 'node:fs'
15
+ import path from 'node:path'
16
+
17
+ export function loadWorkflowSource(file) {
18
+ return fs.readFileSync(file, 'utf8')
19
+ }
20
+
21
+ // Extract the `export const meta = {...}` literal by brace-matching and
22
+ // evaluate it standalone — exactly what "pure literal, no computed values"
23
+ // guarantees is possible.
24
+ export function extractMeta(src, file) {
25
+ const start = src.indexOf('export const meta')
26
+ assert.notEqual(start, -1, `${file}: missing \`export const meta\``)
27
+ const braceStart = src.indexOf('{', start)
28
+ let depth = 0
29
+ let end = -1
30
+ for (let i = braceStart; i < src.length; i++) {
31
+ const ch = src[i]
32
+ if (ch === '{') depth++
33
+ else if (ch === '}') { depth--; if (depth === 0) { end = i; break } }
34
+ }
35
+ assert.notEqual(end, -1, `${file}: unbalanced braces in meta`)
36
+ const literal = src.slice(braceStart, end + 1)
37
+ // A pure literal evaluates with no scope at all; a computed meta throws here.
38
+ return new Function(`'use strict'; return (${literal})`)()
39
+ }
40
+
41
+ // Compile + run the script body under stub harness globals. `export ` is
42
+ // stripped (the body otherwise has no module syntax — the harness forbids
43
+ // imports/fs). Returns a promise that settles the way the harness would.
44
+ export function runWorkflow(file, { args, agent } = {}) {
45
+ const src = loadWorkflowSource(file).replace(/^export\s+const\s+meta/m, 'const meta')
46
+ const fn = new Function(
47
+ 'args', 'agent', 'parallel', 'pipeline', 'phase', 'log', 'budget', 'workflow',
48
+ `'use strict'; return (async () => {\n${src}\n})()`
49
+ )
50
+ const deny = (name) => async () => { throw new Error(`${name}() must not be reached in this smoke test`) }
51
+ return fn(
52
+ args,
53
+ agent || deny('agent'),
54
+ async (thunks) => Promise.all(thunks.map((t) => t().catch(() => null))),
55
+ deny('pipeline'),
56
+ () => {},
57
+ () => {},
58
+ { total: null, spent: () => 0, remaining: () => Infinity },
59
+ deny('workflow'),
60
+ )
61
+ }
62
+
63
+ // Register the standard smoke tests for every .workflow.js in `dir`, plus the
64
+ // per-script input-guard assertions in `guards`:
65
+ // { '<test name>': { file, args, message } } → expects runWorkflow to reject.
66
+ export function smokeTestWorkflows(dir, guards) {
67
+ const files = fs.readdirSync(dir).filter((f) => f.endsWith('.workflow.js'))
68
+ assert.ok(files.length > 0, `no .workflow.js files found in ${dir}`)
69
+
70
+ for (const f of files) {
71
+ const file = path.join(dir, f)
72
+ const src = loadWorkflowSource(file)
73
+
74
+ test(`${f}: meta is a pure literal with the required harness fields`, () => {
75
+ const meta = extractMeta(src, f)
76
+ assert.equal(typeof meta.name, 'string')
77
+ assert.ok(meta.name.length > 0)
78
+ assert.equal(typeof meta.description, 'string')
79
+ assert.ok(Array.isArray(meta.phases) && meta.phases.length > 0, `${f}: meta.phases missing/empty`)
80
+ for (const p of meta.phases) assert.equal(typeof p.title, 'string')
81
+ })
82
+
83
+ test(`${f}: every phase() call uses a title declared in meta.phases`, () => {
84
+ const meta = extractMeta(src, f)
85
+ const declared = new Set(meta.phases.map((p) => p.title))
86
+ for (const m of src.matchAll(/\bphase\(\s*(['"`])([^'"`]+)\1\s*\)/g)) {
87
+ assert.ok(declared.has(m[2]), `${f}: phase('${m[2]}') has no matching meta.phases entry`)
88
+ }
89
+ })
90
+
91
+ test(`${f}: body compiles and is import-free (harness constraint)`, () => {
92
+ assert.doesNotMatch(src, /^\s*import\s/m, `${f}: workflow scripts cannot import (no module access in the harness)`)
93
+ runWorkflow(file, { args: undefined }).catch(() => {}) // compile check; rejections are asserted per-guard
94
+ })
95
+ }
96
+
97
+ for (const [name, { file, args, message }] of Object.entries(guards)) {
98
+ test(`guard: ${name}`, async () => {
99
+ await assert.rejects(runWorkflow(path.join(dir, file), { args }), message, `${file} should reject (${name})`)
100
+ })
101
+ }
102
+ }
@@ -0,0 +1,3 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 1AboveIO
@@ -0,0 +1,112 @@
1
+ ---
2
+ name: resolve-release
3
+ description: "Release-lane orchestrator, from merge authorization to verified-in-production: assemble PRs into a release branch, cut version + CHANGELOG, promotion PR, deploy a candidate at 0% traffic, validate it, shift traffic, verify the live revision, tag and publish notes (or delete the candidate / roll back). Input is resolve-issues' handoff. NOT for driving issues to PRs (resolve-issues), pipeline debugging (cloud-build/cloud-deploy/cloud-debug), or broken production (app-debug)."
4
+ dependencies:
5
+ - review-pr
6
+ - e2e-test
7
+ - ensure-coverage
8
+ - smoke
9
+ ---
10
+
11
+ # Resolve release (authorize → merge → build candidate → validate → expose → verify)
12
+
13
+ Take **merge-ready PRs** (typically a `resolve-issues` handoff) through merge, promotion and deployment to a **verified production revision**. Every other resolve-* skill stops at "do not merge unless authorized"; this one owns what follows.
14
+
15
+ The **authorization is the entry gate; observed production state is the exit gate** — the loop closes on **verification of the live revision after traffic reaches it**, never on "merged" or "deploy succeeded". Production is reached in two moves: a candidate at **0% traffic**, validated there, then the shift — so most failures cost **nobody exposed, nothing to roll back, no version burned**.
16
+
17
+ It **owns only** the authorization envelope, the merge/promote/validate/expose/verify sequencing, the **version identity** (bump, CHANGELOG cut, immutable tag — production promotions only), verdict routing, and rollback discipline.
18
+
19
+ ## How to invoke me (read first)
20
+
21
+ **Before creating or resuming a release run, use `resolve-issues/scripts/run-state.mjs init|resume --skill resolve-release`.** That boundary runs `engineering-runtime`'s read-only coherence verifier first and fails closed on an incoherent, unavailable or malformed verdict; inspection commands stay available for diagnosis.
22
+
23
+ **Main-loop orchestrator; never nest me in a subagent, and never fan out.** Nearly every step is outward-facing and gated on an authorization a nested or headless agent cannot collect, and a release is a serialized state machine against shared, moving targets. Run it sequentially, start to finish.
24
+
25
+ **Sequential is not paused.** Wait with one background watcher launch, never a foreground poll loop. A notification is a **continuation trigger**, not a checkpoint: record it and **carry straight on in the same turn** — never write "I'll resume when the watcher reports" and end the turn (`019faea6`: three of five human interventions were that shape and decided nothing). Stop only for an authorization the envelope did not pre-approve, a terminal hand-back, or an ambiguous state. → [watching PR delivery](references/assembly.md#watching-pr-delivery)
26
+
27
+ For PRs this lane opens, use [`watch-pr-delivery.mjs`](../../cicd-pipeline/mergify/scripts/watch-pr-delivery.mjs): it **observes only** — never enqueues, merges, or takes merge authorization. Other waits use their own tooling under the same one-launch rule.
28
+
29
+ ## Routing (read this first)
30
+
31
+ **This file is an index, and must stay one** — a truncated skill silently becomes a shorter skill, and this one lost its traffic shift and rollback routing exactly that way. What must survive truncation is here; everything else is a file you read on arrival. Never work from this page alone.
32
+
33
+ | Phase | Read | The rule you must not miss |
34
+ |---|---|---|
35
+ | **Before anything** — readiness, endpoints, tip green, the envelope | [preflight.md](references/preflight.md) · [`preflight-probes`](scripts/preflight-probes.mjs) · [`production-endpoints`](scripts/production-endpoints.mjs) · [`ensure-target-green`](scripts/ensure-target-green.mjs) | **MANDATORY**, and `unknown` is not `ok`. Repair a red target before confirmation. **No outward action until the human confirms**; undeclared deploy or identity data is a refusal. |
36
+ | 0-2 — intake, assemble, promotion PR | [assembly.md](references/assembly.md) | Merge-readiness re-verified against the tree (principle 2); promotions **fast-forward** (principle 3). |
37
+ | 3 — promote, build the candidate | [candidate.md](references/candidate.md) | Deploys at **0% traffic**; identity discovery **fails closed** on a missing, ambiguous or mismatched read. [Local Docker builds are not release evidence](references/principles.md#local-docker-builds-are-not-release-evidence). |
38
+ | 4 — validate, then expose | [exposure.md](references/exposure.md) | **Approval to promote is not approval to expose.** The shift is separately authorized; identity, traffic split and verdict freshness are re-checked *after* the confirm. |
39
+ | 5 — route on the verdict | [routing.md](references/routing.md) | Pre-exposure failure = delete the 0% candidate: no incident, no version burned. Post-exposure = the confirmed rollback policy. |
40
+ | After a terminal step — write the handoff, profile the release | [handoff.md](references/handoff.md) · [postmortem.md](references/postmortem.md) | `report.mjs` saves the post-mortem at `done`/`discard`/`rollback` — **mandatory and automatic**, a *completeness* pass rather than a speed one. |
41
+ | The mechanism behind a rule you are applying | [principles.md](references/principles.md) | The rules are indexed below; what enforces each is there. |
42
+
43
+ **`references/why.md` is not on this list, and never is.** It is the archive — the derivation behind each rule — read when you **edit** this skill, never while running it.
44
+
45
+ **Transition history:** record correlated intent/result around every outward action; state events and clocks are writer-owned. Protocol: [principles](references/principles.md) · [run state](../resolve-issues/references/run-state.md).
46
+
47
+ ## Non-negotiable principles
48
+
49
+ The rules, verbatim. **They bind every step** — including one whose file you are reading in isolation, which is why they are here and not only in the reference. Their mechanisms: [principles.md](references/principles.md).
50
+
51
+ 1. **Every outward-facing action is covered by explicit authorization.**
52
+ 2. **Merge-readiness is verified against the tree, never the claim.**
53
+ 3. **Promotions fast-forward.**
54
+ 4. **Nothing the release lane runs against production mutates it — tenant or no tenant.**
55
+ 5. **The loop exits on observed production state, never on a claim.**
56
+ 6. **Rollback over live debugging — but most failures never need one.**
57
+ 7. **One release in flight per environment — the Release Attempt Lease.**
58
+ 8. **Combine into one promotion — never N individual promotions to production.**
59
+ 9. **`auto-when-green` pre-approves only behind a real gate, never on CI color alone.**
60
+ 10. **A version names a verified production SHA — and only production has versions.**
61
+ 11. **A promotion promotes a pinned candidate SHA — never a moving tip.**
62
+ 12. **The pipeline owns artifacts; the release lane owns exposure.**
63
+ 13. **An applicable gate that cannot run is a failure, not an absence.**
64
+ 14. **Where the target has durable processing, exposure is a *sequence*, not a routing change.**
65
+ 15. **Repeated failures owned by the lane's own tooling hold the version for release-design review.**
66
+
67
+ ## The release loop
68
+
69
+ Run it sequentially; read each phase file on arrival, not before.
70
+
71
+ **Emit the checkpoint summary at every step transition** — [`report.mjs <run-manifest.json>`](scripts/report.mjs). The operator's question never changes (what happened to production, what is authorized next), and rendering it from the manifest rather than from context is what survives a session dying. **A step reads `done` only when the manifest carries its evidence** — a passed marker with nothing recorded renders `undelivered`, deliberately not a synonym for done.
72
+
73
+ **The repair lane: a red target gate is fixed *inside* the attempt, not by abandoning it.** [Pre-flight item 0](references/preflight.md#item-0--run-the-readiness-probes-before-proposing-anything) surfaces tip colour before the envelope is proposed and owns the whole sequence; on BLOCKED, run [`ensure-target-green.mjs`](scripts/ensure-target-green.mjs), record `release.ensureGreen`, and keep the lease held.
74
+
75
+ | Step | What it does | File |
76
+ |---|---|---|
77
+ | — | **Pre-flight** — confirm the envelope (MANDATORY) | [preflight.md](references/preflight.md) |
78
+ | 0 | Intake: verify merge-readiness against the tree | [assembly.md](references/assembly.md) |
79
+ | 1 | Assemble the release (integration / release branch) | [assembly.md](references/assembly.md#1--assemble-the-release-integration--release-branch) |
80
+ | 1b | Cut version + CHANGELOG (production promotions only) | [assembly.md](references/assembly.md#1b--cut-the-version-and-changelog-production-promotions-only) |
81
+ | 2 | Promotion PR (`review-pr`, promotion mode) | [assembly.md](references/assembly.md#2--promotion-pr-skill-review-pr-promotion-mode) |
82
+ | 3 | Promote, build the candidate — **0% traffic, no exposure** | [candidate.md](references/candidate.md) |
83
+ | 4 | Validate, then **expose** (`smoke`), then the standalone display-version publication gate | [exposure.md](references/exposure.md) |
84
+ | 5 | Route on the verdict — tag and publish only after that gate accepts; otherwise discard or roll back | [routing.md](references/routing.md) |
85
+
86
+ ## Definition of done (handoff report)
87
+
88
+ Done means the handoff can be written from **recorded evidence**, not memory. Each item in full — including the three reported even when nothing went wrong — is [handoff.md](references/handoff.md), read at the terminal step.
89
+
90
+ - **Shipped SHA** + the revision verified live, with evidence from **both phases**: candidate ALIVE at 0%; the re-check fence's readings (verdict age vs the window, the revision the candidate URL resolved to, candidate at 0%, incumbent at 100%); the serving confirmation; health after the shift — each verdict saying which evidence was **fresh** and which **carried over** ([principle 11](#non-negotiable-principles)). On a failure: the **candidate-deletion record** (pre-exposure) or **rollback record** (post-exposure).
91
+ - **Quiescence record** — the pause order as executed, the proof's observed reading, the resume order as executed, the revision resumed against, and that resume was the **exact reverse** of pause. Where [pre-flight item 6](references/preflight.md#pre-flight-gate-confirm-the-authorization-envelope-mandatory) found **no durable processing, say so**: absent and declared-absent read alike otherwise.
92
+ - **Version identity** — version, bump and why, rc tags and attempts, final tag, CHANGELOG cut commit, notes link, and whether the version was **reused** or **burned**.
93
+ - **ensure-target-green**, the **post-release metadata PR**, **closed issues**, the **promotion PR** + fast-forward status, and the **assembly record**.
94
+ - **Authorization audit** — the envelope, what authorized each action, human confirm vs `auto-when-green`, and `envelope.exposureIdentity` **named on every release**, with any declared weakening.
95
+ - **Release-evidence bundle location on every terminal exit**, and on the verified path the GitHub Release it was attached to.
96
+ - **Post-mortem** — auto-saved at a terminal step; **adjudicate each finding** and file the rendered issue. A stalled release auto-saves nothing: run it by hand.
97
+ - Run manifest reflecting the final state.
98
+
99
+ ## Reference Map
100
+
101
+ Phase files are the routing table above. Everything else:
102
+
103
+ - **Version and tag** — [versioning.md](references/versioning.md) + [`version.mjs`](scripts/version.mjs) · [display version is not identity version](references/versioning.md#6-display-version-is-not-identity-version) + [`version-assert.mjs`](scripts/version-assert.mjs)
104
+ - **Verified-SHA GitHub Flow** (opt-in) — [verified-sha-github-flow.md](references/verified-sha-github-flow.md#verified-sha-github-flow-mode-contract) + [`metadata-sync.mjs`](scripts/metadata-sync.mjs)
105
+ - **Readiness before acting** — [`preflight-probes`](scripts/preflight-probes.mjs) · [`production-endpoints`](scripts/production-endpoints.mjs) · [`ensure-target-green`](scripts/ensure-target-green.mjs) ([pre-flight 0/0b](references/preflight.md#item-0--run-the-readiness-probes-before-proposing-anything))
106
+ - **The candidate** — [`watch-candidate-delivery`](scripts/watch-candidate-delivery.mjs) (mutates nothing) · [`candidate-identity`](scripts/candidate-identity.mjs) (fail-closed discovery, attested tuple)
107
+ - **Exposure gates** — [`green-gate`](scripts/green-gate.mjs) · [`rollback-floor`](scripts/rollback-floor.mjs) · durable processing at [principle 14](#non-negotiable-principles) + [pre-flight 6](references/preflight.md#pre-flight-gate-confirm-the-authorization-envelope-mandatory)
108
+ - **Terminal evidence** — [`close-attempt`](scripts/close-attempt.mjs) · [`evidence-bundle`](scripts/evidence-bundle.mjs) · the report contract in [handoff.md](references/handoff.md)
109
+ - **Holds and profiles** — [`rc-circuit-breaker`](scripts/rc-circuit-breaker.mjs) ([principle 15](#non-negotiable-principles)) · [`postmortem`](scripts/postmortem.mjs) + [postmortem.md](references/postmortem.md) · [`version-postmortem`](scripts/version-postmortem.mjs)
110
+ - **Modes** — [auto-when-green.md](references/auto-when-green.md) (unattended promotion) · [assembly.md](references/assembly.md#1--assemble-the-release-integration--release-branch) (merge-queue repo)
111
+ - **Other skills' seams** — [related-skills.md](references/related-skills.md)
112
+ - **Editing this skill** — [regression-checklist.md](references/regression-checklist.md) to grade it, [why.md](references/why.md) for a rule's history. **Neither is a runtime read.**