Phase 42 PRD (docs/CONTROL_PLANE_PRD.md:137) specified:
- crates/truth/src/staffing.rs — staffing rule shapes
- crates/truth/src/devops.rs — scaffold for DevOps long-horizon
PHASES.md marked Phase 42 done, but the rule sets lived inline in
default_truth_store() in lib.rs. Worked, but doesn't match the PRD's
module separation — and that separation matters when the long-horizon
phase fleshes out devops rules: "Keeps the dispatcher signature stable
so no refactor needed later."
Fix: extract staffing_rules() into staffing.rs (5 rules, unchanged
behavior) + create devops.rs with an empty scaffold. default_truth_store
becomes a one-line composition:
devops::devops_rules(staffing::staffing_rules(TruthStore::new()))
4 new tests in the submodules cover:
- staffing_rules registers expected count (regression guard)
- blacklisted worker fails the client-not-blacklisted rule
- missing deadline fires Reject via FieldEmpty condition
- devops scaffold is a no-op for now
Total truth tests: 28 → 32. Workspace warnings still at 0.
Still open from Phase 42 (flagged, not in this commit):
- `truth/` dir at repo root for file-backed rule loading (TOML/YAML).
Rules are in-code today; loader work is a separate feature.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
50 lines
2.1 KiB
Rust
50 lines
2.1 KiB
Rust
//! DevOps task-class rules — scaffold for the long-horizon phase.
|
|
//!
|
|
//! Phase 42 PRD: "Terraform/Ansible rule shapes are scaffolded but
|
|
//! unpopulated until the long-horizon phase. Keeps the dispatcher
|
|
//! signature stable so no refactor needed later."
|
|
//!
|
|
//! This module is intentionally minimal. It registers no rules yet.
|
|
//! The `devops_rules` function exists so callers can compose it onto
|
|
//! a store (e.g. `devops_rules(staffing_rules(TruthStore::new()))`)
|
|
//! without branching on whether the DevOps phase has landed.
|
|
//!
|
|
//! When the long-horizon phase fleshes out the DevOps rule set, the
|
|
//! implementations drop in here — same `RuleCondition` primitives, same
|
|
//! `TruthStore::evaluate` contract, zero upstream refactor.
|
|
|
|
use crate::TruthStore;
|
|
|
|
/// Register DevOps rules on the store. Currently a no-op scaffold —
|
|
/// no rules are added. Safe to compose with other rule-set functions.
|
|
///
|
|
/// Planned task classes (not yet populated):
|
|
/// - `devops.terraform_plan` — `terraform validate` + pre-plan
|
|
/// sanity checks (no destroys without confirm flag, etc.)
|
|
/// - `devops.ansible_playbook` — `ansible-lint` + privileged-task
|
|
/// gates (no `become: true` on untagged hosts)
|
|
/// - `devops.shell_command` — whitelist / blocklist for
|
|
/// AI-generated shell invocations (covers what Phase 42
|
|
/// queryd SQL gate does for SQL — same idea, shell surface)
|
|
pub fn devops_rules(store: TruthStore) -> TruthStore {
|
|
// Intentionally empty. See module-level doc for the phased rollout.
|
|
store
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn devops_rules_is_a_noop_for_now() {
|
|
// Scaffold guarantee: composing devops_rules onto an empty
|
|
// store must not add any rules. Future long-horizon work will
|
|
// populate this and the assertion shifts to counting the
|
|
// expected additions.
|
|
let store = devops_rules(TruthStore::new());
|
|
assert_eq!(store.get_rules("devops.terraform_plan").len(), 0);
|
|
assert_eq!(store.get_rules("devops.ansible_playbook").len(), 0);
|
|
assert_eq!(store.get_rules("devops.shell_command").len(), 0);
|
|
}
|
|
}
|