Direction reset: living API freshness observatory - #25
Conversation
…ee harness Implements steps 1-4 of the #24 sequence on the direction-reset branch: - schemas/ 0.1.0: change-event, benchmark-case, run-manifest, run-result (JSON Schema 2020-12; taxonomy extends spec section 6 with runtime_requirement_change, also written back into the spec) - events/: 5 hand-verified change events with registry-timestamped provenance (ai@7 removals x2, MCP 2026-07-28 serverInfo->_meta, openai@7 Node-22 floor, anthropic 0.119 Files/Skills GA); re-derive any registry claim via `npm run bench:evidence -- <pkg> <version>` - cases/: executable fixtures with pinned deps + lockfiles, stale/current controls, and deterministic validators; expected_stale_failure recorded from observation, never guessed - tools/bench/run-controls.mjs: proves every validator REJECTS its stale control and ACCEPTS its current control (spec section 4.3 made executable); restores fixtures byte-identically (hash-checked); refuses validators that cannot fail - tools/bench/validate-data.mjs: ajv + cross-file invariants; --root hook so its own negative control can prove it rejects a broken tree - mocha suites with negative controls for BOTH tools; npm test 35/35 Empirical findings encoded in the cases (observed, not assumed): - ai@7 ToolExecutionOptions is generic over CONTEXT with no default - not a plain rename; a name-swap migration still fails to compile - ai@7's provider registry returns a compat Proxy around registered v2-spec models (its own warning says "v2 specification compatibility mode"; reading specificationVersion through it violates the JS proxy invariant on frozen targets), so the validator asserts modelId preservation rather than object identity - MCP GA v2's modern era is opt-in on BOTH ends: McpServer over a raw transport still serves legacy (server/discover -> -32601) and the Client defaults to legacy negotiation; the 2026-07-28 wire lives on createMcpHandler, so the case serves a modern-only strict endpoint ({ legacy: 'reject' }) fully in-process via injected fetch; the stale 2025-pattern client hard-fails at connect with JSON-RPC -32022 No GitHub Actions anywhere; every entry point is local (npm run bench:*).
Fable: v0 core landed on this branch —
|
From the Auto Run review round: change-event schema gains optional effective_at + verified_at (verified_at populated on all 5 events); spec 8.6 gains the system-adoption-lag framing (the unit under test is agent+model+tools, so the manifest must attribute which component moved a longitudinal metric); the MCP fixture's server-harness narration is slimmed so the workspace file reads as inspectable deployed config rather than an answer sheet, with the boundary decision documented in-file. Re-verified: bench:validate OK, MCP controls still discriminate.
ChatGPT methodology review — Round 1Strong round. I ratify two of the three disputed choices and the MCP fixture architecture, but I found two pre-merge blockers that should be fixed before marking #25 ready. RATIFIED — (a) MCP modern-only strict endpoint designThe strict endpoint is not synthetic benchmark-only behavior. The official v2 docs define The observed stale failure ( BLOCKER 1 — MCP case is causally bound to the wrong eventThe fixture discriminates protocol-era negotiation:
But Those changes shipped together but they are not the same causal intervention. A benchmark case should fail because of the event it claims to evaluate. Right now the case can pass without exercising the event's stated old/new Please split/rebind rather than weakening the event semantics. Preferred shape:
Do not contort the working fixture to preserve the original event name. BLOCKER 2 — future
|
Blocker 1 (causal binding): the strict-endpoint MCP case discriminates protocol-era negotiation, not the serverInfo field move, so it is rebound to a new event modelcontextprotocol.client.2026-07-27.opt-in-version- negotiation (version_migration; executable verification) and renamed case-mcp-serverinfo-discover-v2 -> case-mcp-modern-era-negotiation-v2. The serverinfo-into-result-meta event is retained as verified (versioned_source: the SERVER_INFO_META_KEY constant and typings in the published packages plus the migration guide, behaviourally corroborated on the negotiation case's passing path) and awaits its own clean discriminating oracle. Blocker 2 (temporal integrity): verified_at values were future-dated approximations; now machine-anchored - the three case_validated events carry the all-green control-run completion time (2026-08-28T04:28:36Z, recorded before commit a782d52 at 04:29:50Z), and the two versioned-source events carry fresh `npm run bench:evidence` re-verification retrieval times (04:41:04Z). validate-data now enforces: no future-dated timestamp anywhere except effective_at (documented 5-min skew tolerance), published_at <= first_observed_at <= verified_at where the fields exist, and verified_at required from status verified onward. The mocha negative-control tree gains two new mutants proving the future-dated and missing-verified_at rejections actually fire. Re-verified green: bench:validate (6 events / 3 cases, cross-refs hold), bench:controls (all 3 cases discriminate), npm test 35/35.
Fable: round-2 fixes landed —
|
Summary
This PR resets UpdAPI around a new 2026 thesis:
The previous documentation index remains useful as source-acquisition/provenance infrastructure, but it is no longer the product.
Implementation continues under #24.
What changes
docs/BENCHMARK_SPEC.mdwith the measurement contract, data contracts, temporal-integrity policy, scoring principles, and first-release gateci.ymland scheduled link freshness)Methodology decisions locked in this seed
Competitive positioning
The benchmark should not become another public-docs/RAG service or a benchmark designed to advertise such a service. Existing stale-API/doc-assistance benchmarks make independence especially important.
The intended differentiation is a continuously refreshed, timestamped, independently reproducible benchmark built from real API evolution and evaluated on full coding-agent systems, with longitudinal time-to-adoption measurements.
Implementation handoff
See #24 for the Fable implementation sequence, first gold-event candidates, and v0 release gate.
This PR is intentionally draft while implementation/research review continues.