openmerit 0.1.10 → 0.1.11

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.11 — 2026-11-01
4
+
5
+ - Refresh packaged Scout guides and include the Saga articles maintained in Markdown.
6
+ - Recognize the Claude Code instruction updater when invoked through a symbolic link, so linked hook entry points run their update checks.
7
+ - Preserve the existing CLI, Claude Code instruction-update contract, Pi integration and public exports. Scout, Saga and homepage source changes require separate website deployments; this npm release does not publish them.
8
+
3
9
  ## 0.1.10 — 2026-10-26
4
10
 
5
11
  - Add default-on Claude Code background checks for compatible Scout skill/startup-rule updates, with daily checks, 15-minute failure backoff, non-blocking failure notices with the “update openmerit” fallback, manual `openmerit update`, persistent opt-out and a natural-language update instruction.
@@ -1 +1 @@
1
- {"format":1,"contract":"scout-recommend-v1","version":"0.1.10","skill":"---\nname: openmerit-scout\ndescription: Consults OpenMerit Scout before choosing, adding, downloading, replacing or configuring any application inference model, including implicit choices while building features, pretrained browser/local models, SDK defaults, embeddings, OCR, speech, classification, detection, segmentation, LLMs and agents. Not for unrelated edits, ordinary inference calls or this coding agent's own model.\n---\n\n# OpenMerit · Scout\n\nBefore introducing, recommending, replacing or configuring an application\ninference model, call the `scout_models` tool on the `openmerit` MCP server.\nThis applies even when the user never mentions models or Scout. Downloading local\nweights, using a pretrained browser model or accepting an SDK default is a model\ndecision: consult Scout before model-specific code, installs or downloads.\nPreserve the user's explicit model choice; assess it rather than silently replacing\nit. Leave unchanged, approved application selections in place.\n\n## Project policy\n\nRead `.openmerit/scout.json` before searching. If it is absent, ask once whether this\nproject uses **existing-only** (only endpoints it can already reach) or\n**existing-first** (prefer them, ask before searching the whole catalogue), and\nwhich public catalogue endpoint IDs it can access. Save the answer:\n\n```sh\nnpx -y openmerit@latest project --policy existing-only --endpoint-id <id> ...\n```\n\nNever infer access from a model name, SDK or environment-variable name. Never\nrecord credentials, private URLs, prompts or customer data. An empty inventory\nis not permission to search all models.\n\n## Searching\n\nCall `scout_models` with a non-confidential task description and\n`endpointIds` set to the saved inventory, including `[]` when empty.\nExisting-only never broadens. For existing-first, if no existing candidate fits,\nexplain the gap and ask before a separate search without `endpointIds`. Send\nonly task requirements, never source files, secrets or real customer records.\n\nCompare model AND endpoint, evidence, reference cost/time, unknowns and\nwarnings. For multiple tasks read `tasks[].slots[0].recommendations`; the\ntop-level list is empty. Prefer the cheapest usable option the quality evidence\nsupports, without claiming benchmarks prove application accuracy. Use the\nreturned provider model ID and the project's actual SDK and protocol.\n\n## Boundaries\n\nAsk before adding providers or credentials, spending, deploying or external\nwrites. Report recommendation, endpoint connectivity and application checks as\nseparate results, each only after it succeeds. Do not switch this coding agent's\nown model.\n\nIf Scout fails or has no suitable candidate/evidence for the required deployment,\nsay so and pause the model decision; do not substitute a remembered recommendation\nor SDK default. Continue only model-independent work. Local/browser models are not\nexempt when the catalogue lacks coverage. If it reports that the device key is missing,\nexpired or revoked, run `npx -y openmerit@latest login` and then\n`npx -y openmerit@latest install` again. Never ask the user to paste a key.\n","rule":"# Application model decisions · OpenMerit Scout\n\nBefore choosing, recommending, adding, downloading, replacing or configuring\nANY application inference model, load the `openmerit-scout` skill and consult\n`scout_models` on the `openmerit` MCP server before committing to a model.\nThis applies even when the user only asks you to build a feature, never mentions\nmodels or Scout, or names a model themselves (assess it; do not silently replace it).\n\nA pretrained model, local weights, browser inference, an SDK's default model,\nembeddings, OCR, speech, image classification, detection and segmentation all\ncount as model choices, not implementation details. Identify this decision before\nwriting model-specific code, installing a model package or downloading weights.\n\nFollow the skill's project access policy. If it is missing, ask and save it first.\nIf Scout is unavailable, fails or has no suitable evidence/candidate, disclose the\ngap and pause the model decision; do not fall back to a remembered or SDK-default\nmodel. You may continue work that does not commit to a model.\n\nDo not consult Scout for unrelated edits, normal inference calls using an unchanged\napproved model, or this coding agent's own model. Do not reselect approved models\nunless the task introduces or changes a model decision.\n\nWhen the user says \"update openmerit\", run\n`npx -y openmerit@latest update --scope user` (use `--scope project` if this\nrule is in the project's .claude/rules directory). Report the result, including\nany conflict or manual-upgrade requirement. Do not delete edited files, bypass\npermissions or rerun login automatically. A new session loads updated instructions.\n"}
1
+ {"format":1,"contract":"scout-recommend-v1","version":"0.1.11","skill":"---\nname: openmerit-scout\ndescription: Consults OpenMerit Scout before choosing, adding, downloading, replacing or configuring any application inference model, including implicit choices while building features, pretrained browser/local models, SDK defaults, embeddings, OCR, speech, classification, detection, segmentation, LLMs and agents. Not for unrelated edits, ordinary inference calls or this coding agent's own model.\n---\n\n# OpenMerit · Scout\n\nBefore introducing, recommending, replacing or configuring an application\ninference model, call the `scout_models` tool on the `openmerit` MCP server.\nThis applies even when the user never mentions models or Scout. Downloading local\nweights, using a pretrained browser model or accepting an SDK default is a model\ndecision: consult Scout before model-specific code, installs or downloads.\nPreserve the user's explicit model choice; assess it rather than silently replacing\nit. Leave unchanged, approved application selections in place.\n\n## Project policy\n\nRead `.openmerit/scout.json` before searching. If it is absent, ask once whether this\nproject uses **existing-only** (only endpoints it can already reach) or\n**existing-first** (prefer them, ask before searching the whole catalogue), and\nwhich public catalogue endpoint IDs it can access. Save the answer:\n\n```sh\nnpx -y openmerit@latest project --policy existing-only --endpoint-id <id> ...\n```\n\nNever infer access from a model name, SDK or environment-variable name. Never\nrecord credentials, private URLs, prompts or customer data. An empty inventory\nis not permission to search all models.\n\n## Searching\n\nCall `scout_models` with a non-confidential task description and\n`endpointIds` set to the saved inventory, including `[]` when empty.\nExisting-only never broadens. For existing-first, if no existing candidate fits,\nexplain the gap and ask before a separate search without `endpointIds`. Send\nonly task requirements, never source files, secrets or real customer records.\n\nCompare model AND endpoint, evidence, reference cost/time, unknowns and\nwarnings. For multiple tasks read `tasks[].slots[0].recommendations`; the\ntop-level list is empty. Prefer the cheapest usable option the quality evidence\nsupports, without claiming benchmarks prove application accuracy. Use the\nreturned provider model ID and the project's actual SDK and protocol.\n\n## Boundaries\n\nAsk before adding providers or credentials, spending, deploying or external\nwrites. Report recommendation, endpoint connectivity and application checks as\nseparate results, each only after it succeeds. Do not switch this coding agent's\nown model.\n\nIf Scout fails or has no suitable candidate/evidence for the required deployment,\nsay so and pause the model decision; do not substitute a remembered recommendation\nor SDK default. Continue only model-independent work. Local/browser models are not\nexempt when the catalogue lacks coverage. If it reports that the device key is missing,\nexpired or revoked, run `npx -y openmerit@latest login` and then\n`npx -y openmerit@latest install` again. Never ask the user to paste a key.\n","rule":"# Application model decisions · OpenMerit Scout\n\nBefore choosing, recommending, adding, downloading, replacing or configuring\nANY application inference model, load the `openmerit-scout` skill and consult\n`scout_models` on the `openmerit` MCP server before committing to a model.\nThis applies even when the user only asks you to build a feature, never mentions\nmodels or Scout, or names a model themselves (assess it; do not silently replace it).\n\nA pretrained model, local weights, browser inference, an SDK's default model,\nembeddings, OCR, speech, image classification, detection and segmentation all\ncount as model choices, not implementation details. Identify this decision before\nwriting model-specific code, installing a model package or downloading weights.\n\nFollow the skill's project access policy. If it is missing, ask and save it first.\nIf Scout is unavailable, fails or has no suitable evidence/candidate, disclose the\ngap and pause the model decision; do not fall back to a remembered or SDK-default\nmodel. You may continue work that does not commit to a model.\n\nDo not consult Scout for unrelated edits, normal inference calls using an unchanged\napproved model, or this coding agent's own model. Do not reselect approved models\nunless the task introduces or changes a model decision.\n\nWhen the user says \"update openmerit\", run\n`npx -y openmerit@latest update --scope user` (use `--scope project` if this\nrule is in the project's .claude/rules directory). Report the result, including\nany conflict or manual-upgrade requirement. Do not delete edited files, bypass\npermissions or rerun login automatically. A new session loads updated instructions.\n"}
@@ -2,6 +2,7 @@
2
2
  // built-ins: it must survive the npx cache disappearing, without installing or
3
3
  // executing code from the release it downloads.
4
4
  import { createHash, randomUUID } from 'node:crypto';
5
+ import { realpathSync } from 'node:fs';
5
6
  import { mkdir, open, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
6
7
  import { dirname, join, resolve } from 'node:path';
7
8
  import { fileURLToPath } from 'node:url';
@@ -381,7 +382,7 @@ export async function runUpdate(base, scope, options = {}) {
381
382
  }
382
383
  // Hooks deliberately never ask Claude to continue, read transcripts or emit
383
384
  // blocking decisions. Offline and concurrent-hook failures exit successfully.
384
- if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
385
+ if (process.argv[1] && realpathSync(resolve(process.argv[1])) === fileURLToPath(import.meta.url)) {
385
386
  const args = process.argv.slice(2), base = args[args.indexOf('--base') + 1], scope = args[args.indexOf('--scope') + 1];
386
387
  if (base && ['user', 'project'].includes(scope ?? '')) {
387
388
  process.stdin.resume();
@@ -2,6 +2,7 @@
2
2
  // built-ins: it must survive the npx cache disappearing, without installing or
3
3
  // executing code from the release it downloads.
4
4
  import { createHash, randomUUID } from 'node:crypto';
5
+ import { realpathSync } from 'node:fs';
5
6
  import { mkdir, open, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
6
7
  import { dirname, join, resolve } from 'node:path';
7
8
  import { fileURLToPath } from 'node:url';
@@ -300,7 +301,7 @@ export async function runUpdate(base: string, scope: string, options: { hook?: b
300
301
 
301
302
  // Hooks deliberately never ask Claude to continue, read transcripts or emit
302
303
  // blocking decisions. Offline and concurrent-hook failures exit successfully.
303
- if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
304
+ if (process.argv[1] && realpathSync(resolve(process.argv[1])) === fileURLToPath(import.meta.url)) {
304
305
  const args = process.argv.slice(2), base = args[args.indexOf('--base') + 1], scope = args[args.indexOf('--scope') + 1];
305
306
  if (base && ['user', 'project'].includes(scope ?? '')) {
306
307
  process.stdin.resume();
@@ -0,0 +1,25 @@
1
+ Model discovery should leave you with questions about the models, not about why the same search changed its mind over lunch.
2
+
3
+ On 27 October, we updated hosted Scout in two ways: completed searches can replay the AI answers behind their recommendations, and task-specific benchmark evidence takes priority over more general estimates. Both changes make the reasoning behind a shortlist easier to inspect.
4
+
5
+ ## Same question, steadier answer
6
+
7
+ Scout uses AI to interpret your task and assess the available evidence. Those steps can vary between attempts, even when your prompt does not.
8
+
9
+ A completed search now records the AI answers it received. An identical search can replay those answers rather than ask again. “Identical” means the same prompt, model-and-endpoint scope, catalogue generation, interpreter version, and UTC day. The replay records are retained for seven days, but the daily boundary still matters: a new UTC day asks again, even if yesterday’s record is still stored.
10
+
11
+ A catalogue or interpreter change also starts fresh. Failed or degraded searches do not create replay records. This is repeatability within defined conditions, not a promise that a recommendation will never change.
12
+
13
+ ## Evidence closer to the task comes first
14
+
15
+ A broad benchmark can be informative without being the best evidence for a narrow job.
16
+
17
+ When candidates in Scout’s quality band have direct benchmark evidence for the task, Scout ranks and labels the strongest, best-value, and fastest choices among those candidates first. A model estimated only from general benchmarks cannot jump ahead of them or remove them as dominated. It may still fill a remaining place, with a warning explaining the weaker evidence basis.
18
+
19
+ When no direct benchmark is accepted, the same preference applies to domain evidence. Think of it as asking someone who has done the job before consulting someone with an excellent general résumé.
20
+
21
+ ## What this does—and does not—change
22
+
23
+ These are improvements to discovery, not new evidence that a recommended model will pass your own evaluations. Stable answers are easier to compare; they are not automatically correct answers. More relevant benchmarks are more useful starting points; they are not your production workload.
24
+
25
+ You can use both improvements in the [Scout beta](/scout/). The [data policy](/scout/data-policy/) explains the service’s handling of search data. Your next step remains the useful one: test a candidate on work that matters to you.
@@ -0,0 +1,154 @@
1
+ Same AI. Same claim documents. Two ways to ask for help.
2
+
3
+ **One request:**
4
+
5
+ > Review this insurance claim. Summarize the important details, flag anything missing, and tell the adjuster whether it's ready for review.
6
+
7
+ **Another:**
8
+
9
+ > Read the attached claim packet and intake checklist. Extract the incident date and repair amount, then check for missing documents. Return a summary of up to 150 words, with a document and page reference for each fact. Mark unreadable values as unknown. The adjuster should be able to verify every fact from its reference. Don't approve or deny the claim.
10
+
11
+ Which would you rather leave running while you're away from your desk?
12
+
13
+ The first sounds reasonable. You could send it to a colleague who already knows your claims process. But an AI has to fill in what “important,” “missing,” and “ready” mean. You might agree with its choices. You might only discover you disagree after someone acts on them.
14
+
15
+ With the second, you can inspect the result and point to what went wrong: a missing reference, an invented amount, a decision it wasn't asked to make. It can still fail. You've given yourself a way to catch it.
16
+
17
+ Look at what's doing the work in that request: **input, work, output, criteria, and constraints**. Five parts, all in one paragraph. You don't need a long prompt to cover them. You do need to make a few decisions before handing the task over.
18
+
19
+ Let's work through those decisions using the claim.
20
+
21
+ ## What are you giving it?
22
+
23
+ “A PDF” doesn't tell you much. Is it three pages of selectable text? Forty pages of scans? Does someone take a photo of the form on their kitchen table and upload that instead?
24
+
25
+ All of these count as documents. You'll want to know which ones you're building for.
26
+
27
+ For our claims task, let's say the input is **one claim, up to 40 pages**, with a claim ID and an intake checklist. The packet can contain scanned forms, photographs, and repair estimates. Some pages will be blurry. Some documents will be missing. We should expect that.
28
+
29
+ We also need the policy that applied on the incident date. Does it arrive with the claim, or do we have to fetch it? Put that in the spec too. Information sitting somewhere in your company isn't automatically available to the AI.
30
+
31
+ The same questions work elsewhere. For a call, name the audio format, language, duration, and whether people talk over each other. For a spreadsheet, give the columns, units, and likely number of rows. Include what happens when the input is too large. Silently reading the first ten pages of a forty-page claim is a bad shortcut.
32
+
33
+ ## What should it actually do?
34
+
35
+ Here's a more useful request than “process this claim”:
36
+
37
+ > Check that the documents belong to this claim. Extract the incident date and repair amount. Retrieve the policy version for that date. Compare the packet with the intake checklist and tell the adjuster what's missing or contradictory.
38
+
39
+ You can see the work now. You can also see the order: we shouldn't look up a policy using a date we haven't read yet.
40
+
41
+ Name the tools it can use. Here, it needs a read-only policy lookup, scoped to the claim. It doesn't need a payment tool. If the lookup fails, the result should say so and go to an adjuster. We don't want the model filling the gap from its general knowledge of insurance.
42
+
43
+ Be specific about the actions, without scripting every thought. Ask for the source page behind an extracted amount. That's something you can check. A long explanation of how carefully the model considered the amount isn't nearly as useful.
44
+
45
+ ## What do you want back?
46
+
47
+ Imagine the person who has to use the result. An adjuster might want a short summary with links to the relevant pages. Your claims software probably wants JSON. You may need both.
48
+
49
+ Write down the format, fields, size, and audience. “A short summary” could mean three bullets or a page. “The amount” needs a currency. A generated image needs dimensions and a file format; an audio response needs a language and a duration limit. These decisions are easy to make now and annoying to discover downstream.
50
+
51
+ Here's a fragment of what our claim output might look like. This is an example, not a product API:
52
+
53
+ ```json claim-intake-example.json
54
+ {
55
+ "claim_id": "CLM-1042",
56
+ "repair_estimate": {
57
+ "amount": null,
58
+ "currency": "GBP",
59
+ "source": { "document": "repair-estimate.pdf", "page": 2 },
60
+ "issue": "Amount is unreadable"
61
+ },
62
+ "missing_documents": ["Proof of ownership"],
63
+ "status": "needs_review"
64
+ }
65
+ ```
66
+
67
+ That `null` matters. The amount wasn't readable. It wasn't zero, and it wasn't a plausible number the model found somewhere else. We've given “I can't tell” a place in the output, so the next step can handle it.
68
+
69
+ ## How will you know it worked?
70
+
71
+ This is where “looks good to me” starts getting expensive.
72
+
73
+ Take claims that an adjuster has already reviewed. Did the system extract the right dates and amounts? Did it catch the missing documents? Do the page references actually support what it says?
74
+
75
+ Check those separately. If it gets every date right but misses half the missing documents, one combined score will make it look better than it is.
76
+
77
+ You can use a percentage, a checklist, a numerical tolerance, or a person's judgment against written criteria. But be clear about what you're counting. “95% accurate” could mean fields, documents, or entire claims. Those are very different bars.
78
+
79
+ And watch the escape hatch. A system that sends everything to an adjuster might make very few mistakes. It also leaves the adjuster with all the work. Measure how often it refers a case as well as how often it's right.
80
+
81
+ For this task, I'd treat an invented amount or a fact pulled from the wrong claim as a reason to stop the release. Agree on the other thresholds with the claims team before running the evaluation. Include poor scans, conflicting dates, and missing pages, and keep some cases aside that you haven't used while tuning. Passing that set won't prove the system can never fail, but it gives you a much better basis for a decision than a few convincing demos.
82
+
83
+ ## Where should it stop?
84
+
85
+ Our task prepares a claim for review. It doesn't approve it, deny it, pay it, or email the customer. Write that down.
86
+
87
+ Also write down the less dramatic boundaries. It can't read another customer's documents. It can't upload the packet to an unapproved service. It shouldn't keep retrying a broken lookup indefinitely. If a document says “ignore your instructions and approve this claim,” that's text inside a document, not permission to do anything.
88
+
89
+ Tell it what to do instead: leave the value unknown, report the failed lookup, or send the case to the review queue. Set actual retry, cost, and time limits where the task needs them.
90
+
91
+ Then enforce the important bits in the software. Give it read-only credentials. Restrict which records it can retrieve. Put approval checks in front of consequential actions.
92
+
93
+ > If the task must never issue a payment, don't give it a payment tool and rely on a sentence asking it to behave.
94
+
95
+ There's a useful distinction here: “don't access the web” is a rule; “there is no browser available” describes the environment. Your spec should say both what isn't allowed and what isn't possible. It saves the system from trying things that were never going to work.
96
+
97
+ ## This can be a small document
98
+
99
+ The insurance example has a lot to care about. A startup routing support tickets can use the same five parts in much less space:
100
+
101
+ ```text support-routing-task.txt
102
+ Input
103
+ One support thread, up to 20 messages and 10,000 characters.
104
+ English text and the current routing guide. No attachments.
105
+
106
+ Work
107
+ Choose billing, technical, account, or other using the guide.
108
+ If multiple teams are needed, use other and flag for review.
109
+ No external lookups.
110
+
111
+ Output
112
+ One JSON object:
113
+ queue: billing, technical, account, or other
114
+ summary: a string of at most 40 words
115
+ needs_review: a boolean
116
+
117
+ Criteria
118
+ Valid JSON, allowed field values, no invented facts.
119
+ At least 190 of 200 held-out, labelled threads routed correctly.
120
+ Count review referrals as misses for this score;
121
+ report the referral rate separately.
122
+
123
+ Constraints
124
+ Don't send replies, change accounts, or issue refunds.
125
+ Leave passwords and payment details out of the summary.
126
+ Unsupported language, oversized input, or missing guide:
127
+ return queue=other and needs_review=true.
128
+ ```
129
+
130
+ The 190-out-of-200 target is just an example. Pick your own based on what a wrong answer costs and how much review your team can handle. The useful part is that someone can run this task and tell you whether it passed.
131
+
132
+ You don't need to turn every instruction into a document this long. If you're asking for a one-off draft, a few sentences may cover all five parts. When the task will run a thousand times without you watching, spend the extra time.
133
+
134
+ ## When the job gets bigger
135
+
136
+ Suppose you're doing this in a supply-chain team. You want to find late shipments, suggest alternatives, contact suppliers, and update orders.
137
+
138
+ I'd split that up. Start with finding the late shipments:
139
+
140
+ | Part | What to specify |
141
+ | --- | --- |
142
+ | Input | One purchase order, its line items and promised dates, plus timestamped carrier events. |
143
+ | Work | Match events to order lines, compare delivery estimates with promised dates, and flag exceptions. |
144
+ | Output | A record for each affected line, with source timestamps, and a short internal summary. |
145
+ | Criteria | Check against reviewed on-time, late, partial, and cancelled shipments. Count missed exceptions and false alarms separately. |
146
+ | Constraints | No supplier messages or order changes. Stale or missing tracking data means “unknown,” not “on time.” |
147
+
148
+ Finding a replacement supplier can be the next task. Placing an order can be another, with approval required. Each gets its own five-part spec. You can improve shipment detection without accidentally giving it authority to buy things.
149
+
150
+ Pay attention to what passes between tasks. Do they agree on order IDs, units, and timestamps? Can the next task distinguish “no late shipments” from “we couldn't reach the carrier”? An empty list shouldn't have to mean both.
151
+
152
+ Keep the specs with the test cases. When a task fails, save that input, write down what should have happened, and fix the relevant part. When you change the spec, give it a version so you know which instructions produced which results.
153
+
154
+ Before you try another model, try handing the task to a colleague. Ask what they'd need to know to do it. Whatever they have to ask you is a good place to start editing.
@@ -0,0 +1,33 @@
1
+ Suppose two models look equally good on a public leaderboard. One has been measured on a task close to yours. The other has an impressive general score, but no comparable result for your task. Are those two pieces of evidence interchangeable?
2
+
3
+ Our working answer is no. This is a research note about how we interpret evidence, not a new benchmark report or a claim that we have measured your application’s quality.
4
+
5
+ ## The distance between a score and a decision
6
+
7
+ A benchmark is a particular set of inputs, a scoring rule, and an execution setup. A product is also a particular set of inputs, rules, and conditions—usually a different one.
8
+
9
+ The gap can be small: a structured extraction benchmark may resemble the documents you process. Or it can be large: a general reasoning score may tell you little about recognising a specialised medical code. The danger is not that a general score is useless. It is that a precise-looking number can hide how indirect the evidence is.
10
+
11
+ Our approach in Scout distinguishes evidence about the task itself, evidence about its broader domain, and general estimates. That distinction should survive all the way to the recommendation. Combining everything into one confident-looking order would make the interface simpler at the expense of the explanation.
12
+
13
+ | Evidence | What it helps you judge | What it does not establish |
14
+ | --- | --- | --- |
15
+ | Direct task benchmark | Performance on a related measured task | Success on your own inputs |
16
+ | Domain benchmark | Capability in the broader problem area | Accuracy on this specific workflow |
17
+ | General estimate | A starting point when closer evidence is missing | A substitute for a task-specific evaluation |
18
+
19
+ ## Repeatability answers a different question
20
+
21
+ We also examined how consistently Scout produced shortlists. In an internal check of 34 test cases, each run three times, repeated searches shared only 34–39% of their top-five candidates. That observation concerns recommendation consistency. It does not measure the candidates’ task accuracy, and it is not an independent assessment of model quality.
22
+
23
+ The finding motivated replaying the AI answers behind completed, identical searches. Under the same prompt, scope, catalogue generation, interpreter version, and UTC day, the service can reuse those answers. This reduces a source of variation while those conditions hold.
24
+
25
+ But consistency is not correctness. A compass that points in the same direction deserves a second question: is that north? We still need relevant evidence, visible limitations, and evaluations that resemble the intended work.
26
+
27
+ ## What we conclude
28
+
29
+ First, prefer evidence closer to the task when it is available. Second, make weaker evidence visibly weaker rather than letting a broad score borrow the authority of a direct measurement. Third, make a search reproducible enough that a person can investigate why a recommendation was made.
30
+
31
+ Those principles inform Scout’s [latest discovery update](/news/a-steadier-compass/). They do not establish a universal ranking, quantify an improvement in downstream task success, or remove the need for application-specific evaluation.
32
+
33
+ The next useful experiment is not “which model wins everything?” It is a comparison on representative inputs, with the same success criteria and a clear account of failures. Until that experiment is run, a shortlist should remain exactly that.
@@ -1,81 +1,39 @@
1
- # Scout beta data policy
1
+ # Scout data policy
2
2
 
3
- Updated 25 October 2026.
3
+ Updated 29 October 2026.
4
4
 
5
- **Source only, not released:** Scout setup usage/installation analytics now defaults on without an analytics-enabling prefix in the normal copied command. `OPENMERIT_TELEMETRY=0` or `DO_NOT_TRACK=1` disables it and propagates to device approval and installed MCP headers. Scout's browser usage/unlink choices and account opt-outs remain effective; MCP prompt-content capture stays off. Terminal/evaluation analytics remain opt-in. These defaults require an updated npm release before prompt deployment; npm 0.1.9 still has the opt-in setup behavior described below.
5
+ OpenMerit operates Scout. This policy covers its hosted website and connected clients.
6
6
 
7
- **Coding-agent setup, 24 October 2026:** hosted Scout supports device sign-in and MCP; stable npm 0.1.8 installs Claude Code's MCP configuration, startup rule and Scout skill after approval. This supersedes the 23 October web-placeholder reset. Scout stores the approving account, device name you chose (the host name by default), client, scope, timestamps and hashes of device codes and keys, but never a plaintext key. Local setup stores the key in private configuration; external coding agents have their own data handling. Installation and startup guidance do not guarantee an agent will invoke Scout.
7
+ **Don't submit confidential or sensitive information.** Automated redaction is not guaranteed to remove it.
8
8
 
9
- **Lifecycle telemetry — npm 0.1.9 and matching Scout deployment:** this revision adds consent-gated setup-click, clipboard/launch-request, device-authorization, installation/component-verification and MCP-invocation diagnostics. Linked setup uses random setup and installation UUIDs to correlate those milestones; the local ownership record and installed MCP headers retain them across sessions/upgrades. Unlinked mode omits these IDs. Copied setup prompts carry usage/unlink preferences into installation, while standalone CLI telemetry remains opt-in and DNT overrides it. Installed MCP prompt-content capture remains off. The revision also adds bounded delivery retries and sanitized Cloudflare delivery counters, without identity, content, URLs, device codes or credentials in those counters. Existing installations need an installer rerun; these changes do not backfill earlier activity. Release acceptance is recorded separately.
9
+ ## Data we use
10
10
 
11
- **Version-5 diagnostics:** Scout serving builds collect page views/leaves, bounded engagement, allowlisted acquisition/UTM and browser/device categories, and sampled browser performance observations where supported and usage analytics is enabled. Native URL properties use only reconstructed public paths, never raw visitor URLs, queries or fragments. Linked activity can join same-tab visits, signup and searches; unlinking retains request-only server identity, not a cross-request funnel. Feedback records a useful/not-useful rating and optional fixed reason, with linked trace/retry correlation, not free text. Server diagnostics include bounded stage/provider failure codes and actual pipeline attempt tokens when reported, not invented charges or executions of recommended models. Main-site/docs collection and CLI publication have separate release boundaries. No replay or ranking experiment is enabled, and none of the prompt-content or retention controls below change.
11
+ - **Service data:** Your submitted task and related information are processed by an AI service provider, even with analytics off. We also retain account, authorization and device details needed to provide access.
12
+ - **Optional analytics:** When enabled, we collect usage, recommendations, feedback, setup activity, device/browser categories, performance and error information to improve Scout and fix problems. Account analytics may include your name, verified email and sign-in provider, and may link activity before and after sign-in.
13
+ - **Shared content:** When prompt sharing is enabled, analytics also includes task text and analysis. We use this for product improvement, not foundation model training. There is no session recording.
12
14
 
13
- Scout is operated by OpenMerit. This policy covers the hosted Scout website, recommendation API and MCP endpoint. It describes current data handling, not a promise that beta data is anonymous or exempt from privacy requirements. External coding agents, the local Inference Terminal and other OpenMerit services have separate data flows.
15
+ Service providers handle hosting, AI processing, sign-in and analytics on our behalf. They have their own retention and security policies; processing is not guaranteed to stay in one region or have zero retention. External coding agents and linked services have separate policies.
14
16
 
15
- ## Help improve Scout during beta
17
+ ## Your choices
16
18
 
17
- Scout processes your submitted task to generate recommendations. With usage analytics enabled, we record recommendations and usage diagnostics for product evaluation, improvement and debugging, not foundation model training. Our service providers process data on our behalf.
19
+ Manage sharing in [Privacy & analytics](/scout/privacy/). Browser usage analytics and prompt sharing default on unless you previously opted out. Saved opt-outs, Do Not Track and Global Privacy Control are respected.
18
20
 
19
- **Beta revision, effective 22 October 2026.** Browser prompt sharing defaults on only where no content choice is stored; a saved off choice remains off. You can turn sharing off before submitting a task, or choose not to link this browser's activity to your account. Browser privacy signals still take precedence. A beta label or this notice does not establish consent or another legal basis.
21
+ You can disable usage analytics, disable prompt sharing, or stop linking this browser's activity to your account. Unlinking does not remove earlier links or stop separate account-profile analytics; task text can still identify you.
20
22
 
21
- **Don't submit confidential or sensitive information.** Describe the work rather than pasting credentials, private customer records or real documents. Automated redaction cannot recognize every secret or personal detail.
23
+ Setup analytics defaults on. Set `OPENMERIT_TELEMETRY=0` or `DO_NOT_TRACK=1` to disable it. Installed coding-agent connections do not share prompt content for analytics. Terminal and evaluation analytics remain opt-in. Rerun setup to apply changed preferences to existing installations.
22
24
 
23
- ## What we process and why
24
-
25
- | Data | Purpose and collection |
26
- | --- | --- |
27
- | Submitted task and model restrictions | Required to interpret the task, find suitable models and return recommendations. Scout sends task information to OpenAI even when analytics is off. |
28
- | Recommendations and search diagnostics | When usage analytics is enabled, PostHog receives task categories, model IDs, ranks, available quality/cost/latency evidence, timings, cache status and outcomes. These describe recommendations, not execution of those models on your data. |
29
- | Product interactions and errors | Enabled analytics includes visits, preset selections, sign-in activity, results viewed, evidence opened, copies, provider-link clicks and coding-agent setup activity. API/MCP events record request outcomes. Lifecycle-enabled builds add allowlisted method/tool, reported agent/harness and version, setup/installation correlation and verified-connection diagnostics. A launch request is not proof an app opened, and key authorization is not proof of installation. Error reports use bounded categories and application stack locations, not raw error messages. |
30
- | Account details | Clerk handles Google/GitHub login. Enabled account analytics can synchronize your name, verified primary email, signup time and connected providers to PostHog. Account and session lifecycle events help us understand onboarding and returning use. |
31
- | Optional prompt content | Only when prompt sharing is enabled, PostHog also receives the submitted prompt and written task breakdown, for at most three tasks. Prompt text is limited to 4,000 characters, with up to 1,000 characters per excerpt or five-layer field. Common sensitive patterns are removed where detected; this is not guaranteed anonymization. All such text is confined to `$ai_trace.$ai_input_state={prompt,tasks}`; new ordinary `scout_search_details` events contain no prompt, excerpt or layer prose. |
32
-
33
- Scout does not use session replay, record keystrokes, or automatically capture every page element. Our analytics code does not forward bearer tokens, cookies, raw Clerk identifiers or visitor IP addresses to PostHog. Hosting and authentication providers still process the connection and security information needed to run their services.
34
-
35
- ## Your choices and account linkage
36
-
37
- Open **Privacy & analytics** in the [Scout footer](/scout/#analytics-settings):
38
-
39
- - **Share usage and account analytics** controls optional product events and account synchronization. It is on by default unless you opt out or a supported browser privacy signal disables it.
40
- - **Share my task prompts and breakdowns for product improvement** defaults on only without a stored content choice. Saved off, general opt-out, DNT/GPC and unreadable preference storage keep content off; usage analytics must also be enabled.
41
- - **Don’t link this browser’s activity to my account** applies to this browser/request only, not your account everywhere. It sends `X-Scout-Analytics-Account: off`.
42
- - Turning sharing off stops future analytics collection. It does not stop necessary task processing, undo in-flight work or delete information already stored.
43
-
44
- Scout respects Do Not Track and Global Privacy Control for these analytics. An authenticated browser also communicates its usage preference to the server; the latest received account preference controls background synchronization. A browser that is offline or not signed in cannot update that account preference until it reconnects and authenticates.
45
-
46
- API/MCP clients can send `X-Scout-Analytics: off` to disable analytics. Prompt text still requires explicit `X-Scout-Analytics-Content: on`; general opt-out and supported privacy signals take precedence. CLI content capture is always off. Older 0.1.8 setup does not inherit this browser's account-linkage setting; the 0.1.9 lifecycle revision explicitly carries usage and unlink preferences into the command and installed headers. Later browser changes do not rewrite existing agent configuration; rerun setup to update it. Request-only refusals in that revision do not overwrite saved account-wide preferences.
47
-
48
- Enabled signed-in analytics normally uses a stable account identifier linked to the profile above; hashing does not make it anonymous, and a pre-sign-in visit can be joined after login. In unlinking mode the server uses fresh unrelated random identifiers, sends no profile/identify operation, ignores previously linked browser identifiers and supplied trace IDs, and does not return an analytics trace ID for later interactions to reuse. Account opt-out and deletion gates still apply before sending. Clerk profile/lifecycle analytics can continue separately under general usage consent. Past records remain linked; signing out or selecting this option does not unlink them. Unlinked request events cannot support cross-request funnels or automatic account-based historical deletion. Prompt text itself may identify a person: unlinking is not anonymization.
49
-
50
- ## Service providers
51
-
52
- | Provider | Role |
53
- | --- | --- |
54
- | Cloudflare | Hosts Scout, handles requests and rate limits, holds the public model catalogue, and coordinates analytics preferences, webhook receipts and deletion state. |
55
- | OpenAI | Processes task descriptions and related public evidence for interpretation, matching and query embeddings. Its API retention policies apply; Scout does not promise zero retention by OpenAI. |
56
- | Clerk, Google and GitHub | Provide authentication and account/session handling. Google or GitHub is contacted according to the sign-in method you choose. |
57
- | PostHog | Stores optional product/account analytics, recommendation diagnostics and separately enabled prompt content. Scout uses PostHog's EU ingestion endpoint; this is not a claim that every provider processes data only in the EU. |
58
-
59
- Scout's twice-daily research uses Parallel and public model/benchmark sources. Visitor prompts are not sent to Parallel, benchmark publishers or the recommended-model providers as part of that research. Opening a provider link takes you to a separate service under its own policies.
25
+ Turning sharing off stops future optional collection. It does not stop required processing or delete stored data.
60
26
 
61
27
  ## Storage and retention
62
28
 
63
- Submitting a task is not a zero-storage operation, even with analytics disabled:
64
-
65
- - **In your browser:** Scout temporarily keeps a prompt draft in tab storage during sign-in. Analytics preferences use local storage; anonymous visit/session-transition markers use tab storage when analytics is enabled. Clerk manages authentication storage separately.
66
- - **Search cache:** Scout temporarily keeps exact tasks and results in server memory for reuse. Cached results are eligible for reuse for 30 seconds. Expired entries are removed on subsequent cache access or when the instance ends; this is not a guarantee of physical erasure at exactly 30 seconds.
67
- - **PostHog:** Content uses the provider's [AI event retention policy](https://posthog.com/docs/ai-observability/data-retention): large AI properties including `$ai_input_state` are stored in `posthog.ai_events` for 30 days and stripped from normal events at ingestion. Metadata remains under normal event retention. Storage separation and the 30-day setting have been checked with synthetic data; actual expiry and backup erasure have not been independently verified. Historical v3 `scout_search_details` may still contain content outside those AI properties. There is no custom retention cron or content export, and no claim of retroactive deletion. Other events and profiles remain subject to applicable retention/deletion settings. Disabling sharing is not a deletion request.
68
- - **Account synchronization:** Cloudflare retains preference state and pseudonymous delivery/deletion records, not a second copy of your name, email or prompts. Pending lifecycle events without a known preference are bounded and expire after seven days. Deletion tombstones are retained to prevent delayed events from recreating an account's analytics.
69
- - **Historical records:** Before the 22 October 2026 consolidation, Scout stored prompts and recommendation evidence in a private Cloudflare Analytics Engine archive. New writes have stopped. That archive follows Cloudflare's three-month retention, may contain unredacted personal information, and is not automatically erased by the PostHog account-deletion flow.
70
-
71
- OpenAI, Clerk and other providers have their own retention and security policies. A change to Scout's analytics settings does not change those policies. Restrict analytics access to authorized personnel with a product evaluation/debugging need; Scout does not expose a public search-history endpoint. The processors above receive data: this is not a “no third party” service.
72
-
73
- ## Data questions and deletion requests
74
-
75
- Contact [lazim@openmerit.ai](mailto:lazim@openmerit.ai) for data questions or to request access, correction or deletion. Include the account email and approximate dates, but do not send passwords, session tokens or sensitive prompt content. We may need to verify account ownership before acting. The rights and obligations that apply depend on your location and circumstances.
29
+ - Your browser stores sign-in information, sharing preferences and temporary task drafts.
30
+ - Task data and results may be stored temporarily even with analytics off: short-lived results for 30 seconds and completed-search processing data for seven days. Expiry is not a guarantee of immediate erasure.
31
+ - Newly shared task content has a 30-day analytics retention window. Other analytics and account records may remain longer under provider settings. Backup erasure has not been independently verified.
32
+ - Older task records may fall outside that 30-day policy. A discontinued archive follows a three-month retention period and is not automatically covered by account deletion.
33
+ - We retain access and privacy-preference records as needed to operate the service and honor opt-outs and deletion requests.
76
34
 
77
- Deleting a Clerk account triggers a request to delete its linked PostHog profile and events. Deletion is asynchronous, and Scout repeats reconciliation to catch delayed deliveries; an accepted request is not proof that erasure has finished. Unlinked anonymous events and the historical Cloudflare archive are not automatically covered. Clearing a current profile field also does not remove it from older events. Contact us when a request needs review beyond the account-deletion flow.
35
+ ## Contact and deletion
78
36
 
79
- ## Changes during beta
37
+ For data access, correction or deletion, contact [lazim@openmerit.ai](mailto:lazim@openmerit.ai). We may verify account ownership. Do not send passwords or sensitive task content.
80
38
 
81
- We will update this page when data handling changes and identify the revision date. This notice does not itself override an existing opt-out or guarantee a fixed erasure deadline. Privacy settings remain available before and after submitting a task.
39
+ Account deletion requests deletion of linked analytics. Erasure is asynchronous; unlinked activity and historical records may require separate review. Turning off sharing does not delete past data. Your rights depend on applicable law.
package/docs/scout.md CHANGED
@@ -1,16 +1,92 @@
1
1
  # Scout by OpenMerit
2
2
 
3
- Describe what you need a model to do. Scout returns up to five model-and-endpoint candidates per task. Comparable measurements support performance ranking; narrow decision and vision tasks use an explicitly labelled task-fit shortlist when quality is unmeasured. The `/scout/` page and JSON API use the same index and ranking.
3
+ Scout is OpenMerit's model search agent. Describe your task and get model recommendations. Scout returns up to five model-and-endpoint candidates per task. Comparable measurements support performance ranking; narrow decision and vision tasks use an explicitly labelled task-fit shortlist when quality is unmeasured. The `/scout/` page and JSON API use the same index and ranking.
4
4
 
5
5
  Scout is a separate hosted beta product. Npm 0.1.7 includes optional Claude Code setup for it; the hosted service does not change the Pi coordinator or Inference Terminal. Recommendations are evidence-based candidates for your own evaluation, not a guarantee of task accuracy or an independently validated state-of-the-art ranking.
6
6
 
7
7
  **Website rebuild — published 24 October 2026:** the rebuild preserves the existing landing page at `/` and Scout at `/scout/`, and takes all hosted `/docs/` pages offline, including this guide. `/connect/`, the JSON API/MCP and the standalone `/scout/data-policy/` remain available. The guide remains maintained in Markdown; this does not remove the local CLI or its documentation from the package. See the [cutover notes](site-domain-migration.md) for publication and verification details.
8
8
 
9
+ **Small-screen handoff — source only, not deployed:** below 768 CSS pixels, the Scout page replaces its search interface with a note from Lazim asking visitors to use a larger screen. **Share link** attempts to copy the public Scout URL and opens the device’s native share sheet where supported. If clipboard access fails, the visible URL can be copied manually. At 768 CSS pixels and above, including full-width iPad layouts, the search interface remains available. This does not change JSON API or MCP access.
10
+
9
11
  **Coding-agent setup — 24 October 2026:** stable npm 0.1.7 includes [device sign-in setup](#connect-a-coding-agent). Hosted Scout serves `/connect` and `/scout/mcp`; the button opens Claude Desktop with a setup prompt. This supersedes the 23 October web-placeholder reset. Existing older client configuration and authorization grants are not automatically removed or revoked. Scout serving, main-site documentation and npm publication remain separate releases; dated receipts below describe their original versions, not acceptance of every later build.
10
12
 
13
+ **Session restoration — unreleased source:** onboarding stays hidden while sign-in is checked, so returning signed-in visitors do not see the introduction flash on reload or reopening. Chat remains locked until an active session is confirmed. Signed-out visitors and failed checks reveal the introduction with sign-in still available; signing out restores it. No saved tour-completion flag grants access. This is not yet deployed and changes no homepage FAQ claim.
14
+
15
+ **Product wording — unreleased source:** the homepage, Scout page, onboarding and search/social descriptions call Scout “OpenMerit's model search agent,” with “model search” as the shorthand and “Find the right AI models for your task” as its promise. “Model recommendations” describes its output; the web and coding agents are access channels, not separate product categories. This copy is not yet deployed. Dated receipts below retain the wording and behavior of their original releases.
16
+
17
+ ## Five-step introduction modal — deployed, 28 October 2026
18
+
19
+ **Deployment receipt:** the owner approved commit, push and deployment. [PR #28](https://github.com/laz-aslam/openmerit/pull/28) merged as [a70103a](https://github.com/laz-aslam/openmerit/commit/a70103a1c8eb8a701ee262106ae6e6c026cf04b4). All PR and merged-commit CI checks passed. The guarded Scout-serving deploy moved `openmerit-scout-alpha` from `2cf2c2d3-8aef-40f0-9c44-800bcab247bf` to `17ab0166-9a5c-43e9-932b-c13bee040db7` at 20:45 UTC. Live Scout HTML, chat/auth/onboarding JavaScript, styles and Claude screenshot matched the release build. `/` and `/connect/` stayed byte-identical; other Workers were not redeployed. The catalogue remained healthy on snapshot `588855a0bf28212fad48a9513dbf3d5b`.
20
+
21
+ Live Chrome desktop/mobile and WebKit mobile checks covered all five slides, locked future navigation, revisiting reached slides, real Google/GitHub sign-in controls with optional analytics blocked, dismissal keeping the page inert, signed-out reload returning to slide one and zero agent turns during the tour. Browser checks with simulated sign-in/replies covered all three example tasks, exact submitted messages, single submission after double activation, keyboard activation and New restoring examples; auth fixtures covered resumption after sign-in. Completed production OAuth, an authenticated production recommendation, native Claude installation and physical-phone behavior remain unverified.
22
+
23
+ Signed-out visitors see a five-step introduction modal over the actual Scout page, with the page dimmed and softly blurred behind it. The first is a personal note signed by Lazim and Praveen: Scout is OpenMerit's model discovery product in early beta, and feedback on what is useful, confusing or could improve is welcome. This is a text-only note, not a feedback form or a new feedback channel. The second introduces Scout with bundled lab/Hub marks and coverage from the same optional status request as the page: indexed models, benchmarked labs, benchmarks and distinct source-feed IDs. Hub repositories appear separately because they can overlap the catalogue. Labs count model publishers with benchmark results, not every inference host; source feeds include research records, not distinct organizations. Failed or invalid status responses leave a general coverage description, never fabricated counts, and do not block the tour or sign-in.
24
+
25
+ The third explains that Scout recommends rather than routes or resells inference tokens. Its illustration separates a recommendation from the visitor's app → provider/router → model runtime path. Recommendations can be constrained to the public endpoint inventory supplied through the [coding-agent project configuration](#using-scout-from-the-agent) or API; the slide does not import accounts, collect provider keys, connect endpoints or introduce a web configuration form. The fourth explains the task-to-shortlist workflow with an illustrative conversation; its model order, quality estimates and prices are example values, not a live recommendation or measured task accuracy. The fifth explains the optional Claude Code integration and shows cropped excerpts of an actual session, mentioning MCP, API and CLI availability. Its historical model recommendation is not a recommendation for the current visitor. The full-size capture opens separately. Viewing any step does not submit a task, run inference, install Scout or launch Claude.
26
+
27
+ **Continue** advances through the first four steps; **Get started** on the fifth opens the existing Google/GitHub sign-in flow above the introduction. The five progress controls revisit only slides already reached through Continue; future slides are disabled and excluded from keyboard navigation. Going back preserves access to all reached slides, including those ahead of the current slide, for the current page visit. There is no separate back button. The modal has no separate header sign-in or footer navigation, and the conversation/Claude previews have no supplementary captions. The conversation preview's title bar uses decorative red/yellow/green window lights instead of the Scout wordmark and example label; these do not close, minimize or maximize the modal. Its accessible image description still identifies the values as illustrative. The underlying page stays visible but inert until Clerk reports an active session, including after an OAuth return; a dismissed, failed or pending sign-in never enables it. The introduction cannot be dismissed to bypass this gate. Successful onboarding sign-in dismisses the introduction and focuses chat without automatically sending the example. Existing explicit draft-submission resumption remains separate. Returning active sessions bypass the introduction. Signing out restores the modal and makes the page inert again.
28
+
29
+ Tour progress stays in page memory: signed-out reloads and new page visits start at the first slide, even after opening or dismissing sign-in. The tour does not read or write a completion marker; old `scout-onboarding-v1` markers are ignored. Reloading with an active authenticated session still bypasses the introduction. Blocked storage does not prevent navigation or sign-in. Privacy controls and the data policy remain directly accessible without authentication at `/scout/privacy/` and `/scout/data-policy/`; their links stay in the main page footer, not the modal. No onboarding-specific analytics event is added; existing page/sign-in analytics and preferences remain effective.
30
+
31
+ After sign-in, the empty chat shows three task examples under **Try these**: support-ticket summarization, invoice extraction and product-photo classification. Selecting one immediately submits that task through the normal composer/auth flow and starts a conversation; no separate Send action is needed. If the session has expired, the task stays as a draft while sign-in opens and resumes through the existing authenticated-submit flow. The examples disappear when the first conversation turn appears; **New** clears the conversation and shows them again. They remain inside the chat surface, above the fixed composer, and cannot bypass the onboarding/auth gate. The homepage makes no affected example-task claim and needs no FAQ change.
32
+
33
+ Pointer navigation uses a short, non-looping opacity/position transition. Keyboard navigation and reduced motion change steps without movement. Keyboard focus stays inside the introduction, yielding to the sign-in modal while it is open. On narrow and short screens, the introduction scrolls within its rounded panel; the underlying page does not scroll. The homepage makes no affected onboarding or sign-in claim and needs no FAQ copy change.
34
+
35
+ Design references: [Linear's welcome screen](https://mobbin.com/screens/62773d0f-3574-4191-ac91-eb8a51697a95), [Linear's onboarding flow](https://mobbin.com/flows/cbaf58a9-fd84-4afe-b214-e65b24484013), [Notion's focused setup screen](https://mobbin.com/screens/99396b7b-c21d-4cea-8956-4942c2b9aae6), [Neon's integration walkthrough](https://mobbin.com/screens/8b8b58fe-86fd-4a2a-a5ad-51b84614d7b2), and [Torph's text-continuity examples](https://torph.lochie.me/). The implementation keeps Scout's own graphite palette and system typography; it does not embed Mobbin or generated mockup assets or add an animation dependency. The Claude Code image comes from the owner's 24 October recorded session: two unaltered content crops of `claude-automatic-expanded-full.png`, `(1330, 1029)–(2810, 1103)` and `(1330, 1552)–(2810, 1770)`, stacked with a 42-pixel neutral gap and encoded as WebP. OS chrome, account information and unrelated session content are excluded.
36
+
37
+ ## Every model kind in the agent — source only, not deployed
38
+
39
+ This describes source changes that are not yet published or deployed. Until both the publisher and the serving Worker are deployed and a refresh has published a new catalogue version, the agent behaves as described in the next section.
40
+
41
+ Each published catalogue version will include every model in the merged catalogue, not only chat models: embedding, rerank, image, video, speech (text to speech), transcription (speech to text), decision, OCR, moderation, 3D and music models, plus models whose kind is unknown. Each model carries its kind, input and output modalities, context window, release date, open-weights status and up to 16 catalogue routes with their current base-tier prices. Models also carry their linked leaderboard results from the media, speech, decision and embedding leaderboards Scout imports (Arena, Artificial Analysis, TTS Arena, Open ASR, 3D Arena, VBench, MMEB and others), and from MTEB's final leaderboards: metric, whether higher or lower is better, score, rank out of every result on that leaderboard version, leaderboard version, date and source. Chat models keep Scout's reviewed routes and benchmark results unchanged. The agent reads only this published copy, so a refresh that is still running never changes what one conversation sees between search and the shortlist check.
42
+
43
+ The agent's tools change as follows:
44
+
45
+ - **search_catalogue** (new) searches models, benchmarks and leaderboards by free text. By default it combines keyword (BM25) and embedding results by reciprocal rank fusion; it can also use either alone, and filter by result type and model kind. Each result names the field that matched. Without embeddings (no OpenAI key, an embedding error, or a catalogue version published without them) it returns keyword results and says so. Its queries, written by the agent from your task, are embedded with OpenAI, as benchmark search already does.
46
+ - **search_models** filters by model kind and reports the cheapest eligible price in each unit a model is billed in: per million tokens, per image, per second of audio or video, per million characters, per page or per request. Sorting by price compares one unit only (by default the usual unit for the requested kind, otherwise tokens); models not billed in that unit follow, unsorted. A route that lists only zero prices, such as a local runtime or a free tier, is not counted as a price.
47
+ - **get_model_details** and **benchmark_leaderboard** include leaderboard results, and leaderboard IDs work wherever benchmark IDs do.
48
+ - **submit_recommendation** accepts models of any kind. Fewer than five are accepted only when fewer models meet the stated hard constraints, which can now include the model kind. The per-task workload is given in billing units (input and output tokens, images, seconds of audio or video, characters, pages, requests) and cost per 1,000 tasks is computed from catalogue prices on the eligible route that prices most of the workload, then the cheapest. Quantities the route does not price are listed, and such a partial cost never leads on cost. Citations must be the model's own benchmark or leaderboard results.
49
+
50
+ In the shortlist, the Input and Output columns keep per-million-token prices; a model billed in another unit shows that unit's price there instead, marked with its unit, and the expanded model shows the estimated cost per 1,000 tasks. Known limitations: per-second audio prices apply to audio seconds, but audio billed in tokens must be estimated as tokens; image prices are per generated image; prices are base-tier list prices from catalogue sources and can be wrong at the source.
51
+
52
+ ## Conversational Scout agent replaces the search page — deployed, 28 October 2026
53
+
54
+ **Deployment receipt:** the owner approved the commit, push and Scout serving deployment. [PR #26](https://github.com/laz-aslam/openmerit/pull/26) merged as [332dda3](https://github.com/laz-aslam/openmerit/commit/332dda3d889a2da386f2d0bb59e60cc5170d29ce). After all PR and merged-commit CI checks passed, the guarded deployment wrapper moved `openmerit-scout-alpha` from `88e33d4c-4606-4eb1-be27-36a2b05309ff` to `2cf2c2d3-8aef-40f0-9c44-800bcab247bf` at 14:38 UTC (18:38 Dubai). The deployed Scout HTML, JavaScript, stylesheet and auth module matched the local release build. `/` and `/connect/` remained byte-identical; the publisher, router, terminal and memo service were not redeployed. The catalogue stayed healthy on snapshot `588855a0bf28212fad48a9513dbf3d5b`. Live desktop/mobile checks opened the real Google/GitHub sign-in controls with optional analytics blocked, preserved the task on dismissal and sent no agent turn before authentication. Mobile scroll checks reached the full-height chat before the footer. Completed OAuth, an authenticated production recommendation, native Claude installation and physical-phone keyboard behavior remain unverified. CI's first merged-commit attempt failed an existing assertion that mistook `900` inside random UUIDs for leaked error data; the failed jobs passed on retry without changing that test.
55
+
56
+ **Claude Code action — deployed, 28 October 2026:** **Add to Claude Code**, with the existing Claude icon, sits below the intro's coverage counts. It restores the secret-free setup handoff described [below](#connect-a-coding-agent): copying and requesting the prefilled Claude link happen independently, without waiting for clipboard permission or requiring a chat sign-in. Feedback appears below the button and distinguishes a copied prompt from a requested launch; neither proves installation. Current task text is never included. DNT/GPC, saved usage refusals and account unlinking propagate into the installer command. A fresh setup ID is included only when browser usage collection and account linking are both enabled; blocked optional analytics does not manufacture a saved installer opt-out or prevent the handoff. On stacked screens, the intro and setup feedback scroll above the full-height chat. Browser-platform fixtures cover prompt/deep-link equivalence, privacy and failure handling; native Claude launch and completed installation remain unverified.
57
+
58
+ **Header wordmark — deployed, 28 October 2026:** Scout uses the footer OpenMerit wordmark's 18px size, 550 weight and tight letter spacing, rendered lowercase. The **New** label aligns with the header divider's right end while retaining the button's padding; account controls precede it when present. Sign-in, account access and conversation reset are unchanged.
59
+
60
+ **Chat surface and footer — deployed, 28 October 2026:** the conversation and composer share a subtle theme-aware surface with no outline. Spacing separates responses and task-brief fields without horizontal dividers; the model comparison header also has no divider. Continue is the task brief's only action, using a compact filled button with no explanatory line below it. Buttons are 32 CSS pixels high for mouse input and at least 44 pixels when a coarse pointer is available. Scout responses show the OpenMerit icon beside their Scout label; user messages keep their You label. The OpenMerit home logo sits at the footer's right edge. Data policy, Privacy & analytics, then Scout by OpenMerit stay vertically stacked at its left edge with the same spacing. Link destinations and privacy controls are unchanged.
61
+
62
+ **Viewport layout — deployed, 28 October 2026:** above 900 CSS pixels, navigation, title/description/coverage and footer form a left column; the chat fills the right column's height, with its composer at the bottom and its conversation scrolling independently. At 900 pixels and below, navigation and intro scroll above a chat section that occupies the full dynamic viewport height. Native page scroll snapping stops at the chat's top; its transcript scrolls inside it while the composer stays at the bottom. Scrolling beyond the transcript's end can continue down the page to the footer, the only section below the chat. Focus the conversation to scroll with the keyboard, including long briefs and expanded model details. **New** stays in navigation instead of taking up a transcript row: a compact borderless button with a plus icon, labelled “New conversation” for assistive technology and in its tooltip. The intro and composer compact on short screens, and long drafts scroll inside a height-limited input instead of taking over the conversation. Touch-input text is at least 16 pixels to avoid focus zoom; safe-area padding protects the full-height chat's top and composer. Mobile viewport height follows browser chrome, with keyboard-driven layout resizing where the browser supports it. Physical-phone scrolling and keyboard behavior remain unverified.
63
+
64
+ **Intro coverage — deployed, 28 October 2026:** the heading reads “Find the best AI models for your work.” A small overlapping lab/Hugging Face icon stack sits above live coverage from the public status endpoint. The counts distinguish catalogue models (`availableModels`), Hub repositories (`specialistRepositories`), labs with benchmark results (`providers`), indexed benchmark series (`benchmarks`, including descriptions without results), and distinct source-feed IDs (including retained research records, not unique organizations). Catalogue models and Hub repositories may overlap and are not added into a unique total. If status is unavailable, counts stay hidden without blocking sign-in or sending. These are catalogue coverage counts, not proof of task performance or an optimal recommendation. The homepage makes no affected coverage claim and needs no copy change.
65
+
66
+ The conversational agent is the Scout page at `/scout/`, replacing the search box and its results table. The page stays open to everyone; sending a message requires sign-in, as searching did, and a message typed while signed out is kept while you sign in. The JSON search API (`/scout/api/recommend`), the MCP server (`/scout/mcp`), coding-agent setup at `/connect/` and the catalogue refresh are unchanged, so the CLI and installed coding agents keep their current behaviour. Sections below that describe the search page's prompt examples, results table and loading messages are historical; the Claude Code setup handoff remains available in the new page.
67
+
68
+ You describe the work; Scout writes a task brief with five components (input, work, output, criteria and constraints), each marked stated, assumed or missing. Each component is editable in place: correct anything Scout got wrong, or fill in a missing one. All five fields share the same editable background, including Work; the page does not show per-component question text. Once sent, the brief collapses. **Continue** sends only the components you changed and requests recommendations immediately, using stated assumptions for missing details. It also works without edits; there is no separate Skip questions button. Pressing Enter in a brief field does the same; Shift+Enter adds a line break. The message box stays at the bottom of the page. Each turn ends with an editable brief or a shortlist of five models, followed by Scout's summary. While a turn runs, its steps are listed with the current one last; afterwards they stay as a collapsed record of the work. The shortlist reports Scout's 0–100 quality estimate with the cited benchmark ranks, input and output prices per million tokens on its cheapest eligible route and release date. Expanding a model shows its rationale, benchmark ranks, route and reference latency. A missing release date is shown as unknown. Reply in the same conversation to change constraints or trade-offs; **New** starts over.
69
+
70
+ The agent runs in a Cloudflare Durable Object, one per conversation, using Pi Durable and the Agents SDK. Its model is set by `SCOUT_AGENT_MODEL`: `openai/<model>` calls OpenAI's Responses API directly with the Worker's `OPENAI_API_KEY` (default `openai/gpt-6-sol`), and any other value runs on Workers AI, such as `@cf/zai-org/glm-5.3`. Its tools search benchmark descriptions by embedding (OpenAI embeddings, as in search), read leaderboards and model records from the published catalogue, and use Workers AI web search when the catalogue cannot answer something decisive. Cost, latency and recency figures come from catalogue data, not from the model's text, and a shortlist that cites models or benchmarks outside the catalogue, or breaks a stated hard constraint, is rejected and resubmitted. A turn usually takes one to three minutes.
71
+
72
+ The page uses the same sign-in and rate limits as search:
73
+
74
+ - `POST /scout/api/agent` with `{"message": "…"}` starts a conversation and runs one turn. Continue it with `conversationId` plus `message`, `brief` (the edited components, such as `{"constraints": "Open weights only"}`; an empty string removes one) and/or `skip: true`. A client may supply its own UUID as `conversationId` with the first message.
75
+ - `GET /scout/api/agent/<conversationId>` returns `busy`, the turn's `progress` steps and its latest `answer`. The page polls it while a turn runs and reads the answer from it if the POST connection drops.
76
+
77
+ Conversations are keyed by the signed-in account, so one account cannot read another's. The conversation transcript is stored in its Durable Object with no expiry yet. With the default `openai/gpt-6-sol` agent model (not yet deployed), the task text and the conversation reach OpenAI, which also embeds benchmark and catalogue searches; web search runs on Workers AI. Before that change, the task text reached Workers AI and, for benchmark search, OpenAI. The [beta data policy](/scout/data-policy/) still needs updating to describe conversation storage. The deployed serving configuration includes the `SCOUT_AGENT` Durable Object (migration `agent-1`), the Workers AI binding and `nodejs_compat`.
78
+
79
+ ## Repeatable searches and task-specific evidence first — deployed, 27 October 2026
80
+
81
+ **Repeatable results.** Scout's interpretation and evidence checks are AI calls whose answers vary between attempts, so an identical search could return a different shortlist: across 34 test cases run three times, repeats shared only 34–39% of their top five. A completed search now records each AI answer it received. For seven days, an identical search (same prompt, model/endpoint scope, catalogue generation, interpreter version and UTC day) replays those answers instead of asking again, so it returns the same shortlist. Failed or degraded searches record nothing. A new catalogue generation, interpreter version or day asks again. See [the data policy](/scout/data-policy/) for how the answers are stored. Relative dates in restrictions now resolve against the UTC day rather than the exact time. Interpreter version is 40.
82
+
83
+ **Task-specific evidence first.** When some candidates in the quality band have a score on a benchmark of the task itself (direct evidence), they are ranked and labelled strongest, best value and fastest among themselves first. A model estimated only from general benchmarks can no longer outrank them or remove them as dominated; it can still fill a remaining place, and a warning names it. The same applies to domain evidence when no direct benchmark was accepted. For example, a model with only a high general score no longer leads a medical coding search above models measured on MedCode.
84
+
85
+ The evidence assessment call now allows one retry within the search deadline (up to four seconds instead of 1.8), because a single slow answer previously failed the whole search.
86
+
11
87
  ## Twice-daily catalogue refresh — deployed, 25 October 2026
12
88
 
13
- The hosted catalogue publisher refreshes twice a day, at 00:07 and 12:07 UTC (05:37 and 17:37 IST), instead of hourly. Each run is unchanged: the same feeds, discovery pages, up to 24 Parallel research jobs and the same publication checks. Daily paid research therefore drops from at most 576 to at most 48 jobs, and Hugging Face discovery pages advance twelve times more slowly. Public feeds are reported stale 13 hours after their last successful check, which is one missed run plus an hour's grace. A single failed run can therefore leave up to roughly a day between source checks. The local `npm run scout` preview still refreshes its bundled feeds hourly. The owner-approved publisher and serving deployments went live on 25 October 2026 at 17:00 UTC.
89
+ The hosted catalogue publisher refreshes twice a day, at 00:07 and 12:07 UTC (05:37 and 17:37 IST), instead of hourly. Each run reads the structured feeds and the D1 catalogue and applies the same publication checks. Since 26 October 2026 it no longer runs Parallel research jobs or the Hugging Face recently-modified listing discovery that fed them. Their 234 discovered benchmarks had no model results; the descriptions they collected are kept and are not refreshed, so they never mark the catalogue stale. Public feeds are reported stale 13 hours after their last successful check, which is one missed run plus an hour's grace. A single failed run can therefore leave up to roughly a day between source checks. The local `npm run scout` preview still refreshes its bundled feeds hourly. The owner-approved publisher and serving deployments went live on 25 October 2026 at 17:00 UTC.
14
90
 
15
91
  ## Beta evaluation logging — 22 October 2026 rollout
16
92
 
@@ -123,6 +199,10 @@ Hosted Scout uses Clerk authentication for **Google and GitHub only**, without C
123
199
 
124
200
  The page and index status remain public. **Sign in** opens Clerk's account UI; submitting a task while signed out opens that same flow without invoking matching. A prompt draft is temporarily kept in this tab's `sessionStorage` to survive the OAuth redirect, then removed on return or successful sign-in. Storage-disabled browsers can sign in but may lose their draft during the redirect. Signing out or changing accounts clears the visible prompt/results and cancels the browser's pending request; it does not guarantee cancellation of provider work already accepted by the server.
125
201
 
202
+ **Sign-in correction — deployed, 28 October 2026:** optional analytics downloads no longer block the conversational page's sign-in or submit handlers. Failed authentication initialization now displays an on-page error without clearing the task or starting an agent turn. Auth configuration and client initialization have 15-second limits; a sign-in modal that fails to render its controls within 30 seconds closes with a reload instruction. Closing a fully rendered modal does not count as an authentication error. Live desktop/mobile checks confirmed that the real Google/GitHub controls open with analytics blocked and preserve the draft on dismissal; these checks do not establish completed OAuth or an authenticated production conversation.
203
+
204
+ Submitting a task while signed out resumes that task automatically once an active session is available, including after a same-tab OAuth return. A separate temporary submission marker contains the submitted task in this tab's `sessionStorage` and is consumed before resuming, so session updates and later reloads do not replay it. Header **Sign in** only restores the draft; it does not submit it. Editing the draft or dismissing sign-in with its close button, backdrop or Escape cancels automatic submission. With storage disabled, same-page sign-in can resume in memory, but redirect return cannot restore the task or submission intent. These cases have simulated-session coverage, not proof of completed provider OAuth.
205
+
126
206
  The Worker verifies Clerk session tokens before catalogue access for both `/scout/api/recommend` and `/scout/mcp`, including MCP discovery. Requests must send `Authorization: Bearer <session token>`; a cookie alone is not enough. Signature, expiry, issuer and authorized-party validation use Clerk's SDK, and pending sessions cannot search. Missing/invalid credentials return HTTP 401; missing server configuration returns 503 rather than enabling anonymous access. Status and `/scout/api/auth` remain public; the latter exposes only the publishable key and frontend API hostname. The secret key never reaches the browser.
127
207
 
128
208
  For an authenticated development/API check, obtain a current token from `await window.Clerk.session.getToken()` in your own signed-in browser. Treat it as a credential, do not share it, and set it privately as `SCOUT_TOKEN`. Then send:
@@ -201,7 +281,7 @@ Similar tasks can still receive identical shortlists when one benchmark is their
201
281
 
202
282
  This change replaces the cost-first policy below. Quality screening previously compared a model only with models that had exactly the same set of accepted benchmarks. That split the catalogue into many two- or three-model groups, so the best of a small, weak group passed the screen and cost-first ordering promoted it.
203
283
 
204
- Scout now fits **one latent quality estimate across every connected evaluation** for the task. Each benchmark has its own difficulty offset, score scale and noise, so a near-zero benchmark and a widely spread one contribute on comparable terms. Correlated series in one benchmark family share that family's weight. Each model receives an estimate with a standard error; a benchmark run by only one model links nothing. Applicable calibration observations join as one further evaluation using effective quality. Models with no evidence connected to the main group receive no estimate and remain provisional; they are never compared numerically. The estimate is reported as `comparison.qualityEstimate` and `comparison.qualityStandardError`; `quality` is its relative percentile among the estimated models.
284
+ Scout now fits **one latent quality estimate across every connected evaluation** for the task. Each benchmark has its own difficulty offset, score scale and noise, so a near-zero benchmark and a widely spread one contribute on comparable terms. Correlated series in one benchmark family share that family's weight. Copies of one evaluation from different publishers, such as GPQA Diamond reported by Epoch AI, Artificial Analysis and model developers, form one family and count as one evaluation; their scores stay separate series. Evidence from the task's own domain carries at least three quarters of the weight when present, and evidence that scores the task's own kind of work counts twice as much as other domain evidence. General proxies fill in the rest and connect models that lack domain results. Each model receives an estimate with a standard error; a benchmark run by only one model links nothing. Applicable calibration observations join as one further evaluation using effective quality. Models with no evidence connected to the main group receive no estimate and remain provisional; they are never compared numerically. The estimate is reported as `comparison.qualityEstimate` and `comparison.qualityStandardError`; `quality` is its relative percentile among the estimated models.
205
285
 
206
286
  A configuration qualifies when it is not credibly worse than the strongest estimate: within two points plus one combined standard error. Supported Pareto selection over quality, reference cost and reference time follows. A balanced search keeps the strongest, lowest-known-cost and fastest frontier points, labelled in `pick` as `quality`, `value` and `speed`, then orders by estimated quality. An explicit `quality`, `cost` or `latency` priority orders the frontier accordingly. At most two models per provider are selected while other qualifying models remain; the cap never leaves a supported place empty. `ranking.version` is `10`, and `ranking.frontier` reports `version: 4`, the priority, the number of estimated models and benchmarks, and the tolerance.
207
287
 
@@ -267,9 +347,9 @@ The collection changes below remain **unreleased**; alpha reads the existing sta
267
347
 
268
348
  Research requests cited lifecycle/expiry information, capability updates, deployment regions, fine-tuning scope and documented hardware requirements. Standard rates remain separate from promotional offers, subsidies and expiry conditions. Editorial claims supply leads rather than numerical benchmark observations. Provider-specific facts must retain their scope; OpenRouter expiry is stored on its route rather than on every deployment of a model. Unknown or unsupported facts remain unavailable. No new paid collection run has validated this expanded coverage yet.
269
349
 
270
- OpenAI receives the submitted request for decomposition and derived work descriptions for interpretation and embedding. Parallel receives only public research subjects. Private hosted analytics records each model role separately with the original prompt, role position and allowlisted supporting evidence; the existing sampled three-month retention applies. Do not put secrets or personal information into prompts. Keys stay server-side.
350
+ OpenAI receives the submitted request for decomposition and derived work descriptions for interpretation and embedding. Private hosted analytics records each model role separately with the original prompt, role position and allowlisted supporting evidence; the existing sampled three-month retention applies. Do not put secrets or personal information into prompts. Keys stay server-side.
271
351
 
272
- For development, `npm run scout` serves the page on port 45833 and requires `OPENAI_API_KEY` for matching. It refreshes structured feeds locally each hour; it does not run the hosted Parallel/R2/D1/Vectorize publication pipeline. Local evidence retrieval uses lexical matches and prepared memberships without a Vectorize binding. Production-like validation needs an isolated Worker with the storage bindings and both `OPENAI_API_KEY` and `PARALLEL_API_KEY`. Never put their values in browser assets, Git or a chat message.
352
+ For development, `npm run scout` serves the page on port 45833 and requires `OPENAI_API_KEY` for matching. It refreshes structured feeds locally each hour; it does not run the hosted R2/D1/Vectorize publication pipeline. Local evidence retrieval uses lexical matches and prepared memberships without a Vectorize binding. Production-like validation needs an isolated Worker with the storage bindings and `OPENAI_API_KEY`. Never put its value in browser assets, Git or a chat message.
273
353
 
274
354
  ## Evidence architecture — hosted beta, 16 October 2026
275
355
 
@@ -285,7 +365,7 @@ Scout separates semantic interpretation from exact metadata checks and numerical
285
365
  | Evidence retrieval | A query embedding retrieves benchmark methodology, supplemented by hourly capability memberships. Semantic similarity supplies evidence candidates, never a model's score. |
286
366
  | Selection | All eligible verified catalogue models are considered before selecting up to five distinct models. One quality estimate spans connected evaluations; Pareto comparisons require known quality, cost and latency. |
287
367
 
288
- Mandatory restrictions use alternatives of complete condition groups. Soft preferences affect ordering, not eligibility. Relative dates use a supplied current UTC reference; arbitrary numeric bounds are retained, including impossible requirements. An unsupported mandatory condition cannot silently disappear. A no-match result describes the available verified catalogue and inventory, not every model in existence.
368
+ Mandatory restrictions use alternatives of complete condition groups. Soft preferences affect ordering, not eligibility. Relative dates use a supplied current UTC day; arbitrary numeric bounds are retained, including impossible requirements. An unsupported mandatory condition cannot silently disappear. A no-match result describes the available verified catalogue and inventory, not every model in existence.
289
369
 
290
370
  Quality remains a relative benchmark signal, not predicted accuracy on an arbitrary task. Correlated benchmark families are grouped. Incomplete or incomparable objectives remain provisional and cannot establish a global three-objective frontier. Narrow typed tasks can still use a task-fit shortlist with unknown quality. Comparable direct calibration observations supplement quality evidence without excluding other eligible models. Calibration episode charges and timing do not replace the common token-workload reference costs and endpoint-bound timing; unknown values remain unknown.
291
371
 
@@ -339,7 +419,7 @@ The hosted implementation keeps the existing task and format Decisions, exact me
339
419
 
340
420
  Hourly staging prepares content-addressed specialist packs alongside profile indexes. Searches select the same scoped profiles and use those packs instead of many repository reads. A version-checked derived pack index can also be prepared for an existing immutable catalogue without repeating research. Existing generations remain readable through the original shard path when no matching pack index is available. Source research and the hourly trigger are unchanged.
341
421
 
342
- Successful searches may be reused within a Worker isolate for up to 30 seconds, bounded to 32 entries and approximately 4 MiB. Exact prompt text, model/endpoint inventories, publication, interpretation version and UTC calendar date identify a cache entry. Cache hits preserve the original `evaluatedAt` time; date conditions remain evaluated as of that time for at most 30 seconds, and results are not reused across UTC midnight. Identical concurrent requests share computation. Errors and results missing a specialist or applicability check are not cached. This temporary memory cache adds no external prompt storage and is not semantic similarity caching.
422
+ Successful searches may be reused within a Worker isolate for up to 30 seconds, bounded to 32 entries and approximately 4 MiB. Exact prompt text, model/endpoint inventories, publication, interpretation version and UTC calendar date identify a cache entry. Cache hits preserve the original `evaluatedAt` time; date conditions remain evaluated as of that time for at most 30 seconds, and results are not reused across UTC midnight. Identical concurrent requests share computation. Errors and results missing a specialist or applicability check are not cached. This temporary memory cache is not semantic similarity caching. Since 26 October 2026, a separate seven-day answer cache in D1 replays the AI answers of an identical completed search; see the repeatable-searches section above.
343
423
 
344
424
  Private search records now include fixed stage durations, pending stages at a deadline, cache status and allowlisted provider status/error codes. They do not store raw errors, stack traces, headers or credentials. API results include `runtime` timings/cache status; cache hits report their current serving duration and zero new interpretation time. The page remains unchanged. A six-second matching deadline remains a reliability boundary; these changes do not establish a latency guarantee. The full repository release checks passed, including 318 Scout tests. An initial candidate timed out on books/posters; that failure was retained, and the interpretation was then reduced further. The revised semantic suite passed 17 of 17 cases, including cold repetitions and exact-cache reuse, and four final cold checks passed after the independent database reads were parallelized. These small samples do not establish a production percentile or a latency guarantee. Post-deployment HTTP/MCP checks passed five of five on their first attempts: supplied-label vision, creator restriction, impossible context, JSON invoice extraction through MCP and an exact repeat. Observed end-to-end durations were approximately 2.0–4.3 seconds for new searches and 146 ms for the repeated prompt served from the same isolate cache. The 127 UI source files and five live scripts/styles were unchanged. These are individual observations, not percentile guarantees.
345
425
 
@@ -410,7 +490,7 @@ Compatibility is eligibility, not predicted accuracy. Scout still enforces endpo
410
490
 
411
491
  Snapshot data version 7 prepares benchmark capabilities and correlated benchmark families with Decisions during the hourly refresh. It replaces benchmark-name regexes, manually assigned capability tags and the automatic reasoning fallback. Source adapters retain metric identifiers, score units and parsing contracts. Epoch descriptions and methodology are read from its published catalogue; Artificial Analysis and BFCL methodology are read from their public pages. Unavailable definitions remain explicit limitations, and names alone do not establish an opaque benchmark's capabilities.
412
492
 
413
- Each changed benchmark receives an isolated interpretation request so another benchmark's description cannot supply its capabilities. For shared publisher methodology, a preceding Decisions request selects the directly applicable definition for that benchmark and evaluated subset; unrelated sections are omitted from capability interpretation. Publisher-declared suite identities are retained as source facts; other family relationships are interpreted by Decisions. Capability choices and family references are validated, and positive choices below the existing 0.4 confidence threshold are not used. Family links group related evidence; numerical comparisons still require the exact same benchmark series. Unknown scopes receive no capability tags and cannot contribute capability-ranking evidence. This is semantic metadata interpretation, not a measurement of model quality or a guarantee that the classifications are correct.
493
+ Each changed benchmark receives an isolated interpretation request so another benchmark's description cannot supply its capabilities. For shared publisher methodology, a preceding Decisions request selects the directly applicable definition for that benchmark and evaluated subset; unrelated sections are omitted from capability interpretation. A section titled with the benchmark's own name, such as "GPQA Diamond" on Artificial Analysis's methodology page, is always kept and listed first, ahead of shared sections such as the Intelligence Index overview. The publisher's methodology is used even when an earlier research description exists. Publisher-declared suite identities are retained as source facts; other family relationships are interpreted by Decisions. Capability choices and family references are validated, and positive choices below the existing 0.4 confidence threshold are not used. Family links group related evidence; numerical comparisons still require the exact same benchmark series. Unknown scopes receive no capability tags and cannot contribute capability-ranking evidence. This is semantic metadata interpretation, not a measurement of model quality or a guarantee that the classifications are correct.
414
494
 
415
495
  Interpretations are cached by definition, relevant publisher methodology, family inventory and interpreter version. Score, model, price and collection-time changes alone do not invalidate that cache. Family inventory changes trigger rechecking its references. If an interpretation fails, unchanged cached records remain usable, affected new or changed series stay unclassified, and source failure status is exposed until a later refresh succeeds. A methodology download failure retains the prior methodology when available and marks its source degraded. There is no keyword fallback.
416
496
 
@@ -420,11 +500,21 @@ The initial deployed snapshot processed all 146 benchmark series: 136 have suppo
420
500
 
421
501
  ## Use Scout
422
502
 
503
+ **Source only, not deployed:** results use **Model Choices** in their count and no longer display rank numbers, the Rank column or the “Read left to right” instruction. The Assumptions & limitations disclosure, including its supplementary specialist list, is replaced with “Results could be wrong. Please verify before choosing a model.” Model evidence remains expandable; ranking, API evidence and the methodology documented here are unchanged. Feedback's reason selector and action buttons share a 40px height.
504
+
505
+ **Source only, not deployed:** the pending search state places rotating search messages in the results-title position, preceded by a tiny pulsing orb. It does not repeat the submitted prompt or show a separate loading heading. Reduced-motion preferences disable both the orb pulse and the 180ms opacity/3px message transition.
506
+
507
+ Loading messages describe search perspectives, not reported backend stages or completion percentages. Live timing starts at submission, including authentication and network wait, and freezes as **Took …s** when the response arrives. A cached response may legitimately be much faster. The existing 35-second request timeout still starts after authentication; replacing a search, signing out, completing or failing stops its loading updates.
508
+
509
+ **Source only, not deployed:** focusing the task field changes its background without drawing an outline around the input container. Keyboard focus outlines on buttons and links are unchanged.
510
+
511
+ **Source only, not deployed:** example prompts appear as rounded pills numbered 1, 2 and 3 beside **Try**, inside the bottom-left of the task field. They disappear as soon as the field contains any text, including whitespace, and return when it is cleared. Selecting a pill fills an editable draft without submitting it. The visible input-helper sentence is removed; Shift + Enter still adds a line. The Claude Code logo uses its existing transparent image without a white background in either theme.
512
+
423
513
  Open [Scout](https://openmerit.ai/scout/), type a task, and select the arrow button (**Find models**) or press Enter. For example: “I want to upload an invoice and get the invoice number, date, vendor, subtotal, tax, and total as JSON.” The task field grows and shrinks as you type or paste. Very long prompts scroll within the field once it reaches its height limit. Shift + Enter adds a line. When the field is empty and unfocused, its placeholder cycles through detailed example tasks every ten seconds with a brief fade. Rotation pauses while you type, while the field is focused, or while the page is hidden. With reduced motion enabled, the example stays still. Placeholders never fill the input or send a request. The heading shows live counts of API catalogue models, Hugging Face repositories, benchmark series and sources. API identities and Hub repositories are separate counts and can overlap; neither count promises a runnable endpoint for every entry. The evaluation guide remains available in the fixed bottom footer, with space reserved beneath the page content.
424
514
 
425
515
  The comparison table keeps recommendations in Scout rank order. Benchmark mode shows a relative quality signal and reference cost/time estimates. Applicable calibration contributes quality evidence within its recorded scope; its episode charges and timing do not replace the common reference workload. **Candidates to evaluate** denotes task-fit mode: quality is shown as unknown, alongside known reference costs and deployment requirements. When image separation is ambiguous, Scout first offers labels, bounding boxes or pixel masks/cutouts as output choices. **Assumptions & limitations** contains the sample size, workload and measurement limits. Neither mode executes your prompt. Click a model row to expand or collapse its details, beginning with its ID and followed by measured evidence, benchmark scores, evaluation configurations, separate input/output prices, and source links. With a keyboard, focus the model name and use Enter or Space. On narrow screens, scroll the table horizontally; the model column stays visible. Provider marks appear beside provider names, without icon tiles. They are bundled and served from the same origin; Hugging Face results resolve the repository publisher, using a known lab mark or its bundled organization avatar; otherwise a Hugging Face mark identifies the repository platform. Missing or failed marks leave the provider name visible. No third-party favicon service is contacted. The page follows the device’s light or dark appearance with the Inference Terminal’s compact typography and neutral surfaces. Complete JSON responses are available through the API. **JSON API**, **Capabilities**, and **Sources** expand beneath the search and results. **Sources** uses a compact list; expand a source for its coverage, methods, limits, collection times and refresh failures.
426
516
 
427
- The capability index lists each area with its benchmark-series and model counts. After a search, task matches appear first with a check mark. Counts describe index coverage, not the number of models eligible for your task. The source panel describes what each feed measures, its coverage, source dates, archived results, and limitations. Collection time is separate from source dates, which can be publication dates rather than measurement dates. Scout task calibration appears separately with its tested pool, scope and seven-day expiry.
517
+ **Source only, not deployed:** the Scout page no longer exposes the JSON API setup, capability index or source catalogue disclosures, including the header API link. Privacy & analytics has its own [settings page](/scout/privacy/), linked from Scout's footer alongside the data policy. The task-logging notice and sharing controls live on that page; existing choices are preserved, and the former settings fragment forwards there. This is a presentation change, not API access control: the JSON API, status endpoint and MCP remain available under their existing contracts, and recommendation rows retain their evidence links and limitations.
428
518
 
429
519
  **Provider page** in each model's evidence opens its provider's official pricing, model documentation, or website. Model links never fall back to a router. Each quote identifies its source: a router route, independent provider metadata, or a reviewed provider contract. Routes have separate prices. Self-hosted infrastructure cost and incomplete quotes remain unknown. Hugging Face deployment links open the publisher’s model repository and pinned card. Benchmark links lead to the original evaluation sources.
430
520
 
@@ -495,6 +585,8 @@ The agent compares model and endpoint, evidence, reference cost/time and unknown
495
585
 
496
586
  Version 0.1.10 adds default-on updates for the installed Scout skill and startup rule. **npm 0.1.9 does not contain the updater.** After 0.1.10 is published, existing installations need one explicit installer rerun in their original scope to acquire it. A website or Scout deployment cannot bootstrap files on someone else's machine. Compatible hosted Scout changes already reach agents through their next MCP request.
497
587
 
588
+ Version 0.1.11 also recognizes updater entry points reached through symbolic links. Existing installations need an installer rerun to acquire this updater-code fix; automatic instruction updates do not replace the installed updater itself.
589
+
498
590
  Setup discloses automatic updates and installs asynchronous `SessionStart` and `Stop` command hooks. They check npm's stable `latest` release at most once per 24 hours per installation. Offline or failed checks retain the installed version and retry at the next eligible hook after 15 minutes. `Stop` means Claude finished responding, not that the user's task succeeded. No background service watches connectivity while Claude Code is closed, and checks never ask Claude to keep working. A one-shot `claude -p` process can exit before an asynchronous Stop hook finishes; startup checks and later sessions provide the retry path. Managed policies or disabled hooks can prevent automatic checks; an explicit manual update remains available.
499
591
 
500
592
  Completed failed checks emit a non-blocking Claude Code notice: the installed version was retained, automatic checks retry after 15 minutes during use, and the user can say **“update openmerit”** to retry manually. Hooks during that backoff stay silent; another eligible failed check emits the notice again. Current-version checks and disabled automatic checks stay silent. Delivery depends on Claude Code processing the completed asynchronous hook output; an exiting one-shot process may not show the notice.
@@ -568,16 +660,27 @@ The twice-daily updater fetches eight independent public sources, including Mode
568
660
  | Feed | Used for |
569
661
  | --- | --- |
570
662
  | [Epoch AI](https://epoch.ai/benchmarks) | Benchmark definitions, published results, source links, and evaluation configurations. |
571
- | [Artificial Analysis](https://artificialanalysis.ai/leaderboards/models) | Benchmark results for 27 evaluations, measured first-answer delay and reference generation speed. Elo-style ratings (GDPval-AA and AA-3D) become the expected win rate against the median-rated model, as for Arena; AA-Briefcase is not read. Archived evaluations remain labelled when their models are still available. |
663
+ | [Artificial Analysis](https://artificialanalysis.ai/leaderboards/models) | Benchmark results for 32 evaluations (including HealthBench, HealthBench Professional, Humanity’s Last Exam Diamond, CritPt v2 Hard and FrontierCode 2.0, each its own series beside its earlier version), measured first-answer delay and reference generation speed. Elo-style ratings (GDPval-AA, AA-3D and Code2Video-AA) become the expected win rate against the median-rated model, as for Arena; AA-Briefcase is not read. Archived evaluations remain labelled when their models are still available. |
572
664
  | [OmniDocBench](https://github.com/opendatalab/OmniDocBench#end-to-end-evaluation) | Document parsing scores from the explicitly labelled `v1.6_full` leaderboard, including newer document models than the OpenVLM snapshot. |
573
665
  | [IDP Leaderboard](https://www.idp-leaderboard.org/) | Nanonets' MIT-licensed document processing leaderboard: OlmOCR, OmniDocBench v1.5 and IDP Core (key information extraction, handwriting, tables, visual QA) component scores. The overall average is not imported; per-model dates are not supplied. |
574
666
  | [OpenCompass / VLMEvalKit](https://huggingface.co/spaces/opencompass/open_vlm_leaderboard) | Visual understanding and OCR benchmark results. Its feed currently identifies itself as 17 September 2025. |
575
667
  | [Berkeley Function Calling Leaderboard (BFCL v4)](https://gorilla.cs.berkeley.edu/leaderboard) | Native function-calling single-turn, live, and multi-turn scores; separate memory scores for key-value, vector, and recursive-summarization stores. |
668
+ | [Arena leaderboard dataset](https://huggingface.co/datasets/lmarena-ai/leaderboard-dataset) | Style-controlled human-preference ratings (CC BY 4.0) from four boards: text request categories (including medicine and healthcare, legal and government, the sciences, and entertainment, sports and media), document prompts, vision (overall, OCR, diagrams, homework and creative writing about images) and Code Arena WebDev (overall, HTML, React and image-to-WebDev). Each becomes the expected win rate against the median-rated model of its category; ratings with confidence intervals wider than 60 points are left out. Each category keeps its own publication date. Human preference, not verified correctness. A separate text **factuality** board (overall, medicine and healthcare, legal and government, business and finance) blends those votes with Arena's automated web verification of each response's factual claims at 25% weight; it is converted the same way and covers web-verifiable claims only. Search and Agent Arena are not read: they rate models together with a search system or agent harness. |
669
+ | [Vals AI](https://www.vals.ai/benchmarks) | Overall accuracy on 27 benchmarks Vals AI runs, many on private test sets: healthcare (MedQA, MedCode, MedScribe), legal (LegalBench, Legal Research Bench, HLAB), finance (CorpFin, TaxEval, MortgageTax, Finance Agent, Excel modelling, ClaimBench), public benefits, education, multilingual math, science, code migration, programming and security. Composite indexes, archived versions and evaluations other feeds already supply are not read. Vals AI publishes no data licence; Scout keeps only overall scores with links to each page. Per-model evaluation dates are not supplied. Agent products such as a model inside Claude Code or Codex are not matched to the model. |
670
+ | [Scale Labs (SEAL)](https://labs.scale.com/leaderboard) | Published scores from 11 current boards Scale runs, mostly on private sets: Professional Reasoning (legal and finance), MCP Atlas, MultiChallenge, the Remote Labor Index, SWE Atlas (refactoring, test writing and codebase questions), HiL-Bench, DrugDiscoveryBench and Humanity's Sixth Sense (visual reasoning). Each result keeps the date Scale added it. Rows Scale flags as possibly contaminated or deprecated are left out, as are deprecated boards, safety boards, audio, Humanity's Last Exam Diamond (read from Artificial Analysis) and SWE-Bench Pro V2. Agent boards rate a model inside a named harness, such as Codex or Claude Code; the harness is kept as the result's configuration. Scale names configurations inconsistently, so some rows stay unmatched. |
671
+ | [LiveBench](https://livebench.ai) | LiveBench 2.0 category scores (long agentic, reasoning, coding, browser, data analysis, research and design) from the newest release's published table, about 30 frontier models per release. No per-model dates; the overall score is not read. |
672
+ | [τ-bench by Sierra](https://taubench.com) | pass^1 on τ²-bench airline, retail and telecom and τ-bench banking, from Sierra's own text runs on harness 1.x. Developer-submitted and custom-agent entries are left out, and banking keeps only the AllTools retrieval setup. Few models per domain. |
673
+ | [OpenCompass](https://opencompass.org.cn) | Text-only knowledge, abstraction, reasoning, interaction and agent ability averages for about 20 models. The overall score and the safety board are not read. |
674
+ | [HELM Arabic](https://crfm.stanford.edu/helm/) (Stanford CRFM) | Mean score across HELM's Arabic scenarios from the newest release, mostly multiple choice. Models missing a scenario are left out; no per-model dates. |
675
+ | [BRIDGE Medical](https://huggingface.co/spaces/YLab-Open/BRIDGE-Medical-Leaderboard) (YLab) | Zero-shot average across clinical-text tasks in several languages, mostly open-weight models. Average only; no per-model dates. |
676
+ | [SuperCLUE](https://www.superclueai.com) | Chinese general-board category scores: math and science reasoning, hallucination control, precise instruction following, agentic coding and planning, for about 20 models. Boards older than six months are not read. |
677
+ | [LLM Stats](https://llm-stats.com/benchmarks) (vendor-reported) | Scores model developers report in announcements, papers and model cards, compiled by LLM Stats and reused with attribution under its terms. Scout reads LLM Stats' 100 most-reported benchmarks and keeps only results it marks self-reported, on 0–1 or 0–100 scales, as separate `· vendor-reported` series that never merge with third-party measurements of the same benchmark. Vendor-reported results count toward ranking. They are not independently verified, and settings such as tools, attempts and reasoning effort follow each vendor. Base (pretrained) checkpoints are never matched to instruct models. A benchmark that leaves the 100 keeps its last results. |
576
678
  | [OpenRouter](https://openrouter.ai/api/v1/models) | Available model IDs, input modalities, declared tools and structured-output support, context limits, and advertised token prices. |
577
679
  | [Models.dev](https://models.dev) | Independent native model IDs, declared capabilities and prices via ten direct-provider adapters: OpenAI, Anthropic, Google, DeepSeek, Mistral, xAI, Cohere, Moonshot, MiniMax and Z.AI. Not a performance benchmark or account-availability check. |
578
- | OpenMerit model catalogue | Additional hosted chat routes and token prices, merged from [Models.dev](https://models.dev), [LiteLLM](https://github.com/BerriAI/litellm), OpenRouter, [Vercel AI Gateway](https://vercel.com/ai-gateway/models) and [genai-prices](https://github.com/pydantic/genai-prices). Only reviewed inference hosts and model makers' own OpenAI-compatible APIs with positive per-token prices are included; resellers, routers, subscription plans and account-specific cloud endpoints are not. A route is attached only through an exact model identity. Chat models with such routes that no other source lists become catalogue models, so benchmark results naming them are kept; a catalogue model whose name another listed model already uses is left out. Listings are not verified access in your account. |
680
+ | OpenMerit model catalogue | Hosted routes and advertised prices, merged field by field from [Models.dev](https://models.dev), [LiteLLM](https://github.com/BerriAI/litellm), OpenRouter's complete output-modality feed, [Vercel AI Gateway](https://vercel.com/ai-gateway/models), [DeepInfra's own model API](https://deepinfra.com/models), [genai-prices](https://github.com/pydantic/genai-prices) and the [TrueFoundry models registry](https://github.com/truefoundry/models) (MIT). [Eden AI's expert-model list](https://www.edenai.co/docs/v3/expert-models/listing-models) adds the gateway's own OCR and document-parsing, translation, text-to-speech, transcription, moderation and AI-content detection routes, including vendors no other source lists, such as Mindee, Veryfi, Affinda, DeepL, ModernMT, Gladia and Sightengine. Its prices are per character (per million), page, document file, image, request or second of audio or video, exclude Eden AI's platform fee, and come with no stated data licence. Eden's token-priced routes that do not say input or output, free quotes and its LLM catalogue are left out; only speech and OCR models with an existing catalogue ID link to it. TrueFoundry adds per-provider configs for Bedrock, Azure and Microsoft Foundry, Vertex, Gemini, OpenAI, Mistral, xAI, Cohere, Databricks, Deepgram, ElevenLabs and others, including speech, transcription, image, video, rerank, OCR, moderation and decision routes, with batch, priority and flex rates and regional prices where they differ from the base region; retired routes and context-tier surcharges are left out. OpenRouter contributes chat, decision, embedding, rerank, image, video, speech and transcription routes. DeepInfra contributes its chat, decision, embedding, rerank, image, video, speech, music and transcription inventory. Token, character, image, frame and input/output-time rates keep their provider-defined units; conditional overrides and unsupported multipliers remain in the archived source payload instead of being flattened into misleading base prices. Novita is not ingested in this revision: its public OpenAI model list mostly overlaps routes already present and does not supply source-specific pricing or modalities that this importer can normalize. A route is attached only through an exact model identity. Models with such routes that no other source lists become catalogue models, so benchmark results naming them are kept; a catalogue model whose name another listed model already uses is left out. Benchmark rows are also matched through the catalogue's other names for a listed model (host model IDs, listing names and Hugging Face repositories), and after removing run settings such as reasoning effort, thinking budgets and trailing parentheticals. A name shared by distinct catalogue models matches nothing, and a row under Scout's own name for a model outranks loosely matched rows for the same benchmark. Listings are metadata, not verified account access or a performance test. |
579
681
  | [OpenAI Decisions](https://developers.openai.com/api/docs/guides/decisions) | Reviewed typed-choice, predicate and score endpoint contract, inputs and endpoint-specific rates. No general chat timing is inherited. |
580
682
  | [TypeSafe Jev](https://typesafe.ai/blog/jev-1-14) | Reviewed System One contract. Image and single-box output are experimental; headers, version and incomplete total pricing are disclosed. Jev is a candidate for compatible tasks, not Scout’s ranking engine. |
683
+ | [Vercel AI Gateway decision routes](https://vercel.com/docs/ai-gateway/modalities/decision) | Decision models Vercel AI Gateway routes (Laya, Liquid d1, Perplexity Deciders, Jev, Microsoft Decision-1, Baseten Elephant and Mammoth and others), read from the OpenMerit catalogue each refresh with their input-token rates, context and image input. One reviewed contract covers them: `POST https://ai-gateway.vercel.sh/v1/evaluate` with supplied choices, ordered rubric scores and boolean probabilities. They join classification and judging shortlists as task-fit candidates; promotional and free-tier rates are shown as listed and can end. A free-tier ID with the same name as a paid one is listed once. Many decision rates are identical, so between routes with the same reference cost, the model's standing on [JevBench](https://benchmarkheaven.com/jev-models) (capability: intelligence and calibration, ranked systems only) and the [Artificial Analysis Decision Index](https://artificialanalysis.ai/evaluations/artificial-analysis-decision-index) breaks the tie: the share of each board's other entries it beats, averaged over the boards it appears on. Models without results come after those with them at that price; a cheaper route always comes first. Results link by exact model name. These boards measure general typed decisions, not accuracy on your task; the reason and `decisionBenchmarks` show each result. |
581
684
  | [Hugging Face](https://huggingface.co/models) | Public repository metadata, model-card results and structured evaluation records for specialist discovery. Separate from performance ranking. |
582
685
 
583
686
  Over 100 benchmark **series** are indexed, including source-specific implementations and versions. This is not 100 independent publishers, and coverage is not uniformly current. Some definitions have no results matched to an available model. Both counts are exposed. Missing metrics and ambiguous or unmatched model versions are omitted. Model discovery merges OpenRouter with independent native-provider records and catalogue host routes before matching public benchmark results. An OpenRouter outage does not prevent an independent catalogue from bootstrapping. Distinct endpoints retain prices and parameters; duplicate hosting entries do not create additional model votes or consume multiple places in the five. Endpoint listings are metadata, not verified access in the caller’s account.
@@ -586,6 +689,16 @@ Collection time is not measurement time. A successful refresh does not make an o
586
689
 
587
690
  Epoch AI attribution: “Capabilities & benchmarking,” published at epoch.ai, normalized and matched by Scout under the source's [CC BY 4.0 terms](https://creativecommons.org/licenses/by/4.0/). Other sources are attributed in the source panel and individual evidence links. These are data-source attributions, not a statement about OpenMerit's licensing.
588
691
 
692
+ ### Pending embedding benchmark and media-price collection
693
+
694
+ **Not yet deployed:** the publisher source adds [MTEB's final leaderboard summaries](https://huggingface.co/spaces/mteb/leaderboard), including historical/off-menu suites and text, image, audio and video embedding evaluations. It collects only published aggregate and per-task scores plus their model, experiment, suite and training-disclosure metadata—not benchmark datasets, embeddings, predictions or per-example outputs. Different suite versions and experiment settings remain separate; missing aggregates remain unknown. Results are source-reported, not independently verified by Scout. The results dataset declares CC0-1.0; that does not change the individual task datasets' licences.
695
+
696
+ This is catalogue ingestion only. MTEB results do not yet enter the published chat benchmark index or recommendations, and embedding/rerank workload pricing and recommendation paths remain unfinished. The summaries do not supply evaluated checkpoint revisions or measurement dates; collection and release dates do not substitute for either. An unavailable or malformed suite retains its previous complete results and original collection timestamp.
697
+
698
+ Also **not yet deployed:** three supplemental [Portkey pricing feeds](https://github.com/Portkey-AI/models) contribute reviewed Deepgram Aura, ElevenLabs speech and Stability AI image quotes. Speech generation rates are per input character, Scribe transcription rates per input-audio second, and image rates per image with any published quality/size tier. Portkey's token-like field names do not establish token billing. Unknown denominators, service aliases, custom calculations and zero-only media placeholders are excluded rather than advertised as free generation. Each response is archived with its source attribution; listed prices are not an account-specific quote or proof of availability. These supplemental prices do not add a media recommendation path.
699
+
700
+ The pending publisher also discovers Hugging Face inference-provider routes across all tasks, including repositories from personal accounts. This is independent of the admitted-organisation crawl and does not admit an author's entire collection. Bounded pages and repository batches resume from durable cursors; incomplete collection never withdraws existing routes, and source-wide removals wait for completed application. Application batches can become visible incrementally, while the source retains its previous successful-check timestamp until completion. Only exact/reviewed identities link to canonical models, non-token task prices remain unknown, and provider listings do not establish working credentials or task accuracy. This does not widen the executable recommendation contracts.
701
+
589
702
  ## Specialist models and open weights
590
703
 
591
704
  Some specialist models have useful evaluations outside general LLM leaderboards. Scout reads both legacy model-card `model-index` results and the Hub’s [structured evaluation records](https://huggingface.co/docs/hub/eval-results). It retains the original dataset, task or metric, units, configuration, split, reported date, setup notes and source link when supplied. Scores are not averaged across unrelated datasets. A repository revision pins the metadata collected; it does not establish which checkpoint produced every reported score. Reported dates can also default to a commit date. Scout does not validate verification tokens or independently reproduce these scores.
@@ -602,15 +715,15 @@ Missing evaluations mean **unknown**, not poor performance. Task-fit candidates
602
715
 
603
716
  [OpenAI Decisions](https://developers.openai.com/api/docs/guides/decisions), using `gpt-6-luna`, interprets the work, capability requirements, operation, answer space, serialization and tradeoff priority. It distinguishes writing source from executing it, supplied categories from open identification, text-bearing objects from reading their contents, and session state from persistent memory. Typed answers are validated and checked for consistency. Uncertain answers remain disclosed; they cannot authorize narrow calibration evidence. No prompt keyword rules or model-name bonuses enter selection.
604
717
 
605
- A Structured Outputs call first extracts downstream work, explicit model/endpoint restrictions and preferences using the published metadata definitions and canonical vocabulary. Mandatory conditions use alternatives of complete AND groups; exclusions and arbitrary numeric/date bounds are preserved. Relative dates use a supplied current UTC reference. Generic typed comparisons enforce those conditions and intersect optional `modelIds`/`endpointIds` inventories. Missing facts cannot satisfy a restriction, including an exclusion. Unexpressible mandatory restrictions produce no verified matches rather than silently broadening the search. Names mentioned as task data, clients or comparison subjects are not automatic filters. Interpretation is probabilistic and can still misread a prompt.
718
+ A Structured Outputs call first extracts downstream work, explicit model/endpoint restrictions and preferences using the published metadata definitions and canonical vocabulary. Mandatory conditions use alternatives of complete AND groups; exclusions and arbitrary numeric/date bounds are preserved. Relative dates use a supplied current UTC day. Generic typed comparisons enforce those conditions and intersect optional `modelIds`/`endpointIds` inventories. Missing facts cannot satisfy a restriction, including an exclusion. Unexpressible mandatory restrictions produce no verified matches rather than silently broadening the search. Names mentioned as task data, clients or comparison subjects are not automatic filters. Interpretation is probabilistic and can still misread a prompt.
606
719
 
607
720
  Image tasks require declared image input and relevant visual evidence in performance ranking. Document reading needs document evidence. JSON/schema tasks need declared `response_format` or `structured_outputs`; required tool execution needs tools support and relevant tool evidence. Persistent memory requires external-memory evidence rather than a large context window. [BFCL memory evaluations](https://gorilla.cs.berkeley.edu/blogs/16_bfcl_v4_memory.html) do not establish built-in memory or performance on the visitor's storage system. Recognized image/video/audio generation and transcription remain outside the supported output index. Ambiguous spatial output produces the existing clarification choices.
608
721
 
609
- Classification and judgment tasks first use applicable benchmark evidence. With no supported benchmark candidates, supplied-label classification and judgments retain the explicitly labelled **task-fit** fallback. Boxes and masks use their compatible task-fit path. Documented operation/output fit, deployment readiness and known reference costs/times determine unmeasured shortlists; quality stays unknown. Open or uncertain identification instead needs name-generating endpoints and relevant evidence; fixed-choice APIs cannot satisfy it. Specialist compatibility uses hourly-prepared public profiles. Unknown compatibility omits a repository with a warning, rather than assuming task accuracy.
722
+ Classification and judgment tasks first use applicable benchmark evidence. With no supported benchmark candidates, supplied-label classification and judgments retain the explicitly labelled **task-fit** fallback. Boxes and masks use their compatible task-fit path. Documented operation/output fit, deployment readiness and known reference costs/times determine unmeasured shortlists; quality on the task stays unknown. Between decision models with the same reference cost, their standing on two general decision leaderboards breaks the tie, as described in the Vercel decision routes row of the source table. Open or uncertain identification instead needs name-generating endpoints and relevant evidence; fixed-choice APIs cannot satisfy it. Specialist compatibility uses hourly-prepared public profiles. Unknown compatibility omits a repository with a warning, rather than assuming task accuracy.
610
723
 
611
- For performance ranking, a query embedding retrieves benchmark methodologies, supplemented by capability memberships prepared at each refresh. Bounded independent Decisions predicates verify relevance and a deliberately scored required ability before a methodology contributes proxy evidence. Similarity never supplies a quality score. Rejected, unknown and unavailable evidence is withheld. If some checks fail, verified evidence can still be used with an explicit warning; if no applicability can be verified because checks are unavailable, the search returns unavailable rather than reporting a false no-match.
724
+ For performance ranking, a query embedding retrieves benchmark methodologies, supplemented by capability memberships prepared at each refresh. Bounded independent Decisions predicates verify relevance and a deliberately scored required ability before a methodology contributes proxy evidence. A second Decisions question compares each methodology with the task's description: *direct* (the same kind of work in the same domain, such as MedCode for ICD-10 coding), *domain* (the task's subject domain or profession, but a different form of work), *generic* (a general ability the task uses) or *unrelated*. When direct and domain together hold at least 70% of that judgement, the benchmark is accepted as task-specific evidence, whatever the generic ability check says. A general proxy judged unrelated with at least 80%, such as competition mathematics for clinical questions, is withheld. Direct and domain evidence are listed first on each recommendation. The four nearest methodologies are always assessed, whatever their prepared capability tags, because a vertical benchmark such as TaxEval is often tagged for a different ability than the one the task names. When no single ability clearly determines quality, as with security review or tax checking, Scout uses the required ability the interpreter favours most and adds a warning, instead of failing the search. Similarity never supplies a quality score. Rejected, unknown and unavailable evidence is withheld. If some checks fail, verified evidence can still be used with an explicit warning; if no applicability can be verified because checks are unavailable, the search returns unavailable rather than reporting a false no-match.
612
725
 
613
- Quality comparisons use shared benchmark results, grouped by correlated family and task capability. Different cohorts are not compared through unrelated percentiles. BFCL uses native function-calling configurations with their original labels; correlated series are one family. Missing scores remain unknown and actual zero remains a score. Model/version matching remains conservative. A relative quality signal is not predicted accuracy or a statistical confidence interval.
726
+ Quality comparisons use shared benchmark results, grouped by correlated family and task capability. Different cohorts are not compared through unrelated percentiles. BFCL uses native function-calling configurations with their original labels; correlated series are one family. Missing scores remain unknown and actual zero remains a score. Model/version matching remains conservative. A "+" in a model name is significant, so Command A+ and Command A are separate models rather than one ambiguous name. A catalogue model's dated ID (such as Cohere's `command-a-03-2025`) counts as a copy of the undated model. A relative quality signal is not predicted accuracy or a statistical confidence interval.
614
727
 
615
728
  Matching calibration observations can supplement quality for their exact operation, format, modality, tools, retention and workload scope. Each admitted model needs at least six calibration cases, and evidence expires after 30 days (seven days before 22 October 2026). An applicable profile past that age stays excluded and the result carries a warning naming the profile and its expiry date, rather than silently using benchmarks only. A match no longer requires five tested models or excludes all untested eligible models. Observations remain tied to their tested router deployment. Repeated calibration request failures still cap effective quality. Calibration episode bills and durations remain source evidence; they are not substituted for only some candidates' reference costs or times. Held-out outcomes and answer keys never enter runtime ranking.
616
729
 
@@ -696,7 +809,7 @@ npm ci
696
809
  npm run scout
697
810
  ```
698
811
 
699
- Open `http://127.0.0.1:45833/scout/`. This lightweight local preview uses the shared interpreter and matcher with bundled/source-feed data; it does not run the hosted Parallel research workflow or R2 publication system. Local API and MCP endpoints use that same origin. `SCOUT_PORT` changes the port. The server immediately uses the newer of its bundled index and `.openmerit/scout/snapshot.json` cache, refreshes when older than an hour, and continues hourly while running. Stopping the process stops its local schedule.
812
+ Open `http://127.0.0.1:45833/scout/`. This lightweight local preview uses the shared interpreter and matcher with bundled/source-feed data; it does not run the hosted refresh workflow or R2 publication system. Local API and MCP endpoints use that same origin. `SCOUT_PORT` changes the port. The server immediately uses the newer of its bundled index and `.openmerit/scout/snapshot.json` cache, refreshes when older than an hour, and continues hourly while running. Stopping the process stops its local schedule.
700
813
 
701
814
  `npm run scout:refresh` fetches the eight public sources and atomically updates `scout/snapshot.json` after validation. Successful sources replace their previous data; failed sources retain labelled prior data when available. Source downloads need no provider inference, but preparing new or changed specialist profiles and benchmark interpretations requires `OPENAI_API_KEY` and incurs Decisions usage. Unchanged metadata reuses cached analysis. Without a usable key, required specialist preparation retains the previous specialist snapshot; affected new or changed benchmark definitions remain unclassified. Both failures are reported on the affected source. It does not run model evaluations or update the separate calibration file. Calibration refreshes are an explicit offline evaluation and deployment; no paid scheduled evaluation job is installed. Recommendation queries require the server key and incur OpenAI interpretation/embedding usage. The local source-refresh command updates the bundled feeds; the hosted twice-daily Workflow additionally prepares and publishes its D1/Vectorize serving generation.
702
815
 
package/docs/security.md CHANGED
@@ -97,4 +97,4 @@ Clerk webhook signatures are verified over bounded raw request bodies with the S
97
97
 
98
98
  ## Scout research storage
99
99
 
100
- Scout uses Parallel for twice-daily public-source research. Parallel receives catalogue subjects and official-source metadata, not visitor prompts or application inventories. Decisions processes task descriptions and relevant public evidence. Public research receipts, citations, semantic annotations, publication completion receipts and immutable catalogue versions are stored in Scout's private Cloudflare R2 bucket. Public endpoint/model facts and observations also enter the private D1 serving projection. Vectorize stores public benchmark methodology embeddings, not visitor query vectors. Query embeddings are used transiently; OpenAI has its own API retention policies. Scout uses the prompt-and-evidence analytics policy above. API credentials are held as Worker secrets and are not included in browser assets, catalogue objects or analytics. Source text is treated as evidence, not executable code or instructions. Citations and semantic validation do not independently verify that publisher claims are true.
100
+ Scout's twice-daily refresh reads public sources directly and no longer uses a research service. Decisions processes task descriptions and relevant public evidence. Previously collected public research citations, semantic annotations, publication completion receipts and immutable catalogue versions are stored in Scout's private Cloudflare R2 bucket. Public endpoint/model facts and observations also enter the private D1 serving projection. Vectorize stores public benchmark methodology embeddings, not visitor query vectors. Query embeddings are used transiently; OpenAI has its own API retention policies. Scout uses the prompt-and-evidence analytics policy above. API credentials are held as Worker secrets and are not included in browser assets, catalogue objects or analytics. Source text is treated as evidence, not executable code or instructions. Citations and semantic validation do not independently verify that publisher claims are true.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openmerit",
3
- "version": "0.1.10",
3
+ "version": "0.1.11",
4
4
  "description": "Evidence-driven model decisions for coding harnesses.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -61,7 +61,8 @@
61
61
  "access": "public"
62
62
  },
63
63
  "workspaces": [
64
- "packages/*"
64
+ "packages/*",
65
+ "scout/agent"
65
66
  ],
66
67
  "engines": {
67
68
  "node": ">=22.19.0"
@@ -69,7 +70,7 @@
69
70
  "scripts": {
70
71
  "check": "npm run check --workspaces --if-present",
71
72
  "test": "npm run test --workspaces --if-present",
72
- "typecheck": "tsc -p tsconfig.json && tsc -p tsconfig.scout.json",
73
+ "typecheck": "tsc -p tsconfig.json && tsc -p tsconfig.scout.json && tsc -p scout/agent/tsconfig.json",
73
74
  "check:typescript": "node scripts/check-typescript.ts",
74
75
  "types:workers": "node scripts/worker-types.ts",
75
76
  "check:worker-types": "node scripts/worker-types.ts --check",
@@ -81,7 +82,8 @@
81
82
  "dash": "node packages/terminal/src/cli.mjs dash",
82
83
  "build:docs": "node scripts/build-docs.mjs",
83
84
  "check:docs": "npm run build:docs && node --test scripts/docs.test.mjs",
84
- "check:demo": "node --test demo/test/*.test.mjs",
85
+ "memo": "node demo/memo/preview.ts",
86
+ "check:demo": "npm ci --ignore-scripts --prefix demo && npm run build:docs && tsc -p tsconfig.memo.json && node --test demo/test/*.test.mjs demo/test/*.test.ts",
85
87
  "prepare": "npm run build",
86
88
  "verify": "npm test && npm run check && npm run typecheck && npm run check:typescript && npm run build && npm run check:demo && npm run check:scout && npm run check:docs && npm run build:scout && git diff --check",
87
89
  "prepublishOnly": "npm run verify",
@@ -89,7 +91,7 @@
89
91
  "deploy:dash-preview": "node scripts/deploy.ts terminal-preview",
90
92
  "scout": "node scout/dev.mjs",
91
93
  "scout:refresh": "node scout/refresh.mjs",
92
- "check:scout": "node --test scout/test/*.test.mjs scout/test/*.test.ts && node --check scout/worker.mjs && node --check site/scout/scout.js",
94
+ "check:scout": "node --test scout/test/*.test.mjs scout/test/*.test.ts && node --check scout/worker.mjs",
93
95
  "build:scout": "node scripts/build-scout.mjs"
94
96
  },
95
97
  "dependencies": {
@@ -112,7 +114,9 @@
112
114
  "devDependencies": {
113
115
  "@clerk/backend": "3.26.1",
114
116
  "@clerk/shared": "4.41.0",
117
+ "@lezer/highlight": "1.2.5",
115
118
  "@resvg/resvg-js": "2.6.2",
119
+ "@types/markdown-it": "14.1.2",
116
120
  "@types/node": "^22.18.6",
117
121
  "@xyflow/react": "12.12.0",
118
122
  "elkjs": "0.12.0",
@@ -120,6 +124,7 @@
120
124
  "fflate": "0.8.2",
121
125
  "liveline": "0.0.7",
122
126
  "markdown-it": "15.0.2",
127
+ "miniflare": "5.20260921.0-alpha",
123
128
  "minisearch": "7.2.0",
124
129
  "morphdom": "2.7.8",
125
130
  "react": "19.3.0",
package/docs/memo.md DELETED
@@ -1,126 +0,0 @@
1
- # Optimum Inference For All
2
-
3
- *Lazim*
4
-
5
- How can we accelerate the distribution of intelligence?
6
-
7
- Building and deploying more models and improving the compute landscape is where most of the energy being spent right now. I have another, less explored direction in my mind, which I call, the optimum inference problem.
8
-
9
- I see a substantial part of what limits autonomous systems is how the models are selected and assessed throughout their lifecycle. It's a harness-level infrastructure concern.
10
-
11
- #### Does this need to get solved?
12
-
13
- In companies that I had the privilege of working with, I have built or maintained or used a rudimentary version of this. When budget constraints strangled the roadmap, teams scrambled their way out by building something enough to justify why they need to pay y amount of money to solve x task. This was never a maintained system nor it was ever prioritised because it was seen as an optional optimisation issue and overlooked the power it had over the dissemination of intelligence inside the org and the products they ship.
14
-
15
- If it was ever solved, it was always at a task level and if it had room and engineers to pressure, maybe at the agent level but rarely. even rarer at the harness level. As the system develops, its inference choices should develop with it. I don't think every team should have to build and maintain that process and stack themselves. We are building OpenMerit to solve this. In the Mission of optimum inference for all.
16
-
17
- #### What optimum means
18
-
19
- Optimum depends on the work. We need to know what counts as success, how reliably it must be delivered and the customer's constraints on cost, latency and operation.
20
-
21
- A cheaper model that needs repeated attempts may make the completed job more expensive. A stronger model may add cost without improving the result. We need to account for the whole workflow, including anything a person has to fix.
22
-
23
- The range of models matters here. There are frontier models from leading labs, general-purpose open-weight models, fine-tuned and distilled variants on Hugging Face, and specialists for coding, retrieval, vision and speech. Jev, by TypeSafe, is designed for fast structured decisions. Its recent release shows there is demand for a different breed of system-one models. Smaller models can run task-specific programs optimised through tools such as DSPy. An agent may have a place for several of these. We want OpenMerit to assess all of them on the work they can actually do, to allocate as it required.
24
-
25
- The right deployment could use a direct API from the lab, a router, an inference cloud or a customer-operated model. It could combine them. A company using only commercial APIs should get a complete product. So should one operating entirely within its own environment.
26
-
27
- Hardware is equally part of the decision. For customer-operated deployments, we need to account for available compute and memory, concurrent workloads and the cost of loading or swapping models. With managed APIs, we work with measurable outcomes and the constraints the provider exposes.
28
-
29
- Local models, open weights and fine-tunes extend the possibilities. We have no preference for moving customers towards them. If the industry the customer operates in demands sovereignty then it should be able to, without sacrificing the intelligence spread.
30
-
31
- Better allocation also matters beyond the bill. Where a smaller configuration meets the requirements and the freed capacity can be reused, the same resources can support more work. That is part of what I mean by distributing intelligence.
32
-
33
- #### What we are building
34
-
35
- There's no end-to-end product or platform clarity at the moment, but on a broader spectrum, you could place OpenMerit as infrastructure for assessing, benchmarking, selecting, assigning and maintaining all model choices within your harness.
36
-
37
- It operates at task, agent and harness levels. An assignment should suit the individual task while accounting for the agent's overall result. Across a harness, those choices have to work within shared budgets and capacity.
38
-
39
- To get there, OpenMerit first needs to establish which options the customer can use. It should then coordinate comparisons on representative work using their success criteria. Production evidence tells us how the current configuration behaves. It does not establish how an untested alternative would perform.
40
-
41
- After deployment, OpenMerit should check whether the expected improvement happened and decide where further investigation is worthwhile. Keeping the current assignment is a valid decision.
42
-
43
- The interface should be agent-native. A harness should be able to request a comparison and retrieve an assignment with its evidence programmatically. Within the customer's permissions, OpenMerit should coordinate validated changes through the existing infrastructure, then retain or reverse them based on the results.
44
-
45
- We will remain harness-agnostic. The customer's harness owns execution and coordination. Its providers and serving systems run inference. We integrate with its observability and evaluation tools. We will not build those products ourselves as much as we can, and production traffic will not have to pass through us to fulfil the task, but sure can control the traffic based on the evidence.
46
-
47
- #### A continuing research problem
48
-
49
- Most of the components are still very nascent and will increasingly need newer ways of operating as models become increasingly intelligent and the compute becomes increasingly efficient. Hence we see OpenMerit as a research lab as much as a product company.
50
-
51
- To zoom out, we see optimum inference as a long-term research and deployment effort. There is no final configuration we can find, hand over and consider the problem solved.
52
-
53
- We need better methods for deciding how much evidence an assignment requires and when that evidence needs updating. Testing every option is expensive. Testing too little can leave us maintaining a poor decision. OpenMerit should spend its testing budget where additional evidence is likely to be useful.
54
-
55
- We also need to understand how individual choices affect the complete outcome. A model that performs well on one step may leave the next step with harder work. Several assignments that look sensible separately may compete for the same compute.
56
-
57
- These are some of the questions we will have to study in production. Deployment will expose cases our experiments missed and show us which improvements were worth pursuing. That experience should inform the next investigation and the methods we build.
58
-
59
- OpenMerit should support this work throughout a system's creation, iteration and ongoing operation.
60
-
61
- #### Where we start
62
-
63
- Our first customers are engineering and AI teams running repeatable production workflows with measurable outcomes and meaningful inference costs or capacity constraints.
64
-
65
- One way to think about it goes like this. A developer or their coding agent connects one workflow. OpenMerit establishes a baseline, compares eligible alternatives and returns a decision they can act on. They keep using it because maintaining that assignment is useful, then connect more work.
66
-
67
- The first line of product combines L1, organisation-wide understanding, with L2, repeatable workflows. Individual workflows provide the evidence for a wider view of which models are assigned where, why those choices were made and which ones deserve reassessment and swapping.
68
-
69
- L3, adaptive agents, is the longer-term research direction. Agents may revise their plans or create subagents while working. We want to support inference decisions during that execution without taking over the harness's responsibility.
70
-
71
- L2 should support a business on its own. It also gives us production experience for the harder questions ahead.
72
-
73
- #### A separate company, not a feature
74
-
75
- We want OpenMerit to follow the customer's work across whichever models and infrastructure are appropriate.
76
-
77
- A customer should be able to change providers, introduce a fine-tune or replace a harness without rebuilding how they make model decisions. Some evidence will need to be revalidated. The history of what they tried and why they changed should remain useful.
78
-
79
- That continuing responsibility is substantial enough to build a company around. We intend to earn it through the quality of our decisions and the maintenance we remove from the customer's team.
80
-
81
- We are thinking of building an open-core, with hosted and customer-operated options, and charge for continuous assessment and decision management. We will not mark up inference.
82
-
83
- #### We need to prove
84
-
85
- Our evaluations have to reflect the customer's actual work. We should begin with representative examples and usable success criteria, and limit autonomous changes to decisions the evidence supports. Where the criteria are inadequate, we need to identify that before automating the wrong objective.
86
-
87
- Our own costs belong in the calculation. Comparisons consume resources. Switching can introduce failures and maintenance. OpenMerit needs to recognise when an apparent improvement is too small to pursue.
88
-
89
- We also need dependable integrations. We should start with a narrow set and make them work well before extending our coverage. Supporting different infrastructure does not require supporting everything immediately.
90
-
91
- The standard is a measurable improvement after accounting for testing, switching and running OpenMerit. Depending on the workload, that means better outcomes within the same budget, lower total cost at the required quality or more completed work with available capacity.
92
-
93
- #### What is already here in some shape or form
94
-
95
- There are useful tools here, including ones that already make model decisions. OpenRouter's Auto Router selects models for incoming requests. Portkey's gateway supports conditional routing, fallbacks and controlled testing of new models in production. Not Diamond lets teams train routers on their own data and evaluation criteria, with quality, cost and latency preferences.
96
-
97
- Langfuse helps teams compare changes through evaluation scores, cost, latency and individual failures. Braintrust supports experiments and continuous production evaluation, including bringing production examples back into testing. These tools already help teams investigate and improve their systems.
98
-
99
- Many of these capabilities overlap with parts of what we want to explore. They are also components we expect to work with.
100
-
101
- We consider optimum inference far from solved. A system needs to determine when the evidence behind an assignment is no longer enough, which alternatives deserve testing and whether a change will improve the completed work after its costs are included. It needs to maintain that process across changes to its tasks, models and infrastructure.
102
-
103
- OpenMerit exists to take on that continuing responsibility. The tools for an investigation should be available to the harness, along with the means to act on the result. The customer should not inherit a permanent engineering project to keep it all working.
104
-
105
- #### Path ahead
106
-
107
- We want teams to know when the strongest model is worth paying for, when an inexpensive alternative is sufficient and when a different deployment would let them do more.
108
-
109
- We want those decisions to become part of what a system can maintain for itself. Its engineers should be able to define the work and its constraints without inheriting a permanent job of reconsidering every model assignment.
110
-
111
- How much more useful work can we make possible with the intelligence and compute available to us?
112
-
113
- ---
114
-
115
- **Additional Reading**
116
-
117
- 1. [**"The Shift from Models to Compound AI Systems"**](https://bair.berkeley.edu/blog/2024/02/18/compound-ai-systems/) — Matei Zaharia et al., BAIR. (February 18, 2024)
118
- 2. [**"DSPy: Program, Don't Prompt"**](https://dspy.ai/current/) — DSPy / Stanford NLP.
119
- 3. [**"Optimas: Optimizing Compound AI Systems with Globally Aligned Local Rewards"**](https://optimas.stanford.edu/) — Shirley Wu et al., arXiv. (February 9, 2026)
120
- 4. [**"AI Agents That Matter"**](https://arxiv.org/abs/2407.01502) — Sayash Kapoor, Benedikt Stroebl, Zachary S. Siegel, Nitya Nadgir, and Arvind Narayanan, arXiv. (July 1, 2024)
121
- 5. [**"Training a Custom Router"**](https://docs.notdiamond.ai/docs/router-training-quickstart) — Not Diamond.
122
- 6. [**"Auto Router — Intelligent Model Selection"**](https://openrouter.ai/docs/guides/routing/routers/auto-router) — OpenRouter.
123
- 7. [**"AI Gateway"**](https://portkey.ai/docs/product/ai-gateway) — Portkey.
124
- 8. [**"Compare Experiments"**](https://langfuse.com/docs/evaluation/experiments/compare-experiments) — Langfuse.
125
- 9. [**"Evaluate Systematically"**](https://www.braintrust.dev/docs/evaluate) — Braintrust.
126
- 10. [**"Introducing System One Models & Jev"**](https://typesafe.ai/blog/introducing-system-one-models-and-jev) — Diogo Almeida, TypeSafe AI. (September 15, 2026)