QuickSearchRecordSearchProvider fills the extended QQQ record-search contract (QRun-IO/qqq#1072, ships in QQQ 4.1.0-RC.4):
per-hit relevance score (OpenSearch _score)
highlights: OpenSearch highlighting of fieldValues.* with private-use pre/post tags (/), converted to plain text + {start,end} ranges and attributed to the QQQ field name (core keeps only well-formed highlights for fields the user can see, where its own highlighting found no match)
totalCountByTable (track_total_hits up to 10,000) → core's tables[].totalCount / hasMore
honors request offset (from); sort: RECENT keeps relevance order (the index holds no record modify dates — documented)
new QuickSearchOpenSearchClient.searchRecordsPerTable; searchRecordIdsPerTable delegates to it
**Rebased by merge onto develop (qqq RC.6, which includes the RC.4 SPI); full CI=true ./mvnw verify passes locally.
Integration (26, Testcontainers OpenSearch): totals + paging across pages, score > 0, real highlight fragments convert to "comes in blue and green" with match [9,13).
JaCoCo gate met. All run locally against a QQQ 4.1.0-SNAPSHOT built from #1072.
## Summary
`QuickSearchRecordSearchProvider` fills the extended QQQ record-search contract (QRun-IO/qqq#1072, ships in QQQ **4.1.0-RC.4**):
- per-hit relevance **`score`** (OpenSearch `_score`)
- **`highlights`**: OpenSearch highlighting of `fieldValues.*` with private-use pre/post tags (``/``), converted to **plain text + `{start,end}` ranges** and attributed to the QQQ field name (core keeps only well-formed highlights for fields the user can see, where its own highlighting found no match)
- **`totalCountByTable`** (track_total_hits up to 10,000) → core's `tables[].totalCount` / `hasMore`
- honors request **`offset`** (`from`); `sort: RECENT` keeps relevance order (the index holds no record modify dates — documented)
- new `QuickSearchOpenSearchClient.searchRecordsPerTable`; `searchRecordIdsPerTable` delegates to it
**Rebased by merge onto develop (qqq RC.6, which includes the RC.4 SPI); full `CI=true ./mvnw verify` passes locally.
## Contract
Provider → core (per result): `{ tableName, recordId, score, highlights: [{ fieldName, text, matches: [{start, end}] }] }`; output: `totalCountByTable: { "<table>": <int> }`. Input now carries `offset` and `sort`.
## Test plan
- [x] Unit (374): scores/highlights/totals mapping + offset passthrough, fragment→range conversion (adjacent merge, unbalanced/blank/no-match → none, non-`fieldValues` fields skipped), core integration reports `PROVIDER`/`hasMore`, failure → `FAILED`/`FALLBACK`/`QException`.
- [x] Integration (26, Testcontainers OpenSearch): totals + paging across pages, score > 0, real highlight fragments convert to `"comes in blue and green"` with match `[9,13)`.
- [x] JaCoCo gate met. All run locally against a QQQ 4.1.0-SNAPSHOT built from #1072.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
QuickSearchRecordSearchProviderfills the extended QQQ record-search contract (QRun-IO/qqq#1072, ships in QQQ 4.1.0-RC.4):score(OpenSearch_score)highlights: OpenSearch highlighting offieldValues.*with private-use pre/post tags (/), converted to plain text +{start,end}ranges and attributed to the QQQ field name (core keeps only well-formed highlights for fields the user can see, where its own highlighting found no match)totalCountByTable(track_total_hits up to 10,000) → core'stables[].totalCount/hasMoreoffset(from);sort: RECENTkeeps relevance order (the index holds no record modify dates — documented)QuickSearchOpenSearchClient.searchRecordsPerTable;searchRecordIdsPerTabledelegates to it**Rebased by merge onto develop (qqq RC.6, which includes the RC.4 SPI); full
CI=true ./mvnw verifypasses locally.Contract
Provider → core (per result):
{ tableName, recordId, score, highlights: [{ fieldName, text, matches: [{start, end}] }] }; output:totalCountByTable: { "<table>": <int> }. Input now carriesoffsetandsort.Test plan
fieldValuesfields skipped), core integration reportsPROVIDER/hasMore, failure →FAILED/FALLBACK/QException."comes in blue and green"with match[9,13).🤖 Generated with Claude Code