@ivorycanvas/qamap 0.4.2 → 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.
- package/CHANGELOG.md +19 -0
- package/README.md +10 -1
- package/dist/e2e.d.ts +25 -0
- package/dist/e2e.js +245 -6
- package/dist/e2e.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/qa.d.ts +2 -1
- package/dist/qa.js +68 -10
- package/dist/qa.js.map +1 -1
- package/dist/scenario-routing.d.ts +11 -0
- package/dist/scenario-routing.js +72 -0
- package/dist/scenario-routing.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/agent-format.md +10 -8
- package/docs/architecture.md +22 -1
- package/docs/assets/qamap-cover.png +0 -0
- package/docs/assets/qamap-cover.svg +56 -0
- package/docs/benchmarking.md +8 -1
- package/docs/e2e-output-examples.md +32 -19
- package/docs/release-validation.md +17 -0
- package/docs/roadmap.md +2 -0
- package/package.json +1 -1
- package/schema/qamap-agent.schema.json +51 -1
|
@@ -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>
|
package/docs/benchmarking.md
CHANGED
|
@@ -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. |
|
|
@@ -88,7 +93,7 @@ node scripts/bench.mjs --baseline bench-results/<file>.json
|
|
|
88
93
|
|
|
89
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.
|
|
90
95
|
|
|
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.
|
|
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.
|
|
92
97
|
|
|
93
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.
|
|
94
99
|
|
|
@@ -101,4 +106,6 @@ When a real repository produces a poor recommendation:
|
|
|
101
106
|
3. Confirm `pnpm bench:ci` fails for the intended reason.
|
|
102
107
|
4. Fix the inference and keep the fixture as permanent regression evidence.
|
|
103
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
|
+
|
|
104
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.
|
|
@@ -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
|
|
20
|
-
- Behavior lifecycle: trigger:
|
|
21
|
-
- Affected behavior: Submit
|
|
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
|
|
25
|
-
- Critical scenario: Submit
|
|
26
|
-
-
|
|
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:
|
|
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
|
|
37
|
-
- User journey:
|
|
38
|
-
- Success signal:
|
|
39
|
-
- Changed files: src/pages/
|
|
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-
|
|
43
|
-
- Open route /
|
|
44
|
-
-
|
|
45
|
-
-
|
|
46
|
-
|
|
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
|
-
- [
|
|
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,22 @@
|
|
|
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
|
+
|
|
3
20
|
## 0.4.2 - 2026-07-13
|
|
4
21
|
|
|
5
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:
|
package/docs/roadmap.md
CHANGED
|
@@ -44,6 +44,8 @@ There is no fixed end date or patch count for `0.4.x`. QAMap will remain on comp
|
|
|
44
44
|
- Stabilize the manifest feedback loop with `.qamap/manifest.yaml`, `manifest init`, `manifest validate`, `manifest explain`, JSON Schema, and manifest-driven E2E draft shaping.
|
|
45
45
|
- Keep `manifest context` useful as a pre-init sanity check for repo-local QA memory, harness docs, agent instructions, and runbooks.
|
|
46
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.
|
|
47
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.
|
|
48
50
|
|
|
49
51
|
## Longer-Term Release Bar (No Scheduled 0.5.x Date)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ivorycanvas/qamap",
|
|
3
|
-
"version": "0.4.
|
|
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" },
|