roadmodel 0.2.65__tar.gz → 0.2.67__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 (55) hide show
  1. {roadmodel-0.2.65 → roadmodel-0.2.67}/PKG-INFO +1 -1
  2. {roadmodel-0.2.65 → roadmodel-0.2.67}/docs/benchmarks.json +53 -53
  3. {roadmodel-0.2.65 → roadmodel-0.2.67}/docs/catalog.json +2 -2
  4. {roadmodel-0.2.65 → roadmodel-0.2.67}/docs/model-selector.txt +13 -1
  5. {roadmodel-0.2.65 → roadmodel-0.2.67}/hatch_build.py +12 -4
  6. {roadmodel-0.2.65 → roadmodel-0.2.67}/infra/README.md +4 -2
  7. {roadmodel-0.2.65 → roadmodel-0.2.67}/pyproject.toml +6 -1
  8. {roadmodel-0.2.65 → roadmodel-0.2.67}/roadmodel/data/benchmarks.json +53 -53
  9. {roadmodel-0.2.65 → roadmodel-0.2.67}/roadmodel/data/catalog.json +2 -2
  10. {roadmodel-0.2.65 → roadmodel-0.2.67}/roadmodel/data/model-selector.txt +13 -1
  11. roadmodel-0.2.67/scripts/agent_context.py +583 -0
  12. roadmodel-0.2.67/scripts/agent_rules.py +227 -0
  13. {roadmodel-0.2.65 → roadmodel-0.2.67}/scripts/update_projects.py +193 -22
  14. roadmodel-0.2.67/scripts/updater_lock.py +122 -0
  15. roadmodel-0.2.67/scripts/upgrade_fleet.py +362 -0
  16. roadmodel-0.2.67/scripts/worktree_memory.py +299 -0
  17. {roadmodel-0.2.65 → roadmodel-0.2.67}/src/roadmodel/__init__.py +1 -1
  18. {roadmodel-0.2.65 → roadmodel-0.2.67}/src/roadmodel/recommend.py +6 -3
  19. {roadmodel-0.2.65 → roadmodel-0.2.67}/.gitignore +0 -0
  20. {roadmodel-0.2.65 → roadmodel-0.2.67}/LICENSE +0 -0
  21. {roadmodel-0.2.65 → roadmodel-0.2.67}/NOTICE +0 -0
  22. {roadmodel-0.2.65 → roadmodel-0.2.67}/README.md +0 -0
  23. {roadmodel-0.2.65 → roadmodel-0.2.67}/docs/model-tier-cost-scale.md +0 -0
  24. {roadmodel-0.2.65 → roadmodel-0.2.67}/docs/settings-display.md +0 -0
  25. {roadmodel-0.2.65 → roadmodel-0.2.67}/docs/templates/phase-roadmap-template.md +0 -0
  26. {roadmodel-0.2.65 → roadmodel-0.2.67}/docs/templates/planning-kit-how-to-use.md +0 -0
  27. {roadmodel-0.2.65 → roadmodel-0.2.67}/docs/templates/project-roadmap-template.md +0 -0
  28. {roadmodel-0.2.65 → roadmodel-0.2.67}/docs/templates/prompt-phase-roadmap.md +0 -0
  29. {roadmodel-0.2.65 → roadmodel-0.2.67}/docs/templates/prompt-project-roadmap.md +0 -0
  30. {roadmodel-0.2.65 → roadmodel-0.2.67}/docs/user-context.example.md +0 -0
  31. {roadmodel-0.2.65 → roadmodel-0.2.67}/infra/gcp-killswitch/README.md +0 -0
  32. {roadmodel-0.2.65 → roadmodel-0.2.67}/infra/supabase/README.md +0 -0
  33. {roadmodel-0.2.65 → roadmodel-0.2.67}/roadmodel/data/model-tier-cost-scale.md +0 -0
  34. {roadmodel-0.2.65 → roadmodel-0.2.67}/roadmodel/data/phase-roadmap-template.md +0 -0
  35. {roadmodel-0.2.65 → roadmodel-0.2.67}/roadmodel/data/planning-kit-how-to-use.md +0 -0
  36. {roadmodel-0.2.65 → roadmodel-0.2.67}/roadmodel/data/project-roadmap-template.md +0 -0
  37. {roadmodel-0.2.65 → roadmodel-0.2.67}/roadmodel/data/prompt-phase-roadmap.md +0 -0
  38. {roadmodel-0.2.65 → roadmodel-0.2.67}/roadmodel/data/prompt-project-roadmap.md +0 -0
  39. {roadmodel-0.2.65 → roadmodel-0.2.67}/roadmodel/data/settings-display.md +0 -0
  40. {roadmodel-0.2.65 → roadmodel-0.2.67}/roadmodel/data/user-context.example.md +0 -0
  41. {roadmodel-0.2.65 → roadmodel-0.2.67}/src/roadmodel/__main__.py +0 -0
  42. {roadmodel-0.2.65 → roadmodel-0.2.67}/src/roadmodel/cli.py +0 -0
  43. {roadmodel-0.2.65 → roadmodel-0.2.67}/src/roadmodel/config.py +0 -0
  44. {roadmodel-0.2.65 → roadmodel-0.2.67}/src/roadmodel/cost.py +0 -0
  45. {roadmodel-0.2.65 → roadmodel-0.2.67}/src/roadmodel/errors.py +0 -0
  46. {roadmodel-0.2.65 → roadmodel-0.2.67}/src/roadmodel/mcp_server.py +0 -0
  47. {roadmodel-0.2.65 → roadmodel-0.2.67}/src/roadmodel/providers/__init__.py +0 -0
  48. {roadmodel-0.2.65 → roadmodel-0.2.67}/src/roadmodel/providers/anthropic.py +0 -0
  49. {roadmodel-0.2.65 → roadmodel-0.2.67}/src/roadmodel/providers/google.py +0 -0
  50. {roadmodel-0.2.65 → roadmodel-0.2.67}/src/roadmodel/providers/openai.py +0 -0
  51. {roadmodel-0.2.65 → roadmodel-0.2.67}/src/roadmodel/providers/openai_compatible.py +0 -0
  52. {roadmodel-0.2.65 → roadmodel-0.2.67}/src/roadmodel/providers/registry.py +0 -0
  53. {roadmodel-0.2.65 → roadmodel-0.2.67}/src/roadmodel/scoring.py +0 -0
  54. {roadmodel-0.2.65 → roadmodel-0.2.67}/src/roadmodel/usage.py +0 -0
  55. {roadmodel-0.2.65 → roadmodel-0.2.67}/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.65
3
+ Version: 0.2.67
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
@@ -6,7 +6,7 @@
6
6
  "endpoint": "https://artificialanalysis.ai/api/v2/data/llms/models",
7
7
  "attribution": "Benchmark data © Artificial Analysis, used under its API terms with attribution."
8
8
  },
9
- "generated_at_utc": "2026-10-02T22:10:28Z",
9
+ "generated_at_utc": "2026-10-05T22:11:00Z",
10
10
  "model_count": 54,
11
11
  "unmapped": [],
12
12
  "missing_slugs": [],
@@ -38,8 +38,8 @@
38
38
  "tau2": 0.546783625730994,
39
39
  "tau_banking": 0.0927835051546392
40
40
  },
41
- "median_output_tokens_per_second": 116.991,
42
- "median_time_to_first_token_seconds": 13.947
41
+ "median_output_tokens_per_second": 107.429,
42
+ "median_time_to_first_token_seconds": 7.79
43
43
  },
44
44
  "claude-fable-5": {
45
45
  "aa_id": "cd55210d-358e-4df1-ba9c-9acb5f186cc9",
@@ -96,8 +96,8 @@
96
96
  "tau2": null,
97
97
  "tau_banking": 0.472164948453608
98
98
  },
99
- "median_output_tokens_per_second": 70.155,
100
- "median_time_to_first_token_seconds": 137.867
99
+ "median_output_tokens_per_second": 68.612,
100
+ "median_time_to_first_token_seconds": 145.612
101
101
  },
102
102
  "claude-opus-5": {
103
103
  "aa_id": "b8fc61f7-5e9a-49e6-8547-6ac56db24627",
@@ -154,8 +154,8 @@
154
154
  "tau2": null,
155
155
  "tau_banking": null
156
156
  },
157
- "median_output_tokens_per_second": 97.574,
158
- "median_time_to_first_token_seconds": 449.114
157
+ "median_output_tokens_per_second": 96.593,
158
+ "median_time_to_first_token_seconds": 489.353
159
159
  },
160
160
  "claude-sonnet-5": {
161
161
  "aa_id": "23c86e4a-c769-43c0-a056-79e3cd15834f",
@@ -183,8 +183,8 @@
183
183
  "tau2": null,
184
184
  "tau_banking": 0.37319587628866
185
185
  },
186
- "median_output_tokens_per_second": 92.634,
187
- "median_time_to_first_token_seconds": 198.594
186
+ "median_output_tokens_per_second": 0,
187
+ "median_time_to_first_token_seconds": 0
188
188
  },
189
189
  "claude-sonnet-5-5": {
190
190
  "aa_id": "b171d979-5ec1-45de-b8b9-db1ee65e77ec",
@@ -212,8 +212,8 @@
212
212
  "tau2": null,
213
213
  "tau_banking": null
214
214
  },
215
- "median_output_tokens_per_second": 140.474,
216
- "median_time_to_first_token_seconds": 261.115
215
+ "median_output_tokens_per_second": 137.507,
216
+ "median_time_to_first_token_seconds": 269.765
217
217
  },
218
218
  "deepseek-flash": {
219
219
  "aa_id": "dbe7c625-3100-4463-b479-a228c41f75dd",
@@ -241,8 +241,8 @@
241
241
  "tau2": null,
242
242
  "tau_banking": null
243
243
  },
244
- "median_output_tokens_per_second": 214.866,
245
- "median_time_to_first_token_seconds": 0.836
244
+ "median_output_tokens_per_second": 214.176,
245
+ "median_time_to_first_token_seconds": 0.802
246
246
  },
247
247
  "deepseek-v4-pro": {
248
248
  "aa_id": "83173329-c09a-41f1-a028-a282a5f908d7",
@@ -270,8 +270,8 @@
270
270
  "tau2": null,
271
271
  "tau_banking": 0.395876288659794
272
272
  },
273
- "median_output_tokens_per_second": 108.409,
274
- "median_time_to_first_token_seconds": 1.137
273
+ "median_output_tokens_per_second": 103.076,
274
+ "median_time_to_first_token_seconds": 1.112
275
275
  },
276
276
  "gemini-2.5-flash": {
277
277
  "aa_id": "219ed587-60c5-4a48-9517-8480e08d0ca1",
@@ -386,8 +386,8 @@
386
386
  "tau2": 0.956140350877193,
387
387
  "tau_banking": 0.214432989690722
388
388
  },
389
- "median_output_tokens_per_second": 123.648,
390
- "median_time_to_first_token_seconds": 26.15
389
+ "median_output_tokens_per_second": 123.821,
390
+ "median_time_to_first_token_seconds": 15.32
391
391
  },
392
392
  "gemini-3.5-flash": {
393
393
  "aa_id": "0097ebf5-124f-42f6-9463-33b00e711f03",
@@ -502,8 +502,8 @@
502
502
  "tau2": null,
503
503
  "tau_banking": 0.449484536082474
504
504
  },
505
- "median_output_tokens_per_second": 255.648,
506
- "median_time_to_first_token_seconds": 11.765
505
+ "median_output_tokens_per_second": 223.213,
506
+ "median_time_to_first_token_seconds": 9.822
507
507
  },
508
508
  "glm-4.5-air": {
509
509
  "aa_id": "5d303dc9-c027-401f-9803-4e9aa3331007",
@@ -618,8 +618,8 @@
618
618
  "tau2": null,
619
619
  "tau_banking": 0.503092783505155
620
620
  },
621
- "median_output_tokens_per_second": 73.964,
622
- "median_time_to_first_token_seconds": 2.655
621
+ "median_output_tokens_per_second": 75.232,
622
+ "median_time_to_first_token_seconds": 3.1
623
623
  },
624
624
  "glm-5.3-flash": {
625
625
  "aa_id": "19496b81-9f41-4214-a77a-1df803b3c5ae",
@@ -647,8 +647,8 @@
647
647
  "tau2": null,
648
648
  "tau_banking": 0.472164948453608
649
649
  },
650
- "median_output_tokens_per_second": 52.907,
651
- "median_time_to_first_token_seconds": 3.043
650
+ "median_output_tokens_per_second": 49.967,
651
+ "median_time_to_first_token_seconds": 2.638
652
652
  },
653
653
  "gpt-5": {
654
654
  "aa_id": "48e50f00-1fd1-4acc-b337-61078aa341e6",
@@ -850,8 +850,8 @@
850
850
  "tau2": 0.859649122807018,
851
851
  "tau_banking": null
852
852
  },
853
- "median_output_tokens_per_second": 98.35,
854
- "median_time_to_first_token_seconds": 46.046
853
+ "median_output_tokens_per_second": 102.301,
854
+ "median_time_to_first_token_seconds": 34.347
855
855
  },
856
856
  "gpt-5.4": {
857
857
  "aa_id": "a89c4b28-2d8c-456e-88ea-255fb51fd2b6",
@@ -1053,8 +1053,8 @@
1053
1053
  "tau2": 0.862573099415205,
1054
1054
  "tau_banking": 0.402061855670103
1055
1055
  },
1056
- "median_output_tokens_per_second": 109.955,
1057
- "median_time_to_first_token_seconds": 94.607
1056
+ "median_output_tokens_per_second": 116.052,
1057
+ "median_time_to_first_token_seconds": 82.187
1058
1058
  },
1059
1059
  "gpt-6-astra": {
1060
1060
  "aa_id": "2f339a97-9a0d-499a-9cb5-e0db665bfa25",
@@ -1082,8 +1082,8 @@
1082
1082
  "tau2": null,
1083
1083
  "tau_banking": 0.414432989690722
1084
1084
  },
1085
- "median_output_tokens_per_second": 55.68,
1086
- "median_time_to_first_token_seconds": 197.034
1085
+ "median_output_tokens_per_second": 64.764,
1086
+ "median_time_to_first_token_seconds": 191.318
1087
1087
  },
1088
1088
  "gpt-6-luna": {
1089
1089
  "aa_id": "6fb13851-40ce-4bda-ad3f-6b38e0c5daa7",
@@ -1111,8 +1111,8 @@
1111
1111
  "tau2": null,
1112
1112
  "tau_banking": null
1113
1113
  },
1114
- "median_output_tokens_per_second": 138.11,
1115
- "median_time_to_first_token_seconds": 83.735
1114
+ "median_output_tokens_per_second": 135.654,
1115
+ "median_time_to_first_token_seconds": 75.426
1116
1116
  },
1117
1117
  "gpt-6-sol": {
1118
1118
  "aa_id": "c50ea08c-88c0-4eb7-85b8-27f2bbf6d527",
@@ -1140,8 +1140,8 @@
1140
1140
  "tau2": null,
1141
1141
  "tau_banking": null
1142
1142
  },
1143
- "median_output_tokens_per_second": 105.847,
1144
- "median_time_to_first_token_seconds": 105.231
1143
+ "median_output_tokens_per_second": 0,
1144
+ "median_time_to_first_token_seconds": 0
1145
1145
  },
1146
1146
  "gpt-6.1-sol": {
1147
1147
  "aa_id": "b25ac058-1e33-4c31-bbc9-a20c3ad0717a",
@@ -1169,8 +1169,8 @@
1169
1169
  "tau2": null,
1170
1170
  "tau_banking": null
1171
1171
  },
1172
- "median_output_tokens_per_second": 59.099,
1173
- "median_time_to_first_token_seconds": 170.489
1172
+ "median_output_tokens_per_second": 60.455,
1173
+ "median_time_to_first_token_seconds": 157.396
1174
1174
  },
1175
1175
  "gpt-oss-120b": {
1176
1176
  "aa_id": "f0083258-8646-45b8-8082-7aaf6c2ea82a",
@@ -1198,8 +1198,8 @@
1198
1198
  "tau2": 0.657894736842105,
1199
1199
  "tau_banking": 0.127835051546392
1200
1200
  },
1201
- "median_output_tokens_per_second": 156.511,
1202
- "median_time_to_first_token_seconds": 0.525
1201
+ "median_output_tokens_per_second": 199.818,
1202
+ "median_time_to_first_token_seconds": 0.501
1203
1203
  },
1204
1204
  "gpt-oss-20b": {
1205
1205
  "aa_id": "36f73aaf-d38a-4b56-a2b3-d04d17186910",
@@ -1227,8 +1227,8 @@
1227
1227
  "tau2": 0.60233918128655,
1228
1228
  "tau_banking": 0.0701030927835052
1229
1229
  },
1230
- "median_output_tokens_per_second": 200.593,
1231
- "median_time_to_first_token_seconds": 0.409
1230
+ "median_output_tokens_per_second": 227.873,
1231
+ "median_time_to_first_token_seconds": 0.427
1232
1232
  },
1233
1233
  "grok-4.3": {
1234
1234
  "aa_id": "948892b5-db03-4118-a4a8-ccd51ed871ea",
@@ -1314,8 +1314,8 @@
1314
1314
  "tau2": null,
1315
1315
  "tau_banking": null
1316
1316
  },
1317
- "median_output_tokens_per_second": 80.156,
1318
- "median_time_to_first_token_seconds": 19.497
1317
+ "median_output_tokens_per_second": 72.511,
1318
+ "median_time_to_first_token_seconds": 9.66
1319
1319
  },
1320
1320
  "kimi-k2.7-code": {
1321
1321
  "aa_id": "8d0cb231-7303-452c-9923-a9620b948475",
@@ -1343,8 +1343,8 @@
1343
1343
  "tau2": 0.900584795321637,
1344
1344
  "tau_banking": 0.202061855670103
1345
1345
  },
1346
- "median_output_tokens_per_second": 84.582,
1347
- "median_time_to_first_token_seconds": 1.233
1346
+ "median_output_tokens_per_second": 105.681,
1347
+ "median_time_to_first_token_seconds": 1.142
1348
1348
  },
1349
1349
  "kimi-k3": {
1350
1350
  "aa_id": "f7d2fc3e-1f7b-405f-818c-07952a4af78f",
@@ -1372,8 +1372,8 @@
1372
1372
  "tau2": null,
1373
1373
  "tau_banking": 0.45979381443299
1374
1374
  },
1375
- "median_output_tokens_per_second": 35.161,
1376
- "median_time_to_first_token_seconds": 2.906
1375
+ "median_output_tokens_per_second": 45.199,
1376
+ "median_time_to_first_token_seconds": 2.455
1377
1377
  },
1378
1378
  "mistral-large-3": {
1379
1379
  "aa_id": "4928e950-7f37-4475-b0dc-c5bad781a321",
@@ -1401,8 +1401,8 @@
1401
1401
  "tau2": 0.245614035087719,
1402
1402
  "tau_banking": 0.0577319587628866
1403
1403
  },
1404
- "median_output_tokens_per_second": 79.16,
1405
- "median_time_to_first_token_seconds": 0.723
1404
+ "median_output_tokens_per_second": 79.265,
1405
+ "median_time_to_first_token_seconds": 0.692
1406
1406
  },
1407
1407
  "mistral-medium-3.5": {
1408
1408
  "aa_id": "dd059b25-d82a-4ead-82a4-4adceaaec48b",
@@ -1430,8 +1430,8 @@
1430
1430
  "tau2": 0.941520467836257,
1431
1431
  "tau_banking": 0.150515463917526
1432
1432
  },
1433
- "median_output_tokens_per_second": 168.676,
1434
- "median_time_to_first_token_seconds": 0.564
1433
+ "median_output_tokens_per_second": 168.037,
1434
+ "median_time_to_first_token_seconds": 0.6
1435
1435
  },
1436
1436
  "mistral-small-4": {
1437
1437
  "aa_id": "3fd96175-4ef1-434c-8795-f873aec2abc1",
@@ -1459,8 +1459,8 @@
1459
1459
  "tau2": 0.412280701754386,
1460
1460
  "tau_banking": 0.0494845360824742
1461
1461
  },
1462
- "median_output_tokens_per_second": 173.831,
1463
- "median_time_to_first_token_seconds": 0.643
1462
+ "median_output_tokens_per_second": 171.598,
1463
+ "median_time_to_first_token_seconds": 0.559
1464
1464
  },
1465
1465
  "muse-spark-1.3": {
1466
1466
  "aa_id": "9999672c-b687-4026-9c15-5cef02ff53bb",
@@ -1488,8 +1488,8 @@
1488
1488
  "tau2": null,
1489
1489
  "tau_banking": 0.505154639175258
1490
1490
  },
1491
- "median_output_tokens_per_second": 163.786,
1492
- "median_time_to_first_token_seconds": 43.349
1491
+ "median_output_tokens_per_second": 122.652,
1492
+ "median_time_to_first_token_seconds": 28.442
1493
1493
  },
1494
1494
  "opus-4.7": {
1495
1495
  "aa_id": "e9a09db3-8fd6-41dd-ba2f-20e0a2bff7f2",
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "schema_version": "4",
3
3
  "output_contract_version": 2,
4
- "generated_at_utc": "2026-10-02T22:10:28Z",
4
+ "generated_at_utc": "2026-10-06T20:14:04Z",
5
5
  "source_doc_sha256": {
6
- "model-selector.txt": "3a1897163e23e66afb77cf2f76ae84aa9354f85b07a235c27fb6bc55e7b657f8",
6
+ "model-selector.txt": "b7abeb92fb4d9b85b70a4544369a49de103d5695bf6dd77ea996dc4e85db0a31",
7
7
  "model-tier-cost-scale.md": "2b3b0eb82237eb5cb5bf468a3fe971bcaf0160ad7d0bc700698d2c16640bc41d"
8
8
  },
9
9
  "models": [
@@ -456,7 +456,19 @@
456
456
  default. It also makes Opus 4.7+ and Fable default to a 1M context
457
457
  window on Bedrock, Vertex, Foundry and the Claude apps gateway. The
458
458
  `/effort` vocabulary and the extended-thinking controls are
459
- unchanged.
459
+ unchanged. 2.1.288 fixes resumed sessions dropping the model's
460
+ earlier thinking, retries thinking-only responses after a
461
+ mid-response API timeout, and makes a plugin-defined agent spawned
462
+ by name run with its own effort instead of the default. 2.1.289 is a
463
+ plugin / mod / permission-rule bug-fix release. Neither changes the
464
+ `/effort` vocabulary or the extended-thinking controls. 2.1.290
465
+ makes three effort/thinking fixes. A flagged message retried on a
466
+ fallback model with a different saved level no longer changes the
467
+ effort level. A reply that the output content filter stopped while
468
+ Claude was still thinking is now retried once. `/effort` sent from
469
+ `claude agents` to a busy background session now applies right
470
+ away. 2.1.291 is a hotfix for two regressions. Neither release
471
+ changes the `/effort` vocabulary or the extended-thinking controls.
460
472
  - OpenAI (Codex, OpenAI API, ChatGPT advanced controls):
461
473
  `reasoning_effort` knob — `low`, `medium`, `high`, `xhigh`, `max`,
462
474
  `ultra`. Codex's plan-mode `plan_mode_reasoning_effort` variant
@@ -80,7 +80,15 @@ class BundleDocsHook(BuildHookInterface): # type: ignore[misc]
80
80
  # source file: scripts/update_projects.py, which is also the bootstrap
81
81
  # URL, so it is mapped in rather than copied under src/.
82
82
  if self.target_name == "wheel":
83
- updater = root / "scripts" / "update_projects.py"
84
- if not updater.is_file():
85
- raise FileNotFoundError(f"hatch_build.py: {updater} is missing")
86
- force_include[str(updater)] = "roadmodel/update_projects.py"
83
+ for name in (
84
+ "update_projects",
85
+ "agent_context",
86
+ "agent_rules",
87
+ "upgrade_fleet",
88
+ "worktree_memory",
89
+ "updater_lock",
90
+ ):
91
+ updater = root / "scripts" / (name + ".py")
92
+ if not updater.is_file():
93
+ raise FileNotFoundError(f"hatch_build.py: {updater} is missing")
94
+ force_include[str(updater)] = f"roadmodel/{name}.py"
@@ -153,7 +153,7 @@ is wired across three env scopes:
153
153
  Google Password Manager as `roadmodel ROADMODEL_IP_SALT`).
154
154
  Rotation cadence is **quarterly** per the Phase 7
155
155
  secrets-rotation policy. Defaults to a placeholder in
156
- `web/lib/withRateLimit.ts` so local + CI builds work without
156
+ `web/lib/ip-salt.ts` so local + CI builds work without
157
157
  override, but production builds without the override silently
158
158
  bucket every IP under the same key, so the var **must** be
159
159
  set in every Vercel scope serving real traffic.
@@ -442,7 +442,9 @@ deliberate — Step 6 should not relitigate the Upstash decision.
442
442
  | `UPSTASH_REDIS_TOKEN` | `roadmodel-web` Vercel env vars (Marketplace Upstash + alias) | Next.js rate limiter (live since Step 7 close-out) | web: production + preview + development + staging Custom Env (Step 7) | web: production + preview + development + staging |
443
443
  | `ROADMODEL_IP_SALT` | `roadmodel-web` Vercel env vars (generated `openssl rand -hex 32`) | Next.js rate limiter daily IP+UA hashing salt (live since Step 7 close-out); rotate quarterly | web: production + preview + development + staging Custom Env (Step 7) | web: production + preview + development + staging |
444
444
  | `FRONTIER_ROADMAP_ENABLED` | `roadmodel-web` Vercel env vars (default `false`) | Next.js model-routing resolver — gates the Phase 5 Anthropic frontier branch | **not set anywhere in Phase 4 (defaults false)** | web: production + preview + staging (set true on the scope where Phase 5 rolls out) |
445
- | `RECOMMEND_RATELIMIT_EXEMPT_USER_IDS` | `roadmodel-web` Vercel env vars (comma-separated founder Supabase uid; default empty) | Next.js rate limiter — user_ids that skip the `/api/recommend` daily limit (founder browser dogfooding); empty = nobody exempt | web: production (founder uid) | web: production (+ preview/staging if founder tests there) |
445
+ | `RECOMMEND_RATELIMIT_EXEMPT_USER_IDS` | `roadmodel-web` Vercel env vars (comma-separated founder Supabase uid; default empty) | The FOUNDER list (`web/lib/funding-lane.ts`): these user_ids run `/api/recommend` and `/api/roadmap` on the operator's keys with no rate limit, and see the founder-only engines; empty = nobody | web: production (founder uid) | web: production (+ preview/staging if founder tests there) |
446
+ | `RECOMMEND_INVITED_USER_IDS` | `roadmodel-web` Vercel env vars (comma-separated Supabase uids; default empty; personal data, never committed) | The INVITE list (`web/lib/funding-lane.ts`, Phase 4.11): these user_ids run on the operator's keys, 20 a day each; every caller on neither list gets `402 funding_required` before any paid call | web: production (Phase 4.11 Step 1) | web: production |
447
+ | `ROADMODEL_DAILY_COST_CAP_USD` | `roadmodel-web` Vercel env vars (readable, not sensitive) | The operator lane's daily spend circuit breaker (`web/lib/spend-guard.ts`): once the UTC day's operator-funded `audit_log.cost_usd` reaches it, the operator lane answers 503 until midnight; 0 = off | web: production = `2` (Phase 4.11 Step 1) | web: production |
446
448
 
447
449
  Rules:
448
450
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "roadmodel"
7
- version = "0.2.65"
7
+ version = "0.2.67"
8
8
  description = "BYO-key CLI that recommends the right AI model, platform, and settings for a prompt."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -92,6 +92,11 @@ include = [
92
92
  "docs/catalog.json",
93
93
  "docs/benchmarks.json",
94
94
  "scripts/update_projects.py",
95
+ "scripts/agent_context.py",
96
+ "scripts/agent_rules.py",
97
+ "scripts/upgrade_fleet.py",
98
+ "scripts/worktree_memory.py",
99
+ "scripts/updater_lock.py",
95
100
  "hatch_build.py",
96
101
  "README.md",
97
102
  "LICENSE",