You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 3e92bb4
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: docs/OPERATIONAL_INTEGRITY.md
+48-1Lines changed: 48 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,54 @@ Issues 202–205 add four small, dependency-free contracts used at operational b
4
4
5
5
-`createAuditEvidenceBundle` exports a redacted audit slice with a deterministic digest. `verifyAuditEvidenceBundle` must pass before an investigation bundle is trusted.
6
6
-`compareConfigurationContracts` checks that every environment contains the same production-critical configuration keys and reports the environment/key pair that is missing or unexpected.
7
-
-`createSideEffectDispatcher` persists idempotency keys, replays an existing job instead of enqueueing a duplicate, and moves failures to a dead-letter state after the bounded retry budget.
7
+
-`createSideEffectDispatcher` persists idempotency keys, replays an existing job instead of enqueuing a duplicate, and moves failures to a dead-letter state after the bounded retry budget.
8
8
-`checkSchemaEvolution` rejects non-increasing versions and changes to required field types. `validateSchemaRecord` protects stored records and API responses at their boundary.
9
9
10
10
All four APIs accept injected storage or deterministic inputs, so contract tests can run without a network, secrets, or a production database.
11
+
12
+
## Accessibility regression coverage
13
+
14
+
The accessibility suite guards the dense forms, tables, and error recovery flows used by the utility tools, transaction inspector, and Soroban diagnostics workflows. It runs with the existing test runner and does not change public APIs, schemas, or user-facing behavior.
15
+
16
+
### What is covered
17
+
18
+
-`**Keyboard navigation**: dense forms are traversed in document order with Tab/Shift+Tab, submit actions are reachable from the keyboard, and table rows expose their actions without a pointer.`
19
+
-`**Focus management**: focus moves to the first invalid field on validation failure, returns to the trigger on cancel, and is trapped in modal dialogs until dismissed.`
20
+
-`**Screen-reader announcements**: error summaries are exposed through `_role="alert"` and `_role="status"` live regions, table captions and headers are associated, and form controls retain accessible names.`
21
+
-`**Reduced motion**: with `prefers-reduced-motion: reduce` the flow remains usable and no animation-dependent state is lost.`
22
+
-**Error recovery**: transient failures surface a retry affordance, retry restores the previous inputs, and terminal failures announce a recovery path without losing focus context.
23
+
24
+
### How to run
25
+
26
+
The accessibility regression tests live alongside the existing contract tests and run with the repository test command:
27
+
28
+
```sh
29
+
npm test -- accessibility
30
+
```
31
+
32
+
The suite is deterministic: it uses injected dom fixtures and mocked media queries, so it needs no network, secrets, or production database.
33
+
34
+
## Operational edge cases
35
+
36
+
- Empty or single-row tables must still expose a caption and header relationships.
37
+
- Forms with conditionally hidden fields (for example, Soroban diagnostic options) must not leave focus on a hidden control.
38
+
- Error recovery must preserve user input across retry and must not duplicate announcements when the same error repeats.
39
+
- Reduced-motion preferences may change at runtime; the flow must respond without a reload.
40
+
- Table sorting and filtering must announce the new result count without stealing focus from the control that triggered it.
41
+
42
+
## Failure modes
43
+
44
+
- A regression in focus order or announcement content fails the suite before merge.
45
+
- Missing live regions or labels fail the screen-reader assertions.
46
+
- Animation-dependent state fails the reduced-motion assertions.
47
+
- Error recovery that loses input or focus context fails the recovery assertions.
48
+
49
+
## Rollback and recovery
50
+
51
+
If an accessibility regression is detected in production:
52
+
53
+
1. Revert the offending UI change to the last known-good revision; the suite is pure test coverage and requires no data migration.
54
+
2. Re-run `npm test -- accessibility` to confirm the baseline passes.
55
+
3. Reproduce the failure with the added case before reintroducing the change.
56
+
4. If the failure involves announcements or focus in a live workflow, disable the affected flow behind its existing feature flag until the fix ships.
57
+
5. Record the incident and the added regression case in the changelog so the coverage gap cannot silently return.
0 commit comments