- 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
Express (ESM, no build step) service wrapping Ollama embeddings and Qdrant:
- POST /v1/embed, /v1/index, /v1/search
- GET /health reports each dependency as ok | absent | unobservable with the
exact measurement_surface URL and observed_at; overall ok only when all
deps are ok, 503 degraded otherwise
- upstream failures on /v1/* return 502 marked unobservable — never an empty
result set or indexed:0
- defaults PORT=5499, QDRANT_URL=127.0.0.1:6333, OLLAMA_URL=127.0.0.1:11436
(11436 native Ollama; 11434 is the broken Colima forward on this Mac)
- node:test unit tests with injected fetch; run with zero live dependencies
- README documents endpoints and a reference launchd plist (not installed)
Co-Authored-By: Claude Fable 5 <[email protected]>