openmerit 0.1.6 → 0.1.7-preview.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -4
- package/README.md +61 -40
- package/dist/eval/src/adapters.mjs +112 -0
- package/dist/eval/src/cli.mjs +151 -0
- package/dist/eval/src/config.mjs +108 -0
- package/dist/eval/src/process.mjs +44 -0
- package/dist/eval/src/report.mjs +59 -0
- package/dist/eval/src/runner.mjs +123 -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 +145 -0
- package/docs/architecture.md +3 -3
- package/docs/automation.md +5 -5
- package/docs/budgets.md +2 -2
- package/docs/commands.md +9 -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 +8 -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 +133 -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 +46 -68
- package/docs/troubleshooting.md +3 -3
- package/package.json +9 -3
package/docs/testing.md
CHANGED
|
@@ -1,118 +1,96 @@
|
|
|
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
|
-
|
|
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.
|
|
40
28
|
|
|
41
|
-
|
|
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.
|
|
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.
|
|
44
30
|
|
|
45
|
-
|
|
31
|
+
The three fictional scenarios are separate:
|
|
46
32
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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 |
|
|
51
38
|
|
|
52
|
-
The
|
|
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.
|
|
53
40
|
|
|
54
|
-
|
|
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.
|
|
55
42
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
Requirements: Node.js 22.19+, Pi 0.87.x with OpenRouter coding-harness authentication, and an OpenRouter application credential available as `OPENROUTER_API_KEY` or in Pi's local `auth.json`. The coding-harness credential is not passed to the generated application; the demo runner supplies the application credential only while making provider calls.
|
|
43
|
+
## Pi load and package smoke tests
|
|
59
44
|
|
|
60
45
|
```sh
|
|
61
|
-
|
|
46
|
+
./node_modules/.bin/pi --no-session --no-extensions -e ./packages/pi/src/index.ts --list-models
|
|
62
47
|
```
|
|
63
48
|
|
|
64
|
-
|
|
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.
|
|
65
50
|
|
|
66
|
-
|
|
51
|
+
## Experimental sandbox
|
|
67
52
|
|
|
68
|
-
|
|
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.
|
|
69
54
|
|
|
70
|
-
|
|
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.
|
|
71
56
|
|
|
72
|
-
|
|
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.
|
|
73
58
|
|
|
74
|
-
|
|
59
|
+
## What evidence establishes
|
|
75
60
|
|
|
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.
|
|
76
65
|
|
|
77
|
-
|
|
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.
|
|
78
67
|
|
|
79
68
|
|
|
80
|
-
|
|
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
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
This opt-in test application makes four real local generation calls. The terminal itself still reads only inventory endpoints and a temporary metadata export. Two requests are exported with Ollama's actual token and timing measurements. A separate, explicitly synthetic running-to-completed record tests update semantics. A generation without an export must produce no invented request or agent history. The test removes its temporary project and stops its terminal process; the caller owns the disposable runtime's lifecycle. The JSON report excludes prompts and generated text. No cloud credentials are needed.
|
|
69
|
+
## Agent-evaluation preview validation — 15 October 2026
|
|
93
70
|
|
|
94
|
-
|
|
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.
|
|
95
72
|
|
|
96
|
-
|
|
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.
|
|
97
74
|
|
|
98
|
-
|
|
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.
|
|
99
76
|
|
|
100
|
-
|
|
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.
|
|
101
78
|
|
|
102
|
-
### Historical VM check with Pi history (superseded)
|
|
103
79
|
|
|
104
|
-
|
|
80
|
+
### Published preview on Linux — 15 October 2026
|
|
105
81
|
|
|
106
|
-
|
|
82
|
+
Installed `openmerit@0.1.7-preview.1` from npm into a separate prefix in the existing Ubuntu ARM64 VM. The live Scout API returned a frozen shortlist within the declared OpenRouter connections. A deterministic CSV grader scored quoted commas, escaped quotes, leading-zero identifiers and field types; the uncorrected and corrected CLI passed 8/12 and 12/12 checks respectively in grader sanity checks.
|
|
107
83
|
|
|
108
|
-
The
|
|
84
|
+
Claude Code/Haiku 4.5 completed three attempts per revision at 66.7% then 100% mean field accuracy. The combined watcher stopped on budget admission before OpenCode’s last post-change attempt, so its report has no automatic comparison. A separate OpenCode/Gemini 2.5 Flash Lite watcher completed three attempts per revision at 66.7% then 100%, detected the source edit, emitted token/cost/time deltas, and exited cleanly. Earlier partial trials remain separate. Codex/GPT-4.1 Mini could not execute filesystem tools under this VM’s Linux sandbox; no passing Codex task result is claimed. Total account usage was approximately $0.26 including diagnostics, while native reported estimates differed. One authored fixture and three repetitions do not establish general performance or a cost improvement. Source and diagnostic artifacts are retained in the task’s `openmerit-vm-eval` directory; a scan found no temporary key in the 66 test-project files.
|
|
109
85
|
|
|
86
|
+
### Accounting corrections on Linux — unreleased source, 15 October 2026
|
|
110
87
|
|
|
111
|
-
|
|
88
|
+
The source package was packed and installed into a separate VM prefix; the registry preview and existing VM installations were left unchanged. All 400 repository tests pass, including 22 eval-runner tests. The added cases cover partial usage/cost recovery, missing prices, conservative old/new ledgers, scored wrong answers, native budget and permission blocks, zero-exit sandbox failures, and the free Linux sandbox probe. Replaying the previously captured Claude budget response recovers 30,820 input tokens and 196 output tokens instead of zero.
|
|
112
89
|
|
|
113
|
-
|
|
90
|
+
The real Codex connection now stops during sandbox preflight with `environment_blocked`, zero attempts, no reserved allowance and no inference spend. A deliberately small Claude budget stops after one attempt with unknown quality, 21,532 input tokens, 190 output tokens and a retained $0.110705 partial native estimate. A second normal-run attempt also hit its native cap; its unscored record and $0.1505768 reservation were preserved. With sufficient per-attempt allowance, Claude completed three scored CSV attempts at 100%, a 12.82-second median, and a $0.06029 mean native estimate. This is not a billed-dollar measurement or a before/after Claude comparison.
|
|
114
91
|
|
|
92
|
+
OpenCode's real watcher completed three attempts per revision. The earlier CLI averaged 44.4% field accuracy (one actual zero-score task output remained included); the corrected CLI averaged 100%. Median times were 5.05 and 5.79 seconds. One earlier and two later attempts had incomplete native step pricing, so the cost means and cost delta correctly remained unknown while partial estimates were retained. The cumulative reservation stayed at $0.03. These checks validate accounting and failure separation on the same integration fixture, not general task quality, model ordering or savings. Sanitized reports, package and verification output are retained in the task's `openmerit-eval-accounting` directory.
|
|
115
93
|
|
|
116
|
-
###
|
|
94
|
+
### Budget setup — unreleased source, 15 October 2026
|
|
117
95
|
|
|
118
|
-
The
|
|
96
|
+
The eval suite now has 29 tests. New coverage checks the three budget choices after scope, custom amount validation, explicit unlimited configuration, reuse of saved choices, automatic reservations, retained cumulative usage, bounded repetitions and cancellation. A real CLI subprocess uses a loopback Scout fixture to verify persistence across replans and failed requests, rejection of missing or invalid noninteractive choices, and lock cleanup. An interactive terminal smoke test also verifies scope-before-budget, custom input, no-repeat questions, no fixed cap and EOF cancellation. These are offline workflow tests; no model calls, provider charges or npm publication were required.
|
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.2",
|
|
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",
|