You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Fixed
Site Type presets now actually take effect (#82). The published config/scolta.php hard-coded a concrete value for every scoring/display field, and ScoltaAiService forwards the full config to ScoltaConfig::fromArray() unfiltered, so every key was always present and always overrode the selected preset. The result: the entire Site Type preset was inert — not just expansion_combine_mode, but ~13 fields (ranking weights, recency, sub-word recall, AI-summary candidate breadth, results-per-page, excerpt length). Picking content_catalog vs none produced near-identical behavior. The config's own comment "Leave a value at its default to use the preset's recommendation" was false. Now the preset-overridable fields default to null (env-driven, no fallback), and scolta-php's fromArray() treats null as "not set" so it falls through to the preset (or the base default when the preset is none); an explicit value — set via the matching SCOLTA_* env var — still overrides. Requires the scolta-php null-as-unset fix (scolta-php#181, merged). Drupal and WordPress were never affected (they omit keys to fall through). ⚠️ Behavior change on upgrade: existing Laravel sites that selected a Site Type preset will now actually receive that preset's tuning, which was previously ignored — result ranking, results-per-page, AI-summary candidate breadth, recency, and query expansion may shift. Sites on the default none preset move to expand_subword_max_frequency0.10 (previously the hard-coded 0.05), slightly broadening recall. This is the intended fix, but it is visible on upgrade; sites that want the old numbers can set the corresponding SCOLTA_* env vars to pin them.
Added
expansion_combine_mode scoring config. Expose the browser-side query-expansion candidate-selection knob added in scolta-php (tag1consulting/scolta-php#170) in the published config/scolta.php. expansion_combine_mode (SCOLTA_EXPANSION_COMBINE_MODE, default relevance_union) controls how a multi-term expansion's per-sub-query result sets are combined into the AI-summary candidate set — relevance_union keeps the historical behavior, round_robin deals the top few from each sub-query so the summarizer sees breadth across expansion terms. It is surfaced exactly like the other preset-overridable scoring values (an explicit value in the scoring section overrides the preset default — see Changed below). Requires scolta-php#179 (merged) to take effect at runtime.
Added SearchComponentRenderTest — renders the search Blade component in a booted app and asserts the emitted window.scoltapagefindPath/wasmPath/endpoint URLs (parsed out of the script block) against both the nested and flat Pagefind layouts, plus the not-built warning path. The prior BladeComponentTest only string-matched the template source and was blind to wrong emitted URL values; this is the first true render test (uses the already-present orchestra/testbench dev dependency).
Changed
expansion_combine_mode is now preset-defaulted, and the expansion_per_term_top_k (K) config key is removed. Following the scolta-php #170 evaluation, round_robin is the better summary-candidate strategy on faceted corpora and a safe no-op elsewhere, so it is now a per-Site-Type preset default in scolta-php: the content_catalog, blog, and ecommerce presets default the combine mode to round_robin; reference, none, and the base default stay relevance_union. expansion_combine_mode stays in the scoring section as the per-site override, surfaced exactly like the other preset-overridable scoring values (an explicit value wins over the preset default). The per-sub-query top-K is no longer tunable — evaluation found no benefit above 3 and over-reach below it — so scolta-php locks it at 3 internally and the scoring.expansion_per_term_top_k config key and its SCOLTA_EXPANSION_PER_TERM_TOP_K env var are removed; ConfigTest now asserts the key is absent. The preset-default behavior flows through the existing config plumbing, so no scolta-php release bump is required for it. (tag1consulting/scolta-php#180)
Stopped restating scoring/display defaults in the README; point to scolta-php's CONFIG_REFERENCE.md instead. The Default column of the README's Search Scoring and Display tables duplicated scolta-php's canonical defaults and had drifted (scoring.title_match_boost showed 1.0 vs the current 2.0; scoring.recency_boost_max showed 0.5 vs 0.25). Those columns are removed and each table now links to scolta-php docs/CONFIG_REFERENCE.md, the single source of truth for defaults (verified against ScoltaConfig in scolta-php CI). The .env keys, config/scolta.php paths, preset guidance, and worked override examples are unchanged. Docs-only — no config or default values change.
Reworked the README "Preset" section to lead with the site type and a symptom→fix prompt. Opens with "Getting fewer search results than you expect on a recipe, product, or catalog site? Set SCOLTA_PRESET=content_catalog…", frames presets as the recommended path over hand-set numbers, and links to scolta-php's docs/TUNING.md for the evidence. Docs-only — no config or default values change.
Dropped the redundant message()/conversation()/messageForOperation() overrides in ScoltaAiService; the base AiServiceAdapter now owns the budget-exception try/catch. Each override existed only to wrap the parent:: call in try/catch (\RuntimeException) → handlePossibleBudgetException(). scolta-php's base class now does that wrapping and calls a protected handlePossibleBudgetException() hook, so the adapter keeps only its hook override (visibility changed private→protected). Behavior is identical — an Amazee budget error still converts to AmazeeBudgetExceededException. Requires scolta-php ≥ 1.0.3 (the release that adds the hook). (scolta-php#173)
Opened 1.0.3-dev development cycle.
Internal
Release workflow is now notes-only; dropped the redundant vendor-bundled release zip and its validate-zip job. Composer resolves tag1/scolta-laravel from Packagist's GitHub source zipball, so the manually-built scolta-laravel-${VERSION}.zip release asset had no consumer. The tag-triggered release now publishes the CHANGELOG entry with GitHub's auto-attached source archives only. The lock-guard job (verifies tag1/scolta-php is pinned to a Packagist stable dist) is retained. Removed the StructuralIntegrityTest methods that asserted the deleted zip/validate-zip behavior and replaced them with test_release_workflow_uploads_no_build_artifact, which fails if a build artifact upload or validate-zip job is re-added.
Block-scoped ignores for the security advisories that broke CI dependency resolution on the EOL Laravel 11 matrix row. Newly-published advisories against laravel/framework 11.x made composer update refuse to install on the Laravel 11/12 CI rows. Migrated config.audit.ignore to the detailed object form with apply: "block" (resolver stops blocking; composer audit still reports), one documented + tagged entry per advisory ID. The five laravel/framework IDs are tagged [PERMANENT:laravel-11-eol] (Laravel 11 reached EOL 2026-03-12; the genuine blocker CVE-2026-48019 covers all 11.x with no 11.x fix coming, and the other four are already patched in 11.x but enumerated across the candidate range) — remove them when Laravel 11 is dropped from the matrix. The two pre-existing PHPUnit IDs are re-tagged [DEV-ONLY:phpunit]. No runtime/dependency change; supported Laravel 12/13 are unaffected (already patched).