affaan-m/ECC · error

seeds must be unique

Error message

seeds must be unique

What it means

`evaluate_paired` requires all explicit seeds to be unique; it deduplicates them into a `BTreeSet` and compares cardinality. Duplicated seeds would weight the statistical comparison toward repeated cases, so the call is rejected up front.

Solutions

  1. Deduplicate the seed slice before calling, e.g. `seeds.sort(); seeds.dedup();`
  2. Build the seed list through a `BTreeSet`/`HashSet` to guarantee uniqueness
  3. If duplicates were intentional re-weights, run the evaluator once per occurrence and merge samples yourself

Example fix

// before
let seeds = vec![1, 2, 2, 3];
let samples = evaluate_paired(&evaluator, &seeds)?;
// after
let mut seeds = vec![1, 2, 2, 3];
seeds.sort_unstable();
seeds.dedup();
let samples = evaluate_paired(&evaluator, &seeds)?;
Defensive patterns

Strategy: validation

Validate before calling

fn ensure_unique_seeds(seeds: &[u64]) -> Result<(), String> {
    let unique = seeds.iter().copied().collect::<std::collections::BTreeSet<_>>();
    if unique.len() != seeds.len() {
        return Err("seeds contain duplicates".into());
    }
    Ok(())
}

Type guard

fn seeds_are_unique(seeds: &[u64]) -> bool {
    seeds.iter().copied().collect::<std::collections::BTreeSet<_>>().len() == seeds.len()
}

Try / catch

match evaluate_paired(&evaluator, &seeds) {
    Ok(samples) => samples,
    Err(e) if e.to_string().contains("unique") => {
        let mut seeds = seeds.clone();
        seeds.sort_unstable();
        seeds.dedup();
        evaluate_paired(&evaluator, &seeds)?
    }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: Calling `evaluate_paired` with a seed slice containing at least one repeated u64, e.g. `[1, 2, 2, 3]`, or seeds built from a source that can repeat values (hash collisions, manual lists, concatenated runs).

Common situations: Merging seed lists from multiple test runs without deduplication; hand-written seed arrays with a typo; generating seeds from a small modulus so values repeat.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


AI-assisted analysis of affaan-m/ECC@8321021c54 (2026-09-16). Data as JSON: /api/errors/8f9a843ad8379dcf. Report an issue: GitHub.

Appendix: source

Thrown at ecc2/src/harness_eval.rs:473

    pub seed: u64,
    pub candidate_score: f64,
    pub baseline_score: f64,
}

pub fn evaluate_paired(
    evaluator: &mut dyn Evaluator,
    candidate_id: &str,
    baseline_id: &str,
    seeds: &[u64],
) -> Result<Vec<PairedSample>> {
    if seeds.is_empty() {
        bail!("at least one explicit seed is required");
    }
    if seeds.len() > 10_000 {
        bail!("seed count exceeds 10000");
    }
    if seeds.iter().copied().collect::<BTreeSet<_>>().len() != seeds.len() {
        bail!("seeds must be unique");
    }
    seeds
        .iter()
        .map(|seed| {
            Ok(PairedSample {
                seed: *seed,
                candidate_score: evaluator.evaluate(candidate_id, *seed)?,
                baseline_score: evaluator.evaluate(baseline_id, *seed)?,
            })
        })
        .collect()
}

#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct PromotionPolicy {
    pub min_samples: usize,
    pub min_mean_delta: f64,
    pub min_win_rate: f64,

View on GitHub (pinned to 8321021c54)