Skip to content

Commit acafce8

Browse files
Jonathan D.A. Jewellclaude
andcommitted
feat: integrate accessibilitybot into fleet ecosystem
Add Accessibilitybot to BotId enum as a Tier 2 Finisher for WCAG compliance validation. Update all integration points: shared-context BotId, BotInfo, fleet-cli parser, fleet-coordinator deployment status, and K9 deployment config with bot workflows. Finding categories: accessibility/wcag-a, accessibility/wcag-aa, accessibility/wcag-aaa, accessibility/aria, accessibility/css Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent c1e6a1e commit acafce8

5 files changed

Lines changed: 58 additions & 4 deletions

File tree

deploy-bot-fleet.k9.ncl

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,13 @@ config = {
5353
finishbot = {
5454
enabled | Bool = true,
5555
description = "Release readiness validation",
56-
priority | Number = 6, # Lowest priority (final checks)
56+
priority | Number = 6,
57+
},
58+
59+
accessibilitybot = {
60+
enabled | Bool = true,
61+
description = "WCAG 2.3 AAA accessibility compliance",
62+
priority | Number = 7, # After finishbot, before executor
5763
},
5864
},
5965

@@ -182,6 +188,28 @@ bot_workflows = {
182188
"add_changelog_entry",
183189
],
184190
},
191+
192+
accessibilitybot = {
193+
description = "WCAG 2.3 AAA accessibility compliance workflow",
194+
enabled = config.bots.accessibilitybot.enabled,
195+
workflow_file = ".github/workflows/accessibilitybot.yml",
196+
checks = [
197+
"wcag_a_conformance",
198+
"wcag_aa_conformance",
199+
"wcag_aaa_conformance",
200+
"aria_usage",
201+
"css_accessibility",
202+
"keyboard_navigation",
203+
"color_contrast",
204+
"alt_text",
205+
],
206+
auto_fix_items = [
207+
"add_aria_labels",
208+
"fix_color_contrast",
209+
"add_alt_text",
210+
"fix_heading_hierarchy",
211+
],
212+
},
185213
}
186214

187215
# Just recipes for deployment
@@ -332,6 +360,7 @@ recipes = {
332360
(if config.bots.glambot.enabled then "echo ' ✓ glambot (presentation)'" else ""),
333361
(if config.bots.seambot.enabled then "echo ' ✓ seambot (integration)'" else ""),
334362
(if config.bots.finishbot.enabled then "echo ' ✓ finishbot (release readiness)'" else ""),
363+
(if config.bots.accessibilitybot.enabled then "echo ' ✓ accessibilitybot (WCAG compliance)'" else ""),
335364
"echo ''",
336365
"echo 'Mode: %{std.string.from config.deployment.mode}'",
337366
"echo 'Organization: %{config.github_org}'",
@@ -349,6 +378,7 @@ validation = {
349378
|| config.bots.glambot.enabled
350379
|| config.bots.seambot.enabled
351380
|| config.bots.finishbot.enabled
381+
|| config.bots.accessibilitybot.enabled
352382
| doc "At least one bot must be enabled",
353383

354384
# Deployment mode must be valid

fleet-coordinator.sh

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,9 @@ BOT EXECUTION ORDER (from bot_integration.lgt):
4545
4. glambot (Finisher - accessibility, SEO) [depends: rhodibot]
4646
5. seambot (Finisher - integration) [depends: rhodibot, echidnabot]
4747
6. finishbot (Finisher - release, quality) [depends: rhodibot, glambot]
48-
7. robot-repo-automaton (Executor - fixes)
49-
8. hypatia (Engine - rule coordination)
48+
7. accessibilitybot (Finisher - WCAG compliance) [depends: rhodibot, glambot]
49+
8. robot-repo-automaton (Executor - fixes)
50+
9. hypatia (Engine - rule coordination)
5051
EOF
5152
}
5253

@@ -549,6 +550,7 @@ deploy_bots() {
549550
"glambot": {"status": "ready", "tier": "finisher"},
550551
"seambot": {"status": "ready", "tier": "finisher"},
551552
"finishbot": {"status": "ready", "tier": "finisher"},
553+
"accessibilitybot": {"status": "ready", "tier": "finisher"},
552554
"robot-repo-automaton": {"status": "ready", "tier": "executor"},
553555
"hypatia": {"status": "ready", "tier": "engine"}
554556
}

shared-context/fleet-cli/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,7 @@ fn parse_bot_id(name: &str) -> Option<BotId> {
310310
"finishbot" => Some(BotId::Finishbot),
311311
"robot-repo-automaton" | "robot" => Some(BotId::RobotRepoAutomaton),
312312
"hypatia" => Some(BotId::Hypatia),
313+
"accessibilitybot" | "accessibility-bot" => Some(BotId::Accessibilitybot),
313314
_ => None,
314315
}
315316
}

shared-context/src/bot.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ pub enum BotId {
2424
RobotRepoAutomaton,
2525
/// Neurosymbolic CI/CD intelligence platform
2626
Hypatia,
27+
/// WCAG accessibility compliance validator
28+
Accessibilitybot,
2729
/// Custom/external bot
2830
Custom(u32),
2931
}
@@ -39,6 +41,7 @@ impl fmt::Display for BotId {
3941
BotId::Finishbot => write!(f, "finishbot"),
4042
BotId::RobotRepoAutomaton => write!(f, "robot-repo-automaton"),
4143
BotId::Hypatia => write!(f, "hypatia"),
44+
BotId::Accessibilitybot => write!(f, "accessibilitybot"),
4245
BotId::Custom(id) => write!(f, "custom-{}", id),
4346
}
4447
}
@@ -49,7 +52,7 @@ impl BotId {
4952
pub fn tier(&self) -> Tier {
5053
match self {
5154
BotId::Rhodibot | BotId::Echidnabot | BotId::Sustainabot => Tier::Verifier,
52-
BotId::Glambot | BotId::Seambot | BotId::Finishbot => Tier::Finisher,
55+
BotId::Glambot | BotId::Seambot | BotId::Finishbot | BotId::Accessibilitybot => Tier::Finisher,
5356
BotId::RobotRepoAutomaton => Tier::Executor,
5457
BotId::Hypatia => Tier::Engine,
5558
BotId::Custom(_) => Tier::Custom,
@@ -67,6 +70,7 @@ impl BotId {
6770
BotId::Finishbot,
6871
BotId::RobotRepoAutomaton,
6972
BotId::Hypatia,
73+
BotId::Accessibilitybot,
7074
]
7175
}
7276

@@ -81,6 +85,7 @@ impl BotId {
8185
"finishbot" | "finishingbot" | "finishing-bot" => Some(BotId::Finishbot),
8286
"robot-repo-automaton" | "robotrepoautomaton" => Some(BotId::RobotRepoAutomaton),
8387
"hypatia" | "cicd-hyper-a" | "cicdhypera" => Some(BotId::Hypatia),
88+
"accessibilitybot" | "accessibility-bot" => Some(BotId::Accessibilitybot),
8489
_ => None,
8590
}
8691
}
@@ -252,6 +257,21 @@ impl BotInfo {
252257
can_fix: false, // Engine provides rules, doesn't directly fix
253258
depends_on: vec![], // Engine is the root, no dependencies
254259
},
260+
BotId::Accessibilitybot => Self {
261+
id,
262+
name: "Accessibilitybot".to_string(),
263+
description: "WCAG 2.3 AAA accessibility compliance validator".to_string(),
264+
version: "0.1.0".to_string(),
265+
categories: vec![
266+
"accessibility/wcag-a".to_string(),
267+
"accessibility/wcag-aa".to_string(),
268+
"accessibility/wcag-aaa".to_string(),
269+
"accessibility/aria".to_string(),
270+
"accessibility/css".to_string(),
271+
],
272+
can_fix: true,
273+
depends_on: vec![BotId::Rhodibot, BotId::Glambot],
274+
},
255275
BotId::Custom(_) => Self {
256276
id,
257277
name: "Custom Bot".to_string(),

shared-context/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
//! - `glambot` - Presentation quality
1818
//! - `seambot` - Integration testing
1919
//! - `finishbot` - Release readiness
20+
//! - `accessibilitybot` - WCAG accessibility compliance
2021
//!
2122
//! ## Usage
2223
//!

0 commit comments

Comments
 (0)