roadmodel 0.2.85__tar.gz → 0.2.86__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. {roadmodel-0.2.85 → roadmodel-0.2.86}/PKG-INFO +3 -2
  2. {roadmodel-0.2.85 → roadmodel-0.2.86}/README.md +2 -1
  3. {roadmodel-0.2.85 → roadmodel-0.2.86}/docs/claude-commands/roadmap-refresh.md +43 -38
  4. {roadmodel-0.2.85/roadmodel/data → roadmodel-0.2.86/docs/claude-commands}/roadmap-step.md +24 -3
  5. {roadmodel-0.2.85/roadmodel/data → roadmodel-0.2.86/docs/templates}/phase-roadmap-template.md +86 -40
  6. {roadmodel-0.2.85 → roadmodel-0.2.86}/docs/templates/planning-kit-how-to-use.md +13 -0
  7. {roadmodel-0.2.85/roadmodel/data → roadmodel-0.2.86/docs/templates}/project-roadmap-template.md +59 -47
  8. {roadmodel-0.2.85/roadmodel/data → roadmodel-0.2.86/docs/templates}/prompt-phase-roadmap.md +36 -22
  9. {roadmodel-0.2.85 → roadmodel-0.2.86}/docs/templates/prompt-project-roadmap.md +21 -16
  10. {roadmodel-0.2.85 → roadmodel-0.2.86}/pyproject.toml +3 -1
  11. {roadmodel-0.2.85/docs/templates → roadmodel-0.2.86/roadmodel/data}/phase-roadmap-template.md +86 -40
  12. {roadmodel-0.2.85 → roadmodel-0.2.86}/roadmodel/data/planning-kit-how-to-use.md +13 -0
  13. {roadmodel-0.2.85/docs/templates → roadmodel-0.2.86/roadmodel/data}/project-roadmap-template.md +59 -47
  14. {roadmodel-0.2.85/docs/templates → roadmodel-0.2.86/roadmodel/data}/prompt-phase-roadmap.md +36 -22
  15. {roadmodel-0.2.85 → roadmodel-0.2.86}/roadmodel/data/prompt-project-roadmap.md +21 -16
  16. {roadmodel-0.2.85 → roadmodel-0.2.86}/roadmodel/data/roadmap-refresh.md +43 -38
  17. {roadmodel-0.2.85/docs/claude-commands → roadmodel-0.2.86/roadmodel/data}/roadmap-step.md +24 -3
  18. {roadmodel-0.2.85 → roadmodel-0.2.86}/scripts/update_projects.py +60 -0
  19. {roadmodel-0.2.85 → roadmodel-0.2.86}/src/roadmodel/__init__.py +1 -1
  20. {roadmodel-0.2.85 → roadmodel-0.2.86}/src/roadmodel/cli.py +89 -9
  21. {roadmodel-0.2.85 → roadmodel-0.2.86}/src/roadmodel/mcp_server.py +44 -3
  22. {roadmodel-0.2.85 → roadmodel-0.2.86}/src/roadmodel/recommend.py +43 -2
  23. {roadmodel-0.2.85 → roadmodel-0.2.86}/src/roadmodel/scoring.py +212 -66
  24. roadmodel-0.2.86/src/roadmodel/series.py +51 -0
  25. {roadmodel-0.2.85 → roadmodel-0.2.86}/.github/README.md +0 -0
  26. {roadmodel-0.2.85 → roadmodel-0.2.86}/.gitignore +0 -0
  27. {roadmodel-0.2.85 → roadmodel-0.2.86}/LICENSE +0 -0
  28. {roadmodel-0.2.85 → roadmodel-0.2.86}/NOTICE +0 -0
  29. {roadmodel-0.2.85 → roadmodel-0.2.86}/docs/benchmarks.json +0 -0
  30. {roadmodel-0.2.85 → roadmodel-0.2.86}/docs/catalog.json +0 -0
  31. {roadmodel-0.2.85 → roadmodel-0.2.86}/docs/claude-commands/roadmap-phase.md +0 -0
  32. {roadmodel-0.2.85 → roadmodel-0.2.86}/docs/claude-commands/roadmap-project.md +0 -0
  33. {roadmodel-0.2.85 → roadmodel-0.2.86}/docs/claude-commands/roadmodel-upgrade.md +0 -0
  34. {roadmodel-0.2.85 → roadmodel-0.2.86}/docs/context-windows.json +0 -0
  35. {roadmodel-0.2.85 → roadmodel-0.2.86}/docs/effort-tokens.json +0 -0
  36. {roadmodel-0.2.85 → roadmodel-0.2.86}/docs/model-selector.txt +0 -0
  37. {roadmodel-0.2.85 → roadmodel-0.2.86}/docs/model-tier-cost-scale.md +0 -0
  38. {roadmodel-0.2.85 → roadmodel-0.2.86}/docs/settings-display.md +0 -0
  39. {roadmodel-0.2.85 → roadmodel-0.2.86}/docs/user-context.example.md +0 -0
  40. {roadmodel-0.2.85 → roadmodel-0.2.86}/hatch_build.py +0 -0
  41. {roadmodel-0.2.85 → roadmodel-0.2.86}/infra/README.md +0 -0
  42. {roadmodel-0.2.85 → roadmodel-0.2.86}/infra/gcp-killswitch/README.md +0 -0
  43. {roadmodel-0.2.85 → roadmodel-0.2.86}/infra/supabase/README.md +0 -0
  44. {roadmodel-0.2.85 → roadmodel-0.2.86}/roadmodel/data/benchmarks.json +0 -0
  45. {roadmodel-0.2.85 → roadmodel-0.2.86}/roadmodel/data/catalog.json +0 -0
  46. {roadmodel-0.2.85 → roadmodel-0.2.86}/roadmodel/data/context-windows.json +0 -0
  47. {roadmodel-0.2.85 → roadmodel-0.2.86}/roadmodel/data/effort-tokens.json +0 -0
  48. {roadmodel-0.2.85 → roadmodel-0.2.86}/roadmodel/data/model-selector.txt +0 -0
  49. {roadmodel-0.2.85 → roadmodel-0.2.86}/roadmodel/data/model-tier-cost-scale.md +0 -0
  50. {roadmodel-0.2.85 → roadmodel-0.2.86}/roadmodel/data/roadmap-phase.md +0 -0
  51. {roadmodel-0.2.85 → roadmodel-0.2.86}/roadmodel/data/roadmap-project.md +0 -0
  52. {roadmodel-0.2.85 → roadmodel-0.2.86}/roadmodel/data/roadmodel-upgrade.md +0 -0
  53. {roadmodel-0.2.85 → roadmodel-0.2.86}/roadmodel/data/settings-display.md +0 -0
  54. {roadmodel-0.2.85 → roadmodel-0.2.86}/roadmodel/data/user-context.example.md +0 -0
  55. {roadmodel-0.2.85 → roadmodel-0.2.86}/scripts/agent_context.py +0 -0
  56. {roadmodel-0.2.85 → roadmodel-0.2.86}/scripts/agent_rules.py +0 -0
  57. {roadmodel-0.2.85 → roadmodel-0.2.86}/scripts/updater_lock.py +0 -0
  58. {roadmodel-0.2.85 → roadmodel-0.2.86}/scripts/upgrade_fleet.py +0 -0
  59. {roadmodel-0.2.85 → roadmodel-0.2.86}/scripts/worktree_memory.py +0 -0
  60. {roadmodel-0.2.85 → roadmodel-0.2.86}/src/roadmodel/__main__.py +0 -0
  61. {roadmodel-0.2.85 → roadmodel-0.2.86}/src/roadmodel/config.py +0 -0
  62. {roadmodel-0.2.85 → roadmodel-0.2.86}/src/roadmodel/cost.py +0 -0
  63. {roadmodel-0.2.85 → roadmodel-0.2.86}/src/roadmodel/errors.py +0 -0
  64. {roadmodel-0.2.85 → roadmodel-0.2.86}/src/roadmodel/private_files.py +0 -0
  65. {roadmodel-0.2.85 → roadmodel-0.2.86}/src/roadmodel/providers/__init__.py +0 -0
  66. {roadmodel-0.2.85 → roadmodel-0.2.86}/src/roadmodel/providers/_safety.py +0 -0
  67. {roadmodel-0.2.85 → roadmodel-0.2.86}/src/roadmodel/providers/anthropic.py +0 -0
  68. {roadmodel-0.2.85 → roadmodel-0.2.86}/src/roadmodel/providers/google.py +0 -0
  69. {roadmodel-0.2.85 → roadmodel-0.2.86}/src/roadmodel/providers/openai.py +0 -0
  70. {roadmodel-0.2.85 → roadmodel-0.2.86}/src/roadmodel/providers/openai_compatible.py +0 -0
  71. {roadmodel-0.2.85 → roadmodel-0.2.86}/src/roadmodel/providers/registry.py +0 -0
  72. {roadmodel-0.2.85 → roadmodel-0.2.86}/src/roadmodel/usage.py +0 -0
  73. {roadmodel-0.2.85 → roadmodel-0.2.86}/src/roadmodel/user_context.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: roadmodel
3
- Version: 0.2.85
3
+ Version: 0.2.86
4
4
  Summary: BYO-key CLI that recommends the right AI model, platform, and settings for a prompt.
5
5
  Project-URL: Homepage, https://roadmodel.ai
6
6
  Project-URL: Repository, https://github.com/nathanramoscfa/roadmodel
@@ -607,7 +607,8 @@ server and the reasoning-effort default in parity automatically.
607
607
  | `roadmodel recommend --model` | Override the specific model ID on the chosen provider. |
608
608
  | `roadmodel recommend --user-context PATH` | Override the user-context.md location for this invocation. |
609
609
  | `roadmodel score --category C --complexity X` | Rank (model, platform, effort) candidates in code for a classified task — no engine call. See [docs/scoring-model.md](docs/scoring-model.md). |
610
- | `roadmodel backup --category C --complexity X --model M --effort E` | Name the cross-maker backup for a pick, by the rule /recommend uses — no engine call. Prints the roadmap Settings Backup cell, and first a `MODEL` cell when a newer version of the pick's model (same platform, no dearer) scores level or better at its effort. |
610
+ | `roadmodel backup --category C --complexity X --model M --effort E` | Name the cross-maker backup for a pick, by the rule /recommend uses — no engine call. Prints the roadmap Settings Backup cell, and first a `MODEL` cell when the pick's platform offers a newer version of its model (GPT-6 Sol → GPT-6.1 Sol). |
611
+ | `roadmodel ladder --category C --complexity X [--novel] [--phase]` | Print a roadmap Settings table as the full ladder: Cost / Balanced / Quality, each with its effort and a cross-maker backup, plus the column the step runs and the rule for a tight or exhausted pool — no engine call. |
611
612
  | `roadmodel catalog show` | Print the bundled `model-selector.txt` (use `--doc tier-cost-scale` for the price doc). |
612
613
  | `roadmodel catalog path` | Print the on-disk path of the bundled catalog document (same `--doc` flag). |
613
614
  | `roadmodel context show` | Print the resolved `user-context.md` file. |
@@ -356,7 +356,8 @@ server and the reasoning-effort default in parity automatically.
356
356
  | `roadmodel recommend --model` | Override the specific model ID on the chosen provider. |
357
357
  | `roadmodel recommend --user-context PATH` | Override the user-context.md location for this invocation. |
358
358
  | `roadmodel score --category C --complexity X` | Rank (model, platform, effort) candidates in code for a classified task — no engine call. See [docs/scoring-model.md](docs/scoring-model.md). |
359
- | `roadmodel backup --category C --complexity X --model M --effort E` | Name the cross-maker backup for a pick, by the rule /recommend uses — no engine call. Prints the roadmap Settings Backup cell, and first a `MODEL` cell when a newer version of the pick's model (same platform, no dearer) scores level or better at its effort. |
359
+ | `roadmodel backup --category C --complexity X --model M --effort E` | Name the cross-maker backup for a pick, by the rule /recommend uses — no engine call. Prints the roadmap Settings Backup cell, and first a `MODEL` cell when the pick's platform offers a newer version of its model (GPT-6 Sol → GPT-6.1 Sol). |
360
+ | `roadmodel ladder --category C --complexity X [--novel] [--phase]` | Print a roadmap Settings table as the full ladder: Cost / Balanced / Quality, each with its effort and a cross-maker backup, plus the column the step runs and the rule for a tight or exhausted pool — no engine call. |
360
361
  | `roadmodel catalog show` | Print the bundled `model-selector.txt` (use `--doc tier-cost-scale` for the price doc). |
361
362
  | `roadmodel catalog path` | Print the on-disk path of the bundled catalog document (same `--doc` flag). |
362
363
  | `roadmodel context show` | Print the resolved `user-context.md` file. |
@@ -167,39 +167,42 @@ Print the phase · step · status table.
167
167
 
168
168
  The current step is the first step, in phase order, that does not read
169
169
  `Complete`. For the current step and every step after it, in every phase
170
- roadmap that exists, re-run the model selector exactly as the phase
171
- roadmap was written: `planning/model-selector.txt`, with prices from
172
- `planning/model-tier-cost-scale.md` and display rules from
173
- `planning/settings-display.md`, against `planning/user-context.md`. You
174
- are the engine — do not call any external API. Honor every availability
175
- exclusion in the selector, and include a backup model.
170
+ roadmap that exists, re-select its Settings the way a phase roadmap is
171
+ written now. Classify the step (its PRIMARY and SECONDARY category, its
172
+ complexity, novel or not; its Model rationale names them), then:
176
173
 
174
+ - Where `roadmodel` is installed, the Settings table is the ladder
175
+ `roadmodel ladder --category <c> --complexity <x> [--novel]` prints
176
+ for that classification (MCP tool: `roadmap_settings`), pasted as
177
+ printed with its **Runs:** line: Cost, Balanced and Quality, each with
178
+ its own effort and a backup from another maker, read with every usage
179
+ pool at headroom, so the step's runner picks the column from the pools
180
+ on the day. A single-column table becomes the ladder: that is a
181
+ difference. Its models are always the latest version of their series.
182
+ - Where `roadmodel` cannot be reached, re-run the model selector as the
183
+ roadmap was written: `planning/model-selector.txt`, with prices from
184
+ `planning/model-tier-cost-scale.md` and display rules from
185
+ `planning/settings-display.md`, against `planning/user-context.md`.
186
+ You are the engine — do not call any external API. Honor every
187
+ availability exclusion in the selector, include a backup model, and
188
+ never name an older version of a series (GPT-6 Sol where GPT-6.1 Sol
189
+ runs, Opus 5 where Opus 5.5 does).
177
190
  - If the result differs from the step's Settings table, rewrite the
178
191
  table and its Model rationale, and add one line beneath the table:
179
192
  `> Settings updated <YYYY-MM-DD> (refresh): was <old model> · <old effort>. <why>.`
180
- A changed backup alone counts as a difference; name it in that line.
181
- - Every table carries a `Backup` row directly under `Model`: the
182
- selector's BACKUP with its own platform and dial in one cell
183
- (`GPT-5.6 Terra — Codex · Intelligence Medium`), or `None`. Where
184
- `roadmodel` is installed, the cell is the one `roadmodel backup
185
- --category <c> --complexity <x> [--novel] --model <the step's model>
186
- --effort <the step's effort>` prints for the step's classification —
187
- the rule /recommend backs a pick up by, which takes the cheaper of two
188
- substitutes the benchmarks cannot tell apart — and it outranks the
189
- selector's BACKUP. When the command also prints a `MODEL` line, that
190
- cell replaces the step's model — a newer version of the same model
191
- (GPT-6 Sol → GPT-6.1 Sol), on the same platform, no dearer, that
192
- scores level or better at the step's effort; the selector's letters
193
- are measured at each model's top effort, and a step that runs lower
194
- can reverse them. That is a difference: rewrite the table, its Model
195
- rationale and its selection block with the `MODEL` cell, keep the
196
- Backup cell printed with it, and add the `Settings updated` line.
197
- A table written before roadmodel 0.2.41 has no such row: add it from the
193
+ For a ladder, the old model and effort are the column the step ran
194
+ (its **Runs:** line), or the single column it replaced. A changed
195
+ backup alone counts as a difference; name it in that line.
196
+ - Every table carries a `Backup` row directly under `Model`, each cell
197
+ a backup with its own platform and dial
198
+ (`GPT-6.1 Sol — Codex · Intelligence Medium`), or `None`. A table
199
+ written before roadmodel 0.2.41 has no such row: add it from the
198
200
  backup the step already names (its Model rationale's closing
199
201
  sentence, or its entry in the Model selection blocks) — a layout
200
202
  fix, not a new pick, so it takes no `Settings updated` line.
201
- - Keep the step's `BACKUP:` line in the Model selection blocks equal to
202
- its table's Backup row.
203
+ - Keep the step's selection block in the Model selection blocks equal
204
+ to the column its **Runs:** line names (its `BACKUP:` line to that
205
+ column's Backup), and its Summary Table row to the same column.
203
206
  - If it matches, leave the step exactly as it is.
204
207
  - **Never touch a step that reads `Complete`.** Its settings are the
205
208
  record of what ran.
@@ -214,18 +217,20 @@ roadmap settings** table (roadmodel 0.2.54 on): the model and dials for
214
217
  the session that writes that phase's roadmap with `/roadmap-phase N`.
215
218
  For every phase whose roadmap does not exist yet — no
216
219
  `phaseNN-roadmap.md` or `phaseNN-<slug>-roadmap.md` for it — re-run the
217
- selector for that session, quality first: the strongest `planning`
218
- model the operator's access methods reach, at the deepest reasoning
219
- rung it exposes on its platform (`Max` in Claude Code), thinking on,
220
- never `Ultracode`, with a backup on its own platform and dial — unless
221
- `planning/user-context.md` states a rule for roadmap-writing sessions,
222
- which wins. Where `roadmodel` is installed, take the model and the
223
- backup, not their effort, from the PRIMARY and BACKUP lines of
224
- `roadmodel score --category planning --complexity high --budget best`:
225
- it ranks on measured benchmarks, so a stale catalog letter cannot steer
226
- them, and a model the user-context names for these sessions still wins.
227
- The table takes its platform's shape, as a step's does, with
228
- Conversation **New**, followed by one or two sentences on why.
220
+ selector for that session, quality first: it runs the Quality column,
221
+ the strongest `planning` model the operator's access methods reach, at
222
+ the deepest reasoning rung it exposes on its platform (`Max` in Claude
223
+ Code), thinking on, never `Ultracode`, with a backup on its own platform
224
+ and dial — unless `planning/user-context.md` states a rule for
225
+ roadmap-writing sessions, which wins. Where `roadmodel` is installed,
226
+ the table is the ladder `roadmodel ladder --category planning
227
+ --complexity high --phase` prints, pasted as printed with its **Runs:**
228
+ line: it ranks on measured benchmarks, so a stale catalog letter cannot
229
+ steer it, and a model the user-context names for these sessions still
230
+ wins. A single-column table becomes the ladder: that is a difference.
231
+ Without roadmodel, the table takes its platform's single-column shape,
232
+ as a step's does. Conversation is **New**, followed by one or two
233
+ sentences on why.
229
234
 
230
235
  - No table yet ⇒ add one. It is the phase's first pick, so it takes no
231
236
  `Settings updated` line.
@@ -101,6 +101,23 @@ Print one line: `Step {{STEP}} requires: Model <M> · Platform <P> ·
101
101
  <the dials the table carries, e.g. Effort <E> · Thinking <T>, or
102
102
  Intelligence <I>>. This session: <your own model> on <this surface>.`
103
103
 
104
+ - **Ladder tables** (Cost / Balanced / Quality columns, roadmodel 0.2.86
105
+ on) carry every column the step may run, so pick one before the checks
106
+ below. The table's **Runs:** line names the column. Apply its rule to
107
+ the Usage-pool status table in `planning/user-context.md` (a row whose
108
+ reset time has passed reads `headroom`). Read the pool of the
109
+ subscription that pays for that column's platform:
110
+ - `headroom`: run that column.
111
+ - `tight`: run that column's Backup when the Backup's pool reads
112
+ `headroom`, else the Cost column.
113
+ - `exhausted`: run that column's Backup.
114
+
115
+ The chosen column (or Backup) is what the printed line names as
116
+ required, with the column named (`… · Balanced column`, or `… ·
117
+ Balanced column's Backup — Claude pool tight`). Any column's model on
118
+ that column's platform, or any column's Backup on its own platform,
119
+ continues too. Say which column you are, and which column the rule
120
+ selected.
104
121
  - **Backup.** The table's `Backup` row (roadmaps from roadmodel 0.2.41
105
122
  on) names the model to run when the primary is unavailable, with its
106
123
  own platform and dial. If you are that backup model on that platform,
@@ -155,9 +172,13 @@ Intelligence <I>>. This session: <your own model> on <this surface>.`
155
172
  rollout's `"effort"` is the dial the session runs on, so print it. If
156
173
  it differs from the table's, name the value to set. Continue.
157
174
 
158
- **Record what ran.** If the model or effort you proceed with differs from
159
- the table, the step's own PR rewrites its Settings table to match (§5),
160
- with one line beneath it:
175
+ **Record what ran.** With a ladder table, running one of its columns or
176
+ Backups changes nothing in it: the step's own PR adds one line beneath
177
+ it, `> Ran <YYYY-MM-DD>: <column> — <model · effort>. <why>.` (why: the
178
+ **Runs:** column, or the pool that moved it). When what ran is in none of
179
+ its cells, or the table has a single column, and the model or effort you
180
+ proceed with differs from the table, the step's own PR rewrites its
181
+ Settings table to match (§5), with one line beneath it:
161
182
  `> Settings updated <YYYY-MM-DD>: was <old model> · <old effort>. <why>.`
162
183
  The roadmap on `main` is the ledger, so it must say what actually ran.
163
184
  Never rewrite the table of a step that reads `Complete`: that is history.
@@ -737,6 +737,30 @@ that owns it.}}
737
737
  "Sonnet 4.6 via Claude Code" reads very differently
738
738
  from "Sonnet 4.6 via Anthropic API" on the cost line.
739
739
 
740
+ THE LADDER — the default wherever roadmodel is
741
+ installed. A step's Settings table carries the full
742
+ recommendation /recommend shows: Cost, Balanced and
743
+ Quality, each with its own model, platform and effort
744
+ and a backup from another maker. The roadmap then
745
+ outlives a usage pool's state: when a pool reads
746
+ `tight` or `exhausted`, the step's runner picks
747
+ another column (the **Runs:** line's rule) instead of
748
+ the roadmap being refreshed. Paste the table and its
749
+ **Runs:** line exactly as `roadmodel ladder --category
750
+ <c> --complexity <x> [--novel]` prints them for the
751
+ step's classification (MCP tool: `roadmap_settings`).
752
+ Rows: Model / Backup / Platform / Effort / Thinking /
753
+ Conversation. The Effort cell names each column's own
754
+ dial (`Intelligence Medium` on Codex, `Effort High` on
755
+ Claude Code); a column whose surface has no such
756
+ control reads `—` there. Every model is the latest
757
+ version of its series, never an older one (GPT-6 Sol
758
+ where GPT-6.1 Sol runs, Opus 5 where Opus 5.5 does).
759
+ Set Conversation to **Continue** in every column only
760
+ when the step continues the previous one's session.
761
+ The single-column shapes below are the fallback where
762
+ roadmodel cannot be reached.
763
+
740
764
  SETTINGS TABLE SHAPE IS PLATFORM-SPECIFIC. Each
741
765
  surface exposes a different tuning UI, and the table
742
766
  MUST mirror what the operator will actually see in
@@ -824,6 +848,24 @@ that owns it.}}
824
848
  cannot apply.
825
849
  -->
826
850
 
851
+ Settings table — ladder ({{the default wherever roadmodel is
852
+ installed: the table and **Runs:** line `roadmodel ladder
853
+ --category <c> --complexity <x> [--novel]` prints for the
854
+ step's classification, pasted as printed. The three shapes
855
+ after it are the fallback where roadmodel cannot be
856
+ reached}}):
857
+
858
+ | Setting | Cost | Balanced | Quality |
859
+ | ------------ | --------------------------- | --------------------------- | --------------------------- |
860
+ | Model | {{Model}} | {{Model}} | {{Model}} |
861
+ | Backup | {{Backup — platform · dial}} | {{Backup — platform · dial}} | {{Backup — platform · dial}} |
862
+ | Platform | {{Access method}} | {{Access method}} | {{Access method}} |
863
+ | Effort | {{Its dial and level}} | {{Its dial and level}} | {{Its dial and level}} |
864
+ | Thinking | {{On, or — with no toggle}} | {{On, or — with no toggle}} | {{On, or — with no toggle}} |
865
+ | Conversation | **{{New or Continue}}** | **{{New or Continue}}** | **{{New or Continue}}** |
866
+
867
+ **Runs:** {{Cost / Balanced / Quality}} — the user-context's Budget priority is `{{cheap / balanced / best}}`. If that column's usage pool reads `tight`, run its Backup when the Backup's pool has headroom, else the Cost column; if it reads `exhausted`, run its Backup.
868
+
827
869
  Settings table — Effort + Thinking variant ({{use this
828
870
  shape when PLATFORM is "Claude Code" or any other
829
871
  reasoning-dial surface that is not Codex — ChatGPT app,
@@ -1228,29 +1270,28 @@ hygiene").}}
1228
1270
 
1229
1271
  **Deploys:** {{surface → environment, or "nothing beyond merge"}}
1230
1272
 
1231
- {{Settings table — pick the variant that matches PLATFORM
1232
- per the Step 1 guidance, and carry ONLY the rows that
1233
- platform's panel exposes. Claude Code and the other
1234
- reasoning-dial surfaces use Model / Platform / Effort /
1235
- Thinking (On/Off) / Conversation. Codex uses Model /
1236
- Platform / Intelligence / Conversation (no Max Mode, no
1237
- Thinking row). Cursor uses Model / Platform / Max Mode /
1238
- Conversation (no Effort row, no Thinking row). The shape
1239
- below is the Effort + Thinking variant — swap it wholesale if
1240
- PLATFORM is something else; never keep a row for a dial
1241
- the surface does not have.}}
1242
-
1243
- | Setting | Value |
1244
- | ------------ | ------------------------------ |
1245
- | Model | {{Model name}} |
1246
- | Backup | {{Backup model — its platform · its dial, or None}} |
1247
- | Platform | {{Access method name}} |
1248
- | Effort | {{Low/Medium/High/Extra High/Max/Ultracode}} |
1249
- | Thinking | {{On or Off}} |
1250
- | Conversation | **{{New or Continue}}** |
1251
-
1252
- **Model rationale:** 3-5 sentences. Name the PLATFORM and
1253
- the subscription or API key that pays for it. For Claude
1273
+ {{Settings table — the ladder `roadmodel ladder` prints for
1274
+ this step's classification (the Step 1 guidance), pasted as
1275
+ printed with its **Runs:** line. Where roadmodel cannot be
1276
+ reached, the single-column variant that matches PLATFORM,
1277
+ carrying ONLY the rows that platform's panel exposes.}}
1278
+
1279
+ | Setting | Cost | Balanced | Quality |
1280
+ | ------------ | --------------------------- | --------------------------- | --------------------------- |
1281
+ | Model | {{Model}} | {{Model}} | {{Model}} |
1282
+ | Backup | {{Backup — platform · dial}} | {{Backup — platform · dial}} | {{Backup — platform · dial}} |
1283
+ | Platform | {{Access method}} | {{Access method}} | {{Access method}} |
1284
+ | Effort | {{Its dial and level}} | {{Its dial and level}} | {{Its dial and level}} |
1285
+ | Thinking | {{On, or — with no toggle}} | {{On, or — with no toggle}} | {{On, or — with no toggle}} |
1286
+ | Conversation | **{{New or Continue}}** | **{{New or Continue}}** | **{{New or Continue}}** |
1287
+
1288
+ **Runs:** {{the line `roadmodel ladder` prints}}
1289
+
1290
+ **Model rationale:** 3-5 sentences. With the ladder: the
1291
+ classification it was printed for (PRIMARY and SECONDARY
1292
+ category, complexity, novel or not) and why, then what sets
1293
+ the three columns apart for this step. Otherwise: name the
1294
+ PLATFORM and the subscription or API key that pays for it. For Claude
1254
1295
  Code and the other reasoning-dial surfaces, state why
1255
1296
  EFFORT is at the stated level and why THINKING is on or
1256
1297
  off. For Codex, state why INTELLIGENCE is at the stated
@@ -1366,23 +1407,21 @@ mechanically rather than left to memory.
1366
1407
  **Deploys:** nothing beyond merge — the CI matrix entry is live
1367
1408
  on merge.
1368
1409
 
1369
- {{Settings table — pick the variant that matches PLATFORM
1370
- per the Step 1 guidance, carrying ONLY the rows that
1371
- platform exposes. There are exactly three shapes: the
1372
- Effort + Thinking variant (Claude Code and every other
1373
- reasoning-dial surface), the Codex variant (Intelligence
1374
- alone — no Max Mode, no Thinking row), and the Cursor
1375
- variant (Max Mode alone — no Effort row, no Thinking row).
1376
- The shape below is the Effort + Thinking variant.}}
1410
+ {{Settings table — the ladder `roadmodel ladder` prints for
1411
+ this step's classification, pasted as printed with its
1412
+ **Runs:** line; where roadmodel cannot be reached, the
1413
+ single-column variant that matches PLATFORM.}}
1377
1414
 
1378
- | Setting | Value |
1379
- | ------------ | ------------------------------ |
1380
- | Model | {{Model}} |
1381
- | Backup | {{Backup model — its platform · its dial, or None}} |
1382
- | Platform | {{Access method name}} |
1383
- | Effort | {{Low/Medium/High/Extra High/Max/Ultracode}} |
1384
- | Thinking | {{On or Off}} |
1385
- | Conversation | **New** |
1415
+ | Setting | Cost | Balanced | Quality |
1416
+ | ------------ | --------------------------- | --------------------------- | --------------------------- |
1417
+ | Model | {{Model}} | {{Model}} | {{Model}} |
1418
+ | Backup | {{Backup — platform · dial}} | {{Backup — platform · dial}} | {{Backup — platform · dial}} |
1419
+ | Platform | {{Access method}} | {{Access method}} | {{Access method}} |
1420
+ | Effort | {{Its dial and level}} | {{Its dial and level}} | {{Its dial and level}} |
1421
+ | Thinking | {{On, or — with no toggle}} | {{On, or — with no toggle}} | {{On, or — with no toggle}} |
1422
+ | Conversation | **New** | **New** | **New** |
1423
+
1424
+ **Runs:** {{the line `roadmodel ladder` prints}}
1386
1425
 
1387
1426
  **Model rationale:** Why this model fits the mechanical
1388
1427
  translation of the prior verify-script template into this
@@ -1868,7 +1907,12 @@ corresponding row below.
1868
1907
 
1869
1908
  ## Summary Table
1870
1909
 
1871
- <!-- Summary Table column "Reasoning dial" carries
1910
+ <!-- With ladder Settings tables, each step's row shows the
1911
+ column its **Runs:** line names (the Model, Platform
1912
+ and dial of that column); the other two columns live
1913
+ in the step's own table.
1914
+
1915
+ Summary Table column "Reasoning dial" carries
1872
1916
  whichever dial the step's PLATFORM exposes, written
1873
1917
  in the surface's native vocabulary so reviewers can
1874
1918
  audit each row 1:1 against the panel. The per-step
@@ -1928,6 +1972,8 @@ output format for ease of audit by a roadmodel script.
1928
1972
 
1929
1973
  Include this section if your project has a roadmodel
1930
1974
  audit tool that consumes the text format. Skip it if not.
1975
+ With ladder Settings tables, each block restates the column
1976
+ the step's **Runs:** line names.
1931
1977
  -->
1932
1978
 
1933
1979
  <!-- These blocks follow OUTPUT CONTRACT VERSION 2 of
@@ -28,6 +28,19 @@ MCP tool, or web service — the operator's editor session already pays for your
28
28
  reasoning (e.g. Claude Code funded by a flat Max plan = $0 marginal). Calling
29
29
  out would add cost for no benefit.
30
30
 
31
+ **Where `roadmodel` is installed, the Settings table comes from it.** Classify
32
+ the step (step 1 below), then paste the table and **Runs:** line
33
+ `roadmodel ladder --category <c> --complexity <x> [--novel]` prints: the
34
+ Cost / Balanced / Quality picks /recommend shows, each with its effort and a
35
+ backup from another maker. It is local code — no API call, no engine — and it
36
+ reads every usage pool at headroom, so the table outlives a pool's state: when
37
+ a pool reads `tight` or `exhausted`, `/roadmap-step` runs another column
38
+ instead of the roadmap being refreshed. Its models are always the latest
39
+ version of their series (GPT-6.1 Sol, never GPT-6 Sol where both run). The
40
+ project roadmap's phase tables come from `roadmodel ladder --category
41
+ planning --complexity high --phase`. Steps 2–4 are the fallback where
42
+ `roadmodel` cannot be reached.
43
+
31
44
  Concretely, for each roadmap step:
32
45
 
33
46
  1. **Classify** the step's task with the selector's
@@ -38,25 +38,29 @@ STYLE RULES (the AI MUST follow)
38
38
  own tables in the phase roadmap. Pick it with the model
39
39
  selector, quality first. A phase roadmap fixes every step's
40
40
  scope, task prompt, acceptance criteria and Settings, so it
41
- is the phase's highest-leverage session, and it runs once.
42
- Take the strongest `planning` model the operator's access
43
- methods reach, at the deepest reasoning rung that model
44
- exposes on its platform (`Max` in Claude Code, which
45
- `/roadmap-phase` sets by itself), with thinking on. Where
46
- `roadmodel` is installed, take the two models, not their
47
- effort, from the PRIMARY and BACKUP lines of `roadmodel
48
- score --category planning --complexity high --budget best`:
49
- it ranks on measured benchmarks, so a stale catalog letter
50
- cannot steer them, and a model the user-context names for
51
- these sessions still wins. Never `Ultracode`: it reasons at
52
- `Extra high` and adds parallel agents, which one planning
53
- document does not need. A rule
54
- for roadmap-writing sessions in the user-context overrides
55
- this default. The table takes its platform's shape (the
56
- phase roadmap template's Settings variants) with a Backup
57
- row, and its Conversation is always **New**. Once the phase
58
- roadmap exists, the table is history: only a phase not yet
59
- written is ever re-picked.
41
+ is the phase's highest-leverage session, and it runs once:
42
+ it runs the Quality column, the strongest `planning` model
43
+ the operator's access methods reach, at the deepest
44
+ reasoning rung that model exposes on its platform (`Max`
45
+ in Claude Code, which `/roadmap-phase` sets by itself),
46
+ with thinking on. Where `roadmodel` is installed, the table
47
+ is the ladder `roadmodel ladder --category planning
48
+ --complexity high --phase` prints, pasted as printed with
49
+ its **Runs:** line: Cost, Balanced and Quality, each with a
50
+ backup from another maker, so a pool that reads `tight` or
51
+ `exhausted` on the day moves the session to another column
52
+ instead of the table being refreshed. It ranks on measured
53
+ benchmarks, so a stale catalog letter cannot steer it, and
54
+ a model the user-context names for these sessions still
55
+ wins. Never `Ultracode`: it reasons at `Extra high` and
56
+ adds parallel agents, which one planning document does not
57
+ need. A rule for roadmap-writing sessions in the
58
+ user-context overrides this default. Without roadmodel, the
59
+ table takes its platform's single-column shape (the phase
60
+ roadmap template's Settings variants) with a Backup row.
61
+ Its Conversation is always **New**. Once the phase roadmap
62
+ exists, the table is history: only a phase not yet written
63
+ is ever re-picked.
60
64
  - Every phase carries a `**Status:**` line directly under its
61
65
  `### Phase` heading, before its **Goal:** — `Not started`
62
66
  when this roadmap is written. The phase's FIRST step flips it
@@ -242,19 +246,23 @@ dependency graph in §5 is honoured.
242
246
  **Phase roadmap settings** — the session that writes
243
247
  `phase01-roadmap.md` (`/roadmap-phase 1`):
244
248
 
245
- | Setting | Value |
246
- |--------------|------------------------------------------------------|
247
- | Model | <Model name> |
248
- | Backup | <Backup model — its platform · its dial, or None> |
249
- | Platform | <Claude Code, or the access method that pays> |
250
- | Effort | <Deepest reasoning rung there — Max in Claude Code> |
251
- | Thinking | On |
252
- | Conversation | **New** |
249
+ | Setting | Cost | Balanced | Quality |
250
+ |--------------|------------------------|------------------------|------------------------------------------|
251
+ | Model | <Model> | <Model> | <The strongest planning model> |
252
+ | Backup | <Backup — its platform · its dial> | <Backup — its platform · its dial> | <Backup — its platform · its dial> |
253
+ | Platform | <Access method> | <Access method> | <Claude Code, or the access method that pays> |
254
+ | Effort | <Its dial and level> | <Its dial and level> | <Deepest rung there — Effort Max in Claude Code> |
255
+ | Thinking | <On, or — with no toggle> | <On, or — with no toggle> | On |
256
+ | Conversation | **New** | **New** | **New** |
253
257
 
254
- <!-- The Claude Code shape. Another platform takes its own
255
- shape from the phase roadmap template's Settings variants:
256
- Codex carries Intelligence and no Thinking row; Cursor
257
- carries Max Mode alone. -->
258
+ **Runs:** Quality — a phase-roadmap session runs Quality (quality first). If that column's usage pool reads `tight`, run its Backup when the Backup's pool has headroom, else the Cost column; if it reads `exhausted`, run its Backup.
259
+
260
+ <!-- The ladder `roadmodel ladder --category planning
261
+ --complexity high --phase` prints, pasted as printed. Without
262
+ roadmodel, a single-column table in its platform's shape from
263
+ the phase roadmap template's Settings variants: Codex carries
264
+ Intelligence and no Thinking row; Cursor carries Max Mode
265
+ alone. -->
258
266
 
259
267
  <One or two sentences: what this phase's roadmap must get
260
268
  right, why this model at this rung, and which subscription or
@@ -298,14 +306,16 @@ key pays for the platform.>
298
306
  **Phase roadmap settings** — the session that writes
299
307
  `phase02-roadmap.md` (`/roadmap-phase 2`):
300
308
 
301
- | Setting | Value |
302
- |--------------|---------|
303
- | Model | … |
304
- | Backup | … |
305
- | Platform | … |
306
- | Effort | … |
307
- | Thinking | On |
308
- | Conversation | **New** |
309
+ | Setting | Cost | Balanced | Quality |
310
+ |--------------|---------|----------|---------|
311
+ | Model | … | … | … |
312
+ | Backup | … | … | … |
313
+ | Platform | … | … | … |
314
+ | Effort | … | … | … |
315
+ | Thinking | … | … | On |
316
+ | Conversation | **New** | **New** | **New** |
317
+
318
+ **Runs:** Quality — <the line `roadmodel ladder` prints>
309
319
 
310
320
  <Why, in one or two sentences.>
311
321
 
@@ -333,14 +343,16 @@ key pays for the platform.>
333
343
  **Phase roadmap settings** — the session that writes
334
344
  `phaseNN-roadmap.md` (`/roadmap-phase N`):
335
345
 
336
- | Setting | Value |
337
- |--------------|---------|
338
- | Model | … |
339
- | Backup | … |
340
- | Platform | … |
341
- | Effort | … |
342
- | Thinking | On |
343
- | Conversation | **New** |
346
+ | Setting | Cost | Balanced | Quality |
347
+ |--------------|---------|----------|---------|
348
+ | Model | … | … | … |
349
+ | Backup | … | … | … |
350
+ | Platform | … | … | … |
351
+ | Effort | … | … | … |
352
+ | Thinking | … | … | On |
353
+ | Conversation | **New** | **New** | **New** |
354
+
355
+ **Runs:** Quality — <the line `roadmodel ladder` prints>
344
356
 
345
357
  <Why, in one or two sentences.>
346
358
 
@@ -68,9 +68,19 @@ own model> on <this surface>.`
68
68
  take a rollout from another directory. Where no source names
69
69
  the model, print `unverified`, ask me which I picked, and go on with my
70
70
  answer.
71
+ - A ladder table (Cost / Balanced / Quality columns): its **Runs:**
72
+ line names the column this session runs (Quality, for a phase
73
+ roadmap). Apply that line's rule to the Usage-pool status table in
74
+ `planning/user-context.md`: a pool that reads `tight` moves the run
75
+ to the column's Backup when the Backup's pool has headroom, else to
76
+ the Cost column; `exhausted` moves it to the column's Backup. That
77
+ column's Model, Platform and dials are the ones checked below; print
78
+ which column it is.
71
79
  - You are its Model on its Platform, or a newer version in the same
72
80
  line (Opus 5 → Opus 5.5, Fable 5 → Fable 5.1, GPT-6 Sol → GPT-6.1
73
- Sol): continue, and say so on the line.
81
+ Sol): continue, and say so on the line. In a ladder table, any
82
+ column's model on that column's platform continues too; when it is
83
+ not the column the rule selects, say which one is.
74
84
  - You are its Backup on the backup's platform: continue — I have
75
85
  switched to it — and say so on the line.
76
86
  - Anything else — a different line, an older version, another
@@ -96,27 +106,31 @@ Carry forward anything `{{PRIOR}}` hands to this phase (its closing
96
106
  "inherits" line, its Not-in-scope items owned by this phase, and any
97
107
  carry-over checklist).
98
108
 
99
- For **each step's** Settings table and Model rationale, run the model
100
- selector in `@planning/model-selector.txt` (prices from
101
- `@planning/model-tier-cost-scale.md`, display rules from
102
- `@planning/settings-display.md`) against `@planning/user-context.md`.
103
- You are the engine — do not call any external API. Honor every
104
- availability exclusion in the selector, and write each step's backup
105
- model into its Settings table's Backup row, with the backup's own
106
- platform and dial. Where `roadmodel` is installed, the Backup row is
107
- the cell `roadmodel backup --category <c> --complexity <x> [--novel]
108
- --model <the step's model> --effort <the step's effort>` prints for the
109
- step's own classification: the rule /recommend backs a pick up by, in
110
- code, which takes the cheaper of two substitutes the benchmarks cannot
111
- tell apart. The selector's BACKUP stands only where it is not
112
- installed. When the command also prints a `MODEL` line, that cell
113
- replaces the step's model: a newer version of the same model (GPT-6 Sol
114
- → GPT-6.1 Sol), on the same platform, no dearer, that scores level or
115
- better at the step's effort. The selector's letters are measured at each
116
- model's top effort, and a step that runs lower can reverse them. Write
117
- the `MODEL` cell into the Model row, the Model rationale and the step's
118
- selection block, citing the newer model's figures at the step's effort,
119
- and keep the Backup cell printed with it.
109
+ For **each step's** Settings table, classify the step first: its
110
+ PRIMARY and SECONDARY category, its complexity, and whether it is novel
111
+ problem-solving (the model selector's Steps 1 and 2 in
112
+ `@planning/model-selector.txt`, against `@planning/user-context.md`).
113
+ Where `roadmodel` is installed, the Settings table is the ladder
114
+ `roadmodel ladder --category <c> --complexity <x> [--novel]` prints for
115
+ that classification (MCP tool: `roadmap_settings`), pasted as printed
116
+ with its **Runs:** line. It carries the full recommendation /recommend
117
+ shows: Cost, Balanced and Quality, each with its own effort and a
118
+ backup from another maker. The step's runner picks the column from the
119
+ usage pools on the day, so the roadmap needs no refresh when a pool
120
+ tightens. Its models are always the latest version of their series.
121
+ The Model rationale explains the classification and what sets the
122
+ columns apart for the step; the Summary Table row and the step's
123
+ selection block restate the column the **Runs:** line names.
124
+
125
+ Where `roadmodel` cannot be reached, run the model selector as the
126
+ engine instead (prices from `@planning/model-tier-cost-scale.md`,
127
+ display rules from `@planning/settings-display.md`) and write the
128
+ single-column variant that matches the step's platform. You are the
129
+ engine — do not call any external API. Honor every availability
130
+ exclusion in the selector, write each step's backup model into its
131
+ Settings table's Backup row with the backup's own platform and dial,
132
+ and never name an older version of a series (GPT-6 Sol where GPT-6.1
133
+ Sol runs, Opus 5 where Opus 5.5 does).
120
134
 
121
135
  Honor the template's style rules: 80-column prose, zero `{{...}}`
122
136
  tokens left, `**Status:** Not started` directly under the title and