← Manual home

V0 · Orientation & Core Concepts

What wheeling is, who does it, the objects the platform is made of, the clock it runs on, plus SAPP, carbon and weather — the concepts every other volume stands on.

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:

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 market map — who touches a wheeled kilowatt-hour
IPPgenerates & injects
→metered injection
The gridEskom Tx/Dx · municipal Dx
→metered offtake
Off-takerconsumes
Traderbuys and resells energy — a commercial layer, no wires of its own
→contracts
PPAs & settlementwho pays whom, proven interval by interval
Oversight & market
NERSAlicenses generation & trading, approves tariffs
Market Operatorruns SAWEM’s auctions and settlement files
System Operatorkeeps the physical grid stable — dispatch & curtailment

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:

  1. Standing data — organizations, sites, meters, tariffs, reference tables; the facts everything else consumes.
  2. Deals — proposals negotiated into signed, active PPAs, physical and virtual.
  3. Strategy — portfolio planning, forecasting, nominations, battery dispatch and risk for traders, IPPs and off-takers.
  4. Market — SAWEM participation as a BRP: day-ahead bidding, imbalance, reconciliation.
  5. 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:

  1. Virtual Wheeling — Eskom’s registered VW account: many generators and many meters under one holder, one consolidated refund (§5 · V17).
  2. Regional trading (SAPP) — cross-border day-ahead and forward physical at the Southern African Power Pool (§9 · V18).
  3. Carbon — RECs and credits, a trading venue, and carbon-tax compliance for emitters (§10 · V19 · V20).
  4. 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:

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 viewer role 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:

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

Standing data — who exists and what gets measured
Organizationyour company; owns everything below
→owns 1‑n
Sites & poolsoff-taker sites · generator sites · trader pools
→metered by
Metera device at the connection point
Readingone register value at a timestamp
→two make
Interval20-min energy; the platform’s atom
→rolls up
Daily · monthly serieswhat charts and reports read
Reference data
Tariffseasons · TOU · blocks · rates
Loss factorsTLF & DLF lookup tables
UoS chargesnetwork charges by category
Municipalitythe last-mile network owner

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.

Meter series ladder — OffTaker C Midrand DC · June 2026
Cumulative register Standard Peak Off-peak Highlighted period

Readings — cumulative register

Cumulative meter readings 10:00 to 12:00 Seven register snapshots rise from the 10:00 baseline to 3,260 kWh by 12:00. +3,260 kWh from 10:00 baseline 10:0011:0012:00

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

Six 20-minute intervals from 10:00 to 12:00 Bar heights 540, 520, 560, 520, 560, 560 kWh sum to 3,260 kWh. 540520560520560560 10:00Σ 3,260 kWh12:00

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

Daily TOU stacks 9 to 15 June 2026 Seven stacked bars; Thursday 12 June totals 38,900 kWh and is highlighted. Thu 12 Jun · 38,900 kWh 9101112131415

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

Monthly totals January to June 2026 Six monthly bars; June is highlighted at 1,168,000 kWh. 1,168 MWh JanFebMarAprMayJun

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

The deal chain
Proposaloffered terms; PENDING until answered
→accept creates
PPA (draft)physical or virtual; negotiated in a wizard
→both sign
Signaturecontent-hashed; then ACTIVE on start date

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.

Four contract topologies — seller → buyer (physical and virtual)
Generator siteIPP / plant
→OFFTAKER_IPP
Off-taker siteconsumer
Generator siteIPP / plant
→TRADER_IPP
Trader poolbuyer book
Trader poolseller book
→OFFTAKER_TRADER
Off-taker siteconsumer
Trader poolseller book
→TRADER_TRADER
Trader poolbuyer book
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:

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

What a settled month leaves behind
Settlement periodone contract × one period; status DRAFT → FINAL
→contains
Line itemsdouble-entry rows; Σ = 0
→projected into
Statementsone per party, immutable, versioned
Supporting records
Adjustmentscross-period corrections
Banking ledgercarried-forward energy credits
Nominationsdeclared volumes for meterless parties
Allocation & claim setsshared meters split fairly, no double-selling

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:

Thread period ledger (energy pair) — PPPA-202607-138209764 · 9 Jul 2026 · Σ = 0
Party Category kWh Amount
IPP2 Atlantis Wind energy 36,597
  • R 31,107.73
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.

Where a nomination sits on the resolution rail
METERED
→missing / unusable
NOMINATION
→no series
CONTRACTED
→data late
PROVISIONAL

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):

Shared generation meter split pro-rata to demand (illustrative peak band)
AllocateShared gen meter · 84,000 kWh
One meter84,000 kWh
↓ pro-rata to demand (2 : 1)
PPA → Buyer A56,000 / 56,000
56k Buyer A
PPA → Buyer B28,000 / 28,000
28k Buyer B
Buyer A shareBuyer B share

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 (one per trader pool, off-taker site or generator site)
Booka party’s whole strategy portfolio
→holds
Pools & memberssupply and demand, with rules
→runs produce
Allocation runsimmutable engine outputs + KPIs
Around the book
ForecastsP50/P90 series per member
Nomination plansmonthly commitments, optimised
BESS assetsbatteries and their dispatch
Risk snapshots & limitsthe daily KPI record and its thresholds
Contract simulationswhat-ifs that can become proposals

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.

Members on the board — illustrative T1 Renewables trader book (SUPPLY left · DEMAND right)
Supply pools — sources
☀ Solar · P10IPP3 Midrand Hybrid PPA · forecast shape
☁ Wind · P20Atlantis wind block · forecast shape
🎚 Flexible · P30Nominated member · SUBMITTED plan = available kWh
🔒 Firm · P40Rosslyn BESS · reserved for firm demand
Demand pools — sinks
🔧 Industrial · P10Open demand · factory load
🏬 Commercial · P20Open demand · offices / retail
🏛 Municipal · P30Open demand · last open queue
💵 Trader Sales · P40 · firmOffTaker A Rosebank Mall · served first from Firm

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
One-hour allocation — firm first, then open demand by priority (MWh)
Stage 1Protect firm demand
Firm supply · P404 MWh
→
Trader Sales · firm3 MWh served
Firm remainder1 MWh
Stage 2Walk open demand · merit-order supply
Solar A · P10 · 65c6 MWh
Solar B · P10 · 70c4 MWh
Wind · P205 MWh
Firm remainder · last1 MWh
↓ allocate into demand pools
Industrial · P108 / 8 MWh
6 Solar A 2 Solar B
Commercial · P205 / 5 MWh
2 Solar B 3 Wind
Municipal · P303 / 5 MWh
2 Wind 1 Firm 2 short
SolarWindFirmShortfall

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 seat and the IPP’s committed numbers
SAWEM (per organization)
BRP registrationthe market seat; roles & guarantee
Bids & bid linesday-ahead ladders, cleared volumes
Imbalance positionsactual − scheduled, priced per hour
Reconciliation & disputesthe MO’s file vs your expectation
SO instructionsdispatch · curtailment · outage orders
Market rules & price forecastversioned gates; P10/P50/P90 SMP
IPP programme (per generator site)
Allocation hierarchyPRIORITY / PRO_RATA / FIXED tiers, versioned
Monthly forecastFG, obligations, AES — the bankable numbers
HAFhow available the plant really is

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.

Beside the spine — certificates, the pool, and weather
Carbon
REC1 MWh from FINAL settlement
Carbon credit1 tCO₂e · registered project
Listing / Tradevenue book · RFQ · auction
Tax packsection 6 · July export
SAPP
Participation profilesponsored or direct
Position / TradeDAM · FPM · FX denomination
Wheeling pathcorridors · ATC · losses
Shadow statementCC file vs book · :FX
Weather
Forecast pointissued_at · site · interval
Nowcastlater issue of the same hour

Where this is taught. §9 · §10 · §11.

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.

The lifecycle spine — a kilowatt-hour’s journey from standing data to statement
1Setuporgs, sites, meters, tariffs
→
2Dealproposal → PPA → signed
→
3Strategyforecast, allocate, simulate
→
4Nominatecommit next month’s volumes
→
5Market daybid, clear, deviate, answer the SO
→
6Settlematch, price, adjust, ledger
→
7Statementwho owes whom, provably

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.

The narrative thread — who you follow (full_demo · seed 42)
Direct line — physical OFFTAKER_IPP
IPP2 Atlantis Windmeter MTR-NERSA-GEN-1002
→PPPA-202607-138209764
OffTaker C Midrand DCmeter MTR-OTS-thin_offtaker_c_private
Chain line — IPP → trader → off-taker
IPP3 Midrand Hybridsells into the book
→TRADER_IPP
T1 Renewables PoolTrader 1 book
→OFFTAKER_TRADER
OffTaker A Rosebank Mallfirm demand member
T1 Renewables Poolseller book
→TRADER_TRADER
T2 Flex PoolTrader 2 · mid-chain
Same cast, next chapter of the story — volume by volume
V2Setuporgs · sites · meters stand up
→
V3Dealproposals → signed PPAs
→
V5StrategyT1 book · pools · runs
→
V6IPPhierarchy · FG · HAF
→
V7MarketBRP-T1-DEMO · bids
→
V4Settle9 Jul · ledger Σ = 0

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.

A physical hour — 12:00, IPP → factory (illustrative numbers)
12:00standard
IPP injects10,000 kWh sentenergy price 65 c/kWh
DLF 0.966→340 kWh lost
Factory receives9,660 kWh deliveredwheeling 15 c/kWh
Energy (on sent)R 6,500.0010,000 × 65 ÷ 100
Wheeling (on delivered)R 1,449.009,660 × 15 ÷ 100
Utility bill− 9,660 kWhwheeled energy displaces grid 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

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.

Virtual wheeling — who pays whom (no electrons reassigned)
Eskomrefunds credit × consumption on the bill
→WER credit
Off-takerstill draws the grid; POD unchanged
↔︎CfD
Trader / IPPseller of the VPPA hedge
IPP generationirrelevant to this cash settlement
⇢not matched
No delivered profileno TLF/DLF · no UoS on the hedge

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:

  1. 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.
  2. 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.
  3. 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.
Eskom virtual wheeling — one period, strike R 1.05 · credit R 0.72 · 250,000 kWh
WEREskom bill
Eskom credit rateR 0.72 / kWh× 250,000 kWh consumption
→refund on bill
Off-taker receivesR 180,000WER / virtual wheeling credit
CfDVPPA
Strike − creditR 0.33 / kWh1.05 − 0.72
→off-taker pays seller
Trader / IPP invoicesR 82,500CfD settlement
Eskom refundR 180,0000.72 × 250,000
CfD (buyer → seller)R 82,500(1.05 − 0.72) × 250,000
Effective costR 262,500= strike × consumption · R 1.05 / kWh

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:

Same volume, credit above strike — seller pays the CfD
Altcredit 1.20
Credit > strike1.20 > 1.05Eskom refunds more than the strike
→seller pays buyer
CfD cashflowR 37,500(1.05 − 1.20) × 250,000
Eskom refundR 300,0001.20 × 250,000
CfD (seller → buyer)R 37,500seller pays the difference
Effective costR 262,500still strike × consumption
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.

The daily clock (SAST) — orientation preview; full catalogue in the tables below; worked rhythms in V1 · The Four Rhythms
00061218
  • 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
Day-of-month jobs 1 2 3 4 5 678910 1112131415 16171819 20 2122232425 2627282930 31

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.

SAPP in one picture — toolkit, not a second market
Your bookDAM + FPM positions · FX denomination
→before 09:30 CAT
Coordination CentreHarare clears, publishes, invoices
→monthly file
Shadow statementvariance · :FX · argue line by line
Dispatch MWwhat you offered
→path losses + ATC
Delivered MWwhat actually arrives

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.

Three carbon rooms — do not mix the instruments
From FINAL MWh
REC1 MWh · zaRECs / I-REC
Certificate Deskallocate · retire · claim
Venuelist · RFQ · auction · Trade
From a registered project / from the Act
Carbon credit1 tCO₂e verified · COAS-listed or not
Tax packsection 6 · July export · never submits

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.

Weather on the clock — pull, then bid, then nowcast
02:00FetchWeatherCycle · per site
→hour before DAM
03:00SubmitDamBids reads the issued series
→intraday
06 / 09 / 12 / 15nowcast · IDM

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.