@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,282 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "review-pr findings",
4
+ "description": "Canonical review document and finding contract. Generated from scripts/finding-contract.mjs and consumed by scripts/post-review.mjs.",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "verdict",
9
+ "findings"
10
+ ],
11
+ "properties": {
12
+ "verdict": {
13
+ "enum": [
14
+ "PASS",
15
+ "NEEDS_CHANGES",
16
+ "FAIL",
17
+ "BLOCKED"
18
+ ]
19
+ },
20
+ "summary": {
21
+ "type": "string"
22
+ },
23
+ "overall_correctness": {
24
+ "enum": [
25
+ "correct",
26
+ "incorrect"
27
+ ]
28
+ },
29
+ "findings": {
30
+ "type": "array",
31
+ "items": {
32
+ "type": "object",
33
+ "additionalProperties": false,
34
+ "required": [
35
+ "title",
36
+ "axis",
37
+ "file",
38
+ "line_start",
39
+ "confidence",
40
+ "why",
41
+ "priority"
42
+ ],
43
+ "properties": {
44
+ "title": {
45
+ "type": "string",
46
+ "minLength": 1,
47
+ "pattern": "\\S",
48
+ "maxLength": 120
49
+ },
50
+ "axis": {
51
+ "type": "string",
52
+ "enum": [
53
+ "spec",
54
+ "coverage",
55
+ "correctness",
56
+ "standards"
57
+ ]
58
+ },
59
+ "subject": {
60
+ "type": "string",
61
+ "description": "What the finding is about: the code under review ('code', the default) or the evidence describing it \u2014 Review Contract wording, coverage-checklist rows, evidence locators, test-level tags ('evidence'). Absent means 'code'. Callers use this to route a round whose production diff has not moved; misclassifying a code defect as evidence skips its adversarial re-review, so classify 'evidence' only when the fix touches no source file.",
62
+ "enum": [
63
+ "code",
64
+ "evidence"
65
+ ],
66
+ "default": "code"
67
+ },
68
+ "in_scope": {
69
+ "type": "boolean",
70
+ "default": true
71
+ },
72
+ "priority": {
73
+ "type": "integer",
74
+ "minimum": 0,
75
+ "maximum": 3
76
+ },
77
+ "file": {
78
+ "type": "string",
79
+ "minLength": 1,
80
+ "pattern": "\\S"
81
+ },
82
+ "line_start": {
83
+ "type": "integer",
84
+ "minimum": 1
85
+ },
86
+ "line_count": {
87
+ "type": "integer",
88
+ "minimum": 1
89
+ },
90
+ "confidence": {
91
+ "type": "number",
92
+ "minimum": 0,
93
+ "maximum": 1
94
+ },
95
+ "why": {
96
+ "type": "string",
97
+ "minLength": 1,
98
+ "pattern": "\\S"
99
+ },
100
+ "consequence": {
101
+ "type": "string",
102
+ "minLength": 1,
103
+ "pattern": "\\S"
104
+ },
105
+ "recommendation": {
106
+ "type": "string",
107
+ "minLength": 1,
108
+ "pattern": "\\S"
109
+ },
110
+ "theme": {
111
+ "$ref": "#/$defs/theme"
112
+ },
113
+ "hazard_candidate": {
114
+ "$ref": "#/$defs/hazard_candidate"
115
+ }
116
+ }
117
+ }
118
+ },
119
+ "overMockFindings": {
120
+ "type": "array"
121
+ },
122
+ "previousFindingsResolution": {
123
+ "type": "array"
124
+ },
125
+ "reviewModel": {
126
+ "type": "string",
127
+ "minLength": 1,
128
+ "pattern": "\\S"
129
+ },
130
+ "independent": {
131
+ "type": "boolean"
132
+ },
133
+ "contractValidates": {
134
+ "type": "boolean"
135
+ }
136
+ },
137
+ "$defs": {
138
+ "theme": {
139
+ "type": "object",
140
+ "additionalProperties": false,
141
+ "required": [
142
+ "id",
143
+ "kind",
144
+ "contract"
145
+ ],
146
+ "properties": {
147
+ "id": {
148
+ "type": "string",
149
+ "pattern": "^[a-z][a-z0-9-]*$"
150
+ },
151
+ "kind": {
152
+ "type": "string",
153
+ "enum": [
154
+ "other",
155
+ "state-machine",
156
+ "concurrency"
157
+ ]
158
+ },
159
+ "contract": {
160
+ "type": "string",
161
+ "minLength": 1,
162
+ "pattern": "\\S"
163
+ },
164
+ "stateSpace": {
165
+ "type": "object",
166
+ "additionalProperties": false,
167
+ "required": [
168
+ "states",
169
+ "taskKinds"
170
+ ],
171
+ "properties": {
172
+ "states": {
173
+ "type": "array",
174
+ "minItems": 1,
175
+ "uniqueItems": true,
176
+ "items": {
177
+ "type": "string",
178
+ "minLength": 1,
179
+ "pattern": "\\S"
180
+ }
181
+ },
182
+ "taskKinds": {
183
+ "type": "array",
184
+ "minItems": 1,
185
+ "uniqueItems": true,
186
+ "items": {
187
+ "type": "string",
188
+ "minLength": 1,
189
+ "pattern": "\\S"
190
+ }
191
+ }
192
+ }
193
+ }
194
+ },
195
+ "allOf": [
196
+ {
197
+ "if": {
198
+ "properties": {
199
+ "kind": {
200
+ "enum": [
201
+ "state-machine",
202
+ "concurrency"
203
+ ]
204
+ }
205
+ }
206
+ },
207
+ "then": {
208
+ "required": [
209
+ "stateSpace"
210
+ ]
211
+ }
212
+ },
213
+ {
214
+ "if": {
215
+ "properties": {
216
+ "kind": {
217
+ "const": "other"
218
+ }
219
+ }
220
+ },
221
+ "then": {
222
+ "not": {
223
+ "required": [
224
+ "stateSpace"
225
+ ]
226
+ }
227
+ }
228
+ }
229
+ ]
230
+ },
231
+ "hazard_candidate": {
232
+ "type": "object",
233
+ "additionalProperties": false,
234
+ "anyOf": [
235
+ {
236
+ "required": [
237
+ "section",
238
+ "id",
239
+ "rule",
240
+ "prove"
241
+ ]
242
+ },
243
+ {
244
+ "required": [
245
+ "covered_by"
246
+ ]
247
+ }
248
+ ],
249
+ "properties": {
250
+ "section": {
251
+ "type": "string",
252
+ "enum": [
253
+ "auth",
254
+ "money",
255
+ "tenancy",
256
+ "migration",
257
+ "cross-cutting"
258
+ ]
259
+ },
260
+ "id": {
261
+ "type": "string",
262
+ "pattern": "^[a-z][a-z0-9-]*$"
263
+ },
264
+ "rule": {
265
+ "type": "string",
266
+ "minLength": 1,
267
+ "pattern": "\\S"
268
+ },
269
+ "prove": {
270
+ "type": "string",
271
+ "minLength": 1,
272
+ "pattern": "\\S"
273
+ },
274
+ "covered_by": {
275
+ "type": "string",
276
+ "minLength": 1,
277
+ "pattern": "\\S"
278
+ }
279
+ }
280
+ }
281
+ }
282
+ }
@@ -0,0 +1,285 @@
1
+ // Canonical review finding/document contract.
2
+ //
3
+ // This module is the executable source of truth for the review-pr JSON schema,
4
+ // post-review enforcement, and resolve-issues durable review history. The JSON
5
+ // schema and the import-free workflow schema are generated/kept in parity with
6
+ // these definitions; consumers must use the validators below for enforcement.
7
+
8
+ import { validateTheme, THEME_KINDS } from './theme-contract.mjs'
9
+
10
+ export const REVIEW_VERDICTS = ['PASS', 'NEEDS_CHANGES', 'FAIL', 'BLOCKED']
11
+ export const FINDING_AXES = ['spec', 'coverage', 'correctness', 'standards']
12
+ // What the finding is *about*, orthogonal to axis and to severity: the code under
13
+ // review, or the material describing it. Absent means 'code' — the overwhelming
14
+ // default — so existing producers stay valid. Callers route the evidence-only lane
15
+ // on this (resolve-issues § Fix); only the reviewer read the diff, so only the
16
+ // reviewer can set it.
17
+ export const FINDING_SUBJECTS = ['code', 'evidence']
18
+ export const FINDING_KEYS = [
19
+ 'title', 'axis', 'subject', 'in_scope', 'priority', 'file', 'line_start', 'line_count',
20
+ 'confidence', 'why', 'consequence', 'recommendation', 'theme', 'hazard_candidate',
21
+ ]
22
+ // Fields the schema no longer defines but still *tolerates on read* — a finding
23
+ // carrying one does not hard-fail; it warns (findingWarnings) and the value is
24
+ // ignored. `blocking` was removed (#399): it is derived, never stored, as
25
+ // `in_scope && priority <= 1`, so a persisted `blocking` is at best redundant and
26
+ // at worst contradicts the derived value. Same removed-field posture as
27
+ // resolve-issues run-state's obsolete-slot warnings.
28
+ export const FINDING_OBSOLETE_KEYS = ['blocking']
29
+ // Lean core: what every finding owes — a located, confident, explained defect.
30
+ // consequence/recommendation/line_count are welcome but optional; `theme` is the
31
+ // deep lane's identity mechanism (resolve-issues/references/high-risk.md) and is
32
+ // validated only when present — forcing a taxonomy entry per lean-lane finding
33
+ // was pure ceremony and schema-retry surface.
34
+ export const FINDING_REQUIRED = [
35
+ 'title', 'axis', 'file', 'line_start', 'confidence', 'why', 'priority',
36
+ ]
37
+ export const FINDING_CONTRACT_VERSION = 2
38
+
39
+ const isObject = (value) => value != null && typeof value === 'object' && !Array.isArray(value)
40
+ const nonEmptyString = (value) => typeof value === 'string' && value.trim().length > 0
41
+ const hasOwn = (value, key) => Object.prototype.hasOwnProperty.call(value, key)
42
+
43
+ function unknownKeys(value, allowed, label) {
44
+ return Object.keys(value || {})
45
+ .filter((key) => !allowed.includes(key))
46
+ .map((key) => `${label} has unknown property: ${key}`)
47
+ }
48
+
49
+ function validateHazardCandidate(value, index) {
50
+ if (value === undefined) return []
51
+ if (!isObject(value)) return [`finding[${index}]: hazard_candidate must be an object`]
52
+ const errors = unknownKeys(value, ['section', 'id', 'rule', 'prove', 'covered_by'], `finding[${index}].hazard_candidate`)
53
+ const covered = nonEmptyString(value.covered_by)
54
+ const complete = ['section', 'id', 'rule', 'prove'].every((key) => nonEmptyString(value[key]))
55
+ if (!covered && !complete) {
56
+ errors.push(`finding[${index}]: hazard_candidate requires section/id/rule/prove or covered_by`)
57
+ }
58
+ if (value.section !== undefined && !['auth', 'money', 'tenancy', 'migration', 'cross-cutting'].includes(value.section)) {
59
+ errors.push(`finding[${index}]: hazard_candidate.section is invalid`)
60
+ }
61
+ if (value.id !== undefined && (!nonEmptyString(value.id) || !/^[a-z][a-z0-9-]*$/.test(value.id))) {
62
+ errors.push(`finding[${index}]: hazard_candidate.id must be kebab-case`)
63
+ }
64
+ for (const key of ['rule', 'prove', 'covered_by']) {
65
+ if (value[key] !== undefined && !nonEmptyString(value[key])) errors.push(`finding[${index}]: hazard_candidate.${key} is required`)
66
+ }
67
+ return errors
68
+ }
69
+
70
+ export function validateFinding(finding, index = 0) {
71
+ const prefix = `finding[${index}]`
72
+ if (!isObject(finding)) return [`${prefix}: finding must be an object`]
73
+ // Obsolete keys (e.g. removed `blocking`) are read-tolerated, not unknown: they
74
+ // never error — findingWarnings surfaces them and the value is ignored.
75
+ const errors = unknownKeys(finding, [...FINDING_KEYS, ...FINDING_OBSOLETE_KEYS], prefix)
76
+ for (const key of FINDING_REQUIRED) {
77
+ if (!hasOwn(finding, key)) errors.push(`${prefix}: missing ${key}`)
78
+ }
79
+ if (!nonEmptyString(finding.title) || (typeof finding.title === 'string' && finding.title.length > 120)) {
80
+ errors.push(`${prefix}: title must be a non-empty string of at most 120 characters`)
81
+ }
82
+ if (!FINDING_AXES.includes(finding.axis)) errors.push(`${prefix}: axis must be one of ${FINDING_AXES.join('|')}`)
83
+ if (!nonEmptyString(finding.file)) errors.push(`${prefix}: file is required (a finding must locate changed code)`)
84
+ if (!Number.isInteger(finding.line_start) || finding.line_start < 1) errors.push(`${prefix}: line_start must be a positive integer`)
85
+ if (finding.line_count !== undefined && (!Number.isInteger(finding.line_count) || finding.line_count < 1)) {
86
+ errors.push(`${prefix}: line_count must be a positive integer`)
87
+ }
88
+ if (typeof finding.confidence !== 'number' || !Number.isFinite(finding.confidence) || finding.confidence < 0 || finding.confidence > 1) {
89
+ errors.push(`${prefix}: confidence must be a number in 0..1`)
90
+ }
91
+ if (!nonEmptyString(finding.why)) errors.push(`${prefix}: why is required`)
92
+ for (const key of ['consequence', 'recommendation']) {
93
+ if (finding[key] !== undefined && !nonEmptyString(finding[key])) errors.push(`${prefix}: ${key} must be a non-empty string when present`)
94
+ }
95
+ if (finding.priority !== undefined && (!Number.isInteger(finding.priority) || finding.priority < 0 || finding.priority > 3)) {
96
+ errors.push(`${prefix}: priority must be an integer in 0..3`)
97
+ }
98
+ if (finding.in_scope !== undefined && typeof finding.in_scope !== 'boolean') errors.push(`${prefix}: in_scope must be boolean`)
99
+ if (finding.theme !== undefined) errors.push(...validateTheme(finding.theme).map((error) => `${prefix}: ${error}`))
100
+ errors.push(...validateHazardCandidate(finding.hazard_candidate, index))
101
+ return errors
102
+ }
103
+
104
+ // Read-tolerance for removed fields (#399): a finding still carrying an obsolete
105
+ // key is not rejected (validateFinding accepts it) but earns a warning so the
106
+ // producer drops it. The derived value is authoritative; the stored one is
107
+ // ignored. Callers print these; they never gate.
108
+ export function findingWarnings(finding, index = 0) {
109
+ if (!isObject(finding)) return []
110
+ const warnings = []
111
+ if (hasOwn(finding, 'blocking')) {
112
+ warnings.push(`finding[${index}]: blocking is obsolete — it was removed and is now derived as (in_scope && priority <= 1); the stored value is ignored, drop the field`)
113
+ }
114
+ return warnings
115
+ }
116
+
117
+ export function reviewDocumentWarnings(document) {
118
+ if (!isObject(document) || !Array.isArray(document.findings)) return []
119
+ return document.findings.flatMap((finding, index) => findingWarnings(finding, index))
120
+ }
121
+
122
+ // Derived severity/routing from the two canonical fields. `blocking` is NEVER a
123
+ // stored field — it is this function. `in_scope` defaults true (a finding is
124
+ // about the diff unless the reviewer says otherwise). priority<=1 is a blocker
125
+ // only when in scope; a p0/p1 out-of-scope finding is a dedicated critical issue,
126
+ // not a PR-holding blocker.
127
+ export function findingInScope(finding) {
128
+ return finding.in_scope !== false
129
+ }
130
+
131
+ export function isBlockingFinding(finding) {
132
+ return findingInScope(finding) && Number.isInteger(finding.priority) && finding.priority <= 1
133
+ }
134
+
135
+ export function isOutOfScopeCritical(finding) {
136
+ return !findingInScope(finding) && Number.isInteger(finding.priority) && finding.priority <= 1
137
+ }
138
+
139
+ // Legacy range support is deliberately explicit. Normal validation never
140
+ // silently accepts or rewrites line_end.
141
+ export function migrateLegacyFinding(finding, { version } = {}) {
142
+ if (version !== 1) throw new Error('legacy finding migration requires version 1')
143
+ if (!isObject(finding)) throw new Error('legacy finding must be an object')
144
+ if (hasOwn(finding, 'line_count')) throw new Error('legacy finding must use line_end, not line_count')
145
+ // A real v1 finding predates the #399 field changes: it may carry an obsolete key
146
+ // (e.g. `blocking`, which landed 2026-07-16) and may lack `priority` (optional
147
+ // pre-#399). Mirror validateFinding's read-tolerance — allow obsolete keys through
148
+ // (findingWarnings surfaces them, drop them on write) instead of hard-failing, so a
149
+ // historically-real finding stays migratable rather than bricking the whole unit.
150
+ const errors = unknownKeys(finding, [...FINDING_KEYS.filter((key) => key !== 'line_count'), ...FINDING_OBSOLETE_KEYS, 'line_end'], 'legacy finding')
151
+ for (const key of ['line_start', 'line_end']) {
152
+ if (!Number.isInteger(finding[key]) || finding[key] < 1) errors.push(`legacy finding ${key} must be a positive integer`)
153
+ }
154
+ if (Number.isInteger(finding.line_start) && Number.isInteger(finding.line_end) && finding.line_end < finding.line_start) {
155
+ errors.push('legacy finding line_end < line_start (reversed range)')
156
+ }
157
+ if (errors.length) throw new Error(errors.join('; '))
158
+ const { line_end, ...withoutEnd } = structuredClone(finding)
159
+ // Drop every obsolete key: the derived value is authoritative, the stored one ignored.
160
+ for (const key of FINDING_OBSOLETE_KEYS) delete withoutEnd[key]
161
+ const migrated = { ...withoutEnd, line_count: line_end - finding.line_start + 1 }
162
+ // Backfill the now-required priority when a pre-#399 finding lacks it: a stored
163
+ // blocking:true was an in-scope blocker → priority 1; anything else is an
164
+ // un-prioritized legacy note → priority 2 (a sensible non-blocking severity).
165
+ if (!hasOwn(migrated, 'priority')) migrated.priority = finding.blocking === true ? 1 : 2
166
+ return migrated
167
+ }
168
+
169
+ export function migrateLegacyReviewDocument(document, { version } = {}) {
170
+ if (version !== 1) throw new Error('legacy review migration requires version 1')
171
+ if (!isObject(document) || !Array.isArray(document.findings)) throw new Error('legacy review document requires findings')
172
+ return { ...structuredClone(document), findings: document.findings.map((finding) => migrateLegacyFinding(finding, { version: 1 })) }
173
+ }
174
+
175
+ const DOCUMENT_KEYS = [
176
+ 'verdict', 'summary', 'overall_correctness', 'findings', 'overMockFindings',
177
+ 'previousFindingsResolution', 'reviewModel', 'independent', 'contractValidates',
178
+ ]
179
+
180
+ export function validateReviewDocument(document) {
181
+ if (!isObject(document)) return ['review document must be an object']
182
+ const errors = unknownKeys(document, DOCUMENT_KEYS, 'review document')
183
+ if (!REVIEW_VERDICTS.includes(document.verdict)) errors.push(`review document verdict must be one of ${REVIEW_VERDICTS.join('|')}`)
184
+ if (document.summary !== undefined && typeof document.summary !== 'string') errors.push('review document summary must be a string')
185
+ if (document.overall_correctness !== undefined && !['correct', 'incorrect'].includes(document.overall_correctness)) {
186
+ errors.push('review document overall_correctness must be correct|incorrect')
187
+ }
188
+ if (!Array.isArray(document.findings)) errors.push('review document findings is not an array')
189
+ else document.findings.forEach((finding, index) => errors.push(...validateFinding(finding, index)))
190
+ if (document.overMockFindings !== undefined && !Array.isArray(document.overMockFindings)) errors.push('review document overMockFindings must be an array')
191
+ if (document.previousFindingsResolution !== undefined && !Array.isArray(document.previousFindingsResolution)) errors.push('review document previousFindingsResolution must be an array')
192
+ if (document.reviewModel !== undefined && !nonEmptyString(document.reviewModel)) errors.push('review document reviewModel must be a non-empty string')
193
+ if (document.independent !== undefined && typeof document.independent !== 'boolean') errors.push('review document independent must be boolean')
194
+ if (document.contractValidates !== undefined && typeof document.contractValidates !== 'boolean') errors.push('review document contractValidates must be boolean')
195
+ return errors
196
+ }
197
+
198
+ // Canonical schema object used to generate schemas/findings.schema.json and to
199
+ // mechanically compare the import-free independent-review workflow contract.
200
+ export const FINDING_SCHEMA = {
201
+ type: 'object',
202
+ additionalProperties: false,
203
+ required: FINDING_REQUIRED,
204
+ properties: {
205
+ title: { type: 'string', minLength: 1, pattern: '\\S', maxLength: 120 },
206
+ axis: { type: 'string', enum: FINDING_AXES },
207
+ subject: { type: 'string', enum: FINDING_SUBJECTS, default: 'code' },
208
+ in_scope: { type: 'boolean', default: true },
209
+ priority: { type: 'integer', minimum: 0, maximum: 3 },
210
+ file: { type: 'string', minLength: 1, pattern: '\\S' },
211
+ line_start: { type: 'integer', minimum: 1 },
212
+ line_count: { type: 'integer', minimum: 1 },
213
+ confidence: { type: 'number', minimum: 0, maximum: 1 },
214
+ why: { type: 'string', minLength: 1, pattern: '\\S' },
215
+ consequence: { type: 'string', minLength: 1, pattern: '\\S' },
216
+ recommendation: { type: 'string', minLength: 1, pattern: '\\S' },
217
+ theme: { $ref: '#/$defs/theme' },
218
+ hazard_candidate: { $ref: '#/$defs/hazard_candidate' },
219
+ },
220
+ }
221
+
222
+ export const FINDING_SCHEMA_DEFS = {
223
+ theme: {
224
+ type: 'object',
225
+ additionalProperties: false,
226
+ required: ['id', 'kind', 'contract'],
227
+ properties: {
228
+ id: { type: 'string', pattern: '^[a-z][a-z0-9-]*$' },
229
+ kind: { type: 'string', enum: THEME_KINDS },
230
+ contract: { type: 'string', minLength: 1, pattern: '\\S' },
231
+ stateSpace: {
232
+ type: 'object',
233
+ additionalProperties: false,
234
+ required: ['states', 'taskKinds'],
235
+ properties: {
236
+ states: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'string', minLength: 1, pattern: '\\S' } },
237
+ taskKinds: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'string', minLength: 1, pattern: '\\S' } },
238
+ },
239
+ },
240
+ },
241
+ allOf: [
242
+ {
243
+ if: { properties: { kind: { enum: ['state-machine', 'concurrency'] } } },
244
+ then: { required: ['stateSpace'] },
245
+ },
246
+ {
247
+ if: { properties: { kind: { const: 'other' } } },
248
+ then: { not: { required: ['stateSpace'] } },
249
+ },
250
+ ],
251
+ },
252
+ hazard_candidate: {
253
+ type: 'object',
254
+ additionalProperties: false,
255
+ anyOf: [
256
+ { required: ['section', 'id', 'rule', 'prove'] },
257
+ { required: ['covered_by'] },
258
+ ],
259
+ properties: {
260
+ section: { type: 'string', enum: ['auth', 'money', 'tenancy', 'migration', 'cross-cutting'] },
261
+ id: { type: 'string', pattern: '^[a-z][a-z0-9-]*$' },
262
+ rule: { type: 'string', minLength: 1, pattern: '\\S' },
263
+ prove: { type: 'string', minLength: 1, pattern: '\\S' },
264
+ covered_by: { type: 'string', minLength: 1, pattern: '\\S' },
265
+ },
266
+ },
267
+ }
268
+
269
+ export const REVIEW_DOCUMENT_SCHEMA = {
270
+ type: 'object',
271
+ additionalProperties: false,
272
+ required: ['verdict', 'findings'],
273
+ properties: {
274
+ verdict: { enum: REVIEW_VERDICTS },
275
+ summary: { type: 'string' },
276
+ overall_correctness: { enum: ['correct', 'incorrect'] },
277
+ findings: { type: 'array', items: FINDING_SCHEMA },
278
+ overMockFindings: { type: 'array' },
279
+ previousFindingsResolution: { type: 'array' },
280
+ reviewModel: { type: 'string', minLength: 1, pattern: '\\S' },
281
+ independent: { type: 'boolean' },
282
+ contractValidates: { type: 'boolean' },
283
+ },
284
+ $defs: FINDING_SCHEMA_DEFS,
285
+ }