Skip to content

Prompt — split Phase 17b into build-ready issues

Run /phase-split docs/plan/phase-17b-walk-corrections.md from the backbone checkout C:\Users\gkalomalos\Projects\develop\climate-lama (trunk main). You have no conversation context. Everything you need is in the repos and the documents below. Do not build anything (no --build), change no code, and never add the ci label to a PR.

The repos

  • Backbone: CortoMaltese3/climate-lama, checkout C:\Users\gkalomalos\Projects\develop\climate-lama.
  • UI: CortoMaltese3/climate-lama-ui, checkout C:\Users\gkalomalos\Projects\develop\climate-lama-ui. This is /phase-build's sibling lane.
  • Engine: CortoMaltese3/climate-lama-engine, checkout C:\Users\gkalomalos\Projects\develop\climate-lama-engine. It takes wave E1 only (EN-7's engine half and EN-8) and is NOT a second sibling lane: E1 runs as its own /phase-build session from the engine checkout with bare #N targets. The engine repo has no milestone:*, type:* or size:* labels yet, so create them there before filing.
  • Push as CortoMaltese3 (remotes use the github-personal alias). Every gh call that targets a sibling names -R <owner/repo>. Cross-repo Deps: are written owner/repo#N.

The documents, in order of authority

  1. docs/plan/phase-17b-walk-corrections.md: the phase doc. 116 finding rows (PF, SH, LK, EX, EV, AD, EN, AS, DT, RP), guardrails 1 to 11, decisions K1 to K32, the "Item groups" wave table (W0a, W0, W1, E1, W2, W2b, W3, W4, W5, W6, W7 with three walk:mid stops), "Ops and owner items", exit criteria. Read its header: the split was authorised on 2026-10-02 with Reports, Data, Analyses, Admin and the 390 px pass still unwalked; those findings enter through Walk stop 1's delta split.
  2. docs/plan/phase-17b-run-model.md and docs/plan/phase-17b-domain-model.md: the business logic. Guardrail 11: every issue that touches a run input, a compute or rollup or measure or live-lane field cites the section or the finding row it implements and uses those names verbatim (exposure_dataset_ids, scope, exposure_growth_rate, measure_ids, cells, rp_protect, benefit_years, combined, event_key, cumulative, band_distribution, ead_by_hazard, and the rest of the guardrail's list). A field neither doc nor a row names is Out-of-scope.
  3. docs/plan/phase-17-revamp.md: direction lock V1 to V3 and design record D1 to D22, which still bind (D1 and the Explore frame line carry 2026-10-02 amendments in place).
  4. The UI repo's docs/prototype/mapping.md (plus the prototype snapshot under docs/prototype/source/): the per-view inventory until SP-3 writes phase-17b-prototype-inventory.md. Coverage (guardrail 10) is checked against its rows; print unmapped: and it must be empty. Its deviation paragraph lists the owner-approved departures (SH-17, SH-23, SH-24, EX-16).
  5. docs/plan/showcase-script.md and CLAUDE.md (the demo slice, now exposure first) for the moments the issues advance.
  6. Code-truth docs (docs/CLIMATE_LAMA.md, docs/DECISIONS.md, the UI's docs/CLIMATE_LAMA_UI.md) describe today's behaviour. The phase doc is a claim about the repo, not its state: ground every item in the code before drafting it, as the skill requires.

Live facts to re-verify first (true at 2026-10-02 19:00 UTC)

  • Trunks: read them live (git -C <checkout> fetch -q origin main && git rev-parse --short origin/main). The backbone trunk must contain the header paragraph "Split authorised 2026-10-02": if git -C <backbone> show origin/main:docs/plan/phase-17b-walk-corrections.md | grep -c "Split authorised" prints 0, halt and report. UI trunk at hand-off: 1668e5fd. No open PRs in either repo at hand-off.
  • The milestone title is exactly Phase 17b -- Walk corrections in all three repos and its label is milestone:phase-17b. /phase-split creates labels, never milestones: before the create step, run gh api repos/CortoMaltese3/<repo>/milestones -f title="Phase 17b -- Walk corrections" in each repo whose gh api repos/CortoMaltese3/<repo>/milestones --jq '.[].title' lacks it, and pass --milestone "Phase 17b -- Walk corrections" on every gh issue create.
  • found-in:* open issues: 0 in the backbone (labels found-in:phase-14, found-in:phase-15) and 0 in the UI (found-in:phase-14/15/16/17). Run the drain query anyway and report drained: admitted · closed as the skill requires.
  • No Phase 17b milestone exists in any repo. The backbone's Phase 17 milestone holds two open items that are NOT 17b's: #1501 (the Phase 17 owner walk and mid-review tracker) and #1499 (Oasis ops). Do not duplicate or move them. #1300 (Phase 15) is EV-9's subject, cited not re-filed.
  • The owner confirmed three decisions on 2026-10-02 that rows already carry: K25 (the value-weighted band stays, labelled, beside a band distribution), K28 (no thresholds or subscriptions in the live lane, ADR-078 item 6), K32 (engine changes land in this phase, wave E1).

Split-specific rules for this phase

  • Rows tagged both become two issues, a backbone one and a UI one, the UI one with Deps: CortoMaltese3/climate-lama#<backbone issue>. Some Change cells carry "Backbone:" and "UI:" prefixes (PF-9, EX-14, EV-8, EV-10, EV-11, EV-14, EV-16, AD-1, AD-12, AD-13, AS-2, EN-7). These do not: SH-23, PF-8, PF-10, RP-1, AD-11, AD-15, AD-16, AS-1 (its halves are (a) and (b)), EV-12, EV-13, and the older PF-2, PF-3, PF-4, SH-3, DT-4, LK-9, PF-6, EX-1, EV-4, EV-7, AD-4, AD-7, AD-8, AD-9, EN-4. For those, derive each half from the code and write the cut into the issue's Context; when one half is empty, file one issue and state "UI: none" or "Backbone: none". LK-13, EX-15 and EX-16 are single-repo rows.
  • Titles and bodies for the breaker. Every planned item is titled by what it builds (feat, refactor, perf, ci, test, docs), never fix(...): fix is reserved for a defect found in a 17b build, so scripts/rework_rate.py's unattributed-fix count measures 17b rework and not the planned corrections of Phase 17. No body opens a line with "Found by", "Split out of", "Deferred from" or "Follow-up"; cite the finding id ("Finding: PF-8") instead.
  • SH-10's deferrals. plan.md's Phase 18 stub does not yet list SH-10's items (ui#551, ui#552, ui#553, ui#555, ui#556, ui#538, ui#530, ui#531, ui#532, ui#533, ui#536, ui#535, ui#565, ui#559, ui#524). File SH-10 as one W6 backbone docs issue with one - [ ] box per source issue (each lands through SH-16 or the stub gains a line naming it). Until that lands no defer: may point at the stub for these items (guardrail 7).
  • PF-1 depends on W0a's guardrail-8 issue (the never-throwing formatAmount): list it in Deps: and mark src/i18n/format.ts (hotspot), because W0a and W0 share one session.
  • The wave table's rows are groups, not sessions. Cut each group into /phase-build sessions of at most 5 issues, budget each from the serial-chain estimate plus the 20-minute gate reserve, and give any session over 120 minutes an explicit --max-runtime. Every command carries --no-pr-ci (the backbone's CLAUDE.md declares on-demand CI). Respect the merge orders the Notes cells declare: W1's rollup chain PF-10 → PF-9 → PF-11 and migration chain DT-1 → DT-2 → DT-5, W3's migration chain EV-11 → EV-10 → EV-12 → EV-14, W4's single AD-4 migration carrying AD-11, AD-14 and AD-15 columns, SH-21's Button before the other W1 UI issues, EX-15 before EX-14 and EX-16, EX-17 and PF-8 and AD-2's rp_protect migration in W0.
  • "Beside" means one session, never two. Groups the doc says run beside each other (W0a with W0, W2 with W2b and W3, W4 with W5) share one /phase-build command whose independent set runs in parallel. Two 17b sessions never run in the same repo at once (/phase-build's lane check counts every builder worktree as a lane, and the UI sibling lane is one per session). The engine E1 session is the only concurrent one. The After column serialises every other session.
  • Walk stops are walk:mid trackers (three, per references/trackers.md), each with a release before it. Every build issue in every group after a stop lists the latest preceding stop's tracker in Deps:, not only the next group: W1, W2, W2b, W3 and the engine pin bump list stop 1, W4 and W5 list stop 2, W6 lists stop 3, and E1's engine issues list CortoMaltese3/climate-lama#<stop 1>. The phase-end walk is one new walk tracker in W7 (not #1501).
  • Engine wave E1: file EN-7 (engine half) and EN-8 in the engine repo quoting, in the engine checkout, docs/CLIMATE_LAMA_ENGINE.md:259-260, :460 and :371-389 with climate_lama_engine/cost_benefit.py:42, 105-127; file one backbone issue "engine pin bump (uv.lock)" with Deps: CortoMaltese3/climate-lama-engine#<EN-7>, CortoMaltese3/climate-lama-engine#<EN-8>; AD-12, AD-13 and AD-14 list the pin-bump issue in Deps:. The E1 row's command is the /phase-build line run from the engine checkout, and that session reads the breaker from the backbone checkout (python ../climate-lama/scripts/rework_rate.py --repo CortoMaltese3/climate-lama-engine --since <the engine milestone's earliest createdAt> --follow-ups --json) and the phase doc at ../climate-lama/docs/plan/phase-17b-walk-corrections.md; write that into the row's command cell.
  • Spikes and the harness (per references/trackers.md): SP-1 is a spike tracker (model: none, Blocker: agent, Run: write docs/plan/exploration/basemap.md through a docs PR, Proof: that PR merged; rides W1, feeds SH-2b, LK-5, EX-7, SH-19). SP-3 has the same shape (Run: write docs/plan/phase-17b-prototype-inventory.md, Proof: the delta split prints unmapped: empty). SP-2 is three items: (a) a spike tracker, Blocker: agent, in which the orchestrator reads the claude.ai artifact or copies the UI repo's docs/prototype/source/ snapshot, commits tests/e2e/parity/prototype-src/** and renders the baselines tests/e2e/parity/prototype/<view>.png in the pinned Playwright image through WSL Docker, landed by a PR; (b) an ops tracker, Blocker: agent, for the e2e-run.sh visual mode in ~/.claude/scripts/local-e2e-gate/, which lives outside every repo; (c) one buildable UI issue, type test, sized by /analyze, for the visual project in playwright.config.ts, parity.spec.ts and the CI container: job, Deps: (a) and (b), carrying the prove-it-fails box (8 px padding red, baseline green) as a stackPending box the W0a wave gate runs. Guardrail 1's parity box on every W1+ UI view issue names SP-2 (c) in Deps: and is marked stackPending.
  • Guardrail 2's seed has to be committed, not fetched. The m3, persons, USD and EUR books and the one region-tagged SSP river-flood dataset (region "Greece", one SSP scenario, one future horizon) are small synthetic fixtures under tests/fixtures/, listed in the W0a issue's Files:, loaded by scripts/smoke_e2e.py and the UI seed. No ingest pack and no network fetch runs in the smoke or the wave gate.
  • Credentials leave the milestone: credential: OPENAI_API_KEY (AS-3) and the imagery provider key SP-1 picks (SH-19) are standing-ops trackers without the milestone. Prod-only proofs take the needs-prod-proof label, never an acceptance box. The owner prod checks in "Ops and owner items" are ops rows, not issues.
  • SH-9 is superseded by SH-24: no issue; SH-24's issue closes it in its PR body.
  • Decisions are settled. K1 to K32 are not re-opened and no tracker is filed for a choice. A new choice inside the split runs the framework's decision protocol (one refuter, at most 10 tool calls) and is recorded as Decision (auto, <date>): <A> over <B> — <why> — reassess: <verdict> in the issue's Context.
  • Issue bodies use --body-file (never inline --body), Refs #N for partial scope, Resolves #N only on the final PR of an issue. Never gh issue edit an issue outside this split's own set.

What to print as proof before the closeout

  • drained: line, the label and milestone creation per repo, the count of issues per repo and per wave, every finding id mapped to exactly one issue (grep each id across the drafted bodies and print the misses, which must be none), unmapped: against mapping.md (must be empty), the conflict-hotspot map, and the one wave table with full pasteable commands (| Wave | Command | After | Owner | Budget (min) | Covers |), sibling items as owner/repo#N, no shorthand.
  • The phase-doc annotation PR (per references/docs-pr.md) that writes the wave table into docs/plan/phase-17b-walk-corrections.md and flips its status line from "not yet split" to "split ".
  • The closeout block from ~/.claude/protocols/closeout.md, next: = W0a's first /phase-build line. Keep every printed line under 100 characters and never print a raw markdown table in the terminal outside the one wave table.