{"record":{"id":"509dbd7113699e63","repo":"astrid-runtime/astrid","slug":"stability-measurement-produced-no-edit-cases","errorCode":null,"errorMessage":"stability measurement produced no edit cases","messagePattern":"stability measurement produced no edit cases","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/astrid-storage-chunker-evidence/src/stability.rs","lineNumber":319,"sourceCode":"        fixture_quantile_basis_points,\n        kind,\n        anchor,\n        edit_offset: u64::try_from(edit.old_start)?,\n        edit_bytes: u64::try_from(edit.old_end.saturating_sub(edit.old_start).max(EDIT_BYTES))?,\n        boundaries_considered: considered,\n        boundaries_survived: survived,\n        boundary_survival_basis_points: survival_basis_points,\n        identical_chunks_reused: u64::try_from(identical_chunks_reused)?,\n        new_chunks: u64::try_from(edited.len().saturating_sub(identical_chunks_reused))?,\n        resynchronization_bytes: first_resynchronized_start\n            .map(|start| u64::try_from(start.saturating_sub(edit.new_end)))\n            .transpose()?,\n    })\n}\n\nfn summarize(cases: &[EditResult], neighborhoods: usize) -> Result<StabilitySummary> {\n    if cases.is_empty() {\n        bail!(\"stability measurement produced no edit cases\");\n    }\n    let minimum_boundary_survival_basis_points = cases\n        .iter()\n        .map(|case| case.boundary_survival_basis_points)\n        .min()\n        .expect(\"the non-empty case set has a minimum\");\n    let cases_without_resynchronization = cases\n        .iter()\n        .filter(|case| case.resynchronization_bytes.is_none())\n        .count();\n    let mut distances = cases\n        .iter()\n        .filter_map(|case| case.resynchronization_bytes)\n        .collect::<Vec<_>>();\n    distances.sort_unstable();\n    let resynchronization_bytes = if distances.is_empty() {\n        None\n    } else {","sourceCodeStart":301,"sourceCodeEnd":337,"githubUrl":"https://github.com/astrid-runtime/astrid/blob/affd8760f44190dbdfbec23403f4c4b642c33112/crates/astrid-storage-chunker-evidence/src/stability.rs#L301-L337","documentation":"summarize() aggregates boundary-survival statistics across edit cases produced by a chunker stability measurement. If the case list is empty there is nothing to summarize, so the function bails instead of producing a meaningless or divide-by-zero summary. This guards the internal invariant that measure_fixture always generates at least one edit case before summarizing.","triggerScenarios":"Calling measure_fixture on a fixture where the configured edit-case generation yields zero EditResult entries (e.g. an empty or too-small fixture, or a configuration that disables all edit operations), so summarize() receives an empty cases slice.","commonSituations":"Pointing the stability harness at a tiny or zero-byte fixture; misconfigured edit parameters (all edit probabilities zero); running measurements against fixture files that were truncated or failed to load.","solutions":["Check that the fixture passed to measure_fixture is non-empty and large enough to generate edit cases","Review the measurement configuration so at least one edit case is produced per neighborhood","Guard the call site: verify cases are generated before invoking summarize, or return a descriptive error earlier"],"exampleFix":"// before\nlet summary = summarize(&cases, neighborhoods)?;\n// after\nif cases.is_empty() {\n    bail!(\"fixture {:?} produced no edit cases; use a larger fixture\", fixture_path);\n}\nlet summary = summarize(&cases, neighborhoods)?;","handlingStrategy":"validation","validationCode":"// rust\nanyhow::ensure!(!fixture.is_empty(), \"fixture must contain data for stability measurement\");\n// then assert generated cases before summarizing\nanyhow::ensure!(!cases.is_empty(), \"no edit cases generated; check measurement config\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always measure against a fixture with enough bytes to generate edits","Validate measurement config (edit counts/probabilities) at startup","Add an integration test that runs measure_fixture on a minimal fixture"],"tags":["empty-input","measurement","rust"],"backgroundTag":"empty-required-field","analyzedSha":"affd8760f44190dbdfbec23403f4c4b642c33112","analyzedAt":"2026-09-09T21:28:12.402Z","contentChangedAt":"2026-09-09T21:28:12.402Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}