@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,135 @@
1
+ #!/usr/bin/env node
2
+ // close-attempt — ordered terminal release closeout with durable evidence.
3
+ //
4
+ // The released path has finalize-release.mjs because it needs a larger verification transaction.
5
+ // This command owns the corresponding failed pre-candidate path: validate the bundle and lease
6
+ // transition, emit the immutable top-level record, then commit the manifest close. A malformed or
7
+ // conflicting bundle leaves the attempt open, so the rc circuit breaker can never depend on an
8
+ // operator remembering a separate emit command after recording a failure.
9
+
10
+ import fs from 'node:fs'
11
+
12
+ import { isMainModule } from '../../engineering-runtime/scripts/main-module.mjs'
13
+ import {
14
+ ATTEMPT_CLOSE_CAUSES,
15
+ readManifest,
16
+ recordReleaseAttemptState,
17
+ writeManifest,
18
+ } from '../../resolve-issues/scripts/run-state.mjs'
19
+ import { bundleKey, emitBundle, validateBundle } from './evidence-bundle.mjs'
20
+
21
+ const FAILED_PRE_CANDIDATE = 'failed-pre-promotion'
22
+ const nonEmpty = (value) => typeof value === 'string' && value.trim() !== ''
23
+ const isObject = (value) => value != null && typeof value === 'object' && !Array.isArray(value)
24
+
25
+ const USAGE = `close-attempt — close a failed pre-candidate release attempt and emit its durable bundle.
26
+
27
+ Usage:
28
+ close-attempt.mjs <run-manifest.json> --bundle <release-evidence.json>
29
+ --dir <durable-evidence-dir> --state failed-pre-promotion --evidence <verified-cleanup>
30
+
31
+ The command validates that the bundle belongs to the manifest's open attempt, validates the
32
+ release-attempt close, emits the immutable top-level bundle, then writes the terminal attempt
33
+ state. It refuses before the manifest write when the bundle is incomplete, fabricated, stale, or
34
+ conflicts with an existing bundle for the same (attempt id, terminal state).
35
+
36
+ Candidate delivery failures that end before a candidate exists use this command after the
37
+ verified no-candidate/cleanup observation. The emitted bundle has failurePhase pre-candidate and
38
+ is discoverable by version-postmortem.mjs and rc-circuit-breaker.mjs.`
39
+
40
+ function parseArgs(argv) {
41
+ const positional = []
42
+ const options = { bundle: null, dir: null, state: null, evidence: null }
43
+ for (let index = 0; index < argv.length; index += 1) {
44
+ const arg = argv[index]
45
+ if (arg === '--help' || arg === '-h') return { help: true, positional, options }
46
+ if (arg.startsWith('--')) {
47
+ const key = arg.slice(2)
48
+ if (!Object.hasOwn(options, key)) throw new Error(`unknown argument ${arg}`)
49
+ const value = argv[++index]
50
+ if (value === undefined || value.startsWith('--')) throw new Error(`${arg} needs a value`)
51
+ options[key] = value
52
+ } else {
53
+ positional.push(arg)
54
+ }
55
+ }
56
+ return { help: false, positional, options }
57
+ }
58
+
59
+ function readJson(file, label) {
60
+ if (!nonEmpty(file)) throw new Error(`${label} is required`)
61
+ try {
62
+ return JSON.parse(fs.readFileSync(file, 'utf8'))
63
+ } catch (error) {
64
+ throw new Error(`${label} is not readable JSON: ${file} (${error.message})`)
65
+ }
66
+ }
67
+
68
+ export function closeAttempt({ manifest, bundle, dir, state, evidence }) {
69
+ if (!isObject(manifest) || manifest.skill !== 'resolve-release') {
70
+ throw new Error('run manifest must be a resolve-release manifest')
71
+ }
72
+ if (state !== FAILED_PRE_CANDIDATE) {
73
+ throw new Error(`close-attempt only closes ${FAILED_PRE_CANDIDATE}; got ${JSON.stringify(state)}`)
74
+ }
75
+ if (!nonEmpty(dir) || !nonEmpty(evidence)) throw new Error('--dir and --evidence are required')
76
+
77
+ const attempt = manifest.release?.attempt
78
+ if (!isObject(attempt) || !nonEmpty(attempt.id)) throw new Error('release.attempt with an immutable id is required')
79
+ if (bundleKey(bundle) !== attempt.id) {
80
+ throw new Error(`bundle attempt id ${JSON.stringify(bundleKey(bundle))} does not match manifest attempt ${JSON.stringify(attempt.id)}`)
81
+ }
82
+ if (bundle.terminalState !== state || bundle.closedBy !== ATTEMPT_CLOSE_CAUSES[state]) {
83
+ throw new Error(`bundle must declare ${state}/${ATTEMPT_CLOSE_CAUSES[state]}`)
84
+ }
85
+ if (attempt.rcTag != null && bundle.rcTag !== attempt.rcTag) {
86
+ throw new Error('bundle rcTag does not match the manifest attempt rcTag')
87
+ }
88
+ if (manifest.envelope?.deployTrigger != null && bundle.deployTrigger !== manifest.envelope.deployTrigger) {
89
+ throw new Error('bundle deployTrigger does not match the manifest envelope')
90
+ }
91
+ if (manifest.release?.candidateSha != null && bundle.sha !== manifest.release.candidateSha) {
92
+ throw new Error('bundle sha does not match release.candidateSha')
93
+ }
94
+
95
+ const validation = validateBundle(bundle)
96
+ if (!validation.valid) throw new Error(`invalid bundle: ${validation.failed.join(', ')}`)
97
+ const nextManifest = recordReleaseAttemptState(manifest, { state, closedBy: ATTEMPT_CLOSE_CAUSES[state], evidence })
98
+ const emitted = emitBundle({ bundle, dir })
99
+ return { manifest: nextManifest, bundle: emitted }
100
+ }
101
+
102
+ export function main(argv) {
103
+ let parsed
104
+ try {
105
+ parsed = parseArgs(argv)
106
+ if (parsed.help) {
107
+ console.log(USAGE)
108
+ return 0
109
+ }
110
+ if (parsed.positional.length !== 1) throw new Error('exactly one run-manifest path is required')
111
+ const { bundle, dir, state, evidence } = parsed.options
112
+ const manifestPath = parsed.positional[0]
113
+ const result = closeAttempt({
114
+ manifest: readJson(manifestPath, 'run manifest'),
115
+ bundle: readJson(bundle, 'bundle'),
116
+ dir,
117
+ state,
118
+ evidence,
119
+ })
120
+ writeManifest(manifestPath, result.manifest)
121
+ process.stdout.write(JSON.stringify({
122
+ attemptId: result.manifest.release.attempt.id,
123
+ state: result.manifest.release.attempt.state,
124
+ bundle: result.bundle,
125
+ }, null, 2) + '\n')
126
+ return 0
127
+ } catch (error) {
128
+ console.error(`close-attempt: ${error.message}\n\n${USAGE}`)
129
+ return 1
130
+ }
131
+ }
132
+
133
+ if (isMainModule(import.meta.url)) {
134
+ process.exitCode = main(process.argv.slice(2))
135
+ }
@@ -0,0 +1,161 @@
1
+ #!/usr/bin/env node
2
+ // closeout-release — the one released-path closeout command (#1025).
3
+ //
4
+ // A release cannot report success until every durable record is present: the finalizer writes the
5
+ // terminal manifest state, this command emits then re-validates its immutable bundle, copies the
6
+ // aggregate artifact, and persists both post-mortems. The normal path assembles the bundle from
7
+ // manifest observations plus build/approval receipts; it never accepts a hand-authored bundle.
8
+
9
+ import fs from 'node:fs'
10
+
11
+ import { isMainModule } from '../../engineering-runtime/scripts/main-module.mjs'
12
+ import { readManifest, writeManifest } from '../../resolve-issues/scripts/run-state.mjs'
13
+ import { finalizeRelease } from './finalize-release.mjs'
14
+ import { emitBundle, validateBundle } from './evidence-bundle.mjs'
15
+ import { releaseVersion, saveReleasePostmortem } from './postmortem.mjs'
16
+ import { saveVersionPostmortem, versionPostmortem } from './version-postmortem.mjs'
17
+
18
+ const nonEmpty = (value) => typeof value === 'string' && value.trim() !== ''
19
+
20
+ const USAGE = `closeout-release — finalize one verified release and write every terminal artifact.
21
+
22
+ Usage:
23
+ closeout-release.mjs --manifest <run-manifest.json>
24
+ --adapter-completion-artifact <immutable-completion.json>
25
+ --adapter-component-head <40-hex-component-head>
26
+ --adapter-completion-sha256 <64-hex-sha256>
27
+ --build-identity <build-identity.json> --approval <approval.json>
28
+ [--durable-processing <durable-processing-receipts.json>]
29
+ --aggregate-bundle <release-evidence.json> --postmortem-dir <dir> [--now <iso>]
30
+
31
+ Sequence: finalize manifest -> emit bundle -> validate bundle -> copy aggregate bundle -> save
32
+ run + version post-mortems. Any failed step exits nonzero and prints no success response. The
33
+ normal path assembles the bundle from recorded observations; hand-written bundles are recovery
34
+ artifacts only and must be validated with evidence-bundle.mjs before use.`
35
+
36
+ function readJson(file, label) {
37
+ if (!nonEmpty(file)) throw new Error(`--${label} is required`)
38
+ try {
39
+ return JSON.parse(fs.readFileSync(file, 'utf8'))
40
+ } catch (error) {
41
+ throw new Error(`${label} is not readable JSON: ${file} (${error.message})`)
42
+ }
43
+ }
44
+
45
+ function parse(argv) {
46
+ const options = {}
47
+ for (let index = 0; index < argv.length; index += 1) {
48
+ const arg = argv[index]
49
+ if (arg === '--help' || arg === '-h') return { help: true }
50
+ if (!arg.startsWith('--')) throw new Error(`unexpected positional argument ${arg}`)
51
+ const key = arg.slice(2)
52
+ if (!['manifest', 'adapter-completion-artifact', 'adapter-component-head', 'adapter-completion-sha256',
53
+ 'build-identity', 'approval', 'durable-processing', 'aggregate-bundle', 'postmortem-dir', 'now'].includes(key)) {
54
+ throw new Error(`unknown argument ${arg}`)
55
+ }
56
+ const value = argv[++index]
57
+ if (!nonEmpty(value) || value.startsWith('--')) throw new Error(`${arg} needs a value`)
58
+ options[key] = value
59
+ }
60
+ for (const key of ['manifest', 'adapter-completion-artifact', 'adapter-component-head',
61
+ 'adapter-completion-sha256', 'build-identity', 'approval', 'aggregate-bundle', 'postmortem-dir']) {
62
+ if (!nonEmpty(options[key])) throw new Error(`--${key} is required`)
63
+ }
64
+ return { options }
65
+ }
66
+
67
+ function releaseBundle(manifest, buildIdentity, approval, durableProcessing) {
68
+ const release = manifest.release ?? {}
69
+ const attempt = release.attempt ?? {}
70
+ const candidate = release.candidateIdentity
71
+ const declaredDurableProcessing = manifest.envelope?.durableProcessing
72
+ if (declaredDurableProcessing?.present === true && !durableProcessing) {
73
+ throw new Error('durable-processing receipts are required when the release declares durable processing')
74
+ }
75
+ return {
76
+ attemptId: attempt.id,
77
+ rcTag: release.rcTag ?? attempt.rcTag,
78
+ deployTrigger: manifest.envelope?.deployTrigger,
79
+ sha: manifest.shippedSha,
80
+ buildIdentity,
81
+ terminalState: 'released',
82
+ closedBy: 'verified-release',
83
+ candidateReceipt: candidate,
84
+ candidateVerdict: release.candidateVerdict,
85
+ approval,
86
+ trafficTransition: {
87
+ from: release.previousRevision,
88
+ to: candidate?.revision,
89
+ fromPercent: release.servingConfirmation?.previousRevisionPercent,
90
+ toPercent: release.servingConfirmation?.candidatePercent,
91
+ },
92
+ liveVerdict: release.liveVerdict,
93
+ durableProcessing: durableProcessing ?? { present: false },
94
+ }
95
+ }
96
+
97
+ function savePostmortems(manifest, postmortemDir) {
98
+ const env = { ...process.env, RESOLVER_POSTMORTEM_DIR: postmortemDir }
99
+ const run = saveReleasePostmortem(manifest, env)
100
+ if (!run.saved) throw new Error(`run post-mortem was not saved: ${run.error ?? 'unknown error'}`)
101
+
102
+ const version = releaseVersion(manifest)
103
+ if (!nonEmpty(version) || !nonEmpty(manifest.durableEvidenceDir)) {
104
+ throw new Error('version post-mortem requires a release version and durableEvidenceDir')
105
+ }
106
+ const profile = versionPostmortem({ dir: manifest.durableEvidenceDir, version, runSlug: manifest.runSlug })
107
+ if (profile.attempts.length === 0) throw new Error('version post-mortem found no durable bundles after emission')
108
+ const aggregate = saveVersionPostmortem(profile, env)
109
+ if (!aggregate.saved) throw new Error(`version post-mortem was not saved: ${aggregate.error ?? 'unknown error'}`)
110
+ return { run: run.paths, version: aggregate.paths }
111
+ }
112
+
113
+ export function closeoutRelease(options) {
114
+ const before = readManifest(options.manifest)
115
+ const result = finalizeRelease(before, {
116
+ now: options.now ?? new Date().toISOString(),
117
+ adapterCompletionArtifact: options['adapter-completion-artifact'],
118
+ adapterComponentHead: options['adapter-component-head'],
119
+ adapterCompletionSha256: options['adapter-completion-sha256'],
120
+ })
121
+ if (!result.resumed) writeManifest(options.manifest, result.manifest)
122
+
123
+ const buildIdentity = readJson(options['build-identity'], 'build-identity')
124
+ const approval = readJson(options.approval, 'approval')
125
+ const durableProcessing = options['durable-processing']
126
+ ? readJson(options['durable-processing'], 'durable-processing')
127
+ : null
128
+ const bundle = releaseBundle(result.manifest, buildIdentity, approval, durableProcessing)
129
+ const emitted = emitBundle({ bundle, dir: result.manifest.durableEvidenceDir })
130
+ const written = readJson(emitted.path, 'emitted bundle')
131
+ const validation = validateBundle(written)
132
+ if (!validation.valid) throw new Error(`emitted bundle did not validate: ${validation.failed.join(', ')}`)
133
+
134
+ fs.copyFileSync(emitted.path, options['aggregate-bundle'])
135
+ const postmortems = savePostmortems(result.manifest, options['postmortem-dir'])
136
+ return {
137
+ ok: true,
138
+ manifest: options.manifest,
139
+ bundle: emitted.path,
140
+ aggregateBundle: options['aggregate-bundle'],
141
+ postmortems,
142
+ steps: { finalize: 'passed', emit: 'passed', validate: 'passed', aggregateCopy: 'passed', postmortems: 'passed' },
143
+ }
144
+ }
145
+
146
+ export function main(argv) {
147
+ try {
148
+ const parsed = parse(argv)
149
+ if (parsed.help) {
150
+ console.log(USAGE)
151
+ return 0
152
+ }
153
+ console.log(JSON.stringify(closeoutRelease(parsed.options), null, 2))
154
+ return 0
155
+ } catch (error) {
156
+ console.error(`closeout-release: ${error.message}`)
157
+ return 1
158
+ }
159
+ }
160
+
161
+ if (isMainModule(import.meta.url)) process.exitCode = main(process.argv.slice(2))
@@ -0,0 +1,106 @@
1
+ // The release doctrine as ONE document, however it happens to be split across files.
2
+ //
3
+ // Why this exists: SKILL.md used to be the whole doctrine — 490 lines, 129KB — and the
4
+ // doctrine tests in this directory read it directly and slice it by heading. Then a real
5
+ // failure showed up: an agent harness loaded the skill and got lines 1-260 of 491, which cut
6
+ // off step 4 (the traffic shift), step 5 (rollback routing), and the Reference Map that would
7
+ // have told it where to look. Nothing warned anyone; the model simply never received the
8
+ // second half of a production-release procedure.
9
+ //
10
+ // The fix was to make SKILL.md an index and move each phase into `references/`. That kept
11
+ // every word (the sections were extracted verbatim), but it broke the premise the tests were
12
+ // written on — that "the doctrine" and "SKILL.md" are the same string.
13
+ //
14
+ // They were never the same thing, and that is the point. These tests grade the *doctrine*:
15
+ // that a passage exists, that two rules appear in a required order, that a slice stops at its
16
+ // sibling. All of that is preserved by a move; none of it is a claim about which file the prose
17
+ // sits in. So the doctrine is reassembled here, in its original document order, and the tests
18
+ // read it from this module instead of from a path.
19
+ //
20
+ // The reassembly is faithful rather than approximate: each phase file was extracted as a
21
+ // contiguous line range, in order, so concatenating them in that order reproduces the original
22
+ // document. Two details make it exact:
23
+ //
24
+ // 1. Each reference file opens with a NEW `# Title` and orientation paragraph that did not
25
+ // exist in the original. Those are stripped — the body resumes at the first heading that
26
+ // came from the original document, which is why each entry below names it.
27
+ // 2. SKILL.md now carries a `## Non-negotiable principles` heading of its own, holding the
28
+ // 14 rules as a one-line index. Concatenating SKILL.md whole would put that index ahead of
29
+ // the real section and every principle-body slice would land in the index instead. So
30
+ // SKILL.md contributes only its head (frontmatter → Related skills) and its tail
31
+ // (Definition of done onward); the principles section comes from `principles.md`.
32
+ //
33
+ // If a future split moves a section again, update the ORDER table below in the same commit.
34
+ // A test that fails because prose moved is this module being out of date, not doctrine being
35
+ // lost — but do confirm which of the two it is before editing anything here.
36
+ import fs from 'node:fs'
37
+ import path from 'node:path'
38
+ import { fileURLToPath } from 'node:url'
39
+
40
+ const skillDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
41
+ const read = (rel) => fs.readFileSync(path.join(skillDir, rel), 'utf8')
42
+
43
+ // Each phase file, and the first heading in it that came from the original SKILL.md. Everything
44
+ // above that heading is this-file-only orientation and is dropped.
45
+ const ORDER = [
46
+ { file: 'references/principles.md', resumeAt: '## Non-negotiable principles' },
47
+ { file: 'references/preflight.md', resumeAt: '## Pre-flight gate: confirm the authorization envelope' },
48
+ { file: 'references/assembly.md', resumeAt: '### 0 — Intake' },
49
+ { file: 'references/candidate.md', resumeAt: '### 3 — Promote' },
50
+ { file: 'references/exposure.md', resumeAt: '### 4 — Validate' },
51
+ { file: 'references/routing.md', resumeAt: '### 5 — Route' },
52
+ // The handoff report moved off SKILL.md (2026-08-17); the doctrine follows it.
53
+ { file: 'references/handoff.md', resumeAt: '## Every item' },
54
+ ]
55
+
56
+ function bodyFrom({ file, resumeAt }) {
57
+ const text = read(file)
58
+ const idx = text.indexOf(`\n${resumeAt}`)
59
+ if (idx < 0) {
60
+ throw new Error(
61
+ `doctrine.mjs: ${file} no longer contains "${resumeAt}". Either the heading was reworded ` +
62
+ '(update ORDER in this file, same commit) or the section was moved again (update ORDER, ' +
63
+ 'and check the section still exists somewhere before assuming it is only a rename).',
64
+ )
65
+ }
66
+ return text.slice(idx + 1)
67
+ }
68
+
69
+ // SKILL.md's own contribution: its head, and its tail from Definition of done onward. The
70
+ // sections between those two — the routing index, the principles INDEX, the loop table — are
71
+ // navigation this module deliberately excludes, because the doctrine they point at is included
72
+ // in full from the files above and a duplicate heading would capture every slice.
73
+ function skillHeadAndTail() {
74
+ const text = read('SKILL.md')
75
+ const headEnd = text.indexOf('\n## Routing')
76
+ const tailStart = text.indexOf('\n## Definition of done')
77
+ if (headEnd < 0 || tailStart < 0) {
78
+ throw new Error(
79
+ 'doctrine.mjs: SKILL.md is missing "## Routing" or "## Definition of done". Both are ' +
80
+ 'structural — Routing is the index that has to survive a truncated load, and Definition ' +
81
+ 'of done is graded prose. Restore the heading, or update this loader in the same commit.',
82
+ )
83
+ }
84
+ return { head: text.slice(0, headEnd), tail: text.slice(tailStart) }
85
+ }
86
+
87
+ // `## The release loop` opened the step sequence in the original document and now lives only in
88
+ // SKILL.md's navigation table, so it is reinserted at its original position — before step 0, not
89
+ // after step 5. Order is load-bearing here: several tests assert that one rule appears before
90
+ // another, and they would read a shuffled reassembly as a doctrine defect.
91
+ const LOOP_HEADING_BEFORE = 'references/assembly.md'
92
+
93
+ export function loadDoctrine() {
94
+ const { head, tail } = skillHeadAndTail()
95
+ const parts = [head]
96
+ for (const entry of ORDER) {
97
+ if (entry.file === LOOP_HEADING_BEFORE) parts.push('## The release loop')
98
+ parts.push(bodyFrom(entry))
99
+ }
100
+ parts.push(tail)
101
+ return parts.join('\n')
102
+ }
103
+
104
+ // The assembled doctrine. Named `SKILL` at the call sites for continuity with the tests that
105
+ // already sliced a variable by that name — the string is what they were always asserting about.
106
+ export const DOCTRINE = loadDoctrine()