Skip to content

Phase 17 and 17b — Mid-Review

Read 2026-10-28, after release R4. Backbone v0.31.0 (31dc0e53), UI v0.21.0 (2085b62), engine v0.6.0, deploy-prod run 39857310288 green on 2026-10-22. Ground truth: GitHub issues and merged PRs in the three repos, the trunk gates, scripts/rework_rate.py, scripts/prototype_registry_coverage.py and the walk records in the phase docs. Written by the Phase 18 planning session (step 0), because the framework of 2026-10-22 lets a phase close on 0 open build issues and a filed /parity-audit, with the owner's walks never a gate.

Phase frame and design record: phase-17-revamp.md (D1 to D22, V1 to V3). Corrections: phase-17b-walk-corrections.md (161 finding rows, K1 to K74, guardrails 1 to 12), the run model, the domain model, the fine-tune (FD-1 to FD-17, FT-1 to FT-29, BC-1 to BC-9) and the prototype inventory. This file records the verdict for 17 and 17b together (Phase 17b exit criterion 7).

Verdict

Built, released, and ready for the Phase 18 definition. Every build issue of the five milestones (Phase 17 and Phase 17b in the backbone and the UI, Phase 17b in the engine) is closed; both repos are released from gated SHAs and run on prod; the registry coverage prints unmapped: empty over the 212 live ids of the v2 snapshot. The phase pair closes when /parity-audit phase-17b is filed (framework practice 4). Two owner items stay open and do not gate: the phase-end walk on prod (#1655) and the PF-8 EAD read on #1501.

What to carry rather than celebrate: the whole-phase escape rate stayed above the 25 % breaker in both repos (backbone 0.29, UI 0.42, Phase 17b window; Phase 17's own window read 0.48 in the UI, 0.67 before harness fixes were set aside). Every trip inside the phase was repaired before the next wave, and the last windows read 0.20 and 0.00, but the design was reached through three walk stops, 33 + 11 + 10 delta issues and a fine-tune of the prototype, not by the first split. Phase 17 closed 115 issues and failed its walk on 2026-10-01; Phase 17b needed 341 more issues to reach the prototype. That cost is the lesson, and it is the first guardrail of Phase 18 (F-1, F-2).

What shipped

Release Date Backbone UI Deploy Carried
Phase 17 R1 2026-10-01 v0.27.0 at 433e12f5 v0.17.0 at 0640a63 36844235147 Waves B1–B28: one Explore workspace (Analyse · Compare · Events · Adapt), role lenses, the instrument-panel system with a dark theme, result and exposure aggregates as vector tiles (ADR-083), the Lookup place page, Portfolios, Data and Analyses rebuilt, Adapt v1 over a climate-adjusted future hazard, the Reports studio over report documents (ADR-085), Oasis LMF as the third engine (ADR-084), named actions and the flagged assistant (ADR-086)
17b R1 2026-10-08 v0.28.0 v0.18.0 37776281060 W0a and W0: the parity harness, prod-shaped seed, the portfolio crash (PF-1), a single future cell computes (EX-1), the run contract (ADR-087)
17b R2 2026-10-11 v0.29.0 v0.19.0 38175655511 W1 to W3: the two-step dock (1 Scope, 2 Run), "Run N cells", the place report, the Events lane, portfolio cards in their own unit
17b R3 / R3.1 2026-10-13 / 14 v0.30.0 / v0.30.1 v0.20.0 38398954001 / 38528649564 W4 and W5: Compare in place and in the address, Adapt's landing page and money appraisal, the engine fix for a future slice on a coarser grid (#1835)
17b R4 2026-10-22 v0.31.0 at 31dc0e53 v0.21.0 at 2085b62 39857310288 (after 39854228479 failed on the Oasis sidecar image; #1928 pinned it) W6: adaptation plans with an org-scoped CRUD API, cancellable queued jobs, report documents scoped to a portfolio, organisation branding, usage counts, dataset download and versions, uploads of curves, footprints, boundaries and NetCDF, admin reads for data requests, engines, queues and failures, event impacts with measures, the OpenAI assistant provider; Alembic 0113 → 0120
Count Phase 17 Phase 17b
Milestone issues (gh, trackers included) 39 backbone · 76 UI 135 backbone · 201 UI · 5 engine
PRs merged on main 55 backbone (v0.26.2..v0.27.0) · 136 UI (v0.16.1..v0.17.0) 227 backbone (v0.27.0..v0.31.0) · 358 UI (v0.17.0..v0.21.0, 176 feat, 105 fix)
Open build issues 0 0
Open trackers #1501 (owner item) #1655 (owner item)
ADRs ADR-083 to ADR-086 ADR-087, ADR-088

Prod runs v0.31.0 and v0.21.0. The six backbone commits past the tag are per-PR CI (#1927), the sidecar pins (#1928) and docs; the two UI commits are per-PR CI (#1271) and the parity profile (#1278). The engine moved v0.5.x → v0.6.0 (a combined cost-benefit run of a plan, benefit_years, npv_of_avoided, the loss curve outside the modelled return-period range).

The walk

2026-10-01, Phase 17's phase-end walk, failed (prod v0.27.0 / UI v0.17.0, #1501). Oasis passed its three-engine agreement (exit 0, +0.3965 %). Moments 1 to 4 failed: Lookup did not read as the place report, /portfolios crashed on a non-ISO unit (m3), every future Explore cell answered 422, event replay blinked, and adaptation had no visible way to be applied. The owner stopped part way through Moment 4. Seven read-only audits checked every screenshot against the code, the prototype and prod and produced the 73 findings and the ten causes recorded in phase-17b-walk-corrections.md.

2026-10-02, a second walk of Home, the shell, Explore, Lookup, Adapt, Settings and the assistant added 17 findings (SH-17 to SH-24, AS-1 to AS-3, EX-14 to EX-16, LK-13) and the request for a written run model. 2026-10-04 and 05, the owner reviewed the v2 prototype, raised eight points, decided eleven choices and marked every live registry entry "Looks right" (the fine-tune).

Walk stop 1, 2026-10-08 (prod v0.28.0 / UI v0.18.0, #1572): Home, Lookup, the Portfolios list, Analyses, Events, Adapt, Reports, Data, Settings, Admin and the 390 px pass all walkable; six findings (EX-24, EX-25, PF-13, SH-29, LK-16, LK-17), filed as boxes on open issues.

Walk stop 2, 2026-10-12 (prod v0.29.0 / UI v0.19.0, #1618): no core path dead. Moment 3 through both doors of Scope, "Run 2 cells", the strip, Save analysis, Compare, Moment 2's cards in their own units, Events, the demo slice's ingest, the assistant's two sentences, a failed run that ends its in-flight state. PF-8 held (the Evia book's card $1.4M equals its run's ead 1,423,594). Eight findings (EX-26 to EX-31, AS-5, EV-20), the worst being the 503s a whole-country result tile caused by holding every DB connection (EX-26: a statement timeout and a concurrency cap landed, and the plan read on prod found the app role losing the spatial index).

Walk stop 3, 2026-10-13 and 14 (prod v0.30.0 → v0.30.1 / UI v0.20.0, #1631): Moment 1 on three pins with the place report, This area and "Model the benefit"; Moment 4 steps 1 to 9 on two replay watches over /data/live_series/evia_2021_daily, with EV-10's cumulative loss monotone across six frames; Compare's saved comparison and "Compare engines" (climada and climate_lama 218,936,267, oasis 209,843,531, −4.2 %). One core path was dead on prod, Adapt's money appraisal (AD-18, a future slice on a coarser grid than its baseline); the fix shipped as R3.1 and the owner saw the appraisal the next day (benefit–cost ratio 3.61, payback 1.4 years). Ten findings (AD-18, EX-32, LK-18 to LK-22, SH-30, EV-21, PF-14), four admitted to the phase.

Walk stop 4, the phase-end walk (#1655, W7): not yet walked. R4 shipped on 2026-10-22 and the owner has not walked it. It stays open as an owner item with no gate on it (framework 2026-10-22: "owner walks never gate"). Its boxes that are the owner's reads are exit criteria 1, 2, 8, 9 and 11 below; the rest are recorded here.

Open owner items, neither gating:

  • #1655 — the phase-end walk of Moments 1 to 4, the demo slice, Reports, Data, History, Home, Settings and Admin on prod data only, plus Home, Lookup and Events at 390×844; the Linux baselines accepted against the v2 captures; the Moment 3 run through both doors; the assistant's live sentence on prod. Findings become found-in:phase-17b issues or Phase 18 items.
  • #1501, PF-8 — read a USD portfolio card's EAD against GET /v1/results/{latest_result_id} on prod and record it; the agent's read at walk stop 2 held, the owner's own read is the box. #1501 closes with #1655.

Exit criteria — Phase 17 (re-checked, criterion 7 of Phase 17b)

# Criterion Verdict
1 Build issues at 0 open on Phase 17 -- Revamp in both repos MET — 39 backbone, 76 UI, all closed since 2026-10-01
2 One phase-end walk by the owner on prod after the release Walked and failed 2026-10-01; re-walked in three stops under Phase 17b; the phase-end re-walk is #1655, open, an owner item that does not gate
3 Measured: ≥ 30 FPS p5 on the 10M fixture, p95 first tile < 500 ms at z 4–6, < 500 MB; no-page-scroll at 1440×900 and the 390-px checks green with prove-it-fails; colour guard below baseline MET on the perf path — performance.yml run 36583672654 (2026-09-29, 93aa71bf): fps_p5 60, tile_p95_ms 346.9, rss_mb 226.77. Layout proofs re-made under 17b — the original assertNoPageScroll could not fail (SH-7); the Phase 17b harness measures the view root ([assertNoHorizontalOverflow] … view root 390 vs main 390 in e2e-smoke 39865374909) and the visual project renders every view at 1440×900 and Home, Lookup and Events at 390×844 in the pinned Linux image. The colour guard rides ci.yml
4 Contracts covered by tests/e2e/smoke/contract-map.ts or the named conformance job MET — the Oasis conformance scenario passes inside e2e-smoke (OasisPiWind 2.5.7 case_0 reproduced within tolerance, run 40539723164) and oasis-conformance.yml gates the sidecar paths; the assistant, measures, report-document, tile, coverage and curve-basis contracts are the smoke specs of their 17b issues
5 Offline acceptance: every external provider unset, every view renders MET — tests/e2e/smoke/offline-basemap.spec.ts on every push to main; the visual project runs with the offline basemap
6 Guardrails hold and the escape rate is ≤ 25 % NOT MET as a whole-phase read — see the breaker below. Repaired in-phase; recorded, not waived
7 Record: mid-review, plan.md banner, the Phase 18 charter stub, ADRs for D4, D10, D11 and the Oasis sidecar MET — this file; the plan.md banner and the stub were written at #1500; ADR-083 (tiles, D4), ADR-085 (report documents, D10), ADR-086 (named actions, D11), ADR-084 (Oasis)

Exit criteria — Phase 17b

# Criterion Verdict
1 The owner walks every surface on prod after the W7 release with no [CRITICAL] open Owner item (#1655) — walk stops 1 to 3 walked every surface at least once with every CRITICAL fixed and seen on prod; the W7 re-walk is open and does not gate
2 Linux baselines at 1440×900 (and 390×844) accepted against the v2 captures; no design difference on any view issue Owner item (#1655) for the acceptance; the wave gates posted the difference lists on every view issue and every view issue closed with its design box ticked (K53)
3 The final wave gate shows the prod-shaped seed, 0 unexpected skips, layout proofs on the view root MET — e2e-smoke 39865374909 at 2a81299 (2026-10-22): 275 passed, 6 skipped (the assistant_live lane and the declared stack-only specs), 2 flaky, the view-root assertions logged per view
4 Every breaker trip recorded with its repair set; the last window ≤ 0.25; the whole-phase read reported here MET as a record — the trips of 2026-10-18 (backbone 0.33, UI 0.80) and 2026-10-19 (0.50 on small samples) are in the plan.md status log with their repair sets (ui#1213, #1900); the last windows read 0.20 and 0.00; the whole-phase read is below
5 Every walk:mid tracker closed as completed MET — #1572, #1618 and #1631 closed by the owner's ruling, findings filed by the delta splits
6 The prototype inventory prints unmapped: empty over the 212 live registry ids MET — scripts/prototype_registry_coverage.py on 2026-10-28: 221 entries (212 live, 9 superseded), 338 issues read, 206 mapped, 6 prototype only (shell-7, shell-8, shell-9, explore-27, explore-44, adapt-19), unmapped: empty
7 Phase 17's exit criteria 2 to 7 re-checked; this file records 17 and 17b together MET — above
8 Moment 3 on prod through the two-step dock and both doors, every limit line read Walked at walk stop 2 (A place: Greece narrowed to Attica and Aegean, 729 locations, Today and SSP2-4.5 2030 with one measure; My assets: the Evia 2021 book); the W7 re-read is #1655's
9 The assistant completes the Greece sentence on prod; assistant-run.spec.ts green with 0 skips Half met — the place, region, portfolio and score-only sentences are green on the smoke stack (run 40539723164, assistant_live skipped as declared); the prod sentence against the live provider is #1655's
10 SP-3's inventory lists every owner-approved deviation and the "prototype only" entries; no issue builds one MET — the inventory's deviations (SH-17, SH-23/24, EX-16/K36) and the six prototype-only ids; the coverage run above
11 The domain-model figures read right on prod: PF-8, PF-9, PF-10, EX-17, EV-10 Read by the agent at walk stops 2 and 3 (PF-8 $1.4M = ead 1,423,594; EV-10's six cumulative frames monotone; EX-17's stored pairs; PF-9 and PF-10 on the cards); the owner's own read is #1655's

The circuit breaker — rework at close

scripts/rework_rate.py --follow-ups --json, run 2026-10-28 (window hours 72):

Repo Window Builds Escapes Escape rate Partial rate Coverage Harness fixes (not counted)
climate-lama Phase 17, 2026-09-28 → 10-02 34 5 0.15 0.26 1.00 2
climate-lama-ui Phase 17, 2026-09-28 → 10-02 75 36 0.48 0.12 0.97 16
climate-lama Phase 17b, 2026-10-02 → 10-28 106 31 0.29 0.03 0.78 4
climate-lama-ui Phase 17b, 2026-10-02 → 10-28 105 44 0.42 0.04 0.83 25

The Phase 17 window as the phase doc recorded it on 2026-10-01 (--since 2026-09-28 --escapes-only) read UI 0.67 (50 of 75 builds), backbone 0.18 (6 of 34); the 2026-10-28 re-read above is lower only because the script now leaves harness fix PRs out of the escapes (16 in the UI, 2 in the backbone), as the framework of 2026-10-22 says. The UI ran 28 waves past the breaker because nothing executed it; Phase 17b wired the breaker into /phase-build (guardrail 5) and every later trip stopped the lane until its repair set landed.

Both Phase 17b whole-phase rates sit over the 0.25 line. They are not waived: the framework's breaker is a per-window stop, every window's trip was repaired, and the whole-phase read is what criterion 4 asked to be reported "whatever its value". Read as a product signal, 0.42 in the UI says that a view built from a component-level issue was corrected on average once before it matched the design, even with the parity captures in hand from W0a onward. The per-tier table shows no tier better than another (backbone Opus · high · tier 2: 0.17 fixes and 0.11 follow-ups per build over 88 builds; tier 3: 0.20 and 0.10 over 10), so the lever is the issue, not the model.

Findings

F-1 · The first split cannot reach the design from component issues — [ENHANCE-NEXT]

Phase 17 wrote 115 issues naming one component each and tested them in jsdom; the walk failed on the experience. Phase 17b reached the design, but through a run model written after the split, a prototype fine-tune, three walk stops and 54 delta issues. The guardrails that made 17b converge (parity captures as the design, a state file per issue, the gate's difference list, prod-shaped fixtures, layout proofs on the view root, a Prover: on every stack box) are the Phase 18 split's entry bar, not something added after its first wave. Lands: Phase 18 design record, guardrails.

F-2 · The escape rate as a whole-phase read is over the breaker in both repos — [ENHANCE-NEXT]

0.29 and 0.42 (above). The per-window breaker worked from 2026-10-08 on; what it cannot do is lower the number of corrections a view needs. Phase 18 keeps the breaker, reads the whole-phase rate at each /phase-analyze, and sizes its UI slice so that a trip stops fewer than ten issues at a time. Lands: Phase 18 guardrails and wave table.

F-3 · The e2e-smoke run on main is red on a docs-only commit — [ENHANCE-NOW]

e2e-smoke 40539723164 at ab69f14e (#1278, the parity profile): adapt-plan.spec.ts:46 and lookup-actions.spec.ts:151 failed twice, seed.spec.ts:850 once (the watch with an uncomputed observation, 5.2 min), 12 specs did not run; e2e-visual 40592457310 at the same sha failed. The previous run at 2a81299 was green with 2 flaky. Nothing in src/ changed between them, so this is stack flakiness, timeouts of several minutes on the seed, not a regression, but a red gate on main is what the parity audit and every Phase 18 builder reads next. One /fix on the UI's smoke timing before Phase 18's first wave. Lands: found-in:phase-17b on the UI, filed by the audit or by the owner.

F-4 · Two found-in:phase-17b issues are open with no milestone — [BACKLOG]

ui#1249 (Engines cards show liveness and method notes, supersedes K74; needs a backbone liveness read) and ui#1177 (the distance from a place to an event's footprint on past-event cards; needs a backbone route). Both are backbone-first. They enter the Phase 18 stub as "found-in:phase-17b", and the planning session decides whether the slice takes them. Lands: Phase 18 doc, Phase 19+ stub.

F-5 · The walk record is the owner's rulings plus the agent's reads, not per-step artefacts — [BACKLOG]

Walk stops 1 to 3 recorded ids, figures and job ids for the agent's reads (EX-1, PF-8, EV-10, EX-26's plan read) but the owner's own steps are summarised in prose ("What passed"). Same as Phase 16's F-1. /parity-audit now produces the per-view artefact that the walk did not, so the walk list the owner gets is at most 15 items with a capture each. Lands: already practice.

F-6 · Unsourced regulatory wording stayed unverified through the phase — [BACKLOG]

Reports ship ORSA as wording_to_verify (#1865) and the CSRD/ESRS E1, EU Taxonomy and IFRS S2 templates carry "to verify" labels (D10, guardrail 7). No Phase 17 or 17b issue read the published texts. Phase 18's market rescan brings regulation in only with a verifiable source (Greek law 5116/2024, EIOPA, CSRD/ESRS E1), and the planning session marks everything else [ASSUMPTION]. Lands: Phase 18 design record.

Findings summary

Id Finding Tag Lands
F-1 The first split cannot reach the design from component issues [ENHANCE-NEXT] Phase 18 guardrails
F-2 Whole-phase escape rate over the breaker (0.29, 0.42) [ENHANCE-NEXT] Phase 18 guardrails and wave table
F-3 e2e-smoke red on main at ab69f14e on a docs-only commit [ENHANCE-NOW] one UI /fix before the Phase 18 first wave
F-4 ui#1249 and ui#1177 open, no milestone [BACKLOG] Phase 18 doc or the Phase 19+ stub
F-5 Walk record is prose plus agent reads [BACKLOG] /parity-audit artefacts
F-6 Regulatory wording unverified [BACKLOG] Phase 18 market rescan

Found-in issues at the close

Repo found-in:phase-17 found-in:phase-17b
climate-lama 0 open · 0 closed 0 open · 9 closed
climate-lama-ui 0 open · 2 closed 2 open (ui#1249, ui#1177) · 17 closed

Parity audit pending. /parity-audit phase-17b had not been filed at this read: no comment on #1655 names a parity-audit <date> at <sha> for UI 2a81299 or ab69f14e. A sibling session runs it on 2026-10-28; the found-in:phase-17b issues it files are folded into the Phase 18 doc when they exist, and the phase pair closes once the audit comment is on #1655.

What the next phase inherits

  • The two open owner items, #1655 and #1501's PF-8 read: owner walks at will, never a gate.
  • ui#1249 and ui#1177 (found-in:phase-17b), plus whatever the parity audit files.
  • A red e2e-smoke and e2e-visual on UI main at ab69f14e (F-3).
  • The Phase 18 charter stub in plan.md: about 40 deferred items across engines and loss (D19), the charter deferrals (D21), the property-level build (D18), the run-model and domain-model deferrals, the fine-tune's per-country batch and measure shortlist, the SH-10 items and the owner's rulings K57 to K71.
  • The lesson of F-1 and F-2 as the Phase 18 split's entry bar: parity captures and a Prover: on every stack box from the first issue, prod-shaped fixtures, layout proofs on the view root, the breaker read per window and per phase.