The saga and certificate diagnosis engines (nexus/fm/src/diagnosis/saga.rs
and arriving in #11238, certificate.rs) each carry a near line-for-line copy of the same bookkeeping around parent-forwarded cases:
- an UninterpretableCase enum (ForeignFact, Disagreeings, NoFacts)
- the loop that closes uninterpretable cases with a "cannot interpret case" comment and a "closing uninterpretable case" warning
- the BTreeMap Entry::Vacant/Occupied loop that dedups cases by key, keeping the lowest CaseUuid and closing the rest as duplicates
The uninterpretable half also appears a third time in physical_disk.rs.
Per-engine fact modeling (what a parsed case's payload looks like) is, and SHOULD be,
engine-specific as described in RFD 603, but this adoption scaffolding is
engine-agnostic, and a fix to the tiebreak or the close messages today has
to be made in three places.
Proposal: a helper in diagnosis/mod.rs along the lines of
fn adopt_keyed_cases<K: Ord + Display, P>(
builder: &mut SitrepBuilder<'_>,
de: DiagnosisEngineKind,
parse: impl Fn(&Case) -> Result<(K, P), impl Display>,
) -> BTreeMap<K, (CaseUuid, P)>
that saga.rs and certificate.rs call, keeping only their own parse_case
bodies. physical_disk.rs could adopt the uninterpretable half in the same
change or a follow-up. Existing tests in all three engines already cover
uninterpretable and duplicate cases.
The saga and certificate diagnosis engines (nexus/fm/src/diagnosis/saga.rs
and arriving in #11238, certificate.rs) each carry a near line-for-line copy of the same bookkeeping around parent-forwarded cases:
The uninterpretable half also appears a third time in physical_disk.rs.
Per-engine fact modeling (what a parsed case's payload looks like) is, and SHOULD be,
engine-specific as described in RFD 603, but this adoption scaffolding is
engine-agnostic, and a fix to the tiebreak or the close messages today has
to be made in three places.
Proposal: a helper in diagnosis/mod.rs along the lines of
that saga.rs and certificate.rs call, keeping only their own parse_case
bodies. physical_disk.rs could adopt the uninterpretable half in the same
change or a follow-up. Existing tests in all three engines already cover
uninterpretable and duplicate cases.