Skip to content

Commit 059a566

Browse files
spec: V20, projection ("terminal" UX/UI) proving
Promotes V20 as operator-quality canon for ENGI. Proof-source commit: 2f3fb17 This promotion closes the V20 first gate: - advances the canonical pointer from V19 to V20 - preserves inherited V19 proof closure and reproducible-canon promotion gates before pointer advancement - adds generated operator acceptance transcript coverage for required proof-bearing workflows - adds deterministic DOM/geometry visual regression signatures for required operator states - adds deterministic accessibility budget coverage for labels, focus, keyboard operation, live status, landmarks, toggles, contrast, reduced motion, and projection safety - adds normalized local performance budget reporting without raw wall-clock samples in canonical bytes - adds projection-quality smoke coverage for public, reviewer, buyer, and internal principals - adds generated V20 quality summary and generated-only V20 _PROVEN_ appendix - records accepted V20 boundaries for inherited projection-policy coverage, representative mutation coverage, and deferred screenshot stability The implementation adds V20 quality report builders, V20 quality gate tests, V20 promotion support, V20 _PROVEN_ generation, browser posture updates, operator-facing accessibility semantics, and an aggregate non-E2E test script that avoids duplicating standalone browser listener setup. Validation completed through npm run promote:canon -- --version V20 --commit HEAD, including typecheck, unit, integration, E2E, inherited V19 gates, all V20 quality gates, aggregate non-E2E suite, generated appendix check, and git diff --check.
1 parent 2f3fb17 commit 059a566

8 files changed

Lines changed: 4260 additions & 1 deletion
Lines changed: 291 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,291 @@
1+
{
2+
"acceptedExclusionCount": 0,
3+
"acceptedExclusions": [],
4+
"blockingFailureCount": 0,
5+
"blockingFailures": [],
6+
"branchModes": [
7+
"patch",
8+
"context"
9+
],
10+
"browserContext": {
11+
"engine": "chromium",
12+
"execution": "deterministic-local-browser",
13+
"network": "loopback-only",
14+
"variancePolicy": "canonical-artifacts-use-normalized-classes"
15+
},
16+
"checkCount": 11,
17+
"checks": [
18+
{
19+
"assertions": [
20+
"button-name",
21+
"select-name",
22+
"input-name",
23+
"mode-toggle-name"
24+
],
25+
"checkId": "control-names",
26+
"concern": "Buttons, selects, inputs, textareas, info badges, and mode toggles expose names.",
27+
"failureReason": "",
28+
"passed": true,
29+
"statesCovered": [
30+
"initial-seeded-shell",
31+
"targeted-branch-run",
32+
"normalization-branch-run",
33+
"projection-quality-smoke"
34+
]
35+
},
36+
{
37+
"assertions": [
38+
"label-wrapped-controls",
39+
"placeholder-not-sole-contract"
40+
],
41+
"checkId": "form-labeling",
42+
"concern": "Each form control has a visible label or equivalent programmatic label.",
43+
"failureReason": "",
44+
"passed": true,
45+
"statesCovered": [
46+
"initial-seeded-shell",
47+
"targeted-branch-run",
48+
"normalization-branch-run",
49+
"projection-quality-smoke"
50+
]
51+
},
52+
{
53+
"assertions": [
54+
"tab-order-controls",
55+
"enter-space-buttons",
56+
"select-keyboard-change"
57+
],
58+
"checkId": "keyboard-operation",
59+
"concern": "Keyboard path can select scenario, projection, branch mode, run branch, switch surface mode, and reset.",
60+
"failureReason": "",
61+
"passed": true,
62+
"statesCovered": [
63+
"initial-seeded-shell",
64+
"targeted-branch-run",
65+
"normalization-branch-run",
66+
"projection-quality-smoke"
67+
]
68+
},
69+
{
70+
"assertions": [
71+
"0. Operating picture",
72+
"1. Depositing + candidate assets",
73+
"2. Needing + measured demand",
74+
"3. Depositing-to-needing fit",
75+
"4. Ranked candidates + verification determinisms",
76+
"5. Asset pack + branch artifacts",
77+
"6. Settlement + journal diff",
78+
"7. Ledger + policy surfaces"
79+
],
80+
"checkId": "focus-order",
81+
"concern": "Focus order follows the operator workflow order.",
82+
"failureReason": "",
83+
"passed": true,
84+
"statesCovered": [
85+
"initial-seeded-shell",
86+
"targeted-branch-run",
87+
"normalization-branch-run",
88+
"projection-quality-smoke"
89+
]
90+
},
91+
{
92+
"assertions": [
93+
"button:focus-visible",
94+
"input:focus-visible",
95+
"select:focus-visible",
96+
"textarea:focus-visible",
97+
".surface-mode-button:focus-visible"
98+
],
99+
"checkId": "focus-visibility",
100+
"concern": "Interactive controls expose focus-visible styling.",
101+
"failureReason": "",
102+
"passed": true,
103+
"statesCovered": [
104+
"initial-seeded-shell",
105+
"targeted-branch-run",
106+
"normalization-branch-run",
107+
"projection-quality-smoke"
108+
]
109+
},
110+
{
111+
"assertions": [
112+
"#status[role=status]",
113+
"aria-live=polite",
114+
"aria-atomic=true"
115+
],
116+
"checkId": "status-announcements",
117+
"concern": "Status changes are announced through a polite status live region.",
118+
"failureReason": "",
119+
"passed": true,
120+
"statesCovered": [
121+
"initial-seeded-shell",
122+
"targeted-branch-run",
123+
"normalization-branch-run",
124+
"projection-quality-smoke"
125+
]
126+
},
127+
{
128+
"assertions": [
129+
"header.hero",
130+
"main.grid",
131+
"section.panel",
132+
".panel-head h2"
133+
],
134+
"checkId": "landmarks-and-sections",
135+
"concern": "Header, main, summary, and major panels are navigable.",
136+
"failureReason": "",
137+
"passed": true,
138+
"statesCovered": [
139+
"initial-seeded-shell",
140+
"targeted-branch-run",
141+
"normalization-branch-run",
142+
"projection-quality-smoke"
143+
]
144+
},
145+
{
146+
"assertions": [
147+
"role=tablist",
148+
"aria-selected=true",
149+
"aria-controls"
150+
],
151+
"checkId": "toggle-state",
152+
"concern": "Visual/raw surface toggles expose selected state.",
153+
"failureReason": "",
154+
"passed": true,
155+
"statesCovered": [
156+
"initial-seeded-shell",
157+
"targeted-branch-run",
158+
"normalization-branch-run",
159+
"projection-quality-smoke"
160+
]
161+
},
162+
{
163+
"assertions": [
164+
"normal-text>=4.5",
165+
"large-text>=3",
166+
"non-text-ui>=3",
167+
"focus-indicator>=3"
168+
],
169+
"checkId": "contrast",
170+
"concern": "Text and actionable controls meet the accepted local WCAG AA thresholds.",
171+
"failureReason": "",
172+
"passed": true,
173+
"statesCovered": [
174+
"initial-seeded-shell",
175+
"targeted-branch-run",
176+
"normalization-branch-run",
177+
"projection-quality-smoke"
178+
]
179+
},
180+
{
181+
"assertions": [
182+
"prefers-reduced-motion: reduce"
183+
],
184+
"checkId": "reduced-motion",
185+
"concern": "Nonessential transitions are bounded under reduced-motion preference.",
186+
"failureReason": "",
187+
"passed": true,
188+
"statesCovered": [
189+
"initial-seeded-shell",
190+
"targeted-branch-run",
191+
"normalization-branch-run",
192+
"projection-quality-smoke"
193+
]
194+
},
195+
{
196+
"assertions": [
197+
"public-no-private-required",
198+
"reviewer-no-raw-required",
199+
"buyer-no-raw-required"
200+
],
201+
"checkId": "projection-safety",
202+
"concern": "Accessibility checks do not require private artifacts in lower-privilege projections.",
203+
"failureReason": "",
204+
"passed": true,
205+
"statesCovered": [
206+
"initial-seeded-shell",
207+
"targeted-branch-run",
208+
"normalization-branch-run",
209+
"projection-quality-smoke"
210+
]
211+
}
212+
],
213+
"colorScheme": "dark",
214+
"contrastThresholds": {
215+
"focusIndicatorRatio": 3,
216+
"largeTextRatio": 3,
217+
"nonTextUiRatio": 3,
218+
"normalTextRatio": 4.5
219+
},
220+
"disabledControlExemption": "only-controls-not-required-to-complete-accepted-operator-flow",
221+
"engine": "deterministic-dom-accessibility-contract",
222+
"fixtureSeed": "engi-demo-v20-quality-fixture-v1",
223+
"generatedAt": "2026-04-09T23:08:15-03:00",
224+
"generatorId": "engi-demo.proven-generator.v1",
225+
"locale": "en-US",
226+
"missingCheckIds": [],
227+
"passed": true,
228+
"projectionPrincipals": [
229+
"public",
230+
"reviewer",
231+
"buyer",
232+
"internal"
233+
],
234+
"proofSourceCommit": "2f3fb17983223d6951c257be9bfa663419bdfd7e",
235+
"qualityRunnerId": "engi-demo.v20-quality-runner.v1",
236+
"reducedMotion": "reduce",
237+
"replayContext": {
238+
"browserContext": {
239+
"engine": "chromium",
240+
"execution": "deterministic-local-browser",
241+
"network": "loopback-only",
242+
"variancePolicy": "canonical-artifacts-use-normalized-classes"
243+
},
244+
"colorScheme": "dark",
245+
"fixtureSeed": "engi-demo-v20-quality-fixture-v1",
246+
"generatedAt": "2026-04-09T23:08:15-03:00",
247+
"generatorId": "engi-demo.proven-generator.v1",
248+
"locale": "en-US",
249+
"proofSourceCommit": "2f3fb17983223d6951c257be9bfa663419bdfd7e",
250+
"qualityRunnerId": "engi-demo.v20-quality-runner.v1",
251+
"reducedMotion": "reduce",
252+
"timezone": "UTC",
253+
"version": "V20",
254+
"viewport": {
255+
"height": 1200,
256+
"width": 1440
257+
},
258+
"worktreeState": "clean"
259+
},
260+
"reportId": "v20-accessibility-report",
261+
"requiredCheckIds": [
262+
"control-names",
263+
"form-labeling",
264+
"keyboard-operation",
265+
"focus-order",
266+
"focus-visibility",
267+
"status-announcements",
268+
"landmarks-and-sections",
269+
"toggle-state",
270+
"contrast",
271+
"reduced-motion",
272+
"projection-safety"
273+
],
274+
"scenarioIds": [
275+
"auth-issuer-rollback",
276+
"rust-validator-proof-gap",
277+
"config-policy-precedence-incident",
278+
"unsafe-patch-review-recovery",
279+
"infra-deployment-mismatch",
280+
"privacy-boundary-proof-export",
281+
"polyglot-gateway-benchmark-remediation",
282+
"auth-many-asset-normalization"
283+
],
284+
"timezone": "UTC",
285+
"version": "V20",
286+
"viewport": {
287+
"height": 1200,
288+
"width": 1440
289+
},
290+
"worktreeState": "clean"
291+
}

0 commit comments

Comments
 (0)