///|
/// Scope call IDs by run. Exact duplicates are counted once and diagnosed.
/// Conflicting copies are excluded entirely rather than trusting the first row.
pub fn reconcile(parsed : Parsed) -> Parsed {
  let first : Map[(String, String), Record] = Map([])
  let conflicts : Map[(String, String), Bool] = Map([])
  let ordered : Array[Record] = []
  let findings = parsed.findings.copy()
  for record in parsed.records {
    let call = record.call
    let key = (call.run_id, call.call_id)
    match first.get(key) {
      None => {
        first.set(key, record)
        ordered.push(record)
      }
      Some(previous) =>
        if @json.to_json(previous.call) == @json.to_json(call) {
          findings.push({
            line: record.line,
            code: "duplicate_call",
            message: "duplicate of line " + previous.line.to_string(),
          })
        } else {
          conflicts.set(key, true)
          findings.push({
            line: record.line,
            code: "conflicting_call",
            message: "conflicts with line " +
            previous.line.to_string() +
            "; all copies excluded",
          })
        }
    }
  }
  let records = ordered.filter(fn(record) {
    !conflicts.contains((record.call.run_id, record.call.call_id))
  })
  { records, findings, }
}