Measured, not asserted

Does obfuscation break net metering credits?

A solar customer moves energy in both directions. The meter records the same kilowatt-hours whichever way they went -- and what a renamed name can take away is not the energy, but the record of which way it was going.

Two directions, one meter

Energy drawn from the grid is bought at the retail rate. Energy pushed back is credited, usually at a much lower avoided-cost rate. How the two are set against each other is the scheme: netting them across a month at the retail rate is worth far more to the customer than crediting each exported unit separately.

The sample settles a summer month on a well-sized roof -- 720 kWh imported, 540 kWh exported -- under a filed monthly-netting scheme, against a library whose default is instantaneous settlement. It also settles a winter month on the same roof, where there is barely any export at all.

Protection alone changed nothing across all five presets, in this area and the four others measured this pass.

Losing the scheme moved money between two parties

Renaming netMeteringMethod replaced monthly netting with the vendor's instantaneous default. Under the filed scheme the customer's 540 exported units cancel 540 imported ones at retail, leaving 180 units to pay for: $33.12. Under the default, the 720 imported units are bought at retail and the 540 exported ones are credited at four cents, which comes to $110.88.

The meter data is identical in both. The same 1,260 kilowatt-hours crossed the meter in the same intervals in the same directions. What changed is how much of the export was allowed to cancel an import, and that difference -- $77.76 on one month on one house -- is money that moved from the customer to the utility. Nothing was created or destroyed, so nothing that counts energy can see it.

The winter month is the reason this is hard to catch. With almost no export, the two schemes land within three dollars of each other: $187.68 against $190.56. An account reviewed in January reconciles under either scheme, and looks entirely healthy.

Losing the direction was worse

Each interval record carries a direction. Renaming direction is the record-field case, and a direction the engine cannot read is not an error -- energy that registered on a meter has to be one of two things, and the overwhelming majority of meters are import meters, so that is what the engine assumed.

The result: import 1260 kWh, export 0 kWh -- customer owes $231.84. The household's own generation was billed back to it at the price of electricity it never bought. Its bill went from $33.12 to $231.84, and the winter month moved too, from $187.68 to $195.04.

This is the pattern this series has measured repeatedly and it is the one worth internalising. A missing option key is replaced by a vendor default. A missing record field is not replaced by anything -- it is simply data the engine has never seen, and engines are built to keep going when they meet unfamiliar data, because in production they constantly do. A missing direction becomes the common direction; a missing category becomes the fallback bucket; a missing key creates a new one.

What failed closed

The money and the quantity both failed loudly, as they have in every area measured this pass. Renaming kwh or importRateUsd made the charge unreadable and the engine refused before billing: SETTLED=false non-finite-charge(refused before billing). That is total loss of function, noticed immediately, rolled back the same hour.

Two arms were pinned equal to the library's own defaults on purpose, as controls, and both were completely inert -- the export rate and the currency. That prediction has now held on nineteen consecutive passes, and it is a useful audit shortcut: the option keys that carry a non-default value are the ones a rename can hurt, and that list is usually much shorter than the config.

The scheme rule's return shape behaved the same way as the option it carries. Renaming the field the settlement method arrives in dropped the engine back to instantaneous settlement and the $110.88 bill, with the configuration screen still reporting the filed scheme.

What to check

Reconcile directions, not just units. Export volume as a proportion of generation is a number every solar account has a history for, and an account whose export suddenly reads zero while its consumption rises by the same amount is describing an impossible physical event. That check is cheap and it is specific to exactly this failure.

Treat an unrecognised direction, category or scheme as an error rather than as the common case. Refusing to settle a record whose direction is not one of the two you accept costs a line of code and converts a silent redistribution into a loud refusal -- and it protects against a dropped key over a serialisation hop just as much as against a rename.

Then scope the rename pattern. Keep out the option keys an installed settlement library reads and the field names on the records you hand it, and member renaming stops being able to reach any of this.

Frequently asked questions

Does obfuscation change a solar customer's bill?

Not on its own. Protection alone left every measured output identical across five presets and five areas this pass. The changes described here come from member renaming, an opt-in option driven by a pattern you write.

What did losing the settlement scheme cost?

Monthly netting was replaced by the library's instantaneous default. A summer bill went from $33.12 to $110.88 on identical meter data -- the same 1,260 kilowatt-hours in the same intervals in the same directions.

What happened when the direction field was renamed?

The engine treated every interval as an import, because energy on a meter has to be one of two things and imports are the common case. The customer's own generation was billed back to them and the bill went from $33.12 to $231.84.

Why is a missing record field worse than a missing option key?

A missing option key is replaced by the vendor's default, which is at least a defined value. A missing record field is just unfamiliar data, and engines are built to keep going when they meet unfamiliar data, so it silently becomes the fallback.

Would a monthly reconciliation catch this?

Not one based on units. The same total crossed the meter in every arm. A winter month with almost no export settled within three dollars under either scheme, so an account reviewed off-season looks entirely healthy.

Did anything fail loudly?

Yes. Renaming the quantity or the import rate made the charge unreadable and the engine refused to settle at all. Losing a value fails closed; losing what the value means fails open. That contrast held in all five areas measured this pass.

What is the specific mitigation here?

Reconcile export volume against generation history per account, and treat an unrecognised direction as an error rather than as the common case. Then keep the option keys and record fields an installed library reads outside your rename pattern.

Related reading