1. This volume — the organisation P&L, and the page that reads it
Settlement told you what the month added up to. Billing turned that into documents. This volume is about the missing layer in between the filing cabinet and the question a finance lead actually asks:
Am I making money or losing money — and where?
The answer lives on one page: the Money Room at
/org/money. It reads a rebuildable fact base in which every
Rand is tagged by activity and traceable to its document. This volume
teaches that page, the period switcher, the grade chips, the five
panels, the lineage behind every figure, and the P&L statement a
finance lead can file.
Where this is taught. The documents — V15 · Billing. The ledger those documents rest on — V8 · Settlement. Certificates that already price into the P&L — V19 · Carbon. Come back here when the question is the organisation, not a single invoice or a single REC.
How to read this volume
- This chapter — what V14 is for, and what it is not (a general ledger, a chart zoo, a place that invents zeros).
- Value streams — the fourteen activities a Rand can belong to (§2).
- Where the numbers come from — a fact, a grade, ex-VAT (§3).
- When they refresh — the 1st-of-month chain, and why nothing here is live (§4).
- Money left on the table — the Loss Ledger, never added to the P&L (§5).
- How the numbers prove themselves — the gate, and why a missing month is better than a wrong one (§6).
- The Money Room —
/org/money: the five questions, the panels, clicking a figure for its lineage (§7). - The vocabulary — the dictionary generated from the code (§8).
- Exports and the P&L statement — the PDF you file, the CSV of the facts, and what neither of them is (§9).
- How the advisor finds context — when Ask ships (§10).
- Ask the Money Room — the question box, off by default (§11).
- Where you can improve — what a finding is, why it is evidence-backed, how to dismiss one, the recommendation lifecycle, and how estimated versus realised is kept on the same card (§12).
Follow along. Seat: OffTaker C (
offtaker_c@webill.net, passwordsupersecret). Path: Organisation → Money Room. You should see the period switcher, a grade chip, the month and year figures, and — when facts exist — five panels rather than an empty state.
2. What a value stream is
A value stream is the name of the activity a Rand belonged to. The Money Room groups every figure by these names. There are fourteen. A settlement line, a market statement line, and a billing-document line each map to exactly one of them. If a new kind of charge appears and nobody has said which stream it is, the mapping raises rather than dropping the Rand into an “other” bucket.
The same ledger line is not the same activity for both parties.
Careful. An energy line on a physical PPA is a sale to the generator and a purchase to the offtaker. The platform tags it twice, once per seat. If you add the two organisations’ P&Ls together you will double-count. You are not meant to.
The fourteen streams
PPA energy sales
Energy (and capacity) you sold under a physical PPA. Sunfields invoices Milltown for 1 240 MWh of matched energy at the contract price: that Rand is PPA energy sales on Sunfields’ P&L.
PPA energy purchases
Energy (and capacity) you bought under a physical PPA. The same 1 240 MWh, on Milltown’s P&L, is PPA energy purchases. Capacity charges travel with energy: a R 80 000 / month capacity fee on that PPA is sales for the IPP and purchases for the buyer.
Virtual-PPA CfD
A virtual PPA does not wheel electrons. It settles the difference between a strike price and a reference. If the month’s reference is below strike, Sunfields pays Milltown the difference; if it is above, Milltown pays Sunfields. Either direction lands here — the sign on the line is the direction.
WER credits
Eskom’s Wheeled Energy Refund, paid to the buyer of wheeled energy. Milltown receives a credit on the Eskom bill for the kWh that were matched and wheeled. That credit is WER, not a PPA purchase and not a network refund.
Trader margin
The slice a trader keeps (or, on a bad month, pays) for standing between a seller and a buyer. Trader X buys from Sunfields and sells on to Milltown; the difference after network they bear is trader margin. The same category on the offtaker’s line is the margin they were charged.
Day-ahead market
Payments for energy scheduled in the SAWEM day-ahead auction
(EPM lines). A BRP that sold 40 MWh at the system marginal
price is paid here; a BRP that bought 40 MWh is charged here. Same
stream, opposite sign.
Constrained and reserve (flex)
Constrained-on payments, constrained-off charges, above-cap energy,
and reserve-capacity payments (CPP, CSC,
AEPM, PAYRURC and the other reserve kinds).
The System Operator instructed a plant on, or bought regulating reserve
from it: the money is flex, not day-ahead energy.
Intraday market
Intraday payments and charges (IDPM_*,
IDC_*, IDM_REVERSAL). A re-declaration after
the day-ahead gate that the market accepted is intraday, even when it is
the same megawatt-hours you would have liked to sell yesterday.
Imbalance
Balancing charges and payments for departing from schedule (the
BPM_* family, and a bilateral :imbalance
line). Uninstructed forecast error is usually a cost. Instructed
deviation can pay you. The stream holds both; the Loss Ledger later
pulls out the uninstructed slice.
Market fees
The Market Operator’s own charges: the fixed monthly fee, the variable fee, unsecured-bad-debt allocation and recovery, default interest. An MO fixed fee has no site and no trading unit. It is still this stream, on the registration’s organisation.
Network (use of system)
Wheeling, transmission, distribution, losses, ancillary, and admin — the bill for moving energy across someone else’s wires. Always a cost on the organisation that bears it. Sunfields’ TUoS on delivered energy is network, not a reduction of energy sales.
Residual supply
Consumption the contracts did not cover, bought from Eskom or the municipality at the retail tariff. Milltown used 310 MWh that no PPA matched; that 310 MWh at the Megaflex rate is residual supply, not a PPA purchase.
Contract adjustments
Everything the contract does to the month after the energy has been priced: shortfall penalties, replacement energy, excess charges, banking draw-downs, curtailment credits, spill credits, escalation corrections, and dispute corrections. A spill credit at 80 % of contract price is an adjustment, not energy sales. A resolved bilateral dispute posted onto a later period is an adjustment, not admin.
Careful.
:excess_chargeis reserved in the ledger today — no code emits it — but it already has a stream. The day it acquires an emitter, the P&L will take it rather than refuse to build.
Certificates
RECs and carbon credits, as billed. This stream is
live. Generator and trader-supply invoices already
carry priced :rec and :carbon lines from
confirmed allocations (lib/wb/carbon/invoice_lines.ex). It
is not a reserved zero. An organisation with no confirmed allocations
will still read zero; that is a fact about their month, not about the
stream.
3. Where the numbers come from
A figure on the Money Room is not computed when you open the page. It is read from a fact: one row that says this organisation, this month, this activity, this counterparty, this many Rand, with a pointer back to the document, settlement line, or statement that produced it.
If that pointer is missing, the row is refused. A number you cannot click through to a document is not a number the platform will show.
What a fact is
One fact is one tagged Rand. The tuple that makes it unique is organisation × month × grade × value stream × counterparty × entity. The same org-month-stream can carry an invoiced row and a settled row; they are different facts, not versions of one. They are, however, two measurements of the same money, so a page never adds them (see The three grades).
The entity is the site, trader pool, or trading unit the money attaches to. It is allowed to be empty. The Market Operator’s fixed monthly fee belongs to the organisation and to no site — that is still a fact.
amount_cents is money in the fact’s own
direction. A revenue fact is money you received; a cost
fact is money you paid. A credit or a reversal is a negative amount on
the same stream. A buyer’s R 100.00 energy invoice is a cost of R
100.00, and a credit note refunding R 20.00 of it is a cost of −R 20.00,
so the net energy result is revenue minus cost: −R 80.00.
The build reads every source as money in or out from your side. A settlement line is + when you receive and − when you pay. An invoice you received, or a credit note you issued, is money out; an invoice you issued, or a credit note you received, is money in. A stream that can run either way, such as contract adjustments, is a cost when the money went out and revenue when it came in: a curtailment credit you received is revenue, a shortfall penalty you were charged is a cost.
Only documents that move money become facts. Pro formas, drafts, and void or reissued documents produce none; the tax document beside a pro forma carries its money.
An invoice you received names the supplier’s site. The build ties the fact to your own site or pool that buys from that supplier, found from your contracts. When no single site of yours matches, the fact is left Not tied to a site rather than borrowing the supplier’s.
The three grades
| Grade | When it appears |
|---|---|
| Invoiced | A billing document has been issued for this amount. Closed months, once the issuer run has posted. |
| Settled | A market or bilateral settlement has posted this amount. SAWEM statements, some contract settlements. |
| Estimated | A recommendation, a forecast, or any other computed figure that is not yet a document. It must name the method that produced it. |
The grades measure the same money at different stages, so they are never added. For each month and value stream, the Money Room, the P&L statement and the fact CSV count the best grade present: invoiced, then settled, then estimated. When August’s energy invoices issue, they replace August’s settled energy; August’s network charges stay settled until their own invoices arrive. The build keeps every row it wrote, so nothing is lost when a better grade lands.
Grades are never mixed silently. A year-to-date that includes the current month says so in a sentence rather than presenting one number that is quietly two things. That is the same rule the chips on the Money Room already follow (§7).
Why the P&L is ex-VAT (and what-you-owe is not)
The P&L answers how is the business doing. For a VAT vendor, VAT is pass-through: it is collected and paid over, it is not margin. A P&L that quietly includes it overstates both revenue and cost by fifteen percent in a way that looks entirely plausible.
So each fact carries two integers: the ex-VAT amount, and the VAT beside it. They are never added together on the fact. The number you owe, or that is owed to you, is gross — that is Panel 3, and Panel 3 reads the billing documents, which are settled gross.
A tax opinion that changes how a WER credit or a CfD line is treated lands in the facts on the next rebuild. The table does not decide a VAT character; it inherits the document’s.
Why one month can look expensive
Contracts do not all settle on a calendar month. Some settle daily, some weekly, some bi-monthly, some quarterly. A fact is recorded against the month that contains the settlement period’s end, and when that period is not a single calendar month the fact keeps a one-line note of the span — quarterly settlement, 1 Jun – 31 Aug 2026. The note’s presence is the chip. A monthly settlement has no note.
Careful. A quarterly contract makes August look expensive and June and July look empty. That is the contract’s lumpiness, not a platform error and not a lost Rand. Add the four quarters and you get the year. Add the twelve months of a monthly contract for the same energy and you get the same year. The annual view is exact; the monthly view is lumpy, and that lumpiness is the contract’s.
4. When the numbers refresh
The Money Room does not compute a Rand when you open the page. A worker builds the facts, on a clock, from documents and settlement that already exist. Nothing here is real-time by design. A figure that moved with every meter tick would be a different product, and a worse one: you could not point at the invoice that produced it.
What happens on the 1st
Once a month, after the period has closed, the platform runs a chain of jobs. The order that matters for the Money Room is the crontab’s order, not the sentence in an older diagram.
Chain reconciliation runs at 04:00. That is
before invoices exist. The issuer run is at
05:00, organisation billing at 05:30.
Facts that claim to be invoiced have to wait until those documents are
on the register, so the fact build is last: 06:00 on
the 1st, after OrgBillingRunner. At 06:30
the Improvement Planner runs for organisations that opted in: it
composes the month’s findings, re-runs each implemented recommendation’s
same detector on the later month, and — only if the
organisation also opted into delivery and has findings
— emails a byte-deterministic PDF. An organisation with nothing to
report is not emailed.
Careful. “After reconciliation” is not the same as “after documents exist.” Reconciliation at 04:00 is a trader-chain check. The fact build needs documents, which is why it is last.
On that 06:00 run the builder reads three kinds of source and writes none of a fourth:
| Grade | What it reads |
|---|---|
| Settled | Bilateral settlement line items, and market statement lines decoded
from the statement’s embedded lines array. There is no
separate market-lines table. |
| Invoiced | Billing documents and their lines, received and issued, for the org-month. Amounts are ex-VAT; VAT sits beside them. Pro formas, drafts, and void or reissued documents are skipped. |
| Estimated | Nothing on this run. An estimate is a method with a version, not a by-product of rebuilding settlement. |
For an organisation with a buying site, the same run also rolls up savings against grid-only for the month, from its settlement periods, and replaces the month’s previous estimate. A month with no settlement periods gets no estimate. A failed roll-up is logged and never undoes the facts just built.
A line the builder cannot attribute is residue, not a guess. It is written for the operator who ran the build. It does not appear on the organisation’s Money Room. A figure you cannot act on does not belong on your dashboard; a figure nobody sees at all is a silent hole.
The current month is provisional
Until the 1st’s issuer run has posted, the month you are in has settlement and no invoices. The grade chip on the Money Room already says so. Opening the page on the 15th does not invent an invoice. An on-demand run for the current month refreshes settled facts from whatever the ledger has now. Invoiced facts wait for a close.
When a month is closed, call the builder with the invoiced grade (or wait for the next 1st). The documents are then the input, and the invoiced rows rebuild from them.
A re-settled month simply rebuilds
Re-settlement, a reissued document, a dispute correction — none of
these have a special branch in the builder. They change the inputs. The
builder hashes those inputs (document ids and versions, settlement
period ids and their content hashes, statement ids and their parameter
hashes). If the hash is unchanged, it writes nothing:
the rows stay, built_at does not move. If the hash moved,
the month rebuilds under a new run id.
A :dispute_correction line is a contract adjustment
because that is what the stream mapping says, not because the builder
noticed the word “dispute.”
History already on the platform is filled the same way, month by month, from the settlement record. That backfill does not refresh aggregates first and does not assume they are fresh. It reads the sources it names.
Follow along. The numbers on
/org/moneyare from the last successful build. They will not twitch while you watch. If a month looks empty on the 2nd, the 06:00 job has not yet had documents to read — or it had them and could not attribute a line, which is an operator report, not a missing Rand on this page.
5. Money left on the table — the Loss Ledger
The P&L tells you what you made and what you spent. It does not tell you what you left on the table. That is a different question, and it gets a different row.
A loss row is one valued miss for one organisation, one month, one kind, against a sentence that says compared to what? The sentence lives on the row. When the method changes, old rows keep the sentence they were computed under. The change is visible instead of retroactive.
Careful. Losses are never added to the P&L. Adding “money you didn’t make” to “money you spent” produces a number no accountant will accept. The Loss Ledger is a separate panel, in a separate colour. Click through a loss and you land on the settlement line, the imbalance hour, or the banking row that produced it — never on a summed figure that mixed the two.
Compared to what?
A Rand of loss without a baseline is a claim you cannot defend. Every row therefore carries:
- a baseline — one human sentence, stored on the row, not looked up
- a method version — so a change of opinion is a bump, not a silent rewrite
- a confidence — high when the contract or the Market Code already states the counterfactual
If nobody has signed the baseline, the kind produces no row. A zero-value loss would claim that nothing was lost. Absence is the honest record.
Why these four first
Eleven kinds are named. Four of them have a counterfactual the contract or the Market Code already states, so the number was defensible before the workshop. Six more now carry a signed-interim baseline and a versioned method. One kind — residual premium — still produces no row: its sentence is recorded, but a business owner has not countersigned it.
The four that needed no workshop:
Spill forfeited
Generated energy nobody took, and the contract says it is forfeited. The settlement adjuster prices that surplus at zero. The loss is that quantity at the contract’s own price.
Baseline on the row: Compared with keeping this surplus at the contract’s own price — what a banking or buy-back clause would have preserved.
Spill that was offered into the day-ahead market and accepted is recovered, not lost. The recovered quantity is subtracted so recovered plus lost equals the surplus.
Spill credited at a discount
The same surplus, but the contract credits a percentage of the
contract price rather than forfeiting it. The loss is the
gap: (100 − credited %) of the energy, at
the full contract price.
Baseline on the row: Compared with crediting the surplus at the full contract price rather than the discounted percentage the contract actually paid.
A contract cannot forfeit and discount in the same period. One treatment applies. The two kinds never appear together for the same contract-period.
Uninstructed imbalance
Your forecast error, charged at balancing prices. The imbalance calculator already splits instructed (the System Operator caused it — excused, charged R 0) from uninstructed (you caused it — charged). The loss is the uninstructed charge. An hour that is instructed-only produces no row.
Baseline on the row: Compared with zero imbalance. The uninstructed charge itself is the loss; instructed deviations are excused and excluded.
Charging you, on your own dashboard, for a deviation the System Operator instructed is the fastest way to lose trust in every other figure on the page. That hour is excluded on purpose.
Banked energy that expired
Spill that was banked, then left unused until the window closed. The banking row already carries the rate the energy was banked at. Fully drawn balances are not a loss. A partially drawn balance values only the remainder that expired.
Baseline on the row: Compared with drawing the banked energy before it expired, valued at the rate it was banked at.
Six more, each with a sentence
These six share the same honesty rules as the four: a stored baseline, a method version, a confidence taken from the row. Two of them are low confidence — a modelled counterfactual, not a clause — and the chip says so.
Curtailment that was not fully deemed
The grid cut you, and the contract’s deemed-energy clause did not pay the whole quantity. The loss is deemed energy at the contract price, minus what was credited. Where the contract is silent on deemed energy, the whole curtailed quantity is the loss — silence is not “no claim, so no row”.
Baseline on the row: Compared with being paid the contract price for the curtailed energy. Where the contract is silent on deemed energy, the whole curtailed quantity is the loss.
Shortfall penalties
A cash penalty for missing an availability or performance commitment. It is listed separately from forgone revenue. The baseline is paying no penalty.
Baseline on the row: Compared with paying no availability or performance penalty. This is a cash penalty, listed separately from forgone revenue.
Missed market gates
A bid was built but missed gate closure. The loss is the month’s average realised day-ahead uplift, counted only on days this organisation actually participated — empty calendar days are not in the denominator.
Baseline on the row: Compared with the month’s average realised day-ahead market uplift, counted only on days this organisation actually participated — not averaged across empty calendar days.
Battery cycle cap
Charge-and-discharge pairs the battery’s own record shows were profitable, held only because the daily cycle cap had been reached. The figure comes from that record. The dispatcher is not re-run.
Baseline on the row: Compared with dispatching the charge-and-discharge pairs the battery’s own record shows were profitable and were held only because the daily cycle cap had been reached. No re-run of the dispatcher.
Escalation drift
The contract price rose faster than the tariff the contract names. If the contract does not name a tariff, this kind does not fire — CPI is not invented as a stand-in. Shown as low confidence.
Baseline on the row: Compared with the contract price rising in line with the tariff the contract names. If the contract does not name a tariff, this kind does not fire.
Uncaptured market volume
Offered volume the market did not accept, and spill that was never offered, valued as if accepted at that hour’s clearing price. A modelled counterfactual, shown as low confidence.
Baseline on the row: Compared with the offered volume having been accepted at that hour’s clearing price. Spill that was never offered is valued the same way. This figure is shown as low confidence.
What you will not see yet
Residual premium — unmet consumption bought at the retail tariff, compared with the cheapest contracted price — is named so the vocabulary is complete. Its sentence is recorded as signed-interim. A business owner has not countersigned it, so the kind produces no rows. Absence is the honest record. A materiality floor (hide the R 40 rounding artefacts, keep the R 480 000 row) is a display choice for the panel, not a filter at build. Every loss that these methods emit is stored.
On the Money Room
Panel 4 on /org/money is this ledger for the period you
have selected. Each visible row is one sentence (kind, energy where it
exists, Rand value) with a confidence chip taken from
the row — high, medium, or low —
not from the kind. The tooltip is the row’s stored
baseline. Opening a finding on Panel 5 is that same row’s
detail, not a new number. A finalized curtailment claim that paid short
may appear as Unrecovered
curtailment. That is a period leftover. It is not Annual exposure, and this page
has no Annual exposure tile.
Where this is taught. The IPP relationship — where Annual exposure actually lives, and what Money Room does not show — is V4 §10.5.
Rows below the display floor (R100) collapse into “and N smaller items”. The losses-only total still includes them, and is captioned so it cannot be read as part of the P&L.
When a missed gate and an uninstructed imbalance charge both appear, the panel says they are different money and both stand. A reader who assumes one event cannot be two losses would otherwise collapse them.
Residual premium produces no rows on the panel until a business owner countersigns A1. There is no “coming soon”. Absence is the honest record.
Sometimes one loss, sometimes two
Two rows that sound similar are not always the same megawatt-hour counted twice. Each overlap has a rule, and the rule is not always “pick one”.
Forfeited spill and uncaptured market volume. Spill the contract forfeits is forfeited. Volume you genuinely offered into the day-ahead market that the market did not accept is uncaptured. Never-offered surplus is not both.
Forfeited spill and discounted spill. A contract cannot forfeit and discount in the same period. One treatment applies.
Spill that the day-ahead market took. Offered and accepted is recovered, not lost. The recovered quantity is subtracted. Fully recovered surplus produces no spill row.
Curtailment and a missed gate on the same day. The plant could not have delivered. Curtailment is the cause; the gate miss does not fire for that day.
Expired banking and residual premium. Residual premium is not on the ledger yet (a business owner has not countersigned it). When it is, expired banking is the loss, and residual premium will exclude the quantity a live banked balance would have covered.
A missed gate and an uninstructed imbalance charge. Both are real and both stand. The imbalance charge is money you paid; the missed gate is money you did not make. Collapsing them would understate the total just as counting the same spill twice would overstate it.
The period total is still the sum of distinct events. It is still not part of the P&L.
Why the plan was missed — the margin bridge
The bridge explains plan to actual; the ledger explains achievable to actual. They are different questions and are never added.
Where this is taught. On the IPP Dashboard the same card sits in Chapter 1 above Monthly Money — V4 §12.2.
For a worked solar month, plan is R11,985,000 and actual is R10,703,250. Volume contributes −R618,682.98, average price −R279,300.45, shape −R337,648.91, imbalance −R42,500, contract protection +R205,860 and leaks −R206,227.66. The remaining −R3,250 is the market fee. The seven steps sum to the −R1,281,750 gap exactly.
Leaks use energy valued at the plan’s captured price. They do not copy the Loss Ledger’s Rand estimate. Uncaptured market-volume lineage also shows the latest available DAM-capture metric and date, or says it is not yet computed for the book.
6. How the numbers prove themselves
Every month is checked against the invoices before it is shown. If it does not add up, you see nothing rather than something wrong.
The Money Room does not invent a Rand. It reads the documents and the settlement ledger that already exist, tags every amount, and then asks a question the settlement ledger has asked for years: does this sum to the cent? If the answer is no, the month is refused. The previous month stays on the page. A discrepancy is written for whoever ran the build. You are not asked to trust a plausible figure.
Careful. A number that is almost right is worse than a number that is missing. Almost-right is quoted. Missing is investigated.
What is checked
For the month that has closed, invoiced facts — the ones that came from billing documents — must equal those documents, VAT included, to the cent. The P&L line is ex-VAT, with VAT sitting beside it, so the check adds the two and compares them to the invoice totals (gross). A one-cent error against a single counterparty is named against that counterparty, not buried in an organisation-wide delta.
Settled facts — the ones that came from the ledger and from market statements — must equal that ledger’s own totals for the organisation’s periods. They are allowed to differ from the invoiced figure. That difference is the accrued-versus-invoiced gap the platform already documents, not a bug.
Estimated rows, including every loss on the Loss Ledger, are excluded from the check. A large loss does not move the gate, because a loss is not a P&L line.
What “provisional” means
The current month is provisional. Documents for it have not been issued yet. Settled-grade facts are still built, so you can see how the month is accumulating, but they are chipped as provisional and they are not the invoice. When the month closes and the invoices issue, the invoiced rebuild runs, the gate runs, and either the month is signed or it is refused.
A refused month does not appear as a wrong number. It stays as it was — last month’s signed facts — until the discrepancy is fixed and the build is run again.
Why the accrued figure and the invoiced figure legitimately differ
Settlement posts as the period runs. Invoices issue after the month closes, and they include VAT, rounding, and any correction notes that landed between the last settlement and the issue date. The two figures are two grades of the same activity, not two attempts at the same number. The gate checks each grade against its own source. It does not demand that settled equal invoiced.
What it does demand is that invoiced equal the invoices, and that settled equal the ledger. To the cent. Anything else is a build that failed, not a dashboard that guessed.
Clicking a figure already on the page
The gate is how a month earns a place on the page. Once a figure is there, click it. The lineage drawer shows the facts behind that Rand and opens the document, ledger, or market statement they came from — or says the source cannot be opened. That walk is taught in §7.11. The PDF and CSV you leave with are taught in §9.
7. The Money Room —
/org/money
You need to understand your portfolio’s result, see which sites or
pools contributed, and decide what to investigate next. Open the
Money Room
through Organisation → Money → Room, at
/org/money. It is your organisation’s page; requests naming
another organisation return not found.
Read the page from the summary through monthly performance and contributors, then the result breakdown, payments, and losses with next steps. Changing the time range keeps this order, so you can compare periods without learning a new page. On a phone, Open navigation reveals the familiar sidebar without taking space away from the portfolio view.
Where this is taught. Documents the Money Room will read — V15 · Billing. Settlement the documents rest on — V8. Loss rows — §5. Come back here when the question is “am I making money, and can I prove it?”
7.1 What this page is for
Settlement told you what the month added up to. Billing turned that into documents. The Money Room is the one page that answers the questions a finance lead actually asks, from those documents, without sending them hunting through five screens.
It is an energy P&L, not a general ledger. Salaries and insurance live in the organisation’s accounting system. The figures here are the money this platform produced: energy, network charges, market settlement, credits, certificates.
7.2 The five questions
| Question | Where to look |
|---|---|
| What is the result? | The verdict sentence and four summary tiles |
| How is it changing? | How each month went, with the Monthly money chart |
| Who and what contributed? | Where the money came from: What made the result and Who contributed |
| What must I collect or pay? | Cash to collect and pay, with not-yet-due, overdue and disputed amounts |
| What should I investigate next? | Losses and next moves, then What to do next |
The tiles show the energy result, a second result for context, Owed to you and You owe. For a buyer viewing the whole portfolio, once a grid-only estimate exists, Savings against grid-only takes the first tile and the energy result moves to the second. Payment tiles are gross and count the unpaid documents behind them; energy results and savings exclude value-added tax (VAT).
The top bar carries Manual, which opens this chapter in a new tab.
7.3 How to change the period
Choose Period, then the month beside it. In Month that field is called Month. In Year to date and Rolling 12 months it is called Through, because it sets the last month of the range.
| Period | Month field | Range and URL |
|---|---|---|
| Month | August 2026 | August; ?period=2026-08 |
| Year to date | August 2026 | January–August;
?anchor=2026-08&period=ytd-2026 |
| Rolling 12 months | August 2026 | September 2025–August 2026; ?period=r12-2026-08 |
The heading prints the actual range. A shared link preserves the anchor month, including for year to date. Invalid periods fall back to the current month. There is no financial-year mode.
Use Performance scope to select Whole portfolio or a site or pool named in your energy facts. Not tied to a site collects the facts the build did not attribute to a site or pool. A scope filters the energy tiles, the months, the streams and their evidence. Who contributed still shows the whole portfolio for context. Payments, grid-only savings and losses stay whole-portfolio, and their captions say so. The URL keeps your scope.
Select a bar on Monthly money, or expand Monthly figures and evidence and select a month, to open that month without losing your scope. The chart stays in place: the months around the one you picked stay on it, and the months the page is showing are shaded green. With the chart focused, the left and right arrow keys move between months and Enter opens one.
7.4 What the chips mean
The period status and the facts’ basis answer different questions.
| Label | Meaning |
|---|---|
| PROVISIONAL | The selected calendar month is still open or in the future. |
| CLOSED PERIOD | The whole selected range is before the current month. This does not claim every fact is invoiced. |
| This range includes closed and provisional months. | The range crosses the current-month boundary. |
How sure is this story counts the closed and provisional months on show and lists the grades actually present, such as Invoiced + Settled. Each month’s stream is counted once, at its best grade: invoiced energy replaces settled energy, so the two are never added (§3). Facts built gives the time of the latest fact build in SAST (South African Standard Time) and how long ago that was. When the range includes the open month and the build is two or more days old, the line turns amber and says the open month may have moved since.
The box beside the chart gives the river’s takeaway. When the latest closed month and the month before it can be compared, it says how far the cash net moved, for example Jun 2026 was R 150.00 higher than May 2026, and the chart card shows the same change as +R 150.00 vs May 2026. When they cannot be compared, it says why: a month has no facts, is still open, has a different grade, or includes non-monthly settlement windows. In Year to date and Rolling 12 months it compares the range’s latest closed month. Hatched bars mark provisional months, and the monthly figures table names each month’s basis.
7.5 When numbers appear
An organisation with no facts yet sees a plain explanation:
No numbers yet. Numbers appear on the 1st of
the month, after invoices are issued. The empty state is not a
zero. R 0.00 would claim “we measured, and it was nothing.”
“No numbers yet” claims “we have not measured.”
Payables, losses, and findings are a different matter: they read documents and loss rows that already exist. An organisation with no unpaid documents sees Nothing to collect and Nothing to pay, not an invented Rand.
7.6 Two lenses on “am I making money?” (Panel 1)
The Net energy result is recorded revenue minus recorded cost, excluding VAT. It is an energy profit-and-loss result, not a statement of bank cash received or paid. A buyer’s costs can exceed revenue while its energy programme still saves money against buying everything from the grid. A book with costs and no revenue has nothing for its costs to exceed, so the verdict says what the energy cost, for example Energy cost R 84,656.60 for August 2026. The verdict names the site or pool with the largest contribution only when there are several; it never names Not tied to a site.
For a buyer viewing the whole portfolio, Savings against grid-only leads the summary once the build has an estimate for the period, and the Monthly money chart draws it as a line. The build rolls savings up with each month’s facts for any organisation with a buying site. This is an estimate against the stored baseline. The separate savings card shows the arithmetic: grid-only cost − actual cost = saved. When the programme cost more than grid-only, the card says so instead, for example R 833.53 more than grid-only (OffTaker A, July 2026), and the verdict says the programme is R 833.53 behind grid-only. Expand Comparison basis to read the assumptions.
Until an estimate exists, the page makes no savings claim. The tiles lead with Net energy result, the savings card says No grid-only baseline available for this period, and neither the verdict, the chart nor its monthly table mentions savings. A month with no settlement periods has nothing to compare, so it never gets an estimate.
Follow along. Seat: OffTaker A (Organization). Path: Money → Room, then Month · August 2026. You should see Savings against grid-only −R 5,603.51 first and Net energy result −R 84,656.60 second, and the verdict August 2026: the programme is R 5,603.51 behind grid-only. Cash is −R 84,656.60. Choose OffTaker A Rosebank Mall in Performance scope, and the verdict begins Energy cost R 84,656.60 for August 2026.
Savings answer a buyer’s question: what would the power have cost from the utility? A seller has no such bill, so it sees cash only: no savings tile, line, table column or card. A hybrid organisation, with buying and selling sites, leads with the net energy result and keeps the savings card. A trader also sees cash only, with a note explaining why no grid-only alternative is shown. A buyer’s individual-site scope shows energy results, because the saved amount is only available for the whole organisation.
In Month, the second tile, Year to date, runs from January through the selected month. In Year to date and Rolling 12 months the second tile is Latest month: the range’s last month on its own. When a buyer’s savings lead, the second tile is the Net energy result instead. A buyer’s energy result is not coloured as a loss, because paying for energy is what a buyer does.
The Monthly money chart shows up to 13 months in Month, or the selected range in the other periods. In Month the window ends at the latest month with facts, up to twelve months after the one you selected, so picking an earlier bar does not cut off the months after it. History begins at the first available fact. Internal gaps remain gaps rather than invented zeros. The expandable monthly table gives the amounts and a keyboard path to every month.
Who contributed ranks the whole portfolio’s entity contributions on a shared scale with a central zero line. The rows add to the portfolio’s net energy result. They, and Performance scope, list only your own sites and pools: an invoice you received is tied to your site that buys from the supplier, never to the supplier’s site. Not tied to a site identifies facts the build did not attribute to a site or pool; Unclassified activity identifies an entity whose kind is missing. Select a row to inspect that contribution’s evidence.
7.7 Where the money went (Panel 2)
Under Where the money came from, What made the result explains the selected energy result with a waterfall of its active value streams. Revenue and cost controls open their own evidence. Fourteen streams are supported; inactive streams collapse into a count rather than empty bars. Stream contributions sum to net.
Each bar runs from the running total before its stream to the total after it. A stream that takes the total below zero is drawn below the axis, and one that crosses zero is drawn on both sides of it. Increases are green and decreases grey; the Net bar is green when positive and red when negative. Point at or focus a bar to read its own signed change, such as PPA energy purchases −R 35,365.85.
Select a bar to open that stream’s evidence, or expand Stream figures and evidence for the table and its evidence controls. With the chart focused, the arrow keys step through the bars and Enter opens one. These figures follow your performance scope. If the facts include non-monthly settlement windows, expand Includes non-monthly settlements to see the spans. This prevents a settlement window from being mistaken for ordinary monthly performance.
The folded Plan against actual comparison below this section names its month and book. It appears only for an organisation with a trader or IPP book; it is explained under The plan-to-actual bridge.
7.8 Owed and owing (Panel 3)
Cash to collect and pay shows the unpaid billing documents for the selected period, for the whole organisation, from your side of each document. An invoice you issued is money to collect. An invoice you received is money to pay. A credit note runs the other way. Pro formas, drafts, and void or reissued documents are not payment obligations and are left out, so a pro forma never doubles the tax invoice beside it. The Billing Hub places documents the same way, so the two screens agree.
The caption states the date used for aging: today. Opening an old month therefore shows what remains unpaid today, not a historical snapshot of the balance at that month-end.
The Collect and Pay bars share one scale. Each separates not-yet-due, overdue and disputed amounts, with Rand captions for overdue and disputed balances. Disputed documents are excluded from overdue. An empty side says Nothing to collect or Nothing to pay.
A bill does not vanish when the page moves on to the next month. When a bill you received for an earlier month is still unpaid after its due date, an amber line under Pay says so, for example Also overdue from before Aug 2026: R 6,320.11 · 3 bills, and the You owe tile adds R 6,320.11 overdue from earlier months. Disputed bills are left out, as they are from overdue. Open in billing opens the Billing Hub’s documents across every open month, narrowed to overdue bills to pay. The collect side stays with the selected period; chase your own overdue invoices on the Billing Hub.
Expand Documents, aging and market payments for the documents on each side, named by the other party, with their aging buckets and the market payment figures. Select a document to open its evidence. Open billing takes you to the Billing Hub. These payment obligations are gross (VAT-inclusive); they must not be added to the energy result, which excludes VAT.
Follow along. Seat: IPP 1 (Organization). Path: Money → Room, then Month · August 2026. You should see Owed to you R 29,636.81 from two unpaid invoices: GEN-TAX-2026-000003 to OffTaker A (R 15,803.23) and GEN-TAX-2026-000004 to OffTaker C (R 13,833.58), both due 1 Oct 2026. The matching pro formas are not counted, and You owe says Nothing to pay.
Follow along. Seat: OffTaker A (Organization). Path: Money → Room, then Month · August 2026. You should see You owe R 46,629.17 for August’s two unpaid invoices, not yet due, with R 6,320.11 overdue from earlier months under it: three July invoices numbered GEN-TAX-2026-000001, one from each of IPP 1, IPP 2 and IPP 3, due 31 Aug 2026.
Where this is taught. Billing registers and document detail — V15.
7.9 Money left on the table (Panel 4)
Losses and next moves lists the estimated losses by kind, largest total first. A kind with one loss is one row: its sentence, where it sits, a suggested investigation, a confidence label and Review evidence. The stored baseline is available on the row and in its evidence. Losses remain whole-portfolio figures when you select a site or pool in the header.
Some kinds are valued hour by hour. A month of uninstructed imbalance is one loss per imbalance hour, so the kind is said once, with its count and total: Uninstructed imbalance — forecast error charged · 46 hours · ≈ R 35,450.51. Below it, the five largest hours are listed by what tells them apart, the day and hour in SAST, such as Tue 1 Sep, 20:00–21:00 SAST · 1.425 MWh ≈ R 1,296.75. Equal amounts list in time order. Show 41 more hours unfolds the rest. Review all 46 opens every loss of the kind in the evidence drawer, titled by the kind; select an hour to open that hour alone.
Follow along. Seat: OffTaker A (Organization). Path: Money → Room, then Month · September 2026. You should see one Uninstructed imbalance group of 46 hours, ≈ R 35,450.51, led by 20:00–21:00 SAST on Tue 1 Sep and Tue 15 Sep, ≈ R 1,296.75 each, and one matching finding under What to do next.
The total is estimated, ex-VAT, and never added to the P&L. It is not a promise that you can recover that amount. Rows below R 100 collapse into and N smaller items but remain in the total. Kinds without a valuer are absent. An empty period says No avoidable losses recorded this period.
Where this is taught. The loss kinds and their comparison baselines — §5.
7.10 Do next (Panel 5)
What to do next turns losses into next steps. Until the advisor ranks recommendations, it shows the deterministic subset: each loss kind already implies its own fix (forfeited spill → banking or a market offer; expired banking; charged forecast error; a spill discount gap). There is one finding per kind. Its Rand value is the loss row, or the total of the kind’s rows when there are several, and it says how many, such as Across 46 hours. Open is the finding’s detail, naming the largest hours; it is not a write. Select the figure to open the kind’s evidence. Implementing a finding goes through the existing human flows — proposals, amendments, bids.
When the advisor is on, each card is an AI-drafted recommendation with three actions:
- Start research marks it under research.
- Accept records that you will act on it. Carry it out through a proposal, amendment or bid; the platform does not act on it itself.
- Dismiss needs a Reason for dismissing, which is kept with the dismissal. The recommendation leaves the list and stays hidden until its value or its evidence changes materially.
Each action is one click, and the panel then says what happened, with Undo. Undo puts an accepted or researched recommendation back where it was, and restores a dismissed one to the list. If an action is no longer possible, for example because someone else already moved the recommendation, the panel says so in red instead of silently doing nothing.
After you implement a recommendation, the same detector that found the problem comes back and writes realised next to estimated — never replacing the estimate. A condition that cannot be scored (the entity is gone, or the detector went silent for a different reason) is recorded as unmeasurable, not as a win.
An organisation with no losses sees a quiet empty state, not an encouraging one.
7.11 How a figure proves itself
Select a summary amount, a contributor, a waterfall bar, a payable row, or a loss sentence. The Evidence drawer opens with the facts that make up that figure: stream, site, the other party, amount and grade. Energy evidence respects the selected scope; a contributor row opens its own facts. Close the drawer with the top-right ×, the backdrop, or Escape. Each fact’s source is a link into a screen that already exists: a billing document, a contract ledger, a market statement.
A settlement line is named by its charge, its time-of-use bucket when it has one, and the date the settlement period starts, followed by the party it is settled with: Energy · off-peak · 8 Aug 2026 · with OffTaker A Rosebank Mall. A network charge names the network operator it is paid to, such as with Eskom Distribution, not the other party to the energy contract. Its amount sits on the right, and the largest lines come first. Lines worth R 0.00 fold into N more lines at R 0.00, which you can expand. Contract-term keys in a ledger description are shown as words. The line’s identifier stays on the link and is not the label.
Amounts in the drawer carry the sign they have on the page: a cost is
negative, as its waterfall bar is. An invoice line is named by its
document and line, such as Invoice GEN-TAX-2026-000003 · Energy
offpeak, and opens that document on the Billing Hub even when other
suppliers’ invoices share its number. A loss priced on an imbalance hour
opens that day on the Imbalance screen
(/org/brp/after-delivery/imbalance), labelled Imbalance
· 1 Sep 2026, 20:00–21:00 SAST.
If a source cannot be opened, the row says so. A dead link on a provenance trail is worse than an acknowledged gap, because it looks like proof.
The number in the drawer header is the number you clicked. The facts underneath add up to it. The drawer does not invent a second total.
Where this is taught. What a fact is — §3. The PDF and CSV you leave with — §9.
7.12 What is not on this page yet
Ask the Money Room appears only when the advisor is enabled for your organisation. It explains recorded figures; it does not calculate new money. Its use and limitations are taught in §11.
Site-level savings and payment attribution are not supplied by this page. The P&L statement (PDF) stays one month for the whole organisation, even when the screen shows a longer range or a site. The fact CSV follows the screen; see §9.
The plan-to-actual bridge
Expand Plan against actual · [month] · [book] below the result breakdown. Choose a trader or IPP book in the Book selector. Books with a built bridge come first, then the rest by name, so the comparison opens on a book that has something to show. The comparison always uses the anchor month, including when the overview covers a year or rolling 12 months. It states whether the month is open, a plan is missing, required inputs are unavailable, or a completed bridge is available. Off-taker books use savings analysis and have no margin bridge, so they are never listed, and an organisation whose books are all off-taker books sees no Plan against actual fold.
The card’s caption says Why the plan was missed only when actual fell short of plan. It says Why actual beat the plan when actual was higher, Plan met when they match, and Plan against actual when no bridge could be built. Read from plan to actual through the seven steps. Expand How this step was counted for the plain-English inputs that feed that step. On the Money Room card, Show the evidence opens the evidence drawer beside the other panels. Demo-market and retrospective-plan labels remain visible. Bridge values are not included in the P&L totals or added to losses.
8. The vocabulary — a dictionary generated from the code
The Money Room, the advisor, and this volume have to mean the same thing by WER, deemed energy, and value stream. This chapter is that dictionary. It is generated from the Ash resources and from the master glossary, so it cannot quietly rot.
Where this is taught. The fourteen streams as activities — §2. Where a fact comes from — §3. Definitions of terms the resources do not spell out live in the platform glossary (GLOSSARY.md) — this chapter cites those entries; it does not write a second definition.
8.1 How things connect
A PPA has a seller, a buyer, and settlement periods. A settlement period produces line items. Line items map to value streams. A P&L fact belongs to an organisation.
| Subject | Predicate | Object |
|---|---|---|
PhysicalPpa |
has_seller |
GeneratorSite |
PhysicalPpa |
has_buyer |
OffTakerSite |
SettlementPeriod |
produces |
LineItem |
LineItem |
maps_to |
ValueStream |
PnlFact |
belongs_to |
Organization |
8.2 The fourteen value streams
Every Rand on the organisation P&L is tagged with exactly one of these. The one-sentence meanings are the enum’s own.
8.2.1 :ppa_energy_sales
ppa_energy_sales — Energy (and capacity) you sold under
physical PPAs. Typical direction: revenue.
8.2.2
:ppa_energy_purchases
ppa_energy_purchases — Energy (and capacity) you bought
under physical PPAs. Typical direction: cost.
8.2.3 :vppa_cfd
vppa_cfd — Contract-for-difference settlements on
virtual PPAs (either direction). Typical direction: either.
8.2.4 :wer_credits
wer_credits — Eskom’s Wheeled Energy Refund paid to
buyers. Typical direction: revenue.
8.2.5 :trader_margin
trader_margin — Margin earned (or paid) on
trader-intermediated deals. Typical direction: either.
8.2.6 :market_dam
market_dam — Day-ahead market: energy payments for
scheduled sales/purchases. Typical direction: either.
8.2.7 :market_flex
market_flex — Constrained-on payments, constrained-off
charges, above-cap energy, reserve capacity payments. Typical direction:
either.
8.2.8 :market_idm
market_idm — Intraday market payments and charges.
Typical direction: either.
8.2.9 :market_imbalance
market_imbalance — Balancing charges/payments for
deviating from schedule. Typical direction: either.
8.2.10 :market_fees
market_fees — Market operator fixed + variable charges,
bad-debt allocations. Typical direction: either.
8.2.11 :network_uos
network_uos — Wheeling, transmission, distribution,
losses, ancillary, admin charges. Typical direction: cost.
8.2.12 :residual_supply
residual_supply — Unmet consumption bought from
Eskom/municipality at the retail tariff. Typical direction: cost.
8.2.13
:contract_adjustments
contract_adjustments — Shortfall penalties, replacement
energy, excess charges, banking draw-downs, curtailment credits, spill
credits, escalation corrections, dispute corrections. Typical direction:
either.
8.2.14 :certificates
certificates — RECs and carbon credits. Typical
direction: revenue.
8.3 The eleven loss kinds
The Loss Ledger values money you did not make. Losses are never added to the P&L. Each kind has a baseline; that baseline is the hard part, and an unsigned baseline does not ship as a number.
| Kind | What happened | Confidence |
|---|---|---|
spill_forfeited |
Generated energy no one took, and the contract says it is forfeited. | high |
spill_discount_gap |
Spill credited, but at a discounted percentage of the contract price. | high |
curtailment_unrecovered |
Grid curtailed you and the contract’s deemed-energy clause did not fully compensate. | high |
imbalance_uninstructed |
Your forecast error, charged at balancing prices (instructed deviations excluded). | high |
shortfall_penalties |
Availability or performance penalties you paid. | high |
banking_expired |
Banked energy that expired unused. | high |
residual_premium |
Unmet consumption bought at the retail tariff (baseline signed-interim; valuer unbuilt until A1 is countersigned). | medium |
market_gate_misses |
Days a bid was built but missed gate closure. | medium |
market_uncaptured |
Offered volume the market did not accept, or spill never offered. | low |
bess_ceiling |
Battery arbitrage pairs rejected only by the daily cycle cap. | medium |
escalation_drift |
Contract escalation running ahead of the tariff escalation it was meant to track. | low |
8.4 Terms the resources cannot know
WER, deemed energy, gate closure, the three pots, the six bill groups, spill treatments, instructed versus uninstructed — these meanings live in the master glossary or in the chapter that teaches them. Cited, not rewritten.
| Term | Definition |
|---|---|
| WER | g-wer-wheeled-energy-refund |
| WER credit | g-wer-credit |
| deemed energy | g-deemed-energy |
| gate closure | g-gate-closure |
| energy pot | g-energy-payment-epm |
| ancillary service recovery | g-ancillary-service-recovery |
| Market Operator Charge Account | g-market-operator-charge-account |
| Trading Clearing Account | g-trading-clearing-account |
| Market Balancing Account | g-market-balancing-account |
| instructed / uninstructed imbalance | g-instructed-uninstructed-imbalance |
| Instructed Energy | g-instructed-energy |
| spill | g-spill |
| spill credit | g-spill-credit |
| banking (energy) | g-banking-energy |
| spill treatment — forfeit | PPA treatment FORFEITED — leftover meaning is spill |
| bill group 1 — wheeling energy | taught in V15 §7 — not a GLOSSARY.md entry |
| bill group 2 — wheeling & use of system | taught in V15 §7 — not a GLOSSARY.md entry |
| bill group 3 — credits | taught in V15 §7 — not a GLOSSARY.md entry |
| bill group 4 — other charges | taught in V15 §7 — not a GLOSSARY.md entry |
| bill group 5 — residual | taught in V15 §7 — not a GLOSSARY.md entry |
| bill group 6 — corrections | taught in V15 §7 — not a GLOSSARY.md entry |
8.5 Regenerating
The committed artefact is priv/insight/ontology.json.
After a resource, stream, or glossary change:
mix run --no-start -e 'WB.Insight.Ontology.generate()'
CI fails when that file has drifted from the code.
9. Exports and the P&L statement
You can answer the five questions on the Money Room. You still have to leave with something a finance lead can file, and something a spreadsheet can check. That is the P&L statement PDF and the fact CSV.
The PDF is for one organisation and one month. The fact CSV follows the screen: the months of the period you are viewing, up to twelve, and your performance scope. The closed month is the default — last month, once invoices have issued. Opening the current month is allowed; the PDF is stamped PROVISIONAL rather than refused. An unlabelled mid-month view is the danger, not the view itself.
Follow along. Path: Organisation → Room → Export, in the page header → Facts behind this view (CSV) or P&L statement (PDF). URLs:
GET /org/money.csv?from=2026-01&to=2026-08(add&scope=generator_site:<id>for one site) andGET /org/money.pdf?month=2026-08.
Each entry in the Export menu says what it covers in words. The CSV
line names the range and scope on screen, such as Jan – Aug 2026 ·
Whole portfolio. The PDF line names its month and says whole
portfolio · one month, because the statement is always a single
month for the whole organisation. month= on the CSV route
still exports one whole-portfolio month. The menu closes when you press
Escape or click anywhere else.
What the PDF is for
It is an input to an accountant, not a general ledger. The face of the statement says so. Salaries, insurance and finance costs live in the organisation’s accounting system. This file is the energy P&L this platform produced: the verdict, both lenses, the stream breakdown, the grade, and — in a section of its own — the estimated losses.
The losses section is captioned estimated value of avoidable losses — not part of the P&L above. Adding those rows into net would produce a number no accountant will accept. They sit apart so they cannot be mistaken for costs.
The bytes are deterministic: the same org-month, rendered twice, is the same file. That is the same renderer every tax invoice on this platform already uses. This artefact is not an exception.
What the PDF is not
It is not a replacement for the general ledger. It is not a cash-flow statement. It is not a market “position” that sums the market’s internal pots. It does not invent a figure for a month that has no facts — it prints the facts it has, and an empty month is an empty statement, not a zero dressed as a result.
A provisional stamp means documents for this month have not issued yet. It does not mean the numbers are estimates of next month. Settled facts for the current month are still facts; they are not the invoice.
What the CSV contains
Every P&L fact the page counts for the months and scope you
exported, one row each: month, stream, direction, counterparty, entity,
amount_cents, VAT beside it, grade, and the source
references. Where a month’s stream has both invoiced and settled rows,
only the invoiced ones are in the file, because the page counts only
them (§3). A cost row’s
amount_cents is the money paid, positive; net is revenue
rows minus cost rows. The cents in the file are the cents on the screen.
If the Money Room shows R 1,842,000.00 of revenue, the CSV’s
amount_cents for those revenue rows sum to 184200000.
Losses are not in this file. They are not P&L lines. Mixing them in would be the same mistake as adding them on the page.
Careful.
amount_centsis ex-VAT. Panel 3 on the Money Room is gross, because those are payment obligations. The CSV follows the P&L, not the owed/owing panel. VAT sits in its own column so a spreadsheet can add it back; the file never silently includes it.
Export the explanation separately
The PDF includes a captioned Margin bridge section after losses when
bridge rows exist. Its values explain the plan-to-actual difference;
they do not change the P&L totals. The existing Money Room CSV route
accepts section=bridge for book, month, step, signed cents,
grade, plan source, reference series, formula and source references. The
default CSV continues to export P&L facts.
10. How the advisor finds the right corner
When you ask the Money Room a question — why was October so expensive? — the platform does not hand the answerer a warehouse to rummage through. It already knows how your contracts, invoices, settlement periods and market days connect, because it wrote that map in the same run that built the month’s facts. It walks from the things the question names to the small connected neighbourhood that is actually relevant, and that is what gets explained.
The walk cannot leave your organisation, and it cannot leave the month you asked about. Those two bounds are how the answer stays yours.
Where this is taught. The facts the map is drawn from — §3. The dictionary both you and the advisor share — §8. The Money Room page itself — §7. Terms of art for this retrieval pattern live in the platform glossary (GLOSSARY.md); this chapter does not use them.
What the map contains
Each connection is a labelled link with a pointer back to a document, settlement line, or statement. The labels are a closed list, written down here so they cannot quietly grow:
| From | Link | To |
|---|---|---|
| An invoice | bills | a settlement period |
| A settlement period | of | a PPA |
| A PPA | between | its seller, and its buyer |
| A fact | belongs to | a value stream |
| A loss | evidenced by | an adjustment |
| A statement | covers | a trading day |
A link the facts do not support is not written. The map is a by-product of the monthly fact build, not a second pipeline that could drift. A rebuild that changes nothing writes no new links.
What you see when you ask
You type a question. The platform picks the entities the question mentions (an invoice number, a site, a month), walks a few steps along the map, and gathers the figures that already sit on those facts. The draft you read is an explanation of that sliver — cited back to the same documents the Money Room already opens when you click a Rand.
If the advisor is switched off, nothing about the Money Room changes: the five panels, the lineage drawer, and the numbers remain. Finding the right corner is how a question is answered; it is not how the numbers are computed.
How far the walk goes (measured 2026-08-28)
The map is small on purpose: one organisation, one month. On 28 August 2026 a constructed two-organisation month (560 links, 512 things on the map) walked at p50 ≈ 8 ms and p99 ≈ 13 ms. The walk runs on the same Postgres the facts already use. A different store, or a search over the wording of the manual, would only be considered if this walk started to hurt; it does not. That measurement closed the storage question as not needed.
11. Ask the Money Room
The Money Room already shows the month’s numbers. Ask is the box that explains them in this organisation’s own vocabulary, with a citation beside every claim.
The numbers come from the platform. The sentences come from the model. That split is the whole point. Ask never computes a Rand, never rounds one, and never invents one. If a draft mentions a figure the tools did not return, the answer is rejected, not quietly repaired.
Where this is taught. The page Ask sits on — §7. How the advisor finds the right corner of the map — §10. The dictionary both you and the advisor share — §8. Documents a citation may open — V15 · Billing.
11.1 What you can ask
Questions about this organisation’s energy P&L, in plain language:
- Why did October cost more than September?
- What am I losing this month?
- What do I owe, and what is owed to me?
- How did residual supply change?
The box is on /org/money when your organisation has
opted in. It is off by default. When it is off, the
rest of the Money Room is unchanged — the question box is simply not
there.
Every answer is labelled AI-drafted. Read that label as: the platform produced the figures; the model chose the order, the emphasis, and the English.
11.2 What it will refuse — and why refusing is correct
Ask will not guess. Three refusals you should expect:
| Kind | Example | Why refusal is the right answer |
|---|---|---|
| Out of scope | What’s the weather in Cape Town? | That is not this organisation’s P&L. A guess would look like knowledge. |
| Another organisation | What did that other company earn last month? | Own-party is a hard rule. A number about someone else is not yours to see. |
| Malformed | ??? |
An unreadable question is not turned into a confident paragraph. |
Each refusal comes with examples of questions it can answer. That list is the feature, not a consolation: it is how the box teaches its own scope.
11.3 How to read a citation
A citation is a link, not a footnote for atmosphere. It lands on the same existing screen the lineage drawer already opens: a billing document, a contract ledger, a market statement. A citation that cannot be resolved still names the reference rather than pretending to prove the number.
Click the citation. You should land on a page this organisation already sees. If you cannot, the answer is not finished — treat it as a draft.
11.4 Provisional months
When the period on the page is still PROVISIONAL, the answer must say so. Grade chips travel with the numbers into the question. An answer that talks about the current month as if the invoices had already issued is a defect.
11.5 When Ask is unavailable
If the model is off, unreachable, or times out, the Money Room keeps working. The verdict, the waterfall, owed/owing, the Loss Ledger, and the deterministic findings do not depend on Ask. The box either degrades in place (the advisor is unavailable; the figures on this page are still the real ones) or is absent.
No AI call sits on a critical path.
11.6 What the advisor is measured on
Ask does not ship on vibe. An evaluation harness
(WB.Insight.Eval) marks every change against a set that was
written down before anyone ran it:
| Dimension | What a miss means |
|---|---|
| Intent-parse accuracy | The question was sorted into the wrong tool. |
| Retrieval relevance | The neighbourhood or the tools missed the evidence the question needed. |
| Narrative faithfulness | A claim in the answer is not in the evidence. An unsupported claim fails the item — there is no vibe score to lower. |
| Refusal correctness | Its own number. Out-of-scope must be refused; in-scope must not. |
Every Rand figure in an answer must already be a tool result. The citation post-check enforces that structurally; the harness measures what the post-check cannot.
Ground truth for market facts is the published golden day and golden
month (WB.Sawem.Api.ReferenceVectors) — SMP on the 15th,
cascade recovery — not a number someone typed into the test. Org P&L
answers are whatever PnlFact and the tools compute for the
seeded month.
The mock path runs in CI. A prompt or model change is measured, never vibed. A real-model run uses the same set and the same seeds, and records the model id and prompt version. It does not run unless the adapter is selected and this organisation’s flag is on. Default is still off.
11.7 What it will not do
- It will not compute, adjust, or round money.
- It will not answer for another organisation.
- It will not guess when the month failed reconciliation, is still provisional without saying so, or when the fact base simply does not show the thing you asked.
- It will not call a vendor from this page until a legal reviewer has countersigned the data-boundary memo. Until then the sentences you see are the Mock adapter’s, labelled AI-drafted.
- It will not stay on the page when the flag is off. The Money Room itself is unchanged.
12. Where you can improve — findings
The Loss Ledger tells you what you left on the table. A finding is the next sentence: this is a condition you can act on, with the evidence that produced it, and with a Rand that did not come from a model.
The eight classes on this page are the ones the business welcomed (signed-interim, R5). Two others — residual creep, and escalation drift as advice — were left out. Residual premium still produces no loss row. Escalation drift stays on Panel 4 as a loss, not as a recommendation.
Where this is taught. The Loss Ledger those findings rest on — §5. Panel 5 — §7. Ask the Money Room — §11. The lifecycle (proposed through measured) is taught in §12.4.
12.1 What a finding is
A finding is not a guess and it is not a new number. It is a detector saying: this condition fired, here is the evidence, and here is the Rand the Loss Ledger or an existing optimiser already computed.
| Class | What fired |
|---|---|
| Forfeited spill | Spill was given away under a FORFEITED clause |
| Chronic imbalance shape | Uninstructed charge concentrated in the same clock hours — not the monthly total you already see |
| Gate misses | A day-ahead bid missed gate (GATE_MISS_COUNT above
zero) |
| Banking at risk | Banked energy that will expire within 60 days, not energy that already did |
| REC dormancy | REC-enabled contracts with zero certificate revenue — the carbon detectors, aggregated, not rewritten |
| BESS ceiling | Profitable pairs held only by the daily cycle cap |
| Over/under-contracting | The book sits far from the coverage optimum |
| Recon money on the table | Reconciliation variance and open disputes |
Panel 5 today still shows the four deterministic loss kinds (forfeited spill, spill credited at a discount, uninstructed imbalance, expired banking) when the advisor is off. When your organisation opts in, the eight classes above are composed onto the face of the panel — three at a time, the rest collapsed on request. After implementation, estimated and realised sit side by side; a condition that cannot be scored is unmeasurable. The monthly email is opt-in and silent when there is nothing to report.
12.2 Why every finding is evidence-backed
The first question anyone asks is says who? A finding whose evidence does not open an existing screen is not shippable.
Click through. You land on the contract ledger, a settlement line, a document, or a market statement — the same lineage drawer the rest of the Money Room already uses. The Rand on the finding is the loss row or the optimiser figure, copied. The detector does not multiply a rate by a quantity of its own.
Carbon findings (REC dormancy, and the quieter year-end holdings that ride with it) come from the carbon programme’s own detectors. There is one REC-dormancy code path. A second one with a different threshold is how an organisation would get two contradictory recommendations in the same email.
12.3 How to dismiss a finding
A finding the organisation already knows about is noise even when it is correct and valuable. Dismissal is how “obvious” is recorded without teaching the detector to lie.
The rule:
- Per organisation. Another organisation does not see your dismissal, and cannot reach it (not found, never forbidden).
- A reason is required. An empty reason is refused. “We know” is a reason; a blank box is not.
- Identity is the class plus the entity it cites. Dismissing forfeited spill on Sunfields does not silence imbalance on Milltown, and does not silence spill on a different contract.
- It stays dismissed until the underlying condition materially changes — the value moves by more than the configured threshold (25% today, stored as data) or the evidence refs change.
- Dismissal is not a loss-row delete. Panel 4 still lists the loss. You dismissed the advice, not the fact.
Three findings sit on the face of Panel 5 and on the monthly email. The rest collapse behind an “and N more” line and remain available to Ask. Below the R100 materiality floor they are stored, still in the annual total, and suppressed on the panel. Dismissed findings do not occupy a face slot.
12.4 The recommendation lifecycle
A finding is a condition. A recommendation is the sentence that follows: here is what to do, here is why, here is the Rand the detector already computed, and here is a suggested order. The order is AI-proposed — value × confidence × effort, shown as those three parts — so you can disagree with the ranking without distrusting the number. Every recommendation is labelled AI-drafted. The Rand is the finding’s, copied. A model does not adjust it.
The honest next step is sometimes research, not a clause change. That
is a first-class state (UNDER_RESEARCH), not a
recommendation that got stuck at proposed. The specification’s own
example is investigating Eskom buy-back status before amending a spill
clause.
A recommendation moves when a person moves it:
Proposed → under research → accepted → implemented → measured → retired or repeated.
Accepting one does not do the thing. It hands off to the flows you already use: a proposal, an amendment, a bid. A recommendation is advice. The platform never acts on one by itself — it never writes a contract, a bid, or a payment from this page.
When the advisor is off for your organisation, Panel 5 still shows the deterministic findings from the Loss Ledger. The rest of the Money Room does not hide.
Provisional months stay provisional: the grade chip travels onto the recommendation, and the copy says so.
The dismiss control is on the card. A reason is required. Dismissal is still not a loss-row delete — Panel 4 keeps the fact.
12.5 Estimated versus realised
After a recommendation is implemented, the platform does not take its own word for the Rand. The same detector that found the problem runs again on a later month and writes what it now sees beside the original estimate:
estimated R 480 000 · realised R 391 000
The estimate stays. A revised history is not a track record. You can
see both figures on the card
(#money-recommendation-{id}-estimated and
#money-recommendation-{id}-realised) and on the monthly PDF
if your organisation opted in.
Accuracy is kept per method version — the loss method / detector class version on that finding, not a blend of predecessors. If that version repeatedly overshoots, its confidence drops from the observations (the same MAPE / bias discipline the forecast layer already uses). Nobody turns a knob.
Sometimes the later month cannot be scored honestly: the contract is gone, the spill treatment changed for a different reason, or the detector has nothing to look at. That is unmeasurable. It is not a success and not a failure. Leaving it out is how a track record quietly becomes flattering.
The monthly email is opt-in, and it uses the same delivery addresses
already confirmed for invoices. An organisation with no findings
gets no email. A monthly “nothing to report” is how a useful
channel becomes an ignored one. The PDF is byte-deterministic: the same
inputs produce the same bytes. Empty copy is No numbers
yet, never an invented R 0.00.
