From f5a36c2df1e531beec98de6d59c5abd6f43ecb9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=BAper=20=28Yousef=29=20Anas?= <97895153+Cuuper22@users.noreply.github.com> Date: Wed, 2 Sep 2026 23:21:28 -0700 Subject: [PATCH 1/2] feat: add WebMCP causal mission control Expose eight evidence-grounded WebMCP tools, human-only conclusion approval, visible receipts and causal highlights, bounded SHA-linked run projections, official evals, tests, and challenge disclosure. --- CHALLENGE.md | 174 ++++ LICENSE | 21 + README.md | 6 + docs/data/webmcp-run-projection-v1.json.gz | Bin 0 -> 249304 bytes docs/observatory.html | 84 +- docs/observatory.js | 60 +- docs/styles/99-webmcp-mission.css | 769 +++++++++++++++ docs/webmcp-mission.js | 1039 ++++++++++++++++++++ docs/webmcp-tools.js | 556 +++++++++++ evals/webmcp-evals.json | 160 +++ scripts/generate_webmcp_projection.py | 171 ++++ tests/test_webmcp_contract.py | 373 +++++++ tests/test_webmcp_mission_runtime.mjs | 241 +++++ tests/test_webmcp_projection.py | 66 ++ 14 files changed, 3718 insertions(+), 2 deletions(-) create mode 100644 CHALLENGE.md create mode 100644 LICENSE create mode 100644 docs/data/webmcp-run-projection-v1.json.gz create mode 100644 docs/styles/99-webmcp-mission.css create mode 100644 docs/webmcp-mission.js create mode 100644 docs/webmcp-tools.js create mode 100644 evals/webmcp-evals.json create mode 100644 scripts/generate_webmcp_projection.py create mode 100644 tests/test_webmcp_contract.py create mode 100644 tests/test_webmcp_mission_runtime.mjs create mode 100644 tests/test_webmcp_projection.py diff --git a/CHALLENGE.md b/CHALLENGE.md new file mode 100644 index 0000000..4e473fa --- /dev/null +++ b/CHALLENGE.md @@ -0,0 +1,174 @@ +# GPUSTACK Causal Mission Control + +**WebMCP Challenge 2026 entry** + +GPUSTACK is a virtual AI datacenter whose full Python model connects 1,517 variables across training, kernels, memory, interconnects, thermals, power delivery, economics, semiconductor devices, lithography, materials, and physical constants. The browser publishes immutable experiment artifacts and a 700-node dependency cone rather than running that model. Causal Mission Control turns the existing observatory into a shared evidence-audit surface: an agent handles the breadth of the published evidence, while the human owns the scientific conclusion. + +- **Live application:** +- **Public source:** +- **Pre-WebMCP baseline:** [`3d7339a87e13c4f809ed223c2aa299fb3f631799`](https://github.com/Cuuper22/gpu_stack-/commit/3d7339a87e13c4f809ed223c2aa299fb3f631799) +- **Baseline tag:** `pre-webmcp-baseline` + +## Challenge-window disclosure + +GPUSTACK is an existing project. The baseline commit above, merged August 13, 2026, is the exact state immediately before the WebMCP Challenge extension. It is preserved in Git history and tagged so reviewers can separate the new work from the underlying project. + +### Existing before the challenge extension + +- The Python registry-backed equation graph and resolver +- The virtual datacenter, scenario runners, and preregistered research program +- Existing experiment results and evidence JSON +- The Causal Observatory, its visual design, charts, data loaders, and normal human controls +- The public GitHub Pages deployment + +### Added for the WebMCP Challenge after August 25, 2026 + +- Top-level imperative WebMCP registration for eight domain-specific tools +- A bounded adapter between WebMCP tool calls and the observatory's published, immutable artifacts +- A generated scalar-only projection of the existing E001-SC1 raw trace, so an agent can inspect bounded epoch slices without loading the roughly 72 MB authoritative artifact +- Visible causal spotlight, agent activity, pending-review, receipt, and undo surfaces +- A local review workflow with a distinct human approval boundary +- Structured results carrying affected model IDs and current state version +- Contract tests for registration, schemas, state effects, and failure behavior +- This challenge disclosure, a root open-source license, and the WebMCP eval suite + +The challenge contribution can be inspected directly with: + +```bash +git diff 3d7339a87e13c4f809ed223c2aa299fb3f631799..HEAD +git log --oneline 3d7339a87e13c4f809ed223c2aa299fb3f631799..HEAD +``` + +Only that post-baseline work is presented as the WebMCP Challenge submission. + +## Why WebMCP is load-bearing + +A screenshot-based agent sees windows, labels, and charts. It does not naturally know that `training.tokens_per_sec` is a typed model variable, which published dependencies lead to it, which quantities are measured or modeled, which experiment artifact supports a claim, or whether an operation merely inspects evidence or records a review decision. + +WebMCP exposes those domain objects and authority boundaries directly. The tools read the same immutable artifacts shown in the page, and each meaningful call leaves a visible selection, highlight, comparison, or review receipt. The result is not a chat layer over GPUSTACK: it is a semantic audit plane for evidence that would otherwise require laborious manual traversal. + +The extension deliberately does **not** pretend the static browser is a simulator. It cannot recompute the Python model, invent an intervention, or turn one small-model experiment into a frontier-scale claim. Its job is narrower and more defensible: find the relevant published evidence, preserve its boundary, and help a person judge what conclusion it supports. + +## Architecture + +| Layer | Path | Responsibility | +|---|---|---| +| WebMCP adapter | `docs/webmcp-tools.js` | Feature detection, JSON Schemas, imperative `document.modelContext.registerTool(...)` calls, bounded results, and abort handling | +| Mission handlers | `docs/webmcp-mission.js` via `window.GPUStackMission.invoke(name, args, { signal })` | Indexed, bounded reads over the shipped artifacts plus local review state and receipts | +| View bridge | `docs/observatory.js` via `window.GPUStackObservatory` | Applies tool-driven selections and causal highlights to the same observatory the human sees | +| Published data | `docs/data/*.json` | Immutable registry-cone and experiment evidence loaded by the observatory | +| Run projection | `scripts/generate_webmcp_projection.py` and `docs/data/webmcp-run-projection-v1.json.gz` | Reproducible, scalar-only view of all 56 E001-SC1 runs and 12,981 epochs; source hashes and omissions are explicit | +| Shared interface | `docs/observatory.html` and `docs/styles/99-webmcp-mission.css` | Human-visible selections, paths, pending reviews, receipts, and approval controls | +| Contract tests | `tests/test_webmcp_contract.py` | Registration, schema, tool inventory, safety boundary, and integration checks | +| Agent evals | `evals/webmcp-evals.json` | Official experimental WebMCP call-selection and trajectory cases | + +Registration occurs in the top-level document. If `document.modelContext` is unavailable, the observatory keeps working normally; the application does not install a fake compatibility object. Tool `execute` callbacks validate their inputs again in code and return compact, JSON-serializable objects. + +## Tools and authority + +| Tool | Mode | What it contributes to the shared page | +|---|---|---| +| `get_observatory_state` | Read-only | Returns the active immutable artifact, registered IDs, evidence boundary, visible selection, and current review state so the agent does not guess identifiers | +| `compare_stress_families` | Read-only | Compares all six held-out E001-SC1 families, or a named subset, across the registered learning, infrastructure, work, and abstention fields | +| `inspect_stress_family` | Read-only | Selects and explains one held-out family, its adaptive-versus-comparator deltas, uncertainty regions, abstention reason, and linked run IDs | +| `inspect_run` | Read-only | Opens an exact run, accepts a request of up to 20 epochs, and returns at most 6 scalar-projection rows per compact result while preserving the authoritative-trace binding | +| `trace_causal_path` | Read-only | Finds and highlights a bounded path through the seven-node conceptual evidence graph without collapsing its branches or evidence classes | +| `open_evidence` | Read-only | Opens a registered artifact, source result, assumption, uncertainty item, or missing-evidence boundary at a chosen semantic depth | +| `compare_policies` | Read-only | Compares up to three registered policies; by default it uses `observable_adaptive` and the calibration-frozen `periodic_local` comparator | +| `stage_conclusion` | Staging write | Places a supported, qualified, or abstain claim plus one to eight evidence IDs in the pending tray; it cannot approve or commit the claim | + +The first seven tools are annotated read-only. `stage_conclusion` affects only local pending-review state, never the source experiment JSON. No WebMCP tool can approve, reject, or undo a conclusion: those actions are page-only human controls. The agent can explore broadly and prepare a coherent evidence bundle, but it must stop at the judgment boundary. + +## Testing + +Run the WebMCP contract tests: + +```bash +python -m pytest tests/test_webmcp_contract.py -q +``` + +Run the complete Python suite: + +```bash +python -m pytest -q +``` + +Serve the static site locally: + +```bash +python -m http.server 8000 --directory docs +``` + +Then open in a WebMCP-enabled browser. The application must remain fully usable in an ordinary browser where WebMCP is absent. + +The eval file follows the official experimental [`webmcp-evals`](https://github.com/GoogleChromeLabs/webmcp-tools/tree/main/webmcp-evals) format. With the page already served, deterministic calls can be checked without an API key: + +```bash +npx webmcp-evals smoke \ + -u http://localhost:8000/observatory.html \ + -e evals/webmcp-evals.json \ + -v +``` + +For probabilistic tool selection and multi-step journeys: + +```bash +npx webmcp-evals browser \ + -u https://cuuper22.github.io/gpu_stack-/observatory.html \ + -e evals/webmcp-evals.json \ + --open +``` + +Final acceptance is performed against the deployed top-level page in ChatGPT desktop and a WebMCP-enabled Chrome build. Each demonstrated call must update the visible shared state before returning. + +## Judging-criteria map + +| Criterion | What to inspect | +|---|---| +| WebMCP leverage | Eight typed domain operations replace brittle UI-coordinate automation; calls operate on the published evidence graph and produce visible state transitions. The human/agent authority boundary depends on staged semantic actions. | +| Execution | The shipped surface contains a 700-node dependency cone and compact E001-SC1 summaries for 56 runs backed by 12,981 raw epochs. Inputs are validated, results are bounded, artifacts stay immutable, and local decisions leave receipts with undo. | +| Potential impact | Researchers can audit a result across stress families and evidence classes faster without giving an agent authority to upgrade an experiment into a stronger claim. The pattern applies to other evidence-heavy technical reviews. | +| Creativity and ambition | The browser becomes an evidence court: the agent traverses a dense causal record, but the human decides whether the claim survives its falsifier. | + +## Demo prompt + +> Audit whether E001-SC1's observable adaptive controller deserves a transferable win claim over `periodic_local`. Compare all six held-out stress families, inspect the failure, trace the evidence boundary, and stage the scientifically honest conclusion. Do not approve it for me. + +The demo is anchored to values already serialized in `docs/data/e001-semantic-consistency-v1.json`: + +| Audit fact | Published value | +|---|---| +| Experiment | `E001-SC1` | +| Candidate | `observable_adaptive` | +| Frozen comparator | `periodic_local`; selected on the calibration split before evaluation | +| Untouched evaluation families | `E1` through `E6` | +| Out-of-support abstentions | 104 total: 32 in `E2`, 48 in `E4`, and 24 in `E6` | +| Decisive E6 held-out NLL | adaptive `1.063824194483459`; comparator `0.9984574504196644` | +| Serialized conclusion | `abstain_without_policy_claim` | +| Evidence boundary | measured small-model learning, exact accounting, modeled infrastructure; frontier-scale transfer remains unresolved | + +A complete demo should make one coherent loop visible: + +1. Open E001-SC1 and compare the controller with `periodic_local` across its six untouched evaluation families. +2. Inspect the compact run ledger, then drill into a bounded slice of the 12,981-epoch scalar projection instead of dumping the roughly 72 MB authoritative raw artifact into context. +3. Surface the decisive failure: on `E6-repeated-membership-loss`, the adaptive policy reaches 1.0638 held-out NLL versus 0.9985 for `periodic_local`. +4. Trace one directed route from site availability to time to target through the published seven-node, eight-edge causal DAG, then open the measured/modeled/unresolved boundary. Present the returned route as one path through a branching graph, not as the entire DAG. +5. Stage `abstain_without_policy_claim`, linked to the evidence, in the pending-review surface. +6. Have the human alone approve or reject it, then show the decision receipt and undo. + +The strongest moment is not a list of tool names. It is the point where the agent finds the tempting win, finds the falsifying family, and voluntarily stages the narrower conclusion already warranted by the record—then stops for human judgment. + +## Known limits + +- WebMCP is experimental and availability depends on the host browser or agent. +- The challenge extension reads the shipped registry-cone export and experiment artifacts; it does not execute the Python simulator, fabricate measurements, or claim live access to a physical datacenter. +- Scenario comparisons are only as strong as their declared assumptions and evidence. The interface keeps those boundaries visible rather than hiding them behind a single recommendation. +- The static public deployment has no account system or server-side persistence. Review state is local to the current browser session, while source evidence remains immutable. + +## References + +- [OpenAI WebMCP Challenge](https://openai.com/webmcp-challenge/) +- [Official challenge rules and judging criteria](https://webmcp.devpost.com/rules) +- [WebMCP Community Group draft](https://webmachinelearning.github.io/webmcp/) +- [Chrome imperative WebMCP API](https://developer.chrome.com/docs/ai/webmcp/imperative-api) +- [Chrome WebMCP eval guidance](https://developer.chrome.com/docs/ai/webmcp/evals) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..48ff7ea --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 gpu_stack contributors / Cuuper22 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 5b18f7c..c906c34 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,12 @@ **Repository:**
**Research program:** [RESEARCH.md](RESEARCH.md) +## WebMCP Challenge 2026 + +GPUSTACK's [Causal Observatory](https://cuuper22.github.io/gpu_stack-/observatory.html) is now a shared evidence-audit surface for people and browser agents. Eight WebMCP tools let an agent compare the immutable E001-SC1 results, inspect bounded run traces, follow claims through the causal evidence graph, and stage a review conclusion while the human keeps control of approval and undo. + +See [CHALLENGE.md](CHALLENGE.md) for the exact pre-challenge baseline, challenge-window work, tool contracts, architecture, tests, and demo path. + `gpu_stack` started as a curiosity project in the overlap between my AI work and my physics brain. The question was simple enough to be annoying: if frontier training is supposedly "more GPUs, more data, more money," where does that sentence actually bottom out? diff --git a/docs/data/webmcp-run-projection-v1.json.gz b/docs/data/webmcp-run-projection-v1.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..3857a939a64bf204e2ebd076c6d72cb90d4f8f31 GIT binary patch literal 249304 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

II!F7Sz7d#-a^9O??pbhL6yGJ0k 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 J+aP}8{{Ta=C;b2b literal 0 HcmV?d00001 diff --git a/docs/observatory.html b/docs/observatory.html index 46c9860..b075565 100644 --- a/docs/observatory.html +++ b/docs/observatory.html @@ -15,9 +15,12 @@ + + + - +
    @@ -67,6 +70,85 @@ +
    +

    WebMCP causal mission control

    + + + +
    + Objective: + Audit whether adaptive training deserves a transferable win claim +
    + +
    + Policy: + Human approval required +
    + +
    + Live status: + Connecting to the observatory… + +
    + +
    + + +
    +
    + + +
    diff --git a/docs/observatory.js b/docs/observatory.js index b00b6f6..287a4c0 100644 --- a/docs/observatory.js +++ b/docs/observatory.js @@ -212,6 +212,8 @@ let inspectorHidden = false; let siteRailInitialized = false; let resizeFrame = 0; + let resolveObservatoryReady; + const observatoryReady = new Promise((resolve) => { resolveObservatoryReady = resolve; }); class ArtifactContractError extends Error {} @@ -1060,6 +1062,8 @@ loadCheckpointEnergyArtifact(); loadRackDephasingArtifact(); loadSemanticConsistencyArtifact(); + resolveObservatoryReady(); + document.dispatchEvent(new CustomEvent("gpustack:observatory-ready")); } document.addEventListener("DOMContentLoaded", init, { once: true }); @@ -1088,7 +1092,7 @@ renderRackDephasingV3(); renderSemanticConsistencyV1(); renderExperimentView(); - if (state.experiment === "E001-SC1" && state.depth === "full_trace" && semanticConsistencyArtifact && !semanticConsistencyRawArtifact && !semanticConsistencyRawLoad && !semanticConsistencyRawArtifactError) { + if (state.experiment === "E001-SC1" && state.depth === "full_trace" && dom.semanticconsistencyrawdetails?.open && semanticConsistencyArtifact && !semanticConsistencyRawArtifact && !semanticConsistencyRawLoad && !semanticConsistencyRawArtifactError) { loadSemanticConsistencyRawArtifact().catch(() => {}); } } @@ -2713,6 +2717,7 @@ const stateLabel = passed === true ? "PASS" : passed === false ? "FAIL" : "UNRESOLVED"; const card = element("article", "equal-work-effect-card"); card.dataset.passed = passed === null || passed === undefined ? "unresolved" : String(passed); + card.dataset.effectId = effect.effect_id || ""; const header = element("header"); header.append(element("h4", "", effect.label), element("span", "equal-work-effect-status", stateLabel)); card.append( @@ -2944,6 +2949,7 @@ dom.semanticconsistencyfamilybody.replaceChildren(); semanticFamilyResults().forEach((family) => { const row = element("tr"); + row.dataset.familyId = family.family_id || ""; const stateCell = element("td", "", `${semanticRankingStateLabel(family.ranking_state)}${family.abstention_reason ? ` · ${family.abstention_reason}` : ""}`); stateCell.dataset.state = family.ranking_state || "unmeasured"; row.append( @@ -4028,6 +4034,8 @@ class: `causal-edge${selectedId && (edge.source === selectedId || edge.target === selectedId) ? " is-selected" : ""}`, d: causalEdgePath(source, target, mobile), "marker-end": "url(#causal-arrow)", + "data-source": edge.source, + "data-target": edge.target, }); svg.append(path); if (!mobile) { @@ -4052,6 +4060,7 @@ const kind = normalizedEvidence(node.evidence_class); const group = svgElement("g", { class: `causal-node node--${kind}${state.node === node.node_id ? " is-selected" : ""}`, + "data-node-id": node.node_id, transform: `translate(${box.x} ${box.y})`, role: "button", tabindex: 0, @@ -4201,6 +4210,7 @@ const orderedRuns = [...artifactRuns()].sort((a, b) => POLICY_ORDER.indexOf(a.policy) - POLICY_ORDER.indexOf(b.policy)); orderedRuns.forEach((run) => { const row = element("tr"); + row.dataset.policyId = run.policy || ""; row.classList.toggle("is-selected", run.policy === state.policy); const policyCell = element("td"); const policyButton = element("button", "policy-select", policyLabel(run.policy)); @@ -5005,4 +5015,52 @@ dom.rawtracejson.textContent = JSON.stringify(artifact, null, 2); } + const observatoryBridge = Object.freeze({ + version: "1.0.0", + whenReady() { + return observatoryReady; + }, + getState() { + return { ...state }; + }, + getArtifactStatus() { + return { + screening: artifact ? "ready" : artifactError ? "error" : "loading", + semanticConsistency: semanticConsistencyArtifact ? "ready" : semanticConsistencyArtifactError ? "error" : "loading", + semanticRaw: semanticConsistencyRawArtifact ? "ready" : semanticConsistencyRawArtifactError ? "error" : "not_loaded", + }; + }, + async selectView(patch, options = {}) { + await observatoryReady; + commitState(patch, { replace: Boolean(options.replace) }); + return { ...state }; + }, + async focusCausalPath(nodeIds, edges = []) { + await observatoryReady; + const pathNodes = Array.isArray(nodeIds) ? nodeIds.filter((value) => typeof value === "string") : []; + const terminalNode = pathNodes[pathNodes.length - 1] || "time_to_target"; + commitState({ experiment: "E001", depth: "researcher", node: terminalNode }); + const selectedNodes = new Set(pathNodes); + const selectedEdges = new Set(edges.map((edge) => `${edge.source}>${edge.target}`)); + document.querySelectorAll("#causal-svg [data-node-id]").forEach((node) => { + node.classList.toggle("is-mission-path", selectedNodes.has(node.dataset.nodeId)); + }); + document.querySelectorAll("#causal-svg [data-source][data-target]").forEach((edge) => { + edge.classList.toggle("is-mission-path", selectedEdges.has(`${edge.dataset.source}>${edge.dataset.target}`)); + }); + byId("causal-field")?.scrollIntoView({ behavior: "smooth", block: "center" }); + return { ...state }; + }, + announce(message) { + announce(String(message || "")); + }, + }); + + Object.defineProperty(window, "GPUStackObservatory", { + configurable: false, + enumerable: true, + writable: false, + value: observatoryBridge, + }); + })(); diff --git a/docs/styles/99-webmcp-mission.css b/docs/styles/99-webmcp-mission.css new file mode 100644 index 0000000..c58b0c4 --- /dev/null +++ b/docs/styles/99-webmcp-mission.css @@ -0,0 +1,769 @@ +/* GPUSTACK WebMCP mission layer. + This file intentionally loads last: it extends the existing CuperOS + observatory without changing the evidence grammar underneath it. */ + +:root { + --mission-rail: clamp(330px, 24vw, 390px); + --mission-bar-height: 50px; + --mission-ready: oklch(0.55 0.17 142); + --mission-wait: oklch(0.55 0.14 88); + --mission-cyan-wash: oklch(0.94 0.045 195); + --mission-gold-wash: oklch(0.95 0.075 88); + --mission-red-wash: oklch(0.94 0.04 28); +} + +body[data-mission-mode="active"] .obs-desktop { + width: min(100% - 20px, 1660px); +} + +/* Reserve a real column for the rail. It never floats over evidence. */ +.obs-window-content { + display: grid; + grid-template-columns: minmax(0, 1fr) var(--mission-rail); + align-items: start; +} + +.obs-header, +.mission-control, +.obs-footer { + grid-column: 1 / -1; +} + +.obs-header { + grid-row: 1; +} + +.mission-control { + grid-row: 2; +} + +#observatory-main { + grid-row: 3; + grid-column: 1; + width: 100%; + min-width: 0; + border-right: 2px solid var(--inset-dark); +} + +.mission-sidecar { + grid-row: 3; + grid-column: 2; +} + +.obs-footer { + grid-row: 4; +} + +/* ------------------------------------------------------------------ */ +/* Mission bar */ +/* ------------------------------------------------------------------ */ + +.mission-control { + position: sticky; + z-index: 38; + top: var(--obs-header-height); + display: grid; + grid-template-columns: auto minmax(220px, 1fr) auto minmax(300px, 1.25fr) auto; + min-height: var(--mission-bar-height); + margin: 0; + border-top: 2px solid var(--inset-light); + border-bottom: 2px solid var(--inset-dark); + background: var(--pane-bright); + box-shadow: 0 2px 0 oklch(0.18 0.006 250 / 0.14); + color: var(--text-dark); + font: 600 13px/1.2 var(--font-display); +} + +.mission-control > div { + min-width: 0; + min-height: calc(var(--mission-bar-height) - 4px); + padding: 8px 13px; + display: flex; + align-items: center; + gap: 8px; +} + +.mission-control > div + div { + border-left: 2px solid var(--inset-dark); + box-shadow: inset 2px 0 0 var(--inset-light); +} + +.mission-identity { + text-transform: uppercase; + letter-spacing: 0.035em; + white-space: nowrap; +} + +.mission-signal { + position: relative; + width: 13px; + height: 13px; + flex: 0 0 auto; + border: 2px solid var(--accent-cyan-deep); + transform: rotate(45deg); + background: var(--pane-bright); +} + +.mission-signal::after { + position: absolute; + inset: 3px; + content: ""; + background: var(--accent-cyan-deep); +} + +.mission-bar-label { + flex: 0 0 auto; + color: var(--text-soft); + font-family: var(--font-mono); + text-transform: uppercase; + letter-spacing: 0.035em; +} + +.mission-objective-block strong, +.mission-live-copy { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.mission-objective-block strong { + font-weight: 700; +} + +.mission-policy strong { + color: var(--danger-red); + font-weight: 700; + text-transform: uppercase; + white-space: nowrap; +} + +.mission-live-block { + overflow: hidden; +} + +.mission-live-copy { + flex: 1 1 auto; +} + +body[data-mission-status="working"] .mission-live-copy { + color: var(--title-bar); +} + +body[data-mission-status="waiting"] .mission-live-copy, +body[data-mission-status="waiting"] .mission-signal { + color: var(--mission-wait); + border-color: var(--mission-wait); +} + +body[data-mission-status="waiting"] .mission-signal::after { + background: var(--mission-wait); +} + +body[data-mission-status="error"] .mission-live-copy, +body[data-mission-status="error"] .mission-signal { + color: var(--danger-red); + border-color: var(--danger-red); +} + +body[data-mission-status="error"] .mission-signal::after { + background: var(--danger-red); +} + +body[data-mission-status="fallback"] .mission-live-copy { + color: var(--text-soft); +} + +.mission-meter { + display: grid; + grid-template-columns: repeat(6, 6px); + gap: 3px; + flex: 0 0 auto; + margin-left: auto; +} + +.mission-meter i { + width: 6px; + height: 10px; + border: 1px solid oklch(0.31 0.01 250); + background: var(--mission-ready); + box-shadow: inset 1px 1px 0 oklch(0.86 0.12 142); +} + +.mission-meter i:nth-child(5), +.mission-meter i:nth-child(6) { + animation: mission-meter-pulse 1400ms steps(2, end) infinite; +} + +body[data-mission-status="waiting"] .mission-meter i { + background: var(--mission-wait); +} + +body[data-mission-status="error"] .mission-meter i { + background: var(--danger-red); +} + +body[data-mission-status="fallback"] .mission-meter i:nth-child(n + 3) { + background: var(--chrome-well); + box-shadow: none; +} + +.mission-utility-actions { + gap: 5px !important; + padding-right: 8px !important; + padding-left: 8px !important; +} + +@keyframes mission-meter-pulse { + 50% { + background: var(--chrome-well); + box-shadow: none; + } +} + +/* ------------------------------------------------------------------ */ +/* Human decision rail */ +/* ------------------------------------------------------------------ */ + +.mission-sidecar { + position: sticky; + z-index: 18; + top: calc(var(--obs-header-height) + var(--mission-bar-height)); + align-self: start; + display: grid; + gap: 8px; + width: 100%; + min-width: 0; + max-height: calc(100vh - var(--obs-header-height) - var(--mission-bar-height) - 68px); + padding: 8px; + overflow: auto; + overscroll-behavior: contain; + background: var(--window-chrome); +} + +.mission-panel { + min-width: 0; + border: 2px outset var(--button-face); + background: var(--pane-bright); + box-shadow: 1px 1px 0 oklch(0.16 0.008 250 / 0.28); +} + +.mission-panel-header { + min-height: 34px; + padding: 6px 9px; + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + border-bottom: 2px solid var(--inset-dark); + background: linear-gradient(180deg, var(--pane-bright), var(--chrome-well)); +} + +.mission-panel-header h2 { + margin: 0; + color: var(--text-dark); + font: 700 14px/1.1 var(--font-display); + letter-spacing: 0.035em; + text-transform: uppercase; +} + +.mission-count { + flex: 0 0 auto; + color: var(--text-soft); + font: 500 12px/1 var(--font-mono); +} + +.mission-list, +.receipt-list { + min-width: 0; + margin: 0; + padding: 7px; + display: grid; + gap: 7px; + list-style: none; + background: var(--chrome-well-bright); +} + +.mission-list { + max-height: min(34vh, 330px); + overflow: auto; +} + +.receipt-list { + max-height: min(32vh, 300px); + overflow: auto; +} + +.mission-empty { + min-height: 76px; + padding: 12px; + display: grid; + grid-template-columns: 16px minmax(0, 1fr); + align-items: start; + gap: 10px; + border: 1px dashed var(--chrome-border); + background: var(--pane-bright); + color: var(--text-soft); +} + +.mission-empty--receipt { + min-height: 70px; +} + +.mission-empty-mark { + width: 11px; + height: 11px; + margin-top: 3px; + border: 2px solid var(--chrome-border); + transform: rotate(45deg); +} + +.mission-empty strong { + display: block; + margin-bottom: 3px; + color: var(--text-dark); + font: 700 12px/1.25 var(--font-display); + text-transform: uppercase; +} + +.mission-empty p { + margin: 0; + font: 500 12px/1.35 var(--font-display); +} + +/* The bridge can render either class names or semantic data attributes. + Both receive the same compact, evidence-first card treatment. */ +.mission-change, +.pending-change, +#pending-changes > [data-change-id] { + padding: 10px 11px; + border: 1px solid var(--accent-cyan-deep); + background: var(--mission-cyan-wash); + box-shadow: inset 0 0 0 1px oklch(0.92 0.035 195); + color: var(--text-dark); +} + +.mission-change[data-kind="assumption"], +.pending-change[data-kind="assumption"], +#pending-changes > [data-change-kind="assumption"], +.mission-change[data-kind="conclusion"], +.pending-change[data-kind="conclusion"], +#pending-changes > [data-change-kind="conclusion"] { + border-color: var(--gold-line); + background: var(--mission-gold-wash); + box-shadow: inset 0 0 0 1px oklch(0.94 0.065 88); +} + +.mission-change[aria-selected="true"], +.pending-change[aria-selected="true"], +#pending-changes > [data-selected="true"] { + outline: 2px solid var(--title-bar); + outline-offset: -3px; +} + +.mission-change h3, +.pending-change h3, +#pending-changes > [data-change-id] h3 { + margin: 0 0 8px; + font: 700 13px/1.25 var(--font-display); +} + +.mission-change p, +.pending-change p, +#pending-changes > [data-change-id] p { + margin: 4px 0; + font: 500 12px/1.35 var(--font-display); + overflow-wrap: anywhere; +} + +.mission-change code, +.pending-change code, +#pending-changes > [data-change-id] code { + font: 500 14px/1 var(--font-mono); +} + +.mission-claim-editor { + display: block; + width: 100%; + min-height: 118px; + max-height: 240px; + margin: 6px 0 8px; + padding: 8px 9px; + resize: vertical; + border: 2px inset var(--window-chrome); + border-radius: 0; + background: var(--pane-bright); + color: var(--text-dark); + font: 500 13px/1.45 var(--font-display); +} + +.mission-claim-editor:focus-visible { + outline: 2px solid var(--accent-gold); + outline-offset: 2px; +} + +.mission-decision-actions, +.mission-receipt-actions { + padding: 7px; + display: grid; + gap: 7px; + border-top: 2px solid var(--inset-light); + background: var(--window-chrome); +} + +.mission-decision-actions { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.mission-receipt-actions { + grid-template-columns: minmax(0, 1fr); +} + +.mission-button { + min-width: 0; + min-height: 32px; + padding: 5px 8px; + border: 2px outset var(--button-face); + border-radius: 0; + background: var(--button-face); + color: var(--text-dark); + font: 700 12px/1 var(--font-display); + letter-spacing: 0.025em; + text-transform: uppercase; +} + +.mission-button:hover:not(:disabled) { + background: var(--button-hover); + color: var(--title-bar); +} + +.mission-button:active:not(:disabled) { + border-style: inset; +} + +.mission-button:disabled { + cursor: not-allowed; + color: oklch(0.50 0.004 250); + text-shadow: 1px 1px 0 var(--inset-light); + opacity: 0.72; +} + +.mission-button--compact { + min-height: 28px; + padding: 4px 7px; + font-size: 11px; +} + +.mission-button--reject:not(:disabled) { + color: var(--danger-red); +} + +.mission-button--approve:not(:disabled) { + color: oklch(0.42 0.16 142); +} + +.mission-human-boundary { + margin: 0; + padding: 6px 9px; + border-top: 2px solid var(--inset-dark); + background: var(--chrome-well); + color: var(--text-dark); + font: 600 11px/1.3 var(--font-display); + text-align: center; +} + +/* ------------------------------------------------------------------ */ +/* Receipts */ +/* ------------------------------------------------------------------ */ + +.receipt-list > li:not(.mission-empty), +.webmcp-receipt, +.receipt-item { + position: relative; + min-width: 0; + padding: 9px 10px 9px 27px; + border: 1px solid var(--chrome-border); + background: var(--pane-bright); + color: var(--text-dark); + font: 500 12px/1.35 var(--font-display); +} + +.receipt-list > li:not(.mission-empty)::before, +.webmcp-receipt::before, +.receipt-item::before { + position: absolute; + top: 12px; + left: 10px; + width: 9px; + height: 9px; + content: ""; + border: 2px solid var(--mission-ready); + transform: rotate(45deg); +} + +.receipt-list > li[data-status="pending"] { + border-color: var(--gold-line); + background: var(--mission-gold-wash); +} + +.receipt-list > li[data-status="pending"]::before { + border-color: var(--mission-wait); +} + +.receipt-list > li[data-status="rejected"], +.receipt-list > li[data-status="failed"] { + border-color: var(--danger-red); + background: var(--mission-red-wash); +} + +.receipt-list > li[data-status="rejected"]::before, +.receipt-list > li[data-status="failed"]::before { + border-color: var(--danger-red); +} + +.receipt-list strong { + font-weight: 700; +} + +.receipt-list code, +.receipt-list time, +.receipt-id, +.receipt-delta { + font-family: var(--font-mono); +} + +.receipt-list p { + margin: 3px 0 0; + overflow-wrap: anywhere; +} + +.receipt-evidence { + color: var(--text-soft); + font: 500 13px/1.25 var(--font-mono); +} + +/* Agent-read paths are a temporary cyan spotlight, never a new evidence + class. The node's original evidence label and glyph remain untouched. */ +#causal-svg .causal-node.is-mission-path .node-frame { + fill: var(--mission-cyan-wash); + stroke: var(--accent-cyan-deep); + stroke-width: 3; + filter: drop-shadow(2px 2px 0 oklch(0.28 0.06 195 / 0.24)); +} + +#causal-svg .causal-edge.is-mission-path { + stroke: var(--accent-cyan-deep); + stroke-width: 3; + stroke-dasharray: 8 4; + animation: mission-path-flow 900ms linear infinite; +} + +@keyframes mission-path-flow { + to { + stroke-dashoffset: -12; + } +} + +/* Family rows and effect cards opened by an agent keep their original + PASS/FAIL and evidence state; this gold focus band only shows location. */ +.is-mission-evidence:not(tr) { + position: relative; + z-index: 1; + outline: 3px solid var(--accent-gold); + outline-offset: 3px; + scroll-margin-top: calc(var(--obs-header-height) + var(--mission-bar-height) + 18px); + animation: mission-evidence-arrive 700ms steps(2, end) 2; +} + +tr.is-mission-evidence > th, +tr.is-mission-evidence > td { + background: var(--mission-gold-wash); + box-shadow: inset 0 3px 0 var(--accent-gold), inset 0 -3px 0 var(--accent-gold); +} + +tr.is-mission-evidence > :first-child { + box-shadow: inset 3px 0 0 var(--accent-gold), inset 0 3px 0 var(--accent-gold), inset 0 -3px 0 var(--accent-gold); +} + +tr.is-mission-evidence > :last-child { + box-shadow: inset -3px 0 0 var(--accent-gold), inset 0 3px 0 var(--accent-gold), inset 0 -3px 0 var(--accent-gold); +} + +@keyframes mission-evidence-arrive { + 50% { + outline-color: var(--title-bar); + } +} + +/* ------------------------------------------------------------------ */ +/* Responsive */ +/* ------------------------------------------------------------------ */ + +@media (max-width: 1380px) { + .mission-control { + grid-template-columns: auto minmax(200px, 1fr) auto minmax(250px, 1fr) auto; + } + + .mission-control > div { + padding-right: 9px; + padding-left: 9px; + } + + .mission-meter { + display: none; + } +} + +/* Below a wide desktop, an inline rail gives the dense observatory its full + width. This deliberately switches before any research grid can collide. */ +@media (max-width: 1280px) { + .obs-window-content { + grid-template-columns: minmax(0, 1fr); + } + + .obs-header, + .mission-control, + .mission-sidecar, + #observatory-main, + .obs-footer { + grid-column: 1; + } + + .obs-header { + grid-row: 1; + } + + .mission-control { + grid-row: 2; + } + + .mission-sidecar { + position: static; + grid-row: 3; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + max-height: none; + padding: 8px; + overflow: visible; + border-bottom: 2px solid var(--inset-dark); + } + + #observatory-main { + grid-row: 4; + border-right: 0; + } + + .obs-footer { + grid-row: 5; + } + + .mission-list, + .receipt-list { + max-height: 250px; + } +} + +@media (max-width: 900px) { + .mission-control { + position: static; + grid-template-columns: minmax(0, 1fr) auto; + min-height: 0; + } + + .mission-control > div { + min-height: 42px; + } + + .mission-identity { + grid-column: 1; + } + + .mission-objective-block { + grid-column: 1 / -1; + grid-row: 2; + border-top: 2px solid var(--inset-dark); + border-left: 0 !important; + box-shadow: inset 0 2px 0 var(--inset-light) !important; + } + + .mission-policy { + grid-column: 1 / -1; + grid-row: 3; + border-top: 2px solid var(--inset-dark); + border-left: 0 !important; + box-shadow: inset 0 2px 0 var(--inset-light) !important; + } + + .mission-live-block { + grid-column: 1 / -1; + grid-row: 4; + border-top: 2px solid var(--inset-dark); + border-left: 0 !important; + box-shadow: inset 0 2px 0 var(--inset-light) !important; + } + + .mission-utility-actions { + grid-column: 2; + grid-row: 1; + } + + .mission-sidecar { + grid-template-columns: minmax(0, 1fr); + } + + .mission-panel { + box-shadow: none; + } +} + +@media (max-width: 620px) { + body[data-mission-mode="active"] .obs-desktop { + width: min(100% - 10px, 1660px); + } + + .mission-control { + font-size: 12px; + } + + .mission-control > div { + padding: 7px 8px; + } + + .mission-objective-block, + .mission-policy, + .mission-live-block { + display: grid !important; + grid-template-columns: 1fr; + gap: 3px !important; + } + + .mission-objective-block strong, + .mission-live-copy, + .mission-policy strong { + overflow: visible; + white-space: normal; + } + + .mission-sidecar { + padding: 5px; + } + + .mission-decision-actions { + gap: 5px; + } + + .mission-button { + min-height: 36px; + padding-right: 5px; + padding-left: 5px; + font-size: 11px; + } +} + +@media (prefers-reduced-motion: reduce) { + .mission-meter i, + #causal-svg .causal-edge.is-mission-path, + .is-mission-evidence:not(tr) { + animation: none; + } +} diff --git a/docs/webmcp-mission.js b/docs/webmcp-mission.js new file mode 100644 index 0000000..96d687b --- /dev/null +++ b/docs/webmcp-mission.js @@ -0,0 +1,1039 @@ +(() => { + "use strict"; + + const SEMANTIC_URL = "data/e001-semantic-consistency-v1.json"; + const SCREENING_URL = "data/e001-screening-v1.json"; + const PROJECTION_URL = "data/webmcp-run-projection-v1.json.gz"; + const STORAGE_KEY = "gpustack.webmcp.mission.v1"; + const MAX_RECEIPTS = 40; + const REGISTERED_METRICS = Object.freeze([ + "final_held_out_nll", + "modeled_completion_seconds", + "inter_site_payload_bytes", + "abstention_count", + "replayed_tokens", + "divergence_count", + ]); + + const EMPTY_PENDING_HTML = ` +
    + +
    + No conclusion is staged +

    Agent evidence bundles land here before they can become a recorded decision.

    +
    +
    `; + + class MissionError extends Error { + constructor(code, message, extra = {}) { + super(message); + this.name = "MissionError"; + this.code = code; + this.extra = extra; + } + } + + const dom = {}; + let semanticPromise = null; + let screeningPromise = null; + let projectionPromise = null; + let tourRunning = false; + let editingProposal = false; + let missionState = loadMissionState(); + + function initialMissionState() { + return { + stateVersion: 1, + nextReceipt: 1, + nextProposal: 1, + pending: null, + approved: [], + receipts: [], + }; + } + + function isRecord(value) { + return value !== null && typeof value === "object" && !Array.isArray(value); + } + + function loadMissionState() { + const fallback = initialMissionState(); + try { + const parsed = JSON.parse(window.sessionStorage.getItem(STORAGE_KEY) || "null"); + if (!isRecord(parsed)) return fallback; + return { + stateVersion: Number.isInteger(parsed.stateVersion) && parsed.stateVersion > 0 ? parsed.stateVersion : 1, + nextReceipt: Number.isInteger(parsed.nextReceipt) && parsed.nextReceipt > 0 ? parsed.nextReceipt : 1, + nextProposal: Number.isInteger(parsed.nextProposal) && parsed.nextProposal > 0 ? parsed.nextProposal : 1, + pending: isRecord(parsed.pending) ? parsed.pending : null, + approved: Array.isArray(parsed.approved) ? parsed.approved.slice(-8) : [], + receipts: Array.isArray(parsed.receipts) ? parsed.receipts.slice(-MAX_RECEIPTS) : [], + }; + } catch (_error) { + return fallback; + } + } + + function persist() { + try { + window.sessionStorage.setItem(STORAGE_KEY, JSON.stringify(missionState)); + } catch (_error) { + // The mission stays fully functional when storage is disabled. + } + } + + function abortIfNeeded(signal) { + if (signal && signal.aborted) throw signal.reason || new DOMException("Aborted", "AbortError"); + } + + async function fetchArtifact(url, signal) { + abortIfNeeded(signal); + const response = await fetch(url, { cache: "no-store", headers: { Accept: "application/json" }, signal }); + if (!response.ok) throw new MissionError("ARTIFACT_UNAVAILABLE", `${url} returned HTTP ${response.status}.`); + return response.json(); + } + + async function fetchGzipArtifact(url, signal) { + abortIfNeeded(signal); + const response = await fetch(url, { cache: "no-store", headers: { Accept: "application/gzip" }, signal }); + if (!response.ok) throw new MissionError("ARTIFACT_UNAVAILABLE", `${url} returned HTTP ${response.status}.`); + if (typeof DecompressionStream !== "function") { + throw new MissionError("DECOMPRESSION_UNAVAILABLE", "This browser cannot open the bounded gzip projection."); + } + const compressed = await response.arrayBuffer(); + const bytes = new Uint8Array(compressed); + if (bytes[0] !== 0x1f || bytes[1] !== 0x8b) { + return JSON.parse(new TextDecoder().decode(bytes)); + } + const stream = new Blob([compressed]).stream().pipeThrough(new DecompressionStream("gzip")); + return new Response(stream).json(); + } + + function semanticArtifact(signal) { + semanticPromise ||= fetchArtifact(SEMANTIC_URL, signal).then((value) => { + if (value?.schema !== "gpu-stack.causal-observatory.e001-semantic-consistency.v1") { + throw new MissionError("ARTIFACT_INVALID", "The E001-SC1 compact artifact has an unsupported schema."); + } + return value; + }).catch((error) => { + semanticPromise = null; + throw error; + }); + return semanticPromise; + } + + function screeningArtifact(signal) { + screeningPromise ||= fetchArtifact(SCREENING_URL, signal).then((value) => { + if (value?.schema !== "gpu-stack.causal-observatory.e001.v1") { + throw new MissionError("ARTIFACT_INVALID", "The E001 screening artifact has an unsupported schema."); + } + return value; + }).catch((error) => { + screeningPromise = null; + throw error; + }); + return screeningPromise; + } + + function runProjection(signal) { + projectionPromise ||= fetchGzipArtifact(PROJECTION_URL, signal).then((value) => { + if (value?.schema !== "gpustack.webmcp-run-projection.v1" || !Array.isArray(value.epoch_columns)) { + throw new MissionError("PROJECTION_INVALID", "The bounded epoch projection has an unsupported schema."); + } + return value; + }).catch((error) => { + projectionPromise = null; + throw error; + }); + return projectionPromise; + } + + async function observatory() { + const bridge = window.GPUStackObservatory; + if (!bridge || typeof bridge.whenReady !== "function") { + throw new MissionError("OBSERVATORY_UNAVAILABLE", "The visible observatory bridge is not ready."); + } + await bridge.whenReady(); + return bridge; + } + + function setStatus(message, state = "ready") { + if (!dom.status) return; + dom.status.textContent = message; + document.body.dataset.missionStatus = state; + } + + function evidenceIdsFromReceipt(receipt) { + return Array.isArray(receipt.evidenceIds) ? receipt.evidenceIds.slice(0, 4) : []; + } + + function addReceipt(tool, status, summary, options = {}) { + const receipt = { + receiptId: `wmcp-${String(missionState.nextReceipt).padStart(4, "0")}`, + tool, + status, + summary: String(summary || "Action completed.").slice(0, 260), + evidenceIds: Array.isArray(options.evidenceIds) ? options.evidenceIds.slice(0, 8) : [], + delta: options.delta ? String(options.delta).slice(0, 180) : "No model mutation", + origin: options.origin || "webmcp", + timestamp: new Date().toISOString(), + }; + missionState.nextReceipt += 1; + missionState.receipts.push(receipt); + missionState.receipts = missionState.receipts.slice(-MAX_RECEIPTS); + persist(); + renderMission(); + return receipt; + } + + function resultWithReceipt(result, receipt) { + return { + ...result, + state_version: missionState.stateVersion, + receipt_id: receipt.receiptId, + human_approval_required: Boolean(missionState.pending), + }; + } + + function familyList(semantic) { + return Array.isArray(semantic?.researcher?.family_results) ? semantic.researcher.family_results : []; + } + + function runLedger(semantic) { + return Array.isArray(semantic?.full_trace?.run_ledger) ? semantic.full_trace.run_ledger : []; + } + + function totalAbstentions(semantic) { + return runLedger(semantic) + .filter((run) => run.split === "evaluation" && run.policy_id === "observable_adaptive") + .reduce((total, run) => total + Number(run.abstention_count || 0), 0); + } + + function adaptiveRunForFamily(semantic, familyId) { + return runLedger(semantic).find( + (run) => run.family_or_stratum_id === familyId && run.policy_id === "observable_adaptive" && run.split === "evaluation", + ); + } + + function scrollToId(id) { + const target = document.getElementById(id); + if (target) target.scrollIntoView({ behavior: "smooth", block: "center" }); + } + + function clearHighlights() { + document.querySelectorAll(".is-mission-evidence").forEach((node) => node.classList.remove("is-mission-evidence")); + } + + function highlight(selector) { + clearHighlights(); + const target = document.querySelector(selector); + if (target) { + target.classList.add("is-mission-evidence"); + target.scrollIntoView({ behavior: "smooth", block: "center" }); + } + } + + function compactFamily(family, semantic) { + const adaptiveRun = adaptiveRunForFamily(semantic, family.family_id); + return { + family_id: family.family_id, + ranking_state: family.ranking_state, + learning_delta: roundNumber(family.learning_delta), + completion_ratio: roundNumber(family.completion_ratio), + wan_ratio: roundNumber(family.wan_ratio), + abstentions: adaptiveRun ? adaptiveRun.abstention_count : 0, + }; + } + + function roundNumber(value, digits = 6) { + return Number.isFinite(value) ? Number(value.toFixed(digits)) : null; + } + + async function getObservatoryState(_args, context) { + const [semantic, screening, bridge] = await Promise.all([ + semanticArtifact(context.signal), + screeningArtifact(context.signal), + observatory(), + ]); + abortIfNeeded(context.signal); + const effects = semantic.researcher.paired_effects || []; + const families = familyList(semantic); + const view = bridge.getState(); + const receipt = addReceipt("get_observatory_state", "complete", "Read the immutable audit state and registered evidence IDs.", { + evidenceIds: [semantic.artifact_sha256], + origin: context.origin, + }); + return resultWithReceipt({ + ok: true, + active_view: { + experiment: view.experiment, + depth: view.depth, + selected_family: view.semanticFamily || null, + selected_run: view.semanticRun || null, + }, + artifact: { + experiment_id: semantic.experiment_id, + sha256: semantic.artifact_sha256, + raw_sha256: semantic.full_trace.raw_trace_artifact.artifact_sha256, + families: families.length, + runs: runLedger(semantic).length, + epochs: semantic.full_trace.raw_trace_artifact.epoch_count || 12981, + }, + evidence_boundary: "Measured learning + exact accounting; modeled infrastructure; frontier transfer unresolved.", + frozen_result: { + conclusion: semantic.status.conclusion, + all_falsifiers_pass: semantic.status.all_falsifiers_pass, + failed_gate_count: effects.filter((effect) => effect.passed === false).length, + abstentions: totalAbstentions(semantic), + }, + registered_ids: { + families: families.map((family) => family.family_id), + policies: [...new Set(runLedger(semantic).map((run) => run.policy_id))], + causal_nodes: screening.causal_graph.nodes.map((node) => node.node_id), + effect_ids: effects.map((effect) => effect.effect_id), + }, + pending_proposal: missionState.pending ? missionState.pending.proposalId : null, + suggested_next: "compare_stress_families", + }, receipt); + } + + async function compareStressFamilies(args, context) { + const semantic = await semanticArtifact(context.signal); + abortIfNeeded(context.signal); + const families = familyList(semantic); + const selectedIds = args.family_ids || families.map((family) => family.family_id); + const unknown = selectedIds.find((id) => !families.some((family) => family.family_id === id)); + if (unknown) { + throw new MissionError("UNKNOWN_FAMILY", `No held-out family named ${unknown}.`, { + available_ids: families.map((family) => family.family_id), + }); + } + const rows = selectedIds.map((id) => compactFamily(families.find((family) => family.family_id === id), semantic)); + const bridge = await observatory(); + await bridge.selectView({ experiment: "E001-SC1", depth: "researcher", semanticFamily: rows[0].family_id, semanticRun: "" }); + scrollToId("semantic-consistency-v1"); + const receipt = addReceipt("compare_stress_families", "complete", `Compared ${rows.length} held-out stress families; none establishes an adaptive transferable win.`, { + evidenceIds: selectedIds, + delta: `Visible family → ${rows[0].family_id}`, + origin: context.origin, + }); + return resultWithReceipt({ + ok: true, + comparator: semantic.comparison.selected_fixed_policy_id, + candidate: "observable_adaptive", + families: rows, + shared_fields: { + replayed_work: "0 adaptive / 0 fixed tokens in every held-out family", + energy: "not measured for both paired runs", + }, + counts: rows.reduce((result, row) => { + result[row.ranking_state] = (result[row.ranking_state] || 0) + 1; + return result; + }, {}), + aggregate_conclusion: semantic.status.conclusion, + }, receipt); + } + + async function inspectStressFamily(args, context) { + const semantic = await semanticArtifact(context.signal); + const family = familyList(semantic).find((entry) => entry.family_id === args.family_id); + if (!family) { + throw new MissionError("UNKNOWN_FAMILY", `No held-out family named ${args.family_id}.`, { + available_ids: familyList(semantic).map((entry) => entry.family_id), + }); + } + const linkedRuns = runLedger(semantic) + .filter((run) => run.family_or_stratum_id === family.family_id && run.split === "evaluation") + .filter((run) => ["observable_adaptive", semantic.comparison.selected_fixed_policy_id].includes(run.policy_id)) + .map((run) => run.run_id); + const bridge = await observatory(); + await bridge.selectView({ experiment: "E001-SC1", depth: "researcher", semanticFamily: family.family_id, semanticRun: "" }); + highlight(`[data-family-id="${CSS.escape(family.family_id)}"]`); + const result = compactFamily(family, semantic); + result.abstention_reason = family.abstention_reason || null; + result.replayed_work = family.replayed_work_display; + result.energy = family.energy_display; + if (args.include_regions) { + result.regions = (family.regions || []).slice(0, 8).map((region) => ({ + region_id: region.region_id, + state: region.state, + bandwidth_x: roundNumber(region.coordinates?.bandwidth_realization_multiplier), + compute_x: roundNumber(region.coordinates?.compute_rate_realization_multiplier), + rtt_s: roundNumber(region.coordinates?.wan_round_trip_seconds), + })); + } + const receipt = addReceipt("inspect_stress_family", "complete", `Opened ${family.family_id}: ${family.ranking_state}, ${result.abstentions} adaptive abstentions.`, { + evidenceIds: [family.family_id, ...linkedRuns.slice(0, 2)], + delta: `Visible family → ${family.family_id}`, + origin: context.origin, + }); + return resultWithReceipt({ ok: true, family: result, linked_run_ids: linkedRuns }, receipt); + } + + function projectedEpochRows(projection, runId, offset, requestedLimit) { + const run = projection.runs.find((entry) => entry.run_id === runId); + if (!run) return null; + const columnIndexes = [0, 1, 3, 5, 6, 7, 9, 14, 23, 28]; + const returnedLimit = Math.min(requestedLimit, 6); + return { + columns: columnIndexes.map((index) => projection.epoch_columns[index]), + rows: run.epochs.slice(offset, offset + returnedLimit).map((row) => columnIndexes.map((index) => row[index])), + returned: Math.min(returnedLimit, Math.max(0, run.epoch_count - offset)), + next_offset: offset + returnedLimit < run.epoch_count ? offset + returnedLimit : null, + total_epochs: run.epoch_count, + context_limit_applied: requestedLimit > returnedLimit, + }; + } + + async function inspectRun(args, context) { + const [semantic, projection] = await Promise.all([ + semanticArtifact(context.signal), + runProjection(context.signal), + ]); + abortIfNeeded(context.signal); + const run = runLedger(semantic).find((entry) => entry.run_id === args.run_id); + if (!run) { + throw new MissionError("UNKNOWN_RUN", `No compact run named ${args.run_id}.`, { + hint: "Call get_observatory_state or inspect_stress_family for exact run IDs.", + }); + } + if (args.epoch_offset >= run.epoch_count) { + throw new MissionError("EPOCH_OFFSET_OUT_OF_RANGE", `epoch_offset must be below ${run.epoch_count}.`); + } + if (projection.source_artifact_sha256 !== semantic.full_trace.raw_trace_artifact.artifact_sha256) { + throw new MissionError("HASH_MISMATCH", "The bounded projection is not bound to this compact artifact's raw trace."); + } + const page = projectedEpochRows(projection, run.run_id, args.epoch_offset, args.epoch_limit); + const bridge = await observatory(); + await bridge.selectView({ + experiment: "E001-SC1", + depth: "researcher", + semanticFamily: run.family_or_stratum_id, + semanticRun: run.run_id, + }); + scrollToId("semantic-consistency-timeline-title"); + const receipt = addReceipt("inspect_run", "complete", `Opened ${run.run_id} and epoch page ${args.epoch_offset}–${args.epoch_offset + page.returned - 1}.`, { + evidenceIds: [run.run_id, projection.source_artifact_sha256], + delta: `Visible run → ${run.run_id}`, + origin: context.origin, + }); + return resultWithReceipt({ + ok: true, + run: { + run_id: run.run_id, + family_id: run.family_or_stratum_id, + policy_id: run.policy_id, + split: run.split, + seed: run.seed, + epoch_count: run.epoch_count, + abstention_count: run.abstention_count, + ood_epoch_count: run.out_of_distribution_epoch_count, + final_held_out_nll: run.final_held_out_nll, + completion_seconds: run.modeled_infrastructure?.completion_seconds, + inter_site_payload_bytes: run.modeled_infrastructure?.inter_site_payload_bytes, + }, + epoch_page: page, + source_raw_sha256: projection.source_artifact_sha256, + projection_boundary: "Bounded scalar projection; the raw SHA-256 remains authoritative.", + }, receipt); + } + + function shortestCausalPath(graph, fromNode, toNode) { + const queue = [[fromNode, [], [fromNode]]]; + const visited = new Set([fromNode]); + while (queue.length) { + const [current, pathEdges, pathNodes] = queue.shift(); + for (const edge of graph.edges.filter((candidate) => candidate.source === current)) { + const nextEdges = [...pathEdges, edge]; + const nextNodes = [...pathNodes, edge.target]; + if (edge.target === toNode) return { edges: nextEdges, nodeIds: nextNodes }; + if (!visited.has(edge.target)) { + visited.add(edge.target); + queue.push([edge.target, nextEdges, nextNodes]); + } + } + } + return null; + } + + async function traceCausalPath(args, context) { + const screening = await screeningArtifact(context.signal); + const graph = screening.causal_graph; + const nodes = new Map(graph.nodes.map((node) => [node.node_id, node])); + if (!nodes.has(args.from_node) || !nodes.has(args.to_node)) { + const unknown = !nodes.has(args.from_node) ? args.from_node : args.to_node; + throw new MissionError("UNKNOWN_CAUSAL_NODE", `No conceptual evidence node named ${unknown}.`, { + available_ids: [...nodes.keys()], + }); + } + const path = shortestCausalPath(graph, args.from_node, args.to_node); + if (!path) throw new MissionError("NO_CAUSAL_PATH", `No directed path connects ${args.from_node} to ${args.to_node}.`); + if (path.nodeIds.length > args.max_nodes) { + throw new MissionError("PATH_LIMIT_EXCEEDED", `The shortest path needs ${path.nodeIds.length} nodes; max_nodes is ${args.max_nodes}.`); + } + const bridge = await observatory(); + await bridge.focusCausalPath(path.nodeIds, path.edges); + const nodeRows = path.nodeIds.map((id) => { + const node = nodes.get(id); + return { node_id: id, label: node.label, evidence_class: node.evidence_class }; + }); + const receipt = addReceipt("trace_causal_path", "complete", `Highlighted the ${path.nodeIds.length}-node path from ${args.from_node} to ${args.to_node}.`, { + evidenceIds: path.nodeIds, + delta: `${path.nodeIds.length} causal nodes highlighted`, + origin: context.origin, + }); + return resultWithReceipt({ + ok: true, + nodes: nodeRows, + edges: path.edges, + boundary: "A directed evidence path is not proof that every downstream quantity is measured.", + }, receipt); + } + + async function resolveEvidence(evidenceId, depth, navigate, signal) { + const [semantic, screening] = await Promise.all([semanticArtifact(signal), screeningArtifact(signal)]); + const bridge = await observatory(); + const artifactAliases = new Set([semantic.artifact_sha256, `sha256:${semantic.artifact_sha256}`, `artifact:${semantic.artifact_sha256}`]); + const rawHash = semantic.full_trace.raw_trace_artifact.artifact_sha256; + const rawAliases = new Set([rawHash, `sha256:${rawHash}`, `artifact:${rawHash}`]); + if (artifactAliases.has(evidenceId)) { + if (navigate) { + await bridge.selectView({ experiment: "E001-SC1", depth }); + scrollToId("semantic-consistency-v1"); + } + return { + evidence_id: evidenceId, + kind: "compact_artifact", + sha256: semantic.artifact_sha256, + schema: semantic.schema, + conclusion: semantic.status.conclusion, + boundary: semantic.evidence_boundary?.plain_boundary, + }; + } + if (rawAliases.has(evidenceId)) { + if (navigate) { + await bridge.selectView({ experiment: "E001-SC1", depth: "researcher" }); + scrollToId("semantic-consistency-raw-details"); + } + return { + evidence_id: evidenceId, + kind: "raw_artifact_binding", + sha256: rawHash, + schema: semantic.full_trace.raw_trace_artifact.schema, + epoch_count: semantic.full_trace.raw_trace_artifact.epoch_count || 12981, + boundary: "Use inspect_run for bounded rows; the authoritative raw artifact is not dumped into agent context.", + }; + } + const effect = semantic.researcher.paired_effects.find((entry) => entry.effect_id === evidenceId); + if (effect) { + if (navigate) { + await bridge.selectView({ experiment: "E001-SC1", depth: depth === "freshman" ? "researcher" : depth }); + highlight(`[data-effect-id="${CSS.escape(evidenceId)}"]`); + } + return { + evidence_id: evidenceId, + kind: "frozen_gate", + label: effect.label, + value: effect.display_value, + interval: effect.interval_display, + boundary: effect.boundary, + passed: effect.passed, + evidence_class: effect.evidence_class, + }; + } + const family = familyList(semantic).find((entry) => entry.family_id === evidenceId); + if (family) { + if (navigate) { + await bridge.selectView({ experiment: "E001-SC1", depth: "researcher", semanticFamily: family.family_id, semanticRun: "" }); + highlight(`[data-family-id="${CSS.escape(evidenceId)}"]`); + } + return { evidence_id: evidenceId, kind: "held_out_family", ...compactFamily(family, semantic) }; + } + const run = runLedger(semantic).find((entry) => entry.run_id === evidenceId); + if (run) { + if (navigate) { + await bridge.selectView({ experiment: "E001-SC1", depth: "researcher", semanticFamily: run.family_or_stratum_id, semanticRun: run.run_id }); + scrollToId("semantic-consistency-timeline-title"); + } + return { + evidence_id: evidenceId, + kind: "run", + family_id: run.family_or_stratum_id, + policy_id: run.policy_id, + final_held_out_nll: run.final_held_out_nll, + completion_seconds: run.modeled_infrastructure?.completion_seconds, + abstentions: run.abstention_count, + work_contract_violations: run.exact_accounting?.work_contract_violations || [], + }; + } + const observation = (screening.observations || []).find((entry) => entry.observation_id === evidenceId); + if (observation) { + if (navigate) { + await bridge.selectView({ experiment: "E001", depth }); + scrollToId("source-observations-title"); + } + return { + evidence_id: evidenceId, + kind: "source_observation", + citation: observation.provenance?.citation, + uri: observation.provenance?.uri, + license: observation.provenance?.license, + measured_values: Object.fromEntries(Object.entries(observation.measured_values || {}).map(([metric, record]) => [metric, { + value: record.value, + unit: record.unit, + lower_bound: record.uncertainty?.lower_bound, + upper_bound: record.uncertainty?.upper_bound, + }])), + scope: observation.provenance?.notes?.[0], + }; + } + const causalNode = screening.causal_graph.nodes.find((entry) => entry.node_id === evidenceId); + if (causalNode) { + if (navigate) await bridge.focusCausalPath([causalNode.node_id], []); + return { + evidence_id: evidenceId, + kind: "causal_node", + label: causalNode.label, + evidence_class: causalNode.evidence_class, + explanation: causalNode[depth], + }; + } + const ledgers = [...(semantic.full_trace.assumptions || []), ...(semantic.full_trace.missing_evidence || [])]; + const ledgerEntry = ledgers.find((entry) => [entry.assumption_id, entry.evidence_id, entry.id].includes(evidenceId)); + if (ledgerEntry) { + if (navigate) { + await bridge.selectView({ experiment: "E001-SC1", depth: "researcher" }); + scrollToId("semantic-consistency-assumptions"); + } + return { evidence_id: evidenceId, kind: "evidence_boundary", entry: ledgerEntry }; + } + throw new MissionError("UNKNOWN_EVIDENCE", `No registered evidence named ${evidenceId}.`, { + hint: "Call get_observatory_state for registered family, run, causal-node, and effect IDs.", + }); + } + + async function openEvidence(args, context) { + const evidence = await resolveEvidence(args.evidence_id, args.semantic_depth, true, context.signal); + const receipt = addReceipt("open_evidence", "complete", `Opened ${evidence.kind}: ${args.evidence_id}.`, { + evidenceIds: [args.evidence_id], + delta: `Evidence focus → ${args.evidence_id}`, + origin: context.origin, + }); + return resultWithReceipt({ ok: true, evidence }, receipt); + } + + function median(values) { + const ordered = values.filter(Number.isFinite).sort((a, b) => a - b); + if (!ordered.length) return null; + const middle = Math.floor(ordered.length / 2); + return ordered.length % 2 ? ordered[middle] : (ordered[middle - 1] + ordered[middle]) / 2; + } + + function metricValue(run, metricId) { + const values = { + final_held_out_nll: run.final_held_out_nll, + modeled_completion_seconds: run.modeled_infrastructure?.completion_seconds, + inter_site_payload_bytes: run.modeled_infrastructure?.inter_site_payload_bytes, + abstention_count: run.abstention_count, + replayed_tokens: run.exact_accounting?.replayed_tokens, + divergence_count: run.diverged ? 1 : 0, + }; + return values[metricId]; + } + + async function comparePolicies(args, context) { + const semantic = await semanticArtifact(context.signal); + const ledger = runLedger(semantic); + const availablePolicies = [...new Set(ledger.map((run) => run.policy_id))]; + const policyIds = args.policy_ids || ["observable_adaptive", semantic.comparison.selected_fixed_policy_id]; + const metricIds = args.metric_ids || REGISTERED_METRICS.slice(0, 5); + const unknownPolicy = policyIds.find((id) => !availablePolicies.includes(id)); + const unknownMetric = metricIds.find((id) => !REGISTERED_METRICS.includes(id)); + if (unknownPolicy) throw new MissionError("UNKNOWN_POLICY", `No registered policy named ${unknownPolicy}.`, { available_ids: availablePolicies }); + if (unknownMetric) throw new MissionError("UNKNOWN_METRIC", `No registered comparison metric named ${unknownMetric}.`, { available_ids: REGISTERED_METRICS }); + const rows = policyIds.map((policyId) => { + const runs = ledger.filter((run) => run.split === "evaluation" && run.policy_id === policyId); + const metrics = {}; + metricIds.forEach((metricId) => { + const values = runs.map((run) => Number(metricValue(run, metricId))).filter(Number.isFinite); + metrics[metricId] = ["abstention_count", "divergence_count", "replayed_tokens"].includes(metricId) + ? values.reduce((sum, value) => sum + value, 0) + : median(values); + }); + return { policy_id: policyId, evaluation_runs: runs.length, metrics }; + }); + const bridge = await observatory(); + await bridge.selectView({ experiment: "E001-SC1", depth: "researcher" }); + scrollToId("semantic-consistency-effects-title"); + const receipt = addReceipt("compare_policies", "complete", `Compared ${policyIds.join(" vs ")} on ${metricIds.length} registered metrics.`, { + evidenceIds: semantic.researcher.paired_effects.map((effect) => effect.effect_id), + delta: "Aggregate gate evidence in view", + origin: context.origin, + }); + return resultWithReceipt({ + ok: true, + evaluation_split_only: true, + comparator_frozen_before_evaluation: semantic.comparison.selection.frozen_before_evaluation, + policies: rows, + frozen_gates: semantic.researcher.paired_effects.map((effect) => ({ + effect_id: effect.effect_id, + passed: effect.passed, + })), + conclusion: semantic.status.conclusion, + }, receipt); + } + + async function stageConclusion(args, context) { + const semantic = await semanticArtifact(context.signal); + if (args.expected_state_version !== undefined && args.expected_state_version !== missionState.stateVersion) { + throw new MissionError("STALE_STATE", `Expected state version ${args.expected_state_version}, but current version is ${missionState.stateVersion}.`, { + current_state_version: missionState.stateVersion, + }); + } + if (args.confidence === "supported" && semantic.status.all_falsifiers_pass !== true) { + throw new MissionError("EVIDENCE_CONFLICT", "A supported conclusion is not admissible: all four frozen aggregate gates failed. Use qualified or abstain and cite the failed gates.", { + frozen_conclusion: semantic.status.conclusion, + recommended_confidence: "abstain", + }); + } + const resolved = []; + for (const evidenceId of args.evidence_ids) { + resolved.push(await resolveEvidence(evidenceId, "researcher", false, context.signal)); + } + const proposal = { + proposalId: `proposal-${String(missionState.nextProposal).padStart(3, "0")}`, + claim: args.claim, + evidenceIds: [...args.evidence_ids], + evidenceKinds: resolved.map((entry) => entry.kind), + confidence: args.confidence, + frozenConclusion: semantic.status.conclusion, + createdAt: new Date().toISOString(), + }; + missionState.nextProposal += 1; + missionState.stateVersion += 1; + missionState.pending = proposal; + editingProposal = false; + persist(); + renderMission(); + scrollToId("pending-changes-title"); + const receipt = addReceipt("stage_conclusion", "pending", `Staged ${proposal.proposalId}; human approval remains required.`, { + evidenceIds: proposal.evidenceIds, + delta: `Pending proposal → ${proposal.proposalId}`, + origin: context.origin, + }); + return resultWithReceipt({ + ok: true, + proposal_id: proposal.proposalId, + status: "pending_human_review", + confidence: proposal.confidence, + evidence_ids: proposal.evidenceIds, + frozen_conclusion: proposal.frozenConclusion, + next_action: "A human must approve, edit, or reject in the visible pending tray.", + }, receipt); + } + + const HANDLERS = Object.freeze({ + get_observatory_state: getObservatoryState, + compare_stress_families: compareStressFamilies, + inspect_stress_family: inspectStressFamily, + inspect_run: inspectRun, + trace_causal_path: traceCausalPath, + open_evidence: openEvidence, + compare_policies: comparePolicies, + stage_conclusion: stageConclusion, + }); + + async function invoke(toolName, args = {}, options = {}) { + const handler = HANDLERS[toolName]; + if (!handler) return { ok: false, code: "UNKNOWN_TOOL", message: `No mission handler named ${toolName}.` }; + const context = { signal: options.signal, origin: options.origin || "webmcp" }; + setStatus(`${toolName.replaceAll("_", " ")}…`, "working"); + try { + abortIfNeeded(context.signal); + const result = await handler(args, context); + abortIfNeeded(context.signal); + refreshRegistrationStatus(); + return result; + } catch (error) { + if (error?.name === "AbortError") throw error; + const code = error instanceof MissionError ? error.code : "MISSION_ERROR"; + const message = error instanceof Error ? error.message : "Mission execution failed."; + const receipt = addReceipt(toolName, "failed", message, { origin: context.origin }); + refreshRegistrationStatus("error"); + return { + ok: false, + code, + message, + ...(error instanceof MissionError ? error.extra : {}), + state_version: missionState.stateVersion, + receipt_id: receipt.receiptId, + }; + } + } + + function escapeText(value) { + return String(value ?? ""); + } + + function renderPending() { + if (!dom.pending) return; + const proposal = missionState.pending; + dom.pending.replaceChildren(); + if (!proposal) { + dom.pending.innerHTML = EMPTY_PENDING_HTML; + } else { + const card = document.createElement("article"); + card.className = "mission-change"; + card.dataset.kind = "conclusion"; + card.dataset.changeId = proposal.proposalId; + card.setAttribute("aria-selected", "true"); + const title = document.createElement("h3"); + title.textContent = `${proposal.proposalId} · ${proposal.confidence}`; + const claim = editingProposal ? document.createElement("textarea") : document.createElement("p"); + if (editingProposal) { + claim.id = "mission-claim-editor"; + claim.className = "mission-claim-editor"; + claim.value = proposal.claim; + claim.maxLength = 600; + claim.setAttribute("aria-label", "Edit staged conclusion"); + } else { + claim.textContent = proposal.claim; + } + const evidence = document.createElement("p"); + const evidenceLabel = document.createElement("strong"); + evidenceLabel.textContent = "Evidence: "; + evidence.append(evidenceLabel, document.createTextNode(proposal.evidenceIds.join(" · "))); + const boundary = document.createElement("p"); + boundary.textContent = `Frozen result: ${proposal.frozenConclusion}. Approval has not occurred.`; + card.append(title, claim, evidence, boundary); + dom.pending.append(card); + } + dom.pendingCount.textContent = proposal ? "1 staged" : "0 staged"; + [dom.approve, dom.reject, dom.edit].forEach((button) => { button.disabled = !proposal; }); + dom.edit.textContent = editingProposal ? "Save" : "Edit"; + } + + function renderReceipts() { + if (!dom.receipts) return; + dom.receipts.replaceChildren(); + if (!missionState.receipts.length) { + const item = document.createElement("li"); + item.className = "mission-empty mission-empty--receipt"; + item.innerHTML = `
    No WebMCP calls yet

    Semantic calls appear with evidence IDs and visible state deltas.

    `; + dom.receipts.append(item); + } else { + [...missionState.receipts].reverse().forEach((receipt) => { + const item = document.createElement("li"); + item.className = "webmcp-receipt"; + item.dataset.status = receipt.status; + const heading = document.createElement("strong"); + heading.textContent = `${receipt.tool.replaceAll("_", " ")} · ${receipt.status}`; + const summary = document.createElement("p"); + summary.textContent = receipt.summary; + const metadata = document.createElement("p"); + metadata.className = "receipt-delta"; + const time = document.createElement("time"); + time.dateTime = receipt.timestamp; + time.textContent = new Date(receipt.timestamp).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", second: "2-digit" }); + metadata.append(document.createTextNode(`${receipt.receiptId} · ${receipt.delta} · `), time); + item.append(heading, summary, metadata); + const evidenceIds = evidenceIdsFromReceipt(receipt); + if (evidenceIds.length) { + const evidence = document.createElement("p"); + evidence.className = "receipt-evidence"; + evidence.textContent = `Evidence: ${evidenceIds.join(" · ")}`; + item.append(evidence); + } + dom.receipts.append(item); + }); + } + dom.receiptCount.textContent = `${missionState.receipts.length} item${missionState.receipts.length === 1 ? "" : "s"}`; + dom.undo.disabled = missionState.approved.length === 0; + } + + function renderMission() { + renderPending(); + renderReceipts(); + } + + async function approvePending() { + if (!missionState.pending) return; + const approved = { ...missionState.pending, approvedAt: new Date().toISOString() }; + missionState.approved.push(approved); + missionState.approved = missionState.approved.slice(-8); + missionState.pending = null; + missionState.stateVersion += 1; + editingProposal = false; + persist(); + addReceipt("human_approve", "approved", `Human recorded ${approved.proposalId}.`, { + evidenceIds: approved.evidenceIds, + delta: `Recorded conclusion → ${approved.proposalId}`, + origin: "human", + }); + setStatus("Human decision recorded · undo available", "ready"); + window.GPUStackObservatory?.announce("Staged conclusion approved and recorded by the human reviewer."); + } + + function rejectPending() { + if (!missionState.pending) return; + const rejected = missionState.pending; + missionState.pending = null; + missionState.stateVersion += 1; + editingProposal = false; + persist(); + addReceipt("human_reject", "rejected", `Human rejected ${rejected.proposalId}.`, { + evidenceIds: rejected.evidenceIds, + delta: `Rejected proposal → ${rejected.proposalId}`, + origin: "human", + }); + setStatus("Proposal rejected · evidence remains visible", "ready"); + } + + function editPending() { + if (!missionState.pending) return; + if (!editingProposal) { + editingProposal = true; + renderMission(); + document.getElementById("mission-claim-editor")?.focus(); + return; + } + const editor = document.getElementById("mission-claim-editor"); + const claim = editor ? editor.value.trim() : ""; + if (!claim) { + setStatus("A staged conclusion cannot be empty", "error"); + return; + } + missionState.pending.claim = claim.slice(0, 600); + missionState.stateVersion += 1; + editingProposal = false; + persist(); + addReceipt("human_edit", "pending", `Human edited ${missionState.pending.proposalId}; approval is still required.`, { + evidenceIds: missionState.pending.evidenceIds, + delta: `Edited proposal → ${missionState.pending.proposalId}`, + origin: "human", + }); + } + + function undoApproved() { + const undone = missionState.approved.pop(); + if (!undone) return; + missionState.stateVersion += 1; + persist(); + addReceipt("human_undo", "complete", `Human undid recorded decision ${undone.proposalId}.`, { + evidenceIds: undone.evidenceIds, + delta: `Removed recorded conclusion → ${undone.proposalId}`, + origin: "human", + }); + setStatus("Last recorded conclusion undone", "ready"); + } + + async function resetMission() { + missionState = initialMissionState(); + editingProposal = false; + try { window.sessionStorage.removeItem(STORAGE_KEY); } catch (_error) { /* no-op */ } + renderMission(); + clearHighlights(); + const bridge = await observatory(); + await bridge.selectView({ experiment: "E001-SC1", depth: "freshman", semanticFamily: "", semanticRun: "" }, { replace: true }); + refreshRegistrationStatus(); + } + + function pause(milliseconds) { + return new Promise((resolve) => window.setTimeout(resolve, milliseconds)); + } + + async function runTour() { + if (tourRunning) return; + tourRunning = true; + dom.tour.disabled = true; + try { + await invoke("get_observatory_state", {}, { origin: "local_tour" }); + await pause(220); + await invoke("compare_stress_families", {}, { origin: "local_tour" }); + await pause(220); + await invoke("inspect_stress_family", { family_id: "E6-repeated-membership-loss", include_regions: false }, { origin: "local_tour" }); + await pause(220); + await invoke("trace_causal_path", { from_node: "site_availability", to_node: "time_to_target", max_nodes: 7 }, { origin: "local_tour" }); + await pause(220); + await invoke("open_evidence", { evidence_id: "adaptive_minus_best_fixed_final_nll", semantic_depth: "researcher" }, { origin: "local_tour" }); + await pause(220); + await invoke("stage_conclusion", { + claim: "The observable adaptive controller does not earn a transferable winner claim: it abstained under out-of-distribution stress, and every frozen aggregate gate failed.", + evidence_ids: [ + "E6-repeated-membership-loss", + "adaptive_minus_best_fixed_final_nll", + "adaptive_to_best_fixed_inter_site_payload_ratio", + "adaptive_to_best_fixed_modeled_completion_time_ratio", + ], + confidence: "abstain", + expected_state_version: missionState.stateVersion, + }, { origin: "local_tour" }); + setStatus("Audit staged · waiting for human approval", "waiting"); + } finally { + tourRunning = false; + dom.tour.disabled = false; + } + } + + function cacheDOM() { + dom.status = document.getElementById("mission-status"); + dom.pending = document.getElementById("pending-changes"); + dom.pendingCount = document.getElementById("pending-change-count"); + dom.receipts = document.getElementById("webmcp-receipts"); + dom.receiptCount = document.getElementById("webmcp-receipt-count"); + dom.approve = document.getElementById("mission-approve"); + dom.reject = document.getElementById("mission-reject"); + dom.edit = document.getElementById("mission-edit"); + dom.undo = document.getElementById("mission-undo"); + dom.reset = document.getElementById("mission-reset"); + dom.tour = document.getElementById("mission-tour"); + } + + function refreshRegistrationStatus(forcedState) { + const webmcp = window.GPUStackWebMCP; + if (webmcp?.supported) { + webmcp.ready.then((status) => { + const failed = status.failed?.length || 0; + setStatus(failed ? `${status.registered.length} tools ready · ${failed} failed` : `${status.registered.length} WebMCP tools ready`, failed ? "error" : (forcedState || "ready")); + }); + } else { + setStatus("Manual audit ready · WebMCP unavailable in this browser", forcedState || "fallback"); + } + } + + function bindUI() { + dom.approve.addEventListener("click", approvePending); + dom.reject.addEventListener("click", rejectPending); + dom.edit.addEventListener("click", editPending); + dom.undo.addEventListener("click", undoApproved); + dom.reset.addEventListener("click", () => { resetMission().catch(() => setStatus("Reset failed", "error")); }); + dom.tour.addEventListener("click", () => { runTour().catch((error) => setStatus(error.message || "Tour failed", "error")); }); + window.addEventListener("gpustack:webmcp-ready", () => refreshRegistrationStatus()); + window.addEventListener("gpustack:webmcp-unavailable", () => refreshRegistrationStatus()); + } + + async function init() { + document.body.dataset.missionMode = "active"; + cacheDOM(); + bindUI(); + renderMission(); + refreshRegistrationStatus(); + try { + await Promise.all([semanticArtifact(), screeningArtifact(), observatory()]); + refreshRegistrationStatus(); + } catch (error) { + setStatus(`Evidence unavailable · ${error.message}`, "error"); + } + } + + window.GPUStackMission = Object.freeze({ + version: "1.0.0", + invoke, + getState() { + return JSON.parse(JSON.stringify(missionState)); + }, + }); + + if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", init, { once: true }); + else init(); +})(); diff --git a/docs/webmcp-tools.js b/docs/webmcp-tools.js new file mode 100644 index 0000000..179fc15 --- /dev/null +++ b/docs/webmcp-tools.js @@ -0,0 +1,556 @@ +(() => { + "use strict"; + + /** + * WebMCP adapter for GPUSTACK's immutable E001-SC1 evidence observatory. + * + * The page owns the artifacts, visible selection, staged conclusion, and + * human approval/rejection controls. It exposes one bridge to this adapter: + * + * window.GPUStackMission.invoke(toolName, validatedArgs, { signal }) + * + * The bridge may be installed after this file is evaluated. Every invocation + * resolves it from `window` at call time. It must update the human-visible UI + * before resolving and return a compact JSON-serializable object. WebMCP can + * stage a conclusion, but approval remains an explicit page-only human act. + */ + + const MAX_ID_LENGTH = 180; + const MAX_RESULT_CHARS = 1500; + const ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.:/-]{0,179}$/; + const SEMANTIC_DEPTHS = ["freshman", "researcher", "full_trace"]; + const CONFIDENCE_LEVELS = ["supported", "qualified", "abstain"]; + + class ArgumentError extends Error { + constructor(field, message, expected) { + super(message); + this.name = "ArgumentError"; + this.field = field; + this.expected = expected; + } + } + + const objectSchema = (properties, required = []) => ({ + type: "object", + properties, + required, + additionalProperties: false, + }); + + const idSchema = (description) => ({ + type: "string", + description, + minLength: 1, + maxLength: MAX_ID_LENGTH, + pattern: "^[A-Za-z0-9][A-Za-z0-9_.:/-]{0,179}$", + }); + + const idArraySchema = (description, maxItems, minItems = 1) => ({ + type: "array", + description, + minItems, + maxItems, + uniqueItems: true, + items: idSchema("Exact identifier from the active observatory artifact."), + }); + + const SCHEMAS = Object.freeze({ + get_observatory_state: objectSchema({}), + + compare_stress_families: objectSchema({ + family_ids: idArraySchema( + "Optional held-out evaluation family IDs. Omit to compare all six E001-SC1 families.", + 6, + ), + }), + + inspect_stress_family: objectSchema( + { + family_id: idSchema("Held-out family ID, for example E4-failure-inside-wan-collapse."), + include_regions: { + type: "boolean", + default: true, + description: "Include compact uncertainty ranking regions. Defaults to true.", + }, + }, + ["family_id"], + ), + + inspect_run: objectSchema( + { + run_id: idSchema("Exact run ID from the E001-SC1 compact or raw artifact."), + epoch_offset: { + type: "integer", + minimum: 0, + default: 0, + description: "Zero-based first epoch to return. Defaults to 0.", + }, + epoch_limit: { + type: "integer", + minimum: 1, + maximum: 20, + default: 8, + description: "Requested projected epochs. Defaults to 8; replies cap rows to fit the result budget.", + }, + }, + ["run_id"], + ), + + trace_causal_path: objectSchema( + { + from_node: idSchema("Conceptual evidence-graph node where the trace begins."), + to_node: idSchema("Conceptual evidence-graph node where the trace ends."), + max_nodes: { + type: "integer", + minimum: 2, + maximum: 12, + default: 7, + description: "Maximum nodes in the returned path. Defaults to 7.", + }, + }, + ["from_node", "to_node"], + ), + + open_evidence: objectSchema( + { + evidence_id: idSchema("Evidence record, artifact, source, or boundary identifier."), + semantic_depth: { + type: "string", + enum: SEMANTIC_DEPTHS, + default: "researcher", + description: "Explanation depth. Defaults to researcher.", + }, + }, + ["evidence_id"], + ), + + compare_policies: objectSchema({ + policy_ids: idArraySchema( + "Optional policy IDs. Omit to compare observable_adaptive with the frozen periodic_local comparator.", + 3, + ), + metric_ids: idArraySchema( + "Optional metric IDs to prioritize. Omit for the artifact's registered comparison metrics.", + 6, + ), + }), + + stage_conclusion: objectSchema( + { + claim: { + type: "string", + minLength: 1, + maxLength: 600, + description: "Concise proposed conclusion grounded only in the cited evidence IDs.", + }, + evidence_ids: idArraySchema( + "One to eight evidence IDs that directly support or qualify the proposed claim.", + 8, + ), + confidence: { + type: "string", + enum: CONFIDENCE_LEVELS, + description: "Supported, qualified, or abstain. This is evidence confidence, not approval.", + }, + expected_state_version: { + type: "integer", + minimum: 0, + description: "Optional optimistic-concurrency version returned by a prior tool call.", + }, + }, + ["claim", "evidence_ids", "confidence"], + ), + }); + + function isRecord(value) { + if (value === null || typeof value !== "object" || Array.isArray(value)) return false; + const prototype = Object.getPrototypeOf(value); + return prototype === Object.prototype || prototype === null; + } + + function checkObject(value, allowedKeys) { + if (!isRecord(value)) { + throw new ArgumentError("$", "Arguments must be a JSON object.", "object"); + } + const unknown = Object.keys(value).find((key) => !allowedKeys.includes(key)); + if (unknown) { + throw new ArgumentError( + unknown, + `Unknown argument: ${unknown}.`, + allowedKeys.length ? `one of: ${allowedKeys.join(", ")}` : "no arguments", + ); + } + } + + function cleanString(value, field, options = {}) { + const { required = false, min = 0, max = 600, pattern = null } = options; + if (value === undefined) { + if (required) throw new ArgumentError(field, `${field} is required.`, "string"); + return undefined; + } + if (typeof value !== "string") { + throw new ArgumentError(field, `${field} must be a string.`, "string"); + } + const cleaned = value.trim(); + if (cleaned.length < min || cleaned.length > max) { + throw new ArgumentError(field, `${field} must be ${min}-${max} characters.`, `${min}-${max} characters`); + } + if (pattern && !pattern.test(cleaned)) { + throw new ArgumentError(field, `${field} has an invalid identifier format.`, "GPUSTACK identifier"); + } + return cleaned; + } + + function cleanId(value, field) { + return cleanString(value, field, { + required: true, + min: 1, + max: MAX_ID_LENGTH, + pattern: ID_PATTERN, + }); + } + + function cleanIdArray(value, field, maxItems) { + if (!Array.isArray(value) || value.length < 1 || value.length > maxItems) { + throw new ArgumentError(field, `${field} must contain 1-${maxItems} identifiers.`, `array with 1-${maxItems} identifiers`); + } + const cleaned = value.map((item, index) => cleanId(item, `${field}[${index}]`)); + if (new Set(cleaned).size !== cleaned.length) { + throw new ArgumentError(field, `${field} must not contain duplicates.`, "unique identifiers"); + } + return cleaned; + } + + function cleanOptionalIdArray(value, field, maxItems) { + return value === undefined ? undefined : cleanIdArray(value, field, maxItems); + } + + function cleanEnum(value, field, allowed, fallback) { + if (value === undefined && fallback !== undefined) return fallback; + if (typeof value !== "string" || !allowed.includes(value)) { + throw new ArgumentError(field, `${field} must be one of ${allowed.join(", ")}.`, allowed.join(" | ")); + } + return value; + } + + function cleanInteger(value, field, minimum, maximum, fallback) { + if (value === undefined) { + if (fallback !== undefined) return fallback; + throw new ArgumentError(field, `${field} is required.`, `integer >= ${minimum}`); + } + const aboveMax = maximum !== undefined && value > maximum; + if (!Number.isInteger(value) || value < minimum || aboveMax) { + const range = maximum === undefined ? `>= ${minimum}` : `${minimum}-${maximum}`; + throw new ArgumentError(field, `${field} must be an integer in ${range}.`, `integer ${range}`); + } + return value; + } + + const VALIDATORS = Object.freeze({ + get_observatory_state(args) { + checkObject(args, []); + return {}; + }, + + compare_stress_families(args) { + checkObject(args, ["family_ids"]); + const result = {}; + const familyIds = cleanOptionalIdArray(args.family_ids, "family_ids", 6); + if (familyIds !== undefined) result.family_ids = familyIds; + return result; + }, + + inspect_stress_family(args) { + checkObject(args, ["family_id", "include_regions"]); + if (args.include_regions !== undefined && typeof args.include_regions !== "boolean") { + throw new ArgumentError("include_regions", "include_regions must be a boolean.", "boolean"); + } + return { + family_id: cleanId(args.family_id, "family_id"), + include_regions: args.include_regions === undefined ? true : args.include_regions, + }; + }, + + inspect_run(args) { + checkObject(args, ["run_id", "epoch_offset", "epoch_limit"]); + return { + run_id: cleanId(args.run_id, "run_id"), + epoch_offset: cleanInteger(args.epoch_offset, "epoch_offset", 0, undefined, 0), + epoch_limit: cleanInteger(args.epoch_limit, "epoch_limit", 1, 20, 8), + }; + }, + + trace_causal_path(args) { + checkObject(args, ["from_node", "to_node", "max_nodes"]); + const fromNode = cleanId(args.from_node, "from_node"); + const toNode = cleanId(args.to_node, "to_node"); + if (fromNode === toNode) { + throw new ArgumentError("to_node", "to_node must differ from from_node.", "different node identifier"); + } + return { + from_node: fromNode, + to_node: toNode, + max_nodes: cleanInteger(args.max_nodes, "max_nodes", 2, 12, 7), + }; + }, + + open_evidence(args) { + checkObject(args, ["evidence_id", "semantic_depth"]); + return { + evidence_id: cleanId(args.evidence_id, "evidence_id"), + semantic_depth: cleanEnum(args.semantic_depth, "semantic_depth", SEMANTIC_DEPTHS, "researcher"), + }; + }, + + compare_policies(args) { + checkObject(args, ["policy_ids", "metric_ids"]); + const result = {}; + const policyIds = cleanOptionalIdArray(args.policy_ids, "policy_ids", 3); + const metricIds = cleanOptionalIdArray(args.metric_ids, "metric_ids", 6); + if (policyIds !== undefined) result.policy_ids = policyIds; + if (metricIds !== undefined) result.metric_ids = metricIds; + return result; + }, + + stage_conclusion(args) { + checkObject(args, ["claim", "evidence_ids", "confidence", "expected_state_version"]); + const result = { + claim: cleanString(args.claim, "claim", { required: true, min: 1, max: 600 }), + evidence_ids: cleanIdArray(args.evidence_ids, "evidence_ids", 8), + confidence: cleanEnum(args.confidence, "confidence", CONFIDENCE_LEVELS), + }; + if (args.expected_state_version !== undefined) { + result.expected_state_version = cleanInteger(args.expected_state_version, "expected_state_version", 0); + } + return result; + }, + }); + + const READ_ONLY = Object.freeze({ readOnlyHint: true, untrustedContentHint: false }); + const STAGING_WRITE = Object.freeze({ readOnlyHint: false, untrustedContentHint: true }); + + const TOOL_DEFINITIONS = Object.freeze([ + { + name: "get_observatory_state", + title: "Read observatory state", + description: "Read the active immutable artifact, semantic depth, selected family and run, registered IDs, evidence boundary, state version, and any staged conclusion. Use this first instead of guessing identifiers.", + inputSchema: SCHEMAS.get_observatory_state, + annotations: READ_ONLY, + }, + { + name: "compare_stress_families", + title: "Compare held-out stress families", + description: "Compare up to six E001-SC1 held-out evaluation families on learning, completion time, WAN payload, replayed work, energy, ranking regions, and abstentions. Omit IDs to compare all six.", + inputSchema: SCHEMAS.compare_stress_families, + annotations: READ_ONLY, + }, + { + name: "inspect_stress_family", + title: "Inspect one stress family", + description: "Inspect one held-out E001-SC1 stress family, including adaptive-versus-frozen-comparator deltas, uncertainty regions, abstention reason, and linked run IDs. Also selects it visibly.", + inputSchema: SCHEMAS.inspect_stress_family, + annotations: READ_ONLY, + }, + { + name: "inspect_run", + title: "Inspect experiment run", + description: "Inspect one exact E001-SC1 run and a bounded page of scalar-projected optimizer-commit epochs. Returns mode choice, OOD and abstention state, completion, and event markers while preserving the authoritative raw-trace hash.", + inputSchema: SCHEMAS.inspect_run, + annotations: READ_ONLY, + }, + { + name: "trace_causal_path", + title: "Trace evidence path", + description: "Trace a bounded path through the seven-node conceptual evidence graph, preserving relation labels and observed, modeled, assumed, prior, or unmeasured boundaries. Highlights the same path.", + inputSchema: SCHEMAS.trace_causal_path, + annotations: READ_ONLY, + }, + { + name: "open_evidence", + title: "Open supporting evidence", + description: "Open a registered artifact hash, frozen gate, held-out family, run, source observation, or causal node at the requested semantic depth. Returns provenance and caveats, not a fabricated claim.", + inputSchema: SCHEMAS.open_evidence, + annotations: READ_ONLY, + }, + { + name: "compare_policies", + title: "Compare registered policies", + description: "Compare up to three policies from the immutable experiment artifact. Omit IDs for observable_adaptive versus the calibration-frozen periodic_local comparator across registered metrics.", + inputSchema: SCHEMAS.compare_policies, + annotations: READ_ONLY, + }, + { + name: "stage_conclusion", + title: "Stage evidence conclusion", + description: "Stage a supported, qualified, or abstain conclusion with explicit evidence IDs in the visible pending tray. This never approves or commits it; only the human can approve or reject it in the page.", + inputSchema: SCHEMAS.stage_conclusion, + annotations: STAGING_WRITE, + }, + ]); + + function failure(toolName, code, message, extra = {}) { + return { + ok: false, + tool: toolName, + code, + message: String(message).slice(0, 320), + ...extra, + }; + } + + function compactValue(value, depth = 0) { + if (value === null || typeof value === "boolean") return value; + if (typeof value === "number") return Number.isFinite(value) ? value : null; + if (typeof value === "string") return value.length > 300 ? `${value.slice(0, 297)}...` : value; + if (depth >= 5) return "[detail omitted]"; + if (Array.isArray(value)) { + const result = value.slice(0, 10).map((item) => compactValue(item, depth + 1)); + if (value.length > 10) result.push(`[${value.length - 10} more]`); + return result; + } + if (isRecord(value)) { + const result = {}; + const keys = Object.keys(value).sort().slice(0, 24); + keys.forEach((key) => { + const item = compactValue(value[key], depth + 1); + if (item !== undefined) result[key] = item; + }); + if (Object.keys(value).length > 24) result.detail_omitted = true; + return result; + } + return undefined; + } + + function compactResult(toolName, rawResult) { + if (rawResult === undefined) { + return failure(toolName, "EMPTY_RESULT", "The mission bridge returned no result."); + } + const normalized = isRecord(rawResult) + ? { ok: rawResult.ok !== false, ...rawResult, tool: toolName } + : { ok: true, tool: toolName, result: rawResult }; + + try { + if (JSON.stringify(normalized).length <= MAX_RESULT_CHARS) return normalized; + } catch (_error) { + return failure(toolName, "NON_SERIALIZABLE_RESULT", "The mission bridge returned data that is not JSON-serializable."); + } + + const compacted = compactValue(normalized); + try { + compacted.truncated = true; + if (JSON.stringify(compacted).length <= MAX_RESULT_CHARS) return compacted; + } catch (_error) { + // Fall through to a small receipt. Full detail remains in the page. + } + + const fallback = { + ok: normalized.ok !== false, + tool: toolName, + truncated: true, + message: "Full detail is visible in GPUSTACK; this response was reduced to the WebMCP result budget.", + }; + ["code", "stateVersion", "state_version", "proposal_id", "summary"].forEach((key) => { + if (normalized[key] !== undefined) fallback[key] = compactValue(normalized[key]); + }); + return fallback; + } + + function abortIfNeeded(signal) { + if (signal && signal.aborted) { + throw signal.reason || new Error("Tool execution was cancelled."); + } + } + + async function executeTool(toolName, args, options = {}) { + const signal = options && options.signal; + abortIfNeeded(signal); + + let validated; + try { + validated = VALIDATORS[toolName](args); + } catch (error) { + if (error instanceof ArgumentError) { + return failure(toolName, "INVALID_ARGUMENT", error.message, { + field: error.field, + expected: error.expected, + }); + } + return failure(toolName, "INVALID_ARGUMENT", "The tool arguments could not be validated."); + } + + const bridge = window.GPUStackMission; + if (!bridge || typeof bridge.invoke !== "function") { + return failure(toolName, "BRIDGE_UNAVAILABLE", "GPUSTACK Mission Control is still loading. Retry after the observatory is ready."); + } + + try { + const result = await bridge.invoke(toolName, validated, { signal }); + abortIfNeeded(signal); + return compactResult(toolName, result); + } catch (error) { + abortIfNeeded(signal); + const message = error && typeof error.message === "string" ? error.message : "Mission execution failed."; + return failure(toolName, "MISSION_ERROR", message); + } + } + + function emit(name, detail) { + if (typeof window.dispatchEvent !== "function" || typeof CustomEvent !== "function") return; + window.dispatchEvent(new CustomEvent(name, { detail })); + } + + const toolNames = Object.freeze(TOOL_DEFINITIONS.map((tool) => tool.name)); + if (window.GPUStackWebMCP) return; + + const modelContext = document.modelContext; + if (!modelContext || typeof modelContext.registerTool !== "function") { + window.GPUStackWebMCP = Object.freeze({ + supported: false, + toolNames, + ready: Promise.resolve({ supported: false, registered: [], failed: [] }), + dispose() {}, + }); + emit("gpustack:webmcp-unavailable", { + reason: "document.modelContext.registerTool is unavailable", + toolNames, + }); + return; + } + + const lifecycle = typeof AbortController === "function" ? new AbortController() : null; + const registered = []; + const failed = []; + const ready = (async () => { + for (const definition of TOOL_DEFINITIONS) { + const executable = { + ...definition, + execute: (args, options) => executeTool(definition.name, args, options), + }; + try { + if (lifecycle) { + await modelContext.registerTool(executable, { signal: lifecycle.signal }); + } else { + await modelContext.registerTool(executable); + } + registered.push(definition.name); + } catch (error) { + failed.push({ + name: definition.name, + message: error && typeof error.message === "string" ? error.message.slice(0, 240) : "Registration failed.", + }); + } + } + const status = { supported: true, registered: [...registered], failed: [...failed] }; + emit("gpustack:webmcp-ready", status); + return status; + })(); + + window.GPUStackWebMCP = Object.freeze({ + supported: true, + toolNames, + ready, + dispose() { + if (lifecycle && !lifecycle.signal.aborted) lifecycle.abort(); + }, + }); +})(); diff --git a/evals/webmcp-evals.json b/evals/webmcp-evals.json new file mode 100644 index 0000000..511b8b5 --- /dev/null +++ b/evals/webmcp-evals.json @@ -0,0 +1,160 @@ +[ + { + "name": "Read the observatory before auditing", + "messages": [ + { + "role": "user", + "type": "message", + "content": "Read the current GPUSTACK observatory state and tell me which immutable experiment, policies, families, evidence boundary, and review state are available. Do not guess identifiers." + } + ], + "expectedCall": [ + { + "functionName": "get_observatory_state", + "arguments": {} + } + ] + }, + { + "name": "Compare every held-out stress family", + "messages": [ + { + "role": "user", + "type": "message", + "content": "Compare observable_adaptive with the frozen comparator across all six held-out E001-SC1 stress families. Include learning, modeled completion time, payload, replayed work, and abstentions." + } + ], + "expectedCall": [ + { + "functionName": "compare_stress_families", + "arguments": {} + } + ] + }, + { + "name": "Inspect the decisive repeated-membership-loss family", + "messages": [ + { + "role": "user", + "type": "message", + "content": "Inspect E6-repeated-membership-loss, including its uncertainty regions, adaptive-versus-comparator delta, abstention reason, and linked runs." + } + ], + "expectedCall": [ + { + "functionName": "inspect_stress_family", + "arguments": { + "family_id": "E6-repeated-membership-loss", + "include_regions": true + } + } + ] + }, + { + "name": "Inspect a bounded page of the decisive candidate run", + "messages": [ + { + "role": "user", + "type": "message", + "content": "Inspect the first eight projected epochs of the observable_adaptive run in the E6 held-out family. Keep the result bounded and preserve its link to the authoritative trace." + } + ], + "expectedCall": [ + { + "functionName": "inspect_run", + "arguments": { + "run_id": "e001-sc1:evaluation:E6-repeated-membership-loss:observable_adaptive", + "epoch_offset": 0, + "epoch_limit": 8 + } + } + ] + }, + { + "name": "Trace the causal evidence DAG", + "messages": [ + { + "role": "user", + "type": "message", + "content": "Trace the published evidence path from site availability to time to target. Preserve the relation labels and evidence classes, and do not invent a linear chain where the graph branches." + } + ], + "expectedCall": [ + { + "functionName": "trace_causal_path", + "arguments": { + "from_node": "site_availability", + "to_node": "time_to_target", + "max_nodes": 7 + } + } + ] + }, + { + "name": "Open the semantic-consistency evidence boundary", + "messages": [ + { + "role": "user", + "type": "message", + "content": "Open the E001-SC1 semantic-consistency evidence at full-trace depth and distinguish measured learning, exact accounting, modeled infrastructure, and unresolved transfer." + } + ], + "expectedCall": [ + { + "functionName": "open_evidence", + "arguments": { + "evidence_id": "369bc4e9b32d6e1fcdd8dadc98c830e5ac5179f4a7204a9f5194e22913fdefdf", + "semantic_depth": "full_trace" + } + } + ] + }, + { + "name": "Compare the adaptive policy with its frozen comparator", + "messages": [ + { + "role": "user", + "type": "message", + "content": "Compare observable_adaptive with the calibration-frozen periodic_local policy using the registered E001-SC1 metrics." + } + ], + "expectedCall": [ + { + "functionName": "compare_policies", + "arguments": { + "policy_ids": [ + "observable_adaptive", + "periodic_local" + ] + } + } + ] + }, + { + "name": "Stage the warranted abstention without approving it", + "messages": [ + { + "role": "user", + "type": "message", + "content": "Stage the scientifically warranted conclusion that no transferable winner claim follows for observable_adaptive over periodic_local across the held-out stress families. Cite the decisive E6 family, both E6 policy runs, the failed learning effect, and the compact and raw semantic-consistency artifacts. Mark confidence as abstain. Do not approve or commit it." + } + ], + "expectedCall": [ + { + "functionName": "stage_conclusion", + "arguments": { + "claim": "No transferable winner claim follows for observable_adaptive over periodic_local across the held-out stress families.", + "evidence_ids": [ + "adaptive_minus_best_fixed_final_nll", + "E6-repeated-membership-loss", + "e001-sc1:evaluation:E6-repeated-membership-loss:observable_adaptive", + "e001-sc1:evaluation:E6-repeated-membership-loss:periodic_local", + "369bc4e9b32d6e1fcdd8dadc98c830e5ac5179f4a7204a9f5194e22913fdefdf", + "d6321d6fc4c0f71c4f14c2f799eff252348073b3fe5508783f9f078e7f5e9d76" + ], + "confidence": "abstain" + } + } + ] + } +] diff --git a/scripts/generate_webmcp_projection.py b/scripts/generate_webmcp_projection.py new file mode 100644 index 0000000..cc7b202 --- /dev/null +++ b/scripts/generate_webmcp_projection.py @@ -0,0 +1,171 @@ +#!/usr/bin/env python3 +"""Build the bounded WebMCP epoch projection from the immutable E001-SC1 trace. + +The source artifact is intentionally large (roughly 72 MB). WebMCP tools must +not return or eagerly load that file, so this script preserves the audit fields +needed by ``inspect_run`` while dropping tensors, replica state, and hashes that +are not useful in a short agent interaction. +""" + +from __future__ import annotations + +import argparse +import gzip +import io +import json +from pathlib import Path +from typing import Any + + +ROOT = Path(__file__).resolve().parents[1] +DEFAULT_SOURCE = ROOT / "docs" / "data" / "e001-semantic-consistency-raw-v1.json" +DEFAULT_OUTPUT = ROOT / "docs" / "data" / "webmcp-run-projection-v1.json.gz" + + +def _event_count(value: Any, *keys: str) -> int: + if isinstance(value, list): + return len(value) + if not isinstance(value, dict): + return 0 + return sum(len(value.get(key, [])) for key in keys if isinstance(value.get(key), list)) + + +EPOCH_COLUMNS = [ + "index", + "wall_tick", + "logical_tick_before", + "logical_tick_after", + "action", + "selected_mode", + "commit_outcome", + "abstained", + "abstention_reasons", + "ood", + "ood_dimensions", + "active_site_count", + "wan_bandwidth_bytes_per_second", + "wan_round_trip_seconds", + "modeled_completion_seconds", + "modeled_compute_seconds", + "modeled_wan_seconds", + "held_out_nll", + "recent_gradient_norm", + "attempted_tokens", + "useful_tokens", + "replayed_tokens", + "discarded_tokens", + "membership_event_count", + "merge_event_count", + "recovery_event_count", + "wan_event_count", + "mode_transition_from", + "mode_transition_to", +] + + +def _compact_epoch(epoch: dict[str, Any], index: int) -> list[Any]: + abstention = epoch.get("abstention_state") or {} + ood = epoch.get("ood_state") or {} + stress = epoch.get("stress") or {} + accounting = epoch.get("exact_accounting") or {} + feature_vector = ood.get("feature_vector") or {} + transition = epoch.get("mode_transition") or {} + return [ + index, + epoch.get("wall_tick"), + epoch.get("logical_tick_before"), + epoch.get("logical_tick_after"), + epoch.get("action"), + epoch.get("selected_mode"), + epoch.get("commit_outcome"), + bool(abstention.get("abstained")), + abstention.get("reasons") or [], + bool(ood.get("is_out_of_distribution")), + ood.get("dimensions") or [], + feature_vector.get("active_site_count", len(stress.get("active_sites") or [])), + feature_vector.get( + "wan_bandwidth_bytes_per_second", stress.get("bandwidth_bytes_per_second") + ), + feature_vector.get("wan_latency_seconds"), + epoch.get("modeled_completion_seconds"), + epoch.get("modeled_compute_seconds"), + epoch.get("modeled_wan_seconds"), + epoch.get("held_out_nll"), + epoch.get("recent_gradient_norm"), + accounting.get("attempted_tokens"), + accounting.get("useful_tokens"), + accounting.get("replayed_tokens"), + accounting.get("discarded_tokens"), + _event_count(epoch.get("membership_events"), "departures", "rejoins"), + _event_count(epoch.get("merge_events")), + _event_count(epoch.get("recovery_events")), + _event_count(epoch.get("wan_events")), + transition.get("from_mode") if transition else None, + transition.get("to_mode") if transition else None, + ] + + +def build_projection(source: dict[str, Any]) -> dict[str, Any]: + runs = [] + projected_epoch_count = 0 + for run in source.get("runs", []): + epoch_trace = [ + _compact_epoch(epoch, index) + for index, epoch in enumerate(run.get("epoch_trace", [])) + ] + projected_epoch_count += len(epoch_trace) + runs.append( + { + "run_id": run.get("run_id"), + "family_or_stratum_id": run.get("family_or_stratum_id"), + "policy_id": run.get("policy_id"), + "split": run.get("split"), + "seed": run.get("seed"), + "epoch_count": len(epoch_trace), + "epochs": epoch_trace, + } + ) + + return { + "schema": "gpustack.webmcp-run-projection.v1", + "experiment_id": source.get("experiment_id"), + "source_schema": source.get("schema"), + "source_artifact_sha256": source.get("artifact_sha256"), + "source_epoch_count": source.get("epoch_count"), + "projected_epoch_count": projected_epoch_count, + "projection_boundary": ( + "Rows follow epoch_columns. Lossless for listed scalar audit fields; omits tensors, replica state, sample hashes, " + "and descriptive local-device energy. The immutable raw artifact remains authoritative." + ), + "epoch_columns": EPOCH_COLUMNS, + "runs": runs, + } + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--source", type=Path, default=DEFAULT_SOURCE) + parser.add_argument("--output", type=Path, default=DEFAULT_OUTPUT) + args = parser.parse_args() + + with args.source.open(encoding="utf-8") as handle: + source = json.load(handle) + projection = build_projection(source) + args.output.parent.mkdir(parents=True, exist_ok=True) + payload = (json.dumps(projection, ensure_ascii=False, separators=(",", ":")) + "\n").encode() + if args.output.suffix == ".gz": + buffer = io.BytesIO() + with gzip.GzipFile(filename="", mode="wb", fileobj=buffer, compresslevel=9, mtime=0) as handle: + handle.write(payload) + args.output.write_bytes(buffer.getvalue()) + else: + args.output.write_bytes(payload) + + print( + f"wrote {args.output} with {len(projection['runs'])} runs and " + f"{projection['projected_epoch_count']} epochs" + ) + + +if __name__ == "__main__": + main() diff --git a/tests/test_webmcp_contract.py b/tests/test_webmcp_contract.py new file mode 100644 index 0000000..4b30011 --- /dev/null +++ b/tests/test_webmcp_contract.py @@ -0,0 +1,373 @@ +"""Chrome-free contract tests for the browser-side WebMCP adapter.""" + +from __future__ import annotations + +import json +from pathlib import Path +import re +import shutil +import subprocess + +import pytest + + +ROOT = Path(__file__).resolve().parents[1] +ADAPTER = ROOT / "docs" / "webmcp-tools.js" + +TOOL_ORDER = [ + "get_observatory_state", + "compare_stress_families", + "inspect_stress_family", + "inspect_run", + "trace_causal_path", + "open_evidence", + "compare_policies", + "stage_conclusion", +] +EXPECTED_TOOLS = set(TOOL_ORDER) +READ_ONLY_TOOLS = set(TOOL_ORDER[:-1]) + +VALID_CALLS = { + "get_observatory_state": {}, + "compare_stress_families": {}, + "inspect_stress_family": {"family_id": "E4-failure-inside-wan-collapse"}, + "inspect_run": { + "run_id": "e001-sc1:evaluation:E6-repeated-membership-loss:future_trace_oracle" + }, + "trace_causal_path": { + "from_node": "site_availability", + "to_node": "time_to_target", + }, + "open_evidence": { + "evidence_id": "369bc4e9b32d6e1fcdd8dadc98c830e5ac5179f4a7204a9f5194e22913fdefdf" + }, + "compare_policies": { + "policy_ids": ["observable_adaptive", "periodic_local"], + }, + "stage_conclusion": { + "claim": "The transferable-win claim is not supported across every held-out family; abstain pending stronger evidence.", + "evidence_ids": [ + "369bc4e9b32d6e1fcdd8dadc98c830e5ac5179f4a7204a9f5194e22913fdefdf", + "d6321d6fc4c0f71c4f14c2f799eff252348073b3fe5508783f9f078e7f5e9d76", + ], + "confidence": "abstain", + "expected_state_version": 4, + }, +} + +INVALID_CALLS = { + "get_observatory_state": {"invented": True}, + "compare_stress_families": { + "family_ids": [f"E{index}-family" for index in range(1, 8)] + }, + "inspect_stress_family": { + "family_id": "E1-bursty-wan", + "include_regions": "yes", + }, + "inspect_run": {"run_id": "run-1", "epoch_limit": 21}, + "trace_causal_path": { + "from_node": "time_to_target", + "to_node": "time_to_target", + }, + "open_evidence": {"evidence_id": "contains a space"}, + "compare_policies": {"policy_ids": ["same", "same"]}, + "stage_conclusion": { + "claim": "Unsupported certainty", + "evidence_ids": [], + "confidence": "certain", + }, +} + + +NODE_HARNESS = r""" +const fs = require("fs"); +const vm = require("vm"); +const adapterPath = process.argv[1]; +const mode = process.argv[2]; +const source = fs.readFileSync(adapterPath, "utf8"); +const registered = []; +const invocations = []; +const events = []; + +class TestCustomEvent { + constructor(type, options = {}) { this.type = type; this.detail = options.detail; } +} + +const windowObject = { + dispatchEvent(event) { events.push({ type: event.type, detail: event.detail }); return true; }, +}; +if (mode !== "no_bridge") { + windowObject.GPUStackMission = { + async invoke(name, args, options) { + invocations.push({ name, args, hasSignal: Boolean(options && options.signal) }); + if (mode === "large_result") { + return { ok: true, stateVersion: 7, summary: "x".repeat(6000), rows: Array(80).fill("y".repeat(200)) }; + } + return { ok: true, stateVersion: 7, summary: `completed ${name}` }; + }, + }; +} +const documentObject = mode === "unsupported" ? {} : { + modelContext: { + async registerTool(tool, options) { + registered.push({ tool, hasLifecycleSignal: Boolean(options && options.signal) }); + }, + }, +}; +const context = { + window: windowObject, + document: documentObject, + CustomEvent: TestCustomEvent, + AbortController, + console, + Promise, + Object, + Array, + Number, + String, + Boolean, + Set, + Error, + JSON, +}; +vm.runInNewContext(source, context, { filename: adapterPath }); + +(async () => { + const status = await windowObject.GPUStackWebMCP.ready; + if (mode === "unsupported") { + process.stdout.write(JSON.stringify({ supported: windowObject.GPUStackWebMCP.supported, status, events })); + return; + } + if (mode === "metadata") { + process.stdout.write(JSON.stringify({ + status, + events, + tools: registered.map(({ tool, hasLifecycleSignal }) => ({ + name: tool.name, + title: tool.title, + description: tool.description, + inputSchema: tool.inputSchema, + annotations: tool.annotations, + executeType: typeof tool.execute, + hasLifecycleSignal, + })), + })); + return; + } + if (mode === "invoke") { + const calls = JSON.parse(process.argv[3]); + const results = {}; + for (const { tool } of registered) { + results[tool.name] = await tool.execute(calls[tool.name], { signal: new AbortController().signal }); + } + const beforeInvalid = invocations.length; + const invalid = await registered[0].tool.execute( + { invented: true }, + { signal: new AbortController().signal }, + ); + process.stdout.write(JSON.stringify({ + results, + invocations, + invalid, + invalidReachedBridge: invocations.length !== beforeInvalid, + })); + return; + } + if (mode === "validation") { + const calls = JSON.parse(process.argv[3]); + const results = {}; + for (const { tool } of registered) { + results[tool.name] = await tool.execute(calls[tool.name], { signal: new AbortController().signal }); + } + process.stdout.write(JSON.stringify({ results, invocationCount: invocations.length })); + return; + } + if (mode === "no_bridge" || mode === "large_result") { + const result = await registered[0].tool.execute({}, { signal: new AbortController().signal }); + process.stdout.write(JSON.stringify({ result })); + return; + } + throw new Error(`Unknown harness mode: ${mode}`); +})().catch((error) => { console.error(error); process.exitCode = 1; }); +""" + + +def _node() -> str: + executable = shutil.which("node") + if executable is None: + pytest.skip("Node is required for JavaScript contract execution") + return executable + + +def _run_harness(mode: str, payload: object | None = None) -> dict: + command = [_node(), "-e", NODE_HARNESS, str(ADAPTER), mode] + if payload is not None: + command.append(json.dumps(payload, separators=(",", ":"))) + completed = subprocess.run( + command, + cwd=ROOT, + check=True, + capture_output=True, + text=True, + timeout=15, + ) + return json.loads(completed.stdout) + + +def test_adapter_parses_and_uses_current_imperative_api() -> None: + source = ADAPTER.read_text(encoding="utf-8") + subprocess.run( + [_node(), "--check", str(ADAPTER)], + cwd=ROOT, + check=True, + capture_output=True, + text=True, + timeout=15, + ) + assert "document.modelContext" in source + assert ".registerTool(" in source + assert "navigator.modelContext" not in source + assert "outputSchema" not in source + assert "requestUserInteraction" not in source + + +def test_exact_tools_schemas_and_annotations() -> None: + result = _run_harness("metadata") + tools = {tool["name"]: tool for tool in result["tools"]} + + assert list(tools) == TOOL_ORDER + assert result["status"] == { + "supported": True, + "registered": TOOL_ORDER, + "failed": [], + } + assert any(event["type"] == "gpustack:webmcp-ready" for event in result["events"]) + + for name, tool in tools.items(): + assert tool["title"].strip() + assert tool["description"].strip() + assert len(tool["description"]) <= 500 + assert tool["executeType"] == "function" + assert tool["hasLifecycleSignal"] is True + assert tool["inputSchema"]["type"] == "object" + assert tool["inputSchema"]["additionalProperties"] is False + assert tool["annotations"]["readOnlyHint"] is (name in READ_ONLY_TOOLS) + + assert tools["stage_conclusion"]["annotations"]["untrustedContentHint"] is True + assert all( + tools[name]["annotations"]["untrustedContentHint"] is False + for name in READ_ONLY_TOOLS + ) + assert tools["get_observatory_state"]["inputSchema"]["properties"] == {} + assert tools["stage_conclusion"]["inputSchema"]["required"] == [ + "claim", + "evidence_ids", + "confidence", + ] + + +def test_schema_limits_match_the_grounded_artifact_contract() -> None: + tools = {tool["name"]: tool for tool in _run_harness("metadata")["tools"]} + schemas = {name: tool["inputSchema"] for name, tool in tools.items()} + + assert schemas["compare_stress_families"]["properties"]["family_ids"]["maxItems"] == 6 + assert schemas["inspect_run"]["properties"]["epoch_offset"]["minimum"] == 0 + assert schemas["inspect_run"]["properties"]["epoch_limit"]["maximum"] == 20 + assert schemas["trace_causal_path"]["properties"]["max_nodes"] == { + "type": "integer", + "minimum": 2, + "maximum": 12, + "default": 7, + "description": "Maximum nodes in the returned path. Defaults to 7.", + } + assert schemas["compare_policies"]["properties"]["policy_ids"]["maxItems"] == 3 + assert schemas["compare_policies"]["properties"]["metric_ids"]["maxItems"] == 6 + assert schemas["stage_conclusion"]["properties"]["evidence_ids"]["maxItems"] == 8 + assert schemas["stage_conclusion"]["properties"]["confidence"]["enum"] == [ + "supported", + "qualified", + "abstain", + ] + + +def test_valid_calls_are_normalized_forwarded_and_compact() -> None: + result = _run_harness("invoke", VALID_CALLS) + + assert len(result["invocations"]) == 8 + assert {call["name"] for call in result["invocations"]} == EXPECTED_TOOLS + assert all(call["hasSignal"] for call in result["invocations"]) + assert all(value["ok"] is True for value in result["results"].values()) + assert all(value["tool"] == name for name, value in result["results"].items()) + assert all( + len(json.dumps(value, separators=(",", ":"))) <= 1500 + for value in result["results"].values() + ) + + calls = {call["name"]: call["args"] for call in result["invocations"]} + assert calls["get_observatory_state"] == {} + assert calls["inspect_stress_family"]["include_regions"] is True + assert calls["inspect_run"]["epoch_offset"] == 0 + assert calls["inspect_run"]["epoch_limit"] == 8 + assert calls["trace_causal_path"]["max_nodes"] == 7 + assert calls["open_evidence"]["semantic_depth"] == "researcher" + + +def test_invalid_arguments_fail_before_bridge() -> None: + result = _run_harness("invoke", VALID_CALLS) + invalid = result["invalid"] + assert result["invalidReachedBridge"] is False + assert invalid["ok"] is False + assert invalid["tool"] == "get_observatory_state" + assert invalid["code"] == "INVALID_ARGUMENT" + assert invalid["field"] == "invented" + + +def test_domain_validation_rejects_bad_calls_before_bridge() -> None: + result = _run_harness("validation", INVALID_CALLS) + assert result["invocationCount"] == 0 + assert set(result["results"]) == EXPECTED_TOOLS + for name, failure in result["results"].items(): + assert failure["ok"] is False, name + assert failure["tool"] == name + assert failure["code"] == "INVALID_ARGUMENT" + assert failure["field"] + assert failure["expected"] + + +def test_late_bound_missing_bridge_returns_recoverable_failure() -> None: + result = _run_harness("no_bridge")["result"] + assert result == { + "ok": False, + "tool": "get_observatory_state", + "code": "BRIDGE_UNAVAILABLE", + "message": "GPUSTACK Mission Control is still loading. Retry after the observatory is ready.", + } + + +def test_large_bridge_results_are_bounded_for_agent_context() -> None: + result = _run_harness("large_result")["result"] + assert result["ok"] is True + assert result["tool"] == "get_observatory_state" + assert result["truncated"] is True + assert len(json.dumps(result, separators=(",", ":"))) <= 1500 + + +@pytest.mark.parametrize("name", TOOL_ORDER) +def test_each_tool_name_is_declared_once(name: str) -> None: + source = ADAPTER.read_text(encoding="utf-8") + declared = re.findall(r'^\s+name: "([a-z_]+)",$', source, flags=re.MULTILINE) + assert declared.count(name) == 1 + + +def test_feature_detection_preserves_normal_page() -> None: + result = _run_harness("unsupported") + assert result["supported"] is False + assert result["status"] == {"supported": False, "registered": [], "failed": []} + assert [event["type"] for event in result["events"]] == ["gpustack:webmcp-unavailable"] + + +def test_adapter_documents_late_bound_bridge_and_human_only_approval() -> None: + source = ADAPTER.read_text(encoding="utf-8") + assert "window.GPUStackMission.invoke(toolName, validatedArgs, { signal })" in source + assert "approval remains an explicit page-only human act" in source + assert "This never approves or commits it" in source diff --git a/tests/test_webmcp_mission_runtime.mjs b/tests/test_webmcp_mission_runtime.mjs new file mode 100644 index 0000000..f460559 --- /dev/null +++ b/tests/test_webmcp_mission_runtime.mjs @@ -0,0 +1,241 @@ +import assert from "node:assert/strict"; +import fs from "node:fs/promises"; +import path from "node:path"; +import test from "node:test"; +import vm from "node:vm"; +import { fileURLToPath } from "node:url"; + + +const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); + + +async function makeRuntime() { + const registrations = new Map(); + const selections = []; + const paths = []; + const storage = new Map(); + const document = { + readyState: "loading", + body: { dataset: {} }, + addEventListener() {}, + getElementById() { return null; }, + querySelector() { return null; }, + querySelectorAll() { return []; }, + modelContext: { + async registerTool(definition) { + registrations.set(definition.name, definition); + }, + }, + }; + const window = { + document, + sessionStorage: { + getItem(key) { return storage.get(key) ?? null; }, + setItem(key, value) { storage.set(key, value); }, + removeItem(key) { storage.delete(key); }, + }, + dispatchEvent() {}, + setTimeout, + GPUStackObservatory: { + version: "test", + async whenReady() {}, + getState() { + return { experiment: "E001-SC1", depth: "freshman", semanticFamily: "", semanticRun: "" }; + }, + async selectView(patch) { + selections.push(patch); + return patch; + }, + async focusCausalPath(nodeIds, edges) { + paths.push({ nodeIds, edges }); + }, + announce() {}, + }, + }; + + const context = vm.createContext({ + AbortController, + CSS: { escape: (value) => String(value) }, + CustomEvent: class CustomEvent { + constructor(type, options = {}) { this.type = type; this.detail = options.detail; } + }, + DOMException, + Blob, + DecompressionStream, + Response, + URL, + console, + document, + fetch: async (url) => { + const filename = path.join(ROOT, "docs", String(url)); + try { + const body = await fs.readFile(filename); + return { + ok: true, + status: 200, + async arrayBuffer() { return body.buffer.slice(body.byteOffset, body.byteOffset + body.byteLength); }, + async json() { return JSON.parse(body.toString("utf8")); }, + }; + } catch (_error) { + return { ok: false, status: 404, async json() { throw new Error("not found"); } }; + } + }, + setTimeout, + window, + }); + window.window = window; + + const toolsSource = await fs.readFile(path.join(ROOT, "docs", "webmcp-tools.js"), "utf8"); + vm.runInContext(toolsSource, context, { filename: "webmcp-tools.js" }); + await window.GPUStackWebMCP.ready; + + const missionSource = await fs.readFile(path.join(ROOT, "docs", "webmcp-mission.js"), "utf8"); + vm.runInContext(missionSource, context, { filename: "webmcp-mission.js" }); + + return { window, registrations, selections, paths, context }; +} + + +function executor(runtime) { + return (name, args) => { + runtime.context.__args = JSON.stringify(args); + const realmArgs = vm.runInContext("JSON.parse(__args)", runtime.context); + return runtime.registrations.get(name).execute(realmArgs, { signal: new AbortController().signal }); + }; +} + + +test("all eight WebMCP registrations execute against immutable evidence", async () => { + const runtime = await makeRuntime(); + assert.equal(runtime.registrations.size, 8); + const execute = executor(runtime); + + const state = await execute("get_observatory_state", {}); + assert.equal(state.ok, true); + assert.ok(state.artifact, JSON.stringify(state)); + assert.equal(state.artifact.families, 6); + assert.equal(state.artifact.runs, 56); + assert.equal(state.artifact.epochs, 12981); + assert.equal(state.frozen_result.abstentions, 104); + assert.equal(state.frozen_result.all_falsifiers_pass, false); + assert.equal(state.truncated, undefined); + + const families = await execute("compare_stress_families", {}); + assert.equal(families.ok, true); + assert.equal(families.families.length, 6); + assert.equal(families.aggregate_conclusion, "abstain_without_policy_claim"); + assert.equal(families.truncated, undefined); + + const family = await execute("inspect_stress_family", { + family_id: "E6-repeated-membership-loss", + include_regions: true, + }); + assert.equal(family.ok, true); + assert.equal(family.family.abstentions, 24); + assert.equal(family.family.regions.length, 8); + assert.equal(family.truncated, undefined); + + const runId = "e001-sc1:evaluation:E6-repeated-membership-loss:observable_adaptive"; + const run = await execute("inspect_run", { run_id: runId, epoch_offset: 0, epoch_limit: 8 }); + assert.equal(run.ok, true); + assert.equal(run.run.final_held_out_nll, 1.063824194483459); + assert.equal(run.epoch_page.rows.length, 6); + assert.equal(run.epoch_page.context_limit_applied, true); + assert.equal(run.source_raw_sha256, "d6321d6fc4c0f71c4f14c2f799eff252348073b3fe5508783f9f078e7f5e9d76"); + assert.equal(run.truncated, undefined); + + const trace = await execute("trace_causal_path", { + from_node: "site_availability", + to_node: "time_to_target", + max_nodes: 7, + }); + assert.equal(trace.ok, true); + assert.deepEqual( + Array.from(trace.nodes, (node) => node.node_id), + ["site_availability", "mechanical_elapsed_time", "time_to_target"], + ); + assert.equal(trace.truncated, undefined); + + const evidence = await execute("open_evidence", { + evidence_id: "adaptive_minus_best_fixed_final_nll", + semantic_depth: "researcher", + }); + assert.equal(evidence.ok, true); + assert.equal(evidence.evidence.passed, false); + assert.equal(evidence.truncated, undefined); + + const artifactEvidence = await execute("open_evidence", { + evidence_id: "369bc4e9b32d6e1fcdd8dadc98c830e5ac5179f4a7204a9f5194e22913fdefdf", + semantic_depth: "full_trace", + }); + assert.equal(artifactEvidence.ok, true); + assert.equal(artifactEvidence.evidence.kind, "compact_artifact"); + assert.equal(artifactEvidence.truncated, undefined); + + const policies = await execute("compare_policies", {}); + assert.equal(policies.ok, true); + assert.equal(policies.policies.length, 2); + assert.equal(policies.comparator_frozen_before_evaluation, true); + assert.equal(policies.truncated, undefined); + + const rejectedOverclaim = await execute("stage_conclusion", { + claim: "The adaptive policy is a transferable winner.", + evidence_ids: ["E6-repeated-membership-loss"], + confidence: "supported", + expected_state_version: state.state_version, + }); + assert.equal(rejectedOverclaim.ok, false); + assert.equal(rejectedOverclaim.code, "EVIDENCE_CONFLICT"); + + const staged = await execute("stage_conclusion", { + claim: "The artifact supports abstaining from any transferable winner claim.", + evidence_ids: [ + "adaptive_minus_best_fixed_final_nll", + "E6-repeated-membership-loss", + runId, + "e001-sc1:evaluation:E6-repeated-membership-loss:periodic_local", + "369bc4e9b32d6e1fcdd8dadc98c830e5ac5179f4a7204a9f5194e22913fdefdf", + "d6321d6fc4c0f71c4f14c2f799eff252348073b3fe5508783f9f078e7f5e9d76", + ], + confidence: "abstain", + expected_state_version: state.state_version, + }); + assert.equal(staged.ok, true); + assert.equal(staged.status, "pending_human_review"); + assert.equal(staged.truncated, undefined); + assert.equal(runtime.window.GPUStackMission.getState().pending.proposalId, staged.proposal_id); + assert.ok(runtime.selections.length >= 5); + assert.equal(runtime.paths.length, 1); +}); + + +test("adapter rejects invalid and stale calls without mutating approval state", async () => { + const runtime = await makeRuntime(); + const execute = executor(runtime); + + const invalid = await execute("inspect_run", { run_id: "bad id with spaces" }); + assert.equal(invalid.ok, false); + assert.equal(invalid.code, "INVALID_ARGUMENT"); + + const unknown = await execute("inspect_stress_family", { family_id: "E99-missing" }); + assert.equal(unknown.ok, false); + assert.equal(unknown.code, "UNKNOWN_FAMILY"); + + const staged = await execute("stage_conclusion", { + claim: "Abstain from a transferable claim.", + evidence_ids: ["adaptive_minus_best_fixed_final_nll"], + confidence: "abstain", + expected_state_version: 1, + }); + assert.equal(staged.ok, true); + + const stale = await execute("stage_conclusion", { + claim: "A second proposal based on stale state.", + evidence_ids: ["adaptive_minus_best_fixed_final_nll"], + confidence: "abstain", + expected_state_version: 1, + }); + assert.equal(stale.ok, false); + assert.equal(stale.code, "STALE_STATE"); + assert.equal(runtime.window.GPUStackMission.getState().approved.length, 0); +}); diff --git a/tests/test_webmcp_projection.py b/tests/test_webmcp_projection.py new file mode 100644 index 0000000..b8360da --- /dev/null +++ b/tests/test_webmcp_projection.py @@ -0,0 +1,66 @@ +from __future__ import annotations + +import json +import gzip +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +DATA = ROOT / "docs" / "data" + + +def test_webmcp_projection_is_bound_complete_and_columnar() -> None: + with gzip.open(DATA / "webmcp-run-projection-v1.json.gz", "rt", encoding="utf-8") as handle: + projection = json.load(handle) + compact = json.loads((DATA / "e001-semantic-consistency-v1.json").read_text()) + + raw_binding = compact["full_trace"]["raw_trace_artifact"] + compact_runs = compact["full_trace"]["run_ledger"] + projected_runs = projection["runs"] + columns = projection["epoch_columns"] + + assert projection["schema"] == "gpustack.webmcp-run-projection.v1" + assert projection["experiment_id"] == compact["experiment_id"] == "E001-SC1" + assert projection["source_artifact_sha256"] == raw_binding["artifact_sha256"] + assert projection["source_schema"] == raw_binding["schema"] + assert projection["source_epoch_count"] == projection["projected_epoch_count"] == 12_981 + assert len(projected_runs) == len(compact_runs) == 56 + assert {run["run_id"] for run in projected_runs} == {run["run_id"] for run in compact_runs} + assert sum(run["epoch_count"] for run in projected_runs) == 12_981 + + assert len(columns) == len(set(columns)) == 29 + assert columns[:7] == [ + "index", + "wall_tick", + "logical_tick_before", + "logical_tick_after", + "action", + "selected_mode", + "commit_outcome", + ] + assert "abstained" in columns + assert "ood" in columns + assert "modeled_completion_seconds" in columns + + for run in projected_runs: + assert run["epoch_count"] == len(run["epochs"]) + assert all(isinstance(row, list) and len(row) == len(columns) for row in run["epochs"]) + + +def test_projection_does_not_copy_heavy_raw_records() -> None: + projection_path = DATA / "webmcp-run-projection-v1.json.gz" + with gzip.open(projection_path, "rt", encoding="utf-8") as handle: + projection_text = handle.read() + + for forbidden in ( + "replica_lineages", + "replica_disagreement_before", + "replica_disagreement_after", + "sample_commitments", + "token_batch_sha256", + "model_state_sha256", + "optimizer_state_sha256", + ): + assert forbidden not in projection_text + + assert projection_path.stat().st_size < 300_000 From b3996c39ace21adaaf9b89d0d0f979877986553c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=BAper=20=28Yousef=29=20Anas?= <97895153+Cuuper22@users.noreply.github.com> Date: Wed, 2 Sep 2026 23:22:33 -0700 Subject: [PATCH 2/2] docs: clarify public baseline ref --- CHALLENGE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHALLENGE.md b/CHALLENGE.md index 4e473fa..62a4e5b 100644 --- a/CHALLENGE.md +++ b/CHALLENGE.md @@ -7,11 +7,11 @@ GPUSTACK is a virtual AI datacenter whose full Python model connects 1,517 varia - **Live application:** - **Public source:** - **Pre-WebMCP baseline:** [`3d7339a87e13c4f809ed223c2aa299fb3f631799`](https://github.com/Cuuper22/gpu_stack-/commit/3d7339a87e13c4f809ed223c2aa299fb3f631799) -- **Baseline tag:** `pre-webmcp-baseline` +- **Baseline ref:** [`pre-webmcp-baseline`](https://github.com/Cuuper22/gpu_stack-/tree/pre-webmcp-baseline) (public branch; also an annotated tag in the development checkout) ## Challenge-window disclosure -GPUSTACK is an existing project. The baseline commit above, merged August 13, 2026, is the exact state immediately before the WebMCP Challenge extension. It is preserved in Git history and tagged so reviewers can separate the new work from the underlying project. +GPUSTACK is an existing project. The baseline commit above, merged August 13, 2026, is the exact state immediately before the WebMCP Challenge extension. It is preserved as a public immutable comparison ref so reviewers can separate the new work from the underlying project. ### Existing before the challenge extension