Skip to content

feat(eval): add reproducible discovery evaluation reports - #424

Merged
Medformatik merged 4 commits into
mainfrom
feat/discovery-evaluation-protocol
Oct 7, 2026
Merged

Medformatik merged 4 commits into
mainfrom
feat/discovery-evaluation-protocol

Conversation

@Medformatik

@Medformatik Medformatik commented Oct 7, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

  • Coordinate existing search, cache/conflation, Overture gates, place-card/sheet contracts and navigation replays in pnpm discovery-eval, with versioned JSON/Markdown reports and application/input/style fingerprints.
  • Add nine dated, independently reviewed pilot cases for exact branches, real mall tenants, closed/missing businesses and urban/rural browsing. Score entity rank/recall, duplicates, wrong branches, readable labels/crowding and request/latency budgets; retain unknown and absent evidence separately.
  • Add strict operator manifests with source/deployment/extract unknowns, configuration, stages, query order and cache isolation. Compare all five evidence layers, reject tampered/incomplete baselines and lost measurements, and supply a reproducible synthetic before/after negative control. Document rights, redaction and external artifact storage.

Related issues

Fixes #409

Supports #397 and later discovery/navigation work. Station repair remains #389 / #392. Installed navigation/offline evidence remains explicitly unavailable until #398 / #403 / #404 provide those capabilities.

How was this tested?

  • 53 evaluator/capture/inventory/CLI regression tests, including RED/GREEN evidence for malformed enums, dropped measured values, stage changes, missing tenants/businesses, wrong branches and closed listings. Selected-place partial-state contracts now run alongside existing card contracts.
  • Worked control: 100 automated cases passed; three device/offline cases unavailable. The deliberate normalized branch change exits 1 and reports only the normalization regression, with unchanged data/provider/presentation and navigation replay outcomes. Fixtures remain synthetic; CI makes no paid-provider requests.
  • Read-only public-instance pilot: four adapted autocomplete captures plus four visually inspected zoom-15 phone maps, clearly separated from raw upstream, client ranking and installed runtime. The pilot correctly flags coverage/ordering and readability misses; it is not a controlled production before/after experiment. Unknown deployment/geocoder generations and uncontrolled API cache are retained.
  • pnpm lint, full pnpm check-types, pnpm check:policy, full pnpm test (1,614 files / 17,720 tests passed; 138 opt-in tests skipped), and pnpm -C docs build verified locally. Final independent review found no remaining Critical/Important issues after three integrity findings were reproduced and fixed.

Legacy search fixtures retain unknown provenance. This is a bounded evaluation pilot, not population-wide coverage or native/offline readiness. No visual product behavior changed; no screenshots or capture archives added to Git. Sample full generated comparison is provided in a PR comment and repeatable commands/schema fixtures are in the developer guide.

Checklist

  • Conventional Commits title
  • pnpm lint && pnpm check-types && pnpm test pass locally
  • No publishable package changed; changeset not applicable
  • Documentation updated
  • Code remains in the repository's AGPL license tier; source-specific evidence attribution documented
  • No secrets, real API keys, or .env files committed
  • Contributor License Agreement already recorded

@Medformatik Medformatik added documentation Improvements or additions to documentation enhancement New feature or request javascript Pull requests that update javascript code labels Oct 7, 2026
@Medformatik Medformatik self-assigned this Oct 7, 2026
Comment thread scripts/record-search-eval.mts
@Medformatik

Copy link
Copy Markdown
Collaborator Author

Completed the remaining #409 evaluation work in af1aff3. The two generated reports below are a synthetic harness control, not a product improvement. Both ran on the clean committed tree: the before command exits 0; the after command intentionally exits 1 when only the normalized REWE branch is changed. Data/provider projections, presentation judgment and navigation replay results stay unchanged.

The real read-only pilot is separate: adapted API captures and inspected browser labels, uncontrolled API cache, unknown deployment/geocoder revisions, no raw-upstream or installed-device claim. Its misses demonstrate useful evaluation outcomes rather than needing search/product fixes in this PR.

Live pilot Result
Exact REWE branch Rank 1; expected location
MediaMarkt ALEXA Expected branch rank 2; wrong branch first
EDEKA ALEXA Business missing; address results do not substitute
Permanently closed SEA LIFE No unqualified matching attraction hit
Berlin z15 6 fully readable POI/park labels; expected cathedral label clipped
Aachen z15 3 fully readable labels; expected cathedral readable
Neuss z15 4 fully readable labels; expected minster label absent
Monschau z15 5 fully readable labels; expected castle readable

All four viewports: 430×932, DPR 1, English, dark, zoom 15, zero pitch/bearing; zero observed POI/park label overlaps. Rendered feature counts were not treated as readable-label counts. Operator capture files/screenshots stay outside Git. Public identity judgments and source-specific rights/redaction limits are documented in the developer guide.

Before: generated report

Markdown SHA-256: 47c49cb2df78eb868dd1c584c5b09053bf11bb7f2e10a2eea8148d8eaa823860

Discovery evaluation report

Protocol: 2; catalog: cdeba7569bffeb983bf5a1580d80d456d24e67069ef853134bc7119a0330ae18
Application: af1aff3; working tree dirty: false
Run succeeded: true; case counts: {"passed":100,"unavailable":3}

Automated cases are offline recorded/synthetic/contract evidence. Optional reviewed observations retain their own live/recorded/synthetic provenance; absent layers and installed-device cases are unavailable. Assertion counts can overlap between cases; they are not independent observations or production performance metrics.
Search capture provenance: 88 legacy fixtures with unknown provenance; 0 explicitly adapted API captures. Legacy fixture deployment/source generations are unknown; optional operator context follows.

Case Evidence layer Status Passed / failed / unavailable assertions Reason
search/berlin-coffee client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-cafe client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-alexanderplatz client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-alexanderpl-prefix client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-ikea client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-pizza client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-rewe client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-kudamm-21 client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-museumsinsel client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-brandenburger-tor client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-hauptbahnhof client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-fernsehturm client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-tegel client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-tempelhof client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-charite client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-kaufland client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-starbucks client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-mcdonalds client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-apotheke client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-supermarkt client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-paris client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-hamburg client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-munchen client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-heathrow client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-lax client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-ber client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-hbf client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/munich-marienplatz client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/munich-hauptbahnhof client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/munich-englischer-garten client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/munich-coffee client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/paris-louvre client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/paris-gare-de-lyon client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/paris-boulangerie client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/nyc-central-park client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/nyc-times-square client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/nyc-coffee client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/nyc-jfk client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/london-big-ben client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/london-kings-cross client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/london-pret client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/aachen-hbf client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/aachen-dom client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/oslo-s client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/germany-berlin client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/germany-frankfurt client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/germany-coffee client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/munich-alexanderplatz client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-tankstelle client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-typo-alexanderplatz client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-vegan client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/aachen-vegan client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-doner client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-spatkauf client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-vegetarisch client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-wifi client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-rewe-enter client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-springfield client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-bar client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-bio client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-restaurant client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-bank client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-museum client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-lax-lower client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-koln client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-koln-in-english client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-rom-in-english client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-rome client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-munchen-in-english client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/aachen-hbf-alone client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-paris-enter client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-eiffel-tower client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-louvre client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-colosseum client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-sagrada-familia client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-big-ben client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-neuschwanstein client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-neuschwanstein-typo client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-eiffel-tower-typo client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-sagrada-familia-typo client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-colosseum-typo client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-colosseo-in-english client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-brandenburger-tor-enter client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-sanssouci client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-mauerpark client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-typo-potsdamer-platz client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-friedrichstrasse-100 client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-postcode-city client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/aggregate-ranking-budget client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/station-synonyms-cache-order adapted-api/mocked-upstream passed 14 / 0 / 0
search/location-cache-isolation adapted-api/mocked-upstream passed 4 / 0 / 0
identity/co-located-tenants conflation/synthetic passed 41 / 0 / 0
place/partial-enrichment-loading ui/contract-fixtures passed 50 / 0 / 0
place/selected-sheet-partial-states ui/contract-fixtures passed 23 / 0 / 0
coverage/overture-reviewed-gate-contract dataset-gate/unit-fixtures passed 7 / 0 / 0
coverage/overture-metric-contract dataset-gate/unit-fixtures passed 11 / 0 / 0
coverage/overture-search-quality-contract dataset-gate/unit-fixtures passed 2 / 0 / 0
navigation/transit-recovery-gps-gaps navigation-engine/synthetic-replay passed 25 / 0 / 0
navigation/ground-off-route-arrival navigation-engine/synthetic passed 25 / 0 / 0
navigation/alternative-route navigation-engine/synthetic passed 14 / 0 / 0
unavailable/installed-navigation installed-device unavailable 0 / 0 / 0 Installed navigation composition and device evidence pending #398; shared-engine replays are separate.
unavailable/offline-place-search installed-device/offline unavailable 0 / 0 / 0 Offline place/address search pending #403; downloaded map tiles are not offline search.
unavailable/offline-rerouting installed-device/offline unavailable 0 / 0 / 0 Android offline routing/rerouting prototype pending #404; no airplane-mode engine measurement in this corpus.

Independently reviewed observations

Definitions and frozen pilot budgets: ee56f34187b97bd5f7f34dafcb8693ae1d4a6bfa754a027400dcdfa0a51f8a40; 41 case/layer observations unavailable.
Raw upstream belongs to provider; adapted API/client ranking belongs to normalization; final readable UI belongs to presentation. A missing layer is not an inferred success.

{
  "region": "Germany: Berlin pilot",
  "extractDate": {
    "value": null,
    "reason": "Synthetic records, no extract used"
  },
  "style": {
    "value": null,
    "reason": "Synthetic display judgment, no rendered style used"
  },
  "deployment": {
    "value": null,
    "reason": "No deployment used in this synthetic example"
  },
  "sources": {
    "osm": {
      "value": null,
      "reason": "Coordinates from reviewed case, no imported OSM generation"
    },
    "overture": {
      "value": null,
      "reason": "Not used"
    }
  },
  "provider": {
    "id": "synthetic-control",
    "capabilities": [
      "projected search rows"
    ]
  },
  "configuration": {
    "language": "en",
    "theme": "dark",
    "viewport": [
      430,
      932
    ],
    "dpr": 1
  },
  "queryOrder": [
    "business/rewe-invalidenstrasse"
  ],
  "cacheIsolation": "isolated"
}
Case Layer / stage Provenance / cache Status Measured metrics
business/rewe-invalidenstrasse data / source synthetic / cold passed {"recall":1,"firstRank":1,"duplicates":0,"wrongBranch":0,"forbiddenHits":0,"requests":1,"latencyMs":10,"usefulLabels":null,"overlaps":null}
business/rewe-invalidenstrasse provider / raw-upstream synthetic / cold passed {"recall":1,"firstRank":1,"duplicates":0,"wrongBranch":0,"forbiddenHits":0,"requests":1,"latencyMs":10,"usefulLabels":null,"overlaps":null}
business/rewe-invalidenstrasse normalization / adapted-api synthetic / cold passed {"recall":1,"firstRank":1,"duplicates":0,"wrongBranch":0,"forbiddenHits":0,"requests":1,"latencyMs":10,"usefulLabels":null,"overlaps":null}
browsing/berlin-z15 presentation / final-ui synthetic / uncontrolled passed {"recall":1,"firstRank":null,"duplicates":0,"wrongBranch":0,"forbiddenHits":0,"requests":null,"latencyMs":null,"usefulLabels":6,"overlaps":0}

Absent layers (listed individually in report.json):

  • business/rewe-invalidenstrasse: presentation
  • business/rewe-invalidenstrasse: runtime
  • business/mediamarkt-alexa: data
  • business/mediamarkt-alexa: provider
  • business/mediamarkt-alexa: normalization
  • business/mediamarkt-alexa: presentation
  • business/mediamarkt-alexa: runtime
  • business/edeka-alexa: data
  • business/edeka-alexa: provider
  • business/edeka-alexa: normalization
  • business/edeka-alexa: presentation
  • business/edeka-alexa: runtime
  • business/alexa-tenants: data
  • business/alexa-tenants: provider
  • business/alexa-tenants: normalization
  • business/alexa-tenants: presentation
  • business/alexa-tenants: runtime
  • business/sealife-closed: data
  • business/sealife-closed: provider
  • business/sealife-closed: normalization
  • business/sealife-closed: presentation
  • business/sealife-closed: runtime
  • browsing/berlin-z15: data
  • browsing/berlin-z15: provider
  • browsing/berlin-z15: normalization
  • browsing/berlin-z15: runtime
  • browsing/aachen-z15: data
  • browsing/aachen-z15: provider
  • browsing/aachen-z15: normalization
  • browsing/aachen-z15: presentation
  • browsing/aachen-z15: runtime
  • browsing/neuss-z15: data
  • browsing/neuss-z15: provider
  • browsing/neuss-z15: normalization
  • browsing/neuss-z15: presentation
  • browsing/neuss-z15: runtime
  • browsing/monschau-z15: data
  • browsing/monschau-z15: provider
  • browsing/monschau-z15: normalization
  • browsing/monschau-z15: presentation
  • browsing/monschau-z15: runtime
After: generated comparison report (intentional failure)

Markdown SHA-256: 11fbe2438841e3a87f5d8dcc0baf3abd719898ad34c47bd3a9151bc20855c42b

Discovery evaluation report

Protocol: 2; catalog: cdeba7569bffeb983bf5a1580d80d456d24e67069ef853134bc7119a0330ae18
Application: af1aff3; working tree dirty: false
Run succeeded: false; case counts: {"passed":100,"unavailable":3}

Automated cases are offline recorded/synthetic/contract evidence. Optional reviewed observations retain their own live/recorded/synthetic provenance; absent layers and installed-device cases are unavailable. Assertion counts can overlap between cases; they are not independent observations or production performance metrics.
Search capture provenance: 88 legacy fixtures with unknown provenance; 0 explicitly adapted API captures. Legacy fixture deployment/source generations are unknown; optional operator context follows.

Comparison

{
  "reviewed": {
    "contextChanged": false,
    "captureConditionsChanged": false,
    "changedProviderInputs": [],
    "regressions": [
      "business/rewe-invalidenstrasse/normalization"
    ],
    "changes": [
      {
        "caseId": "business/rewe-invalidenstrasse",
        "layer": "normalization",
        "metric": "recall",
        "before": 1,
        "after": 0
      },
      {
        "caseId": "business/rewe-invalidenstrasse",
        "layer": "normalization",
        "metric": "firstRank",
        "before": 1,
        "after": null
      },
      {
        "caseId": "business/rewe-invalidenstrasse",
        "layer": "normalization",
        "metric": "wrongBranch",
        "before": 0,
        "after": 1
      }
    ]
  },
  "regressions": [],
  "improvements": [],
  "changedInputs": [],
  "appOnlyComparison": false,
  "runRegression": true
}

Changed inputs and dirty trees prevent an application-only comparison; comparisons do not establish causality.

Case Evidence layer Status Passed / failed / unavailable assertions Reason
search/berlin-coffee client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-cafe client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-alexanderplatz client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-alexanderpl-prefix client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-ikea client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-pizza client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-rewe client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-kudamm-21 client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-museumsinsel client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-brandenburger-tor client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-hauptbahnhof client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-fernsehturm client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-tegel client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-tempelhof client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-charite client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-kaufland client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-starbucks client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-mcdonalds client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-apotheke client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-supermarkt client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-paris client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-hamburg client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-munchen client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-heathrow client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-lax client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-ber client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-hbf client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/munich-marienplatz client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/munich-hauptbahnhof client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/munich-englischer-garten client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/munich-coffee client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/paris-louvre client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/paris-gare-de-lyon client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/paris-boulangerie client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/nyc-central-park client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/nyc-times-square client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/nyc-coffee client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/nyc-jfk client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/london-big-ben client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/london-kings-cross client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/london-pret client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/aachen-hbf client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/aachen-dom client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/oslo-s client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/germany-berlin client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/germany-frankfurt client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/germany-coffee client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/munich-alexanderplatz client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-tankstelle client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-typo-alexanderplatz client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-vegan client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/aachen-vegan client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-doner client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-spatkauf client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-vegetarisch client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-wifi client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-rewe-enter client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-springfield client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-bar client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-bio client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-restaurant client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-bank client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-museum client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-lax-lower client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-koln client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-koln-in-english client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-rom-in-english client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-rome client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-munchen-in-english client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/aachen-hbf-alone client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-paris-enter client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-eiffel-tower client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-louvre client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-colosseum client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-sagrada-familia client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-big-ben client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-neuschwanstein client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-neuschwanstein-typo client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-eiffel-tower-typo client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-sagrada-familia-typo client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-colosseum-typo client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-colosseo-in-english client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-brandenburger-tor-enter client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-sanssouci client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-mauerpark client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-typo-potsdamer-platz client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-friedrichstrasse-100 client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/berlin-postcode-city client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/aggregate-ranking-budget client-ranking/recorded-adapted-api passed 1 / 0 / 0
search/station-synonyms-cache-order adapted-api/mocked-upstream passed 14 / 0 / 0
search/location-cache-isolation adapted-api/mocked-upstream passed 4 / 0 / 0
identity/co-located-tenants conflation/synthetic passed 41 / 0 / 0
place/partial-enrichment-loading ui/contract-fixtures passed 50 / 0 / 0
place/selected-sheet-partial-states ui/contract-fixtures passed 23 / 0 / 0
coverage/overture-reviewed-gate-contract dataset-gate/unit-fixtures passed 7 / 0 / 0
coverage/overture-metric-contract dataset-gate/unit-fixtures passed 11 / 0 / 0
coverage/overture-search-quality-contract dataset-gate/unit-fixtures passed 2 / 0 / 0
navigation/transit-recovery-gps-gaps navigation-engine/synthetic-replay passed 25 / 0 / 0
navigation/ground-off-route-arrival navigation-engine/synthetic passed 25 / 0 / 0
navigation/alternative-route navigation-engine/synthetic passed 14 / 0 / 0
unavailable/installed-navigation installed-device unavailable 0 / 0 / 0 Installed navigation composition and device evidence pending #398; shared-engine replays are separate.
unavailable/offline-place-search installed-device/offline unavailable 0 / 0 / 0 Offline place/address search pending #403; downloaded map tiles are not offline search.
unavailable/offline-rerouting installed-device/offline unavailable 0 / 0 / 0 Android offline routing/rerouting prototype pending #404; no airplane-mode engine measurement in this corpus.

Independently reviewed observations

Definitions and frozen pilot budgets: ee56f34187b97bd5f7f34dafcb8693ae1d4a6bfa754a027400dcdfa0a51f8a40; 41 case/layer observations unavailable.
Raw upstream belongs to provider; adapted API/client ranking belongs to normalization; final readable UI belongs to presentation. A missing layer is not an inferred success.

{
  "region": "Germany: Berlin pilot",
  "extractDate": {
    "value": null,
    "reason": "Synthetic records, no extract used"
  },
  "style": {
    "value": null,
    "reason": "Synthetic display judgment, no rendered style used"
  },
  "deployment": {
    "value": null,
    "reason": "No deployment used in this synthetic example"
  },
  "sources": {
    "osm": {
      "value": null,
      "reason": "Coordinates from reviewed case, no imported OSM generation"
    },
    "overture": {
      "value": null,
      "reason": "Not used"
    }
  },
  "provider": {
    "id": "synthetic-control",
    "capabilities": [
      "projected search rows"
    ]
  },
  "configuration": {
    "language": "en",
    "theme": "dark",
    "viewport": [
      430,
      932
    ],
    "dpr": 1
  },
  "queryOrder": [
    "business/rewe-invalidenstrasse"
  ],
  "cacheIsolation": "isolated"
}
Case Layer / stage Provenance / cache Status Measured metrics
business/rewe-invalidenstrasse data / source synthetic / cold passed {"recall":1,"firstRank":1,"duplicates":0,"wrongBranch":0,"forbiddenHits":0,"requests":1,"latencyMs":10,"usefulLabels":null,"overlaps":null}
business/rewe-invalidenstrasse provider / raw-upstream synthetic / cold passed {"recall":1,"firstRank":1,"duplicates":0,"wrongBranch":0,"forbiddenHits":0,"requests":1,"latencyMs":10,"usefulLabels":null,"overlaps":null}
business/rewe-invalidenstrasse normalization / adapted-api synthetic / cold failed {"recall":0,"firstRank":null,"duplicates":0,"wrongBranch":1,"forbiddenHits":0,"requests":1,"latencyMs":10,"usefulLabels":null,"overlaps":null}
browsing/berlin-z15 presentation / final-ui synthetic / uncontrolled passed {"recall":1,"firstRank":null,"duplicates":0,"wrongBranch":0,"forbiddenHits":0,"requests":null,"latencyMs":null,"usefulLabels":6,"overlaps":0}

Absent layers (listed individually in report.json):

  • business/rewe-invalidenstrasse: presentation
  • business/rewe-invalidenstrasse: runtime
  • business/mediamarkt-alexa: data
  • business/mediamarkt-alexa: provider
  • business/mediamarkt-alexa: normalization
  • business/mediamarkt-alexa: presentation
  • business/mediamarkt-alexa: runtime
  • business/edeka-alexa: data
  • business/edeka-alexa: provider
  • business/edeka-alexa: normalization
  • business/edeka-alexa: presentation
  • business/edeka-alexa: runtime
  • business/alexa-tenants: data
  • business/alexa-tenants: provider
  • business/alexa-tenants: normalization
  • business/alexa-tenants: presentation
  • business/alexa-tenants: runtime
  • business/sealife-closed: data
  • business/sealife-closed: provider
  • business/sealife-closed: normalization
  • business/sealife-closed: presentation
  • business/sealife-closed: runtime
  • browsing/berlin-z15: data
  • browsing/berlin-z15: provider
  • browsing/berlin-z15: normalization
  • browsing/berlin-z15: runtime
  • browsing/aachen-z15: data
  • browsing/aachen-z15: provider
  • browsing/aachen-z15: normalization
  • browsing/aachen-z15: presentation
  • browsing/aachen-z15: runtime
  • browsing/neuss-z15: data
  • browsing/neuss-z15: provider
  • browsing/neuss-z15: normalization
  • browsing/neuss-z15: presentation
  • browsing/neuss-z15: runtime
  • browsing/monschau-z15: data
  • browsing/monschau-z15: provider
  • browsing/monschau-z15: normalization
  • browsing/monschau-z15: presentation
  • browsing/monschau-z15: runtime

@Medformatik
Medformatik merged commit 080766a into main Oct 7, 2026
25 checks passed
@Medformatik
Medformatik deleted the feat/discovery-evaluation-protocol branch October 7, 2026 19:43
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 7, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

documentation Improvements or additions to documentation enhancement New feature or request javascript Pull requests that update javascript code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Extend the baseline into a versioned discovery and navigation evaluation corpus

2 participants