openmerit 0.1.6 → 0.1.7-preview.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -4
- package/README.md +61 -40
- package/dist/eval/src/adapters.mjs +73 -0
- package/dist/eval/src/cli.mjs +103 -0
- package/dist/eval/src/config.mjs +102 -0
- package/dist/eval/src/process.mjs +44 -0
- package/dist/eval/src/report.mjs +51 -0
- package/dist/eval/src/runner.mjs +106 -0
- package/dist/eval/src/scout.mjs +37 -0
- package/dist/terminal/public/app.js +36 -36
- package/dist/terminal/public/flow.css +1 -1
- package/dist/terminal/public/flow.js +26 -26
- package/dist/terminal/public/index.html +3 -2
- package/dist/terminal/public/styles.css +320 -91
- package/dist/terminal/src/cli.mjs +2 -0
- package/dist/terminal/src/demo-policy.mjs +205 -0
- package/dist/terminal/src/enterprise-sample.mjs +151 -0
- package/docs/adapter-guide.md +2 -2
- package/docs/agent-evaluations.md +101 -0
- package/docs/architecture.md +3 -3
- package/docs/automation.md +5 -5
- package/docs/budgets.md +2 -2
- package/docs/commands.md +7 -5
- package/docs/demo-backfill.md +3 -1
- package/docs/demo-fieldkit.md +3 -1
- package/docs/demo-placement.md +3 -1
- package/docs/demo-spam.md +3 -1
- package/docs/demo-support.md +3 -1
- package/docs/demo.md +22 -5
- package/docs/first-trial.md +2 -2
- package/docs/getting-started.md +23 -12
- package/docs/index.md +18 -29
- package/docs/inference-terminal.md +90 -54
- package/docs/interactive-demo.md +118 -0
- package/docs/lifecycle.md +4 -4
- package/docs/metrics-and-evidence.md +3 -3
- package/docs/operations.md +3 -5
- package/docs/pi-extension.md +6 -6
- package/docs/roadmap.md +17 -17
- package/docs/scout.md +206 -0
- package/docs/security.md +6 -4
- package/docs/site-demo.md +4 -0
- package/docs/site-design.md +7 -1
- package/docs/site-documentation.md +9 -3
- package/docs/site-domain-migration.md +57 -0
- package/docs/site-dynamic-og.md +2 -2
- package/docs/site-faq-maintenance.md +121 -6
- package/docs/site-hero-resolution.md +2 -0
- package/docs/site-illustration-sequences.md +3 -1
- package/docs/site-illustration-transparency.md +80 -0
- package/docs/site-memo.md +6 -0
- package/docs/site-og-image.md +1 -1
- package/docs/site-publication-2026-10-14.md +29 -0
- package/docs/site-scout-decisions-experiment.md +87 -0
- package/docs/site-scout.md +254 -0
- package/docs/site-terminal-preview.md +96 -3
- package/docs/site-themes.md +30 -0
- package/docs/testing.md +37 -78
- package/docs/troubleshooting.md +3 -3
- package/package.json +9 -3
package/docs/testing.md
CHANGED
|
@@ -1,118 +1,77 @@
|
|
|
1
|
-
# Testing
|
|
1
|
+
# Testing and validation
|
|
2
2
|
|
|
3
3
|
## Standard verification
|
|
4
4
|
|
|
5
5
|
```sh
|
|
6
|
-
npm
|
|
7
|
-
npm test
|
|
8
|
-
npm run check
|
|
6
|
+
npm ci
|
|
9
7
|
npm run verify
|
|
10
8
|
npm pack --dry-run
|
|
11
9
|
```
|
|
12
10
|
|
|
13
|
-
|
|
11
|
+
`verify` runs workspace tests, syntax checks, TypeScript checks, the package build, demo tests, generated-documentation checks, and whitespace validation. It does not publish a package or deploy the website.
|
|
14
12
|
|
|
15
|
-
|
|
13
|
+
## Coordinator and Pi coverage
|
|
16
14
|
|
|
17
|
-
|
|
15
|
+
Automated tests cover protocol contracts, task-specific sampling, application-target binding, setup and post-build target detection, incumbent identity, deterministic baseline sufficiency, durable candidate/assessment handoffs, frontier conformance, approval, swap and rollback requests, persistence, evidence requirements, budget accounting, and audit redaction.
|
|
18
16
|
|
|
19
|
-
|
|
17
|
+
Automation coverage includes task and elapsed cadence, signal idempotency, durable pending work, catalogue changes, regression thresholds, delayed post-swap checks, scheduler capability gaps, and persistent pause. Pi's own usage and coding checkpoints are not counted as application measurements.
|
|
20
18
|
|
|
21
|
-
|
|
19
|
+
The disposable-project test in `packages/pi/test/live-wakeup.test.ts` verifies that a due, insufficient baseline is recorded without starting Pi. Scheduler tests validate managed LaunchAgent configuration and authorization boundaries. They do not establish reliable unattended candidate discovery, comparison, or swapping; those require a representative headless product trial.
|
|
22
20
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
The enterprise sample tests assert 40 reported agents, 140 tasks, 21 used models, 9,600 unique requests, consistent task-to-agent assignments, all path classifications, and unknown measurements on running requests. Browser checks cover the larger inventories, agent/task lists and nested details, command search, map coverage, and desktop/mobile layouts. This fixture exercises interface density; it does not establish production throughput or hardware performance.
|
|
26
|
-
|
|
27
|
-
The sidebar and animation revision was additionally checked for persistent chart/DOM identity across polls, CPU/memory selection, exact-sample keyboard inspection, compact navigation, Torph transitions, immediate keyboard updates, and static charts under reduced motion. These are browser checks, not a committed browser automation suite. Browser source lives in `packages/terminal/client/`; `scripts/build-terminal.mjs` bundles it into the ignored `public/app.js` before `npm run dash` and during the package build.
|
|
28
|
-
|
|
29
|
-
Path-category tests cover explicit metadata precedence, unknown/invalid types, case-insensitive inventory/source matching, conflicting declarations, and mixed paths without double counting. They verify that endpoint location alone never establishes a request path. Sample data exercises direct, local, router, and gateway paths, including one model reached through multiple types.
|
|
30
|
-
|
|
31
|
-
Deployment and capacity tests cover strict identity matching, duplicate-ID rejection, ordered path projection and entry conflicts, shared-pool deduplication, stale/future/missing/zero readings, positive-limit ratios, safe project-local capacity files, export failure clearing, and highest-series vLLM cache usage. The enterprise fixture checks 27 deployments, 12 pools, 9,479 identified requests, and explicit stale/missing capacity coverage.
|
|
32
|
-
|
|
33
|
-
## Pi load smoke test
|
|
21
|
+
## Inference Terminal coverage
|
|
34
22
|
|
|
35
23
|
```sh
|
|
36
|
-
|
|
24
|
+
npm test --workspace=@openmerit/terminal
|
|
37
25
|
```
|
|
38
26
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
CI also packs `openmerit`, installs the tarball in a temporary directory,
|
|
42
|
-
imports its public core and protocol entry points, and loads the installed Pi
|
|
43
|
-
extension. This checks the published artifact rather than only the workspace.
|
|
27
|
+
Tests cover metadata projection and redaction, source containment, recursive syntax indexing, phased worker progress, incremental reuse, coverage limits, endpoint classification, authorized loopback probes, supported request-log formats, UTF-8 boundaries, rotation/truncation, source reconciliation, historical ranges, unknown versus zero measurements, and the read-only API.
|
|
44
28
|
|
|
45
|
-
|
|
29
|
+
Inventory and UI coverage includes model/service identity, explicit deployment and host links, shared capacity, stale/missing hardware, path classification, map completeness, search and filtering, preference-dependent demo decisions, and preservation of unknown costs. Runtime fixtures establish which endpoints collectors call; they do not prove compatibility with every external runtime version.
|
|
46
30
|
|
|
47
|
-
|
|
48
|
-
- **Runtime smoke verified** — the actual Pi runtime loads the extension.
|
|
49
|
-
- **Product trial verified** — Pi creates evals and observability in a real product and completes an intent with evidence.
|
|
50
|
-
- **Production verified** — representative repeated runs support reliability and distribution claims.
|
|
31
|
+
The three fictional scenarios are separate:
|
|
51
32
|
|
|
52
|
-
|
|
33
|
+
| Scenario | Agents | Tasks | Models / offers | Requests |
|
|
34
|
+
| --- | ---: | ---: | --- | ---: |
|
|
35
|
+
| Local sample (`--demo` or sample selector) | 40 | 140 | 21 models | 9,600 over 24 hours |
|
|
36
|
+
| Hosted enterprise sample | 200 | 699 | 21 models | 9.6 million over 30 days |
|
|
37
|
+
| Hosted before/after comparison | 280 | 980 | 26 reviewed offers across six services; assignments depend on preference | 9.6 million over 30 days |
|
|
53
38
|
|
|
54
|
-
|
|
39
|
+
The comparison tests preserve workload and token volume across all six preferences, enforce service/output compatibility, disclose benchmark/efficiency overrides, and verify modeled costs. Sample tests exercise interface scale and arithmetic, not measured throughput, application quality, or hardware performance.
|
|
55
40
|
|
|
56
|
-
|
|
41
|
+
Browser review covers the six views, inspectors, search, activity ranges, map and chart interaction, keyboard navigation, reduced motion, and desktop/narrow layouts. The source light/dark change has local browser verification; it is not yet published to npm or the hosted site. Browser checks are distinct from the committed unit suite.
|
|
57
42
|
|
|
58
|
-
|
|
43
|
+
## Pi load and package smoke tests
|
|
59
44
|
|
|
60
45
|
```sh
|
|
61
|
-
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Pi builds a small sentiment-classification app and infers a task/evaluation plan in a temporary directory. The runner validates the plan against available collectors, shows the selected metrics and rationales, smoke-tests the app's configurable route through a live application call, and passes the inferred profile to OpenMerit's coordinator. Task quality is scored only by exact sentiment-label match; rationale plausibility is not graded. The runner collects a baseline, randomly interleaves incumbent/challenger calls over Pi's same three to five representative cases with two repetitions per case, records provider-reported token use and request cost plus measured latency and task outcomes, asks OpenMerit to calculate and verify the Pareto frontier, applies a selected frontier route only in that temporary app, and runs a new post-swap check for every case/repetition. It stops on missing model availability, missing provider usage/cost, invalid output, or a $1 default application-provider spend threshold checked after each response. The saved summary includes its randomization seed.
|
|
65
|
-
|
|
66
|
-
The default baseline is `openai/gpt-4.1-mini`, with `openai/gpt-4o-mini` as the challenger. Override the selection with `OPENMERIT_DEMO_BASELINE_MODEL` and comma-separated `OPENMERIT_DEMO_CANDIDATE_MODELS`; candidates must be available in the current OpenRouter catalogue. `OPENMERIT_DEMO_PI_MODEL` selects the Pi coding model. `OPENMERIT_DEMO_REPETITIONS` accepts 2–5, `OPENMERIT_DEMO_MAX_SPEND_USD` accepts a cap up to $5, and `OPENMERIT_DEMO_SEED` supplies a repeatable ordering seed.
|
|
67
|
-
|
|
68
|
-
The temporary directory path is printed at startup and completion. It contains the generated app and inferred plan, `.openmerit/` lifecycle state and redacted event log, per-call `artifacts/application-runs.jsonl`, comparison manifest, and summary. The runner executes application calls serially. Its spend threshold measures application calls only; Pi's coding-model spend is not measured or included. Its tiny task set and sample count are a mechanics demo only: do not present its observed rates, average latency, or frontier as representative reliability, quality, or performance claims.
|
|
69
|
-
|
|
70
|
-
### Inference Terminal hardware checks (unreleased)
|
|
71
|
-
|
|
72
|
-
`npm test --workspace=@openmerit/terminal` covers bounded and project-contained hardware exports, duplicate/reserved host IDs, future and stale timestamps, missing versus empty residency, per-host history deduplication/reset, sample placement, and the hashes of locally bundled official favicons. Browser verification covers path-series selection and keyboard bin inspection, enlarged table headers, host and location selection, separate host chart histories, stale/missing hardware, exact-name connection icons, and narrow-screen layouts. These checks exercise passive metadata; they do not run inference or discover remote hardware.
|
|
73
|
-
|
|
74
|
-
The terminal identity checks additionally cover all 21 sample models across inventory, requests, deployments and residency; official versus arbitrary model namespaces; unknown-name fallbacks; runtime/maker separation; and consistent HTML/SVG asset selection. Browser checks cover model and service marks on all six views, search results, deployment/path/source/model inspectors, and loaded-model rows, plus image loading without external requests, mobile overflow, and nonduplicated accessible names.
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
The terminal naming tests cover source-supplied IDs without display names, absent workload labels, configured-address fallback for unnamed runtimes, full system hostnames, exported host name/hostname/ID precedence, and missing site/rack metadata. Browser checks cover colored all-path stacks and isolated paths, readable activity subtitles, compact Sources rows, name provenance inspectors, and host filters that appear only for reported sites. Sample naming is explicitly fictional.
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
Top-navigation browser checks cover all six tabs, manual arrow/Home/End activation, panel labels, direct hash views, source coverage, environment switching, command search, sticky positioning, responsive tab overflow, and focus/scroll preservation through a passive poll. The old sidebar and collapse controls are absent. Desktop and narrow layouts retain readable content with no page-level horizontal overflow.
|
|
81
|
-
|
|
82
|
-
### Installed terminal smoke test
|
|
83
|
-
|
|
84
|
-
The package-smoke CI job installs the npm tarball into a fresh directory, then runs `scripts/terminal-package-smoke.mjs` against its installed executable. It checks the CLI, packaged browser assets, cached passive collection, request-update deduplication, source loss/recovery, sample separation, read-only HTTP boundary, and shutdown. Its default runtime is a deterministic fixture; that test makes no inference calls.
|
|
85
|
-
|
|
86
|
-
For a separate real-runtime check, supply a disposable Ollama server with `smollm2:135m` already installed and unloaded:
|
|
87
|
-
|
|
88
|
-
```sh
|
|
89
|
-
node scripts/terminal-package-smoke.mjs /path/to/install/node_modules/.bin/openmerit --ollama-url http://127.0.0.1:11434 --output /tmp/terminal-evidence
|
|
46
|
+
./node_modules/.bin/pi --no-session --no-extensions -e ./packages/pi/src/index.ts --list-models
|
|
90
47
|
```
|
|
91
48
|
|
|
92
|
-
This
|
|
93
|
-
|
|
94
|
-
### Automatic application discovery (unreleased)
|
|
49
|
+
This checks extension loading and catalogue enumeration, not successful provider authentication or a completed product intent. CI also packs the package, installs it in a temporary directory, imports the core/protocol entry points, and loads the installed extension.
|
|
95
50
|
|
|
96
|
-
|
|
51
|
+
## Experimental sandbox
|
|
97
52
|
|
|
98
|
-
|
|
53
|
+
`npm run demo` builds a disposable sentiment-classification application through Pi and runs live provider calls. It requires Pi 0.87 with OpenRouter authentication and an application OpenRouter credential. It is separate from the fictional dashboard comparison and from the recorded website player.
|
|
99
54
|
|
|
100
|
-
The
|
|
55
|
+
The runner collects a baseline, interleaves incumbent/challenger calls on the prepared cases, records cost/token/latency evidence, submits results to the coordinator, and exercises a change and fresh checks in the temporary app. Missing usage, invalid output, or exhausted allowance stops the run. The default application-spend threshold is $1, checked after responses; Pi's own coding-model spend is excluded. This is not an in-flight provider cutoff.
|
|
101
56
|
|
|
102
|
-
|
|
57
|
+
The default models are `openai/gpt-4.1-mini` and `openai/gpt-4o-mini`. The runner supports `OPENMERIT_DEMO_BASELINE_MODEL`, comma-separated `OPENMERIT_DEMO_CANDIDATE_MODELS`, `OPENMERIT_DEMO_PI_MODEL`, `OPENMERIT_DEMO_REPETITIONS` (2–5), `OPENMERIT_DEMO_MAX_SPEND_USD` (up to $5), and `OPENMERIT_DEMO_SEED`. The printed temporary directory retains the app, plan, lifecycle state, per-call artifacts, comparison manifest, and summary. Small prepared examples do not establish representative product reliability.
|
|
103
58
|
|
|
104
|
-
|
|
59
|
+
## What evidence establishes
|
|
105
60
|
|
|
106
|
-
|
|
61
|
+
- **Unit verified:** deterministic behavior has automated coverage.
|
|
62
|
+
- **Runtime smoke verified:** the runtime loads the extension or executable.
|
|
63
|
+
- **Product trial verified:** a representative application completes the workflow with inspected evidence.
|
|
64
|
+
- **Production verified:** repeated representative runs support the claimed operating conditions and reliability.
|
|
107
65
|
|
|
108
|
-
|
|
66
|
+
Implementation checks, historical demo recordings, and public model benchmarks cannot substitute for target-product validation. See [current limitations](roadmap.md) before relying on unattended changes.
|
|
109
67
|
|
|
110
68
|
|
|
111
|
-
|
|
69
|
+
## Agent-evaluation preview validation — 15 October 2026
|
|
112
70
|
|
|
113
|
-
|
|
71
|
+
The npm preview `0.1.7-preview.1` package adds a separate agent-evaluation loop. `npm run verify` passes 393 tests, plus syntax/type/build/documentation checks. Fifteen evaluation-runner tests cover fresh workspaces, frozen input bytes, scope acknowledgement, final-output parsing, balanced/adaptive repeats, revision compatibility, process timeout, invalid graders, connection errors, cumulative unknown-cost reservations, corrupt ledgers, file collisions, locking and watch coalescing.
|
|
114
72
|
|
|
73
|
+
An isolated installation of the actual npm tarball completed init, real hosted Scout planning and a disabled-budget check. Twelve simulated agent attempts through that installed command verified two CLI revisions, six attempts each, compatible deltas and persistent accounting. Simulated metrics are packaging tests, not model-performance evidence.
|
|
115
74
|
|
|
116
|
-
|
|
75
|
+
Real macOS smoke runs used Claude Code 2.1.7, Codex CLI 0.162.0-alpha.17.2 and OpenCode 1.18.30. On one tiny JavaScript normalization fixture, with three fresh attempts per route, Claude/Haiku 4.5 and Codex/GPT-6 Luna passed all executable checks. OpenCode/Gemini 2.5 Flash Lite passed one of three. Costs remained unknown for Codex. These different model/harness combinations validate execution and grading paths; they are not an unbiased comparison of agents or a general model ranking. Earlier smoke runs deliberately exposed unsupported authentication/model access, native permission failures, a timeout and invalid JSON. Those cases informed connection-error handling and conservative partial-cost accounting. No model-specific ranking rule was added.
|
|
117
76
|
|
|
118
|
-
|
|
77
|
+
Scout Worker `7ddeacd3-1310-48bd-b546-60fcab4fa4ef` passed live HTTP/MCP checks for pre-ranking model eligibility, empty inventory and duplicate-ID rejection. npm publication is separate from the successful tarball installation; the registry credential returned HTTP 401 during release preparation.
|
package/docs/troubleshooting.md
CHANGED
|
@@ -42,11 +42,11 @@ Pending or active intent state is durable. Inspect `state.json` and `events.json
|
|
|
42
42
|
|
|
43
43
|
## Checks are not running while Pi is closed
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
On macOS, check that the confirmed policy requests persistent execution and allows infrastructure changes, that the Mac user is logged in, and that Pi authentication works without shell-only credentials. `/openmerit doctor` reports scheduler diagnostics; `.openmerit/scheduler-status.json` records completed wakeups and failures. An active pause unloads the managed LaunchAgent. Other platforms need an external scheduler. A successful schedule does not establish that model-driven work completed. See [automatic checks](automation.md).
|
|
46
46
|
|
|
47
|
-
##
|
|
47
|
+
## Work continues after pausing
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
Pause is durable and gates automatic work, but an already-active intent can continue and explicit commands remain available. Inspect the active intent and audit timestamps to distinguish prior work from a new automatic dispatch. `/openmerit cancel` records abandonment; it does not terminate a provider request or harness process. The standalone terminal is independent of Pi pause; stop its CLI with Ctrl+C to stop collection. If a new automatic intent starts while the persisted pause is active, record a sanitized reproduction and your installed version.
|
|
50
50
|
|
|
51
51
|
## Report a reproducible problem
|
|
52
52
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openmerit",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7-preview.1",
|
|
4
4
|
"description": "Evidence-driven model decisions for coding harnesses.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"dist/protocol/",
|
|
20
20
|
"dist/pi/",
|
|
21
21
|
"dist/terminal/",
|
|
22
|
+
"dist/eval/",
|
|
22
23
|
"docs/",
|
|
23
24
|
"CHANGELOG.md",
|
|
24
25
|
"LICENSE",
|
|
@@ -77,10 +78,14 @@
|
|
|
77
78
|
"check:docs": "npm run build:docs && node --test scripts/docs.test.mjs",
|
|
78
79
|
"check:demo": "node --test demo/test/*.test.mjs",
|
|
79
80
|
"prepare": "npm run build",
|
|
80
|
-
"verify": "npm test && npm run check && npm run typecheck && npm run build && npm run check:demo && npm run check:docs && git diff --check",
|
|
81
|
+
"verify": "npm test && npm run check && npm run typecheck && npm run build && npm run check:demo && npm run check:scout && npm run check:docs && npm run build:scout && git diff --check",
|
|
81
82
|
"prepublishOnly": "npm run verify",
|
|
82
83
|
"build:dash-preview": "node scripts/build-terminal-preview.mjs",
|
|
83
|
-
"deploy:dash-preview": "npx --yes wrangler@4.136.3 deploy --config wrangler.terminal.jsonc"
|
|
84
|
+
"deploy:dash-preview": "npx --yes wrangler@4.136.3 deploy --config wrangler.terminal.jsonc",
|
|
85
|
+
"scout": "node scout/dev.mjs",
|
|
86
|
+
"scout:refresh": "node scout/refresh.mjs",
|
|
87
|
+
"check:scout": "node --test scout/test/*.test.mjs && node --check scout/worker.mjs && node --check site/scout/scout.js",
|
|
88
|
+
"build:scout": "node scripts/build-scout.mjs"
|
|
84
89
|
},
|
|
85
90
|
"dependencies": {
|
|
86
91
|
"@earendil-works/pi-ai": "0.87.0",
|
|
@@ -104,6 +109,7 @@
|
|
|
104
109
|
"@xyflow/react": "12.12.0",
|
|
105
110
|
"elkjs": "0.12.0",
|
|
106
111
|
"esbuild": "0.28.2",
|
|
112
|
+
"fflate": "0.8.2",
|
|
107
113
|
"liveline": "0.0.7",
|
|
108
114
|
"markdown-it": "15.0.2",
|
|
109
115
|
"minisearch": "7.2.0",
|