@1aboveio/skills 1.0.10 → 1.0.12
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/.codex-plugin/plugin.json +1 -1
- package/.codex-plugin/resources.json +298 -216
- package/README.md +3 -3
- package/package.json +10 -8
- package/skills/app-dev/airflow/SKILL.md +1 -1
- package/skills/app-dev/android-foundation/SKILL.md +35 -37
- package/skills/app-dev/android-foundation/references/delivery-focus.md +4 -2
- package/skills/app-dev/android-foundation/references/feature-work.md +50 -0
- package/skills/app-dev/android-foundation/references/setup.md +24 -9
- package/skills/app-dev/android-foundation/references/workspace.md +81 -0
- package/skills/app-dev/android-foundation/scripts/workspace-runtime/bin/workspaces.mjs +52 -0
- package/skills/app-dev/android-foundation/scripts/workspace-runtime/native-workspace.mjs +239 -0
- package/skills/app-dev/android-foundation/scripts/workspace-runtime/workspace-lifecycle.mjs +2154 -0
- package/skills/app-dev/app-debug/SKILL.md +1 -1
- package/skills/app-dev/better-auth/SKILL.md +1 -1
- package/skills/app-dev/data-catalog/SKILL.md +1 -1
- package/skills/app-dev/data-quality/SKILL.md +1 -1
- package/skills/app-dev/ios-foundation/SKILL.md +15 -10
- package/skills/app-dev/ios-foundation/references/setup.md +25 -9
- package/skills/app-dev/ios-foundation/references/workspace.md +82 -0
- package/skills/app-dev/ios-foundation/scripts/workspace-runtime/bin/workspaces.mjs +52 -0
- package/skills/app-dev/ios-foundation/scripts/workspace-runtime/native-workspace.mjs +239 -0
- package/skills/app-dev/ios-foundation/scripts/workspace-runtime/workspace-lifecycle.mjs +2154 -0
- package/skills/app-dev/monorepo/SKILL.md +1 -1
- package/skills/app-dev/nextjs-fullstack/SKILL.md +1 -1
- package/skills/app-dev/prisma-setup/SKILL.md +1 -1
- package/skills/app-dev/pyspark/SKILL.md +1 -1
- package/skills/app-dev/python-backend/SKILL.md +1 -1
- package/skills/app-dev/shadcn/SKILL.md +1 -1
- package/skills/app-dev/zod-v4/SKILL.md +1 -1
- package/skills/cicd/cloud-build/SKILL.md +1 -1
- package/skills/cicd/cloud-debug/SKILL.md +1 -1
- package/skills/cicd/cloud-deploy/SKILL.md +1 -1
- package/skills/cicd/docker/SKILL.md +1 -1
- package/skills/cicd/github-actions/SKILL.md +1 -1
- package/skills/cicd/github-flow/SKILL.md +1 -1
- package/skills/cicd/google-cloud/SKILL.md +1 -1
- package/skills/cicd/mergify/SKILL.md +1 -1
- package/skills/cicd/podman/SKILL.md +1 -1
- package/skills/content/article-review/SKILL.md +1 -1
- package/skills/content/article-to-image/SKILL.md +1 -1
- package/skills/content/flowchart-svg/SKILL.md +1 -1
- package/skills/content/image-gen/SKILL.md +1 -1
- package/skills/content/mermaid/SKILL.md +1 -1
- package/skills/content/wechat-article-writer/SKILL.md +1 -1
- package/skills/content/wechat-publisher/SKILL.md +1 -1
- package/skills/content/wechat-search/SKILL.md +1 -1
- package/skills/content/xai-search/SKILL.md +1 -1
- package/skills/core/distill-writing/SKILL.md +3 -3
- package/skills/core/distill-writing/references/extraction.md +1 -1
- package/skills/core/doc-to-md/SKILL.md +1 -1
- package/skills/core/editorial-review/SKILL.md +82 -12
- package/skills/core/editorial-review/references/checklist.md +26 -1
- package/skills/core/house-style/SKILL.md +8 -3
- package/skills/core/house-style/references/analytical-reporting.md +123 -0
- package/skills/core/house-style/references/analytical-writing-patterns.md +79 -0
- package/skills/core/house-style/references/analytical-writing-research.md +129 -0
- package/skills/core/{write-doc → house-style}/references/bilingual.md +7 -5
- package/skills/core/house-style/references/definitions-and-metrics.md +86 -0
- package/skills/core/house-style/references/document-workflow.md +193 -0
- package/skills/core/house-style/references/initialization.md +66 -0
- package/skills/core/house-style/references/persistence.md +9 -4
- package/skills/core/house-style/references/rules.md +11 -4
- package/skills/core/house-style/scripts/init-guidance.mjs +213 -0
- package/skills/core/house-style/templates/analytical-report.md +54 -0
- package/skills/core/house-style/templates/gap-analysis.md +1 -1
- package/skills/core/plain-language/SKILL.md +2 -2
- package/skills/core/polish-cn/SKILL.md +9 -2
- package/skills/core/reg-parser/SKILL.md +3 -3
- package/skills/core/terminology/SKILL.md +8 -4
- package/skills/core/write-doc/SKILL.md +40 -151
- package/skills/core/write-report/SKILL.md +129 -0
- package/skills/core/{write-doc → write-report}/references/compliance-reports.md +4 -4
- package/skills/engineering/better-review/SKILL.md +37 -37
- package/skills/engineering/better-review/references/passes.md +35 -41
- package/skills/engineering/better-review/references/result.md +10 -9
- package/skills/engineering/e2e-test/SKILL.md +17 -17
- package/skills/engineering/e2e-test/references/authoring/playwright-config.md +11 -13
- package/skills/engineering/e2e-test/references/presentation-sweep.md +7 -7
- package/skills/engineering/e2e-test/references/reviewing.md +9 -11
- package/skills/engineering/e2e-test/references/route-manifest.md +1 -1
- package/skills/engineering/engineering/SKILL.md +201 -0
- package/skills/engineering/engineering/references/engineering-conventions.md +32 -0
- package/skills/engineering/engineering/references/feature-delivery.md +8 -0
- package/skills/engineering/engineering/references/init-scope.md +45 -0
- package/skills/engineering/engineering/references/scope-management.md +85 -0
- package/skills/engineering/engineering/scripts/init.mjs +160 -0
- package/skills/engineering/{contributing → engineering}/scripts/persist-conventions.mjs +1 -1
- package/skills/engineering/engineering-runtime/SKILL.md +1 -1
- package/skills/engineering/engineering-runtime/coherence/workflow.json +19 -19
- package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +1 -1
- package/skills/engineering/ensure-coverage/SKILL.md +22 -109
- package/skills/engineering/ensure-coverage/references/breadth/coverage-ledger.md +7 -5
- package/skills/engineering/ensure-coverage/references/breadth/surface-baseline.md +4 -4
- package/skills/engineering/ensure-coverage/references/breadth/surface-discovery.md +3 -3
- package/skills/engineering/ensure-coverage/references/depth/characterization.md +4 -65
- package/skills/engineering/ensure-coverage/references/depth/grading.md +5 -7
- package/skills/engineering/ensure-coverage/references/depth/mock-policy.md +6 -12
- package/skills/engineering/ensure-coverage/references/enforcement/ci-contract.md +1 -1
- package/skills/engineering/ensure-coverage/references/presentation/axis.md +6 -6
- package/skills/engineering/ensure-coverage/references/process/audit-mode.md +7 -23
- package/skills/engineering/ensure-coverage/references/process/output-template.md +18 -133
- package/skills/engineering/ensure-coverage/references/process/test-strategy.md +7 -12
- package/skills/engineering/ensure-coverage/scripts/README.md +12 -4
- package/skills/engineering/golden-path/SKILL.md +1 -1
- package/skills/engineering/harness-runtime/SKILL.md +3 -1
- package/skills/engineering/harness-runtime/bin/workspaces.mjs +52 -0
- package/skills/engineering/harness-runtime/native-workspace.mjs +239 -0
- package/skills/engineering/harness-runtime/references/workspaces.md +78 -0
- package/skills/engineering/harness-runtime/workspace-lifecycle.mjs +2154 -0
- package/skills/engineering/resolve-issues/SKILL.md +40 -61
- package/skills/engineering/resolve-issues/references/ci.md +13 -3
- package/skills/engineering/resolve-issues/references/delivery-progress.md +4 -3
- package/skills/engineering/resolve-issues/references/done.md +11 -2
- package/skills/engineering/resolve-issues/references/expire.md +9 -2
- package/skills/engineering/resolve-issues/references/implementation.md +33 -17
- package/skills/engineering/resolve-issues/references/preflight.md +3 -1
- package/skills/engineering/resolve-issues/references/principles.md +52 -0
- package/skills/engineering/resolve-issues/references/review.md +25 -15
- package/skills/engineering/resolve-issues/references/task-plan.md +64 -27
- package/skills/engineering/resolve-issues/references/workspaces.md +164 -0
- package/skills/engineering/resolve-issues/scripts/cleanup-runs.mjs +185 -317
- package/skills/engineering/resolve-issues/scripts/next-actions.mjs +44 -7
- package/skills/engineering/resolve-issues/scripts/rehydrate.mjs +36 -2
- package/skills/engineering/resolve-issues/scripts/review-verdict.mjs +9 -8
- package/skills/engineering/resolve-issues/scripts/workspace-lifecycle.mjs +1 -0
- package/skills/engineering/resolve-release/SKILL.md +1 -1
- package/skills/engineering/rush-issues/SKILL.md +7 -5
- package/skills/engineering/rush-release/SKILL.md +1 -1
- package/skills/engineering/test-quality/SKILL.md +19 -4
- package/skills/engineering/test-quality/references/lint.md +1 -1
- package/skills/engineering/test-quality/references/principles.md +2 -2
- package/skills/engineering/test-quality/references/testing-conventions.md +1 -1
- package/skills/risk-compliance/compliance-audit/SKILL.md +4 -8
- package/skills/risk-compliance/compliance-audit/references/audience-and-reports.md +12 -0
- package/skills/risk-compliance/contract-compare/SKILL.md +17 -1
- package/skills/risk-compliance/contract-review/SKILL.md +6 -1
- package/skills/risk-compliance/contract-review/references/report-stage.md +17 -0
- package/skills/risk-compliance/doc-authenticity/SKILL.md +11 -1
- package/skills/risk-compliance/fraud-detection/LICENSE +3 -0
- package/skills/risk-compliance/fraud-detection/SKILL.md +148 -0
- package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/archetypes/first-party-fraud.md +3 -2
- package/skills/risk-compliance/fraud-detection/references/archetypes/third-party-fraud.md +47 -0
- package/skills/risk-compliance/fraud-detection/references/collection-payout-features.md +151 -0
- package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/contexts/bank-transfer.md +4 -3
- package/skills/risk-compliance/fraud-detection/references/contexts/card-payment.md +70 -0
- package/skills/risk-compliance/fraud-detection/references/contexts/payment-collection.md +34 -0
- package/skills/risk-compliance/fraud-detection/references/contexts/payout.md +34 -0
- package/skills/risk-compliance/fraud-detection/references/enrichment.md +74 -0
- package/skills/risk-compliance/fraud-detection/references/entities.md +48 -0
- package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/feature-engineering.md +69 -33
- package/skills/risk-compliance/fraud-detection/references/feature-sql.md +150 -0
- package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/report-rationale.md +4 -2
- package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/report-template.md +45 -23
- package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/review-checklist.md +60 -20
- package/skills/risk-compliance/fraud-detection/references/workflow.md +216 -0
- package/skills/risk-compliance/fraud-detection/release-check.mjs +95 -0
- package/skills/risk-compliance/payment-analysis/SKILL.md +36 -17
- package/skills/risk-compliance/payment-analysis/references/auth-rate-actions.md +2 -2
- package/skills/risk-compliance/payment-analysis/references/report-template.md +10 -2
- package/skills/risk-compliance/payment-analysis/references/visualization.md +11 -1
- package/skills/risk-compliance/portfolio-payment-analysis/LICENSE +3 -0
- package/skills/risk-compliance/portfolio-payment-analysis/SKILL.md +170 -0
- package/skills/risk-compliance/portfolio-payment-analysis/references/identity-and-reconciliation.md +46 -0
- package/skills/risk-compliance/portfolio-payment-analysis/references/metrics-and-reporting.md +170 -0
- package/skills/risk-compliance/portfolio-payment-analysis/references/risk-history.md +89 -0
- package/skills/risk-compliance/portfolio-payment-analysis/release-check.mjs +95 -0
- package/skills/risk-compliance/portfolio-payment-analysis/scripts/analyze.py +636 -0
- package/skills/risk-compliance/portfolio-payment-analysis/scripts/build_report.py +386 -0
- package/skills/risk-compliance/portfolio-payment-analysis/scripts/comparison_charts.py +425 -0
- package/skills/risk-compliance/portfolio-payment-analysis/scripts/csv_export.py +52 -0
- package/skills/risk-compliance/portfolio-payment-analysis/scripts/render.py +160 -0
- package/skills/risk-compliance/portfolio-payment-analysis/scripts/risk_history.py +435 -0
- package/skills/risk-compliance/similar-domain/SKILL.md +9 -4
- package/skills/risk-compliance/tld-detection/SKILL.md +124 -239
- package/skills/risk-compliance/tld-detection/agents/openai.yaml +1 -1
- package/skills/risk-compliance/tld-detection/references/clean.md +18 -51
- package/skills/risk-compliance/tld-detection/references/fx-conversion.md +56 -219
- package/skills/risk-compliance/tld-detection/references/metric-contract.md +109 -0
- package/skills/risk-compliance/tld-detection/references/pattern.md +99 -0
- package/skills/risk-compliance/tld-detection/references/report-template.md +49 -272
- package/skills/risk-compliance/tld-detection/scripts/detect_ladders.py +46 -13
- package/skills/risk-compliance/tld-detection/scripts/detect_patterns.py +346 -0
- package/skills/risk-compliance/tld-detection/scripts/detect_streams.py +51 -19
- package/skills/risk-compliance/tld-detection/scripts/profile_groups.py +109 -0
- package/skills/risk-compliance/tld-detection/scripts/render_charts.py +218 -0
- package/skills/risk-compliance/tld-detection/scripts/tld_common.py +243 -0
- package/skills/engineering/contributing/SKILL.md +0 -70
- package/skills/risk-compliance/fraud-analysis/SKILL.md +0 -114
- package/skills/risk-compliance/fraud-analysis/references/archetypes/third-party-fraud.md +0 -27
- package/skills/risk-compliance/fraud-analysis/references/contexts/card-payment.md +0 -30
- package/skills/risk-compliance/fraud-analysis/references/contexts/payment-collection.md +0 -20
- package/skills/risk-compliance/fraud-analysis/references/contexts/payout.md +0 -20
- package/skills/risk-compliance/fraud-analysis/references/workflow.md +0 -175
- package/skills/risk-compliance/tld-detection/references/chinese-polish.md +0 -55
- package/skills/risk-compliance/tld-detection/references/clustering.md +0 -235
- package/skills/risk-compliance/tld-detection/references/decision.md +0 -189
- package/skills/risk-compliance/tld-detection/references/streams.md +0 -141
- package/skills/risk-compliance/tld-detection/references/terminology.md +0 -95
- package/skills/risk-compliance/tld-detection/references/workflow.md +0 -95
- /package/skills/{engineering/contributing → core/write-report}/LICENSE +0 -0
- /package/skills/core/{write-doc → write-report}/references/reports/audit-report-template.md +0 -0
- /package/skills/core/{write-doc → write-report}/references/reports/external-assessment-template.md +0 -0
- /package/skills/core/{write-doc → write-report}/references/reports/management-report-template.md +0 -0
- /package/skills/core/{write-doc → write-report}/references/reports/vars-report-template.md +0 -0
- /package/skills/{engineering/contributing → core/write-report}/release-check.mjs +0 -0
- /package/skills/{risk-compliance/fraud-analysis → engineering/engineering}/LICENSE +0 -0
- /package/skills/engineering/{contributing → engineering}/references/tracker-conventions.md +0 -0
- /package/skills/{risk-compliance/fraud-analysis → engineering/engineering}/release-check.mjs +0 -0
- /package/skills/engineering/{contributing → engineering}/scripts/persist-conventions-core.mjs +0 -0
- /package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/archetypes/authorized-payment-scam.md +0 -0
- /package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/mechanisms/account-takeover.md +0 -0
- /package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/taxonomy.md +0 -0
- /package/skills/risk-compliance/{fraud-analysis → fraud-detection}/references/terminology.md +0 -0
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"golden-path",
|
|
12
12
|
"test-quality",
|
|
13
13
|
"better-review",
|
|
14
|
-
"
|
|
14
|
+
"engineering",
|
|
15
15
|
"engineering-runtime"
|
|
16
16
|
],
|
|
17
17
|
"dependencies": [
|
|
@@ -369,7 +369,7 @@
|
|
|
369
369
|
"repository": "1aboveio/ai",
|
|
370
370
|
"revision": "main"
|
|
371
371
|
},
|
|
372
|
-
"contentDigest": "
|
|
372
|
+
"contentDigest": "e1a3eda72480a554a71b876b0803ffadb6d975f57ce73e9ae84e3a30a75630bc",
|
|
373
373
|
"digestExcludes": []
|
|
374
374
|
},
|
|
375
375
|
{
|
|
@@ -382,7 +382,7 @@
|
|
|
382
382
|
"repository": "1aboveio/ai",
|
|
383
383
|
"revision": "main"
|
|
384
384
|
},
|
|
385
|
-
"contentDigest": "
|
|
385
|
+
"contentDigest": "4976da3d810ab0a712121dfc5acbd62f63f8ae42ec0116431ad7d27d0c52a324",
|
|
386
386
|
"digestExcludes": []
|
|
387
387
|
},
|
|
388
388
|
{
|
|
@@ -395,7 +395,7 @@
|
|
|
395
395
|
"repository": "1aboveio/ai",
|
|
396
396
|
"revision": "main"
|
|
397
397
|
},
|
|
398
|
-
"contentDigest": "
|
|
398
|
+
"contentDigest": "32204a3fe185c2ea79eb27b0dd4055c321ef7b9f152ffc3a374b714ae8d465fa",
|
|
399
399
|
"digestExcludes": []
|
|
400
400
|
},
|
|
401
401
|
{
|
|
@@ -408,7 +408,7 @@
|
|
|
408
408
|
"repository": "1aboveio/ai",
|
|
409
409
|
"revision": "main"
|
|
410
410
|
},
|
|
411
|
-
"contentDigest": "
|
|
411
|
+
"contentDigest": "6dc6606527c8023eb1f79a188ae73bea4fafe8b339ed391a00fae60340107e0c",
|
|
412
412
|
"digestExcludes": []
|
|
413
413
|
},
|
|
414
414
|
{
|
|
@@ -421,7 +421,7 @@
|
|
|
421
421
|
"repository": "1aboveio/ai",
|
|
422
422
|
"revision": "main"
|
|
423
423
|
},
|
|
424
|
-
"contentDigest": "
|
|
424
|
+
"contentDigest": "0ec4a9d50c9918d1219a2454ea2aad7eb3ffdabe917319c55d7928c6d5e3580e",
|
|
425
425
|
"digestExcludes": []
|
|
426
426
|
},
|
|
427
427
|
{
|
|
@@ -434,7 +434,7 @@
|
|
|
434
434
|
"repository": "1aboveio/ai",
|
|
435
435
|
"revision": "main"
|
|
436
436
|
},
|
|
437
|
-
"contentDigest": "
|
|
437
|
+
"contentDigest": "388bd68865a9af12e76b1a522f879684546d5d03427649df5639b16d0b0240b9",
|
|
438
438
|
"digestExcludes": []
|
|
439
439
|
},
|
|
440
440
|
{
|
|
@@ -447,7 +447,7 @@
|
|
|
447
447
|
"repository": "1aboveio/ai",
|
|
448
448
|
"revision": "main"
|
|
449
449
|
},
|
|
450
|
-
"contentDigest": "
|
|
450
|
+
"contentDigest": "d7552f7681020f9cd4ed72dbde105adb5b172e40ba4119bcbb0d4685688faf18",
|
|
451
451
|
"digestExcludes": []
|
|
452
452
|
},
|
|
453
453
|
{
|
|
@@ -460,7 +460,7 @@
|
|
|
460
460
|
"repository": "1aboveio/ai",
|
|
461
461
|
"revision": "main"
|
|
462
462
|
},
|
|
463
|
-
"contentDigest": "
|
|
463
|
+
"contentDigest": "414606c12207509b0d9207b0021dbb29bcb1689ca7d7486496ab2bc6a1dfecfc",
|
|
464
464
|
"digestExcludes": []
|
|
465
465
|
},
|
|
466
466
|
{
|
|
@@ -473,7 +473,7 @@
|
|
|
473
473
|
"repository": "1aboveio/ai",
|
|
474
474
|
"revision": "main"
|
|
475
475
|
},
|
|
476
|
-
"contentDigest": "
|
|
476
|
+
"contentDigest": "274f5ac6be3224dfdafaa4264cfa0ed223e3b98cf3cbd2c083b6c85314a92791",
|
|
477
477
|
"digestExcludes": []
|
|
478
478
|
},
|
|
479
479
|
{
|
|
@@ -486,20 +486,20 @@
|
|
|
486
486
|
"repository": "1aboveio/ai",
|
|
487
487
|
"revision": "main"
|
|
488
488
|
},
|
|
489
|
-
"contentDigest": "
|
|
489
|
+
"contentDigest": "a6efa258db14db8a4cab8600bcbdc2563c61531a51a486508ed42da70824be86",
|
|
490
490
|
"digestExcludes": []
|
|
491
491
|
},
|
|
492
492
|
{
|
|
493
|
-
"installName": "
|
|
493
|
+
"installName": "engineering",
|
|
494
494
|
"ownership": "owned",
|
|
495
|
-
"sourcePath": "skills/engineering/
|
|
495
|
+
"sourcePath": "skills/engineering/engineering",
|
|
496
496
|
"expectedSource": {
|
|
497
497
|
"id": "first-party",
|
|
498
498
|
"type": "first-party",
|
|
499
499
|
"repository": "1aboveio/ai",
|
|
500
500
|
"revision": "main"
|
|
501
501
|
},
|
|
502
|
-
"contentDigest": "
|
|
502
|
+
"contentDigest": "869bf4214b7e80e4968e4488f2f6ad4a944b2393a343ad40157e45f694457814",
|
|
503
503
|
"digestExcludes": []
|
|
504
504
|
},
|
|
505
505
|
{
|
|
@@ -512,13 +512,13 @@
|
|
|
512
512
|
"repository": "1aboveio/ai",
|
|
513
513
|
"revision": "main"
|
|
514
514
|
},
|
|
515
|
-
"contentDigest": "
|
|
515
|
+
"contentDigest": "bc78899c2a745aedee9f547a16b8c2be2ffab8a128695b033991802d033db303",
|
|
516
516
|
"digestExcludes": [
|
|
517
517
|
"coherence/workflow.json"
|
|
518
518
|
]
|
|
519
519
|
}
|
|
520
520
|
],
|
|
521
|
-
"releaseIdentity": "
|
|
521
|
+
"releaseIdentity": "fed4e4c161cf525a08eee89fb30ba578ec21962b2d4cb9c9226fc61146fe4225",
|
|
522
522
|
"lifecycleAuthority": "native-skills-cli",
|
|
523
523
|
"repairRecipe": {
|
|
524
524
|
"id": "engineering-workflow-dependency-first",
|
|
@@ -589,17 +589,17 @@
|
|
|
589
589
|
"golden-path",
|
|
590
590
|
"test-quality",
|
|
591
591
|
"better-review",
|
|
592
|
-
"
|
|
592
|
+
"engineering",
|
|
593
593
|
"engineering-runtime"
|
|
594
594
|
],
|
|
595
595
|
"commands": [
|
|
596
596
|
{
|
|
597
597
|
"transport": "https",
|
|
598
|
-
"command": "npx skills@1.5.22 add 1aboveio/ai --global --agent universal claude-code --skill harness-runtime e2e-test ensure-coverage rush-issues resolve-issues rush-release resolve-release golden-path test-quality better-review
|
|
598
|
+
"command": "npx skills@1.5.22 add 1aboveio/ai --global --agent universal claude-code --skill harness-runtime e2e-test ensure-coverage rush-issues resolve-issues rush-release resolve-release golden-path test-quality better-review engineering engineering-runtime && npm --prefix \"$(realpath \"$HOME/.agents/skills/engineering-runtime/scripts\")\" ci --ignore-scripts"
|
|
599
599
|
},
|
|
600
600
|
{
|
|
601
601
|
"transport": "ssh",
|
|
602
|
-
"command": "npx skills@1.5.22 add git@github.com:1aboveio/ai.git --global --agent universal claude-code --skill harness-runtime e2e-test ensure-coverage rush-issues resolve-issues rush-release resolve-release golden-path test-quality better-review
|
|
602
|
+
"command": "npx skills@1.5.22 add git@github.com:1aboveio/ai.git --global --agent universal claude-code --skill harness-runtime e2e-test ensure-coverage rush-issues resolve-issues rush-release resolve-release golden-path test-quality better-review engineering engineering-runtime && npm --prefix \"$(realpath \"$HOME/.agents/skills/engineering-runtime/scripts\")\" ci --ignore-scripts"
|
|
603
603
|
}
|
|
604
604
|
],
|
|
605
605
|
"onFailure": {
|
|
@@ -2,128 +2,41 @@
|
|
|
2
2
|
name: ensure-coverage
|
|
3
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
4
|
disable-model-invocation: true
|
|
5
|
-
release-version: 0.
|
|
5
|
+
release-version: 0.45.1
|
|
6
6
|
---
|
|
7
7
|
**Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
|
|
8
8
|
# Ensure Coverage
|
|
9
9
|
|
|
10
|
-
Define
|
|
10
|
+
Define what must be proven for the agreed business outcome and material risks. This skill scopes criteria and grades evidence; it does not implement tests, wire gates, or issue a merge verdict.
|
|
11
11
|
|
|
12
|
-
- **Create mode
|
|
13
|
-
- **Audit mode
|
|
12
|
+
- **Create mode:** agree observable criteria and suitable proof before implementation. Record them in the issue or conversation; create a criteria document only when requested or required by the repository.
|
|
13
|
+
- **Audit mode:** assess evidence against the agreed scope. A feature audit stays scoped to the feature; a whole-repo census is appropriate only for an explicitly requested broad audit. Use the [audit guidance](references/process/audit-mode.md) and [optional output template](references/process/output-template.md).
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
Read the relevant source and governing project guidance. When product behavior or authorization is unclear and blocks the task, ask the owner; do not invent semantics or add planning handoffs for ordinary implementation choices. Keep agreed criteria stable during implementation and proof. A newly discovered concrete defect may need a fix; speculative robustness ideas and test preferences are follow-ups, not new acceptance conditions. Escalate a proposed scope change for agreement.
|
|
16
16
|
|
|
17
|
-
##
|
|
17
|
+
## Scope and proof
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
- Choose the smallest sufficient proof for the outcome and material risks; reuse existing tests and required CI results when they prove the behavior. Do not automatically require multiple test layers, a ledger, a criteria document, a presentation campaign, or reconciliation of every ADR.
|
|
20
|
+
- Existing required repository checks and adopted coverage floors remain binding unless an approved change alters them. Authentication, money, tenancy, and data-integrity protections remain binding. Read applicable ADRs and project policy for the touched work, not every ADR in the repository.
|
|
21
|
+
- Consider breadth, depth, and presentation where relevant: what behavior is in scope, whether evidence actually exercises it, and whether a user can perceive and use a changed interface. Do not turn every axis or hypothetical state into a separate blocking obligation.
|
|
22
|
+
- The [surface baseline](references/breadth/surface-baseline.md) is guidance for selecting proof, not a universal new floor. The bundled ledger and presentation tools implement stricter mechanical rules; use them only when requested or already required, and report their actual results without claiming their defaults are new policy.
|
|
23
|
+
- Avoid tests that bypass the behavior they claim to prove, especially for security or durable state. Select boundaries and test levels for the risk, following applicable repo rules ([mock policy](references/depth/mock-policy.md), [strategy](references/process/test-strategy.md)). A relevant existing test can suffice; characterization and fails-first runs are useful when warranted, not automatic requirements ([characterization](references/depth/characterization.md)).
|
|
24
|
+
- Do not weaken or disable tests merely to get green. Report a required check that cannot run or fails; do not claim it passed.
|
|
25
|
+
- Do not recommend or wire new CI gates unless asked. Existing required checks still apply ([CI contract](references/enforcement/ci-contract.md)). Integrated release campaigns run at their assigned gate, not automatically for each feature.
|
|
20
26
|
|
|
21
|
-
|
|
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.
|
|
27
|
+
## Grade honestly
|
|
25
28
|
|
|
26
|
-
|
|
29
|
+
Inspect the relevant test and its assertions before claiming it proves a behavior. A passing execution proves it ran, not that it covered every claim. Use [grading](references/depth/grading.md): `Covered`, `Partial`, `Missing`, `Wrong Level`, `Over-mocked`, `Unverified`, `Excluded`, or `BLOCKED`. Describe what the evidence proves and what remains unverified; never promote a hypothetical state to a blocker merely because it lacks a test. Missing agreed proof, a concrete material defect, or a failed required check can block; distinguish those from follow-ups. Report unavailable evidence or unresolved decisions without a false success.
|
|
27
30
|
|
|
28
|
-
|
|
31
|
+
## Workflow and output
|
|
29
32
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
+
1. Identify the agreed outcome, touched behavior, material risks, required repo checks, and applicable guidance. Resolve only decisions needed to proceed.
|
|
34
|
+
2. Agree observable acceptance criteria and sufficient proof before implementation. Note existing proof and select focused additions only where needed.
|
|
35
|
+
3. For an audit, inspect relevant tests and results, grade the agreed scope, and report concrete gaps, blockers, and non-blocking follow-ups. Do not expand criteria after the fact. An explicitly requested broad audit may use [surface discovery](references/breadth/surface-discovery.md) and the [coverage ledger](references/breadth/coverage-ledger.md); state any limits on its completeness.
|
|
36
|
+
4. Record what was verified, what was not, and why. Use the repository's existing format or a concise response; no new document is required by default.
|
|
33
37
|
|
|
34
|
-
|
|
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.
|
|
38
|
+
The scripts in this skill are optional tools unless the repo already requires them. Set `SKILL_DIR` to this skill's directory and see [scripts/README.md](scripts/README.md) for usage. Their fixed checks and outputs can be broader or stricter than the agreed feature scope; do not silently change or bypass an adopted gate. Escalate conflicts rather than presenting tool defaults as policy.
|
|
126
39
|
|
|
127
40
|
## Downstream
|
|
128
41
|
|
|
129
|
-
|
|
42
|
+
`test-quality` judges individual tests; `e2e-test` authors browser tests; `golden-path` owns curated release-critical journeys; `resolve-issues` delivers and `better-review` provides independent review. Other skills and existing repository policy may still carry stricter requirements: preserve them and surface conflicts to the appropriate owner rather than silently overriding them.
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
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
4
|
|
|
5
|
+
This reference describes an optional ledger and its existing mechanical behavior, not a requirement to create a ledger or reconcile all ADRs for routine features. Use it when requested or already required by the repository. Its errors and floors remain binding when an existing required check enforces them; seek approval rather than bypassing or silently changing that policy. A whole-repo census requires an explicitly requested broad audit.
|
|
6
|
+
|
|
5
7
|
## Doctrine: the ledger is a reconciliation, not an anchor
|
|
6
8
|
|
|
7
9
|
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.
|
|
@@ -22,7 +24,7 @@ Once a row is `Aligned` (or an `Orphan surface` carrying its baseline floor), th
|
|
|
22
24
|
|
|
23
25
|
## Three layers
|
|
24
26
|
|
|
25
|
-
|
|
27
|
+
When using the ledger, separate discovery, curated intent, and the generated aggregation; reconcile them where requested or already required. Status is **computed, never stored**, so per-requirement files for a shared surface cannot diverge — there is no status field to disagree on.
|
|
26
28
|
|
|
27
29
|
- **Generated inventory** (never hand-edited): surface discovery from code — routes, APIs, tables, events. Regenerated on every change.
|
|
28
30
|
- **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.
|
|
@@ -53,9 +55,9 @@ The aggregation maps `@covers` → surface, checks required levels, flags intern
|
|
|
53
55
|
|
|
54
56
|
## Acceptance gate
|
|
55
57
|
|
|
56
|
-
|
|
58
|
+
When the repository has adopted this ledger acceptance gate, follow its configured requirements. Otherwise this is an optional mechanism, not a new acceptance gate.
|
|
57
59
|
|
|
58
|
-
-
|
|
60
|
+
- If the adopted gate requires it, an accepted requirement with runtime behavior owns `docs/tests/<source>/<id>-*.coverage.yml` linked to its `criteria` doc.
|
|
59
61
|
- 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
62
|
- A requirement with no runtime behavior (pure architecture, terminology) says "no runtime behavior" in its own text and needs no coverage file.
|
|
61
63
|
- 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.
|
|
@@ -74,7 +76,7 @@ The breadth axis is enforced by checks that fail (error) or warn:
|
|
|
74
76
|
- required level is integration/API/journey but only unit/mock evidence resolves;
|
|
75
77
|
- internal interception counted as behavior coverage (`Over-mocked`).
|
|
76
78
|
|
|
77
|
-
Run reconciliation
|
|
79
|
+
Run reconciliation when requested or required by the repository, within the authorized scope. Keep generated inputs deterministic and report stale inventory rather than repairing it during an audit. Existing required CI checks remain binding; do not add a gate without authorization ([CI contract](../enforcement/ci-contract.md)).
|
|
78
80
|
|
|
79
81
|
## Reference validator
|
|
80
82
|
|
|
@@ -87,6 +89,6 @@ node ~/.agents/skills/ensure-coverage/scripts/coverage-ledger.mjs validate [--co
|
|
|
87
89
|
node ~/.agents/skills/ensure-coverage/scripts/coverage-ledger.mjs report # markdown index + ADR matrix view
|
|
88
90
|
```
|
|
89
91
|
|
|
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%)`).
|
|
92
|
+
**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%)`). Treat the over-mock count as a lead to inspect in context ([../depth/mock-policy.md](../depth/mock-policy.md)); the *rate* is a trend signal, not an automatic feature blocker. An adopted required gate retains its configured result.
|
|
91
93
|
|
|
92
94
|
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`.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
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
4
|
|
|
5
|
-
|
|
5
|
+
Use the table as guidance when selecting proof for the agreed scope and material risks, not as a universal obligation for newly discovered surfaces. Existing repository-adopted floors and required checks remain binding unless changed through approval. A requirement document is not needed to recognize a concrete risk. The rules below describe the bundled ledger's mechanical defaults when it is used, not new policy for every feature.
|
|
6
6
|
|
|
7
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
8
|
|
|
@@ -27,9 +27,9 @@ Baseline only **entry surfaces** (`route`, `api`). **Internal surfaces** (`table
|
|
|
27
27
|
| permission | — | `integration` | resolves an auth test |
|
|
28
28
|
| integration (external) | — | fake adapter + contract | — |
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
In the ledger, 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
31
|
|
|
32
|
-
|
|
32
|
+
In the ledger, 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
33
|
|
|
34
34
|
## Exclusion is gated, not honored on a reason
|
|
35
35
|
|
|
@@ -41,4 +41,4 @@ An exclusion downgrades a surface to manifest-only — the exact move that re-op
|
|
|
41
41
|
|
|
42
42
|
## The feature card is a deviation record, not a precondition
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
When using the ledger, because its 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.
|
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
>
|
|
5
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
6
|
|
|
7
|
-
Use this
|
|
7
|
+
Use this protocol within the agreed audit scope, even if `e2e-test` is unavailable. Enumerate the whole repository only for an explicitly requested broad audit. For scoped work, inspect relevant routes and their reachability as needed; the following describes comprehensive discovery for Next.js App Router and similar file-based routers:
|
|
8
8
|
|
|
9
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
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
11
|
3. Classify reachability as `Reachable`, `Redirected`, `Guarded`, `Blocked`, or `Unknown`, with the guard/layout/middleware evidence.
|
|
12
|
-
4. For
|
|
12
|
+
4. For relevant `Reachable` pages, identify user-actionable mutations and their backend targets. Distinguish rendering from submission and durable-state evidence; select proof based on agreed criteria and material risks, not an automatic journey obligation per mutation.
|
|
13
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.
|
|
14
|
+
6. Report relevant concrete gaps and unavailable evidence. Treat missing journey coverage according to agreed criteria and existing required floors, not as an automatic feature blocker.
|
|
15
15
|
|
|
16
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.
|
|
@@ -1,68 +1,7 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Characterization and fails-first evidence
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
When changing existing behavior, consider whether a relevant existing test already protects the behavior that should stay unchanged. Reuse it if sufficient. Add a characterization test when the risk of unintended change warrants it; it captures actual behavior at an observable boundary, including quirks. Do not require a new test or pre-change run for every source edit, or introduce a seam solely to satisfy a blanket rule.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
For a bug fix, a test that fails before the fix and passes afterward can show that the fix addresses the defect. Use it when practical and useful or when repository policy requires it; otherwise explain the proof and any limitation. A feature test should make meaningful assertions about the agreed outcome, not just a mock call or a fixture that bypasses the real behavior. Inspect it before claiming coverage; a broken-tree run is not automatically required.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
## The obligation: when it is owed
|
|
10
|
-
|
|
11
|
-
A change owes a characterization test when **all** hold:
|
|
12
|
-
|
|
13
|
-
- It **edits or removes** existing lines of a non-test **source** file (a pure addition into a new file, or appended-only code, is new behavior → TDD path).
|
|
14
|
-
- The touched code has **observable behavior** — return value, durable-state effect, emitted event, HTTP contract, rendered output. (Internal-only renames with no behavioral surface don't.)
|
|
15
|
-
- The surface is **non-trivial** — anything carrying a Surface Baseline floor, or logic a user/caller depends on.
|
|
16
|
-
|
|
17
|
-
When owed, the test must: **(1) capture actual, not intended, behavior** including quirks/bugs (if current behavior is wrong, characterize it *then* fix it in a separate declared step); **(2) pass on the pre-change tree** (GREEN on `HEAD~`/base before your edit — capture as evidence); **(3) still pass after the change**, unless the change is a declared intended behavior change.
|
|
18
|
-
|
|
19
|
-
## When it is waived
|
|
20
|
-
|
|
21
|
-
Mark the waiver explicitly in the PR's evidence, never silently:
|
|
22
|
-
|
|
23
|
-
- **Already pinned** — an existing behavior test covers the exact changed path and still passes unchanged. Cite it (`file:line`); that test *is* the characterization.
|
|
24
|
-
- **Declared intended behavior change** — deliberately alters observable behavior per an AC/bug brief. The obligation inverts: update/author the test to assert the **new** behavior, and the diff must show the old assertion changing to the new (a behavior change with no test delta is the suspicious case). Cite the AC.
|
|
25
|
-
- **Trivial / generated / non-behavioral** — formatting, comments, type-only edits, generated code with no behavior delta.
|
|
26
|
-
|
|
27
|
-
## The `@characterizes` convention
|
|
28
|
-
|
|
29
|
-
Tag a characterization test so the gate can resolve it, parallel to `@covers`:
|
|
30
|
-
|
|
31
|
-
```js
|
|
32
|
-
// @characterizes <surface-id> // pins prior behavior of a surface being modified
|
|
33
|
-
// @covers <surface-id> // (a characterization test usually also @covers it)
|
|
34
|
-
// @level <level>
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
`@characterizes` is the signal that *this* test exists to hold a modification's behavior boundary. A modifying diff with no `@characterizes` test and no declared waiver is the gap this obligation names.
|
|
38
|
-
|
|
39
|
-
## Grading
|
|
40
|
-
|
|
41
|
-
Characterization is a **depth** concern, graded with the [shared vocabulary](grading.md):
|
|
42
|
-
|
|
43
|
-
- A modifying diff whose changed behavior is pinned by a passing characterization test (or cited pre-existing behavior test) → that surface can reach `Covered` on the normal evidence rules.
|
|
44
|
-
- A modifying diff with **no** characterization test and **no** declared intended-change → `Partial` at best; the reviewer raises the `modifies-existing-behavior` lead (below). Not a hard `Missing` (existing tests may incidentally cover it) — a **lead to adjudicate**, because whether a characterization test is *needed and adequate* is judgment.
|
|
45
|
-
|
|
46
|
-
## Detection (mechanical) → adjudication (judgment)
|
|
47
|
-
|
|
48
|
-
The decidable half is mechanical: any non-test source file with **removed/changed** lines emits a `modifies-existing-behavior` **lead** ("look here and verify," never an auto-finding). The reviewer checks for a `@characterizes` test (or a declared change) and adjudicates, citing `file:line`. The reviewer resolves it with a locator, not prose. The split matches the GATE-vs-LEAD line everywhere in this skill: detecting *that behavior changed* is mechanical; deciding *whether the pinning test is adequate* is semantic.
|
|
49
|
-
|
|
50
|
-
## Seams: where to pin
|
|
51
|
-
|
|
52
|
-
A characterization test is writable only where you can observe behavior without rewriting the thing you're about to change — a **seam** (*"a place where you can alter behavior without editing the code in that place"*). Pin at the nearest observable seam: the public function's return/throw, the endpoint's HTTP contract, the rendered page's output, the emitted event. If there's no seam, that itself is the finding — introduce one first (extract the call, expose the boundary), pin, *then* change. Do not skip characterization because "it's hard to test as written"; hard-to-pin is the legacy-code smell the obligation exists to surface.
|
|
53
|
-
|
|
54
|
-
## Fails-first: bug-fix AND feature-AC — prove the test fails when the behavior is broken
|
|
55
|
-
|
|
56
|
-
The shared property: **a test is evidence for a behavior only if it would go red were that behavior broken.** A green test that passes with *and* without the behavior it claims is **vacuous coverage** — it locks in nothing. Two cases:
|
|
57
|
-
|
|
58
|
-
**Bug-fix sibling.** A bug fix changes behavior that's *already wrong*, so it owes the inverse of characterization: at least one test demonstrated to **fail on the unfixed code and pass on the fixed code** (RED→GREEN, run in that order), tagged `// @fails-without-fix <surface>`. Reverting the fix must turn the test red. Waive only with a cited reason the failure can't be reproduced in-suite (a tracked `Unverified` manual check, not a silent skip).
|
|
59
|
-
|
|
60
|
-
**Feature-AC sibling.** The same test applies to a *new feature's* AC, where it's most-missed: a green test cited for an AC clears it only if it would go red were the AC's behavior removed — it exercises the AC's real code path, not a proxy. Recurring vacuous forms:
|
|
61
|
-
- a fixture that **early-returns before the code runs** (a 0-step workflow "proving" a multi-step reset that never executes);
|
|
62
|
-
- a `.fill()`/`setValue` that sets state in one shot and so **masks a re-render/defocus bug** a character-by-character `pressSequentially` would expose;
|
|
63
|
-
- an assertion **pinned to a stand-in value the real producer never emits**;
|
|
64
|
-
- asserting **the mock was called** rather than that the outcome happened.
|
|
65
|
-
|
|
66
|
-
**Grading the two outcomes** (they differ from [grading.md](grading.md)'s `Unverified`): can't-yet-confirm it would go red → `Unverified` (a warning unless `unverifiedBlocks: true`); confirm it would **still pass** with the behavior gone → `Missing`/`Over-mocked` (a proven-vacuous test is *worse* than unchecked).
|
|
67
|
-
|
|
68
|
-
The two **decidable** vacuous forms (a swallowed assertion, a fixed timeout) are gated by `lint-tests`; the semantic "would it have been red?" property is verified at review and by running the test against the broken tree. Named incident: the login regression (#237), where a green sweep asserted nothing the bug could trip.
|
|
7
|
+
If an existing adopted gate requires annotations, a pre-change run, or other evidence, follow it unless an approved change alters the gate. Grade evidence honestly using [grading](grading.md).
|
|
@@ -2,11 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
> Read when: grading whether a test actually proves the behavior against real state. Sibling: [mock-policy.md](mock-policy.md) (the boundary principle this grading enforces). Depth grades each `Aligned` row — and each `Orphan surface` carrying a [Surface Baseline Contract](../breadth/surface-baseline.md) floor — by inspecting its actual tests.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
A depth failure occurs when a substitute bypasses the behavior a test claims to prove. For example, a Playwright interception of an endpoint cannot prove that endpoint's real behavior. Grade that claim `Over-mocked`, not `Covered`; a focused UI test may still prove its own scope. See the [mock policy](mock-policy.md).
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
**For any write form, require one test that fills the rendered UI and asserts the mutation end to end** — operator fills the actual form and submits → backend accepts → durable state changes. Keep the render-health watcher attached **through** the submit (compose with `presentation:render-health`, [../presentation/axis.md](../presentation/axis.md)), so an uncaught error / `console.error` / first-party 5xx fired *during* the write fails the test even when the durable-state assertion would pass — the "mutate-health" gap. Do not accept seam tests in its place: a schema endpoint returning fields, a validator rejecting bad input, and an API forwarding a hand-built payload all pass while the rendered form silently drops a backend-required field. This is acute for the **split-contract form**, whose fields come from one source (schema endpoint, config descriptor, generated form spec) and validation from another (the backend contract); only a rendered-form submission proves the form emits a payload the backend accepts.
|
|
7
|
+
Distinguish what API and browser evidence actually proves. An API test alone does not prove a rendered form works; a UI test that fakes the backend does not prove durable state. Select the proof needed for the agreed outcome and material risk, reusing existing evidence where sufficient. A rendered end-to-end submission can expose split-contract form failures, but is not an automatic new obligation for every form. Existing adopted floors and required checks remain binding.
|
|
10
8
|
|
|
11
9
|
## Evidence Hierarchy
|
|
12
10
|
|
|
@@ -25,11 +23,11 @@ Classify coverage as `Covered` only after inspecting the relevant test file/case
|
|
|
25
23
|
|
|
26
24
|
A self-declared `@level` is a claim the validator must try to **refute**, and can never alone reach `Covered`. The three terminal states are marked below.
|
|
27
25
|
|
|
28
|
-
- `Covered` (green, terminal): inspected test code validates the AC at the
|
|
29
|
-
- `Partial`: some behavior
|
|
26
|
+
- `Covered` (green, terminal): inspected test code validates the agreed AC at the appropriate level with meaningful assertions and acceptable mock/fake use. A self-declared `@level` alone never reaches it. The ledger additionally requires its `verified: true` attestation.
|
|
27
|
+
- `Partial`: some agreed behavior or material-risk proof is incomplete. An untested hypothetical state alone is not an automatic blocker.
|
|
30
28
|
- `Missing`: no meaningful test maps to the AC.
|
|
31
29
|
- `Wrong Level`: test exists but is too shallow for the risk — e.g. unit-only for stateful workflow, API contract, auth, money movement, concurrency, or event behavior.
|
|
32
|
-
- `Over-mocked` (red, terminal):
|
|
30
|
+
- `Over-mocked` (red, terminal): substitutes bypass the behavior the agreed AC must prove. For example, an intercepted endpoint cannot prove its real durable-state path; the test may still prove a narrower UI behavior.
|
|
33
31
|
- `Unverified` (yellow, terminal): the level is satisfied statically (or claimed by docs/reports/CI) but nobody has read the test yet. It is a **warning** by default; it blocks only when the user sets `unverifiedBlocks: true`. Marking `verified: true` after reading the test promotes it to `Covered`; no evidence is required unless the user asks for it. The residual variance is over *quality of an existing test*, not *whether a surface exists*.
|
|
34
32
|
- `Excluded`: a human marked the surface out of scope with category + reason and the adapter signals permit it; surfaced in the exclusion census.
|
|
35
33
|
- `BLOCKED`: required source, code, tests, route discovery, environment, or product decision is unavailable.
|