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, checkoutC:\Users\gkalomalos\Projects\develop\climate-lama. - UI:
CortoMaltese3/climate-lama-ui, checkoutC:\Users\gkalomalos\Projects\develop\climate-lama-ui. This is/phase-build's sibling lane. - Engine:
CortoMaltese3/climate-lama-engine, checkoutC:\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-buildsession from the engine checkout with bare#Ntargets. The engine repo has nomilestone:*,type:*orsize:*labels yet, so create them there before filing. - Push as
CortoMaltese3(remotes use thegithub-personalalias). Everyghcall that targets a sibling names-R <owner/repo>. Cross-repoDeps:are writtenowner/repo#N.
The documents, in order of authority¶
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 threewalk:midstops), "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.docs/plan/phase-17b-run-model.mdanddocs/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.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).- The UI repo's
docs/prototype/mapping.md(plus the prototype snapshot underdocs/prototype/source/): the per-view inventory until SP-3 writesphase-17b-prototype-inventory.md. Coverage (guardrail 10) is checked against its rows; printunmapped:and it must be empty. Its deviation paragraph lists the owner-approved departures (SH-17, SH-23, SH-24, EX-16). docs/plan/showcase-script.mdandCLAUDE.md(the demo slice, now exposure first) for the moments the issues advance.- Code-truth docs (
docs/CLIMATE_LAMA.md,docs/DECISIONS.md, the UI'sdocs/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": ifgit -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 correctionsin all three repos and its label ismilestone:phase-17b./phase-splitcreates labels, never milestones: before the create step, rungh api repos/CortoMaltese3/<repo>/milestones -f title="Phase 17b -- Walk corrections"in each repo whosegh api repos/CortoMaltese3/<repo>/milestones --jq '.[].title'lacks it, and pass--milestone "Phase 17b -- Walk corrections"on everygh issue create. found-in:*open issues: 0 in the backbone (labelsfound-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 reportdrained: admitted · closedas the skill requires.- No
Phase 17bmilestone 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
bothbecome two issues, a backbone one and a UI one, the UI one withDeps: 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), neverfix(...):fixis reserved for a defect found in a 17b build, soscripts/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 nodefer: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 inDeps:and marksrc/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-buildsessions 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'sCLAUDE.mddeclares 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'srp_protectmigration 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-buildcommand 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. TheAftercolumn serialises every other session. - Walk stops are
walk:midtrackers (three, perreferences/trackers.md), each with a release before it. Every build issue in every group after a stop lists the latest preceding stop's tracker inDeps:, 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 listCortoMaltese3/climate-lama#<stop 1>. The phase-end walk is one newwalktracker 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,:460and:371-389withclimate_lama_engine/cost_benefit.py:42, 105-127; file one backbone issue "engine pin bump (uv.lock)" withDeps: CortoMaltese3/climate-lama-engine#<EN-7>, CortoMaltese3/climate-lama-engine#<EN-8>; AD-12, AD-13 and AD-14 list the pin-bump issue inDeps:. The E1 row's command is the/phase-buildline 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 aspiketracker (model: none,Blocker: agent,Run:writedocs/plan/exploration/basemap.mdthrough 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:writedocs/plan/phase-17b-prototype-inventory.md,Proof:the delta split printsunmapped:empty). SP-2 is three items: (a) aspiketracker,Blocker: agent, in which the orchestrator reads the claude.ai artifact or copies the UI repo'sdocs/prototype/source/snapshot, commitstests/e2e/parity/prototype-src/**and renders the baselinestests/e2e/parity/prototype/<view>.pngin the pinned Playwright image through WSL Docker, landed by a PR; (b) anopstracker,Blocker: agent, for thee2e-run.sh visualmode in~/.claude/scripts/local-e2e-gate/, which lives outside every repo; (c) one buildable UI issue, typetest, sized by/analyze, for thevisualproject inplaywright.config.ts,parity.spec.tsand the CIcontainer:job,Deps:(a) and (b), carrying the prove-it-fails box (8 px padding red, baseline green) as astackPendingbox the W0a wave gate runs. Guardrail 1's parity box on every W1+ UI view issue names SP-2 (c) inDeps:and is markedstackPending. - 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 undertests/fixtures/, listed in the W0a issue'sFiles:, loaded byscripts/smoke_e2e.pyand 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 theneeds-prod-prooflabel, 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 #Nfor partial scope,Resolves #Nonly on the final PR of an issue. Nevergh issue editan 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:againstmapping.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 asowner/repo#N, no shorthand.- The phase-doc annotation PR (per
references/docs-pr.md) that writes the wave table intodocs/plan/phase-17b-walk-corrections.mdand flips its status line from "not yet split" to "split". - The closeout block from
~/.claude/protocols/closeout.md,next:= W0a's first/phase-buildline. Keep every printed line under 100 characters and never print a raw markdown table in the terminal outside the one wave table.