@1aboveio/skills 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +3 -0
- package/README.md +90 -0
- package/bin/1aboveio-skills.mjs +18 -0
- package/package.json +28 -0
- package/runtime/skills/distribution/generated/recipes.json +1189 -0
- package/runtime/skills/distribution/scripts/bundles.mjs +280 -0
- package/runtime/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
- package/skills/backend/airflow-dag-develop/LICENSE +3 -0
- package/skills/backend/airflow-dag-develop/SKILL.md +111 -0
- package/skills/backend/app-debug/LICENSE +3 -0
- package/skills/backend/app-debug/SKILL.md +109 -0
- package/skills/backend/app-debug/references/common-errors.md +128 -0
- package/skills/backend/python-backend/LICENSE +3 -0
- package/skills/backend/python-backend/SKILL.md +326 -0
- package/skills/cicd-pipeline/cloud-build/LICENSE +3 -0
- package/skills/cicd-pipeline/cloud-build/SKILL.md +707 -0
- package/skills/cicd-pipeline/cloud-debug/LICENSE +3 -0
- package/skills/cicd-pipeline/cloud-debug/SKILL.md +316 -0
- package/skills/cicd-pipeline/cloud-debug/references/build-failures.md +238 -0
- package/skills/cicd-pipeline/cloud-debug/references/deploy-failures.md +376 -0
- package/skills/cicd-pipeline/cloud-debug/references/pipeline-failures.md +378 -0
- package/skills/cicd-pipeline/cloud-deploy/LICENSE +3 -0
- package/skills/cicd-pipeline/cloud-deploy/SKILL.md +229 -0
- package/skills/cicd-pipeline/cloud-deploy/references/config-templates.md +257 -0
- package/skills/cicd-pipeline/docker/LICENSE +3 -0
- package/skills/cicd-pipeline/docker/SKILL.md +126 -0
- package/skills/cicd-pipeline/google-cloud/LICENSE +3 -0
- package/skills/cicd-pipeline/google-cloud/SKILL.md +118 -0
- package/skills/cicd-pipeline/google-cloud/references/gcs.md +469 -0
- package/skills/cicd-pipeline/google-cloud/references/iam.md +451 -0
- package/skills/cicd-pipeline/google-cloud/references/project.md +349 -0
- package/skills/cicd-pipeline/google-cloud/references/secrets.md +336 -0
- package/skills/cicd-pipeline/google-cloud/references/vpc.md +312 -0
- package/skills/cicd-pipeline/google-cloud/scripts/create-sa.sh +36 -0
- package/skills/cicd-pipeline/google-cloud/scripts/gcp-config.sh +31 -0
- package/skills/cicd-pipeline/google-cloud/scripts/grant-iap.sh +41 -0
- package/skills/cicd-pipeline/google-cloud/scripts/setup-secrets.sh +48 -0
- package/skills/cicd-pipeline/mergify/LICENSE +3 -0
- package/skills/cicd-pipeline/mergify/SKILL.md +138 -0
- package/skills/cicd-pipeline/mergify/assets/templates/mergify.yml +237 -0
- package/skills/cicd-pipeline/mergify/assets/templates/ruleset.json +46 -0
- package/skills/cicd-pipeline/mergify/references/branch-protection.md +277 -0
- package/skills/cicd-pipeline/mergify/references/configuration.md +183 -0
- package/skills/cicd-pipeline/mergify/references/diagnosis.md +73 -0
- package/skills/cicd-pipeline/mergify/references/traps.md +78 -0
- package/skills/cicd-pipeline/mergify/references/watch-contract.md +218 -0
- package/skills/cicd-pipeline/mergify/scripts/audit-core.mjs +131 -0
- package/skills/cicd-pipeline/mergify/scripts/audit.mjs +4 -0
- package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery-core.mjs +663 -0
- package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery.mjs +4 -0
- package/skills/cicd-pipeline/podman/LICENSE +3 -0
- package/skills/cicd-pipeline/podman/SKILL.md +70 -0
- package/skills/cicd-pipeline/podman/agents/openai.yaml +4 -0
- package/skills/cicd-pipeline/podman/assets/templates/podman-compose-socket-directory.yml +6 -0
- package/skills/cicd-pipeline/podman/assets/templates/podman-service-override.conf +3 -0
- package/skills/cicd-pipeline/podman/references/compose-compatibility.md +70 -0
- package/skills/cicd-pipeline/podman/references/networking-and-ports.md +74 -0
- package/skills/cicd-pipeline/podman/references/rootless-services-and-sockets.md +156 -0
- package/skills/cicd-pipeline/podman/references/troubleshooting.md +98 -0
- package/skills/engineering/e2e-test/LICENSE +3 -0
- package/skills/engineering/e2e-test/SKILL.md +156 -0
- package/skills/engineering/e2e-test/assets/ci-gates.cloudbuild.yaml +272 -0
- package/skills/engineering/e2e-test/assets/ci-gates.github.yml +451 -0
- package/skills/engineering/e2e-test/assets/e2e-workflow.yml +282 -0
- package/skills/engineering/e2e-test/references/authoring/auth-flows.md +159 -0
- package/skills/engineering/e2e-test/references/authoring/playwright-config.md +71 -0
- package/skills/engineering/e2e-test/references/authoring/playwright-patterns.md +219 -0
- package/skills/engineering/e2e-test/references/authoring/test-skipping.md +44 -0
- package/skills/engineering/e2e-test/references/ci-integration.md +121 -0
- package/skills/engineering/e2e-test/references/ci-playwright-container.md +280 -0
- package/skills/engineering/e2e-test/references/debugging.md +36 -0
- package/skills/engineering/e2e-test/references/presentation-sweep.md +131 -0
- package/skills/engineering/e2e-test/references/reviewing.md +39 -0
- package/skills/engineering/e2e-test/references/route-discovery.md +50 -0
- package/skills/engineering/e2e-test/references/route-manifest.md +44 -0
- package/skills/engineering/e2e-test/scripts/detect-routes-fastapi.py +290 -0
- package/skills/engineering/e2e-test/scripts/detect-routes-nextjs.mjs +200 -0
- package/skills/engineering/e2e-test/scripts/post-visual-evidence.mjs +158 -0
- package/skills/engineering/e2e-test/scripts/presentation-checks.mjs +171 -0
- package/skills/engineering/e2e-test/scripts/presentation-perceivability.mjs +179 -0
- package/skills/engineering/e2e-test/scripts/presentation-reachability.mjs +154 -0
- package/skills/engineering/e2e-test/scripts/presentation-render-health.mjs +141 -0
- package/skills/engineering/e2e-test/scripts/presentation-sweep.mjs +148 -0
- package/skills/engineering/e2e-test/scripts/presentation-temporal.mjs +127 -0
- package/skills/engineering/e2e-test/scripts/presentation-visual.mjs +84 -0
- package/skills/engineering/e2e-test/scripts/project-route-manifest.mjs +75 -0
- package/skills/engineering/e2e-test/scripts/validate-manifest.mjs +106 -0
- package/skills/engineering/engineering-runtime/LICENSE +3 -0
- package/skills/engineering/engineering-runtime/SKILL.md +10 -0
- package/skills/engineering/engineering-runtime/agents/openai.yaml +6 -0
- package/skills/engineering/engineering-runtime/coherence/workflow.json +553 -0
- package/skills/engineering/engineering-runtime/scripts/exact-head-artifact.mjs +131 -0
- package/skills/engineering/engineering-runtime/scripts/head-check-set.mjs +398 -0
- package/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
- package/skills/engineering/engineering-runtime/scripts/mergify-yaml.mjs +11 -0
- package/skills/engineering/engineering-runtime/scripts/package-lock.json +43 -0
- package/skills/engineering/engineering-runtime/scripts/package.json +10 -0
- package/skills/engineering/engineering-runtime/scripts/required-check-plan.mjs +223 -0
- package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +576 -0
- package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +166 -0
- package/skills/engineering/ensure-coverage/LICENSE +3 -0
- package/skills/engineering/ensure-coverage/SKILL.md +136 -0
- package/skills/engineering/ensure-coverage/evals/evals.json +125 -0
- package/skills/engineering/ensure-coverage/references/breadth/coverage-ledger.md +91 -0
- package/skills/engineering/ensure-coverage/references/breadth/inventory-contract.md +83 -0
- package/skills/engineering/ensure-coverage/references/breadth/surface-baseline.md +44 -0
- package/skills/engineering/ensure-coverage/references/breadth/surface-discovery.md +16 -0
- package/skills/engineering/ensure-coverage/references/depth/characterization.md +68 -0
- package/skills/engineering/ensure-coverage/references/depth/coverage.config.example.json +25 -0
- package/skills/engineering/ensure-coverage/references/depth/grading.md +35 -0
- package/skills/engineering/ensure-coverage/references/depth/mock-policy.md +87 -0
- package/skills/engineering/ensure-coverage/references/depth/test-smells.md +23 -0
- package/skills/engineering/ensure-coverage/references/enforcement/ci-contract.md +164 -0
- package/skills/engineering/ensure-coverage/references/enforcement/hooks.md +85 -0
- package/skills/engineering/ensure-coverage/references/examples/coverage-ledger.md +109 -0
- package/skills/engineering/ensure-coverage/references/examples/refund-flow.md +33 -0
- package/skills/engineering/ensure-coverage/references/presentation/axis.md +78 -0
- package/skills/engineering/ensure-coverage/references/presentation/runner-contract.md +74 -0
- package/skills/engineering/ensure-coverage/references/process/audit-mode.md +33 -0
- package/skills/engineering/ensure-coverage/references/process/output-template.md +139 -0
- package/skills/engineering/ensure-coverage/references/process/review-contract-template.md +119 -0
- package/skills/engineering/ensure-coverage/references/process/scope-class.md +178 -0
- package/skills/engineering/ensure-coverage/references/process/test-strategy.md +55 -0
- package/skills/engineering/ensure-coverage/schemas/coverage-config.schema.json +45 -0
- package/skills/engineering/ensure-coverage/schemas/coverage-file.schema.json +93 -0
- package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.mjs +178 -0
- package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.mjs +101 -0
- package/skills/engineering/ensure-coverage/scripts/ci-audit.mjs +358 -0
- package/skills/engineering/ensure-coverage/scripts/coverage-checklist.mjs +494 -0
- package/skills/engineering/ensure-coverage/scripts/coverage-ledger.mjs +663 -0
- package/skills/engineering/ensure-coverage/scripts/design-parity.mjs +591 -0
- package/skills/engineering/ensure-coverage/scripts/evidence-block.mjs +367 -0
- package/skills/engineering/ensure-coverage/scripts/lint-tests.mjs +269 -0
- package/skills/engineering/ensure-coverage/scripts/mock-policy-config.mjs +176 -0
- package/skills/engineering/ensure-coverage/scripts/package-lock.json +76 -0
- package/skills/engineering/ensure-coverage/scripts/package.json +19 -0
- package/skills/engineering/ensure-coverage/scripts/scope-class.mjs +554 -0
- package/skills/engineering/harness-runtime/LICENSE +3 -0
- package/skills/engineering/harness-runtime/SKILL.md +18 -0
- package/skills/engineering/harness-runtime/agents/openai.yaml +6 -0
- package/skills/engineering/harness-runtime/bin/discover-models.mjs +4 -0
- package/skills/engineering/harness-runtime/bin/model-catalog.mjs +4 -0
- package/skills/engineering/harness-runtime/contracts.md +15 -0
- package/skills/engineering/harness-runtime/discover-models.mjs +392 -0
- package/skills/engineering/harness-runtime/fixtures/native-question-schemas.json +33 -0
- package/skills/engineering/harness-runtime/fixtures/question-responses.json +54 -0
- package/skills/engineering/harness-runtime/index.mjs +767 -0
- package/skills/engineering/harness-runtime/model-catalog.mjs +787 -0
- package/skills/engineering/harness-runtime/native-question-contracts.md +37 -0
- package/skills/engineering/harness-runtime/references/model-catalog-seed.json +159 -0
- package/skills/engineering/harness-runtime/references/model-catalog.md +57 -0
- package/skills/engineering/implement-and-pr/LICENSE +3 -0
- package/skills/engineering/implement-and-pr/SKILL.md +176 -0
- package/skills/engineering/implement-and-pr/references/ci-iteration.md +10 -0
- package/skills/engineering/implement-and-pr/references/closeout.md +27 -0
- package/skills/engineering/implement-and-pr/references/contract-complete-fix-rounds.md +34 -0
- package/skills/engineering/implement-and-pr/references/evidence-rules.md +39 -0
- package/skills/engineering/implement-and-pr/references/incremental-plan.md +16 -0
- package/skills/engineering/implement-and-pr/references/self-review.md +23 -0
- package/skills/engineering/implement-and-pr/references/tdd-mode.md +18 -0
- package/skills/engineering/resolve-issues/LICENSE +3 -0
- package/skills/engineering/resolve-issues/SKILL.md +167 -0
- package/skills/engineering/resolve-issues/generated/workflow-repair-policy.json +448 -0
- package/skills/engineering/resolve-issues/references/breaker.md +82 -0
- package/skills/engineering/resolve-issues/references/deliverables.md +27 -0
- package/skills/engineering/resolve-issues/references/delivery.md +108 -0
- package/skills/engineering/resolve-issues/references/evidence-lane.md +21 -0
- package/skills/engineering/resolve-issues/references/exact-head-ci.md +287 -0
- package/skills/engineering/resolve-issues/references/fan-out.md +33 -0
- package/skills/engineering/resolve-issues/references/finalization.md +68 -0
- package/skills/engineering/resolve-issues/references/guarantees.md +10 -0
- package/skills/engineering/resolve-issues/references/high-risk.md +29 -0
- package/skills/engineering/resolve-issues/references/incidents/848/README.md +156 -0
- package/skills/engineering/resolve-issues/references/intake.md +86 -0
- package/skills/engineering/resolve-issues/references/integration-gate.md +53 -0
- package/skills/engineering/resolve-issues/references/interference.md +87 -0
- package/skills/engineering/resolve-issues/references/loop.md +134 -0
- package/skills/engineering/resolve-issues/references/model-catalog.md +9 -0
- package/skills/engineering/resolve-issues/references/postmortem.md +27 -0
- package/skills/engineering/resolve-issues/references/pre-flight-model-slots.md +41 -0
- package/skills/engineering/resolve-issues/references/pre-flight-recording-and-checkout.md +48 -0
- package/skills/engineering/resolve-issues/references/pre-flight.md +41 -0
- package/skills/engineering/resolve-issues/references/regression-checklist.md +26 -0
- package/skills/engineering/resolve-issues/references/run-state.md +288 -0
- package/skills/engineering/resolve-issues/references/sandboxed-testing.md +48 -0
- package/skills/engineering/resolve-issues/references/spawn-contract.md +96 -0
- package/skills/engineering/resolve-issues/references/terminal-evidence-journal.md +40 -0
- package/skills/engineering/resolve-issues/references/why.md +653 -0
- package/skills/engineering/resolve-issues/schemas/fix-round.schema.json +49 -0
- package/skills/engineering/resolve-issues/scripts/combine-and-verify.mjs +721 -0
- package/skills/engineering/resolve-issues/scripts/component-candidate.mjs +962 -0
- package/skills/engineering/resolve-issues/scripts/contract-revision.mjs +220 -0
- package/skills/engineering/resolve-issues/scripts/detect-delivery-mode.mjs +420 -0
- package/skills/engineering/resolve-issues/scripts/detect-target-branch.mjs +256 -0
- package/skills/engineering/resolve-issues/scripts/detect-workspace-mode.mjs +168 -0
- package/skills/engineering/resolve-issues/scripts/discover-models.mjs +9 -0
- package/skills/engineering/resolve-issues/scripts/doctrine.mjs +62 -0
- package/skills/engineering/resolve-issues/scripts/evidence-lifecycle-contract.mjs +191 -0
- package/skills/engineering/resolve-issues/scripts/exact-head-ci.mjs +413 -0
- package/skills/engineering/resolve-issues/scripts/exact-head-github-provider.mjs +332 -0
- package/skills/engineering/resolve-issues/scripts/finalize.mjs +488 -0
- package/skills/engineering/resolve-issues/scripts/fix-rounds.mjs +3307 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-circular-1001.json +16 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-valid-sequencing.json +51 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/fmm-express-830-component-candidate.json +17 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/head-check-set-1081.json +166 -0
- package/skills/engineering/resolve-issues/scripts/gate-value-series.mjs +92 -0
- package/skills/engineering/resolve-issues/scripts/guide-index.mjs +73 -0
- package/skills/engineering/resolve-issues/scripts/head-check-set.mjs +159 -0
- package/skills/engineering/resolve-issues/scripts/interference.mjs +427 -0
- package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +9 -0
- package/skills/engineering/resolve-issues/scripts/next-operations.mjs +419 -0
- package/skills/engineering/resolve-issues/scripts/postmortem.mjs +909 -0
- package/skills/engineering/resolve-issues/scripts/preflight-questions.mjs +322 -0
- package/skills/engineering/resolve-issues/scripts/reconcile-contained-unit-prs.mjs +415 -0
- package/skills/engineering/resolve-issues/scripts/release-state-contract.mjs +697 -0
- package/skills/engineering/resolve-issues/scripts/report.mjs +494 -0
- package/skills/engineering/resolve-issues/scripts/required-check-plan.mjs +172 -0
- package/skills/engineering/resolve-issues/scripts/round-metadata.mjs +79 -0
- package/skills/engineering/resolve-issues/scripts/run-state-review6-cases.mjs +334 -0
- package/skills/engineering/resolve-issues/scripts/run-state.mjs +4784 -0
- package/skills/engineering/resolve-issues/scripts/sandbox-selftest.mjs +395 -0
- package/skills/engineering/resolve-issues/scripts/spawn-contract.mjs +290 -0
- package/skills/engineering/resolve-issues/scripts/terminal-dispositions.mjs +170 -0
- package/skills/engineering/resolve-issues/scripts/terminal-evidence-journal.mjs +293 -0
- package/skills/engineering/resolve-issues/scripts/unit-kind.mjs +197 -0
- package/skills/engineering/resolve-issues/scripts/unit-lifecycle.mjs +127 -0
- package/skills/engineering/resolve-issues/scripts/watch-delivery.mjs +893 -0
- package/skills/engineering/resolve-issues/scripts/workspaces.mjs +829 -0
- package/skills/engineering/resolve-issues/workflows/independent-review.workflow.js +290 -0
- package/skills/engineering/resolve-issues/workflows/prior-art-scan.workflow.js +80 -0
- package/skills/engineering/resolve-issues/workflows/workflow-smoke.mjs +102 -0
- package/skills/engineering/resolve-release/LICENSE +3 -0
- package/skills/engineering/resolve-release/SKILL.md +112 -0
- package/skills/engineering/resolve-release/references/assembly.md +137 -0
- package/skills/engineering/resolve-release/references/auto-when-green.md +56 -0
- package/skills/engineering/resolve-release/references/candidate.md +167 -0
- package/skills/engineering/resolve-release/references/exposure.md +178 -0
- package/skills/engineering/resolve-release/references/handoff.md +24 -0
- package/skills/engineering/resolve-release/references/postmortem.md +230 -0
- package/skills/engineering/resolve-release/references/preflight.md +207 -0
- package/skills/engineering/resolve-release/references/principles.md +94 -0
- package/skills/engineering/resolve-release/references/regression-checklist.md +36 -0
- package/skills/engineering/resolve-release/references/related-skills.md +12 -0
- package/skills/engineering/resolve-release/references/routing.md +149 -0
- package/skills/engineering/resolve-release/references/verified-sha-github-flow.md +285 -0
- package/skills/engineering/resolve-release/references/versioning.md +202 -0
- package/skills/engineering/resolve-release/references/why.md +53 -0
- package/skills/engineering/resolve-release/scripts/adapter-completion-artifact.mjs +389 -0
- package/skills/engineering/resolve-release/scripts/build-changes.mjs +209 -0
- package/skills/engineering/resolve-release/scripts/candidate-hygiene.mjs +407 -0
- package/skills/engineering/resolve-release/scripts/candidate-identity.mjs +904 -0
- package/skills/engineering/resolve-release/scripts/candidate-traffic.mjs +81 -0
- package/skills/engineering/resolve-release/scripts/checked-adapter-loader.mjs +612 -0
- package/skills/engineering/resolve-release/scripts/close-attempt.mjs +135 -0
- package/skills/engineering/resolve-release/scripts/closeout-release.mjs +161 -0
- package/skills/engineering/resolve-release/scripts/doctrine.mjs +106 -0
- package/skills/engineering/resolve-release/scripts/durable-processing.mjs +522 -0
- package/skills/engineering/resolve-release/scripts/ensure-target-green.mjs +659 -0
- package/skills/engineering/resolve-release/scripts/evidence-bundle.mjs +1014 -0
- package/skills/engineering/resolve-release/scripts/finalize-release.mjs +526 -0
- package/skills/engineering/resolve-release/scripts/fixtures/durable-processing-adapter.mjs +169 -0
- package/skills/engineering/resolve-release/scripts/green-gate.mjs +599 -0
- package/skills/engineering/resolve-release/scripts/isolated-adapter-evaluator.mjs +752 -0
- package/skills/engineering/resolve-release/scripts/metadata-pr-status.mjs +56 -0
- package/skills/engineering/resolve-release/scripts/metadata-sync.mjs +1538 -0
- package/skills/engineering/resolve-release/scripts/postmortem.mjs +381 -0
- package/skills/engineering/resolve-release/scripts/preflight-probes.mjs +498 -0
- package/skills/engineering/resolve-release/scripts/production-endpoints.mjs +326 -0
- package/skills/engineering/resolve-release/scripts/rc-circuit-breaker.mjs +272 -0
- package/skills/engineering/resolve-release/scripts/report.mjs +417 -0
- package/skills/engineering/resolve-release/scripts/reprobe-credentials.mjs +114 -0
- package/skills/engineering/resolve-release/scripts/revalidate-candidate.mjs +238 -0
- package/skills/engineering/resolve-release/scripts/review-packet.mjs +503 -0
- package/skills/engineering/resolve-release/scripts/rollback-floor.mjs +263 -0
- package/skills/engineering/resolve-release/scripts/version-assert.mjs +339 -0
- package/skills/engineering/resolve-release/scripts/version-postmortem.mjs +485 -0
- package/skills/engineering/resolve-release/scripts/version.mjs +1199 -0
- package/skills/engineering/resolve-release/scripts/watch-candidate-delivery.mjs +449 -0
- package/skills/engineering/resolve-release/vendor/ACORN-LICENSE +21 -0
- package/skills/engineering/resolve-release/vendor/README.md +60 -0
- package/skills/engineering/resolve-release/vendor/acorn.mjs +6233 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/LICENSE +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/README.md +341 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/README.template.md +70 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs +7 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.mts +2033 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.ts +2033 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js +7 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/package.json +49 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/LICENSE +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/README.md +5 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.mts +549 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.ts +549 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/package.json +36 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/LICENSE +47 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/README.md +82 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.d.ts +11 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.mjs +22 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cjs +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.cjs +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.d.ts +11 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.d.ts +11 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.mjs +25 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.wasm +0 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.mts +85 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.ts +85 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.mts +20 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.ts +20 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/package.json +61 -0
- package/skills/engineering/review-pr/LICENSE +3 -0
- package/skills/engineering/review-pr/SKILL.md +123 -0
- package/skills/engineering/review-pr/references/adversarial-reviewer-prompt.md +42 -0
- package/skills/engineering/review-pr/references/code-correctness.md +5 -0
- package/skills/engineering/review-pr/references/contract-freshness.md +9 -0
- package/skills/engineering/review-pr/references/coordination.md +18 -0
- package/skills/engineering/review-pr/references/domain-hazards.md +123 -0
- package/skills/engineering/review-pr/references/finding-themes.md +7 -0
- package/skills/engineering/review-pr/references/github-posting.md +98 -0
- package/skills/engineering/review-pr/references/golden-path-smoke.md +5 -0
- package/skills/engineering/review-pr/references/incremental-output.md +16 -0
- package/skills/engineering/review-pr/references/inputs-and-discovery.md +31 -0
- package/skills/engineering/review-pr/references/output-format.md +99 -0
- package/skills/engineering/review-pr/references/over-mock-screen.md +7 -0
- package/skills/engineering/review-pr/references/promotion-prs.md +16 -0
- package/skills/engineering/review-pr/references/re-review.md +18 -0
- package/skills/engineering/review-pr/references/review-method.md +199 -0
- package/skills/engineering/review-pr/references/review-mode.md +30 -0
- package/skills/engineering/review-pr/references/review-posture.md +53 -0
- package/skills/engineering/review-pr/references/round1-depth.md +62 -0
- package/skills/engineering/review-pr/references/scripts.md +17 -0
- package/skills/engineering/review-pr/references/workflow.md +16 -0
- package/skills/engineering/review-pr/schemas/findings.schema.json +282 -0
- package/skills/engineering/review-pr/scripts/finding-contract.mjs +285 -0
- package/skills/engineering/review-pr/scripts/post-review.mjs +405 -0
- package/skills/engineering/review-pr/scripts/pr-context.mjs +207 -0
- package/skills/engineering/review-pr/scripts/scan-diff.mjs +365 -0
- package/skills/engineering/review-pr/scripts/theme-contract.mjs +57 -0
- package/skills/engineering/smoke/LICENSE +3 -0
- package/skills/engineering/smoke/SKILL.md +131 -0
- package/skills/engineering/smoke/assets/smoke.manifest.example.json +53 -0
- package/skills/engineering/smoke/references/manifest.md +192 -0
- package/skills/engineering/smoke/scripts/smoke.mjs +713 -0
- package/skills/fullstack/better-auth/LICENSE +3 -0
- package/skills/fullstack/better-auth/SKILL.md +601 -0
- package/skills/fullstack/better-auth/references/feishu-api.md +270 -0
- package/skills/fullstack/monorepo/LICENSE +3 -0
- package/skills/fullstack/monorepo/SKILL.md +465 -0
- package/skills/fullstack/nextjs-fullstack/LICENSE +3 -0
- package/skills/fullstack/nextjs-fullstack/SKILL.md +210 -0
- package/skills/fullstack/nextjs-fullstack/conventions.md +318 -0
- package/skills/fullstack/nextjs-fullstack/frontend-conventions.md +61 -0
- package/skills/fullstack/nextjs-fullstack/nextjs16.md +287 -0
- package/skills/fullstack/nextjs-fullstack/server-actions.md +409 -0
- package/skills/fullstack/prisma-setup/LICENSE +3 -0
- package/skills/fullstack/prisma-setup/SKILL.md +180 -0
- package/skills/fullstack/prisma-setup/nextjs.md +258 -0
- package/skills/fullstack/prisma-setup/turborepo.md +301 -0
- package/skills/fullstack/shadcn/LICENSE +3 -0
- package/skills/fullstack/shadcn/SKILL.md +119 -0
- package/skills/fullstack/shadcn/assets/shadcn-small.png +0 -0
- package/skills/fullstack/shadcn/assets/shadcn.png +0 -0
- package/skills/fullstack/shadcn/cli.md +411 -0
- package/skills/fullstack/shadcn/customization.md +224 -0
- package/skills/fullstack/shadcn/evals/evals.json +90 -0
- package/skills/fullstack/shadcn/mcp.md +101 -0
- package/skills/fullstack/shadcn/rules/base-vs-radix.md +323 -0
- package/skills/fullstack/shadcn/rules/component-selection.md +67 -0
- package/skills/fullstack/shadcn/rules/composition.md +195 -0
- package/skills/fullstack/shadcn/rules/data-table.md +201 -0
- package/skills/fullstack/shadcn/rules/forms.md +255 -0
- package/skills/fullstack/shadcn/rules/icons.md +103 -0
- package/skills/fullstack/shadcn/rules/styling.md +167 -0
- package/skills/fullstack/zod-v4/LICENSE +3 -0
- package/skills/fullstack/zod-v4/SKILL.md +287 -0
|
@@ -0,0 +1,166 @@
|
|
|
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
|
+
'implement-and-pr',
|
|
13
|
+
'resolve-issues',
|
|
14
|
+
'resolve-release',
|
|
15
|
+
'review-pr',
|
|
16
|
+
'smoke',
|
|
17
|
+
'engineering-runtime',
|
|
18
|
+
]);
|
|
19
|
+
|
|
20
|
+
export const HARNESS_RUNTIME_DEPENDENCY_MEMBERS = deepFreeze([
|
|
21
|
+
'harness-runtime',
|
|
22
|
+
]);
|
|
23
|
+
|
|
24
|
+
export const MATT_DEPENDENCY_MEMBERS = deepFreeze([
|
|
25
|
+
'batch-grill-me',
|
|
26
|
+
'code-review',
|
|
27
|
+
'codebase-design',
|
|
28
|
+
'diagnosing-bugs',
|
|
29
|
+
'domain-modeling',
|
|
30
|
+
'grill-me',
|
|
31
|
+
'grill-with-docs',
|
|
32
|
+
'grilling',
|
|
33
|
+
'handoff',
|
|
34
|
+
'improve-codebase-architecture',
|
|
35
|
+
'prototype',
|
|
36
|
+
'research',
|
|
37
|
+
'resolving-merge-conflicts',
|
|
38
|
+
'setup-matt-pocock-skills',
|
|
39
|
+
'tdd',
|
|
40
|
+
'to-spec',
|
|
41
|
+
'to-tickets',
|
|
42
|
+
'triage',
|
|
43
|
+
'wayfinder',
|
|
44
|
+
]);
|
|
45
|
+
|
|
46
|
+
// Per-invoked-skill closure, generated from SKILL.md dependencies plus cross-member
|
|
47
|
+
// runtime imports. Order follows the coherence member census so the same tree always
|
|
48
|
+
// produces the same identity. A generated file remains part of its owner's content
|
|
49
|
+
// digest and is also named explicitly so a scoped verdict reports every identity used.
|
|
50
|
+
export const WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES = deepFreeze([
|
|
51
|
+
{
|
|
52
|
+
invokedSkill: 'resolve-issues',
|
|
53
|
+
members: [
|
|
54
|
+
'tdd',
|
|
55
|
+
'harness-runtime',
|
|
56
|
+
'e2e-test',
|
|
57
|
+
'ensure-coverage',
|
|
58
|
+
'implement-and-pr',
|
|
59
|
+
'resolve-issues',
|
|
60
|
+
'review-pr',
|
|
61
|
+
'smoke',
|
|
62
|
+
'engineering-runtime',
|
|
63
|
+
],
|
|
64
|
+
generatedIdentities: [
|
|
65
|
+
{ member: 'resolve-issues', path: 'generated/workflow-repair-policy.json' },
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
invokedSkill: 'resolve-release',
|
|
70
|
+
members: [
|
|
71
|
+
'harness-runtime',
|
|
72
|
+
'e2e-test',
|
|
73
|
+
'ensure-coverage',
|
|
74
|
+
'resolve-issues',
|
|
75
|
+
'resolve-release',
|
|
76
|
+
'review-pr',
|
|
77
|
+
'smoke',
|
|
78
|
+
'engineering-runtime',
|
|
79
|
+
],
|
|
80
|
+
generatedIdentities: [
|
|
81
|
+
{ member: 'resolve-issues', path: 'generated/workflow-repair-policy.json' },
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
]);
|
|
85
|
+
|
|
86
|
+
// First-party content is distributed as an exact public npm release, so its identity is the package
|
|
87
|
+
// and version rather than a private repository at a moving branch. The private checkout remains a
|
|
88
|
+
// render target of the same manifest for local development, but it is not what an installed Workflow
|
|
89
|
+
// is verified against: `revision: 'main'` is scoped to that target and never reaches coherence.
|
|
90
|
+
// External sources keep their immutable reviewed revision — the migration is first-party only.
|
|
91
|
+
export const WORKFLOW_TRUSTED_SOURCES = deepFreeze({
|
|
92
|
+
firstParty: {
|
|
93
|
+
id: 'first-party',
|
|
94
|
+
type: 'first-party',
|
|
95
|
+
package: '@1aboveio/skills',
|
|
96
|
+
version: '0.10.0',
|
|
97
|
+
},
|
|
98
|
+
matt: {
|
|
99
|
+
id: 'matt-pocock',
|
|
100
|
+
type: 'external',
|
|
101
|
+
repository: 'https://github.com/mattpocock/skills',
|
|
102
|
+
revision: 'ed37663cc5fbef691ddfecd080dff42f7e7e350d',
|
|
103
|
+
reviewedTree: '04b0fcb78e3de7c58744fcba2528354cc64ab988',
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
const nativeSkillsPrefix = 'npx skills@1.5.22 add';
|
|
108
|
+
const nativeSkillsTarget = '--global --agent universal claude-code --skill';
|
|
109
|
+
const externalArchiveLimits = 'SKILLS_DOWNLOAD_MAX_BYTES=33554432 SKILLS_EXTRACT_MAX_FILES=4096 SKILLS_EXTRACT_MAX_BYTES=67108864';
|
|
110
|
+
const mattMembersArgument = MATT_DEPENDENCY_MEMBERS.join(' ');
|
|
111
|
+
const firstPartyMembers = deepFreeze([
|
|
112
|
+
...HARNESS_RUNTIME_DEPENDENCY_MEMBERS,
|
|
113
|
+
...WORKFLOW_OWNED_MEMBERS,
|
|
114
|
+
]);
|
|
115
|
+
const publicPackageRelease = `${WORKFLOW_TRUSTED_SOURCES.firstParty.package}@${WORKFLOW_TRUSTED_SOURCES.firstParty.version}`;
|
|
116
|
+
|
|
117
|
+
// The public package/group flow, which expands the same dependency-first recipe the steps below
|
|
118
|
+
// document and delegates every write to the pinned native CLI. `--yes` is deliberately absent: repair
|
|
119
|
+
// runs against an installation that is already missing, modified or mixed, which is exactly when the
|
|
120
|
+
// native overwrite summary and its consent prompt are the point. The generated recipes withhold the
|
|
121
|
+
// flag for the same reason, and repair guidance must not be the one place that pre-approves a
|
|
122
|
+
// destructive overwrite.
|
|
123
|
+
export const WORKFLOW_TRUSTED_REPAIR_RECIPE = deepFreeze({
|
|
124
|
+
id: 'engineering-workflow-dependency-first',
|
|
125
|
+
generatedFrom: 'skills/distribution/generated/recipes.json',
|
|
126
|
+
groupId: 'engineering-workflow',
|
|
127
|
+
lifecycle: 'install',
|
|
128
|
+
renderTarget: 'public-npm',
|
|
129
|
+
stopOnFailure: true,
|
|
130
|
+
steps: [
|
|
131
|
+
{
|
|
132
|
+
sourceId: 'matt-pocock',
|
|
133
|
+
sourceType: 'external',
|
|
134
|
+
repository: WORKFLOW_TRUSTED_SOURCES.matt.repository,
|
|
135
|
+
revision: WORKFLOW_TRUSTED_SOURCES.matt.revision,
|
|
136
|
+
installPath: null,
|
|
137
|
+
members: MATT_DEPENDENCY_MEMBERS,
|
|
138
|
+
commands: [{
|
|
139
|
+
transport: 'https',
|
|
140
|
+
command: `${externalArchiveLimits} ${nativeSkillsPrefix} https://codeload.github.com/mattpocock/skills/tar.gz/${WORKFLOW_TRUSTED_SOURCES.matt.revision} ${nativeSkillsTarget} ${mattMembersArgument}`,
|
|
141
|
+
}],
|
|
142
|
+
onFailure: {
|
|
143
|
+
action: 'stop',
|
|
144
|
+
message: 'Source matt-pocock fetch failed; stop this recipe before running another source.',
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
sourceId: 'first-party',
|
|
149
|
+
sourceType: 'first-party',
|
|
150
|
+
package: WORKFLOW_TRUSTED_SOURCES.firstParty.package,
|
|
151
|
+
version: WORKFLOW_TRUSTED_SOURCES.firstParty.version,
|
|
152
|
+
installPath: null,
|
|
153
|
+
members: firstPartyMembers,
|
|
154
|
+
commands: [
|
|
155
|
+
{
|
|
156
|
+
transport: 'npm',
|
|
157
|
+
command: `npx ${publicPackageRelease} install --group engineering-workflow`,
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
onFailure: {
|
|
161
|
+
action: 'stop',
|
|
162
|
+
message: 'Source first-party fetch failed; stop this recipe before running another source.',
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
});
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ensure-coverage
|
|
3
|
+
description: "Define or audit behavior-first test criteria — ACs, required test levels, evidence expectations, mock/integration/E2E policy — across three axes: breadth (Coverage Ledger), depth (over-mocking), presentation (perceivability of browser surfaces). NOT the merge verdict on a PR (review-pr), authoring browser tests (e2e-test), or driving issues to PRs (resolve-issues)."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Ensure Coverage
|
|
7
|
+
|
|
8
|
+
Use this skill to define what must be proven before implementation is ready. Convert a PRD, design doc, feature spec, bug brief, GitHub issue, or equivalent into a behavior-first test criteria document under `/docs/tests/`. Use audit mode to compare existing code/tests against those criteria and produce concrete coverage gaps.
|
|
9
|
+
|
|
10
|
+
This file is the **spine** — the mental model, the workflow, and a map to the detail. The mechanics (tables, templates, protocols, contracts) live in `references/`, grouped by axis; load a reference only when the step needs it (see [Reference Map](#reference-map)). The spine alone is enough for the common path.
|
|
11
|
+
|
|
12
|
+
## Modes
|
|
13
|
+
|
|
14
|
+
- **Create mode** — before or during implementation, when the user needs test criteria, acceptance criteria, or a test matrix.
|
|
15
|
+
- **Audit mode** — when reviewing whether current code/tests sufficiently cover a requirement, PR, issue, feature, or bugfix. Steps: [process/audit-mode.md](references/process/audit-mode.md).
|
|
16
|
+
|
|
17
|
+
## Inputs And Outputs
|
|
18
|
+
|
|
19
|
+
Required input:
|
|
20
|
+
|
|
21
|
+
- A PRD, design document, feature spec, bug brief, GitHub issue, or equivalent source-of-truth requirement.
|
|
22
|
+
- For audit mode: relevant code paths and existing tests, or enough repo access to inspect them.
|
|
23
|
+
- If no source document exists, derive candidate ACs from the best available source: issue brief, repro steps, screenshots, sibling flows, public API/code surface, existing behavior, or explicit design decisions.
|
|
24
|
+
|
|
25
|
+
Required output:
|
|
26
|
+
|
|
27
|
+
- Create mode: `/docs/tests/YYYY-MM-DD-<feature-slug>-criteria.md` (template: [process/output-template.md](references/process/output-template.md)).
|
|
28
|
+
- Audit mode: `/docs/tests/YYYY-MM-DD-<feature-slug>-audit.md`.
|
|
29
|
+
- Mark inferred behavior `Assumption` and unclear product decisions `BLOCKED`; do not invent product semantics.
|
|
30
|
+
|
|
31
|
+
## Stance: Assume It Ships Broken Until Proven Otherwise
|
|
32
|
+
|
|
33
|
+
Audit adversarially. Default to "not ready" and make the code earn the verdict. Run every audit against one question: **if we launch to production right now, how likely is a real user to hit a bug, and how confident are you that no bug report lands in the first week?** A green suite is a claim to be attacked, not an answer.
|
|
34
|
+
|
|
35
|
+
- Treat each passing test as a suspect: state what it actually exercises and what it silently skips. A test you have not read does not count as coverage.
|
|
36
|
+
- Walk the first things a real user does — open the page, fill the form, submit, take the error path — and name the test that proves each. If you cannot, that is a predicted bug report.
|
|
37
|
+
- Name the concrete failure: "username field is dropped, submit returns 400" beats "form coverage is partial."
|
|
38
|
+
- End with a verdict, not a vibe: an explicit ship / no-ship call, the scenarios that would generate bug reports, and the evidence that would raise confidence.
|
|
39
|
+
- When behavior is unproven, say not ready. Do not round up to `Covered` to be agreeable.
|
|
40
|
+
|
|
41
|
+
## Coverage Has Three Axes: Breadth, Depth, And Presentation
|
|
42
|
+
|
|
43
|
+
Coverage is three orthogonal questions audited in different directions. Drive all three; each is blind to the others' failure.
|
|
44
|
+
|
|
45
|
+
- **Breadth (completeness), requirement-inward**: did we identify everything that must be proven? Enumerate obligations from sources of truth and reconcile against what the system exposes. Catches *invisible gaps* — surfaces nobody audited, obligations with no test at all. A closed-world enumeration problem, so an audit emits a **complete surface census** (every surface with a status; gaps = non-`Covered`/`Excluded` rows), never a "top gaps" highlight reel. → `references/breadth/`, completeness rules in [process/audit-mode.md](references/process/audit-mode.md)
|
|
46
|
+
- **Depth (fidelity), test-outward**: does each test actually prove the behavior against real state? Catches *false green* — over-mocking, proxy wiring, shallow assertions, wrong level, stale/unverified evidence. → `references/depth/`
|
|
47
|
+
- **Presentation (perceivability), render-outward**: for a browser surface, can a human *see and act on* the rendered page, not just does the DOM exist? Catches what a green functional journey sails past — an invisible control, overlapping/overflowing layout, layout shift, a route nothing links to. → `references/presentation/`
|
|
48
|
+
|
|
49
|
+
Depth without breadth is honest tests of an incomplete set. Breadth without depth is a complete-looking ledger full of proxy-wiring green. Both can pass while a control sits invisible on the page — that is the Presentation axis's job. **A coverage claim is trustworthy only when all three axes pass.** Absence produces no signal from the test side, so only requirement-inward enumeration finds a surface with no tests; and neither functional axis can tell that a present, clicked-by-tests control is unperceivable to a user.
|
|
50
|
+
|
|
51
|
+
## Coverage Classifications (the shared vocabulary)
|
|
52
|
+
|
|
53
|
+
Every axis grades obligations with the same eight terms. A self-declared `@level` is a claim the validator must try to **refute** — it never alone reaches `Covered`. Full definitions: [depth/grading.md](references/depth/grading.md).
|
|
54
|
+
|
|
55
|
+
- **`Covered`** (green) — inspected test proves the behavior at the required level with acceptable mocks, **and** is reviewer-attested.
|
|
56
|
+
- **`Partial`** — some behavior tested; edge cases, failures, permissions, state, or evidence incomplete.
|
|
57
|
+
- **`Missing`** — no meaningful test maps to the obligation ("required and built but untested" is this, not a breadth gap).
|
|
58
|
+
- **`Wrong Level`** — a test exists but is too shallow for the risk (e.g. unit-only for a stateful workflow).
|
|
59
|
+
- **`Over-mocked`** (red) — mocks bypass the behavior under test: a journey intercepting first-party traffic (`page.route`/`route.fulfill`/MSW), or a mutation journey that never resolves a real durable-state path.
|
|
60
|
+
- **`Unverified`** (blocking yellow) — satisfied statically but assertion/execution quality unconfirmed; **blocks** the gate until a reviewer attests `verified: true`.
|
|
61
|
+
- **`Excluded`** — human marked out of scope with category + reason, adapter signals permitting; surfaced in the exclusion census.
|
|
62
|
+
- **`BLOCKED`** — required source, code, tests, route discovery, environment, or product decision unavailable.
|
|
63
|
+
|
|
64
|
+
## The Surface Baseline (the floor every surface owes)
|
|
65
|
+
|
|
66
|
+
A requirement (ADR/PRD/spec) is **not** a precondition for a test obligation. **Every surface in the inventory carries a minimum required-level floor the instant it is discovered**, graded automatically — safe by default, not safe-if-someone-remembers. The floor keys off an **adapter-emitted taxonomy** (`class`, `reachability`), never per-session inference, so two agents on the same code compute the same floor. Humans may only **raise** the floor (`sensitive`) or **exclude** through a gated path — never weaken the mechanical floor; a `reachable` `mutation` route can never be excluded. A curated `…coverage.yml` ("feature card") is needed only to *deviate*, not to enable coverage.
|
|
67
|
+
|
|
68
|
+
The floor table, the taxonomy keys, the exclusion gate, and the feature card: [breadth/surface-baseline.md](references/breadth/surface-baseline.md). Every live browser route *also* auto-carries the **Presentation floor** (spine: `presentation:render-health`) on top: [presentation/axis.md](references/presentation/axis.md).
|
|
69
|
+
|
|
70
|
+
## Core Principles
|
|
71
|
+
|
|
72
|
+
Separate test design from implementation, and test observable behavior, not internal structure.
|
|
73
|
+
|
|
74
|
+
- Planner defines ACs/matrix/evidence/gates before coding; coding agent implements tests mapped to the approved criteria; reviewer rejects shallow/over-mocked/implementation-shaped tests; human approves risk decisions, mock-only exceptions, and unautomated ACs.
|
|
75
|
+
- Tests prove externally visible outcomes: user/system behavior, durable state, contracts, permissions, side effects, events, failure handling — not private functions, unless that unit *is* the public contract.
|
|
76
|
+
- **Mock boundary:** real internals, faked externals, nothing in between. A substitute for an internal seam (DB, service layer, internal endpoint, event bus) is a gap, not a choice. Full policy: [depth/mock-policy.md](references/depth/mock-policy.md).
|
|
77
|
+
- **Characterize before you change.** Adding a new surface is TDD red→green; *modifying* existing behavior owes the inverse — a **characterization test that pins the current behavior and passes on the pre-change tree** before you edit it, so the diff is proven not to shift observable behavior by accident (tag `// @characterizes <surface>`; waive only with a cited pre-existing test or a declared intended change). Full policy: [depth/characterization.md](references/depth/characterization.md).
|
|
78
|
+
- **Prove it fails first — a test is evidence only if it would go red when the behavior is broken.** One rule, two cases: a **bug-fix** test must be red on the pre-fix tree (tag `// @fails-without-fix <surface>`), and a **feature-AC** test must go red were the AC's behavior removed — exercise the AC's real code path, not a proxy. Grading splits: can't-yet-confirm-it-would-fail is `Unverified` (blocking); confirmed-it-would-still-pass is `Missing`/`Over-mocked` (worse than unchecked). The decidable vacuous forms ride `lint-tests` (`no-swallowed-assertion`, `no-fixed-timeout`); the "would it have been red?" property is verified at review. Full doctrine and waiver rules: [depth/characterization.md](references/depth/characterization.md) → "Fails-first".
|
|
79
|
+
- **Evidence order:** test code first, then execution evidence, then code discovery; prior docs/PR summaries/CI logs are leads, never proof of coverage *quality*. Full hierarchy: [depth/grading.md](references/depth/grading.md).
|
|
80
|
+
- **Obligation ≠ placement.** A surface's coverage *obligation* — what must be proven, at what level, honestly (no skip / over-mock / vacuous assertion) — is fixed by risk and **non-negotiable**. *Where and when* the proof runs (per-PR lane, integration-branch gate, nightly, release lane) is a separate cost/latency decision owned by CI config and the orchestrators (`resolve-issues`, `cloud-build`, `cloud-deploy`), not this skill. Demoting the broad functional+journey suite to the integration lane is legitimate tuning; using "placement" as cover to drop, skip, or weaken it is not. The **per-PR floor** every PR pays never negotiates down: the `presentation:render-health` sweep and a curated E2E `smoke` gate. Each honest-proof property is enforced **as early as it is decidable** (static checks ride the edit-time hook / per-PR `lint-tests`; smoke rides the implementer's local run). Full lane model: [enforcement/ci-contract.md](references/enforcement/ci-contract.md) → "Three lanes".
|
|
81
|
+
|
|
82
|
+
## Workflow
|
|
83
|
+
|
|
84
|
+
1. **Understand the source** — choose the dated output path, identify observable behavior, mark assumptions/blockers/product decisions needing confirmation.
|
|
85
|
+
2. **Model correctness** — write numbered ACs, identify critical journeys, classify each by required test level ([process/test-strategy.md](references/process/test-strategy.md)).
|
|
86
|
+
3. **Plan coverage** — build the test matrix, mock/integration policy, E2E needs, required evidence ([process/output-template.md](references/process/output-template.md)).
|
|
87
|
+
4. **Audit or gate — drive all three axes:**
|
|
88
|
+
- *Breadth* — reconcile requirement sources against the surface inventory into the Coverage Ledger; flag `Orphan surface` / `Unrealized requirement` / `Stale link` before judging any test ([breadth/coverage-ledger.md](references/breadth/coverage-ledger.md)). Run route/surface discovery first ([breadth/surface-discovery.md](references/breadth/surface-discovery.md)).
|
|
89
|
+
- *Depth* — verify actual test code before trusting prior claims; classify each obligation; name concrete gaps ([depth/grading.md](references/depth/grading.md)).
|
|
90
|
+
- *Presentation* — for each browser route, confirm its `presentation:*` floor is proven against a real rendered page (a functional journey does not satisfy it; DOM-only is `Over-mocked`). **If the unit's source cites a design artifact** (prototype branch/path, mockup, layout-fixing design doc), it also owes `presentation:fidelity` — every other level is self-referential and cannot ask whether the page matches the thing it was derived from ([presentation/axis.md](references/presentation/axis.md)).
|
|
91
|
+
- *Enforcement* — audit that CI actually wires the gates ([enforcement/ci-contract.md](references/enforcement/ci-contract.md)).
|
|
92
|
+
5. **Validate** — reject implementation-shaped, over-mocked, skipped, or incomplete coverage; revise until the Behavior-First Validation checklist passes or mark explicit blockers ([process/output-template.md](references/process/output-template.md)).
|
|
93
|
+
|
|
94
|
+
## Reference Map
|
|
95
|
+
|
|
96
|
+
Load the reference for the step you're on — not all of them.
|
|
97
|
+
|
|
98
|
+
| When you need to… | Read |
|
|
99
|
+
|---|---|
|
|
100
|
+
| build/aggregate the Coverage Ledger, `@covers` convention, the validator | [breadth/coverage-ledger.md](references/breadth/coverage-ledger.md) |
|
|
101
|
+
| compute a surface's baseline floor (table, taxonomy keys, exclusion gate, feature card) | [breadth/surface-baseline.md](references/breadth/surface-baseline.md) |
|
|
102
|
+
| enumerate surfaces / classify guard-chain route reachability | [breadth/surface-discovery.md](references/breadth/surface-discovery.md) |
|
|
103
|
+
| supply the repo's surface-inventory adapter | [breadth/inventory-contract.md](references/breadth/inventory-contract.md) |
|
|
104
|
+
| grade test depth (classifications, split-contract trap, evidence hierarchy, terminal states) | [depth/grading.md](references/depth/grading.md) |
|
|
105
|
+
| characterize existing behavior before modifying it (the obligation, `@characterizes`, owed/waived, grading) | [depth/characterization.md](references/depth/characterization.md) |
|
|
106
|
+
| diagnose a test smell + decide gate vs. lead (Erratic/Missing-Assertion/Slow/Fragile/Obscure/Over-mocked) | [depth/test-smells.md](references/depth/test-smells.md) |
|
|
107
|
+
| decide what may be mocked | [depth/mock-policy.md](references/depth/mock-policy.md) |
|
|
108
|
+
| work a presentation invariant (render-health spine, spatial, perceivability, navigational reachability, temporal, mutate-health) **or the opt-in `presentation:visual` pixel baseline** | [presentation/axis.md](references/presentation/axis.md) |
|
|
109
|
+
| build against a cited design source — prototype, mockup, design doc — and prove the deliverable matches it (`presentation:fidelity`, the parity manifest) | [presentation/axis.md](references/presentation/axis.md) → `presentation:fidelity` |
|
|
110
|
+
| the presentation sweep runner interface (what the `e2e-test` sweep must satisfy) | [presentation/runner-contract.md](references/presentation/runner-contract.md) |
|
|
111
|
+
| wire or audit CI gates (incl. the `ci-audit.mjs` meta-gate + lifecycle gates) | [enforcement/ci-contract.md](references/enforcement/ci-contract.md) |
|
|
112
|
+
| wire the in-loop gate hooks (edit-time skip lint, stop-time coverage gate, tiering, escape hatch) | [enforcement/hooks.md](references/enforcement/hooks.md) |
|
|
113
|
+
| write the criteria/audit doc (template, writing rules, behavior-first validation) | [process/output-template.md](references/process/output-template.md) |
|
|
114
|
+
| choose test levels / E2E type / skipping policy | [process/test-strategy.md](references/process/test-strategy.md) |
|
|
115
|
+
| run an audit end to end | [process/audit-mode.md](references/process/audit-mode.md) |
|
|
116
|
+
| the canonical Review Contract schema (used by implement-and-pr + review-pr) | [process/review-contract-template.md](references/process/review-contract-template.md) |
|
|
117
|
+
| decide whether the coverage artifacts apply at all to a config-only/docs-only unit (the `no-surface` scope class, its pattern→oracle table, what it never drops) | [process/scope-class.md](references/process/scope-class.md) |
|
|
118
|
+
| worked examples | [examples/refund-flow.md](references/examples/refund-flow.md) · [examples/coverage-ledger.md](references/examples/coverage-ledger.md) |
|
|
119
|
+
|
|
120
|
+
## Scripts
|
|
121
|
+
|
|
122
|
+
**Resolving these scripts.** Every `scripts/<name>.mjs` below is under **this skill's own directory** — the absolute path you read this `SKILL.md` from — **not your working directory** (a spawned agent's CWD is the target repo, where `scripts/…` does not resolve). Set `SKILL_DIR` to that directory and invoke `node "$SKILL_DIR/scripts/<name>.mjs"`. Never resolve a script against your CWD, and **never locate one with `find` over `$HOME` / `/Users`**; if `SKILL_DIR` is unknown, stop and ask.
|
|
123
|
+
|
|
124
|
+
- `scripts/coverage-ledger.mjs aggregate|validate|report` — the breadth accounting gate (also grades depth + presentation from `@covers`/`@level` annotations).
|
|
125
|
+
- `scripts/ci-audit.mjs --files <ci configs>` — the meta-gate: verifies CI wires the required gates and keeps them blocking. `--adoption` turns an unwired/pre-existing CI into a ready-to-file wiring issue (gap-scoped checklist + matching template + bootstrap step); pipe into `to-issues` so the contract installs itself through the normal loop.
|
|
126
|
+
- `scripts/coverage-checklist.mjs generate|validate` — the method-tagged **Coverage Checklist** for the [Review Contract](references/process/review-contract-template.md), spanning all three axes. `generate` auto-fills the **gate-lint** rows from the tools (lint-tests, ledger, ci-audit, presentation sweep, and runtime smoke via `--smoke <results.json>`) and leaves **lead/judgment** rows as a skeleton; `validate` is the anti-ritual guard — every PASS/FAIL row must carry a checkable locator (`file:line` / `` `command` `` / #issue), no gate row left `TODO`. The method per row is doctrine-fixed in the script's catalog (never chosen per-PR); a judgment row whose evidence becomes mechanizable is promoted to a gate-lint rule.
|
|
127
|
+
- `scripts/evidence-block.mjs collect|validate|render` — generates the **volatile half** of the [Review Contract](references/process/review-contract-template.md) instead of letting an author retype it: scan channels (via `review-pr/scripts/scan-diff.mjs`), the exact-head CI job table, SHAs, and the production-diff-emptiness proof, all stamped with the HEAD they describe. `validate` fails when the stamp is not current HEAD, so staleness is a command's verdict rather than a reviewer's catch. Repo-specific suite results come in via `--ingest` and carry the same stamp; reuse of an earlier probe must be `reused: true` with a note and cannot be `Pass`, and a skipped CI job is reported skipped, never folded into passed. Durable claims — what the PR proves, which rows are `Partial/Unverified` and why — stay hand-written; only the machine-derivable numbers move here. Wired as the `evidence-block` job in `e2e-test/assets/ci-gates.*`, because the producer running it is an instruction to do something last and a later commit re-stales it silently.
|
|
128
|
+
- `scripts/lint-tests.mjs --diff <base>` — static **test-lint gate engine**: deterministic, ~zero-false-positive checks blocking on what a diff **adds** (`--rules a,b` for a subset). Always-on authoring rules `no-skip`, `no-fixed-timeout`, `no-empty-test`, `no-swallowed-assertion`, plus the default-on zero-tolerance depth rule `mock-internal-seam` (a `vi.mock`/`jest.mock` of a first-party seam — no waiver, no grandfathering; fix by correcting topology in `coverage.config.json`, never disable). Decidable shell only; the judgment remainder stays a review lead (`review-pr` → `scripts/scan-diff.mjs`). Full catalog + `RULES` registry: [enforcement/ci-contract.md](references/enforcement/ci-contract.md) → "Static lint gates" · [depth/mock-policy.md](references/depth/mock-policy.md). Wired as the `lint-tests` job in `e2e-test/assets/ci-gates.*`.
|
|
129
|
+
- `scripts/design-parity.mjs scaffold|probe|validate` — the **fidelity gate** for a unit built from a cited design source. `scaffold` emits a parity-manifest skeleton from a doctrine-fixed catalog (page measure, container plane, per-viewport type scale, box, coupled rhythm, plus a relational primary>secondary row) so the properties a hand-written list forgets are already in the file; `probe` emits the JS that measures the built page; `validate --observed <results.json>` blocks on a TODO row, a rejection with no real reason, a `from:` citation that does not resolve in the source blob, a catalog row missing for a declared role, or any measured divergence. **Not a differ** — comparing across stacks (HTML/Figma source vs React deliverable) is judgment, so only the check against the extracted manifest is mechanized. **Not `presentation:visual`** — every `expected` is read off the *source*, where a pixel baseline is captured from the implementation and so ratifies whatever shipped. Reduced form (no `--observed`) announces itself on stderr. Doctrine + the named incident: [presentation/axis.md](references/presentation/axis.md) → `presentation:fidelity`.
|
|
130
|
+
- `scripts/check-quarantine-expiry.mjs` — the **auto-resurface gate**: a `@quarantine(until=…)` exit sits non-blocking until its date, then **expires and re-blocks** so the quarantine lane can't decay into a silent permanent skip. Run in the blocking lane ([enforcement/ci-contract.md](references/enforcement/ci-contract.md)).
|
|
131
|
+
- `scripts/scope-class.mjs classify|table` — infers a unit's **scope class** from its net `merge-base...HEAD` diff, **deny-by-default**: `no-surface` only when *every* path matches a configured non-runtime pattern, one unmatched path ⇒ `surface-bearing` and full gates. Orthogonal to `highRisk` — it decides which coverage/evidence *artifacts* apply, never how deep the review goes (`SCOPE_KEPT_OBLIGATIONS` names what no class ever drops: scan-diff's findings channel, CI on the exact head, the independent review, delivery recording). One repo-config table (`coverage.config.json` → `scopeClass`) drives both the classification and the **oracle requirement**: a matched class with no declared oracle is a blocking finding, not a waiver. Also derives the smoke `not-applicable` reason and the Review Contract's inapplicable rows. Doctrine + the built-in default table: [process/scope-class.md](references/process/scope-class.md).
|
|
132
|
+
- `scripts/mock-policy-config.mjs` — resolves the project's first-party/external **topology** (`coverage.config.json` → `mockPolicy`) that `mock-internal-seam` reads, so "real internals, faked externals" is decidable from declared config, not a baked-in path regex ([depth/mock-policy.md](references/depth/mock-policy.md)).
|
|
133
|
+
|
|
134
|
+
## Downstream
|
|
135
|
+
|
|
136
|
+
ensure-coverage defines *what must be proven*; `implement-and-pr` proves it; `review-pr` runs the audit/breadth gate last; CI enforces the [gate contract](references/enforcement/ci-contract.md), and the repo's `hooks/` run the fast/decidable subset *in the agent's loop* per the [hook contract](references/enforcement/hooks.md). `e2e-test` owns the presentation sweep runner satisfying [presentation/runner-contract.md](references/presentation/runner-contract.md). `resolve-issues` sequences these steps (implement → e2e → review → CI → fix) and runs this skill's gates between them. This skill is the source of truth for doctrine; downstream skills consume it rather than restating it.
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "ensure-coverage",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"name": "unmapped-mutation-route-baseline",
|
|
7
|
+
"prompt": "Someone on my team shipped a /settings/integrations page last sprint with a 'Connect account' form on it. There's no ADR and no PRD for it \u2014 it just got added. There is one Playwright test for the page and it passes. Our coverage audit reports we're green because every ADR in docs/adr is covered. Are we actually covered here? And more generally, how should features like this \u2014 added without any spec written ahead of time \u2014 be handled by our coverage system so they don't slip through?",
|
|
8
|
+
"expected_output": "Explains that no ADR/PRD does NOT mean no test obligation: every surface gets a baseline floor from its (kind, class). Identifies /settings/integrations as a reachable mutation/write-form route needing a browser-journey (fill form -> backend accepts -> durable state). Treats the single passing Playwright test as a suspect to inspect (likely over-mocked via page.route/route.fulfill). Describes a default baseline contract by surface type rather than waiting on a spec, and that orphan/ownership is a warn while the test obligation is the hard gate.",
|
|
9
|
+
"files": [],
|
|
10
|
+
"assertions": [
|
|
11
|
+
{
|
|
12
|
+
"text": "States that the absence of an ADR/PRD does not remove the test obligation (surfaces carry a baseline regardless of ownership)"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"text": "Identifies the page as a reachable mutation/write-form surface requiring a browser-level journey (fill the real form, backend accepts, durable state changes)"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"text": "Treats the single passing Playwright test as a suspect and asks to inspect it for first-party interception (page.route/route.fulfill) -> Over-mocked, not Covered"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"text": "Proposes a default baseline keyed on surface type (read/detail/mutation), applied automatically rather than waiting on someone to author a spec"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"text": "Notes that 'every ADR covered' is not the same as 'every surface covered' (requirement-inward breadth misses un-ADR'd surfaces)"
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": 2,
|
|
30
|
+
"name": "exclusion-governance-and-smoke",
|
|
31
|
+
"prompt": "Our route coverage tool is complaining about a pile of pages and endpoints with no journey tests: a /pricing marketing page, a /signup form, and an /api/_seed endpoint that's only used by CI to seed test data. The team's plan is to just exclude all of them from the coverage tool so the build goes green. Is that acceptable? What's the right policy for each one?",
|
|
32
|
+
"expected_output": "Distinguishes legitimately excludable surfaces (static /pricing, internal /api/_seed) from ones that must keep coverage (/signup is a reachable write form -> cannot be excluded). Static content page keeps a render-health (browser-level reachability) floor — the level formerly named smoke — not zero test. render-health must be a real browser load, not an HTTP-200/API ping. Exclusions require a category + reason and are surfaced in a visible census, never silent. A reachable mutation surface can never be excluded to dodge a journey.",
|
|
33
|
+
"files": [],
|
|
34
|
+
"assertions": [
|
|
35
|
+
{
|
|
36
|
+
"text": "Refuses a blanket exclusion; evaluates each surface separately by reachability and class"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"text": "Says /signup (a reachable write form) cannot be excluded and still needs a mutation-form journey"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"text": "Allows excluding /pricing but keeps a render-health floor (does not let a content page ship with zero test)"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"text": "Specifies render-health is browser-level (page loads and renders), not an API/HTTP-200 check"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"text": "Requires each exclusion to carry a category + reason and be visible (census), not silently dropped"
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": 3,
|
|
54
|
+
"name": "settings-models-coverage-audit",
|
|
55
|
+
"prompt": "We have a /settings/models page and its APIs governed by a couple of ADRs, and some Playwright tests that pass. I have a nagging feeling the coverage isn't real. How would you audit whether this is actually covered?",
|
|
56
|
+
"expected_output": "Regression check carried from iteration-1: refuses green CI as proof, inspects actual test code, flags route.fulfill/page.route interception as Over-mocked, runs requirement-inward breadth, names load-bearing behaviors, recommends real-DB integration + journey tests.",
|
|
57
|
+
"files": [],
|
|
58
|
+
"assertions": [
|
|
59
|
+
{
|
|
60
|
+
"text": "Refuses to treat green CI as proof; inspects actual test code (Evidence Hierarchy)"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"text": "Flags route.fulfill/page.route interception as the likely cause (Over-mocked)"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"text": "Runs requirement-inward breadth (surface inventory, Orphan/Unrealized/Stale)"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"text": "Names load-bearing behaviors (per-org persistence, permission/tenant, no-secret)"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"text": "Recommends replacing mocked specs with real-DB integration + journey tests"
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": 4,
|
|
78
|
+
"name": "presentation-invisible-button-and-overflow",
|
|
79
|
+
"prompt": "We have a React dashboard at /dashboard. Last release a 'Save' button shipped that is technically present and clickable \u2014 our Playwright journey does getByRole('button',{name:'Save'}).click() and the test is green \u2014 but the button is nearly the same light-grey as the page background, so users literally can't see it. We also got a report that on mobile a data table runs off the right edge of the screen. Our coverage dashboard is all green. How is that possible, and what should our test criteria require so this whole class of bug can't pass green again?",
|
|
80
|
+
"expected_output": "Explains that a DOM-driven journey passes whether or not the control is visually perceivable, so functional coverage is structurally blind to invisible/overflowing UI. Introduces presentation obligations proven against the REAL rendered page: perceivability (WCAG contrast, e.g. axe-core) and spatial (no horizontal overflow at mobile+desktop viewports). Notes a DOM-only/JSDOM assertion does not count (Over-mocked); disabled controls are state-aware-exempt; ambiguous contrast (text over image/gradient) abstains to a blocking Unverified. Crucially, the answer should invoke the SKILL-SPECIFIC semantics (real-render-or-Over-mocked, exact-match levels, abstain->Unverified for gradient contrast, state-exempt disabled controls, gated allowlist for intentional overflow) \u2014 not just the general idea of 'add contrast and overflow checks', which a capable model proposes unaided.",
|
|
81
|
+
"files": [],
|
|
82
|
+
"assertions": [
|
|
83
|
+
{
|
|
84
|
+
"text": "Diagnoses both bugs as a distinct Presentation-axis concern that the functional DOM journey is structurally blind to (the green journey is necessary but not sufficient)"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"text": "Requires the perceivability/spatial checks be proven against a REAL rendered page and states a DOM-only/JSDOM assertion is graded Over-mocked, not Covered"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"text": "States a functional browser-journey does NOT satisfy the presentation obligation \u2014 presentation:spatial / presentation:perceivability is a separate, exact-match required level"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"text": "Handles ambiguity/intent correctly: contrast on text over an image/gradient abstains to a blocking Unverified (not a silent pass), and disabled controls are state-exempt from the contrast check"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"text": "Treats intentional horizontal scroll (e.g. a carousel) as suppressible only via a gated allowlist (category + reason, surfaced in a census), never silently ignored"
|
|
97
|
+
}
|
|
98
|
+
]
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"id": 5,
|
|
102
|
+
"name": "presentation-navorphan-and-payfields-shift",
|
|
103
|
+
"prompt": "Two things are bugging me. (1) We built a /reports/export page; it loads fine and is behind auth guards, but QA says no menu or link anywhere points to it, so real users can't find it. Our route coverage tool lists it as 'reachable' and green. (2) On checkout, the Stripe embedded card fields load a moment late and shove the rest of the layout downward when they appear. What's wrong with calling /reports/export 'covered', and what should our coverage actually require for both of these?",
|
|
104
|
+
"expected_output": "Distinguishes guard-chain reachability (URL loads past auth) from navigational reachability (a user can click their way to it) \u2014 guard-reachable is not the same as navigationally reachable; /reports/export is a navigational orphan. Requires a nav-orphan check (route-manifest minus the crawl-reachable set). For Stripe: a temporal/layout-shift obligation; notes the cross-origin iframe specifics (top-page CLS is blind to it; use before/after geometry gated on a provider-ready signal against the provider sandbox) and that this runs in a non-blocking lane that is tracked (Unverified), not silently ignored.",
|
|
105
|
+
"files": [],
|
|
106
|
+
"assertions": [
|
|
107
|
+
{
|
|
108
|
+
"text": "Distinguishes guard-chain reachability (loads past auth) from navigational reachability (a user can click to it); the route is a navigational orphan despite being guard-reachable"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"text": "Requires a nav-orphan check: route-manifest set minus the set reachable by crawling the rendered navigation"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"text": "Identifies the Stripe issue as a layout-shift/temporal obligation"
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"text": "Notes the cross-origin iframe nuance (top-page CLS cannot see inside it; use before/after geometry gated on a provider-ready signal, against the provider sandbox)"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"text": "Notes the third-party/payfields check is tracked (non-blocking lane + Unverified), not silently passed or silently dropped"
|
|
121
|
+
}
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
]
|
|
125
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
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` **blocks the gate by default** (`unverifiedBlocks: true`) until a curated `verified: true` attestation promotes it; set `unverifiedBlocks: false` to phase it down to a warning during rollout.
|
|
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 have its own `…criteria.md` and `…coverage.yml` before it can merge; the requirement's own PR adds both.
|
|
59
|
+
- A requirement with no runtime behavior (pure architecture/terminology) satisfies the gate with a criteria doc stating "no runtime behavior" and why, plus an empty coverage file.
|
|
60
|
+
- When a requirement's status becomes accepted, CI checks for its matching criteria doc and coverage file.
|
|
61
|
+
|
|
62
|
+
## Reconciliation checks (CI)
|
|
63
|
+
|
|
64
|
+
The breadth axis is enforced by checks that fail (error) or warn:
|
|
65
|
+
|
|
66
|
+
- an accepted requirement with runtime behavior has no criteria doc or coverage file (error);
|
|
67
|
+
- the generated inventory is stale (surfaces changed but inventory not regenerated);
|
|
68
|
+
- an entry surface's **baseline floor is unmet** — `Missing`/`Over-mocked`/`Wrong Level` (error), or `Unverified` (error by default, see `unverifiedBlocks`);
|
|
69
|
+
- a surface owned by no curated file (`Orphan surface`, **warn** — baseline still enforced);
|
|
70
|
+
- an internal surface reached by no evidence (`Dead surface`, warn);
|
|
71
|
+
- an exclusion rejected by the reachability/class gate, or missing `category`/`reason` (error); honored exclusions print a census line (warn);
|
|
72
|
+
- a `Stale link` / `Unrealized requirement`;
|
|
73
|
+
- required level is integration/API/journey but only unit/mock evidence resolves;
|
|
74
|
+
- internal interception counted as behavior coverage (`Over-mocked`).
|
|
75
|
+
|
|
76
|
+
Wire this as a CI job on every PR (the illustrative job is in [../enforcement/ci-contract.md](../enforcement/ci-contract.md) → Reference wiring) regardless of who authored the change, and pair it with a PR template requiring the **Obligation Impact** block (touched surfaces, levels, proving tests, gate result). Skill prose makes the *agent* produce good inputs but cannot guarantee it — the CI job is the guarantee.
|
|
77
|
+
|
|
78
|
+
## Reference validator
|
|
79
|
+
|
|
80
|
+
A framework-agnostic tool ships at `scripts/coverage-ledger.mjs` (Node, `js-yaml` only; curated files may be `.json` for zero-dep):
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
node ~/.agents/skills/ensure-coverage/scripts/adapters/nextjs-inventory.mjs <appDir> --check # repo-specific discovery; fail if inventory stale
|
|
84
|
+
node ~/.agents/skills/ensure-coverage/scripts/coverage-ledger.mjs aggregate # build coverage-index from inventory + curated files + @covers tests
|
|
85
|
+
node ~/.agents/skills/ensure-coverage/scripts/coverage-ledger.mjs validate [--config f] [--strict] [--warn-only] # checks above; exit 1 on errors
|
|
86
|
+
node ~/.agents/skills/ensure-coverage/scripts/coverage-ledger.mjs report # markdown index + ADR matrix view
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**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 the zero-tolerance gate ([../depth/mock-policy.md](../depth/mock-policy.md)); the *rate* lets CI / `review-pr` **trend honesty as the suite grows** (a count rises just from more tests, a rate does not).
|
|
90
|
+
|
|
91
|
+
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`.
|