1. Wheeling, and why this platform exists
1.1 The problem
For most of a century, South African electricity was one conversation: Eskom generated, Eskom transmitted, your municipality or Eskom itself delivered, and you paid the tariff. That world is gone. Load-shedding made energy security a board-level issue; corporate net-zero commitments made green energy a procurement requirement; and regulatory reform — licensing-threshold changes, the rise of licensed traders, and the South African Wholesale Electricity Market (SAWEM) — made private supply legal and practical at scale.
So today an IPP can build a solar plant in the Northern Cape and sell its output to a factory in Gauteng. The electrons do not drive up the N1: physics sends them to the nearest load. What actually happens is wheeling — the plant injects metered energy into the shared grid at one point, the factory draws metered energy at another, and a stack of contracts turns the two meter readings into deliveries, credits and invoices.
That contractual stack is the hard part. Someone must own the losses between the two meters, pay for the wires, credit the factory’s utility bill for energy it bought privately, keep the trader in the middle whole, and prove — interval by interval — that nobody sold the same kilowatt-hour twice. This platform exists to run that whole stack in one place.
1.2 What wheeling actually is
Three things happen at once in every wheeling deal:
- Physical delivery — the generator injects into the grid at its connection voltage; the buyer draws at its own. Both are metered in 20-minute intervals.
- Loss adjustment — energy shrinks between the two meters. Transmission losses are scaled by a TLF; distribution losses by a DLF. Sell on sent, buy on delivered — the factors decide how much arrives.
- Network charges — the wires are rented, not free. Use-of-System charges (TUoS, DUoS, ETUoS) apply depending on which networks the path crosses.
Which charges apply is a topology question — where the seller and buyer connect:
| Path (seller → buyer) | Losses | Network charges | The gist |
|---|---|---|---|
| Eskom Tx → Eskom Tx | TLF | TUoS | Transmission only |
| Eskom Tx → Eskom Dx | TLF + DLF | DUoS | Classic wheeling |
| Eskom Dx → Eskom Dx | DLF | DUoS | Local, often no Tx leg |
| Eskom grid → municipal Dx | DLF or Included in Tariff | ETUoS | The hybrid: the municipality is the last mile |
Note. The full applicability matrix — every deal shape, every connection combination, with the buyer as the paying party throughout — is settlement’s job and is taught in V8 · Settlement. The reference rules live in the platform’s Eskom tables, maintained in the Eskom app.
The cast in one sentence each: Eskom owns the national grid and the reference tariffs; a municipality owns the last mile for customers on its network and must be wheeling-enabled to participate; NERSA licenses everyone; the Market Operator runs the wholesale auctions; the System Operator keeps the lights physically on; and the commercial players — IPPs, off-takers, traders — do the dealing.
1.3 What the platform does
Webill Green runs the full commercial lifecycle of wheeled energy for every party at once:
- Standing data — organizations, sites, meters, tariffs, reference tables; the facts everything else consumes.
- Deals — proposals negotiated into signed, active PPAs, physical and virtual.
- Strategy — portfolio planning, forecasting, nominations, battery dispatch and risk for traders, IPPs and off-takers.
- Market — SAWEM participation as a BRP: day-ahead bidding, imbalance, reconciliation.
- Settlement — the closed period turned into a zero-sum ledger and per-party statements.
Each of those is a volume of this manual. The platform also runs four more commercial rooms that sit beside that spine, not on it:
- Virtual Wheeling — Eskom’s registered VW account: many generators and many meters under one holder, one consolidated refund (§5 · V17).
- Regional trading (SAPP) — cross-border day-ahead and forward physical at the Southern African Power Pool (§9 · V18).
- Carbon — RECs and credits, a trading venue, and carbon-tax compliance for emitters (§10 · V19 · V20).
- Weather — per-site forecast, committed position and nowcast, pulled before the day-ahead bid (§11).
The next chapter shows who logs in where; chapter 4 walks the spine end to end; chapter 6 lists every clock run.
2. The cast, the seats, and the five apps
2.1 One platform, five front doors
Everyone in chapter 1’s market map signs into the same platform, but
each actor gets an app shaped for its job. The landing page at
/ is an app chooser — five cards, one per app:
| App | Who | Where | What happens there |
|---|---|---|---|
| Organization | IPPs, off-takers, traders — the commercial players | /org |
Directories, deals, strategy, BRP market seat, settlement views |
| Eskom | The Eskom analyst | /eskom |
Tariffs, charges, rates, loss factors — the reference data everyone else consumes |
| Utility | A municipality’s officer | /munix |
Municipal configuration, wheeling participation, municipal tariffs |
| Market Operator | SAWEM’s MO | /mo |
Market rules, BRP registrations, the day’s bid board, notices |
| System Operator | The grid’s SO | /so |
Dispatch and curtailment instructions, acknowledgements |
A seat is a login persona in one of those contexts. One person can hold several seats; the platform keeps each app’s view scoped to its context — an organization user sees only their organization’s sites, deals and books.
2.2 Signing in
From the app chooser, each card resolves its login differently:
- Organization — pick your organization from the dropdown; the card resolves its registered user and asks for the password.
- Utility — type your municipality’s name; the search is fuzzy, so “tshwane” finds City of Tshwane. The seat is the municipality itself.
- Eskom / Market Operator / System Operator — fixed
single seats (
eskom@webill.net,mo@webill.net,so@webill.net).
Signing in stores your context in the session — organization users
carry their organization_id, municipal users their
municipality — and every screen you open re-checks that context. Log out
(or Switch application in the app header) to change seats.
Careful. A
viewerrole on a session makes edit-controls read-only where a screen supports it — today that gates publishing changes to an IPP’s allocation hierarchy. Everything else follows the seat’s context.
2.3 The demo seats — follow along in this manual
Every follow-along in this manual runs against the deterministic demo
dataset (the consolidated
setup; how to build it is in V21 · Operations
§4). The seats below are seeded by it; every demo password
is supersecret — development and demo environments
only, never production.
| Seat | Login | The story it carries |
|---|---|---|
| Trader 1 | trader_1@webill.net |
The rich trader story: strategy book, pools, nominations, BRP seat |
| IPP 2 | ipp_2@webill.net |
The rich generation story: strategy, BESS, contracts, settlement |
| Off-taker C | offtaker_c@webill.net |
The rich buy-side story: procurement, contracts, settlement, billing |
| IPP 1 · IPP 3 | ipp_1@ · ipp_3@webill.net |
Onboarding-thin seat · municipal/cross-network topology |
| Off-taker A · B | offtaker_a@ · offtaker_b@webill.net |
Thin/search counterparty · alternate topology and state gallery |
| Trader 2 · 3 | trader_2@ · trader_3@webill.net |
Counterparty/chain story · thin/state gallery |
| Eskom | eskom@webill.net |
Tariff, rate and loss-factor console |
| Market Operator | mo@webill.net |
Market Desk |
| System Operator | so@webill.net |
Dispatch Desk |
| Municipality | municipality name@webill.net |
Municipal console for that municipality |
Follow along. Seat: any — start at
/. Path: open the app chooser and hover each card. You should see: five cards; the Organization card offers a dropdown of seeded organizations, the Utility card a search box.
2.4 Finding your way in the Organization app
The org app is where most of this manual happens. Its fixed left sidebar is grouped the way the business works — Configuration pinned, then module rows WHEELING · TRADING · CARBON · MONEY, with live counts on the busy rooms:
- Configuration — your organization’s profile and accreditations.
- WHEELING — OffTaker Sites · IPP Sites · Trader Pools · Trading Pools · Trading Units · Deals (Proposals · Negotiations · Contracts · Disputes) · Virtual Wheeling. Opening a site or pool exposes its Strategy tab bar (Overview, Pools, Runs, Simulations, Nominations, BESS, Dashboard). An IPP dashboard carries the weather panel (§11).
- TRADING — BRP / Market (SAWEM seat) · Bid Desk · Market Month · Accounts. Cross-border pool trading is not a sidebar room in this release (§9).
- CARBON — Certificates
(
/org/certificates) · Market (/org/carbon-market) · Tax (/org/carbon-tax) — §10. - MONEY — Settlement views · Billing · Accounts.
Trading Pools lists every strategy pool under the organisation’s books. Trading Units lists every registered unit (TUID, class, zone with the same colour swatch as the SO/MO zone register, MCR, status, and the generator or off-taker Site — or Pool and the trader pool name when you are on a Trader organisation). Filter the directory by Zone and Class on OffTaker, IPP and Trader seats. A registered BRP cell on OffTaker Sites, IPP Sites or Trader Pools opens Trading Units.
The sidebar collapses to icons; the header carries the organization badge, a theme toggle (system / light / dark), Switch application and Log out. The Eskom and Utility apps use the same shell with their own menus; the MO and SO consoles are single-screen desks with their own chrome.
Where this is taught. Each sidebar destination has its own chapter: directories and configuration in V2 · Entities & Setup, the deal screens in V7 · The Deal Room, strategy areas in V3 · Strategy and V4 · IPP, the market seat in V9 · Market Operations, organisation rooms in V10, Virtual Wheeling in V17, SAPP in V18, carbon in V19 · V20.
3. The object model, in plain language
Everything the platform does is built from a small set of objects. This chapter names them in plain words — no fields, no schemas — so that every later screen reads as “ah, a list of those”. Skim it once now; come back when a term surprises you.
3.1 Standing data — the facts
An organization owns three kinds of market-facing entity: off-taker sites (the buy side), generator sites (the sell side) and trader pools (the commercial layer — note: no meter of its own). Sites carry a meter; meters produce readings; consecutive readings become 20-minute intervals — the atom every settlement, forecast and strategy computation is built from. Intervals roll up into daily and monthly series — what charts and reports read. Tariffs and Eskom’s effective-dated loss-factor and UoS tables are the reference prices of the physical world.
The meter ladder is four resolutions of the same energy. Here is two hours of OffTaker C Midrand DC, then the day and month those hours sit in.
Data. full_demo · seed 42 · OffTaker C Midrand DC · meter
MTR-OTS-thin_offtaker_c_private· stage S05 (meter history) · Thursday 2026-06-12 · sealed 2026-07-15.
| Time (SAST) | Cumulative register (kWh) | Interval Δ (kWh) | TOU |
|---|---|---|---|
| 10:00 | 48,120,000.0 | — | — |
| 10:20 | 48,120,540.0 | 540 | Standard |
| 10:40 | 48,121,060.0 | 520 | Standard |
| 11:00 | 48,121,620.0 | 560 | Standard |
| 11:20 | 48,122,140.0 | 520 | Standard |
| 11:40 | 48,122,700.0 | 560 | Standard |
| 12:00 | 48,123,260.0 | 560 | Standard |
Arithmetic for the first slot:
48,120,540.0 − 48,120,000.0 = 540 kWh. The six intervals
sum to 3,260 kWh for 10:00–12:00. That Thursday’s 72
intervals total 38,900 kWh (peak 6,850 + standard
16,020 + off-peak 16,030). June 2026 rolls up to 1,168,000
kWh (peak 205,333 + standard 481,600 + off-peak 481,067 — Σ ✓),
the same month total the consumption explorer shows in V2 §7.2.
Readings — cumulative register
Read it: each dot is one reading — a cumulative register snapshot. The step rises only when a new read lands; energy is the vertical climb between dots.
Intervals — 20-minute energy
Read it: each bar is this reading minus the previous one. Settlement, forecasts and strategy consume these atoms — never the cumulative counters.
Daily series — one week of TOU stacks
Read it: each stack is one day’s intervals, split Peak / Standard / Off-peak. Thursday (highlighted) is the day that owns the 10:00–12:00 window above.
Monthly series — H1 2026
Read it: June’s bar is the month total from V2 §7.2 — peak + standard + off-peak. Charts and reports read this series; settlement still prices the intervals underneath.
Where this is taught. The full pipeline (register deltas, late reads, TOU split, consumption explorer drill-down): V2 §7.
3.2 Deal objects — from handshake to contract
A proposal is the pre-contract handshake; accepting one creates a draft PPA — physical or virtual (chapter 5) — whose terms both parties complete in a negotiation wizard. Signing is content-hashed so what you signed is provably what was agreed; an active contract’s terms then drive everything downstream.
Every PPA sits in one cell of a small matrix: who sells to whom (deal type) × physical or virtual. The four deal types are the contract topologies — the same seller→buyer shapes whether energy wheels or only money moves.
| Deal type | Seller | Buyer | Physical gist | Virtual gist |
|---|---|---|---|---|
IPP → Off-taker (OFFTAKER_IPP) |
Generator site | Off-taker site | Classic wheeling — plant to factory | Direct CfD hedge on the buyer’s grid bill |
IPP → Trader (TRADER_IPP) |
Generator site | Trader pool | Trader buys the plant into its book | Wholesale CfD; trader carries price risk |
Trader → Off-taker
(OFFTAKER_TRADER) |
Trader pool | Off-taker site | Portfolio supply to a consumer | Retail CfD (often with WER in the reference) |
Trader → Trader (TRADER_TRADER) |
Trader pool | Trader pool | Mid-chain portfolio deal | Mid-chain financial hedge |
What changes by topology is not the deal chain — it is meters, wizard steps, and who picks the shape of the promise:
| Deal type | Generation meter | Consumption meter | Extra negotiation steps | Who chooses contract type |
|---|---|---|---|---|
OFFTAKER_IPP |
From generator site | From off-taker site | — | Buyer (off-taker); seller only states what is feasible |
TRADER_IPP |
From generator site | None (buyer is meterless) | Trader buyer terms (margin, balancing, imbalance) | Buyer (trader) |
OFFTAKER_TRADER |
None (seller is meterless) | From off-taker site | Trader seller terms (source guarantee, replacement energy, credit support) | Buyer (off-taker); seller aligns upstream IPP contracts |
TRADER_TRADER |
None | None | Both trader-buyer and trader-seller terms | Buyer-trader; seller-trader matches or hedges from its IPP book |
On physical deals, wheeling charges and the buyer’s distribution loss
factor apply whenever there is a consumption path — they are not
applicable on TRADER_TRADER (no site meters on
either side). Seller and buyer still jointly negotiate capacity, tariff,
curtailment, spill, shortfall, RECs and settlement frequency; “seller”
means the IPP on IPP deals and the selling trader on trader deals, and
likewise for “buyer”.
Virtual deals use the same four topologies. Differences that matter at orientation depth:
- The strike is set by the two contracting parties — Eskom never sets it.
- When an off-taker is a party, that off-taker chooses the VWP vendor (they own the Eskom POD and billing relationship); traders and IPPs accept that choice.
- Off-taker virtual deals typically need VWA registration and smart metering at the buyer’s POD; IPPs still need grid connection and generation licensing; traders need a trading licence.
- One generation source must not sell the same MWh twice — physical wheeled attribution and virtual claim on the same interval cannot both consume it (V8).
In the demo cast: IPP2 Atlantis Wind → OffTaker C Midrand DC
is a direct OFFTAKER_IPP physical; the chain IPP3
Midrand Hybrid → T1 Renewables Pool → OffTaker A Rosebank Mall is
TRADER_IPP then OFFTAKER_TRADER; T1 → T2
Flex Pool is TRADER_TRADER.
Where this is taught. Physical vs virtual mechanics: §5. Wizard steps, term ownership and the full party-assignment matrices: V7 · Deal types. How each cell settles: V8 · Settlement.
3.3 Money objects — settlement’s output
Every closed period per active contract becomes a settlement period holding line items — a double-entry ledger where every rand paid is a rand received. Per-party statements are filtered views of that one ledger. Nominations supply declared volumes when a seat is meterless or a reading is late. Banking, adjustments, and the shared-meter machinery (allocation sets, claim sets) keep multi-party reality honest.
Here is how those objects look with numbers — first a simple ledger and statement, then nominations, banking, adjustments and a shared meter.
Data. full_demo · seed 42 · stage S09 (settlement matrix) · physical
PPPA-202607-138209764(IPP2 Atlantis Wind → OffTaker C Midrand DC, FIXED 85 c/kWh) · period 2026-07-09 · DRAFT.
Line items. Match delivers about 36,597
kWh after 6% loss on 38,933.333 kWh matched. Seller energy is
36,597.333 × R 0.85 = R 31,107.73. The ledger records
equal-and-opposite lines — not a single invoice total:
| Party | Category | kWh | Amount |
|---|---|---|---|
| IPP2 Atlantis Wind | energy | 36,597 |
|
| OffTaker C Midrand DC | energy | 36,597 | − R 31,107.73 |
| Σ across all parties (must be zero) | R 0.00 ✓ | ||
Network charges (UoS) add their own payer and Eskom/municipality lines; those pairs also net to zero. A party’s net need not be zero — only the whole period must.
Statement. A statement is the same ledger filtered for one seat — not a second calculation. IPP2 sees a receivable; OffTaker C sees a payable; both amounts come from the shared rows above.
| Fact | IPP2 Atlantis Wind statement | OffTaker C Midrand DC statement |
|---|---|---|
| Period | 9 Jul 2026 · DRAFT | 9 Jul 2026 · DRAFT |
| Delivered energy | 36,597 kWh (counterparty volume) | 36,597 kWh purchased |
| Energy line | + R 31,107.73 receivable |
− R 31,107.73 payable |
| Buyer’s retail tariff | not shown | not treated as seller revenue |
| Content hash | on the audit strip | on the audit strip |
Follow along. Seat: IPP2 Atlantis Wind. Path: Contracts →
PPPA-202607-138209764→ Settlements → 9 Jul 2026 → Ledger / open statement. You should see the signed energy lines and the audit-strip hash.
Nominations. A usable meter always wins. When the
grid-facing seat is meterless (typical buying trader on
TRADER_IPP / TRADER_TRADER) — or its reading
is late — settlement Resolve takes the submitted nomination instead: a
declared hour-by-hour volume that expands into 20-minute rows and binds
at Match. Strategy authors the plan; settlement only consumes what was
submitted.
Same thread period, first run vs after the off-taker meter lands:
| Input | First run (PRELIMINARY) | Re-settlement |
|---|---|---|
IPP2 meter MTR-NERSA-GEN-1002 |
41,418.44 kWh | 41,418.44 kWh |
| Nominated demand (day) | 38,000.000 kWh | reference only |
OffTaker C meter MTR-OTS-thin_offtaker_c_private |
missing | 38,933.333 kWh |
| Loss factor | 6% | 6% |
| Matched | min(41,418.44, 38,000) = 38,000 |
min(41,418.44, 38,933.333) = 38,933.333 |
| Delivered | 35,720 kWh | 36,597 kWh (as in the ledger above) |
The first result is not a wrong meter — it is a nominated demand while the real series is late. When the meter arrives, Resolve substitutes the higher-priority source; the prior period is REVERSED and a new version is calculated. Nominations never invent energy; they declare the volume the desk commits until the meter (or a contracted profile) can speak.
A usable meter outranks the desk’s nomination. The rail records its source so the statement and audit strip can explain the result.
Banking. When spill is banked under the PPA’s terms, surplus kWh become credits drawn oldest-first (FIFO) in later periods — within the deal’s cap, period and inter-TOU rules:
| Period | Bank in | Accrue (spill) | Draw | Bank out | What happened |
|---|---|---|---|---|---|
| M1 | 0 | +12,000 | 0 | 12,000 | first surplus banked |
| M2 | 12,000 | +3,000 | −8,000 | 7,000 | draw consumes M1 first |
| M3 | 7,000 | 0 | −7,000 | 0 | balance cleared |
A bank accrual in M1 and a bank draw in M2 each appear as their own ledger categories on those periods — M1 is never silently rewritten.
Adjustments. Residues after Match become priced lines, not edits to energy:
| Residue | Typical line categories |
|---|---|
| Spill (supply left after match) | forfeit · Eskom buyback · spill credit · or bank (above) |
| Shortfall (firm shape missed) | liquidated damages / replacement / penalty — net of excused windows |
| Cross-period correction | a separate adjustment record so a closed period is never silently edited |
Example shape on a later month that draws the bank: the buyer still sees an energy payable for newly matched kWh, plus a bank draw credit that reduces what they owe for the drawn volume — while the seller’s statement shows the matching bank-draw disposition. Spill that was forfeited never becomes a receivable.
Shared-meter machinery. One generation meter can
feed several PPAs. An allocation set carves
the meter before Match so each contract only sees its share
(Σ shares = metered):
Conservation: 56,000 + 28,000 = 84,000 ✓. Each PPA then
builds its own line items and statements from its share
only. A claim
set does the same job across physical and virtual claims on
one generator: physical_claim + virtual_claim ≤ generation
every interval — so the same MWh is never sold twice.
Where this is taught. How Resolve picks meter vs nomination: V8 §3. How strategy authors and submits nomination plans: V3 §9. Shared meters and claim sets: V8 §5. Pricing, spill, shortfall and banking: V8 §7. Ledger Σ = 0 and statements: V8 §8 · V8 §9. Full worked months: V8 §13 · V8 §14.
3.4 Strategy objects — the planning layer
The strategy layer plans; it moves no money. A book exists per trader pool, off-taker site and generator site; its pools, allocation runs, nomination plans, BESS schedules and risk snapshots are the whole of V3 · Strategy.
Pools are how you tell the engine what the book is. Each pool is one side — supply (sources) or demand (sinks) — with a priority and members. A PPA, site, counterparty pool or battery that is not a member of any ACTIVE pool does not exist for allocation. Members are placed on the two-column board; the engine then, hour by hour, allocates available energy (forecast, metered shape, or a submitted nomination) from supply pools into demand pools.
Lower pool priority numbers go first. Within a supply pool, cheaper buy price wins, then member priority. Firm demand (Trader Sales) is served out of turn from the Firm supply pool before any open demand walks the merit stack. Nominated members do not invent energy: for that hour their available supply is the submitted nomination (three 20-minute rows per nominated hour); forecast-backed members use the hour’s P50/P90 series instead.
One hour, ignoring network losses for clarity — supply and demand already placed as above:
| Side | Member (pool) | Available / required |
|---|---|---|
| Supply | Solar A (Solar · P10) | 6 MWh @ 65 c |
| Supply | Solar B (Solar · P10) | 4 MWh @ 70 c |
| Supply | Wind (Wind · P20) | 5 MWh |
| Supply | Flexible nominated block (Flexible · P30) | 0 MWh this hour (overnight nomination) |
| Supply | Firm / BESS remainder (Firm · P40) | 4 MWh |
| Demand | Trader Sales · firm | 3 MWh |
| Demand | Industrial · open | 8 MWh |
| Demand | Commercial · open | 5 MWh |
| Demand | Municipal · open | 5 MWh |
Walk the same hour in words: (1) firm Trader Sales takes 3 MWh from Firm, leaving 1 MWh; (2) Industrial takes Solar A 6 + Solar B 2; (3) Commercial takes Solar B’s remaining 2 + Wind 3; (4) Municipal takes Wind 2 + Firm remainder 1, and is left with a 2 MWh shortfall. Flexible’s nominated block was 0 this hour, so it never entered the merit stack — at 19:00 the same member might contribute 7.5 MWh from its SUBMITTED plan and appear in the stack at P30. Equal-priority demand members share pro rata by weight; spill from Solar / Wind can be routed to Flexible for tracking (still unsold until nominated, sold or stored).
Where this is taught. Building pools and placing members: V3 §4. The allocation walk and pricing of each flow: V3 §6. Authoring the nominations that feed Flexible (and other nominated members): V3 §9.
3.5 Market and IPP-programme objects
The market objects belong to the organization’s single BRP registration and are taught in V9 · Market Operations. The IPP’s Global Allocation Hierarchy, monthly forecast and HAF are the whole of V4 · IPP.
3.6 Carbon, SAPP and weather objects
Three more object families sit beside the spine. Orientation depth only — fields and screens live in their volumes.
Note. Nothing in this chapter is exhaustive — each object’s fields, states and screens live in its owning volume. If a term here is new, its glossary entry links to the full treatment.
4. The lifecycle spine — one kWh, end to end
Every volume of this manual is one stretch of the same road. This chapter walks it once, quickly, so you always know where you are. The strip below reappears at the top of every volume with its own stop lit.
1 · Setup (V2) — an organization stands up its facts: profile and accreditations, sites with meters, tariffs in reach. From the moment a meter is assigned, readings flow and become the 20-minute intervals everything downstream consumes. Nothing else works until this does — which is why it is the entities volume.
2 · Deal (V7 · The Deal Room) — a counterparty found in market search receives a proposal; acceptance opens the negotiation wizard; completed terms get signed; on its start date the contract goes ACTIVE — from then on it is a standing instruction to the settlement engine.
3 · Strategy (V3 · Strategy) — each party’s book forecasts and allocates its portfolio nightly: where energy will flow, what margin it earns, what is at risk. For an IPP, the programme in V4 adds the published hierarchy, the monthly forecast and HAF — the guard-rails on what it may still sell.
4 · Nominate (V3 §9) — flexible members commit hour-by-hour volumes for next month. A submitted nomination is binding: settlement will read it where a meter cannot speak (a trader has no meter), and imbalance will judge it.
5 · Market day (V9) — the organization’s BRP seat bids the book’s net position into the day-ahead auction before gate closure, corrects hours intraday, absorbs the System Operator’s instructions, and accrues imbalance where actuals deviate from schedule.
6 · Settle (V8) — when the period closes, the pipeline resolves what each meter (or nomination) says, matches supply to demand, applies losses and network charges, prices the contract’s terms, adjusts for spill, shortfall, curtailment and banking — and writes a ledger whose line items sum to zero.
7 · Statement (V8) — each party receives its immutable, versioned statement: the same ledger, filtered to what they owe and are owed. Trader chains reconcile; disputes reopen a period deliberately, never silently.
The thread. From V2 onward, the manual follows one seeded cast — an IPP, a trader and an off-taker from the demo dataset — down this exact road: set up in V2, contracted in V5, planned in V3/V4, taken to market in V7, settled in V6. Each volume’s flagship worked example is the next chapter of that story. Beside the spine: Virtual Wheeling (V17), SAPP (V18), carbon (V19 · V20), weather (§11). The clock underneath is V1.
Careful. The spine is a reading map, not a strict sequence in the product: strategy runs nightly whether or not you are dealing, the market day loops daily, and settlement re-runs when late data arrives. Chapter 6 previews the clock; V1 · The Four Rhythms walks each rhythm end to end.
5. Physical vs virtual — the two kinds of deal
Every PPA on the platform answers the same two buyer questions — what will my energy cost? and can I claim it’s green? — but there are two fundamentally different ways to answer, and the platform runs both.
5.1 Physical: the energy actually moves
In a physical PPA, the seller’s metered injection is contractually delivered to the buyer, as chapter 1 described: losses scale it, network charges price the path, and the buyer’s utility bill shrinks because wheeled energy displaces utility purchases.
The signature of physical settlement: a per-interval delivered profile. Settlement matches metered supply to metered demand every 20 minutes, which is why losses, TOU periods, curtailment and banking all have somewhere precise to act.
5.2 Virtual: only the money moves
Eskom Virtual Wheeling (and the platform’s virtual PPA that sits on it) is a financial mechanism. The off-taker keeps buying grid electricity at its meter exactly as before. There is no physical delivery obligation to a specific POD, no loss factor on the hedge leg, and IPP generation is not used in the settlement arithmetic. What settles is a price hedge: a CfD against Eskom’s virtual wheeling credit, locked to an agreed strike.
Core components
| Component | What it is | Notes |
|---|---|---|
| Strike price | Fixed VPPA price (R/kWh or c/kWh) the parties agreed | Flat (not TOU). Independent of the IPP’s generation profile. |
| Eskom virtual wheeling credit rate | Rate at which Eskom refunds qualifying consumption — the WER | From WEPS / local / non-local tariff positions. Applied to consumption, not generation. |
| Consumption (kWh) | Verified TOU consumption on Eskom or municipal meters | Must cover the contracted VPPA volume to claim the full credit. |
| CfD settlement | Cash between seller (trader or IPP) and off-taker | Makes the off-taker’s effective cost equal the strike. |
CfD = (Strike price − Eskom credit rate) × Consumption
- Strike above credit → off-taker pays the seller the difference.
- Strike below credit → seller pays the off-taker the difference.
Without the CfD, the off-taker’s cost would float with Eskom’s credit rate. The CfD locks a bankable renewable price, which is why VPPAs can support IPP financing and off-taker ESG commitments.
Worked example — realistic Eskom numbers
| Item | Value |
|---|---|
| Strike price | R 1.05 / kWh (105 c/kWh) |
| Eskom virtual wheeling credit rate | R 0.72 / kWh (72 c/kWh) |
| Off-taker consumption (qualifying) | 250,000 kWh |
| IPP generation | not used |
Step through the cash:
- Eskom credit —
0.72 × 250,000 =R 180,000 refunded on the off-taker’s bill. Eskom does not allocate energy volumes and does not match generation to consumption. - CfD —
(1.05 − 0.72) × 250,000 = 0.33 × 250,000 =R 82,500. Strike is above the credit, so the off-taker pays the trader/IPP. - Effective cost — credit + CfD =
180,000 + 82,500 =R 262,500 =1.05 × 250,000= strike × consumption. Per kWh:0.72 + 0.33 = 1.05.
What each party experiences:
| Party | What happens |
|---|---|
| Eskom | Refunds R 180,000. Does not reassign MWh between meters. |
| Trader / IPP (seller) | Invoices R 82,500 CfD. |
| Off-taker | Bill reduced by the credit; pays the CfD; final cost on the hedged volume = strike. |
The direction flips when the credit sits above the strike — same formula, seller pays the off-taker:
| Component | Role |
|---|---|
| Strike price | Off-taker’s agreed renewable energy price |
| Eskom credit rate (WER) | Refund applied to consumption |
| CfD | Financial difference that locks the off-taker on the strike |
| IPP generation | Not used in this settlement — pure financial product |
Platform variants differ in the reference and volume behind the CfD (wholesale price, wheeled-energy value with or without WER, or a nomination-based volume). Eskom Virtual Wheeling with WER-netting is the shape above; V8 §14 walks a seeded demo day on the same logic with TOU-split rates.
5.3 Choosing, and where each is taught
| Physical | Virtual | |
|---|---|---|
| Energy delivery | Real — metered, lossy, per interval | None — buyer stays on grid supply |
| Needs a wheeling path | Yes (topology, losses, UoS) | No |
| Settlement output | Delivered profile + ledger | CfD + WER cashflows + ledger |
| The buyer’s risk | Volume & shape (did it generate when I consume?) | Credit-rate / reference behaviour |
| Green claim | Delivered energy | Certificates per the contract’s REC terms |
| Generation in the formula | Matched every interval | Not used — consumption (and strike/credit) drive cash |
Both kinds come in the same four deal types introduced in §3.2 — IPP→Off-taker, IPP→Trader, Trader→Off-taker, Trader→Trader — eight cells in all, and both end in the same settlement machinery and the same zero-sum ledger.
Where this is taught. Deal construction, terms and wizards: V7 · The Deal Room. Settlement mechanics for both kinds, including the CfD variants and the no-double-sell guarantee when one generator carries physical and virtual claims at once: V8 · Settlement · V8 §14. Eskom’s registered VW account (many generators, many meters, one 45-day refund): V17 · Virtual Wheeling.
6. The clock — what runs while you sleep
Much of the platform’s work happens without anyone signing in. Background jobs settle closed periods, re-forecast every book, pull weather, build and submit market bids, poll the System Operator, accrue certificates, and reconcile the Market Operator’s files — on a fixed SAST clock. Knowing the clock explains why screens change overnight and what “it will be there in the morning” actually means.
This chapter is the orientation catalogue: every configured cron run, grouped. Step-by-step process, worked examples and visualizations for the four commercial rhythms live in V1 · The Four Rhythms. Failure modes, queues and retries live in V21 §3.
Times below are the crontab expressions in
config/config.exs, labelled SAST as the
rest of this manual publishes them — 66 cron lines, 37 distinct
workers, plus the four AshOban triggers in §6.4. Gate times for
market workers are still derived from versioned MarketRules (V9
§1) — the cron line is the wake-up, not always the legal gate.
- 00:05 Archive SO instructions · MEC scan
- 01:00 Settle daily-frequency contracts
- 02:00 Weather cycle (hour before DAM)
- 02:30 Nightly re-forecast · 02:45 stochastic VaR
- 03:00 Build & submit day-ahead bids
- 06 / 09 / 12 / 15 Weather nowcast drift
- 06:30 Price yesterday’s imbalance
- 12:00 Fetch schedule · publish MO reports · 12:30 SMP forecast
- every 15 min Poll the System Operator · 04 / 10 / 16 / 22 IDM monitor
6.1 The four rhythms (and the jobs around them)
Four coloured cadences share the same SAST calendar. Weather, carbon, billing and the Market Operator’s own cadence run alongside them — they are on this clock even when they are not one of the four named rhythms.
| Rhythm | Colour | What it does (one line) | Deep dive |
|---|---|---|---|
| Settlement chain | gold | Closed periods → ledger & statements; chain recon on the 1st | V1 §2 |
| Strategy loop | purple | Nightly book re-forecast; 4th backcast; 20th nomination proposals | V1 §3 |
| Market day | blue | D−1 bid → gate → schedule → D+1 imbalance; SO/IDM throughout | V1 §4 |
| IPP programme | teal | 5th monthly FG → hierarchy → AES (what is still safe to sell) | V1 §5 |
Around those four:
| Family | What it adds | Taught in |
|---|---|---|
| Weather | 02:00 day-ahead pull per generator site; 06/09/12/15 nowcast drift | §11 · V3 IPP dashboard |
| Carbon | 1st 04:45 certificate accrual; daily CAD Trust observer / publisher | §10 · V19 |
| Billing & insight | 1st statements → invoices → org billing → facts → planner | V15 · V16 |
| MO cadence | DAM close / rollover / unconstrained / constrained / prices / publish; IDM auctions; metering; balancing; cover | V11 |
| SAPP | Not an Oban job — the Coordination Centre’s 09:30 CAT DAM gate | §9 · V18 |
Two contract triggers run alongside the scheduled jobs: daily activation of SIGNED physical PPAs on start date; hourly expiry of stale proposals. Interlock and the master timetable: V1 §6–7.
6.2 Frequent and daily runs
| When (SAST) | Worker | What it does |
|---|---|---|
| every 15 min | PollSo |
Ingest SO dispatch, curtailment and outage instructions |
| 04:00 · 10:00 · 16:00 · 22:00 | IdmMonitor |
Intraday drift against the five Code gates |
| 00:05 | ArchiveSoInstructions |
Archive completed SO windows; history stays searchable |
| 00:05 | MecBreachScan |
Prior-day generator meter MEC check |
| 00:15 | DeliveryCadence ingest_metering |
MO metering ingest (empty ingest = miss) |
| 00:30 | DeliveryCadence allocate_metering |
Allocate ingested metering to trading units |
| 01:00 | SettlementRunner DAILY |
Fan-out period settlement for daily-frequency contracts |
| 02:00 | FetchWeatherCycle |
One weather pull per generator site, jittered, 72 h horizon |
| 02:00 | SettlementCadence nightly_reassertion |
MO registry reassertion |
| 02:30 | RunNightly |
Refresh every strategy book; resolve BRP BESS inputs first |
| 02:45 | RunStochastic |
Stochastic VaR after the nightly RiskSnapshot, before DAM |
| 03:00 | SubmitDamBids |
Build and submit day-ahead bids for tomorrow |
| 03:15 | RunFleet |
Aggregate site results into the fleet story and correlated VaR |
| 04:00 | IdmCadence iteration 3 |
MO IDM auction (delivery day) |
| 05:15 | DisputeClock |
Bilateral dispute reminder, then lapse |
| 05:30 | ApplicationClock |
BRP application clock (expire IR, become contractable) |
| 06:00 · 09:00 · 12:00 · 15:00 | FetchWeatherDrift |
Intraday nowcast; feeds IDM decisions |
| 06:30 | ComputeImbalance |
Price yesterday’s actual-versus-scheduled deviations |
| 07:20 | Cadt.SyncRunner |
CAD Trust observer sync — moves no money |
| 07:50 | Cadt.PublishRunner |
CAD Trust publisher (testnet until the mandate) |
| 08:00 | DamCadence close_dam_gate |
Close the MO day-ahead gate |
| 08:01 | DamCadence generate_rolled_over_submissions |
Rollover unmatched into the next session |
| 08:05 | DamCadence clear_unconstrained |
Unconstrained clear (sets the price) |
| 10:00 | IdmCadence iteration 4 |
MO IDM auction |
| 11:35 | DamCadence clear_constrained |
Constrained clear (dispatch basis) |
| 11:50 | DamCadence calculate_prices |
Five prices from the two schedules |
| 12:00 | FetchSchedule |
Pull the accepted DAM schedule after clearing |
| 12:00 | DamCadence publish_schedule_reports |
Publish schedules and prices |
| 12:30 | RefreshPriceForecast |
Trailing-quantile SMP forecast |
| 15:00–15:30 | DeliveryCadence run_balancing offsets 1–7 |
Balancing D+1…D+7; official D+7 gated on verified vintage |
| 16:00 | IdmCadence iteration 1 (D−1) and 5 (D) |
18:00 SAST is both D−1 iter 1 and D iter 5 |
| 22:00 | IdmCadence iteration 2 |
MO IDM auction |
| 22:15 | TrustInterest |
Trust-account interest |
6.3 Weekday, weekly and day-of-month runs
| When (SAST) | Worker | What it does |
|---|---|---|
| Mon–Fri 10:45 | Fx.FetchRates |
Primary reference-rate fetch (08:45 UTC) |
| Mon–Fri 14:00 | Fx.FetchRates |
Retry if today’s primary set is absent (12:00 UTC) |
| Mon–Fri 17:30 | Fx.FetchRates |
Policy fallback when primary absent (15:30 UTC) |
| Mon–Fri 10:00 | SettlementCadence issue_initial_statements |
MO initial statements (BP+5 WD) |
| Mon–Fri 10:05 | SettlementCadence issue_invoices |
MO invoices after initial statements |
| Mon–Fri 15:00 | SettlementCadence issue_indicative_statements |
Indicative statements (not Saturday) |
| Mon–Fri 15:00 | SettlementCadence recalculate_credit_cover |
Recalculate posted vs required cover |
| Mondays 02:00 | SettlementRunner WEEKLY |
Weekly-frequency contracts |
| 1st 02:00 | RefreshSettlementAggregates |
Refresh aggregates before statements |
| 1st 03:00 | SettlementRunner MONTHLY |
Physical monthly settlement |
| 1st 03:30 | SettlementRunner MONTHLY virtual |
Virtual monthly settlement |
| 1st 03:00, every 3rd month | SettlementRunner QUARTERLY |
Quarterly-frequency contracts |
| 1st 04:00 | ChainReconciliationRunner |
Cross-PPA chain check |
| 1st 04:10 | LevyConservationRunner |
Non-bypassable levy coverage (raises on a miss) |
| 1st 04:30 | StatementCadence |
Issue settlement statements |
| 1st 04:45 | CertificateRunner |
Accrue RECs from FINAL settlement |
| 1st 05:00 | Billing.IssuerRunner |
Issue billing documents |
| 1st 05:30 | OrgBillingRunner |
Organisation billing run |
| 1st 06:00 | Insight.FactBuilder |
Insight facts (after invoices exist) |
| 1st 06:00 | SettlementCadence run_timetabled_rerun |
MO timetabled rerun |
| 1st 06:30 | Insight.Planner |
Improvement planner (opted-in orgs) |
| 3rd 07:00 | ReconcileMonth |
Join last month to the MO settlement file |
| 4th 04:00 | RunBackcast |
Strategy backcast of the prior month |
| 5th 04:00 | MonthlyForecastRunner |
One IPP monthly forecast per active IPP |
| 20th 05:00 | ProposeNominations |
Propose next month’s nominated memberships |
| 1 Sep 06:00 | SettlementCadence publish_settlement_calendar |
Next year’s MO settlement calendar |
6.4 Triggers (not cron workers)
| Cadence | Trigger | What it does |
|---|---|---|
| daily 00:00 | PhysicalPpa :activate |
SIGNED → ACTIVE when start_date ≤ today |
| daily 01:00 | PhysicalPpa / VirtualPpa
:suspend_unsigned |
AGREED past the 10-day sign window → SUSPENDED |
| hourly | Proposal :expire_stale |
PENDING past expires_at → EXPIRED |
Where this is taught. Process, data-driven examples and figures: V1 · The Four Rhythms. Ops cards (queues, retries, failure modes): V21 §3. Trader operating cadence on the same clock: V3 §18. Counts: COVERAGE.md Matrix 3 (Oban cron entries / distinct workers).
7. How to read this manual
The manual set follows the same conventions everywhere. Two minutes here saves confusion later.
7.1 Volumes, chapters, bridges
Each volume owns its topics; chapters are numbered and stable, so
V4 §7.2 will always mean the same section. When another
volume owns a mechanism, you’ll meet a one-sentence summary plus a
bridge — a “Where this is taught” callout — rather than
a re-explanation. Nothing is taught twice; if two explanations ever
disagree, one of them is a bug.
At the top of each volume, the lifecycle strip from chapter 4 shows where you are on the road. After the glossary, V0 continues with three rooms beside the spine: §9 SAPP, §10 carbon, §11 weather.
7.2 Callouts
Note. Context, tips and caveats look like this.
Careful. Warnings — things that bite — look like this.
Follow along. Seat: Trader 1 (
trader_1@webill.net, Organization app). Path: Trader Pools → open the pool → Strategy. You should see: the book’s Overview tab with KPI cards.
A follow along names the demo seat to sign in as, the click path, and what you should see. All of them run against the deterministic demo dataset — the consolidated setup — so your screen will match the manual’s numbers exactly.
7.3 Worked examples show their arithmetic
Substantial mechanisms are taught with real numbers: an inputs table,
the computation stepped through in prose
(R1: 60 × 50/100 = 30), a conservation check wherever
anything splits (Σ = 75 + 60 = 135 = G ✓ — energy in equals
energy out; ledgers prove Σ = 0), and the roll-up table
exactly as the screen will show it. Each example opens with a data
stamp:
Data. full_demo · seed 42 · stage S09 (settlement matrix) · last re-derived 2026-07-18.
That stamp is a promise: rebuild the demo dataset and you can reproduce every number in the example.
7.4 Figures
Figures share one visual vocabulary across all volumes: object cards and relationship arrows for models, state pills on a rail for lifecycles, numbered stage strips for pipelines, ledgers with a Σ = 0 proof row, clock dials for schedules, tier bands for network paths, and annotated screen replicas with red numbered callouts. Once you’ve read one of each, every later figure is instant.
7.5 Terms and the glossary
The first use of a term of art in a chapter links to the master glossary on the hub; every glossary entry links back to the section that teaches the concept. If you meet an unlinked term you don’t know, the glossary is still the place to look — and if it’s missing there, that’s a documentation bug worth reporting.
7.6 Icons and badges
The manual names icons and badges exactly as the app renders them — one icon per concept, platform-wide. When a chapter says the amber SIMULATED ribbon or the run-status badge, the words match what’s on screen.
7.7 Honesty rules
The manual documents what is built. Placeholder screens are called placeholders; partial features say what’s missing; every chapter carries a last verified stamp. If the product and the manual disagree, trust the product and report the manual.
8. The glossary
The master glossary — every term of art across all volumes, alphabetical, each entry linking to the section that teaches it — lives on the hub: open the glossary.
It is one list, deliberately: a term means the same thing on every
screen and in every volume, definitions are never forked, and anchors
are permanent, so a link like allocation run will
resolve for as long as this manual exists.
V0 introduced the platform-wide concepts — wheeling, the actors, the object model, physical vs virtual, the clock, SAPP, carbon and weather. The specialist vocabularies live with their volumes: strategy’s in V3, the IPP programme’s in V4, settlement’s in V8, the market’s in V9, Virtual Wheeling in V17, SAPP in V18, carbon in V19 · V20.
V0 continues: §9 SAPP · §10 carbon · §11 weather.
9. Cross-border trading — SAPP
South African wheeling (chapters 1 and 5) is one country, one grid, rand documents. The Southern African Power Pool is the next conversation: a trader can sell or buy across a SAPP interconnector into Namibia, Botswana, Zimbabwe, Mozambique and the rest of the pool. The electrons still follow physics. The contracts, the currency, and the wheeling path (available transfer capability, losses on each corridor) are what this platform has to get right.
The platform is a participant toolkit, not a second market operator. The Coordination Centre in Harare clears the competitive markets, publishes rates and issues the monthly statement. This platform holds a book, submits before the gate, nominates against real transfer capability, and shadows the statement closely enough to argue with it line by line.
9.1 What you actually do
| Piece | The gist |
|---|---|
| Membership | Sponsored (a SAPP member transmits for you) or direct. Demo seed is sponsored and labelled illustrative until a commercial membership exists. |
| Four products | Day-ahead (DAM) at 09:30 CAT, FPM-Monthly, FPM-Weekly, and intraday retrieval. CAT equals SAST (UTC+02, no DST). |
| Currency | Engines still compute in Decimal; documents persist
integer minor units with a denomination. A
dollar-priced pool trade billed in rands is two numbers. Mixed-currency
arithmetic is refused by name. Conversion is an explicit step against a
published FX rate set. |
| Wheeling path | Delivery is smaller than dispatch. Each corridor on the path consumes ATC and applies its loss factor. |
| Monthly statement | A shadow of the CC statement, with variance and an :FX
hint — the same reconciliation vocabulary as domestic settlement, plus
currency. |
| The desk | /org/regional — membership, positions, rates,
nominations, the shadow statement. |
The 09:30 CAT gate is a parameter register row, not
a hardcoded time, and it is not an Oban job. Missing it
raises the same critical gate-miss the domestic DAM cycle raises.
Completing against the in-process simulator is completion: behaviours,
persistence, gate and screens are real; only the transport is simulated
(:sapp_client → WB.Sim.SappSim,
:fx_provider → mock) until membership arms live
adapters.
Follow along. Seat: Trader 1 (
trader_1@webill.net, Organization app). Path: TRADING. You should see Market, Bid Desk, Month and Accounts. Regional is not in that menu for this release.
Where this is taught. The toolkit, when it is in the product: V18 · Regional Trading. It is not an organisation sidebar room in this release. SAPP interconnectors on the network model: V12. Domestic market beside it: V9 · V10.
The participating desk shows regional hydrology from published Kariba storage; dry conditions can be rehearsed as a named shock in the risk fan.
10. Carbon — certificates, credits, tax and trading
Settlement told you how many megawatt-hours the plant produced. Carbon is what those megawatt-hours mean as instruments and as tax. The platform runs three related rooms; they must not be mixed.
| Room | Who | What one unit is | Volume |
|---|---|---|---|
| Certificates | Generator, off-taker, trader | 1 MWh of renewable electricity (REC) | V19 · Carbon |
| Carbon credits | A registered offset project | 1 tCO₂e of verified avoided or removed emissions | V19 |
| Carbon tax | An emitter (may own no meter) | Section-6 liability in rands, offsets surrendered | V20 · Carbon Tax Compliance |
A REC is not a carbon credit. Reporting that a plant avoided tonnes is not the same as holding a tradable offset. The tax room can surrender a COAS-listed credit; it cannot mint one from a REC.
The platform is a mirror, not a registry, and a computer, not SARS. It accrues what should exist from FINAL settlement, records what zaRECs / I-REC / Verra / Gold Standard / COAS actually issued, and refuses a claim that would count the same megawatt-hour twice. It computes the tax pack and exports it. It never holds eFiling credentials and never submits.
10.1 Certificates and the desk
RECs accrue on the 1st at 04:45 (CertificateRunner) from
FINAL settlement — after chain reconciliation, before the billing
issuer. A batch accrued at 04:45 cannot be invoiced at 05:00: a human
must confirm accrual and allocation first. Certificate money rides a
later month’s issuer run.
The Certificate Desk is /org/certificates: accrue,
allocate, bundle, retire, evidence, the emissions statement (dual-method
Scope 2), and offset projects for the few sites that qualify. CAD Trust
is the world’s card catalogue — observer now, testnet publisher until
the mandate (Cadt.SyncRunner 07:20,
Cadt.PublishRunner 07:50 daily).
Contract terms (REC price, non-double-counting warranty, credit ownership) are negotiated in V7; the checkable report is V19 §8.
10.2 Trading carbon
Two organisations with no prior contract can discover a price, agree
a trade, and exchange certificates against payment. That is the
venue at /org/carbon-market (also
Certificates → Trading). Every path ends in the same Trade
the bilateral desk already uses: invoice, pay, deliver. There is no
second settlement mechanism.
A FIRM listing pledges the slice
(FREE → LISTED): what is on the book is always deliverable.
An INDICATIVE listing advertises without pledging.
Matching is the first moment the two sides see each other — until then
the public book has no seller identity. RFQs and sealed uniform-price
auctions are the other two origins. Live venue VAT waits on the CS1
opinion; every VAT-bearing figure is
estimated-grade.
10.3 Carbon tax
You may be an emitter with DA 185 licences and no wheeled
kilowatt-hour. /org/carbon-tax is that seat: facilities,
the year’s activity, a live provisional liability, COAS offset
surrender, and the July pack whose every figure is derivable from
section 6 of the Act. Phase-2 (2026) headline rate, allowances and
offset caps live in register rows, never in code.
SUBMITTED is a mark you make with the eFiling reference
after you file.
Follow along. Seat: OffTaker C (
offtaker_c@webill.net). Path: Organisation → Certificates. You should see: the Desk with a month picker. Carbon market is Carbon › Market; tax is Carbon › Tax.
Where this is taught. Certificates, offsets, venue: V19 · Carbon. Tax pack: V20 · Carbon Tax Compliance. Certificate lines on invoices: V15. Deal terms: V7.
11. Weather — what the plant will do
A solar or wind plant does not generate because a nomination said so. It generates because of irradiance, wind speed, temperature and the plant’s own curve. Strategy, the day-ahead bid and the intraday nowcast are only as honest as the weather sitting behind them.
Weather conversion creates generation series only for solar, wind and hybrid plants. Hydro, thermal and storage-only sites are not converted from weather points.
The platform pulls a forecast per generator site, keeps every issued row (a 03:00 bid must still be explicable at 15:00), and paints three bands on the IPP strategy dashboard: forecast, committed, and nowcast. A forecast of zero is a real night. No forecast is a different claim — the panel says so, and the book falls back to a synthetic shape rather than drawing a zero band.
11.1 What runs
| When (SAST) | Worker | What it does |
|---|---|---|
| 02:00 daily | FetchWeatherCycle |
One FetchWeather job per generator site, jittered up to
15 minutes so hundreds of sites do not burst together. Default horizon
72 h. An hour ahead of the 03:00 DAM build. |
| 06:00 · 09:00 · 12:00 · 15:00 | FetchWeatherDrift |
Intraday nowcast on the same :forecast queue and
rate-limit budget. Feeds IDM decisions. |
The mock adapter is mandatory in every environment. Live providers (Open-Meteo, Solcast) stay unarmed until configuration selects them. Freshness windows are per provider (mock / Open-Meteo 6 h, Solcast 3 h): one second outside the window the site is stale. Attribution on the panel names the provider (“Open-Meteo.com” when that adapter ran).
A weather-backed bid volume carries grade, provider and model-run time on the Bid Desk provenance strip — so you can see why the hour was that shape, not only that it was.
11.2 What you see
On an IPP strategy dashboard (#ipp-weather-panel):
| Band | Meaning |
|---|---|
| Forecast | The day-ahead issued series used to plan and to bid |
| Committed | What the book has already promised for those hours |
| Nowcast | The later issued series — what you would believe now |
| Stale chip | Newest issued_at is older than the provider’s freshness
window |
| No forecast — synthetic shape | Empty state; not a zero night |
Demo seeding has a dedicated weather step: it runs the weather pack on the mock, before the day-ahead backfill, because the DAM build reads the weather that is already there.
Follow along. Seat: IPP 2 (
ipp_2@webill.net). Path: IPP Sites → open the site → Strategy. You should see: the weather panel with forecast / committed / nowcast bands when the mock pack has run, or the explicit empty state if it has not.
Where this is taught. The clock rows: §6. IPP dashboard and bid provenance: V3 · Strategy · V10 Bid Desk. Ops / demo weather step: V21. Extreme-weather excuse on a PPA is a contract term, not this forecast: V7.
— End of V0. Next stop on the spine: V1 · The Four Rhythms, then V2 · Entities & Setup.
