@ivorycanvas/qamap 0.4.1 → 0.4.3

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.
@@ -0,0 +1,56 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1280" height="640" viewBox="0 0 1280 640" role="img" aria-labelledby="title description">
2
+ <title id="title">QAMap</title>
3
+ <desc id="description">A local PR QA workflow from commits and diffs to behavior and QA evidence.</desc>
4
+ <rect width="1280" height="640" fill="#07111f"/>
5
+ <rect x="40" y="40" width="1200" height="560" rx="24" fill="none" stroke="#27466e" stroke-width="2"/>
6
+
7
+ <g font-family="Arial, Helvetica, sans-serif">
8
+ <text x="112" y="150" fill="#eef5ff" font-size="74" font-weight="700">QAMap</text>
9
+ <text x="116" y="208" fill="#32c4f5" font-size="30">Find what a change needs to prove.</text>
10
+ <text x="116" y="258" fill="#a9bddb" font-size="23">Local PR QA design from commits and diffs.</text>
11
+
12
+ <g transform="translate(116 306)">
13
+ <rect width="142" height="36" rx="18" fill="#103e38"/>
14
+ <text x="71" y="24" fill="#56e0b0" font-family="Menlo, Monaco, monospace" font-size="16" text-anchor="middle">LOCAL</text>
15
+ <rect x="160" width="162" height="36" rx="18" fill="#173b5a"/>
16
+ <text x="241" y="24" fill="#50caff" font-family="Menlo, Monaco, monospace" font-size="16" text-anchor="middle">ZERO LLM</text>
17
+ <rect x="340" width="192" height="36" rx="18" fill="#4e3610"/>
18
+ <text x="436" y="24" fill="#ffbf38" font-family="Menlo, Monaco, monospace" font-size="16" text-anchor="middle">OPEN SOURCE</text>
19
+ </g>
20
+
21
+ <g transform="translate(114 422)">
22
+ <rect x="0" y="0" width="238" height="92" rx="12" fill="#0d1a2d" stroke="#315277" stroke-width="2"/>
23
+ <text x="28" y="37" fill="#eef5ff" font-family="Menlo, Monaco, monospace" font-size="19">commit + diff</text>
24
+ <text x="28" y="65" fill="#8fa8c8" font-size="16">intent evidence</text>
25
+
26
+ <path d="M260 46H332" fill="none" stroke="#4a87b7" stroke-width="3"/>
27
+ <path d="M322 35L336 46L322 57" fill="none" stroke="#4a87b7" stroke-width="3"/>
28
+
29
+ <rect x="354" y="0" width="238" height="92" rx="12" fill="#0d1a2d" stroke="#315277" stroke-width="2"/>
30
+ <text x="382" y="37" fill="#eef5ff" font-family="Menlo, Monaco, monospace" font-size="19">behavior flow</text>
31
+ <text x="382" y="65" fill="#8fa8c8" font-size="16">what changed</text>
32
+
33
+ <path d="M614 46H686" fill="none" stroke="#4a87b7" stroke-width="3"/>
34
+ <path d="M676 35L690 46L676 57" fill="none" stroke="#4a87b7" stroke-width="3"/>
35
+
36
+ <rect x="708" y="0" width="238" height="92" rx="12" fill="#0d1a2d" stroke="#315277" stroke-width="2"/>
37
+ <text x="736" y="37" fill="#eef5ff" font-family="Menlo, Monaco, monospace" font-size="19">QA evidence</text>
38
+ <text x="736" y="65" fill="#8fa8c8" font-size="16">what to verify</text>
39
+ </g>
40
+
41
+ <g transform="translate(946 139)">
42
+ <path d="M0 40V84C0 115 18 134 48 144" fill="none" stroke="#19bef2" stroke-width="7" stroke-linecap="round"/>
43
+ <path d="M94 40V84C94 115 76 134 48 144" fill="none" stroke="#19bef2" stroke-width="7" stroke-linecap="round"/>
44
+ <path d="M47 40V144" fill="none" stroke="#19bef2" stroke-width="7" stroke-linecap="round"/>
45
+ <path d="M48 144V179" fill="none" stroke="#19bef2" stroke-width="7" stroke-linecap="round"/>
46
+ <circle cx="0" cy="29" r="17" fill="#07111f" stroke="#19bef2" stroke-width="7"/>
47
+ <circle cx="47" cy="29" r="17" fill="#07111f" stroke="#19bef2" stroke-width="7"/>
48
+ <circle cx="94" cy="29" r="17" fill="#07111f" stroke="#19bef2" stroke-width="7"/>
49
+ <circle cx="48" cy="144" r="17" fill="#07111f" stroke="#19bef2" stroke-width="7"/>
50
+ <circle cx="48" cy="211" r="35" fill="#07111f" stroke="#ffb414" stroke-width="8"/>
51
+ <path d="M29 211L43 225L68 197" fill="none" stroke="#ffb414" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"/>
52
+ </g>
53
+
54
+ <text x="806" y="538" fill="#c8d8ed" font-family="Menlo, Monaco, monospace" font-size="20">github.com/IvoryCanvas/qamap</text>
55
+ </g>
56
+ </svg>
@@ -50,6 +50,11 @@ Each target can declare:
50
50
  | `mustFindIntentEvidence` | Commit or diff terms that must remain attached to intent provenance. |
51
51
  | `mustTraceScenarioFiles` | Changed files that must appear in at least one scenario's exact direct/supporting base- or head-side diff source. |
52
52
  | `maxUntracedCriticalScenarios` | Maximum critical scenarios without a direct/supporting diff source carrying a file and line number. Contextual commit evidence cannot satisfy this contract; lifecycle fixtures keep it at zero. |
53
+ | `minScenarioReceipts` | Minimum routed scenario receipts emitted by the E2E adapter. |
54
+ | `maxMissingScenarioReceipts` | Maximum selected QA scenarios with no corresponding automation receipt. Public lifecycle fixtures keep this at zero. |
55
+ | `minRoutedRequiredScenarios` | Minimum critical scenarios promoted to required by located direct or supporting diff evidence. |
56
+ | `maxRequiredScenarioGaps` | Maximum required scenarios that remain partial or not compiled. Use only for fixtures whose adapter coverage is expected to be complete. |
57
+ | `minMappedScenarioAssertions` | Minimum selected assertions mapped to observable runner assertions across scenario receipts. |
53
58
  | `mustReachFiles` | Files that the selected flows must reach. |
54
59
  | `mustNameFlows` | Product terms that must appear in a user-facing flow title. |
55
60
  | `mustNotNameFlows` | Misleading flow-title terms that must not be emitted. |
@@ -64,6 +69,15 @@ Each target can declare:
64
69
  | `maxBlankActions` | Maximum malformed or empty draft steps; public fixtures keep this at zero. |
65
70
  | `maxGenericTitles` | Maximum titles ending in generic `primary journey` or `smoke flow` wording. |
66
71
  | `maxAgentBytes` | Maximum UTF-8 payload size for `qa --format agent`. Production output also has a global 8KB ceiling and discloses omitted intent/flow counts. |
72
+ | `minReadinessScore` | Minimum aggregate draft-readiness score after self-check, TODO, required-action, and execution-blocker penalties. |
73
+ | `allowedReadinessLevels` | Accepted aggregate levels: `ready`, `near-runnable`, `needs-work`, or `blocked`. Use this to prevent a semantically plausible but unusable draft from satisfying the contract. |
74
+ | `minTryableDrafts` | Minimum files classified as `runnable-candidate` or `near-runnable`. |
75
+ | `minRunnableCandidates` | Minimum files classified as `runnable-candidate` with no known execution blockers. |
76
+ | `minSelfCheckPass` | Minimum generated files whose static draft self-check passes. This does not claim that the target application was executed. |
77
+ | `maxSelfCheckFail` | Maximum generated files whose static draft self-check fails. Warnings may remain for honest setup or domain-assertion gaps. |
78
+ | `maxReviewOnlyFiles` | Maximum generated files that remain reference-only instead of tryable automation. |
79
+ | `maxTodos` | Maximum unresolved TODO markers across generated drafts. |
80
+ | `maxExecutionBlockers` | Maximum unresolved execution blockers across generated drafts. Contract failures name the most common blocker. |
67
81
 
68
82
  Set `manifestBaseline: true` on a committed fixture to generate its manifest from the base snapshot into the benchmark temp directory, then pass that external manifest to analysis of the head commit. The fixture repository is never modified by this step. This protects the feedback loop itself: a baseline must affect the next PR, not merely serialize valid YAML.
69
83
 
@@ -79,7 +93,7 @@ node scripts/bench.mjs --baseline bench-results/<file>.json
79
93
 
80
94
  When both files exist, `pnpm bench` prefers the gitignored local config. CI always passes `--config bench.config.json --assert`, so private paths cannot affect the public quality gate.
81
95
 
82
- Saved results include intent titles, lifecycle and scenario terms, scenario trace coverage, flow titles, draft paths, recall gaps, readiness, agent payload size, and timing. Use a saved baseline to see heuristic movement, but treat the committed expectation contract as the merge gate.
96
+ Saved results include intent titles, lifecycle and scenario terms, scenario trace coverage, scenario receipt coverage, flow titles, draft paths, recall gaps, raw readiness counts, self-check outcomes, TODOs, execution blockers, agent payload size, and timing. The table reports draft status as `runnable/near-runnable/review-only` and scenario compilation as `compiled/partial/not-compiled`. Use a saved baseline to see heuristic movement, but treat the committed expectation contract as the merge gate.
83
97
 
84
98
  Every benchmark target also enforces the Behavior Graph base contract: graph schema version 1, at least one graph flow for every planned flow, at least one impacted node for a non-empty diff, and no edge whose endpoint is missing. The table reports `graph n/i` as total nodes versus impacted nodes. These checks keep the graph connected to real PR analysis while framework-specific adapters are introduced incrementally.
85
99
 
@@ -92,4 +106,6 @@ When a real repository produces a poor recommendation:
92
106
  3. Confirm `pnpm bench:ci` fails for the intended reason.
93
107
  4. Fix the inference and keep the fixture as permanent regression evidence.
94
108
 
109
+ Any new production heuristic must be exercised by at least two unrelated positive domains and one negative or false-positive control. Domain vocabulary belongs in synthetic fixtures, not in shared inference rules.
110
+
95
111
  Do not copy repository names, proprietary code, domain language, file paths, credentials, production data, or raw smoke output into a public fixture. Reduce the behavior to neutral synthetic vocabulary and keep private diagnostics outside the repository.
package/docs/commands.md CHANGED
@@ -223,6 +223,10 @@ The draft result is meant to be useful as a PR artifact, not only as generated f
223
223
  - `actionSummary`: total required/recommended action counts, ready file count, and the most common action categories
224
224
  - `readinessSummary`: an overall 0-100 score, readiness level, self-check counts, starter-code gaps, execution blocker counts, and top blockers
225
225
 
226
+ `runnable-candidate` means QAMap found no known blocker to trying the generated file with the detected local command. It is not a claim that the scenario is complete or that the PR is safe to merge. Missing failure coverage, unconfirmed fixture values, and other proof gaps remain visible as required or recommended action items and in the validation matrix. `near-runnable` means the file still has a concrete setup or execution gap; `review-only` means it should be used as design guidance rather than executed as automation.
227
+
228
+ Playwright self-checks also reject false confidence from `body`-only smoke assertions. When static evidence includes a mockable endpoint, a stable action selector, and visible failure copy, QAMap emits a deterministic 4xx/5xx route, repeats the action, and asserts the failure outcome. When any of those facts are missing, the draft keeps a domain-assertion warning rather than inventing behavior.
229
+
226
230
  See [docs/e2e-output-examples.md](e2e-output-examples.md) for compact examples of web, mobile, API/service, CLI, test-light, and monorepo output.
227
231
 
228
232
  Generated Playwright drafts use the flow language as `test.step()` names so the file reads like the user journey it protects:
@@ -10,44 +10,55 @@ First contact should work without a manifest:
10
10
  pnpm dlx @ivorycanvas/qamap qa . --base origin/main --head HEAD
11
11
  ```
12
12
 
13
- The output should be specific enough to paste into a PR comment:
13
+ The output should be specific enough to paste into a PR comment. This excerpt uses the committed web preferences lifecycle benchmark; it deliberately keeps the current compiler gaps visible:
14
14
 
15
15
  ```txt
16
16
  # QAMap QA Draft
17
17
 
18
18
  At a Glance
19
- - Change intent: Submit checkout and persist the confirmed order [high]
20
- - Behavior lifecycle: trigger: Submit checkout -> side-effect: Create order -> observable-outcome: Show order confirmation
21
- - Affected behavior: Submit checkout and persist the confirmed order
19
+ - Change intent: Submit notification preferences and show the saved state [high]
20
+ - Behavior lifecycle: trigger: submit preferences -> state-change: update saved state -> side-effect: invoke fetch -> observable-outcome: show saved state
21
+ - Affected behavior: Submit notification preferences and show the saved state
22
22
 
23
23
  Change Intent Evidence
24
- - Commit: feat: submit checkout and persist the confirmed order
25
- - Critical scenario: Submit checkout and persist the confirmed order
26
- - Assert: order confirmation is visible and persisted
24
+ - Commit: feat: submit notification preferences, persist the selected timezone, and show the saved state after the request completes
25
+ - Critical scenario: Submit notification preferences and show the saved state
26
+ - Routing: required; 3 supporting diff hunks
27
+ - E2E mapping: partial; steps 0/3, assertions 1/1
28
+ - Assert: the saved state becomes observable
27
29
  - Recommended scenario: Failure, timeout, and retry handling
30
+ - Routing: recommended; 1 supporting diff hunk
31
+ - E2E mapping: not compiled; no deterministic failure compiler matched all required evidence
28
32
 
29
33
  Summary
30
34
  - Project: Web
31
35
  - Automation adapter: Playwright
32
36
  - Manifest: not found; using repo signals and PR diff only
33
- - Stage: almost runnable (3 of 4)
37
+ - Stage: setup needed (1 of 4); readiness 37/100
38
+ - Scenario routing: 2 required, 2 recommended, 0 review-only
39
+ - E2E mapping: 0 compiled, 1 partial, 3 not compiled
34
40
 
35
41
  PR Comment Draft
36
- - Affected flow: Submit checkout and persist the confirmed order
37
- - User journey: Customer -> Open route /checkout -> Complete checkout with realistic form data
38
- - Success signal: confirmation state is visible after submit
39
- - Changed files: src/pages/checkout/index.tsx
42
+ - Affected flow: Submit notification preferences and show the saved state
43
+ - User journey: User -> Open route /preferences -> Submit preferences
44
+ - Success signal: visible text "Preferences saved" appears
45
+ - Changed files: src/pages/preferences.tsx
40
46
 
41
47
  Suggested E2E / QA Draft
42
- - tests/e2e/submit-checkout-and-persist-the-confirmed-order.spec.ts: near runnable
43
- - Open route /checkout.
44
- - Fill checkout email.
45
- - Submit checkout.
46
- - Assert confirmation state is visible after submit.
48
+ - tests/e2e/submit-notification-preferences-persist-the-selected-timezone-and-show-the-saved.spec.ts: near runnable
49
+ - Open route /preferences.
50
+ - Submit notification preferences.
51
+ - Assert visible text "Preferences saved" appears.
52
+
53
+ Scenario automation receipts
54
+ - [required] Submit notification preferences and show the saved state: partial (steps 0/3, assertions 1/1)
55
+ - Blocker: three selected action steps remain outside executable coverage
56
+ - [recommended] Failure, timeout, and retry handling: not compiled (steps 0/2, assertions 0/2)
57
+ - Blocker: no deterministic failure compiler matched an entrypoint, action, fixture boundary, and observable outcome
47
58
 
48
59
  Missing evidence before trusting this PR
49
- - [required] fixture: Add deterministic fixture or mock data.
50
- - [recommended] selector: Confirm stable selectors.
60
+ - [required] fixture: Add deterministic fixture or mock data for /api/preferences.
61
+ - [required] assertion: Compile required QA scenarios into executable coverage.
51
62
 
52
63
  PR checklist
53
64
  - [ ] Review the generated draft path.
@@ -55,6 +66,8 @@ PR checklist
55
66
  - [ ] Run local validation: pnpm run test:e2e
56
67
  ```
57
68
 
69
+ The counts above describe static compilation, not execution. `compiled` means the selected steps and assertions were mapped to concrete runner code. Only an explicit validation command can turn that draft into pass or fail evidence.
70
+
58
71
  If this recommendation is useful but slightly wrong, the next step is not another long AI prompt. Generate and correct repo-local QA memory:
59
72
 
60
73
  ```sh
@@ -1,5 +1,39 @@
1
1
  # Release Validation
2
2
 
3
+ ## 0.4.3 - 2026-07-14
4
+
5
+ Validated as an evidence-routed QA-to-automation patch. Intent-backed scenarios are selected from exact diff evidence before an adapter is chosen, and every selected scenario carries a receipt that states whether its setup, action, and assertion were compiled, partially mapped, left uncompiled, or retained for review only:
6
+
7
+ | Gate | Current result |
8
+ | --- | --- |
9
+ | `pnpm release:check` | Passed end to end |
10
+ | `pnpm test` | 148/148 passing |
11
+ | `pnpm scan` | 0 findings |
12
+ | `pnpm bench:ci` | 12/12 synthetic PR targets pass; both lifecycle fixtures preserve 4/4 exact diff traces and 4/4 scenario automation receipts |
13
+ | Coverage | Lines 87.64%, branches 84.19%, functions 95.32% |
14
+ | Required QA honesty | Required scenarios that are only partially mapped or not compiled lower readiness and remain explicit blockers instead of being hidden behind a syntactically valid draft |
15
+ | Failure-path safety | A positive fixture compiles repository-backed failure setup, action, and outcome evidence; a negative control proves an unrelated stable selector is not reused |
16
+ | Package preview | `pnpm pack --dry-run` and `npm publish --dry-run --access public` pass for `@ivorycanvas/qamap@0.4.3`; 134 files, 914.2 kB packed |
17
+
18
+ This patch does not add product-specific payment, order, or upload rules. The shared engine ranks scenarios from runner-independent evidence relations and only compiles a failure path when the repository exposes a compatible endpoint boundary, related action selector, and observable outcome. Review-only and incomplete mappings remain visible to humans and agents rather than being presented as runnable E2E coverage.
19
+
20
+ ## 0.4.2 - 2026-07-13
21
+
22
+ Validated as an automation-readiness honesty patch. Benchmark contracts now fail when QAMap finds a plausible flow but emits a draft that cannot be tried, and generated Playwright failure paths require a repository-observed endpoint, stable action, and visible failure outcome before QAMap writes executable steps:
23
+
24
+ | Gate | Current result |
25
+ | --- | --- |
26
+ | `pnpm release:check` | Passed end to end |
27
+ | `pnpm test` | 146/146 passing |
28
+ | `pnpm scan` | 0 findings |
29
+ | `pnpm bench:ci` | 12/12 synthetic PR targets pass; readiness, runnable-candidate, self-check, TODO, review-only, and execution-blocker contracts are enforced |
30
+ | Coverage | Lines 87.53%, branches 84.18%, functions 95.22% |
31
+ | Existing Playwright golden | Improved from `needs-work 67` with one blocker to `near-runnable 97`, one runnable candidate, and zero execution blockers |
32
+ | Honest weak-draft handling | Testless checkout and shared-component fixtures remain `needs-work 48` because missing execution facts and body-only assertions are not promoted to runnable evidence |
33
+ | Package preview | `pnpm pack --dry-run` and `npm publish --dry-run --access public` pass for `@ivorycanvas/qamap@0.4.2`; 129 files, 828.8 kB packed |
34
+
35
+ This patch does not claim that all generated E2E files are green in their target applications. It makes that gap measurable: repository validation guidance no longer masquerades as a generated-file execution blocker, body-only smoke assertions remain warnings, and only evidence-backed failure flows compile into Playwright actions and assertions.
36
+
3
37
  ## 0.4.1 - 2026-07-13
4
38
 
5
39
  Validated as an evidence-first QA patch. A proposed scenario now exposes the commit or exact base/head diff file, line, symbol, hunk, and direct/supporting/contextual relation that caused it. Removed guards remain visible as base-side critical evidence, contextual-only scenarios cannot become critical, and runner adoption remains an explicit step after review:
package/docs/releasing.md CHANGED
@@ -10,8 +10,9 @@ QAMap keeps major and minor changes deliberately rare during `0.x` development.
10
10
  - Minor is reserved for a new product-level capability, an incompatible CLI or manifest contract, or a meaningful change to default execution and safety behavior.
11
11
  - Risky minor work should ship through `alpha`, `beta`, and `rc` prereleases before the final minor.
12
12
  - Do not pre-allocate a minor version to every roadmap phase. Define the next minor release bar and continue compatible work as patches until that bar is met.
13
+ - Do not schedule `0.5.x` by date or implementation count. Continue `0.4.x` patches until external repository evidence shows that static QA design and automation drafts are dependable enough to support a new execution contract.
13
14
 
14
- Version `0.4.0` is earned by the first commit-to-intent-to-scenario vertical slice: behavior-bearing commits and diff symbols become an evidence-backed lifecycle and concrete runner-independent QA, then existing Playwright, Maestro, or manual adapters compile the result. The next minor is reserved for explicit temporary execution and normalized evidence without modifying the target repository.
15
+ Version `0.4.0` is earned by the first commit-to-intent-to-scenario vertical slice: behavior-bearing commits and diff symbols become an evidence-backed lifecycle and concrete runner-independent QA, then existing Playwright, Maestro, or manual adapters compile the result. The next minor remains unscheduled and is reserved for explicit temporary execution and normalized evidence without modifying the target repository. That capability must be proven across unrelated repositories before a `0.5.0` candidate is cut.
15
16
 
16
17
  Version `1.0.0` requires a stable public contract and external adoption, not implementation volume alone. CLI commands, exit codes, machine output, manifest migration, adapter compatibility, no-LLM/no-upload guarantees, and release operations must be dependable. Repository stars are useful social proof, but repeated use in unrelated repositories and reported QA value are stronger release evidence.
17
18
 
package/docs/roadmap.md CHANGED
@@ -24,30 +24,37 @@ Before treating the next public release as ready, the golden demo must satisfy t
24
24
  - Generic `primary journey` and `smoke flow` names fail the benchmark when commit and diff evidence can support a concrete lifecycle.
25
25
  - Manifest authoring burden stays low: `manifest context` and `manifest init` provide a useful baseline before a human edits YAML.
26
26
  - Generated E2E draft is a usable starting point: it has route/screen entry, meaningful actions, assertions, and clear TODOs only where repo data is missing.
27
+ - The public benchmark distinguishes a tryable file from complete PR evidence: golden automation fixtures contract on self-checks, TODOs, execution blockers, and runnable status instead of passing on flow naming alone.
27
28
  - Recommendation evidence is explainable: output shows the changed file, manifest flow/check, and manifest path to repair when wrong.
28
29
  - README demo shows the full loop: manifest-free PR QA draft, optional repo context baseline, PR mapping, E2E draft, and remaining validation gaps.
29
30
  - One manifest correction should improve future PR recommendations without another LLM prompt.
30
31
 
31
32
  ## Now: 0.4.x
32
33
 
34
+ There is no fixed end date or patch count for `0.4.x`. QAMap will remain on compatible patch releases while real repositories still expose material gaps in change intent, affected-flow selection, scenario evidence, or automation-draft quality. `0.5.x` is not the next scheduled milestone; it is a release bar that must be earned by a stable, explicitly approved execution contract and evidence from repeated use outside the maintainer's repositories.
35
+
33
36
  - Stabilize commit-range Change Intent analysis: related behavior commits, diff symbols, confidence, review requirements, lifecycle stages, and runner-independent QA scenarios.
34
37
  - Keep `qamap.change-intent` as a direct Behavior Graph adapter while moving more source observations out of the compatibility adapter.
35
38
  - Preserve `qa` as the static, read-only product surface while designing explicit execution behind `verify`; never turn a scan into implicit project-code execution.
36
39
  - Treat the committed [benchmark contract](benchmarking.md) as the quality gate for recommendations, not only implementation correctness. Reduce real failures into public fixtures and require `pnpm bench:ci` on every PR.
40
+ - Keep execution readiness separate from validation completeness. A draft may be locally runnable while still requiring failure coverage, fixture confirmation, or reviewer approval before it becomes trusted PR evidence.
37
41
  - Make `qa` the primary product surface. Its first screen and `--format agent` payload must agree on change intent, lifecycle, QA scenarios, affected behavior, repository evidence, draft path, and missing trust requirements.
38
42
  - Improve changed-file impact mapping from shared symbols and components to consuming routes, screens, API contracts, and manifest flows.
39
43
  - Keep the [release validation checklist](release-validation.md), [manifest guide](manifest.md), public [E2E output examples](e2e-output-examples.md), and README examples aligned with captured output from the public fixtures.
40
44
  - Stabilize the manifest feedback loop with `.qamap/manifest.yaml`, `manifest init`, `manifest validate`, `manifest explain`, JSON Schema, and manifest-driven E2E draft shaping.
41
45
  - Keep `manifest context` useful as a pre-init sanity check for repo-local QA memory, harness docs, agent instructions, and runbooks.
42
46
  - Improve Playwright and Maestro compilation from intent scenarios while keeping runner choice behind the runner-independent QA contract.
47
+ - Keep scenario selection and automation compilation independently measurable: exact diff evidence routes each scenario as required, recommended, or review-only, then runner receipts report compiled, partial, or not-compiled coverage. Required compilation gaps must lower readiness instead of hiding behind a green smoke assertion.
48
+ - Require every new shared heuristic to pass unrelated web/mobile or UI/service fixtures plus a negative control. Product-specific vocabulary stays in fixtures and optional manifests, never in global rules.
43
49
  - Keep `verify`, `e2e`, and `manifest` as deeper layers behind `qa`; freeze new scanner, doctor, eval, domains, flows, and history features until the core QA contract is consistently useful.
44
50
 
45
- ## Next
51
+ ## Longer-Term Release Bar (No Scheduled 0.5.x Date)
46
52
 
47
53
  - Move route, screen, endpoint, selector, fixture, test, and contract discovery into analyzer adapters, starting with TypeScript web stacks and reusing one web behavior model across Next.js, React Router, Vue/Nuxt, and SvelteKit.
48
54
  - Compare base and head Behavior Graphs, then select impacted graph paths before refining deterministic success, validation, failure, empty, loading, auth, and contract scenarios.
49
55
  - Add policy-controlled temporary execution so selected scenarios can produce normalized pass, fail, blocked, and not-verifiable evidence without modifying the target repository.
50
56
  - Add an execution benchmark that injects known regressions and requires QAMap to select and fail the relevant scenario without changing the fixture repository.
57
+ - Compile critical success and failure scenarios into concrete runner actions before execution, so a green smoke assertion cannot satisfy a lifecycle or coverage contract by itself.
51
58
  - Add symbol-level anchors for exported components, hooks, API clients, handlers, schemas, and queries after the public import-impact fixture stays stable.
52
59
  - Add a manifest correction command that proposes the exact flow/anchor patch and applies it only after human approval, avoiding routine hand-edits to YAML.
53
60
  - Add stronger deterministic draft adapters for Playwright and Maestro while keeping `manual` output for API, CLI, token, and catalog repositories; runner detection itself is not a product success metric.
@@ -55,6 +62,8 @@ Before treating the next public release as ready, the golden demo must satisfy t
55
62
  - Keep the `--format agent` output a stable, versioned contract that skills and MCP wrappers can rely on.
56
63
  - Continue expanding agent surface detection across popular coding-agent tools without making the public workflow depend on a single vendor.
57
64
 
65
+ These items do not imply that the next completed item triggers a minor release. Analyzer improvements, new deterministic scenarios, stronger adapters, and additional benchmark fixtures continue as `0.4.x` patches when they preserve the public CLI, schema, and safety contracts. A `0.5.0` candidate should be considered only when policy-controlled execution is useful across unrelated repositories, the target repository remains unmodified by default, and normalized evidence is stable enough to document as a new public capability.
66
+
58
67
  ## Later
59
68
 
60
69
  - Policy packs for open source, startup teams, and security-sensitive repositories.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ivorycanvas/qamap",
3
- "version": "0.4.1",
3
+ "version": "0.4.3",
4
4
  "description": "Local zero-LLM PR QA designer that maps commit intent and diffs to traceable behavior lifecycles, QA scenarios, and optional automation drafts.",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@10.32.1",
@@ -134,6 +134,7 @@
134
134
  "properties": {
135
135
  "priority": { "type": "string", "enum": ["critical", "recommended"] },
136
136
  "kind": { "type": "string", "enum": ["primary", "failure", "boundary", "state-transition"] },
137
+ "id": { "type": "string" },
137
138
  "title": { "type": "string" },
138
139
  "confidence": { "type": "string", "enum": ["low", "medium", "high"] },
139
140
  "reviewRequired": { "type": "boolean" },
@@ -142,7 +143,29 @@
142
143
  "items": { "$ref": "#/definitions/evidenceSource" },
143
144
  "description": "The strongest diff or commit locations that caused this scenario to be proposed (capped)."
144
145
  },
145
- "assertions": { "type": "array", "items": { "type": "string" } }
146
+ "assertions": { "type": "array", "items": { "type": "string" } },
147
+ "routing": {
148
+ "type": "object",
149
+ "required": ["decision", "reason", "requiredSources", "referenceSources"],
150
+ "properties": {
151
+ "decision": { "type": "string", "enum": ["required", "recommended", "review-only"] },
152
+ "reason": { "type": "string" },
153
+ "requiredSources": { "type": "integer", "minimum": 0 },
154
+ "referenceSources": { "type": "integer", "minimum": 0 }
155
+ }
156
+ },
157
+ "automation": {
158
+ "type": "object",
159
+ "required": ["status", "mappedSteps", "totalSteps", "mappedAssertions", "totalAssertions"],
160
+ "properties": {
161
+ "status": { "type": "string", "enum": ["compiled", "partial", "not-compiled", "review-only"] },
162
+ "mappedSteps": { "type": "integer", "minimum": 0 },
163
+ "totalSteps": { "type": "integer", "minimum": 0 },
164
+ "mappedAssertions": { "type": "integer", "minimum": 0 },
165
+ "totalAssertions": { "type": "integer", "minimum": 0 },
166
+ "blocker": { "type": "string" }
167
+ }
168
+ }
146
169
  }
147
170
  }
148
171
  }
@@ -163,6 +186,20 @@
163
186
  "type": "string",
164
187
  "description": "Deprecated v1 field retained for compatibility. New output uses the opt-in automation object instead of promoting runner setup as the default QA action."
165
188
  },
189
+ "scenarioCoverage": {
190
+ "type": "object",
191
+ "description": "Counts that connect routed QA scenarios to generated automation without claiming execution.",
192
+ "required": ["required", "recommended", "reviewOnly", "compiled", "partial", "notCompiled", "requiredGaps"],
193
+ "properties": {
194
+ "required": { "type": "integer", "minimum": 0 },
195
+ "recommended": { "type": "integer", "minimum": 0 },
196
+ "reviewOnly": { "type": "integer", "minimum": 0 },
197
+ "compiled": { "type": "integer", "minimum": 0 },
198
+ "partial": { "type": "integer", "minimum": 0 },
199
+ "notCompiled": { "type": "integer", "minimum": 0 },
200
+ "requiredGaps": { "type": "integer", "minimum": 0 }
201
+ }
202
+ },
166
203
  "automation": {
167
204
  "type": "object",
168
205
  "description": "Optional adapter handoff after a reviewer accepts the QA scenario. It is not required to use the QA judgment.",
@@ -219,6 +256,19 @@
219
256
  "items": { "type": "string" },
220
257
  "description": "Changed test files to execute instead of generating another draft. Present for test-evidence-only changes."
221
258
  },
259
+ "scenarioAutomation": {
260
+ "type": "array",
261
+ "description": "Compact receipts connecting selected scenario ids to generated automation status.",
262
+ "items": {
263
+ "type": "object",
264
+ "required": ["id", "decision", "status"],
265
+ "properties": {
266
+ "id": { "type": "string" },
267
+ "decision": { "type": "string", "enum": ["required", "recommended", "review-only"] },
268
+ "status": { "type": "string", "enum": ["compiled", "partial", "not-compiled", "review-only"] }
269
+ }
270
+ }
271
+ },
222
272
  "evidence": {
223
273
  "type": "array",
224
274
  "items": { "type": "string" },