- Upstream layer (embedTexts/upsertPoints/searchPoints/ensureCollection) now
RETURNS the exact URL it fetched as `surface`; app.js reports it verbatim so
measurement_surface can never drift from the real call (encoded collection
names, ?wait=true included).
- Embed-model presence matching is now symmetric on name:tag — base-name match
when either side lacks a tag, exact tag match when both carry one.
- A 200 /api/tags response that parses but has no models array is now
unobservable, never absent: only a readable models list may prove absence.
- Tests: tag matching both directions + tag mismatch + base-name mismatch,
wrong-shape/non-JSON tags responses, and surface exactness asserted against
the mocked fetch's actual URL (including URL-encoded collection names).
Co-Authored-By: Claude Fable 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_012T1XF1ZyJL7KW8AVRUJjiD