openmerit 0.1.12 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +5 -8
  3. package/dist/pi/scout-extension.mjs +23 -10
  4. package/dist/terminal/public/app.js +37 -37
  5. package/dist/terminal/public/styles.css +0 -125
  6. package/dist/terminal/scout-update.json +1 -1
  7. package/dist/terminal/src/cli.mjs +2 -0
  8. package/dist/terminal/src/install.mjs +1 -0
  9. package/dist/terminal/src/scout-instructions.d.ts +2 -2
  10. package/dist/terminal/src/scout-instructions.js +23 -10
  11. package/dist/terminal/src/scout-instructions.ts +23 -10
  12. package/dist/terminal/src/scout.d.ts +77 -0
  13. package/dist/terminal/src/scout.js +181 -0
  14. package/dist/terminal/src/scout.ts +164 -0
  15. package/dist/terminal/src/server.mjs +1 -1
  16. package/docs/commands.md +2 -78
  17. package/docs/getting-started.md +2 -2
  18. package/docs/index.md +4 -13
  19. package/docs/inference-terminal.md +2 -63
  20. package/docs/pi-extension.md +1 -1
  21. package/docs/roadmap.md +4 -17
  22. package/docs/scout.md +29 -250
  23. package/docs/security.md +5 -17
  24. package/docs/testing.md +7 -35
  25. package/docs/troubleshooting.md +1 -1
  26. package/package.json +4 -24
  27. package/dist/core/src/index.d.ts +0 -101
  28. package/dist/core/src/index.js +0 -1649
  29. package/dist/core/src/store.d.ts +0 -35
  30. package/dist/core/src/store.js +0 -102
  31. package/dist/protocol/src/index.d.ts +0 -484
  32. package/dist/protocol/src/index.js +0 -47
  33. package/dist/protocol/src/schemas.d.ts +0 -576
  34. package/dist/protocol/src/schemas.js +0 -280
  35. package/dist/terminal/public/brands/vllm.ico +0 -0
  36. package/dist/terminal/public/flow.css +0 -1
  37. package/dist/terminal/public/flow.js +0 -770
  38. package/dist/terminal/src/demo-policy.mjs +0 -205
  39. package/dist/terminal/src/enterprise-sample.mjs +0 -151
  40. package/docs/adapter-guide.md +0 -191
  41. package/docs/architecture.md +0 -61
  42. package/docs/automation.md +0 -76
  43. package/docs/budgets.md +0 -39
  44. package/docs/demo-backfill.md +0 -31
  45. package/docs/demo-fieldkit.md +0 -49
  46. package/docs/demo-placement.md +0 -32
  47. package/docs/demo-spam.md +0 -17
  48. package/docs/demo-support.md +0 -44
  49. package/docs/demo.md +0 -74
  50. package/docs/first-trial.md +0 -62
  51. package/docs/interactive-demo.md +0 -118
  52. package/docs/lifecycle.md +0 -32
  53. package/docs/metrics-and-evidence.md +0 -48
  54. package/docs/operations.md +0 -40
  55. package/docs/pareto-spec.md +0 -76
  56. package/docs/ux-reference.md +0 -32
package/docs/testing.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Testing and validation
2
2
 
3
- **Pi source replacement — unreleased and unpublished:** the new Pi 1.5.0 adapter uses native Scout MCP and shared guidance only. The dated Pi 0.87 lifecycle/scheduler results below remain historical receipts, not proof of the replacement or supported current commands. Package, browser-approval, native Pi and SDK acceptance must be reported for the new build separately; a successful documentation build alone establishes none of them. Core coordinator and standalone evaluation tests remain separate.
3
+ **Pi adapter — npm 0.1.12 and later:** the Pi 1.5.0 adapter uses native Scout MCP and shared guidance only. Dated acceptance records below describe the packages tested at the time; some mention package exports that have since been removed. Standalone evaluation tests remain separate.
4
4
 
5
5
  ## Stable 0.1.7 acceptance — 24 October 2026
6
6
 
@@ -34,7 +34,7 @@ The final production deployment passed **203/203 VM assertions and 8/8 filter/am
34
34
 
35
35
  The published `0.1.7-preview.4` package passed the full repository verification, including 329 Scout tests and documentation checks. Its packaged runtime is byte-for-byte unchanged from preview.3; version metadata and public guides carry this release. Registry integrity matches the reviewed tarball, the `preview` tag resolves to this version, and stable `latest` remains `0.1.6`. Scout deploys independently and its UI files are unchanged. Broader evidence coverage, task calibration and complete quality/cost/latency validation remain follow-up work.
36
36
 
37
- The hosted beta's public post-deployment suite passed 9/11 cases. Explicit SVG generation returned no shortlist; a Qwen-family code-authoring request admitted tool-calling evidence. Restriction checks passed for creator, family, context and dates, including known matches and impossible-context no-match. The actual bird prompt also displayed five recommendations in a browser. Earlier candidate deadline and interpretation failures are retained in the [Scout validation record](scout.md#task-relevance-corrections-hosted-beta-17-october-2026). These checks do not establish universal semantic reliability or improved task accuracy.
37
+ The hosted beta's public post-deployment suite passed 9/11 cases. Explicit SVG generation returned no shortlist; a Qwen-family code-authoring request admitted tool-calling evidence. Restriction checks passed for creator, family, context and dates, including known matches and impossible-context no-match. The actual bird prompt also displayed five recommendations in a browser. Earlier candidate deadline and interpretation failures were recorded separately at the time. These checks do not establish universal semantic reliability or improved task accuracy.
38
38
 
39
39
  Fresh registry installation in the existing Ubuntu ARM64 Lima VM verified all 101 packaged file hashes, registry integrity and public core/protocol/Pi exports. Seven workloads were sent through both HTTP and the official MCP SDK. Six of those fourteen requests failed their functional expectations: books/posters and invoice HTTP requests returned unavailable responses, while SQL generation and safety classification with rewriting returned empty shortlists through both interfaces. The matching MCP books/posters and invoice requests succeeded; bird identification, label-only classification and unsupported audio behaved as expected. The first harness stopped when it assumed SQL had returned an endpoint. A separate continuation tested exact endpoint scope using the successful bird result, request/protocol errors and installed CLI planning, preserving all original failures. Together the runs recorded 187 passing checks and nine failed assertions, including duplicate agreement failures caused by unavailable responses and an installed-CLI candidate check. Both CLI email and SQL plans were empty. Planning created no execution or spend state, and the existing global VM installation was retained. This is not a clean acceptance pass. The seven first HTTP workload requests had a median wall time of 4.924 seconds and a maximum of 6.229 seconds, including unavailable responses; repeated cached requests were faster.
40
40
 
@@ -60,14 +60,6 @@ npm pack --dry-run
60
60
 
61
61
  `verify` runs workspace tests, syntax checks, strict TypeScript checks and the TypeScript migration ratchet, the package build, demo tests, generated-documentation checks, and whitespace validation. It does not publish a package or deploy the website.
62
62
 
63
- ## Coordinator and Pi coverage
64
-
65
- 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.
66
-
67
- 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.
68
-
69
- 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.
70
-
71
63
  ## Inference Terminal coverage
72
64
 
73
65
  ```sh
@@ -76,35 +68,15 @@ npm test --workspace=@openmerit/terminal
76
68
 
77
69
  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.
78
70
 
79
- 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.
71
+ 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, and preservation of unknown costs. Runtime fixtures establish which endpoints collectors call; they do not prove compatibility with every external runtime version.
80
72
 
81
- The three fictional scenarios are separate:
73
+ The local fictional sample (`--demo` or the sample selector) has 40 agents, 140 tasks, 21 models and 9,600 requests over 24 hours. Sample tests exercise interface scale and arithmetic, not measured throughput, application quality, or hardware performance.
82
74
 
83
- | Scenario | Agents | Tasks | Models / offers | Requests |
84
- | --- | ---: | ---: | --- | ---: |
85
- | Local sample (`--demo` or sample selector) | 40 | 140 | 21 models | 9,600 over 24 hours |
86
- | Hosted enterprise sample | 200 | 699 | 21 models | 9.6 million over 30 days |
87
- | Hosted before/after comparison | 280 | 980 | 26 reviewed offers across six services; assignments depend on preference | 9.6 million over 30 days |
88
-
89
- 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.
90
-
91
- 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.
75
+ Browser review covers the six views, inspectors, search, activity ranges, map and chart interaction, keyboard navigation, reduced motion, and desktop/narrow layouts. Browser checks are distinct from the committed unit suite.
92
76
 
93
77
  ## Pi load and package smoke tests
94
78
 
95
- ```sh
96
- ./node_modules/.bin/pi --no-session --no-extensions -e ./packages/pi/src/index.ts --list-models
97
- ```
98
-
99
- 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.
100
-
101
- ## Experimental sandbox
102
-
103
- `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.
104
-
105
- 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.
106
-
107
- 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.
79
+ CI packs the package, installs it in a temporary directory, imports `openmerit/pi`, smoke-tests the installed terminal command, and loads the installed extension in Pi with `--list-models`. These checks establish packaging and loading, not successful provider authentication or Scout recommendations.
108
80
 
109
81
  ## What evidence establishes
110
82
 
@@ -113,7 +85,7 @@ The default models are `openai/gpt-4.1-mini` and `openai/gpt-4o-mini`. The runne
113
85
  - **Product trial verified:** a representative application completes the workflow with inspected evidence.
114
86
  - **Production verified:** repeated representative runs support the claimed operating conditions and reliability.
115
87
 
116
- 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.
88
+ Implementation checks and public model benchmarks cannot substitute for target-product validation. See [current limitations](roadmap.md).
117
89
 
118
90
 
119
91
  ## Agent-evaluation preview validation — 15 October 2026
@@ -33,7 +33,7 @@ That is expected. Pi has no OpenMerit auto-update hooks. Explicitly rerun `insta
33
33
 
34
34
  ## `/openmerit` or evaluation tools are missing
35
35
 
36
- They were removed, not renamed. The Pi adapter now supplies only native Scout MCP and shared guidance. It does not set up evaluations, recover intents, schedule work, swap models, or install a LaunchAgent. Existing legacy background jobs must be removed separately; installing the new adapter is not evidence that they stopped. Preserve old evaluation state and audit files if needed. For new evaluations use [the standalone CLI](agent-evaluations.md); custom harnesses may still use [the core coordinator](adapter-guide.md).
36
+ They were removed, not renamed. The Pi adapter now supplies only native Scout MCP and shared guidance. It does not set up evaluations, recover intents, schedule work, swap models, or install a LaunchAgent. Existing legacy background jobs must be removed separately; installing the new adapter is not evidence that they stopped. Preserve old evaluation state and audit files if needed. For new evaluations use [the standalone CLI](agent-evaluations.md).
37
37
 
38
38
  ## Scout was not consulted or its evidence is insufficient
39
39
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openmerit",
3
- "version": "0.1.12",
3
+ "version": "0.2.0",
4
4
  "description": "Evidence-driven model decisions for coding harnesses.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -11,12 +11,9 @@
11
11
  "pi-package",
12
12
  "pi-extension",
13
13
  "model-routing",
14
- "evaluation",
15
- "pareto-frontier"
14
+ "evaluation"
16
15
  ],
17
16
  "files": [
18
- "dist/core/",
19
- "dist/protocol/",
20
17
  "dist/pi/",
21
18
  "dist/terminal/",
22
19
  "dist/eval/",
@@ -26,18 +23,6 @@
26
23
  "README.md"
27
24
  ],
28
25
  "exports": {
29
- ".": {
30
- "types": "./dist/core/src/index.d.ts",
31
- "default": "./dist/core/src/index.js"
32
- },
33
- "./core": {
34
- "types": "./dist/core/src/index.d.ts",
35
- "default": "./dist/core/src/index.js"
36
- },
37
- "./protocol": {
38
- "types": "./dist/protocol/src/index.d.ts",
39
- "default": "./dist/protocol/src/index.js"
40
- },
41
26
  "./pi": {
42
27
  "types": "./dist/pi/src/index.d.ts",
43
28
  "default": "./dist/pi/src/index.js"
@@ -77,7 +62,6 @@
77
62
  "deploy": "node scripts/deploy.ts",
78
63
  "deploy:status": "node scripts/deploy.ts status",
79
64
  "build": "node scripts/build.mjs",
80
- "demo": "node scripts/demo.mjs",
81
65
  "predash": "node scripts/build-terminal.mjs",
82
66
  "dash": "node packages/terminal/src/cli.mjs dash",
83
67
  "build:docs": "node scripts/build-docs.mjs",
@@ -87,8 +71,6 @@
87
71
  "prepare": "npm run build",
88
72
  "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",
89
73
  "prepublishOnly": "npm run verify",
90
- "build:dash-preview": "node scripts/build-terminal-preview.mjs",
91
- "deploy:dash-preview": "node scripts/deploy.ts terminal-preview",
92
74
  "scout": "node scout/dev.mjs",
93
75
  "scout:refresh": "node scout/refresh.mjs",
94
76
  "check:scout": "node --test scout/test/*.test.mjs scout/test/*.test.ts && node --check scout/worker.mjs",
@@ -98,8 +80,6 @@
98
80
  "@iarna/toml": "2.2.5",
99
81
  "@lezer/javascript": "1.5.6",
100
82
  "@lezer/python": "1.1.19",
101
- "hyparquet": "1.31.5",
102
- "typebox": "1.3.27",
103
83
  "yaml": "2.9.1"
104
84
  },
105
85
  "peerDependencies": {
@@ -117,10 +97,9 @@
117
97
  "@resvg/resvg-js": "2.6.2",
118
98
  "@types/markdown-it": "14.1.2",
119
99
  "@types/node": "^22.18.6",
120
- "@xyflow/react": "12.12.0",
121
- "elkjs": "0.12.0",
122
100
  "esbuild": "0.28.2",
123
101
  "fflate": "0.8.2",
102
+ "hyparquet": "1.31.5",
124
103
  "liveline": "0.0.7",
125
104
  "markdown-it": "15.0.2",
126
105
  "miniflare": "5.20260921.0-alpha",
@@ -129,6 +108,7 @@
129
108
  "react": "19.3.0",
130
109
  "react-dom": "19.3.0",
131
110
  "torph": "0.1.3",
111
+ "typebox": "1.3.27",
132
112
  "typescript": "^5.9.3",
133
113
  "web-vitals": "6.2.3",
134
114
  "wrangler": "4.136.3"
@@ -1,101 +0,0 @@
1
- import type { AnyIntentResult, AutomationPlan, AutomationSignal, CandidateAssessment, FrontierSnapshot, HarnessCapability, HarnessDescriptor, HarnessDispatchReceipt, HarnessWakeupRequest, TaskProfile, ImprovementCycleState, IntentLifecycleUpdate, IntentKind, OpenMeritIntent, OpenMeritProjectConfig, OpenMeritProjectState, ObservabilityCoverage, JsonValue, SupervisedGraduationPolicy } from "../../protocol/src/index.ts";
2
- import type { OpenMeritStore } from "./store.ts";
3
- export { OPENMERIT_DIRECTORY, ProjectStore, type AuditEventExporter, type OpenMeritStore, type ProjectStoreOptions, } from "./store.ts";
4
- export interface HarnessAdapter {
5
- readonly descriptor: HarnessDescriptor;
6
- dispatch(intent: OpenMeritIntent): Promise<HarnessDispatchReceipt>;
7
- scheduleWakeup?(request: HarnessWakeupRequest): Promise<HarnessDispatchReceipt>;
8
- }
9
- export interface IntentFactoryOptions {
10
- readonly taskProfileId?: string | undefined;
11
- readonly authorizationPolicyId?: string;
12
- readonly policy?: SupervisedGraduationPolicy | undefined;
13
- readonly id?: string;
14
- readonly requestedAt?: string;
15
- readonly evaluationSpend?: number | undefined;
16
- readonly targetId?: string | undefined;
17
- readonly additionalConstraints?: Readonly<Record<string, JsonValue>>;
18
- }
19
- export declare function createOpenMeritIntent(kind: IntentKind, options?: IntentFactoryOptions): OpenMeritIntent;
20
- export declare function missingHarnessCapabilities(descriptor: HarnessDescriptor, kind: IntentKind): readonly HarnessCapability[];
21
- export declare function validateHarnessDescriptor(descriptor: HarnessDescriptor): VerificationResult;
22
- export declare function dispatchToHarness(adapter: HarnessAdapter, intent: OpenMeritIntent): Promise<HarnessDispatchReceipt>;
23
- export declare function startedStage(kind: IntentKind): ImprovementCycleState["stage"];
24
- export declare function completedStage(kind: IntentKind, succeeded: boolean): ImprovementCycleState["stage"];
25
- export interface VerificationResult {
26
- readonly valid: boolean;
27
- readonly errors: readonly string[];
28
- }
29
- export interface ResultInterpretation extends VerificationResult {
30
- readonly nextStage?: ImprovementCycleState["stage"];
31
- readonly config?: OpenMeritProjectConfig | undefined;
32
- readonly cyclePatch?: Partial<ImprovementCycleState> | undefined;
33
- }
34
- export declare function validateObservabilityCoverage(profile: TaskProfile, coverage: ObservabilityCoverage, requireReady: boolean): readonly string[];
35
- export declare function interpretIntentResult(intent: OpenMeritIntent, result: AnyIntentResult, cycle: ImprovementCycleState, config: OpenMeritProjectConfig): ResultInterpretation;
36
- export type OrchestrationDecision = {
37
- readonly action: "issue_intent";
38
- readonly intentKind: IntentKind;
39
- readonly reason: string;
40
- } | {
41
- readonly action: "await_user";
42
- readonly reason: string;
43
- } | {
44
- readonly action: "observe";
45
- readonly reason: string;
46
- };
47
- export declare function nextImprovementAction(state: ImprovementCycleState): OrchestrationDecision;
48
- export declare function verifyFrontierSnapshot(profile: TaskProfile, assessments: readonly CandidateAssessment[], snapshot: FrontierSnapshot): VerificationResult;
49
- export interface IssuedIntent {
50
- readonly intent: OpenMeritIntent;
51
- readonly state: OpenMeritProjectState;
52
- readonly receipt: HarnessDispatchReceipt;
53
- }
54
- export interface CoordinatorIssueOptions {
55
- readonly additionalConstraints?: Readonly<Record<string, JsonValue>> | undefined;
56
- }
57
- export interface AcceptedIntentResult {
58
- readonly intentKind: IntentKind;
59
- readonly state: OpenMeritProjectState;
60
- readonly interpretation: ResultInterpretation;
61
- readonly automation: {
62
- readonly plan: AutomationPlan;
63
- readonly receipt?: HarnessDispatchReceipt;
64
- };
65
- }
66
- export interface ObservationResult {
67
- readonly state: OpenMeritProjectState;
68
- readonly assessmentDue: boolean;
69
- }
70
- export interface CatalogChangeResult {
71
- readonly state: OpenMeritProjectState;
72
- readonly changed: boolean;
73
- readonly reassessmentDue: boolean;
74
- }
75
- export interface AutomationSignalResult {
76
- readonly state: OpenMeritProjectState;
77
- readonly duplicate: boolean;
78
- readonly decision: OrchestrationDecision;
79
- }
80
- export declare function buildAutomationPlan(state: OpenMeritProjectState, descriptor: HarnessDescriptor): AutomationPlan;
81
- /** Harness-neutral durable coordinator. Adapters transport jobs; this class owns lifecycle state. */
82
- export declare class OpenMeritCoordinator {
83
- private readonly store;
84
- private readonly adapter;
85
- constructor(store: OpenMeritStore, adapter: HarnessAdapter);
86
- issue(kind: IntentKind, options?: CoordinatorIssueOptions): Promise<IssuedIntent>;
87
- reconcileAutomation(now?: string): Promise<{
88
- readonly plan: AutomationPlan;
89
- readonly receipt?: HarnessDispatchReceipt;
90
- }>;
91
- acceptResult(result: AnyIntentResult): Promise<AcceptedIntentResult>;
92
- recordLifecycle(update: IntentLifecycleUpdate): Promise<void>;
93
- recordTaskObservation(details?: Readonly<Record<string, JsonValue>>): Promise<ObservationResult>;
94
- assessBaseline(now?: string): Promise<{
95
- readonly state: OpenMeritProjectState;
96
- readonly errors: readonly string[];
97
- readonly decision: OrchestrationDecision;
98
- }>;
99
- recordAutomationSignal(signal: AutomationSignal): Promise<AutomationSignalResult>;
100
- recordModelCatalogFingerprint(fingerprint: string): Promise<CatalogChangeResult>;
101
- }