Implements the 1.0 scope from docs/PLAN-1.0-release.md: all 25 blockers of the 2026-10-04 production-readiness audit (docs/audits/2026-10-04/README.md).
Highlights
QQQ 4.1 QBit contract: QBitMetaDataProducer, self-registered QBitMetaData, component producers, runtime service, instance-scoped QuickSearchRuntime with a deprecated static facade.
Real-time indexing via RecordChangeListenerInterface, published after commit; failures recorded in quickSearchFailedEvent and replayed by basepull.
OpenSearch client: NONE/BASIC/AWS_SIGV4, TLS block, timeouts, mapping v2 behind an alias, versioned bulk writes, alias-swap full reindex.
Indexing steps: keyset paging, start-anchored watermark with overlap, orphan sweep, drift detection, run purge.
Permission-aware bounded search; process input and result screens; README, CHANGELOG, migration guide.
Build
Targets qqq 4.1.0-RC.1 and opensearch-java 3.10.0 through the default-active qqq-snapshot profile over qbit-build-parent 2.0.0 (deviation from ADR-0007 until parent 2.1.0 ships). Build with ./mvnw.
Validation
CI=true ./mvnw verify on qqq 4.1.0-RC.1 and OpenSearch 2.19.6: 307 unit tests, 18 integration tests, JaCoCo gate (85% line) passed.
Implements the 1.0 scope from `docs/PLAN-1.0-release.md`: all 25 blockers of the 2026-10-04 production-readiness audit (`docs/audits/2026-10-04/README.md`).
## Highlights
- QQQ 4.1 QBit contract: `QBitMetaDataProducer`, self-registered `QBitMetaData`, component producers, runtime service, instance-scoped `QuickSearchRuntime` with a deprecated static facade.
- Real-time indexing via `RecordChangeListenerInterface`, published after commit; failures recorded in `quickSearchFailedEvent` and replayed by basepull.
- OpenSearch client: `NONE`/`BASIC`/`AWS_SIGV4`, TLS block, timeouts, mapping v2 behind an alias, versioned bulk writes, alias-swap full reindex.
- Indexing steps: keyset paging, start-anchored watermark with overlap, orphan sweep, drift detection, run purge.
- Permission-aware bounded search; process input and result screens; README, CHANGELOG, migration guide.
## Build
Targets qqq 4.1.0-RC.1 and opensearch-java 3.10.0 through the default-active `qqq-snapshot` profile over `qbit-build-parent` 2.0.0 (deviation from ADR-0007 until parent 2.1.0 ships). Build with `./mvnw`.
## Validation
`CI=true ./mvnw verify` on qqq 4.1.0-RC.1 and OpenSearch 2.19.6: 307 unit tests, 18 integration tests, JaCoCo gate (85% line) passed.
Review (2026-10-05, deep tier: code review of the search permission filter and alias swap, silent-failure hunt on the listener and basepull paths, security review of the transport and config).
FullReindexStep deleted the new physical index in its catch block even after the alias swap, which could leave the alias pointing at nothing. The index is now kept once the swap has happened.
The legacy concrete-index upgrade in QuickSearchOpenSearchClient.swapAliasTo used two requests; it is now one _aliases request with remove_index and add. Old-index cleanup is best-effort.
QuickSearchAction forced hasMore and totalHitsIsLowerBound to false when record locks dropped hits, so results past the fetch window were unreachable; hasMore is now based on the raw hit count. Repeated tableNames are deduplicated.
No blocking findings in the listener, basepull replay, or transport/secret handling. Lower-severity observations are tracked in docs/TODO.md under "Before 1.0.0 GA".
Validation after the fixes: CI=true ./mvnw verify on qqq 4.1.0-RC.1 and OpenSearch 2.19.6, 307 unit and 18 integration tests, coverage gate passed.
Review (2026-10-05, deep tier: code review of the search permission filter and alias swap, silent-failure hunt on the listener and basepull paths, security review of the transport and config).
Merge-blocking, fixed in 45bd1fc:
- `FullReindexStep` deleted the new physical index in its catch block even after the alias swap, which could leave the alias pointing at nothing. The index is now kept once the swap has happened.
- The legacy concrete-index upgrade in `QuickSearchOpenSearchClient.swapAliasTo` used two requests; it is now one `_aliases` request with `remove_index` and `add`. Old-index cleanup is best-effort.
- `QuickSearchAction` forced `hasMore` and `totalHitsIsLowerBound` to false when record locks dropped hits, so results past the fetch window were unreachable; `hasMore` is now based on the raw hit count. Repeated `tableNames` are deduplicated.
No blocking findings in the listener, basepull replay, or transport/secret handling. Lower-severity observations are tracked in `docs/TODO.md` under "Before 1.0.0 GA".
Validation after the fixes: `CI=true ./mvnw verify` on qqq 4.1.0-RC.1 and OpenSearch 2.19.6, 307 unit and 18 integration tests, coverage gate passed.
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.
Implements the 1.0 scope from
docs/PLAN-1.0-release.md: all 25 blockers of the 2026-10-04 production-readiness audit (docs/audits/2026-10-04/README.md).Highlights
QBitMetaDataProducer, self-registeredQBitMetaData, component producers, runtime service, instance-scopedQuickSearchRuntimewith a deprecated static facade.RecordChangeListenerInterface, published after commit; failures recorded inquickSearchFailedEventand replayed by basepull.NONE/BASIC/AWS_SIGV4, TLS block, timeouts, mapping v2 behind an alias, versioned bulk writes, alias-swap full reindex.Build
Targets qqq 4.1.0-RC.1 and opensearch-java 3.10.0 through the default-active
qqq-snapshotprofile overqbit-build-parent2.0.0 (deviation from ADR-0007 until parent 2.1.0 ships). Build with./mvnw.Validation
CI=true ./mvnw verifyon qqq 4.1.0-RC.1 and OpenSearch 2.19.6: 307 unit tests, 18 integration tests, JaCoCo gate (85% line) passed.Review (2026-10-05, deep tier: code review of the search permission filter and alias swap, silent-failure hunt on the listener and basepull paths, security review of the transport and config).
Merge-blocking, fixed in
45bd1fc:FullReindexStepdeleted the new physical index in its catch block even after the alias swap, which could leave the alias pointing at nothing. The index is now kept once the swap has happened.QuickSearchOpenSearchClient.swapAliasToused two requests; it is now one_aliasesrequest withremove_indexandadd. Old-index cleanup is best-effort.QuickSearchActionforcedhasMoreandtotalHitsIsLowerBoundto false when record locks dropped hits, so results past the fetch window were unreachable;hasMoreis now based on the raw hit count. RepeatedtableNamesare deduplicated.No blocking findings in the listener, basepull replay, or transport/secret handling. Lower-severity observations are tracked in
docs/TODO.mdunder "Before 1.0.0 GA".Validation after the fixes:
CI=true ./mvnw verifyon qqq 4.1.0-RC.1 and OpenSearch 2.19.6, 307 unit and 18 integration tests, coverage gate passed.