model-orchestrator 0.1.35 → 1.0.1

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 (124) hide show
  1. package/AGENTS.md +31 -21
  2. package/CHANGELOG.md +58 -1
  3. package/README.md +129 -110
  4. package/SECURITY.md +7 -3
  5. package/bin/README.md +57 -6
  6. package/bin/aunx.js +7 -0
  7. package/bin/cli-run.mjs +21 -15
  8. package/bin/cli.js +376 -257
  9. package/docs/README.md +15 -18
  10. package/docs/catalog.md +236 -44
  11. package/docs/companions.md +28 -10
  12. package/docs/guarantees.md +21 -12
  13. package/docs/how-it-routes.md +49 -42
  14. package/docs/install.md +141 -33
  15. package/docs/part-1-beginner.md +37 -45
  16. package/docs/part-2-intermediate.md +34 -52
  17. package/docs/part-3-advanced.md +36 -26
  18. package/docs/security-review-history.md +39 -0
  19. package/llms.txt +24 -25
  20. package/package.json +15 -8
  21. package/proof/README.md +100 -0
  22. package/proof/gate-demo.cast +9 -0
  23. package/proof/gate-demo.gif +0 -0
  24. package/proof/results.json +198 -0
  25. package/proof/scripts/check-gate.js +26 -0
  26. package/proof/scripts/install-time.js +16 -0
  27. package/proof/scripts/lib.js +73 -0
  28. package/proof/scripts/measure.js +15 -0
  29. package/proof/scripts/missing-results.js +30 -0
  30. package/proof/scripts/record-gate.js +38 -0
  31. package/proof/scripts/render.js +18 -0
  32. package/proof/scripts/runner-overhead.js +21 -0
  33. package/src/README.md +10 -3
  34. package/src/activation-ownership.js +19 -0
  35. package/src/apply-companions.js +104 -0
  36. package/src/apply-snippets.js +60 -28
  37. package/src/aunx.js +272 -0
  38. package/src/bounded-file.js +31 -0
  39. package/src/catalog.js +257 -121
  40. package/src/install.js +483 -212
  41. package/src/plugin.js +13 -4
  42. package/src/postinstall.js +57 -0
  43. package/src/roles.js +184 -0
  44. package/src/uninstall.js +128 -10
  45. package/templates/README.md +19 -2
  46. package/templates/advanced/README.md +2 -2
  47. package/templates/advanced/vm/ENVIRONMENT.md +8 -0
  48. package/templates/advanced/vm/PRIVACY_GATES.md +17 -19
  49. package/templates/advanced/vm/README.md +25 -20
  50. package/templates/advanced/vm/box-CLAUDE.md +19 -18
  51. package/templates/advanced/vm/docker-compose.yml +2 -1
  52. package/templates/advanced/vm/jobs/README.md +31 -2
  53. package/templates/advanced/vm/jobs/weekly-audit.service +7 -2
  54. package/templates/advanced/vm/jobs/weekly-audit.sh +24 -17
  55. package/templates/advanced/vm/setup-vm.sh +49 -2
  56. package/templates/agents/README.md +2 -2
  57. package/templates/agents/agy/README.md +20 -3
  58. package/templates/agents/agy/builder.md +11 -7
  59. package/templates/agents/agy/bulk-worker.md +9 -7
  60. package/templates/agents/agy/code-reviewer.md +13 -7
  61. package/templates/agents/agy/deep-planner.md +10 -7
  62. package/templates/agents/agy/done-verifier.md +13 -22
  63. package/templates/agents/agy/finding-verifier.md +14 -22
  64. package/templates/agents/agy/live-researcher.md +10 -7
  65. package/templates/agents/agy/reader.md +10 -12
  66. package/templates/agents/claude-code/README.md +18 -14
  67. package/templates/agents/claude-code/builder.md +10 -15
  68. package/templates/agents/claude-code/bulk-worker.md +8 -10
  69. package/templates/agents/claude-code/code-reviewer.md +11 -17
  70. package/templates/agents/claude-code/deep-planner.md +9 -11
  71. package/templates/agents/claude-code/done-verifier.md +12 -33
  72. package/templates/agents/claude-code/finding-verifier.md +13 -39
  73. package/templates/agents/claude-code/live-researcher.md +9 -11
  74. package/templates/agents/claude-code/reader.md +9 -18
  75. package/templates/agents/snippets/chat.md +9 -10
  76. package/templates/agents/snippets/claude-code.md +17 -18
  77. package/templates/agents/snippets/generic.md +9 -11
  78. package/templates/agents/snippets/route-gate.mjs +2 -2
  79. package/templates/agents/snippets/route-metrics.mjs +1 -1
  80. package/templates/agents/snippets/subagent-context.mjs +4 -4
  81. package/templates/beginner/ORCHESTRATOR.md +31 -36
  82. package/templates/beginner/README.md +1 -1
  83. package/templates/common/ACCEPTANCE_CHECKS.json +12 -0
  84. package/templates/common/CONTEXT.md +37 -0
  85. package/templates/common/DECISIONS.md +11 -0
  86. package/templates/common/README.md +24 -11
  87. package/templates/common/TASK_BRIEF.md +84 -0
  88. package/templates/common/protocols/README.md +14 -11
  89. package/templates/common/protocols/acceptance-checks.md +15 -0
  90. package/templates/common/protocols/build-protocol.md +91 -106
  91. package/templates/common/protocols/context-file.md +10 -0
  92. package/templates/common/protocols/decision-log.md +9 -0
  93. package/templates/common/protocols/deep-research.md +20 -34
  94. package/templates/common/protocols/docs-then-prove.md +13 -18
  95. package/templates/common/protocols/gap-analysis.md +15 -21
  96. package/templates/common/protocols/memory-and-record.md +21 -20
  97. package/templates/common/protocols/numbers-and-logic.md +20 -26
  98. package/templates/common/protocols/propagate.md +18 -27
  99. package/templates/intermediate/CLI-RUN.md +83 -113
  100. package/templates/intermediate/DELEGATION_MATRIX.md +9 -3
  101. package/templates/intermediate/README.md +3 -3
  102. package/templates/intermediate/RESEARCH_TRIAGE.md +23 -15
  103. package/templates/intermediate/ROUTING.md +54 -51
  104. package/templates/intermediate/TIERS.md +37 -76
  105. package/templates/tools/README.md +1 -1
  106. package/templates/tools/codecalc/CODECALC.md +4 -4
  107. package/templates/tools/codecalc/mcp/agy.mcp_config.json +1 -1
  108. package/templates/tools/codecalc/mcp/codex.config.toml +1 -1
  109. package/templates/tools/codecalc/mcp/mcpServers.json +1 -1
  110. package/templates/tools/codecalc/mcp/vscode.mcp.json +1 -1
  111. package/templates/tools/codecalc/mcp/zed.settings.json +1 -1
  112. package/templates/tools/context7/CONTEXT7.md +6 -10
  113. package/templates/tools/obsidian-tc/OBSIDIAN-TC.md +3 -3
  114. package/templates/tools/obsidian-tc/mcp/obsidian-tc.agy.mcp_config.json +1 -1
  115. package/templates/tools/obsidian-tc/mcp/obsidian-tc.codex.config.toml +1 -1
  116. package/templates/tools/obsidian-tc/mcp/obsidian-tc.mcpServers.json +1 -1
  117. package/templates/tools/obsidian-tc/mcp/obsidian-tc.vscode.mcp.json +1 -1
  118. package/templates/tools/obsidian-tc/mcp/obsidian-tc.zed.settings.json +1 -1
  119. package/docs/audit-brief.md +0 -148
  120. package/scripts/README.md +0 -7
  121. package/scripts/gen-catalog.js +0 -81
  122. package/scripts/gen-plugin.js +0 -16
  123. package/scripts/record-demo.sh +0 -45
  124. package/templates/common/TASK_BUNDLE.md +0 -56
package/src/catalog.js CHANGED
@@ -4,20 +4,24 @@
4
4
  // Fields
5
5
  // id stable key used in --ais and in generated files
6
6
  // name what the prompt shows
7
- // kind 'agent-cli' (a terminal agent), 'chat' (a chat app, no CLI), 'local' (a local model runtime)
7
+ // summary what the AI is and gives; role assignment is computed in roles.js
8
+ // facts capability claims, billing and model family; null means UNVERIFIED
9
+ // factNotes provenance caveats attached to the named capability facts
8
10
  // bin binary to look for on PATH, or null
9
- // access 'subscription' ($0 per call on a plan you already pay for), 'metered' (per token), 'free', 'local'
10
- // lane 'A' = subscription CLI, 'B' = metered API, 'local' = stays on the machine
11
- // laneCategories routing capabilities used to filter generated lane advice
12
- // role the one job it wins at in a multi-AI stack
13
11
  // minLevel 1 beginner, 2 intermediate, 3 advanced
14
- // install { npm: pkg } for a global npm install the installer may run after you say yes,
12
+ // install { npm: pkg } for a global npm install command printed for you to run,
15
13
  // { script: url } for a vendor shell installer the installer only PRINTS, never runs,
16
14
  // { url } for a download page
17
15
  // auth how you sign in, always the vendor's own flow, never a key typed into this tool
16
+ // authStatus optional reliable read-only status command; unlisted CLIs get conditional sign-in guidance.
17
+ // trust: 'positive-only' means only a reported success is
18
+ // believed; every other outcome (a reported failure, a parse
19
+ // error, a timeout, a missing binary) keeps the conditional step.
20
+ // jsonField names the boolean field read from the command's JSON
21
+ // stdout under positive-only trust; default 'loggedIn'.
18
22
  // rulesFile the instructions file that agent reads from a project root, if any
19
- // agentsDir where that agent keeps project-level subagent definitions, if any
20
- // cliRun true when bin/cli-run.mjs has a judge for this lane
23
+ // projectMcp verified project-local MCP config: relative file and server-map key.
24
+ // Absent means setup remains a manual step; never infer a global path.
21
25
  // builtAgainst the vendor version this release's lane wiring and judges were
22
26
  // exercised against. ONE number per lane: the README compatibility
23
27
  // table is generated from it, and where install.npm exists the pin
@@ -29,7 +33,10 @@
29
33
  // a sentence you can read once (#22)
30
34
  // chatSurface chat apps only: where the pasted block goes in that app
31
35
  // plans optional known subscription plans: { id, name, headroom,
32
- // source, checked }. Guidance uses headroom only, never prices.
36
+ // source, checked, tierModels }. A null tierModels leaves model selection
37
+ // to the user's plan and agent configuration.
38
+
39
+ export const CATALOG_MODELS = { measuredAt: '2026-09-23', expiresAt: '2026-10-23', source: 'catalog compatibility snapshot; verify with the provider before use' };
33
40
 
34
41
  export const LEVELS = [
35
42
  {
@@ -44,228 +51,345 @@ export const LEVELS = [
44
51
  key: 'intermediate',
45
52
  name: 'Intermediate',
46
53
  tagline: 'several LLMs and agents, called through their CLIs',
47
- gives: 'everything in Beginner plus cli-run, a delegation matrix, task bundles and three-engine research triage'
54
+ gives: 'everything in Beginner plus cli-run, a delegation matrix and multi-engine research triage'
48
55
  },
49
56
  {
50
57
  id: 3,
51
58
  key: 'advanced',
52
59
  name: 'Advanced',
53
- tagline: 'everything above, plus a virtual machine that runs it unattended',
54
- gives: 'everything in Intermediate plus a gateway config, scheduled jobs, a dispatch layer and privacy gates for a box'
60
+ tagline: 'everything above, plus templates for your always-on Linux machine',
61
+ gives: 'everything in Intermediate plus a gateway config, a scheduled review job, dispatch guidance and configurable privacy gates'
55
62
  }
56
63
  ];
57
64
 
58
65
  export const AIS = [
59
66
  {
60
67
  id: 'claude-code',
68
+ facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
69
+ modelFamily: 'Anthropic',
70
+ kind: 'agent-cli',
71
+ billing: 'subscription',
72
+ pricing: null, // UNVERIFIED: check your provider's current rate.
73
+ headless: true,
74
+ cliRun: false,
75
+ writesFiles: true,
76
+ readOnlyMode: false,
77
+ liveWeb: true, // Source: templates/agents/claude-code/live-researcher.md grants WebSearch and WebFetch.
78
+ runsLocally: false,
79
+ fanOut: null, // UNVERIFIED: no vendor doc states N children in one call.
80
+ contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
81
+ // Verified at code.claude.com/docs/en/sub-agents (fetched 2026-09-10): "A
82
+ // non-fork subagent's initial context contains: CLAUDE.md files: every
83
+ // level of the CLAUDE.md hierarchy the main conversation loads ... The
84
+ // built-in Explore and Plan agents skip this." No other lane in this
85
+ // catalog has that documented, so the builder-by-default routing, the
86
+ // route-gate hook and the inline-threshold note are gated on this field
87
+ // and stay claude-code only.
88
+ loadsProjectRules: true,
89
+ agentDefinitions: '.claude/agents',
90
+ },
61
91
  name: 'Claude Code (Anthropic)',
62
92
  vendor: 'Anthropic',
63
- kind: 'agent-cli',
64
93
  bin: 'claude',
65
- access: 'subscription',
66
- lane: 'A',
67
- role: 'orchestrator: routes, maps, builds, verifies, records',
94
+ summary: 'Anthropic\'s terminal coding agent; its subagents load the project rules file',
68
95
  minLevel: 1,
69
- install: { npm: '@anthropic-ai/claude-code', pin: '2.1.226' },
96
+ install: { npm: '@anthropic-ai/claude-code', url: 'https://code.claude.com/docs/en/setup', pin: '2.1.226' },
70
97
  builtAgainst: '2.1.226',
71
98
  auth: 'run `claude` once and sign in with your Anthropic account',
99
+ // Positive-only (Q1): an author-machine probe of a working, authenticated
100
+ // session (2026-09-27) still returned {"loggedIn":false} with exit 1, so a
101
+ // reported failure is not trusted; only loggedIn:true skips the step.
102
+ authStatus: { args: ['auth', 'status'], reliable: true, trust: 'positive-only', jsonField: 'loggedIn', checked: '2026-09-27', source: 'author-machine probe: `claude auth status` (default JSON) returned {"loggedIn":false}, exit 1, inside a working authenticated session' },
72
103
  rulesFile: 'CLAUDE.md',
73
- agentsDir: '.claude/agents',
74
- cliRun: false,
75
- models: { deep: 'opus', standard: 'sonnet', fast: 'haiku' },
104
+ // Project scope documented in templates/tools/context7/CONTEXT7.md.
105
+ projectMcp: { file: '.mcp.json', key: 'mcpServers' },
106
+ // tierModels is UNVERIFIED: no checked vendor source maps this plan to model aliases.
76
107
  plans: [
77
- { id: 'pro', name: 'Claude Pro', headroom: 'base', source: 'https://support.claude.com/en/articles/11049762-choose-a-claude-plan', checked: '2026-09-12' },
78
- { id: 'max-5x', name: 'Claude Max 5x', headroom: 'high', source: 'https://support.claude.com/en/articles/11049762-choose-a-claude-plan', checked: '2026-09-12' },
79
- { id: 'max-20x', name: 'Claude Max 20x', headroom: 'max', source: 'https://support.claude.com/en/articles/11049762-choose-a-claude-plan', checked: '2026-09-12' }
80
- ],
81
- // Verified at code.claude.com/docs/en/sub-agents (fetched 2026-09-10): "A
82
- // non-fork subagent's initial context contains: CLAUDE.md files: every
83
- // level of the CLAUDE.md hierarchy the main conversation loads ... The
84
- // built-in Explore and Plan agents skip this." No other lane in this
85
- // catalog has that documented, so the builder-by-default routing, the
86
- // route-gate hook and the inline-threshold note are gated on this field
87
- // and stay claude-code only.
88
- subagentsLoadRules: true
108
+ { id: 'pro', name: 'Claude Pro', headroom: 'base', tierModels: null, source: 'https://claude.com/pricing', checked: '2026-09-12' },
109
+ { id: 'max-5x', name: 'Claude Max 5x', headroom: 'high', tierModels: null, source: 'https://claude.com/pricing', checked: '2026-09-12' },
110
+ { id: 'max-20x', name: 'Claude Max 20x', headroom: 'max', tierModels: null, source: 'https://claude.com/pricing', checked: '2026-09-12' }
111
+ ]
89
112
  },
90
113
  {
91
114
  id: 'codex',
92
- laneCategories: ['second-coder'],
115
+ facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
116
+ modelFamily: 'OpenAI',
117
+ kind: 'agent-cli',
118
+ billing: 'subscription',
119
+ pricing: null, // UNVERIFIED: check your provider's current rate.
120
+ headless: true,
121
+ cliRun: true,
122
+ writesFiles: true,
123
+ readOnlyMode: true, // Source: --audit maps to a read-only filesystem sandbox (src/install.js).
124
+ liveWeb: null, // UNVERIFIED: no checked capability source.
125
+ runsLocally: false,
126
+ fanOut: false,
127
+ contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
128
+ loadsProjectRules: false,
129
+ agentDefinitions: null, // UNVERIFIED: no project agent-definition path is cataloged.
130
+ },
93
131
  name: 'Codex CLI (OpenAI, ChatGPT plan)',
94
132
  vendor: 'OpenAI',
95
- kind: 'agent-cli',
96
133
  bin: 'codex',
97
- access: 'subscription',
98
- lane: 'A',
99
- role: 'second coder and second-opinion reviewer (a different model family reading your diff)',
134
+ summary: 'OpenAI\'s terminal coding agent on a ChatGPT plan; `--audit` runs it in a read-only filesystem sandbox',
100
135
  minLevel: 1,
101
- install: { npm: '@openai/codex', pin: '0.153.4' },
136
+ install: { npm: '@openai/codex', url: 'https://developers.openai.com/codex/cli', pin: '0.153.4' },
102
137
  builtAgainst: '0.153.4',
103
138
  auth: '`codex login` (add `--device-auth` on a machine with no browser)',
139
+ authStatus: { args: ['login', 'status'], reliable: true, checked: '2026-09-27', source: 'author-machine probe: Logged in using ChatGPT, exit 0' },
104
140
  rulesFile: 'AGENTS.md',
105
- agentsDir: null,
106
- cliRun: true
107
- , plans: [
108
- { id: 'plus', name: 'ChatGPT Plus', headroom: 'base', source: 'https://learn.chatgpt.com/codex/pricing.md', checked: '2026-09-12' },
109
- { id: 'pro-5x', name: 'ChatGPT Pro 5x', headroom: 'high', source: 'https://learn.chatgpt.com/codex/pricing.md', checked: '2026-09-12' },
110
- { id: 'pro-20x', name: 'ChatGPT Pro 20x', headroom: 'max', source: 'https://learn.chatgpt.com/codex/pricing.md', checked: '2026-09-12' }
141
+ // tierModels is UNVERIFIED: no checked vendor source maps this plan to model aliases.
142
+ plans: [
143
+ { id: 'plus', name: 'ChatGPT Plus', headroom: 'base', tierModels: null, source: 'https://learn.chatgpt.com/codex/pricing.md', checked: '2026-09-12' },
144
+ { id: 'pro-5x', name: 'ChatGPT Pro 5x', headroom: 'high', tierModels: null, source: 'https://learn.chatgpt.com/codex/pricing.md', checked: '2026-09-12' },
145
+ { id: 'pro-20x', name: 'ChatGPT Pro 20x', headroom: 'max', tierModels: null, source: 'https://learn.chatgpt.com/codex/pricing.md', checked: '2026-09-12' }
111
146
  ]
112
147
  },
113
148
  {
114
149
  id: 'agy',
115
- laneCategories: ['fan-out', 'largest-context'],
150
+ factNotes: { fanOut: 'UNVERIFIED against a vendor doc; inherited from the 0.1.x catalog.' },
151
+ facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
152
+ modelFamily: 'Google',
153
+ kind: 'agent-cli',
154
+ billing: 'subscription',
155
+ pricing: null, // UNVERIFIED: check your provider's current rate.
156
+ headless: true,
157
+ cliRun: true,
158
+ writesFiles: true,
159
+ readOnlyMode: false,
160
+ liveWeb: null, // UNVERIFIED: no checked capability source.
161
+ runsLocally: false,
162
+ fanOut: true, // UNVERIFIED against a vendor doc; inherited from the 0.1.x catalog.
163
+ contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
164
+ loadsProjectRules: null, // UNVERIFIED: project rules inheritance needs a vendor-doc check.
165
+ agentDefinitions: '.agents/agents',
166
+ },
116
167
  name: 'Antigravity CLI `agy` (Google AI plan)',
117
168
  vendor: 'Google',
118
- kind: 'agent-cli',
119
169
  bin: 'agy',
120
- access: 'subscription',
121
- lane: 'A',
122
- role: 'deep research sweeps and concurrent fan-out (its subagent call takes an array)',
170
+ summary: 'Google\'s Antigravity terminal agent; one subagent call starts several children',
123
171
  minLevel: 1,
124
172
  install: { script: 'https://antigravity.google/cli/install.sh' },
125
173
  builtAgainst: '1.1.27',
126
- auth: 'first run opens a device-code sign-in with your Google account',
174
+ auth: 'run `agy`; the first run opens a device-code sign-in with your Google account',
127
175
  rulesFile: 'GEMINI.md',
128
- agentsDir: '.agents/agents',
129
- cliRun: true,
130
- models: { deep: 'pro', standard: 'flash', fast: 'flash' },
176
+ // tierModels is UNVERIFIED: no checked vendor source maps this plan to model aliases.
131
177
  plans: [
132
- { id: 'ai-pro', name: 'Google AI Pro', headroom: 'base', source: 'https://gemini.google/subscriptions/', checked: '2026-09-12' },
133
- { id: 'ultra-5x', name: 'Google AI Ultra 5x', headroom: 'high', source: 'https://gemini.google/subscriptions/', checked: '2026-09-12' },
134
- { id: 'ultra-20x', name: 'Google AI Ultra 20x', headroom: 'max', source: 'https://gemini.google/subscriptions/', checked: '2026-09-12' }
178
+ { id: 'ai-pro', name: 'Google AI Pro', headroom: 'base', tierModels: null, source: 'https://gemini.google/subscriptions/', checked: '2026-09-12' },
179
+ { id: 'ultra-5x', name: 'Google AI Ultra 5x', headroom: 'high', tierModels: null, source: 'https://gemini.google/subscriptions/', checked: '2026-09-12' },
180
+ { id: 'ultra-20x', name: 'Google AI Ultra 20x', headroom: 'max', tierModels: null, source: 'https://gemini.google/subscriptions/', checked: '2026-09-12' }
135
181
  ],
136
182
  note: 'Gemini CLI was retired by Google in June 2026. agy is the successor. Do not install `gemini`.'
137
183
  },
138
184
  {
139
185
  id: 'grok',
140
- laneCategories: ['live-data'],
186
+ factNotes: { liveWeb: 'UNVERIFIED against a vendor doc; inherited from the 0.1.x catalog.' },
187
+ facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
188
+ modelFamily: 'xAI',
189
+ kind: 'agent-cli',
190
+ billing: 'subscription',
191
+ pricing: null, // UNVERIFIED: check your provider's current rate.
192
+ headless: true,
193
+ cliRun: true,
194
+ writesFiles: true,
195
+ readOnlyMode: false,
196
+ liveWeb: true, // UNVERIFIED against a vendor doc; inherited first-party X and web search tools.
197
+ runsLocally: false,
198
+ fanOut: false,
199
+ contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
200
+ loadsProjectRules: false,
201
+ agentDefinitions: null, // UNVERIFIED: no project agent-definition path is cataloged.
202
+ },
141
203
  name: 'Grok CLI (xAI, X Premium)',
142
204
  vendor: 'xAI',
143
- kind: 'agent-cli',
144
205
  bin: 'grok',
145
- access: 'subscription',
146
- lane: 'A',
147
- role: 'X and live web reads at no per-call cost (its search tools bill on the API, not on the CLI)',
206
+ summary: 'xAI\'s terminal agent with first-party X and web search tools; searches are covered by the subscription rather than billed per call',
148
207
  minLevel: 1,
149
208
  install: { script: 'https://x.ai/cli/install.sh' },
150
209
  builtAgainst: '1.0.5',
151
210
  auth: '`grok login` (add `--device-auth` on a headless machine)',
152
211
  rulesFile: null,
153
- agentsDir: null,
154
- cliRun: true
155
- , plans: [
156
- { id: 'supergrok', name: 'SuperGrok', headroom: 'base', source: 'https://x.ai/news/grok-build-cli', checked: '2026-09-12' },
157
- { id: 'supergrok-plus', name: 'SuperGrok Plus', headroom: 'high', source: 'https://x.ai/pricing', checked: '2026-09-12' },
158
- { id: 'x-premium-plus', name: 'X Premium Plus', headroom: 'base', source: 'https://x.ai/news/grok-build-cli', checked: '2026-09-12' }
212
+ // tierModels is UNVERIFIED: no checked vendor source maps this plan to model aliases.
213
+ plans: [
214
+ { id: 'supergrok', name: 'SuperGrok', headroom: 'base', tierModels: null, source: 'https://x.ai/news/grok-build-cli', checked: '2026-09-12' },
215
+ { id: 'supergrok-plus', name: 'SuperGrok Plus', headroom: 'high', tierModels: null, source: 'https://x.ai/pricing', checked: '2026-09-12' },
216
+ { id: 'x-premium-plus', name: 'X Premium Plus', headroom: 'base', tierModels: null, source: 'https://x.ai/news/grok-build-cli', checked: '2026-09-12' }
159
217
  ]
160
218
  },
161
219
  {
162
220
  id: 'hermes',
163
- laneCategories: ['free'],
221
+ facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
222
+ modelFamily: null, // UNVERIFIED: the configured provider or model determines the family.
223
+ kind: 'agent-cli',
224
+ billing: 'free',
225
+ pricing: null, // UNVERIFIED: check your provider's current rate.
226
+ headless: true,
227
+ cliRun: true,
228
+ writesFiles: true,
229
+ readOnlyMode: false,
230
+ liveWeb: null, // UNVERIFIED: no checked capability source.
231
+ runsLocally: false,
232
+ fanOut: false,
233
+ contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
234
+ loadsProjectRules: false,
235
+ agentDefinitions: null, // UNVERIFIED: no project agent-definition path is cataloged.
236
+ },
164
237
  name: 'Hermes Agent (Nous Research)',
165
238
  vendor: 'Nous Research',
166
- kind: 'agent-cli',
167
239
  bin: 'hermes',
168
- access: 'free',
169
- lane: 'A',
170
- role: 'the free tier: rough drafts, first-pass summaries, cheap divergent reads, cron jobs on a box',
240
+ summary: 'A free terminal agent that chains whichever providers you authenticate',
171
241
  minLevel: 2,
172
242
  install: { url: 'https://github.com/NousResearch/hermes-agent' },
173
243
  builtAgainst: '0.20.0',
174
244
  auth: '`hermes auth add <provider>` per provider; its own fallback chain handles outages',
175
245
  rulesFile: null,
176
- agentsDir: null,
177
- cliRun: true
178
246
  },
179
247
  {
180
248
  id: 'qwen',
181
- laneCategories: ['cheapest-metered'],
249
+ facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
250
+ modelFamily: null, // UNVERIFIED: the configured provider or model determines the family.
251
+ kind: 'agent-cli',
252
+ billing: 'pay-per-token',
253
+ pricing: null, // UNVERIFIED: check your provider's current rate.
254
+ headless: true,
255
+ cliRun: true,
256
+ writesFiles: true,
257
+ readOnlyMode: false,
258
+ liveWeb: null, // UNVERIFIED: no checked capability source.
259
+ runsLocally: false,
260
+ fanOut: false,
261
+ contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
262
+ loadsProjectRules: false,
263
+ agentDefinitions: null, // UNVERIFIED: no project agent-definition path is cataloged.
264
+ },
182
265
  name: 'Qwen Code CLI (Alibaba, provider-agnostic)',
183
266
  vendor: 'Alibaba',
184
- kind: 'agent-cli',
185
267
  bin: 'qwen',
186
- access: 'metered',
187
- lane: 'B',
188
- role: 'cheapest metered bulk lane for structured output; never for anything that cites a line, a number or a source',
268
+ summary: 'A provider-agnostic terminal agent; you supply the API key, so its rate is your provider\'s rate',
189
269
  minLevel: 2,
190
- install: { npm: '@qwen-code/qwen-code', pin: '0.22.3' },
270
+ install: { npm: '@qwen-code/qwen-code', url: 'https://qwenlm.github.io/qwen-code-docs/en/users/overview/', pin: '0.22.3' },
191
271
  builtAgainst: '0.22.3',
192
- auth: 'a provider key in an environment variable, named (not stored) in ~/.qwen/settings.json. There is no free Qwen cloud tier any more.',
272
+ auth: 'run `qwen` and use `/auth` to configure your provider',
193
273
  rulesFile: 'QWEN.md',
194
- agentsDir: null,
195
- cliRun: true,
196
274
  note: 'Its own success flags lie on API failures. cli-run checks the two honest signals for you.'
197
275
  },
198
276
  {
199
277
  id: 'ollama',
200
- laneCategories: ['local'],
278
+ facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
279
+ modelFamily: null, // UNVERIFIED: the configured provider or model determines the family.
280
+ kind: 'local-runtime',
281
+ billing: 'local',
282
+ pricing: null, // UNVERIFIED: check your provider's current rate.
283
+ headless: true,
284
+ cliRun: false,
285
+ writesFiles: false,
286
+ readOnlyMode: false,
287
+ liveWeb: false,
288
+ runsLocally: true,
289
+ fanOut: false,
290
+ contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
291
+ loadsProjectRules: false,
292
+ agentDefinitions: null, // UNVERIFIED: no project agent-definition path is cataloged.
293
+ },
294
+ gatewayModel: 'ollama/llama3.2:3b',
295
+ modelsChecked: CATALOG_MODELS.measuredAt,
296
+ modelsExpires: CATALOG_MODELS.expiresAt,
201
297
  name: 'Ollama (local models)',
202
298
  vendor: 'Ollama',
203
- kind: 'local',
204
299
  bin: 'ollama',
205
- access: 'local',
206
- lane: 'local',
207
- role: 'the privacy lane: anything that must never leave the machine. Not a cost lane.',
300
+ summary: 'A local model runtime; work sent here stays on the machine',
208
301
  minLevel: 2,
209
302
  install: { url: 'https://ollama.com/download', brew: 'ollama' },
210
303
  builtAgainst: '0.33.3',
211
304
  auth: 'none',
212
305
  rulesFile: null,
213
- agentsDir: null,
214
- cliRun: false
215
306
  },
216
307
  {
217
308
  id: 'claude-app',
309
+ facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
310
+ modelFamily: 'Anthropic',
311
+ kind: 'chat',
312
+ billing: 'subscription',
313
+ pricing: null, // UNVERIFIED: check your provider's current rate.
314
+ headless: false,
315
+ cliRun: false,
316
+ writesFiles: false,
317
+ readOnlyMode: false,
318
+ liveWeb: null, // UNVERIFIED: no checked capability source.
319
+ runsLocally: false,
320
+ fanOut: false,
321
+ contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
322
+ loadsProjectRules: false,
323
+ agentDefinitions: null, // UNVERIFIED: no project agent-definition path is cataloged.
324
+ },
218
325
  name: 'Claude app or claude.ai (chat only, no CLI)',
219
326
  vendor: 'Anthropic',
220
- kind: 'chat',
221
327
  bin: null,
222
- access: 'subscription',
223
- lane: 'chat',
224
- role: 'single-agent use through Projects and custom instructions',
328
+ summary: 'A chat app; it reads pasted instructions, not files',
225
329
  minLevel: 1,
226
330
  install: { url: 'https://claude.ai' },
227
331
  auth: 'sign in',
228
332
  chatName: 'the Claude app or claude.ai',
229
333
  chatSurface: 'custom instructions or a Project',
230
334
  rulesFile: null,
231
- agentsDir: null,
232
- cliRun: false
233
335
  },
234
336
  {
235
337
  id: 'chatgpt-app',
338
+ facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
339
+ modelFamily: 'OpenAI',
340
+ kind: 'chat',
341
+ billing: 'subscription',
342
+ pricing: null, // UNVERIFIED: check your provider's current rate.
343
+ headless: false,
344
+ cliRun: false,
345
+ writesFiles: false,
346
+ readOnlyMode: false,
347
+ liveWeb: null, // UNVERIFIED: no checked capability source.
348
+ runsLocally: false,
349
+ fanOut: false,
350
+ contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
351
+ loadsProjectRules: false,
352
+ agentDefinitions: null, // UNVERIFIED: no project agent-definition path is cataloged.
353
+ },
236
354
  name: 'ChatGPT (chat only, no CLI)',
237
355
  vendor: 'OpenAI',
238
- kind: 'chat',
239
356
  bin: null,
240
- access: 'subscription',
241
- lane: 'chat',
242
- role: 'single-agent use through custom instructions and Projects',
357
+ summary: 'A chat app; it reads pasted instructions, not files',
243
358
  minLevel: 1,
244
359
  install: { url: 'https://chatgpt.com' },
245
360
  auth: 'sign in',
246
361
  chatName: 'ChatGPT',
247
362
  chatSurface: 'custom instructions or a Project',
248
363
  rulesFile: null,
249
- agentsDir: null,
250
- cliRun: false
251
364
  },
252
365
  {
253
366
  id: 'gemini-app',
367
+ facts: { // Capability snapshot checked 2026-09-27; unknown facts stay null.
368
+ modelFamily: 'Google',
369
+ kind: 'chat',
370
+ billing: 'subscription',
371
+ pricing: null, // UNVERIFIED: check your provider's current rate.
372
+ headless: false,
373
+ cliRun: false,
374
+ writesFiles: false,
375
+ readOnlyMode: false,
376
+ liveWeb: null, // UNVERIFIED: no checked capability source.
377
+ runsLocally: false,
378
+ fanOut: false,
379
+ contextWindow: null, // UNVERIFIED: context capacity depends on the selected model.
380
+ loadsProjectRules: false,
381
+ agentDefinitions: null, // UNVERIFIED: no project agent-definition path is cataloged.
382
+ },
254
383
  name: 'Gemini app (chat only, no CLI)',
255
384
  vendor: 'Google',
256
- kind: 'chat',
257
385
  bin: null,
258
- access: 'subscription',
259
- lane: 'chat',
260
- role: 'single-agent use through Gems and saved instructions',
386
+ summary: 'A chat app; it reads pasted instructions, not files',
261
387
  minLevel: 1,
262
388
  install: { url: 'https://gemini.google.com' },
263
389
  auth: 'sign in',
264
390
  chatName: 'the Gemini app',
265
391
  chatSurface: 'saved instructions or a Gem',
266
392
  rulesFile: null,
267
- agentsDir: null,
268
- cliRun: false
269
393
  }
270
394
  ];
271
395
 
@@ -276,11 +400,12 @@ export const TOOLS = [
276
400
  name: 'codecalc (calculator, code runner, logic checker for your agent)',
277
401
  repo: 'https://github.com/The-40-Thieves/codecalc',
278
402
  role: 'exact arithmetic, code execution in 31 languages, SMT logic checks, complexity and equivalence proofs; offline, no key, no telemetry',
279
- install: "uvx 'codecalc[full]' setup --write",
403
+ get install() { return `uvx 'codecalc[full]==${this.pin}' setup --write`; },
280
404
  pin: '0.5.0',
405
+ mcpSnippets: { 'claude-code': 'mcp/mcpServers.json', codex: 'mcp/codex.config.toml', agy: 'mcp/agy.mcp_config.json', qwen: 'mcp/mcpServers.json' },
281
406
  requires: 'uv (https://docs.astral.sh/uv/) and Python 3.10+',
282
407
  autoClients: ['Claude Code', 'Claude Desktop', 'Cursor', 'VS Code', 'Zed'],
283
- recommended: true,
408
+ recommended: false,
284
409
  optionalNote: 'Optional. Needs Python 3.10+ and uv. Everything else runs offline.'
285
410
  },
286
411
  {
@@ -288,8 +413,9 @@ export const TOOLS = [
288
413
  name: 'obsidian-tc (governed memory: an agent-ready MCP server over an Obsidian vault)',
289
414
  repo: 'https://github.com/The-40-Thieves/obsidian-tc',
290
415
  role: 'durable memory and record for your agents: hybrid retrieval (BM25 + dense + link graph), backlinks, compare-and-swap writes with a confirmation gate, folder ACLs, a poison scan on inferred writes; 163 tools, local by default',
291
- install: 'npm install -g obsidian-tc && obsidian-tc /path/to/your/vault',
416
+ get install() { return `npm install -g obsidian-tc@${this.pin} && obsidian-tc /path/to/your/vault`; },
292
417
  pin: '1.26.0',
418
+ mcpSnippets: { 'claude-code': 'mcp/obsidian-tc.mcpServers.json', codex: 'mcp/obsidian-tc.codex.config.toml', agy: 'mcp/obsidian-tc.agy.mcp_config.json', qwen: 'mcp/obsidian-tc.mcpServers.json' },
293
419
  requires: 'an Obsidian vault folder (the Obsidian app itself is only needed for live plugin bridges); Node 24+ or Bun 1.1+ (stricter than this installer); Ollama with `nomic-embed-text` for local embeddings, or a cloud embeddings key; the Local REST API plugin only for bridge tools',
294
420
  autoClients: ['Cursor', 'VS Code'],
295
421
  recommended: false,
@@ -300,10 +426,11 @@ export const TOOLS = [
300
426
  name: 'Context7 (Upstash: version-aware docs for the libraries your agent calls)',
301
427
  repo: 'https://github.com/upstash/context7',
302
428
  role: 'up-to-date, version-specific documentation and code examples for libraries, SDKs, APIs and CLIs, pulled into the prompt; tells the agent what the code is SUPPOSED to do. Paired with codecalc, which runs the code and proves what it actually does: docs never stand as proof, and where they disagree the run wins',
303
- install: 'npx ctx7 setup',
429
+ get install() { return `npx -y @upstash/context7-mcp@${this.pin}`; },
304
430
  pin: '4.1.1',
431
+ mcpSnippets: { 'claude-code': 'mcp/context7.claude-code.mcp.json', codex: 'mcp/context7.codex.config.toml', agy: 'mcp/context7.agy.mcp_config.json', qwen: 'mcp/context7.qwen.settings.json' },
305
432
  requires: 'Node.js 18+ for the local server or the ctx7 CLI; a free CONTEXT7_API_KEY is optional, for higher rate limits (it works anonymously at the base rate)',
306
- autoClients: ['Claude Code', 'Cursor', 'Codex CLI', 'Qwen Code'],
433
+ autoClients: [], // The pinned MCP server does not register itself; merge its snippets.
307
434
  recommended: false,
308
435
  optionalNote: 'Optional, and from a different maintainer than codecalc and obsidian-tc (Upstash, not The-40-Thieves). Needs a network call even at the anonymous rate; skip it offline. MIT.'
309
436
  }
@@ -313,12 +440,14 @@ export const toolById = Object.fromEntries(TOOLS.map((t) => [t.id, t]));
313
440
  // Metered API providers for the level 3 gateway. Separate from the AI list on
314
441
  // purpose: a Claude Code subscription is not an Anthropic API key, and a user
315
442
  // can truthfully have one without the other. Only NAMES of variables live here.
443
+ // Model names are a dated compatibility snapshot, refreshed against vendor catalogs.
444
+
316
445
  export const PROVIDERS = [
317
- { id: 'anthropic', name: 'Anthropic API', envName: 'ANTHROPIC_API_KEY', lanes: [['standard', 'anthropic/claude-sonnet-5'], ['deep', 'anthropic/claude-opus-5']] },
318
- { id: 'openai', name: 'OpenAI API', envName: 'OPENAI_API_KEY', lanes: [['second-opinion', 'openai/gpt-5.6-terra']] },
319
- { id: 'google', name: 'Google Gemini API', envName: 'GEMINI_API_KEY', lanes: [['long-context', 'gemini/gemini-3.1-pro']] },
320
- { id: 'xai', name: 'xAI API', envName: 'XAI_API_KEY', lanes: [['live-fast', 'xai/grok-4.1-fast']] },
321
- { id: 'openrouter', name: 'OpenRouter (many cheap models, one key)', envName: 'OPENROUTER_API_KEY', lanes: [['bulk-cheap', 'openrouter/qwen/qwen3.7-flash']] }
446
+ { id: 'anthropic', name: 'Anthropic API', envName: 'ANTHROPIC_API_KEY', modelsChecked: CATALOG_MODELS.measuredAt, modelsExpires: CATALOG_MODELS.expiresAt, lanes: [['standard', 'anthropic/claude-sonnet-5'], ['deep', 'anthropic/claude-opus-5']] },
447
+ { id: 'openai', name: 'OpenAI API', envName: 'OPENAI_API_KEY', modelsChecked: CATALOG_MODELS.measuredAt, modelsExpires: CATALOG_MODELS.expiresAt, lanes: [['second-opinion', 'openai/gpt-5.6-terra']] },
448
+ { id: 'google', name: 'Google Gemini API', envName: 'GEMINI_API_KEY', modelsChecked: CATALOG_MODELS.measuredAt, modelsExpires: CATALOG_MODELS.expiresAt, lanes: [['long-context', 'gemini/gemini-3.1-pro']] },
449
+ { id: 'xai', name: 'xAI API', envName: 'XAI_API_KEY', modelsChecked: CATALOG_MODELS.measuredAt, modelsExpires: CATALOG_MODELS.expiresAt, lanes: [['live-fast', 'xai/grok-4.1-fast']] },
450
+ { id: 'openrouter', name: 'OpenRouter (many cheap models, one key)', envName: 'OPENROUTER_API_KEY', modelsChecked: CATALOG_MODELS.measuredAt, modelsExpires: CATALOG_MODELS.expiresAt, lanes: [['bulk-cheap', 'openrouter/qwen/qwen3.7-flash']] }
322
451
  ];
323
452
  export const providerById = Object.fromEntries(PROVIDERS.map((p) => [p.id, p]));
324
453
 
@@ -331,7 +460,7 @@ export const IMAGES = {
331
460
 
332
461
  export const byId = Object.fromEntries(AIS.map((a) => [a.id, a]));
333
462
 
334
- // The ONE place an npm install spec is built. Interactive install, the printed
463
+ // The ONE place an npm install spec is built. The printed
335
464
  // fallback command, the install table and the box script all call this, so
336
465
  // two users on two paths get the same version.
337
466
  export function npmSpec(a) {
@@ -344,6 +473,13 @@ export function aisForLevel(level) {
344
473
  }
345
474
 
346
475
  export function agentCandidates(selected) {
347
- // Which of the selected AIs can be the single primary agent at level 1.
348
- return selected.filter((a) => a.kind === 'agent-cli' || a.kind === 'chat');
476
+ // Which of the selected AIs can be the single main agent at level 1.
477
+ return selected.filter((a) => a.facts.kind === 'agent-cli' || a.facts.kind === 'chat');
478
+ }
479
+
480
+
481
+ // Preserve provenance when the compact summary is rendered away from facts.
482
+ export function summaryWithEvidence(ai) {
483
+ const notes = Object.entries(ai.factNotes || {}).map(([fact, note]) => `${fact}: ${note}`);
484
+ return notes.length ? `${ai.summary.replace(/\.$/, '')}. ${notes.join(' ')}` : ai.summary;
349
485
  }