#172: flip substrate search to default; ?fts=off escape hatch#335
Conversation
Ship decision 2026-07-17 (RY): most recent progress ships unless obviously broken, with a flag back to the prior path. Rationale: - Substrate wins every benchmark row vs interim (isamplesorg#171 post-fix table, e.g. no-hit 62.7s -> 5.5s cold; pottery 22.3s -> 11.6s). - All isamplesorg#172 hard-fail invariants pass (stopword equivalence, duplicate-term identity, concept-only non-empty, no-hit zero, tokenizer parity). - Hand review of benchmark top-10s (2026-07-17 AM) found no glaring ranking regressions; SME A/B comparison sheet goes out today as the post-ship ranking-quality input (calibrates isamplesorg#172 thresholds; BM25/field weights tunable post-ship without index format changes). Mechanics: - substrateEnabled(): default true; only `?fts=off` reverts to the interim ILIKE scan (kept intact as rollback + A/B baseline). `?fts=v1` still accepted, so pre-flip opt-in links behave identically. - Spec: 'no param -> interim' becomes 'fts=off -> interim' (escape hatch), plus a new 'no param -> substrate' test asserting the flip (basalt 785). The isamplesorg#172 gate does NOT close: Section 7 end-to-end budgets remain open as the pin-overlay / downstream-latency track (both backends miss them today; the dominant cost is shared post-search refiltering, not the backend). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Nohddj7oXLnkJ4P9Cibg8Y
…dening - P1: PID-looking queries (ARK/IGSN/DOI/resolver/pid:) route to the interim builder even under default substrate — the substrate index has no PID field (SEARCH_INDEX_V1 s2), so tokenizing a pasted identifier returned junk. Interim's exact-PID arm (isamplesorg#278/isamplesorg#26) handles it. New no-flag Playwright regression using a PID from the interim benchmark's own top-10. - P2: ?fts=off now dominant over duplicate params (getAll, not first-wins). - P2: a REJECTED substrate module import resets the cache so the next search retries instead of failing forever on one transient hiccup. - P2: routing tests moved to their own describe (no double cold-boot via the ?fts=v1 beforeEach); stale opt-in comments updated; "exactly as interim" overstatement corrected. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Nohddj7oXLnkJ4P9Cibg8Y
- explorer-e2e dispatch job cap 20 -> 35 min: fts-v1 spec worst-case is 20m30s of test budget alone (5x120s substrate, 150s default, 2x240s interim-path routing) before install/render; a slow dispatch run was killable mid-suite with no diagnostics. - Contract comment: display-column backfill joins samples_map_lite, not the wide parquet. - Interim builder comment: isamplesorg#171 landed and is default; this path now serves ?fts=off rollback + PID-looking queries, not "goes away". Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Nohddj7oXLnkJ4P9Cibg8Y
…ents - fts-v1 spec caps itself to 1 CI retry (file-level configure): 2 attempts x 20m30s = 41m envelope; workflow dispatch cap 35 -> 55 min so retries and artifact upload survive a data outage. - A1 strategy header and warm-buffer comments now state the substrate default vs interim (?fts=off / PID) split instead of universal ILIKE. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Nohddj7oXLnkJ4P9Cibg8Y
Codex review: LGTM (round 4; 0 P0 / 0 P1 / 0 P2)Round 1 (NOT-LGTM) caught a real ship-blocker: PID-aware search (pasted ARK/IGSN/DOI) would have regressed under the default flip — the substrate index carries no PID field. Fixed by routing PID-looking queries to the interim builder's exact-PID arm, with a no-flag Playwright regression. Rounds 2–3 hardened the edges: Round 4 verification: 110 unit tests + 40 frontend-derived tests pass, Playwright discovers all 8 cases, clean diff. (Live remote E2E not executed in the review sandbox; will verify on production post-merge.) |
EXPLORER_QUERIES.md still described the ILIKE facets scan as THE search path; since 2026-07-17 that is only the ?fts=off / identifier fallback. Adds the sharded-index default path in plain English (Eric's #268 ask), the search-index row in the file table, and relabels the try-it-yourself ILIKE example as the fallback equivalent. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Nohddj7oXLnkJ4P9Cibg8Y
What changes
substrateEnabled()now returns true unless?fts=off.?fts=offis the escape hatch back to the interim ILIKE scan (kept fully intact as rollback + A/B baseline).?fts=v1still accepted — every pre-flip opt-in link behaves identically.?fts=off→ interim"; new test asserts "no param → substrate" (basalt = 785, 202608 ground truth).Why ship now (honestly)
What this does NOT do
🤖 Generated with Claude Code
https://claude.ai/code/session_01Nohddj7oXLnkJ4P9Cibg8Y