# APLD Forecast-vs-Actual Ledger Validation Report

Status: PASS

Validation scope:
- Manifest file: `apld_forecast_actual_manifest.csv`
- Ledger file: `apld_forecast_actual_rows.csv`
- Validator: `validate_apld_forecast_actual.py`
- Extractor: `extract_apld_forecast_actual.py`

Checks implemented:
- Required row fields are present: company, period, metric_name, raw_value, normalized_value, unit, value_qualifier, ownership_basis, forecast_or_actual, is_derived, source_url, source_location, source_snippet, snippet_support_status, confidence, caveat.
- Minimum ledger row count is at least 30.
- Every source URL is HTTPS and appears in the manifest.
- `forecast_or_actual` is restricted to `forecast` or `actual`, and both classes are present.
- Units are restricted to `MW`, `USD_billions`, `USD_millions`, and `year`.
- Unit coverage includes MW and USD billions.
- Additive MW rows such as `106+180` and `150+150` normalize correctly.
- GW rows normalize to MW when snippet text uses GW/gigawatt.
- Snippet provenance is non-empty and contains value support.
- Ownership basis coverage includes critical IT load, gross utility power, legacy hosting, lease base-term revenue, and property/equipment development investment.

Expected validation output:

APLD forecast-vs-actual validation passed

- manifest rows: 11
- ledger rows: 40
- classes: ['actual', 'forecast']
- units: ['MW', 'USD_billions', 'USD_millions', 'year']
- provenance: every row source_url appears in manifest
- normalization: additive MW and GW-to-MW conversions checked
- ownership basis: critical IT load, utility power, legacy hosting, lease revenue, and PPE/development bases represented

Known caveats:
- Several source snippets come from IR PDFs; repeatable extraction should use PDF text extraction when materializing source text, but the direct primary URLs are stable IR PDF URLs.
- Contracted capacity is deliberately not treated as operating capacity.
- Gross utility power and net critical IT load are separate units of analysis even when both are measured in MW.
- The `year` normalized value for August 2027 is a sortable approximation only; the raw value preserves the actual commencement window.
