build: re-pin to qbit-build-parent 2.0.0 (QRun-IO/qqq#765) #7

Closed
KofTwentyTwo wants to merge 12 commits from feature/GH-765-repin-build-parent-2 into develop
pull from: feature/GH-765-repin-build-parent-2
KofTwentyTwo commented 2026-09-26 00:27:21 +00:00 (Migrated from github.com)

Summary

Re-pins this qbit to com.kingsrook:qbit-build-parent:2.0.0 (qqq 4.0.0 GA) and adds an opt-in qqq-snapshot profile that verifies it on qqq 4.1.0-SNAPSHOT, so qqq-all can include it. The first commit back-merges main into develop.

Closes QRun-IO/qqq#765
Part of QRun-IO/qqq-all#1

Changes

  • Back-merge main -> develop (debc4fd, git merge --no-ff origin/main). It brings in the 3 main-only commits: the 0.4.0 release merge, Bump version to 0.4.0, and fix ot use revision property.
  • Parent 1.5.1 -> 2.0.0. Removed the child qqq-bom-pom:0.40.0-SNAPSHOT import that shadowed the parent (ADR-0007), so default builds take the qqq version only from the parent. Java 21 comes from the parent's java.version.
  • qqq 4.0 API migration, needed to compile:
    • TableViewFieldCustomizer: RecordCustomizerUtilityInterface.getValueFromRecordOrOldRecord (removed in 4.0) is replaced by getValueFromRecordElseFromOldRecord, wrapped in ValueUtils.getValueAsString as the 4.0 javadoc recommends. The lookup logic is the same.
    • BaseTest: QInstance.setAuthentication (removed in 4.0) is replaced by withInstanceDefaultAuthentication.
  • New test TableViewFieldCustomizerTest.testSparseUpdateUsesOldRecordValues covers the old-record fallback that the migrated call serves. It had no test before. I checked it catches a regression: with the fallback disabled, the test fails; with the fix restored, it passes.
  • Opt-in qqq-snapshot profile. It imports qqq-bom-pom:${qqq.snapshot.version} (default 4.1.0-SNAPSHOT), which takes precedence over the parent's BOM, and it adds the Central snapshots repository. The parent has no qqq-version property to override. The top-level sonatype-snapshots repository, which only served the old snapshot BOM, moved into this profile. The default build still resolves fine from Central, and the parent declares the same snapshots URL anyway.
  • CLAUDE.md: replaced the stale "depends on qqq-bom-pom:0.40.0-SNAPSHOT" note with how the version is now set and checked.
  • Licensing is untouched, per the issue ("licensing alignment is a separate owner decision"). An earlier commit on this branch switched the pom <licenses> to Apache-2.0 before the issue was updated. 0a63b1f reverts it. The branch history was not rewritten (no force-push). Likewise, df03ac5 replaces the first qqq.version override profile (6afce06) with qqq-snapshot. The net diff contains neither intermediate.

Merge conflict resolution

There was one conflict, in pom.xml <properties><revision>:

  • develop had 0.5.0-SNAPSHOT and main had 0.4.0. I kept develop's 0.5.0-SNAPSHOT. 0.4.0 is the release stamp CI writes on main. develop had already moved to the next development line (8f92567), and taking 0.4.0 would make develop snapshots publish as a released version.
  • main's fix (523fd34, <version>${revision}</version>) merged cleanly. develop already had the same line.
  • The only content main changed since the merge base (5323d4e) is those two pom lines. The 0.4 release code (virtual fields, record-lock fields) was already on develop. After the merge, the tree matches origin/develop exactly, so none of develop's features or main's fixes were lost.

Type of Change

  • Dependencies update
  • Breaking change: consumers of this qbit move from qqq 0.40.x to qqq 4.0.0
  • Bug fix
  • New feature
  • Documentation update
  • Refactoring

Testing

I ran all commands from the repo root with Maven 3.9.16 and OpenJDK 21.0.12.1. There is no mvnw, so I used mvn. I never ran mvn install.

Command Result
mvn -B verify on untouched develop (baseline) BUILD FAILURE: compile error, QTableMetaData.getFieldOrVirtualField not found. The dead 0.40.0-SNAPSHOT BOM resolves a stale core.
mvn -B verify after the parent bump only BUILD FAILURE: getValueFromRecordOrOldRecord not found (removed in 4.0)
mvn -B test -Dtest=TableViewFieldCustomizerTest with the old-record fallback disabled (temporary change, reverted) 1 failure: testSparseUpdateUsesOldRecordValues
mvn -B dependency:list -DincludeGroupIds=com.kingsrook.qqq qqq-backend-core:4.0.0
same with -Pqqq-snapshot qqq-backend-core:4.1.0-SNAPSHOT
same with -Pqqq-snapshot -Dqqq.snapshot.version=4.0.0 qqq-backend-core:4.0.0 (the version override works)
CI=true mvn -B clean verify (parent's qqq 4.0.0), on 971249b BUILD SUCCESS: 19 tests, 0 failures, 0 errors, 0 skipped
CI=true mvn -B -U clean verify -Pqqq-snapshot (qqq 4.1.0-SNAPSHOT), on 971249b BUILD SUCCESS: 19 tests, 0 failures, 0 errors, 0 skipped

I also ran the intermediate re-pin commit (35aa2da) with mvn -B clean verify: 19 tests, all passing.

  • Unit tests pass
  • mvn verify passes on qqq 4.0.0 and with -Pqqq-snapshot
  • Manual testing performed

Checklist

  • Code follows the project's style guidelines
  • Self-review performed
  • Tests added for the migrated behavior
  • New and existing unit tests pass locally
  • No new warnings (see the parent-pom warning below)

Additional Notes

  • Docker integration tests (plan step 4): not applicable. This repo has no Docker or Testcontainers tests; all tests use in-memory and H2 backends. Under CI=true, 0 tests are skipped.
  • qbit-user-role-permissions: this qbit has no Maven dependency on u-r-p. It refers to the role possible-value source by name only, and tests register a local placeholder enum. There is no u-r-p pin to keep or change, and nothing here depends on u-r-p's new version.
  • New build warning from the parent: Failed to build parent project ... com.kingsrook:qbit-build-parent:pom:${revision}. qbit-build-parent:2.0.0 was published with an unflattened <version>${revision}</version>; 1.5.1 was flattened. The effective model still resolves correctly, so the warning is harmless, but it should be fixed upstream in a future parent release by publishing a flattened pom.
  • Out of scope, left as is: the README is stale. It shows a Java 17 badge and documents a saved-views API that does not exist.
  • CircleCI test_only fails because of infrastructure, not this change. Jobs 49 and 50 both time out in the orb step "Install Java 21 and build tools", before Maven runs. On the machine image, apt triggers needrestart's interactive "Daemons using outdated libraries" dialog, and the step then hits the 10-minute no-output limit. qbit-user-role-permissions build 44 (the B2 re-pin) fails the same way, so the problem is fleet-wide in kingsrook/qqq-orb@0.5.0. It needs a non-interactive apt setting in the orb (for example NEEDRESTART_MODE=a / DEBIAN_FRONTEND=noninteractive). Once that is fixed, re-run CI here.
## Summary Re-pins this qbit to `com.kingsrook:qbit-build-parent:2.0.0` (qqq 4.0.0 GA) and adds an opt-in `qqq-snapshot` profile that verifies it on qqq `4.1.0-SNAPSHOT`, so qqq-all can include it. The first commit back-merges `main` into `develop`. Closes QRun-IO/qqq#765 Part of QRun-IO/qqq-all#1 ## Changes - **Back-merge `main` -> `develop`** (`debc4fd`, `git merge --no-ff origin/main`). It brings in the 3 main-only commits: the 0.4.0 release merge, `Bump version to 0.4.0`, and `fix ot use revision property`. - **Parent 1.5.1 -> 2.0.0.** Removed the child `qqq-bom-pom:0.40.0-SNAPSHOT` import that shadowed the parent (ADR-0007), so default builds take the qqq version only from the parent. Java 21 comes from the parent's `java.version`. - **qqq 4.0 API migration**, needed to compile: - `TableViewFieldCustomizer`: `RecordCustomizerUtilityInterface.getValueFromRecordOrOldRecord` (removed in 4.0) is replaced by `getValueFromRecordElseFromOldRecord`, wrapped in `ValueUtils.getValueAsString` as the 4.0 javadoc recommends. The lookup logic is the same. - `BaseTest`: `QInstance.setAuthentication` (removed in 4.0) is replaced by `withInstanceDefaultAuthentication`. - **New test** `TableViewFieldCustomizerTest.testSparseUpdateUsesOldRecordValues` covers the old-record fallback that the migrated call serves. It had no test before. I checked it catches a regression: with the fallback disabled, the test fails; with the fix restored, it passes. - **Opt-in `qqq-snapshot` profile.** It imports `qqq-bom-pom:${qqq.snapshot.version}` (default `4.1.0-SNAPSHOT`), which takes precedence over the parent's BOM, and it adds the Central snapshots repository. The parent has no qqq-version property to override. The top-level `sonatype-snapshots` repository, which only served the old snapshot BOM, moved into this profile. The default build still resolves fine from Central, and the parent declares the same snapshots URL anyway. - **CLAUDE.md**: replaced the stale "depends on `qqq-bom-pom:0.40.0-SNAPSHOT`" note with how the version is now set and checked. - **Licensing is untouched**, per the issue ("licensing alignment is a separate owner decision"). An earlier commit on this branch switched the pom `<licenses>` to Apache-2.0 before the issue was updated. `0a63b1f` reverts it. The branch history was not rewritten (no force-push). Likewise, `df03ac5` replaces the first `qqq.version` override profile (`6afce06`) with `qqq-snapshot`. The net diff contains neither intermediate. ## Merge conflict resolution There was one conflict, in `pom.xml` `<properties><revision>`: - develop had `0.5.0-SNAPSHOT` and main had `0.4.0`. **I kept develop's `0.5.0-SNAPSHOT`.** `0.4.0` is the release stamp CI writes on `main`. develop had already moved to the next development line (`8f92567`), and taking `0.4.0` would make develop snapshots publish as a released version. - main's fix (`523fd34`, `<version>${revision}</version>`) merged cleanly. develop already had the same line. - The only content main changed since the merge base (`5323d4e`) is those two pom lines. The 0.4 release code (virtual fields, record-lock fields) was already on develop. After the merge, the tree matches `origin/develop` exactly, so none of develop's features or main's fixes were lost. ## Type of Change - [x] Dependencies update - [x] Breaking change: consumers of this qbit move from qqq 0.40.x to qqq 4.0.0 - [ ] Bug fix - [ ] New feature - [ ] Documentation update - [ ] Refactoring ## Testing I ran all commands from the repo root with Maven 3.9.16 and OpenJDK 21.0.12.1. There is no `mvnw`, so I used `mvn`. I never ran `mvn install`. | Command | Result | |---|---| | `mvn -B verify` on untouched `develop` (baseline) | **BUILD FAILURE**: compile error, `QTableMetaData.getFieldOrVirtualField` not found. The dead `0.40.0-SNAPSHOT` BOM resolves a stale core. | | `mvn -B verify` after the parent bump only | **BUILD FAILURE**: `getValueFromRecordOrOldRecord` not found (removed in 4.0) | | `mvn -B test -Dtest=TableViewFieldCustomizerTest` with the old-record fallback disabled (temporary change, reverted) | 1 failure: `testSparseUpdateUsesOldRecordValues` | | `mvn -B dependency:list -DincludeGroupIds=com.kingsrook.qqq` | `qqq-backend-core:4.0.0` | | same with `-Pqqq-snapshot` | `qqq-backend-core:4.1.0-SNAPSHOT` | | same with `-Pqqq-snapshot -Dqqq.snapshot.version=4.0.0` | `qqq-backend-core:4.0.0` (the version override works) | | `CI=true mvn -B clean verify` (parent's qqq 4.0.0), on `971249b` | **BUILD SUCCESS**: 19 tests, 0 failures, 0 errors, 0 skipped | | `CI=true mvn -B -U clean verify -Pqqq-snapshot` (qqq 4.1.0-SNAPSHOT), on `971249b` | **BUILD SUCCESS**: 19 tests, 0 failures, 0 errors, 0 skipped | I also ran the intermediate re-pin commit (`35aa2da`) with `mvn -B clean verify`: 19 tests, all passing. - [x] Unit tests pass - [x] `mvn verify` passes on qqq 4.0.0 and with `-Pqqq-snapshot` - [ ] Manual testing performed ## Checklist - [x] Code follows the project's style guidelines - [x] Self-review performed - [x] Tests added for the migrated behavior - [x] New and existing unit tests pass locally - [ ] No new warnings (see the parent-pom warning below) ## Additional Notes - **Docker integration tests (plan step 4):** not applicable. This repo has no Docker or Testcontainers tests; all tests use in-memory and H2 backends. Under `CI=true`, 0 tests are skipped. - **qbit-user-role-permissions:** this qbit has no Maven dependency on u-r-p. It refers to the `role` possible-value source by name only, and tests register a local placeholder enum. There is no u-r-p pin to keep or change, and nothing here depends on u-r-p's new version. - **New build warning from the parent:** `Failed to build parent project ... com.kingsrook:qbit-build-parent:pom:${revision}`. `qbit-build-parent:2.0.0` was published with an unflattened `<version>${revision}</version>`; 1.5.1 was flattened. The effective model still resolves correctly, so the warning is harmless, but it should be fixed upstream in a future parent release by publishing a flattened pom. - **Out of scope, left as is:** the README is stale. It shows a Java 17 badge and documents a saved-views API that does not exist. - **CircleCI `test_only` fails because of infrastructure, not this change.** Jobs 49 and 50 both time out in the orb step "Install Java 21 and build tools", before Maven runs. On the machine image, `apt` triggers `needrestart`'s interactive "Daemons using outdated libraries" dialog, and the step then hits the 10-minute no-output limit. `qbit-user-role-permissions` build 44 (the B2 re-pin) fails the same way, so the problem is fleet-wide in `kingsrook/qqq-orb@0.5.0`. It needs a non-interactive apt setting in the orb (for example `NEEDRESTART_MODE=a` / `DEBIAN_FRONTEND=noninteractive`). Once that is fixed, re-run CI here.
KofTwentyTwo commented 2026-09-26 01:01:15 +00:00 (Migrated from github.com)

Review, round 1 (plan task B3): no blocking issues

Routed through local--review-pr at the Deep tier: 92 changed lines across 5 files, a pom parent change, and a red CI check. Aspects covered: code, tests, comments, error handling, and a security pass.

Verified locally (PR head 971249b, clean copy, Maven 3.9, JDK 21)

Check Result
CI=true mvn -B clean verify BUILD SUCCESS: 19 tests, 0 failures, 0 errors, 0 skipped
CI=true mvn -B -U clean verify -Pqqq-snapshot BUILD SUCCESS: 19 tests, 0 failures, 0 errors, 0 skipped
dependency:list, default and with -Pqqq-snapshot qqq-backend-core and qqq-backend-module-rdbms resolve to 4.0.0 and 4.1.0-SNAPSHOT respectively
Mutation: fallback removed (record.getValue(...) only) testSparseUpdateUsesOldRecordValues fails, so the test catches the regression
Repo checkstyle/config.xml (plugin 3.6.0, main and test) 2 warnings, both in files this PR doesn't touch (CustomizableTableViewsQBitProducer.java:77, CustomizableTableViewsFieldMetaData.java:37). Changed files are clean.
git diff origin/develop debc4fd Empty: the back-merge tree matches develop exactly
LICENSE, NOTICE, source headers, pom <licenses> Unchanged in the net diff

B3 requirements

  1. Back-merge: met. It's done in this PR as merge commit debc4fd, the same way the B2 PR does it. The <revision> conflict was resolved to develop's 0.5.0-SNAPSHOT, which is correct.
  2. Parent: met. The parent is 2.0.0, the shadowing child qqq-bom-pom import is removed, Java 21 comes from the parent's java.version, and licensing is untouched.
  3. Builds and profile: met. The build is green on 4.0.0. The qqq-snapshot profile imports qqq-bom-pom:${qqq.snapshot.version} (default 4.1.0-SNAPSHOT) and adds the Central snapshots repository with releases disabled. It takes precedence over the parent's BOM, as dependency:list confirms.
  4. Docker tests: N/A. The repo has no Docker or Testcontainers tests.
  5. qqq versions: met. The child pom has no explicit qqq module <version>s.

API migration: in qqq v4.0.0, getValueFromRecordElseFromOldRecord has the same body as the removed getValueFromRecordOrOldRecord, minus the unchecked cast. ValueUtils.getValueAsString(null) returns null, so null handling is unchanged. withInstanceDefaultAuthentication is the 4.0 replacement for setAuthentication.

Blocking

None.

Non-blocking

  1. Merge gate: CI. test_only (job 50, on 971249b) timed out in "Install Java 21 and build tools" before Maven ran. It was stuck on the needrestart "Daemons using outdated libraries" dialog. Job 49 and qbit-user-role-permissions build 44 fail the same way, so this PR didn't cause it. Still, re-run CI after the orb fix and get it green before merging.
  2. Merge method. Use "Create a merge commit". Squash or rebase would drop debc4fd's second parent. main's 3 commits would then still be missing from develop's history, which undoes step 1, and the next develop to main release would hit the same <revision> conflict. The plan asks for a separate back-merge PR first. Doing it inside this PR is fine as long as the merge commit survives.
  3. Test precision. In the mutant run, assertThat(mandatoryToReadOnly.getErrors()).hasSizeGreaterThan(0) still passed, because the null-fieldName NPE becomes a SystemErrorStatusMessage. Only the optional-record assertion caught the regression. Consider asserting that the mandatory record's error is a BadInputStatusMessage, or checking its message. Also consider a case where the update record sets fieldName itself, so the record's value must win over the old record's; that covers the other branch.
  4. CLAUDE.md: the "ADR-0007" reference has no path. The ADR is in the second-brain vault (decisions/ADR-0007-qqq-fleet-scope-groupid-4.0.md). The other knowledge-base notes in this file give vault paths, so add one here too.
  5. Parent warning: agreed that the qbit-build-parent:pom:${revision} warning comes from how the 2.0.0 parent was published. Track it outside this PR.
  6. History: the branch contains a181b3b and its revert 0a63b1f. The net effect is zero, but with a merge commit both will appear in develop's log.

Security pass: no secrets, and no dependency changes beyond the parent bump. The child's snapshots repository moved from always-on to opt-in. The parent still declares the same snapshots URL (central-portal-snapshots), so the repositories a default build uses are effectively unchanged.

Verdict: approve (round 1). Merge once CI is green, using a merge commit.

## Review, round 1 (plan task B3): no blocking issues Routed through `local--review-pr` at the Deep tier: 92 changed lines across 5 files, a pom parent change, and a red CI check. Aspects covered: code, tests, comments, error handling, and a security pass. ### Verified locally (PR head `971249b`, clean copy, Maven 3.9, JDK 21) | Check | Result | |---|---| | `CI=true mvn -B clean verify` | BUILD SUCCESS: 19 tests, 0 failures, 0 errors, 0 skipped | | `CI=true mvn -B -U clean verify -Pqqq-snapshot` | BUILD SUCCESS: 19 tests, 0 failures, 0 errors, 0 skipped | | `dependency:list`, default and with `-Pqqq-snapshot` | `qqq-backend-core` and `qqq-backend-module-rdbms` resolve to `4.0.0` and `4.1.0-SNAPSHOT` respectively | | Mutation: fallback removed (`record.getValue(...)` only) | `testSparseUpdateUsesOldRecordValues` fails, so the test catches the regression | | Repo `checkstyle/config.xml` (plugin 3.6.0, main and test) | 2 warnings, both in files this PR doesn't touch (`CustomizableTableViewsQBitProducer.java:77`, `CustomizableTableViewsFieldMetaData.java:37`). Changed files are clean. | | `git diff origin/develop debc4fd` | Empty: the back-merge tree matches develop exactly | | LICENSE, NOTICE, source headers, pom `<licenses>` | Unchanged in the net diff | ### B3 requirements 1. **Back-merge: met.** It's done in this PR as merge commit `debc4fd`, the same way the B2 PR does it. The `<revision>` conflict was resolved to develop's `0.5.0-SNAPSHOT`, which is correct. 2. **Parent: met.** The parent is `2.0.0`, the shadowing child `qqq-bom-pom` import is removed, Java 21 comes from the parent's `java.version`, and licensing is untouched. 3. **Builds and profile: met.** The build is green on 4.0.0. The `qqq-snapshot` profile imports `qqq-bom-pom:${qqq.snapshot.version}` (default `4.1.0-SNAPSHOT`) and adds the Central snapshots repository with releases disabled. It takes precedence over the parent's BOM, as `dependency:list` confirms. 4. **Docker tests: N/A.** The repo has no Docker or Testcontainers tests. 5. **qqq versions: met.** The child pom has no explicit qqq module `<version>`s. **API migration:** in qqq `v4.0.0`, `getValueFromRecordElseFromOldRecord` has the same body as the removed `getValueFromRecordOrOldRecord`, minus the unchecked cast. `ValueUtils.getValueAsString(null)` returns null, so null handling is unchanged. `withInstanceDefaultAuthentication` is the 4.0 replacement for `setAuthentication`. ### Blocking None. ### Non-blocking 1. **Merge gate: CI.** `test_only` (job 50, on `971249b`) timed out in "Install Java 21 and build tools" before Maven ran. It was stuck on the `needrestart` "Daemons using outdated libraries" dialog. Job 49 and qbit-user-role-permissions build 44 fail the same way, so this PR didn't cause it. Still, re-run CI after the orb fix and get it green before merging. 2. **Merge method.** Use "Create a merge commit". Squash or rebase would drop `debc4fd`'s second parent. main's 3 commits would then still be missing from develop's history, which undoes step 1, and the next develop to main release would hit the same `<revision>` conflict. The plan asks for a separate back-merge PR first. Doing it inside this PR is fine as long as the merge commit survives. 3. **Test precision.** In the mutant run, `assertThat(mandatoryToReadOnly.getErrors()).hasSizeGreaterThan(0)` still passed, because the null-`fieldName` NPE becomes a `SystemErrorStatusMessage`. Only the optional-record assertion caught the regression. Consider asserting that the mandatory record's error is a `BadInputStatusMessage`, or checking its message. Also consider a case where the update record sets `fieldName` itself, so the record's value must win over the old record's; that covers the other branch. 4. **CLAUDE.md:** the "ADR-0007" reference has no path. The ADR is in the second-brain vault (`decisions/ADR-0007-qqq-fleet-scope-groupid-4.0.md`). The other knowledge-base notes in this file give vault paths, so add one here too. 5. **Parent warning:** agreed that the `qbit-build-parent:pom:${revision}` warning comes from how the 2.0.0 parent was published. Track it outside this PR. 6. **History:** the branch contains `a181b3b` and its revert `0a63b1f`. The net effect is zero, but with a merge commit both will appear in develop's log. **Security pass:** no secrets, and no dependency changes beyond the parent bump. The child's snapshots repository moved from always-on to opt-in. The parent still declares the same snapshots URL (`central-portal-snapshots`), so the repositories a default build uses are effectively unchanged. **Verdict: approve (round 1).** Merge once CI is green, using a merge commit.
KofTwentyTwo commented 2026-09-26 01:43:09 +00:00 (Migrated from github.com)
Superseded by https://github.com/QRun-IO/qbit-customizable-table-views/pull/8

Pull request closed

Please reopen this pull request to perform a merge.
Sign in to join this conversation.