
Platt: New York Clean-Energy Site-Screening Methodology (v0.5.1)
This document describes the production scoring engine.
Executive summary
Platt fuses the public datasets that govern clean-energy siting in New York (utility hosting capacity, interconnection-queue pressure, parcel geometry, terrain, environmental constraints, and building footprints) into one database and computes a deterministic 0–100 screening score for every parcel in the state.
- Live model: v0.5.1. It scores 2,046,724 parcels across ten counties (the five New York City boroughs plus Onondaga, Albany, Monroe, Erie, and Westchester).
- What the number is. A relative suitability index that ranks parcels by interconnection and land conditions. It is not a probability (a 70 is not "70% likely") and not a validated predictor of which parcels will actually be built. Earlier documents and some persisted API fields call this number the "feasibility score"; that is legacy naming, retained for compatibility only. This document calls it a screening score throughout, because §2 and §6.3 establish that feasibility itself is not identifiable from the available data.
- What we have shown. The screen is internally valid: its shortlist is robust to ±25% weight perturbation, and its ranking is driven by the physically meaningful inputs. These results need no outcome data and hold across the footprint; re-run and holding on the live v0.5.1 snapshot (§6.1).
- What we have not shown. Against real build outcomes the model fails its pre-registered gate: within-county lift@50 = 1.156, 95% CI [0.836, 1.462]. The lower bound sits below parity (1.0), and the model loses to simple size baselines: its CI upper bound (1.462) sits below every size baseline's point estimate (building count 2.000, acreage 1.912, roof area 1.905). §2 explains why no model could currently clear that bar from New York's data.
- Posture. A site screen. It loses to simple size baselines on raw outcome lift and sits at parity with random once demand is de-confounded (1.082 vs 1.038). The path to a calibrated predictive claim is the forward-accrual program in §6.3.
The rest of this document specifies the complete engine (every weight, threshold, and value function) and reports the validation results.
Product overview
The methodology below runs as a working product. The three screens are from the production build, captured 2026-06-11.



1. What Platt is, and the problem it solves
Siting a distribution-scale clean-energy project in New York (community solar, battery storage, or solar-plus-storage) is slow, expensive, and data-fragmented. A developer's first question for any parcel is is this worth pursuing?, and answering it means assembling facts that no single public source holds: how much distribution hosting capacity the nearest usable feeder has, how far that feeder is, how congested its interconnection queue is, whether the parcel sits in a Con Edison secondary-network area where customer-sited export is constrained by default, how steep the land is, how much of it survives wetlands and floodplain, and how large a usable rooftop it carries. Those facts live across six investor-owned utilities, several state and federal regulators, and dozens of GIS layers that share no keys, units, or refresh cadences. Done by hand, one parcel at a time, this is days to weeks of GIS work.
Platt does it once, for the whole state. We fuse these public datasets into a single geospatial database and compute a deterministic 0–100 screening score for every parcel: today 2,046,724 parcels across ten counties, the five New York City boroughs (Bronx, Kings, New York, Queens, Richmond) plus Onondaga, Albany, Monroe, Erie, and Westchester. A developer shortlists viable sites in seconds instead of weeks; a lender gets an auditable, source-cited screen for diligence. Every score row carries its exact inputs, with citations for the parcel, environmental-flag, substation, and hosting-capacity sources (§5), and the score is fully reproducible: re-running the engine on the same data snapshot returns the same number, to the decimal.
The score is a screen. §2 defines what it measures and its limits.
2. What the score measures
The 0–100 score is a deterministic site screen: a relative suitability index that ranks parcels by interconnection and land conditions for a distribution-scale solar project. It is not a probability. A 70 does not mean "70% likely to be built" or "70% likely to be feasible." It means the parcel ranks above one scoring 60 on the modeled suitability dimensions, under the weights and value functions documented in §3. The framing is borrowed from presence-only species-distribution modeling, where a model yields a relative suitability surface and the absolute prevalence is, by construction, not recoverable from the data.
The live model, v0.5.1, ships labeled improved, not-yet-validated interim. It is a measured improvement over its predecessors and passes the internal-validity tests of §6.1 (re-run on the v0.5.1 snapshot), but it has not been shown to predict real build outcomes. The reason is structural, and it shapes every design choice that follows.
Why feasibility is not identifiable from "where solar got built." The only positive examples available are completed community-distributed-generation installs (call them CDG installs). This is a presence-only record (we observe successes, never a labeled set of true negatives), and it carries two structural problems:
- A survivorship and demand confound. A completed install reflects, roughly,
P(build) ≈ feasibility × developer demand × market access × timing, not feasibility alone. "Where solar got built" therefore encodes where developers chose to build and succeeded, which is driven heavily by demand and market access. Feasibility and demand are not separately identifiable from successes alone. - A selection (collider) problem. The natural way to obtain negatives is to look at projects that applied to interconnect but did not energize. But application is itself a choice that sits downstream of both feasibility and demand. Conditioning on it does not close the confound; it opens a spurious feasibility–demand association (a Berkson-type selection effect). That induced association is plausibly negative, so it biases an outcome test against the model. But the population question "is this site feasible?" is not recoverable from applicant-conditioned, positives-only data.
When we de-confound for demand using a target-group-background design (we compare installs not against all land but against a background of plausible candidate parcels, here parcels with a usable roof ≥ 200 m², so that "demand lives where buildings are" is differenced out), the screen performs at parity with random (model within-county lift ≈ 1.082; random ≈ 1.038), and on the raw outcome test it loses to simple size baselines (§6.2). Platt is a site screen, not a validated predictor.
Modeling approach: why there is no trained model
Platt is a deterministic weighted-and-gated screen, not a fitted machine-learning model. We did not train a classifier on "where solar got built," and we did not fit a probability calibration. Two reasons, in order of importance:
- Identifiability. As above, the only labels available are presence-only, applicant- conditioned, and demand-confounded. A model trained on them would learn where developers chose to build (demand and market access), not feasibility. Model capacity does not repair a label that fails to identify the target: a flexible learner would encode the confound in its output. We do not fit to those labels until cleaner ones exist.
- Auditability. Year-two users are project-finance lenders and underwriters. Lenders can audit
a screen whose every weight, threshold, and value function is inspectable and reproducible. They
cannot audit a black-box probability. The screen also fails safe: a missing input resolves
to a neutral discount of
1.0.
Calibration is deferred and gated. Once the forward-accrual program (§6.3) yields a point-in-time, less-confounded outcome set over an expanded footprint, the next step is to fit a monotone calibration from the score to an empirical energization rate: beta or Platt scaling while the resolved set is small, and isotonic regression once it is not (§6.3). Only then does the output become a calibrated probability rather than a relative index, and only if the identification assumptions hold.
3. The four-stage model, in full detail
The model is gated additive-multiplicative: a hard eligibility gate (Stage 0) is checked before any score is computed, a weighted additive core then scores the surviving parcels, and every cost or friction is applied as a multiplicative discount, never a subtraction. A constraint can dampen a score, but a high score can never "pay it back." On the live population the Stage-0 gate currently excludes 0 of 2,046,724 parcels (see the note in Stage 0), so today the gating is carried in practice by the multiplicative discounts. This architecture is the central correction over the original additive model (§8).
Two project archetypes are scored for every parcel: ground_mount and rooftop. The
headline score is that of the first eligible archetype in preference order, ground-mount
first, then rooftop, and not the higher-scoring of the two. The archetypes renormalize
different weight vectors onto non-comparable scales (rooftop weights three inputs, ground-mount
four), so taking the maximum would let a renormalized rooftop score spuriously out-rank a ground-
mount composite on a large rural parcel that is in fact a ground-mount site. Both full breakdowns are
always retained alongside the headline. If neither archetype is eligible, the parcel failed a
shared hard gate, and the headline row reports the rooftop result's exclusion reason.
Stage 0: Eligibility gate (hard exclusions)
The gate returns (eligible, exclusion_reason, flags). A disqualified parcel is excluded with a
stated reason, never assigned a small positive score. The gates fire in order; thresholds are exact
and apply to both archetypes unless noted. (On the current live population these gates exclude
0 of 2,046,724 parcels; see the note below.)
| # | Condition | Exclusion reason | Applies to | Rationale |
|---|---|---|---|---|
| 1 | available_hc_mw is null or ≤ 0 |
no_hosting_capacity |
both | A parcel whose nearest usable feeder has no PV hosting capacity cannot interconnect. |
| 2 | dist_to_feeder_m is null or > 15,000 m |
no_hosting_capacity_within_range |
both | The nearest-feeder join has no distance cap, so it always finds some feeder with PV > 0. Beyond 15 km that feeder is effectively unreachable; we exclude rather than credit headroom the parcel cannot reach. |
| 3 | in_critical_habitat is true |
critical_habitat |
both | Federal designated critical habitat is a hard exclusion. |
| 4 | slope_mean_pct is not null and ≥ 15.0% |
slope |
ground-mount only | 15% is the permissive edge of the developer range (grade-cost onset is ~5–10%; 15% is a common special-permit trigger in model solar zoning). A hard cut atop the graded slope penalty. |
| 5 | net_buildable_acres is null or < 8.0 acres |
below_min_viable_ground_mount |
ground-mount only | 8 net acres is about 1 MW-AC at the NREL land-use benchmark (roughly 7 to 8 ac/MW-AC), near the minimum-viable ground-mount project size. |
The 15 km eligibility cap is generous, and it diverges from the grid- proximity value function, which already decays to zero by 5 km (§3.1). A parcel 5–15 km from its feeder is therefore scored low, not hard-excluded: it could in principle justify a costly line extension, and a hard cut there would be a false negative.
A non-gating flag, coned_network_export_constrained, is appended (not excluded) for any parcel
whose centroid falls inside a Con Edison secondary-network area; the export economics are priced as a
discount in Stage 1 rather than as a gate.
net_buildable_acres computation. Net buildable acres derives from total parcel acres, the
wetland/floodplain coverage, the critical-habitat flag, and slope:
if total_acres is null or ≤ 0: net_buildable_acres = null
elif in_critical_habitat: net_buildable_acres = 0.0
else:
remainder = total_acres × (1 − clamp01((wetlands_pct + floodplain_pct) / 100))
if slope_mean_pct ≥ 15.0: remainder = remainder × 0.5 # slope-halving
net_buildable_acres = max(0, remainder)
The slope-halving uses the mean parcel slope ≥ 15%; because slope is also its own graded scoring component, this halving (rather than a hard zero) avoids double-penalizing the same constraint.
A note on what the gate currently does. On the live population the gate is non-binding: it excludes 0 of 2,046,724 parcels and 0 of 500 known install-parcels. Its categories are mechanism-correct, but its real-world safety is therefore untested by present data. See §7.
Stage 1: Graded suitability (the core formula)
For a surviving parcel, the suitability of an archetype is the weighted sum of value functions, multiplied by the product of discounts, clamped to [0, 1] and scaled to [0, 100]:
suitability = clamp01( ( Σᵢ weightᵢ · valueᵢ ) · Πⱼ discountⱼ )
score = round( suitability × 100.0 , 1 )
A missing discount input resolves to 1.0, the multiplicative neutral.
3.1 Weights (each archetype's weights sum to 1.0)
| Input | Ground-mount weight | Rooftop weight |
|---|---|---|
Hosting-capacity headroom (v_hc_headroom) |
0.40 | 0.40 |
Grid proximity (v_grid_proximity) |
0.30 | 0.30 |
Buildable area (v_buildable) |
0.20 | n/a |
Roof area, usable (v_roof_area) |
n/a | 0.30 |
Slope / terrain (v_slope) |
0.10 | n/a |
The weights encode one domain principle: for distribution-scale solar, grid access dominates land. Hosting-capacity headroom and grid proximity together carry 0.70 of the weight in both archetypes. Rooftop has no terrain or buildable-land term; the 0.30 that ground-mount splits across buildable (0.20) and slope (0.10) is repurposed entirely to usable roof area (0.30). The weights are engineering judgments, not empirically calibrated; §6.1 reports the test showing the ranking is robust to them.
3.2 Value functions vᵢ : input → [0, 1]
Every value function is a continuous, monotone, saturating piecewise-linear interpolation over a
fixed set of anchor points: below the first anchor the value equals the first anchor's y; above the
last it equals the last anchor's y; in between it is linear. There are no step-band
discontinuities. Anchors are stated as (input, value) pairs.
v_hc_headroom: available hosting capacity in MW. Null or ≤ 0 → 0.0.
| MW headroom | 0.0 | 1.0 | 3.0 | 5.0 |
|---|---|---|---|---|
| value | 0.00 | 0.40 | 0.75 | 1.00 |
The value saturates at 5 MW because 5 MW-AC is the distribution-level interconnection ceiling for this project class under New York's Standardized Interconnection Requirements (effective August 1, 2025). A CDG project cannot exceed it, so headroom beyond 5 MW carries zero marginal value. This is a regulatory ceiling, not a grid-physics one.
v_grid_proximity: straight-line distance from the parcel centroid to the nearest usable feeder
line, in metres. Null → 0.0.
| metres | 0 | 250 | 750 | 1,500 | 3,000 | 5,000 |
|---|---|---|---|---|---|---|
| value | 1.00 | 0.95 | 0.80 | 0.45 | 0.10 | 0.00 |
The curve decays to ~0 by 3 km and fully to 0 by 5 km, anchored to interconnection-cost economics rather than raw distance: a sub-5 MW CDG project can typically justify a line extension of ~1–3 km; beyond ~3 km the upgrade cost is usually fatal. The applicant bears that cost, and no rule caps an individual applicant's share. Two points of precision (critique C5): the cost-sharing mechanism the PSC adopted on April 14, 2022 caps a utility's unrecovered upgrade costs at 2% of its distribution and sub-transmission capital investment budget per fiscal year, which protects the utility's other customers rather than the applicant; and NYSEIA's Cost-Sharing 2.0 petition (Case 24-E-0621, open as of June 2026, comments through May 2026) seeks a cap at 115% of the CESIR estimate, binding for 36 months. An adopted cap would shift the cost distribution that any future cost model trains on (§6.3).
Con Edison secondary-network override. Inside a Con Edison secondary-network area, grid proximity is not computed from feeder distance; it is set to a fixed
PROX_NETWORK_DEFAULT = 0.95. The published radial-feeder layer barely maps the dense network core, so the measured distance to the nearest mapped radial feeder there is a coverage artifact (a network-core parcel can be kilometres from a mapped radial even though the grid runs under the street). 0.95 represents excellent-but-not-perfect access. The export economics of network areas are priced separately as a discount (§3.3), so this is not double-counting, and the engine logs which path fired (network-default vs. distance-based) on every parcel.
v_roof_area: usable roof area, in m², of the parcel's single largest building (building
footprint × a usable-area derate: 0.60 for flat commercial roofs, 0.25 for pitched residential). A
10 m² minimum footprint applies at ingest to the Microsoft (upstate) source only; NYC Open Data
footprints carry no minimum. Null or ≤ 0 → 0.0. Rooftop only. The derate is currently selected from the
parcel's property class (NY class code beginning "2" → residential 0.25; otherwise 0.60) and
applied to the largest building, rather than from each building's own roof geometry, a proxy that
mis-derates genuinely mixed-use lots (§7).
| usable m² | 0 | 200 | 500 | 1,000 | 2,500 | 5,000 |
|---|---|---|---|---|---|---|
| value | 0.00 | 0.30 | 0.55 | 0.75 | 0.92 | 1.00 |
The curve is monotone and saturating, not linear; a linear map would merely reproduce the raw-area baseline. As a rule of thumb: ~200 m² ≈ a 25 kW system → 0.30; ~1,000 m² ≈ 125 kW → 0.75; ~5,000 m² and up is MW-scale → 1.00 (at roughly 8 m²/kW of usable roof).
v_buildable: net buildable acres (from Stage 0). Not ground-mount, or null → 0.0. Ground-mount
only.
| net acres | 0 | 8 | 25 | 40 |
|---|---|---|---|---|
| value | 0.00 | 0.25 | 0.70 | 1.00 |
The 8-acre and 40-acre anchors are set from the NREL land-use benchmark for utility-scale PV, roughly 7 to 8 acres per MW-AC (Ong et al. 2013, NREL/TP-6A20-56290), which places 8 acres near a 1 MW-AC minimum-viable project and 40 acres near a 5 MW-AC system. They are not drawn from the Model Solar Energy Local Law, which defines its tiers by capacity and on-site consumption and contains no capacity-to-acreage ratio. The 25-acre mid-tier is a derived interpolation point, about 3 MW-AC at the same benchmark, and carries no external citation.
v_slope: mean parcel slope in percent. Null → 0.5 (neutral). Ground-mount only.
| slope % | 0 | 5 | 10 | 15 |
|---|---|---|---|---|
| value | 1.00 | 0.85 | 0.55 | 0.00 |
Slope ≥ 15% is also a hard gate (Stage 0 #4), so the graded penalty operates on the 0–15% band and
reaches 0 exactly at the gate threshold. The null default is 0.5 (neutral) rather than the
0.0 used for v_buildable/v_roof_area: a missing roof or missing parcel area is genuine evidence of
absence (no roof, no land), whereas a missing slope reading is genuine ignorance about a terrain
that is, on the New York parcels we score, usually mild. The default is neutral. Because slope is
near-dead-weight on the current population (§6.1), this choice barely moves the ranking either way.
3.3 Discounts dⱼ : input → (0, 1] (multiplicative friction)
The four discounts apply multiplicatively, in the order [farmland, flood/wetland, queue, ConEd- network]. Each is a friction in (0, 1]; a missing input resolves to 1.0. None is a hard gate.
| Discount | Formula | Magnitude | Notes |
|---|---|---|---|
discount_farmland |
1.0 − 0.15 × clamp01(prime_farmland_pct / 100) |
0.15 | Prime/statewide-important farmland triggers a state notice-of-intent and mitigation-payment process, not a permit block, so this is a mild discount, not a gate. Null → 1.0. |
discount_flood_wetland |
rooftop: 1.0 − 0.30 × clamp01((floodplain_pct + wetlands_pct) / 100); ground-mount: 1.0 |
0.30 (rooftop only) | Archetype-aware.1 Ground-mount is neutral here because the usable-area loss is already owned by net buildable acres (§3.1); applying it twice would double-count the same geography. Rooftop has no buildable-area term, so this is its sole flood/wetland channel. Null coverage → 0%. |
discount_queue |
1.0 − 0.60 × clamp01(queue_saturation) |
0.60 | queue_saturation = queued_mw / available_hc_mw. Published hosting capacity is headroom before queued DG, so a feeder with a large queue relative to its headroom is heavily discounted. Null → 1.0. |
discount_coned_network |
constant by archetype | ground-mount 0.15; rooftop 0.85 | Con Edison area networks are no-export by default. For ground-mount (always export-scale community solar) this is a near-gate (0.15); for rooftop it is softer (0.85), reflecting that small net-metered systems are only lightly constrained while > 50 kW-AC export systems bind. Not in a network → 1.0. |
One input-join detail on discount_queue: 1,328 of 4,766 feeders (28%) publish no queued-DG
figure, and the live input join coalesces that absence to a saturation of 0 rather than null. The
discount is identical either way (1.0), but the displayed queue_saturation does not distinguish
an empty queue from unpublished queue data.
With the Stage-0 gate currently non-binding, the multiplicative structure carries the gating in
practice: a severe discount dominates the additive core no matter how strong that core is. A
ground-mount parcel with every value function at 1.0 (Σ wᵢ vᵢ = 1.0) that sits inside a Con Edison
network area scores 1.0 × 0.15 = 0.15 → 15, regardless of how strong its grid and land are: the
no-export constraint dominates.
Stage 2: Economic & interconnection-risk signals (pass-through)
Stage 2 surfaces economic and interconnection-risk signals alongside the score (for ranking and
diligence) rather than folding them into the single number, because they live on scales not
commensurable with a 0–1 suitability. Two signal fields ride on every score row. queue_saturation
also drives discount_queue in Stage 1, so it is a real scored input as well as a displayed
metric; in the live join, a feeder with no published queued-DG figure surfaces as saturation 0
(§3.3). Value-stack eligibility (VDER/LSRV: New York's Value of Distributed Energy Resources
tariff and its Locational System Relief Value adder) is currently unpopulated: the field exists in
the schema and the API but is false for every parcel, pending an LSRV-area ingest.
A size-aware interconnection-risk band is also implemented, as a coarse size-only first
cut.2 It maps a parcel's buildable capacity (ground-mount ≈ net buildable acres ÷
~8 ac/MW-AC; rooftop ≈ usable roof area ÷ ~8 m²/kW) onto three bands: low below 300 kW-AC,
moderate from 300 to 500 kW-AC, and high at or above 500 kW-AC. These breakpoints predate the
verified mapping of New York's SIR review tracks (50 kW-AC or less, the simplified process; above
50 up to 300 kW-AC, the expedited path with a UL 1741 supplement SA inverter; above that toward the
5 MW-AC ceiling, full review with a Coordinated Electric System Interconnection Review (CESIR)
likely)3 and diverge from the regulatory bright lines at 50 and 300 kW-AC; a code fix is
queued for the next re-score. Unknown size → null, never a favorable default. A parcel has no
intrinsic project size, so the band is a proxy. The optional enrichment with feeder-level CESIR
study-cost percentiles depends on further data ingest (§7).
Stage 3: Confidence / data readiness (high / medium / low)
This label is a data-readiness (fitness-for-use) rating, not a probability: it reports whether a parcel's inputs are fresh, complete, and in-scope. It is not calibrated to any outcome and is not a measure of site quality (a low-scoring parcel can be high-readiness, and vice versa), and it is kept orthogonal to the 0–100 score, never multiplied into it.4 It is gated purely on data quality, using these thresholds:
| Threshold | Value | Meaning |
|---|---|---|
_HC_FRESH_DAYS |
220 days | ≈ 7 months, within the semi-annual hosting-capacity refresh cycle. |
_HC_STALE_DAYS |
400 days | > ~13 months: the feeder has missed a refresh. |
_CLOSE_FEEDER_M |
2,000 m | A confidently close, well-mapped feeder. |
_FAR_FEEDER_M |
10,000 m | A feeder far enough that the linkage is doubtful. |
Rules. Return low if any of: available_hc_mw, dist_to_feeder_m, or total_acres is
null; the parcel is in a Con Edison network area (network hosting capacity is per-area, not feeder-
accurate); the hosting-capacity age exceeds 400 days; or the feeder distance exceeds 10,000 m.
Otherwise return high only if all of: the hosting capacity is fresh (≤ 220 days) and the
feeder is close (≤ 2,000 m) and slope is present. Anything else is medium.
On the live snapshot the three tiers are approximately 61% high, 3% medium, and 36% low (they sum
to 100%). The large high share is up from 497,929 parcels (≈ 24%) under the prior v0.4.0 rule,
not because parcels became more suitable, but as a definitional change: the prior rule capped
otherwise-ready parcels at medium whenever their feeder was not reconciled to a canonical
substation, a linkage the score never uses.5 Removing that requirement reveals that most
parcels have fresh, complete, in-scope inputs. The 36% low tier is driven by Con Edison network
membership (per-area hosting capacity), null inputs, and stale hosting-capacity dates. The 220-day
and 2-km breakpoints are not tuned to rebalance the tier distribution.6 The
thin medium band (≈ 3%) is the near-binary in-between; a queued per-flag panel will surface which
gate is borderline rather than collapse it to one word.
4. The two archetypes, and when each applies
Both archetypes are scored for every parcel; the headline is the first eligible one in the order ground-mount → rooftop.
- Ground-mount is the primary land use: utility/community-scale and land-driven. It uses all four ground-mount inputs (hosting-capacity headroom, grid proximity, buildable area, slope) and is subject to the extra Stage-0 gates (slope ≥ 15% and net buildable < 8 ac). A parcel that clears the buildable-area floor is reported as ground-mount.
- Rooftop is the community-DG fallback: roof-driven, for parcels too small for ground-mount. It drops slope and buildable land entirely (terrain is irrelevant to a roof) and adds usable roof area. It has no acreage floor, which keeps dense urban parcels (most of New York City) in scope: a small Manhattan lot with a large flat commercial roof can be a strong rooftop site even though it could never host a ground array.
Why first-eligible and not higher score: the two archetypes renormalize different weight vectors onto non-comparable scales, so a rooftop's roof-area term can numerically out-rank a ground-mount composite on a large rural parcel that is, in reality, a ground-mount site. Preferring the first eligible archetype encodes the real-world precedence (if a parcel can host ground-mount, that is the project) and avoids a scale artifact. Because rooftop has no buildable-area gate, the vast majority of parcels in the dense-urban counties surface as rooftop headlines, which makes the overall ranking substantially a usable-roof-size ranking modulated by grid capacity (quantified in §6.1).
5. Data and provenance
Each score row cites its parcel, environmental-flag, substation, and hosting-capacity provenance; the remaining inputs (roof, network membership, slope, and the individual environmental layers) are documented at the dataset level here, and a per-county sources endpoint serves the full inventory. The table enumerates the datasets, what each provides, and its refresh cadence. Hosting capacity is assembled from all six New York investor-owned utilities into a single per-feeder layer of 4,766 feeders.
| Dataset | Source | What it provides | Cadence |
|---|---|---|---|
| Hosting capacity (6 IOUs) | National Grid, Con Edison/CECONY, NYSEG, RG&E, Central Hudson, Orange & Rockland published HC layers | Per-feeder available PV hosting capacity (MW), queued DG (MW), feeder geometry, utility-named substation, HC refresh date | PV/storage HC semi-annual (≈ April / October); queued-DG monthly where published. Per-feeder as-of dates vary within and across utilities (the live layer spans 2025-04 to 2026-06); Stage 3 prices that staleness per parcel |
| Substations | National electric-substation point layer (ORNL/HIFLD) | Canonical substation identity, geometry, operator, max voltage, line count | Periodic (infrequent national refresh) |
| Interconnection queue | NY DPS Standardized Interconnection Requirements (SIR) monthly inventory: all six IOUs fully (NYSEG and RG&E publish a joint file), plus PSEG Long Island partially (energized Y/N only; no withdrawn status) | Per-application status (energized / active / withdrawn), estimated upgrade (CESIR) cost, technology, developer identity (5 of 6 utilities; National Grid redacts it), milestone dates | Monthly (publisher cadence); the live ingested snapshot is as-of 2026-03 (PSEG-LI 2025-12) |
| Parcels | NY statewide tax-parcel service (county-direct for Monroe) | Geometry, total acres, property class, assessed value, owner/address, roll-year vintage | Per refresh |
| Slope | USGS 3DEP 1/3 arc-second DEM | Per-parcel mean slope (%), derived; the DEM itself is never stored | Per refresh (DEM updates infrequently) |
| Wetlands | USFWS National Wetlands Inventory (USGS-WIM service) | Per-parcel wetland coverage (%) | Per refresh |
| Floodplain | FEMA National Flood Hazard Layer (regulatory Special Flood Hazard Area) | Per-parcel 100-year floodplain coverage (%) | Per refresh |
| Critical habitat | USFWS designated critical habitat | Per-parcel critical-habitat intersection (boolean) | Per refresh |
| Prime farmland | USDA NRCS Soil Data Access (SSURGO) | Per-parcel prime-farmland coverage (%) | Per refresh |
| Network areas | Con Edison secondary/area-network polygons | Network-export-constraint membership flag | Per refresh |
| Buildings / roof | NYC Open Data Building Footprints (five boroughs); Microsoft US Building Footprints (upstate counties). FEMA USA Structures is specified as a gap-fill source but not yet ingested | Per-parcel usable roof area (m²), building count, largest-building footprint | Per refresh |
| Calibration positives / developer identity | NYSERDA CDG dataset (Complete + Pipeline rows; the contractor column carries developer identity) | Energized community-solar installs spatially joined to parcels for validation; also the only public source naming developers in National Grid territory | Source refreshes monthly; archived monthly by cron to dated snapshots |
Five provenance details materially affect interpretation:
- Hosting-capacity semantics. Published HC is headroom after connected DG but before queued
DG. The per-feeder PV value we use (the maximum nodal HC on the feeder) therefore overstates
immediately connectable capacity, which is why
discount_queueexists. The queued-DG figure that feeds the discount comes from the utilities' HC layers, not from the SIR inventory; the SIR inventory is the outcome and archival substrate (§6.3). - Feeder selection at score time. A parcel is matched to the nearest feeder line with PV > 0 (including feeders not reconciled to a canonical substation) via a planar nearest- neighbour search re-ranked by true geographic distance. We do not use the reconciled substation point for proximity; doing so once wrongly excluded a parcel 0.47 km from its feeder because that feeder's substation was 16 km away.7
- Environmental coverage is now statewide-within-footprint. In the live v0.5.1 model the environmental layers (wetlands, floodplain, critical habitat, prime farmland) are populated across all ten scored counties, a correction over v0.5.0, in which they were ingested only over a three-county bounding box and defaulted to neutral elsewhere.8 The wetland source was re-ingested from the authoritative USGS-WIM National Wetlands Inventory service, with the per- parcel overlaps independently verified (§8). Two caveats remain and are stated in §7: prime farmland was re-ingested footprint-wide but has not been independently ground-truthed, and there is no parcel-footprint (setback / internal-road) subtraction beyond the environmental overlap.
- Roof-join coverage. 1,795,203 of 2,046,724 parcels (87.7%) carry a
parcels_roofrow; the remainder have no joined building footprint and score zero usable roof area on the rooftop archetype's dominant input. - Monthly archival snapshots. Point-in-time snapshots of the SIR queue (5th of each month), all six hosting-capacity layers (6th), and the NYSERDA CDG dataset (8th) are archived monthly by scheduled jobs into dated tables. The published HC and SIR state is not reconstructable retroactively, and the archive begins June 2026; §6.3's temporal-validation panel depends on this cadence.
6. Validation program and results
The validation gate is pre-registered. Validation splits into two families: internal-validity legs that need no outcome data (and are therefore independent of the 10-county footprint), and outcome-validation legs that test the score against real build outcomes (and are fundamentally limited by the presence-only problem of §2).
Current validation status
| Leg | Substrate | Status |
|---|---|---|
| Internal validity (rank stability, ablation) | v0.5.1 snapshot | Pass; re-run 2026-06-09 (§6.1) |
| Outcome gate (within-county lift@50) | v0.5.1 live | FAIL: 1.156, 95% CI [0.836, 1.462]; loses to size baselines (§6.2) |
| TGB demand-de-confounded read | v0.4.0, post-hoc | Parity with random (1.082 vs 1.038); exploratory (§6.2) |
| CESIR cost corroboration | Complete-case SIR | Directionally supportive ($281 vs $112/kW); null under hostile imputation (§6.2) |
| Conditional-energization gate | SIR queue | Pre-registered, DRAFT, no-peek rule in force (§6.3)9 |
6.1 Internal validity: what we have shown
These legs touch no outcome data; they ask only whether the ranking is well-behaved. Both legs were
re-run on the live v0.5.1 snapshot (feasibility_scores_v2026_06_06, 2026-06-09), frozen in
metrics_rank_stability_v0_5_1.json / metrics_ablation_v0_5_1.json; the v0.4.0 runs remain frozen
alongside and read the same way.
Leg 1: Rank-stability under weight perturbation. We re-score all eligible parcels from their
stored value functions and discount product, perturbing every Stage-1 weight by × (1 ± φ) with
φ = 0.25 (±25%), renormalizing to sum 1, across 500 seeded Monte-Carlo draws, and measure the
retention of the published top-k shortlist (the fraction of the nominal top-k still present in the
perturbed top-k). The recompute-vs-stored sanity check correlated 1.000. Results
(n = 2,046,724 parcels; 500 draws; φ = 0.25):
| Shortlist | k | Retention (median) | [p5, p95] |
|---|---|---|---|
| Top 0.1% | 2,046 | 0.949 | [0.887, 0.987] |
| Top 1% | 20,467 | 0.937 | [0.848, 0.976] |
| Top 5% | 102,336 | 0.951 | [0.860, 0.986] |
| Top 500 (fixed) | 500 | 0.988 | [0.506, 0.998] |
The screening shortlist (top 0.1–5%) retains ~94–95% of its members under ±25% weight
perturbation, so the exact weight values are not load-bearing. One nuance: the literal top-500
ordering has a wide tail (median 0.988, fifth percentile 0.506) because many rooftop parcels cluster at the score ceiling
(v_grid_proximity = 0.95, v_hc_headroom = 1.0) and reshuffle under perturbation. The operative
robust unit is the top 1–5%, not the exact tip. This leg perturbs weights only; perturbing value-
function anchors and discount magnitudes is a documented follow-up.
Leg 2: Component ablation. We zero each Stage-1 input's weight in turn, renormalize the survivors, re-score, and measure churn = 1 − Jaccard(nominal top-k, ablated top-k). High churn means the input drives the ranking; near-zero means it is near-dead-weight on current data. Sorted by top-1% churn (n = 2,046,724):
| Archetype · input | Top-1% churn | Top-5% churn | Reading |
|---|---|---|---|
| rooftop · roof_area | 0.949 | 0.642 | Dominant driver of the rooftop-heavy shortlist. |
| rooftop · hc_headroom | 0.260 | 0.464 | Strong secondary. |
| ground_mount · buildable | 0.217 | 0.018 | Moderate. |
| ground_mount · hc_headroom | 0.201 | 0.057 | Moderate. |
| ground_mount · grid_proximity | 0.161 | 0.031 | Moderate. |
| rooftop · grid_proximity | 0.153 | 0.235 | Muted; see below. |
| ground_mount · slope | 0.046 | 0.006 | Near-dead-weight on the current population. |
The rooftop ranking is substantially a usable-roof-size ranking modulated by grid capacity. Rooftop grid-proximity is muted because the Con Edison network override flattens proximity for the many NYC network-area parcels. Slope is near- dead-weight on the current low-weight, ground-mount-only population, but it is kept because it is mechanism-correct; our policy is to cut a component only if it is structurally inert, not merely data-limited.
Neither leg touches outcome data, so both results are independent of the ten-county footprint. Shortlist robustness to weights does not extend to input-data corrections: the v0.5.1 environmental re-ingest retained only 6 of 50 of the prior ground-mount top-50 (§8),8 because the ground-mount ranking keys on the buildable-area term. The binding sensitivity is data provenance, not weight tuning.
6.2 Outcome validation: results
We tested the score against the 500 distinct parcels carrying a completed NYSERDA CDG install (spatially joined from ~1,402 statewide geocoded installs; all non-residential, median 83.9 kW-DC). The pre-registered primary endpoint is within-county lift at the top 50%: the ratio of the installs' density in the model's top-half to the population baseline, computed within county so that geography is not the thing being measured, with a feeder-cluster bootstrap and a gate on the 95% CI lower bound exceeding 1.0 (parity). The live result, with every comparison ranker on the same within-county axis:
| Ranker | Within-county lift@50 | Gate |
|---|---|---|
| Platt v0.5.1 model score (live) | 1.156, 95% CI [0.836, 1.462] | FAIL: CI lower bound < 1.0 |
| Building count (1-column sort) | 2.000 | beats model |
| Acreage (1-column sort) | 1.912 | beats model |
| Roof area (1-column sort) | 1.905 | beats model |
| Composite size | 1.852 | beats model |
| Random | 0.996 | n/a |
| Proximity (1-column sort) | 0.472 | n/a |
The model's point estimate crosses parity (1.156 > 1.0) and it edges random (0.996), but the CI lower bound is below 1.0 (so the gate fails) and the score loses to trivial one-column size sorts: the model's CI upper bound (1.462) sits below every size baseline's point estimate (building count 2.000, acreage 1.912, roof area 1.905). The result is stable across versions (v0.4 was 1.144 [0.833, 1.448] and v0.5.0 was 1.144 [0.824, 1.437]), confirming that the v0.5.1 environmental correction improved the inputs and the shortlist (§8) without moving the measured lift (n = 500; 195 feeder clusters; the interval shifts slightly because the bootstrap is re-run per snapshot).
Because decision-makers act on the top of a list, not its top half, we also report the finer
operating points (critique C9).10 These are exploratory reporting on the same substrate, not a
new gate (full bootstrap detail in docs/validation/metrics_v2026_06_09_liftk.json):
| Ranker | Lift@1% | Lift@5% | Lift@10% |
|---|---|---|---|
| Platt v0.5.1 model score (live) | 11.20 [7.71, 15.95] | 6.36 [4.40, 8.34] | 3.86 [2.43, 5.38] |
| Building count | 13.20 [7.88, 20.69] | 4.63 [3.20, 6.47] | 3.40 [2.78, 4.16] |
| Acreage | 22.40 [15.95, 31.53] | 10.88 [8.86, 13.41] | 7.56 [7.10, 8.18] |
| Roof area | 26.41 [18.97, 36.97] | 12.21 [10.62, 14.52] | 7.90 [7.36, 8.53] |
| Random | 0.80 [0.00, 1.49] | 0.88 [0.53, 1.29] | 0.98 [0.73, 1.28] |
The reading is consistent with the gate. The model concentrates installs far above random at every
operating point (CI lower bounds 7.7, 4.4, and 2.4), and it edges building count at @5% and @10% on
the point estimate (overlapping CIs), but it sits below the pure size sorts (acreage, roof area)
at every k. At the operating points developers act on, a one-column size sort beats the
screen. (Roof area and building count are computed
on the 462 of 500 installs carrying a parcels_roof row, 174 clusters, exactly as the frozen gate
run treated missing values.)
Two further outcome angles point the same way:
- A demand-de-confounded re-analysis. Using a target-group-background design (background = the 364 install-bearing parcels compared against parcels with usable roof ≥ 200 m², differencing out "demand lives where buildings are"), the model sat at parity with random (model within-county lift ≈ 1.082; random ≈ 1.038). This is exploratory and post-hoc (run on v0.4.0, not a frozen pre-registration).
- An upgrade-cost corroboration. Withdrawn interconnection projects showed a median CESIR cost of $281/kW versus $112/kW for energized projects on a complete-case basis (directionally supportive), but this collapsed to a null under a hostile missing-data imputation, and the score- vs-cost link was underpowered (Spearman ≈ 0.00 across only 149 feeders). The sign is stable; the magnitude is not.
Two constraints cap all three outcome legs. The SIR queue spans all 62 New York counties (after county-name normalization) while scoring covers ten, so every score-requiring outcome leg is limited to the scoring footprint. And the available positives are demand-confounded, survivorship-biased, and positives-only: the presence-only / collider problem of §2. We did not tune the model to the test after the gate failed.
Summary: the screen loses to simple size baselines on raw outcome lift and sits at parity with random once demand is differenced out. It is not a demonstrated predictor. Feasibility is not identifiable from positives-only, applicant-conditioned outcomes. The gate fails because the data cannot yet support a predictive claim. The screen passes every internal-validity test in §6.1.
6.3 The path forward: conditional energization, not feasibility
The conclusion of §6.2 is that feasibility cannot be recovered from the data New York produces, and no quantity of forward data changes that, because the barrier is identification rather than sample size. We change the estimand.
The interconnection queue contains a labeled negative class: withdrawn applications. Among community-distributed-generation applications we observe energized projects, withdrawn projects, and active ones still pending. Conditioning on the fact that a developer pursued a site is not a defect here. It defines the population we predict in. A model trained on applicants and deployed on applicants estimates the correct conditional distribution, and the collider objection of §2, which is fatal to a causal claim about feasibility, does not bind a predictive model used inside its own conditioning regime. The estimand becomes the probability and timing of energization for a project already under development.
Two limits bound this; both were verified against the live data. First, the queue records no reason for withdrawal. We read the current inventory template column by column across utilities, and a withdrawn project carries only a status flag, with no field that separates an interconnection failure from a lost offtake or a financing collapse. The achievable model is therefore all-cause energization: the probability a pursued project energizes. That is its label, not feasibility. Second, the model speaks only to the applicant population. Extending it to the millions of parcels no one has applied to develop is a selection shift; the model does not extend there. The broad 0-to-100 screen stays a separate breadth layer for prospecting; the conditional model is the precision layer that ranks sites a developer is already weighing.
The right method is competing-risks survival analysis, because the queue has two absorbing states that compete, energized and withdrawn, alongside a censored active state. A subdistribution-hazard model yields the cumulative incidence directly, the probability of energization by a given month, which is the quantity a developer or a lender wants. A cost regression sits beside it. Predicting the CESIR upgrade cost in dollars per kW from feeder state and project features is the number that most often kills New York distribution solar, and no public model predicts distribution-scale CESIR cost for New York.
Point-in-time feature snapshotting prevents label leakage. Today's hosting-capacity headroom on a feeder reflects whether past projects energized or withdrew, so joining current grid state to a past application's outcome would feed the model its answer. Every feature must be taken as of the application date. The monthly archival jobs (§5) exist to build this leak-proof panel: features as of the application date, joined to resolved outcomes. The hosting-capacity history exists only from June 2026 forward, so the panel accrues from that date. The model is then validated temporally, trained on everything resolved before a date and tested on what resolves after. That is the validation that mimics deployment.
The gate for that work is pre-registered as a numeric DRAFT artifact,
docs/validation/conditional-energization-preregistration.md, with a no-peek rule in force: no
estimation may run before the freeze commit hash is recorded.9 Three co-primary endpoints
must all pass. E1, discrimination: Uno's IPCW time-dependent C-index at the 36-month horizon,
95% CI lower bound > 0.50 and point estimate ≥ 0.60. E2, calibration: the IPCW Brier score
reported as an index of prediction accuracy, IPA ≥ 0.05 with CI lower bound > 0 against the
covariate-free within-county Aalen-Johansen reference. E3, ranking: within-county lift@10 with
CI lower bound > 1.0, point estimate ≥ 1.20, and a paired same-replicate bootstrap difference with
CI lower bound > 0 against both the size baseline and the queue-position baseline. The substrate at
draft is approximately 1,601 energized, 9,119 withdrawn, and 2,033 censored CDG applications, with
PSEG Long Island excluded and a pre-registered Con Edison-excluded sensitivity. The lift@k
operating point may be amended once, pre-freeze, from the developer-conversation answer; the freeze
then requires founder sign-off. Until that gate is cleared, the product is a screen. Calibration,
once the gate clears, will use whichever monotone method the sample supports: beta or Platt scaling
while the resolved set is small, and isotonic regression once it is not.
7. Limitations
We group limitations by severity. The first tier changes how the current output should be used; the second is fixable with data and pipeline work already scoped; the third is inherent to a screen of this design and is retained by choice.
Tier 1: Material (changes how to use the output today)
- The score is a relative suitability index, not a probability, and not a validated predictor of build outcomes (§2, §6.2). This is the headline caveat and the reason it ships labeled improved, not-yet-validated interim.
- Weights and value-function anchors are uncalibrated engineering judgments. Mitigated, not removed, by the rank-stability result (§6.1): the exact weights are not load-bearing, but they have not been fit to outcomes.
- The eligibility gate is currently non-binding (0 of 2,046,724 parcels excluded), so its real- world safety is untested by present data even though its categories are mechanism-correct. The environmental fill-in has now happened (v0.5.1) and the gate still excludes 0 parcels outright, because wetlands bind only the ground-mount minimum-acreage gate and parcels failing it fall back to rooftop (ground-mount eligibility dropped from 50,371 to 44,229 parcels). Prime farmland is a Stage-1 discount, not a gate input, and cannot produce exclusions. Until the gate excludes a parcel, treat it as a stated intention rather than a demonstrated filter.
- The rooftop usable-area derate is selected by parcel class, not per building. The derate (0.60 flat / 0.25 pitched) is chosen from the parcel's property class and applied to its single largest building, and roof area is the dominant rooftop driver (ablation top-1% churn 0.95). For a mixed-use parcel (residential class, large flat commercial roof) this can mis-estimate usable roof by up to ~2.4× (the ratio of the flat to the pitched derate). The fix is per-building, class-aware derating;11 the per-building roof signals exist only for NYC while the affected shortlisted parcels are upstate, so the durable fix is LiDAR-derived and is gated on outcome validity.12
- Reported roof area is a roofprint and may overstate the true footprint. Upstate building footprints are satellite-traced roofprints; because usable roof area dominates the rooftop ranking, this systematic inflation may be as material as the derate approximation, and no height or roof-type source currently corrects it.12
Tier 2: Fixable with data / pipeline work (scoped)
- Coverage is ten New York counties. Statewide is a roadmap item; every score-requiring outcome test is currently capped by this footprint (§6.2).
- Prime farmland was re-ingested footprint-wide in v0.5.1 but has not been independently ground-truthed,8 and there is no parcel-footprint subtraction (setbacks, internal roads) beyond the environmental overlap, so for many parcels net buildable acres still approximates total acres. The v0.5.1 wetland/floodplain re-ingest closed the larger version of this gap (environmental flags are now populated across all ten counties), but the farmland ground-truthing and footprint-subtraction items remain.
- Stage 2 is partially a stub. The LSRV value-stack flag is unpopulated: it is false for every parcel, pending an LSRV-area ingest, and exists today as schema and API plumbing only. Queue saturation is populated on every row, with unpublished queued-DG surfacing as 0 (§3.3). The size-aware interconnection-risk band is implemented as a size-only first cut;2 its breakpoints diverge from the SIR bright lines pending a code fix (§3, Stage 2), and its optional feeder-level CESIR-cost enrichment remains data-gated.
- Usable-roof-area has error sources the model does not capture: rooftop obstructions, fire-code setbacks, partial-polygon-vs-true-roof, tree/scan occlusion, footprint-vs-imagery temporal mismatch, and multi-building parcel linkage. Any of these can dominate usable-area error even with a correct flat/pitched derate, which is why a heavier roof fix is gated on outcome validity rather than pursued now.12
- Substation reconciliation is incomplete. Feeder-to-substation name matching achieves a 52.8%–87.1% match rate across utilities, an any-tier match fraction (exact, whole-token subset, or 2 km nearest), not a gold-set-validated recall. It affects only the data-readiness label and the substation citation, never the grid score, which keys on the nearest feeder line; unreconciled feeders are still scored.7
- Hosting capacity is a periodic snapshot. A parcel's score reflects the last published grid state (headroom before queued DG, hence the queue discount); the data-readiness label is gated on its recency (§3, Stage 3).
Tier 3: Inherent / minor (retained by choice)
- Slope is near-dead-weight on the current population (ablation top-1% churn 0.065). It is kept as mechanism-correct, but it currently barely moves the ranking.
- The buildable-area distribution is severely right-skewed. On the v0.5.1 data the 90th-percentile parcel has only ~0.95 buildable acres, and only ~18,224 parcels (~0.9%) have ≥ 25 usable acres, which is why the gate is archetype-aware (ground-mount ≥ 8 net ac; rooftop has no floor), so that dense urban parcels are not erased.
- The Con Edison-network rooftop discount (0.85) is provisional and evidence-contradicted. The realized CDG population skews to larger non-residential systems (median ~84 kW-DC), not the small net-metered systems the 0.85 softening assumed, so the rooftop network discount is likely too lenient (it should probably sit closer to the ground-mount 0.15 than to 1.0). We have not yet re-fit it because doing so credibly depends on the same outcome data the gate awaits.
8. Version history: v0.1 → v0.5.1
The score model is versioned independently of any release tag. The current engine reports v0.5.1;
the legacy additive engine reports v0.1.0. The live view is repointed with a single statement and
is instantly reversible: the v0.5.0, v0.4.0, v0.3.0, and v0.1.0 snapshots are all retained as
rollback targets.
Current live: v0.5.1 (flipped 2026-06-05).13 The latest change is a data correction, not a scoring-logic change: the environmental layers were re-ingested (most consequentially a wetland source-swap to the authoritative USGS-WIM National Wetlands Inventory service) and per-parcel flags were recomputed across all ten counties. This corrects an env-blind footprint in v0.5.0 (the environmental tables were largely unpopulated when v0.5.0 was scored), moving ~11% of parcels. The same frozen gate returns within-county lift@50 = 1.156 [0.836, 1.462]: still failing, still below the size baselines (§6.2). The flagship ground-mount shortlist, however, changed materially (the live top-50 retained only 6 of the prior 50) because v0.5.0 had been surfacing parcels that are genuinely 50–60% wetland; the corrected list is clean. The correction was adversarially verified, which caught and forced the fix of an environmental under-count in one county before the change went live.8
v0.5.0 (live 2026-06-04 → 06-05). A correctness pass with three engine changes: the flood/wetland double-count resolved (the discount made archetype-aware);1 the data-readiness label decoupled from substation-name reconciliation;5 and the Stage-2 interconnection-risk band implemented.2 A regression run through the same frozen gate held the lift unchanged (1.144 [0.824, 1.437]); the fixes improved construct validity without moving the outcome correlation.
v0.4: fixing the anti-ranking finding. The first outcome-ranking validation found that v0.3
anti-ranked energized installs (they landed below the population median; lift@50 0.39, worse than
random). The diagnosis identified two surfacing-blocking defects, fixed together in one re-score:
(1) the Con Edison-network proximity artifact (the radial-feeder distance inside network areas was a
coverage artifact suppressing strong urban parcels) was replaced by PROX_NETWORK_DEFAULT = 0.95;
and (2) the rooftop archetype, which had no size input, gained v_roof_area (weight 0.30, from the
buildable + slope share rooftop does not use). v0.4 then failed the pre-registered gate
(1.144 [0.833, 1.448]) but passed both internal-validity legs, and was flipped live as a labeled
improved, not-yet-validated interim.
v0.3: queue and network signals became real scored inputs (discount_queue and
discount_coned_network began firing on live data), the grid-proximity curve was re-anchored to
interconnection-cost economics (full decay by 5 km), and the network rooftop discount was softened
from 0.60 to 0.85.
v0.2: the four-stage gated additive-multiplicative re-architecture that replaced v0.1's purely
additive sum: the hard eligibility gate, the multiplicative (Σ wᵢ vᵢ) · Π dⱼ formula, continuous
monotone value functions, multiplicative discounts with neutral 1.0 "unknown" defaults, the
two-archetype structure with the first-eligible headline rule, and a confidence model in which
high is reachable. A mid-cycle fix corrected feeder selection to use the nearest feeder line
rather than the reconciled substation point, resolving ~1,489 wrong exclusions.
v0.1: the initial compensatory additive model (superseded). Eight inputs contributed signed
points against fixed caps. It had four fatal defects that motivated the rewrite: disqualifiers were
subtractable penalties (a high grid score could out-vote a fatal constraint); three inputs (queue,
opposition, VDER) were frozen at favorable neutrals, so ~30 of 100 points carried no signal and
inflated scores; the buildable term used coarse, mis-scaled step bands; and high confidence was
structurally unreachable.
Document errata (post-release corrections to this document, after v0.5.1 shipped).
- 2026-06-06. Three regulatory anchors were corrected after verification against the primary SIR
document: the SIR effective date (August 1, 2025; previously misstated as March 2025), the
interconnection review tracks (≤ 50 kW-AC simplified; above 50 up to 300 kW-AC expedited with a
UL 1741 supplement SA inverter, previously misstated as supplement SB; full review toward the
5 MW-AC ceiling above that), and the
v_buildableacreage anchors (re-attributed from the Model Solar Energy Local Law, which carries no acreage ratio, to the NREL land-use benchmark, Ong et al. 2013). §6.3 was reframed to all-cause conditional energization in the same change.3 - 2026-06-09. The posture was corrected from "at parity with simple size baselines" (wrong: the model's CI upper bound sits below every size baseline's point estimate) to "loses to size baselines"; "feasibility score" was relabeled "screening score"; "non-compensatory" was relabeled "gated additive-multiplicative"; and the exploratory lift@1/5/10 table was added to §6.2.10
- 2026-06-09. The §6.3 conditional gate was pre-registered as a numeric DRAFT artifact with a no-peek rule,9 and an external verification round closed the cost-sharing (C5) and VDER-attribution (C6) items now reflected in §3.2 and the glossary.14
Glossary
- CDG (community distributed generation): New York's program for shared community-solar projects; the source of our completed-install positives.
- Hosting capacity: the MW of new distributed generation a feeder can accept without grid upgrades, as published per-feeder by each utility.
- Feeder: a distribution circuit; the unit at which hosting capacity and queue pressure are published and at which we match parcels to the grid.
- Presence-only data: a dataset of observed successes (here, completed installs) with no labeled true negatives; absolute prevalence is not recoverable from it.
- Survivorship / demand confound: completed installs reflect feasibility and developer demand, market access, and timing jointly; the four are not separable from successes alone.
- Collider / Berkson selection effect: conditioning on a variable downstream of two causes (here, interconnection application) induces a spurious association between them; it opens, rather than closes, the feasibility–demand confound.
- Target-group-background (TGB) design: a presence-only evaluation that compares positives against a background of plausible candidates (here, roofed parcels) rather than all land, to difference out demand.
- Relative suitability index: a score that ranks parcels relative to one another; ordering is meaningful, absolute level is not a probability.
- Lift@k / within-county lift@k: the density of true installs in the model's top-k% relative to a baseline; within-county computes it inside each county so the metric is not just measuring geography.
- SIR: New York's Standardized Interconnection Requirements; the source of the monthly interconnection-queue inventory (including withdrawals).
- CESIR is the Coordinated Electric System Interconnection Review, the full study (and cost) generally required for systems above 300 kW-AC, up to the 5 MW-AC ceiling.
- VDER / LSRV is the Value of Distributed Energy Resources tariff and its Locational System Relief Value adder, the value-stack signals surfaced in Stage 2. VDER is a New York PSC construct (Phase One Order, March 9, 2017), implemented with NYSERDA. NYISO has no role in it.
- UL 1741 (supplement SA) is the inverter certification the current SIR requires for the expedited path, which is open to systems above 50 kW-AC up to 300 kW-AC. Supplement SB, aligned to IEEE 1547-2018, is the newer revision; the expedited exception in the current SIR text cites SA.
- DC:AC ratio: the ratio of a project's panel (DC) nameplate to its inverter (AC) rating (≈ 1.3 here); the regulatory ceilings are stated in AC.
Notes and references
This page is the public methodology of record, generated from the same document that governs the production engine. The references below are entries in Platt's internal, dated decision log and build specifications, which record when each choice was made and why; the full log, the frozen pre- registrations, and the source code are available to partners under diligence.
Footnotes
-
Flood/wetland discount made archetype-aware: neutral for ground-mount (where the usable- area loss is already counted in net buildable acres), retained for rooftop. ↩ ↩2
-
Stage-2 size-aware interconnection-risk band implemented as a size-only first cut with breakpoints at 300 kW-AC and 500 kW-AC. These predate the DL-030 SIR verification and diverge from the regulatory bright lines at 50 and 300 kW-AC; a code fix is queued (§3, Stage 2). ↩ ↩2 ↩3
-
Regulatory anchors verified against the primary SIR document and corrected (2026-06-06): effective date August 1, 2025; review tracks ≤ 50 kW-AC simplified, above 50 up to 300 kW-AC expedited under UL 1741 supplement SA, full review toward the 5 MW-AC ceiling; the 8/40-acre anchors re-attributed to the NREL land-use benchmark (Ong et al. 2013). The Stage-2 band's 300/500 kW-AC breakpoints predate this verification; a code fix is queued. ↩ ↩2
-
"Confidence" reframed as a data-readiness (fitness-for-use) rating; a field rename and a per-flag readiness panel are queued. ↩
-
Data-readiness label decoupled from substation-name reconciliation (the score keys on the nearest feeder line, not the reconciled substation). ↩ ↩2
-
Data-readiness research: cutpoints are not moved to rebalance the tier distribution. ↩
-
Feeder selection keys on the nearest feeder line (including unreconciled feeders), not the reconciled substation point. ↩ ↩2
-
Environmental cascade: NWI re-ingested via the USGS-WIM service, per-parcel flags recomputed across all ten counties, adversarially verified (an Erie under-count was caught and fixed before release). ↩ ↩2 ↩3 ↩4
-
Conditional-energization gate pre-registered as a numeric DRAFT (
docs/validation/conditional-energization-preregistration.md); the no-peek rule is in force until the freeze commit hash is recorded; companion resume/redirect/kill criteria are pre-specified indocs/re-evaluation-criteria.md. ↩ ↩2 ↩3 -
Posture and naming corrections (2026-06-09): the loses-to-size-baselines posture, the screening-score relabel, the gated additive-multiplicative relabel, and the exploratory lift@1/5/10 table (
docs/validation/metrics_v2026_06_09_liftk.json). ↩ ↩2 -
A per-building, class-aware roof derate (NYC roof-height/feature codes, upstate occupancy) was specified; the shipped pipeline used the parcel-class proxy pending the LiDAR fix. ↩
-
Roof fixes (per-building derate, roofprint inflation, and the broader usable-area error sources) deferred to a LiDAR-derived solution gated on outcome validity. ↩ ↩2 ↩3
-
v0.5.1 flipped live 2026-06-05; one-line reversible rollback to the v0.5.0 snapshot. ↩
-
External verification round (2026-06-09): the 2% cost-sharing cap and the 115%-of-CESIR petition (Case 24-E-0621) in §3.2, and the VDER attribution (PSC Phase One Order, March 9, 2017) in the glossary. ↩