Skip to content

v0.2.4

Choose a tag to compare

@github-actions github-actions released this 21 Apr 13:38

Added

  • Phrase-proximity scoring (requires updated WASM from scolta-core 0.2.4): scoreResults() now passes data.locations (Pagefind word positions) to the WASM scorer. Adjacent phrase matches (terms appearing consecutive in the document) receive a ×2.5 content-boost multiplier; near-phrase (within 5 words) receives ×1.5. Fixes exact-phrase results ranking below title-only hits.
  • Quoted-phrase forced mode: Queries wrapped in double-quotes (e.g. "hello world") activate forced_phrase in the Rust scorer and suppress OR fallback — the user explicitly asked for phrase results, not individual-term broadening.
  • WASM config key fix: scoreResults() now converts SCREAMING_SNAKE_CASE config keys to snake_case before sending to WASM. Previously all scoring config from the admin UI was silently ignored by the scorer (it always used Rust defaults). Admin-configured values for title_match_boost, content_match_boost, recency strategy, etc. now apply correctly.
  • ScoltaConfig phrase fields: phraseAdjacentMultiplier (2.5), phraseNearMultiplier (1.5), phraseNearWindow (5), phraseWindow (15) with corresponding PHRASE_* keys in toJsScoringConfig().

Fixed

  • Stale WASM (second rebuild): the 0.2.4 WASM artifact was rebuilt a second time on 2026-04-21 after scolta-core commit ae71e9f added phrase-proximity scoring. The earlier 0.2.4-dev WASM (from 2026-04-19) predated that commit, so the SearchResult.locations field was absent and JS-passed location arrays were silently dropped into SearchResult.extra. Anyone running a checkout between 2026-04-19 and the rebuild would have seen no phrase-proximity ranking despite the JS layer sending locations. Binary size after rebuild: 1,194,999 bytes (up from 1,186,125 bytes pre-phrase).
  • Stale WASM binary: assets/wasm/scolta_core_bg.wasm was built from scolta-core 0.2.2-dev and had never been updated since. The scolta-core 0.2.3 release added batch_extract_context, sanitize_query, match_priority_pages, and the N-set merge_results format; all of those WASM calls were silently falling back to their JS implementations in every 0.2.3 install. Rebuilt from scolta-core 0.2.4-dev (binary size: 1.1 MB, up from 256 KB; increase reflects the new algorithms).
  • merge_results TypeScript declaration: scolta_core.d.ts now documents the N-set input shape ({ sets, deduplicate_by, normalize_urls }) that the implementation has used since 0.2.3. The old { original, expanded, config } shape comment was stale.
  • mergeResults behavioral tests: Added five behavioral Jest tests in behavioral.test.js that actually invoke mergeResults at runtime (JS fallback path) and assert deduplication and score-wins semantics. The previous test was a string-match only.
  • HealthChecker index_exists: Now checks {outputDir}/pagefind/pagefind.js first (the location both PhpIndexer and the Pagefind binary pipeline write to since 0.2.3), falling back to the legacy flat {outputDir}/pagefind.js. Previously index_exists always returned false for fresh PHP-indexer builds and true only for sites retaining a stale pre-0.2.3 flat file.