Skip to content

Commit 487886c

Browse files
Jonathan D.A. Jewellclaude
andcommitted
feat: integrate robot-repo-automaton into fleet ecosystem
Add robot-repo-automaton as Tier 3 Executor in the K9 deployment config, bot workflows, validation, and deployment summary. Update fleet-coordinator and shared-context to fully support the executor tier in orchestration. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent eb153fb commit 487886c

4 files changed

Lines changed: 71 additions & 12 deletions

File tree

deploy-bot-fleet.k9.ncl

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,16 @@ config = {
6262
priority | Number = 7, # After finishbot, before executor
6363
},
6464

65+
cipherbot = {
66+
enabled | Bool = true,
67+
description = "Cryptographic hygiene and post-quantum readiness",
68+
priority | Number = 8, # Specialist tier, after finishers
69+
},
70+
6571
robot_repo_automaton = {
6672
enabled | Bool = true,
6773
description = "Tier 3 Executor - automated fix application with confidence thresholds",
68-
priority | Number = 8, # Executor tier runs after all verifiers and finishers
74+
priority | Number = 9, # Executor tier runs after all verifiers, finishers, and specialists
6975
},
7076
},
7177

@@ -217,6 +223,24 @@ bot_workflows = {
217223
],
218224
},
219225

226+
cipherbot = {
227+
description = "Cryptographic hygiene and post-quantum readiness workflow",
228+
enabled = config.bots.cipherbot.enabled,
229+
workflow_file = ".github/workflows/cipherbot.yml",
230+
checks = [
231+
"hash_algorithm_strength",
232+
"symmetric_cipher_selection",
233+
"key_exchange_protocols",
234+
"signature_scheme_validity",
235+
"password_hashing_compliance",
236+
"post_quantum_readiness",
237+
],
238+
auto_fix_items = [
239+
"upgrade_weak_hash_algorithms",
240+
"add_pq_readiness_markers",
241+
],
242+
},
243+
220244
robot_repo_automaton = {
221245
description = "Tier 3 Executor - automated fix application",
222246
enabled = config.bots.robot_repo_automaton.enabled,
@@ -385,6 +409,7 @@ recipes = {
385409
(if config.bots.seambot.enabled then "echo ' ✓ seambot (integration)'" else ""),
386410
(if config.bots.finishbot.enabled then "echo ' ✓ finishbot (release readiness)'" else ""),
387411
(if config.bots.accessibilitybot.enabled then "echo ' ✓ accessibilitybot (WCAG compliance)'" else ""),
412+
(if config.bots.cipherbot.enabled then "echo ' ✓ cipherbot (crypto hygiene)'" else ""),
388413
(if config.bots.robot_repo_automaton.enabled then "echo ' ✓ robot-repo-automaton (Tier 3 executor)'" else ""),
389414
"echo ''",
390415
"echo 'Mode: %{std.string.from config.deployment.mode}'",
@@ -404,6 +429,7 @@ validation = {
404429
|| config.bots.seambot.enabled
405430
|| config.bots.finishbot.enabled
406431
|| config.bots.accessibilitybot.enabled
432+
|| config.bots.cipherbot.enabled
407433
|| config.bots.robot_repo_automaton.enabled
408434
| doc "At least one bot must be enabled",
409435

fleet-coordinator.sh

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

@@ -551,6 +552,7 @@ deploy_bots() {
551552
"seambot": {"status": "ready", "tier": "finisher"},
552553
"finishbot": {"status": "ready", "tier": "finisher"},
553554
"accessibilitybot": {"status": "ready", "tier": "finisher"},
555+
"cipherbot": {"status": "ready", "tier": "specialist"},
554556
"robot-repo-automaton": {"status": "ready", "tier": "executor"},
555557
"hypatia": {"status": "ready", "tier": "engine"}
556558
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ fn parse_bot_id(name: &str) -> Option<BotId> {
311311
"robot-repo-automaton" | "robot" => Some(BotId::RobotRepoAutomaton),
312312
"hypatia" => Some(BotId::Hypatia),
313313
"accessibilitybot" | "accessibility-bot" => Some(BotId::Accessibilitybot),
314+
"cipherbot" | "cipher-bot" => Some(BotId::Cipherbot),
314315
_ => None,
315316
}
316317
}
@@ -321,6 +322,7 @@ fn tier_name(tier: gitbot_shared_context::Tier) -> &'static str {
321322
Tier::Engine => "Engine",
322323
Tier::Verifier => "Verifier",
323324
Tier::Finisher => "Finisher",
325+
Tier::Specialist => "Specialist",
324326
Tier::Executor => "Executor",
325327
Tier::Custom => "Custom",
326328
}

shared-context/src/bot.rs

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-License-Identifier: PMPL-1.0
1+
// SPDX-License-Identifier: PMPL-1.0-or-later
22
//! Bot identification and metadata
33
44
use serde::{Deserialize, Serialize};
@@ -26,6 +26,8 @@ pub enum BotId {
2626
Hypatia,
2727
/// WCAG accessibility compliance validator
2828
Accessibilitybot,
29+
/// Cryptographic hygiene and post-quantum readiness specialist
30+
Cipherbot,
2931
/// Custom/external bot
3032
Custom(u32),
3133
}
@@ -42,6 +44,7 @@ impl fmt::Display for BotId {
4244
BotId::RobotRepoAutomaton => write!(f, "robot-repo-automaton"),
4345
BotId::Hypatia => write!(f, "hypatia"),
4446
BotId::Accessibilitybot => write!(f, "accessibilitybot"),
47+
BotId::Cipherbot => write!(f, "cipherbot"),
4548
BotId::Custom(id) => write!(f, "custom-{}", id),
4649
}
4750
}
@@ -53,6 +56,7 @@ impl BotId {
5356
match self {
5457
BotId::Rhodibot | BotId::Echidnabot | BotId::Sustainabot => Tier::Verifier,
5558
BotId::Glambot | BotId::Seambot | BotId::Finishbot | BotId::Accessibilitybot => Tier::Finisher,
59+
BotId::Cipherbot => Tier::Specialist,
5660
BotId::RobotRepoAutomaton => Tier::Executor,
5761
BotId::Hypatia => Tier::Engine,
5862
BotId::Custom(_) => Tier::Custom,
@@ -71,6 +75,7 @@ impl BotId {
7175
BotId::RobotRepoAutomaton,
7276
BotId::Hypatia,
7377
BotId::Accessibilitybot,
78+
BotId::Cipherbot,
7479
]
7580
}
7681

@@ -86,6 +91,7 @@ impl BotId {
8691
"robot-repo-automaton" | "robotrepoautomaton" => Some(BotId::RobotRepoAutomaton),
8792
"hypatia" | "cicd-hyper-a" | "cicdhypera" => Some(BotId::Hypatia),
8893
"accessibilitybot" | "accessibility-bot" => Some(BotId::Accessibilitybot),
94+
"cipherbot" | "cipher-bot" => Some(BotId::Cipherbot),
8995
_ => None,
9096
}
9197
}
@@ -99,6 +105,8 @@ pub enum Tier {
99105
Verifier,
100106
/// Second tier - consumes findings, produces results (glambot, seambot, finishbot)
101107
Finisher,
108+
/// Specialist - domain-specific deep analysis (cipherbot)
109+
Specialist,
102110
/// Third tier - executes actions based on findings (robot-repo-automaton)
103111
Executor,
104112
/// Central intelligence layer - coordinates all bots (hypatia)
@@ -111,11 +119,12 @@ impl Tier {
111119
/// Get execution order (lower = earlier)
112120
pub fn execution_order(&self) -> u8 {
113121
match self {
114-
Tier::Engine => 0, // Engine coordinates, runs first
122+
Tier::Engine => 0, // Engine coordinates, runs first
115123
Tier::Verifier => 1,
116124
Tier::Finisher => 2,
117-
Tier::Executor => 3, // Executor runs after verification
118-
Tier::Custom => 4,
125+
Tier::Specialist => 3, // Specialist runs after verifiers/finishers
126+
Tier::Executor => 4, // Executor runs after all analysis
127+
Tier::Custom => 5,
119128
}
120129
}
121130

@@ -224,13 +233,17 @@ impl BotInfo {
224233
BotId::Finishbot => Self {
225234
id,
226235
name: "Finishing Bot".to_string(),
227-
description: "Release readiness - placeholders, licenses, claims".to_string(),
236+
description: "Tier 2 Finisher - completeness analysis and release readiness".to_string(),
228237
version: "0.1.0".to_string(),
229238
categories: vec![
230-
"license".to_string(),
231-
"placeholder".to_string(),
232-
"claims".to_string(),
233-
"release".to_string(),
239+
"completeness/license".to_string(),
240+
"completeness/placeholder".to_string(),
241+
"completeness/claims".to_string(),
242+
"completeness/release".to_string(),
243+
"completeness/scm".to_string(),
244+
"completeness/testing".to_string(),
245+
"completeness/tooling".to_string(),
246+
"completeness/v1-readiness".to_string(),
234247
],
235248
can_fix: true,
236249
depends_on: vec![BotId::Rhodibot, BotId::Glambot],
@@ -276,6 +289,22 @@ impl BotInfo {
276289
can_fix: true,
277290
depends_on: vec![BotId::Rhodibot, BotId::Glambot],
278291
},
292+
BotId::Cipherbot => Self {
293+
id,
294+
name: "Cipherbot".to_string(),
295+
description: "Cryptographic hygiene and post-quantum readiness specialist".to_string(),
296+
version: "0.1.0".to_string(),
297+
categories: vec![
298+
"crypto/hashing".to_string(),
299+
"crypto/symmetric".to_string(),
300+
"crypto/key-exchange".to_string(),
301+
"crypto/signatures".to_string(),
302+
"crypto/password".to_string(),
303+
"crypto/pq-readiness".to_string(),
304+
],
305+
can_fix: true,
306+
depends_on: vec![BotId::Rhodibot, BotId::Echidnabot],
307+
},
279308
BotId::Custom(_) => Self {
280309
id,
281310
name: "Custom Bot".to_string(),

0 commit comments

Comments
 (0)