# OPS-1

## Operator Performance Specification for Publicly Financed Solar-Hybrid Assets

**Version 1.0, 4 September 2026**
Published by Gen318.

---

## Foreword

**Publishing information.** This specification is published by Gen318. Version 1.0 was issued on 4 September 2026. No amendments have been issued since publication. Each issue of the Markdown source is identified by its SHA-256 digest, which is printed in the colophon of the published PDF and on the publisher's website.

**Declaration of interest.** Gen318 builds and sells software designed to this specification. The specification is published free and unrestricted, and adopting it creates no obligation to Gen318: any monitoring platform, spreadsheet or manual process that satisfies a clause satisfies it. Gen318 does not claim conformance for its own product. A self-declared conformance statement, clause by clause and including the clauses not yet met, will be published separately. Until it is, this document should be read as a specification that its publisher is also working towards.

**Development of this document.** The first draft was completed on 29 August 2026 from the instruments listed in §2, the published guidelines listed in the bibliography, and the publisher's experience of operating monitoring systems on solar-hybrid plants in Nigeria. Before publication, every checkable statement in the draft was tested against its primary source, and the definitions were reviewed for cases in which two conforming implementations could produce different results. Six statements were found to be wrong and were corrected, Clause 13 was added, and the definitions in Clauses 1, 2, 3, 11 and 13 were tightened. No comments from parties outside the publisher were received before publication. The consultation that a standards body would have conducted has not taken place, and readers should weigh the document accordingly.

**Review.** This specification will be reviewed at intervals not exceeding twelve months. Corrections and disagreements are welcome, will be listed in the next version, and should be sent to hello@gen318.com.

**Status.** This document is a published measurement method. It is not a standard: no standards body has adopted it. It is not a certification scheme: no conformity assessment body exists for it and none is proposed; there is no certificate, no mark and no register; and a claim of conformance is a self-declaration. The document is free to reproduce, adapt and incorporate into procurement documents, with attribution, under the terms in §9.

**Presentational conventions.** Requirements are expressed in sentences in which the principal auxiliary verb is "shall". Recommendations use "should", permissions use "may", and possibility or capability uses "can". Commentary, explanation and other informative material is presented in italic type, headed "What this prevents" where it explains a requirement, and does not constitute a normative element. Notes are informative and contain no requirements. Formulas and field names are set in monospace type. A reference of the form Clause n or Clause n.m is to a numbered requirement in §5; a reference of the form §n or §n.m is to a section of this document.

**Contractual and legal considerations.** This specification does not purport to include all the necessary provisions of a contract. Users are responsible for its correct application. Conformance with this specification does not of itself confer immunity from legal obligations, including obligations under the Mini-Grid Regulations 2026, the Nigeria Data Protection Act 2023 and any agreement between the parties. The model language in §8 is offered as a starting point for drafting and is not legal advice.

---

## Introduction

In August 2026 the Federal Government, through the Rural Electrification Agency, launched the Renewable Asset Management Company to manage publicly financed renewable energy assets. Its functions, as announced by the Agency's Managing Director at the launch, include engaging competent operators, metering consumption and collecting revenue, and ensuring that funds are available to replace equipment when it reaches the end of its useful life.

Each of those functions depends on a measurement that does not yet exist. Competence has no definition for this class of asset in the Regulations or in the instruments listed in §2. End of useful life cannot be estimated from a record that carries no installation dates. The assessment cited at the launch, in which the Managing Director reported three of the seven first-phase campus plants in good or usable condition, is a finding that arrived years after the point at which it could have been acted on.

What exists today sits on either side of the gap. IEC 61724-1 defines how to monitor a photovoltaic system. IEC TS 63019 defines an information model for availability. ISO 14224 defines how to collect reliability and maintenance data for the petroleum, petrochemical and natural gas industries, and has no equipment class for photovoltaic arrays or battery storage. The Africa Minigrid Developers Association's benchmarking reports publish operational and financial benchmarks across African mini-grid portfolios, on the largest Nigerian sample there is, but they compare portfolios with each other after the fact. They do not tell an owner what to require of an operator in a contract, and they are not a failure record.

This specification fills the middle. It defines thirteen clauses that an owner can put into an operations and maintenance agreement, and the evidence each one requires. It assumes that the operator wants to be measured fairly and that the owner cannot verify everything. Each clause is therefore built around one question: what can this number be made to say that is not true, and what makes that harder? Table 1 gives the thirteen clauses at a glance.

**Table 1: The clauses at a glance**

| Clause | The operator reports | What it prevents |
|---|---|---|
| 1 Data delivery | For every registered series, how much of the expected data arrived and how much of it can be trusted | A failed sensor vanishing from its own denominator; unbelievable data counted as coverage |
| 2 Availability | Every interval in one declared state, and two availability figures, raw and adjusted, in minutes as well as percentages | Availability inferred from telemetry arrival; an excuse hidden inside a single figure |
| 3 Energy accounting | A photovoltaic identity that closes at the inverter boundary, with the resource model and its uncertainty, and a separate plant balance | Shortfall relabelled as curtailment; a loss figure improved by lowering the resource estimate |
| 4 Performance ratio | The IEC 61724-1 ratio with its monitoring class, irradiance provenance, measurement point and exclusions declared | A sun-hours constant presented as a performance ratio |
| 5 Fault labelling | A structured cause and a confidence on every corrective closure | "Fixed" as a maintenance record |
| 6 Evidence of intervention | An evidence completeness score, post-repair verification and supervisor attestation | A closure rate that measures typing rather than repair |
| 7 Measurement provenance | The share of energy-bearing readings read from the device, from a vendor cloud, and from a counterparty meter | A record that is entirely the equipment vendor's assertion |
| 8 Asset identity | Manufacturer, model, serial, capacity, firmware and commissioning date per asset, reconciled to any regulatory filing | The loss of age at failure |
| 9 Savings claims | A baseline fixed in advance, its coefficients, and the confidence of the measurement behind the claim | A saving manufactured by fitting the baseline to the period |
| 10 Condition and remaining life | State of health and remaining life with a method, an end-of-life criterion and an uncertainty band | A replacement reserve built on a point estimate |
| 11 Report integrity | An immutable, hashed report under a declared canonicalisation profile, chained to the one before | An issued report quietly edited |
| 12 The scorecard | Nine named dimensions, each with its evidence status; a composite only with its weights | A single score that cannot be argued with |
| 13 Response and restoration | Four detection-anchored intervals by fault class, closures by detection source, open faults, verified restoration and undetected closures | A response clock that starts when the operator chose to notice |

---

## 1 Scope

**1.1 Application.** This specification applies to grid-isolated and interconnected solar-hybrid plants with battery storage, with or without diesel back-up, serving an institutional offtaker or a distribution network under an operations and maintenance agreement between an asset owner and an operator.

**1.2 Relationship to other instruments.** This specification sits under the instruments listed in §2 and does not replace any of them. Table 2 states the relationship.

**Table 2: Relationship to other instruments**

| Instrument | Relationship |
|---|---|
| Mini-Grid Regulations 2026 (NERC-R-001-2026) | Permits are required above 100 kW; registration is optional at or below it. The permit holder or registered operator files an operational and commercial report on the Schedule 4 template, annually where its capacity is below 1 MW and quarterly above (section 22). Where the site falls under the Regulations, the Reporting Period may be aligned to that filing period. The OPS-1 record is an input to the Schedule 4 filing and not a substitute for it: Schedule 4 asks for generation by source, consumption and revenue by customer class, and an asset register with age and book value, none of which Annex B produces. |
| IEC 61724-1:2021 | Clause 4 requires a monitoring class to be declared under it, and ties the cadence declared under Clause 1 to that class. |
| IEC TS 63019:2019 | Clause 2 is shaped to its information model for availability. |
| ISO 14224:2016 | Annex A follows its equipment and failure discipline, extended by analogy. ISO 14224 has no equipment class for photovoltaic arrays or battery storage systems. |
| Nigeria Data Protection Act 2023 | This specification assumes site and asset data. Customer-level consumption that can be linked to an identifiable individual falls within the Act's definition of personal data, and the Act applies to it. |

Many plants within the scope of this specification fall outside the Mini-Grid Regulations, for a reason other than size. The Regulations define a mini-grid as a system supplying electricity to more than one customer. A plant serving a single institutional offtaker, such as a campus plant, is therefore not a mini-grid at any capacity, and most of the first-phase federal campus plants are in any case within the 5 MW isolated cap. There is no lower size threshold: registration at or below 100 kW is optional, and the Regulations apply to every isolated mini-grid up to 5 MW and every interconnected mini-grid up to 10 MW per site. For plants outside the Regulations, the Reporting Period is set in the agreement, and quarterly is the default.

**1.3 Exclusions.** This specification does not cover statutory asset valuation, electrical safety certification, tariff setting, carbon crediting, or any determination requiring a licensed independent engineer. Health and safety is excluded because the two cases differ: for a permitted mini-grid the permit already binds the operator on it (Schedule 6 of the Mini-Grid Regulations); a single-offtaker plant outside the Regulations has no equivalent instrument, and its owner must provide for it elsewhere.

---

## 2 Normative references

The following documents are referred to in the text in such a way that some or all of their content constitutes requirements of this specification. For dated references, only the edition cited applies.

- Nigerian Electricity Regulatory Commission, *Mini-Grid Regulations 2026*, NERC-R-001-2026, together with Schedules 1 to 15
- IEC 61724-1:2021, *Photovoltaic system performance. Part 1: Monitoring*, Edition 2.0
- IEC TS 63019:2019, *Photovoltaic power systems (PVPS). Information model for availability*
- ISO 14224:2016, *Petroleum, petrochemical and natural gas industries. Collection and exchange of reliability and maintenance data for equipment*
- Nigeria Data Protection Act 2023

---

## 3 Terms, definitions and abbreviations

**3.1 Terms and definitions.** For the purposes of this specification, the following terms and definitions apply.

| Term | Definition |
|---|---|
| **Owner** | The party holding the asset and the record. |
| **Operator** | The party contracted to operate or maintain the asset. This is not the "Mini-Grid Operator" of the Mini-Grid Regulations, which is the permitted or registered entity and may be the Owner. |
| **Site** | One plant at one location, under one service model. |
| **Reporting Period** | The interval over which every figure in this specification is computed and reported. It is fixed in the agreement and is quarterly unless a regulatory period applies. |
| **Declared parameter** | A threshold or configuration that a clause requires to be fixed in advance and published with the report, rather than chosen after the data has been seen. Annex B lists them. |
| **Refusal** | A stated non-answer where an input is missing: *undefined*, *unpriced*, *withheld*, *no baseline*, *insufficient coverage*, *unclassified* or *unverified*. A refusal is a conforming output. |
| **Energy-bearing measurement** | A record of energy or power on the declared metric set, from which delivery, loss and revenue are derived. |

**3.2 Abbreviations.** The following abbreviations are used in this specification. Where an abbreviation is defined by a cited standard, that definition governs.

| Abbreviation | Meaning |
|---|---|
| AMDA | Africa Minigrid Developers Association |
| Distribution Licensee | The holder of a distribution licence under the Electricity Act 2023, commonly a DisCo |
| GADS | Generating Availability Data System, operated by the North American Electric Reliability Corporation |
| HPPC | Hybrid pulse power characterisation, a battery test procedure |
| IEA-PVPS | International Energy Agency Photovoltaic Power Systems Programme |
| IEC | International Electrotechnical Commission |
| ISO | International Organization for Standardization |
| kWh, kWp | Kilowatt-hour; kilowatt-peak, the rated direct-current capacity of an array at standard test conditions |
| NERC | Nigerian Electricity Regulatory Commission (the North American body of the same initials is written out in full) |
| O&M | Operations and maintenance |
| PCC | Point of common coupling, where an interconnected plant meets the Distribution Licensee's network |
| PR | Performance ratio, as defined in IEC 61724-1 |
| PV | Photovoltaic |
| RAMCO | Renewable Asset Management Company |
| REA | Rural Electrification Agency |
| RFC 8785 | The JSON Canonicalization Scheme, the default canonical form under Clause 11 |
| SHA-256 | The 256-bit member of the SHA-2 family of hash functions |
| STC | Standard test conditions: 1 000 W/m² irradiance, 25 °C cell temperature |
| USABC | United States Advanced Battery Consortium, whose test manuals define pulse durations cited in Clause 10 |

---

## 4 Principles

**P1. Measurement precedes target.** A service level written before its measurement is defined is unenforceable. Define the clause, run it for one Reporting Period, then set the target.

**P2. No party grades itself on data it can withhold.** Every performance figure is reported with the coverage of the data behind it, delivered and trusted, over the same window, and with the count of records it used.

**P3. A gap is neither a zero nor an excuse.** Missing data is reported as missing. It never raises a performance figure, and it is never counted as excused time.

**P4. Exclusions are declared in advance and never selected afterwards.** The categories of excusable time are fixed in the agreement. An event is excused only if it falls within a declared category and carries evidence.

**P5. Provenance travels with the number.** Whether a measurement was read from the device or asserted by a manufacturer's cloud service is a property of that measurement, and it is reported with it.

**P6. Refuse rather than fabricate.** Where an input is missing, the correct output is a refusal and never a default value.

**P7. Publish the method with the number.** Every figure carries the version of the method that produced it.

---

## 5 Requirements

Clauses 1 to 13 are the requirements of this specification. Each clause states a requirement and, where they apply, its definition and the evidence it needs, followed by commentary on what it prevents. Clause numbering is stable and is governed by §9.

### Clause 1 – Data delivery

**1.1 Requirement.** The operator shall declare, per site, a register of measurement series with the sampling cadence and the validity checks of each, and shall report for every Reporting Period both the delivered coverage and the trusted coverage of every series on the register. Where a monitoring class is declared under Clause 4, the declared cadence of the irradiance, module-temperature and electrical series shall satisfy the sampling and recording intervals that IEC 61724-1 sets for that class.

**1.2 Delivered coverage.** The window for a series is the part of the Reporting Period during which the series was on the register; a series commissioned or retired within the period has its expected count computed over that part only. Expected samples for a series = window duration ÷ declared cadence, counted on interval boundaries from the period start. Received samples = distinct samples whose timestamp falls within the period; a repeated sample for the same series and timestamp shall count once, and a sample shall not stand in for a missing interval other than its own. Delivered coverage % = min(received ÷ expected, 1) × 100. Where the expected count is zero, the coverage is undefined and shall be reported as undefined, never as zero and never as 100. Site-level coverage on either axis = total received (or trusted) samples ÷ total expected samples across every series on the register, never the mean of the per-series percentages, and shall be reported together with the per-series values.

**1.3 Trusted coverage.** A delivered sample is trusted only if it passes all four validity checks declared for its series:

- it lies within the declared physical range;
- it is not part of a stuck run longer than the declared limit;
- its timestamp lies within the declared tolerance of the source's clock;
- the source has not flagged it bad.

Trusted coverage % = min(trusted ÷ expected, 1) × 100. Rejected samples shall be counted by reason. Delivered and trusted coverage shall be reported together, and neither shall be quoted without the other. Every performance figure in this specification shall state the count of trusted records it used.

**1.4 Roster.** The series expected in a period are those on the register declared under 1.1. A series shall be added to the register with the date and evidence of its commissioning, and shall be retired from it only with the date and evidence of its decommissioning. A series that stops reporting stays on the register and reports zero coverage until it is retired. The register, with its additions and retirements, shall be published with the report.

**1.5 Silent series.** Any series whose trusted coverage falls below 90% shall be named individually and shall not be absorbed into an average.

**1.6 Late data.** A period's figures are provisional until a declared late-data horizon passes. A restatement after the horizon shall carry a note.

**1.7 Evidence.** Series register with cadences, validity checks, additions and retirements; per-period delivered and trusted coverage for every series; rejection counts by reason; named silent series.

**What this prevents.** Coverage averaged across a fleet hides a dark site. A roster defined as "the series we currently receive" makes a failed sensor disappear from its own denominator, and a roster that forgets a sensor after two quiet periods does the same thing more slowly. A sample that arrived but cannot be believed is not coverage: a producer emitting one reading every ten minutes where the register says sixty seconds delivers ten percent and can still report every reading as valid.

### Clause 2 – Availability

**2.1 Requirement.** The operator shall declare a service model per site (continuous, daylight, or contracted hours), shall classify every interval into exactly one state, and shall report both availability figures. Where a service profile has been disclosed to customers or to the Commission, such as the normal supply hours that a registered mini-grid discloses under Schedule 7 of the Mini-Grid Regulations or the minimum service profile of a customer charter, the declared service model shall be that profile.

**2.2 States.** In service; plant fault; scheduled maintenance; excused grid outage; client curtailment; force majeure; no data; outside contracted hours.

**2.3 Classification rules.** Intervals shall be of a declared resolution not exceeding fifteen minutes, aligned to the period start. An interval is in service where the plant delivered, or was able to deliver, at least the declared share of contracted capacity at the declared delivery point throughout the interval; an interval below that share is a plant fault unless it falls within an excused state. An interval with no trusted data under Clause 1 is no data. Where more than one state applies to an interval, the first matching state in the following order shall be assigned:

1. outside contracted hours;
2. no data;
3. force majeure;
4. excused grid outage;
5. client curtailment;
6. scheduled maintenance;
7. plant fault;
8. in service.

The resolution, the capacity share and the delivery point are declared parameters. Where the contracted minutes of a period are zero, both availability figures shall be reported as undefined, never as zero and never as 100. Where contracted minutes are positive but every contracted minute is excused, the adjusted figure shall be reported as undefined with the reason fully excused, and the raw figure shall still be reported.

**2.4 Excused set.** The excusable states are grid outage, only where the service model does not promise supply through an outage; client curtailment; and force majeure. Scheduled maintenance shall be excused only where the agreement declares it so: the clause tags the interval, the contract decides its treatment, and the treatment is a declared parameter. The state no data shall not be excused. Where the offtaker paid for battery storage and the service model is continuous, a grid outage shall not be excusable, because supply through an outage is what the storage was bought for.

**2.5 Definition.** Two figures shall be reported, both in the same table:

```
adjusted_availability_pct = in_service ÷ (contracted − excused) × 100
raw_availability_pct      = in_service ÷ contracted × 100
```

Contracted time, in-service time and each excluded category shall be reported in minutes and not only as percentages. The gap between the two figures is the size of the excuse. It is the number the owner should watch, and no target should be set against the adjusted figure alone.

**2.6 Third-party targets.** Where an agreement with a third party carries an availability or reliability target with no defined computation, such as the Annex 6 target of the tripartite agreement under the Mini-Grid Regulations, the raw figure shall be the one reported against it unless that agreement declares otherwise.

**2.7 Evidence.** Interval state series at the declared resolution; excusal events, each with a cause and a corroborating source.

**What this prevents.** Availability approximated from telemetry arrival. A site whose meter is reporting while the plant is dark scores as available under that method. Clause 1 exists so that the two cannot be confused, and Clause 12 forbids substituting one for the other. The classification rules exist so that two implementations given the same plant history produce the same two figures.

### Clause 3 – Energy accounting

**3.1 Requirement.** The period's photovoltaic energy shall be reported under an identity that closes, with every term published, including the residual:

```
E_resource = E_pv + E_curtailed + E_loss
```

**3.2 Definition.** `E_resource` is the energy the photovoltaic array could have produced under the period's irradiance and cell temperature, computed with the resource model declared under 3.3 on the provenance ladder of Clause 4. `E_pv` is the photovoltaic output measured at the boundary defined in Clause 4.2, the inverter or charge-controller output, before storage and before mixing with any other source. `E_curtailed` is energy withheld on positive evidence. `E_loss` is the declared residual, the PV resource loss: energy the array could have produced and did not. It is not the technical or non-technical loss of section 23 of the Mini-Grid Regulations, which is a distribution-side percentage verified at inspection, and it is not the aggregate technical, commercial and collection loss filed on Schedule 4.

**3.3 Resource model.** The resource model shall be declared: the irradiance provenance under Clause 4.3, the transposition and temperature models and their coefficients, the rated capacity used, and an uncertainty band on `E_resource` derived from the declared uncertainty of the irradiance source. A resource figure without its band is not reportable under this specification.

**3.4 Plant energy balance.** Energy delivered to the load or network is a different quantity from `E_pv` on a hybrid plant, because diesel generation and battery discharge also arrive at the delivery point. It shall be reported in a separate balance that closes over the period, with every term published and the residual named:

```
E_pv + E_diesel + E_import + E_storage_discharge
  = E_delivered + E_export + E_storage_charge + E_auxiliary + E_balance_residual
```

`E_delivered` is the energy consumed by the plant's own load at the declared delivery point. It excludes energy exported to the network, which is `E_export`, and auxiliary consumption, which is `E_auxiliary`; each is reported separately and no energy is counted under two terms. Apart from `E_pv`, which is common to both, none of these terms enters the resource identity, and the report shall say so.

**3.5 Settlement estimates.** A regulatory settlement estimate, such as the three-month average that Schedule 8 of the Mini-Grid Regulations prescribes when a point-of-common-coupling meter fails, or any estimate made for billing, shall not be an input to this identity. The identity uses metered values or refuses.

**3.6 Making the identity testable.** Defined as a residual, the identity closes by construction and tests nothing. It becomes a test where `E_pv` is metered at the boundary rather than derived from the same model as the resource. Where both a metered and a derived `E_pv` exist, both shall be reported, and their divergence is the check: a resource estimate adjusted to flatter the loss figure moves one and not the other.

**3.7 Curtailment.** Curtailment shall be counted only on positive evidence: a control setpoint, a full battery with no load available, or a documented instruction. Absent such evidence, energy not delivered is loss and not curtailment.

**3.8 Loss attribution.** Where part of the loss is attributed to a named mechanism such as soiling or thermal derating, the attributed and unattributed parts shall be reported separately.

**3.9 Evidence.** All terms of both the identity and the balance per period; metered and derived `E_pv` where both exist; the declared resource model and its band; curtailment evidence log; the basis of any loss attribution.

**What this prevents.** Unexplained shortfall relabelled as curtailment, and a loss figure improved by quietly lowering the resource estimate. It also prevents a negative loss: measured at the delivery point of a hybrid plant, delivered energy can exceed the photovoltaic resource whenever the genset ran, and the identity would then report a loss below zero.

### Clause 4 – Performance ratio

**4.1 Requirement.** Performance ratio shall be reported in accordance with IEC 61724-1, with the monitoring class achieved (A, B, or unclassified) and the irradiance provenance declared for each period:

```
PR = (E_ac ÷ P_stc) ÷ (H_poa ÷ G_stc)
```

**4.2 Measurement point.** `E_ac` is the alternating-current output of the photovoltaic inverters, or the equivalent measured at the charge-controller output on a direct-current-coupled plant. It is not the energy delivered after battery round-trip and diesel generation; a ratio taken at the delivery point of a hybrid plant is not a performance ratio. IEC 61724-1 Annex E governs plants with storage and auxiliary sources. In this specification "auxiliary" means auxiliary consumption; in IEC 61724-1 Annex E an "auxiliary source" is a generator.

**4.3 Irradiance provenance.** The irradiance provenance shall be declared per period from the following ladder, from most to least authoritative: measured plane-of-array irradiance; measured global horizontal irradiance transposed to plane-of-array, with the transposition model declared; satellite or remote-sensed irradiance, which IEC 61724-1 recognises as a data source. Where none exists, the ratio shall be refused. A modelled clear-sky irradiance is not an estimate of the period's irradiance: a ratio computed against it is a clear-sky ratio, is wrong by the whole of the cloud loss in a rainy season, and shall not be reported as a performance ratio under this clause. A regional constant, for example "5 peak sun hours", is not an irradiance measurement; a ratio computed against one is a specific-yield ratio and shall not be reported as a performance ratio under this clause.

**4.4 Temperature correction.** Where a temperature-corrected ratio is reported, the reference temperature shall be declared as either 25 °C or the irradiance-weighted annual-average module temperature, these being the two variants defined in IEC 61724-1 clause 14.3.2, together with the temperature coefficient and the source of the module temperature. At the module temperatures of this climate the two variants differ by ten points or more and are not interchangeable.

**4.5 Exclusions.** Records excluded from the ratio (night, invalid readings, periods below the declared minimum insolation, and missing data) shall be counted and reported, together with the treatment applied to missing data, as IEC 61724-1 clauses 12 and 15 require. A ratio reported without its records-used count cannot be compared with another. Below the declared minimum insolation the ratio shall not be reported.

**4.6 Declared class.** A declared class shall be testable. The report shall name the irradiance and module-temperature sensors, their type and their last calibration date, and the cadence declared under Clause 1 shall satisfy the intervals that IEC 61724-1 sets for the class. A class whose sensors or cadence do not meet the standard shall be declared unclassified, and a legacy Class C declaration shall be restated as unclassified. Unclassified against IEC 61724-1 is a valid declaration; most distributed plants in this class are unclassified because they carry no calibrated irradiance sensor.

> Edition 2.0 of IEC 61724-1 (2021) eliminated Class C. The numeric range and stuck-value filters commonly attributed to IEC 61724 are in IEC TS 61724-3, not in Part 1.

**What this prevents.** A specific-yield ratio against an assumed sun-hours constant, presented as an IEC performance ratio. The two differ by more than the performance differences being measured, so a fleet ranked on the first is ranked on its climate and not on its operators.

### Clause 5 – Fault labelling

**5.1 Requirement.** Every corrective intervention shall close with a structured cause label. The record shall not be marked complete without one, because a label that is optional is not collected.

**5.2 Code shape.** Labels take the form `equipment.category.cause`, drawn from a published code set whose version shall be stated. Annex A gives a set that may be used or replaced.

**5.3 Confidence.** Each label shall carry a confidence of `confirmed`, `probable` or `suspected`.

**5.4 Mandatory note.** Where a cause has consequences beyond the plant (theft, tamper, unauthorised connection, fuel shortfall), or where the label records that no cause was established, a free-text note shall be required.

**5.5 Evidence window.** The interval of plant data associated with the fault shall be fixed at closure: anchored on the triggering event, extending a declared period before it and a shorter declared period after it. It shall be captured at closure and shall not be recomputed later from data that has since been revised.

**5.6 Preventive and administrative work.** Work whose purpose is a scheduled preventive inspection or service, or administrative work that does not respond to a fault, is outside this clause and shall not be blocked by it. The exemption follows the purpose of the work and never the way its record was created: a corrective intervention entered by hand is a corrective closure under 5.1.

**5.7 Offline closure.** Where interventions are recorded on a device that may be offline, the code set shall be held on the device. A closure that cannot be labelled offline shall be held for completion and shall not be discarded, and the count of held closures shall be reported.

**What this prevents.** "Fixed" as a maintenance record. A fleet of closed work orders with no causes is not a maintenance history: it cannot support a reserve estimate, a warranty claim, a recurrence finding, or a procurement decision about a manufacturer.

### Clause 6 – Evidence of intervention

**6.1 Requirement.** Each corrective closure shall carry an evidence completeness score, computed against a declared per-equipment requirement set and stamped on the record at closure.

**6.2 Minimum.** Pre-work and post-work photographs shall be required. Battery work shall additionally require a diagnostic reading. Optional items may be listed but shall be excluded from the denominator.

**6.3 Post-repair verification.** The record shall state whether plant measurements after the intervention were re-read to confirm that the fault had cleared, and the outcome.

**6.4 Attestation.** Interventions above a declared consequence threshold shall carry a named supervisor review.

**What this prevents.** A closure rate that measures typing rather than repair. Recurrence counted from alarm history alone misses a fault that returns under a different alarm.

### Clause 7 – Measurement provenance

**7.1 Requirement.** The operator shall report, for each period, the share of energy-bearing measurements read directly from the device, meaning a local protocol read over an owner-controlled gateway, against those asserted by a manufacturer's cloud service:

```
device_read_share_pct = owner_path_records ÷ all_energy_bearing_records × 100
```

**7.2 Counterparty settlement meter.** On an interconnected site the import and export energy at the point of common coupling is read from the Distribution Licensee's settlement meter, which is neither an owner-path read nor a manufacturer's assertion. Records from it shall carry a third provenance value, `counterparty_meter`, shall be reported on their own line, and shall sit in neither the numerator nor the denominator of the device-read share.

**What this prevents.** A portfolio whose entire performance record is the assertion of the party that sold the equipment, and which ends when a vendor changes an API, withdraws a service, or asserts rights in the data.

> Some manufacturer agreements assert intellectual property in data derived from their equipment. For an owner that intends to keep its own record, and for a public owner that must, a local protocol read is the contractually safe path.

### Clause 8 – Asset identity

**8.1 Requirement.** Each asset shall carry manufacturer, model, serial number, rated capacity, firmware version at the time of the record, commissioning or installation date, and site location including a climate classification.

**8.2 Nameplate evidence.** A photograph of the nameplate shall take precedence over typed entry. A correction from a nameplate shall propagate to records already written as a dated revision that references the record it corrects; an issued report is never rewritten (Clause 11.4).

**8.3 Reconciliation with filings.** Where an age or commissioning date for the same asset has been filed with the Commission, in the Schedule 4 asset register or a Schedule 13 handover sheet under the Mini-Grid Regulations, the register shall reconcile to it. A divergence shall be reported with both values and shall not be resolved silently in either direction.

**8.4 Estimated dates.** This clause has a deadline, because every period operated without it is permanently lost. An implementation that later populates installation dates from estimates shall mark those records as estimated. A register that does not distinguish estimated from evidenced dates looks complete and is not.

**What this prevents.** The loss of age at failure, the single most valuable field in any reliability record and the one that cannot be reconstructed afterwards. A record without installation dates can never answer how long these batteries lasted in this climate.

### Clause 9 – Savings and avoided-cost claims

**9.1 Requirement.** Any avoided-cost, avoided-diesel or avoided-carbon claim shall state its counterfactual baseline, the date on which that baseline was established, its normalisation variables and coefficients, and the confidence of the consumption measurement behind it.

**9.2 Baseline.** The baseline shall be established in advance and shall not be fitted against the period being reported. Fitting a baseline to the reporting period manufactures the saving.

**9.3 Overlapping counterfactuals.** Where two savings claims rest on overlapping counterfactuals, for instance avoided diesel and avoided grid purchase, they shall be reported separately and stated as non-additive.

**9.4 Unpriced and withheld values.** Where no tariff is on file, the line shall read *unpriced*; a platform default rate is not a tariff. Where measurement confidence falls below a declared floor, the physical quantity shall be reported and the currency figure shall be *withheld*.

**What this prevents.** The avoided-cost figure that cannot survive diligence. This is the clause most likely to be tested by an institutional investor, and the one most often produced without a documented baseline.

### Clause 10 – Condition and remaining life

**10.1 Requirement.** Any statement of battery state of health or remaining useful life shall declare its method, its end-of-life definition, and an uncertainty band. A point estimate without a band is not reportable under this specification.

**10.2 Method conditions.** State of health measured by coulomb counting shall state the qualifying discharge criteria. Round-trip efficiency shall be reported only between comparable state-of-charge endpoints. Integration across a data gap shall be clipped at a declared maximum interval, and the clipping shall be disclosed.

**10.3 Projected life.** Where remaining life is projected from a physical model rather than from observed replacements, it shall be labelled as such and its end-of-life criterion shall be stated, for example capacity at 60% of nameplate.

**10.4 Internal resistance.** Minute-cadence telemetry cannot yield a standards-grade internal resistance: the IEC 61960 and HPPC read-points fall at 1 to 30 seconds, inside one sample interval, and IEA-PVPS T13-35:2026 puts the requirement at pulses of roughly ten seconds. A platform sampling at minute intervals shall not report internal resistance as a measurement. A lumped-resistance trend regressed from voltage, current and temperature may be reported only if it is labelled as such, calibrated for current, temperature and state of charge, and never compared with a laboratory value.

**What this prevents.** A replacement reserve built on a confident number with no error bars. A reserve is a financial decision: it needs a range, and the range needs to be honest about what produced it.

### Clause 11 – Report integrity

**11.1 Requirement.** An issued performance report shall be immutable.

**11.2 Definition.** The canonical form of a report is its payload serialised under a declared canonicalisation profile, after exactly two fields have been removed: the report's own digest, `content_sha256`, and the generation timestamp. No other field shall be removed. The predecessor's digest, `previous_sha256`, stays inside the payload, so that a report's digest also commits to its place in the chain and a predecessor cannot be exchanged without changing the digest. The profile shall be the JSON Canonicalization Scheme (RFC 8785) unless the report declares another published profile that fixes key order, whitespace, string escaping and number serialisation. The profile identifier, `rfc8785` or the published identifier of the alternative, shall be carried in the payload as `hash_profile`, so that the digest covers it and travels with it. Under `rfc8785`, object keys are ordered by UTF-16 code units and numbers are serialised as that scheme requires. No Unicode normalisation shall be applied before canonicalisation: a string is hashed as received, and two encodings of one character are two different records. An alternative profile shall state its key order and shall likewise apply no normalisation. The digest is SHA-256 over the UTF-8 bytes of the canonical form, written as 64 lowercase hexadecimal characters. Re-hashing an unchanged report under its declared profile reproduces the stored value, and any party holding the payload and the profile's published definition can check it. Consecutive reports for the same asset or portfolio shall carry the prior report's digest in `previous_sha256`. The first report of a chain shall carry `previous_sha256` as JSON null, and the null value is hashed like any other.

**11.3 Worked example.** Under `rfc8785`, the first report of a chain with the payload

```
{"period_end": "2026-09-30", "period_start": "2026-07-01", "site": "S1",
 "e_pv_metered_kwh": 1234.5, "hash_profile": "rfc8785", "previous_sha256": null}
```

canonicalises to

```
{"e_pv_metered_kwh":1234.5,"hash_profile":"rfc8785",
"period_end":"2026-09-30","period_start":"2026-07-01",
"previous_sha256":null,"site":"S1"}
```

and its digest is `a0d1d8451541fd21913d0c7fa5851415902a54cda4e14563cecfb0de5b28f9e5`. The line breaks in the canonical form above are shown for layout only; the canonical form contains no whitespace. The keys of this example are ASCII, so code-point and UTF-16 orderings agree on it; a profile is not proved by this example alone where its keys are not. An implementation declaring `rfc8785` that does not reproduce this value from this payload does not conform to this clause. A published alternative profile shall provide a worked example of the same form.

**11.4 Enforcement.** Immutability shall be enforced outside the process that authors the report, by a database constraint, an append-only store, or a countersignature, so that a defect in the authoring application cannot silently alter an issued report.

**11.5 Restatement.** A restatement shall be a new report that references the superseded one. It shall not be an edit.

> A manual or spreadsheet process can satisfy this clause by issuing each report as a checksummed file in an append-only store; no database is required. The digest covers the data the document was rendered from, not the bytes of the rendered file. The digest printed in the colophon of this specification is a checksum of its Markdown source, a separate convention applied to the document itself; the source file is published beside the PDF at gen318.com/ops-1.

### Clause 12 – The scorecard

**12.1 Requirement.** Operator performance shall be reported as a scorecard of separately named dimensions, each with its own evidence status. A single composite score is permitted only where every input dimension is published alongside it, with its weight.

**12.2 Dimensions.** The scorecard carries nine dimensions:

- C1, data delivery, both coverage axes;
- C2, availability, both figures;
- C3, energy identity divergence, the absolute difference between metered and derived `E_pv` as a share of the metered value, which may exceed 100 % and is undefined where the metered value is zero, both values being reported in either case;
- C4, performance ratio with its declared class;
- C5, label quality;
- C6, intervention evidence;
- C7, measurement provenance;
- C8, asset record completeness;
- C13, response, added by Clause 13.

**12.3 Label quality.** Where Clause 5 is enforced, the labelling rate is 100% by construction and measures nothing. What varies, and what shall be reported, is the confidence mix, the share coded as no cause established, and the count of closures held for want of a label.

**12.4 Ranking.** Ranking across a portfolio shall be by percentile within the Reporting Period, and the population size shall be stated. A rank over fewer than five comparable sites shall be reported as a rank and not as a percentile.

**12.5 Prohibited methods.** No dimension shall be computed by a method that another clause prohibits. In particular, the availability dimension shall be computed under Clause 2 and never from Clause 1 coverage.

**What this prevents.** A single health score that cannot be argued with, and therefore cannot be improved. An operator that disputes one dimension should be able to dispute exactly that dimension.

### Clause 13 – Response and restoration

**13.1 Requirement.** For every corrective intervention the operator shall report four intervals, each in minutes, anchored on a detection timestamp that the operator does not control:

- detection to acknowledgement;
- acknowledgement to arrival on site, the intervention;
- detection to arrival, the response;
- arrival to closure, the resolution.

Intervals shall be recorded in whole minutes, rounded down. Percentiles shall be computed by the nearest-rank method, so that every reported percentile is an observed interval; interpolation shall not be used. Fault classes, and any restoration expectation published to customers or to the Commission, are declared parameters.

**13.2 Detection.** The clock shall start at the earliest of: the first alarm on the declared metric set; the first interval classified as plant fault under Clause 2; a customer or owner report carrying a timestamp; or a finding by the operator's own staff, timestamped in a store that satisfies 13.8. It shall not start when the operator acknowledges the alarm, and it shall not pause for a communications loss. A plant the operator cannot see is a plant the operator cannot serve, and P3 applies.

**13.3 Fault classes.** Fault classes shall be declared per site, in advance, by share of contracted capacity lost or by consequence to the offtaker, and there shall be at least three. A restoration expectation published under section 17(2)(f) of the Mini-Grid Regulations shall be restated here as the declared expectation for its class.

**13.4 Definition.** Each interval shall be reported per closure and, per period, as the 50th and 90th percentiles by fault class, each calculated by the nearest-rank method of 13.1, with the count of closures in each class. Each closure shall carry the source of its detection timestamp: alarm, interval classification under Clause 2, customer report, owner report, or operator staff; and the period shall report the count of closures by detection source. A closure whose detection timestamp is missing shall be reported as undetected and counted; it shall not be assigned the acknowledgement time. The two counts measure different things: the share of closures first detected by a person is a measurement of the monitoring, and the count of undetected closures is a measurement of the record.

**13.5 Open faults.** All faults open at the end of the Reporting Period, regardless of when they were detected, shall be reported by class as a count and as ages in days at the period end, together with the count overdue against the declared restoration expectation. A fault carried into a later period keeps its original detection timestamp, appears in the open-fault count of every period until it closes, and has its intervals reported in the period in which it closes. A period's percentiles shall be read together with its open-fault count, and the report shall present them together.

**13.6 Verified restoration.** Resolution shall be reported twice: to administrative closure, and to verified restoration, the time at which the post-repair verification of Clause 6.3 confirmed that the fault had cleared. Where that verification was not performed, verified restoration shall be reported as unverified and never as the closure time.

**13.7 Remote interventions.** Where a fault is resolved without a site visit, the intervention interval ends at the first remote action carrying a timestamp, and the record shall state that the intervention was remote. For a remote intervention, the timestamp of the first remote action shall substitute for arrival on site in the intervention, response and resolution intervals.

**13.8 Detection record.** The detection record shall be held in a store that the operator cannot alter after the fact: an alarm log whose entries are timestamped and hashed under Clause 11, or a record that the owner or a customer controls. An operator-editable log on its own does not establish detection.

**13.9 Scorecard.** Response is the ninth dimension of the Clause 12 scorecard, named C13, with its own evidence status. The dimension shall carry response and verified resolution at the 90th percentile for every declared fault class, together with the open-fault count, and shall not be collapsed to one class or to a mean. A composite that omits the dimension shall say so in its published weights.

**13.10 Evidence.** Alarm log or Clause 2 interval record for detection; dispatch record for acknowledgement; site check-in or remote-action record for arrival; Clause 5 closure and Clause 6 verification for resolution.

**What this prevents.** A response-time figure that starts when the operator chose to notice. Under the convention common in European O&M contracts the clock runs from acknowledgement and a communications loss pauses it; under this clause an operator that acknowledges slowly reports slowly, and a dark site is a fault rather than a pause. It also prevents a restoration promise made to customers that no record can check.

> No response-time target is set until one full Reporting Period has been reported (P1). Resolution depends on parts supply and is, in most O&M markets, monitored rather than guaranteed; that is a contract choice this clause does not make.

---

## 6 Conformance

Conformance is declared at one of three levels, per site and per Reporting Period (Table 3).

**Table 3: Conformance levels**

| Level | Meaning |
|---|---|
| **Declared** | The operator reports every clause in the required form, including its refusals. An O&M agreement should require this from the first full Reporting Period after mobilisation; §8 sets when the inputs must exist. |
| **Verified** | The owner or its agent independently reproduces the reported figures from the underlying records, for a sampled period. |
| **Independently assured** | A party with no commercial interest in the result reproduces them. |

**6.1 Clause status.** The report shall carry, for each clause, one of three statuses: reported; refused, with the refusal type from §3.1, the date from which the refusal has applied and the party responsible for remedying it; or not reported. A report that refuses every clause is Declared but not evidenced, and the two shall be distinguishable at a glance.

There is no certificate, no mark and no register. A claim of conformance is a self-declaration and should be read as one. Refusals are conforming outputs, and a report that never refuses anything is the report to examine first.

---

## 7 What this specification cannot do

These limits are stated in the body of the document rather than in an annex, because a reader deciding whether to use it needs them before the rest.

- **Telemetry does not establish physical condition.** Every clause operates on data. A corroded termination, a cracked backsheet or a failed earth is found by a person at the site.
- **Coverage is not availability, and availability is not service.** Clauses 1 and 2 are separated for that reason, but a plant can satisfy both and still serve its load badly.
- **The labels come from the operator's own technicians.** Clause 5 produces a maintenance record rather than independent evidence. Clause 7 puts at least the measurement behind the label outside the operator's control. For insurance or claims work a source the operator does not control is a requirement, and this specification does not deliver one.
- **Age at failure only accrues forward.** Clause 8 cannot be backfilled honestly.
- **A response clock measures reaction, not repair.** Clause 13 times the operator's acknowledgement, arrival and closure. Whether the fault cleared is Clause 6's post-repair verification, and whether the right fault was fixed is Clause 5's label and its confidence. A fast closure that returns is two fast closures, and only Clauses 5 and 6 together will show it.
- **No population baseline exists at this scale.** None of the programmes the publisher examined (GADS Solar, NERC's Schedule 4 return, the Enugu State template and AMDA's benchmarks) mandatorily collects an event-level failure record (cause codes, equipment identity, age at failure) at the size of these plants, and the publisher found no other that does. The North American GADS Solar programme, which does collect such records, is mandatory only from 20 MW, and smaller plants report voluntarily if at all. Nigerian regulators collect operational returns from permitted operators: annual generation, revenue and asset ages federally, and quarterly reliability indices with planned and unplanned outage counts in Enugu. Neither is a failure record. AMDA's benchmarking reports publish portfolio-level operational and financial performance across African mini-grids, but they carry no failure-cause taxonomy, no age at failure and no equipment identity. This specification defines how to record. It cannot yet say whether a number is good.
- **This is a method and not a standard.** No standards body has adopted it. It is offered because the alternative, in which every owner invents private definitions inside private contracts, produces a decade of records that cannot be compared with each other.

---

## 8 Contract language

The following provisions are ready to adapt into an operations and maintenance agreement.

> **Performance measurement.** The Operator shall report, for each Reporting Period and for each Site, the measurements defined in Clauses 1 to 13 of OPS-1 v1.0, in the form that specification requires, including any refusal it requires. The Reporting Period shall be quarterly, or shall align with the regulatory reporting period applicable to the Site's permit holder or registered operator where one applies.
>
> **Declared parameters.** The Operator shall fix, and publish with each report, every parameter OPS-1 requires to be declared. A declared parameter shall not be changed within a Reporting Period.
>
> **Data delivery.** The Operator shall declare the measurement series and cadence for each Site within 30 days of mobilisation. Availability shall not be computed from data-delivery coverage.
>
> **Exclusions.** Time is excused only where it falls within a category declared in Schedule [ ] and is supported by evidence. Periods of missing data are not excused.
>
> **Fault records.** A corrective work order shall not be recorded as complete without a cause code, a confidence level and, where the code requires it, a note. A closure that cannot be labelled shall be held for completion and reported, and shall not be discarded.
>
> **Asset register.** The Operator shall record manufacturer, model, serial number, rated capacity, firmware version and commissioning date for each asset within 60 days of mobilisation, evidenced by nameplate photograph. Dates not evidenced shall be marked estimated.
>
> **Provenance.** The Operator shall report the device-read share of energy-bearing measurements for each Reporting Period, and shall not reduce it without the Owner's written agreement.
>
> **Response and restoration.** The Operator shall report the intervals defined in Clause 13 for every corrective intervention, anchored on detection. Fault classes and any restoration expectation are declared in Schedule [ ]. No response-time target is set until one full Reporting Period has been reported.
>
> **Access and retention.** The Owner shall have read access to all measurement series, work-order records, closure labels, evidence media and asset records at all times during the term, and shall receive an export of them in a documented, non-proprietary format with each Reporting Period's report. The Operator shall retain them for the life of the asset or ten years, whichever is longer.
>
> **Records on exit.** All measurement series, work-order records, closure labels, evidence media and asset records are the property of the Owner and shall be delivered in a documented, non-proprietary format on expiry or termination. The Owner shall confirm in writing that the delivered records reconcile to the final report before the Operator's obligations are discharged.

The last provision is the one owners most often omit and most often need.

---

## 9 Version and citation

**OPS-1 v1.0, 4 September 2026.**

Cite as: Gen318 (2026). *OPS-1: Operator Performance Specification for Publicly Financed Solar-Hybrid Assets*, version 1.0. https://gen318.com/ops-1

This specification is free to reproduce, adapt and incorporate into procurement documents, with attribution. An adaptation shall state the version it derives from and shall describe its changes.

Clause numbering is stable. A future version may add clauses; it will not renumber existing ones. A withdrawn clause is marked withdrawn and retained.

Corrections and disagreements are welcome and will be listed in the next version.

---

## Annex A (informative) – Fault code set

**Code set version: 1.** This set may be adopted, extended or replaced. Clause 5 requires that a published set is used and that its version is stated.

**Code shape:** `equipment.category.cause`. Codes are stable once published. A retired code is marked inactive and retained; it is never deleted and never reused.

**Equipment classes (9).** `battery` · `inverter` · `solar_array` · `charge_controller` · `diesel_genset` · `meter` · `distribution` · `sensor` · `general`

**Categories (13).** `thermal` · `electrical` · `mechanical` · `environmental` · `control` · `comms` · `fuel` · `wear` · `install` · `ops` · `external` · `none` · `undetermined`

**Confidence ladder.** `confirmed` · `probable` · `suspected`

**Examples.** `battery.thermal.charging_over_temp` · `battery.wear.capacity_fade` · `battery.install.undersized_bank` · `inverter.electrical.igbt_failure` · `inverter.control.firmware_fault` · `inverter.comms.rs485_wiring` · `solar_array.environmental.soiling` · `solar_array.electrical.bypass_diode_failure` · `diesel_genset.fuel.contaminated_fuel` · `general.external.grid_outage` · `battery.none.no_fault_found`

**Codes requiring a mandatory note.** `solar_array.external.theft` · `diesel_genset.fuel.fuel_shortfall` · `meter.control.tamper` · `distribution.external.unauthorized_connection` · `general.external.theft_vandalism` · `general.undetermined.undetermined`

The `none` and `undetermined` categories exist deliberately: `battery.none.no_fault_found` and `general.undetermined.undetermined` are valid, complete closures. A taxonomy without them forces a technician to invent a cause, and an invented cause is worse than a recorded absence, which is why `general.undetermined.undetermined` carries a mandatory note.

---

## Annex B (normative) – Minimum reporting schema

The fields in Table B.1 shall be reported per site and per Reporting Period. Types are given as JSON types; a map is an object keyed by the named key; a list is an array.

**Table B.1: Minimum reporting schema**

| Field | Type, unit | Clause | Note |
|---|---|---|---|
| `period_start`, `period_end` | date (ISO 8601) | 2 | Period boundaries |
| `service_model` | enum: `continuous`, `daylight`, `contracted_hours` | 2 | Declared rather than inferred |
| `interval_resolution_min`, `in_service_capacity_share_pct`, `delivery_point` | integer min; number %; text | 2 | The classification parameters of 2.3 |
| `coverage_by_series[]` | list of {`series_id`, `cadence_s`, `expected`, `delivered`, `trusted`, `rejected_by_reason` map} | 1 | One entry for every series on the register; an expected count of zero is reported as undefined |
| `coverage_delivered_pct`, `coverage_trusted_pct` | number % | 1 | Site aggregates; neither is reported without the other |
| `series_register_changes[]` | list of {`series_id`, `action` enum `added`/`retired`, `date`, `evidence_ref`} | 1 | Roster additions and retirements with evidence |
| `silent_series[]`, `provisional` | list of `series_id`; boolean | 1 | Trusted coverage below 90%; provisional until the late-data horizon passes |
| `minutes_contracted`, `minutes_in_service`, `minutes_plant_fault`, `minutes_scheduled_maintenance` | integer min | 2 | Minutes as well as percentages; scheduled maintenance tagged, its excusal a declared parameter |
| `minutes_grid_outage_excused`, `minutes_client_curtailment`, `minutes_force_majeure`, `minutes_no_data` | integer min | 2 | `no_data` reported, never excused |
| `availability_raw_pct`, `availability_adjusted_pct` | number % | 2 | Both, side by side; undefined where contracted minutes are zero |
| `e_resource_kwh`, `e_resource_kwh_low`, `e_resource_kwh_high` | number kWh | 3 | The resource with its uncertainty band (3.3) |
| `resource_model` | {`irradiance_provenance`, `transposition_model`, `temperature_model`, `gamma_pct_per_k`, `p_stc_kwp`, `irradiance_uncertainty_pct`} | 3 | The declared resource model (3.3) |
| `e_pv_metered_kwh`, `e_pv_derived_kwh`, `e_curtailed_kwh`, `e_loss_kwh` | number kWh | 3 | Both `E_pv` figures where both exist; `e_loss_kwh` is PV resource loss rather than a regulatory loss figure |
| `e_delivered_kwh`, `e_diesel_kwh`, `e_import_kwh`, `e_export_kwh`, `e_storage_charge_kwh`, `e_storage_discharge_kwh`, `e_auxiliary_kwh`, `e_balance_residual_kwh` | number kWh | 3 | The plant energy balance of 3.4, outside the identity; `e_auxiliary_kwh` is auxiliary consumption rather than an IEC "auxiliary source" |
| `loss_attributed_kwh`, `loss_unattributed_kwh` | number kWh | 3 | Where any attribution is claimed |
| `pr_pct`, `pr_tc_pct`, `tc_reference_temp`, `tc_gamma_pct_per_k` | number %; number %; enum `25C`/`annual_equivalent`; number %/K | 4 | The temperature-corrected ratio carries its reference temperature and coefficient |
| `monitoring_class`, `irradiance_provenance` | enum `A`/`B`/`unclassified`; enum `poa_measured`/`ghi_transposed`/`satellite`/`refused` | 4 | Declared per period |
| `pr_records_used`, `pr_records_excluded`, `pr_missing_data_rule` | integer; integer; text | 4 | Exclusions counted and the missing-data treatment stated |
| `irradiance_sensor`, `irradiance_sensor_calibrated_on`, `module_temp_sensor`, `module_temp_sensor_calibrated_on` | text; date; text; date | 4 | A declared class carries its sensors and calibration dates |
| `corrective_closures`, `confidence_mix`, `share_no_cause_established_pct`, `closures_held` | integer; map of `confirmed`/`probable`/`suspected` to integer; number %; integer | 5 | Label quality rather than labelling rate |
| `evidence_completeness_mean`, `post_repair_verified_pct` | number 0 to 1; number % | 6 | |
| `device_read_share_pct`, `counterparty_meter_share_pct` | number % | 7 | Across the declared metric set; the counterparty meter is its own line, outside the device-read ratio |
| `asset_record_completeness_pct`, `install_dates_estimated_pct`, `register_filing_divergences` | number %; number %; integer | 8 | Estimated dates counted separately; divergences from a Commission filing reported, never resolved silently |
| `savings_liters`, `savings_ngn`, `savings_baseline_id`, `baseline_established_on` | number L; number NGN; text; date | 9 | `savings_ngn` is absent and its status `withheld` below the confidence floor, and `unpriced` where no tariff is on file |
| `savings_baseline_coefficients`, `savings_measurement_confidence` | map of variable to coefficient; number 0 to 1 | 9 | The normalisation variables and coefficients of 9.1 |
| `soh_pct`, `soh_pct_low`, `soh_pct_high`, `soh_method`, `eol_criterion` | number %; number %; number %; text; text | 10 | No point estimate without a band |
| `rul_days_low`, `rul_days_mid`, `rul_days_high` | integer d | 10 | Labelled `projected` where derived from a physical model |
| `method_version`, `hash_profile`, `content_sha256`, `previous_sha256` | text; text (`rfc8785` or a published profile identifier); 64 hex characters; 64 hex characters, or null for the first report of a chain | 11 | SHA-256 over the canonical form of the declared profile; `hash_profile` and `previous_sha256` are inside the hashed payload, only `content_sha256` and the generation timestamp are outside it |
| `scorecard[]`, `composite_weights`, `population_size`, `identity_divergence_pct` | list of {`dimension`, `value`, `evidence_status`, `records_used`}, where `value` is a number or a map of named components (delivered and trusted, raw and adjusted, or fault class) to numbers; map of dimension to weight; integer; number %, not capped at 100 | 12 | Dimensions published with any composite; C13 is a dimension; a paired or per-class dimension keeps its parts |
| `acknowledgement_minutes_p50_by_class`, `acknowledgement_minutes_p90_by_class`, `intervention_minutes_p50_by_class`, `intervention_minutes_p90_by_class`, `response_minutes_p50_by_class`, `response_minutes_p90_by_class`, `resolution_minutes_p50_by_class`, `resolution_minutes_p90_by_class`, `resolution_verified_minutes_p50_by_class`, `resolution_verified_minutes_p90_by_class` | map of fault class to integer min | 13 | Detection-anchored; verified resolution reported beside administrative closure |
| `closures_by_class`, `closures_by_detection_source`, `closures_undetected`, `open_faults_by_class`, `open_fault_age_days_by_class`, `overdue_faults_by_class`, `remote_interventions` | map to integer; map of `alarm`/`interval`/`customer`/`owner`/`staff` to integer; integer; map to integer; map to list of integer d; map to integer; integer | 13 | An undetected closure is counted, never assigned the acknowledgement time; closures by detection source measure the monitoring; open faults reported beside the percentiles |
| `clause_status[]` | list of {`clause`, `status` enum `reported`/`refused`/`not_reported`, `refusal`, `since`, `remediation_owner`} | 6 | One entry per clause (6.1) |

**Refusals and statuses.** A field that cannot be produced shall carry a refusal value from §3.1 in a companion `<field>_status` field, and the field itself shall be absent; it shall never carry zero, null or a default. Every ratio and every percentile shall carry the count of trusted records behind it in a companion `<field>_n` field. For a field reported by fault class, the value, the status and the count are carried per class: `<field>_status` and `<field>_n` are then maps keyed by class, and a class whose value cannot be produced is absent from the field and present in its status map, so that one class may carry a verified restoration percentile while another is unverified. A machine-readable schema stating the type, unit, status and calculation of each field is published beside this specification as `annex-b.schema.json`; where the schema and this table differ, this table governs. Validation against the schema establishes only that a report is well formed. It does not establish conformance, which requires the evidence, the declared parameters and the refusals of each clause.

**Declared parameters.** The following shall be published with every report:

- Clause 1: series cadences and validity checks (physical range, stuck-run limit, timestamp tolerance); the late-data horizon;
- Clause 2: the excusable categories, including whether scheduled maintenance is excused; the interval resolution, in-service capacity share and delivery point;
- Clause 3: the resource model and the irradiance uncertainty;
- Clause 4: the minimum insolation, the missing-data treatment and the reference temperature;
- Clause 5: the evidence-window lookback and lookahead;
- Clause 6: the per-equipment evidence requirement set and the supervisor-attestation consequence threshold;
- Clause 7: the energy-bearing metric set;
- Clause 9: the savings measurement-confidence floor;
- Clause 10: the maximum integration interval;
- Clause 11: the canonicalisation profile;
- Clause 13: the fault classes and the declared restoration expectation per class.

---

## Bibliography

- Africa Minigrid Developers Association, *Benchmarking Africa's Minigrids*, 2020, 2022 and 2024 editions.
- IEA-PVPS Task 13, T13-09:2017, *Assessment of Photovoltaic Module Failures in the Field*.
- IEA-PVPS Task 13, T13-25:2022, *Guidelines for Operation and Maintenance of Photovoltaic Power Plants in Different Climates*.
- IEA-PVPS Task 13, T13-35:2026, *Assessing the Reliability of Battery Systems in Solar Power Plants in Operation*.
- IEC TS 61724-3:2016, *Photovoltaic system performance. Part 3: Energy evaluation method*.
- IEC 61960-3, *Secondary cells and batteries containing alkaline or other non-acid electrolytes. Secondary lithium cells and batteries for portable applications. Part 3: Prismatic and cylindrical lithium secondary cells, and batteries made from them*.
- North American Electric Reliability Corporation, *GADS Solar Data Reporting Instructions*, 2026 edition. Reporting is mandatory for NERC-registered generator owners at 20 MW of inverter capacity and above with commercial operation from 2010; smaller plants may report voluntarily.
- SolarPower Europe, *Operation and Maintenance Best Practice Guidelines*, Version 6.0, February 2025; and the Sub-Saharan Africa edition, March 2021.
