← Manual home

V22 · TODOs

Open documentation work for the published manual set — filed by owning volume (V0–V21), each item citing a volume and chapter.

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

  1. 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.

  2. Cite volume + chapter. Every item must name a concrete published section (e.g. V3 §9.4). Volume-root links alone are not enough.

  3. 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)
  4. Register fields: Priority, What, Ref, Already provided, Trigger, First-guess shape.

  5. 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.

  6. 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.

Ref: V2 §4.2 · V2 §4.3

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.

Ref: V4 §8.3 · V4 §8.4

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.

Ref: V4 §3 · V4 §6.1

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.

Ref: V5 §4.10 · hero V5 §4.1

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.

Ref: V5 §7 · verdict V5 §7.1

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.1 Should buyers see a seller price menu before asking? Intermediate

Priority: Intermediate

What: when a buyer starts a proposal, no seller price card exists yet. Decide whether buyers can browse supported shapes (with or without indicative prices) before approaching a plant — or keep decline-and-re-propose as the only path.

Ref: V7 §3.4 · V7 §3.5d · DECISIONS-TODO D2

Already provided: seller-originated studios publish a full price card; buyer-originated path declines with findings when the shape is impossible.

Trigger: repeated buyer asks for shapes the plant cannot deliver.

First-guess shape: publish shapes without prices (nearly free), or seller opt-in indicative prices per plant.

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.4 Decline share defaults — confirm shipped leaning Nice to Have

Priority: Nice to Have

What: M14 marked DECISIONS-TODO D12 ✅ with the shipped leaning (share dealbreakers, hold negotiable; infeasible always shared). Confirm with commercial that those defaults stay, or flip them and re-document §3.5d.

Ref: V7 §3.5d · DECISIONS-TODO D12 ✅

Already provided: structured decline findings with those defaults live.

Trigger: counterparties keep re-proposing the same negotiable miss, or decliners complain they over-disclosed.

First-guess shape: leave defaults; or add a product toggle and update §3.5d.

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.

Ref: V10 §15 · V15

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.

  1. 10:00 SAST D−1 — the SO publishes the demand forecast and reserve requirements for the Trading Day.
  2. 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.

Ref. V17 §6 · V15 §5

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.