Ctrl K
ComunidadGuías…

src/support/history/tests.rs

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
use super::{
    History, MAX_BYTES, MAX_CYCLES, MAX_GROUPS, Message, QUEUE, Recorder, add, apply, read, save,
};
use serde_json::json;
use std::sync::{
    Arc, Mutex,
    atomic::{AtomicU64, Ordering},
    mpsc,
};
use tracing_subscriber::Layer;
use tracing_subscriber::layer::SubscriberExt;

#[test]
fn history_roundtrip_groups_observations_and_bounds_restarts() {
    let dir = tempfile::tempdir().unwrap();
    let path = dir.path().join("support.json");
    let mut h = History {
        schema_version: 1,
        ..History::default()
    };
    for n in 0..(MAX_CYCLES + 4) {
        apply(
            &mut h,
            Message::Begin(json!({"threads": 2, "username": "private-username"})),
        );
        for _ in 0..3 {
            add(&mut h, "exact_lookup_rejection_v1", json!({"rejected_requests": n, "expected_owner": "absent", "stage": "master_reference_scope", "reason": "owner_unqualified"}).as_object().unwrap().clone());
        }
        apply(
            &mut h,
            Message::Complete(
                json!({"bytes_downloaded": 604, "disk_bytes_written": 17}),
                "partial_failure",
            ),
        );
    }
    save(&path, &mut h).unwrap();
    let (reopened, status) = read(&path);
    assert_eq!(status, "available");
    assert_eq!(reopened.cycles.len(), MAX_CYCLES);
    assert_eq!(reopened.cycles_evicted, 4);
    assert_eq!(
        reopened.cycles.last().unwrap().diagnostics[0].observations,
        3
    );
    assert_eq!(
        reopened.cycles.last().unwrap().stats["disk_bytes_written"],
        17
    );
    assert!(std::fs::metadata(&path).unwrap().len() <= MAX_BYTES);
    assert!(
        !serde_json::to_string(&reopened)
            .unwrap()
            .contains("private-username")
    );
}

#[test]
fn interrupted_staging_keeps_previous_snapshot_and_is_bounded_on_restart() {
    let dir = tempfile::tempdir().unwrap();
    let path = dir.path().join("support.json");
    let mut h = History {
        schema_version: 1,
        ..History::default()
    };
    apply(&mut h, Message::Begin(json!({"threads": 2})));
    save(&path, &mut h).unwrap();
    std::fs::write(path.with_extension("support-tmp"), br#"{"half-written":1"#).unwrap();
    let (mut reopened, status) = read(&path);
    assert_eq!(status, "available");
    assert!(reopened.cycles[0].completed_at.is_none());
    apply(&mut reopened, Message::Begin(json!({"threads": 4})));
    save(&path, &mut reopened).unwrap();
    assert_eq!(read(&path).0.cycles.len(), 2);
    assert!(!path.with_extension("support-tmp").exists());
}

#[test]
fn groups_and_queue_have_explicit_omission_counts() {
    let mut h = History {
        schema_version: 1,
        ..History::default()
    };
    apply(&mut h, Message::Begin(json!({})));
    for n in 0..(MAX_GROUPS + 5) {
        add(
            &mut h,
            "metadata_capture_ambiguity_counts_v1",
            json!({"matching_children": n}).as_object().unwrap().clone(),
        );
    }
    assert_eq!(h.cycles[0].diagnostics.len(), MAX_GROUPS);
    assert_eq!(h.groups_omitted, 5);
    let (sender, _receiver) = mpsc::sync_channel(QUEUE);
    let recorder = Recorder {
        sender,
        generation: Arc::new(AtomicU64::new(0)),
        dropped: Arc::new(AtomicU64::new(0)),
        aliases: Arc::new(Mutex::new(std::collections::HashMap::new())),
        alias_namespace: uuid::Uuid::new_v4(),
    };
    for _ in 0..(QUEUE + 5) {
        recorder.send(Message::Observe(
            "sparse_identity_state_failed",
            Default::default(),
        ));
    }
    assert_eq!(recorder.dropped.load(Ordering::Relaxed), 5);
}

#[test]
fn diagnostic_layer_runs_below_log_filter_and_ignores_private_fields() {
    let (sender, receiver) = mpsc::sync_channel(QUEUE);
    let recorder = Recorder {
        sender,
        generation: Arc::new(AtomicU64::new(0)),
        dropped: Arc::new(AtomicU64::new(0)),
        aliases: Arc::new(Mutex::new(std::collections::HashMap::new())),
        alias_namespace: uuid::Uuid::new_v4(),
    };
    let subscriber = tracing_subscriber::registry().with(recorder).with(
        tracing_subscriber::fmt::layer()
            .with_writer(std::io::sink)
            .with_filter(tracing_subscriber::filter::LevelFilter::ERROR),
    );
    tracing::subscriber::with_default(subscriber, || {
        tracing::debug!(
            diagnostic = "exact_lookup_rejection_v1",
            target = "paired",
            stage = "master_reference_scope",
            reason = "owner_unqualified",
            expected_owner = "absent",
            lookup_zone = "primary",
            rejected_requests = 604u64,
            asset_id = "private-id",
            path = "/private/path",
            error = "private-password",
            token = "private-token",
            "private free text"
        );
        tracing::error!(
            diagnostic = "private-new-diagnostic",
            error = "private-body",
            "private message"
        );
    });
    let Message::Tagged(_, message) = receiver.try_recv().unwrap() else {
        panic!("expected attribution envelope")
    };
    let Message::Event(kind, fields) = *message else {
        panic!("expected diagnostic")
    };
    assert_eq!(kind, "exact_lookup_rejection_v1");
    assert_eq!(fields["rejected_requests"], 604);
    assert_eq!(fields.len(), 6);
    assert!(!serde_json::to_string(&fields).unwrap().contains("private"));
    assert!(receiver.try_recv().is_err());
}

#[test]
fn untrusted_saved_strings_and_unknown_schema_never_escape() {
    let dir = tempfile::tempdir().unwrap();
    let path = dir.path().join("support.json");
    let mut h = History {
        schema_version: 1,
        ..History::default()
    };
    apply(
        &mut h,
        Message::Begin(json!({"username": "private-id", "resolution": "https://private-url"})),
    );
    let cycle = h.cycles.last_mut().unwrap();
    cycle.build_version = "0.private-token".into();
    cycle.outcome = "private-error".into();
    cycle.stats = json!({"inventory_drop_library": "private-album", "bytes_downloaded": 1});
    add(&mut h, "exact_lookup_rejection_v1", json!({"reason": "private-error", "target": "private-id", "rejected_requests": 4, "path": "/private/path"}).as_object().unwrap().clone());
    std::fs::write(&path, serde_json::to_vec(&h).unwrap()).unwrap();
    let (clean, status) = read(&path);
    assert_eq!(status, "available");
    assert!(!serde_json::to_string(&clean).unwrap().contains("private"));
    std::fs::write(&path, b"{\"schema_version\":999,\"cycles\":[],\"cycles_evicted\":0,\"queue_dropped\":0,\"groups_omitted\":0,\"previous_history_unavailable\":false}").unwrap();
    assert_eq!(read(&path).1, "unsupported_schema");
    std::fs::write(&path, b"{incomplete").unwrap();
    assert_eq!(read(&path).1, "invalid_or_interrupted");
    std::fs::write(&path, vec![b'x'; usize::try_from(MAX_BYTES + 1).unwrap()]).unwrap();
    assert_eq!(read(&path).1, "truncated_or_unreadable");
}

#[tokio::test]
async fn normal_worker_flushes_restart_history() {
    let dir = tempfile::tempdir().unwrap();
    let path = dir.path().join("support.json");
    let (recorder, guard) = super::start(path.clone(), json!({"threads": 2})).unwrap();
    recorder
        .sender
        .send(Message::Event(
            "sparse_deletion_validation_failed".into(),
            Default::default(),
        ))
        .unwrap();
    guard.finish().await;
    let (recorder, guard) = super::start(path.clone(), json!({"threads": 4})).unwrap();
    recorder
        .sender
        .send(Message::Complete(json!({"failed": 1}), "partial_failure"))
        .unwrap();
    guard.finish().await;
    let (history, status) = read(&path);
    assert_eq!(status, "available");
    assert_eq!(history.cycles.len(), 2);
    assert_eq!(history.cycles[1].stats["failed"], 1);
    assert_eq!(
        history.cycles[0].diagnostics[0].kind,
        "sparse_deletion_validation_failed"
    );
}

#[test]
fn serialized_byte_limit_rotates_complete_records() {
    let dir = tempfile::tempdir().unwrap();
    let path = dir.path().join("support.json");
    let mut history = History {
        schema_version: 1,
        ..History::default()
    };
    for _ in 0..MAX_CYCLES {
        apply(&mut history, Message::Begin(json!({})));
        // Fill fixed scalar fields with long numeric encodings, not private text.
        for n in 0..MAX_GROUPS {
            let fields = json!({"pages":n,"records":u64::MAX,"transferred_bytes":u64::MAX,"retained_bytes":u64::MAX,
                "page_budget":u64::MAX,"record_budget":u64::MAX,"page_byte_budget":u64::MAX,"retained_byte_budget":u64::MAX,
                "elapsed_secs":1.7976931348623157e308,"reason":"invalid_inventory_evidence","phase":"family_scan","subreason":"child_reference_scope_mismatch",
                "eof_observed":true,"family_context":"unrelated","scope_mismatch_component":"owner","child_soft_deleted":false,
                "expected_owner":"private_default","expected_owner_type":"string","supplied_owner":"other_string","supplied_owner_type":"string"});
            add(
                &mut history,
                "legacy_inventory_failure_v2",
                fields.as_object().unwrap().clone(),
            );
        }
    }
    assert!(serde_json::to_vec(&history).unwrap().len() as u64 > MAX_BYTES);
    save(&path, &mut history).unwrap();
    assert!(std::fs::metadata(&path).unwrap().len() <= MAX_BYTES);
    assert!(history.cycles_evicted > 0);
    let (reopened, status) = read(&path);
    assert_eq!(status, "available");
    assert_eq!(reopened.cycles_evicted, history.cycles_evicted);
}

#[cfg(unix)]
#[test]
fn staging_symlink_cannot_modify_another_file() {
    let dir = tempfile::tempdir().unwrap();
    let path = dir.path().join("support.json");
    let target = dir.path().join("media");
    std::fs::write(&target, b"private media").unwrap();
    std::os::unix::fs::symlink(&target, path.with_extension("support-tmp")).unwrap();
    let mut history = History {
        schema_version: 1,
        ..History::default()
    };
    apply(&mut history, Message::Begin(json!({})));
    assert!(save(&path, &mut history).is_err());
    assert_eq!(std::fs::read(target).unwrap(), b"private media");
}

#[tokio::test]
async fn existing_writer_lock_preserves_prior_history() {
    use fs4::fs_std::FileExt;
    let dir = tempfile::tempdir().unwrap();
    let path = dir.path().join("support.json");
    let mut history = History {
        schema_version: 1,
        ..History::default()
    };
    apply(&mut history, Message::Begin(json!({})));
    save(&path, &mut history).unwrap();
    let before = std::fs::read(&path).unwrap();
    let lock = super::private_options()
        .create(true)
        .truncate(false)
        .open(path.with_extension("support-lock"))
        .unwrap();
    lock.lock_exclusive().unwrap();
    let (_, guard) = super::start(path.clone(), json!({"threads":42})).unwrap();
    guard.finish().await;
    assert_eq!(std::fs::read(path).unwrap(), before);
}

#[test]
fn restarting_does_not_complete_an_interrupted_prior_startup() {
    let mut history = History {
        schema_version: 1,
        ..History::default()
    };
    apply(&mut history, Message::Start(json!({})));
    add(
        &mut history,
        "support_startup_v1",
        json!({"phase":"starting"}).as_object().unwrap().clone(),
    );
    apply(&mut history, Message::Start(json!({})));
    assert!(history.cycles[0].completed_at.is_none());
    assert_eq!(history.cycles[0].outcome, "running");
    add(
        &mut history,
        "support_startup_v1",
        json!({"phase":"starting"}).as_object().unwrap().clone(),
    );
    apply(&mut history, Message::Begin(json!({})));
    assert!(history.cycles[0].completed_at.is_none());
    assert_eq!(history.cycles[1].outcome, "success");
    assert!(history.cycles[1].completed_at.is_some());
}

#[test]
fn dropped_cycle_handoff_cannot_overwrite_prior_completed_evidence() {
    let (sender, receiver) = mpsc::sync_channel(1);
    let recorder = Recorder {
        sender,
        generation: Arc::new(AtomicU64::new(0)),
        dropped: Arc::new(AtomicU64::new(0)),
        aliases: Arc::new(Mutex::new(Default::default())),
        alias_namespace: uuid::Uuid::new_v4(),
    };
    let mut history = History {
        schema_version: 1,
        ..History::default()
    };
    recorder.send(Message::Begin(json!({"threads":2})));
    apply(&mut history, receiver.recv().unwrap());
    recorder.send(Message::Complete(json!({"downloaded":17}), "success"));
    apply(&mut history, receiver.recv().unwrap());
    let prior = serde_json::to_value(&history.cycles[0]).unwrap();
    // A stalled writer has a full observation queue at the next cycle boundary.
    recorder.send(Message::Observe(
        "sparse_identity_state_failed",
        Default::default(),
    ));
    recorder.send(Message::Begin(json!({"threads":4})));
    assert_eq!(recorder.dropped.load(Ordering::Relaxed), 1);
    apply(&mut history, receiver.recv().unwrap());
    recorder.send(Message::Complete(
        json!({"downloaded":604}),
        "partial_failure",
    ));
    apply(&mut history, receiver.recv().unwrap());
    assert_eq!(
        serde_json::to_value(&history.cycles[0]).unwrap()["stats"],
        prior["stats"]
    );
    assert_eq!(
        history.cycles[0].completed_at,
        prior["completed_at"].as_str().map(str::to_owned)
    );
    assert_eq!(history.cycles[0].outcome, "success");
    assert_eq!(history.cycles.len(), 1);
    assert_eq!(history.queue_dropped, 1);
    // A later accepted handoff resumes accurate collection with a separate record.
    recorder.send(Message::Begin(json!({"threads":8})));
    apply(&mut history, receiver.recv().unwrap());
    recorder.send(Message::Complete(json!({"downloaded":2}), "success"));
    apply(&mut history, receiver.recv().unwrap());
    assert_eq!(history.cycles.len(), 2);
    assert_eq!(history.cycles[1].stats["downloaded"], 2);
}

#[cfg(unix)]
#[test]
fn failed_history_rename_never_uses_an_unowned_copy_fallback() {
    let dir = tempfile::tempdir().unwrap();
    let path = dir.path().join("support.json");
    std::fs::create_dir(&path).unwrap();
    let media = dir.path().join("media.jpg");
    std::fs::write(&media, b"private media").unwrap();
    let sibling = path.with_extension(format!("json.kei-xdev-tmp-{}", std::process::id()));
    std::os::unix::fs::symlink(&media, &sibling).unwrap();
    let mut history = History {
        schema_version: 1,
        ..History::default()
    };
    apply(&mut history, Message::Start(json!({})));
    assert!(save(&path, &mut history).is_err());
    assert_eq!(std::fs::read(media).unwrap(), b"private media");
    assert!(
        std::fs::symlink_metadata(sibling)
            .unwrap()
            .file_type()
            .is_symlink()
    );
    assert!(path.is_dir());
}

#[test]
fn late_failures_and_summary_survive_sampled_details_and_report_counts() {
    let mut h = History {
        schema_version: 1,
        ..History::default()
    };
    apply(&mut h, Message::Begin(json!({})));
    for n in 0..200 {
        let fields = json!({"phase":"scan","reason":"candidate","scan_index":n});
        for _ in 0..2 {
            add(
                &mut h,
                "support_import_v1",
                fields.as_object().unwrap().clone(),
            );
        }
    }
    add(
        &mut h,
        "support_import_v1",
        json!({"phase":"adoption","reason":"strict_refusal"})
            .as_object()
            .unwrap()
            .clone(),
    );
    add(
        &mut h,
        "support_import_v1",
        json!({"phase":"complete","total":200,"strict_refused":1})
            .as_object()
            .unwrap()
            .clone(),
    );
    let c = &h.cycles[0];
    assert_eq!(c.diagnostics.len(), super::MAX_DETAIL_GROUPS + 2);
    assert_eq!(c.observations_total, Some(402));
    assert_eq!(c.observations_shown, Some(130));
    assert_eq!(c.observations_omitted, Some(272));
    assert!(
        c.diagnostics
            .iter()
            .any(|d| d.fields.get("strict_refused") == Some(&json!(1)))
    );
    let tmp = tempfile::tempdir().unwrap();
    let path = tmp.path().join("support.json");
    save(&path, &mut h).unwrap();
    let (clean, status) = read(&path);
    assert_eq!(status, "available");
    assert_eq!(clean.cycles[0].observations_omitted, Some(272));
    // Exhaust failure groups too: late summary displaces an earlier failure.
    for n in 0..MAX_GROUPS {
        add(
            &mut h,
            "exact_lookup_rejection_v1",
            json!({"rejected_requests":n}).as_object().unwrap().clone(),
        );
    }
    add(
        &mut h,
        "support_import_v1",
        json!({"phase":"complete","total":201,"strict_refused":2})
            .as_object()
            .unwrap()
            .clone(),
    );
    let c = &h.cycles[0];
    assert_eq!(c.diagnostics.len(), MAX_GROUPS);
    assert_eq!(
        c.observations_total,
        c.observations_shown
            .zip(c.observations_omitted)
            .map(|(a, b)| a + b)
    );
    assert!(
        c.diagnostics
            .iter()
            .any(|d| d.fields.get("total") == Some(&json!(201)))
    );
}

#[test]
fn older_history_observation_accounting_is_explicitly_unavailable() {
    let mut h = History {
        schema_version: 1,
        ..History::default()
    };
    apply(&mut h, Message::Begin(json!({})));
    let mut saved = serde_json::to_value(&h).unwrap();
    let c = saved["cycles"][0].as_object_mut().unwrap();
    for field in [
        "observations_total",
        "observations_shown",
        "observations_omitted",
    ] {
        c.remove(field);
    }
    let tmp = tempfile::tempdir().unwrap();
    let path = tmp.path().join("support.json");
    std::fs::write(&path, serde_json::to_vec(&saved).unwrap()).unwrap();
    let (read, status) = read(&path);
    assert_eq!(status, "available");
    assert!(read.cycles[0].observations_total.is_none());
    assert!(read.cycles[0].observations_shown.is_none());
    assert!(read.cycles[0].observations_omitted.is_none());
}

#[test]
fn issue956_pair_reference_reasons_survive_history_reopen_without_private_fields() {
    let directory = tempfile::tempdir().unwrap();
    let path = directory.path().join("history.json");
    let mut history = History {
        schema_version: 1,
        ..History::default()
    };
    apply(&mut history, Message::Begin(json!({})));
    let reasons = [
        "master_reference_missing",
        "master_reference_malformed",
        "child_master_mismatch",
        "record_provider_error",
    ];
    for reason in reasons {
        add(
            &mut history,
            "exact_lookup_rejection_v1",
            json!({
                "reason":reason,"target":"paired","stage":"pairing","rejected_requests":1,
                "recordName":"PRIVATE_RECORD_CANARY"
            })
            .as_object()
            .unwrap()
            .clone(),
        );
    }
    save(&path, &mut history).unwrap();
    let (reopened, status) = read(&path);
    assert_eq!(status, "available");
    let saved: Vec<_> = reopened.cycles[0]
        .diagnostics
        .iter()
        .map(|observation| observation.fields["reason"].as_str().unwrap())
        .collect();
    assert_eq!(saved, reasons);
    assert!(
        !serde_json::to_string(&reopened)
            .unwrap()
            .contains("PRIVATE_RECORD_CANARY")
    );
}

#[test]
fn missing_reference_history_survives_restart_and_revalidates_export() {
    let dir = tempfile::tempdir().unwrap();
    let path = dir.path().join("support.json");
    let mut history = History {
        schema_version: 1,
        ..History::default()
    };
    apply(&mut history, Message::Begin(json!({})));
    let fields = json!({"record_history":"replacement", "prior_reference":"unavailable",
        "sparse_marker":"not_recorded", "linkage":"not_recorded", "lookup_outcome":"scope_unavailable", "lookup_family":"not_established", "lookup_scope":"child_unavailable", "lookup_shape":"provider_error"});
    add(
        &mut history,
        "support_missing_reference_v1",
        fields.as_object().unwrap().clone(),
    );
    apply(
        &mut history,
        Message::Complete(json!({}), "partial_failure"),
    );
    save(&path, &mut history).unwrap();
    let (reopened, status) = read(&path);
    assert_eq!(status, "available");
    let diagnostic = &reopened.cycles[0].diagnostics[0];
    assert_eq!(diagnostic.kind, "support_missing_reference_v1");
    assert_eq!(serde_json::Value::Object(diagnostic.fields.clone()), fields);
    let mut poisoned: serde_json::Value =
        serde_json::from_slice(&std::fs::read(&path).unwrap()).unwrap();
    for key in ["lookup_family", "lookup_scope", "lookup_shape"] {
        poisoned["cycles"][0]["diagnostics"][0]["fields"][key] = json!("private-provider-id");
    }
    std::fs::write(&path, serde_json::to_vec(&poisoned).unwrap()).unwrap();
    assert!(
        !serde_json::to_string(&read(&path).0)
            .unwrap()
            .contains("private-provider-id")
    );
}

#[test]
fn legacy_receipt_prerequisites_roundtrip_only_fixed_labels() {
    let dir = tempfile::tempdir().unwrap();
    let path = dir.path().join("support.json");
    let mut history = History {
        schema_version: 1,
        ..History::default()
    };
    apply(&mut history, Message::Begin(json!({})));
    let labels = [
        "child_not_ready",
        "rendition_missing",
        "path_receipt_missing",
        "receipt_binding_mismatch",
        "source_receipt_missing",
        "source_receipt_invalid",
        "receipt_state_changed",
        "diagnostic_unavailable",
    ];
    for label in labels {
        add(&mut history, "legacy_receipt_prerequisite_v1", json!({"prerequisite":label,"id":"private-id","path":"/private/path","checksum":"private-checksum","error":"private-error"}).as_object().unwrap().clone());
    }
    add(
        &mut history,
        "legacy_receipt_prerequisite_v1",
        json!({"prerequisite":"private-new-label"})
            .as_object()
            .unwrap()
            .clone(),
    );
    save(&path, &mut history).unwrap();
    let (reopened, status) = read(&path);
    assert_eq!(status, "available");
    let observed: Vec<_> = reopened.cycles[0]
        .diagnostics
        .iter()
        .filter_map(|d| {
            d.fields
                .get("prerequisite")
                .and_then(serde_json::Value::as_str)
        })
        .collect();
    assert_eq!(observed, labels);
    assert!(
        !serde_json::to_string(&reopened)
            .unwrap()
            .contains("private")
    );
}

#[test]
fn issue956_lookup_record_statuses_survive_reopen_and_reject_untrusted_values() {
    let directory = tempfile::tempdir().unwrap();
    let path = directory.path().join("history.json");
    let mut history = History {
        schema_version: 1,
        ..History::default()
    };
    apply(&mut history, Message::Begin(json!({})));
    for (master, child) in [("not_found", "returned"), ("returned", "access_denied")] {
        add(
            &mut history,
            "exact_lookup_rejection_v1",
            json!({
                "target":"paired","stage":"record_error","reason":"record_provider_error",
                "master_status":master,"child_status":child,"rejected_requests":3,
                "serverErrorCode":"PRIVATE_ERROR_CANARY","recordName":"PRIVATE_RECORD_CANARY"
            })
            .as_object()
            .unwrap()
            .clone(),
        );
    }
    save(&path, &mut history).unwrap();
    let (reopened, status) = read(&path);
    assert_eq!(status, "available");
    let events = &reopened.cycles[0].diagnostics;
    assert_eq!(events.len(), 2);
    assert_eq!(events[0].fields["master_status"], "not_found");
    assert_eq!(events[0].fields["child_status"], "returned");
    assert_eq!(events[1].fields["master_status"], "returned");
    assert_eq!(events[1].fields["child_status"], "access_denied");
    assert!(
        !serde_json::to_string(&reopened)
            .unwrap()
            .contains("PRIVATE_")
    );

    let mut untrusted = serde_json::to_value(&reopened).unwrap();
    untrusted["cycles"][0]["diagnostics"][0]["fields"]["master_status"] =
        json!("PRIVATE_STATUS_CANARY");
    untrusted["cycles"][0]["diagnostics"][0]["fields"]["child_status"] = json!(401);
    std::fs::write(&path, serde_json::to_vec(&untrusted).unwrap()).unwrap();
    let (clean, status) = read(&path);
    assert_eq!(status, "available");
    assert!(
        !clean.cycles[0].diagnostics[0]
            .fields
            .contains_key("master_status")
    );
    assert!(
        !clean.cycles[0].diagnostics[0]
            .fields
            .contains_key("child_status")
    );
    assert_eq!(
        clean.cycles[0].diagnostics[1].fields["child_status"],
        "access_denied"
    );
    assert!(!serde_json::to_string(&clean).unwrap().contains("PRIVATE_"));
}

#[test]
fn issue956_lookup_statuses_cross_the_production_tracing_recorder_and_reopen() {
    let statuses = [
        "not_requested",
        "omitted",
        "returned",
        "tombstone",
        "not_found",
        "access_denied",
        "authentication_failed",
        "zone_not_found",
        "retry_later",
        "throttled",
        "server_error",
        "other_error",
        "malformed_error",
    ];
    let _parallel_dispatch = tracing::Dispatch::new(tracing::subscriber::NoSubscriber::default());
    let (recorder, drain) = super::test_layer();
    let subscriber = tracing_subscriber::registry().with(recorder);
    tracing::subscriber::with_default(subscriber, || {
        for status in statuses {
            tracing::info!(
                diagnostic = "exact_lookup_rejection_v1",
                target = "paired",
                master_status = status,
                child_status = status,
                rejected_requests = 1u64,
                record_name = "PRIVATE_RECORD_CANARY",
                error = "PRIVATE_ERROR_CANARY",
                "PRIVATE_MESSAGE_CANARY"
            );
        }
        tracing::info!(
            diagnostic = "exact_lookup_rejection_v1",
            master_status = "PRIVATE_STATUS_CANARY",
            child_status = 401u64,
            rejected_requests = 2u64,
            "untrusted categories"
        );
    });
    let events = drain();
    assert_eq!(events.len(), statuses.len() + 1);
    for (event, status) in events.iter().zip(statuses) {
        assert_eq!(event["fields"]["master_status"], status);
        assert_eq!(event["fields"]["child_status"], status);
    }
    let last = events.last().unwrap()["fields"].as_object().unwrap();
    assert_eq!(last.len(), 1);
    assert_eq!(last["rejected_requests"], 2);
    assert!(!serde_json::to_string(&events).unwrap().contains("PRIVATE_"));

    let directory = tempfile::tempdir().unwrap();
    let path = directory.path().join("history.json");
    let mut history = History {
        schema_version: 1,
        ..History::default()
    };
    apply(&mut history, Message::Begin(json!({})));
    for event in events {
        add(
            &mut history,
            event["kind"].as_str().unwrap(),
            event["fields"].as_object().unwrap().clone(),
        );
    }
    save(&path, &mut history).unwrap();
    let (reopened, status) = read(&path);
    assert_eq!(status, "available");
    for (event, status) in reopened.cycles[0].diagnostics.iter().zip(statuses) {
        assert_eq!(event.fields["master_status"], status);
        assert_eq!(event.fields["child_status"], status);
    }
}

#[test]
fn issue956_child_reference_status_crosses_tracing_and_reopen_without_private_values() {
    use tracing_subscriber::layer::SubscriberExt;
    let labels = [
        "not_requested",
        "omitted",
        "unavailable",
        "invalid_child",
        "missing",
        "malformed",
        "sparse",
        "matches_requested",
        "different",
    ];
    let _parallel_dispatch = tracing::Dispatch::new(tracing::subscriber::NoSubscriber::default());
    let (recorder, drain) = super::test_layer();
    tracing::subscriber::with_default(tracing_subscriber::registry().with(recorder), || {
        for label in labels {
            tracing::info!(
                diagnostic = "exact_lookup_rejection_v1",
                child_reference_status = label,
                record_name = "PRIVATE_RECORD_CANARY",
                "PRIVATE_MESSAGE_CANARY"
            );
        }
    });
    let events = drain();
    assert_eq!(events.len(), labels.len());
    let directory = tempfile::tempdir().unwrap();
    let path = directory.path().join("history.json");
    let mut history = History {
        schema_version: 1,
        ..History::default()
    };
    apply(&mut history, Message::Begin(json!({})));
    for (event, label) in events.iter().zip(labels) {
        assert_eq!(event["fields"]["child_reference_status"], label);
        add(
            &mut history,
            "exact_lookup_rejection_v1",
            event["fields"].as_object().unwrap().clone(),
        );
    }
    save(&path, &mut history).unwrap();
    let (reopened, status) = read(&path);
    assert_eq!(status, "available");
    assert_eq!(reopened.cycles[0].diagnostics.len(), labels.len());
    for (event, label) in reopened.cycles[0].diagnostics.iter().zip(labels) {
        assert_eq!(event.fields["child_reference_status"], label);
    }
    assert!(
        !serde_json::to_string(&reopened)
            .unwrap()
            .contains("PRIVATE_")
    );
    let mut untrusted = serde_json::to_value(&reopened).unwrap();
    for (index, invalid) in [json!("PRIVATE_REFERENCE_CANARY"), json!(42)]
        .into_iter()
        .enumerate()
    {
        untrusted["cycles"][0]["diagnostics"][index]["fields"]["child_reference_status"] = invalid;
    }
    std::fs::write(&path, serde_json::to_vec(&untrusted).unwrap()).unwrap();
    let (clean, status) = read(&path);
    assert_eq!(status, "available");
    assert!(
        clean.cycles[0].diagnostics[..2]
            .iter()
            .all(|event| !event.fields.contains_key("child_reference_status"))
    );
    assert_eq!(
        clean.cycles[0].diagnostics[2].fields["child_reference_status"],
        labels[2]
    );
    assert!(!serde_json::to_string(&clean).unwrap().contains("PRIVATE_"));
}

#[test]
fn storage_reuse_counters_saturate_and_preserve_last_stop() {
    let mut reuse = super::StorageReuse::default();
    reuse.inbox.new = u64::MAX;
    reuse.inbox.exact = u64::MAX;
    reuse.inbox.equivalent = u64::MAX;
    reuse.inbox.capacity_rejected = u64::MAX;
    reuse.inbox.single_item_limit = u64::MAX;
    reuse.record(
        super::StorageComponent::Inbox,
        super::StorageOutcome::New,
        Some((7, 11)),
    );
    reuse.record(
        super::StorageComponent::Inbox,
        super::StorageOutcome::Exact,
        None,
    );
    reuse.record(
        super::StorageComponent::Inbox,
        super::StorageOutcome::Equivalent,
        None,
    );
    reuse.record(
        super::StorageComponent::Inbox,
        super::StorageOutcome::CapacityRejected,
        Some((8, 11)),
    );
    assert!(reuse.inbox.observed);
    assert!(!reuse.catalogue.observed);
    assert_eq!(reuse.inbox.new, u64::MAX);
    assert_eq!(reuse.inbox.exact, u64::MAX);
    assert_eq!(reuse.inbox.equivalent, u64::MAX);
    assert_eq!(reuse.inbox.capacity_rejected, u64::MAX);
    assert_eq!(reuse.inbox.last_reason, super::ReuseReason::Capacity);
    assert_eq!(reuse.inbox.last_observed_used, Some(8));
    assert_eq!(reuse.inbox.last_observed_limit, Some(11));
    reuse.record(
        super::StorageComponent::Selection,
        super::StorageOutcome::SingleItemLimit,
        None,
    );
    assert_eq!(reuse.selection.single_item_limit, 1);
    assert_eq!(
        reuse.selection.last_reason,
        super::ReuseReason::SingleItemLimit
    );
    assert_eq!(reuse.selection.last_observed_used, None);
    reuse.record(
        super::StorageComponent::Selection,
        super::StorageOutcome::Exact,
        Some((3, 9)),
    );
    assert_eq!(
        reuse.selection.last_reason,
        super::ReuseReason::SingleItemLimit
    );
    assert_eq!(reuse.selection.last_observed_used, Some(3));
    assert_eq!(reuse.selection.last_observed_limit, Some(9));
}

#[test]
fn migration_evidence_replaces_counts_and_budgets_with_the_last_result() {
    let mut history = History {
        schema_version: 1,
        ..History::default()
    };
    apply(&mut history, Message::Begin(json!({})));
    super::apply_migration(
        &mut history,
        super::MigrationEvent::Committed(super::CompactionSummary {
            examined_raw_pages: 10,
            logical_charge_before: Some(100),
            logical_charge_after: Some(40),
            ..Default::default()
        }),
    );
    super::apply_migration(
        &mut history,
        super::MigrationEvent::Committed(super::CompactionSummary {
            examined_raw_pages: 2,
            logical_charge_before: Some(9),
            logical_charge_after: Some(4),
            ..Default::default()
        }),
    );
    let evidence = &history.cycles[0].transport_compaction;
    assert_eq!(evidence.committed, 2);
    assert_eq!(evidence.examined_raw_pages, 2);
    assert_eq!(evidence.logical_charge_before, Some(9));
    assert_eq!(evidence.logical_charge_after, Some(4));
    assert_eq!(evidence.committed_reclaim, Some(5));
    super::apply_migration(
        &mut history,
        super::MigrationEvent::Failed(super::MigrationFailure::MigrationFailed),
    );
    let evidence = &history.cycles[0].transport_compaction;
    assert_eq!(evidence.failed, 1);
    assert_eq!(evidence.reason, super::CompactionReason::MigrationFailed);
    assert_eq!(evidence.examined_raw_pages, 0);
    assert_eq!(evidence.logical_charge_before, None);
    assert_eq!(evidence.logical_charge_after, None);
    assert_eq!(evidence.committed_reclaim, Some(0));
    assert_eq!(evidence.committed, 2);
}

#[test]
fn older_storage_and_migration_fields_default_without_rejecting_history() {
    let value = json!({
        "schema_version": 1,
        "cycles_evicted": 0,
        "queue_dropped": 0,
        "groups_omitted": 0,
        "previous_history_unavailable": false,
        "cycles": [{
            "id": uuid::Uuid::new_v4().to_string(),
            "started_at": "2026-10-22T00:00:00Z",
            "completed_at": null,
            "outcome": "running",
            "build_version": "0.25.1",
            "configuration": {},
            "stats": {},
            "diagnostics": [],
            "storage_reuse": {
                "inbox": {"new":1,"exact":0,"equivalent":0,"capacity_rejected":0},
                "selection": {"new":0,"exact":0,"equivalent":0,"capacity_rejected":0},
                "work": {"new":0,"exact":0,"equivalent":0,"capacity_rejected":0}
            },
            "transport_compaction": {
                "committed": 1,
                "failed": 0,
                "reason": "committed",
                "examined_raw_pages": 2
            }
        }]
    });
    let history: History = serde_json::from_value(value).unwrap();
    assert_eq!(history.cycles[0].storage_reuse.inbox.new, 1);
    assert_eq!(history.cycles[0].storage_reuse.catalogue.new, 0);
    assert_eq!(history.cycles[0].storage_reuse.inbox.single_item_limit, 0);
    assert_eq!(
        history.cycles[0].transport_compaction.logical_charge_before,
        None
    );
}

#[test]
fn unknown_fixed_enum_labels_do_not_escape_from_stored_history() {
    let directory = tempfile::tempdir().unwrap();
    let path = directory.path().join("support.json");
    let cycle = json!({
        "id": uuid::Uuid::new_v4().to_string(),
        "started_at": "2026-10-22T00:00:00Z",
        "completed_at": null,
        "outcome": "running",
        "build_version": "0.25.1",
        "configuration": {},
        "stats": {},
        "diagnostics": []
    });
    let mut value = json!({
        "schema_version": 1,
        "cycles_evicted": 0,
        "queue_dropped": 0,
        "groups_omitted": 0,
        "previous_history_unavailable": false,
        "cycles": [cycle]
    });
    value["cycles"][0]["storage_reuse"] = json!({"inbox":{"last_reason":"PRIVATE_ENUM_CANARY"}});
    std::fs::write(&path, serde_json::to_vec(&value).unwrap()).unwrap();
    let (clean, status) = read(&path);
    assert_eq!(status, "invalid_or_interrupted");
    assert!(
        !serde_json::to_string(&clean)
            .unwrap()
            .contains("PRIVATE_ENUM_CANARY")
    );
    value["cycles"][0]["storage_reuse"] = json!({});
    value["cycles"][0]["transport_compaction"] = json!({"reason":"PRIVATE_ENUM_CANARY"});
    std::fs::write(&path, serde_json::to_vec(&value).unwrap()).unwrap();
    let (clean, status) = read(&path);
    assert_eq!(status, "invalid_or_interrupted");
    assert!(
        !serde_json::to_string(&clean)
            .unwrap()
            .contains("PRIVATE_ENUM_CANARY")
    );
}