omp-llm-role 1.0.0 → 1.1.0

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 (49) hide show
  1. package/README.md +179 -11
  2. package/agents/designer.md +4 -3
  3. package/docs/dev/README.md +44 -7
  4. package/docs/dev/agent-authoring.md +59 -1
  5. package/docs/dev/architecture.md +84 -27
  6. package/docs/dev/ci.md +152 -0
  7. package/docs/dev/current-state.md +327 -24
  8. package/docs/dev/data-sources.md +202 -38
  9. package/docs/dev/explorer.md +157 -46
  10. package/docs/dev/quirks.md +45 -4
  11. package/docs/dev/releasing.md +129 -17
  12. package/docs/dev/scoring.md +789 -28
  13. package/docs/dev/testing.md +206 -0
  14. package/docs/dev/writes-and-state.md +176 -28
  15. package/docs/llm-role-rankings.md +141 -140
  16. package/package.json +754 -80
  17. package/skills/omp-llm-role-create-agent/SKILL.md +7 -1
  18. package/src/agent-architect.ts +148 -19
  19. package/src/agent-create.ts +800 -40
  20. package/src/agent-file.ts +2 -5
  21. package/src/architect-provenance.ts +16 -0
  22. package/src/availability.ts +104 -6
  23. package/src/benchmark-author.ts +9 -4
  24. package/src/benchmark-sources.ts +283 -18
  25. package/src/cli/create-role.ts +29 -1
  26. package/src/cli/llm-role-rank.ts +40 -1
  27. package/src/config-edit.ts +207 -80
  28. package/src/engine.ts +409 -46
  29. package/src/error-report.ts +562 -0
  30. package/src/explorer/boot.ts +36 -24
  31. package/src/explorer/explain.ts +110 -13
  32. package/src/explorer/scopes.ts +110 -0
  33. package/src/explorer/server.ts +112 -32
  34. package/src/extension.ts +407 -34
  35. package/src/features.ts +103 -0
  36. package/src/project-registry.ts +65 -0
  37. package/src/project-setup.ts +382 -0
  38. package/src/prompts/agent-creation-architect.md +2 -0
  39. package/src/prompts/project-profile-architect.md +33 -0
  40. package/src/prompts/project-profile-user.md +8 -0
  41. package/src/role-archetypes.ts +12 -2
  42. package/src/role-settings.ts +22 -0
  43. package/src/settings.ts +205 -24
  44. package/src/state.ts +1 -1
  45. package/src/updater.ts +150 -31
  46. package/web/app.js +411 -12
  47. package/web/index.html +1 -0
  48. package/web/style.css +44 -1
  49. package/docs/dev/spec.md +0 -633
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omp-llm-role",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "type": "module",
5
5
  "description": "omp plugin: daily model-role updater driven by llm-stats/OpenRouter rankings",
6
6
  "license": "MIT",
@@ -31,7 +31,9 @@
31
31
  "create-role": "node src/cli/create-role.ts"
32
32
  },
33
33
  "omp": {
34
- "extensions": ["./src/extension.ts"],
34
+ "extensions": [
35
+ "./src/extension.ts"
36
+ ],
35
37
  "settings": {
36
38
  "switchMargin": {
37
39
  "type": "number",
@@ -66,6 +68,36 @@
66
68
  "description": "Reapply the new default selector to an empty session's active model",
67
69
  "default": true
68
70
  },
71
+ "errorReporting": {
72
+ "type": "enum",
73
+ "description": "File unexpected plugin errors as GitHub issues (off, ask, auto)",
74
+ "default": "off",
75
+ "values": [
76
+ "off",
77
+ "ask",
78
+ "auto"
79
+ ]
80
+ },
81
+ "features.endpointCeilings": {
82
+ "type": "boolean",
83
+ "description": "Drop routes that cannot call tools and routes whose output ceiling is below 16 384 tokens",
84
+ "default": false
85
+ },
86
+ "features.cachePricing": {
87
+ "type": "boolean",
88
+ "description": "Price the role on a cache-heavy agent loop's invoice (cacheHitRate 0.5) instead of the sticker price",
89
+ "default": false
90
+ },
91
+ "features.providerPinning": {
92
+ "type": "boolean",
93
+ "description": "Price a model on its own lab's route where one exists (per-model policy; never drops a model)",
94
+ "default": false
95
+ },
96
+ "features.costCap": {
97
+ "type": "boolean",
98
+ "description": "Drop the priciest tail of the eligible pool (maxPriceUsdPerM 10)",
99
+ "default": false
100
+ },
69
101
  "roles.default.enabled": {
70
102
  "type": "boolean",
71
103
  "description": "Enable the default role",
@@ -80,7 +112,53 @@
80
112
  "type": "enum",
81
113
  "description": "Thinking level appended to the default selector",
82
114
  "default": "auto",
83
- "values": ["off", "minimal", "low", "medium", "high", "xhigh", "max", "auto"]
115
+ "values": [
116
+ "off",
117
+ "minimal",
118
+ "low",
119
+ "medium",
120
+ "high",
121
+ "xhigh",
122
+ "max",
123
+ "auto"
124
+ ]
125
+ },
126
+ "roles.default.providerPin": {
127
+ "type": "string",
128
+ "description": "Provider slug the default role's requests are pinned to (OpenRouter @<slug> routing; empty = default routing)"
129
+ },
130
+ "roles.default.cacheHitRate": {
131
+ "type": "number",
132
+ "description": "Assumed cache-hit rate (0–1) for default's input tokens; blends each route's cache-read price before the 3:1 blend (0 = off)",
133
+ "default": 0,
134
+ "min": 0,
135
+ "max": 1,
136
+ "step": 0.01
137
+ },
138
+ "roles.default.features.endpointCeilings": {
139
+ "type": "boolean",
140
+ "description": "Enable the Endpoint capability ceilings capability for the default role",
141
+ "default": false
142
+ },
143
+ "roles.default.features.cachePricing": {
144
+ "type": "boolean",
145
+ "description": "Enable the Cache-read pricing capability for the default role",
146
+ "default": false
147
+ },
148
+ "roles.default.features.providerPinning": {
149
+ "type": "boolean",
150
+ "description": "Enable the Prefer the model's own lab endpoint capability for the default role",
151
+ "default": false
152
+ },
153
+ "roles.default.features.costCap": {
154
+ "type": "boolean",
155
+ "description": "Enable the Cost cap capability for the default role",
156
+ "default": false
157
+ },
158
+ "roles.default.preferOwnProvider": {
159
+ "type": "boolean",
160
+ "description": "Price default models on their own lab's route where one exists (soft preference; never drops a model)",
161
+ "default": false
84
162
  },
85
163
  "roles.default.required": {
86
164
  "type": "string",
@@ -92,6 +170,29 @@
92
170
  "description": "Restrict the default pool to image-capable models",
93
171
  "default": false
94
172
  },
173
+ "roles.default.filters.tools": {
174
+ "type": "boolean",
175
+ "description": "Restrict the default pool to models with a tool-capable route",
176
+ "default": false
177
+ },
178
+ "roles.default.filters.minContextTokens": {
179
+ "type": "number",
180
+ "description": "Drop default routes whose endpoint context is below this (tokens; 0 = off)",
181
+ "default": 0,
182
+ "min": 0
183
+ },
184
+ "roles.default.filters.minOutputTokens": {
185
+ "type": "number",
186
+ "description": "Drop default routes whose endpoint output ceiling is below this (tokens; 0 = off)",
187
+ "default": 0,
188
+ "min": 0
189
+ },
190
+ "roles.default.filters.maxPriceUsdPerM": {
191
+ "type": "number",
192
+ "description": "Drop default models whose role-priced blend exceeds this ($/M; 0 = off)",
193
+ "default": 0,
194
+ "min": 0
195
+ },
95
196
  "roles.default.lambda": {
96
197
  "type": "number",
97
198
  "description": "Explicit λ ($ per quality point) override for default",
@@ -100,15 +201,7 @@
100
201
  "roles.default.weights.general": {
101
202
  "type": "number",
102
203
  "description": "Weight of general in the default quality composite",
103
- "default": 0.3221,
104
- "min": 0,
105
- "max": 1,
106
- "step": 0.001
107
- },
108
- "roles.default.weights.reasoning": {
109
- "type": "number",
110
- "description": "Weight of reasoning in the default quality composite",
111
- "default": 0.1705,
204
+ "default": 0.4926,
112
205
  "min": 0,
113
206
  "max": 1,
114
207
  "step": 0.001
@@ -167,7 +260,53 @@
167
260
  "type": "enum",
168
261
  "description": "Thinking level appended to the smol selector",
169
262
  "default": "off",
170
- "values": ["off", "minimal", "low", "medium", "high", "xhigh", "max", "auto"]
263
+ "values": [
264
+ "off",
265
+ "minimal",
266
+ "low",
267
+ "medium",
268
+ "high",
269
+ "xhigh",
270
+ "max",
271
+ "auto"
272
+ ]
273
+ },
274
+ "roles.smol.providerPin": {
275
+ "type": "string",
276
+ "description": "Provider slug the smol role's requests are pinned to (OpenRouter @<slug> routing; empty = default routing)"
277
+ },
278
+ "roles.smol.cacheHitRate": {
279
+ "type": "number",
280
+ "description": "Assumed cache-hit rate (0–1) for smol's input tokens; blends each route's cache-read price before the 3:1 blend (0 = off)",
281
+ "default": 0,
282
+ "min": 0,
283
+ "max": 1,
284
+ "step": 0.01
285
+ },
286
+ "roles.smol.features.endpointCeilings": {
287
+ "type": "boolean",
288
+ "description": "Enable the Endpoint capability ceilings capability for the smol role",
289
+ "default": false
290
+ },
291
+ "roles.smol.features.cachePricing": {
292
+ "type": "boolean",
293
+ "description": "Enable the Cache-read pricing capability for the smol role",
294
+ "default": false
295
+ },
296
+ "roles.smol.features.providerPinning": {
297
+ "type": "boolean",
298
+ "description": "Enable the Prefer the model's own lab endpoint capability for the smol role",
299
+ "default": false
300
+ },
301
+ "roles.smol.features.costCap": {
302
+ "type": "boolean",
303
+ "description": "Enable the Cost cap capability for the smol role",
304
+ "default": false
305
+ },
306
+ "roles.smol.preferOwnProvider": {
307
+ "type": "boolean",
308
+ "description": "Price smol models on their own lab's route where one exists (soft preference; never drops a model)",
309
+ "default": false
171
310
  },
172
311
  "roles.smol.required": {
173
312
  "type": "string",
@@ -179,6 +318,29 @@
179
318
  "description": "Restrict the smol pool to image-capable models",
180
319
  "default": false
181
320
  },
321
+ "roles.smol.filters.tools": {
322
+ "type": "boolean",
323
+ "description": "Restrict the smol pool to models with a tool-capable route",
324
+ "default": false
325
+ },
326
+ "roles.smol.filters.minContextTokens": {
327
+ "type": "number",
328
+ "description": "Drop smol routes whose endpoint context is below this (tokens; 0 = off)",
329
+ "default": 0,
330
+ "min": 0
331
+ },
332
+ "roles.smol.filters.minOutputTokens": {
333
+ "type": "number",
334
+ "description": "Drop smol routes whose endpoint output ceiling is below this (tokens; 0 = off)",
335
+ "default": 0,
336
+ "min": 0
337
+ },
338
+ "roles.smol.filters.maxPriceUsdPerM": {
339
+ "type": "number",
340
+ "description": "Drop smol models whose role-priced blend exceeds this ($/M; 0 = off)",
341
+ "default": 0,
342
+ "min": 0
343
+ },
182
344
  "roles.smol.lambda": {
183
345
  "type": "number",
184
346
  "description": "Explicit λ ($ per quality point) override for smol",
@@ -187,7 +349,7 @@
187
349
  "roles.smol.weights.price": {
188
350
  "type": "number",
189
351
  "description": "Weight of price in the smol quality composite",
190
- "default": 0.3,
352
+ "default": 0.45,
191
353
  "min": 0,
192
354
  "max": 1,
193
355
  "step": 0.001
@@ -195,7 +357,7 @@
195
357
  "roles.smol.weights.throughput": {
196
358
  "type": "number",
197
359
  "description": "Weight of throughput in the smol quality composite",
198
- "default": 0.28,
360
+ "default": 0.22,
199
361
  "min": 0,
200
362
  "max": 1,
201
363
  "step": 0.001
@@ -203,7 +365,7 @@
203
365
  "roles.smol.weights.general": {
204
366
  "type": "number",
205
367
  "description": "Weight of general in the smol quality composite",
206
- "default": 0.2,
368
+ "default": 0.1571,
207
369
  "min": 0,
208
370
  "max": 1,
209
371
  "step": 0.001
@@ -211,7 +373,7 @@
211
373
  "roles.smol.weights.code": {
212
374
  "type": "number",
213
375
  "description": "Weight of code in the smol quality composite",
214
- "default": 0.12,
376
+ "default": 0.0943,
215
377
  "min": 0,
216
378
  "max": 1,
217
379
  "step": 0.001
@@ -219,7 +381,7 @@
219
381
  "roles.smol.weights.tool_calling": {
220
382
  "type": "number",
221
383
  "description": "Weight of tool_calling in the smol quality composite",
222
- "default": 0.1,
384
+ "default": 0.0786,
223
385
  "min": 0,
224
386
  "max": 1,
225
387
  "step": 0.001
@@ -238,7 +400,53 @@
238
400
  "type": "enum",
239
401
  "description": "Thinking level appended to the slow selector",
240
402
  "default": "high",
241
- "values": ["off", "minimal", "low", "medium", "high", "xhigh", "max", "auto"]
403
+ "values": [
404
+ "off",
405
+ "minimal",
406
+ "low",
407
+ "medium",
408
+ "high",
409
+ "xhigh",
410
+ "max",
411
+ "auto"
412
+ ]
413
+ },
414
+ "roles.slow.providerPin": {
415
+ "type": "string",
416
+ "description": "Provider slug the slow role's requests are pinned to (OpenRouter @<slug> routing; empty = default routing)"
417
+ },
418
+ "roles.slow.cacheHitRate": {
419
+ "type": "number",
420
+ "description": "Assumed cache-hit rate (0–1) for slow's input tokens; blends each route's cache-read price before the 3:1 blend (0 = off)",
421
+ "default": 0,
422
+ "min": 0,
423
+ "max": 1,
424
+ "step": 0.01
425
+ },
426
+ "roles.slow.features.endpointCeilings": {
427
+ "type": "boolean",
428
+ "description": "Enable the Endpoint capability ceilings capability for the slow role",
429
+ "default": false
430
+ },
431
+ "roles.slow.features.cachePricing": {
432
+ "type": "boolean",
433
+ "description": "Enable the Cache-read pricing capability for the slow role",
434
+ "default": false
435
+ },
436
+ "roles.slow.features.providerPinning": {
437
+ "type": "boolean",
438
+ "description": "Enable the Prefer the model's own lab endpoint capability for the slow role",
439
+ "default": false
440
+ },
441
+ "roles.slow.features.costCap": {
442
+ "type": "boolean",
443
+ "description": "Enable the Cost cap capability for the slow role",
444
+ "default": false
445
+ },
446
+ "roles.slow.preferOwnProvider": {
447
+ "type": "boolean",
448
+ "description": "Price slow models on their own lab's route where one exists (soft preference; never drops a model)",
449
+ "default": false
242
450
  },
243
451
  "roles.slow.required": {
244
452
  "type": "string",
@@ -250,6 +458,29 @@
250
458
  "description": "Restrict the slow pool to image-capable models",
251
459
  "default": false
252
460
  },
461
+ "roles.slow.filters.tools": {
462
+ "type": "boolean",
463
+ "description": "Restrict the slow pool to models with a tool-capable route",
464
+ "default": false
465
+ },
466
+ "roles.slow.filters.minContextTokens": {
467
+ "type": "number",
468
+ "description": "Drop slow routes whose endpoint context is below this (tokens; 0 = off)",
469
+ "default": 0,
470
+ "min": 0
471
+ },
472
+ "roles.slow.filters.minOutputTokens": {
473
+ "type": "number",
474
+ "description": "Drop slow routes whose endpoint output ceiling is below this (tokens; 0 = off)",
475
+ "default": 0,
476
+ "min": 0
477
+ },
478
+ "roles.slow.filters.maxPriceUsdPerM": {
479
+ "type": "number",
480
+ "description": "Drop slow models whose role-priced blend exceeds this ($/M; 0 = off)",
481
+ "default": 0,
482
+ "min": 0
483
+ },
253
484
  "roles.slow.lambda": {
254
485
  "type": "number",
255
486
  "description": "Explicit λ ($ per quality point) override for slow",
@@ -258,15 +489,7 @@
258
489
  "roles.slow.weights.general": {
259
490
  "type": "number",
260
491
  "description": "Weight of general in the slow quality composite",
261
- "default": 0.26,
262
- "min": 0,
263
- "max": 1,
264
- "step": 0.001
265
- },
266
- "roles.slow.weights.reasoning": {
267
- "type": "number",
268
- "description": "Weight of reasoning in the slow quality composite",
269
- "default": 0.26,
492
+ "default": 0.6,
270
493
  "min": 0,
271
494
  "max": 1,
272
495
  "step": 0.001
@@ -287,14 +510,6 @@
287
510
  "max": 1,
288
511
  "step": 0.001
289
512
  },
290
- "roles.slow.weights.math": {
291
- "type": "number",
292
- "description": "Weight of math in the slow quality composite",
293
- "default": 0.08,
294
- "min": 0,
295
- "max": 1,
296
- "step": 0.001
297
- },
298
513
  "roles.slow.weights.throughput": {
299
514
  "type": "number",
300
515
  "description": "Weight of throughput in the slow quality composite",
@@ -325,7 +540,53 @@
325
540
  "type": "enum",
326
541
  "description": "Thinking level appended to the vision selector",
327
542
  "default": "auto",
328
- "values": ["off", "minimal", "low", "medium", "high", "xhigh", "max", "auto"]
543
+ "values": [
544
+ "off",
545
+ "minimal",
546
+ "low",
547
+ "medium",
548
+ "high",
549
+ "xhigh",
550
+ "max",
551
+ "auto"
552
+ ]
553
+ },
554
+ "roles.vision.providerPin": {
555
+ "type": "string",
556
+ "description": "Provider slug the vision role's requests are pinned to (OpenRouter @<slug> routing; empty = default routing)"
557
+ },
558
+ "roles.vision.cacheHitRate": {
559
+ "type": "number",
560
+ "description": "Assumed cache-hit rate (0–1) for vision's input tokens; blends each route's cache-read price before the 3:1 blend (0 = off)",
561
+ "default": 0,
562
+ "min": 0,
563
+ "max": 1,
564
+ "step": 0.01
565
+ },
566
+ "roles.vision.features.endpointCeilings": {
567
+ "type": "boolean",
568
+ "description": "Enable the Endpoint capability ceilings capability for the vision role",
569
+ "default": false
570
+ },
571
+ "roles.vision.features.cachePricing": {
572
+ "type": "boolean",
573
+ "description": "Enable the Cache-read pricing capability for the vision role",
574
+ "default": false
575
+ },
576
+ "roles.vision.features.providerPinning": {
577
+ "type": "boolean",
578
+ "description": "Enable the Prefer the model's own lab endpoint capability for the vision role",
579
+ "default": false
580
+ },
581
+ "roles.vision.features.costCap": {
582
+ "type": "boolean",
583
+ "description": "Enable the Cost cap capability for the vision role",
584
+ "default": false
585
+ },
586
+ "roles.vision.preferOwnProvider": {
587
+ "type": "boolean",
588
+ "description": "Price vision models on their own lab's route where one exists (soft preference; never drops a model)",
589
+ "default": false
329
590
  },
330
591
  "roles.vision.required": {
331
592
  "type": "string",
@@ -337,6 +598,29 @@
337
598
  "description": "Restrict the vision pool to image-capable models",
338
599
  "default": true
339
600
  },
601
+ "roles.vision.filters.tools": {
602
+ "type": "boolean",
603
+ "description": "Restrict the vision pool to models with a tool-capable route",
604
+ "default": false
605
+ },
606
+ "roles.vision.filters.minContextTokens": {
607
+ "type": "number",
608
+ "description": "Drop vision routes whose endpoint context is below this (tokens; 0 = off)",
609
+ "default": 0,
610
+ "min": 0
611
+ },
612
+ "roles.vision.filters.minOutputTokens": {
613
+ "type": "number",
614
+ "description": "Drop vision routes whose endpoint output ceiling is below this (tokens; 0 = off)",
615
+ "default": 0,
616
+ "min": 0
617
+ },
618
+ "roles.vision.filters.maxPriceUsdPerM": {
619
+ "type": "number",
620
+ "description": "Drop vision models whose role-priced blend exceeds this ($/M; 0 = off)",
621
+ "default": 0,
622
+ "min": 0
623
+ },
340
624
  "roles.vision.lambda": {
341
625
  "type": "number",
342
626
  "description": "Explicit λ ($ per quality point) override for vision",
@@ -398,13 +682,59 @@
398
682
  "roles.plan.description": {
399
683
  "type": "string",
400
684
  "description": "Description of the plan role",
401
- "default": "Planning: reasoning, math, long-context coherence"
685
+ "default": "Planning: reasoning and long-context coherence, priced so the cheapest capable planner wins"
402
686
  },
403
687
  "roles.plan.thinking": {
404
688
  "type": "enum",
405
689
  "description": "Thinking level appended to the plan selector",
406
690
  "default": "auto",
407
- "values": ["off", "minimal", "low", "medium", "high", "xhigh", "max", "auto"]
691
+ "values": [
692
+ "off",
693
+ "minimal",
694
+ "low",
695
+ "medium",
696
+ "high",
697
+ "xhigh",
698
+ "max",
699
+ "auto"
700
+ ]
701
+ },
702
+ "roles.plan.providerPin": {
703
+ "type": "string",
704
+ "description": "Provider slug the plan role's requests are pinned to (OpenRouter @<slug> routing; empty = default routing)"
705
+ },
706
+ "roles.plan.cacheHitRate": {
707
+ "type": "number",
708
+ "description": "Assumed cache-hit rate (0–1) for plan's input tokens; blends each route's cache-read price before the 3:1 blend (0 = off)",
709
+ "default": 0,
710
+ "min": 0,
711
+ "max": 1,
712
+ "step": 0.01
713
+ },
714
+ "roles.plan.features.endpointCeilings": {
715
+ "type": "boolean",
716
+ "description": "Enable the Endpoint capability ceilings capability for the plan role",
717
+ "default": false
718
+ },
719
+ "roles.plan.features.cachePricing": {
720
+ "type": "boolean",
721
+ "description": "Enable the Cache-read pricing capability for the plan role",
722
+ "default": false
723
+ },
724
+ "roles.plan.features.providerPinning": {
725
+ "type": "boolean",
726
+ "description": "Enable the Prefer the model's own lab endpoint capability for the plan role",
727
+ "default": false
728
+ },
729
+ "roles.plan.features.costCap": {
730
+ "type": "boolean",
731
+ "description": "Enable the Cost cap capability for the plan role",
732
+ "default": false
733
+ },
734
+ "roles.plan.preferOwnProvider": {
735
+ "type": "boolean",
736
+ "description": "Price plan models on their own lab's route where one exists (soft preference; never drops a model)",
737
+ "default": false
408
738
  },
409
739
  "roles.plan.required": {
410
740
  "type": "string",
@@ -416,23 +746,38 @@
416
746
  "description": "Restrict the plan pool to image-capable models",
417
747
  "default": false
418
748
  },
419
- "roles.plan.lambda": {
749
+ "roles.plan.filters.tools": {
750
+ "type": "boolean",
751
+ "description": "Restrict the plan pool to models with a tool-capable route",
752
+ "default": false
753
+ },
754
+ "roles.plan.filters.minContextTokens": {
420
755
  "type": "number",
421
- "description": "Explicit λ ($ per quality point) override for plan",
756
+ "description": "Drop plan routes whose endpoint context is below this (tokens; 0 = off)",
757
+ "default": 0,
422
758
  "min": 0
423
759
  },
424
- "roles.plan.weights.reasoning": {
760
+ "roles.plan.filters.minOutputTokens": {
425
761
  "type": "number",
426
- "description": "Weight of reasoning in the plan quality composite",
427
- "default": 0.3129,
428
- "min": 0,
429
- "max": 1,
430
- "step": 0.001
762
+ "description": "Drop plan routes whose endpoint output ceiling is below this (tokens; 0 = off)",
763
+ "default": 0,
764
+ "min": 0
765
+ },
766
+ "roles.plan.filters.maxPriceUsdPerM": {
767
+ "type": "number",
768
+ "description": "Drop plan models whose role-priced blend exceeds this ($/M; 0 = off)",
769
+ "default": 0,
770
+ "min": 0
771
+ },
772
+ "roles.plan.lambda": {
773
+ "type": "number",
774
+ "description": "Explicit λ ($ per quality point) override for plan",
775
+ "min": 0
431
776
  },
432
777
  "roles.plan.weights.general": {
433
778
  "type": "number",
434
779
  "description": "Weight of general in the plan quality composite",
435
- "default": 0.2542,
780
+ "default": 0.6,
436
781
  "min": 0,
437
782
  "max": 1,
438
783
  "step": 0.001
@@ -440,15 +785,7 @@
440
785
  "roles.plan.weights.long_context": {
441
786
  "type": "number",
442
787
  "description": "Weight of long_context in the plan quality composite",
443
- "default": 0.1369,
444
- "min": 0,
445
- "max": 1,
446
- "step": 0.001
447
- },
448
- "roles.plan.weights.math": {
449
- "type": "number",
450
- "description": "Weight of math in the plan quality composite",
451
- "default": 0.1369,
788
+ "default": 0.116676,
452
789
  "min": 0,
453
790
  "max": 1,
454
791
  "step": 0.001
@@ -456,7 +793,7 @@
456
793
  "roles.plan.weights.throughput": {
457
794
  "type": "number",
458
795
  "description": "Weight of throughput in the plan quality composite",
459
- "default": 0.0391,
796
+ "default": 0.033324,
460
797
  "min": 0,
461
798
  "max": 1,
462
799
  "step": 0.001
@@ -464,7 +801,7 @@
464
801
  "roles.plan.weights.price": {
465
802
  "type": "number",
466
803
  "description": "Weight of price in the plan quality composite",
467
- "default": 0.12,
804
+ "default": 0.25,
468
805
  "min": 0,
469
806
  "max": 1,
470
807
  "step": 0.001
@@ -483,7 +820,53 @@
483
820
  "type": "enum",
484
821
  "description": "Thinking level appended to the commit selector",
485
822
  "default": "off",
486
- "values": ["off", "minimal", "low", "medium", "high", "xhigh", "max", "auto"]
823
+ "values": [
824
+ "off",
825
+ "minimal",
826
+ "low",
827
+ "medium",
828
+ "high",
829
+ "xhigh",
830
+ "max",
831
+ "auto"
832
+ ]
833
+ },
834
+ "roles.commit.providerPin": {
835
+ "type": "string",
836
+ "description": "Provider slug the commit role's requests are pinned to (OpenRouter @<slug> routing; empty = default routing)"
837
+ },
838
+ "roles.commit.cacheHitRate": {
839
+ "type": "number",
840
+ "description": "Assumed cache-hit rate (0–1) for commit's input tokens; blends each route's cache-read price before the 3:1 blend (0 = off)",
841
+ "default": 0,
842
+ "min": 0,
843
+ "max": 1,
844
+ "step": 0.01
845
+ },
846
+ "roles.commit.features.endpointCeilings": {
847
+ "type": "boolean",
848
+ "description": "Enable the Endpoint capability ceilings capability for the commit role",
849
+ "default": false
850
+ },
851
+ "roles.commit.features.cachePricing": {
852
+ "type": "boolean",
853
+ "description": "Enable the Cache-read pricing capability for the commit role",
854
+ "default": false
855
+ },
856
+ "roles.commit.features.providerPinning": {
857
+ "type": "boolean",
858
+ "description": "Enable the Prefer the model's own lab endpoint capability for the commit role",
859
+ "default": false
860
+ },
861
+ "roles.commit.features.costCap": {
862
+ "type": "boolean",
863
+ "description": "Enable the Cost cap capability for the commit role",
864
+ "default": false
865
+ },
866
+ "roles.commit.preferOwnProvider": {
867
+ "type": "boolean",
868
+ "description": "Price commit models on their own lab's route where one exists (soft preference; never drops a model)",
869
+ "default": false
487
870
  },
488
871
  "roles.commit.required": {
489
872
  "type": "string",
@@ -495,6 +878,29 @@
495
878
  "description": "Restrict the commit pool to image-capable models",
496
879
  "default": false
497
880
  },
881
+ "roles.commit.filters.tools": {
882
+ "type": "boolean",
883
+ "description": "Restrict the commit pool to models with a tool-capable route",
884
+ "default": false
885
+ },
886
+ "roles.commit.filters.minContextTokens": {
887
+ "type": "number",
888
+ "description": "Drop commit routes whose endpoint context is below this (tokens; 0 = off)",
889
+ "default": 0,
890
+ "min": 0
891
+ },
892
+ "roles.commit.filters.minOutputTokens": {
893
+ "type": "number",
894
+ "description": "Drop commit routes whose endpoint output ceiling is below this (tokens; 0 = off)",
895
+ "default": 0,
896
+ "min": 0
897
+ },
898
+ "roles.commit.filters.maxPriceUsdPerM": {
899
+ "type": "number",
900
+ "description": "Drop commit models whose role-priced blend exceeds this ($/M; 0 = off)",
901
+ "default": 0,
902
+ "min": 0
903
+ },
498
904
  "roles.commit.lambda": {
499
905
  "type": "number",
500
906
  "description": "Explicit λ ($ per quality point) override for commit",
@@ -503,7 +909,7 @@
503
909
  "roles.commit.weights.price": {
504
910
  "type": "number",
505
911
  "description": "Weight of price in the commit quality composite",
506
- "default": 0.35,
912
+ "default": 0.45,
507
913
  "min": 0,
508
914
  "max": 1,
509
915
  "step": 0.001
@@ -511,7 +917,7 @@
511
917
  "roles.commit.weights.throughput": {
512
918
  "type": "number",
513
919
  "description": "Weight of throughput in the commit quality composite",
514
- "default": 0.27,
920
+ "default": 0.2285,
515
921
  "min": 0,
516
922
  "max": 1,
517
923
  "step": 0.001
@@ -519,7 +925,7 @@
519
925
  "roles.commit.weights.general": {
520
926
  "type": "number",
521
927
  "description": "Weight of general in the commit quality composite",
522
- "default": 0.28,
928
+ "default": 0.2369,
523
929
  "min": 0,
524
930
  "max": 1,
525
931
  "step": 0.001
@@ -527,7 +933,7 @@
527
933
  "roles.commit.weights.code": {
528
934
  "type": "number",
529
935
  "description": "Weight of code in the commit quality composite",
530
- "default": 0.1,
936
+ "default": 0.0846,
531
937
  "min": 0,
532
938
  "max": 1,
533
939
  "step": 0.001
@@ -546,7 +952,53 @@
546
952
  "type": "enum",
547
953
  "description": "Thinking level appended to the tiny selector",
548
954
  "default": "off",
549
- "values": ["off", "minimal", "low", "medium", "high", "xhigh", "max", "auto"]
955
+ "values": [
956
+ "off",
957
+ "minimal",
958
+ "low",
959
+ "medium",
960
+ "high",
961
+ "xhigh",
962
+ "max",
963
+ "auto"
964
+ ]
965
+ },
966
+ "roles.tiny.providerPin": {
967
+ "type": "string",
968
+ "description": "Provider slug the tiny role's requests are pinned to (OpenRouter @<slug> routing; empty = default routing)"
969
+ },
970
+ "roles.tiny.cacheHitRate": {
971
+ "type": "number",
972
+ "description": "Assumed cache-hit rate (0–1) for tiny's input tokens; blends each route's cache-read price before the 3:1 blend (0 = off)",
973
+ "default": 0,
974
+ "min": 0,
975
+ "max": 1,
976
+ "step": 0.01
977
+ },
978
+ "roles.tiny.features.endpointCeilings": {
979
+ "type": "boolean",
980
+ "description": "Enable the Endpoint capability ceilings capability for the tiny role",
981
+ "default": false
982
+ },
983
+ "roles.tiny.features.cachePricing": {
984
+ "type": "boolean",
985
+ "description": "Enable the Cache-read pricing capability for the tiny role",
986
+ "default": false
987
+ },
988
+ "roles.tiny.features.providerPinning": {
989
+ "type": "boolean",
990
+ "description": "Enable the Prefer the model's own lab endpoint capability for the tiny role",
991
+ "default": false
992
+ },
993
+ "roles.tiny.features.costCap": {
994
+ "type": "boolean",
995
+ "description": "Enable the Cost cap capability for the tiny role",
996
+ "default": false
997
+ },
998
+ "roles.tiny.preferOwnProvider": {
999
+ "type": "boolean",
1000
+ "description": "Price tiny models on their own lab's route where one exists (soft preference; never drops a model)",
1001
+ "default": false
550
1002
  },
551
1003
  "roles.tiny.required": {
552
1004
  "type": "string",
@@ -558,6 +1010,29 @@
558
1010
  "description": "Restrict the tiny pool to image-capable models",
559
1011
  "default": false
560
1012
  },
1013
+ "roles.tiny.filters.tools": {
1014
+ "type": "boolean",
1015
+ "description": "Restrict the tiny pool to models with a tool-capable route",
1016
+ "default": false
1017
+ },
1018
+ "roles.tiny.filters.minContextTokens": {
1019
+ "type": "number",
1020
+ "description": "Drop tiny routes whose endpoint context is below this (tokens; 0 = off)",
1021
+ "default": 0,
1022
+ "min": 0
1023
+ },
1024
+ "roles.tiny.filters.minOutputTokens": {
1025
+ "type": "number",
1026
+ "description": "Drop tiny routes whose endpoint output ceiling is below this (tokens; 0 = off)",
1027
+ "default": 0,
1028
+ "min": 0
1029
+ },
1030
+ "roles.tiny.filters.maxPriceUsdPerM": {
1031
+ "type": "number",
1032
+ "description": "Drop tiny models whose role-priced blend exceeds this ($/M; 0 = off)",
1033
+ "default": 0,
1034
+ "min": 0
1035
+ },
561
1036
  "roles.tiny.lambda": {
562
1037
  "type": "number",
563
1038
  "description": "Explicit λ ($ per quality point) override for tiny",
@@ -601,7 +1076,53 @@
601
1076
  "type": "enum",
602
1077
  "description": "Thinking level appended to the task selector",
603
1078
  "default": "auto",
604
- "values": ["off", "minimal", "low", "medium", "high", "xhigh", "max", "auto"]
1079
+ "values": [
1080
+ "off",
1081
+ "minimal",
1082
+ "low",
1083
+ "medium",
1084
+ "high",
1085
+ "xhigh",
1086
+ "max",
1087
+ "auto"
1088
+ ]
1089
+ },
1090
+ "roles.task.providerPin": {
1091
+ "type": "string",
1092
+ "description": "Provider slug the task role's requests are pinned to (OpenRouter @<slug> routing; empty = default routing)"
1093
+ },
1094
+ "roles.task.cacheHitRate": {
1095
+ "type": "number",
1096
+ "description": "Assumed cache-hit rate (0–1) for task's input tokens; blends each route's cache-read price before the 3:1 blend (0 = off)",
1097
+ "default": 0,
1098
+ "min": 0,
1099
+ "max": 1,
1100
+ "step": 0.01
1101
+ },
1102
+ "roles.task.features.endpointCeilings": {
1103
+ "type": "boolean",
1104
+ "description": "Enable the Endpoint capability ceilings capability for the task role",
1105
+ "default": false
1106
+ },
1107
+ "roles.task.features.cachePricing": {
1108
+ "type": "boolean",
1109
+ "description": "Enable the Cache-read pricing capability for the task role",
1110
+ "default": false
1111
+ },
1112
+ "roles.task.features.providerPinning": {
1113
+ "type": "boolean",
1114
+ "description": "Enable the Prefer the model's own lab endpoint capability for the task role",
1115
+ "default": false
1116
+ },
1117
+ "roles.task.features.costCap": {
1118
+ "type": "boolean",
1119
+ "description": "Enable the Cost cap capability for the task role",
1120
+ "default": false
1121
+ },
1122
+ "roles.task.preferOwnProvider": {
1123
+ "type": "boolean",
1124
+ "description": "Price task models on their own lab's route where one exists (soft preference; never drops a model)",
1125
+ "default": false
605
1126
  },
606
1127
  "roles.task.required": {
607
1128
  "type": "string",
@@ -613,6 +1134,29 @@
613
1134
  "description": "Restrict the task pool to image-capable models",
614
1135
  "default": false
615
1136
  },
1137
+ "roles.task.filters.tools": {
1138
+ "type": "boolean",
1139
+ "description": "Restrict the task pool to models with a tool-capable route",
1140
+ "default": false
1141
+ },
1142
+ "roles.task.filters.minContextTokens": {
1143
+ "type": "number",
1144
+ "description": "Drop task routes whose endpoint context is below this (tokens; 0 = off)",
1145
+ "default": 0,
1146
+ "min": 0
1147
+ },
1148
+ "roles.task.filters.minOutputTokens": {
1149
+ "type": "number",
1150
+ "description": "Drop task routes whose endpoint output ceiling is below this (tokens; 0 = off)",
1151
+ "default": 0,
1152
+ "min": 0
1153
+ },
1154
+ "roles.task.filters.maxPriceUsdPerM": {
1155
+ "type": "number",
1156
+ "description": "Drop task models whose role-priced blend exceeds this ($/M; 0 = off)",
1157
+ "default": 0,
1158
+ "min": 0
1159
+ },
616
1160
  "roles.task.lambda": {
617
1161
  "type": "number",
618
1162
  "description": "Explicit λ ($ per quality point) override for task",
@@ -680,7 +1224,53 @@
680
1224
  "type": "enum",
681
1225
  "description": "Thinking level appended to the advisor selector",
682
1226
  "default": "auto",
683
- "values": ["off", "minimal", "low", "medium", "high", "xhigh", "max", "auto"]
1227
+ "values": [
1228
+ "off",
1229
+ "minimal",
1230
+ "low",
1231
+ "medium",
1232
+ "high",
1233
+ "xhigh",
1234
+ "max",
1235
+ "auto"
1236
+ ]
1237
+ },
1238
+ "roles.advisor.providerPin": {
1239
+ "type": "string",
1240
+ "description": "Provider slug the advisor role's requests are pinned to (OpenRouter @<slug> routing; empty = default routing)"
1241
+ },
1242
+ "roles.advisor.cacheHitRate": {
1243
+ "type": "number",
1244
+ "description": "Assumed cache-hit rate (0–1) for advisor's input tokens; blends each route's cache-read price before the 3:1 blend (0 = off)",
1245
+ "default": 0,
1246
+ "min": 0,
1247
+ "max": 1,
1248
+ "step": 0.01
1249
+ },
1250
+ "roles.advisor.features.endpointCeilings": {
1251
+ "type": "boolean",
1252
+ "description": "Enable the Endpoint capability ceilings capability for the advisor role",
1253
+ "default": false
1254
+ },
1255
+ "roles.advisor.features.cachePricing": {
1256
+ "type": "boolean",
1257
+ "description": "Enable the Cache-read pricing capability for the advisor role",
1258
+ "default": false
1259
+ },
1260
+ "roles.advisor.features.providerPinning": {
1261
+ "type": "boolean",
1262
+ "description": "Enable the Prefer the model's own lab endpoint capability for the advisor role",
1263
+ "default": false
1264
+ },
1265
+ "roles.advisor.features.costCap": {
1266
+ "type": "boolean",
1267
+ "description": "Enable the Cost cap capability for the advisor role",
1268
+ "default": false
1269
+ },
1270
+ "roles.advisor.preferOwnProvider": {
1271
+ "type": "boolean",
1272
+ "description": "Price advisor models on their own lab's route where one exists (soft preference; never drops a model)",
1273
+ "default": false
684
1274
  },
685
1275
  "roles.advisor.required": {
686
1276
  "type": "string",
@@ -692,23 +1282,38 @@
692
1282
  "description": "Restrict the advisor pool to image-capable models",
693
1283
  "default": false
694
1284
  },
695
- "roles.advisor.lambda": {
1285
+ "roles.advisor.filters.tools": {
1286
+ "type": "boolean",
1287
+ "description": "Restrict the advisor pool to models with a tool-capable route",
1288
+ "default": false
1289
+ },
1290
+ "roles.advisor.filters.minContextTokens": {
696
1291
  "type": "number",
697
- "description": "Explicit λ ($ per quality point) override for advisor",
1292
+ "description": "Drop advisor routes whose endpoint context is below this (tokens; 0 = off)",
1293
+ "default": 0,
698
1294
  "min": 0
699
1295
  },
700
- "roles.advisor.weights.reasoning": {
1296
+ "roles.advisor.filters.minOutputTokens": {
701
1297
  "type": "number",
702
- "description": "Weight of reasoning in the advisor quality composite",
703
- "default": 0.3498,
704
- "min": 0,
705
- "max": 1,
706
- "step": 0.001
1298
+ "description": "Drop advisor routes whose endpoint output ceiling is below this (tokens; 0 = off)",
1299
+ "default": 0,
1300
+ "min": 0
1301
+ },
1302
+ "roles.advisor.filters.maxPriceUsdPerM": {
1303
+ "type": "number",
1304
+ "description": "Drop advisor models whose role-priced blend exceeds this ($/M; 0 = off)",
1305
+ "default": 0,
1306
+ "min": 0
1307
+ },
1308
+ "roles.advisor.lambda": {
1309
+ "type": "number",
1310
+ "description": "Explicit λ ($ per quality point) override for advisor",
1311
+ "min": 0
707
1312
  },
708
1313
  "roles.advisor.weights.general": {
709
1314
  "type": "number",
710
1315
  "description": "Weight of general in the advisor quality composite",
711
- "default": 0.2449,
1316
+ "default": 0.5947,
712
1317
  "min": 0,
713
1318
  "max": 1,
714
1319
  "step": 0.001
@@ -751,7 +1356,53 @@
751
1356
  "type": "enum",
752
1357
  "description": "Thinking level appended to the designer selector",
753
1358
  "default": "auto",
754
- "values": ["off", "minimal", "low", "medium", "high", "xhigh", "max", "auto"]
1359
+ "values": [
1360
+ "off",
1361
+ "minimal",
1362
+ "low",
1363
+ "medium",
1364
+ "high",
1365
+ "xhigh",
1366
+ "max",
1367
+ "auto"
1368
+ ]
1369
+ },
1370
+ "roles.designer.providerPin": {
1371
+ "type": "string",
1372
+ "description": "Provider slug the designer role's requests are pinned to (OpenRouter @<slug> routing; empty = default routing)"
1373
+ },
1374
+ "roles.designer.cacheHitRate": {
1375
+ "type": "number",
1376
+ "description": "Assumed cache-hit rate (0–1) for designer's input tokens; blends each route's cache-read price before the 3:1 blend (0 = off)",
1377
+ "default": 0,
1378
+ "min": 0,
1379
+ "max": 1,
1380
+ "step": 0.01
1381
+ },
1382
+ "roles.designer.features.endpointCeilings": {
1383
+ "type": "boolean",
1384
+ "description": "Enable the Endpoint capability ceilings capability for the designer role",
1385
+ "default": false
1386
+ },
1387
+ "roles.designer.features.cachePricing": {
1388
+ "type": "boolean",
1389
+ "description": "Enable the Cache-read pricing capability for the designer role",
1390
+ "default": false
1391
+ },
1392
+ "roles.designer.features.providerPinning": {
1393
+ "type": "boolean",
1394
+ "description": "Enable the Prefer the model's own lab endpoint capability for the designer role",
1395
+ "default": false
1396
+ },
1397
+ "roles.designer.features.costCap": {
1398
+ "type": "boolean",
1399
+ "description": "Enable the Cost cap capability for the designer role",
1400
+ "default": false
1401
+ },
1402
+ "roles.designer.preferOwnProvider": {
1403
+ "type": "boolean",
1404
+ "description": "Price designer models on their own lab's route where one exists (soft preference; never drops a model)",
1405
+ "default": false
755
1406
  },
756
1407
  "roles.designer.required": {
757
1408
  "type": "string",
@@ -763,6 +1414,29 @@
763
1414
  "description": "Restrict the designer pool to image-capable models",
764
1415
  "default": true
765
1416
  },
1417
+ "roles.designer.filters.tools": {
1418
+ "type": "boolean",
1419
+ "description": "Restrict the designer pool to models with a tool-capable route",
1420
+ "default": false
1421
+ },
1422
+ "roles.designer.filters.minContextTokens": {
1423
+ "type": "number",
1424
+ "description": "Drop designer routes whose endpoint context is below this (tokens; 0 = off)",
1425
+ "default": 0,
1426
+ "min": 0
1427
+ },
1428
+ "roles.designer.filters.minOutputTokens": {
1429
+ "type": "number",
1430
+ "description": "Drop designer routes whose endpoint output ceiling is below this (tokens; 0 = off)",
1431
+ "default": 0,
1432
+ "min": 0
1433
+ },
1434
+ "roles.designer.filters.maxPriceUsdPerM": {
1435
+ "type": "number",
1436
+ "description": "Drop designer models whose role-priced blend exceeds this ($/M; 0 = off)",
1437
+ "default": 0,
1438
+ "min": 0
1439
+ },
766
1440
  "roles.designer.lambda": {
767
1441
  "type": "number",
768
1442
  "description": "Explicit λ ($ per quality point) override for designer",
@@ -779,7 +1453,7 @@
779
1453
  "roles.designer.weights.code": {
780
1454
  "type": "number",
781
1455
  "description": "Weight of code in the designer quality composite",
782
- "default": 0.1,
1456
+ "default": 0.06,
783
1457
  "min": 0,
784
1458
  "max": 1,
785
1459
  "step": 0.001
@@ -795,7 +1469,7 @@
795
1469
  "roles.designer.weights.throughput": {
796
1470
  "type": "number",
797
1471
  "description": "Weight of throughput in the designer quality composite",
798
- "default": 0.13,
1472
+ "default": 0.15,
799
1473
  "min": 0,
800
1474
  "max": 1,
801
1475
  "step": 0.001
@@ -803,7 +1477,7 @@
803
1477
  "roles.designer.weights.price": {
804
1478
  "type": "number",
805
1479
  "description": "Weight of price in the designer quality composite",
806
- "default": 0.15,
1480
+ "default": 0.17,
807
1481
  "min": 0,
808
1482
  "max": 1,
809
1483
  "step": 0.001