{"record":{"id":"18188a74324ff707","repo":"astrid-runtime/astrid","slug":"bottom-k-evidence-requires-at-least-two-versions","errorCode":null,"errorMessage":"bottom-k evidence requires at least two versions","messagePattern":"bottom-k evidence requires at least two versions","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/astrid-storage-chunker-evidence/src/sketch.rs","lineNumber":117,"sourceCode":"    sketches: &'a [Option<MaterializedSketch>],\n    inverted: &'a BTreeMap<[u8; 32], Vec<usize>>,\n    sample_size: u16,\n}\n\n#[derive(Clone, Debug)]\nenum DeltaOperation {\n    Copy { offset: u64, length: u64 },\n    Add(Vec<u8>),\n}\n\npub fn measure(corpus: &Corpus) -> Result<Vec<SketchEvidenceResult>> {\n    let mut versions = Vec::new();\n    corpus.visit_inputs(|bytes| {\n        versions.push(Version::build(bytes)?);\n        Ok(())\n    })?;\n    if versions.len() < 2 {\n        bail!(\"bottom-k evidence requires at least two versions\");\n    }\n\n    let mut results = Vec::new();\n    for width in SCORE_WIDTHS {\n        for sample_size in SAMPLE_SIZES {\n            results.push(measure_configuration(\n                corpus.name(),\n                corpus.kind(),\n                &versions,\n                *width,\n                *sample_size,\n            )?);\n        }\n    }\n    Ok(results)\n}\n\nfn measure_configuration(","sourceCodeStart":99,"sourceCodeEnd":135,"githubUrl":"https://github.com/astrid-runtime/astrid/blob/affd8760f44190dbdfbec23403f4c4b642c33112/crates/astrid-storage-chunker-evidence/src/sketch.rs#L99-L135","documentation":"The bottom-k sketch measurement requires at least two corpus versions because it computes cross-version scores (delta sizes across configurations). With fewer than two versions there is nothing to compare, so measure bails.","triggerScenarios":"Calling measure with a corpus that exposes 0 or 1 inputs via visit_inputs — e.g. an empty corpus or a single-version corpus.","commonSituations":"Testing the library against a single sample file; a directory containing only ignored/empty inputs; misconfigured corpus path pointing at an empty location.","solutions":["Provide a corpus with at least two distinct input versions.","Check the corpus path/configuration includes all intended version files.","Skip the bottom-k measurement for single-version corpora in the caller."],"exampleFix":"// before\nsketch::measure(&corpus_of_one_file)?;\n// after\nif corpus.version_count() >= 2 {\n    sketch::measure(&corpus)?;\n}","handlingStrategy":"validation","validationCode":"let mut n = 0; corpus.visit_inputs(|_| { n += 1; Ok(()) })?; if n < 2 { return Ok(FeatureDisabled); }","typeGuard":null,"tryCatchPattern":"match sketch::measure(&corpus) {\n    Err(e) if e.to_string().contains(\"at least two versions\") => eprintln!(\"need >=2 versions for bottom-k\"),\n    other => other,\n}","preventionTips":["Gate bottom-k measurement behind a version-count >= 2 check","Verify the corpus path contains all version files","Skip cross-version features for single-sample corpora"],"tags":["sketch","validation","empty-input"],"backgroundTag":"invalid-argument-value","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"}