create-cmp-cli 0.18.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +3 -3
  2. package/llms.txt +1 -1
  3. package/package.json +1 -1
  4. package/packages/harness/src/approve.mjs +30 -2
  5. package/packages/harness/src/lib/approvals.mjs +74 -10
  6. package/packages/harness/src/lib/evidence-level.mjs +3 -1
  7. package/packages/harness/src/lib/flight-recorder.mjs +47 -2
  8. package/packages/harness/src/lib/inputs-hash.mjs +71 -3
  9. package/packages/harness/src/lib/lane-narrator.mjs +97 -0
  10. package/packages/harness/src/lib/lane-runner.mjs +173 -0
  11. package/packages/harness/src/lib/plan.mjs +286 -20
  12. package/packages/harness/src/lib/receipt-validate.mjs +56 -1
  13. package/packages/harness/src/lib/spec-coverage.mjs +111 -3
  14. package/packages/harness/src/lib/step-cache.mjs +1 -1
  15. package/packages/harness/src/lib/step-outcomes.mjs +123 -0
  16. package/packages/harness/src/lib/steps-cmp.mjs +1284 -0
  17. package/packages/harness/src/lib/walk.mjs +67 -17
  18. package/packages/harness/src/receipt-check.mjs +80 -4
  19. package/packages/harness/src/verify.mjs +119 -1197
  20. package/packages/receipts/src/index.mjs +1 -0
  21. package/packages/receipts/src/inputs-hash.mjs +71 -3
  22. package/packages/receipts/src/receipt-validate.mjs +56 -1
  23. package/template/CLAUDE.md +52 -6
  24. package/template/composeApp/src/desktopTest/kotlin/com/example/app/conformance/ArchitectureConformanceTest.kt +1 -1
  25. package/template/gitignore +3 -0
  26. package/template/qa/approve.mjs +30 -2
  27. package/template/qa/lib/approvals.mjs +74 -10
  28. package/template/qa/lib/evidence-level.mjs +3 -1
  29. package/template/qa/lib/flight-recorder.mjs +47 -2
  30. package/template/qa/lib/inputs-hash.mjs +71 -3
  31. package/template/qa/lib/lane-narrator.mjs +97 -0
  32. package/template/qa/lib/lane-runner.mjs +173 -0
  33. package/template/qa/lib/plan.mjs +286 -20
  34. package/template/qa/lib/receipt-validate.mjs +56 -1
  35. package/template/qa/lib/spec-coverage.mjs +111 -3
  36. package/template/qa/lib/step-cache.mjs +1 -1
  37. package/template/qa/lib/step-outcomes.mjs +123 -0
  38. package/template/qa/lib/steps-cmp.mjs +1284 -0
  39. package/template/qa/lib/walk.mjs +67 -17
  40. package/template/qa/receipt-check.mjs +80 -4
  41. package/template/qa/verify.mjs +119 -1197
  42. package/template/specs/README.md +26 -0
@@ -19,6 +19,8 @@ id, and every durable test cites the clause it verifies.
19
19
  3. `node qa/verify.mjs` — the lane's `specCoverage` step fails orphan clauses (a live clause
20
20
  with no citing test) and orphan tags (a `// SPEC:`/`# SPEC:` tag with no matching clause, or
21
21
  one citing a withdrawn clause). Withdrawn clauses are exempt from coverage.
22
+ 4. It also fails a clause whose declared `[tier: …]` no citing test can satisfy — see
23
+ **Tier requirements** below.
22
24
 
23
25
  ## Format
24
26
 
@@ -27,6 +29,30 @@ ids** (`<FEATURE>-<NN>`) — ids are never renumbered or reused; a withdrawn cla
27
29
  through and kept. `app-base.spec.md` covers the base architecture and the app shell the
28
30
  scaffold itself ships.
29
31
 
32
+ ## Tier requirements — a citation must be able to SEE the clause
33
+
34
+ A citation proves a test *exists*. It cannot prove that test could ever *observe* the promise,
35
+ and those are different things. A clause promising an animation "plays once per process start"
36
+ was cited by a desktop Compose test — which has no process lifecycle at all, so the claim was
37
+ unobservable there by construction. Coverage was green; nothing had checked anything.
38
+
39
+ So a clause about device behavior declares the tier it needs, right on the clause line:
40
+
41
+ ```markdown
42
+ - **MOTION-13** [tier: device] — Given a warm resume, When the app returns to foreground,
43
+ Then the intro animation does not play again.
44
+ ```
45
+
46
+ - `[tier: device]` — satisfied by `androidInstrumentedTest` or `qa/e2e`.
47
+ - `[tier: e2e]` — satisfied by `qa/e2e` only.
48
+ - No tag — unchanged: any citing test satisfies coverage.
49
+
50
+ Declare it whenever the claim rests on an OS fact a host JVM cannot see: app/process lifecycle,
51
+ alarms, notifications, permissions, audio routing, real navigation. `specCoverage` FAILS when a
52
+ declared tier has no citing test, so a device tier that SKIPPED for want of a device leaves the
53
+ clause visibly unproven instead of silently passing. That is deliberate: "I could not check
54
+ this" is a failure, not a quieter rung on the evidence ladder.
55
+
30
56
  > **Why no Cucumber?** We adopt the Given/When/Then *grammar* but reject the Cucumber
31
57
  > *runtime*: step-definition glue is a third artifact that drifts from both the spec and the
32
58
  > tests. Spec and test are bound by **clause id** instead (`// SPEC:` tag + `[CLAUSE-ID]` in