pub const AC_SHIP1_006_REQUIRED_QA_GATE_COUNT: usize = 8;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Ship006Verdict {
Pass,
Fail,
}
#[must_use]
pub const fn verdict_from_qa_gates(gate_results: &[bool]) -> Ship006Verdict {
if gate_results.len() != AC_SHIP1_006_REQUIRED_QA_GATE_COUNT {
return Ship006Verdict::Fail;
}
let mut i = 0;
while i < gate_results.len() {
if !gate_results[i] {
return Ship006Verdict::Fail;
}
i += 1;
}
Ship006Verdict::Pass
}
#[cfg(test)]
mod ship_006_tests {
use super::*;
#[test]
fn falsify_ship_006_apr_qa_eight_gates_aggregate() {
let all_pass = [true; 8];
assert_eq!(
verdict_from_qa_gates(&all_pass),
Ship006Verdict::Pass,
"all 8 gates Pass must yield aggregate Pass",
);
let all_fail = [false; 8];
assert_eq!(
verdict_from_qa_gates(&all_fail),
Ship006Verdict::Fail,
"all 8 gates Fail must yield aggregate Fail",
);
for flip_idx in 0..8 {
let mut gates = [true; 8];
gates[flip_idx] = false;
assert_eq!(
verdict_from_qa_gates(&gates),
Ship006Verdict::Fail,
"flipping gate {flip_idx} to Fail must break the aggregate",
);
}
for mask in 0u16..256 {
let gates: [bool; 8] = core::array::from_fn(|i| (mask >> i) & 1 == 1);
let expected = if mask == 0xFF {
Ship006Verdict::Pass
} else {
Ship006Verdict::Fail
};
assert_eq!(
verdict_from_qa_gates(&gates),
expected,
"mask=0b{mask:08b} expected {expected:?}",
);
}
let pass_state = [true; 8];
for flip_idx in 0..8 {
let mut mutated = pass_state;
mutated[flip_idx] = false;
assert_ne!(
verdict_from_qa_gates(&mutated),
verdict_from_qa_gates(&pass_state),
"Pass→Fail monotonicity broken at idx {flip_idx}",
);
}
assert_eq!(
verdict_from_qa_gates(&[]),
Ship006Verdict::Fail,
"empty gate array must Fail — contract-drift guard",
);
assert_eq!(
verdict_from_qa_gates(&[true; 7]),
Ship006Verdict::Fail,
"7-long all-true must Fail — gate count drift guard",
);
assert_eq!(
verdict_from_qa_gates(&[true; 9]),
Ship006Verdict::Fail,
"9-long all-true must Fail — gate count drift guard",
);
assert_eq!(
verdict_from_qa_gates(&[true; 16]),
Ship006Verdict::Fail,
"16-long all-true must Fail — double-count guard",
);
assert_eq!(
AC_SHIP1_006_REQUIRED_QA_GATE_COUNT, 8,
"MODEL-1 ship criterion requires exactly 8 apr qa gates \
(spec §4.2 AC-SHIP1-006; docs/specifications/components/qa.md §3)",
);
}
}