{"schemaVersion":"validation-sprint-v1","editionDate":"2026-08-02","cadence":"Monthly","sprints":[{"schemaVersion":"validation-sprint-v1","sprintKey":"publication-integrity","editionDate":"2026-08-02","title":"Publication Integrity Validation Sprint","objective":"Reproduce the public publication-contract checks, separate ledger projection gaps from genuinely unavailable releases, and verify whether non-contract release evidence is connected.","status":"hold","scope":["The complete public data-status and data-trust projections for 32 registered products.","Field-level review of grid-source-registry, grid-edge-conditions, constraint-consequence-ledger, export-flexibility-dividend, rooftop-forecast-record and der-adoption-ledger.","Reachability and declared content type for the 19 exports named by those six product contracts.","Non-contract release verification receipts and consistency between public product outputs and the shared release ledger."],"checks":[{"checkKey":"publication-contract-field-reproduction","label":"Mandatory publication fields","status":"warning","method":"Applied the same presence rule used by the trust register: sourceLabel, currentVersion, coverage, cadence, dataConfidence, knownLimit and at least one of observationPeriodEnd, latestObservationDate or latestReleaseDate must be non-empty.","evidence":[{"label":"Live data-status register","reference":"https://solaranalytica.com/data-status/data.json","asOf":"2026-08-02"},{"label":"Live data-trust register","reference":"https://solaranalytica.com/data-trust/data.json","asOf":"2026-08-02"},{"label":"Trust completeness implementation","reference":"lib/data-trust.ts","asOf":"2026-08-02"}],"observedResult":"Grid Source Registry now carries its exact source-check date and current-version release. Five target products retain contract warnings: Grid Edge lacks a durable fixed-edition date; three source products remain unavailable; Export Flexibility remains non-current and provisional.","boundary":"This check assesses shared publication metadata only. A schemaVersion or methodVersion on a route is not treated as a released data edition, and metadata completeness does not prove source accuracy."},{"checkKey":"declared-export-reachability","label":"Declared public exports","status":"pass","method":"Issued read-only HTTP GET requests to every JSON, CSV, schema and health export declared for the six products and compared response content types with the declared format.","evidence":[{"label":"Product export declarations","reference":"content/data-product-contracts.json","asOf":"2026-08-02"},{"label":"Grid source registry export","reference":"https://solaranalytica.com/data/grid-sources/data.json","asOf":"2026-08-02"},{"label":"Export flexibility export","reference":"https://solaranalytica.com/export-flexibility-dividend/data.json","asOf":"2026-08-02"}],"observedResult":"All 19 declared exports returned HTTP 200; JSON and schema routes returned application/json and CSV routes returned text/csv.","boundary":"HTTP 200 proves route reachability only. Three JSON routes deliberately return status=unavailable, so this result is not evidence that their source datasets have been released."},{"checkKey":"non-contract-release-receipts","label":"Release verification evidence","status":"fail","method":"Counted public data-trust releaseReceipts after excluding the contract-completeness receipt across all 32 products, then isolated the six warning products.","evidence":[{"label":"Live data-trust release receipts","reference":"https://solaranalytica.com/data-trust/data.json","asOf":"2026-08-02"}],"observedResult":"Grid Source Registry now has one exact public non-contract route verification receipt. The other five target products retain their receipt holds, including explicit pass-receipt prohibitions for the three unavailable products.","boundary":"Absence from the shared trust register does not prove that no internal validation occurred; it means the public release cannot currently recover an inspectable verification receipt from that register."},{"checkKey":"live-vintage-projection","label":"Live vintage projection","status":"warning","method":"Compared the edition and vintage fields in each product's public JSON with currentVersion and observation-date fields in data-status and data-trust.","evidence":[{"label":"Grid source registry","reference":"https://solaranalytica.com/data/grid-sources/data.json","asOf":"2026-08-02"},{"label":"Grid edge conditions","reference":"https://solaranalytica.com/grid-edge-conditions/data.json","asOf":"2026-08-02"},{"label":"Shared status projection","reference":"https://solaranalytica.com/data-status/data.json","asOf":"2026-08-02"}],"observedResult":"Grid Source Registry sourceVintage 2026-08-02T09:54:19.000Z is projected into sourceCheckedAt and its exact release receipt. Grid Edge remains live-recovery and cannot inherit a durable edition date from a request timestamp.","boundary":"The route fields are inspectable evidence of a vintage or edition, but the audit does not choose which shared date column is semantically correct; that mapping must be explicit in the parent-owned release pipeline."},{"checkKey":"export-flexibility-publication-state","label":"Export model publication state","status":"pass","method":"Inspected the local v2 result contract, JSON Schema, CSV projection and interface copy, then ran the focused model and public-contract tests to verify that every calculated result carries the same mandatory publication boundary.","evidence":[{"label":"Local v2 result contract","reference":"lib/export-flexibility-dividend-core.mjs","asOf":"2026-08-02"},{"label":"Required JSON Schema boundary","reference":"app/export-flexibility-dividend/schema.json/route.ts","asOf":"2026-08-02"},{"label":"Publication boundary tests","reference":"tests/export-flexibility-dividend.test.mjs","asOf":"2026-08-02"}],"observedResult":"The local public schema is export-flexibility-dividend-public-v2. Every result requires publication.state=interactive_model_only, canonicalBenchmarkPublished=false, durableReleaseStatus=provisional, computationalVerification.status=passed with checkedOn=2026-08-02, and empiricalValidation.status=pending with no cohort edition and an explicit limitation. The former ambiguity between calculated output and canonical publication is resolved.","boundary":"This pass verifies truthful publication semantics and computational checks only. It does not fill the shared currentVersion field, create a public non-contract release receipt, publish a canonical benchmark or establish empirical accuracy and transferability."},{"checkKey":"unavailable-release-boundaries","label":"Unavailable products remain explicit","status":"pass","method":"Inspected status, reason, editionVersion, sourceUpdatedAt and sourceReceipts on the three source-dependent public JSON responses.","evidence":[{"label":"Constraint ledger response","reference":"https://solaranalytica.com/constraint-consequence-ledger/data.json","asOf":"2026-08-02"},{"label":"Rooftop forecast response","reference":"https://solaranalytica.com/rooftop-forecast-record/data.json","asOf":"2026-08-02"},{"label":"DER adoption response","reference":"https://solaranalytica.com/der-adoption-ledger/data.json","asOf":"2026-08-02"}],"observedResult":"constraint-consequence-ledger, rooftop-forecast-record and der-adoption-ledger each return status=unavailable, a specific source-integration reason and an empty sourceReceipts array; none substitutes example or zero-filled observations.","boundary":"The method and response contracts are publishable, but the three data products remain recovering and unresearched until receipt-pinned source editions are integrated."},{"checkKey":"priority-evidence-mapping-classification","label":"Evidence-backed metadata mapping classification","status":"pass","method":"Classified each of the six priority products using only exact currentVersion matches, accepted freshness-basis dates, route serving mode, explicit unavailable state and durable provisional or canonical release status.","evidence":[{"label":"Executable mapping classifier","reference":"lib/validation-sprints/publication-integrity.mjs#assessPriorityPublicationMappings","asOf":"2026-08-02"},{"label":"Live priority route review","reference":"https://solaranalytica.com/data-status/data.json","asOf":"2026-08-02T08:38:54Z"},{"label":"Mapping boundary tests","reference":"tests/validation-publication-integrity.test.mjs","asOf":"2026-08-02"}],"observedResult":"Grid Source Registry is exactly mapped and release-verified. Grid Edge remains live-recovery; Export Flexibility remains provisional and non-current; the remaining three products remain unavailable and prohibit pass receipts.","boundary":"The classifier identifies safe metadata actions; it does not write production rows. A route label, recovery request timestamp, schema version or provisional model contract cannot be promoted into a canonical currentVersion or pass receipt."}],"findings":[{"findingKey":"export-publication-state-conflict","severity":"critical","status":"resolved","productKeys":["export-flexibility-dividend"],"summary":"The former ambiguity between interactive calculated outputs and an unpublished canonical benchmark is resolved by the mandatory v2 publication object.","evidence":"The local v2 contract requires state=interactive_model_only, canonicalBenchmarkPublished=false and durableReleaseStatus=provisional; computational verification passed on 2026-08-02 while empirical validation remains pending with no cohort edition. JSON Schema, CSV, page, workbench, methodology, machine-readable guidance and focused tests expose the same boundary.","action":"Preserve the publication object as a required cross-surface contract. Do not set canonicalBenchmarkPublished=true or empirical validation to passed until a durable canonical release and qualifying measured cohort carry their own receipts. Shared product-version and release-receipt remediation remains separate."},{"findingKey":"shared-release-receipt-gap","severity":"high","status":"open","productKeys":["grid-edge-conditions","constraint-consequence-ledger","export-flexibility-dividend","rooftop-forecast-record","der-adoption-ledger"],"summary":"Five priority products still lack an eligible public non-contract release verification receipt.","evidence":"Grid Source Registry is release-verified. Grid Edge remains live-recovery, Export Flexibility remains provisional and non-current, and three source products remain unavailable with pass receipts prohibited.","action":"Write public data_verification_receipts only after the named check has run. Current products need source-total, schema or recalculation receipts with observed results; unavailable products must remain without pass receipts until real source editions exist."},{"findingKey":"grid-edition-vintage-not-projected","severity":"high","status":"open","productKeys":["grid-edge-conditions"],"summary":"Grid Edge still lacks an eligible durable edition vintage in the shared publication record.","evidence":"Grid Source Registry is exactly projected. Grid Edge is still served from live recovery, so its request-time source cutoff cannot be promoted into a fixed release receipt.","action":"Project the registry source vintage and Grid Edge period end into explicitly chosen data_products date fields, create matching data_product_releases where an immutable edition exists, and attach verification receipts. Do not infer a release date from request generatedAt."},{"findingKey":"source-editions-not-integrated","severity":"medium","status":"accepted_limit","productKeys":["constraint-consequence-ledger","rooftop-forecast-record","der-adoption-ledger"],"summary":"The three source-dependent contracts are public, but their source data editions are intentionally unavailable.","evidence":"Each endpoint states status=unavailable with no source update and no source receipt, matching currentVersion=null, no observation date, recovering status and Unresearched confidence in the shared register.","action":"Keep the products held until receipt-pinned source editions pass reuse, schema and source-total checks. Do not promote schemaVersion, methodVersion, unpublished or source-not-integrated sentinels into currentVersion."},{"findingKey":"warning-classification-correct","severity":"low","status":"resolved","productKeys":["grid-source-registry","grid-edge-conditions","constraint-consequence-ledger","export-flexibility-dividend","rooftop-forecast-record","der-adoption-ledger"],"summary":"The six warning labels are not false positives under the current shared publication-contract rule.","evidence":"The executable audit reproduced every warning from field presence and detected zero warning-on-complete-record cases.","action":"Retain warning status until the missing shared fields are durably connected; improve the public observedResult later so it names exact fields instead of the generic one-or-more-fields message."}],"corrections":[{"correctionKey":"publication-integrity-executable-audit","status":"implemented","summary":"Added a pure audit that reports exact missing field groups, trust-status disagreement, release-receipt state and data-status/data-trust projection mismatches.","files":["lib/validation-sprints/publication-integrity.mjs","tests/validation-publication-integrity.test.mjs"]},{"correctionKey":"publication-integrity-fixed-edition","status":"verified","summary":"Recorded the 2026-08-02 field-level evidence, route checks, release gaps and explicit boundaries without promoting unavailable source editions.","files":["content/validation-sprints/publication-integrity.json"]},{"correctionKey":"publication-ledger-remediation","status":"implemented","summary":"Added a fail-closed Grid Source Registry trust synchronizer that writes only the exact current-version release, source vintage and deterministic five-source verification receipt. The other five priority products retain their recovery, provisional or unavailable holds.","files":["lib/priority-publication-trust-core.mjs","lib/priority-publication-trust.ts","lib/operations-pipelines.ts","lib/trust-release.ts"]},{"correctionKey":"export-interactive-model-publication-boundary","status":"verified","summary":"Verified the parent-owned v2 boundary that distinguishes interactive calculations from a canonical durable release and keeps empirical validation pending.","files":["lib/export-flexibility-dividend-core.mjs","app/export-flexibility-dividend/schema.json/route.ts","app/export-flexibility-dividend/data.csv/route.ts","components/export-flexibility-dividend-workbench.tsx","docs/export-flexibility-dividend-product-contract.md"]},{"correctionKey":"priority-mapping-boundary-classifier","status":"implemented","summary":"Added an executable six-product mapping audit that exposes the one exact Grid Source Registry date action while preserving Grid Edge recovery, Export Flexibility provisional and three unavailable-source holds.","files":["lib/validation-sprints/publication-integrity.mjs","tests/validation-publication-integrity.test.mjs","content/validation-sprints/publication-integrity.json"]}],"releaseDecision":{"state":"hold","reason":"The export model's publication semantics are now explicit and internally consistent, but Publication Integrity remains held until the two grid vintages are projected into the shared ledger and real non-contract release receipts are available. The three source-integration products correctly remain unavailable, and Export Flexibility still lacks a shared currentVersion and receipt."},"nextReview":{"cadence":"Monthly","dueOn":"2026-09-02","trigger":"Review earlier if the export model's canonical or empirical state changes, a target source edition is integrated, a target data_products row changes, or a public verification receipt is added."},"liveReverification":{"status":"grid_source_registry_release_verified","checkedAt":"2026-08-09T09:40:32.850Z","productKey":"grid-source-registry","releaseVersion":"grid-source-registry-v2","receiptKey":"grid-source-registry-route-contract"}},{"schemaVersion":"validation-sprint-v1","sprintKey":"decision-readiness","editionDate":"2026-08-02","title":"Decision Readiness Validation","objective":"Audit every current decision profile, preserve the required-versus-optional evidence rule, and separate source or operational blockers from registration and release-receipt gaps.","status":"passed_with_actions","scope":["Nine decision profiles returned by the live data-status endpoint","Thirty-four required and optional profile-input instances","Product version, confidence, operational status, freshness-basis dates and release receipts","Migration-declared dependencies for products used by decision profiles"],"checks":[{"checkKey":"all-current-profiles-reproduced","label":"All current profile states reproduced","status":"pass","method":"Ran the executable decision-readiness diagnostic over every profile, product and release receipt returned by the live data-status endpoint, retaining assessDecisionReadiness as the state authority.","evidence":[{"label":"Live data-status contract","reference":"https://solaranalytica.com/data-status/data.json","asOf":"2026-08-02T03:17:50.952Z"},{"label":"Executable diagnostic","reference":"lib/validation-sprints/decision-readiness.mjs","asOf":"2026-08-02"}],"observedResult":"All nine profiles were audited: one Ready, four Caution and four Hold, with no profile promoted by the validation layer.","boundary":"The fixed result describes the named endpoint snapshot. A later source-health transition can change readiness and requires a new dated run."},{"checkKey":"required-blocker-precedence","label":"Required blockers dominate readiness","status":"pass","method":"Executed fixture tests with a required recovering product and separately inspected every live required input marked Hold.","evidence":[{"label":"Decision readiness sprint tests","reference":"tests/validation-decision-readiness-sprint.test.mjs","asOf":"2026-08-02"},{"label":"Existing readiness method","reference":"lib/decision-readiness.mjs","asOf":"2026-08-02"}],"observedResult":"A required recovering input produces Hold. The four live Holds each resolve to a required operations blocker, not an optional-context or bookkeeping issue.","boundary":"The diagnostic explains the existing method result; it does not alter the profile registry or override product health."},{"checkKey":"optional-context-ceiling","label":"Optional degradation caps at Caution","status":"pass","method":"Executed fixture tests with all required inputs Ready and one optional recovering input, then compared the result with live Caution profiles.","evidence":[{"label":"Decision readiness sprint tests","reference":"tests/validation-decision-readiness-sprint.test.mjs","asOf":"2026-08-02"},{"label":"Live data-status contract","reference":"https://solaranalytica.com/data-status/data.json","asOf":"2026-08-02T03:17:50.952Z"}],"observedResult":"Optional degradation produced Caution, never Hold. Six optional-context blocker instances were classified with their operations or confidence root cause retained.","boundary":"An optional input can explain caution only while every required input remains usable under the existing readiness method."},{"checkKey":"release-receipt-resolution","label":"Current versions resolve to release receipts","status":"warning","method":"Matched each profile input's productKey and currentVersion against the release ledger, preserving missing and version-mismatch outcomes as metadata findings.","evidence":[{"label":"Live product and release ledger","reference":"https://solaranalytica.com/data-status/data.json","asOf":"2026-08-02T03:17:50.952Z"}],"observedResult":"Thirty of 34 profile-input instances matched an exact receipt. Product-Market Evidence, SWIS DER Adoption, Export Constraint Regime Register and Australia Grid Edge Conditions had a missing or mismatched direct receipt trace.","boundary":"A missing direct receipt is a registration gap unless separate evidence proves the underlying source absent or invalid; it is not automatically an evidence failure."},{"checkKey":"freshness-basis-date-completeness","label":"Freshness dates follow the product basis","status":"warning","method":"Evaluated one accepted date alternative per product freshnessBasis: sourceCheckedAt or latestRetrievedAt for source_check, sourceReleaseDate or latestReleaseDate for source_release, observationPeriodEnd or latestObservationDate for observation_period, and lastMaterialReleaseAt, latestReleaseDate or latestRetrievedAt for editorial_review.","evidence":[{"label":"Live product status ledger","reference":"https://solaranalytica.com/data-status/data.json","asOf":"2026-08-02T03:17:50.952Z"},{"label":"Freshness basis product contract","reference":"supabase/migrations/20260722150000_add_data_truth_release_factory.sql","asOf":"2026-08-02"},{"label":"Basis-aware regression tests","reference":"tests/validation-decision-readiness-sprint.test.mjs","asOf":"2026-08-02"}],"observedResult":"Thirty-three of 34 profile-input instances satisfy their registered date basis. Australia Grid Edge Conditions is the only unresolved instance because its source_check basis has neither sourceCheckedAt nor latestRetrievedAt.","boundary":"Dates belonging to another freshness basis are non-applicable and are neither required nor reported missing. An unknown basis remains not tested rather than borrowing alternatives."},{"checkKey":"dependency-trace","label":"Declared product dependencies traced","status":"warning","method":"Joined the eight migration-declared dependency edges relevant to current profile products to the live product status snapshot and inspected required dependency state.","evidence":[{"label":"Data product dependency migration","reference":"supabase/migrations/20260722150000_add_data_truth_release_factory.sql","asOf":"2026-08-02"},{"label":"Temporal value dependency migration","reference":"supabase/migrations/20260727213000_add_temporal_value_ledger.sql","asOf":"2026-08-02"},{"label":"Live product status","reference":"https://solaranalytica.com/data-status/data.json","asOf":"2026-08-02T03:17:50.952Z"}],"observedResult":"All supplied required dependency rows resolved to registered products in the snapshot, but the public data-status contract does not expose the raw dependency rows used by the server-side health fold.","boundary":"Dependency completeness was checked against repository-declared rows, not a read of the owner-only production dependency table."},{"checkKey":"bookkeeping-evidence-separation","label":"Bookkeeping is not treated as evidence loss","status":"pass","method":"Executed fixtures separating an absent release receipt from evidence loss and proving that only the alternatives declared by freshnessBasis participate in date completeness.","evidence":[{"label":"Decision readiness sprint tests","reference":"tests/validation-decision-readiness-sprint.test.mjs","asOf":"2026-08-02"},{"label":"Executable diagnostic","reference":"lib/validation-sprints/decision-readiness.mjs","asOf":"2026-08-02"}],"observedResult":"The rerun reports five bookkeeping findings: four unresolved direct receipt traces and one basis-aware source-check date gap. Six universal-field false positives were removed without changing readiness.","boundary":"This separation does not excuse missing receipts. It prevents an unknown registration state from being overstated as proof that the source evidence failed."}],"findings":[{"findingKey":"revenue-shape-required-recovery","severity":"high","status":"open","productKeys":["revenue-shape-monitor"],"summary":"Revenue Shape Monitor is recovering and creates required operations Holds for Storage market structure and NEM market structure.","evidence":"The live product is High confidence and versioned with a matching receipt, so this is an operations blocker rather than a missing-registration blocker.","action":"Restore a successful source-health and derived-view run, issue the resulting release receipt, and rerun readiness before either profile can leave Hold."},{"findingKey":"solar-pipeline-recovery","severity":"high","status":"open","productKeys":["solar-capacity-pipeline"],"summary":"Solar Capacity Pipeline is recovering, holding two profiles and capping three further profiles at Caution where it is optional context.","evidence":"The current product is High confidence and versioned, with a matching release receipt; its recovering operational status is the root issue in the snapshot.","action":"Resolve the Global Energy Monitor pipeline health state and verify a new successful receipt before rerunning all five affected profiles."},{"findingKey":"direct-receipt-registration-gaps","severity":"medium","status":"open","productKeys":["product-market-evidence","swis-der","export-constraint-regimes","grid-edge-conditions"],"summary":"Four profile-input instances do not resolve productKey plus currentVersion to an exact direct release receipt.","evidence":"Product-Market Evidence, Export Constraint Regime Register and Australia Grid Edge Conditions have no direct matching receipt; SWIS DER Adoption has hashed receipt versions that do not equal its registered currentVersion.","action":"Register a direct canonical receipt or align currentVersion to the exact immutable receipt version without changing the underlying evidence state."},{"findingKey":"freshness-basis-date-gap","severity":"medium","status":"open","productKeys":["grid-edge-conditions"],"summary":"Australia Grid Edge Conditions does not resolve either accepted timestamp for its source_check freshness basis.","evidence":"The live product has neither sourceCheckedAt nor latestRetrievedAt. Grid Mix and Export Constraint Regime Register satisfy their own source_release and source_check bases respectively and are no longer findings.","action":"Register sourceCheckedAt or latestRetrievedAt from an inspectable source-check receipt; do not backfill non-applicable release, observation or editorial dates."},{"findingKey":"aggregate-grid-operations-version","severity":"medium","status":"open","productKeys":["grid-operations"],"summary":"The shared Grid Operations product exposes one aggregate currentVersion even when a decision profile targets NEM, SWIS, GB, US or EU evidence.","evidence":"The snapshot registers operations-eu-2026-07-31 as currentVersion while separate same-cycle NEM, SWIS, GB and US receipts also exist.","action":"Resolve the selected market to its matching regional receipt in future readiness exports while retaining the aggregate product registration."},{"findingKey":"dependency-ledger-not-publicly-traceable","severity":"low","status":"open","productKeys":[],"summary":"The public readiness payload includes dependency-adjusted operational status but not the dependency edges that produced it.","evidence":"Repository migrations declare product dependencies, while the live data-status JSON returns products, releases and profiles only.","action":"Expose a sanitized dependency trace or include dependency cause codes in the future validation endpoint."}],"corrections":[{"correctionKey":"decision-readiness-diagnostic","status":"implemented","summary":"Added a pure executable diagnostic that wraps the existing readiness result, classifies blocker causes and evaluates date completeness against the product's registered freshness basis.","files":["lib/validation-sprints/decision-readiness.mjs"]},{"correctionKey":"basis-aware-date-alternatives","status":"implemented","summary":"Replaced the universal six-field date requirement with explicit alternatives for source checks, source releases, observation periods and editorial reviews.","files":["lib/validation-sprints/decision-readiness.mjs","content/validation-sprints/decision-readiness.json","tests/validation-decision-readiness-sprint.test.mjs"]},{"correctionKey":"fixed-decision-readiness-audit","status":"verified","summary":"Recorded the dated nine-profile audit with release-receipt coverage, evidence boundaries and remediation for every Hold and Caution profile.","files":["content/validation-sprints/decision-readiness.json"]},{"correctionKey":"decision-readiness-regression-tests","status":"implemented","summary":"Added regression coverage for blocker precedence, optional-context capping, bookkeeping separation, all four freshness bases and fixed artifact completeness.","files":["tests/validation-decision-readiness-sprint.test.mjs"]}],"releaseDecision":{"state":"release_with_caution","reason":"The validation artifact and diagnostic are releasable because they reproduce all current states without upgrading any profile. Open operational Holds and receipt-trace warnings remain visible and must be reviewed on the next run."},"nextReview":{"cadence":"Monthly","dueOn":"2026-09-02","trigger":"Run earlier if Revenue Shape Monitor or Solar Capacity Pipeline leaves recovery, a currentVersion changes, a profile input changes, or a new product release receipt is registered."}},{"schemaVersion":"validation-sprint-v1","sprintKey":"grid-reconciliation","editionDate":"2026-08-02","title":"Grid Reconciliation Validation Sprint","objective":"Prove deterministic daily-aggregate comparison behaviour across the five current grid source families while preserving measurement and serving boundaries.","status":"hold","scope":["AEMO NEM legacy daily operations against canonical shadow observations","AEMO WEM and SWIS legacy operations against canonical shadow observations","EIA-930 legacy daily operations against canonical shadow observations","ENTSO-E legacy daily operations against canonical shadow observations","Elexon legacy daily operations against canonical shadow observations","Sanitized qualification of the first observed production comparison receipt; no production rows, tolerances or serving modes changed"],"checks":[{"checkKey":"five-source-family-contracts","label":"Five source-family measurement contracts","status":"pass","method":"Inspected the five canonical ingest adapters and recorded each legacy dataset, canonical dataset, timezone basis, interval basis and source unit basis in a provider-neutral source-family register.","evidence":[{"label":"Source-family register","reference":"lib/validation-sprints/grid-reconciliation.mjs","asOf":"2026-08-02"},{"label":"Canonical ingest adapters","reference":"lib/nem-ingest.ts; lib/swis-ingest.ts; lib/eia-ingest.ts; lib/entsoe-ingest.ts; lib/gb-ingest.ts","asOf":"2026-08-02"}],"observedResult":"All five current source families have an explicit source-specific time, interval and unit basis; no cross-provider averaging or implicit unit conversion is introduced.","boundary":"The register describes the repository implementation and does not independently certify publisher completeness or licensing terms."},{"checkKey":"deterministic-fixture-comparator","label":"Deterministic fixture comparator","status":"pass","method":"Executed the fixture suite with node:test and compared repeated receipts for exact deep equality across pass, warning, numeric failure, timezone mismatch and missing-versus-zero cases.","evidence":[{"label":"Comparator implementation","reference":"pipelines/grid-reconciliation/reconcile.mjs","asOf":"2026-08-02"},{"label":"Fixture tests","reference":"tests/validation-grid-reconciliation-sprint.test.mjs","asOf":"2026-08-02"}],"observedResult":"Five synthetic source-family fixtures produced the declared statuses and classifications deterministically: one pass, one warning and three failures.","boundary":"Synthetic fixtures validate code paths only and contribute zero days to the production comparison gate."},{"checkKey":"basis-missingness-and-coverage-guards","label":"Measurement-basis, missingness and coverage guards","status":"pass","method":"Exercised explicit compatibility checks for identity, source unit, timezone, UTC day window, interval duration, expected interval count, minimum coverage and value state before numeric tolerance evaluation.","evidence":[{"label":"Synthetic edge-case fixtures","reference":"pipelines/grid-reconciliation/fixtures","asOf":"2026-08-02"},{"label":"Validation coverage","reference":"tests/validation-grid-reconciliation-sprint.test.mjs","asOf":"2026-08-02"}],"observedResult":"Timezone and interval incompatibilities fail before value comparison, incomplete coverage remains unavailable, and a missing aggregate is not treated as a measured zero.","boundary":"Per-metric tolerances must be supplied explicitly; fixture tolerances are test inputs and are not production calibration values."},{"checkKey":"serving-mode-boundary","label":"Serving-mode boundary","status":"pass","method":"Asserted that every fixture begins with legacy-primary and canonical-shadow roles, leaves legacy-primary unchanged and disables automatic promotion regardless of fixture outcome.","evidence":[{"label":"Shadow-record implementation","reference":"pipelines/grid-reconciliation/reconcile.mjs","asOf":"2026-08-02"},{"label":"Serving-boundary tests","reference":"tests/validation-grid-reconciliation-sprint.test.mjs","asOf":"2026-08-02"}],"observedResult":"Fixture receipts are excluded from rollout counts; even a passed comparison cannot alter serving mode, and a completed 30-day production gate would still require manual review.","boundary":"The validation harness does not write rollout state, production receipts or database rows."},{"checkKey":"production-thirty-day-shadow-record","label":"Production 30-day shadow record","status":"fail","method":"Captured the public grid-source health receipt and read-only reconciliation ledger, reduced them to a sanitized five-source qualification receipt, and validated status-count, source-family, rollout and serving-boundary completeness.","evidence":[{"label":"Public grid source health receipt","reference":"https://solaranalytica.com/data/grid-sources/health.json","asOf":"2026-08-02T08:25:31.175Z"},{"label":"Sanitized observed qualification receipt","reference":"pipelines/grid-reconciliation/receipts/observed-qualification-2026-08-02.json","asOf":"2026-08-02T08:25:31.175Z"}],"observedResult":"The first observed comparison record contains 274 metric receipts: EIA-930 passed 124 of 124 and one of thirty required days; AEMO NEM, AEMO WEM, ENTSO-E and Elexon were blocked. All five remain legacy-primary and no source is promoted.","boundary":"One observed date per source is insufficient for promotion and cannot establish a recurring defect, tolerance calibration or publisher fault."},{"checkKey":"observed-mismatch-qualification","label":"Observed mismatch-family qualification","status":"pass","method":"Assigned every warning, failure and unavailable metric to exactly one investigation family with a confirmed, provisional or unresolved qualification state, then rejected any genuine numerical-failure classification lacking four completed causal-exclusion checks.","evidence":[{"label":"Observed receipt validator","reference":"lib/validation-sprints/grid-reconciliation.mjs","asOf":"2026-08-02"},{"label":"Observed qualification tests","reference":"tests/validation-grid-reconciliation-sprint.test.mjs","asOf":"2026-08-02"}],"observedResult":"All 118 non-pass metrics are covered without widening tolerances: 102 incomplete-coverage, 13 measurement-basis, two publisher-revision and one parser-or-legacy investigation lane; zero metrics are claimed as genuine numerical failures.","boundary":"A provisional or unresolved family is a triage lane, not a verified root cause. Only a later receipt with complete causal exclusions may declare a numerical failure."}],"findings":[{"findingKey":"production-shadow-history-insufficient","severity":"high","status":"open","productKeys":["grid-source-registry"],"summary":"The first observed production comparison day is retained, but four source families are blocked and no source has thirty passing days.","evidence":"The sanitized 2026-08-02 receipt validates 274 comparisons. EIA-930 passed its first day; AEMO NEM, AEMO WEM, ENTSO-E and Elexon contain failed or unavailable comparisons. All five remain legacy-primary.","action":"Resolve coverage and basis findings source by source, retain immutable daily receipts and restart a contiguous qualification window without changing tolerances to manufacture passes."},{"findingKey":"observed-root-causes-not-yet-proven","severity":"high","status":"open","productKeys":["grid-source-registry"],"summary":"Six mismatch groups remain provisional or unresolved, so the first-day deltas cannot yet be attributed to publisher, parser, legacy or numerical causes.","evidence":"The receipt records investigation lanes for NEM average price, WEM gas, ENTSO-E generation and missing-as-zero price handling, and Elexon generation, interconnector and solar-edition differences. No metric is qualified as a genuine numerical failure.","action":"Run the receipt-pinned next test declared for each group and publish a superseding qualification receipt; do not rewrite the observed receipt."},{"findingKey":"comparison-semantics-explicit","severity":"medium","status":"resolved","productKeys":["grid-source-registry"],"summary":"The sprint comparator now prevents value-only reconciliation across incompatible units, timezones, day windows, intervals, coverage states and missingness states.","evidence":"The deterministic fixture suite returns dedicated timezone_mismatch, missing_vs_zero, coverage_below_minimum, interval_mismatch and unit_mismatch classifications before tolerance evaluation.","action":"Keep these fields mandatory when the comparator is integrated with production reconciliation rows."},{"findingKey":"cross-provider-comparison-out-of-scope","severity":"medium","status":"accepted_limit","productKeys":["grid-source-registry"],"summary":"The five providers publish different products and temporal bases, so this sprint reconciles each canonical shadow against its own legacy product rather than comparing provider values as interchangeable market facts.","evidence":"The source-family register preserves five-minute NEM and WEM operations, daily EIA observations, source-dependent ENTSO-E intervals and half-hourly Elexon settlement periods.","action":"Introduce any future cross-provider comparison only with a separately versioned common measurement contract."}],"corrections":[{"correctionKey":"provider-neutral-daily-comparator","status":"implemented","summary":"Added a pure comparator with explicit tolerance, coverage, missingness, measurement-basis and serving-mode receipts.","files":["pipelines/grid-reconciliation/reconcile.mjs"]},{"correctionKey":"five-family-fixture-suite","status":"verified","summary":"Added realistic synthetic cases covering all five current source families and the required pass, warning, failure, timezone and missing-versus-zero behaviours.","files":["pipelines/grid-reconciliation/fixtures","tests/validation-grid-reconciliation-sprint.test.mjs"]},{"correctionKey":"observed-production-qualification","status":"verified","summary":"Replaced the stale zero-day baseline with a sanitized, count-complete observed receipt and fail-closed mismatch-family qualification.","files":["pipelines/grid-reconciliation/receipts/observed-qualification-2026-08-02.json","lib/validation-sprints/grid-reconciliation.mjs","tests/validation-grid-reconciliation-sprint.test.mjs"]}],"releaseDecision":{"state":"hold","reason":"Observed qualification is now evidence-backed, but four source families are blocked, six causal groups remain unproven and no source has completed thirty passing dates. Legacy-primary serving must remain unchanged."},"nextReview":{"cadence":"Monthly","dueOn":"2026-09-02","trigger":"Review sooner when a declared mismatch next test closes, a new observed comparison receipt is retained, source semantics change, or any canonical source is proposed for promotion."}},{"schemaVersion":"validation-sprint-v1","sprintKey":"model-validation","editionDate":"2026-08-02","title":"Model Validation Sprint","objective":"Verify the local deterministic, interval-energy and discounted-cashflow behaviour of Value Under Constraint and Export Flexibility Dividend while retaining the schema-v2 interactive-only publication boundary and keeping synthetic checks separate from measured external validation.","status":"passed_with_actions","scope":["Value Under Constraint method temporal-value-wa-v1","Export Flexibility Dividend public schema export-flexibility-dividend-public-v2 and calculation method export-flexibility-dividend-wa-v1","Perth NASA POWER solar-shape edition 2021-2025","WA tariff and fixed export-envelope application","Observed-cohort publication boundary"],"checks":[{"checkKey":"local-contract-reproduction","label":"Local calculation contracts reproduce","status":"pass","method":"Executed both repository calculation cores with fixed local inputs, method versions and source editions after the schema-v2 contract correction.","evidence":[{"label":"Value Under Constraint calculation core","reference":"lib/temporal-value-core.mjs","asOf":"2026-08-02"},{"label":"Export Flexibility Dividend schema-v2 calculation core","reference":"lib/export-flexibility-dividend-core.mjs","asOf":"2026-08-02"}],"observedResult":"The local Value Under Constraint default returned temporal-value-wa-v1, 11,822.58 kWh annual generation and AUD 962.09726143799 annual value. The corrected local Export Flexibility Dividend returned public schema v2, calculation method export-flexibility-dividend-wa-v1, three interactive scenarios and AUD 127.03/year modelled flexibility headroom.","boundary":"Deployment status was not assessed after the schema-v2 correction. These are local computational reproductions, not a canonical benchmark or empirical site-performance test."},{"checkKey":"publication-boundary-retained","label":"Schema-v2 publication boundary is fail-closed","status":"pass","method":"Validated the required publication object on the local result and mutation-tested six unsupported promotions: schema v1, canonical state, canonical benchmark published, durable release published, changed computational check date and empirical validation passed.","evidence":[{"label":"Schema-v2 publication invariant","reference":"lib/validation-sprints/model-validation.mjs","asOf":"2026-08-02"},{"label":"Publication-boundary mutation tests","reference":"tests/validation-model-sprint.test.mjs","asOf":"2026-08-02"}],"observedResult":"Local contract export-flexibility-dividend-public-v2 retained state=interactive_model_only, canonicalBenchmarkPublished=false, durableReleaseStatus=provisional, computational verification passed on 2026-08-02 and empirical validation pending; all six unsupported promotions failed validation.","boundary":"A passing computational model does not publish a canonical benchmark, complete a durable release or establish empirical accuracy."},{"checkKey":"deterministic-reproduction","label":"Deterministic inputs reproduce deterministic results","status":"pass","method":"Ran each fixed-input calculation twice, canonicalized object keys, excluded only the declared volatile generatedAt timestamp and compared SHA-256 hashes and deep results.","evidence":[{"label":"Reusable deterministic hash check","reference":"lib/validation-sprints/model-validation.mjs","asOf":"2026-08-02"},{"label":"Model validation tests","reference":"tests/validation-model-sprint.test.mjs","asOf":"2026-08-02"}],"observedResult":"The Value Under Constraint default reproduced stable SHA-256 1a6c085fcea51327d42ed2d6037eaacd967fc33057f54035d20d42eea8b51ff6; repeated Export Flexibility Dividend calculations with a fixed source receipt and generatedAt value were identical.","boundary":"The result is deterministic only while inputs, calculation methods, public schema and source editions remain fixed; generatedAt is presentation metadata and is excluded from the canonical hash."},{"checkKey":"generation-energy-accounting","label":"Generation is fully accounted for","status":"pass","method":"Recomputed every hourly and annual balance as generation minus direct self-consumption, storage charging, export and curtailment. For no-storage cases, also enforced generation = self-consumption + export + curtailment.","evidence":[{"label":"Invariant implementation","reference":"lib/validation-sprints/model-validation.mjs","asOf":"2026-08-02"},{"label":"Golden and matrix execution","reference":"tests/validation-model-sprint.test.mjs","asOf":"2026-08-02"}],"observedResult":"Three retained lifetime golden cases and 90 year-model combinations passed. The local no-storage default had annual balance residual 5.820766091346741e-11 kWh and maximum hourly residual 0 kWh against a 0.000001 kWh tolerance.","boundary":"When storage is present, charging is a separate generation destination; collapsing it into direct self-consumption would misstate the engine's published fields."},{"checkKey":"export-cap-compliance","label":"Fixed export envelopes bind at every interval","status":"pass","method":"Exercised zero, 1.5 kW, 3 kW, 5 kW and unconstrained envelopes across three tariffs, three load shapes and zero or 10 kWh storage, checking every hourly export value against the selected fixed cap.","evidence":[{"label":"Export-cap matrix test","reference":"tests/validation-model-sprint.test.mjs","asOf":"2026-08-02"},{"label":"Published export-envelope register","reference":"lib/temporal-value-core.mjs","asOf":"2026-08-02"}],"observedResult":"All 90 deterministic year cases passed; maximum hourly export above a declared fixed cap was 0 kWh. The unconstrained case was treated as a counterfactual with no cap-compliance claim.","boundary":"A modelled fixed cap is not a connection approval and does not represent a connection-specific dynamic operating envelope."},{"checkKey":"pv-load-tariff-alignment","label":"PV shape, load shape and tariff periods remain aligned","status":"pass","method":"Verified 8,760 calendar-hour rows per case, reconciled hourly generation and load sums to annual declarations, resolved each import and export rate from its tariff period, and rebuilt avoided-import, storage and export value from interval flows.","evidence":[{"label":"Perth solar-shape receipt","reference":"content/data/perth-solar-shape-2021-2025.json","asOf":"2026-08-02"},{"label":"Alignment and tariff invariant tests","reference":"tests/validation-model-sprint.test.mjs","asOf":"2026-08-02"}],"observedResult":"The default 8,760 rows summed to 11,822.580000000113 kWh generation and 5,999.999999999818 kWh load; all interval tariff rates matched and rebuilt AUD 962.09726143799 annual value.","boundary":"The NASA POWER profile supplies a representative Perth solar shape and the load profiles are synthetic normalized shapes; neither is a measured customer interval trace."},{"checkKey":"discounted-cashflow-accounting","label":"Lifetime values and discounting reconcile","status":"pass","method":"Recomputed each annual discounted cashflow, cumulative discounted balance, total capital, present value, net present value and first non-negative payback year from the declared settings.","evidence":[{"label":"Lifetime invariant implementation","reference":"lib/validation-sprints/model-validation.mjs","asOf":"2026-08-02"},{"label":"Retained golden cases","reference":"tests/fixtures/temporal-value-golden.json","asOf":"2026-08-02"}],"observedResult":"All three 25-year golden cases passed at 0.000001 tolerance. The local default recomputed to AUD 13,439.655099719674 present value, AUD 5,439.655099719674 net present value and discounted payback in year 12.","boundary":"The arithmetic follows the declared model convention: year-one cashflow is discounted once, while tariff escalation, operating cost, finance, tax and storage replacement capital are not modelled."},{"checkKey":"scenario-monotonicity","label":"Export flexibility scenarios preserve expected ordering","status":"pass","method":"Ran three deterministic household and storage cases on one comparison-basis key and checked that broader export access could not reduce export or annual value, increase curtailment, or create negative comparison deltas.","evidence":[{"label":"Scenario invariant tests","reference":"tests/validation-model-sprint.test.mjs","asOf":"2026-08-02"},{"label":"Dividend comparison engine","reference":"lib/export-flexibility-dividend-core.mjs","asOf":"2026-08-02"}],"observedResult":"All three comparison cases ordered fallback <= published ceiling <= unconstrained for annual value and export, and fallback >= published ceiling >= unconstrained for curtailment. A fourth high-capital case confirmed negative net present value remains valid while negative physical flow fails; local interactive comparison arithmetic reconciled within the 0.02 rounded-output tolerance.","boundary":"Monotonicity is a computational property of otherwise identical fixed-envelope scenarios; it does not quantify how often a dynamic envelope will make additional export available."},{"checkKey":"observed-cohort-validation","label":"Measured cohort validation","status":"not_tested","method":"Inspected the observed-cohort eligibility and publication contracts, but no qualifying measured cohort receipt or public cohort output was available inside this sprint scope for comparison with representative model results.","evidence":[{"label":"Observed cohort eligibility contract","reference":"lib/export-flexibility-cohorts.ts","asOf":"2026-08-02"},{"label":"Observed cohort schema migration","reference":"supabase/migrations/20260801201500_add_export_flexibility_observed_cohorts.sql","asOf":"2026-08-02"}],"observedResult":"No empirical pass is recorded. Computational verification is complete for the tested editions; measured-to-representative error remains blank until an eligible cohort is inspected.","boundary":"Golden cases, NASA-derived representative shapes and deterministic invariants are not measured external validation."}],"findings":[{"findingKey":"computational-contract-verified","severity":"low","status":"resolved","productKeys":["temporal-value","export-flexibility-dividend"],"summary":"The tested interval, tariff, export-cap, lifetime and scenario arithmetic reproduces deterministically under local schema v2 and the current calculation editions.","evidence":"The sprint test exercises three retained golden cases, 90 cross-product year cases, three Export Flexibility Dividend ordering cases and a signed-net-present-value boundary case through reusable invariants.","action":"Keep the invariant suite mandatory whenever either model method, tariff edition, export-envelope edition or Perth solar-shape edition changes."},{"findingKey":"interactive-model-publication-boundary","severity":"high","status":"accepted_limit","productKeys":["export-flexibility-dividend"],"summary":"The schema-v2 result is an interactive model only; no canonical benchmark is published and the durable release remains provisional.","evidence":"The required publication object carries interactive_model_only, canonicalBenchmarkPublished=false, durableReleaseStatus=provisional, computational verification passed and empirical validation pending.","action":"Keep every JSON, CSV and visual interpretation subordinate to this publication object until a separately gated canonical benchmark and qualifying empirical cohort exist."},{"findingKey":"observed-cohort-evidence-pending","severity":"high","status":"open","productKeys":["temporal-value","export-flexibility-dividend"],"summary":"No qualifying observed cohort was inspected, so measured error, bias and transferability remain unverified.","evidence":"The repository contains eligibility, consent and minimum-contributor contracts, but this sprint has no inspectable published cohort receipt or measured comparison result.","action":"Publish a cohort comparison only after the existing eligibility gate is met, then report sample band, coverage, flow basis, tariff and envelope editions, median variance and exclusions."},{"findingKey":"representative-profile-boundary","severity":"medium","status":"accepted_limit","productKeys":["temporal-value","export-flexibility-dividend"],"summary":"The current PV and load alignment is computationally verified but representative rather than site-measured.","evidence":"The solar shape is a NASA POWER Perth month-hour profile scaled to a specific-yield baseline; household load shapes are normalized model assumptions.","action":"Retain the representative and counterfactual labels on every surface and do not infer site approval, roof geometry or customer-specific performance."},{"findingKey":"discounting-scope-boundary","severity":"medium","status":"accepted_limit","productKeys":["temporal-value","export-flexibility-dividend"],"summary":"Discounted values reconcile to the implemented convention, which omits several real project cashflow categories.","evidence":"The current engine includes installed and selected storage capital, degradation and discounting, but omits tariff escalation, operating cost, finance, tax and battery replacement.","action":"Keep these omissions visible and version the method before adding any omitted cashflow category."}],"corrections":[{"correctionKey":"reusable-model-invariant-harness","status":"implemented","summary":"Added reusable interval, lifetime, scenario, deterministic-hash and schema-v2 publication-boundary validation functions without changing production model calculations.","files":["lib/validation-sprints/model-validation.mjs"]},{"correctionKey":"model-validation-receipt","status":"verified","summary":"Added fixture-backed tests and a contract-valid sprint artifact that preserve the computational-versus-empirical boundary.","files":["tests/validation-model-sprint.test.mjs","content/validation-sprints/model-validation.json"]},{"correctionKey":"measured-cohort-comparison","status":"deferred","summary":"Measured error and transferability remain deferred until an eligible observed cohort can be inspected.","files":[]}],"releaseDecision":{"state":"release_with_caution","reason":"The local schema-v2 interactive model passes computational verification, but canonicalBenchmarkPublished remains false, the durable release remains provisional and empirical validation remains pending."},"nextReview":{"cadence":"Monthly","dueOn":"2026-09-02","trigger":"Review earlier if a tariff, export-envelope, solar-shape or model method edition changes, a qualifying observed cohort becomes publishable, or any invariant test fails."}},{"schemaVersion":"validation-sprint-v1","sprintKey":"cross-surface-coherence","editionDate":"2026-08-02","title":"Cross-Surface Coherence Validation","objective":"Trace selected public metrics from source or durable contract through page, chart or table, JSON, CSV and methodology without changing geography, unit, basis, vintage, confidence, missingness or publication-state meaning.","status":"passed_with_actions","scope":["Grid Edge Conditions July 2026 NSW price-spread trace","Export Flexibility Dividend Western Power fallback and default model-output traces","Two-Way Network Performance headline and Ausgrid missing-duration traces","Operational Signals page, JSON, CSV, catalogue and admin rollout semantics","Operational Signals durable-state re-verification binding","Exact and rounded numeric presentation","Null-versus-zero and provenance-field preservation"],"checks":[{"checkKey":"reusable-coherence-checker","label":"Seven-dimension manifest checker","status":"pass","method":"Executed fixture-based checks for exact matching, unit mismatch, null-versus-zero, and declared display rounding through checkMetricCoherence and checkCoherenceManifest.","evidence":[{"label":"Checker implementation","reference":"lib/validation-sprints/cross-surface-coherence.mjs","asOf":"2026-08-02"},{"label":"Fixture tests","reference":"tests/validation-cross-surface-coherence.test.mjs","asOf":"2026-08-02"}],"observedResult":"Matching fixtures passed; changed units failed; null and zero produced both value and missingness mismatches; a 28.36662032232715 raw value matched an explicitly declared 28.4 one-decimal display.","boundary":"The checker compares declared normalized meanings. It does not infer semantic equivalence between undocumented prose variants."},{"checkKey":"grid-edge-price-spread-trace","label":"Grid Edge Conditions price-spread trace","status":"pass","method":"Compared the July 2026 NSW1 price-spread value and provenance across the grid kernel mapping, production JSON, production CSV, page table formatting and reading rules.","evidence":[{"label":"Production JSON metric","reference":"https://solaranalytica.com/grid-edge-conditions/data.json#NSW1-price-spread","asOf":"2026-08-02"},{"label":"Production CSV metric","reference":"https://solaranalytica.com/grid-edge-conditions/data.csv#NSW1-price-spread","asOf":"2026-08-02"},{"label":"Human table","reference":"app/grid-edge-conditions/page.tsx#MetricTable","asOf":"2026-08-02"}],"observedResult":"The raw 154.347 AUD/MWh value, NSW1/NEM geography, five-minute daily max-minus-min basis, AEMO-NEM-2026-07-31 vintage, Medium confidence and reported state matched; the visible 154 AUD/MWh value passed the declared zero-decimal display rule.","boundary":"This is one retained metric in one fixed monthly edition, not a claim that every Grid Edge row has been traced."},{"checkKey":"export-flexibility-source-limit-trace","label":"Export Flexibility source-limit trace","status":"pass","method":"Compared the Western Power 1.5 kW site fallback across the source register, public page and source receipt, JSON, CSV and public methodology.","evidence":[{"label":"Source register row","reference":"content/export-constraint-regimes.ts#au-wa-western-power-basic-eg-large-network-single-phase","asOf":"2026-08-02"},{"label":"Production model JSON","reference":"https://solaranalytica.com/export-flexibility-dividend/data.json#scenarios[fallback]","asOf":"2026-08-02"},{"label":"Public methodology","reference":"content/pages/methodology.ts#export-flexibility-dividend","asOf":"2026-08-02"}],"observedResult":"All five occurrences retained 1.5 kW as a site limit for Western Power single-phase basic EG on the large network without retailer off-take, with export-constraint-register-2026-08-01 and High source confidence where provenance is represented.","boundary":"The 5 kW ceiling remains a technical comparison bound, not a connection offer or interval-availability guarantee."},{"checkKey":"export-flexibility-canonical-output-trace","label":"Export Flexibility canonical-output trace","status":"pass","method":"Compared the local schema-v2 interactive result and its publication object across the model core, JSON contract, CSV contract, JSON Schema, page and workbench copy, durable provisional release record and product contract.","evidence":[{"label":"Schema-v2 model publication state","reference":"lib/export-flexibility-dividend-core.mjs#EXPORT_FLEXIBILITY_PUBLICATION_STATE","asOf":"2026-08-02"},{"label":"CSV publication fields","reference":"app/export-flexibility-dividend/data.csv/route.ts#publication-fields","asOf":"2026-08-02"},{"label":"Closed JSON publication schema","reference":"app/export-flexibility-dividend/schema.json/route.ts#$defs.publication","asOf":"2026-08-02"},{"label":"Visible publication boundary","reference":"components/export-flexibility-dividend-workbench.tsx#SourceReceipt","asOf":"2026-08-02"}],"observedResult":"All traced local surfaces now identify the 127.03 AUD default result as interactive_model_only, canonicalBenchmarkPublished false and durableReleaseStatus provisional. Computational verification is passed on 2026-08-02 while empirical validation is pending with no cohort edition. The rounded 127 AUD card remains a reported interactive result, not a canonical benchmark.","boundary":"This pass verifies publication-state coherence and computational labeling. It does not publish a canonical benchmark or supply the pending measured cohort."},{"checkKey":"two-way-network-value-and-missingness-trace","label":"Two-Way Network Performance value and missingness trace","status":"pass","method":"Rebuilt the fixed AER record, compared the all-DNSPs customer-share value across source-derived record, JSON, CSV, page and product method, and traced Ausgrid's unavailable duration through null, empty CSV and Not reported presentation.","evidence":[{"label":"Fixed record builder","reference":"lib/two-way-network-performance-core.mjs","asOf":"2026-08-02"},{"label":"Production JSON","reference":"https://solaranalytica.com/two-way-network-performance/data.json","asOf":"2026-08-02"},{"label":"Product methodology","reference":"docs/two-way-network-performance-product-contract.md","asOf":"2026-08-02"}],"observedResult":"The 28.36662032232715% headline matched raw exports and the documented method, and the page's 28.4% display matched its one-decimal rule. Ausgrid remained null/not-reported in JSON, blank/not-reported in CSV and Not reported on the page; no zero was imputed.","boundary":"The source-defined full-access headline remains an unweighted mean across positive reported values and is not customer weighted."},{"checkKey":"public-provenance-completeness","label":"Public confidence and methodology completeness","status":"pass","method":"Compared explicit output and source-fidelity confidence levels, their limitations, public methodology anchors and direct page links across the current local contracts.","evidence":[{"label":"Two-way public record contract","reference":"lib/two-way-network-performance-core.mjs","asOf":"2026-08-02"},{"label":"Export Flexibility source receipt","reference":"components/export-flexibility-dividend-workbench.tsx#SourceReceipt","asOf":"2026-08-02"},{"label":"Public methodology content","reference":"content/pages/methodology.ts","asOf":"2026-08-02"}],"observedResult":"Export Flexibility now declares Medium output confidence with High regime and Medium solar confidence retained separately and a written transferability basis. Two-Way Network Performance v2 declares High source-fidelity confidence while explicitly excluding completeness of network reporting. Grid Edge and Two-Way Network Performance both have dedicated public methodology anchors and direct page links.","boundary":"These confidence labels describe the named evidence boundary. They do not convert computational checks into empirical validation or complete missing source reporting."},{"checkKey":"operational-signals-cross-surface-contract","label":"Operational Signals shared-surface contract","status":"pass","method":"Compared the shadow metric boundary, thirty-day validation gate and three-metric zone limit across the live no-store JSON review, CSV projection, public page, both existing product catalogue entries and the private admin rollout table.","evidence":[{"label":"Live no-store JSON review","reference":"https://solaranalytica.com/data/operational-signals/data.json","asOf":"2026-08-02T08:38:54Z"},{"label":"Public and CSV contract","reference":"lib/operational-signal-public-core.mjs","asOf":"2026-08-02"},{"label":"Catalogue and admin semantics","reference":"content/data-catalog.ts and app/admin/operations/page.tsx","asOf":"2026-08-02"}],"observedResult":"The reviewed live state was shadow with three monitored streams, zero public streams, zero published zones and zero visible metrics. Page, JSON, CSV, both existing product catalogue entries and admin consistently require thirty complete daily windows plus named manual promotion; public outputs remain limited to three receipt-approved metrics per published zone.","boundary":"Operational Signals remains a shared surface of grid-operations and swis-observatory, not a new data-product identity. This check does not promote a stream or claim that shadow health proves metric accuracy."},{"checkKey":"operational-signals-durable-state-reverification","label":"Live durable-state change detection","status":"warning","method":"Projected only qualification-relevant durable fields from the live payload and bound them to the reviewed edition. Runtime reads compare schema, method, serving mode, validation progress, rollout stage, public visibility and published metric identities against that state.","evidence":[{"label":"Durable-state projector and overlay","reference":"lib/validation-sprints/cross-surface-coherence.mjs","asOf":"2026-08-02"},{"label":"Dynamic validation register","reference":"lib/validation-sprints.ts","asOf":"2026-08-02"},{"label":"Change-detection regression tests","reference":"tests/validation-cross-surface-coherence.test.mjs","asOf":"2026-08-02"}],"observedResult":"The reviewed Operational Signals durable state changed after 2026-08-02T08:38:54Z; 2 bound fields require re-verification.","boundary":"Five-minute freshness, last-success timestamps and live operating values are excluded because operational health owns those controls; excluding them prevents a transient poll from being mislabelled as a semantic coherence failure."}],"findings":[{"findingKey":"export-flexibility-public-output-release-state-conflict","severity":"high","status":"resolved","productKeys":["export-flexibility-dividend"],"summary":"Schema v2 now separates the reported interactive model result from the unpublished canonical benchmark and provisional durable release.","evidence":"The core publication object, CSV, page/workbench, closed JSON Schema and product contract consistently declare interactive_model_only, canonicalBenchmarkPublished false, durableReleaseStatus provisional, computational verification passed and empirical validation pending.","action":"Preserve the required publication object and regression coverage on every future schema or edition. Publishing a canonical benchmark still requires a calculated, validated, content-hashed durable case and must not be inferred from interactive output."},{"findingKey":"model-confidence-does-not-collapse-to-source-confidence","severity":"medium","status":"resolved","productKeys":["export-flexibility-dividend"],"summary":"Export Flexibility now distinguishes Medium model-output confidence from High regime confidence and Medium solar-shape confidence.","evidence":"The v2 publication object requires outputDataConfidence and confidenceBasis; CSV and schema preserve both, while the visible receipt separately labels regime, solar and output confidence.","action":"Preserve the separate dependency and output confidence fields on future editions, and keep empirical validation pending until a qualifying measured cohort is published."},{"findingKey":"two-way-confidence-field-absent","severity":"medium","status":"resolved","productKeys":["two-way-network-performance"],"summary":"Two-Way Network Performance v2 now carries High source-fidelity confidence with an explicit incomplete-reporting limitation.","evidence":"The fixed edition input, record, validator, page, JSON, CSV, schema, product contract and public methodology all carry the High source-fidelity confidence boundary.","action":"Keep the confidence basis attached to future AER editions and fail publication if the source receipt, arithmetic reconciliation or incomplete-reporting limitation is absent."},{"findingKey":"public-methodology-anchors-incomplete","severity":"low","status":"resolved","productKeys":["grid-edge-conditions","two-way-network-performance"],"summary":"Grid Edge and Two-Way Network Performance now have dedicated public methodology sections linked directly from their product pages.","evidence":"content/pages/methodology.ts defines #grid-edge-conditions and #two-way-network-performance; each corresponding page links to its exact anchor.","action":"Retain anchor and route checks so later methodology restructuring cannot leave product links pointing to a generic or missing section."},{"findingKey":"operational-signals-durable-state-changed","severity":"medium","status":"open","productKeys":["grid-operations","swis-observatory"],"summary":"Operational Signals changed after the reviewed cross-surface state.","evidence":"Changed bindings: operationalSignals.streams[0].latestValidationDate, operationalSignals.streams[0].passingValidationWindows.","action":"Re-run page, JSON, CSV, catalogue and admin coherence against the new durable state, then update the reviewed-state receipt without rewriting the prior edition."}],"corrections":[{"correctionKey":"coherence-manifest-checker","status":"implemented","summary":"Added a reusable seven-dimension checker with explicit publication-field, rounded-display and missingness semantics plus a dated 27-occurrence manifest across three products.","files":["lib/validation-sprints/cross-surface-coherence.mjs"]},{"correctionKey":"export-flexibility-publication-boundary-v2","status":"verified","summary":"Verified the parent-owned schema-v2 publication boundary across core, interfaces, page, workbench, JSON, CSV, schema and product documentation.","files":["lib/export-flexibility-dividend-core.mjs","lib/export-flexibility-dividend.ts","app/export-flexibility-dividend/page.tsx","components/export-flexibility-dividend-workbench.tsx","app/export-flexibility-dividend/data.json/route.ts","app/export-flexibility-dividend/data.csv/route.ts","app/export-flexibility-dividend/schema.json/route.ts","docs/export-flexibility-dividend-product-contract.md"]},{"correctionKey":"confidence-and-methodology-contracts","status":"verified","summary":"Verified parent-owned confidence fields, source-fidelity limitations, public methodology anchors and direct product-page links.","files":["lib/export-flexibility-dividend-core.mjs","components/export-flexibility-dividend-workbench.tsx","app/export-flexibility-dividend/data.csv/route.ts","app/export-flexibility-dividend/schema.json/route.ts","lib/two-way-network-performance-edition.mjs","lib/two-way-network-performance-core.mjs","components/two-way-network-performance.tsx","content/pages/methodology.ts","app/grid-edge-conditions/page.tsx","app/two-way-network-performance/page.tsx"]},{"correctionKey":"coherence-regression-tests","status":"implemented","summary":"Added fixtures for matching, mismatching, null-versus-zero and rounded displays, plus bindings to the fixed AER record and current repository surfaces.","files":["tests/validation-cross-surface-coherence.test.mjs"]},{"correctionKey":"coherence-sprint-receipt","status":"verified","summary":"Recorded the completed reassessment with all five traced metrics passing and no unresolved coherence warning.","files":["content/validation-sprints/cross-surface-coherence.json"]},{"correctionKey":"operational-signals-coherence-and-live-binding","status":"implemented","summary":"Added the shared Operational Signals page, export, catalogue and admin semantics to the manifest, plus a live durable-state overlay that prevents a changed qualification state from inheriting the fixed pass.","files":["lib/validation-sprints/cross-surface-coherence.mjs","lib/validation-sprints.ts","app/data-trust/validation/page.tsx","app/data-trust/validation/data.json/route.ts","tests/validation-cross-surface-coherence.test.mjs"]}],"releaseDecision":{"state":"release_with_caution","reason":"The fixed edition remains inspectable, but its Operational Signals state binding changed and cannot be presented as current coherence until the named surfaces are re-verified."},"nextReview":{"cadence":"Monthly","dueOn":"2026-09-02","trigger":"Re-run after any product edition, public export, publication object, methodology, confidence rule or durable release-state change. Operational Signals schema, method, rollout, validation progress, public visibility and published metric identity are checked on every live validation-register read."},"revalidationBindings":[{"kind":"operational-signals-durable-state-v1","checkKey":"operational-signals-durable-state-reverification","reviewedAt":"2026-08-02T08:38:54Z","endpoint":"https://solaranalytica.com/data/operational-signals/data.json","reviewedState":{"schemaVersion":"operational-signals-public-v1","methodVersion":"operational-signal-public-read-v1","serving":"shadow","summary":{"monitoredStreams":3,"publicStreams":0,"publishedMarkets":0,"publishedZones":0,"visibleMetrics":0},"streams":[{"sourceKey":"aemo-nem","streamKey":"nem-dispatch","rolloutStage":"shadow","passingValidationWindows":0,"requiredValidationWindows":30,"latestValidationDate":"2026-08-01","metricsVisible":false},{"sourceKey":"aemo-nem","streamKey":"nem-p5min","rolloutStage":"shadow","passingValidationWindows":0,"requiredValidationWindows":30,"latestValidationDate":"2026-08-01","metricsVisible":false},{"sourceKey":"aemo-wem","streamKey":"wem-realtime-demand","rolloutStage":"shadow","passingValidationWindows":0,"requiredValidationWindows":30,"latestValidationDate":"2026-08-01","metricsVisible":false}],"markets":[]},"boundary":"Runtime freshness, last-success timestamps and live operating values remain under Operational Reliability; this binding covers durable qualification and public-serving semantics only."}],"liveReverification":{"status":"reverification_required","reviewedAt":"2026-08-02T08:38:54Z","differences":[{"path":"operationalSignals.streams[0].latestValidationDate","expected":"2026-08-01","actual":"2026-08-08"},{"path":"operationalSignals.streams[0].passingValidationWindows","expected":0,"actual":5}],"actualState":{"schemaVersion":"operational-signals-public-v1","methodVersion":"operational-signal-public-read-v1","serving":"shadow","summary":{"monitoredStreams":3,"publicStreams":0,"publishedMarkets":0,"publishedZones":0,"visibleMetrics":0},"streams":[{"sourceKey":"aemo-nem","streamKey":"nem-dispatch","rolloutStage":"shadow","passingValidationWindows":5,"requiredValidationWindows":30,"latestValidationDate":"2026-08-08","metricsVisible":false},{"sourceKey":"aemo-nem","streamKey":"nem-p5min","rolloutStage":"shadow","passingValidationWindows":0,"requiredValidationWindows":30,"latestValidationDate":"2026-08-01","metricsVisible":false},{"sourceKey":"aemo-wem","streamKey":"wem-realtime-demand","rolloutStage":"shadow","passingValidationWindows":0,"requiredValidationWindows":30,"latestValidationDate":"2026-08-01","metricsVisible":false}],"markets":[]},"boundary":"Runtime monitor freshness, last-success timestamps and operating values are excluded; those remain owned by the five-minute health and qualification controls."}}],"summary":{"sprintCount":5,"passed":0,"passedWithActions":3,"held":2,"checksPassed":28,"checksWarning":6,"checksFailed":2,"checksNotTested":1,"openFindings":12},"methodology":"https://solaranalytica.com/methodology#validation-sprints","links":{"register":"https://solaranalytica.com/data-trust/validation","trust":"https://solaranalytica.com/data-trust","operations":"https://solaranalytica.com/data-status"}}