Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
6af0647
Add EPMC residual allocation and make allocation method explicit
jpvelez Mar 26, 2026
cccd1d4
Read run_includes_subclasses and residual_allocation from sheet
jpvelez Mar 26, 2026
35cbb42
Comment out peak residual allocation instead of silently omitting
jpvelez Mar 27, 2026
529c299
Merge branch 'main' into add-epmc-residual-allocation
jpvelez Mar 27, 2026
47ecc27
Fix compute-rev-requirements to compute both BAT_percustomer and BAT_…
jpvelez Mar 27, 2026
f18e064
Remove cross_subsidy_col from compute-subclass-rr Justfile recipes
jpvelez Mar 27, 2026
e76dad7
Fix polars tmp dir bug
jpvelez Mar 27, 2026
1b2b023
New rie_hp_flat tariffs
jpvelez Mar 27, 2026
0e3d921
Brand new rie_hp_nonhp_flat tariffs
jpvelez Mar 27, 2026
3e423dc
Slight numerical changes
jpvelez Mar 27, 2026
a1fde82
New subclass_rr for rie split by residual allocation method
jpvelez Mar 27, 2026
081b275
Add heating_type_v2 column and informational breakdown in RR YAML
jpvelez Mar 27, 2026
304c5cb
Merge branch 'add-epmc-residual-allocation' of https://github.com/swi…
jpvelez Mar 27, 2026
8564dac
Add heat_type_breakdown to rie subclass rr yaml
jpvelez Mar 27, 2026
6c232e1
Merge branch 'main' into add-epmc-residual-allocation
jpvelez Mar 27, 2026
8e47bae
Renegerate ny scenarios
jpvelez Mar 27, 2026
63df324
cenhud and rge hp_nonhp_flat
jpvelez Mar 27, 2026
ec0d492
Add build-all-master recipe to RI Justfile
jpvelez Mar 27, 2026
7f2bb78
Add build-all-master recipe to NY Justfile
jpvelez Mar 27, 2026
cbf5e22
Separate delivery and supply allocation methods in subclass RR YAML
jpvelez Mar 27, 2026
57761c8
[agents] cursor latex rendering
jpvelez Mar 29, 2026
9676042
Settings: make cursor pyright evaluate fewer files
jpvelez Mar 29, 2026
d7985ec
Merge branch 'add-epmc-residual-allocation' of https://github.com/swi…
jpvelez Mar 29, 2026
097a404
Add EPMC and supply allocation context doc
jpvelez Mar 29, 2026
f7a845f
Add supply and delivery residual allocations to RIE scenarios
jpvelez Mar 29, 2026
f87845d
Fix framing of architecture change in EPMC context doc
jpvelez Mar 29, 2026
e0c6b7d
Fix framing of architecture change in EPMC context doc
jpvelez Mar 29, 2026
71cb4de
[context] Add NRRI paper on TOU design methods
jpvelez Mar 29, 2026
b1fc324
Merge branch 'add-epmc-residual-allocation' of https://github.com/swi…
jpvelez Mar 29, 2026
b69d06c
New rie_hp_nonhp_flat starting points... these are just copies of rie…
jpvelez Mar 29, 2026
c86ec46
Merge branch 'add-epmc-residual-allocation' of https://github.com/swi…
jpvelez Mar 29, 2026
7426f7e
Rename compute-rev-requirements, uncomment runs 17-20
jpvelez Mar 29, 2026
6b7b16a
New percustomer/epmc/volumetric/passthrough subclass rr for RIE
jpvelez Mar 29, 2026
9130783
[agents] instruct agents not to accidentally render latex in cursor chat
jpvelez Mar 29, 2026
fe9ecfc
[context] Figure out why passthrough isn't necessarily lower than vol…
jpvelez Mar 29, 2026
0683338
New calibrated flat supply that fixes the EPMC-related bug
jpvelez Mar 29, 2026
21aac72
Move notes on residential charges in RI and NY to context/methods
jpvelez Mar 30, 2026
cdb20a7
Add Claude research note on RI's LRS charges and what costs they recover
jpvelez Mar 30, 2026
99adaf0
Install chromium so website-diff can parse plotly plots
jpvelez Mar 30, 2026
1b5bff2
Add comments to rie monthly rates based on looking at RIE charges sum…
jpvelez Mar 30, 2026
b97708e
Merge branch 'add-epmc-residual-allocation' of https://github.com/swi…
jpvelez Mar 30, 2026
f4714f1
Fix bug in fetch monthly rates scripts that was counting credits as d…
jpvelez Mar 30, 2026
cb5d945
Add comments to rev_requirement/<utilty>.yml
jpvelez Mar 30, 2026
739371c
Fix rie rr from rate case from 241M to 171M, reclassify charges to ad…
jpvelez Mar 30, 2026
f79cc71
Regenerate rie default, flat, nonhp_default and nonhp_flat based on n…
jpvelez Mar 30, 2026
8ea3463
Remove annoying lack of newline in create-seasonal-tou-tariff
jpvelez Mar 30, 2026
983267e
New subclass_rr and calibrated rates
jpvelez Mar 30, 2026
b37105d
Merge branch 'main' into add-epmc-residual-allocation
jpvelez Mar 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,15 @@
"**/config/rev_requirement/**",
"dev_plots",
"infra"
],
"cursorpyright.analysis.diagnosticMode": "openFilesOnly",
"cursorpyright.analysis.exclude": [
"run_logs",
"**/config/tariffs/**",
"**/config/scenarios/**",
"**/config/tariff_maps/**",
"**/config/rev_requirement/**",
"dev_plots",
"infra"
]
}
4 changes: 4 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,10 @@ Match existing style: Ruff for formatting/lint, **ty** for type checking, dprint

**LaTeX in markdown:** GitHub's MathJax renderer does not support escaped underscores inside `\text{}` (e.g. `\text{avg\_mc\_peak}` will fail). Use proper math symbols instead: `\overline{MC}_{\text{peak}}`, `MC_h`, `L_h`, etc. Bare subscripts and `\text{}` with simple words (no underscores) are fine.

**LaTeX in Cursor chat:** When running inside Cursor, use `$$...$$` for display math and `$...$` for inline math. Cursor's chat renderer does not support `\[...\]` or `\(...\)` — the backslashes are consumed by the markdown parser, leaving bare brackets that the math renderer ignores.

**Currency dollar signs in chat:** Cursor's chat renderer treats `$...$` as LaTeX math delimiters. A bare `$` used for currency (e.g. `$1.4M`) will pair with the next `$` on the same or a later line, and everything in between renders as garbled math. **In chat output, always wrap ANY bare `$` in backticks** — not just obvious currency amounts like `$1.4M` and `$6/month`, but also unit notations like `$/kWh`, `$/month`, `$/day`, and any other string containing `$`. If it has a dollar sign and it's not LaTeX math, it needs backticks. This only applies to Cursor chat responses — `.md` files committed to the repo should use bare `$` for currency as usual.

## Code Quality (required before every commit)

- Run `just check` — no linter errors, no type errors, no warnings
Expand Down
25 changes: 14 additions & 11 deletions context/README.md

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions context/code/orchestration/run_orchestration.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ all-pre (create-scenario-yamls, create-electric-tariff-maps-all, validate-confi
├─ run-1 (precalc default, delivery)
│ │
│ ├─ compute-rev-requirements ← computes differentiated rev requirement YAML from run-1 BAT output
│ ├─ compute-subclass-rev-requirements ← computes differentiated rev requirement YAML from run-1 BAT output
│ │ (needed by runs 5, 6, 9, 10, 13, 14 -- all multi-tariff precalc runs)
│ │
│ ├─ run-3 (default calibrated, delivery) ← copies calibrated tariff from run-1
Expand Down Expand Up @@ -265,7 +265,7 @@ RDP_BATCH=ny_20260305c_r1-8 just run-subset 1,2,5,6
```

Delegates to `run-<N>` recipes, so dependency logic (copy calibrated tariffs,
etc.) is preserved. Note: `compute-rev-requirements` is not auto-inserted; if
etc.) is preserved. Note: `compute-subclass-rev-requirements` is not auto-inserted; if
the subset spans runs 1-2 and 3+, run it separately.

## Monitoring
Expand Down Expand Up @@ -346,5 +346,5 @@ end-to-end wall time (see Parallel tracks below).
pairs (6 waves of 2), each pair using half the available CPUs. This beats the sequential
strategy when T4/T8 < 1.8 (see `cairo_parallelism_and_workers.md` for measured ratio).
File conflicts: none — each wave pair writes to distinct tariff files and timestamped S3
output directories. The `compute-rev-requirements` step remains serial between wave 1 and
output directories. The `compute-subclass-rev-requirements` step remains serial between wave 1 and
wave 2 (it reads run-1 output and is fast; runs 5, 6, 9, and 10 all depend on it).
97 changes: 97 additions & 0 deletions context/domain/marginal_costs/ri_supply_cost_recovery.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# Rhode Island Energy's Last Resort Service Rate, Dissected

Rhode Island Energy's residential Last Resort Service rate — the default electricity supply price for customers who haven't chosen a competitive supplier — comprises exactly **four volumetric components** totaling **14.770¢/kWh** for winter 2025–2026. Each component serves a distinct cost-recovery function, from wholesale power procurement to renewable energy compliance. The rate is governed by RIPUC Tariff No. 2096, changes on a seasonal schedule (April 1 for summer, October 1 for winter), and is designed as a pure pass-through: RIE earns no profit margin on any component.[^1] Understanding how these pieces fit together reveals a carefully layered system of forecasting, competitive procurement, and annual reconciliation.

## The Base LRS Charge funds wholesale power through laddered solicitations

The Base LRS Charge is the dominant component, set at **13.408¢/kWh** for winter 2025–2026 and **8.706¢/kWh** for summer 2025 — a seasonal swing that mirrors New England's wholesale electricity market, where winter natural gas constraints drive prices far above summer levels.[^2]

RIE does **not** self-supply by purchasing directly from ISO-NE markets. Instead, it procures **Fixed-Price Full-Requirements (FPFR) load-following service** from wholesale suppliers through quarterly competitive solicitations (RFPs) managed by PPL Services Corporation.[^3] Under these contracts, winning suppliers take responsibility for energy costs (ISO-NE LMPs), ancillary services, and most other ISO-NE charges associated with serving the LRS load. The FPFR structure transfers wholesale price risk from ratepayers to suppliers, who price that risk into their bids.

The procurement uses a **laddered approach** designed to mitigate price volatility. For residential and commercial customers, **90% of load** is procured through FPFR contracts across five separate solicitations, each covering 15–20% of load with terms ranging from 6 to 24 months. The remaining **10% is purchased on the ISO-NE spot market**, with estimated costs folded into the rate.[^3] This staggering ensures that no single market moment determines the entire rate. If a bid block receives zero offers, RIE defaults to spot market procurement; if only one bid arrives, the company consults the Division of Public Utilities within a two-hour window.

**Capacity costs** were carved out of FPFR contracts beginning in April 2019 (PUC Order 23366, Docket 4809). RIE now separately estimates Forward Capacity Market payments and embeds them in the Base LRS Charge, a change made to reduce bid-price volatility caused by uncertain future capacity auction outcomes.[^4]

The conversion from time-varying wholesale costs to a flat seasonal rate is straightforward arithmetic. RIE forecasts monthly LRS kWh by customer class, multiplies each month's estimated supply price by projected volume, sums the six months' costs, and divides by total projected kWh.[^5] For summer 2026, this produced a residential base charge of **8.788¢/kWh** against a projected cost of approximately **$107.2 million** over the six-month period.[^6] The total annual revenue collected through the Base LRS Charge across all customer groups runs to **several hundred million dollars**, as indicated by reconciliation swings of $11–26 million in recent years.

## The Adjustment Factor reconciles forecast errors annually

The LRS Adjustment Factor (governed by RIPUC No. 2237) is a pure **reconciliation mechanism** — the true-up between what the Base LRS Charge collected and what wholesale supply actually cost. Four categories of mismatch drive the balance: differences between forecasted and actual monthly kWh distribution, estimated versus actual line losses, estimated versus actual spot market prices, and billing-cycle timing differences.[^7]

The factor is recalculated **once per year** as part of the Annual Retail Rate Filing submitted in February for effect April 1, applying for the subsequent 12-month period (April through March). The ending over/under-recovery balance (including interest) is divided by forecasted LRS kWh for the recovery period.[^8]

For the current period, the residential Adjustment Factor is **−0.355¢/kWh** — a credit reflecting prior over-collection.[^2] Historical magnitudes vary dramatically: CY 2023 saw a **$24.1 million residential over-recovery** (resulting in a −0.777¢ credit the following year), while CY 2022 produced an **$18.3 million under-recovery** across all groups.[^8] These swings underscore the inherent difficulty of forecasting six months of wholesale costs into a flat rate.

## Administrative costs recover working capital, bad debt, and procurement overhead

The LRS Administrative Cost Factor currently stands at **0.256¢/kWh** for residential customers — a small but structurally interesting component.[^2] It consists of two sub-elements: a prospective estimate of upcoming administrative expenses and a reconciliation adjustment for prior-year over/under-collection.

Three categories of cost flow through this factor:

- **Cash working capital** (~$40.6 million in the 2025 filing): the return on funds RIE must advance to pay wholesale suppliers before collecting from retail customers. This is by far the largest dollar item, though the factor recovers only the carrying cost, not the principal.[^8]
- **Uncollectible expense**: bad debt from LRS customers who don't pay, calculated at a **1.30% uncollectible rate** in effect since September 2018.[^4]
- **Administrative expenses**: salaries and costs for employees managing RFPs, negotiating contracts, calculating rates, filing with the PUC, updating billing systems, creating environmental disclosure labels, and administering RES compliance.[^8]

The total annual administrative cost budget across all customer groups was approximately **$7.65 million** in 2025, down from $9.77 million in 2023.[^8] The factor varies by customer class (commercial: 0.307¢; industrial: 0.148¢) because each class's share of total costs is divided by that class's projected kWh sales.

**Why volumetric rather than a fixed charge?** No regulatory proceeding has specifically debated this design choice. The volumetric approach persists for practical reasons: the entire LRS supply charge is structured as a single per-kWh rate to enable direct comparison with competitive supplier offers. Embedding administrative costs in the volumetric commodity charge maintains this apples-to-apples comparability. The PUC treats all LRS costs as pure pass-throughs, and wholesale supply costs are inherently volume-dependent, so a volumetric structure follows naturally from the rate's origins in Rhode Island's late-1990s restructuring.[^1]

## The RES Charge funds an accelerating renewable energy mandate

The Renewable Energy Standard Charge has become the fastest-growing component of the LRS rate, rising from effectively **zero in 2018–2019** to **1.461¢/kWh** as of April 2025.[^2] This trajectory reflects Rhode Island's 2022 legislative acceleration of its RES to reach **100% renewable electricity by 2033** — one of the most aggressive timelines in the country.[^9]

The charge recovers the cost of purchasing **Renewable Energy Certificates (RECs)** to satisfy RIE's statutory obligation under R.I.G.L. § 39-26. For compliance year 2025, the obligation is **34% of retail sales** (32% from "New" resources commissioned after 1997, plus 2% from "Existing" pre-1997 resources). The obligation escalates by 6–9.5 percentage points annually, reaching 100% in 2033.[^10]

RIE procures RECs through three channels: **long-term power purchase agreements** with renewable generators (the primary source), the **Renewable Energy Growth feed-in tariff program** for distributed solar and small renewables, and annual **competitive RFP solicitations** for remaining needs.[^10] RIE has made **$0 in Alternative Compliance Payments** since at least 2013, indicating a well-supplied regional REC market.[^11]

Recent New REC prices have been remarkably stable at approximately **$39–40/MWh**, near Connecticut's Class I ACP rate of $40/MWh, which effectively caps the regional price. Rhode Island's own ACP rate is much higher at **$80.59/MWh** (2023, CPI-adjusted from a $50 base), but the market clears well below this ceiling.[^11] The rising RES charge is driven almost entirely by the **increasing obligation percentage**, not by REC price inflation — a critical distinction for forecasting future costs.

Total LRS RES compliance costs reached **$29.3 million in 2023** (covering 47.2% of statewide obligated load), composed almost entirely of New REC purchases ($28.9 million) with a small Existing REC component ($0.4 million).[^11] As the obligation percentage roughly triples from 2023 to 2033, annual costs will scale proportionally unless REC prices decline.

**The RES charge is an embedded average cost**, not a marginal cost. RIE projects total annual REC procurement expenses, divides by forecasted LRS kWh, and adds a reconciliation adder for prior-year true-up. The volumetric structure is economically well-justified: the RES obligation is itself defined as a percentage of kWh sold, so each additional kilowatt-hour of consumption directly increases the number of RECs required. Cost causation aligns cleanly with volumetric recovery.

## Rate component interactions and what the numbers reveal

Viewing all four components together for winter 2025–2026 clarifies their relative weight:

| Component | Rate (¢/kWh) | Share of total |
| --------------------- | ------------ | -------------- |
| Base LRS Charge | 13.408 | 90.8% |
| LRS Adjustment Factor | (0.355) | (2.4%) credit |
| LRS Admin Cost Factor | 0.256 | 1.7% |
| RES Charge | 1.461 | 9.9% |
| **Total** | **14.770** | **100%** |

The Base LRS Charge overwhelmingly dominates. But the fastest-moving variable is the RES Charge, which has doubled in two years and will continue climbing as the 100%-by-2033 mandate accelerates. By contrast, the Administrative Cost Factor is remarkably stable, and the Adjustment Factor oscillates around zero over time by design.

The procurement architecture deserves attention for its sophistication. The laddered FPFR solicitation approach, the separation of capacity costs from supplier bids, the 90/10 split between contracts and spot exposure, and the annual reconciliation cycle together create a system that balances price stability against cost accuracy. The six-month fixed-price commitment gives residential customers predictability, while the annual true-up prevents large cost mismatches from compounding indefinitely.

## Conclusion

Rhode Island Energy's LRS rate is not a single price but a layered mechanism reflecting four distinct cost streams, each with its own procurement logic and regulatory treatment. The Base LRS Charge — set through competitive full-requirements solicitations and weighted-average seasonal flattening — accounts for over 90% of the total and embeds wholesale energy, capacity, ancillary services, and spot market costs. The Adjustment Factor provides annual error correction. The Administrative Cost Factor, at roughly a quarter-cent per kWh, funds the institutional machinery needed to run the procurement program. And the RES Charge, now approaching 1.5¢/kWh and rising fast, finances Rhode Island's push toward 100% renewable electricity — a mandate that will likely make this component the primary driver of LRS rate increases over the next decade. The entire structure operates as a cost pass-through with no utility profit margin, regulated through a web of RIPUC dockets, annual filings, and quarterly solicitations documented in Tariff No. 2096 and the LRS Adjustment Provision (RIPUC No. 2237).

---

## Sources

[^1]: Rhode Island Energy, [Last Resort Service](https://rienergy.com/site/ways-to-save/rates-and-shopping/last-resort-service). RIE's overview of LRS as a pass-through default supply service.

[^2]: RIPUC, [Compliance Filing — RIPUC Nos. 2095 & 2096, effective October 1, 2025](https://ripuc.ri.gov/sites/g/files/xkgbur841/files/2025-10/Compliance%20-%20RIPUC%20Nos.%202095%20&%202096%20-%20PUC%209-26-25.pdf). Tariff sheets showing the four LRS rate components for winter 2025–2026.

[^3]: RIPUC, [Last Resort Service Regulatory Topic (August 2024)](https://ripuc.ri.gov/sites/g/files/xkgbur841/files/2024-08/Last%20Resort%20Service%20Regulatory%20Topic%20(08-2024).pdf). PUC staff overview of FPFR procurement mechanics, the 90/10 contract-to-spot split, laddered solicitation structure, and bidding protocols.

[^4]: RIPUC, [Order 23770 — Docket 4930 (February 17, 2020)](https://ripuc.ri.gov/sites/g/files/xkgbur841/files/eventsactions/docket/4930-NGrid-Ord23770-2-17-20.pdf). PUC order addressing capacity cost carve-out from FPFR contracts and the 1.30% uncollectible rate.

[^5]: Rhode Island Energy, [Supply Costs](https://www.rienergy.com/RI-Business/Rates/Supply-Costs). RIE's public explanation of how LRS rates are calculated from wholesale procurement costs.

[^6]: RIPUC, [Docket 26-03-EL — LRS April 1, 2026 Rates (Public Filing, January 21, 2026)](https://ripuc.ri.gov/sites/g/files/xkgbur841/files/2026-01/26-03-EL-LRS%20April%201,%202026%20Rates%20-%20Public%20-%20PUC%201-21-2026.pdf). RIE's filing for summer 2026 LRS rates, including projected costs and the base charge calculation.

[^7]: RIPUC, [Docket 25-04-EL — DPUC Position Memo (March 14, 2025)](https://ripuc.ri.gov/sites/g/files/xkgbur841/files/2025-03/25-04-EL%20RIE's%202025%20Retail%20Rate%20Filing%20-%20DPUC%20Position%20Memo%20(3-14-25).pdf). Division of Public Utilities review of the 2025 Annual Retail Rate Filing, discussing adjustment factor mechanics and administrative cost components.

[^8]: RIPUC, [Compliance Filing — Dockets 25-03-EL, 25-04-EL, 25-05-EL, effective April 1, 2025](https://ripuc.ri.gov/sites/g/files/xkgbur841/files/2025-04/25-03-EL,%2025-04-EL,%2025-05-EL%20-%20Compliance%20-%20Effective%20April%201,%202025%20Rates%20-%20PUC%203-31-2025.pdf). Compliance tariff filing with detailed schedules for administrative costs, working capital, over/under-recovery balances, and the adjustment factor calculation.

[^9]: Rhode Island Office of Energy Resources, [Governor McKee Signs Historic Legislation Requiring 100% of Rhode Island's Electricity to be Offset by Renewable Energy by 2033](https://energy.ri.gov/press-releases/governor-mckee-signs-historic-legislation-requiring-100-rhode-islands-electricity-be). Press release on the 2022 RES acceleration legislation.

[^10]: Rhode Island Energy, [Supply Costs — Renewable Energy Standard](https://www.rienergy.com/RI-Business/Rates/Supply-Costs). RIE's description of RES procurement channels and the escalating obligation schedule.

[^11]: Rhode Island RES, [2023 RES Annual Compliance Report](https://rhodeislandres.com/wp-content/uploads/2025/11/2023-RES-Annual-Compliance-Report.pdf). Detailed compliance data including total REC procurement costs ($29.3M in 2023), New and Existing REC prices, ACP rates, and historical compliance statistics.
Loading
Loading