@1aboveio/skills 0.0.0-stage → 1.0.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 (633) hide show
  1. package/README.md +30 -2
  2. package/bin/cli.mjs +14 -0
  3. package/bin/select-core.mjs +172 -0
  4. package/package.json +146 -4
  5. package/skills/app-dev/airflow/LICENSE +3 -0
  6. package/skills/app-dev/airflow/SKILL.md +199 -0
  7. package/skills/app-dev/airflow/release-check.mjs +93 -0
  8. package/skills/app-dev/android-foundation/LICENSE +3 -0
  9. package/skills/app-dev/android-foundation/SKILL.md +192 -0
  10. package/skills/app-dev/android-foundation/assets/android-ci-job.yml +217 -0
  11. package/skills/app-dev/android-foundation/references/ci.md +87 -0
  12. package/skills/app-dev/android-foundation/references/gotchas.md +221 -0
  13. package/skills/app-dev/android-foundation/references/setup.md +164 -0
  14. package/skills/app-dev/android-foundation/release-check.mjs +93 -0
  15. package/skills/app-dev/android-foundation/scripts/device-run.sh +176 -0
  16. package/skills/app-dev/android-foundation/scripts/device-run.test.mjs +172 -0
  17. package/skills/app-dev/app-debug/LICENSE +3 -0
  18. package/skills/app-dev/app-debug/SKILL.md +110 -0
  19. package/skills/app-dev/app-debug/references/common-errors.md +128 -0
  20. package/skills/app-dev/app-debug/release-check.mjs +93 -0
  21. package/skills/app-dev/better-auth/LICENSE +3 -0
  22. package/skills/app-dev/better-auth/SKILL.md +598 -0
  23. package/skills/app-dev/better-auth/references/feishu-api.md +270 -0
  24. package/skills/app-dev/better-auth/release-check.mjs +93 -0
  25. package/skills/app-dev/data-catalog/LICENSE +3 -0
  26. package/skills/app-dev/data-catalog/SKILL.md +204 -0
  27. package/skills/app-dev/data-catalog/agents/openai.yaml +3 -0
  28. package/skills/app-dev/data-catalog/references/data-catalog-conventions.md +75 -0
  29. package/skills/app-dev/data-catalog/references/field-definitions.md +116 -0
  30. package/skills/app-dev/data-catalog/references/format.md +121 -0
  31. package/skills/app-dev/data-catalog/release-check.mjs +93 -0
  32. package/skills/app-dev/data-catalog/scripts/data-catalog.test.mjs +36 -0
  33. package/skills/app-dev/data-catalog/scripts/data_catalog.py +1392 -0
  34. package/skills/app-dev/data-catalog/scripts/persist-conventions-core.mjs +117 -0
  35. package/skills/app-dev/data-catalog/scripts/persist-conventions.mjs +17 -0
  36. package/skills/app-dev/data-catalog/scripts/test_data_catalog.py +571 -0
  37. package/skills/app-dev/ios-foundation/LICENSE +3 -0
  38. package/skills/app-dev/ios-foundation/SKILL.md +184 -0
  39. package/skills/app-dev/ios-foundation/references/setup.md +243 -0
  40. package/skills/app-dev/ios-foundation/release-check.mjs +93 -0
  41. package/skills/app-dev/monorepo/LICENSE +3 -0
  42. package/skills/app-dev/monorepo/SKILL.md +462 -0
  43. package/skills/app-dev/monorepo/release-check.mjs +93 -0
  44. package/skills/app-dev/nextjs-fullstack/LICENSE +3 -0
  45. package/skills/app-dev/nextjs-fullstack/SKILL.md +211 -0
  46. package/skills/app-dev/nextjs-fullstack/conventions.md +318 -0
  47. package/skills/app-dev/nextjs-fullstack/frontend-conventions.md +61 -0
  48. package/skills/app-dev/nextjs-fullstack/nextjs16.md +287 -0
  49. package/skills/app-dev/nextjs-fullstack/release-check.mjs +93 -0
  50. package/skills/app-dev/nextjs-fullstack/server-actions.md +409 -0
  51. package/skills/app-dev/prisma-setup/LICENSE +3 -0
  52. package/skills/app-dev/prisma-setup/SKILL.md +181 -0
  53. package/skills/app-dev/prisma-setup/nextjs.md +258 -0
  54. package/skills/app-dev/prisma-setup/release-check.mjs +93 -0
  55. package/skills/app-dev/prisma-setup/turborepo.md +301 -0
  56. package/skills/app-dev/pyspark/LICENSE +3 -0
  57. package/skills/app-dev/pyspark/SKILL.md +127 -0
  58. package/skills/app-dev/pyspark/assets/templates/etl.py +748 -0
  59. package/skills/app-dev/pyspark/assets/templates/utils/__init__.py +1 -0
  60. package/skills/app-dev/pyspark/assets/templates/utils/hudi_metadata.py +14 -0
  61. package/skills/app-dev/pyspark/references/diagnosis-and-profiling.md +169 -0
  62. package/skills/app-dev/pyspark/references/etl-contract.md +129 -0
  63. package/skills/app-dev/pyspark/references/production-validation.md +131 -0
  64. package/skills/app-dev/pyspark/references/reconciliation.md +38 -0
  65. package/skills/app-dev/pyspark/references/transformation-design.md +190 -0
  66. package/skills/app-dev/pyspark/references/velocity-feature-calculation.md +193 -0
  67. package/skills/app-dev/pyspark/release-check.mjs +93 -0
  68. package/skills/app-dev/pyspark/scripts/spark_eventlog_summary.py +223 -0
  69. package/skills/app-dev/python-backend/LICENSE +3 -0
  70. package/skills/app-dev/python-backend/SKILL.md +325 -0
  71. package/skills/app-dev/python-backend/assets/uv-install.sh +48 -0
  72. package/skills/app-dev/python-backend/references/uv-installs.md +83 -0
  73. package/skills/app-dev/python-backend/release-check.mjs +93 -0
  74. package/skills/app-dev/shadcn/LICENSE +3 -0
  75. package/skills/app-dev/shadcn/SKILL.md +120 -0
  76. package/skills/app-dev/shadcn/assets/shadcn-small.png +0 -0
  77. package/skills/app-dev/shadcn/assets/shadcn.png +0 -0
  78. package/skills/app-dev/shadcn/cli.md +411 -0
  79. package/skills/app-dev/shadcn/customization.md +224 -0
  80. package/skills/app-dev/shadcn/mcp.md +101 -0
  81. package/skills/app-dev/shadcn/release-check.mjs +93 -0
  82. package/skills/app-dev/shadcn/rules/base-vs-radix.md +323 -0
  83. package/skills/app-dev/shadcn/rules/component-selection.md +67 -0
  84. package/skills/app-dev/shadcn/rules/composition.md +195 -0
  85. package/skills/app-dev/shadcn/rules/data-table.md +201 -0
  86. package/skills/app-dev/shadcn/rules/forms.md +255 -0
  87. package/skills/app-dev/shadcn/rules/icons.md +103 -0
  88. package/skills/app-dev/shadcn/rules/styling.md +167 -0
  89. package/skills/app-dev/zod-v4/LICENSE +3 -0
  90. package/skills/app-dev/zod-v4/SKILL.md +286 -0
  91. package/skills/app-dev/zod-v4/release-check.mjs +93 -0
  92. package/skills/cicd/cloud-build/LICENSE +3 -0
  93. package/skills/cicd/cloud-build/SKILL.md +707 -0
  94. package/skills/cicd/cloud-build/release-check.mjs +93 -0
  95. package/skills/cicd/cloud-debug/LICENSE +3 -0
  96. package/skills/cicd/cloud-debug/SKILL.md +315 -0
  97. package/skills/cicd/cloud-debug/references/build-failures.md +238 -0
  98. package/skills/cicd/cloud-debug/references/deploy-failures.md +376 -0
  99. package/skills/cicd/cloud-debug/references/pipeline-failures.md +378 -0
  100. package/skills/cicd/cloud-debug/release-check.mjs +93 -0
  101. package/skills/cicd/cloud-deploy/LICENSE +3 -0
  102. package/skills/cicd/cloud-deploy/SKILL.md +230 -0
  103. package/skills/cicd/cloud-deploy/references/config-templates.md +257 -0
  104. package/skills/cicd/cloud-deploy/release-check.mjs +93 -0
  105. package/skills/cicd/docker/LICENSE +3 -0
  106. package/skills/cicd/docker/SKILL.md +151 -0
  107. package/skills/cicd/docker/release-check.mjs +93 -0
  108. package/skills/cicd/github-actions/LICENSE +3 -0
  109. package/skills/cicd/github-actions/SKILL.md +111 -0
  110. package/skills/cicd/github-actions/references/audit-profile-optimize.md +150 -0
  111. package/skills/cicd/github-actions/references/ci-case-studies.md +141 -0
  112. package/skills/cicd/github-actions/references/conditional-ci.md +214 -0
  113. package/skills/cicd/github-actions/references/debugging.md +13 -0
  114. package/skills/cicd/github-actions/references/pipeline.md +87 -0
  115. package/skills/cicd/github-actions/references/post-deploy-and-publishing.md +33 -0
  116. package/skills/cicd/github-actions/references/runners.md +253 -0
  117. package/skills/cicd/github-actions/references/security.md +29 -0
  118. package/skills/cicd/github-actions/references/speed-and-audit.md +115 -0
  119. package/skills/cicd/github-actions/references/two-pass-reading.md +92 -0
  120. package/skills/cicd/github-actions/release-check.mjs +93 -0
  121. package/skills/cicd/github-actions/scripts/ci-run-audit-core.mjs +612 -0
  122. package/skills/cicd/github-actions/scripts/ci-run-audit.mjs +4 -0
  123. package/skills/cicd/github-actions/scripts/ci-run-audit.test.mjs +637 -0
  124. package/skills/cicd/github-flow/LICENSE +3 -0
  125. package/skills/cicd/github-flow/SKILL.md +123 -0
  126. package/skills/cicd/github-flow/references/ci-conventions.md +14 -0
  127. package/skills/cicd/github-flow/release-check.mjs +93 -0
  128. package/skills/cicd/github-flow/scripts/flow-core.mjs +105 -0
  129. package/skills/cicd/github-flow/scripts/flow.mjs +81 -0
  130. package/skills/cicd/github-flow/scripts/flow.test.mjs +114 -0
  131. package/skills/cicd/github-flow/scripts/persist-conventions-core.mjs +117 -0
  132. package/skills/cicd/github-flow/scripts/persist-conventions.mjs +49 -0
  133. package/skills/cicd/github-flow/scripts/persist-conventions.test.mjs +108 -0
  134. package/skills/cicd/google-cloud/LICENSE +3 -0
  135. package/skills/cicd/google-cloud/SKILL.md +119 -0
  136. package/skills/cicd/google-cloud/references/gcs.md +469 -0
  137. package/skills/cicd/google-cloud/references/iam.md +451 -0
  138. package/skills/cicd/google-cloud/references/project.md +349 -0
  139. package/skills/cicd/google-cloud/references/secrets.md +336 -0
  140. package/skills/cicd/google-cloud/references/vpc.md +312 -0
  141. package/skills/cicd/google-cloud/release-check.mjs +93 -0
  142. package/skills/cicd/google-cloud/scripts/create-sa.sh +36 -0
  143. package/skills/cicd/google-cloud/scripts/gcp-config.sh +31 -0
  144. package/skills/cicd/google-cloud/scripts/grant-iap.sh +41 -0
  145. package/skills/cicd/google-cloud/scripts/setup-secrets.sh +48 -0
  146. package/skills/cicd/mergify/LICENSE +3 -0
  147. package/skills/cicd/mergify/SKILL.md +102 -0
  148. package/skills/cicd/mergify/assets/templates/mergify.yml +215 -0
  149. package/skills/cicd/mergify/assets/templates/ruleset.json +46 -0
  150. package/skills/cicd/mergify/references/branch-protection.md +282 -0
  151. package/skills/cicd/mergify/references/configuration.md +274 -0
  152. package/skills/cicd/mergify/references/diagnosis.md +109 -0
  153. package/skills/cicd/mergify/references/stacks.md +84 -0
  154. package/skills/cicd/mergify/references/traps.md +119 -0
  155. package/skills/cicd/mergify/references/watch-contract.md +274 -0
  156. package/skills/cicd/mergify/release-check.mjs +93 -0
  157. package/skills/cicd/mergify/scripts/audit-core.mjs +208 -0
  158. package/skills/cicd/mergify/scripts/audit.mjs +4 -0
  159. package/skills/cicd/mergify/scripts/audit.test.mjs +201 -0
  160. package/skills/cicd/mergify/scripts/entrypoints.test.mjs +106 -0
  161. package/skills/cicd/mergify/scripts/pr-620-mergify-comments.fixture.json +30 -0
  162. package/skills/cicd/mergify/scripts/stack-push-core.mjs +258 -0
  163. package/skills/cicd/mergify/scripts/stack-push.mjs +4 -0
  164. package/skills/cicd/mergify/scripts/stack-push.test.mjs +233 -0
  165. package/skills/cicd/mergify/scripts/watch-pr-delivery-core.mjs +1065 -0
  166. package/skills/cicd/mergify/scripts/watch-pr-delivery.mjs +4 -0
  167. package/skills/cicd/mergify/scripts/watch-pr-delivery.test.mjs +1826 -0
  168. package/skills/cicd/podman/LICENSE +3 -0
  169. package/skills/cicd/podman/SKILL.md +71 -0
  170. package/skills/cicd/podman/agents/openai.yaml +4 -0
  171. package/skills/cicd/podman/assets/templates/podman-compose-socket-directory.yml +6 -0
  172. package/skills/cicd/podman/assets/templates/podman-service-override.conf +3 -0
  173. package/skills/cicd/podman/references/compose-compatibility.md +70 -0
  174. package/skills/cicd/podman/references/networking-and-ports.md +74 -0
  175. package/skills/cicd/podman/references/rootless-services-and-sockets.md +156 -0
  176. package/skills/cicd/podman/references/troubleshooting.md +98 -0
  177. package/skills/cicd/podman/release-check.mjs +93 -0
  178. package/skills/content/article-review/LICENSE +3 -0
  179. package/skills/content/article-review/SKILL.md +66 -0
  180. package/skills/content/article-review/references/report-format.md +68 -0
  181. package/skills/content/article-review/references/template-guide.md +79 -0
  182. package/skills/content/article-review/references/template-wechat-payments.md +125 -0
  183. package/skills/content/article-review/release-check.mjs +93 -0
  184. package/skills/content/article-to-image/LICENSE +3 -0
  185. package/skills/content/article-to-image/SKILL.md +91 -0
  186. package/skills/content/article-to-image/references/formats.md +53 -0
  187. package/skills/content/article-to-image/release-check.mjs +93 -0
  188. package/skills/content/flowchart-svg/LICENSE +3 -0
  189. package/skills/content/flowchart-svg/SKILL.md +43 -0
  190. package/skills/content/flowchart-svg/release-check.mjs +93 -0
  191. package/skills/content/flowchart-svg/scripts/export_png.sh +8 -0
  192. package/skills/content/image-gen/LICENSE +3 -0
  193. package/skills/content/image-gen/SKILL.md +192 -0
  194. package/skills/content/image-gen/release-check.mjs +93 -0
  195. package/skills/content/image-gen/scripts/credentials.mjs +217 -0
  196. package/skills/content/image-gen/scripts/credentials.test.mjs +212 -0
  197. package/skills/content/image-gen/scripts/generate.mjs +240 -0
  198. package/skills/content/image-gen/scripts/options.mjs +293 -0
  199. package/skills/content/image-gen/scripts/options.test.mjs +245 -0
  200. package/skills/content/mermaid/LICENSE +3 -0
  201. package/skills/content/mermaid/SKILL.md +635 -0
  202. package/skills/content/mermaid/release-check.mjs +93 -0
  203. package/skills/content/wechat-article-writer/LICENSE +3 -0
  204. package/skills/content/wechat-article-writer/SKILL.md +92 -0
  205. package/skills/content/wechat-article-writer/references/style-selector.md +133 -0
  206. package/skills/content/wechat-article-writer/references/writing-rules.md +152 -0
  207. package/skills/content/wechat-article-writer/release-check.mjs +93 -0
  208. package/skills/content/wechat-article-writer/templates/wechat-comparison.md +52 -0
  209. package/skills/content/wechat-article-writer/templates/wechat-howto.md +51 -0
  210. package/skills/content/wechat-article-writer/templates/wechat-insight.md +50 -0
  211. package/skills/content/wechat-article-writer/templates/wechat-pitfall.md +52 -0
  212. package/skills/content/wechat-publisher/LICENSE +3 -0
  213. package/skills/content/wechat-publisher/SKILL.md +171 -0
  214. package/skills/content/wechat-publisher/references/api.md +105 -0
  215. package/skills/content/wechat-publisher/references/layout-rules.md +57 -0
  216. package/skills/content/wechat-publisher/references/wechat-safe-template.html +86 -0
  217. package/skills/content/wechat-publisher/release-check.mjs +93 -0
  218. package/skills/content/wechat-publisher/scripts/md_to_wechat_html.py +194 -0
  219. package/skills/content/wechat-publisher/scripts/publish.py +239 -0
  220. package/skills/content/wechat-search/LICENSE +3 -0
  221. package/skills/content/wechat-search/SKILL.md +211 -0
  222. package/skills/content/wechat-search/release-check.mjs +93 -0
  223. package/skills/content/wechat-search/scripts/start-chrome.sh +83 -0
  224. package/skills/content/xai-search/LICENSE +3 -0
  225. package/skills/content/xai-search/SKILL.md +79 -0
  226. package/skills/content/xai-search/release-check.mjs +93 -0
  227. package/skills/content/xai-search/scripts/xai_search.sh +187 -0
  228. package/skills/content/xai-search/tests/smoke_test.sh +36 -0
  229. package/skills/core/distill-writing/LICENSE +3 -0
  230. package/skills/core/distill-writing/SKILL.md +74 -0
  231. package/skills/core/distill-writing/references/extraction.md +95 -0
  232. package/skills/core/distill-writing/references/updating.md +46 -0
  233. package/skills/core/distill-writing/release-check.mjs +93 -0
  234. package/skills/core/doc-to-md/LICENSE +3 -0
  235. package/skills/core/doc-to-md/SKILL.md +78 -0
  236. package/skills/core/doc-to-md/release-check.mjs +93 -0
  237. package/skills/core/doc-to-md/scripts/convert.py +157 -0
  238. package/skills/core/editorial-review/LICENSE +3 -0
  239. package/skills/core/editorial-review/SKILL.md +79 -0
  240. package/skills/core/editorial-review/references/checklist.md +94 -0
  241. package/skills/core/editorial-review/release-check.mjs +93 -0
  242. package/skills/core/house-style/LICENSE +3 -0
  243. package/skills/core/house-style/SKILL.md +33 -0
  244. package/skills/core/house-style/references/defaults.md +66 -0
  245. package/skills/core/house-style/references/rules.md +267 -0
  246. package/skills/core/house-style/references/sources.md +27 -0
  247. package/skills/core/house-style/references/style-en.md +131 -0
  248. package/skills/core/house-style/references/style-zh.md +141 -0
  249. package/skills/core/house-style/references/terminology-zh.md +223 -0
  250. package/skills/core/house-style/release-check.mjs +93 -0
  251. package/skills/core/house-style/templates/brd.md +103 -0
  252. package/skills/core/house-style/templates/commercial-proposal.md +93 -0
  253. package/skills/core/house-style/templates/compliance-policy.md +109 -0
  254. package/skills/core/house-style/templates/gap-analysis.md +105 -0
  255. package/skills/core/house-style/templates/general.md +63 -0
  256. package/skills/core/house-style/templates/integration-guide.md +98 -0
  257. package/skills/core/house-style/templates/prd.md +81 -0
  258. package/skills/core/house-style/templates/risk-operations-procedure.md +94 -0
  259. package/skills/core/house-style/templates/technical-spec.md +96 -0
  260. package/skills/core/polish-cn/LICENSE +3 -0
  261. package/skills/core/polish-cn/SKILL.md +102 -0
  262. package/skills/core/polish-cn/references/brief.md +93 -0
  263. package/skills/core/polish-cn/references/models.md +76 -0
  264. package/skills/core/polish-cn/release-check.mjs +93 -0
  265. package/skills/core/polish-cn/scripts/polish-cn.test.mjs +244 -0
  266. package/skills/core/polish-cn/scripts/polish_blocks.py +489 -0
  267. package/skills/core/reg-parser/LICENSE +3 -0
  268. package/skills/core/reg-parser/SKILL.md +212 -0
  269. package/skills/core/reg-parser/references/checklist-schema.md +223 -0
  270. package/skills/core/reg-parser/references/checklists/hk-amlo-checklist.json +1306 -0
  271. package/skills/core/reg-parser/references/checklists/hk-amlo-checklist.md +469 -0
  272. package/skills/core/reg-parser/references/checklists/hk-fi-corporate-onboarding-cdd-checklist.json +634 -0
  273. package/skills/core/reg-parser/references/checklists/hk-fi-corporate-onboarding-cdd-checklist.md +233 -0
  274. package/skills/core/reg-parser/references/checklists/hk-mso-guideline-checklist.json +2194 -0
  275. package/skills/core/reg-parser/references/checklists/hk-mso-guideline-checklist.md +771 -0
  276. package/skills/core/reg-parser/references/checklists/kyc-aml-checklist.md +258 -0
  277. package/skills/core/reg-parser/references/checklists/visa-vars-checklist.md +1058 -0
  278. package/skills/core/reg-parser/references/mandates/hk-amlo-cap615.md +389 -0
  279. package/skills/core/reg-parser/references/mandates/visa-vars.md +205 -0
  280. package/skills/core/reg-parser/release-check.mjs +93 -0
  281. package/skills/core/reg-parser/scripts/compare_checklist.py +230 -0
  282. package/skills/core/reg-parser/scripts/dump_checklist.py +361 -0
  283. package/skills/core/reg-parser/scripts/preprocess-mandate.sh +187 -0
  284. package/skills/core/reg-parser/scripts/reg-parser.test.mjs +165 -0
  285. package/skills/core/reg-parser/scripts/test_quarantine.sh +105 -0
  286. package/skills/core/reg-parser/scripts/validate_checklist.py +563 -0
  287. package/skills/core/reg-parser/scripts/validate_mandate.py +273 -0
  288. package/skills/core/terminology/LICENSE +3 -0
  289. package/skills/core/terminology/SKILL.md +62 -0
  290. package/skills/core/terminology/references/format.md +50 -0
  291. package/skills/core/terminology/references/init.md +32 -0
  292. package/skills/core/terminology/release-check.mjs +93 -0
  293. package/skills/core/write-doc/LICENSE +3 -0
  294. package/skills/core/write-doc/SKILL.md +141 -0
  295. package/skills/core/write-doc/references/bilingual.md +60 -0
  296. package/skills/core/write-doc/release-check.mjs +93 -0
  297. package/skills/engineering/better-review/LICENSE +3 -0
  298. package/skills/engineering/better-review/SKILL.md +249 -0
  299. package/skills/engineering/better-review/agents/openai.yaml +9 -0
  300. package/skills/engineering/better-review/references/domain-hazards.md +53 -0
  301. package/skills/engineering/better-review/references/passes.md +147 -0
  302. package/skills/engineering/better-review/references/result.md +151 -0
  303. package/skills/engineering/better-review/release-check.mjs +93 -0
  304. package/skills/engineering/better-review/scripts/pr-context.mjs +212 -0
  305. package/skills/engineering/better-review/scripts/pr-context.test.mjs +168 -0
  306. package/skills/engineering/better-review/scripts/rereview-scope.mjs +503 -0
  307. package/skills/engineering/better-review/scripts/rereview-scope.test.mjs +587 -0
  308. package/skills/engineering/better-review/scripts/scan-diff.mjs +365 -0
  309. package/skills/engineering/better-review/scripts/scan-diff.test.mjs +414 -0
  310. package/skills/engineering/better-review/scripts/vendor-sync.test.mjs +96 -0
  311. package/skills/engineering/e2e-test/LICENSE +3 -0
  312. package/skills/engineering/e2e-test/SKILL.md +98 -0
  313. package/skills/engineering/e2e-test/assets/ci-gates.cloudbuild.yaml +24 -0
  314. package/skills/engineering/e2e-test/references/authoring/auth-flows.md +159 -0
  315. package/skills/engineering/e2e-test/references/authoring/playwright-config.md +73 -0
  316. package/skills/engineering/e2e-test/references/authoring/playwright-patterns.md +144 -0
  317. package/skills/engineering/e2e-test/references/ci-integration.md +25 -0
  318. package/skills/engineering/e2e-test/references/ci-playwright-container.md +290 -0
  319. package/skills/engineering/e2e-test/references/presentation-sweep.md +104 -0
  320. package/skills/engineering/e2e-test/references/reviewing.md +41 -0
  321. package/skills/engineering/e2e-test/references/route-manifest.md +51 -0
  322. package/skills/engineering/e2e-test/release-check.mjs +93 -0
  323. package/skills/engineering/e2e-test/scripts/detect-routes-nextjs.mjs +200 -0
  324. package/skills/engineering/e2e-test/scripts/presentation-checks.mjs +171 -0
  325. package/skills/engineering/e2e-test/scripts/presentation-checks.test.mjs +106 -0
  326. package/skills/engineering/e2e-test/scripts/presentation-perceivability.mjs +179 -0
  327. package/skills/engineering/e2e-test/scripts/presentation-perceivability.test.mjs +117 -0
  328. package/skills/engineering/e2e-test/scripts/presentation-reachability.mjs +154 -0
  329. package/skills/engineering/e2e-test/scripts/presentation-reachability.test.mjs +69 -0
  330. package/skills/engineering/e2e-test/scripts/presentation-render-health.mjs +141 -0
  331. package/skills/engineering/e2e-test/scripts/presentation-render-health.test.mjs +98 -0
  332. package/skills/engineering/e2e-test/scripts/presentation-sweep.mjs +147 -0
  333. package/skills/engineering/e2e-test/scripts/presentation-sweep.test.mjs +71 -0
  334. package/skills/engineering/e2e-test/scripts/presentation-temporal.mjs +127 -0
  335. package/skills/engineering/e2e-test/scripts/presentation-temporal.test.mjs +59 -0
  336. package/skills/engineering/e2e-test/scripts/project-route-manifest.mjs +82 -0
  337. package/skills/engineering/e2e-test/scripts/project-route-manifest.test.mjs +76 -0
  338. package/skills/engineering/e2e-test/scripts/validate-manifest.mjs +106 -0
  339. package/skills/engineering/engineering-runtime/LICENSE +3 -0
  340. package/skills/engineering/engineering-runtime/SKILL.md +11 -0
  341. package/skills/engineering/engineering-runtime/agents/openai.yaml +6 -0
  342. package/skills/engineering/engineering-runtime/coherence/workflow.json +597 -0
  343. package/skills/engineering/engineering-runtime/engineering-runtime.test.mjs +68 -0
  344. package/skills/engineering/engineering-runtime/release-check.mjs +93 -0
  345. package/skills/engineering/engineering-runtime/scripts/exact-head-artifact.mjs +131 -0
  346. package/skills/engineering/engineering-runtime/scripts/head-check-set.mjs +398 -0
  347. package/skills/engineering/engineering-runtime/scripts/invocation-policy.mjs +187 -0
  348. package/skills/engineering/engineering-runtime/scripts/invocation-policy.test.mjs +95 -0
  349. package/skills/engineering/engineering-runtime/scripts/main-module.mjs +79 -0
  350. package/skills/engineering/engineering-runtime/scripts/main-module.test.mjs +288 -0
  351. package/skills/engineering/engineering-runtime/scripts/mergify-yaml.mjs +11 -0
  352. package/skills/engineering/engineering-runtime/scripts/package-lock.json +43 -0
  353. package/skills/engineering/engineering-runtime/scripts/package.json +10 -0
  354. package/skills/engineering/engineering-runtime/scripts/required-check-plan.mjs +223 -0
  355. package/skills/engineering/engineering-runtime/scripts/required-check-plan.test.mjs +96 -0
  356. package/skills/engineering/engineering-runtime/scripts/review-completion.mjs +56 -0
  357. package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +595 -0
  358. package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +189 -0
  359. package/skills/engineering/engineering-runtime/scripts/yaml-mapping.mjs +18 -0
  360. package/skills/engineering/ensure-coverage/LICENSE +3 -0
  361. package/skills/engineering/ensure-coverage/SKILL.md +129 -0
  362. package/skills/engineering/ensure-coverage/references/breadth/coverage-ledger.md +92 -0
  363. package/skills/engineering/ensure-coverage/references/breadth/inventory-contract.md +85 -0
  364. package/skills/engineering/ensure-coverage/references/breadth/surface-baseline.md +44 -0
  365. package/skills/engineering/ensure-coverage/references/breadth/surface-discovery.md +16 -0
  366. package/skills/engineering/ensure-coverage/references/depth/characterization.md +68 -0
  367. package/skills/engineering/ensure-coverage/references/depth/coverage.config.example.json +19 -0
  368. package/skills/engineering/ensure-coverage/references/depth/grading.md +35 -0
  369. package/skills/engineering/ensure-coverage/references/depth/mock-policy.md +57 -0
  370. package/skills/engineering/ensure-coverage/references/depth/test-smells.md +39 -0
  371. package/skills/engineering/ensure-coverage/references/enforcement/ci-contract.md +44 -0
  372. package/skills/engineering/ensure-coverage/references/examples/coverage-ledger.md +110 -0
  373. package/skills/engineering/ensure-coverage/references/examples/refund-flow.md +35 -0
  374. package/skills/engineering/ensure-coverage/references/presentation/axis.md +64 -0
  375. package/skills/engineering/ensure-coverage/references/process/audit-mode.md +27 -0
  376. package/skills/engineering/ensure-coverage/references/process/output-template.md +139 -0
  377. package/skills/engineering/ensure-coverage/references/process/test-strategy.md +56 -0
  378. package/skills/engineering/ensure-coverage/release-check.mjs +93 -0
  379. package/skills/engineering/ensure-coverage/schemas/coverage-config.schema.json +67 -0
  380. package/skills/engineering/ensure-coverage/schemas/coverage-file.schema.json +140 -0
  381. package/skills/engineering/ensure-coverage/scripts/README.md +99 -0
  382. package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.mjs +182 -0
  383. package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.test.mjs +96 -0
  384. package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.mjs +105 -0
  385. package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.test.mjs +47 -0
  386. package/skills/engineering/ensure-coverage/scripts/ci-audit.mjs +137 -0
  387. package/skills/engineering/ensure-coverage/scripts/ci-audit.test.mjs +86 -0
  388. package/skills/engineering/ensure-coverage/scripts/coverage-ledger.mjs +674 -0
  389. package/skills/engineering/ensure-coverage/scripts/coverage-ledger.test.mjs +447 -0
  390. package/skills/engineering/ensure-coverage/scripts/design-parity.mjs +591 -0
  391. package/skills/engineering/ensure-coverage/scripts/design-parity.test.mjs +552 -0
  392. package/skills/engineering/ensure-coverage/scripts/lint-tests.mjs +282 -0
  393. package/skills/engineering/ensure-coverage/scripts/lint-tests.test.mjs +289 -0
  394. package/skills/engineering/ensure-coverage/scripts/mock-policy-config.mjs +176 -0
  395. package/skills/engineering/ensure-coverage/scripts/mock-policy-config.test.mjs +119 -0
  396. package/skills/engineering/ensure-coverage/scripts/package.json +19 -0
  397. package/skills/engineering/golden-path/LICENSE +3 -0
  398. package/skills/engineering/golden-path/SKILL.md +230 -0
  399. package/skills/engineering/golden-path/agents/openai.yaml +3 -0
  400. package/skills/engineering/golden-path/assets/golden-paths.example.json +57 -0
  401. package/skills/engineering/golden-path/references/contract.md +239 -0
  402. package/skills/engineering/golden-path/references/migration.md +111 -0
  403. package/skills/engineering/golden-path/release-check.mjs +93 -0
  404. package/skills/engineering/golden-path/scripts/golden-path-core.mjs +1779 -0
  405. package/skills/engineering/golden-path/scripts/golden-path.mjs +6 -0
  406. package/skills/engineering/golden-path/scripts/golden-path.test.mjs +1457 -0
  407. package/skills/engineering/harness-runtime/LICENSE +3 -0
  408. package/skills/engineering/harness-runtime/SKILL.md +19 -0
  409. package/skills/engineering/harness-runtime/agents/openai.yaml +6 -0
  410. package/skills/engineering/harness-runtime/bin/discover-models.mjs +4 -0
  411. package/skills/engineering/harness-runtime/bin/model-catalog.mjs +4 -0
  412. package/skills/engineering/harness-runtime/contracts.md +15 -0
  413. package/skills/engineering/harness-runtime/discover-models.mjs +392 -0
  414. package/skills/engineering/harness-runtime/discover-models.test.mjs +363 -0
  415. package/skills/engineering/harness-runtime/fixtures/native-question-schemas.json +33 -0
  416. package/skills/engineering/harness-runtime/fixtures/question-responses.json +54 -0
  417. package/skills/engineering/harness-runtime/harness-runtime.test.mjs +967 -0
  418. package/skills/engineering/harness-runtime/index.mjs +767 -0
  419. package/skills/engineering/harness-runtime/model-catalog-seed.test.mjs +829 -0
  420. package/skills/engineering/harness-runtime/model-catalog.mjs +787 -0
  421. package/skills/engineering/harness-runtime/model-catalog.test.mjs +366 -0
  422. package/skills/engineering/harness-runtime/native-question-contracts.md +37 -0
  423. package/skills/engineering/harness-runtime/references/model-catalog-seed.json +408 -0
  424. package/skills/engineering/harness-runtime/references/model-catalog.md +57 -0
  425. package/skills/engineering/harness-runtime/release-check.mjs +93 -0
  426. package/skills/engineering/resolve-issues/LICENSE +3 -0
  427. package/skills/engineering/resolve-issues/SKILL.md +250 -0
  428. package/skills/engineering/resolve-issues/agents/openai.yaml +9 -0
  429. package/skills/engineering/resolve-issues/plugin-hooks.json +17 -0
  430. package/skills/engineering/resolve-issues/references/canary.md +28 -0
  431. package/skills/engineering/resolve-issues/references/ci.md +105 -0
  432. package/skills/engineering/resolve-issues/references/done.md +25 -0
  433. package/skills/engineering/resolve-issues/references/dropbox.md +90 -0
  434. package/skills/engineering/resolve-issues/references/expire.md +318 -0
  435. package/skills/engineering/resolve-issues/references/exploration.md +202 -0
  436. package/skills/engineering/resolve-issues/references/implementation.md +303 -0
  437. package/skills/engineering/resolve-issues/references/preflight.md +445 -0
  438. package/skills/engineering/resolve-issues/references/review.md +228 -0
  439. package/skills/engineering/resolve-issues/references/shared-modules.md +44 -0
  440. package/skills/engineering/resolve-issues/references/task-plan.md +264 -0
  441. package/skills/engineering/resolve-issues/release-check.mjs +93 -0
  442. package/skills/engineering/resolve-issues/scripts/cleanup-runs.mjs +364 -0
  443. package/skills/engineering/resolve-issues/scripts/cleanup-runs.test.mjs +280 -0
  444. package/skills/engineering/resolve-issues/scripts/discover-models.mjs +9 -0
  445. package/skills/engineering/resolve-issues/scripts/dropbox.mjs +473 -0
  446. package/skills/engineering/resolve-issues/scripts/dropbox.test.mjs +346 -0
  447. package/skills/engineering/resolve-issues/scripts/findings-reuse.mjs +98 -0
  448. package/skills/engineering/resolve-issues/scripts/findings-reuse.test.mjs +88 -0
  449. package/skills/engineering/resolve-issues/scripts/github-reviews.mjs +384 -0
  450. package/skills/engineering/resolve-issues/scripts/github-reviews.test.mjs +264 -0
  451. package/skills/engineering/resolve-issues/scripts/install-hooks.mjs +135 -0
  452. package/skills/engineering/resolve-issues/scripts/install-hooks.test.mjs +79 -0
  453. package/skills/engineering/resolve-issues/scripts/issue-tree.mjs +162 -0
  454. package/skills/engineering/resolve-issues/scripts/issue-tree.test.mjs +107 -0
  455. package/skills/engineering/resolve-issues/scripts/manual-invocation.test.mjs +14 -0
  456. package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +9 -0
  457. package/skills/engineering/resolve-issues/scripts/next-actions-capacity.test.mjs +149 -0
  458. package/skills/engineering/resolve-issues/scripts/next-actions.mjs +856 -0
  459. package/skills/engineering/resolve-issues/scripts/next-actions.test.mjs +915 -0
  460. package/skills/engineering/resolve-issues/scripts/plan-sync.mjs +269 -0
  461. package/skills/engineering/resolve-issues/scripts/plan-sync.test.mjs +156 -0
  462. package/skills/engineering/resolve-issues/scripts/preflight-models.mjs +736 -0
  463. package/skills/engineering/resolve-issues/scripts/preflight-models.test.mjs +448 -0
  464. package/skills/engineering/resolve-issues/scripts/ready-check.mjs +185 -0
  465. package/skills/engineering/resolve-issues/scripts/ready-check.test.mjs +217 -0
  466. package/skills/engineering/resolve-issues/scripts/rehydrate.mjs +98 -0
  467. package/skills/engineering/resolve-issues/scripts/rehydrate.test.mjs +91 -0
  468. package/skills/engineering/resolve-issues/scripts/review-verdict.mjs +509 -0
  469. package/skills/engineering/resolve-issues/scripts/review-verdict.test.mjs +1060 -0
  470. package/skills/engineering/resolve-issues/scripts/size-check.mjs +492 -0
  471. package/skills/engineering/resolve-issues/scripts/size-check.test.mjs +458 -0
  472. package/skills/engineering/resolve-release/LICENSE +3 -0
  473. package/skills/engineering/resolve-release/SKILL.md +215 -0
  474. package/skills/engineering/resolve-release/agents/openai.yaml +8 -0
  475. package/skills/engineering/resolve-release/flows/cloud-run-canary.md +13 -0
  476. package/skills/engineering/resolve-release/flows/cloud-run.md +7 -0
  477. package/skills/engineering/resolve-release/flows/root-tag-npm.md +13 -0
  478. package/skills/engineering/resolve-release/flows/workspace-npm.md +22 -0
  479. package/skills/engineering/resolve-release/references/canary.md +51 -0
  480. package/skills/engineering/resolve-release/references/candidate.md +41 -0
  481. package/skills/engineering/resolve-release/references/cut.md +131 -0
  482. package/skills/engineering/resolve-release/references/dark-launch.md +66 -0
  483. package/skills/engineering/resolve-release/references/flows.md +150 -0
  484. package/skills/engineering/resolve-release/references/preflight.md +154 -0
  485. package/skills/engineering/resolve-release/references/prepared-metadata.md +260 -0
  486. package/skills/engineering/resolve-release/references/promotion.md +82 -0
  487. package/skills/engineering/resolve-release/references/publish.md +232 -0
  488. package/skills/engineering/resolve-release/references/workspace-npm.md +103 -0
  489. package/skills/engineering/resolve-release/release-check.mjs +93 -0
  490. package/skills/engineering/resolve-release/scripts/apply.mjs +212 -0
  491. package/skills/engineering/resolve-release/scripts/apply.test.mjs +99 -0
  492. package/skills/engineering/resolve-release/scripts/dark-flags.mjs +134 -0
  493. package/skills/engineering/resolve-release/scripts/dark-flags.test.mjs +100 -0
  494. package/skills/engineering/resolve-release/scripts/flow.mjs +500 -0
  495. package/skills/engineering/resolve-release/scripts/flow.test.mjs +340 -0
  496. package/skills/engineering/resolve-release/scripts/green-head.mjs +231 -0
  497. package/skills/engineering/resolve-release/scripts/green-head.test.mjs +101 -0
  498. package/skills/engineering/resolve-release/scripts/npm-version-absence.mjs +138 -0
  499. package/skills/engineering/resolve-release/scripts/npm-version-absence.test.mjs +426 -0
  500. package/skills/engineering/resolve-release/scripts/plan-npm.test.mjs +659 -0
  501. package/skills/engineering/resolve-release/scripts/plan-toml-boundary.test.mjs +317 -0
  502. package/skills/engineering/resolve-release/scripts/plan-uv.test.mjs +291 -0
  503. package/skills/engineering/resolve-release/scripts/plan.mjs +806 -0
  504. package/skills/engineering/resolve-release/scripts/plan.test.mjs +428 -0
  505. package/skills/engineering/rush-issues/LICENSE +3 -0
  506. package/skills/engineering/rush-issues/SKILL.md +58 -0
  507. package/skills/engineering/rush-issues/agents/openai.yaml +8 -0
  508. package/skills/engineering/rush-issues/rehydrate.mjs +10 -0
  509. package/skills/engineering/rush-issues/release-check.mjs +93 -0
  510. package/skills/engineering/rush-release/LICENSE +3 -0
  511. package/skills/engineering/rush-release/SKILL.md +35 -0
  512. package/skills/engineering/rush-release/agents/openai.yaml +8 -0
  513. package/skills/engineering/rush-release/release-check.mjs +93 -0
  514. package/skills/engineering/test-quality/LICENSE +3 -0
  515. package/skills/engineering/test-quality/SKILL.md +79 -0
  516. package/skills/engineering/test-quality/references/audit.md +80 -0
  517. package/skills/engineering/test-quality/references/lint.md +24 -0
  518. package/skills/engineering/test-quality/references/principles.md +143 -0
  519. package/skills/engineering/test-quality/references/testing-conventions.md +9 -0
  520. package/skills/engineering/test-quality/release-check.mjs +93 -0
  521. package/skills/engineering/test-quality/scripts/lint-tests.mjs +574 -0
  522. package/skills/engineering/test-quality/scripts/lint-tests.test.mjs +591 -0
  523. package/skills/engineering/test-quality/scripts/mock-policy-config.mjs +176 -0
  524. package/skills/engineering/test-quality/scripts/mock-policy-config.test.mjs +119 -0
  525. package/skills/engineering/test-quality/scripts/persist-conventions-core.mjs +117 -0
  526. package/skills/engineering/test-quality/scripts/persist-conventions.mjs +17 -0
  527. package/skills/engineering/test-quality/scripts/persist-conventions.test.mjs +104 -0
  528. package/skills/risk-compliance/compliance-audit/LICENSE +3 -0
  529. package/skills/risk-compliance/compliance-audit/SKILL.md +439 -0
  530. package/skills/risk-compliance/compliance-audit/references/findings-schema.md +293 -0
  531. package/skills/risk-compliance/compliance-audit/references/normalization-rules.md +45 -0
  532. package/skills/risk-compliance/compliance-audit/references/vars-checklist.md +1068 -0
  533. package/skills/risk-compliance/compliance-audit/references/vars-findings-schema.md +398 -0
  534. package/skills/risk-compliance/compliance-audit/release-check.mjs +93 -0
  535. package/skills/risk-compliance/compliance-audit/scripts/compliance-audit.test.mjs +14 -0
  536. package/skills/risk-compliance/compliance-audit/scripts/export_tracker_xlsx.py +221 -0
  537. package/skills/risk-compliance/compliance-audit/scripts/reconcile_tracker.py +458 -0
  538. package/skills/risk-compliance/compliance-audit/scripts/test_export_tracker_xlsx.py +97 -0
  539. package/skills/risk-compliance/compliance-audit/scripts/test_validate_tracker.py +157 -0
  540. package/skills/risk-compliance/compliance-audit/scripts/validate_tracker.py +829 -0
  541. package/skills/risk-compliance/contract-compare/LICENSE +3 -0
  542. package/skills/risk-compliance/contract-compare/SKILL.md +199 -0
  543. package/skills/risk-compliance/contract-compare/references/comparison-dimensions.md +209 -0
  544. package/skills/risk-compliance/contract-compare/release-check.mjs +93 -0
  545. package/skills/risk-compliance/contract-review/LICENSE +3 -0
  546. package/skills/risk-compliance/contract-review/SKILL.md +240 -0
  547. package/skills/risk-compliance/contract-review/references/review-criteria.md +223 -0
  548. package/skills/risk-compliance/contract-review/release-check.mjs +93 -0
  549. package/skills/risk-compliance/doc-authenticity/LICENSE +3 -0
  550. package/skills/risk-compliance/doc-authenticity/SKILL.md +160 -0
  551. package/skills/risk-compliance/doc-authenticity/agents/openai.yaml +8 -0
  552. package/skills/risk-compliance/doc-authenticity/manual-invocation.test.mjs +12 -0
  553. package/skills/risk-compliance/doc-authenticity/references/agreement.md +66 -0
  554. package/skills/risk-compliance/doc-authenticity/references/bank-statement.md +150 -0
  555. package/skills/risk-compliance/doc-authenticity/references/forensic-signals.md +157 -0
  556. package/skills/risk-compliance/doc-authenticity/references/image-signals.md +114 -0
  557. package/skills/risk-compliance/doc-authenticity/references/invoice.md +66 -0
  558. package/skills/risk-compliance/doc-authenticity/references/issuer-profiles.md +86 -0
  559. package/skills/risk-compliance/doc-authenticity/references/verdict-and-report.md +95 -0
  560. package/skills/risk-compliance/doc-authenticity/references/verdict.schema.json +81 -0
  561. package/skills/risk-compliance/doc-authenticity/release-check.mjs +93 -0
  562. package/skills/risk-compliance/doc-authenticity/scripts/image_forensics.py +294 -0
  563. package/skills/risk-compliance/doc-authenticity/scripts/pdf_forensics.py +401 -0
  564. package/skills/risk-compliance/doc-authenticity/scripts/validate_codes.py +224 -0
  565. package/skills/risk-compliance/doc-authenticity/scripts/validate_verdict.py +308 -0
  566. package/skills/risk-compliance/doc-authenticity/scripts/validate_verdict.test.mjs +212 -0
  567. package/skills/risk-compliance/fraud-analysis/LICENSE +3 -0
  568. package/skills/risk-compliance/fraud-analysis/SKILL.md +114 -0
  569. package/skills/risk-compliance/fraud-analysis/references/archetypes/authorized-payment-scam.md +41 -0
  570. package/skills/risk-compliance/fraud-analysis/references/archetypes/first-party-fraud.md +44 -0
  571. package/skills/risk-compliance/fraud-analysis/references/archetypes/third-party-fraud.md +27 -0
  572. package/skills/risk-compliance/fraud-analysis/references/contexts/bank-transfer.md +24 -0
  573. package/skills/risk-compliance/fraud-analysis/references/contexts/card-payment.md +30 -0
  574. package/skills/risk-compliance/fraud-analysis/references/contexts/payment-collection.md +20 -0
  575. package/skills/risk-compliance/fraud-analysis/references/contexts/payout.md +20 -0
  576. package/skills/risk-compliance/fraud-analysis/references/feature-engineering.md +158 -0
  577. package/skills/risk-compliance/fraud-analysis/references/mechanisms/account-takeover.md +36 -0
  578. package/skills/risk-compliance/fraud-analysis/references/report-rationale.md +45 -0
  579. package/skills/risk-compliance/fraud-analysis/references/report-template.md +190 -0
  580. package/skills/risk-compliance/fraud-analysis/references/review-checklist.md +175 -0
  581. package/skills/risk-compliance/fraud-analysis/references/taxonomy.md +79 -0
  582. package/skills/risk-compliance/fraud-analysis/references/terminology.md +108 -0
  583. package/skills/risk-compliance/fraud-analysis/references/workflow.md +175 -0
  584. package/skills/risk-compliance/fraud-analysis/release-check.mjs +93 -0
  585. package/skills/risk-compliance/payment-analysis/LICENSE +3 -0
  586. package/skills/risk-compliance/payment-analysis/SKILL.md +180 -0
  587. package/skills/risk-compliance/payment-analysis/references/auth-rate-actions.md +30 -0
  588. package/skills/risk-compliance/payment-analysis/references/chargebacks.md +208 -0
  589. package/skills/risk-compliance/payment-analysis/references/chinese-polish.md +51 -0
  590. package/skills/risk-compliance/payment-analysis/references/event-layers.md +127 -0
  591. package/skills/risk-compliance/payment-analysis/references/fx.md +59 -0
  592. package/skills/risk-compliance/payment-analysis/references/journey.md +79 -0
  593. package/skills/risk-compliance/payment-analysis/references/metrics.md +67 -0
  594. package/skills/risk-compliance/payment-analysis/references/report-template.md +119 -0
  595. package/skills/risk-compliance/payment-analysis/references/terminology.md +95 -0
  596. package/skills/risk-compliance/payment-analysis/references/visualization.md +56 -0
  597. package/skills/risk-compliance/payment-analysis/release-check.mjs +93 -0
  598. package/skills/risk-compliance/report-writing/LICENSE +3 -0
  599. package/skills/risk-compliance/report-writing/SKILL.md +220 -0
  600. package/skills/risk-compliance/report-writing/references/audit-report-template.md +121 -0
  601. package/skills/risk-compliance/report-writing/references/external-assessment-template.md +167 -0
  602. package/skills/risk-compliance/report-writing/references/management-report-template.md +145 -0
  603. package/skills/risk-compliance/report-writing/references/vars-report-template.md +224 -0
  604. package/skills/risk-compliance/report-writing/release-check.mjs +93 -0
  605. package/skills/risk-compliance/similar-domain/LICENSE +3 -0
  606. package/skills/risk-compliance/similar-domain/SKILL.md +203 -0
  607. package/skills/risk-compliance/similar-domain/references/entities.md +67 -0
  608. package/skills/risk-compliance/similar-domain/references/fingerprints.md +134 -0
  609. package/skills/risk-compliance/similar-domain/references/pivots.md +82 -0
  610. package/skills/risk-compliance/similar-domain/references/report-template.md +93 -0
  611. package/skills/risk-compliance/similar-domain/references/scoring.md +130 -0
  612. package/skills/risk-compliance/similar-domain/references/terminology.md +41 -0
  613. package/skills/risk-compliance/similar-domain/references/workflow.md +85 -0
  614. package/skills/risk-compliance/similar-domain/release-check.mjs +93 -0
  615. package/skills/risk-compliance/tld-detection/LICENSE +3 -0
  616. package/skills/risk-compliance/tld-detection/SKILL.md +245 -0
  617. package/skills/risk-compliance/tld-detection/agents/openai.yaml +9 -0
  618. package/skills/risk-compliance/tld-detection/references/chinese-polish.md +55 -0
  619. package/skills/risk-compliance/tld-detection/references/clean.md +51 -0
  620. package/skills/risk-compliance/tld-detection/references/clustering.md +235 -0
  621. package/skills/risk-compliance/tld-detection/references/decision.md +189 -0
  622. package/skills/risk-compliance/tld-detection/references/fx-conversion.md +232 -0
  623. package/skills/risk-compliance/tld-detection/references/report-template.md +272 -0
  624. package/skills/risk-compliance/tld-detection/references/streams.md +141 -0
  625. package/skills/risk-compliance/tld-detection/references/terminology.md +95 -0
  626. package/skills/risk-compliance/tld-detection/references/workflow.md +95 -0
  627. package/skills/risk-compliance/tld-detection/release-check.mjs +93 -0
  628. package/skills/risk-compliance/tld-detection/scripts/detect_ladders.py +390 -0
  629. package/skills/risk-compliance/tld-detection/scripts/detect_ladders.test.mjs +14 -0
  630. package/skills/risk-compliance/tld-detection/scripts/detect_streams.py +650 -0
  631. package/skills/risk-compliance/tld-detection/scripts/detect_streams.test.mjs +14 -0
  632. package/skills/risk-compliance/tld-detection/tests/test_detect_ladders.py +134 -0
  633. package/skills/risk-compliance/tld-detection/tests/test_detect_streams.py +520 -0
@@ -0,0 +1,189 @@
1
+ const deepFreeze = (value) => {
2
+ if (value && typeof value === 'object' && !Object.isFrozen(value)) {
3
+ for (const child of Object.values(value)) deepFreeze(child);
4
+ Object.freeze(value);
5
+ }
6
+ return value;
7
+ };
8
+
9
+ export const WORKFLOW_OWNED_MEMBERS = deepFreeze([
10
+ 'e2e-test',
11
+ 'ensure-coverage',
12
+ 'rush-issues',
13
+ 'resolve-issues',
14
+ 'rush-release',
15
+ 'resolve-release',
16
+ 'golden-path',
17
+ 'test-quality',
18
+ 'better-review',
19
+ 'engineering-runtime',
20
+ ]);
21
+
22
+ export const HARNESS_RUNTIME_DEPENDENCY_MEMBERS = deepFreeze([
23
+ 'harness-runtime',
24
+ ]);
25
+
26
+ export const MATT_DEPENDENCY_MEMBERS = deepFreeze([
27
+ 'batch-grill-me',
28
+ 'code-review',
29
+ 'codebase-design',
30
+ 'diagnosing-bugs',
31
+ 'domain-modeling',
32
+ 'grill-me',
33
+ 'grill-with-docs',
34
+ 'grilling',
35
+ 'handoff',
36
+ 'improve-codebase-architecture',
37
+ 'prototype',
38
+ 'research',
39
+ 'resolving-merge-conflicts',
40
+ 'setup-matt-pocock-skills',
41
+ 'tdd',
42
+ 'to-spec',
43
+ 'to-tickets',
44
+ 'triage',
45
+ 'wayfinder',
46
+ ]);
47
+
48
+ // Per-invoked-skill closure, generated from SKILL.md dependencies plus cross-member
49
+ // runtime imports. Order follows the coherence member census so the same tree always
50
+ // produces the same identity. A generated file remains part of its owner's content
51
+ // digest and is also named explicitly so a scoped verdict reports every identity used.
52
+ export const WORKFLOW_TRUSTED_INVOCATION_POLICIES = deepFreeze([
53
+ { installName: 'tdd', policy: 'manual-only' },
54
+ ]);
55
+
56
+ export const WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES = deepFreeze([
57
+ {
58
+ invokedSkill: 'rush-issues',
59
+ members: [
60
+ 'harness-runtime',
61
+ 'e2e-test',
62
+ 'rush-issues',
63
+ 'resolve-issues',
64
+ 'golden-path',
65
+ 'better-review',
66
+ 'engineering-runtime',
67
+ ],
68
+ generatedIdentities: [],
69
+ },
70
+
71
+ {
72
+ invokedSkill: 'resolve-issues',
73
+ members: [
74
+ 'harness-runtime',
75
+ 'e2e-test',
76
+ 'resolve-issues',
77
+ 'golden-path',
78
+ 'better-review',
79
+ 'engineering-runtime',
80
+ ],
81
+ generatedIdentities: [],
82
+ },
83
+
84
+ {
85
+ invokedSkill: 'rush-release',
86
+ members: [
87
+ 'rush-release',
88
+ 'resolve-release',
89
+ 'engineering-runtime',
90
+ ],
91
+ generatedIdentities: [],
92
+ },
93
+
94
+ {
95
+ invokedSkill: 'resolve-release',
96
+ members: [
97
+ 'resolve-release',
98
+ 'engineering-runtime',
99
+ ],
100
+ generatedIdentities: [],
101
+ },
102
+
103
+ ]);
104
+
105
+ // First-party content is installed natively from the repository by the Skills CLI (ADR 0005; the
106
+ // @1aboveio/skills npm package is retired, ADR 0010), so its identity is the repository following
107
+ // `main`. External sources keep their immutable reviewed revision.
108
+ export const WORKFLOW_TRUSTED_SOURCES = deepFreeze({
109
+ firstParty: {
110
+ id: 'first-party',
111
+ type: 'first-party',
112
+ repository: '1aboveio/ai',
113
+ revision: 'main',
114
+ },
115
+ matt: {
116
+ id: 'matt-pocock',
117
+ type: 'external',
118
+ repository: 'https://github.com/mattpocock/skills',
119
+ revision: 'ed37663cc5fbef691ddfecd080dff42f7e7e350d',
120
+ reviewedTree: '04b0fcb78e3de7c58744fcba2528354cc64ab988',
121
+ },
122
+ });
123
+
124
+ const nativeSkillsPrefix = 'npx skills@1.5.22 add';
125
+ const nativeSkillsTarget = '--global --agent universal claude-code --skill';
126
+ const invocationPolicyCommand = 'node "$HOME/.agents/skills/engineering-runtime/scripts/invocation-policy.mjs" --skill tdd --policy manual-only --from-selection';
127
+ const externalArchiveLimits = 'SKILLS_DOWNLOAD_MAX_BYTES=33554432 SKILLS_EXTRACT_MAX_FILES=4096 SKILLS_EXTRACT_MAX_BYTES=67108864';
128
+ const mattMembersArgument = MATT_DEPENDENCY_MEMBERS.join(' ');
129
+ const firstPartyMembers = deepFreeze([
130
+ ...HARNESS_RUNTIME_DEPENDENCY_MEMBERS,
131
+ ...WORKFLOW_OWNED_MEMBERS,
132
+ ]);
133
+ const runtimeDependencyInstall = ' && npm --prefix "$(realpath "$HOME/.agents/skills/engineering-runtime/scripts")" ci --ignore-scripts';
134
+ const firstPartyInstallSuffix = `${nativeSkillsTarget} ${firstPartyMembers.join(' ')}${runtimeDependencyInstall}`;
135
+
136
+ // The native dependency-first install. The first-party step carries no `--yes`: repair runs against
137
+ // an installation that is already missing, modified or mixed, which is exactly when the native
138
+ // overwrite summary and its consent prompt are the point. The generated recipes withhold the flag for
139
+ // the same reason, and repair guidance must not be the one place that pre-approves a destructive
140
+ // overwrite.
141
+ export const WORKFLOW_TRUSTED_REPAIR_RECIPE = deepFreeze({
142
+ id: 'engineering-workflow-dependency-first',
143
+ generatedFrom: 'skills/distribution/generated/recipes.json',
144
+ groupId: 'engineering-workflow',
145
+ lifecycle: 'install',
146
+ renderTarget: 'private-checkout',
147
+ stopOnFailure: true,
148
+ steps: [
149
+ {
150
+ sourceId: 'matt-pocock',
151
+ sourceType: 'external',
152
+ repository: WORKFLOW_TRUSTED_SOURCES.matt.repository,
153
+ revision: WORKFLOW_TRUSTED_SOURCES.matt.revision,
154
+ installPath: null,
155
+ members: MATT_DEPENDENCY_MEMBERS,
156
+ invocationPolicies: WORKFLOW_TRUSTED_INVOCATION_POLICIES,
157
+ commands: [{
158
+ transport: 'https',
159
+ command: `${externalArchiveLimits} ${nativeSkillsPrefix} https://codeload.github.com/mattpocock/skills/tar.gz/${WORKFLOW_TRUSTED_SOURCES.matt.revision} ${nativeSkillsTarget} ${mattMembersArgument} --yes && ${invocationPolicyCommand}`,
160
+ }],
161
+ onFailure: {
162
+ action: 'stop',
163
+ message: 'Source matt-pocock fetch failed; stop this recipe before running another source.',
164
+ },
165
+ },
166
+ {
167
+ sourceId: 'first-party',
168
+ sourceType: 'first-party',
169
+ repository: WORKFLOW_TRUSTED_SOURCES.firstParty.repository,
170
+ revision: WORKFLOW_TRUSTED_SOURCES.firstParty.revision,
171
+ installPath: null,
172
+ members: firstPartyMembers,
173
+ commands: [
174
+ {
175
+ transport: 'https',
176
+ command: `${nativeSkillsPrefix} ${WORKFLOW_TRUSTED_SOURCES.firstParty.repository} ${firstPartyInstallSuffix}`,
177
+ },
178
+ {
179
+ transport: 'ssh',
180
+ command: `${nativeSkillsPrefix} git@github.com:${WORKFLOW_TRUSTED_SOURCES.firstParty.repository}.git ${firstPartyInstallSuffix}`,
181
+ },
182
+ ],
183
+ onFailure: {
184
+ action: 'stop',
185
+ message: 'Source first-party fetch failed; stop this recipe before running another source.',
186
+ },
187
+ },
188
+ ],
189
+ });
@@ -0,0 +1,18 @@
1
+ import { DEFAULT_SCHEMA, dump, load } from "js-yaml"
2
+
3
+ // Parses a YAML document whose root must be a mapping. Lives here because js-yaml is resolved
4
+ // from this directory's node_modules; a skill script elsewhere cannot import it by bare name.
5
+ export function parseYamlMapping(yaml, label = "YAML") {
6
+ let value
7
+ try {
8
+ value = load(String(yaml || ""), { schema: DEFAULT_SCHEMA, json: false })
9
+ } catch (error) {
10
+ throw new Error(`${label} parse failed closed: ${String(error.message || error).trim()}`)
11
+ }
12
+ if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`${label} root must be a mapping`)
13
+ return value
14
+ }
15
+
16
+ export function dumpYamlMapping(value) {
17
+ return dump(value, { lineWidth: -1, noRefs: true, sortKeys: false })
18
+ }
@@ -0,0 +1,3 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 1AboveIO
@@ -0,0 +1,129 @@
1
+ ---
2
+ name: ensure-coverage
3
+ description: "Define or audit behavior-first test criteria — ACs, required test levels, mock/integration/E2E policy — across three axes: breadth (Coverage Ledger), depth (over-mocking), presentation (perceivability of browser surfaces). NOT judging whether a single test is any good (test-quality), authoring browser tests (e2e-test), reviewing a PR (better-review), or delivering issues (resolve-issues)."
4
+ disable-model-invocation: true
5
+ release-version: 0.36.0
6
+ ---
7
+ **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
8
+ # Ensure Coverage
9
+
10
+ Define **what must be proven** before a change is ready. This skill states obligations and grades evidence; it does not run CI, wire gates, author tests, or issue merge verdicts.
11
+
12
+ - **Create mode** — turn an ADR, PRD, spec, issue, or bug brief into `/docs/tests/YYYY-MM-DD-<slug>-criteria.md` ([template](references/process/output-template.md)).
13
+ - **Audit mode** — grade existing code and tests against those criteria into `/docs/tests/YYYY-MM-DD-<slug>-audit.md` ([steps](references/process/audit-mode.md)).
14
+
15
+ No source document? Derive candidate ACs from the issue, repro steps, sibling flows, or the public surface. Mark inferred behavior `Assumption` and undecided product questions `BLOCKED`. Never invent product semantics.
16
+
17
+ ## Stance: it ships broken until proven otherwise
18
+
19
+ Default to "not ready" and make the code earn the verdict. The one question: **if this launched now, how likely is a real user to hit a bug in the first week?**
20
+
21
+ - A test you have not read is not coverage. State what each passing test exercises and what it silently skips.
22
+ - Walk what a user does first — open the page, fill the form, submit, hit the error path — and name the test that proves each step.
23
+ - Name the concrete failure ("username dropped, submit returns 400"), not "coverage is partial."
24
+ - End with an explicit ship / no-ship call and the counts that drive it. Never round up to `Covered` to be agreeable.
25
+
26
+ ## Three axes
27
+
28
+ Each axis is blind to the others' failure; a coverage claim holds only when all three pass.
29
+
30
+ - **Breadth** (requirement-inward): did we enumerate everything that must be proven? Catches surfaces with no test at all. Output is a **complete surface census**, never a top-N list.
31
+ - **Depth** (test-outward): does each test prove the behavior against real state? Catches false green: over-mocking, proxy wiring, shallow assertions, wrong level.
32
+ - **Presentation** (render-outward): can a human *see and act on* the rendered page? Catches the invisible control, the overlapping layout, the route nothing links to.
33
+
34
+ ## The obligations
35
+
36
+ **Every surface owes a floor the moment it exists.** A requirement doc is not a precondition. The floor keys off the surface's kind and class, computed mechanically; humans may raise it or exclude through a gated path, never lower it. A reachable mutation route can never be excluded. Full table, taxonomy keys, exclusion gate: [surface-baseline](references/breadth/surface-baseline.md).
37
+
38
+ | kind | class | owes | the test must show |
39
+ |---|---|---|---|
40
+ | route | read / detail | browser-journey | real rendered data, no first-party mock |
41
+ | route | mutation | browser-journey | fill the real form → backend accepts → durable state changes |
42
+ | route | +sensitive | + api | + auth / tenant isolation |
43
+ | api | read | api | status, shape, auth |
44
+ | api | mutation | api + integration | durable state changed |
45
+ | api | +sensitive | + auth | mandatory auth / tenant isolation |
46
+ | table / event / job | — | none (transitive) | dead-surface warning if nothing reaches it |
47
+
48
+ **Every browser route also owes the presentation floor**, proven only against a real rendered page at `[375, 1280]`: `render-health` (no page error, console error, error boundary, or first-party 5xx, held *through* interactions), `spatial` (no overflow or overlap), `perceivability` (visible, contrast-passing controls; absent things are absent), `reachability` (navigable from an entry point, focus visible, ≥44px targets), `temporal` (no first-party layout shift). A functional journey satisfies none of these; a DOM-only assertion is `Over-mocked`. A unit that cites a design source also owes `fidelity`: expected values read off the source, rendered side by side ([axis](references/presentation/axis.md)).
49
+
50
+ **Real internals, faked externals, nothing in between.** Substitute only at a boundary you do not own (third-party APIs, providers, clock, randomness). Never mock-only: DB transactions, idempotency, concurrency, events/outbox/retry, auth and tenant isolation, schema compatibility, orchestrator recovery. A journey that intercepts first-party traffic proves proxy wiring, not behavior. Over-mocked is worse than untested: fix it or delete it ([policy](references/depth/mock-policy.md)).
51
+
52
+ **Prove the test would fail.** Modifying existing behavior owes a characterization test that passes on the pre-change tree. A bug fix owes a test red before the fix. A feature test counts only if it would go red were the behavior removed ([characterization](references/depth/characterization.md)).
53
+
54
+ **No test is skipped, disabled, guarded into a no-op, or weakened to get green.** Missing state is seeded. Un-sandboxable flake goes to a quarantine lane that still runs and reports. Obsolete tests are deleted ([strategy](references/process/test-strategy.md)).
55
+
56
+ **Every accepted ADR with runtime behavior owns a criteria doc and a coverage file.** An ADR that changes behavior with no proof attached is the un-spec'd route's mirror image: stated intent nobody checked. An ADR with no runtime behavior says so in its text; a known gap names a tracked issue. Mechanized by the ledger's acceptance gate ([ledger](references/breadth/coverage-ledger.md)).
57
+
58
+ **Every AC maps to a named test at the required level.** Read the test to judge what it proves. A green run of it (exit 0) is the only execution proof needed: do not collect logs, screenshots, traces, or read-backs on top. Prior docs and PR summaries are leads, never proof.
59
+
60
+ **Assign each obligation to its gate.** Coding acceptance is proven per change, by the tests at the required level, and stops once they pass. Integrated release acceptance (a device or system campaign, all-ABI or signed builds, cross-feature journeys) runs once at the release or campaign gate the spec or repository assigns it. A change's verdict never depends on that campaign and never claims it passed; record it once, as pending, in its owning issue. Define the criteria before execution; never expand them or add evidence obligations while proving them.
61
+
62
+ **Gates are added by humans only.** Do not recommend, require, wire, or audit for CI gates unless the user explicitly asks. A repo with no coverage gates in CI is not a finding. The gate menu ([ci-contract](references/enforcement/ci-contract.md)) and `ci-audit.mjs` are opt-in tools for when the user asks for gates.
63
+
64
+ **CI has one supported gate: curated golden-path smoke.** The ledger, inventory freshness, presentation sweep, broad E2E suite, test lint, over-mock scan, design parity, and quarantine expiry are audit and review evidence, not CI gates. When the user asks about CI coverage, propose or audit only the real-app golden-path smoke contract ([ci-contract](references/enforcement/ci-contract.md)); `ci-audit.mjs` checks only that smoke wiring.
65
+
66
+ ## Classifications
67
+
68
+ Full definitions: [grading](references/depth/grading.md). Whether a single test is any good is `test-quality`'s call; how its labels become these grades, and which smells are lint rules versus reviewer leads: [test-smells](references/depth/test-smells.md). A self-declared level is a claim to refute, never a pass.
69
+
70
+ - **`Covered`** — inspected test proves the behavior at the required level, acceptable mocks. The ledger shows it once the test is marked read (`verified: true`).
71
+ - **`Partial`** — some behavior tested; edge cases, failures, permissions, state, or evidence incomplete.
72
+ - **`Missing`** — no meaningful test maps to the obligation.
73
+ - **`Wrong Level`** — a test exists but is too shallow for the risk.
74
+ - **`Over-mocked`** — mocks bypass the behavior under test.
75
+ - **`Unverified`** — satisfied statically; nobody has marked the test read yet. A warning, not a block, unless the user turns on `unverifiedBlocks`. No evidence is required unless the user asks for it.
76
+ - **`Excluded`** — human-declared out of scope with category and reason, permitted by the gate, visible in the census.
77
+ - **`BLOCKED`** — source, code, tests, environment, or a product decision is unavailable.
78
+
79
+ ## Workflow
80
+
81
+ 1. **Understand the source.** Read the accepted ADRs (`docs/adr`, status accepted) that govern the touched surfaces; they are a requirement source, not background. Pick the output path; list observable behavior; mark assumptions and blockers.
82
+ 2. **Model correctness.** Number the ACs, name the critical journeys, assign each a required level ([levels](references/process/test-strategy.md)).
83
+ 3. **Plan coverage.** Test matrix, mock policy, E2E needs.
84
+ 4. **Grade all three axes.** Enumerate every surface ([discovery protocol](references/breadth/surface-discovery.md); the adapter's output shape is the [inventory contract](references/breadth/inventory-contract.md)), grade each test by reading it, confirm each browser route's presentation floor. Reconcile every accepted ADR against the census: one with runtime behavior and no coverage file is a finding.
85
+ 5. **Validate and decide.** Reject implementation-shaped, over-mocked, skipped, or incomplete coverage. Verdict at the top.
86
+
87
+ ## Deliverable
88
+
89
+ Verdict first, then the evidence that justifies it ([full template](references/process/output-template.md); worked examples: [refund flow](references/examples/refund-flow.md), [ledger](references/examples/coverage-ledger.md)):
90
+
91
+ ```markdown
92
+ ## Verdict: Ship / No-ship — <one-sentence reason with the driving counts>
93
+ ## Source · Scope · Assumptions · Blockers · Design source (or `none`)
94
+ ## Acceptance Criteria (numbered, observable, independently testable)
95
+ ## Critical Journeys (actor, start state, trigger, end state, side effects)
96
+ ## Test Matrix (scenario · AC · level · mock policy · setup · assertions · proving test)
97
+ ## Surface Census (audit) — one row per surface, status, proving test or —
98
+ ## Gaps and follow-ups (each with level, setup, assertions)
99
+ ## Blocking Decisions (product choices that change the verdict)
100
+ ```
101
+
102
+ ## Common wrong answers
103
+
104
+ - Green CI is not coverage. Read the test.
105
+ - An API test under a page does not prove the page.
106
+ - "Every ADR covered" is not "every surface covered." And an accepted ADR with no coverage file is a gap, not a pass.
107
+ - A write form covered by a validator or schema test is not covered. Only a rendered-form submission proves the form emits what the backend accepts.
108
+ - Excluding a surface is not fixing it. Exclusion is gated and visible.
109
+ - "The script isn't in the audited repo" is not `BLOCKED`. The scripts live in this skill; run them against the repo.
110
+ - A top-3 gap list is not an audit. Emit the census.
111
+ - "Out of scope" excludes behaviors, never the axis the unit is about.
112
+
113
+ ## Mechanization
114
+
115
+ The decidable parts of these obligations are decided by scripts, not prose. Every script lives under **this skill's directory** (the path you read this file from). Set `SKILL_DIR` to it and run `node "$SKILL_DIR/scripts/<name>.mjs"`. Never resolve a script against your CWD, and never locate one with `find` over `$HOME`; if `SKILL_DIR` is unknown, stop and ask. Usage and flags: [scripts/README.md](scripts/README.md).
116
+
117
+ | script | decides |
118
+ |---|---|
119
+ | `coverage-ledger.mjs` | breadth accounting: every surface's floor owned and proven; grades depth and presentation from `@covers`/`@level`; with `requirementGlobs`, every accepted ADR or PRD owns a coverage file with criteria or a tracked gap |
120
+ | `lint-tests.mjs` | added skips, fixed timeouts, empty tests, swallowed assertions, and mocks of first-party seams (zero-tolerance) |
121
+ | `design-parity.mjs` | the built page matches the cited design source |
122
+ | `check-quarantine-expiry.mjs` | a dated quarantine exit re-blocks when it expires |
123
+ | `ci-audit.mjs` | CI wires curated golden-path smoke as a blocking check |
124
+
125
+ In audit mode, always run the over-mock scan whole-tree and count every hit in the verdict.
126
+
127
+ ## Downstream
128
+
129
+ This skill defines what must be proven. `test-quality` judges whether each test is any good (one bar, one skip rule, shared with this skill). `e2e-test` authors browser tests and runs the presentation sweep as review evidence. `golden-path` checks the do-not-ship subset of the critical journeys against a running app and is the sole CI gate ([ci-contract](references/enforcement/ci-contract.md), verified by `ci-audit.mjs`). `resolve-issues` delivers and reviews through `better-review`. Some rules (no skips, fake only externals) are deliberately repeated in `e2e-test` and `golden-path` so each works on its own; this skill is the source when they differ.
@@ -0,0 +1,92 @@
1
+ # Coverage Ledger (breadth)
2
+
3
+ > Read when: building or auditing the breadth axis — reconciling requirement sources against the surface inventory. Holds both the **doctrine** (what the ledger is) and the **mechanics** (how to operate it). Siblings: [surface-baseline.md](surface-baseline.md) (the floor each surface owes), [surface-discovery.md](surface-discovery.md) (how surfaces are found), [inventory-contract.md](inventory-contract.md) (the discovery adapter), [examples/coverage-ledger.md](../examples/coverage-ledger.md) (worked shapes).
4
+
5
+ ## Doctrine: the ledger is a reconciliation, not an anchor
6
+
7
+ Breadth is a reconciliation of independent enumerations, never a single anchor. **No one requirement source is complete** — anchoring only on ADRs misses surfaces nobody wrote an ADR for; anchoring only on code misses intent that was never built.
8
+
9
+ 1. **Requirement sources (intent)**: ADRs, PRDs, specs, issues, security/compliance rules, explicit design decisions. Triangulate across them; do not trust one.
10
+ 2. **Surface inventory (implementation)**: routes, API endpoints, **interactive write surfaces (mutation forms and write actions on pages)**, DB tables/migrations, events/topics, jobs, permission boundaries, external integrations. Discover deterministically from code — extend the [Route Discovery And Reachability Protocol](surface-discovery.md) to every surface type. For each reachable page carrying a write action, inventory one **mutation-form journey** per write action as its own obligation; do not fold it into the route entry or its backend endpoint. Treat a page with a write form and `specs: []` (or any empty coverage entry) as an uncovered journey, not a covered route.
11
+ 3. **Reconcile** the two into a **Coverage Ledger**, authored **one file per requirement document** (`docs/tests/adr/<id>-<slug>.coverage.yml`, likewise under `prd/` and `design/`), colocated with and gated by that requirement. Each file declares only the surfaces that requirement owns plus their required level and criteria link; it stores **no** coverage status. A generated aggregation (`coverage-index`) merges duplicate surfaces across files into one row, unions their `requirementRefs: [adr:…, prd:…, issue:…]`, takes the strictest required level, and computes status from the actual tests. The surface stays the unit of truth; the requirement document is just the storage/ownership unit. The ADR Coverage Matrix is a *view* of the aggregation filtered to `adr:` refs — not the source of truth.
12
+
13
+ ## Alignment statuses (the breadth classification)
14
+
15
+ - `Aligned` — requirement ↔ surface ↔ evidence all present and linked. Hand off to depth grading.
16
+ - `Orphan surface` — a surface exists but **no requirement references it** (empty `requirementRefs`) = `inventory − union(curated files)`. The traceability gap a single-anchor audit cannot see. **A warning, not a hard error** — ownership is decoupled from the test obligation: the surface still carries its [Surface Baseline Contract](surface-baseline.md) floor and is graded at depth like any aligned row.
17
+ - `Unrealized requirement` — a curated surface absent from the inventory (drift, dead ADR, unbuilt spec).
18
+ - `Stale link` — the row references a surface or evidence file that no longer exists (rot).
19
+ - `Excluded` — a human marked the surface out of scope with a category + reason and the adapter signals permit it (see the baseline contract's exclusion gate). Surfaced in a visible census, never silent.
20
+
21
+ Once a row is `Aligned` (or an `Orphan surface` carrying its baseline floor), the quality of its evidence is a *depth* question, graded by the [depth classifications](../depth/grading.md). "Required and built but untested" is not a breadth gap — it is a row at depth status `Missing`.
22
+
23
+ ## Three layers
24
+
25
+ Separate discovery, curated intent, and the generated aggregation; let CI reconcile them. Status is **computed, never stored**, so per-requirement files for a shared surface cannot diverge — there is no status field to disagree on.
26
+
27
+ - **Generated inventory** (never hand-edited): surface discovery from code — routes, APIs, tables, events. Regenerated on every change.
28
+ - **Curated coverage** (hand-maintained, one file per requirement at `docs/tests/<adr|prd|design>/<id>-<slug>.coverage.yml`): the surfaces that requirement owns, each with required test level, `uiOnly`, criteria link, optional gap issue. Ownership and intent only — **not** status.
29
+ - **Generated aggregation** (`coverage-index`, never hand-edited): merges all curated files, dedups by surface, unions `requirementRefs`, takes the strictest required level (`strictest(baseline, curated, sensitive)`), and **computes** alignment + coverage status.
30
+
31
+ ## Baseline floor (no requirement needed)
32
+
33
+ Every entry surface (`route`, `api`) carries a minimum required-level floor computed from its `(kind, class)` — see [surface-baseline.md](surface-baseline.md). It applies **whether or not a requirement owns the surface**, so an organically-added route is graded the instant it appears. Consequences: `Orphan surface` is a **warn** but is still graded at its baseline floor (an unmet floor gives the failing depth status); internal surfaces (`table`/`event`/`job`) carry no floor (`Dead`-warned when unreached, else `Reached`); a curated entry can only **raise** (`requiredLevels`, `sensitive`) or **exclude** (gated), never lower the mechanical floor.
34
+
35
+ ## Exclusion gate + census
36
+
37
+ A curated `exclude: { category, reason, gapIssue? }` is honored only when the adapter signals agree the surface cannot hurt a user (`exclusionAllowed`) — full gate in [surface-baseline.md](surface-baseline.md). Every honored exclusion prints a `warn`-level census line; no silent caps.
38
+
39
+ ## Terminal depth states (the ledger's config)
40
+
41
+ `@level` is self-declared and never alone reaches `Covered` (the terminal states — `Over-mocked` / `Unverified` / `Covered` — are defined in [../depth/grading.md](../depth/grading.md)). The ledger flag: `Unverified` is a **warning by default** (`unverifiedBlocks: false`) until a curated `verified: true` promotes it; set `unverifiedBlocks: true` only when the user asks for it to block.
42
+
43
+ ## Evidence via `@covers` annotations
44
+
45
+ Curated files must not hand-list test paths that rot. Each test declares the surfaces it proves:
46
+
47
+ ```ts
48
+ // @covers /settings/models
49
+ // @level browser-journey
50
+ ```
51
+
52
+ The aggregation maps `@covers` → surface, checks required levels, flags internal interception (`route.fulfill`/`page.route(`), and computes depth status per the Evidence Hierarchy.
53
+
54
+ ## Acceptance gate
55
+
56
+ Make coverage a precondition of accepting a requirement, not an optional follow-up.
57
+
58
+ - Every accepted requirement with runtime behavior must own `docs/tests/<source>/<id>-*.coverage.yml` that links its `criteria` doc, before it can merge; the requirement's own PR adds both.
59
+ - A known gap is declared, not hidden: the coverage file names a `gapIssue` or `gapDoc` in place of `criteria` while the gap is open.
60
+ - A requirement with no runtime behavior (pure architecture, terminology) says "no runtime behavior" in its own text and needs no coverage file.
61
+ - The gate is mechanical: `coverage.config.json` → `requirementGlobs: { adr: "docs/adr" }` (and `prd`, `design`, …); `coverage-ledger.mjs validate` then errors on every accepted document with no coverage file, or a coverage file with neither criteria nor a tracked gap. `acceptedMarker` overrides the default `status: accepted` / `**Status:** accepted` match.
62
+
63
+ ## Reconciliation checks
64
+
65
+ The breadth axis is enforced by checks that fail (error) or warn:
66
+
67
+ - an accepted requirement with runtime behavior has no criteria doc or coverage file (error);
68
+ - the generated inventory is stale (surfaces changed but inventory not regenerated);
69
+ - an entry surface's **baseline floor is unmet** — `Missing`/`Over-mocked`/`Wrong Level` (error), or `Unverified` (warning by default; error when `unverifiedBlocks: true`);
70
+ - a surface owned by no curated file (`Orphan surface`, **warn** — baseline still enforced);
71
+ - an internal surface reached by no evidence (`Dead surface`, warn);
72
+ - an exclusion rejected by the reachability/class gate, or missing `category`/`reason` (error); honored exclusions print a census line (warn);
73
+ - a `Stale link` / `Unrealized requirement`;
74
+ - required level is integration/API/journey but only unit/mock evidence resolves;
75
+ - internal interception counted as behavior coverage (`Over-mocked`).
76
+
77
+ Run reconciliation during the audit regardless of who authored the change. Keep the generated inputs deterministic and report stale inventory rather than repairing it during an audit. This validator is evidence for the coverage verdict, not a CI gate; curated golden-path smoke is the sole CI gate ([CI contract](../enforcement/ci-contract.md)).
78
+
79
+ ## Reference validator
80
+
81
+ A framework-agnostic tool ships at `scripts/coverage-ledger.mjs` (Node, `js-yaml` only; curated files may be `.json` for zero-dep):
82
+
83
+ ```
84
+ node ~/.agents/skills/ensure-coverage/scripts/adapters/nextjs-inventory.mjs <appDir> --check # repo-specific discovery; fail if inventory stale
85
+ node ~/.agents/skills/ensure-coverage/scripts/coverage-ledger.mjs aggregate # build coverage-index from inventory + curated files + @covers tests
86
+ node ~/.agents/skills/ensure-coverage/scripts/coverage-ledger.mjs validate [--config f] [--strict] [--warn-only] # checks above; exit 1 on errors
87
+ node ~/.agents/skills/ensure-coverage/scripts/coverage-ledger.mjs report # markdown index + ADR matrix view
88
+ ```
89
+
90
+ **Outputs.** `aggregate` writes the surface-keyed `coverage-index.json` **and** a sibling `coverage-metrics.json` — roll-up counts plus the **over-mock rate** (`overMocked / tested` depth-graded surfaces, split `overMockedBehavior` / `overMockedPresentation`). The metric is a separate file, not a key in the index. `validate` and the `report` header print the rate inline (`N/T tested surfaces over-mocked (X%)`). The over-mock *count* is zero-tolerance in the audit verdict ([../depth/mock-policy.md](../depth/mock-policy.md)); the *rate* lets the reviewer **trend honesty as the suite grows** (a count rises just from more tests, a rate does not).
91
+
92
+ Surface *discovery* is the one repo-specific piece — supply an inventory adapter per [inventory-contract.md](inventory-contract.md) (a reference Next.js one ships at `scripts/adapters/nextjs-inventory.mjs`). Curated files follow `schemas/coverage-file.schema.json`.
@@ -0,0 +1,85 @@
1
+ # Surface Inventory Contract
2
+
3
+ > Read when: writing or checking a repo's surface-inventory adapter, or the ledger reports an orphan or dead surface you cannot explain.
4
+
5
+ Surface **discovery** is the one repo-specific part of the Coverage Ledger: enumerating routes/APIs/tables/events depends entirely on the stack. The reference tool (`scripts/coverage-ledger.mjs`) does **not** discover surfaces — your repo supplies them by emitting an inventory file that satisfies this contract. Everything downstream (aggregation, orphan detection, status) is generic and handled by the tool.
6
+
7
+ ## Output
8
+
9
+ Write JSON to `docs/tests/_generated/surface-inventory.json` (or wherever `--inventory` points). This file is **generated, never hand-edited**, and regenerated on every change so staleness is detectable.
10
+
11
+ ### Canonical form
12
+
13
+ ```json
14
+ {
15
+ "surfaces": [
16
+ { "id": "/settings/models", "kind": "route", "class": "mutation", "reachability": "reachable" },
17
+ { "id": "/about", "kind": "route", "class": "read", "reachability": "reachable" },
18
+ { "id": "/api/settings/model-allowlist", "kind": "api", "class": "mutation" },
19
+ { "id": "model_allowlist", "kind": "table" },
20
+ { "id": "model.allowlist.updated", "kind": "event" }
21
+ ]
22
+ }
23
+ ```
24
+
25
+ - `id` — the surface identifier. It must match exactly how the curated `*.coverage.yml` files and the test `@covers` annotations name the surface.
26
+ - `kind` — one of `route`, `api`, `table`, `event`, `job`, `permission`, `integration` (extend as needed; used only for reporting).
27
+ - `class` — the **mechanical taxonomy** that drives the Surface Baseline Contract floor. The adapter derives it deterministically from code, never from a session judgment:
28
+ - `route`: `read` (no write form) · `detail` (dynamic segment, renders one entity) · `mutation` (contains a write form / submit action).
29
+ - `api`: `read` (GET only) · `mutation` (exports POST/PUT/PATCH/DELETE).
30
+ - Omit for internal kinds (`table`/`event`/`job`) — they carry no baseline.
31
+ - The adapter emits **only** the mechanical class. `sensitive` (credential/admin escalation) and exclusion are human-declared in the curated `*.coverage.yml`, never guessed here — a path heuristic that under-classifies an admin route would silently hand it the weak floor.
32
+ - `reachability` — `reachable | guarded | blocked | unreachable | unknown`, from walking the guard/layout/middleware chain (see the Route Reachability Protocol). Drives the **exclusion gate**: a `reachable` `mutation` route can never be excluded below its journey floor. Omit for non-route kinds.
33
+
34
+ The baseline floor is computed from `(kind, class)`; the grouped lenient form below omits `class`/`reachability`, so entry surfaces fall back to the kind's `_default` floor (still enforced, just not class-refined). Prefer the canonical form so the floor is precise.
35
+
36
+ ### Golden-path candidate discovery
37
+
38
+ The same generated inventory can seed the golden-path contract: `golden-path suggest --inventory docs/tests/_generated/surface-inventory.json` ranks likely golden-path candidates from deterministic signals (route/API kind, `class: mutation`, reachability, auth/payment/liveness-looking names). The output is a `candidates` list, **not** a runnable `golden-paths.json` — product/release judgment decides which candidates are truly do-not-ship flows and writes the concrete observables.
39
+
40
+ ### Presentation axis (browser routes)
41
+
42
+ Every surface with `kind: "route"` auto-carries the **Presentation** floor on top of its functional floor (the five `presentation:*` levels — [../presentation/axis.md](../presentation/axis.md)). The adapter emits **no extra field**: `kind: "route"` *is* the browser-route fact the floor keys on. These floors are *graded* by the ledger and *run* by the `e2e-test` presentation sweep (`e2e-test/references/presentation-sweep.md`). The condition-matrix floor — viewports `[375, 1280]`, default theme, seeded data — is a ledger constant (`PRESENTATION_VIEWPORT_FLOOR` in `coverage-ledger.mjs`), not per-surface data.
43
+
44
+ ### Feature-derived escalation signals (optional)
45
+
46
+ A route surface may carry an optional `signals` object that the adapter derives **deterministically** from code. Each signal *raises* the presentation floor by adding a cell-qualified obligation (Dimension B of the condition matrix). Optional and additive — absent signals just leave the surface at the fixed floor.
47
+
48
+ ```json
49
+ { "id": "/app", "kind": "route", "class": "read", "reachability": "reachable",
50
+ "signals": { "themeToggle": true, "i18n": true } }
51
+ ```
52
+
53
+ | signal | derived from | adds required level(s) |
54
+ |---|---|---|
55
+ | `themeToggle` | a `next-themes` dep, or `useTheme`/`<ThemeProvider>`/`data-theme` in source | `presentation:perceivability@dark` |
56
+ | `i18n` | a known i18n dependency (next-intl, react-i18next, i18next, …) | `presentation:spatial@long-locale`, `presentation:spatial@rtl` |
57
+
58
+ Signals must be **deterministic** (same code → same signals) so two agents compute identical obligations. The reference Next.js adapter detects them at the app level and attaches to every route; a stack may refine to per-route detection. An escalated (`@`-qualified) cell can be dropped only via a gated `excludeCells` entry (category + reason, surfaced in the census); the base mechanical floor can never be removed.
59
+
60
+ ### Lenient grouped form (also accepted)
61
+
62
+ ```json
63
+ {
64
+ "routes": ["/settings/models"],
65
+ "apis": ["/api/settings/model-allowlist"],
66
+ "tables": ["model_allowlist"],
67
+ "events": ["model.allowlist.updated"]
68
+ }
69
+ ```
70
+
71
+ The tool flattens this, deriving `kind` from the group name (`routes` → `route`).
72
+
73
+ ## Adapter expectations
74
+
75
+ - **Deterministic**: same code → same inventory. No timestamps or ordering noise (the tool sorts).
76
+ - **Complete for the kinds it claims**: if it emits `route`s, it must emit *all* reachable routes, or orphan detection becomes unsound.
77
+ - **CI staleness check**: run the adapter with a `--check` mode (or `git diff --exit-code` on the output) so a PR that changes surfaces but not the inventory fails.
78
+
79
+ A reference Next.js App Router adapter ships at `scripts/adapters/nextjs-inventory.mjs` — copy and adapt it, or write your own per framework.
80
+
81
+ ## How the tool consumes it
82
+
83
+ `coverage-ledger.mjs aggregate` reads this inventory, the curated files, and `@covers` tests to build the index; `validate` runs the reconciliation checks. Commands and checks are documented in [coverage-ledger.md](coverage-ledger.md).
84
+
85
+ `Orphan surface` = a surface in this inventory owned by no curated file. It is a `warn` (a traceability gap), but the surface still carries — and is graded against — its Surface Baseline Contract floor, so an unowned route is not silently uncovered. The inventory's completeness is therefore what makes all three axes sound: an adapter that under-reports surfaces, or under-classifies an entry surface's `class`/`reachability`, hides exactly the gaps the ledger exists to catch — including the per-route presentation floor, which keys off `kind: route`.
@@ -0,0 +1,44 @@
1
+ # Surface Baseline Contract (breadth)
2
+
3
+ > Read when: computing the minimum required-level floor a surface owes. The breadth axis enumerates surfaces; this is the floor each one carries the instant it's discovered. Sibling refs: [coverage-ledger.md](coverage-ledger.md) (the ledger that holds these obligations), [surface-discovery.md](surface-discovery.md) (how surfaces and their `reachability` are found), [inventory-contract.md](inventory-contract.md) (the adapter that emits the taxonomy).
4
+
5
+ A requirement source (ADR/PRD/spec) is **not** a precondition for a test obligation. Most production gaps are organically-added routes nobody wrote an ADR for; if coverage waited on someone authoring a requirement, the surface would sit silently uncovered. So **every surface in the inventory carries a minimum required-level floor the instant it is discovered**, graded at depth automatically — safe by default. Orphan detection alone is worthless without a *default obligation* attached; it just relocates the judgment call to whoever notices — the session-variance that produced the gaps.
6
+
7
+ **The baseline keys off an adapter-emitted taxonomy, never inference at grading time** — inference-per-session is how "covered" came to mean different things. The adapter tags each surface deterministically so two agents on the same code compute the same floor.
8
+
9
+ - **`class` (mechanical, adapter-owned)**: `read | detail | mutation` for routes (does the page contain a write form / does `route.*` export a write method); derived from code with no human input.
10
+ - **`reachability` (adapter-owned)**: `reachable | guarded | blocked | unreachable | unknown` from the guard/layout/middleware chain (see [surface-discovery.md](surface-discovery.md)).
11
+ - **`sensitive` / exclusion (human-declared)**: credential/admin judgment and out-of-scope intent are *not* reliably derivable from syntax. Humans may only **raise** the floor (`sensitive`) or **exclude** (gated below) — never weaken the mechanical floor. `effectiveLevels = strictest(baseline, curated requiredLevels, sensitive escalation)`.
12
+
13
+ ## Baseline table
14
+
15
+ Baseline only **entry surfaces** (`route`, `api`). **Internal surfaces** (`table`, `event`, `job`) carry no independent obligation — they are proven transitively by the entry surface that writes/emits them, and only **dead-surface-warned** when no evidence reaches them (a table nothing writes is likely dead code, not a coverage gap).
16
+
17
+ | kind | class | baseline `requiredLevels` | the journey must additionally assert |
18
+ |---|---|---|---|
19
+ | route | read | `browser-journey` | page renders real data (drive the rendered page, no first-party mock) |
20
+ | route | detail | `browser-journey` | seeded real entity renders |
21
+ | route | mutation | `browser-journey` | fill real form → backend accepts → **durable state changes** |
22
+ | route | +sensitive | `browser-journey` + `api` | + auth / tenant-isolation assertion |
23
+ | api | read (GET) | `api` | status, shape, auth |
24
+ | api | mutation (write) | `api` + `integration` | durable state changed |
25
+ | api | +sensitive | + auth | mandatory auth / tenant isolation |
26
+ | table / event / job | — | none (transitive) | dead-surface-warned if unreached |
27
+ | permission | — | `integration` | resolves an auth test |
28
+ | integration (external) | — | fake adapter + contract | — |
29
+
30
+ Every **live browser route is `browser-journey` at minimum** — `class` changes only *what the journey additionally proves*, not *whether* you drive the page. A genuinely static/content page (marketing, docs) is downgraded via the **`static` exclusion category** to a `render-health` floor — a cheap reachability guarantee, never weakening the floor for real app pages. (`smoke` is accepted as an alias for this level; it is not the curated `smoke` gate, which is a cross-flow liveness check, not a per-route level.) **`render-health` is a browser-level check, not an API ping**: a real browser must load the rendered page and confirm it renders without error (externals may be faked). An HTTP-200 / API-level test does **not** satisfy it. The other exclusion categories (`seed`/`deprecated`/`internal`) drop to manifest-only. `render-health` is the one level a present-but-shallow test can satisfy, precisely because it is definitionally shallow. (Same "page loads/renders" concept as e2e-test's Tier-1 and the `presentation:render-health` spine.)
31
+
32
+ Every live browser route *also* auto-carries the **Presentation floor** on top of the functional floor above — see [../presentation/axis.md](../presentation/axis.md).
33
+
34
+ ## Exclusion is gated, not honored on a reason
35
+
36
+ An exclusion downgrades a surface to manifest-only — the exact move that re-opens the gap if trusted on a prose reason. So exclusion is **permitted only when the adapter's deterministic signals agree the surface cannot hurt a user**:
37
+
38
+ - A `Reachable` `mutation` route can **never** be excluded below its journey floor, regardless of any human "internal" claim — a reachable write form is a first-week bug surface.
39
+ - Manifest-only is permitted only when reachability is `blocked`/`unreachable`, or the surface is a read-only page (static/content), or a non-mutation API. The `static` category is the exception that downgrades to a `render-health` floor rather than manifest-only, so a content page still proves it loads.
40
+ - Every exclusion requires `category` (seed/static/deprecated/internal) + `reason` + optional `gapIssue`, and the validator prints a **visible exclusion census** every run. No silent caps.
41
+
42
+ ## The feature card is a deviation record, not a precondition
43
+
44
+ Because the baseline auto-applies, a surface with no requirement is **not blocked on authoring a file** — it is already graded at its floor. A curated `…coverage.yml` (the "feature card") is required only to **deviate**: raise above baseline, mark `sensitive`, exclude, attest (`verified`), or attach `owner`/`purpose`/`userVisibleContract` ownership. Pure happy-path baseline surfaces need no card. Requirement *ownership* (traceability) is a `warn`; the baseline *test obligation* is the hard gate.
@@ -0,0 +1,16 @@
1
+ # Route Discovery & Reachability Protocol (breadth)
2
+
3
+ > Read when: enumerating the surfaces that must be proven, and classifying whether each route is actually reachable. This is the *requirement-inward enumeration* that builds the surface inventory — a breadth activity. Its `reachability` output feeds the baseline floor and the exclusion gate ([surface-baseline.md](surface-baseline.md)).
4
+ >
5
+ > **Guard-chain vs navigational reachability.** This protocol determines **guard-chain** reachability — "can the URL load past middleware/auth." That is *different* from `presentation:reachability` ([../presentation/axis.md](../presentation/axis.md)), which is **navigational** — "can a user *click* their way here from an entry point." A route can be guard-reachable yet navigation-orphaned. Both matter; they are different checks.
6
+
7
+ Use this inline protocol for E2E audits even if `e2e-test` is unavailable. Route discovery is not complete after listing route files; verify whether each route can actually be reached through layouts, middleware, redirects, guards, rewrites, and route groups. For Next.js App Router and similar file-based routers:
8
+
9
+ 1. Enumerate all `page.*` and `route.*` files, including route groups, dynamic segments, parallel/intercepting routes, and exported HTTP methods for `route.*`. Tag each by kind — **browser route** (`page.*`) or **API route** (`route.*`) — because they carry different depth obligations and proof types ([../depth/grading.md](../depth/grading.md)). Never let one stand in for the other.
10
+ 2. For each page route, walk the layout chain root → route group → segment; inspect `layout.*`, `middleware.*`, redirects, `notFound`, auth/session checks, role/tenant guards, feature flags, rewrites.
11
+ 3. Classify reachability as `Reachable`, `Redirected`, `Guarded`, `Blocked`, or `Unknown`, with the guard/layout/middleware evidence.
12
+ 4. For each `Reachable` page, inventory its user-actionable mutations (forms, submit buttons, write actions) and the backend endpoint each targets. Record one **journey obligation** per mutation (operator completes form → backend accepts → state changes), separate from the page merely rendering. A write form with no journey test is uncovered, even when the route renders.
13
+ 5. Cross-reference discovered routes against PRD/spec claims, route manifests, navigation links, product journeys, and the golden-path candidate list. Discovery may suggest golden-path candidates, but the golden-path contract is curated: a route is not release-blocking merely for being a mutation route or containing an auth/payment-looking word.
14
+ 6. Flag routes that are unreachable, misplaced, stale, missing from the manifest, absent from code, or contradicting design docs — and reachable pages whose mutation forms have no journey coverage.
15
+
16
+ Do not classify a route as covered, missing, or part of a valid journey solely because a `page.*`/`route.*` file exists — a route file is only a declared route until its guard chain and journey validity are checked.