@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,43 @@
1
+ {
2
+ "name": "engineering-runtime",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "engineering-runtime",
9
+ "version": "1.0.0",
10
+ "dependencies": {
11
+ "js-yaml": "4.3.1"
12
+ }
13
+ },
14
+ "node_modules/argparse": {
15
+ "version": "2.0.1",
16
+ "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz",
17
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
18
+ "license": "Python-2.0"
19
+ },
20
+ "node_modules/js-yaml": {
21
+ "version": "4.3.1",
22
+ "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.3.1.tgz",
23
+ "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==",
24
+ "funding": [
25
+ {
26
+ "type": "github",
27
+ "url": "https://github.com/sponsors/puzrin"
28
+ },
29
+ {
30
+ "type": "github",
31
+ "url": "https://github.com/sponsors/nodeca"
32
+ }
33
+ ],
34
+ "license": "MIT",
35
+ "dependencies": {
36
+ "argparse": "^2.0.1"
37
+ },
38
+ "bin": {
39
+ "js-yaml": "bin/js-yaml.js"
40
+ }
41
+ }
42
+ }
43
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "engineering-runtime",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "description": "Engineering Workflow runtime dependency closure",
7
+ "dependencies": {
8
+ "js-yaml": "4.3.1"
9
+ }
10
+ }
@@ -0,0 +1,223 @@
1
+ // Versioned required-check plans bind merge-admission discovery and execution
2
+ // evidence to one frozen head. Epic-892 showed that supplied green jobs alone
3
+ // cannot claim completeness: the omitted `skill-size` gate failed after publish.
4
+
5
+ export const REQUIRED_CHECK_PLAN_VERSION = 1
6
+ export const CHECK_PHASES = Object.freeze(['pr-head', 'queue-head'])
7
+
8
+ const isObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value)
9
+ const nonEmpty = (value) => typeof value === 'string' && value.trim().length > 0
10
+ const strings = (value) => Array.isArray(value) && value.every(nonEmpty) && new Set(value).size === value.length
11
+ const SHA = /^[0-9a-f]{40}$/i
12
+
13
+ function exactObject(value, fields, label, errors) {
14
+ if (!isObject(value)) { errors.push(`${label} must be an object`); return false }
15
+ const unknown = Object.keys(value).find((key) => !fields.includes(key))
16
+ if (unknown) errors.push(`${label} has unknown property ${unknown}`)
17
+ return true
18
+ }
19
+
20
+ function conditionTree(value, label, errors) {
21
+ if (!isObject(value)) { errors.push(`${label} must be a condition tree object`); return [] }
22
+ const keys = Object.keys(value)
23
+ if (keys.length !== 1 || !['condition', 'all', 'any'].includes(keys[0])) {
24
+ errors.push(`${label} must contain exactly one of condition|all|any`)
25
+ return []
26
+ }
27
+ if (keys[0] === 'condition') return nonEmpty(value.condition) ? [value.condition] : (errors.push(`${label}.condition must be a non-empty string`), [])
28
+ if (!Array.isArray(value[keys[0]]) || value[keys[0]].length === 0) {
29
+ errors.push(`${label}.${keys[0]} must be a non-empty array`)
30
+ return []
31
+ }
32
+ return value[keys[0]].flatMap((child, index) => conditionTree(child, `${label}.${keys[0]}[${index}]`, errors))
33
+ }
34
+
35
+ function validateDiscoverySource(value, label, errors, { github = false } = {}) {
36
+ const fields = github ? ['conditions', 'trees', 'rulesets'] : ['conditions', 'trees', 'phases']
37
+ if (!exactObject(value, fields, label, errors)) return
38
+ if (!strings(value.conditions)) errors.push(`${label}.conditions must preserve live merge-admission conditions`)
39
+ if (!Array.isArray(value.trees) || value.trees.length === 0) {
40
+ errors.push(`${label}.trees must preserve every live merge-admission condition tree`)
41
+ return
42
+ }
43
+ const leaves = value.trees.flatMap((tree, index) => conditionTree(tree, `${label}.trees[${index}]`, errors))
44
+ const preserved = new Set(value.conditions || [])
45
+ for (const leaf of leaves) if (!preserved.has(leaf)) errors.push(`${label}.trees contains condition absent from ${label}.conditions: ${leaf}`)
46
+ for (const condition of value.conditions || []) if (!leaves.includes(condition)) errors.push(`${label}.conditions omits condition tree leaf: ${condition}`)
47
+ if (github) {
48
+ return
49
+ }
50
+ // Pre-phase fixture plans remain readable as PR-head-only plans. Live discovery
51
+ // always writes phases; it cannot omit queue-head requirements.
52
+ if (value.phases === undefined) return
53
+ if (!Array.isArray(value.phases) || !value.phases.length) {
54
+ errors.push(`${label}.phases must preserve every live Mergify lifecycle phase`)
55
+ return
56
+ }
57
+ const ids = new Set()
58
+ for (const [index, phase] of value.phases.entries()) {
59
+ const at = `${label}.phases[${index}]`
60
+ if (!exactObject(phase, ['id', 'phase', 'source', 'trees', 'conditions'], at, errors)) continue
61
+ if (!nonEmpty(phase.id) || ids.has(phase.id)) errors.push(`${at}.id must be a unique non-empty source identity`)
62
+ else ids.add(phase.id)
63
+ if (!CHECK_PHASES.includes(phase.phase)) errors.push(`${at}.phase must be ${CHECK_PHASES.join('|')}`)
64
+ if (!nonEmpty(phase.source)) errors.push(`${at}.source must be a non-empty source identity`)
65
+ if (!strings(phase.conditions)) errors.push(`${at}.conditions must preserve this phase's condition leaves`)
66
+ const phaseLeaves = Array.isArray(phase.trees)
67
+ ? phase.trees.flatMap((tree, treeIndex) => conditionTree(tree, `${at}.trees[${treeIndex}]`, errors))
68
+ : []
69
+ if (!Array.isArray(phase.trees) || !phase.trees.length) errors.push(`${at}.trees must be a non-empty array`)
70
+ for (const leaf of phaseLeaves) if (!preserved.has(leaf)) errors.push(`${at}.trees contains condition absent from ${label}.conditions: ${leaf}`)
71
+ for (const leaf of phaseLeaves) if (!phase.conditions?.includes(leaf)) errors.push(`${at}.conditions omits phase tree leaf: ${leaf}`)
72
+ for (const condition of phase.conditions || []) if (!phaseLeaves.includes(condition)) errors.push(`${at}.conditions has leaf absent from its trees: ${condition}`)
73
+ }
74
+ }
75
+
76
+ export function checksForPhase(plan, phase) {
77
+ return (plan?.checks || []).filter((check) => check?.admission === 'required' && (Array.isArray(check?.phases) ? check.phases.includes(phase) : phase === 'pr-head'))
78
+ }
79
+
80
+ export function locallyReproducedJobs(plan, phase = 'pr-head') {
81
+ return checksForPhase(plan, phase)
82
+ .filter((check) => check.classification === 'locally-reproduced')
83
+ .map((check) => check.evidence?.job)
84
+ .filter(nonEmpty)
85
+ .sort()
86
+ }
87
+
88
+ export function validateRequiredCheckPlan(plan, { expectedHeadSha, requireEvidence = false, label = 'requiredCheckPlan' } = {}) {
89
+ const errors = []
90
+ if (!isObject(plan)) return { ok: false, errors: [`${label} is a legacy required-check manifest without requiredCheckPlan; rediscover GitHub rulesets and Mergify conditions, classify every live check, then regenerate exact-head evidence`] }
91
+ exactObject(plan, ['version', 'kind', 'repository', 'targetBranch', 'headSha', 'discovery', 'checks', 'allowedSkippedJobs'], label, errors)
92
+ if (![1, 2].includes(plan.version)) errors.push(`${label}.version must be 1 (legacy PR-head) or 2 (phase-aware lifecycle plan)`)
93
+ if (plan.kind !== 'required-check-plan') errors.push(`${label}.kind must be "required-check-plan"`)
94
+ if (!nonEmpty(plan.repository) || !/^[^/\s]+\/[^/\s]+$/.test(plan.repository)) errors.push(`${label}.repository must be owner/name`)
95
+ if (!nonEmpty(plan.targetBranch)) errors.push(`${label}.targetBranch must be a non-empty string`)
96
+ if (!nonEmpty(plan.headSha) || !SHA.test(plan.headSha)) errors.push(`${label}.headSha must be a full 40-character commit SHA`)
97
+ if (expectedHeadSha && plan.headSha !== expectedHeadSha) errors.push(`${label} is STALE: stamped ${plan.headSha}, expected ${expectedHeadSha}`)
98
+ if (exactObject(plan.discovery, ['github', 'mergify', 'requiredChecks'], `${label}.discovery`, errors)) {
99
+ if (!strings(plan.discovery.requiredChecks)) errors.push(`${label}.discovery.requiredChecks must be unique non-empty check names`)
100
+ validateDiscoverySource(plan.discovery.github, `${label}.discovery.github`, errors, { github: true })
101
+ validateDiscoverySource(plan.discovery.mergify, `${label}.discovery.mergify`, errors)
102
+ if (plan.version === 2 && !Array.isArray(plan.discovery.github?.rulesets)) errors.push(`${label}.discovery.github.rulesets must preserve applicable target-branch source conditions`)
103
+ if (plan.version === 2 && !Array.isArray(plan.discovery.mergify?.phases)) errors.push(`${label}.discovery.mergify.phases must preserve every lifecycle source`)
104
+ }
105
+ if (!strings(plan.allowedSkippedJobs)) errors.push(`${label}.allowedSkippedJobs must be unique non-empty job names`)
106
+ if (!Array.isArray(plan.checks) || plan.checks.length === 0) return { ok: false, errors: [...errors, `${label}.checks must be a non-empty array`] }
107
+ const names = new Set()
108
+ for (const [index, check] of plan.checks.entries()) {
109
+ const at = `${label}.checks[${index}]`
110
+ const allowedCheckFields = plan.version === 1 ? ['name', 'admission', 'classification', 'sources', 'evidence', 'changedPathExemption'] : ['name', 'admission', 'classification', 'sources', 'phases', 'evidence', 'queueEvidence', 'changedPathExemption']
111
+ if (!exactObject(check, allowedCheckFields, at, errors)) continue
112
+ if (!nonEmpty(check.name)) errors.push(`${at}.name must be a non-empty string`)
113
+ else if (names.has(check.name)) errors.push(`${label}.checks duplicates ${check.name}`)
114
+ else names.add(check.name)
115
+ if (!['required', 'exempted'].includes(check.admission)) errors.push(`${at}.admission must be required|exempted`)
116
+ if (!['locally-reproduced', 'publish-only'].includes(check.classification)) errors.push(`${at}.classification must be locally-reproduced|publish-only`)
117
+ if (!strings(check.sources) || !check.sources.length) errors.push(`${at}.sources must preserve discovery sources`)
118
+ if ((plan.version === 2 && check.phases === undefined) || (check.phases !== undefined && (!strings(check.phases) || !check.phases.length || check.phases.some((phase) => !CHECK_PHASES.includes(phase))))) errors.push(`${at}.phases must name one or more known evidence phases`)
119
+ if (check.admission === 'exempted' && (!isObject(check.changedPathExemption) || check.changedPathExemption.applies !== true || !nonEmpty(check.changedPathExemption.condition))) errors.push(`${at}.exempted check requires an explicit applicable changed-path exemption`)
120
+ if (check.classification === 'locally-reproduced') {
121
+ if (!isObject(check.evidence) || !nonEmpty(check.evidence.command) || !nonEmpty(check.evidence.job)) errors.push(`${at}.locally-reproduced evidence requires command and job`)
122
+ if (requireEvidence && check.admission === 'required' && (check.phases === undefined || check.phases.includes('pr-head')) && check.evidence?.result !== 'success') errors.push(`${at}.locally-reproduced evidence.result must be success; skipped is never success`)
123
+ } else {
124
+ if (!isObject(check.evidence) || !nonEmpty(check.evidence.provider) || !nonEmpty(check.evidence.reason)) errors.push(`${at}.publish-only evidence requires provider and reason`)
125
+ if (Object.hasOwn(check.evidence || {}, 'conclusion')) errors.push(`${at}.publish-only plan evidence must not embed a provider conclusion; use the separate provider artifact`)
126
+ }
127
+ if (check.admission === 'required' && check.phases?.includes('queue-head')) {
128
+ if (!isObject(check.queueEvidence) || !nonEmpty(check.queueEvidence.provider) || !nonEmpty(check.queueEvidence.acquisition)) {
129
+ errors.push(`${at}.queueEvidence requires a provider and acquisition path before enqueue; queue-head checks cannot be authorized from future synthetic evidence`)
130
+ }
131
+ } else if (check.queueEvidence !== undefined) {
132
+ errors.push(`${at}.queueEvidence is only meaningful for a required queue-head check`)
133
+ }
134
+ }
135
+ for (const name of plan.discovery?.requiredChecks || []) if (!names.has(name)) errors.push(`${label} omits live required check ${name}; epic-892 omitted skill-size, so green supplied jobs are not complete evidence`)
136
+ const local = new Set(locallyReproducedJobs(plan, 'pr-head'))
137
+ for (const skipped of plan.allowedSkippedJobs || []) if (local.has(skipped)) errors.push(`${label}.allowedSkippedJobs includes locally reproduced job ${skipped}; skipped is never success`)
138
+ return { ok: errors.length === 0, errors }
139
+ }
140
+
141
+ export function validatePublishOnlyEvidence(plan, evidence, { expectedHeadSha, expectedRepository, expectedPr, label = 'publishOnlyEvidence' } = {}) {
142
+ const errors = []
143
+ const expected = checksForPhase(plan, 'pr-head').filter((check) => check.classification === 'publish-only')
144
+ if (!Array.isArray(evidence)) return { ok: false, errors: [`${label} must be an array`] }
145
+ const byName = new Map()
146
+ for (const [index, item] of evidence.entries()) {
147
+ const at = `${label}[${index}]`
148
+ if (!exactObject(item, ['name', 'provider', 'repository', 'pr', 'headSha', 'conclusion'], at, errors)) continue
149
+ if (!nonEmpty(item.name) || !nonEmpty(item.provider)) errors.push(`${at}.name and provider must be non-empty strings`)
150
+ if (!nonEmpty(item.repository) || !/^[^/\s]+\/[^/\s]+$/.test(item.repository)) errors.push(`${at}.repository must be owner/name`)
151
+ else if (expectedRepository && item.repository !== expectedRepository) errors.push(`${at} repository mismatch: expected ${expectedRepository}, received ${item.repository}`)
152
+ if (!Number.isInteger(item.pr) || item.pr < 1) errors.push(`${at}.pr must be a positive integer`)
153
+ else if (expectedPr && item.pr !== expectedPr) errors.push(`${at} PR mismatch: expected ${expectedPr}, received ${item.pr}`)
154
+ if (!nonEmpty(item.headSha) || !SHA.test(item.headSha)) errors.push(`${at}.headSha must be a full 40-character commit SHA`)
155
+ else if (expectedHeadSha && item.headSha !== expectedHeadSha) errors.push(`${at} is STALE: stamped ${item.headSha}, expected ${expectedHeadSha}`)
156
+ if (item.conclusion !== 'success') errors.push(`${at}.conclusion must be success; skipped is never success`)
157
+ if (byName.has(item.name)) errors.push(`${label} has duplicate/ambiguous evidence for ${item.name}`)
158
+ else byName.set(item.name, item)
159
+ }
160
+ for (const check of expected) {
161
+ const item = byName.get(check.name)
162
+ if (!item) errors.push(`${label} is missing provider evidence for publish-only required check ${check.name}`)
163
+ else if (item.provider !== check.evidence?.provider) errors.push(`${label} provider mismatch for ${check.name}: expected ${check.evidence?.provider}, received ${item.provider}`)
164
+ }
165
+ for (const name of byName.keys()) if (!expected.some((check) => check.name === name)) errors.push(`${label} has evidence for non-PR-head publish-only check ${name}`)
166
+ return { ok: errors.length === 0, errors }
167
+ }
168
+
169
+ export function validateRequiredCheckExecution(plan, jobs, { expectedHeadSha } = {}) {
170
+ const planVerdict = validateRequiredCheckPlan(plan, { expectedHeadSha })
171
+ const errors = [...planVerdict.errors]
172
+ const byName = new Map(Array.isArray(jobs) ? jobs.filter(isObject).map((job) => [job.name, job]) : [])
173
+ if (!Array.isArray(jobs)) errors.push('workflow jobs must be an array')
174
+ for (const check of checksForPhase(plan, 'pr-head')) {
175
+ if (check.classification !== 'locally-reproduced') continue
176
+ const job = byName.get(check.evidence?.job)
177
+ if (!job) errors.push(`locally reproduced PR-head required check ${check.name} is missing workflow job ${check.evidence?.job}`)
178
+ else if (job.conclusion !== 'success') errors.push(`locally reproduced PR-head required check ${check.name} is ${job.conclusion ?? 'pending'}; skipped is never success`)
179
+ }
180
+ return { ok: errors.length === 0, errors }
181
+ }
182
+
183
+ // Queue/batch checks run on a provider-created synthetic head. This separate artifact
184
+ // prevents PR-head authorization from fabricating delivery evidence.
185
+ export function validateQueueExecutionArtifact(plan, artifact, { expectedRepository, expectedPr, expectedPrHeadSha, label = 'queueExecutionArtifact' } = {}) {
186
+ const errors = []
187
+ const required = checksForPhase(plan, 'queue-head')
188
+ if (!required.length) return { ok: artifact == null, errors: artifact == null ? [] : [`${label} is unnecessary because this plan has no queue-head checks`] }
189
+ if (!exactObject(artifact, ['version', 'kind', 'repository', 'pr', 'prHeadSha', 'queuePr', 'queueHeadSha', 'provider', 'checks', 'status'], label, errors)) return { ok: false, errors }
190
+ if (artifact.version !== 1 || artifact.kind !== 'queue-execution') errors.push(`${label} must be a version 1 queue-execution artifact`)
191
+ if (artifact.repository !== (expectedRepository ?? plan?.repository)) errors.push(`${label}.repository must equal the planned repository`)
192
+ if (!Number.isInteger(artifact.pr) || artifact.pr < 1 || (expectedPr && artifact.pr !== expectedPr)) errors.push(`${label}.pr must equal the planned PR`)
193
+ if (!Number.isInteger(artifact.queuePr) || artifact.queuePr < 1 || artifact.queuePr === artifact.pr) errors.push(`${label}.queuePr must identify a distinct provider-created synthetic queue pull request`)
194
+ if (artifact.prHeadSha !== (expectedPrHeadSha ?? plan?.headSha)) errors.push(`${label}.prHeadSha must equal the frozen PR head`)
195
+ if (!nonEmpty(artifact.queueHeadSha) || !SHA.test(artifact.queueHeadSha)) errors.push(`${label}.queueHeadSha must be a full synthetic queue SHA`)
196
+ else if (artifact.queueHeadSha === artifact.prHeadSha) errors.push(`${label}.queueHeadSha must differ from prHeadSha; synthetic queue evidence cannot bind to the PR SHA`)
197
+ const queueProviders = [...new Set(required.map((check) => check.queueEvidence?.provider))]
198
+ if (queueProviders.length !== 1 || !nonEmpty(queueProviders[0])) {
199
+ errors.push(`${label} requires exactly one non-empty provider across planned queue-head checks`)
200
+ }
201
+ const expectedProvider = queueProviders[0]
202
+ if (!nonEmpty(artifact.provider)) errors.push(`${label}.provider must identify the observing provider`)
203
+ else if (expectedProvider && artifact.provider !== expectedProvider) errors.push(`${label}.provider mismatch: expected ${expectedProvider}, received ${artifact.provider}`)
204
+ if (artifact.status !== 'pass') errors.push(`${label}.status must be "pass"`)
205
+ if (!Array.isArray(artifact.checks)) errors.push(`${label}.checks must be an array`)
206
+ const byName = new Map()
207
+ for (const [index, check] of (Array.isArray(artifact.checks) ? artifact.checks : []).entries()) {
208
+ const at = `${label}.checks[${index}]`
209
+ if (!exactObject(check, ['name', 'provider', 'conclusion', 'headSha'], at, errors)) continue
210
+ if (!nonEmpty(check.name) || !nonEmpty(check.provider)) errors.push(`${at}.name and provider must be non-empty strings`)
211
+ if (!nonEmpty(check.headSha) || !SHA.test(check.headSha)) errors.push(`${at}.headSha must be a full queue-head SHA`)
212
+ if (byName.has(check.name)) errors.push(`${label} has duplicate/ambiguous evidence for ${check.name}`)
213
+ else byName.set(check.name, check)
214
+ }
215
+ for (const check of required) {
216
+ const observed = byName.get(check.name)
217
+ if (!observed) errors.push(`${label} is missing queue-head evidence for ${check.name}`)
218
+ else if (observed.provider !== check.queueEvidence?.provider) errors.push(`${label} provider mismatch for queue-head check ${check.name}: expected ${check.queueEvidence?.provider}, received ${observed.provider}`)
219
+ else if (observed.conclusion !== 'success' || observed.headSha !== artifact.queueHeadSha) errors.push(`${label} queue-head check ${check.name} must succeed on queueHeadSha; skipped is never success`)
220
+ }
221
+ for (const name of byName.keys()) if (!required.some((check) => check.name === name)) errors.push(`${label} has evidence for non-queue-head check ${name}`)
222
+ return { ok: errors.length === 0, errors }
223
+ }