Release Overview
OpenEmpiric v1.0.5 hardens source indexing and source search ranking. The release focuses on deterministic source retrieval: implementation files rank ahead of broad docs/tests when they carry exact source evidence, metadata-only rows cannot dominate normal source results, and source-index include/exclude configuration now behaves predictably.
What Changed and Why
1. Source Search Ranking Hardening
- Change: Added deterministic source-ranking diagnostics, exact identifier matching, symbol-definition boosts, implementation/test/doc/config classification, metadata-only suppression, and stable tie-breakers.
- Why: Source search now gives more predictable implementation-first results for technical queries while still allowing doc/config/agent-instruction queries to return the right non-code files.
2. Source Index Coverage For Implementation Directories
- Change: Upgraded old default source-index config patterns so
execution/**andagent/**can be indexed by default when present. - Why: Implementation scripts and agent helpers are part of the source corpus and should be searchable without manual config changes.
3. Metadata-Only Guardrails
- Change: Metadata-only files no longer receive implementation boosts unless rescued by exact path or filename evidence, and cannot outrank real source content with exact identifiers.
- Why: Large/generated/metadata-only rows can remain visible for exact lookup without polluting normal source-query results.
4. Config Exclusion Fixes
- Change: Added
exclude_globstoSourceIndexConfig, wired it through config loading, and made classification useexclude_globsseparately from explicitexcluderules. - Why:
.gitignore/.oemignore-style ignores and explicit include/exclude matching now stay separate and both work as intended.
5. Ranking Cleanup
- Change: Matched identifiers are computed once per result and reused across classification, boosts, diagnostics, and multi-match scoring. Misleading "cooccurrence" naming was replaced with
identifier_multi_match/matched identifiers. Ranking weights and BM25 constants are now named. - Why: The ranking code is easier to audit and tune without hidden duplicate matching work or unexplained numeric thresholds.
Install
To install/update this version using uv:
uv tool install "git+https://github.com/xpajonx/openempiric.git#subdirectory=packages/oem-knowledge[semantic]"Validation
Targeted source-search ranking tests passed:
PYTHONPATH=packages/oem-knowledge/src uv run pytest \
packages/oem-knowledge/tests/test_source_search_ranking.py \
-q --tb=shortResult: 92 passed.
Broader source/memory/preflight regression tests passed:
PYTHONPATH=packages/oem-knowledge/src uv run pytest \
packages/oem-knowledge/tests/test_search_ranking.py \
packages/oem-knowledge/tests/test_memory_ranking_harness.py \
packages/oem-knowledge/tests/test_preflight.py \
packages/oem-knowledge/tests/test_active_work.py \
packages/oem-knowledge/tests/test_knowledge_health.py \
-q --tb=shortResult: 266 passed, 32 warnings.
Source indexing completed successfully for this repository:
Scanned Files: 199
Indexed Files: 199
Metadata-only: 0
Total Chunks: 599
The corrected source-index database path is:
.oem/indexes/source_index.sqlite