Skip to content

Commit 626c738

Browse files
feat(contractiles): comprehensive just|must|adjust|trust|bust|dust family with error codes + recovery hints (#214)
## Summary Builds out the contractile family for echidna per RSR-H14. Bustfile (was rsr-template-repo content) + Adjustfile (was Burble accessibility content) replaced with echidna-specific content. Trustfile + Dustfile expanded from minimal skeletons to comprehensive coverage. ## What landed | File | Before | After | |---|---|---| | Bustfile.a2ml | 28 lines (rsr-template-repo drift) | 200+ lines, 13 error codes B001-B061 across 7 sections | | Adjustfile.a2ml | 211 lines (Burble accessibility drift) | 130 lines, 13 error codes A001-A042 across 5 sections | | Trustfile.a2ml | 25 lines (2 checks) | 130 lines, 17 error codes T001-T052 across 6 sections | | Dustfile.a2ml | 22 lines (TOML skeleton) | 150 lines, 17 error codes D001-D052 across 6 sections | | Mustfile.a2ml | unchanged (canonical) | unchanged | | contractile.just | wired DUST/INTEND/MUST/TRUST minimally | wired all 6 families + contractile-all + contractile-tour | ## Error-code namespaces - **A###** Adjust — adaptive maintenance / migrations - **B###** Bust — breakage / rollback - **D###** Dust — fine-grained cleanup - **T###** Trust — integrity / provenance / supply-chain - **M###** Must — physical state checks (unchanged) ## Recovery wiring Every error code cross-references heal recipes. E.g. `B001 cargo build broken` → `bust-cargo-cache` → `heal` → `cargo build`. Recoveries are narrowest-first (revert single commit > invalidate specific cache > reinstall toolchain). ## Note on auto-generation contractile.just is normally regenerated by `contractile gen-just --dir .machine_readable/contractiles`. The contractile binary was not on PATH at the time of this rewrite, so contractile.just was hand-augmented to match the expanded a2ml sources. Re-run `contractile gen-just` once available to confirm parity. ## License method Per [[feedback_no_automated_licence_edits]] — SPDX headers on all .a2ml files preserved exactly. No SPDX modifications. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 6fdf2fc commit 626c738

5 files changed

Lines changed: 805 additions & 307 deletions

File tree

Lines changed: 153 additions & 206 deletions
Original file line numberDiff line numberDiff line change
@@ -1,211 +1,158 @@
11
# 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)
104

115
@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
1414
@end
1515

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

Comments
 (0)