@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,199 @@
1
+ # Review Method (detail)
2
+
3
+ How to review, in three layers: a **diff-scoped subject** (what you attack), an **adversarial search across four axes** (how you find issues), and a **calibrated verdict** (what you actually report). The spine names these; this is the detail.
4
+
5
+ ## Diff discipline (the subject of every review)
6
+
7
+ `review-pr` only ever reviews a change-set, so the diff *is* the subject — establish it before anything else.
8
+
9
+ > Run `scripts/pr-context.mjs --base <target-branch> > <pr-context.json>` to produce all of this — merge-base, the net three-dot range, changed files, and the commit list — as JSON, so the base/diff is computed correctly every time. **Save the output**: `post-review.mjs --pr-context <pr-context.json>` reuses its `changedFiles` list at post time, so a finding traced into unchanged code (permitted below) can't 422 the whole review just because its file isn't in the diff (#635). `scripts/scan-diff.mjs` then turns the diff into heuristic **leads** (unanchored regex, first-party interception in tests, new branches) — *leads to verify, never findings*; you still construct the counterexample.
10
+
11
+ - **Compute the review base, then diff against it.** For a PR/branch the unit is the **net diff from the merge-base**, not commit-by-commit:
12
+ - `base = git merge-base <target-branch> <pr-head>` — use the PR's *actual* target branch from its metadata, not a hardcoded `main`; recompute fresh so a rebase/retarget can't fool you.
13
+ - Review `git diff <base>...HEAD` (**three-dot** — the changes that would merge, excluding target-side commits that landed meanwhile; this is what GitHub's "Files changed" tab shows). Two-dot `<base>..HEAD` wrongly folds in base-side changes.
14
+ - **Net, not per-commit.** A bug introduced in one commit and fixed in a later one is not in the net diff and must not be flagged — only the cumulative result ships. Per-commit review flags transient states that never merge.
15
+ - **Introduced vs pre-existing, defined against the base.** A line/behavior is *introduced* iff it appears in `base...HEAD`; *pre-existing* iff present at the base. Pre-existing issues unrelated to the change are a **non-blocking note at most, never `NEEDS_CHANGES`** — don't block a PR for sins it didn't commit. A pre-existing weakness the change now *depends on or worsens* may be raised, framed as such.
16
+ - **Attributable, not myopic.** Diff-scoping governs what you *block on*, not what you *read*: trace into unchanged code freely to *prove* a finding (a change can break an unchanged caller), but every blocking finding must be attributable to this change and cite the diff hunk that causes it.
17
+ - **The evidence harness is something the diff depends on.** The sharpest case of "depends on" above, missed because the dependency runs backwards: when a diff **cites a browser/journey lane as proof of an AC**, the fixtures and config producing that evidence are part of what it depends on. A pre-existing harness defect that makes a cited lane **vacuous** blocks — the diff claims proof the harness cannot deliver, and that claim is introduced here even though the broken helper is not. Attribute it to the citing AC row. The tell is asymmetric: a lane failing *loudly* is a note (it isn't lying); a lane green-or-timing-out **without ever rendering its subject** is the blocker — the positive-marker row in [e2e-test → reviewing.md](../../e2e-test/references/reviewing.md). (Named incident: `skyee-ai-risk` #1144 — a tenant slug defaulted in four files left authorized journeys 403'ing before any row rendered, and five rounds graded lanes that had exercised nothing, each correctly scoping the helper as pre-existing.)
18
+ - **History is a secondary signal.** Scan the commit list for what the net diff hides: a secret added then removed (a real leak — it lives in history), an unsafe intermediate migration state, or a large unrelated change buried mid-history. Otherwise the net diff governs.
19
+
20
+ ## Spec Compliance Review
21
+
22
+ Verify whether the PR does what it is supposed to cover:
23
+
24
+ ### Round-1 depth (deep-lane reviews only)
25
+
26
+ These four checks apply when the caller flags the PR **high-risk**
27
+ (`resolve-issues/references/high-risk.md`) or the diff changes a contract other
28
+ first-party code consumes; on those PRs they are round-1 obligations, not
29
+ optional follow-up work. On a routine lean-lane PR, skip them without ceremony:
30
+
31
+ - **Live endpoint probing:** exercise each changed live endpoint against the
32
+ real running surface, including the relevant authorization, boundary,
33
+ pagination/filter, and failure cases. Record a concrete command/result or
34
+ return `BLOCKED` when the required live surface cannot be exercised.
35
+ - **Shared-consumer impact:** enumerate every shared first-party consumer of
36
+ the changed contract/surface, trace the producer's value into each consumer,
37
+ and exercise the affected consumer path. `Not applicable` is allowed only
38
+ when there is no live endpoint or no shared first-party consumer, and must
39
+ include a specific reason and evidence locator. `deferred`, `later`, and an
40
+ omitted check are not valid statuses.
41
+ - **Invariant enforcement-point inventory:** when the diff declares or relies
42
+ on an invariant that must hold at more than one place, state the invariant in
43
+ one sentence, enumerate every point that must enforce it — searching the
44
+ **tree**, not the diff, since the diff only shows where the author already
45
+ did — and record enforced/not-enforced plus a locator per point. Every
46
+ unenforced point is a round-1 finding.
47
+ - **Presentation state matrix:** when the diff changes what a browser surface
48
+ renders, enumerate the repo's supported presentation dimensions
49
+ (locale × viewport/input-modality × action state × theme) and record a
50
+ per-cell result. Touch is a distinct cell from pointer and keyboard.
51
+
52
+ Obligations 3 and 4 are **sweeps** — enumerate the space, check every cell,
53
+ report per-cell — and they are also where the contract-complete matrix gets
54
+ built, at round 1 rather than on the recurrence § Theme reconciliation below
55
+ waits for. Full method, over-application guard, and the named incidents behind
56
+ each: [round1-depth.md](round1-depth.md).
57
+
58
+ The reviewer records `completed` or `not-applicable` plus evidence for each
59
+ obligation in the review result. A relevant obligation without evidence blocks
60
+ the verdict; it cannot be silently moved to round 2.
61
+
62
+ - Compare source requirements and test criteria ACs against the PR's claimed AC coverage.
63
+ - Check every required behavior has implementation, test evidence, and the required test level.
64
+ - **Verify each AC's *outcome*, not the mechanism's *shape*** — the presence of the right call, component, or constant is *not* the AC; the user-visible result for the **real input** is:
65
+ - **Instantiate the AC with the value the app actually produces at runtime**, not the convenient one a test happens to assert. When a handler branches on one form of a value while the real provider emits another, it fails for every real user — a test pinned to the proxy value is evidence for a case that never occurs.
66
+ - **Exercise realistic, legacy, and default/empty-state data, not just the happy-path fixture** — migrated, imported, and null-bearing rows are usually the ones the AC exists to protect.
67
+ - **Trace the value end-to-end to its producer.** A consumer referencing the right field proves nothing if the path that writes it never populates it; forward-tracing only the consumer is the half that hides this.
68
+ - Verify tests are behavior-first and assert outcomes, state, contracts, side effects, permissions, and failures, not just internal functions.
69
+ - Challenge mock/fake claims: mocks must not bypass the core behavior under review.
70
+ - Check for missing edge cases, negative paths, backward compatibility, observability, and migration/backfill requirements.
71
+ - Confirm known gaps are explicit and approved; `None` must be challenged against the diff and tests.
72
+ - **An AC is satisfied only by a test that actually runs and asserts the behavior.** A proving test that is `test.skip()`'d, guarded into a no-op (`if (!data) test.skip()` / `if (!x) return`), or rewritten to assert on a degraded state (a 404 / not-found / empty page where the name promises a real rendered result) is **not evidence** — mark that AC `Missing` / `Unverified`, never PASS, no matter what the AC table or a green CI box says. An AC line in the Review Contract that cites a skipped/guarded test is a failed attestation, not a pass.
73
+ - **A test's `@level` tag is a claim; verify the assertions earn it, not just the label.** Read what the test actually asserts, not the tier it advertises. A spec tagged `@level journey` that only checks the page loads (`response.ok()`) and *a* form element is visible — especially a weak disjunction like `expect(hasEmail || hasPassword || hasButton).toBeTruthy()` with `.catch(() => false)` swallowing locator errors — is a **smoke test wearing a journey label**: mark it `Wrong Level`, not PASS. A journey must drive the multi-step flow it names to a real outcome (log in and land authenticated, place the order and see it persisted), not assert that a control is merely present. The same trap one tier down: a `@level functional` test that only proves render is a smoke test.
74
+ - **CI green is a proxy for coverage, not the goal — challenge how it was achieved.** A PR that turned red tests green by *skipping*, *guarding*, or *weakening assertions* (instead of fixing the cause or **seeding the required state** — `ensure-coverage` → seed-don't-skip) has manufactured the signal; that is `NEEDS_CHANGES`. Tell-tale in the diff: new `test.skip(`, a tightened-then-loosened assertion, or a status/exact-match assertion swapped for a fuzzy body-text match in the same hunk that made CI pass.
75
+ - **Scan for test smells — as leads, not auto-findings** (doctrine + gate-vs-lead rationale: `ensure-coverage` → [`depth/test-smells.md`](../../ensure-coverage/references/depth/test-smells.md)). The decidable ones are already gated (`Erratic`→`no-fixed-timeout`/quarantine; an empty placeholder body→`no-empty-test`); these three need your reading:
76
+ - **Missing Assertion** — a test with statements but no assertion. The empty-body floor is linted; the rest isn't decidable (it may assert through a helper like `await verifyDashboard(page)`), so *read it* — confirm the helper asserts, or mark the test a no-op. (`depth.asserts-something` checklist row.)
77
+ - **Obscure** — the name doesn't describe the behavior it asserts (non-DAMP), or the failure message wouldn't point at the cause. A test you must reverse-engineer to understand is a maintenance liability even when green.
78
+ - **Slow** — slow *for its tier* (a unit test doing real IO, a journey padded with avoidable waits). Not a blocking gate (runtime is environment-sensitive); flag it and push the test down the pyramid or fix the wait.
79
+
80
+ ### Reviewer attestation
81
+
82
+ You are the attestation point in the coverage chain. A coding agent's self-declared `@level` is a *claim*; ensure-coverage leaves a satisfied-but-uninspected surface at a **blocking `Unverified`**. Promote it to `Covered` only after reading the actual test and confirming it proves the behavior at the required level with acceptable mock use. Classify each AC and changed surface with ensure-coverage's vocabulary — `Covered` / `Partial` / `Missing` / `Wrong Level` / `Over-mocked` / `Unverified` / `Excluded` — not a vague "covered." Name the specific depth traps it defines instead of a generic "mocks are weak": first-party interception (`page.route`/`route.fulfill`/MSW) counted as a journey is `Over-mocked`; a browser route proven only by API tests is uncovered; a write form needs a rendered-form mutation journey (split-contract trap). Full vocabulary + traps: `ensure-coverage` → `references/depth/grading.md`.
83
+
84
+ ## Coverage Breadth Review
85
+
86
+ This is the only pass that catches a surface **no acceptance criterion mentions** — the un-specced route the AC table is structurally blind to. The doctrine (Coverage Ledger, Surface Baseline Contract, alignment/depth statuses, the validator) lives in the `ensure-coverage` skill; apply it here rather than restating it.
87
+
88
+ For surfaces the PR adds or changes:
89
+
90
+ - Run or inspect ensure-coverage's coverage gate — `scripts/coverage-ledger.mjs validate` (or the repo's wrapper) — and reconcile it against the PR's Obligation Impact block. A missing Obligation Impact for a surface-changing PR is itself a defect.
91
+ - Flag `Orphan surface` (a new surface no requirement owns — confirm it still meets its auto-applied baseline floor), unmet baseline / `Missing` / `Wrong Level` / `Over-mocked` on a changed surface, and `Unrealized requirement` / `Stale link`.
92
+ - Check exclusion governance: an exclusion is valid only when gated (a `reachable` `mutation` route can never be excluded), carries a `category` + `reason`, and appears in the census. Reject a blanket "exclude to go green."
93
+ - For changed **browser routes**, confirm the presentation sweep ran (separate gate) and the route has a real-render result — a green functional spec is not the presentation gate. See `e2e-test` → `references/presentation-sweep.md`.
94
+ - A green AC table does not clear this pass. An un-ACed surface that fails its baseline is `NEEDS_CHANGES`.
95
+ - **Require the completed Coverage Checklist where a Review Contract is required** (the method-tagged table in it; `ensure-coverage` → `process/review-contract-template.md`) — a Code-only PR carries no contract and so owes no checklist, but the ledger/baseline gate below still runs, because that answers to the repo rather than to the PR (SKILL.md § Review mode). Run `coverage-checklist.mjs validate <checklist> --diff <merge-base>` on it: every row must be a PASS/FAIL/N-A with a checkable evidence locator (`file:line` / `` `command` `` / #issue), no gate row left `TODO`, every cited `file:line` **resolving in the tree**, and every gate row carrying the gate's *result* rather than its command alone. Pass the `--diff` — it exempts paths the PR deletes, warns on locators outside the net diff, and is what lets a missing cited file block rather than merely warn (without it, a deletion and a stale locator are indistinguishable). A line past the end of an existing file blocks either way. The **gate-lint** rows you can trust as auto-filled; spend your attention on the **lead** rows (adjudicate each surfaced candidate) and **judgment** rows (meaningful assertions, mock acceptability, perceivability) — a row whose "evidence" is prose with no locator is not done, exactly like a finding with no code location.
96
+
97
+ ## Code Correctness Review
98
+
99
+ ### Theme reconciliation and contract-complete fixes (deep lane)
100
+
101
+ In the deep lane (`resolve-issues/references/high-risk.md`) — and on any
102
+ `state-machine`/`concurrency` finding anywhere — findings carry a stable theme
103
+ id and the general violated contract; `theme` is optional on routine lean-lane
104
+ findings. On a second consecutive finding with the same id, verify that the
105
+ reviewer names the contract and that the requested fix is contract-complete:
106
+ construct the full declared `states × taskKinds` matrix, check a test/evidence
107
+ locator for every cell, and check one evidence-located adjacent-state entry for
108
+ every declared state. A same-theme recurrence is an input to resolve-issues'
109
+ circuit-breaker diagnosis (step 3), not a verdict of its own. Two rounds that
110
+ both say `NEEDS_CHANGES` are not that signal; a different or non-consecutive
111
+ theme is a different signal.
112
+
113
+ **A same-theme recurrence is also a signal about the round-1 sweeps.** When
114
+ obligation 3 or 4 ([round1-depth.md](round1-depth.md)) applied, the theme was
115
+ enumerable before round 1 and the recurrence means the sweep under-enumerated —
116
+ so build the matrix *and* say which sweep missed it, because the caller's cost
117
+ was already paid in rounds. When neither obligation applied, the recurrence is
118
+ the ordinary discovery signal this section was written for.
119
+
120
+ Inspect the implementation for bugs independent of contract compliance:
121
+
122
+ - **Read the code; do not trust the PR's narration of it.** The title, body, commit messages, and inline code comments describe *intent*, not behavior — they are claims to verify, not evidence. "Validates the token", "handles the empty case", "this is backward-compatible" must each be confirmed at the actual call site / branch / signature; a comment can lie or rot. Any divergence between what the change *says* it does and what the code *actually* does is itself a finding (either the description is wrong — fix it — or the code is). The same goes for test names: a test called `rejects expired tokens` proves nothing until you read that it actually drives the expired path and asserts the rejection.
123
+ - Look for incorrect logic, error handling gaps, race conditions, idempotency bugs, retry/recovery issues, and async ordering problems.
124
+ - Check auth, tenant isolation, permissions, data exposure, money movement, irreversible state changes, and auditability where relevant.
125
+ - Review schema/migration safety, backwards compatibility, serialization/API contracts, and failure modes.
126
+ - Check test quality: meaningful assertions, no disabled/weakened tests, no tests that only verify mocks or implementation calls.
127
+ - **Hunt vacuous assertions — the full catalogue of forms that sank the #237 login regressions** (green while the primary button rendered invisible and the QR panel crashed): a rejection swallowed by a chained `.catch(...)` (`expect(...).not.toBeVisible().catch(() => {})`); an assertion guarded by a try/catch that re-passes; a `waitForTimeout` standing in for a real wait condition; a presentation/journey test asserting against a *stubbed* DOM instead of the real rendered surface. The directly-chained `.catch` and fixed timeout are gated by `lint-tests` (`no-swallowed-assertion`, `no-fixed-timeout`) where wired — assume they did not run.
128
+ - **Reject assertions that pass on a degraded page.** A test whose name promises a real rendered result (a checkout form, an order detail) but asserts on a *404 / not-found / empty / error* body is a false pass — it goes green precisely when the feature is broken or the state was never seeded. Two findings hide here: the test (re-point it at the real, seeded path) **and** the degraded response itself — e.g. a route returning HTTP 200 with not-found *content* is a status-code bug to file, not a behavior to assert around. A "store not found" body in a test for an existing merchant usually means the merchant was never seeded, not that not-found is the expected outcome.
129
+ - **Any test the PR skips or disables is `NEEDS_CHANGES`.** The committed suite contains only tests that run — a PR may not add `test.skip` / `xit` / `describe.skip`, a conditional skip, or a disguised `if (!x) return` guard. A missing precondition is **seeded**; an un-sandboxable or genuinely flaky case goes to the **quarantine lane** (non-blocking, still runs and reports, surface graded `Unverified`), never skipped. A `TODO`/issue link does **not** authorize a skip — it's a confession the work was deferred, especially when the text names the seed path (`re-enable when we seed a payment_live merchant via /api/e2e/setup`). (Inherited pre-existing skips are a note, not a blocker, per diff-discipline — but a PR may not add one. Full per-case map: `ensure-coverage` → `process/test-strategy.md`, `e2e-test` → `authoring/test-skipping.md`.) Likewise a *cosmetic* response to a finding (a TODO comment, a case-insensitivity tweak, a renamed reason) does not resolve it — re-verify the behavior changed, not the wording.
130
+ - **A concurrency test proves only the state its fixture starts from.** When a test names itself a race and its fixture reads state an earlier test already created (`plan!.id`, `find*OrThrow`) before the `Promise.all`, every "concurrent" caller takes the already-exists early return and the contended first write is never exercised — green, and the race untested. Read the fixture's starting state, not the test's title: a first-write race needs zero pre-existing rows, independent clients, and a barrier. `scan-diff.mjs` surfaces the shape as the `concurrency-test-preexisting-fixture` lead; it stays a lead because a deliberate post-create *replay* test looks identical — what makes it a defect is an AC citing it as first-write proof. (Named incident: skyee-ai-risk #938, where a test titled "replays and races" started from an already-sealed plan; the real first-seal race rejected the losing caller with Prisma `P2034`, and it took five real-PostgreSQL trials to find what the fixture said outright.)
131
+ - Flag broad unrelated refactors, hidden scope changes, dead code, brittle abstractions, and maintainability risks when they affect correctness or reviewability.
132
+
133
+ ### Narration drift (prose contradicting the code)
134
+
135
+ The "read the code, don't trust the narration" bullet above, made into a systematic screen — because in a prose-heavy repo *prose contradicting the code it describes* is the single most common blocking finding, and in a skills/doctrine repo the prose **is** the product: a stale rule stated as operative is a live instruction to the next agent, not a cosmetic nit. For the net diff:
136
+
137
+ - **Comment / docstring / `--help`/USAGE vs the code beneath it.** Read each changed hunk's prose against the behavior it narrates. A comment or USAGE string that states an exit code, a flag's required/optional status, a default, or a rule the code no longer follows is a finding — they disagree; fix the wrong one.
138
+ - **PR-body claim vs the test that asserts it.** For each behavioral claim in the body ("`--stale-only` drops mixed-provenance entries"), find its test. When the test asserts the opposite (the code *keeps* them, the test pins kept), the body inverts tested behavior — a finding against the body.
139
+ - **A superseded/aspirational rule stated as operative.** A section-header comment or doc line stating a rule the code has since replaced — especially in doctrine agents execute — is the reintroduction vector for the removed rule; flag it even when the code is correct, because the prose is a second, wrong instruction. (After a rebase, confirm this by diffing the resolved file against the new base — `git diff <new-base>...HEAD` — not by grepping for the one marker you expected, which hides every *other* change the conflicting side made.)
140
+
141
+ **Blocking calibration.** Where the prose *is* the product — a skills/doctrine repo, a `--help`/USAGE contract, a comment stating a rule agents follow — a stale-rule-as-operative or a USAGE/flag/exit-code falsehood maps to the **spec-contradiction** blocking class (`NEEDS_CHANGES`). Elsewhere a purely cosmetic comment nit (a typo, a dated example with no behavioral claim) stays a **note inside `PASS`**. The test is behavioral consequence — *would an agent or user act wrongly on the prose?* — not "is the comment stale."
142
+
143
+ **Decidable floor (pointer-resolution subset only).** One slice of this class is mechanized: that a cited `scripts/*.mjs --help`, a doc `#anchor`, or a reference link *resolves* is guarded by `reference-links.test.mjs` and `help-pointers.test.mjs`, and `scripts/scan-diff.mjs` fails loud rather than stamping a vacuous clean on empty input. Those check only that the **target exists** — not that the prose about it is **true**. The bulk (a comment stating a stale rule, a USAGE misstating an exit code, a body inverting a tested behavior) resolves fine and is still wrong; it is **semantic, and the reviewer's job — no script catches it.** Never record "enforced by the script" for the semantic part: claiming a guard catches narration drift is itself the narration-drift defect this screen exists to catch.
144
+
145
+ ### Adversarial techniques (how to be adversarial, not just "be adversarial")
146
+
147
+ "Be adversarial" is empty without a method. The unifying move is to **produce the counterexample, not an opinion**: construct the specific artifact that would fail — and cite it — rather than asserting the code "looks fine" or "might be risky." A finding with no concrete trigger is a hunch. Concretely:
148
+
149
+ - **Diff each new/changed function against its siblings.** Functions rarely live alone — find the family (same module, same naming pattern, same role: a set of `detect*` / `validate*` / `is*` / `parse*` functions) and compare their logic line by line. A function that diverges from its established siblings — handles a case they handle differently, uses a looser or tighter pattern, orders its guards differently, omits a branch the others all have — is a defect until the divergence is justified. Name the sibling and the exact divergence (e.g. "`detectOverMockedEvidence` matches `route.fulfill` but its sibling `detectTier1UiOnlyEvidence` also matches `page.route(` — the first will miss that vector"). Two functions that *should* behave alike but quietly don't is one of the most common real bugs a green test suite hides.
150
+ - **Break patterns with boundary inputs.** For any regex, glob, string match, or parser the diff adds or changes, construct the input that breaks it before trusting it: prefix/substring leakage (does `/foo` also match `/foobar`? is the match anchored `^…$`?), word boundaries, empty/whitespace, case, escaping/metacharacters, unicode, and very long input. Over-broad or under-anchored patterns are a classic silent bug. Put the concrete failing string in the finding.
151
+ - **Name a test for every new branch.** For each conditional, `else`, early return, ternary, switch case, and error path in the diff, identify the test that drives it. A branch with no test is unproven even when the line shows as "covered" — line coverage is not branch coverage. List each untested branch as a gap (this is the depth-axis check applied to the PR's own logic; classify with ensure-coverage's vocabulary).
152
+
153
+ These are model-independent: a less meticulous model still has to run the checklist, so the rigor comes from the skill, not from getting lucky with a careful reviewer.
154
+
155
+ ## Standards Review
156
+
157
+ Review documented repository standards separately from spec compliance and code correctness. Do not invent standards; cite documented sources.
158
+
159
+ Look for standards sources such as:
160
+
161
+ - `AGENTS.md`, `CLAUDE.md`, `CONTRIBUTING.md`, `README.md`, `STYLE.md`, `STANDARDS.md`, `STYLEGUIDE.md`.
162
+ - Architecture docs, ADRs, context docs, or design conventions under `/docs/`.
163
+ - Machine-enforced configs like `eslint.config.*`, `biome.json`, `.editorconfig`, `prettier.config.*`, and `tsconfig.json`; note them but do not duplicate checks that CI/tooling already enforces.
164
+
165
+ Report only standards violations grounded in a cited source. Distinguish hard violations from judgment calls. If no standards source is available, state `Standards: Not assessed — no documented standards found`.
166
+
167
+ ## Mock & Integration Review Rules
168
+
169
+ The boundary doctrine — *real internals, faked externals, nothing in between* — is owned by `ensure-coverage` → `references/depth/mock-policy.md`. Apply it here; the review-facing essence:
170
+
171
+ - **Accept** mocks for: external provider failure injection (timeout/decline/malformed), isolating pure logic, asserting an external side effect was *not* called, and deterministic replacement of systems not under test.
172
+ - **Reject mock-only** for: DB transactions, idempotency/duplicate delivery, concurrency/races, event/outbox/retry/recovery, auth/tenant isolation, serialization/schema/API compatibility, orchestrator crash recovery, and money/irreversible state. Money movement, auth, and idempotency can never be mock-only even with approval. (This is the broader mock-only *judgment*; the approval path here never extends to the internal-seam case below.)
173
+ - **Mocking a first-party internal seam is zero-tolerance — not your call to approve.** A `vi.mock`/`jest.mock` of a first-party seam module is gate 5 (`mock-internal-seam`, ensure-coverage `references/depth/mock-policy.md`): default-on, **no `@mock-ok` waiver, no reviewer approval.** Do not bless one "with justification." Your residual role is the over-mock the lint *can't* decide (cross-file: does a real-boundary sibling actually exist?) — and you judge that by the same rule, not a softer one. A confirmed internal-seam over-mock on a changed surface is a **blocker**, and the only resolutions are: make it real, fake only the external, or **delete the test** (over-mock is worse than no test). A false positive is fixed by correcting topology in `coverage.config.json`, never waived.
174
+ - Prefer integration evidence with real app code, real DB/migrations or test containers, broker emulator where practical, fake external adapters, and assertions on final durable state plus emitted events.
175
+
176
+ ## Calibration — the finding bar (the verdict)
177
+
178
+ Adversarial in the *search*, calibrated in the *report*. The techniques above are tuned to surface problems; this bar keeps the verdict signal rather than noise — it is the deliberate counterweight to the adversarial stance, not a softening of it.
179
+
180
+ - **Defensible and provable.** Every finding cites the diff hunk (and, for ripple effects, the *provably affected* code) — not a speculation that something "might" break elsewhere. If a conclusion rests on an inference, say so and keep the confidence honest.
181
+ - **Discrete and actionable.** One finding = one concrete, fixable issue — not a bundle, not a general grievance about the codebase. Each answers: what can go wrong, why this path is vulnerable, the likely impact, and the concrete change that reduces it.
182
+ - **The author would fix it.** Flag what the original author would plausibly act on; don't flag intentional changes, and don't rely on unstated assumptions about their intent.
183
+ - **Rigor proportional to the codebase.** Don't demand prod-grade validation or comments in a repo of one-off scripts — match the bar the surrounding code already holds.
184
+ - **Prefer a few strong findings over many weak ones.** Don't dilute a serious issue with filler; order findings by severity. If the change looks safe, say so plainly and return no findings — "no blocking issues" is a valid, valuable verdict.
185
+
186
+ Attack hard while searching; then report only what survives this bar.
187
+
188
+ ### What not to flag (per-check guards)
189
+
190
+ The adversarial techniques are tuned to surface candidates; each has a matching over-flag trap. A threshold or pattern crossing is a *hint, not a verdict* — check context, intent, and blast radius before it becomes a finding. Do **not** raise:
191
+
192
+ - **Sibling divergence that is justified** — a function differing from its family because its case genuinely differs (documented or self-evident from the inputs). Flag the *unexplained* divergence, not every difference.
193
+ - **An unanchored pattern whose inputs are bounded** — a regex without `^…$` is fine when it matches against a closed, validated set where leakage cannot occur. Produce the boundary input that actually breaks it, or drop it.
194
+ - **A branch with coverage elsewhere** — an "untested" branch already exercised by an integration/E2E test, or a trivial guard whose failure is inert. Name branches whose failure is *observable and unproven*.
195
+ - **A mock at a real external boundary** — a fake/stub for a third-party API, clock, email/SMS, or randomness is correct, not Mock Abuse. Reject mock-only only for the owned-internal list (DB/idempotency/concurrency/events/auth/money).
196
+ - **Pre-existing issues unrelated to the diff** — a non-blocking note at most (diff discipline), never `NEEDS_CHANGES`.
197
+ - **Style/structure below the repo's own bar** — don't demand prod-grade rigor in a one-off-scripts repo, or comments/validation the surrounding code doesn't hold.
198
+
199
+ The throughline: a finding must clear *both* the search (it's real) and these guards (it's worth the author's attention). When unsure, lower the confidence and say what you couldn't rule out — don't inflate a guard-tripping candidate into a blocker.
@@ -0,0 +1,30 @@
1
+ # Review mode: Spec'd or Code-only
2
+
3
+ The one decision that changes what is in scope — and the long list of things it
4
+ deliberately does not change. Indexed from [SKILL.md](../SKILL.md#routing).
5
+ Inputs feeding this decision: [inputs-and-discovery.md](inputs-and-discovery.md).
6
+
7
+ ## Review mode: Spec'd or Code-only
8
+
9
+ Decided once, here, before any axis runs. The mode selects **what is in scope** — never how hard you look at what is.
10
+
11
+ - **Spec'd** — Source Discovery found a requirement artifact that *constrains this diff*: a Review Contract, ACs in the issue or PR body, a PRD/design doc, or test criteria. Run all four axes, enumerate every AC individually, and check [contract-revision ancestry](#contract-freshness-and-precedence).
12
+ - **Code-only** — it found none. Review the code and its tests. **Exactly one thing leaves scope: the spec-compliance axis** — the ACs, their evidence table, and revision ancestry. Record it once in the output header — `Mode: Code-only — no requirement artifact found; spec compliance not assessed` — so a reader can tell "not checked" from "checked and clean", then never raise it again: no finding, no note, no effect on the verdict.
13
+
14
+ **Deciding between them.** An artifact counts only if it constrains the diff enough to be *checkable*: a title-only issue, a PR body that narrates what the diff obviously does, or a design doc the diff merely touches are **not** specs — reviewing against them manufactures ACs nobody wrote. Prefer Code-only when the artifact would not let you *write* a single AC row at all — judge the **artifact's** specificity, never whether the PR happens to satisfy it. A spec'd PR with no tests still writes its rows and fails them; if unmet ACs could flip the mode, the axis would switch off exactly when it was about to fail, which is BLOCK-3's shape inverted. Say which artifact selected Spec'd, so the choice is auditable rather than a vibe.
15
+
16
+ **A missing spec is never a verdict.** Not `FAIL`, not `NEEDS_CHANGES`, not a request to go write a contract. Most repos and most PRs have no spec, and a review that stops to demand paperwork has spent a round without reading the code — which is the opposite of the job. If a *caller* requires a contract, enforcing that is the caller's gate, upstream, before it spends a review: `resolve-issues` does exactly this pre-spawn and bounces a contract-less handoff without paying for a review. A reviewer handed a diff reviews the diff.
17
+
18
+ **What does not vary with mode:** the [four non-negotiable principles](../SKILL.md#non-negotiable-principles--you-are-the-first-line-of-enforcement), code correctness, domain hazards on high-risk surfaces, standards, `scan-diff`'s findings channel, [round-1 depth](review-posture.md#round-1-depth--runs-in-both-modes), the presentation/`visual-gate` check, golden-path smoke, the self-weakening rule, and any **baseline/ledger floor the repo wires** — that last one is per-*repo*, so it never went missing with the PR's spec.
19
+
20
+ The dividing line is **what the check is defined against**. Anything judged against the *diff* survives — an over-mocked test, a skip-to-green, a vacuous assertion, a bug fix with no fails-without-fix test, a shared-contract change. Anything judged against the repo's *baseline* survives, because the baseline is still there. Only what is judged against *this PR's spec* can go missing, because only that artifact is absent. Reach for the mode gate solely when a check has no meaning without the ACs — and if you find yourself gating something else, that is the over-scoping this section exists to prevent.
21
+
22
+
23
+ ### Contract freshness and precedence
24
+
25
+ **Trigger for the *ancestry* check: Spec'd mode, and the caller supplied a contract-revision SHA** — that is what makes ancestry checkable, and Code-only mode has nothing to be stale against. Full precedence rules: [references/contract-freshness.md](contract-freshness.md).
26
+
27
+ **The two conduct rules below are not part of that trigger and run in *both* modes.** They are about what the PR does, not about a revision, and one of them is why: **an implementation PR cannot make itself compliant by weakening its own source or test criteria** unless that source change is itself explicitly approved — the self-weakening gaming vector, and the one a standalone review is most likely to face. Read that together with mode selection and the reason it cannot be mode-gated is plain: **mode is computed from the PR's own HEAD, so a PR that deletes its test criteria would select Code-only and switch off the very rule written to catch the deletion.** A diff that removes or weakens a spec artifact is a finding in either mode — and in Code-only it is worth *more* attention, since the deletion may be why Source Discovery found nothing. The second rule: **do not silently combine incompatible contracts**; say which one governs.
28
+
29
+ The blocking rule: **verify PR HEAD contains that revision before any approval can count** — ancestry failure is `NEEDS_CHANGES`, and pre-revision verdicts, CI and runtime evidence are historical only.
30
+
@@ -0,0 +1,53 @@
1
+ # Review posture and the four axes
2
+
3
+ The adversarial stance, the subject of review, the four axes kept separate, and the
4
+ round-1 depth trigger. Indexed from [SKILL.md](../SKILL.md#routing). The full method
5
+ behind the axes is [review-method.md](review-method.md); the depth obligations are
6
+ [round1-depth.md](round1-depth.md).
7
+
8
+ ## Review Posture
9
+
10
+ Be adversarial but fair: try to disprove readiness. A PR is not correct because the contract says it is; it is correct only when the contract, source spec, test criteria, tests, and diff agree. Look for contradictions, missing behavior, untested edge cases, weak mocks, implementation bugs, and hidden scope changes.
11
+
12
+ When the runtime supports a dedicated review subagent, use `references/adversarial-reviewer-prompt.md`. If subagents are unavailable, apply that stance inline.
13
+
14
+ **The subject is the diff.** Review the net change-set — `git diff $(git merge-base <target> HEAD)...HEAD` (three-dot; the changes that would merge, reviewed cumulatively, not per-commit). Scope findings to what the change *introduces*: a pre-existing issue is a note, never a `NEEDS_CHANGES`; a blocking finding must be attributable to this diff (trace into unchanged code only to *prove* impact). Then, across the axes in scope for your mode, be **adversarial in the search and calibrated in the verdict**. Subject → search → verdict is the whole method; detail in [references/review-method.md](review-method.md).
15
+
16
+ Do not stop at style review. Keep the **four axes** separate so one does not mask another — **Code-only mode runs the last three; only spec compliance switches off** (detail: [references/review-method.md](review-method.md)):
17
+
18
+ - **Spec compliance** — **Spec'd mode only; in Code-only mode this axis does not run, and its absence is not a finding.** Does the PR implement and test what it was supposed to cover? You are the **attestation point**: a self-declared `@level` is a claim; promote a `Unverified` surface to `Covered` only after reading the actual test. Classify with ensure-coverage's vocabulary, not a vague "covered." **When the source — issue, PR body, Review Contract, or test criteria — states acceptance criteria, enumerate every one and verify it individually**: one row per AC in the [Acceptance Criteria Review table](output-format.md), each resolved to the `file:line` of a test that *runs and asserts* that behavior (a skipped/guarded/degraded test is not evidence — [review-method.md](review-method.md)). An AC with no such evidence is `Missing`/`Unverified` and **blocks `PASS`**, regardless of a green CI box, a passing-looking test name, or a self-declared AC table. Never collapse multiple ACs into one "looks covered" judgment.
19
+
20
+ **Verify each AC's *outcome*, not the mechanism's *shape*** — the deeper trust failure than trusting the narration. The presence of the right call, component, or constant is *not* the AC; the user-visible result for the **real runtime input** is — instantiated with the value the app actually produces, exercised against realistic/legacy/empty-state data, and traced end-to-end to its producer (the three checks: [review-method.md](review-method.md) § Spec Compliance). Shape-matching the implementation against the claim is how code that is *present* still produces the *wrong* outcome.
21
+ - **Coverage breadth** — **gated on whether the repo wires a baseline, not on the review mode.** The two are different artifacts and conflating them is the trap: mode comes from a *per-PR* spec, while the Surface Baseline Contract is *per-repo*. `ensure-coverage` → [breadth/surface-baseline.md](../../ensure-coverage/references/breadth/surface-baseline.md) opens by settling it — *"A requirement source (ADR/PRD/spec) is **not** a precondition for a test obligation; every surface carries a minimum floor the instant it is discovered"* — and closes with *"the baseline test obligation is the hard gate."* So where a ledger/baseline **is** wired, run it in **both** modes: a spec-less PR adding a reachable mutation route still owes its floor, and skipping the gate because nobody wrote a PRD is exactly the weakening § Coordination With ensure-coverage forbids. Where **no** baseline is wired, there is no completeness bar to fail and you do not invent one — that is the honest gap, in either mode.
22
+
23
+ Run/inspect `coverage-ledger.mjs validate` and reconcile against the Obligation Impact block. A green AC table does not clear this pass; an un-ACed surface that fails its baseline is `NEEDS_CHANGES`. What **is** Spec'd-mode-only here is the reconciliation *against ACs* — with no ACs there is nothing to reconcile, but the floor still stands.
24
+
25
+ Honesty runs in both modes regardless — principle 3's per-route line: a route with no test is a tolerable gap either way; a route whose test is over-mocked/skipped/weakened is a blocker either way.
26
+
27
+ - **Presentation sweep and `visual-gate` — both modes.** For changed browser routes, confirm the presentation sweep ran; for a surface that opted into `presentation:visual`, confirm the `visual-gate` result is present and any baseline change is a declared intended UI change. This is **principle 2**, which § Review mode lists among the things that do not vary — a bare `--update-snapshots` to green is a blocker with or without a spec.
28
+
29
+ - **Golden-path smoke — trigger: the diff touches a critical do-not-ship journey. Both modes.** The trigger is read off the diff, like round-1 depth's, so it does not switch off with the spec. Confirm `smoke.manifest.json` covers it and the gate ran. [references/golden-path-smoke.md](golden-path-smoke.md)
30
+
31
+
32
+ - **Code correctness** — logic, error handling, races, idempotency, auth/tenant isolation, money/irreversible state, schema/migration safety, test quality. Five distinct rules, named separately because a reviewer who skips one cannot otherwise tell which:
33
+ - **Hunt the domain hazards** when the diff touches a **high-risk** surface — auth/authz/token, money/tax, tenancy/org-scope, migration ([references/domain-hazards.md](domain-hazards.md), plus the repo's own hazards file). Scoped, not universal: applying the hazard catalogue to every diff is the process-weight direction, not rigor.
34
+ - **Every blocking domain-semantic finding carries a `hazard_candidate`** — the ready-to-paste hazards-file row, or `covered_by: <id>`. You are read-only; the fix commit writes the row and the re-review verifies it.
35
+ - **Changed behaviour owes a characterization test** pinning what it did before — or a declared intended change **with its AC and the assertion delta visible in the diff**. Resolve `depth.characterization` against a `file:line`, never against narration: "the change is intended" asserted in a PR body is the claim, not the evidence.
36
+ - **Narration drift is a defect**: a PR body, comment or test name describing behaviour the code does not have is a finding, not a nitpick.
37
+ - **Be concrete** — every finding needs a real `file:line` and the input that breaks it. A finding you cannot produce a failing case for is a note, not a blocker.
38
+
39
+ Full rationale for each: [references/code-correctness.md](code-correctness.md).
40
+
41
+ - **Standards** — documented repo standards only, cited; distinguish hard violations from judgment calls.
42
+
43
+ Mock boundary for the breadth/spec passes: *real internals, faked externals* — reject mock-only for DB/idempotency/concurrency/events/auth/money; accept for external failure injection. Full rules: [references/review-method.md](review-method.md) (owned by `ensure-coverage` → `references/depth/mock-policy.md`).
44
+
45
+
46
+ ### Round-1 depth — runs in **both** modes
47
+
48
+ **Trigger: the caller flagged `highRisk`, *or* the diff changes a contract other first-party code consumes, *or* the delta stands up an enforcement point of an invariant (validator, verifier, guard, promotion check) — that third at whatever round it is born, re-reviews included.** No disjunct needs a spec — one is a caller flag, the other two are read off the diff you already have — so this is **not** part of the spec axis and does not switch off in Code-only mode. A high-risk PR with no written spec is if anything the case that most needs it. The last two are yours to detect, not the caller's to pass: both are visible in the diff you are already reading.
49
+
50
+ Before the first verdict: probe each changed live endpoint against the real running surface; trace the changed contract through every shared first-party consumer; **inventory every enforcement point of any invariant the diff declares** (validators, boundary guards, promotion checks — the set is larger than the consumers); and **enumerate the presentation state matrix** for any changed browser surface (locale × viewport/input-modality × action state × theme). Record concrete evidence for each, or `not-applicable` with a specific reason — **never a silent deferral to a later round**. Full obligations: [references/round1-depth.md](round1-depth.md).
51
+
52
+ The last two are **sweeps**: enumerate the space, check every cell, report per-cell. **Enumerating first is what makes rounds 2..N fixing rather than discovering** — the reasoning and the named incidents are in [references/round1-depth.md](round1-depth.md).
53
+
@@ -0,0 +1,62 @@
1
+ # Round-1 depth obligations
2
+
3
+ **Trigger: the caller flagged the PR `highRisk`** (auth/money/tenancy/migration), **or the diff changes a contract other first-party code consumes** — the second is detected by reading the diff, not passed by the caller. Units meeting neither do not run this — applying it broadly is the process-weight regression `resolve-issues` row 7 names.
4
+
5
+ **Round-1 depth obligations (deep-lane reviews only).** When the caller flags the PR **high-risk** (auth/money/tenancy/migration — `resolve-issues/references/high-risk.md`), or the diff changes a contract other first-party code consumes, or the delta stands up or changes an **enforcement point of an invariant** (validator, verifier, guard, promotion check), the four obligations below are owed **before returning the first verdict**. On that third trigger read "first verdict" as *the first verdict that sees this component* — an enforcement point born in a fix round owes obligation 3 at that round, or it is sampled by every review and swept by none. `Not applicable` needs an explicit reason; `deferred` is not an applicability result, and `BLOCKED` is the honest verdict when the required surface can't be exercised. On a routine lean-lane PR, skip this without ceremony — applying deep-lane depth everywhere is mis-spent review budget, not thoroughness.
6
+
7
+ ### 1. Live endpoint probing
8
+
9
+ Probe each changed live endpoint against the real running surface, including the relevant authorization, boundary, pagination/filter, and failure cases. Record a concrete command and result.
10
+
11
+ ### 2. Shared-consumer impact
12
+
13
+ Trace the changed contract through every shared first-party consumer: enumerate them, trace the producer's value into each, and exercise the affected consumer path. Record concrete evidence.
14
+
15
+ ## Enumerate the space before the first verdict
16
+
17
+ Obligations 3 and 4 are **sweeps**: the defect does not live at one location, it lives at *some subset of a space you can write down*. For those, the round-1 obligation is not "look hard" — it is **enumerate the space, check every cell, and record a per-cell result in the first verdict.**
18
+
19
+ Why this is a round-1 obligation and not diligence: a reviewer who samples the space finds one cell per round, and every cell costs the caller a full fix + re-review + CI round. The finding list converges on the code only as fast as it converges on *coverage of the space*. Enumerating first makes round 1's list complete over the space, so rounds 2..N are **fixing, not discovering**.
20
+
21
+ **This is also where the contract-complete matrix gets built.** `review-method.md` § Theme reconciliation constructs the full declared matrix on the *second* same-theme finding; when obligation 3 or 4 applies, that construction is owed in round 1 instead, because the space was knowable before any finding existed. Recurrence-triggered construction is the fallback for a theme these sweeps did not cover, not the normal path — and a same-theme recurrence at round N>1 is the tell that the round-1 sweep under-enumerated (it is also what the orchestrator's circuit-breaker counts, `resolve-issues` step 3).
22
+
23
+ **The over-application guard.** A space with one cell is not a sweep; say so in one line and move on. Do not manufacture a matrix for a diff that changes one function at one call site, and do not enumerate dimensions the repo does not actually support (no second locale, no dark theme, no mobile breakpoint ⇒ those are not cells). The sweep is scoped by the same trigger as the rest of this file.
24
+
25
+ ### 3. Invariant enforcement-point inventory
26
+
27
+ **Applies when the diff declares, changes, or relies on an invariant that must hold at more than one place** — an all-or-none field contract, a canonical grammar for a wire value, a validation rule, a required-provenance rule, a promotion/admission precondition.
28
+
29
+ Obligation 2 traces a *value* into its consumers. This traces an *invariant* into its **enforcement points**, which are usually a different and larger set: producers, serializers/exporters, validators, boundary guards on the request path, promotion/admission checks, the schema layer on the far side of the wire, and the tests that pin each. A consumer that merely reads the value is not an enforcement point; a validator that never sees a consumer is.
30
+
31
+ Before the first verdict:
32
+
33
+ - **Write the invariant as one sentence**, in the form the code must satisfy — not the story it came from.
34
+ - **Enumerate every enforcement point** by searching for the fields/rules the invariant names across the whole tree, not just the diff. The diff shows where the author *did* enforce it; the tree shows where it *must* be enforced.
35
+ - **Check the invariant at each**, and record one row per point: location, enforced/not-enforced, evidence locator.
36
+ - Points found unenforced are **findings in round 1**, individually and all of them — never "and similar issues may exist elsewhere," which is a sample presented as a sweep.
37
+ - **When the component under review *is* the enforcement machinery** — a verifier, a gate, a daily checker — the points are the checks *inside* it, and the invariant is what it exists to guarantee, which for this shape is almost always *fail closed on any drift*. Enumerate the dimensions of the state it inspects (identity, completeness of the set it compares, the read-model differences it must normalize, the thresholds it asserts) and ask of each: what value here makes this pass when it should fail? A fail-open hole per dimension is one round per dimension otherwise, because each names a different space and no per-finding rule spans them.
38
+
39
+ *Named incident: skyee-ai-risk #1124 / PR #1138. One invariant — every expanded snapshot row carries the complete required contract, all-or-none. It was enforced at six places: a shared contract validator, the service query path, the export job, the promotion/refresh script, the far-side schema layer, and the contract tests. Review rounds 4, 5, 6, and 7 each found it unenforced at two or three of those files — eleven blockers, one invariant, four rounds, because each round searched rather than enumerated.*
40
+
41
+ *Named incident (the enforcement-machinery shape, and why this obligation is not round-1-only): forex #87. A deployment verifier was stood up in a fix round, so it never existed at round 1 and every later review saw it only through a delta scope. Rounds 4–7 returned exactly one theme each — `alert-verifier.quota-policy-name`, `alert-artifacts.canonical-completeness`, `alert-verifier.gcp-read-model-normalization`, `alert-verifier.notification-channel-drift` — against rounds 1 and 3, which returned four and eight. Each named a different space, so the fix side's re-run-every-cell rule spanned none of them; what they shared was the component's own property, that it must fail closed on any drift. Four rounds, one property, ~85 minutes of fix time, because the component whose whole job was to fail closed was the one component nobody enumerated.*
42
+
43
+ ### 4. Presentation state matrix
44
+
45
+ **Applies when the diff changes what a browser surface renders** — a component's rendered states, an interaction affordance, an enabled/disabled treatment, a dialog/tooltip host. Not for a diff that only changes server code behind an unchanged surface.
46
+
47
+ A rendered state is a point in a product space, and presentation defects live in cells, not in components. Before the first verdict, write down the dimensions **the repo actually supports** and check every cell. The dimensions that usually apply:
48
+
49
+ - **locale** — each supported language (copy presence, overflow, truncation)
50
+ - **viewport + input modality** — desktop pointer, keyboard focus, mobile touch. *Touch is its own cell, not a narrow viewport:* a tooltip primitive that shows on hover and focus can still suppress touch-origin focus, so pointer and keyboard passing proves nothing about tap.
51
+ - **action/interaction state** — enabled, disabled, pending, denied-with-reason, error
52
+ - **theme** — light and dark, including contrast ratios for any changed color token
53
+
54
+ Record a per-cell result. Cells that fail are round-1 findings; cells the repo does not support are struck from the matrix with a one-line reason, not carried as `not-applicable` rows.
55
+
56
+ *Named incident: skyee-ai-risk #1144 / PR #1148. Disabled row-action denial reasons had to be perceivable. Round 7 found pointer-hover/focus hidden; round 8 found the touch cell still hidden after the pointer fix; a later pass found the destructive-button contrast cell failing in both themes. Three cells of one matrix, three rounds — and the matrix was never larger than two locales × three input modalities × two action states × two themes for one component.*
57
+
58
+ ## Recording the sweeps
59
+
60
+ Each sweep records, in the round-1 verdict: the space as enumerated (dimensions or point list), the per-cell/per-point result, and the evidence locator for each checked cell. A sweep whose output is a prose paragraph rather than an enumeration did not run — same bar as a finding with no `file:line`.
61
+
62
+ `Not applicable` requires the specific reason (obligation 3: the invariant holds at exactly one place, named; obligation 4: the diff changes no rendered state). As above, `deferred` is not an applicability result, and a sweep that cannot be executed against a real surface is `BLOCKED` for the part it covers, never a silent pass.
@@ -0,0 +1,17 @@
1
+ # Scripts — mechanics
2
+
3
+ The three bundled scripts and what each guarantees. Indexed from
4
+ [SKILL.md](../SKILL.md#routing), which keeps the two rules that are *judgment* rather
5
+ than mechanics: resolving a script against this skill's own directory, and the fact
6
+ that `blocking` is derived rather than set.
7
+
8
+ **Blocking is *derived*, not a flag you set: `blocking == in_scope && priority <= 1`.** The reviewer's job is the *judgment* — pick the finding's `priority` (`0–3`, the one severity scale) and whether it is `in_scope` (about this diff, default true), and confirm every `priority ≤ 1` maps to a named blocking class above. The *mechanism* is `post-review.mjs`: it renders the label (in-scope `p0–1` → `BLOCK-n`; everything else → `NOTE-n`), derives the verdict (`NEEDS_CHANGES` iff ≥1 `BLOCK-n`, else `PASS`; `FAIL`/`BLOCKED` unchanged), and routes non-blocking findings to tracked issues — the in-scope/out-of-scope `p2–3` notes batched into one `refactor-later` issue, and an **out-of-scope `p0–1`** (a real defect in code this PR didn't change) to its own critical/security issue plus a loud warning, *without* blocking the PR. Do not emit a free `blocking` field; a finding still carrying one is read-tolerated (warned) and its stored value is ignored in favor of the derivation.
9
+
10
+ Mechanics are scripted so the deterministic, error-prone glue is reliable; judgment stays in the prose above.
11
+
12
+ - **`scripts/pr-context.mjs --base <target>`** — compute merge-base + net three-dot diff + changed files + commits (diff-discipline as code). Language-agnostic.
13
+ - **`scripts/scan-diff.mjs`** (`git diff <range> | …`) — two channels. **`leads`** (heuristic, "look here and verify"): unanchored regex, first-party interception in tests, new branches, weak assertions, `modifies-existing-behavior`. **`findings`** (decidable **blockers**): `over-mock-internal-seam` — a `vi`/`jest`/`vitest.mock` of a first-party seam, via a **vendored** copy of `ensure-coverage`'s classifier so review-pr is fully standalone (no dependency on `ensure-coverage` being wired). Zero-config; reads `coverage.config.json` topology if present. Best-effort/JS-TS-oriented. *The vendored classifier tracks `ensure-coverage` (`references/depth/mock-policy.md`), which stays canonical; drift isn't honor-system — `scripts/vendor-sync.test.mjs` runs both copies through the full classification decision tree and fails on any divergence (it skips when `ensure-coverage` isn't installed), so resync the vendored copy when that test fires.*
14
+ - **Whole-tree inherited over-mock** (beyond this PR's diff) is an **audit** concern, not a PR-review one (diff-discipline: pre-existing issues are notes, not blockers); `ensure-coverage`'s `lint-tests --rules mock-internal-seam` run whole-tree covers it when available.
15
+ - **`scripts/post-review.mjs --findings <json> --pr <n> [--pr-context <file>]`** — validate findings (reject location-less ones), render the `BLOCK-n`/`NOTE-n` label + derive the verdict from `{priority, in_scope}`, self-authored downgrade, post the single review. `--pr-context` reuses `pr-context.mjs`'s own `changedFiles` (never recomputed here) to keep a finding whose path isn't actually in the diff off `comments` even when `in_scope: true` (#635) — omitted/unreadable fails toward posting (falls back to the `in_scope`-only check, never drops a finding or blocks the post). Routes non-blocking notes to a batched `refactor-later` issue and each out-of-scope critical to its own issue — but only under `--file-issues` (default OFF prints what it would open; the out-of-scope-critical warning prints either way). Language-agnostic.
16
+
17
+ Tests: `node --test scripts/*.test.mjs`.
@@ -0,0 +1,16 @@
1
+ # Review workflow — the eight steps
2
+
3
+ The order the review runs in. Indexed from [SKILL.md](../SKILL.md#routing). Each step
4
+ names the reference that owns its detail.
5
+
6
+ ## Review Workflow
7
+
8
+
9
+ 1. Establish the subject and collect evidence: fetch the target branch; run `scripts/pr-context.mjs --base <target-branch> > <pr-context.json>` to get the merge-base, the net `base...HEAD` diff, changed files, and the commit list in one shot (this is diff-discipline as code — no two-dot/wrong-base mistakes) — **save its stdout to a file**; step 8 reuses that same `changedFiles` list (`--pr-context <file>`) so posting never re-derives the diff from a possibly-drifted checkout. Pipe the diff through `scripts/scan-diff.mjs`, which returns **two channels**: heuristic `leads` (unanchored regex, first-party interception, new branches) — *leads to verify, never findings* — and the decidable `findings` channel (`over-mock-internal-seam`), whose hits are **blockers** to carry into the verdict (principle 1), standalone and zero-config. Then gather the PR body, Review Contract, linked issues/specs/test criteria, comments, tests, CI evidence, and documented standards.
10
+ 2. Select the [review mode](review-mode.md) — it gates the step below, so it is settled first. Then resolve contract freshness and precedence (the ancestry half runs in Spec'd mode only; the two conduct rules run in both). Verify supplied contract-revision ancestry, discover any newer approved target-branch revision affecting the PR, and switch to a full-scope review when the authoritative revision differs from the one used by the last verdict.
11
+ 3. Extract the claims to verify. In Spec'd mode: source requirements, ACs, test-criteria expectations, contract mappings, mock policy, known gaps, standards. In Code-only: the same list minus the spec-derived entries, plus the diff's own claims — PR body, comments, test names — which remain checkable against the code and are where narration drift shows up.
12
+ 5. Review the axes in scope for the mode, separately ([review-method.md](review-method.md)); run/inspect the coverage gate for changed surfaces **wherever the repo wires one — both modes**, per the Coverage breadth axis. The gate answers to the repo's baseline, not to this PR's spec.
13
+ 6. Cross-check contradictions between claims, implementation, tests, mocks, CI, and standards.
14
+ 7. Return `PASS` / `NEEDS_CHANGES` / `FAIL` / `BLOCKED` with per-AC status and required changes, in the [output format](output-format.md) — **every finding must cite a diff `file:line` + a confidence; no code location ⇒ it's `Unverified`, not a finding.** (This is what enforces "verify the code" — you can't form a finding without locating it.)
15
+ 8. If the review target is a real GitHub PR, post the verdict and findings back to GitHub ([github-posting.md](github-posting.md)).
16
+