@ivorycanvas/qamap 0.4.0 → 0.4.2
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/CHANGELOG.md +40 -0
- package/README.md +25 -16
- package/dist/agent-init.js +2 -2
- package/dist/agent-init.js.map +1 -1
- package/dist/behavior-intent.js +11 -0
- package/dist/behavior-intent.js.map +1 -1
- package/dist/behavior.d.ts +8 -0
- package/dist/behavior.js +1 -1
- package/dist/behavior.js.map +1 -1
- package/dist/change-intent.d.ts +11 -1
- package/dist/change-intent.js +196 -56
- package/dist/change-intent.js.map +1 -1
- package/dist/cli.js +7 -3
- package/dist/cli.js.map +1 -1
- package/dist/e2e.js +76 -17
- package/dist/e2e.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/qa.js +227 -94
- package/dist/qa.js.map +1 -1
- package/dist/test-plan.d.ts +18 -0
- package/dist/test-plan.js +123 -13
- package/dist/test-plan.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/agent-format.md +12 -8
- package/docs/agent-skill.md +4 -4
- package/docs/architecture.md +1 -1
- package/docs/benchmarking.md +13 -2
- package/docs/commands.md +4 -0
- package/docs/e2e-output-examples.md +9 -22
- package/docs/quickstart-demo.md +24 -19
- package/docs/release-validation.md +34 -0
- package/docs/releasing.md +15 -4
- package/docs/roadmap.md +8 -1
- package/package.json +2 -2
- package/schema/qamap-agent.schema.json +80 -2
- package/schema/qamap-behavior.schema.json +32 -0
- package/skills/qamap-pr-qa/SKILL.md +9 -8
package/docs/benchmarking.md
CHANGED
|
@@ -48,6 +48,8 @@ Each target can declare:
|
|
|
48
48
|
| `mustIncludeLifecycle` | Trigger, condition, action, state, effect, or outcome terms that must survive in the ordered lifecycle. |
|
|
49
49
|
| `mustIncludeQaScenarios` | Failure, boundary, state-transition, or primary QA terms that must be proposed before runner compilation. |
|
|
50
50
|
| `mustFindIntentEvidence` | Commit or diff terms that must remain attached to intent provenance. |
|
|
51
|
+
| `mustTraceScenarioFiles` | Changed files that must appear in at least one scenario's exact direct/supporting base- or head-side diff source. |
|
|
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. |
|
|
51
53
|
| `mustReachFiles` | Files that the selected flows must reach. |
|
|
52
54
|
| `mustNameFlows` | Product terms that must appear in a user-facing flow title. |
|
|
53
55
|
| `mustNotNameFlows` | Misleading flow-title terms that must not be emitted. |
|
|
@@ -61,7 +63,16 @@ Each target can declare:
|
|
|
61
63
|
| `mustRecommendCommands` | Commands the setup or validation path must expose. |
|
|
62
64
|
| `maxBlankActions` | Maximum malformed or empty draft steps; public fixtures keep this at zero. |
|
|
63
65
|
| `maxGenericTitles` | Maximum titles ending in generic `primary journey` or `smoke flow` wording. |
|
|
64
|
-
| `maxAgentBytes` | Maximum UTF-8 payload size for `qa --format agent`. |
|
|
66
|
+
| `maxAgentBytes` | Maximum UTF-8 payload size for `qa --format agent`. Production output also has a global 8KB ceiling and discloses omitted intent/flow counts. |
|
|
67
|
+
| `minReadinessScore` | Minimum aggregate draft-readiness score after self-check, TODO, required-action, and execution-blocker penalties. |
|
|
68
|
+
| `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. |
|
|
69
|
+
| `minTryableDrafts` | Minimum files classified as `runnable-candidate` or `near-runnable`. |
|
|
70
|
+
| `minRunnableCandidates` | Minimum files classified as `runnable-candidate` with no known execution blockers. |
|
|
71
|
+
| `minSelfCheckPass` | Minimum generated files whose static draft self-check passes. This does not claim that the target application was executed. |
|
|
72
|
+
| `maxSelfCheckFail` | Maximum generated files whose static draft self-check fails. Warnings may remain for honest setup or domain-assertion gaps. |
|
|
73
|
+
| `maxReviewOnlyFiles` | Maximum generated files that remain reference-only instead of tryable automation. |
|
|
74
|
+
| `maxTodos` | Maximum unresolved TODO markers across generated drafts. |
|
|
75
|
+
| `maxExecutionBlockers` | Maximum unresolved execution blockers across generated drafts. Contract failures name the most common blocker. |
|
|
65
76
|
|
|
66
77
|
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.
|
|
67
78
|
|
|
@@ -77,7 +88,7 @@ node scripts/bench.mjs --baseline bench-results/<file>.json
|
|
|
77
88
|
|
|
78
89
|
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.
|
|
79
90
|
|
|
80
|
-
Saved results include intent titles, lifecycle and scenario terms, 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.
|
|
91
|
+
Saved results include intent titles, lifecycle and scenario terms, scenario trace 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`. Use a saved baseline to see heuristic movement, but treat the committed expectation contract as the merge gate.
|
|
81
92
|
|
|
82
93
|
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.
|
|
83
94
|
|
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:
|
|
@@ -330,30 +330,17 @@ The manual draft should name concrete command evidence:
|
|
|
330
330
|
|
|
331
331
|
## Test-Light Project
|
|
332
332
|
|
|
333
|
-
When a project has little or no E2E setup,
|
|
333
|
+
When a project has little or no E2E setup, `qamap qa` still returns the same runner-independent QA judgment. Runner setup remains an explicit team choice:
|
|
334
334
|
|
|
335
335
|
```txt
|
|
336
|
-
##
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
-
|
|
341
|
-
-
|
|
342
|
-
-
|
|
343
|
-
-
|
|
344
|
-
- `playwright.config.ts`
|
|
345
|
-
- `tests/e2e/`
|
|
346
|
-
- `tests/e2e/checkout-primary-journey.spec.ts`
|
|
347
|
-
- Files to update: `package.json`
|
|
348
|
-
|
|
349
|
-
Bootstrap summary:
|
|
350
|
-
4 required bootstrap steps must be resolved before generated E2E drafts should be treated as regression coverage.
|
|
351
|
-
|
|
352
|
-
Required:
|
|
353
|
-
- Configure Playwright before making drafts required
|
|
354
|
-
- Create the first changed-flow E2E draft
|
|
355
|
-
- Add deterministic fixture or mock responses
|
|
356
|
-
- Add stable selectors for changed UI surfaces
|
|
336
|
+
## Optional Automation
|
|
337
|
+
|
|
338
|
+
The QA judgment above does not require adopting this adapter.
|
|
339
|
+
|
|
340
|
+
- Adapter candidate: Playwright
|
|
341
|
+
- Draft target: `tests/e2e/checkout-primary-journey.spec.ts`
|
|
342
|
+
- Preview or create a draft: `qamap e2e draft . --base main --head HEAD`
|
|
343
|
+
- If the team accepts this adapter, inspect its setup proposal: `qamap e2e setup . --runner playwright`
|
|
357
344
|
```
|
|
358
345
|
|
|
359
346
|
Draft action items should make the next developer action explicit:
|
package/docs/quickstart-demo.md
CHANGED
|
@@ -15,6 +15,7 @@ src/features/checkout/submitCheckout.ts
|
|
|
15
15
|
The reviewer wants to know:
|
|
16
16
|
|
|
17
17
|
- Which user flow is affected?
|
|
18
|
+
- Which diff hunk caused each QA scenario to be proposed?
|
|
18
19
|
- Should this become a Playwright test, a manual checklist, or only a review note?
|
|
19
20
|
- What blocks the generated draft from being trusted as regression coverage?
|
|
20
21
|
|
|
@@ -26,9 +27,9 @@ Run QAMap on the branch:
|
|
|
26
27
|
pnpm dlx @ivorycanvas/qamap qa . --base origin/main --head HEAD
|
|
27
28
|
```
|
|
28
29
|
|
|
29
|
-
`qa` is important for first contact. It lets maintainers
|
|
30
|
+
`qa` is important for first contact. It lets maintainers review change intent, behavior lifecycle, scenario confidence, exact diff sources, and a PR checklist without writing files or selecting a test runner.
|
|
30
31
|
|
|
31
|
-
|
|
32
|
+
After the team accepts a scenario and wants executable coverage:
|
|
32
33
|
|
|
33
34
|
```sh
|
|
34
35
|
pnpm dlx @ivorycanvas/qamap e2e draft . --base origin/main --head HEAD --dry-run
|
|
@@ -148,11 +149,12 @@ Output
|
|
|
148
149
|
- commit-backed change intent and confidence
|
|
149
150
|
- ordered behavior lifecycle
|
|
150
151
|
- primary, failure, boundary, and state-transition QA scenarios
|
|
152
|
+
- scenario-level confidence, review status, and exact commit or head-side `file:line` sources
|
|
151
153
|
- changed domain language
|
|
152
154
|
- candidate user flow
|
|
153
155
|
- manifest evidence when a repo-local flow/check matches
|
|
154
|
-
- automation adapter selected after QA design
|
|
155
|
-
- draft file path
|
|
156
|
+
- optional automation adapter selected after QA design
|
|
157
|
+
- optional draft file path
|
|
156
158
|
- flow language brief
|
|
157
159
|
- runnable status
|
|
158
160
|
- self-check status
|
|
@@ -160,7 +162,7 @@ Output
|
|
|
160
162
|
- blockers that explain why a draft is not ready yet
|
|
161
163
|
```
|
|
162
164
|
|
|
163
|
-
The result should not stop at "selector needed" or "fixture needed." A useful QAMap
|
|
165
|
+
The result should not stop at "selector needed" or "fixture needed." A useful QAMap report should say which behavior changed, which scenarios follow, which exact hunk supports each scenario, what remains uncertain, and where to update the manifest if the recommendation is wrong. Automation comes after that review.
|
|
164
166
|
|
|
165
167
|
## Markdown Preview
|
|
166
168
|
|
|
@@ -168,29 +170,32 @@ The result should not stop at "selector needed" or "fixture needed." A useful QA
|
|
|
168
170
|
# QAMap QA Draft
|
|
169
171
|
|
|
170
172
|
At a Glance
|
|
171
|
-
- Change intent: Submit
|
|
172
|
-
- Behavior lifecycle: trigger
|
|
173
|
+
- Change intent: Submit notification preferences and show the saved state [high]
|
|
174
|
+
- Behavior lifecycle: trigger -> state-change -> side-effect -> observable-outcome
|
|
173
175
|
|
|
174
176
|
Summary
|
|
175
177
|
- Project: Web
|
|
176
|
-
- Automation adapter: Playwright
|
|
177
178
|
- Manifest: .qamap/manifest.yaml
|
|
178
|
-
- Stage: almost runnable (3 of 4)
|
|
179
179
|
|
|
180
|
-
|
|
181
|
-
-
|
|
182
|
-
-
|
|
183
|
-
-
|
|
184
|
-
-
|
|
180
|
+
QA scenarios
|
|
181
|
+
- [critical] changed preference lifecycle [high]
|
|
182
|
+
- Source: src/pages/preferences.tsx:17, symbol onClick
|
|
183
|
+
- Assert: the saved state is visible
|
|
184
|
+
- [recommended] failure, timeout, and retry handling [medium; review required]
|
|
185
|
+
- Source: src/pages/preferences.tsx:7, symbol fetch
|
|
186
|
+
- Assert: retries do not duplicate requests or side effects
|
|
185
187
|
|
|
186
|
-
|
|
187
|
-
- [required] fixture: Add deterministic
|
|
188
|
-
- [recommended] selector: Confirm stable selectors for changed checkout controls.
|
|
188
|
+
Evidence gaps in this QA proposal
|
|
189
|
+
- [required] fixture: Add deterministic response data for /api/preferences.
|
|
189
190
|
|
|
190
191
|
PR checklist
|
|
191
|
-
- [ ] Review
|
|
192
|
-
- [ ] Confirm success and failed-response assertions.
|
|
192
|
+
- [ ] Review each QA scenario and its diff source.
|
|
193
|
+
- [ ] Confirm success and failed-response assertions for /api/preferences.
|
|
193
194
|
- [ ] Run pnpm run test:e2e.
|
|
195
|
+
|
|
196
|
+
Optional automation
|
|
197
|
+
- Adapter candidate: Playwright
|
|
198
|
+
- qamap e2e draft . --base origin/main --head HEAD
|
|
194
199
|
```
|
|
195
200
|
|
|
196
201
|
## Draft Shape
|
|
@@ -1,5 +1,39 @@
|
|
|
1
1
|
# Release Validation
|
|
2
2
|
|
|
3
|
+
## 0.4.2 - 2026-07-13
|
|
4
|
+
|
|
5
|
+
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:
|
|
6
|
+
|
|
7
|
+
| Gate | Current result |
|
|
8
|
+
| --- | --- |
|
|
9
|
+
| `pnpm release:check` | Passed end to end |
|
|
10
|
+
| `pnpm test` | 146/146 passing |
|
|
11
|
+
| `pnpm scan` | 0 findings |
|
|
12
|
+
| `pnpm bench:ci` | 12/12 synthetic PR targets pass; readiness, runnable-candidate, self-check, TODO, review-only, and execution-blocker contracts are enforced |
|
|
13
|
+
| Coverage | Lines 87.53%, branches 84.18%, functions 95.22% |
|
|
14
|
+
| Existing Playwright golden | Improved from `needs-work 67` with one blocker to `near-runnable 97`, one runnable candidate, and zero execution blockers |
|
|
15
|
+
| 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 |
|
|
16
|
+
| 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 |
|
|
17
|
+
|
|
18
|
+
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.
|
|
19
|
+
|
|
20
|
+
## 0.4.1 - 2026-07-13
|
|
21
|
+
|
|
22
|
+
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:
|
|
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; web and mobile lifecycle scenarios both retain 4/4 exact diff traces |
|
|
30
|
+
| Coverage | Lines 87.49%, branches 83.99%, functions 95.20% |
|
|
31
|
+
| Agent payload | Evidence-rich lifecycle fixtures are 5,288 and 5,659 bytes; a large real mobile branch compacts from 10,873 to 8,111 bytes while disclosing omitted counts |
|
|
32
|
+
| Package preview | `pnpm pack --dry-run` and `npm publish --dry-run --access public` pass for `@ivorycanvas/qamap@0.4.1`; 129 files, 825.5 kB packed |
|
|
33
|
+
| Read-only repository smoke | A large mobile branch and a web workspace branch were rechecked after base-side evidence and output compaction; both target worktrees remained unchanged |
|
|
34
|
+
|
|
35
|
+
The large mobile branch retained zero untraced critical scenarios. A removed release guard was tied to its exact base-side line and translated into local/development/QA/production configuration checks rather than an unrelated user-authorization scenario. Its agent payload reports 44 total intents, 2 retained intents, and 42 omitted intents within 8,111 bytes. The release-shaped web branch still had no behavior-bearing commit intent and therefore emitted four broader review-only flows with zero critical scenarios; this remains an explicit precision limit rather than promoted confidence.
|
|
36
|
+
|
|
3
37
|
## 0.4.0 - 2026-07-12
|
|
4
38
|
|
|
5
39
|
Validated as the first intent-first QA design release. The release contract starts with behavior-bearing commits and diff evidence, reconstructs an ordered behavior lifecycle, proposes runner-independent QA scenarios, and only then compiles an optional automation draft:
|
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
|
|
|
@@ -20,6 +21,7 @@ Version `1.0.0` requires a stable public contract and external adoption, not imp
|
|
|
20
21
|
Before publishing, confirm:
|
|
21
22
|
|
|
22
23
|
- `package.json` version matches the intended npm version.
|
|
24
|
+
- The canonical release identifier is `vX.Y.Z` (for example, `v0.4.0`). The Git tag and GitHub Release title must match this identifier exactly.
|
|
23
25
|
- `CHANGELOG.md` has a dated section for the version being published.
|
|
24
26
|
- `README.md`, [adoption](adoption.md), [E2E examples](e2e-output-examples.md), and [release validation](release-validation.md) describe the current CLI behavior.
|
|
25
27
|
- `pnpm run release:check` passes from a clean checkout.
|
|
@@ -93,11 +95,20 @@ Use a fresh shell or temporary directory for the smoke check when possible.
|
|
|
93
95
|
After npm publish succeeds:
|
|
94
96
|
|
|
95
97
|
```sh
|
|
96
|
-
|
|
97
|
-
git
|
|
98
|
+
TAG="v$VERSION"
|
|
99
|
+
git tag -a "$TAG" -m "$TAG"
|
|
100
|
+
git push origin "$TAG"
|
|
98
101
|
```
|
|
99
102
|
|
|
100
|
-
Create a GitHub Release
|
|
103
|
+
Create a GitHub Release whose display title is exactly the tag:
|
|
104
|
+
|
|
105
|
+
```sh
|
|
106
|
+
gh release create "$TAG" --title "$TAG" --notes-file <release-notes.md>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Do not prefix the title with `QAMap` or `CodeWard`, and do not add a descriptive subtitle. Product positioning and highlights belong in the release notes body so the release list remains consistently sortable as `vX.Y.Z`.
|
|
110
|
+
|
|
111
|
+
The release notes body should contain:
|
|
101
112
|
|
|
102
113
|
- a concise release summary
|
|
103
114
|
- the current `CHANGELOG.md` section
|
package/docs/roadmap.md
CHANGED
|
@@ -24,16 +24,20 @@ 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.
|
|
@@ -42,12 +46,13 @@ Before treating the next public release as ready, the golden demo must satisfy t
|
|
|
42
46
|
- Improve Playwright and Maestro compilation from intent scenarios while keeping runner choice behind the runner-independent QA contract.
|
|
43
47
|
- 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
48
|
|
|
45
|
-
##
|
|
49
|
+
## Longer-Term Release Bar (No Scheduled 0.5.x Date)
|
|
46
50
|
|
|
47
51
|
- 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
52
|
- Compare base and head Behavior Graphs, then select impacted graph paths before refining deterministic success, validation, failure, empty, loading, auth, and contract scenarios.
|
|
49
53
|
- Add policy-controlled temporary execution so selected scenarios can produce normalized pass, fail, blocked, and not-verifiable evidence without modifying the target repository.
|
|
50
54
|
- Add an execution benchmark that injects known regressions and requires QAMap to select and fail the relevant scenario without changing the fixture repository.
|
|
55
|
+
- 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
56
|
- Add symbol-level anchors for exported components, hooks, API clients, handlers, schemas, and queries after the public import-impact fixture stays stable.
|
|
52
57
|
- 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
58
|
- 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 +60,8 @@ Before treating the next public release as ready, the golden demo must satisfy t
|
|
|
55
60
|
- Keep the `--format agent` output a stable, versioned contract that skills and MCP wrappers can rely on.
|
|
56
61
|
- Continue expanding agent surface detection across popular coding-agent tools without making the public workflow depend on a single vendor.
|
|
57
62
|
|
|
63
|
+
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.
|
|
64
|
+
|
|
58
65
|
## Later
|
|
59
66
|
|
|
60
67
|
- Policy packs for open source, startup teams, and security-sensitive repositories.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ivorycanvas/qamap",
|
|
3
|
-
"version": "0.4.
|
|
4
|
-
"description": "Local zero-LLM PR QA designer that
|
|
3
|
+
"version": "0.4.2",
|
|
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",
|
|
7
7
|
"bin": {
|
|
@@ -5,6 +5,25 @@
|
|
|
5
5
|
"description": "The single-line JSON object printed by `qamap qa --format agent`. Within schema version 1, fields are only ever added — existing fields are never removed or retyped. A breaking change bumps schema.version to 2.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": true,
|
|
8
|
+
"definitions": {
|
|
9
|
+
"evidenceSource": {
|
|
10
|
+
"type": "object",
|
|
11
|
+
"required": ["kind", "reason"],
|
|
12
|
+
"properties": {
|
|
13
|
+
"kind": { "type": "string", "enum": ["commit", "diff", "source"] },
|
|
14
|
+
"reason": { "type": "string" },
|
|
15
|
+
"commit": { "type": "string" },
|
|
16
|
+
"file": { "type": "string" },
|
|
17
|
+
"previousFile": { "type": "string" },
|
|
18
|
+
"symbol": { "type": "string" },
|
|
19
|
+
"relation": { "type": "string", "enum": ["direct", "supporting", "contextual"] },
|
|
20
|
+
"side": { "type": "string", "enum": ["base", "head"] },
|
|
21
|
+
"startLine": { "type": "integer", "minimum": 0 },
|
|
22
|
+
"endLine": { "type": "integer", "minimum": 0 },
|
|
23
|
+
"hunk": { "type": "string" }
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
},
|
|
8
27
|
"required": [
|
|
9
28
|
"schema",
|
|
10
29
|
"base",
|
|
@@ -82,6 +101,17 @@
|
|
|
82
101
|
"confidence": { "type": "string", "enum": ["low", "medium", "high"] },
|
|
83
102
|
"reviewRequired": { "type": "boolean" },
|
|
84
103
|
"evidence": { "type": "array", "items": { "type": "string" } },
|
|
104
|
+
"sources": {
|
|
105
|
+
"type": "array",
|
|
106
|
+
"items": { "$ref": "#/definitions/evidenceSource" },
|
|
107
|
+
"description": "Structured commit and diff locations behind the intent (capped)."
|
|
108
|
+
},
|
|
109
|
+
"scenarioCount": { "type": "integer", "minimum": 0 },
|
|
110
|
+
"omittedScenarioCount": {
|
|
111
|
+
"type": "integer",
|
|
112
|
+
"minimum": 0,
|
|
113
|
+
"description": "Number of lower-ranked scenarios omitted from the compact payload. Use the human or JSON format when non-zero."
|
|
114
|
+
},
|
|
85
115
|
"lifecycle": {
|
|
86
116
|
"type": "array",
|
|
87
117
|
"items": {
|
|
@@ -105,6 +135,13 @@
|
|
|
105
135
|
"priority": { "type": "string", "enum": ["critical", "recommended"] },
|
|
106
136
|
"kind": { "type": "string", "enum": ["primary", "failure", "boundary", "state-transition"] },
|
|
107
137
|
"title": { "type": "string" },
|
|
138
|
+
"confidence": { "type": "string", "enum": ["low", "medium", "high"] },
|
|
139
|
+
"reviewRequired": { "type": "boolean" },
|
|
140
|
+
"sources": {
|
|
141
|
+
"type": "array",
|
|
142
|
+
"items": { "$ref": "#/definitions/evidenceSource" },
|
|
143
|
+
"description": "The strongest diff or commit locations that caused this scenario to be proposed (capped)."
|
|
144
|
+
},
|
|
108
145
|
"assertions": { "type": "array", "items": { "type": "string" } }
|
|
109
146
|
}
|
|
110
147
|
}
|
|
@@ -112,9 +149,31 @@
|
|
|
112
149
|
}
|
|
113
150
|
}
|
|
114
151
|
},
|
|
152
|
+
"intentCount": {
|
|
153
|
+
"type": "integer",
|
|
154
|
+
"minimum": 0,
|
|
155
|
+
"description": "Total inferred intents before compact output capping."
|
|
156
|
+
},
|
|
157
|
+
"omittedIntentCount": {
|
|
158
|
+
"type": "integer",
|
|
159
|
+
"minimum": 0,
|
|
160
|
+
"description": "Intents omitted from the compact payload."
|
|
161
|
+
},
|
|
115
162
|
"firstDraftCommand": {
|
|
116
163
|
"type": "string",
|
|
117
|
-
"description": "
|
|
164
|
+
"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
|
+
},
|
|
166
|
+
"automation": {
|
|
167
|
+
"type": "object",
|
|
168
|
+
"description": "Optional adapter handoff after a reviewer accepts the QA scenario. It is not required to use the QA judgment.",
|
|
169
|
+
"required": ["optIn", "adapter", "setupStatus", "draftCommand"],
|
|
170
|
+
"properties": {
|
|
171
|
+
"optIn": { "const": true },
|
|
172
|
+
"adapter": { "type": "string", "enum": ["maestro", "playwright", "manual"] },
|
|
173
|
+
"setupStatus": { "type": "string", "enum": ["ready", "proposed", "not-applicable"] },
|
|
174
|
+
"draftCommand": { "type": "string" },
|
|
175
|
+
"setupCommand": { "type": "string" }
|
|
176
|
+
}
|
|
118
177
|
},
|
|
119
178
|
"flows": {
|
|
120
179
|
"type": "array",
|
|
@@ -168,6 +227,25 @@
|
|
|
168
227
|
}
|
|
169
228
|
}
|
|
170
229
|
},
|
|
230
|
+
"flowCount": {
|
|
231
|
+
"type": "integer",
|
|
232
|
+
"minimum": 0,
|
|
233
|
+
"description": "Total affected flows before compact output capping."
|
|
234
|
+
},
|
|
235
|
+
"omittedFlowCount": {
|
|
236
|
+
"type": "integer",
|
|
237
|
+
"minimum": 0,
|
|
238
|
+
"description": "Flows omitted from the compact payload."
|
|
239
|
+
},
|
|
240
|
+
"compaction": {
|
|
241
|
+
"type": "object",
|
|
242
|
+
"description": "Present when QAMap reduced lower-priority detail to keep the complete line at or below 8KB.",
|
|
243
|
+
"properties": {
|
|
244
|
+
"maxBytes": { "type": "integer", "minimum": 1 },
|
|
245
|
+
"originalBytes": { "type": "integer", "minimum": 1 },
|
|
246
|
+
"emergency": { "type": "boolean" }
|
|
247
|
+
}
|
|
248
|
+
},
|
|
171
249
|
"requiredEvidence": {
|
|
172
250
|
"type": "array",
|
|
173
251
|
"description": "QA evidence the change still needs before merge (required priority only, capped at 8).",
|
|
@@ -188,7 +266,7 @@
|
|
|
188
266
|
},
|
|
189
267
|
"requiredBootstrap": {
|
|
190
268
|
"type": "array",
|
|
191
|
-
"description": "
|
|
269
|
+
"description": "Non-runner repository context steps (capped at 3). Runner adoption is exposed separately under the opt-in automation object.",
|
|
192
270
|
"items": {
|
|
193
271
|
"type": "object",
|
|
194
272
|
"required": ["title", "action"],
|
|
@@ -96,6 +96,38 @@
|
|
|
96
96
|
"file": {
|
|
97
97
|
"type": "string",
|
|
98
98
|
"minLength": 1
|
|
99
|
+
},
|
|
100
|
+
"previousFile": {
|
|
101
|
+
"type": "string",
|
|
102
|
+
"minLength": 1
|
|
103
|
+
},
|
|
104
|
+
"symbol": {
|
|
105
|
+
"type": "string",
|
|
106
|
+
"minLength": 1
|
|
107
|
+
},
|
|
108
|
+
"commit": {
|
|
109
|
+
"type": "string",
|
|
110
|
+
"minLength": 1
|
|
111
|
+
},
|
|
112
|
+
"relation": {
|
|
113
|
+
"type": "string",
|
|
114
|
+
"enum": ["direct", "supporting", "contextual"]
|
|
115
|
+
},
|
|
116
|
+
"side": {
|
|
117
|
+
"type": "string",
|
|
118
|
+
"enum": ["base", "head"]
|
|
119
|
+
},
|
|
120
|
+
"startLine": {
|
|
121
|
+
"type": "integer",
|
|
122
|
+
"minimum": 0
|
|
123
|
+
},
|
|
124
|
+
"endLine": {
|
|
125
|
+
"type": "integer",
|
|
126
|
+
"minimum": 0
|
|
127
|
+
},
|
|
128
|
+
"hunkHeader": {
|
|
129
|
+
"type": "string",
|
|
130
|
+
"minLength": 1
|
|
99
131
|
}
|
|
100
132
|
}
|
|
101
133
|
},
|
|
@@ -34,28 +34,28 @@ Use QAMap as a final local QA pass before presenting a pull request for human re
|
|
|
34
34
|
```
|
|
35
35
|
|
|
36
36
|
4. Read and verify intent before generating code. In agent format:
|
|
37
|
-
- `intents[]` — commit/diff evidence, confidence, `reviewRequired`, ordered lifecycle, and primary/failure/boundary/state-transition scenarios.
|
|
37
|
+
- `intents[]` — commit/diff evidence, confidence, `reviewRequired`, ordered lifecycle, and primary/failure/boundary/state-transition scenarios. Read each scenario's structured `sources` before accepting it; a diff source carries `file`, head-side line numbers, symbol, and hunk.
|
|
38
38
|
- If `reviewRequired` is true or the lifecycle conflicts with the PR, ask a human to confirm the intended behavior before promoting a draft.
|
|
39
39
|
- `flows[]` — affected flows with `draft` path, `runnable` status, entry route, capped steps, and selectors.
|
|
40
40
|
- `requiredEvidence[]` — evidence that must exist before the PR can be trusted; `recommendedEvidenceCount` for the rest.
|
|
41
|
-
- `requiredBootstrap[]` —
|
|
41
|
+
- `requiredBootstrap[]` — non-runner repository context that still needs clarification.
|
|
42
|
+
- `automation` — an optional adapter handoff. It is not required to use the QA judgment.
|
|
42
43
|
- `prChecklist[]` and `commands[]` — checklist lines and validation commands for the handoff.
|
|
43
44
|
|
|
44
|
-
5.
|
|
45
|
+
5. Only after a human or team accepts the scenario and automation adapter, create or preview executable coverage:
|
|
45
46
|
|
|
46
47
|
```sh
|
|
47
|
-
pnpm exec qamap e2e
|
|
48
|
+
pnpm exec qamap e2e draft . --base <base> --head HEAD
|
|
48
49
|
```
|
|
49
50
|
|
|
50
|
-
|
|
51
|
-
`firstDraftCommand` is present only when the repo has no test suite; run it to create the first starter draft. In markdown format, start from `At a Glance` and `Change Intent Evidence`, then read the PR comment, missing evidence, and checklist sections.
|
|
51
|
+
If the selected adapter is absent, inspect and explicitly accept the `automation.setupCommand` proposal. Never install a runner merely because QAMap detected a web or mobile surface.
|
|
52
52
|
6. Include the useful parts in the PR body, review note, or handoff summary.
|
|
53
53
|
|
|
54
54
|
## Output Rules
|
|
55
55
|
|
|
56
56
|
- Treat QAMap output as QA planning evidence, not proof that browser, device, API, or manual QA passed.
|
|
57
|
-
- Preserve change intent, confidence, lifecycle, QA scenarios,
|
|
58
|
-
-
|
|
57
|
+
- Preserve change intent, confidence, lifecycle, QA scenarios, their strongest file/line sources, affected flow, missing evidence, and validation command in the handoff.
|
|
58
|
+
- Keep automation optional until the scenario and its evidence have been reviewed.
|
|
59
59
|
- Treat Playwright, Maestro, and manual output as adapters after QA design. Do not let runner selection replace review of the inferred intent and scenarios.
|
|
60
60
|
- If the output is `review only` or `near runnable`, explain what blocks it from becoming trusted regression evidence.
|
|
61
61
|
- If `qamap qa` says no manifest was found, do not stop. The first run is allowed to be manifest-free.
|
|
@@ -79,6 +79,7 @@ QAMap QA
|
|
|
79
79
|
- Change intent and confidence:
|
|
80
80
|
- Behavior lifecycle:
|
|
81
81
|
- Required QA scenarios:
|
|
82
|
+
- Scenario source files/lines:
|
|
82
83
|
- Affected flow:
|
|
83
84
|
- Suggested E2E/checklist:
|
|
84
85
|
- Missing evidence:
|