1. How to file a TODO
This volume is the open-docs register for the published manual set. It does not teach product screens. It lists work still owed to readers, grouped by the owning product volume (V0–V21).
1.1 Rules
File under the owning volume. Add the item to that volume's chapter in this volume (chapters 2–23). Never create a "V22" TODO bucket — this volume only hosts other volumes' open work.
Cite volume + chapter. Every item must name a concrete published section (e.g. V3 §9.4). Volume-root links alone are not enough.
Grade by priority (colour on the card left rail and chip). Default is Nice to Have (blue) when you are unsure.
Grade Colour When Urgent Red Blocks a seat path, broken teaching, or a live deadline risk Intermediate Yellow Needed soon; ops/readers will feel the gap this quarter Nice to Have Blue Improvement, polish, or future feature docs (default) Register fields: Priority, What, Ref, Already provided, Trigger, First-guess shape.
Empty volumes stay present. If a volume has no open items, keep its chapter with No open TODOs for this volume. so every product volume appears.
Triage quarterly (EVOLUTION §11). Promote finished items out (delete or move to CHANGELOG); add support smells when the same answer is given twice.
1.2 Item template
Copy this block into the owning volume chapter. Pick the card class
that matches the grade: directory-stat--todo-urgent (red),
directory-stat--todo-intermediate (yellow), or
directory-stat--todo-nice (blue — default).
N. Title Nice to Have
Priority: Nice to Have (default)
What: …
Ref: [VN §x.y](vN-….html#…)
Already provided: …
Trigger: …
First-guess shape: …
1.3 Where this sits in the set
| Role | Place |
|---|---|
| Product teaching | V0–V21 volumes |
| Open docs work | This volume (V22) |
| Coverage matrix | COVERAGE.md |
| Author conventions | STYLE.md |
| Cadence / ownership | EVOLUTION.md |
2. V0 · Orientation & Core Concepts
Owning volume: V0 · Orientation & Core Concepts.
2.1 Coverage-drift automation Nice to Have
Priority: Nice to Have
What: a CI check that re-runs the COVERAGE
reconciliation header counts against router.ex /
config.exs and fails when they drift.
Ref: V0 §7 · How to read
this manual (conventions point at the coverage contract) · COVERAGE.md
Already provided: COVERAGE.md
reconciliation header + Matrix 1–4; build.sh
link/anchor/asset checker.
Trigger: a PR that adds a LiveView or Oban worker without a COVERAGE row (twice in one quarter).
First-guess shape: a small mix or
Python script invoked from build.sh --check-only / CI; exit
non-zero on count mismatch or unmapped live routes.
2.2 Print stylesheet fold-in of legacy families Nice to Have
Priority: Nice to Have
What: retire the
@import url("USER-MANUAL.css") dependency by inlining the
six legacy figure families into manual.css (EVOLUTION
growth path only if the import becomes a maintenance hazard).
Ref: V0 §7 · How to read
this manual (shared figure vocabulary) · figure-gallery.html
Already provided: import works; M8 added
print/avoid-break rules for pricing-flow /
tab-sample and siblings.
Trigger:
docs/user-manual/USER-MANUAL.css is deleted or diverges
from the manual set's needs.
First-guess shape: copy the figure blocks into
manual.css Layer 1; drop the import; visual-diff
figure-gallery.html.
3. V1 · The Four Rhythms
Owning volume: V1 · The Four Rhythms.
No open TODOs for this volume.
4. V2 · Entities & Setup
Owning volume: V2 · Entities & Setup.
4.1 Rewrite §4.2 around the onboarding form’s sections Intermediate
Priority: Intermediate
What: V2 §4.2 still walks the six-step Register IPP wizard’s field tables. IPP Sites no longer opens that wizard: Add New Site opens a blank generator-site onboarding form with eight sections (Identity & location · Plant & technology · Connection & network · Metering · Regulatory evidence · Generation profile · Market standing data · Commercial defaults). Re-cut the field guide by section, and check each field against the form.
Already provided: a Careful note at the top of §4.2 says the tables are a field reference; §4.3 teaches the blank form, the first save, progress (N of 6 core sections complete · 2 optional) and the readiness gate.
Trigger: a reader looks for a §4.2 field under a section name that the form uses and cannot find it.
First-guess shape: one table per onboarding section, keeping the §4.2 heading and anchor; move the Step 7 plant-profile notes into Plant & technology.
5. V3 · Strategy
Owning volume: V3 · Strategy.
5.1 Nominations plan detail — UI/docs sync Nice to Have
Priority: Nice to Have
What: bring V3 §9.4 in line with the live Nominations workbench: plan header Applies to (delivery month) and Generated (timestamp, day-month-year + time); Rationale Panel card label; cost-parameters modal (aligned fields, current plan values, field copy, close X, float-safe Decimal coercion).
Ref: V3 §9.4 · The plan detail · V3 §9.4 · ⚙ costs
Already provided: §9.4 rationale field guide and ⚙ costs field guide in the manual; UI already ships the header meta, modal, and panel label.
Trigger: a reader (or acceptance walk) finds the chapter describing an older header/modal without Applies to / Generated, or omits the Rationale Panel label.
First-guess shape: one short PR against
09-nominations-….md — add the meta stamps and modal/panel
labels to the prose; rebuild v3-strategy.html.
5.2 Nominations — warn after the 20th when next month is still unsubmitted Urgent
Priority: Urgent
What: after the 20th of the month, surface warnings for nominated members whose plan for the following delivery month has been proposed (or is due) but is not yet SUBMITTED — so traders see the review gap while the external nomination deadline is still approaching.
Ref: V3 §9 · Nominations · V3 §9.7 · The monthly rhythm
Already provided: monthly worker proposes next month on the 20th at 05:00; workbench lists status (PROPOSED / APPROVED / SUBMITTED); docs teach Approve → Submit before the external deadline. No calendar-driven "still unsubmitted" warning after the 20th today.
Trigger: traders miss next-month submit because PROPOSED plans sit quiet after the worker run, or ops asks for a visible chase list between the 20th and gate.
First-guess shape: Nominations workbench (and optionally Overview) banner or row chip when today ≥ 20th and any nominated member lacks a SUBMITTED plan for next month; document the rule in §9.7; do not auto-submit.
5.3 Landed — from sensitivity to distribution
Already provided: V3 §11.3 now sits VaR tiles
beside Margin@Risk (missing/stale labelled, never R 0.00);
V3
§22 teaches the two confidences, two horizons, expected shortfall,
the fan, alert-only Q6, and the exposure page. No new TODO from stage
12.
6. V4 · IPP Allocation, Forecast & HAF
Owning volume: V4 · IPP Allocation, Forecast & HAF.
6.1 Deep glossary anchors for IPP Explained-in Nice to Have
Priority: Nice to Have
What: retarget glossary "Explained in → V4 · IPP" links from the volume root to the specific chapter that teaches each high-traffic term.
Ref: V4 §1 · What this is (entry) · hub Glossary
Already provided: every Explained-in resolves (volume-level or chapter); legacy IPP-manual links retargeted at M8.
Trigger: readers report hunting inside V4 for a term that only links to the volume root.
First-guess shape: one PR that maps high-traffic IPP terms to chapter anchors; leave low-traffic terms at the volume root.
6.2 Re-derive Forecast August / December against full_demo Nice to Have
Priority: Nice to Have
What: V4 §8.3 / §8.4 still teach the engine receipt
14,208 / 17,500 MWh (same fixtures as IppForecastLiveTest).
Re-derive the Follow-along month on IPP2 Atlantis Wind
(full_demo · seed 42) and stamp the live picker month if it
differs.
Already provided: Pattern, headline grammar, and SB / AES / Fixed 48.8% reading are taught against the stored receipt; the chapter says demo months may differ in absolute MWh.
Trigger: A reader on ipp_2@webill.net
cannot find 14,208 MWh on the seeded Forecast month.
First-guess shape: Re-run the seeded forecast, replace the worked tables if the plant's live month differs, keep the conservation identities.
6.3 Forecast virtual memo rows are not wired Nice to Have
Priority: Nice to Have
What: obligation_cascade can render
italic (virtual) memo rows, but
IppForecastLive does not pass virtual_memos.
§8.1.4 says so. Teach the rows when the LiveView starts passing
them.
Ref: V4 §8.1.4
Already provided: Honesty note that virtual paper does not consume CO or AES and that memo rows are not on the built page today.
Trigger: Forecast starts listing virtual PPAs on
#co-table.
First-guess shape: Add the passed assigns, then one column table and a scenario in §8.6.
6.4 Teach the rest of the site workspace Nice to Have
Priority: Nice to Have
What: V4 §3 maps the site workspace’s five tabs to their chapters, but some panels have no teaching home yet: the Performance fold Measured performance & revenue analysis, the Commercial tab’s open proposals, the Operations plant model and infrastructure views, and Site details are not walked field by field. Contract commitments is taught in §6.1 as a note beside the Sales desk.
Already provided: the tab map, browser-tab titles and Manual targets in §3; Contract commitments’ three estimates in §6.1; Site lifecycle & fleet membership in V4 §2 and V2 §4.8.
Trigger: a reader opens a workspace panel and the Manual link lands on a chapter that does not describe it.
First-guess shape: lettered subsections under §3 (for example §3.5A) per panel, each with its ids and empty states.
7. V5 · OffTaker
Owning volume: V5 · OffTaker.
7.1 Re-derive Midrand Overview snapshot Rand Nice to Have
Priority: Nice to Have
What: V5 §4.10 teaches Performance labels and the
Megaflex / escalation / landed-cost arithmetic (210 / 128 / 95 c, 12
%/yr, 40 c spill, Yr 5 = 201.4 c) against the running LiveView, but does
not stamp OffTaker C Midrand DC’s latest sealed Saving vs
all-grid / Over-contract cost compact Rand
from a live full_demo page.
Already provided: Click path, how to read the hero, mix, load chart (Typical vs Tomorrow), actions, wedge, empty/missing-rates states, and the chart formula. The chapter says snapshot Rand moves with the latest forecast.
Trigger: A reader on
offtaker_c@webill.net wants the exact compact Rand on
Midrand DC Overview written into the worked example.
First-guess shape: Open Midrand DC → Overview on
full_demo · seed 42 after a fresh Run Forecast
Now, replace the §4.10 roll-up with those compact figures, keep
the 128 / 103 / 201.4 c arithmetic.
7.2 Re-stamp Midrand Dashboard lifetime figures Nice to Have
Priority: Nice to Have
What: V5 §7 still quotes the seeded Midrand DC Dashboard as of 3 September 2026 (15.5 GWh, 99 % grid at 190 c, R 29.4 m paid, R 4.8 m left on the table, waterfall 0.1 %, outlook R 26.8 m → R 47.2 m). Those lifetime totals move as the demo clock and settlement grades roll.
Already provided: How to read the four verdict facts, the served timeline, the sources badges, the waterfall, the left-on-the-table ledger, the three outlook paths, the six vitals, and the ranked next moves. Grade chips and the SAWEM-as-model rule are taught.
Trigger: A reader on
offtaker_c@webill.net finds the lifetime Rand / GWh on
Dashboard no longer match the stamped figures.
First-guess shape: Open Midrand DC → Dashboard on
full_demo · seed 42, replace the stamped totals and the “as
of” date, keep the reading rules.
7.3 Re-stamp Midrand Procurement Option 0 Nice to Have
Priority: Nice to Have
What: V5 §6 still quotes the Midrand uncovered block as 5.7 GWh a year, 39 % of load, 06h–16h, Option 0 R 10.7 m this year / R 18.9 m by year 6 (last re-derived 2026-09-03). The uncovered vector moves with the latest forecast run.
Ref: V5 §6
Already provided: How to read the need chart, Option 0, candidate signals, simulation verdict, and the compare table. The 128 / 103 / 25 c / 63 c money reminder is independent of the block size.
Trigger: A reader on
offtaker_c@webill.net finds Option 0 or the block size no
longer match the stamped figures.
First-guess shape: Open Midrand DC → Procurement on
full_demo · seed 42, replace the headline GWh / % / Option
0 Rand, keep the reading rules.
8. V6 · Trader
Owning volume: V6 · Trader.
No open TODOs for this volume.
9. V7 · The Deal Room
Owning volume: V7 · The Deal Room.
Open product decisions that affect Deal Room teaching cover Physical, Virtual, and cross-instrument choices (X1–X8). Engineering-only items stay off this page; user-visible choices are mirrored below so they surface in the manual backlog.
Settled (do not re-open as open todos): Spec §17 V1 — parties choose settlement volume basis per deal, no silent default (DECISIONS-V V1 ✅); Spec §17 V6 — Virtual Supply sims suppress physical saving figures (DECISIONS-V V5 ✅); X3 — cross-instrument counter inherits renewal budget, fresh expiry window (MX4 Step 4 ✅); X4 — no system instrument tie-break (bridge names the conflict); X6 — both instrument slices carry as suggestions on counter (MX1 ✅).
7.0 Send-gate advisories left non-blocking Nice to Have
Priority: Nice to Have
What: Eskom / VWA buyer-site blockers remain
advisory on compose and do not refuse
send_proposal (M6). Revisit if operations want them
hard-gated at dispatch.
Ref: V7 §3.4.1 · Before you can send
Already provided: missing / incoherent / hard constraints and unacknowledged seller warnings block send at action level.
Trigger: support sees drafts sent that cannot wheel under Eskom VWA rules.
First-guess shape: promote selected VWA blockers
from advisory to :incoherent once the studio checklist
(M7/M8) surfaces them clearly.
7.2 Independent-engineer size bands Nice to Have
Priority: Nice to Have
What: pin the megawatt / contract-value bands that switch shortfall and curtailment verification from seller self-report → IE quarterly → IE monthly.
Ref: V7 §4.7 · Terms · DECISIONS-TODO D3
Already provided: advisors recommend a verification cadence; bands are still interim.
Trigger: finance teams reject self-reported shortfall on large deals, or small deals refuse IE cost.
First-guess shape: two commercial thresholds reused for curtailment and reporting rigour.
7.3 Capacity-knee risk fraction Intermediate
Priority: Intermediate
What: the capacity sweep recommends a MW "knee" using an interim 50% marginal-gain fraction. Commercial should pick the risk appetite that sets recommended deal size on both seats.
Ref: V3 §8 · V7 §3.4 · DECISIONS-TODO D10
Already provided: knee is computed and shown in brief evidence / studios; fraction is a module default pending D10.
Trigger: recommended MW systematically too aggressive or too timid vs desk practice.
First-guess shape: show recommended size at two or three fractions on real books, then freeze one default (possibly per seat).
7.5 Seller floor margin above cost Intermediate
Priority: Intermediate
What: the LCOE floor already blocks below-cost quotes; knowingly-thin warns. Pin the minimum margin above cost that defines the floor (global or per plant).
Ref: V7 §3.4.1 · V4 §6.4.1 · DECISIONS-TODO D13
Already provided: below-LCOE blocks send/accept; thin margin warns.
Trigger: sellers blocked from rational first-customer pricing, or desks quoting at break-even.
First-guess shape: commercial/finance default %; optional per-plant override on the book.
7.6 Retire the proposal list modal? Nice to Have
Priority: Nice to Have
What: compose and review now live in full-page studios; the list pop-up still serves sent/historical read-back. Decide whether it is retired after studios have real use.
Ref: V7 §3.4.2 · DECISIONS-TODO D15
Already provided: studios are the compose/review home; modal kept for sent / completed phases.
Trigger: two surfaces drift, or support cannot tell which UI is authoritative.
First-guess shape: product call after studios are in production use; document the surviving surface in §3.6.
7.7 Re-propose vs renewal limit — confirm shipped rule Nice to Have
Priority: Nice to Have
What: M14 marked DECISIONS-TODO D16 ✅ — re-propose
inherits renewed_count /
max_renewals (does not reset). Confirm with product and
spell the rule in §3.2 / §3.5d so a blocked path is explainable.
Ref: V7 §3.2 · V7 §3.5d · DECISIONS-TODO D16 ✅
Already provided: inherit behaviour in
Proposal.repropose / Changes.Repropose.
Trigger: users blocked after expiry→re-propose, or ask to reset the budget.
First-guess shape: document the inherit rule; only change if product wants a separate re-propose budget.
7.8 Deep glossary anchors for Deal Room Explained-in Nice to Have
Priority: Nice to Have
What: retarget glossary "Explained in" links that land on the Deal Room volume root to the specific chapter that teaches each high-traffic term.
Ref: V7 §6 · The contracts register · hub Glossary
Already provided: every Explained-in resolves (volume-level or chapter); legacy deal-room links retargeted at M8; M14 added Deal Room term anchors (target, price card, review draft, decline finding, re-propose).
Trigger: readers report hunting inside V5 for a term that only links to the volume root.
First-guess shape: one PR that maps high-traffic deal terms to chapter anchors; leave low-traffic terms at the volume root.
7.9 Matched-fraction warn threshold Intermediate
Priority: Intermediate
What: pin how low the matched fraction may go before the system warns loudly on compose, send, and the virtual wizard (buyer approving Generated settlement). Must warn, never block — a buyer may accept poor match for RECs.
Ref: V7 §3.4.1 · V7 §4.3 · V7 §9 · DECISIONS-V V6 · Spec §17 V3
Already provided: interim threshold 0.50; low-match ack on dispatch; buyer GENERATED interrupt in the wizard.
Trigger: warnings fire on deals desks consider fine, or bad matches sign quietly.
First-guess shape: commercial picks a fraction (and whether REC-led deals get a softer copy).
7.10 Strike ladder — always both rows? Intermediate
Priority: Intermediate
What: confirm that sellers always publish flat and time-of-use strike rows (shipped leaning), or may publish one structure only.
Ref: V7 §3.4b · V7 §9 · DECISIONS-V V7 · Spec §17 V4
Already provided: two-row public ladder; floors stay private on the brief.
Trigger: buyers cannot compare offers, or sellers refuse to disclose TOU shape.
First-guess shape: keep both rows; optional seller toggle later if needed.
7.11 Trader VWA eligibility for virtual Nice to Have
Priority: Nice to Have
What: confirm whether traders need Eskom virtual-wheeling registration. Today only off-taker / generator sites are checked.
Ref: V7 §3.4.1 · DECISIONS-V V2 · Spec §17 V2 · G2
Already provided: site-level VWA / CUOSA gates; trader path skips them.
Trigger: a trader-sided virtual deal cannot activate at Eskom, or legal confirms traders need no VWA state.
First-guess shape: document the exemption, or add trader blockers.
7.12 GENERATED_WITH_FLOOR — define the floor Nice to Have
Priority: Nice to Have
What: define units for settlement basis
GENERATED_WITH_FLOOR (% of generation, matched-fraction
threshold, or absolute MWh), or drop the value until a real deal needs
it.
Ref: V7 §4.7 · DECISIONS-V V8 · Spec §17 V1 residual
Already provided: enum value exists; parties can select it; floor meaning is not commercialised.
Trigger: a desk asks to sign the third basis, or support cannot explain it.
First-guess shape: drop from UI until defined; keep enum for forward compat.
7.13 Contracts register — document generation Nice to Have
Priority: Nice to Have
What: document the (or land) contracts-register document generation capability that the published chapter already flags as not yet built.
Ref: V7 §6 · The contracts register
Already provided: register UI and honest "not yet built" note in the chapter — no document generation ships today.
Trigger: product ships generate/download, or support keeps asking where the PDF/contract pack is.
First-guess shape: when the feature lands, replace the placeholder note with a worked follow-along (seat, path, expected file); until then keep the honest boundary and this TODO.
7.14 Materiality floor for Physical vs Virtual Intermediate
Priority: Intermediate
What: pin commercial floors (Rand/year and % of
contract value, plus term sensitivity) that decide when the instrument
difference is large enough to show on Gaps / enable Counter. Today three
interim constants live in InstrumentComparison.
Ref: V7 §3.4c · V7 §3.5b · PHYSICAL-VIRTUAL-GAP X1
Already provided: silence below threshold on review; compose still shows both verdicts; Decide counter absent when immaterial.
Trigger: desks treat the line as noise, or miss a real edge.
First-guess shape: dual floor (R/yr + %) with a term multiplier; keep constants in one module until commercial signs off.
7.15 Labelled estimate of the other side’s instrument verdict Nice to Have
Priority: Nice to Have
What: confirm shipping the counterparty estimate on compose Instrument (disclosed terms only, mandatory “estimate” label). Recommended answer taken for MX2/MX3; still a product/commercial sign-off.
Ref: V7 §3.4c · PHYSICAL-VIRTUAL-GAP X2
Already provided: estimate rendered and labelled; never reads the other org’s brief.
Trigger: parties complain of anchoring, or want the estimate removed.
First-guess shape: keep labelled disclosure (matches RequestedJointTerms precedent); optional org preference later.
7.16 Seller comparison vs plant LCOE Intermediate
Priority: Intermediate
What: confirm the seller-side Physical vs Virtual comparison should keep using the physical margin-over-LCOE assumption on every seller verdict (bias sign unknown until commercial answers).
Ref: V7 §3.4c · PHYSICAL-VIRTUAL-GAP X5
Already provided: assumption line on seller verdicts; buyer path unchanged.
Trigger: sellers reject the comparison as unfair, or underwrite a different floor.
First-guess shape: keep interim assumption labelled; replace when commercial sets the rule.
7.17 Trader pairs — no instrument comparison yet Nice to Have
Priority: Nice to Have
What: instrument comparison for trader-sided deals is blocked until trader VWA / physical path confirmation (V2). Availability already refuses unconfirmed instruments.
Ref: V7 §1.1 · PHYSICAL-VIRTUAL-GAP X7 · DECISIONS-V V2 · todo 7.11
Already provided: unknown/blocked buttons with reason; no fake comparison.
Trigger: V2 lands trader eligibility, or product wants a labelled partial comparison sooner.
First-guess shape: wait on V2; do not invent trader registration state.
10. V8 · Settlement
Owning volume: V8 · Settlement.
| Priority | TODO | Notes |
|---|---|---|
| M | Persist chain_reconciliation_results + restore §10.3
“writes an inspection result” |
Unlocks month-on-month chain health |
| M | MO cross-party chain board | Needs Phase 2 persistence |
11. V9 · Market Operations
Owning volume: V9 · Market Operations.
Stage 9 landed V9 §19 (the vesting instrument, hedged versus merchant, the declining curve). No open TODOs for this volume.
12. V10 · Organization Market Bidding
Owning volume: V10 · Organization Market Bidding.
10.3 Billing field-by-field at Market grain Nice to Have
Priority: Nice to Have (default)
What: V10 §15 maps the filing cabinet. Every Received-table action, Issued document, Sites row and Analyze control is still cursory. Accounts is now field-by-field in V10 §14.
Already provided: Six Billing tabs, Market roll-up pointer, bridge to V13.
Trigger: finance asking “which button on Received is this?”
First-guess shape: expand §15 the way V8 §14 taught the wallet — every control in ordinary English.
13. V11 · Market Operator
Owning volume: V11 · Market Operator.
Stage 9 extended V11 §21 with the Vesting tab and §21.13. The MGC republish item below is unchanged.
11.1 MGC must republish the market cap and reserve floors from time to time Intermediate
Priority: Intermediate
What: the Market Governance Committee must publish, and later republish, the Market Price Cap and the four reserve floor prices (Regulating Up, Regulating Down, Instantaneous, Ten-Minute). Those bounds are not the auction. They sit on the rulebook and they go stale. The Code treats the cap as tariff-derived; a commencement figure shipped once is not a standing determination.
Ref: V11
§2 · V11
§6.1 · V11
§6.4 · V11
§6.5 · V11 §25 · V9 §17
([D-18] / Annexure 2)
Already provided: V9 §2 names the MGC as the seat
that publishes the cap and the floors. V9 §6.1 / §6.4 / §6.5 teach that
those numbers bound the auction. /mo/rules
already has the compose → review → confirm ceremony, with
Determined by defaulting to MGC determination.
Shipped commencement (tests): effective 2026-01-01, cap
R 5,396.40/MWh, reserve floors R 50 / R 50 / R
50 / R 0.
Trigger: a tariff determination, an Annexure 2 revision, or an MGC meeting that changes the cap or any floor. Until a new Rules version is published, every solve keeps hashing the 2026-01-01 commencement values. A published R 5,396.40 that is only a leftover figure cannot be told apart from a fresh determination.
First-guess shape: an MGC standing item — at least
at each tariff determination, and otherwise when the committee revises
Annexure 2. The Market Operator then publishes a new parameter
version on /mo/rules (effective from a named date)
that writes the new cap and the four floors. Teach that cadence on V9
§25; do not invent a second kitchen. A Cadence reminder is enough; a
silent rollover of last year’s cap is not.
14. V12 · Systems Operator
Owning volume: V12 · Systems Operator.
12.1 SO day-ahead publish cron — 10:00 demand/reserves and 13:30 interconnect Urgent
Priority: Urgent
What: implement two System Operator Oban cron jobs
that publish the day-ahead facts the Market Operator’s Daily
lights wait on. Today those facts arrive only when a client
PUTs /internal/so/:input/:trading_date. There
is no SO worker. Without a clocked publish the 10:00 and 13:30
pigeonholes stay empty, then Late, and the 14:00
schedule publication is at risk.
- 10:00 SAST D−1 — the SO publishes the demand forecast and reserve requirements for the Trading Day.
- 13:30 SAST D−1 — the SO publishes the interconnection schedule for the Trading Day.
Ref: V12 §1.4 · How it works with the Market Operator · V21 §3.3 · Cron cards · V11 §14 · Cadence
Already provided: V10 §1.4 teaches the three traffic
lights and the 10:00 / 13:30 D−1 deadlines. The persist path already
exists (PUT /internal/so/demand-forecast/:trading_date,
/internal/so/reserve-requirements/:trading_date,
/internal/so/interconnection-schedule/:trading_date →
SoInputs.put/4). MO DamCadence cron at 10:00
SAST closes the DAM gate — it does not publish SO
facts. SO-SPEC §1.1 names publish_demand_forecast (and
siblings) at those clocks; no Elixir worker implements them.
Trigger: Daily #so-input-demand /
#so-input-reserves / #so-input-interconnect
stay Unknown then Late unless a human or test client PUTs by hand.
Constrained clear after 13:30 and 14:00 publish cannot assume the SO has
spoken.
First-guess shape: two Oban cron lines (UTC = SAST −
2): {"0 8 * * *", …} publishes demand + reserves;
{"30 11 * * *", …} publishes interconnect. Each job writes
the same /internal/so/:input store the MO already reads —
not a second kitchen. Document both cards on V19 §3.3; bump the cron
count in COVERAGE.md Matrix 3. Cadence / Daily
lights should flip Present when the jobs run on
time.
15. V13 · Market API
Owning volume: V13 · Market API.
No open TODOs for this volume.
16. V14 · Scenario Lab
Owning volume: V14 · Scenario Lab.
No open TODOs for this volume. Stochastic mode landed as V14 §17: a rehearsal
on /org/sim that never persists a
RiskDistributionSnapshot against the book.
17. V15 · Billing
Owning volume: V15 · Billing.
No open TODOs for this volume.
18. V16 · Analytics
Owning volume: V16 · Analytics.
The Money Room is live at /org/money (V16 §7): five panels,
lineage drawer into existing screens, P&L statement PDF and fact CSV
(V16
§9). MQ0–MQ3 have landed. MK4 landed the eval harness and the Mock
pilot record; the two-week QuestionLog review remains open.
Phase P2’s own exit test — a named non-technical person answering Q1 and Q2 for a month of their choosing and drilling one figure to a document, unassisted — could not be run in this Cloud Agent environment. No participant is invented. That session remains an open TODO and is the requirements list for the next iteration.
16.1 Unassisted P2 exit session Urgent
Priority: Urgent
What. Run the specification’s P2 exit test with a named person who has not seen the Money Room: they answer Q1 and Q2 for a month of their choosing and drill one figure to a document, unassisted. Record what they could not do. Do not invent a participant name.
Ref. V16 §7
Already provided. The page, the drawer, the PDF and CSV, the V14 chapters.
Trigger. A named non-technical participant is available outside this Cloud Agent environment.
First-guess shape. A written record of the session, filed against §7, becomes the next iteration’s requirements. A self-assessment by the implementer does not count.
16.2 Two-week QuestionLog review Urgent
Priority: Urgent
What. After Ask has been on for one pilot
organisation for two weeks, read that organisation’s
QuestionLog. What people actually asked is the requirements
document for the next iteration. Summarise it into the backlog. Record
disappointments. Do not invent a participant name.
Ref. V16 §11
Already provided. The eval harness, the Mock CI path, verbatim Mock answers, the per-org flag (off by default).
Trigger. A named pilot organisation has had the flag on for two weeks, outside this Cloud Agent environment.
First-guess shape. A written review filed against §11. A self- assessment of the Mock set does not count.
19. V17 · Virtual Wheeling
Owning volume: V17 · Virtual Wheeling.
Priority. Nice to Have
What. Confirm the municipal off-taker narrative against a live Munix officer walkthrough once a municipal seat is asked to sign off revenue-neutrality wording. Update §10 if the wording changes.
Ref. V17 §10
Already provided. Chapter 10 states the product case; the demo portfolio enrols one municipal meter.
Trigger. A municipal officer reviews the volume.
First-guess shape. A follow-along paragraph in the Munix seat, not a new chapter.
Priority. Nice to Have
What. PDF layout of the consolidated refund when rendering capacity is scheduled. Stage 8 issues a numbered, immutable credit note; the artifact is bytes plus a hash, not a designed page.
Already provided. Numbering, grain, and immutability rules.
Trigger. Billing PDF capacity is scheduled for VW refunds.
First-guess shape. A renderer that consumes
VwRefundStatement meters JSON; do not invent a second
document.
20. V18 · Regional Trading
Owning volume: V18 · Regional Trading.
Priority. Nice to Have
What. Replace the illustrative S18 sponsor with a
named operating member once membership under :SPONSORED or
:DIRECT is a commercial fact. The sponsor is already data
on the participation profile; this is a seed-label change, not a client
change.
Ref. V18 §1
Already provided. Channel is configuration; sponsor is a profile attribute; demo labels the sponsor illustrative.
Trigger. SAPP membership is signed.
First-guess shape. A data change on the seeded participation profile; no new code path.
Priority. Nice to Have
What. Swap :sapp_client and
:fx_provider to live adapters when the Coordination Centre
interface and rate feed are reachable. Conformance tests already pin the
mock default.
Ref. V18 §7
Already provided. Behaviours, mocks, config defaults, transport-pin test.
Trigger. Live credentials and a conformance run against the CC.
First-guess shape. Two adapter modules behind the existing behaviours.
21. V19 · Carbon
Owning volume: V19 · Carbon.
Priority. Intermediate
What. CS1 regulatory & eligibility findings (and VAT opinion C1) are not in the repo. Offset mechanics, the venue, the tax pack and origination all ship with recorded-not-inferred eligibility and interim VAT constants. Do not treat a live retirement as a filed COAS offset, a live venue trade as finally rated, or a live July pack as filing copy until CS1 lands.
Ref. V19 §14 · V19 §15 · V19 §20 · V20
Already provided. Mechanics, write-time guards, V17
and V18 chapters stating the gap. CS2 closed by CT3. CS3 remains pinned
interim by launch_gate_test.exs.
Trigger. CS1 findings committed.
First-guess shape. Replace interim constants and re-pin tests.
22. V20 · Carbon Tax Compliance
Owning volume: V20 · Carbon Tax Compliance.
The open CS1 eligibility / VAT item that also blocks the July pack is filed under V19 · Carbon — it is one finding, two volumes.
No exclusive open TODOs for this volume.
23. V21 · Operations & Administration
Owning volume: V21 · Operations & Administration.
10.1 Support-driven FAQ additions Nice to Have
Priority: Nice to Have
What: promote repeated support answers into the troubleshooting FAQ.
Ref: V21 §7 · Troubleshooting & FAQ
Already provided: V19 §7 FAQ scaffold (16 entries).
Trigger: the same answer given twice in support and not already in the manual (EVOLUTION §11).
First-guess shape: one FAQ row + glossary term if a new term of art appears; link from the owning volume if the smell is screen-specific.
10.2 Eskom app — contract route placeholders Nice to Have
Priority: Nice to Have
What: replace or further document the Eskom
/eskom/virtual-contracts and
/eskom/wheeling-contracts placeholder shells when product
lands a real register — or keep the boundary crisp if they remain
non-features.
Ref: V21 §1.1 · Know the boundary before you edit
Already provided: honest placeholder note; agreements taught in V7; monetary result in V8.
Trigger: product ships a real Eskom contracts surface, or readers keep treating the placeholder routes as a PPA register.
First-guess shape: either remove/redirect the routes and rewrite §1.1, or document the new screens with follow-along seats when they exist.
10.3 Munix app — wheeling route placeholders Nice to Have
Priority: Nice to Have
What: replace or further document Munix
/munix/wheeling-contracts and
/munix/wheeling-charges placeholders when product lands
those surfaces.
Ref: V21 §2.4 · Know what is deliberately absent
Already provided: honest "deliberately absent" section; tariffs/charges workflows in §2.3; participation status vs tariff readiness distinguished.
Trigger: product ships Munix wheeling-contract or wheeling-charge screens, or support confuses placeholders with Eskom loss-factor editing.
First-guess shape: rewrite §2.4 into real workflows with follow-along when the routes leave placeholder state; until then keep the boundary and this TODO.
