feat: 1.0 release readiness (GH-1) #10

Merged
KofTwentyTwo merged 12 commits from feature/GH-1-0-release-readiness into develop 2026-10-05 14:50:05 +00:00
KofTwentyTwo commented 2026-10-05 12:04:55 +00:00 (Migrated from github.com)

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.
KofTwentyTwo commented 2026-10-05 12:13:47 +00:00 (Migrated from github.com)

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.

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.
Sign in to join this conversation.