@ivorycanvas/qamap 0.3.5 → 0.4.1
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 +49 -0
- package/README.md +37 -23
- package/dist/agent-init.js +2 -2
- package/dist/agent-init.js.map +1 -1
- package/dist/behavior-intent.d.ts +6 -0
- package/dist/behavior-intent.js +183 -0
- package/dist/behavior-intent.js.map +1 -0
- package/dist/behavior-manifest.d.ts +6 -0
- package/dist/behavior-manifest.js +221 -0
- package/dist/behavior-manifest.js.map +1 -0
- package/dist/behavior.d.ts +151 -0
- package/dist/behavior.js +458 -0
- package/dist/behavior.js.map +1 -0
- package/dist/change-intent.d.ts +81 -0
- package/dist/change-intent.js +884 -0
- package/dist/change-intent.js.map +1 -0
- package/dist/cli.js +13 -8
- package/dist/cli.js.map +1 -1
- package/dist/e2e.d.ts +16 -1
- package/dist/e2e.js +290 -25
- package/dist/e2e.js.map +1 -1
- package/dist/index.d.ts +11 -3
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/qa.d.ts +1 -0
- package/dist/qa.js +293 -88
- package/dist/qa.js.map +1 -1
- package/dist/terminal.js +1 -1
- package/dist/terminal.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/adoption.md +11 -10
- package/docs/agent-format.md +16 -10
- package/docs/agent-skill.md +8 -5
- package/docs/architecture.md +131 -0
- package/docs/benchmarking.md +23 -4
- package/docs/commands.md +13 -7
- package/docs/e2e-output-examples.md +29 -28
- package/docs/quickstart-demo.md +29 -17
- package/docs/release-validation.md +49 -6
- package/docs/releasing.md +26 -3
- package/docs/roadmap.md +20 -10
- package/package.json +4 -2
- package/schema/qamap-agent.schema.json +122 -3
- package/schema/qamap-behavior.schema.json +339 -0
- package/skills/qamap-pr-qa/SKILL.md +20 -14
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# Release Validation
|
|
2
2
|
|
|
3
|
+
## 0.4.1 - 2026-07-13
|
|
4
|
+
|
|
5
|
+
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:
|
|
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; web and mobile lifecycle scenarios both retain 4/4 exact diff traces |
|
|
13
|
+
| Coverage | Lines 87.49%, branches 83.99%, functions 95.20% |
|
|
14
|
+
| 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 |
|
|
15
|
+
| 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 |
|
|
16
|
+
| 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 |
|
|
17
|
+
|
|
18
|
+
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.
|
|
19
|
+
|
|
20
|
+
## 0.4.0 - 2026-07-12
|
|
21
|
+
|
|
22
|
+
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:
|
|
23
|
+
|
|
24
|
+
| Gate | Current result |
|
|
25
|
+
| --- | --- |
|
|
26
|
+
| `pnpm test` | 139/139 passing |
|
|
27
|
+
| `pnpm bench:ci` | 12/12 synthetic PR targets pass; dedicated web and mobile lifecycle targets require commit intent, ordered lifecycle phases, failure/boundary/state QA, observable success text, and commit-backed Behavior Graph evidence |
|
|
28
|
+
| Coverage | Lines 86.80%, branches 83.37%, functions 94.86% |
|
|
29
|
+
| Change Intent coverage | Lines 94.76%, branches 88.57%, functions 98.04% |
|
|
30
|
+
| `npm publish --dry-run --access public` | Passed for `@ivorycanvas/qamap@0.4.0`; 129 files, 813.8 kB packed |
|
|
31
|
+
| Intent-first output | Markdown, JSON, agent output, Behavior Graph, and generated drafts preserve confidence, commit evidence, lifecycle, and QA scenarios before automation-adapter guidance |
|
|
32
|
+
| Read-only safety | Public regression coverage uses synthetic repositories; optional local smoke validation runs from temporary copies and does not modify target repositories |
|
|
33
|
+
|
|
3
34
|
## 0.3.5 - 2026-07-11
|
|
4
35
|
|
|
5
36
|
Validated as a manifest-feedback reliability patch:
|
|
@@ -83,7 +114,9 @@ For each target, record:
|
|
|
83
114
|
|
|
84
115
|
- command used
|
|
85
116
|
- base/head refs or working-tree mode
|
|
86
|
-
-
|
|
117
|
+
- inferred change intent, confidence, commit evidence, and review requirement
|
|
118
|
+
- lifecycle and runner-independent QA scenario quality
|
|
119
|
+
- selected automation adapter
|
|
87
120
|
- generated flow language brief quality
|
|
88
121
|
- draft readiness summary
|
|
89
122
|
- draft self-check status and blockers
|
|
@@ -140,7 +173,9 @@ node dist/cli.js e2e draft <package> --workspace-root <repo-root> --base <base>
|
|
|
140
173
|
|
|
141
174
|
The E2E plan should show:
|
|
142
175
|
|
|
143
|
-
-
|
|
176
|
+
- change intent with commit and diff evidence, confidence, and review requirement
|
|
177
|
+
- ordered behavior lifecycle and concrete primary, failure, boundary, and state-transition QA scenarios
|
|
178
|
+
- automation adapter selection after the runner-independent QA sections
|
|
144
179
|
- execution profile with start command, test command, base URL or app id when discoverable, confidence, and blockers
|
|
145
180
|
- runner setup proposal with install commands, explicit `qamap e2e setup` acceptance command, files to create/update, and next commands when the repo lacks an E2E runner
|
|
146
181
|
- setup output that reports the first generated changed-flow draft file after the accepted runner setup is applied
|
|
@@ -151,6 +186,7 @@ The E2E plan should show:
|
|
|
151
186
|
|
|
152
187
|
The E2E draft should show:
|
|
153
188
|
|
|
189
|
+
- intent evidence, lifecycle, and QA scenario comments inside generated artifacts
|
|
154
190
|
- `verification-manifest` as the draft source when a matched manifest flow is strong enough
|
|
155
191
|
- manifest evidence comments inside generated drafts
|
|
156
192
|
- external `--manifest <file>` previews that let teams test generated manifest quality without writing `.qamap/manifest.yaml` into target repos
|
|
@@ -170,9 +206,11 @@ The QA draft should show:
|
|
|
170
206
|
|
|
171
207
|
- no-write PR comment/checklist output from `qamap qa`
|
|
172
208
|
- no cloud and no LLM token positioning in the output
|
|
209
|
+
- change intent and lifecycle before automation setup
|
|
210
|
+
- primary, failure, boundary, and state-transition QA scenarios when evidence supports them
|
|
173
211
|
- affected flow language with changed files and reviewer question
|
|
174
212
|
- suggested E2E or manual checklist path
|
|
175
|
-
-
|
|
213
|
+
- automation adapter inherited from the E2E planner
|
|
176
214
|
- missing fixture, selector, assertion, runner, validation, or manifest evidence
|
|
177
215
|
- PR checklist items that can be pasted into a pull request
|
|
178
216
|
- optional manifest repair path when a manifest-backed recommendation is wrong
|
|
@@ -198,6 +236,9 @@ The manifest commands should show:
|
|
|
198
236
|
The public demo must prove the product shape, not only command execution. Before promoting a release, run or update a small demo where a realistic PR diff produces a concrete E2E starting point:
|
|
199
237
|
|
|
200
238
|
- The output names the affected product feature and user flow in domain language.
|
|
239
|
+
- The output shows the behavior-bearing commit evidence, confidence, and review requirement behind the inferred intent.
|
|
240
|
+
- The output orders trigger, condition, action, state change, side effect, and observable outcome before selecting a runner.
|
|
241
|
+
- The output proposes concrete primary, failure, boundary, and state-transition QA where evidence supports them.
|
|
201
242
|
- The output names the draft file that would be created or previewed.
|
|
202
243
|
- The draft includes route or screen entry, realistic actions, and at least one meaningful assertion.
|
|
203
244
|
- The report explains why the test was recommended from changed files and manifest evidence.
|
|
@@ -213,11 +254,12 @@ The matrix below is public, fixture-backed evidence from the repository test sui
|
|
|
213
254
|
|
|
214
255
|
| Target | Fixture-backed coverage | Expected output |
|
|
215
256
|
| --- | --- | --- |
|
|
257
|
+
| Commit intent and lifecycle | `change intent clusters related commits into one evidence-backed lifecycle`; `change intent keeps unrelated feature commits separate`; `change intent ignores release-only commit metadata`; `E2E planning promotes commit intent before runner-specific draft generation` | Related feature commits become one evidence-backed intent; unrelated features remain separate; release-only changes do not become product intent; lifecycle and QA scenarios appear before Playwright or Maestro compilation; generic `primary journey` and `smoke flow` titles are suppressed when evidence supports a concrete name. |
|
|
216
258
|
| Manifest-free QA skill entrypoint | `qa command emits a PR comment draft without requiring a manifest` | `qamap qa` works without `.qamap/manifest.yaml`, emits a local-first PR QA draft, names affected flow, changed files, suggested E2E/checklist path, missing evidence, PR checklist, agent handoff, and says manifest is optional upgrade rather than a first-use gate. |
|
|
217
259
|
| Packaged PR QA skill template | `package metadata includes the portable PR QA skill template` | npm package metadata includes `skills`, and `skills/qamap-pr-qa/SKILL.md` contains the local PR QA workflow, `qamap qa` command, and manifest repair guidance. |
|
|
218
260
|
| Verification manifest loop | `manifest init creates a baseline verification manifest`; `manifest init keeps Expo app file domains specific`; `manifest init captures advisory instruction context`; `manifest bootstrap produces concrete PR E2E draft from repo QA memory`; `e2e draft can use an external verification manifest for read-only adoption preview`; `manifest matches explain e2e and verify recommendations`; `manifest validate reports missing and stale manifest policy` | Generated `.qamap/manifest.yaml` includes `$schema`, domains, flows, anchors, checks, runner, source, and confidence; context preview reports repo-local instruction sources, role summaries, validation commands, safety rules, and diagnostics; validator reports missing/stale/duplicate policy; explain output maps branch changes to manifest domains/flows/checks; E2E drafts prefer `verification-manifest` sources with manifest evidence, route entry, detected input/action selectors, required checks, and manifest repair paths; external manifests can be passed with `--manifest` for read-only adoption smoke tests. |
|
|
219
|
-
| Web app with Playwright routes | `generateE2ePlan matches committed core flow definitions`; `generateE2eDraft uses web selectors in Playwright specs`; `generateE2eDraft dry run previews files without writing drafts`; `generateE2eDraft asserts changed HTML success copy in Playwright specs`; `generateE2ePlan captures Playwright execution profile and self-check blockers`; `generateE2ePlan infers Playwright base URLs from dev scripts`; `generateE2eDraft supports Next app router route groups and concrete route hints`; `generateE2ePlan reads React Router object route paths`; `generateE2eDraft fills dynamic route params from concrete route hints`; `generateE2eDraft emits runnable Playwright role and input actions` | `Web` project profile,
|
|
220
|
-
| Expo / React Native mobile app | `generateE2ePlan recommends mobile flows for Expo changes`; `generateE2ePlan detects Maestro app ids from app config files`; `generateE2eDraft scopes entrypoint hints to each domain scenario`; `generateE2eDraft names changed component actions before generic primary journeys` | `Expo / React Native` project profile,
|
|
261
|
+
| Web app with Playwright routes | `generateE2ePlan matches committed core flow definitions`; `generateE2eDraft uses web selectors in Playwright specs`; `generateE2eDraft dry run previews files without writing drafts`; `generateE2eDraft asserts changed HTML success copy in Playwright specs`; `generateE2ePlan captures Playwright execution profile and self-check blockers`; `generateE2ePlan infers Playwright base URLs from dev scripts`; `generateE2eDraft supports Next app router route groups and concrete route hints`; `generateE2ePlan reads React Router object route paths`; `generateE2eDraft fills dynamic route params from concrete route hints`; `generateE2eDraft emits runnable Playwright role and input actions` | `Web` project profile, Playwright output adapter, intent-backed or core-flow names, route-aware drafts, dry-run preview status without filesystem writes, stable selector hints, changed HTML success copy assertions, execution profile, dev-script base URL hints, opt-in setup proposal, route groups, object paths, dynamic params, draft self-check status, action items, and validation gaps. |
|
|
262
|
+
| Expo / React Native mobile app | `generateE2ePlan recommends mobile flows for Expo changes`; `generateE2ePlan detects Maestro app ids from app config files`; `generateE2eDraft scopes entrypoint hints to each domain scenario`; `generateE2eDraft names changed component actions before generic primary journeys` | `Expo / React Native` project profile, Maestro output adapter, app id and launch command hints from `app.json` or `app.config.*`, YAML drafts, `testID`/`accessibilityLabel` selector hints, and mobile setup actions after runner-independent QA intent. |
|
|
221
263
|
| API or backend service | `generateE2ePlan detects API service projects and suggests contract checklists`; `generateE2ePlan detects Django service apps from a workspace root`; `generateE2ePlan names versioned API service paths with domain language`; `generateE2ePlan uses matched core flow names for API service contracts` | `API / service` project profile, manual contract checklist, Django/FastAPI-style service signals when present, domain-aware titles such as `Listing API contract`, API consumer actor, endpoint/handler/service-path trigger, service start/test command hints, and contract failure coverage. |
|
|
222
264
|
| CLI package | `generateE2ePlan detects CLI packages and suggests command verification checklists` | `CLI` project profile from `package.json` bin entries, manual command verification checklist, CLI user or maintainer actor language, command invocation trigger, stdout/stderr/generated-file/exit-code success signal, valid and invalid argument coverage, and no required API fixture action unless the changed command path explicitly exposes network or fixture evidence. |
|
|
223
265
|
| Design tokens and data catalogs | `generateE2ePlan detects design token packages and suggests artifact validation`; `generateE2ePlan detects data catalog repositories and suggests catalog verification` | `Design tokens` and `Data catalog` project profiles, manual artifact/catalog checklist, token or catalog actor language, schema/generated output/consumer fixture coverage, fixture readiness marked not needed for API mocks, and validation matrix rows that do not require browser/device selectors. |
|
|
@@ -239,7 +281,8 @@ Private repositories may be used as local, read-only diagnostics, but their raw
|
|
|
239
281
|
The release candidate must pass the fixture-backed suite, package dry-run, and read-only smoke protocol. Record only public synthetic evidence in this document or in release notes:
|
|
240
282
|
|
|
241
283
|
- whether the generated flow names match the team's domain language
|
|
242
|
-
- whether the
|
|
284
|
+
- whether commit evidence supports the inferred intent and lifecycle
|
|
285
|
+
- whether the automation adapter is plausible without being mistaken for the product value
|
|
243
286
|
- whether generated drafts identify the right actor, trigger, success signal, and edge cases
|
|
244
287
|
- whether action items are concrete enough for a developer to convert into runnable tests
|
|
245
288
|
- whether false positives are caused by missing manifests, weak selectors, or unsupported project structure
|
package/docs/releasing.md
CHANGED
|
@@ -2,11 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
This runbook defines the release process for `qamap`. It is intentionally conservative: the package should be published only when the local release gate, documentation, and representative repository validation all agree.
|
|
4
4
|
|
|
5
|
+
## Pre-1.0 Version Policy
|
|
6
|
+
|
|
7
|
+
QAMap keeps major and minor changes deliberately rare during `0.x` development.
|
|
8
|
+
|
|
9
|
+
- Patch is the default for bug fixes, inference quality, performance, internal architecture, benchmarks, documentation, and additional adapters that preserve the existing CLI, schema, and safety contracts.
|
|
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
|
+
- Risky minor work should ship through `alpha`, `beta`, and `rc` prereleases before the final minor.
|
|
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
|
+
|
|
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
|
+
|
|
16
|
+
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
|
+
|
|
5
18
|
## Release Owner Checklist
|
|
6
19
|
|
|
7
20
|
Before publishing, confirm:
|
|
8
21
|
|
|
9
22
|
- `package.json` version matches the intended npm version.
|
|
23
|
+
- 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.
|
|
10
24
|
- `CHANGELOG.md` has a dated section for the version being published.
|
|
11
25
|
- `README.md`, [adoption](adoption.md), [E2E examples](e2e-output-examples.md), and [release validation](release-validation.md) describe the current CLI behavior.
|
|
12
26
|
- `pnpm run release:check` passes from a clean checkout.
|
|
@@ -80,11 +94,20 @@ Use a fresh shell or temporary directory for the smoke check when possible.
|
|
|
80
94
|
After npm publish succeeds:
|
|
81
95
|
|
|
82
96
|
```sh
|
|
83
|
-
|
|
84
|
-
git
|
|
97
|
+
TAG="v$VERSION"
|
|
98
|
+
git tag -a "$TAG" -m "$TAG"
|
|
99
|
+
git push origin "$TAG"
|
|
85
100
|
```
|
|
86
101
|
|
|
87
|
-
Create a GitHub Release
|
|
102
|
+
Create a GitHub Release whose display title is exactly the tag:
|
|
103
|
+
|
|
104
|
+
```sh
|
|
105
|
+
gh release create "$TAG" --title "$TAG" --notes-file <release-notes.md>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
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`.
|
|
109
|
+
|
|
110
|
+
The release notes body should contain:
|
|
88
111
|
|
|
89
112
|
- a concise release summary
|
|
90
113
|
- the current `CHANGELOG.md` section
|
package/docs/roadmap.md
CHANGED
|
@@ -1,47 +1,56 @@
|
|
|
1
1
|
# Roadmap
|
|
2
2
|
|
|
3
|
-
QAMap
|
|
3
|
+
QAMap is a local CLI for evidence-backed PR QA design. The project can grow in layers without becoming a hosted platform or token-dependent agent.
|
|
4
4
|
|
|
5
5
|
## North Star
|
|
6
6
|
|
|
7
|
-
QAMap should become a local-
|
|
7
|
+
QAMap should become a local, zero-LLM, change-aware QA engine. It should map any PR change to affected behavior, select the smallest relevant QA set, and eventually execute that QA with local evidence. A repository-level verification manifest supplies reviewed product intent that static code evidence cannot prove. The goal is not to replace reviewers or QA. The goal is to remove the repeated blank-page and manual verification work that makes developers skip good QA.
|
|
8
8
|
|
|
9
9
|
The sharp product position is:
|
|
10
10
|
|
|
11
11
|
```txt
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
Read the change, find the affected behavior, and produce local QA evidence.
|
|
13
|
+
No source upload. No LLM token. Let reviewed repository memory improve every later PR.
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
This means QAMap should be judged
|
|
16
|
+
This means QAMap should be judged by whether it identifies the right behavior and catches a seeded regression, not only whether it writes plausible test code. Playwright, Maestro, and other runners are implementation details behind that product contract.
|
|
17
17
|
|
|
18
18
|
## Release Bar
|
|
19
19
|
|
|
20
20
|
Before treating the next public release as ready, the golden demo must satisfy these conditions:
|
|
21
21
|
|
|
22
22
|
- First-run output is concrete, not broad: it names the affected feature, flow, draft file, and checks.
|
|
23
|
+
- Commit evidence becomes an explicit change intent and ordered behavior lifecycle before any runner is recommended.
|
|
24
|
+
- Generic `primary journey` and `smoke flow` names fail the benchmark when commit and diff evidence can support a concrete lifecycle.
|
|
23
25
|
- Manifest authoring burden stays low: `manifest context` and `manifest init` provide a useful baseline before a human edits YAML.
|
|
24
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.
|
|
25
27
|
- Recommendation evidence is explainable: output shows the changed file, manifest flow/check, and manifest path to repair when wrong.
|
|
26
28
|
- README demo shows the full loop: manifest-free PR QA draft, optional repo context baseline, PR mapping, E2E draft, and remaining validation gaps.
|
|
27
29
|
- One manifest correction should improve future PR recommendations without another LLM prompt.
|
|
28
30
|
|
|
29
|
-
## Now
|
|
31
|
+
## Now: 0.4.x
|
|
30
32
|
|
|
33
|
+
- Stabilize commit-range Change Intent analysis: related behavior commits, diff symbols, confidence, review requirements, lifecycle stages, and runner-independent QA scenarios.
|
|
34
|
+
- Keep `qamap.change-intent` as a direct Behavior Graph adapter while moving more source observations out of the compatibility adapter.
|
|
35
|
+
- Preserve `qa` as the static, read-only product surface while designing explicit execution behind `verify`; never turn a scan into implicit project-code execution.
|
|
31
36
|
- 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.
|
|
32
|
-
- Make `qa` the primary product surface. Its first screen and `--format agent` payload
|
|
37
|
+
- 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.
|
|
33
38
|
- Improve changed-file impact mapping from shared symbols and components to consuming routes, screens, API contracts, and manifest flows.
|
|
34
39
|
- 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.
|
|
35
40
|
- Stabilize the manifest feedback loop with `.qamap/manifest.yaml`, `manifest init`, `manifest validate`, `manifest explain`, JSON Schema, and manifest-driven E2E draft shaping.
|
|
36
41
|
- Keep `manifest context` useful as a pre-init sanity check for repo-local QA memory, harness docs, agent instructions, and runbooks.
|
|
37
|
-
- Improve
|
|
42
|
+
- Improve Playwright and Maestro compilation from intent scenarios while keeping runner choice behind the runner-independent QA contract.
|
|
38
43
|
- 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.
|
|
39
44
|
|
|
40
45
|
## Next
|
|
41
46
|
|
|
47
|
+
- 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
|
+
- Compare base and head Behavior Graphs, then select impacted graph paths before refining deterministic success, validation, failure, empty, loading, auth, and contract scenarios.
|
|
49
|
+
- Add policy-controlled temporary execution so selected scenarios can produce normalized pass, fail, blocked, and not-verifiable evidence without modifying the target repository.
|
|
50
|
+
- Add an execution benchmark that injects known regressions and requires QAMap to select and fail the relevant scenario without changing the fixture repository.
|
|
42
51
|
- Add symbol-level anchors for exported components, hooks, API clients, handlers, schemas, and queries after the public import-impact fixture stays stable.
|
|
43
52
|
- 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.
|
|
44
|
-
- Add stronger deterministic draft adapters for Playwright and Maestro while keeping `manual` output for API, CLI, token, and catalog repositories.
|
|
53
|
+
- 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.
|
|
45
54
|
- Expand the public benchmark corpus with package-scoped monorepos, auth/session changes, dynamic routes, API failure fixtures, and non-JavaScript services.
|
|
46
55
|
- Keep the `--format agent` output a stable, versioned contract that skills and MCP wrappers can rely on.
|
|
47
56
|
- Continue expanding agent surface detection across popular coding-agent tools without making the public workflow depend on a single vendor.
|
|
@@ -55,7 +64,8 @@ Before treating the next public release as ready, the golden demo must satisfy t
|
|
|
55
64
|
|
|
56
65
|
## Non-Goals
|
|
57
66
|
|
|
58
|
-
-
|
|
67
|
+
- Static commands such as `qa`, `scan`, and planning modes will not execute scanned project code. Future execution requires an explicit command and a visible, policy-controlled execution plan.
|
|
68
|
+
- QAMap will not implement its own browser or device automation engine; it will orchestrate proven local executors behind a framework-neutral QA contract.
|
|
59
69
|
- QAMap will not replace tests, review, branch protection, threat modeling, or security review.
|
|
60
70
|
- QAMap will not become a general-purpose code style linter.
|
|
61
71
|
- QAMap will not become a deep MCP server analysis engine.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ivorycanvas/qamap",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Local-
|
|
3
|
+
"version": "0.4.1",
|
|
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": {
|
|
@@ -39,6 +39,8 @@
|
|
|
39
39
|
"mcp",
|
|
40
40
|
"preflight",
|
|
41
41
|
"pull-request",
|
|
42
|
+
"change-intent",
|
|
43
|
+
"behavior-graph",
|
|
42
44
|
"e2e",
|
|
43
45
|
"e2e-testing",
|
|
44
46
|
"qa",
|
|
@@ -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",
|
|
@@ -45,7 +64,7 @@
|
|
|
45
64
|
"runner": {
|
|
46
65
|
"type": "string",
|
|
47
66
|
"enum": ["maestro", "playwright", "manual"],
|
|
48
|
-
"description": "
|
|
67
|
+
"description": "Automation output adapter selected after runner-independent QA intent analysis."
|
|
49
68
|
},
|
|
50
69
|
"manifest": {
|
|
51
70
|
"type": ["string", "null"],
|
|
@@ -71,9 +90,90 @@
|
|
|
71
90
|
"files": { "type": "number", "minimum": 0 }
|
|
72
91
|
}
|
|
73
92
|
},
|
|
93
|
+
"intents": {
|
|
94
|
+
"type": "array",
|
|
95
|
+
"description": "Evidence-backed change intents derived before runner selection (capped).",
|
|
96
|
+
"items": {
|
|
97
|
+
"type": "object",
|
|
98
|
+
"required": ["title", "confidence", "reviewRequired", "evidence", "lifecycle", "scenarios"],
|
|
99
|
+
"properties": {
|
|
100
|
+
"title": { "type": "string" },
|
|
101
|
+
"confidence": { "type": "string", "enum": ["low", "medium", "high"] },
|
|
102
|
+
"reviewRequired": { "type": "boolean" },
|
|
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
|
+
},
|
|
115
|
+
"lifecycle": {
|
|
116
|
+
"type": "array",
|
|
117
|
+
"items": {
|
|
118
|
+
"type": "object",
|
|
119
|
+
"required": ["phase", "label"],
|
|
120
|
+
"properties": {
|
|
121
|
+
"phase": {
|
|
122
|
+
"type": "string",
|
|
123
|
+
"enum": ["trigger", "condition", "action", "state-change", "side-effect", "observable-outcome"]
|
|
124
|
+
},
|
|
125
|
+
"label": { "type": "string" }
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
"scenarios": {
|
|
130
|
+
"type": "array",
|
|
131
|
+
"items": {
|
|
132
|
+
"type": "object",
|
|
133
|
+
"required": ["priority", "kind", "title", "assertions"],
|
|
134
|
+
"properties": {
|
|
135
|
+
"priority": { "type": "string", "enum": ["critical", "recommended"] },
|
|
136
|
+
"kind": { "type": "string", "enum": ["primary", "failure", "boundary", "state-transition"] },
|
|
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
|
+
},
|
|
145
|
+
"assertions": { "type": "array", "items": { "type": "string" } }
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
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
|
+
},
|
|
74
162
|
"firstDraftCommand": {
|
|
75
163
|
"type": "string",
|
|
76
|
-
"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
|
+
}
|
|
77
177
|
},
|
|
78
178
|
"flows": {
|
|
79
179
|
"type": "array",
|
|
@@ -127,6 +227,25 @@
|
|
|
127
227
|
}
|
|
128
228
|
}
|
|
129
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
|
+
},
|
|
130
249
|
"requiredEvidence": {
|
|
131
250
|
"type": "array",
|
|
132
251
|
"description": "QA evidence the change still needs before merge (required priority only, capped at 8).",
|
|
@@ -147,7 +266,7 @@
|
|
|
147
266
|
},
|
|
148
267
|
"requiredBootstrap": {
|
|
149
268
|
"type": "array",
|
|
150
|
-
"description": "
|
|
269
|
+
"description": "Non-runner repository context steps (capped at 3). Runner adoption is exposed separately under the opt-in automation object.",
|
|
151
270
|
"items": {
|
|
152
271
|
"type": "object",
|
|
153
272
|
"required": ["title", "action"],
|