- Fixed a precedence-inversion regression in `BaseParser.parse_document` (`opencontractserver/pipeline/base/parser.py`): the #2115 fix let `component_settings` win over `direct_kwargs`/legacy `parser_kwargs` on key collision, but an empty-string secret placeholder in `component_settings` (explicitly allowed by the mutation layer's secret validation) could then clobber a real, truthy value seeded only into legacy `parser_kwargs` (e.g. LlamaParse's env-seeded `api_key`), silently breaking every subsequent LlamaParse ingest. `component_settings` values of `None`/`""` are now treated as "not set" and never override a truthy `direct_kwargs` value.
- Fixed a validation gap in `UpdatePipelineSettingsMutation` (`config/graphql/pipeline_settings_mutations.py`): the #2116 `enabled_components`-vs-assigned-defaults consistency guard covered `default_embedder`/`default_file_converter` but omitted `default_reranker`, so a superuser could assign a disabled component as `default_reranker` with no validation error, silently disabling reranking at the next retrieval.
- Added regression tests: `opencontractserver/tests/test_base_pipeline_parser.py::test_parse_document_empty_component_settings_value_does_not_clobber_direct_kwargs`; `opencontractserver/tests/test_pipeline_settings.py::EnabledComponentsMutationTestCase::test_cannot_assign_disabled_component_as_default_reranker` and `::test_widen_enabled_components_and_assign_in_same_call_succeeds`.
- Removed the module-level `get_preferred_embedder` function from `opencontractserver/pipeline/utils.py`, dead since its only callers (`find_embedder_for_filetype`/`get_default_embedder_for_filetype`) were deleted under #2114. Added `opencontractserver/tests/test_pipeline_utils.py::TestPipelineUtils::test_get_default_embedder_unmocked` to restore the only unmocked, DB-backed coverage of `get_default_embedder()` that was lost when `test_find_embedder_for_filetype` was deleted as part of that same cleanup.
- Tightened `frontend/tests/admin-components.ct.tsx`'s filetype-defaults select-count assertion from a `>= 6` lower bound to an exact `toHaveCount(6)` plus an explicit check that no `Embedder for * files` select exists, so a regression that re-adds the removed per-MIME Embedder column is actually caught.
