@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,202 @@
1
+ # Versioning, tagging, and the CHANGELOG
2
+
3
+ The release lane assigns a **version** to what it ships, records it in the **CHANGELOG**, and marks the shipped SHA with an immutable **tag**. [`scripts/version.mjs`](../scripts/version.mjs) is the mechanism and the **source of truth** for subcommands, flags, and exit codes — run `node <resolve-release>/scripts/version.mjs --help` for the authoritative list (the file header carries the invariants and points at `--help` for the case list, so there is no second copy to drift) rather than hand-rolling `git tag`. This file holds the **doctrine the script does not encode**: the policy behind the mechanism, and the judgment an agent still owns. Several rules below are unrecoverable once violated on a remote.
4
+
5
+ ## 1. Versions exist only on production
6
+
7
+ **A version, a tag, and a CHANGELOG cut are created only when promoting into the production branch.** A dev/staging release is **unversioned** — identified by its **SHA** (and the platform's revision id), which the deploy, the smoke run, and any rollback already reference.
8
+
9
+ This is not style. A version is a **public promise about an immutable artifact**: consumers pin it, incident reports cite it, rollback targets it. `dev` redeploys many times a day, so versioning it either produces meaningless churn (`v1.5.0-dev.47`) or mints a version that later diverges from the `v1.5.0` that actually reaches production. `version.mjs` enforces this: `plan`, `changelog`, `rc`, and `tag` **exit 3** (a normal outcome the loop branches on, not an error) when the target is not the production branch.
10
+
11
+ ### Exit codes
12
+
13
+ An agent branches on these, so each carries exactly one meaning; an overloaded code — 3 meaning both "skip versioning" and "already cut" — would make a resuming run silently ship production untagged. That one-meaning-per-code invariant is the judgment this file owns; the four codes and their exact triggers are the script's — `node <resolve-release>/scripts/version.mjs --help` is the authoritative case list (**exit 3** is "not a production promotion, and nothing else", the normal dev-release outcome §1 branches on).
14
+
15
+ ## 2. The CHANGELOG has two zones — that is why dev needs no version
16
+
17
+ A CHANGELOG is not a list of versions. It has an **unversioned zone** (`## [Unreleased]`, where changes accumulate as they merge to dev) and a **versioned zone** (`## [1.5.0] — 2026-07-10`, minted once at the promotion). A change is written down when it lands and *versioned* when it ships — different moments, and the two zones are how one file holds both. At the promotion the **cut** renames the accumulated content under a `## [1.5.0] — <date>` heading and leaves `Unreleased` empty.
18
+
19
+ Two ways to populate the section, both supported by `version.mjs changelog`, and they compose:
20
+
21
+ - **Derived** (default, zero per-PR discipline) — the cut renders entries from the constituent PRs' conventional-commit titles (`feat(billing): partial refunds` → `### Added`), linking each PR and the issues it closes.
22
+ - **Accumulated** (opt-in per repo) — PRs hand-write entries under `Unreleased`; the cut **carries that body into the versioned section**, merged with the derived entries.
23
+
24
+ **Carrying is an invariant, not a nicety.** A hand-written note that no PR title captured must survive the cut; discarding the `Unreleased` body would silently delete the most considered lines in the file.
25
+
26
+ ## 3. The cut lands on the release branch, before the promotion
27
+
28
+ The version bump + CHANGELOG cut is a **commit on the assembled release branch** (step 1b), never a commit onto the production branch after merging. This is forced by [principle 3](../SKILL.md#non-negotiable-principles): **promotions fast-forward**. A commit created on `main` *after* the promotion merges puts a commit on the base that the head lacks, so the next promotion is no longer fast-forwardable and `review-pr`'s promotion mode (correctly) rejects it. Cutting on the release branch keeps this promotion a clean fast-forward and makes the shipped SHA the exact SHA whose CHANGELOG says it shipped.
29
+
30
+ Under the pinned-candidate model ([principle 11](../SKILL.md#non-negotiable-principles)) the release branch is cut at the candidate SHA while `dev` keeps moving, so the cut commit reaches `main` but **not** `dev` — which is why the post-release back-merge `main → dev` is a standard step-5 action, and until it lands the next promotion cannot fast-forward. Anything else the repo carries a version in (`package.json`, `pyproject.toml`, a `VERSION` file, chart/image tags) is bumped **in that same commit**.
31
+
32
+ ## 4. Tags are immutable
33
+
34
+ The tag is **annotated** (`git tag -a`, carrying a releaser and date), created on the promoted SHA, and never touched again.
35
+
36
+ - **Never move a tag.** Re-tagging the *same* SHA is a resume-safe no-op; a *different* SHA exits 1. There is deliberately no `--force`.
37
+ - **Never delete a published tag.** Anyone who fetched, pinned, or built from it now disagrees with the repo about what `v1.5.0` means.
38
+ - **Never reuse a burned version** (§5).
39
+ - A tag must name a SHA that is an **ancestor of the production branch** — `tag --production-branch main` refuses otherwise, so a tag can never name a revision that was never promoted. The ancestry check **fetches the remote tip first** and resolves against `origin/<production-branch>` (identity-v0.4.1): a stale local `main` is not evidence the promotion has not landed. A **failed fetch fails closed** — a pre-existing (possibly stale) remote-tracking ref is never trusted as a stand-in for a fresh tip.
40
+ - **Tag pushes are not stack pushes.** `version.mjs rc|tag --push` pushes the fully-qualified `refs/tags/<tag>` with `--no-verify`, because a Mergify stacks pre-push hook that rewrites `git push` into `mergify stack push` is correct for branch heads and wrong for immutable release tags (identity-v0.4.1). Do not re-discover `git push --no-verify origin refs/tags/…` by hand; the script owns that path.
41
+
42
+ ### Trigger-owned builds are probed before RC mint
43
+
44
+ A tag-triggered production build and a controller-submitted build are distinct topologies. Passing `_DEPLOYED_VERSION` to `gcloud builds submit` does not establish that Cloud Build receives it when its **`TAG_NAME` trigger** fires. Before `version.mjs rc` can create an immutable tag, `preflight-probes.mjs check --json` must contain a ready `rc-tag-topology` record with `prodBuildTrigger: "tag-trigger"`, `versionSource: "TAG_NAME"`, and `candidateTagSource: "TAG_NAME"`. Its representative substitutions prove the exact path: `TAG_NAME` is an RC tag; `_DEPLOYED_VERSION` is that tag's final SemVer; and `_CANDIDATE_TAG` is that RC tag. The RC command consumes this file with `--topology-probe` and fails closed on a missing, unreadable, unknown, or mismatched record.
45
+
46
+ That record is about the **trigger-owned** candidate. A dev image keyed only by source SHA may be useful diagnostic information, but it is not RC candidate evidence and cannot refuse a candidate lane as already published. RC candidate evidence begins only after the immutable RC tag, its triggered build, and the candidate revision/tag are bound together.
47
+
48
+ ## 5. The invariant, the trigger, and the burn
49
+
50
+ **The invariant: the final tag is created after verification.** `v<version>` is minted once post-deploy verification passes ([step 5](routing.md#5--route-on-the-verdict)), so **it always names a revision observed serving production** — [principle 5](../SKILL.md#non-negotiable-principles) (the loop exits on observed state) applied to the version.
51
+
52
+ What varies between repos is not *when* the version tag is cut but **how the production deploy is triggered** — four shapes, declared at the pre-flight gate ([item 5](preflight.md#pre-flight-gate-confirm-the-authorization-envelope-mandatory)) as `envelope.deployTrigger`. **Undeclared is a refusal**, not a default: the fourth shape exists precisely so a repo that fits none of the first three has something to declare instead of sliding onto the legacy row.
53
+
54
+ | Deploy trigger | `envelope.deployTrigger` | rc at step 3 | Final `v<version>` tag | If the release fails |
55
+ |---|---|---|---|---|
56
+ | **Branch push** (`main`) | `branch-push` | none | after verification | No version claim was published — the retry **reuses** the version. |
57
+ | **`v*-rc.*` tag** (default where a tag must trigger the deploy) | `rc-tag` | minted | after verification | Same: rc tags carry no promise, so the retry **reuses** the version at the next rc. |
58
+ | **Final `v<version>` tag** *(legacy)* | `final-tag` | none | before deploy — it *is* the trigger | **The version is burned.** |
59
+ | **No deployed surface** — a versioned artifact nobody deploys (library consumed by tag, skills installed by symlink, schema package) | `no-deploy` | none | after verification | Nothing was deployed, so nothing is burned — the retry **reuses** the version. |
60
+
61
+ **The `no-deploy` shape makes [steps 3–4](candidate.md#3--promote-then-build-the-candidate-no-exposure-yet) a decided `n/a`** — no rc, no candidate revision at 0%, no 4a smoke against a candidate URL, no traffic shift, no 4b serving confirmation — and it owes `envelope.deployTriggerReason` naming *what* the artifact is and *how* consumers take it, so the `n/a` is checkable rather than a skip. Everything outside those two steps is unchanged: the promotion is authorized, the Release Attempt Lease opens and closes, the final tag is still cut only after verification, and every terminal exit still emits its evidence bundle. What stands in for the deploy observation is the consumer-facing read — the artifact resolvable at the tag the way consumers take it — because [principle 5](../SKILL.md#non-negotiable-principles) has no topology exemption.
62
+
63
+ **And the bundle this shape emits carries *that* evidence, not a deployment's** (#604). The required set is a property of `(terminal state × trigger shape)`: on `no-deploy`, `released` owes the immutable final tag (`releaseTag`), the Release reference (`releaseRef`) and the verification standing in for the two observations (`verification` — CI plus the full suite on the tagged SHA, and the consumer-facing read above); a failed attempt owes the verification that stopped it and the cleanup record, and no tag at all, because the tag is cut only *after* verification on this shape. It must carry **none** of the five deployment artifacts (`candidateReceipt`, `candidateVerdict`, `approval`, `trafficTransition`, `liveVerdict`) — asserting a traffic transition on a shape with no traffic is the fabrication the bundle already refuses, read per shape instead of per state. The deployed shapes are untouched: requiring what a shape cannot produce made the bundle unemittable there, and that is what was fixed — **not** the requirement itself, which is exactly as strict on every shape that deploys.
64
+
65
+ **Release-candidate tags** exist to solve one problem: a pipeline triggerable only by a tag would otherwise force the version tag to precede verification, burning a version on every failed attempt. `v<version>-rc.<n>` decouples the two — a **deploy trigger, not a version claim**. Minted at [step 3](candidate.md#3--promote-then-build-the-candidate-no-exposure-yet) with `version.mjs rc`, once per candidate SHA by default (a same-SHA re-run prints the existing rc rather than firing a second build). After a verified terminal failure, use `--retry-from <prior-rc-tag>` to mint the next immutable RC for the same eligible SHA; a repeated invocation with that predecessor resumes the retry tag instead of minting another one. An rc is **never a baseline**, never published as a Release, never a collision against the final tag. The trigger pattern must match `v*-rc.*` and **not** the final tag, or minting `v1.5.0` at step 5 fires a pointless second build against an already-verified release.
66
+
67
+ **A burned version** is one whose tag reached a remote but never survived to serve production. Under the three shapes that tag after verification (`rc-tag`, `branch-push`, `no-deploy`) this **cannot happen** — that is their whole point. It applies only to the legacy shape, where two doors burn identically: the **build failed** (nothing deployed) or the **verification failed** (deployed, unhealthy, rolled back) — "prod was never touched" is true of the first and irrelevant, because the tag is public regardless. A burned version is never reused, never deleted, never re-pointed; the next attempt takes the next patch (`v1.5.0` burned → the fix ships as `v1.5.1`). Nothing extra tracks this — **tag immutability enforces the burn**: `plan` exits 1 when the computed final tag already exists, so the human decides resume vs bump. A burn is *visible*: the tag exists, but no GitHub Release was ever published (the Release is created only on verified-done, [step 5](routing.md#5--route-on-the-verdict)).
68
+
69
+ **Withdrawn CHANGELOG entries.** On the legacy path the cut commit is already on `main` when a rollback happens, so the CHANGELOG claims `v1.5.0` shipped and it didn't. **Do not delete the section** — the CHANGELOG is append-only, and deleting it erases the only public record that the version existed. `version.mjs withdraw --version 1.5.0 --incident '#77'` annotates it in place, in the same commit that cuts the *next* version. (Under the three tag-after-verify shapes the cut commit is on `main` too, but no tag or Release claims the version shipped, so the retry simply reuses it and no annotation is needed.)
70
+
71
+ ### Adopting the lane in a repo that already releases
72
+
73
+ The pre-flight *declares* the trigger shape; **changing** it is where a repo is more exposed than during any release it will ever run. For an interval, the old trigger and the new one are both armed — one push, two production builds, finishing in whatever order they finish and leaving prod on an arbitrary revision — principle 8's out-of-order-builds hazard, arriving from a trigger no authorization covers. The sequence below exists to make that interval **zero-length**, and that is the invariant it protects: **never two live production triggers.**
74
+
75
+ 1. **Land the new machinery inactive.** Workflow, pipeline changes, tests — merged while the existing production trigger stays exactly as it was. Nothing new can fire yet.
76
+ 2. **Verify the new deploy identity read-only.** Whatever authenticates the new path (OIDC/workload-identity federation, a service account, a deploy key) proves it can *read* before it is capable of mutating anything.
77
+ 3. **Make tag immutability real — before the trigger moves.** [Principle 10](../SKILL.md#non-negotiable-principles) and §4 state it, and `version.mjs` refuses to violate it — but neither can stop anything *else* in the repo from moving or deleting a tag. A **tag ruleset over `v*` — creation allowed, update and deletion blocked** — can, and it covers both tag classes: an rc is a trigger, not a disposable label. The ordering is the point, and it holds in either direction: tags are load-bearing under every shape — firing production under the tag shapes, standing as the sole version claim under branch push and no-deploy — so the switch always changes what the lane leans on tags for, and it must not do that while anything else can still move or delete one. The ruleset precedes the switch, never follows it.
78
+ 4. **Switch the trigger atomically.** One change that disarms the old path and arms the new one, never two changes with a window between them.
79
+ 5. **Prove the whole path with one controlled release** — a real promotion carried through candidate, validation, exposure, and verification. A dry run proves the pieces, not the path.
80
+ 6. **Retire the old controls only after that proof** — legacy trigger config, superseded branch rules, obsolete promotion workflows.
81
+
82
+ Three ways this goes wrong, each of them reopening the interval: switching the trigger first, tolerating overlapping production triggers "briefly", and deleting the old rules before step 5 has proven what replaced them.
83
+
84
+ ## 6. Display version is not identity version
85
+
86
+ A release carries **two** version strings, and conflating them is what leaves UI and `/api/health` showing the attempt tag after the final claim has been verified:
87
+
88
+ - **Identity version** — the immutable tag or SHA that names what is running. Under rc-tag topology this is often `v<version>-rc.<n>`, because that tag is the **deploy trigger**. It is what `candidate-identity.mjs` attests (`sourceSha`, `revision`, `imageDigest`) and what the release lane uses for routing, rollback, and the final tag.
89
+ - **Display version** — the string the running service prints in UI and `/api/health` for operators. After a verified release this should be the **final semver** (`v<version>`), not the rc trigger tag, unless the repo deliberately chooses otherwise.
90
+
91
+ The release lane declares which one the service should show via `envelope.displayVersionPolicy`:
92
+
93
+ | Policy | Meaning | Default context |
94
+ |---|---|---|
95
+ | `final-semver` | UI/health show the final release version (`vX.Y.Z`). | **Default for `rc-tag` topology**, where the trigger tag is not the public version. |
96
+ | `trigger-tag` | UI/health show the tag that fired the deploy (`vX.Y.Z-rc.N`). | Opt-in for repos that want dashboards to name the attempt. |
97
+ | `short-sha` | UI/health show the short SHA. | Opt-in for repos whose meaningful identity is the commit. |
98
+
99
+ The default is **per topology**: `rc-tag` defaults to `final-semver`; other topologies have no default — the pre-flight gate must declare the policy, or the lane refuses. On `rc-tag` an omitted `displayVersionPolicy` resolves to `final-semver`, and the assertion script still checks the result: a service that shows the attempt tag is refused unless a declared exception is recorded.
100
+
101
+ **Asserting the policy.** After the traffic shift, step 4b's serving confirmation already reads `/health` for the identity tuple. The same health JSON is passed to [`scripts/version-assert.mjs`](../scripts/version-assert.mjs). Pass `--policy` explicitly, or, under `rc-tag`, pass `--deploy-trigger rc-tag` and let the script resolve the default:
102
+
103
+ ```bash
104
+ node <resolve-release>/scripts/version-assert.mjs serving \
105
+ --health serving-health.json \
106
+ --settings serving-settings.json \
107
+ --frontend-asset frontend-asset-version.json \
108
+ --policy final-semver \
109
+ --version "$NEXT_VERSION" \
110
+ --trigger-tag "$RC_TAG" \
111
+ --sha "$SHIPPED"
112
+
113
+ # Equivalent under rc-tag: --deploy-trigger rc-tag resolves to --policy final-semver
114
+ node <resolve-release>/scripts/version-assert.mjs serving \
115
+ --health serving-health.json \
116
+ --settings serving-settings.json \
117
+ --frontend-asset frontend-asset-version.json \
118
+ --deploy-trigger rc-tag \
119
+ --version "$NEXT_VERSION" \
120
+ --trigger-tag "$RC_TAG" \
121
+ --sha "$SHIPPED"
122
+ ```
123
+
124
+ ### Standalone mandatory publication gate
125
+
126
+ `version-assert.mjs serving` is a **standalone mandatory gate** between post-shift serving confirmation and step 5 publication. Its three JSON inputs are the post-shift `/health` version, the post-shift `/settings` version, and the frontend asset version; under `final-semver`, **all three must equal the final SemVer**. Capture the command's JSON result and exit code as `release.versionAssert`. Exit **0** is the only result that permits step 5. Exit **1** is a refusal: **stop immediately** and do not mint the final tag or create the GitHub Release. Exit **2** is an unrunnable gate and also stops the release under principle 13.
127
+
128
+ Run the assertion as its own process. **Do not place `&&`, `||`, `;`, or `|` after `version-assert.mjs`, and do not combine it with smoke, status, or informational commands in a shell chain.** A JSON `decision:"refuse"` is not a prompt for human interpretation or a successful command result; the nonzero exit is the release decision. The tag mint and GitHub Release publication path must refuse unless the recorded gate result is `decision:"accept"` with exit code 0.
129
+
130
+ A repo that genuinely needs a mismatch records an explicit exception at pre-flight:
131
+
132
+ ```bash
133
+ node <resolve-release>/scripts/version-assert.mjs serving \
134
+ --health serving-health.json \
135
+ --settings serving-settings.json \
136
+ --frontend-asset frontend-asset-version.json \
137
+ --policy final-semver \
138
+ --version 0.5.0 \
139
+ --record-mismatch "legacy UI embeds rc tag until next major; accepted per #822-exception"
140
+ ```
141
+
142
+ The exception is part of the authorization envelope (`envelope.displayVersionPolicyException`) and is emitted into the evidence bundle so a post-incident read can see that the mismatch was declared, not accidental.
143
+
144
+ **Consumer pipeline: strip, do not fire twice.** Under `rc-tag` topology the consumer build pipeline (e.g. Cloud Build) receives `vX.Y.Z-rc.N` as the trigger and must set `DEPLOYED_VERSION` to the final `vX.Y.Z` for the service to display — **without also firing a deploy on the final `vX.Y.Z` tag**. The pattern that does this is the consumer pipeline's responsibility, not this skill's; it is documented at `skyee#1558`. Do not re-implement it here. The release lane's only job is to assert that the resulting display version matches `envelope.displayVersionPolicy`.
145
+
146
+ ## 7. The bump is computed from the release content, then confirmed
147
+
148
+ `version.mjs plan` reads the constituent PRs and derives the bump — it never guesses, and never decides alone: the computed version is proposed at the [pre-flight gate](preflight.md#pre-flight-gate-confirm-the-authorization-envelope-mandatory) and enters the authorization envelope.
149
+
150
+ | Release contains | Bump | Under `0.x` |
151
+ |---|---|---|
152
+ | a breaking change (`feat!:`, `BREAKING CHANGE:` in the body, or a `breaking` label) | **major** | minor |
153
+ | a new feature (`feat:`) | **minor** | minor |
154
+ | fixes / internal changes only | **patch** | patch |
155
+
156
+ Before 1.0, breaking changes take a minor bump (the public contract is still unstable) and non-breaking features also take a minor bump (a new capability is never presented as a patch fix); `--strict` disables only that pre-1.0 convention. The baseline is the highest release tag **merged into the production branch** — prerelease tags (`v1.5.0-rc.1`) are never a baseline, because an rc names an attempt, not a shipped release, so treating one as the baseline would advance the version on a release that may never have survived validation.
157
+
158
+ **A major bump always forces a human confirm**, even under [`auto-when-green`](auto-when-green.md): breaking a published contract is irreversible for consumers who have already pinned it.
159
+
160
+ ## 8. Artifacts carry the same version
161
+
162
+ If the pipeline builds a container image or a package, it is tagged with the **same version string and the same SHA** the git tag names. A `v1.5.0` tag pointing at `abc123` while the deployed image is `:latest` built from `def456` means the version identifies nothing — and rollback has no target.
163
+
164
+ `version.mjs verify` ties tag, shipped SHA, and live revision together. **It only applies where the final tag already exists** — the legacy path, at [step 4](exposure.md#4--validate-the-candidate-then-expose-it-skill-smoke). Under the three tag-after-verify shapes there is no final tag at step 4 (`verify` would exit 1), because it is created in step 5 after the live revision is confirmed; there the equivalent check is step 4b's serving-revision confirmation against the promoted SHA.
165
+
166
+ ## 9. Monorepos
167
+
168
+ A single repo-wide version is the default and is what `version.mjs` implements. If the repo publishes independently-versioned packages, the release lane still cuts **one** release (principle 8 — one promotion, one deploy); per-package versions are the packaging tool's job (changesets, Lerna, `uv`), invoked from the same cut commit. Do not fan out N promotions to version N packages.
169
+
170
+ ## Output contracts
171
+
172
+ `version.mjs rc` and `version.mjs tag` have the same output modes. Their default stdout is exactly one tag followed by a newline, which is safe for command substitution. Pass `--json` when a caller needs the stable object `{tag, sha, pushed, resumed}`: `sha` is the resolved commit, `pushed` says whether this invocation pushed the tag, and `resumed` says whether the desired immutable tag already existed. First execution, local resume, pushed convergence, cross-clone resume, and dry-run all retain those four keys. Human diagnostics go to stderr and never contaminate either stdout payload.
173
+
174
+ `version.mjs changelog --dry-run` requires an explicit output mode. `--format markdown` writes the complete planned CHANGELOG file to stdout. `--format json` writes `{version, file, noop, markdown}`, where `markdown` is that same complete file and `noop` identifies a resume-safe already-cut plan. Diagnostics, including an already-cut resume notice, use stderr. Neither dry-run mode writes the file.
175
+
176
+ ```bash
177
+ RC_TAG=$(node <resolve-release>/scripts/version.mjs rc --version <v> --sha <shipped> \
178
+ --target-branch <prod> --production-branch <prod> --push)
179
+ node <resolve-release>/scripts/version.mjs tag --version <v> --sha <shipped> \
180
+ --target-branch <prod> --production-branch <prod> --push --json \
181
+ > final-tag.json
182
+ node <resolve-release>/scripts/version.mjs changelog --version <v> --date <YYYY-MM-DD> \
183
+ --changes <prs.json> --target-branch <prod> --production-branch <prod> \
184
+ --dry-run --format json > changelog-plan.json
185
+ ```
186
+
187
+ ## Command reference
188
+
189
+ The subcommands, flags, and exit codes are the script's own — run `node <resolve-release>/scripts/version.mjs --help` (the file header points there too, rather than restating them); do not transcribe them here, where they drift. (Recall §1: `--target-branch`/`--production-branch` are required on `plan`, `changelog`, `rc`, and `tag`, and `--target-branch` is the branch you are *promoting into* — production on a promotion, staging on a dev release, where those commands exit 3.)
190
+
191
+ Two related scripts live beside `version.mjs` rather than inside it, because each owns a distinct release-lane check:
192
+
193
+ - [`scripts/build-changes.mjs`](../scripts/build-changes.mjs) — builds the `--changes` JSON `version.mjs plan` consumes from raw `gh pr view --json` output. Do **not** hand-transform `gh pr view --json` for this; run `node <resolve-release>/scripts/build-changes.mjs --help` for the flags. Pipe it straight into `plan`/`changelog`:
194
+
195
+ ```bash
196
+ node <resolve-release>/scripts/build-changes.mjs <pr>… \
197
+ | node <resolve-release>/scripts/version.mjs plan --target-branch <b> --production-branch <b> --changes -
198
+ ```
199
+
200
+ - [`scripts/version-assert.mjs`](../scripts/version-assert.mjs) — asserts the running service's **display version** matches the `envelope.displayVersionPolicy` declared at pre-flight (or the `rc-tag` default resolved by `--deploy-trigger rc-tag`). Run `node <resolve-release>/scripts/version-assert.mjs --help` for the policy list and the mismatch-exception flag.
201
+
202
+ **Why a script and not a `gh`→`jq` one-liner** — the hand recipe fails *silently* two ways while `plan` still looks correct: it drops every `closes #n` link (gh emits no `issues` field for the notes to link from; the `number`→`pr` rename is a separate fix), and it lets a `BREAKING CHANGE:` living only in a PR body escape the bump (it never fetches `body`) — a silently under-versioned release. `build-changes.mjs --help` carries the full #407/#408 rationale (the rename + `issues` derivation, and the `body` fetch); it is the source of truth for what the script fixes.
@@ -0,0 +1,53 @@
1
+ # Why — the reasoning behind the release rules
2
+
3
+ **Not a runtime file. Never read this during a release.** It is the archive: the derivations, the measurements, and the incidents that produced the rules, kept so a rule can be re-judged rather than re-litigated and so an edit knows what it is deleting. Read it when you **edit this skill** or audit a decision. The runtime files state what to do; this one says why, and a release that stops to read it is spending its context on history. Keeping it off the loop is also what lets it grow — nothing here competes for the budget the runtime files live under.
4
+
5
+ The rules themselves are [principles.md](principles.md) (the non-negotiables) and the phase files. This is only their reasoning.
6
+
7
+ ## Why the handoff reports a thing even when nothing went wrong
8
+
9
+ Three items in the [definition of done](../SKILL.md#definition-of-done-handoff-report) are reported unconditionally, and each is unconditional for the same reason: **a record that appears only when something is wrong is indistinguishable from one nobody kept.**
10
+
11
+ - **The exposure identity.** `envelope.exposureIdentity` is named on every release, not only the weakened ones. An audit that names the identity only when a weakening applies reads exactly like an audit that never looked — the reader cannot tell "checked, and it was clean" from "not checked".
12
+ - **The release-evidence bundle location.** Reported on every terminal exit, not only the verified one. A failed attempt's bundle is what makes that failure reachable months later without this session; an unstated location reopens the session-scoped hole #441 closed.
13
+ - **The quiescence record, including its absence.** Where pre-flight item 6 declared *no* durable processing, the report says so. An absent record and a declared-absent one read identically otherwise, and only one of them means the question was asked.
14
+
15
+ The quiescence record also states plainly that the resume order was the exact reverse of the pause order. That sentence is the one claim a reader can check against the two lists the report just gave them — everything else in the record has to be taken on trust.
16
+
17
+ ## Why the post-mortem is adjudicated, not just saved
18
+
19
+ `report.mjs` computes and saves the post-mortem at every terminal step, so the artifact is never the missing piece — the *adjudication* is. **An unadjudicated finding is not a result**: it is a sentence somebody may read. Each finding gets a line and the rendered issue gets filed (`--issue`).
20
+
21
+ A release that **stalled** never reaches a terminal step, so nothing auto-saves — which is exactly the case worth profiling, because "it stalled" is one of the findings. Run `report.mjs <manifest> --postmortem` by hand there.
22
+
23
+ It profiles **completeness, not speed**. What this lane loses when it goes wrong is not minutes; it is the record of what happened to production.
24
+
25
+ ## Why this file exists at all
26
+
27
+ `resolve-release` had no archive: every rule carried its own derivation inline, so the checklist rows and the phase files each grew a chain of *because* clauses — "the key is the attempt id, not the rc tag, because three of the four declarable shapes mint no rc"; "that scope is exact, not hedged". The reasoning is worth keeping and worth citing. It is not worth re-reading on every release, and a rule stated with three sentences of defence takes longer to find than one stated plainly with a pointer.
28
+
29
+ ## Why the bundle key is the attempt, not the version
30
+
31
+ The release-evidence bundle is keyed `(attempt id, terminal state)`, and the id is `<version>-attempt.<n>` rather than the rc tag or the version. Three separate pressures put it there, and each was found the hard way:
32
+
33
+ **An rc-keyed bundle was unemittable on most shapes (#599).** Three of the four declarable trigger shapes mint no rc at all, so a key derived from the rc tag left those releases with no key — and therefore no record — at every terminal exit.
34
+
35
+ **A version-keyed bundle loses the retry it exists to explain.** A retry re-cuts the same version at the same terminal state, so a version key collides with the attempt it is retrying, and immutability then refuses the *second* failure's diagnosis. The record that survives is the one nobody needed.
36
+
37
+ **The collision had four routes, not one, and fixing them singly is how the class survived two review rounds.** A `validate` that accepts a key `emit` cannot write tells the operator a durable record is good by the only command that could have warned them. A mint that fails **open** on an unreadable durable dir hands back an ordinal already spent. A `path` that reports "no bundles" off a dir it never read is how an operator concludes a spent key is free. And `emit` backstops none of them, because `(id, state)` immutability is deliberately permissive *across* states — one attempt legally reaches two — so two different attempts sharing an id and exiting at different states are written with no refusal anywhere.
38
+
39
+ **The scope is stated exactly rather than hedged**, and that honesty is load-bearing: the mint is collision-free against **closed** attempts, because a bundle exists only after a terminal exit. In-flight attempts do not move the ordinal — the lease precondition (mint only on `free`) is what closes that route — and genuinely concurrent mints before either emits are #509's deferred atomicity. A blanket "collision-free by construction" would be a claim the code cannot deliver, and a checklist grades the claim.
40
+
41
+ **The required set is per `(terminal state × trigger shape)`, not per state (#604)** — otherwise principle 5's "every terminal exit" quietly excludes a shape the pre-flight itself offers: a no-rc, no-deploy shape owing five artifacts only a deployment produces can satisfy no exit, so the release ships with no bundle at all. The widening that fix invites is the mirror failure, which is why an unknown or undeclared shape takes the **deployed** set rather than the smaller one.
42
+
43
+ ## Why the pin grades differently per topology
44
+
45
+ The candidate pin means three different things depending on the branch topology, and the checklist grades it three ways because grading it one way marks correct runs wrong.
46
+
47
+ **GitFlow** is the shape the rule was written in: the promotion head is a release branch cut at a candidate SHA, and `main → dev` back-merges after every production release so the next candidate descends from it.
48
+
49
+ **Generic GitHub Flow (`release/<slug>`)** has no `dev` to back-merge into, and the shipped SHA is the release branch *rebased* onto `main` — so it carries commits that never earned a verdict. The pin is therefore only a pre-filter there, and step 4a's candidate validation is the real gate. Claiming the GitFlow-strength guarantee for that SHA overclaims evidence nobody produced.
50
+
51
+ **Trunk + merge queue** looks like the same single-branch shape and is not: nothing is rebased, so the SHA that earned the verdict is the SHA that ships. The pin is a Trunk Integration Verdict on that exact trunk SHA and does **not** demote. Reading "single-branch" off the shape and demoting it is the mirror error — a correct run graded wrong — and demanding a back-merge into a branch that does not exist is the same mistake pointed the other way.
52
+
53
+ Underneath all three sits principle 11's split: a SHA determines the *tree*, so build and test evidence survives the branch moving on. It does not determine the environment, so identity, remote-service, scheduler, deployment, preview and active-endpoint observations are never inherited across a matching SHA. A verdict that cannot say which half it is carrying is not evidence — an absent observation counted as a satisfied one is exactly how a green verdict ends up unable to name what anybody saw.