Skip to main content

Business name/address retrieval: decision and next steps

The October 8, 2026 investigation supported further local lexical development over existing Overture data. It did not qualify production adoption. The disposable PostgreSQL probe retrieved Moch without another ingestion source; combining it with the saved geocoder results raised verified Hit@3 from 4/9 to 8/9. Mall association, three weak address-query Enter decisions, unknown deployed generations, and unmeasured regional/cold costs remained unresolved.

These are dated findings. The probe changed no application provider/schema, production data/cache/configuration, ingestion, or deployment. Run the replay below to inspect current ranking over those fixed inputs; recapture sources and inspect current code before proposing production work.

Reproduce the fixed-input checks​

Run from the repository root:

pnpm exec vitest run scripts/discovery-eval/business-name-address/evidence.test.ts
pnpm exec tsc -p scripts/discovery-eval/business-name-address/tsconfig.json
pnpm -C packages/cli exec tsx ../../scripts/discovery-eval/business-name-address/replay.ts \
--out /tmp/business-retrieval-replay.json

The tests check adapter and term-extractor contracts. The replay uses the current checkout's ranking/Enter policy with the October 7 projections. It makes no live provider request and implements no lexical search provider.

Reusable inputs and external evidence​

The regression corpus keeps 13 versioned queries, 52 distinct raw/adapter candidate projections, reviewed source identities, real-adapter checks and a current-checkout replay. Its README provides commands, recapture conditions and rights. Inputs were captured on 2026-10-07; these are not today's live provider results.

Dated dropdowns/status snapshots, timings, repeated per-query lists, historical rank/Enter outputs and the original report are in the October 7 capture archive. The throwaway code, 3,255-row source projection, SQL plans/costs, October 8 main replay/composition and reproduction instructions are in the October 8 lexical probe archive. Both commit permalinks have checksum manifests and attribution. Full raw operator files/screenshots/test logs were temporary; no public durable archive is claimed for them. Prior Git history is preserved.

Input/conditionPin or limitation
Initial source/replayMain 3c80939d26a09f131b16d849895255436b5e5798
October 8 main replay/compositionFreshly fetched fe6b7969979ae024655e38d3b4f605295e757f93, clean source export; #432 included; #429/#438 evaluated separately below
Captured query contextEN, Berlin [13.416,52.5194], zoom 15; upstream rounded [13.42,52.52], MapTiler limit 6/autocomplete/types including POI, aggregate limit 8
Public deployment/provider/cacheUnknown deployment SHA, provider generation/chain, OSM extract, active Overture generation and cache history; authenticated status 401. Enabled registry does not prove health/data/capability bindings
OSMAPI bbox/direct versioned elements, not deployed data or a regional PBF; Overpass failed before API fallback
OvertureDated release 2026-09-23.1, bbox [13.408,52.513,13.426,52.527], 3,255 rows; export SHA256 a9ec6402ecd390d6200151ace4d5a5a7106d1ca8641652e19dd336211684ba93; STAC 403, explicit release readable
Live UISeparate dated anonymous capture, 1280×800/DPR1/dark/fixed Berlin camera; 13 lists/two Enter observations. No prototype UI or application-only comparison

Identity and source presence​

Official Moch verifies Grunerstr. 20, 10179 Berlin, phone +493024045625; rechecked 2026-10-08. Its point is a listing location, not a surveyed entrance. Shared mall address/proximity/brand cannot establish exact tenant identity.

EntityEvidence and judgment
Moch/OverturePresent, verified listing: GERS 035b544e-40f5-4ce0-a06f-1c9032ded028 v13, matching name/address/phone; Meta 194804870560113 updated2026-08-24. Operating status null=unknown
OSM EDEKA roomPresent, operator unresolved: way 1204762785 v3, supermarket/indoor/level −1/name EDEKA; no operator/contact/street/number. Exact Moch attributes absent in inspected mall records, not globally absent OSM
Alexanderstraße 25 resultMapTiler poi.39267497 references that same way, which does not assert this address; Nominatim gives Alexanderstraße without house number. Address inference/identity ambiguity, neither a verified other branch nor confirmed Moch
MediaMarktOSM node 322490364 v24 at Grunerstraße 20, branch-specific website. GERS bfbe5e1d-7db5-482e-8772-f53959dde008 v9 and 81270f18-8f0b-48a9-ae69-31d4ef96cdd5 v8 describe the mall branch: duplicate judgment must retain IDs/credits. Espressobar 337b556d-d0d0-4c38-a81b-c92bc326eba1 is a separately named tenant
Schaaf alternativeDated official profile 407497, Schillingstr. 2/phone +493023458611, OSM node 9154787137 v13 and GERS a56cd442-edcf-4d26-98c1-9c70de50f1d7 v11 agree. Raw MapTiler references the node but formats Singerstraße 121. Official profile recheck 404 on October 8 leaves current operation unknown, not proven closed
REWEDated official profile 1350030/OSM node 348000444 v29 verify Invalidenstraße 158. Overture unknown, outside inspected bbox
Deployed copiesUnknown for every source-presence judgment; no production DB access

Provenance/licenses remain separate from code licensing: MapTiler terms, OSM ODbL, Overture/Meta CDLA-Permissive 2.0, Foursquare Apache 2.0 and contributor CC0 where recorded. No ATP coverage claim/new-source requirement. If an intended generation lacks Moch, inspect release/import filters before proposing enrichment.

Separate retrieval, adaptation, ranking and selection​

Raw MapTiler and independently captured adapted rows have the same 78 candidates and ID order across 13 queries: the adapter does not cause Moch's omission. All aggregate replies were empty/partial: unavailable retrieval, not source absence. Initial combined 78→ranked 65 losses happen after retrieval. The OSM index covers aliases/codes/acronyms, skipping ordinary business names; Overture exposes category search rather than named-business candidates; Overpass matches whole query against name without address decomposition. Code: integrations/geocoding-maptiler/provider.ts, services/data-manager/src/jobs/search-index/{terms,extract}.ts, integrations/poi-overture/index.ts, packages/core/src/utils/overpass.service.ts, integrations/search-suggestions/orchestrator.ts, shared suggestionRanking.ts.

Offline layer/runVerified Hit@3Interpretation
Saved raw/adapted/combined4/9Five Moch variants have no confirmed exact tenant; three have unresolved possible matches
Same pool, initial/October 8 main ranker4/9→4/9#432 puts Berlin MediaMarkt above Rijswijk; Enter becomes weak/search instead of opening Rijswijk. EDEKA Alexa also becomes weak/search. Total 65 rows unchanged
Local lexical candidates7/8 inspected-source positivesFour Moch variants, two MediaMarkt variants and Schaaf; REWE outside bbox excluded from this denominator, not called absent
Lexical+saved adapter/October 8 main ranked8/9Combined 90→ranked 75; EDEKA Alexa stays missing. Both lexical negatives return 0; geocoder address/area fallback remains

Moch ranks first for four retrieved variants. Enter opens it for EDEKA Moch, but remains weak/search for EDEKA Moch Grunerstraße 20, EDEKA Grunerstraße 20 Berlin and EDEKA Grunerstraße: selection-policy gaps despite retrieval success. Explicit Alexanderstraße still opens the unresolved provider row and stays unjudged. Offline outputs are not observed new live navigation.

Separately pinned #429/#438 comparison​

PR #438 head dadd03d5339ad65b64de7a8240054d3befacd10c was evaluated against its verified ancestor 5f07b70967319b4b2c86769b542b551b93f98e02, using clean task-owned source exports and identical input pools. Fresh main 9b212363ba891e97ac4a19c080a10bbc0e343cbd produces the same traces as that base. The comparison treats #438 as an unmerged candidate at those revisions. It does not describe the PR's current status.

Geocoder candidates stay78 but ranked rows rise65→78; lexical+geocoder candidates stay90 but ranked rows rise75→90. All candidates survive shared ranking in these small pools. Verified Hit@3 stays4/9 and8/9 respectively; every Enter action is unchanged. This is deduplication preservation, not new upstream/local retrieval. The two MediaMarkt GERS rows and MapTiler branch now remain separate until corroborated cross-source identity. Duplicate handling remains an integration gate; the missing Alexa association and three weak Moch address selections remain. The archive contains separate base/head/October 8 main traces and recomputed counts.

Local probe and bounded integration rules​

Throwaway SQL normalizes case/diacritics/German street spellings; decomposes name and same-address street requirements, a separate house-number field and separate locality tokens; permits only ≥3-character final name prefixes; excludes permanent closure while retaining unknown status. Wrong operator/house/city cannot fall through to that business. Whole/leading business names precede tenants merely mentioning them. An initial Espressobar-first result was reproduced by a failing DB check and corrected. GERS candidates remain distinct before ranking: no invented mall alias or cross-source link. A review reproduced postcode-as-house substitution; separate address roles now reject it and region-as-city substitution. Trailing single house numbers/suffixes are supported; ranges and general address parsing, brand+city without street, multilingual matching and mall associations remain incomplete.

Measured local costResult/conditions
DatabasePostgreSQL 18.6/PostGIS 3.6.4/aarch64; image ghcr.io/baosystems/postgis@sha256:f5d625d4263fd9e9a90033951619c2707734a04abbce41ade91522f3428e42d9; network disabled, own tmpfs 256 MiB, 2 CPU/512 MiB
Import/index build1.60s/0.16s including Docker/psql overhead; 3,255 places+3,255 addresses
Table/index bytes2,392,064/1,056,768 across both tables
MemoryWhole-container cgroup peak 300,068,864 bytes over probe session, not process peak RSS
Warm SQL p950.205 to 3.396ms per-query range; 20 EXPLAIN ANALYZE/BUFFERS repeats/query, nearest-rank p95; warmed by import/earlier calls
Warm command p9567.8 to 94.0ms including Docker exec/psql startup; not application/provider latency
Plans/cold/scaleSelective bitmap indexes; broad EDEKA includes sequential scans. LIMIT caps candidates, not scanned rows. OS-cold/regional/production costs unknown; shared host load uncontrolled

Follow-up: an isolated regional lexical index over existing imports, retaining the specialized alias index; acquire≤30/output≤8 (combined API 8/hard 20/UI 10), one SQL operation/300ms DB deadline within existing 1,200 ms provider deadline, no remote candidate enrichment. Proposed provider p95 cold≤500ms/warm≤150ms and interaction cold≤5000ms/warm≤2000ms remain unproven. Cache by release/index epoch/query/ language/region/proximity; test both orders/cold/warm. Unready/timeout reports partial/unavailable with geocoder fallback; do not cache failures as authoritative misses.

Use existing SearchSuggestion: id=overture:<GERS>, ids.overture, actual source name/address/coordinates, provider, matched name, neutral importance. Keep structured provenance/release/address in audit rows, credits in attributions; selection requires poi-overture resolver/PostGIS ready on the same generation. Brand IDs/proximity/shared addresses/switchboards cannot alone merge branches. Conflicts stay separate; verified links retain IDs/credits. Missing selection must not silently substitute another branch.

Validation, admin inspection and remaining work​

Compact corpus: 14 real-adapter/term-extractor checks. Probe: 10 normalization/SQL checks plus 15 transactional DB checks for identities, negatives, abbreviations, boundaries, branches/tenants, permanent/unknown closure, remote address, same-address consistency, postcode/region role confusion, caps, injection and timeout. Focused/types/lint/docs/CI recorded in PR.

Existing admin workflows expose Overture release/region/counts and search-index epoch/publication/staleness. Fingerprint is available in authenticated status, not the card summary. Ready alias-index/healthy Overture does not establish business lexical coverage. Documentation corrected; no admin behavior/shared caches changed.

At the time of the investigation, follow-up work was to compare #438/#429, address verified name+address Enter intent while retaining unknown-identity guards, resolve or retain the EDEKA Alexa gap, inspect the intended generation/resolver, and measure regional/cold/warm resource costs. Promotion requires 9/9 verified positives in top 3, zero wrong-branch/false exact negatives, branch preservation and controlled fallback/latency. This evaluation does not qualify a production feature, embeddings, an ATP pipeline, or a global rollout.