Three verified backlog items in one wave:
- #2345: putPage's ON CONFLICT upsert never cleared deleted_at, so
re-creating a soft-deleted slug returned created_or_updated while the
page stayed invisible (silent write-swallow). Both engines now set
deleted_at = NULL on upsert; regression test in pages-soft-delete.
- #2028: the query-embed catch in hybridSearch was bare, so a slow
provider missing the ~6s deadline silently degraded hybrid search to
keyword-only (empty results for CJK content). The keyword-fallback meta
now carries degraded_reason (embed_timeout / embed_error /
no_embedding_provider), a once-per-process stderr warning names the
deadline and GBRAIN_QUERY_EMBED_TIMEOUT_MS, and the env var is
documented in docs/guides/search-modes.md. Tests drive all three
reasons through hybridSearch end to end.
- #2330 + takeover of PR #2398 (code hunks, sans release bookkeeping):
upload-raw small-file persistence + source-namespaced storage paths
(#2297), explicit skill_surface check in the focused doctor so
unassessed surfaces warn instead of scoring a vacuous 100 (#2330),
getHealth/getStats soft-delete denominator parity (#2330), PGLite
reinit hint (#2301), and the updateSourceConfig array-branch guard
(#2251) — both engines in lockstep, with the PR's 8-test suite.
Co-authored-by: garrytan <garrytan@users.noreply.github.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>