← Manual home

V16 · Analytics

The Money Room — one page for the organisation P&L, from the documents, not from a guessed zero.

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

  1. This chapter — what V14 is for, and what it is not (a general ledger, a chart zoo, a place that invents zeros).
  2. Value streams — the fourteen activities a Rand can belong to (§2).
  3. Where the numbers come from — a fact, a grade, ex-VAT (§3).
  4. When they refresh — the 1st-of-month chain, and why nothing here is live (§4).
  5. Money left on the table — the Loss Ledger, never added to the P&L (§5).
  6. How the numbers prove themselves — the gate, and why a missing month is better than a wrong one (§6).
  7. The Money Room — /org/money: the five questions, the panels, clicking a figure for its lineage (§7).
  8. The vocabulary — the dictionary generated from the code (§8).
  9. Exports and the P&L statement — the PDF you file, the CSV of the facts, and what neither of them is (§9).
  10. How the advisor finds context — when Ask ships (§10).
  11. Ask the Money Room — the question box, off by default (§11).
  12. 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, password supersecret). 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_charge is 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/money are 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:

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:

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) and GET /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_cents is 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:

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

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:

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.