|
1 | 1 | # SPDX-License-Identifier: MPL-2.0 |
2 | | -# Adjustfile — Accessibility Contract for Burble |
3 | | -# Author: Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk> |
4 | | -# |
5 | | -# Accessibility requirements and compliance for Burble. |
6 | | -# Voice-first design must be inclusive for all users. |
7 | | -# |
8 | | -# Run with: adjust check |
9 | | -# Fix with: adjust fix (where deterministic fix exists) |
| 2 | +# Adjustfile (A2ML Canonical) |
| 3 | +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) |
10 | 4 |
|
11 | 5 | @abstract: |
12 | | -Accessibility requirements and compliance for the Burble voice-first communications platform. |
13 | | -These requirements ensure Burble is usable by everyone, regardless of ability. |
| 6 | +Adaptive-maintenance contract for Echidna. When an upstream dep, |
| 7 | +toolchain, prover binary, schema, or external API shifts, this file |
| 8 | +declares the migration sequence. Each adjustment is an error code, a |
| 9 | +probe to detect drift, and the deterministic-fix-or-defer recipe. |
| 10 | + |
| 11 | +Error-code namespace: A### |
| 12 | +Run with: just adjust-check |
| 13 | +Apply (where deterministic) with: just adjust-apply |
14 | 14 | @end |
15 | 15 |
|
16 | | -## Keyboard Accessibility |
17 | | - |
18 | | -### keyboard-navigation |
19 | | -- description: All features accessible via keyboard |
20 | | -- status: partial |
21 | | -- probe: test -f server/lib/burble/accessibility/keyboard.ex |
22 | | -- compliance: WCAG 2.1 AA |
23 | | -- notes: Basic navigation implemented. Full keyboard-only flow needed. |
24 | | -- fix: Port PanLL's comprehensive keyboard navigation system |
25 | | - |
26 | | -### custom-keybindings |
27 | | -- description: User-configurable keybindings |
28 | | -- status: implemented |
29 | | -- probe: test -f server/lib/burble/accessibility/keyboard.ex |
30 | | -- compliance: WCAG 2.1 AAA |
31 | | -- notes: Users can remap PTT, mute, deafen, volume, and room navigation keys |
32 | | - |
33 | | -### keyboard-shortcuts-discoverable |
34 | | -- description: Keyboard shortcuts are documented and discoverable |
35 | | -- status: missing |
36 | | -- compliance: WCAG 2.1 A |
37 | | -- fix: Add keyboard shortcuts help modal in web client |
38 | | - |
39 | | -## Visual Accessibility |
40 | | - |
41 | | -### high-contrast-mode |
42 | | -- description: High contrast UI theme |
43 | | -- status: missing |
44 | | -- compliance: WCAG 2.1 AA |
45 | | -- fix: Port PanLL's high-contrast theme system |
46 | | -- target: CSS variables for contrast ratios >= 4.5:1 |
47 | | - |
48 | | -### colorblind-support |
49 | | -- description: Colorblind-friendly color schemes |
50 | | -- status: missing |
51 | | -- compliance: WCAG 2.1 AA |
52 | | -- fix: Implement deuteranopia, protanopia, and tritanopia palettes |
53 | | -- reference: PanLL's palette system |
54 | | - |
55 | | -### font-size-adjustment |
56 | | -- description: Resizable UI fonts (4 levels: 14-20px) |
57 | | -- status: missing |
58 | | -- compliance: WCAG 2.1 AA |
59 | | -- fix: Port PanLL's font size adjustment system |
60 | | -- target: User preference persists across sessions |
61 | | - |
62 | | -### theme-switching |
63 | | -- description: Dark/Light/System theme support |
64 | | -- status: missing |
65 | | -- compliance: WCAG 2.1 AA |
66 | | -- fix: Port PanLL's theme system |
67 | | -- target: Respects OS preference, user override |
68 | | - |
69 | | -## Auditory Accessibility |
70 | | - |
71 | | -### screen-reader-support |
72 | | -- description: Full screen reader compatibility |
73 | | -- status: partial |
74 | | -- probe: test -f server/lib/burble/accessibility/screen_reader.ex |
75 | | -- compliance: WCAG 2.1 AA |
76 | | -- notes: Basic announcements implemented. Needs ARIA attributes and live regions. |
77 | | -- fix: Complete ARIA implementation in web client |
78 | | - |
79 | | -### closed-captions |
80 | | -- description: Real-time captioning for voice chat |
81 | | -- status: missing |
82 | | -- compliance: WCAG 2.1 AA |
83 | | -- notes: Requires Web Speech API or external STT integration |
84 | | -- target: 90%+ accuracy for English, configurable display |
85 | | - |
86 | | -### visual-notifications |
87 | | -- description: Visual indicators for audio events |
88 | | -- status: missing |
89 | | -- compliance: WCAG 2.1 A |
90 | | -- notes: Speaking indicators, mute status, connection status |
91 | | -- fix: Add visual cues that duplicate audio information |
92 | | - |
93 | | -### volume-normalization |
94 | | -- description: Consistent volume levels across users |
95 | | -- status: missing |
96 | | -- compliance: WCAG 2.1 AA |
97 | | -- notes: Prevents sudden loud sounds for sensitive users |
98 | | -- target: -23 LUFS normalization per EBU R128 |
99 | | - |
100 | | -## Motor Accessibility |
101 | | - |
102 | | -### voice-commands |
103 | | -- description: Voice-controlled interface |
104 | | -- status: missing |
105 | | -- compliance: WCAG 2.1 AAA |
106 | | -- notes: "Mute", "Deafen", "Join room X", "Volume up/down" |
107 | | -- target: Web Speech API with fallback to keyboard |
108 | | - |
109 | | -### reduced-motion |
110 | | -- description: Reduced animation options |
111 | | -- status: missing |
112 | | -- compliance: WCAG 2.1 AA |
113 | | -- fix: Port PanLL's animation control (on/reduced/off) |
114 | | -- target: Respects prefers-reduced-motion media query |
115 | | - |
116 | | -### hover-alternatives |
117 | | -- description: All hover interactions have click alternatives |
118 | | -- status: partial |
119 | | -- compliance: WCAG 2.1 AA |
120 | | -- notes: Some hover tooltips need click-to-show option |
121 | | -- fix: Audit and add click alternatives |
122 | | - |
123 | | -## Cognitive Accessibility |
124 | | - |
125 | | -### clear-language |
126 | | -- description: Simple, consistent terminology |
127 | | -- status: partial |
128 | | -- compliance: WCAG 2.1 AAA |
129 | | -- notes: Technical terms need plain language explanations |
130 | | -- fix: Add tooltips/glossary for jargon |
131 | | - |
132 | | -### predictable-navigation |
133 | | -- description: Consistent navigation patterns |
134 | | -- status: partial |
135 | | -- compliance: WCAG 2.1 AA |
136 | | -- notes: Navigation structure varies between pages |
137 | | -- fix: Standardize navigation layout |
138 | | - |
139 | | -### error-prevention |
140 | | -- description: Confirmation for destructive actions |
141 | | -- status: partial |
142 | | -- compliance: WCAG 2.1 AA |
143 | | -- notes: Room deletion has confirmation, others may not |
144 | | -- fix: Audit all destructive actions |
145 | | - |
146 | | -### help-availability |
147 | | -- description: Context-sensitive help always available |
148 | | -- status: missing |
149 | | -- compliance: WCAG 2.1 AAA |
150 | | -- notes: No persistent help system |
151 | | -- fix: Add help button with contextual guidance |
152 | | - |
153 | | -## Compliance Targets |
154 | | - |
155 | | -### wcag-2.1-aa |
156 | | -- description: WCAG 2.1 AA compliance |
157 | | -- status: partial |
158 | | -- target: Full compliance by Q4 2026 |
159 | | -- tracking: https://github.com/hyperpolymath/burble/issues/XXX |
160 | | - |
161 | | -### section-508 |
162 | | -- description: U.S. Section 508 compliance |
163 | | -- status: partial |
164 | | -- target: Full compliance by Q4 2026 |
165 | | -- notes: Aligns with WCAG 2.1 AA for most requirements |
166 | | - |
167 | | -### en-301-549 |
168 | | -- description: EU EN 301 549 compliance |
169 | | -- status: partial |
170 | | -- target: Full compliance by Q4 2026 |
171 | | -- notes: EU public sector procurement requirement |
172 | | - |
173 | | -## Integration Requirements |
174 | | - |
175 | | -### panll-accessibility-port |
176 | | -- description: Port PanLL's accessibility engine to Burble |
177 | | -- status: planned |
178 | | -- reference: /var/mnt/eclipse/repos/panll/tests/accessibility_engine_test.js |
179 | | -- target: Q2 2026 |
180 | | - |
181 | | -### k9-accessibility-validator |
182 | | -- description: Integrate K9 accessibility validator |
183 | | -- status: planned |
184 | | -- reference: /var/mnt/eclipse/repos/panll/contractiles/k9/validators/accessibility-baseline.k9.ncl |
185 | | -- target: Q2 2026 |
186 | | - |
187 | | -### accessibility-testing |
188 | | -- description: Add accessibility tests to CI/CD |
189 | | -- status: planned |
190 | | -- target: pa11y or axe-core integration |
191 | | -- compliance: Automated WCAG testing |
192 | | - |
193 | | -## Documentation Requirements |
194 | | - |
195 | | -### accessibility-guide |
196 | | -- description: User-facing accessibility guide |
197 | | -- status: missing |
198 | | -- target: docs/accessibility/USER-GUIDE.adoc |
199 | | -- notes: Keyboard shortcuts, screen reader setup, theme switching |
200 | | - |
201 | | -### developer-accessibility |
202 | | -- description: Developer accessibility guidelines |
203 | | -- status: missing |
204 | | -- target: docs/accessibility/DEVELOPER.adoc |
205 | | -- notes: Coding standards, testing requirements, compliance checklist |
206 | | - |
207 | | -### compliance-report |
208 | | -- description: Accessibility compliance report |
209 | | -- status: missing |
210 | | -- target: docs/compliance/ACCESSIBILITY.adoc |
211 | | -- notes: VPAT (Voluntary Product Accessibility Template) |
| 16 | +@requires: |
| 17 | +- section: Toolchain-Adjust |
| 18 | +- section: Dep-Adjust |
| 19 | +- section: Schema-Adjust |
| 20 | +- section: Prover-Adjust |
| 21 | +- section: Workflow-Adjust |
| 22 | +@end |
| 23 | + |
| 24 | +## Toolchain-Adjust |
| 25 | + |
| 26 | +### A001-rust-toolchain-drift |
| 27 | +- description: rust-toolchain.toml pin behind current stable |
| 28 | +- probe: rustc --version | grep -q $(cat rust-toolchain.toml 2>/dev/null | grep channel | cut -d'"' -f2) |
| 29 | +- severity: low |
| 30 | +- adjust: bump rust-toolchain.toml to current stable; run `cargo update --workspace` to refresh transitives |
| 31 | +- defer-if: any pinned-feature crate breaks on bump |
| 32 | + |
| 33 | +### A002-julia-channel-drift |
| 34 | +- description: juliaup default channel mismatches Project.toml `julia` compat |
| 35 | +- probe: julia --version | grep -q "$(grep -E '^julia = ' src/julia/Project.toml | cut -d'"' -f2 | head -1)" |
| 36 | +- severity: low |
| 37 | +- adjust: juliaup default release ; juliaup update |
| 38 | +- defer-if: a key dep (Flux, CUDA, GNN) doesn't yet support new Julia |
| 39 | + |
| 40 | +### A003-chapel-version-bump |
| 41 | +- description: chapel-ci.yml pin behind upstream |
| 42 | +- probe: grep -E '^CHAPEL_VERSION:' .github/workflows/chapel-ci.yml | grep -q '2.8.0' |
| 43 | +- severity: medium |
| 44 | +- adjust: bump CHAPEL_VERSION env in chapel-ci.yml ; verify .deb URL + SHA via curl |
| 45 | +- defer-if: existing chapel source uses removed syntax (out/label keywords, char-quote rules) |
| 46 | + |
| 47 | +### A004-idris2-version-drift |
| 48 | +- description: idris2 binary doesn't match src/abi/echidnaabi.ipkg pin |
| 49 | +- probe: idris2 --version | grep -q "0.8.0" |
| 50 | +- severity: medium |
| 51 | +- adjust: install matching idris2 via guix or upstream binary |
| 52 | +- defer-if: 0.8.0 reserved-keyword rules break src/abi/ (see [[reference_idris2_0_8_0_reserved_keywords]]) |
| 53 | + |
| 54 | +### A005-zig-version-drift |
| 55 | +- description: zig binary doesn't match ffi/zig pin |
| 56 | +- probe: zig version | grep -q "0.15" |
| 57 | +- severity: low |
| 58 | +- adjust: install matching zig version |
| 59 | +- defer-if: 0.15 breaking changes hit ffi/zig (see [[reference_zig_015_breaking_changes]]) |
| 60 | + |
| 61 | +## Dep-Adjust |
| 62 | + |
| 63 | +### A010-cargo-deps-major-bump-available |
| 64 | +- description: a tracked Cargo dep has a major bump available |
| 65 | +- probe: cargo outdated --workspace --depth 1 2>/dev/null | grep -E '^\w+\s+\S+\s+\S+\s+\d' | head -5 |
| 66 | +- severity: low |
| 67 | +- adjust: review changelog; bump via `cargo update -p <crate> --precise <new>`; run full test suite |
| 68 | +- defer-if: major bump introduces API break with no migration path (nom 7→8, rand 0.9→0.10 examples) |
| 69 | + |
| 70 | +### A011-julia-pkg-major-bump-available |
| 71 | +- description: a tracked Julia pkg has a compat-bound bump available |
| 72 | +- probe: julia --project=src/julia -e 'using Pkg; Pkg.status(outdated=true)' 2>&1 | grep -q '⌃' |
| 73 | +- severity: low |
| 74 | +- adjust: review upstream NEWS; bump `[compat]` in Project.toml; Pkg.resolve() |
| 75 | +- defer-if: GNN-stack (Flux/CUDA/GraphNeuralNetworks) interlock requires waiting on co-bump |
| 76 | + |
| 77 | +### A012-dependabot-pr-backlog |
| 78 | +- description: open dependabot PRs accumulating |
| 79 | +- probe: gh pr list --repo hyperpolymath/echidna --author 'app/dependabot' --state open --limit 50 --json number | jq 'length' | grep -q '^0$' |
| 80 | +- severity: low |
| 81 | +- adjust: triage with `just blocked-pr-triage` style sweep; auto-merge low-risk patches |
| 82 | +- defer-if: dependabot phantom-version (e.g. rand 0.10 not on crates.io) |
| 83 | + |
| 84 | +## Schema-Adjust |
| 85 | + |
| 86 | +### A020-capnp-schema-out-of-sync |
| 87 | +- description: crates/echidna-wire/schemas/*.capnp changed but bindings stale |
| 88 | +- probe: git diff --quiet HEAD~10 crates/echidna-wire/schemas/ && git diff --quiet HEAD~10 crates/echidna-wire/src/ |
| 89 | +- severity: high |
| 90 | +- adjust: just capnp-gen ; verify Rust/Julia/Idris2/Zig/AffineScript bindings all regenerated |
| 91 | +- defer-if: schema bump requires owner approval (Cap'n Proto IPC is owner-gated per #194) |
| 92 | + |
| 93 | +### A021-graphql-sdl-no-export |
| 94 | +- description: src/interfaces/graphql/schema.rs changed but no SDL file tracked |
| 95 | +- probe: test -f src/interfaces/graphql/schema.graphql |
| 96 | +- severity: medium |
| 97 | +- adjust: cargo test --package echidna-graphql export_schema (writes schema.graphql) ; commit it |
| 98 | +- defer-if: schema considered internal-only |
| 99 | + |
| 100 | +### A022-openapi-spec-drift |
| 101 | +- description: REST handlers changed but OpenAPI spec stale |
| 102 | +- probe: test -f src/interfaces/rest/openapi.json && cargo run -- export-openapi 2>/dev/null | diff -q - src/interfaces/rest/openapi.json |
| 103 | +- severity: medium |
| 104 | +- adjust: regenerate via aide / utoipa ; commit ; CI diff-gate |
| 105 | +- defer-if: aide/utoipa not yet adopted; file follow-up to wire |
| 106 | + |
| 107 | +### A023-verisim-er-schema-drift |
| 108 | +- description: crates/echidna-wire/schemas/verisim_er.capnp diverged from docs/architecture/VERISIM-ER-SCHEMA.md crosswalk table |
| 109 | +- probe: diff <(grep -E '^\| .+ \| .+ \|' docs/architecture/VERISIM-ER-SCHEMA.md) <(parse schema → rows) |
| 110 | +- severity: high |
| 111 | +- adjust: update whichever lags; both must move together |
| 112 | +- defer-if: VerisimDB upstream schema is itself in flux (federation pending) |
| 113 | + |
| 114 | +## Prover-Adjust |
| 115 | + |
| 116 | +### A030-new-prover-added-upstream |
| 117 | +- description: an upstream prover repo bumped to a new release |
| 118 | +- probe: scripts/provision_corpora.sh --status | grep -E 'ahead' | head -1 |
| 119 | +- severity: low |
| 120 | +- adjust: pin new tag in scripts/provision_corpora.sh ; just provision-corpora ; just corpus-ingest-saturation <name> ; retrain |
| 121 | +- defer-if: upstream release breaks the extractor (file in src/rust/corpus/<name>.rs) |
| 122 | + |
| 123 | +### A031-prover-kind-enum-expansion |
| 124 | +- description: a new prover backend is wanted (ProverKind::all_core gap) |
| 125 | +- probe: manual — owner identifies |
| 126 | +- severity: medium |
| 127 | +- adjust: add variant to ProverKind enum; implement ProverBackend trait; wire ProverFactory::create; tier-assign in docs/PROVER_COUNT.md |
| 128 | +- defer-if: prover lacks open-source binary distribution |
| 129 | + |
| 130 | +## Workflow-Adjust |
| 131 | + |
| 132 | +### A040-standards-reusable-sha-stale |
| 133 | +- description: a standards-reusable workflow caller is behind current main |
| 134 | +- probe: grep -rE 'uses: hyperpolymath/standards/.+@[0-9a-f]{40}' .github/workflows/ | while read l; do sha=$(echo "$l" | grep -oE '[0-9a-f]{40}'); current=$(gh api repos/hyperpolymath/standards/commits/main --jq .sha); [ "$sha" = "$current" ] || echo STALE; done | head -1 |
| 135 | +- severity: low |
| 136 | +- adjust: bump SHA pin; verify the SHA exists via `gh api repos/hyperpolymath/standards/commits/<sha>` |
| 137 | +- defer-if: a recent reusable change introduces breaking input shape |
| 138 | + |
| 139 | +### A041-action-sha-pin-fake |
| 140 | +- description: a 3rd-party action SHA pin is fake (does not exist upstream) |
| 141 | +- probe: scripts/verify-action-shas.sh 2>&1 | grep -q 'FAKE' |
| 142 | +- severity: critical |
| 143 | +- adjust: replace with current real SHA via `gh api repos/<org>/<action>/commits/<branch>` |
| 144 | +- defer-if: never — fake SHA is a supply-chain hazard |
| 145 | + |
| 146 | +### A042-codeql-cron-drift |
| 147 | +- description: codeql cron drifted from standards canonical schedule (monthly per cut 3) |
| 148 | +- probe: grep -A 2 '^on:' .github/workflows/codeql.yml | grep -q 'cron.*0 0 1 \*' |
| 149 | +- severity: low |
| 150 | +- adjust: bump to '0 0 1 * *' monthly; or drop file entirely and let standards reusable provide |
| 151 | +- defer-if: project-specific gate requires more frequent scan |
| 152 | + |
| 153 | +@adjust-philosophy: |
| 154 | +- always check before adjust (every recipe has both) |
| 155 | +- never adjust without an explicit defer-if escape hatch |
| 156 | +- adjustments cascade: bump rust → cargo update → check tests → check ABI → check container |
| 157 | +- prefer the narrowest change that resolves the drift |
| 158 | +@end |
0 commit comments