@azure-id/orc 1.9.0 → 1.9.2

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 (134) hide show
  1. package/CHANGELOG.md +202 -0
  2. package/README-id.md +57 -59
  3. package/README.md +53 -54
  4. package/bin/build-agents.js +109 -109
  5. package/bin/cli.js +262 -58
  6. package/bin/graph-audit.js +235 -0
  7. package/bin/graph-extract.js +308 -3
  8. package/bin/graph-gain.js +23 -3
  9. package/bin/graph-map.js +9 -1
  10. package/bin/graph-query.js +152 -10
  11. package/bin/graph-shard.js +6 -1
  12. package/bin/graph-signals.js +287 -4
  13. package/bin/graph.js +717 -658
  14. package/bin/onboarding-content.js +4 -4
  15. package/bin/pricing.json +207 -200
  16. package/bin/verify-contracts.js +117 -2
  17. package/bin/verify-package.js +11 -7
  18. package/bin/webui/css/04-motion.css +162 -152
  19. package/bin/webui/css/panels/knowledge.css +563 -116
  20. package/bin/webui/fixtures/extra.js +2036 -2036
  21. package/bin/webui/fixtures/hookui.js +5 -5
  22. package/bin/webui/fixtures/knowledge.js +21 -4
  23. package/bin/webui/fixtures/settings.js +305 -305
  24. package/bin/webui/i18n/en/knowledge.json +122 -4
  25. package/bin/webui/i18n/id/knowledge.json +122 -4
  26. package/bin/webui/js/panels/knowledge.js +573 -9
  27. package/bin/webui/js/panels/overview.js +13 -4
  28. package/mock-run/context-combiner.md +100 -100
  29. package/mock-run/orc-budget.md +534 -534
  30. package/mock-run/orc-challenge-council.md +262 -262
  31. package/mock-run/orc-ultra.md +103 -103
  32. package/package.json +1 -1
  33. package/templates/agents/MODEL-MAPPING.md +43 -43
  34. package/templates/agents/orc-advisor-opus-5-xhigh.md +56 -56
  35. package/templates/agents/orc-analyze-mini-opus-5-med.md +60 -60
  36. package/templates/agents/orc-analyze-mini-sonnet-5-high.md +58 -58
  37. package/templates/agents/orc-challenge-advisor-opus-5-med.md +75 -75
  38. package/templates/agents/orc-challenge-contrarian-opus-5-high.md +110 -110
  39. package/templates/agents/orc-challenge-executor-opus-5-med.md +114 -114
  40. package/templates/agents/orc-challenge-expansionist-opus-5-med.md +112 -112
  41. package/templates/agents/orc-challenge-judge-opus-5-high.md +132 -132
  42. package/templates/agents/orc-challenge-outsider-opus-5-low.md +109 -109
  43. package/templates/agents/orc-challenge-principles-opus-5-high.md +109 -109
  44. package/templates/agents/orc-challenge-reader-opus-5-low.md +90 -90
  45. package/templates/agents/orc-claude-writer-opus-5-med.md +55 -55
  46. package/templates/agents/orc-context-combiner-opus-5-high.md +88 -88
  47. package/templates/agents/orc-doc-checker-opus-5-low.md +108 -108
  48. package/templates/agents/orc-doc-writer-opus-5-med.md +134 -134
  49. package/templates/agents/orc-executor-haiku-4-5.md +2 -1
  50. package/templates/agents/orc-executor-opus-4-7-high.md +2 -1
  51. package/templates/agents/orc-executor-opus-4-7-med.md +2 -1
  52. package/templates/agents/orc-executor-opus-4-8-high.md +2 -1
  53. package/templates/agents/orc-executor-opus-5-high.md +4 -3
  54. package/templates/agents/orc-executor-opus-5-low.md +4 -3
  55. package/templates/agents/orc-executor-opus-5-med.md +4 -3
  56. package/templates/agents/orc-executor-sonnet-4-6-high.md +2 -1
  57. package/templates/agents/orc-executor-sonnet-4-6-med.md +2 -1
  58. package/templates/agents/orc-executor-sonnet-5-high.md +2 -1
  59. package/templates/agents/orc-graph-noter-sonnet-4-6-med.md +1 -1
  60. package/templates/agents/orc-judge-opus-5-xhigh.md +85 -85
  61. package/templates/agents/orc-learn-writer-opus-5-low.md +73 -73
  62. package/templates/agents/orc-pattern-codifier-opus-5-med.md +65 -65
  63. package/templates/agents/orc-planner-mini-opus-5-med.md +4 -4
  64. package/templates/agents/orc-planner-mini-sonnet-5-high.md +1 -1
  65. package/templates/agents/orc-planner-opus-5-med.md +160 -160
  66. package/templates/agents/orc-recon-opus-5-low.md +18 -8
  67. package/templates/agents/orc-recon-sonnet-4-6-med.md +15 -5
  68. package/templates/agents/orc-retro-opus-5-med.md +3 -3
  69. package/templates/agents/orc-reviewer-opus-5-med.md +60 -60
  70. package/templates/agents/orc-scout-opus-5-low.md +40 -40
  71. package/templates/agents/orc-system-analyst-opus-5-high.md +120 -120
  72. package/templates/agents/orc-test-author-opus-5-med.md +71 -71
  73. package/templates/agents/orc-test-designer-opus-5-high.md +158 -158
  74. package/templates/agents/orc-test-interpreter-opus-5-low.md +130 -130
  75. package/templates/agents/orc-verifier-opus-5-med.md +69 -69
  76. package/templates/agents/orc-wiki-scanner-opus-5-med.md +81 -81
  77. package/templates/commands/orc-ultra.md +17 -17
  78. package/templates/commands/orc-verify.md +11 -11
  79. package/templates/hooks/README.md +13 -3
  80. package/templates/hooks/orc-effort-guard.js +178 -178
  81. package/templates/hooks/orc-graph-hook.js +53 -7
  82. package/templates/hooks/orc-statusline.js +6 -6
  83. package/templates/skills/_shared/code-graph.md +57 -18
  84. package/templates/skills/_shared/config-precedence.md +198 -198
  85. package/templates/skills/_shared/extra-dispatch.md +1346 -1346
  86. package/templates/skills/_shared/opus5-only.md +8 -8
  87. package/templates/skills/_shared/phases/analyst-gates.md +136 -136
  88. package/templates/skills/_shared/phases/execution.md +4 -4
  89. package/templates/skills/_shared/phases/planning.md +3 -3
  90. package/templates/skills/_shared/phases/preflight.md +1 -1
  91. package/templates/skills/_shared/phases/review.md +4 -2
  92. package/templates/skills/_shared/phases/ship.md +1 -1
  93. package/templates/skills/_shared/phases/trace.md +3 -2
  94. package/templates/skills/_shared/read-ladder.md +14 -1
  95. package/templates/skills/_shared/return-validation.md +1 -1
  96. package/templates/skills/context-combiner/SKILL.md +1 -1
  97. package/templates/skills/context-combiner/schemas/combined-report.md +78 -78
  98. package/templates/skills/orc/README.md +2 -2
  99. package/templates/skills/orc/SKILL.md +8 -8
  100. package/templates/skills/orc/config.md +9 -9
  101. package/templates/skills/orc/examples/full-run-mock.md +73 -73
  102. package/templates/skills/orc/references/effort-and-mode.md +222 -222
  103. package/templates/skills/orc/references/preflight-report.md +2 -2
  104. package/templates/skills/orc/references/ultra-mode.md +3 -3
  105. package/templates/skills/orc/subskills/orc-planner/SKILL.md +2 -2
  106. package/templates/skills/orc/subskills/orc-planner-mini/SKILL.md +121 -121
  107. package/templates/skills/orc/subskills/orc-review-verify/SKILL.md +76 -76
  108. package/templates/skills/orc/subskills/orc-testgen/SKILL.md +45 -45
  109. package/templates/skills/orc-analyze/SKILL.md +2 -2
  110. package/templates/skills/orc-analyze/examples/analyze-mock.md +42 -42
  111. package/templates/skills/orc-analyze/schemas/report-audit.md +83 -83
  112. package/templates/skills/orc-analyze/schemas/report-prose.md +63 -63
  113. package/templates/skills/orc-analyze/schemas/report-requirement.md +78 -78
  114. package/templates/skills/orc-challenge/README.md +142 -142
  115. package/templates/skills/orc-challenge/examples/council-full-roster.md +273 -273
  116. package/templates/skills/orc-challenge/references/council.md +315 -315
  117. package/templates/skills/orc-challenge/references/intake.md +171 -171
  118. package/templates/skills/orc-claude/SKILL.md +14 -14
  119. package/templates/skills/orc-diy/README.md +143 -143
  120. package/templates/skills/orc-diy/references/flow-schema.md +1 -1
  121. package/templates/skills/orc-doc/README.md +229 -229
  122. package/templates/skills/orc-doc/examples/orc-doc-prd-run.md +325 -325
  123. package/templates/skills/orc-doc/references/chunking.md +527 -527
  124. package/templates/skills/orc-fast/SKILL.md +4 -4
  125. package/templates/skills/orc-learn/SKILL.md +14 -14
  126. package/templates/skills/orc-learn/examples/learn-run-mock.md +61 -61
  127. package/templates/skills/orc-mini/SKILL.md +16 -20
  128. package/templates/skills/orc-mini/references/complexity.md +25 -11
  129. package/templates/skills/orc-quick/SKILL.md +12 -13
  130. package/templates/skills/orc-quick/references/gh-mode.md +1 -1
  131. package/templates/skills/orc-quick/references/look.md +5 -5
  132. package/templates/skills/orc-verify/SKILL.md +15 -15
  133. package/templates/skills/orc-verify/examples/verify-mock.md +33 -33
  134. package/templates/skills/orc-wiki/references/extra.md +1 -1
@@ -36,8 +36,8 @@ const SECTIONS = [
36
36
  "init merges two guards into .claude/settings.json (non-destructively):",
37
37
  " • a PreToolUse effort hard-block (keeps /orc on a capable tier)",
38
38
  " • a statusline model warning (❌ ORC WILL DEGRADE on the wrong tier)",
39
- "Run your MAIN session on Opus 4.8 high (or Opus 5 / Fable 5 at medium+) —",
40
- "subagents can't exceed it; the top [90,100] band needs an Opus 5 session.",
39
+ "Run your MAIN session on Opus 4.8 high (or Opus 5.5 / Fable 5 at medium+) —",
40
+ "subagents can't exceed it; the top [90,100] band needs an Opus 5.5 session.",
41
41
  ],
42
42
  },
43
43
  {
@@ -54,7 +54,7 @@ const SECTIONS = [
54
54
  "",
55
55
  "Session-tier acceptance (the statusline verdict):",
56
56
  " ✔ ORC-ready Opus 4.8 high (the baseline)",
57
- " 🚀 ORC-boosted Opus 4.8 xhigh/max, or Opus 5 / Fable 5 medium…max",
57
+ " 🚀 ORC-boosted Opus 4.8 xhigh/max, or Opus 5.5 / Fable 5 medium…max",
58
58
  " ✖ WILL DEGRADE anything below (wrong model or sub-baseline effort)",
59
59
  "",
60
60
  "Which one do I type? Start from what you HAVE, not from the lane names:",
@@ -153,7 +153,7 @@ const SECTIONS = [
153
153
  title: "⑧ Troubleshooting",
154
154
  lines: [
155
155
  " \"/orc blocked — required effort not met\"",
156
- " → switch to high effort (or Opus 5 / Fable 5 at medium+). xhigh/max also pass.",
156
+ " → switch to high effort (or Opus 5.5 / Fable 5 at medium+). xhigh/max also pass.",
157
157
  " statusline says \"WILL DEGRADE\"",
158
158
  " → wrong model/effort, or a usage window ≥90%. Move to Opus 4.8 high or Opus 5.",
159
159
  " \"wiki: UNREGISTERED\"",
package/bin/pricing.json CHANGED
@@ -1,200 +1,207 @@
1
- {
2
- "_readme": [
3
- "Dated price table for `orc budget`. Point `orc config set budget_price_table <path>`",
4
- "at your own copy to override it. Rates are USD per MILLION tokens.",
5
- "",
6
- "Four rates per model, never one: cache reads are usually the LARGEST token",
7
- "count in a run and the CHEAPEST per token, so a blended number hides",
8
- "whichever component is about to bite you. cache_write/cache_read are the",
9
- "multipliers this vendor publishes against `input` (1.25x / 0.1x) written out",
10
- "as absolute rates so nothing has to remember the ratio.",
11
- "",
12
- "`as_of` is load-bearing: a table older than 90 days makes every dollar",
13
- "figure print a staleness warning. Bump the date only when you have checked",
14
- "the published rates.",
15
- "",
16
- "`providers` (v0.50.0) is the same four-rate shape for a NON-CLAUDE endpoint",
17
- "reached through `orc extra`. Every `models` map SHIPS EMPTY, on purpose, and",
18
- "that is not an oversight: between this package's cutoff and any release the",
19
- "lineup moves (DeepSeek V3.2 -> V4, Kimi K2 -> K2.7, GLM 4.6 -> 5.2), several",
20
- "of these vendors price by PEAK/OFF-PEAK window or by tier, one is",
21
- "subscription-only, and one is a passthrough with a surcharge. A shipped",
22
- "figure that is wrong by 2x is worse than no figure, because a wrong figure",
23
- "gets believed. So ORC ships the MECHANISM and no dollar figure without a",
24
- "rate you put there yourself.",
25
- "",
26
- "Fill one in with `orc extra rates` — it lists every provider/model pair your",
27
- "own traces have actually used, prints the JSON to paste, and says which ones",
28
- "it has no rate for. A pair with no rate reports `usd: null` forever, never a",
29
- "guess and never a family fallback."
30
- ],
31
- "as_of": "2026-08-01",
32
- "currency": "USD",
33
- "unit": "per_million_tokens",
34
- "server_tools": {
35
- "web_search_requests": 0.01,
36
- "web_fetch_requests": 0.0
37
- },
38
- "models": {
39
- "claude-opus-5": {
40
- "input": 15,
41
- "cache_write": 18.75,
42
- "cache_read": 1.5,
43
- "output": 75
44
- },
45
- "claude-opus-4-8": {
46
- "input": 15,
47
- "cache_write": 18.75,
48
- "cache_read": 1.5,
49
- "output": 75
50
- },
51
- "claude-opus-4-7": {
52
- "input": 15,
53
- "cache_write": 18.75,
54
- "cache_read": 1.5,
55
- "output": 75
56
- },
57
- "claude-fable-5": {
58
- "input": 15,
59
- "cache_write": 18.75,
60
- "cache_read": 1.5,
61
- "output": 75
62
- },
63
- "claude-sonnet-5": {
64
- "input": 3,
65
- "cache_write": 3.75,
66
- "cache_read": 0.3,
67
- "output": 15
68
- },
69
- "claude-sonnet-4-6": {
70
- "input": 3,
71
- "cache_write": 3.75,
72
- "cache_read": 0.3,
73
- "output": 15
74
- },
75
- "claude-haiku-4-5": {
76
- "input": 1,
77
- "cache_write": 1.25,
78
- "cache_read": 0.1,
79
- "output": 5
80
- }
81
- },
82
- "families": {
83
- "opus": {
84
- "input": 15,
85
- "cache_write": 18.75,
86
- "cache_read": 1.5,
87
- "output": 75
88
- },
89
- "fable": {
90
- "input": 15,
91
- "cache_write": 18.75,
92
- "cache_read": 1.5,
93
- "output": 75
94
- },
95
- "sonnet": {
96
- "input": 3,
97
- "cache_write": 3.75,
98
- "cache_read": 0.3,
99
- "output": 15
100
- },
101
- "haiku": {
102
- "input": 1,
103
- "cache_write": 1.25,
104
- "cache_read": 0.1,
105
- "output": 5
106
- }
107
- },
108
- "_plans_readme": [
109
- "Quota view. A Pro/Max user does not pay per token — they burn a 5-hour",
110
- "session window and a weekly ceiling. These are WEIGHTED-token capacities",
111
- "(cache reads counted at their 0.1x weight), because that is the unit the",
112
- "forecast can actually produce. They are approximations of a published",
113
- "allowance, not a metered balance: the percentages are a magnitude, and the",
114
- "renderer says so."
115
- ],
116
- "plans": {
117
- "pro": {
118
- "label": "Pro",
119
- "window_weighted_tokens": 900000,
120
- "weekly_weighted_tokens": 9000000
121
- },
122
- "max5": {
123
- "label": "Max 5x",
124
- "window_weighted_tokens": 4500000,
125
- "weekly_weighted_tokens": 45000000
126
- },
127
- "max20": {
128
- "label": "Max 20x",
129
- "window_weighted_tokens": 18000000,
130
- "weekly_weighted_tokens": 180000000
131
- }
132
- },
133
- "context_windows": {
134
- "claude-opus-5": 200000,
135
- "claude-opus-4-8": 200000,
136
- "claude-opus-4-7": 200000,
137
- "claude-fable-5": 200000,
138
- "claude-sonnet-5": 200000,
139
- "claude-sonnet-4-6": 200000,
140
- "claude-haiku-4-5": 200000
141
- },
142
- "providers": {
143
- "_note": "Rates are USD per MILLION tokens, four per model, never one. `models` maps a provider's own model id EXACTLY as the endpoint reports it.",
144
- "deepseek": {
145
- "label": "DeepSeek",
146
- "caveat": "Prices differ by PEAK and OFF-PEAK window, so one number cannot be right for both. Record the window you actually run in.",
147
- "models": {}
148
- },
149
- "zai": {
150
- "label": "Z.ai / GLM",
151
- "caveat": "The current flagship is sold inside a Coding Plan subscription rather than per token, which a per-token table cannot express. Leave it empty and read your invoice.",
152
- "models": {}
153
- },
154
- "moonshot": {
155
- "label": "Moonshot / Kimi",
156
- "caveat": null,
157
- "models": {}
158
- },
159
- "minimax": {
160
- "label": "MiniMax",
161
- "caveat": null,
162
- "models": {}
163
- },
164
- "qwen": {
165
- "label": "Alibaba / Qwen",
166
- "caveat": "Tiered by request size, so a single rate is an average rather than a price.",
167
- "models": {}
168
- },
169
- "mimo": {
170
- "label": "Xiaomi / MiMo",
171
- "caveat": null,
172
- "models": {}
173
- },
174
- "stepfun": {
175
- "label": "StepFun",
176
- "caveat": null,
177
- "models": {}
178
- },
179
- "siliconflow": {
180
- "label": "SiliconFlow",
181
- "caveat": null,
182
- "models": {}
183
- },
184
- "openrouter": {
185
- "label": "OpenRouter",
186
- "caveat": "A PASSTHROUGH: the rate is the upstream provider's, plus a surcharge on credit purchase. It also reroutes between providers by default while preserving the model id, so the model id alone does not identify who you paid.",
187
- "models": {}
188
- },
189
- "ollama": {
190
- "label": "Ollama (local)",
191
- "caveat": "Local inference has no per-token price. Zero here would be true of the API bill and false of the electricity and the hardware, so it is left empty rather than asserted as free.",
192
- "models": {}
193
- },
194
- "custom": {
195
- "label": "Custom endpoint",
196
- "caveat": null,
197
- "models": {}
198
- }
199
- }
200
- }
1
+ {
2
+ "_readme": [
3
+ "Dated price table for `orc budget`. Point `orc config set budget_price_table <path>`",
4
+ "at your own copy to override it. Rates are USD per MILLION tokens.",
5
+ "",
6
+ "Four rates per model, never one: cache reads are usually the LARGEST token",
7
+ "count in a run and the CHEAPEST per token, so a blended number hides",
8
+ "whichever component is about to bite you. cache_write/cache_read are the",
9
+ "multipliers this vendor publishes against `input` (1.25x / 0.1x) written out",
10
+ "as absolute rates so nothing has to remember the ratio.",
11
+ "",
12
+ "`as_of` is load-bearing: a table older than 90 days makes every dollar",
13
+ "figure print a staleness warning. Bump the date only when you have checked",
14
+ "the published rates.",
15
+ "",
16
+ "`providers` (v0.50.0) is the same four-rate shape for a NON-CLAUDE endpoint",
17
+ "reached through `orc extra`. Every `models` map SHIPS EMPTY, on purpose, and",
18
+ "that is not an oversight: between this package's cutoff and any release the",
19
+ "lineup moves (DeepSeek V3.2 -> V4, Kimi K2 -> K2.7, GLM 4.6 -> 5.2), several",
20
+ "of these vendors price by PEAK/OFF-PEAK window or by tier, one is",
21
+ "subscription-only, and one is a passthrough with a surcharge. A shipped",
22
+ "figure that is wrong by 2x is worse than no figure, because a wrong figure",
23
+ "gets believed. So ORC ships the MECHANISM and no dollar figure without a",
24
+ "rate you put there yourself.",
25
+ "",
26
+ "Fill one in with `orc extra rates` — it lists every provider/model pair your",
27
+ "own traces have actually used, prints the JSON to paste, and says which ones",
28
+ "it has no rate for. A pair with no rate reports `usd: null` forever, never a",
29
+ "guess and never a family fallback."
30
+ ],
31
+ "as_of": "2026-08-01",
32
+ "currency": "USD",
33
+ "unit": "per_million_tokens",
34
+ "server_tools": {
35
+ "web_search_requests": 0.01,
36
+ "web_fetch_requests": 0.0
37
+ },
38
+ "models": {
39
+ "claude-opus-5-5": {
40
+ "input": 4,
41
+ "cache_write": 5,
42
+ "cache_read": 0.2,
43
+ "output": 20
44
+ },
45
+ "claude-opus-5": {
46
+ "input": 15,
47
+ "cache_write": 18.75,
48
+ "cache_read": 1.5,
49
+ "output": 75
50
+ },
51
+ "claude-opus-4-8": {
52
+ "input": 15,
53
+ "cache_write": 18.75,
54
+ "cache_read": 1.5,
55
+ "output": 75
56
+ },
57
+ "claude-opus-4-7": {
58
+ "input": 15,
59
+ "cache_write": 18.75,
60
+ "cache_read": 1.5,
61
+ "output": 75
62
+ },
63
+ "claude-fable-5": {
64
+ "input": 15,
65
+ "cache_write": 18.75,
66
+ "cache_read": 1.5,
67
+ "output": 75
68
+ },
69
+ "claude-sonnet-5": {
70
+ "input": 3,
71
+ "cache_write": 3.75,
72
+ "cache_read": 0.3,
73
+ "output": 15
74
+ },
75
+ "claude-sonnet-4-6": {
76
+ "input": 3,
77
+ "cache_write": 3.75,
78
+ "cache_read": 0.3,
79
+ "output": 15
80
+ },
81
+ "claude-haiku-4-5": {
82
+ "input": 1,
83
+ "cache_write": 1.25,
84
+ "cache_read": 0.1,
85
+ "output": 5
86
+ }
87
+ },
88
+ "families": {
89
+ "opus": {
90
+ "input": 15,
91
+ "cache_write": 18.75,
92
+ "cache_read": 1.5,
93
+ "output": 75
94
+ },
95
+ "fable": {
96
+ "input": 15,
97
+ "cache_write": 18.75,
98
+ "cache_read": 1.5,
99
+ "output": 75
100
+ },
101
+ "sonnet": {
102
+ "input": 3,
103
+ "cache_write": 3.75,
104
+ "cache_read": 0.3,
105
+ "output": 15
106
+ },
107
+ "haiku": {
108
+ "input": 1,
109
+ "cache_write": 1.25,
110
+ "cache_read": 0.1,
111
+ "output": 5
112
+ }
113
+ },
114
+ "_plans_readme": [
115
+ "Quota view. A Pro/Max user does not pay per token — they burn a 5-hour",
116
+ "session window and a weekly ceiling. These are WEIGHTED-token capacities",
117
+ "(cache reads counted at their 0.1x weight), because that is the unit the",
118
+ "forecast can actually produce. They are approximations of a published",
119
+ "allowance, not a metered balance: the percentages are a magnitude, and the",
120
+ "renderer says so."
121
+ ],
122
+ "plans": {
123
+ "pro": {
124
+ "label": "Pro",
125
+ "window_weighted_tokens": 900000,
126
+ "weekly_weighted_tokens": 9000000
127
+ },
128
+ "max5": {
129
+ "label": "Max 5x",
130
+ "window_weighted_tokens": 4500000,
131
+ "weekly_weighted_tokens": 45000000
132
+ },
133
+ "max20": {
134
+ "label": "Max 20x",
135
+ "window_weighted_tokens": 18000000,
136
+ "weekly_weighted_tokens": 180000000
137
+ }
138
+ },
139
+ "context_windows": {
140
+ "claude-opus-5-5": 200000,
141
+ "claude-opus-5": 200000,
142
+ "claude-opus-4-8": 200000,
143
+ "claude-opus-4-7": 200000,
144
+ "claude-fable-5": 200000,
145
+ "claude-sonnet-5": 200000,
146
+ "claude-sonnet-4-6": 200000,
147
+ "claude-haiku-4-5": 200000
148
+ },
149
+ "providers": {
150
+ "_note": "Rates are USD per MILLION tokens, four per model, never one. `models` maps a provider's own model id EXACTLY as the endpoint reports it.",
151
+ "deepseek": {
152
+ "label": "DeepSeek",
153
+ "caveat": "Prices differ by PEAK and OFF-PEAK window, so one number cannot be right for both. Record the window you actually run in.",
154
+ "models": {}
155
+ },
156
+ "zai": {
157
+ "label": "Z.ai / GLM",
158
+ "caveat": "The current flagship is sold inside a Coding Plan subscription rather than per token, which a per-token table cannot express. Leave it empty and read your invoice.",
159
+ "models": {}
160
+ },
161
+ "moonshot": {
162
+ "label": "Moonshot / Kimi",
163
+ "caveat": null,
164
+ "models": {}
165
+ },
166
+ "minimax": {
167
+ "label": "MiniMax",
168
+ "caveat": null,
169
+ "models": {}
170
+ },
171
+ "qwen": {
172
+ "label": "Alibaba / Qwen",
173
+ "caveat": "Tiered by request size, so a single rate is an average rather than a price.",
174
+ "models": {}
175
+ },
176
+ "mimo": {
177
+ "label": "Xiaomi / MiMo",
178
+ "caveat": null,
179
+ "models": {}
180
+ },
181
+ "stepfun": {
182
+ "label": "StepFun",
183
+ "caveat": null,
184
+ "models": {}
185
+ },
186
+ "siliconflow": {
187
+ "label": "SiliconFlow",
188
+ "caveat": null,
189
+ "models": {}
190
+ },
191
+ "openrouter": {
192
+ "label": "OpenRouter",
193
+ "caveat": "A PASSTHROUGH: the rate is the upstream provider's, plus a surcharge on credit purchase. It also reroutes between providers by default while preserving the model id, so the model id alone does not identify who you paid.",
194
+ "models": {}
195
+ },
196
+ "ollama": {
197
+ "label": "Ollama (local)",
198
+ "caveat": "Local inference has no per-token price. Zero here would be true of the API bill and false of the electricity and the hardware, so it is left empty rather than asserted as free.",
199
+ "models": {}
200
+ },
201
+ "custom": {
202
+ "label": "Custom endpoint",
203
+ "caveat": null,
204
+ "models": {}
205
+ }
206
+ }
207
+ }
@@ -1813,7 +1813,7 @@ const CONTRACTS = [
1813
1813
  binFiles: ["bin/cli.js"],
1814
1814
  files: [
1815
1815
  "agents/MODEL-MAPPING.md",
1816
- // v1.8.0 — the graph noter has no Opus 5 variant; under the mode a lane
1816
+ // v1.8.0 — the graph noter has no Opus 5.5 variant; under the mode a lane
1817
1817
  // skips notes. Both the agent and the canonical contract say so.
1818
1818
  "agents/orc-graph-noter-sonnet-4-6-med.md",
1819
1819
  "skills/_shared/code-graph.md",
@@ -2741,6 +2741,75 @@ const CONTRACTS = [
2741
2741
  "skills/orc-fast/SKILL.md",
2742
2742
  ],
2743
2743
  },
2744
+ // ── v1.9.1 W3 — the brief answer, and the lines the CLI now computes ──
2745
+ {
2746
+ // Every `--json` read a lane makes carries it, and the CLI is the only
2747
+ // thing that can answer it. A rename that reached one side and not the
2748
+ // other would leave every lane asking for a flag nothing knows.
2749
+ name: "graph brief answer (v1.9.1 — --brief on every --json read a lane makes)",
2750
+ token: "--brief",
2751
+ files: [
2752
+ "agents/orc-executor-haiku-4-5.md",
2753
+ "agents/orc-executor-opus-4-7-high.md",
2754
+ "agents/orc-executor-opus-4-7-med.md",
2755
+ "agents/orc-executor-opus-4-8-high.md",
2756
+ "agents/orc-executor-opus-5-high.md",
2757
+ "agents/orc-executor-opus-5-low.md",
2758
+ "agents/orc-executor-opus-5-med.md",
2759
+ "agents/orc-executor-sonnet-4-6-high.md",
2760
+ "agents/orc-executor-sonnet-4-6-med.md",
2761
+ "agents/orc-executor-sonnet-5-high.md",
2762
+ "agents/orc-recon-opus-5-low.md",
2763
+ "agents/orc-recon-sonnet-4-6-med.md",
2764
+ "skills/_shared/code-graph.md",
2765
+ "skills/_shared/phases/execution.md",
2766
+ "skills/_shared/phases/planning.md",
2767
+ "skills/_shared/phases/preflight.md",
2768
+ // review.md names it to say where it is deliberately NOT used.
2769
+ "skills/_shared/phases/review.md",
2770
+ "skills/_shared/phases/ship.md",
2771
+ // trace.md names the call each trace verb is copied from.
2772
+ "skills/_shared/phases/trace.md",
2773
+ "skills/_shared/read-ladder.md",
2774
+ "skills/orc/SKILL.md",
2775
+ "skills/orc-fast/SKILL.md",
2776
+ "skills/orc-mini/SKILL.md",
2777
+ "skills/orc-mini/references/complexity.md",
2778
+ "skills/orc-quick/SKILL.md",
2779
+ "skills/orc-quick/references/gh-mode.md",
2780
+ "skills/orc-quick/references/look.md",
2781
+ ],
2782
+ binFiles: ["bin/cli.js"],
2783
+ },
2784
+ {
2785
+ // The blast radius is the CLI's line now. A lane that assembled it by hand
2786
+ // would drift from the CLI's grammar the first time either side moved.
2787
+ name: "graph blast line (v1.9.1 — changes computes the blast radius, the lane prints it)",
2788
+ token: "blast_line",
2789
+ files: ["skills/orc-mini/SKILL.md", "skills/orc-quick/SKILL.md"],
2790
+ binFiles: ["bin/graph-signals.js"],
2791
+ },
2792
+ {
2793
+ // Mini's one call. The flag, the prose that explains it and the engine that
2794
+ // answers it move together or not at all.
2795
+ name: "graph complexity read (v1.9.1 — impact --complexity, one call, one line)",
2796
+ token: "--complexity",
2797
+ files: [
2798
+ "skills/_shared/code-graph.md",
2799
+ "skills/_shared/phases/trace.md",
2800
+ "skills/orc-mini/SKILL.md",
2801
+ "skills/orc-mini/references/complexity.md",
2802
+ ],
2803
+ binFiles: ["bin/cli.js"],
2804
+ },
2805
+ {
2806
+ // The four thresholds live in ONE place. The prose quotes them by NAME, so
2807
+ // a rename that reaches only the engine fails here.
2808
+ name: "graph complexity thresholds (v1.9.1 — the constants the prose quotes)",
2809
+ token: "COMPLEXITY_CALLER_FILES",
2810
+ files: ["skills/orc-mini/references/complexity.md"],
2811
+ binFiles: ["bin/graph-signals.js"],
2812
+ },
2744
2813
  // ── v1.8.2 W3 — the delivery flags (D1 · D2 · D3 · D5) ────────────────
2745
2814
  {
2746
2815
  // The slice call. A rename must reach the contract, the phase file that
@@ -2773,6 +2842,43 @@ const CONTRACTS = [
2773
2842
  ],
2774
2843
  binFiles: ["bin/cli.js"],
2775
2844
  },
2845
+ // ── v1.9.1 W5 — delivery where the paid reads are (R1 · R4) ─────────────
2846
+ {
2847
+ // The call sites WITH the card. The recon agents ask for it, the ladder
2848
+ // and the contract say what it may never print, and the CLI answers it.
2849
+ name: "graph callers source (v1.9.1 — ctx --callers-source, six lines per confident call site)",
2850
+ token: "--callers-source",
2851
+ files: [
2852
+ "agents/orc-recon-opus-5-low.md",
2853
+ "agents/orc-recon-sonnet-4-6-med.md",
2854
+ "skills/_shared/code-graph.md",
2855
+ "skills/_shared/read-ladder.md",
2856
+ ],
2857
+ binFiles: ["bin/cli.js", "bin/graph-query.js"],
2858
+ },
2859
+ {
2860
+ // Where a language server is asked. Every reader that is told to use it
2861
+ // names the field, and the engine is the only thing that computes it.
2862
+ name: "graph LSP anchor (v1.9.1 — lsp_at on a symbol card: file, line, 1-based character)",
2863
+ token: "lsp_at",
2864
+ files: [
2865
+ "agents/orc-executor-haiku-4-5.md",
2866
+ "agents/orc-executor-opus-4-7-high.md",
2867
+ "agents/orc-executor-opus-4-7-med.md",
2868
+ "agents/orc-executor-opus-4-8-high.md",
2869
+ "agents/orc-executor-opus-5-high.md",
2870
+ "agents/orc-executor-opus-5-low.md",
2871
+ "agents/orc-executor-opus-5-med.md",
2872
+ "agents/orc-executor-sonnet-4-6-high.md",
2873
+ "agents/orc-executor-sonnet-4-6-med.md",
2874
+ "agents/orc-executor-sonnet-5-high.md",
2875
+ "agents/orc-recon-opus-5-low.md",
2876
+ "agents/orc-recon-sonnet-4-6-med.md",
2877
+ "skills/_shared/code-graph.md",
2878
+ "skills/_shared/read-ladder.md",
2879
+ ],
2880
+ binFiles: ["bin/graph-query.js"],
2881
+ },
2776
2882
  // ── v1.9.0 — the lean lanes reproduce before they fix ───────────────────
2777
2883
  {
2778
2884
  // The slice field that makes a defect entry show the bug RED first. It is
@@ -2943,7 +3049,7 @@ const CONTRACTS = [
2943
3049
  {
2944
3050
  // The only notes writer, dispatched BY NAME. An unnamed dispatch cannot
2945
3051
  // enforce the Sonnet 4.6 pin and is invisible to the trace hook.
2946
- name: "graph noter (v1.8.0 — dispatched by name, no Opus 5 variant)",
3052
+ name: "graph noter (v1.8.0 — dispatched by name, no Opus 5.5 variant)",
2947
3053
  token: "orc-graph-noter-sonnet-4-6-med",
2948
3054
  files: [
2949
3055
  "agents/MODEL-MAPPING.md",
@@ -4562,6 +4668,15 @@ for (const b of BUDGETS) {
4562
4668
  // one. design-05 §6.3: a call one lane makes belongs to that lane.
4563
4669
  for (const [id, c] of Object.entries(CALLS)) {
4564
4670
  const want = [...(measured[prefixOf(c.cmd)] || new Set())].sort();
4671
+ // v1.9.1: a row with `lanes: []` is a USER command — catalogued so
4672
+ // `orc lane calls --all` documents it, and asserted the OTHER way round:
4673
+ // no lane may name it. `orc graph audit` is the first one. The assertion is
4674
+ // stronger than the >= 2 rule, not an exception to it.
4675
+ if (Array.isArray(c.lanes) && c.lanes.length === 0) {
4676
+ if (want.length)
4677
+ errs.push(`${id}: a user command, and ${want.join(", ")} name it — remove the call, or give the row its lanes`);
4678
+ continue;
4679
+ }
4565
4680
  if (want.length < 2)
4566
4681
  errs.push(
4567
4682
  `${id}: only ${want.length} lane names it — a call one lane makes belongs to that lane and is not catalogued`