pub mod dflash;
pub mod eagle3;
pub mod eagle3_orchestrator;
pub mod ngram_orchestrator;
pub mod ngram_proposer;
pub mod verifier;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct SpecDecodeAcceptanceMetric {
pub slot_id: crate::serve::multi_seq_kv::SlotId,
pub accepted_tokens: u32,
pub drafted_tokens: u32,
pub step_count: u32,
}
impl SpecDecodeAcceptanceMetric {
#[inline]
pub const fn new(
slot_id: crate::serve::multi_seq_kv::SlotId,
accepted_tokens: u32,
drafted_tokens: u32,
step_count: u32,
) -> Self {
Self {
slot_id,
accepted_tokens,
drafted_tokens,
step_count,
}
}
#[inline]
pub fn acceptance_ratio(self) -> f32 {
if self.drafted_tokens == 0 {
0.0
} else {
let r = self.accepted_tokens as f32 / self.drafted_tokens as f32;
if r > 1.0 {
1.0
} else {
r
}
}
}
}
#[inline]
pub fn emit_acceptance_metric(_metric: SpecDecodeAcceptanceMetric) {
}
#[cfg(test)]
#[allow(clippy::expect_used, clippy::unwrap_used)]
mod adr040_phase_a4_cont_acceptance_telemetry_tests {
use super::*;
use crate::serve::multi_seq_kv::SlotId;
#[test]
fn h233a_spec_decode_acceptance_metric_carries_dossier_shape_2026_05_30() {
let m = SpecDecodeAcceptanceMetric::new(SlotId(2), 5, 8, 17);
assert_eq!(m.slot_id, SlotId(2));
assert_eq!(m.accepted_tokens, 5);
assert_eq!(m.drafted_tokens, 8);
assert_eq!(m.step_count, 17);
let m2 = m;
assert_eq!(m, m2);
}
#[test]
fn h233b_acceptance_ratio_clamped_and_degenerate_handled_2026_05_30() {
let m = SpecDecodeAcceptanceMetric::new(SlotId(0), 5, 8, 0);
assert!((m.acceptance_ratio() - 0.625).abs() < 1e-6);
let m = SpecDecodeAcceptanceMetric::new(SlotId(0), 0, 0, 0);
assert_eq!(m.acceptance_ratio(), 0.0);
let m = SpecDecodeAcceptanceMetric::new(SlotId(0), 10, 8, 0);
assert!((m.acceptance_ratio() - 1.0).abs() < 1e-6);
}
#[test]
fn h233c_emit_acceptance_metric_is_callable_no_op_2026_05_30() {
let m = SpecDecodeAcceptanceMetric::new(SlotId(0), 5, 8, 0);
emit_acceptance_metric(m);
}
#[test]
fn h233d_emission_call_sites_grep_able_2026_05_30() {
let orchestrator_src = include_str!("../../inference/spec_decode/eagle3_orchestrator.rs");
assert!(
orchestrator_src.contains("emit_acceptance_metric"),
"H233d FALSIFIED: eagle3_orchestrator.rs does NOT name \
`emit_acceptance_metric`. ADR-040 §6.1.55 \
iter-A4-cont-acceptance-telemetry requires the EAGLE-3 \
orchestrator's verification step to construct + emit a \
SpecDecodeAcceptanceMetric record."
);
assert!(
orchestrator_src.contains("iter-A4-cont-acceptance-telemetry"),
"H233d FALSIFIED: eagle3_orchestrator.rs does NOT carry the \
`iter-A4-cont-acceptance-telemetry` cite at the emission \
site. Future-iter implementers + operator triage depend \
on this label being grep-able."
);
let dflash_target_src = include_str!("../../inference/spec_decode/dflash/qwen35_target.rs");
assert!(
dflash_target_src.contains("emit_acceptance_metric"),
"H233d FALSIFIED: dflash/qwen35_target.rs does NOT name \
`emit_acceptance_metric`. ADR-040 §6.1.55 requires the \
Qwen35 DFlash target's verify path to surface acceptance \
telemetry the same way EAGLE-3 does."
);
assert!(
dflash_target_src.contains("iter-A4-cont-acceptance-telemetry"),
"H233d FALSIFIED: dflash/qwen35_target.rs does NOT carry the \
`iter-A4-cont-acceptance-telemetry` cite at the emission \
site."
);
}
}