chromaframe-sdk 0.1.1

Deterministic, privacy-preserving color measurement and ranking SDK
Documentation
use crate::image::MeasurementReport;
use crate::types::{AgentBrief, EvidenceCard};

pub fn evidence_cards(report: &MeasurementReport) -> Vec<EvidenceCard> {
    let confidence = report
        .rankings
        .first()
        .map_or(0.0, |ranking| ranking.confidence);
    vec![
        EvidenceCard {
            kind: "facial_contrast_v1".to_string(),
            summary: "Measured directional feature contrast informs goal fit.".to_string(),
            confidence,
        },
        EvidenceCard {
            kind: "skin_uniformity_v1".to_string(),
            summary: "Skin-region measurements inform penalty and uncertainty only.".to_string(),
            confidence,
        },
        EvidenceCard {
            kind: "calibration_uncertainty_v1".to_string(),
            summary: format!(
                "Capture mode and quality produce confidence {:.2}.",
                confidence
            ),
            confidence,
        },
    ]
}

pub fn agent_brief(report: &MeasurementReport) -> AgentBrief {
    let uncertainty = report.rankings.first().map_or(
        "No ranking because required measurements are missing.".to_string(),
        |ranking| {
            format!(
                "Confidence {:.2}; interpret as goal-specific uncertainty, not personal worth.",
                ranking.confidence
            )
        },
    );
    AgentBrief { summary: "Ranking is based on measured color contrast, candidate color, and requested goal vector.".to_string(), uncertainty }
}

pub fn contains_prohibited_claim(text: &str) -> bool {
    let lower = text.to_ascii_lowercase();
    [
        "beauty score",
        "attractiveness",
        "race",
        "medical diagnosis",
        "identity recognition",
        "skin-tone-to-palette",
    ]
    .iter()
    .any(|phrase| lower.contains(phrase))
}