Files
qt6-migration-pipeline/prompts/merge-lts-viewer-validation-into-basis-modules-merge.prompt.md
T
berrux-dev 4911aa6d80
Qt6 Migration CI / migrate (push) Has been cancelled
Merge Prompt and Report
2026-09-28 08:34:13 +02:00

503 lines
28 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Strict Qt6 Migration Prompt: Merge of feature/qt6-migration-basis-modules-merge and feature/lts-viewer-validation-testing-phase
This prompt is binding task context. Keep changes minimal, scoped, and reproducible.
The only allowed outcome is a merge commit on
`feature/qt6-migration-basis-modules-merge-viewer-validation` that contains the full work of
both source branches and preserves the legacy code behavior of every migrated file.
## Required base prompts
Before making changes, read and apply:
- ./prompts/combined-migration-subfolder-rti-compact.prompt.md
- ./prompts/commit-policy.prompt.md (repository mapping, pre-commit checks, per-repo commits)
If a base prompt is stricter, follow it. This prompt overrides it only for:
- build variants: use ON variants only for `BUILD_RTI`/`BUILD_GRANTLEE`, never OFF
- commit message format: max 2 lines, single author, no co-author lines (see "Commits")
## Task
Merge these two branches and resolve every conflict without changing code behavior:
- **ours (merge target base):** `feature/qt6-migration-basis-modules-merge`
remote tip at prompt writing (2026-09-26): `36f077bce` ("Emit record_replay fromQVariant for plain enums; document PPM MOC exclusion")
NOTE: the previous tip `7659b167d` (same subject) was **replaced** by `36f077bce` via
force-push (it is not an ancestor of the new tip). The replacement commit absorbed the
docker-script unification (deletion of `docker_build.sh`, merged `new_docker_build.sh`).
If the local branch still points at `7659b167d`, resync it to
`origin/feature/qt6-migration-basis-modules-merge` before starting.
- **theirs (branch to merge in):** `feature/lts-viewer-validation-testing-phase`
remote tip at prompt writing: `c664611b8` ("Migrates non-ArcGIS built successfully (tbc)")
- **merge base:** `ed9fc51e7` ("Migrates ./Lts/Viewer successfully to Qt6")
- **result branch:** `feature/qt6-migration-basis-modules-merge-viewer-validation`
(does not exist yet at prompt writing; create it from
`origin/feature/qt6-migration-basis-modules-merge`)
All work happens in the repository `./qt-migration-legatus` (it is a separate git
repository; never commit its changes into the workspace root or the legacy repository).
## Branches and trees
Working repository:
- `./qt-migration-legatus`
Trees:
- Legacy Qt5 source tree (read-only reference, never modify):
`./qt-migration-legatus/qt5-before/qt5-legatus-legacy`
- Qt6 target tree (the only tree that is modified):
`./qt-migration-legatus/qt6-after/qt6-migrated-legatus`
Before starting:
1. `git fetch origin` in `./qt-migration-legatus`.
2. Verify both remote tips still match the hashes above (`git rev-parse origin/feature/qt6-migration-basis-modules-merge` and `git rev-parse origin/feature/lts-viewer-validation-testing-phase`).
3. If either tip moved, recompute the merge base and re-run the dry-run merge (step 3 of the procedure) before resolving anything.
4. Verify the working tree of `./qt-migration-legatus` is clean (`git status --short`). It was verified clean on 2026-09-26 (the docker-script unification is committed in `36f077bce`). Do not overwrite uncommitted user changes; if they block safe work, report the blocker.
## What each side contains
Understand both sides before resolving anything. The merge must keep the work of BOTH sides.
**merge-branch side (ours, 49 commits after the merge base, ~1287 files):**
- the full prior merge of `feature/qt6-migration-basis-modules-services`: complete
Qt6/rtiddsgen 7.7 migration of residual Lts services/proxies/plugins, NmeaManagement
tests, codegen template include-prefix fixes, Qt6::SerialPort manual IMPORTED target,
GROUP4 (DDS tests + Lts/Proxies) and GROUP5 (Lts/Viewer) build configuration
- follow-up fixes: stub-header relocation to the approved forward-declarations directories
plus `BUILD_STATUS_REPORT.md` (`4223ca2ff`); `ci/allowed_signers` principal format fix
(`e748e82c8`); completion of residual service migration + 19 CTest registrations
(`a41001955`); record_replay `fromQVariant` for plain enums + PPM MOC exclusion
(`36f077bce`, which also absorbed the docker-script unification)
- docker-script unification: `new_docker_build.sh` is the **single** validation script —
its GROUP3 carries the complete former `docker_build.sh` migrated-service target set
(~200 targets incl. per-service tests), the apt-package union, and a single consolidated
GROUP4 array (DDS tests + Proxies). `docker_build.sh` is deleted and must stay deleted.
**viewer-validation side (theirs, 3 commits after the merge base, 7 files, +171/−69):**
- `fd3e5e838` — `--build-viewer-only` option in `new_docker_build.sh`: skips Groups 1–4,
builds Viewer targets only (sets `BUILD_VIEWER_ONLY=ON`, `BUILD_GROUP5=ON`,
`BUILD_CODIFICATION=ON`, `RUN_CTEST=ON`). Viewer-only GROUP5 excludes `LtsFileDialog`
(it needs Group-4 services `svcExmCommon`/`svcOpmCommon`/`svcFlmCommon`); GROUP5 target
lists additionally gain the test executables `LtsDataViewTest`/`LtsFileDialogTest`.
Passes `-DBUILD_VIEWER_ONLY` to CMake (new `OPTION(BUILD_VIEWER_ONLY ... OFF)` in the
root `CMakeLists.txt`; `Lts/Viewer/CMakeLists.txt` adds `LtsDataView` also when
`BUILD_VIEWER_ONLY` is set).
- `b6a97c39e` — KDReports detection fix (`cmake/FindKDReports.cmake` rework: apt
`libkdreports-dev` first, fallback build from the KDAB GitHub mirror into `/usr/local`)
and codification support for viewer-only builds: `--codification/--no-codification`
(`BUILD_CODIFICATION`, default OFF, requires KDReports) wired to
`-DBUILD_CODIFICATION`; build-parts variables `BUILD_ALL`/`BUILD_SV`/`BUILD_WS`/
`BUILD_AAR` (defaults ON) passed to CMake; `;/usr/local` appended to the container
`CMAKE_PREFIX_PATH`; KDReports apt/source install block added to the prebuilt-image
Dockerfile; DOCKER_IMAGE default block moved after argument parsing and the prebuilt
image renamed to `legatus-qt6-prebuilt:latest`.
Note: the CMake options `BUILD_CODIFICATION`, `BUILD_SV`, `BUILD_WS`, `BUILD_AAR`
already exist on the ours side (root `CMakeLists.txt` + `cmake/NGLMacros.cmake`);
theirs only wires them through the docker script.
- `c664611b8` — non-ArcGIS viewer build validation: `LtsDataViewTest` auto-exit
(`QTimer::singleShot(1000, &app, &QApplication::quit)`) for CI/headless runs,
`QT_QPA_PLATFORM=offscreen` test property, unconditional `LtsDataViewTest` link
(the `if(QT6_GUI_AVAILABLE)` guard was removed).
## Known conflict surface (dry run 2026-09-26)
A dry-run merge (`git worktree` + `git merge --no-commit --no-ff`) found **1 content
conflict** and no modify/delete conflicts. Re-run the dry run after the fetch and treat
its output as authoritative; the list below is the expected starting point.
Content conflict (1):
1. `qt6-after/qt6-migrated-legatus/new_docker_build.sh`
Auto-merged (theirs-side files, no conflict):
- `qt6-after/qt6-migrated-legatus/CMakeLists.txt` (+1: `OPTION(BUILD_VIEWER_ONLY ...)`)
- `qt6-after/qt6-migrated-legatus/Lts/Viewer/CMakeLists.txt`
- `qt6-after/qt6-migrated-legatus/Lts/Viewer/LtsDataView/CMakeLists.txt`
- `qt6-after/qt6-migrated-legatus/Lts/Viewer/LtsDataView/test.cpp`
- `qt6-after/qt6-migrated-legatus/cmake/FindKDReports.cmake`
- `qt6-after/qt6-migrated-legatus/cmake/NGLMacros.cmake`
## Conflict resolution rules
These rules exist to guarantee: the merged tree keeps both branches' functionality and no
file's behavior deviates from the legacy Qt5 behavior beyond the approved
Qt6/C++17/rtiddsgen adaptations.
General:
- Resolve semantically, never mechanically. For every conflicted hunk read four versions:
the merge-base version, ours, theirs, and the legacy Qt5 equivalent (for
`new_docker_build.sh` there is no legacy counterpart — it is pure Qt6 build machinery —
so use the merge-base version as the third reference and the merge-base-era
`docker_build.sh`/`new_docker_build.sh` pair as context). The resolution must keep both
sides' approved adaptations.
- Never take `ours` or `theirs` wholesale unless you prove the losing side had no unique
changes: `git diff <merge-base>..theirs -- <file>` (or `..ours`) must show nothing that
the kept version lacks. Record the proof in the final report.
- A merge commit must not drop functionality of either branch: every target, dependency,
test registration, docker build option, and code fix present on one side must be present
(or superseded by an equivalent) in the merged tree.
- No behavior-changing edits beyond the merge itself. No refactoring, no style cleanup, no
warning suppression, no new features.
`new_docker_build.sh` (the single conflict) — required merge recipe:
Keep from the ours side (none of this may be lost):
- GROUP3 full migrated-service target set (~200 targets) with per-service tests
- `APT_PACKAGES` union (`libboost-dev`, `libqt6sql6-psql`, `qt6-svg-dev`,
`qt6-serialport-dev`, `qt6-websockets-dev`, …)
- the single consolidated GROUP4 array (DDS tests + Proxies) and the single
`run_build_group "Group 4 (DDS tests + Proxies)"` call — theirs removed one of the two
legacy Group-4 calls, but the DDS test targets must survive in the merged array
- `./new_docker_build.sh` naming in usage text/examples/exit hint, header feature list,
and the group log lines (incl. the Group 4/5 `log_group` lines)
Keep from the theirs side (none of this may be lost):
- `--codification/--no-codification` flags, `BUILD_CODIFICATION` variable (default OFF),
`normalize_on_off`, export, and `-DBUILD_CODIFICATION` in the container cmake call
- `--build-viewer-only` flag and `BUILD_VIEWER_ONLY` variable (default OFF): the flag
handler (`BUILD_GROUP5=ON`, `BUILD_CODIFICATION=ON`, `RUN_CTEST=ON`), normalize,
export, `-DBUILD_VIEWER_ONLY`, and the container-side block that switches Groups 1–4
OFF and Group 5 ON before the `run_build_group` calls
- `BUILD_ALL`/`BUILD_SV`/`BUILD_WS`/`BUILD_AAR` variables (defaults ON), exports, and the
matching `-D` flags in the container cmake call
- the DOCKER_IMAGE default block **relocated after argument parsing** and the prebuilt
image name `legatus-qt6-prebuilt:latest`; make the usage Defaults/examples consistent
with the name used in the logic (do not leave two different prebuilt image names in one
script)
- the KDReports apt/source install block in `build_prebuilt_image` and the `;/usr/local`
suffix in the container `CMAKE_PREFIX_PATH`
- the four-way GROUP5 conditional (BUILD_ARCGIS × BUILD_VIEWER_ONLY) including the
viewer-only subset (no `LtsFileDialog`) and the `LtsDataViewTest`/`LtsFileDialogTest`
test targets
Known theirs-side inconsistency to fix text-only: the usage line claims
`--build-viewer-only … implies --group5 --no-ctest`, but the flag handler sets
`RUN_CTEST=ON` (and the branch was validated with ctest running). Keep the handler
behavior and correct the usage text to describe the actual behavior. No behavior change.
Group execution order in the container script: the theirs-side `BUILD_VIEWER_ONLY` block
first, then `run_build_group` for Group 1, Group 4 (single call, consolidated array),
Group 2, Group 3, Group 5.
Post-resolution script checks (record in the final report):
- `bash -n` on the host script and on the extracted container-side script
- `--help` renders and lists both `--build-viewer-only` and the group options; an
unknown option is still rejected
- target-set check: every one of the ~200 GROUP3 service targets from the ours side is
still present; the GROUP4 array still contains `ddsGenericDataTests`,
`ddsDataTopicTests`, `ddsFunctionTopicTests`
- no reference to `docker_build.sh` remains in the script
Modify/delete conflicts: none in the dry run. Still run the deletion-guard sweep below
before resolving, so no services-side deletion is missed:
```bash
git diff --diff-filter=D --name-only <merge-base>..origin/feature/lts-viewer-validation-testing-phase |
while IFS= read -r f; do
if git cat-file -e "origin/feature/qt6-migration-basis-modules-merge:$f" 2>/dev/null; then
echo "KEEP $f"
else
echo "deleted-on-both-sides $f"
fi
done
```
Every `KEEP` line is a file that must be present in the final merge tree with the
ours-side content (`git checkout --ours -- <file>`); every `deleted-on-both-sides` line
may stay deleted. Record the full sweep output in the final report.
CMake conflicts: none expected in the dry run. If the re-run dry run shows new CMake
conflicts: take the union of both sides' targets, dependencies, include directories, and
link libraries; keep the `Qt6::SerialPort` manual IMPORTED target and the GROUP5/Viewer
wiring (ours) side by side with the `BUILD_VIEWER_ONLY`/`LtsDataView` wiring (theirs).
After resolving, verify with a fresh configure that both sides' targets/options exist
(`make help` / `cmake --build … --target help`, or the docker script's group options).
## Mandatory build variants
Only these variants are valid:
- `BUILD_RTI=ON`
- `BUILD_GRANTLEE=ON`
Forbidden: `BUILD_RTI=OFF`, `BUILD_GRANTLEE=OFF`.
- Do not implement, fix, preserve, test, or validate OFF variants of `BUILD_RTI`/`BUILD_GRANTLEE`.
- Do not add CMake logic, tests, stubs, or fallbacks for those OFF variants.
- Validation must use `BUILD_RTI=ON` and `BUILD_GRANTLEE=ON`.
- The theirs-side options `BUILD_VIEWER_ONLY` (default OFF), `BUILD_CODIFICATION`
(default OFF), and `BUILD_SV`/`BUILD_WS`/`BUILD_AAR` (default ON) are design features of
the viewer-validation branch, not RTI/Grantlee variants: keep their defaults and
semantics as-is; do not flip them.
## Preservation rules
Preserve module removals from commit `92ad7d468` ("remove all unneeded module listed from Niklas"): do not restore removed modules, files, targets, directories, or dependencies — on either side.
Preserve LogViewer reinsert from commit `1fa789767` ("Added LogViewer again"): do not remove, disable, or break LogViewer integration.
Preserve prior IDL warning fixes from commit `be912de9d`: do not reintroduce multiple enum definitions, duplicate enumerators, or builtin type/keyword collisions.
Preserve the ON-variant-only decisions already made on both branches.
Preserve the docker-script unification: `docker_build.sh` stays deleted;
`new_docker_build.sh` remains the single validation script; the GROUP3 service target set
and the consolidated GROUP4 array survive the script merge (see the merge recipe above).
## Stubs and forward declarations
Any required existing stub, compatibility declaration, or forward declaration must live only under:
- `./qt-migration-legatus/qt6-after/qt6-migrated-legatus/forward-declarations/`
- `./qt-migration-legatus/qt6-after/qt6-migrated-legatus/.forward-declarations/include/`
- Do not leave such files in service directories unless they are real service source files.
- Do not create or keep stubs for forbidden OFF variants.
- Do not use stubs as replacements for real RTI, ndsgen, KTextTemplate, or Grantlee outputs in ON builds.
- Report every moved, removed, or newly referenced stub/forward declaration.
## Qt link rules
No active target in the merged tree may link Qt5 imported targets.
Search the merged tree for and fix active uses of: `Qt5::`, `find_package(Qt5`, `QT5_`, `Qt5Core`, `Qt5Widgets`, `Qt5Network`.
Regression check specific to this merge: the theirs side touched `cmake/NGLMacros.cmake`
(build-parts `BUILD_SV`/`BUILD_WS`/`BUILD_AAR` options) and `cmake/FindKDReports.cmake`.
After the merge, re-run the search over ALL files touched by the merge, not just the
conflicted hunk; the legacy `QT5_WRAP_UI`/`QT5_ADD_RESOURCES` function-name calls (compat
shim) are allowed and pre-exist on both sides — imported-target links are not.
## Legacy comparison (required validation step)
This step proves the merge did not change code behavior.
For the single conflicted file (and for any other file you edit during conflict
resolution):
1. Read the legacy Qt5 source at the same relative path in
`./qt-migration-legatus/qt5-before/qt5-legatus-legacy`. If the file does not exist
there (pure Qt6 build machinery — expected for `new_docker_build.sh`), say so and
compare against the merge base instead.
2. Produce three diffs: merge-base vs legacy (or: skip with justification), ours vs
merge-base, theirs vs merge-base.
3. Produce the audit diff: merged result vs merge base.
4. Classify every hunk of the audit diff into exactly one category:
- `qt6-api`: mandatory Qt5→Qt6 API adaptation
- `rtiddsgen-api`: generated-API adaptation
- `build`: CMake/docker/test-infra change with no runtime semantics
- `merge-union`: line present because both branches required it
- `semantic-change`: anything else
5. Every `semantic-change` hunk is a failure of this merge unless you can point to the
legacy source line that implements the same behavior. Fix it back to the legacy
semantics (with approved adaptations) or report it as a blocker. Do not silently accept
`semantic-change` hunks. (For `new_docker_build.sh`, `build`/`merge-union` are the
expected categories; a `semantic-change` there means a behavior of one side's script
was silently dropped.)
6. Record the per-file hunk classification (counts per category is sufficient; list every
`semantic-change` hunk explicitly) in the final report.
Additional equivalence checks on the merged tree:
- CMake option union: `BUILD_VIEWER_ONLY`, `BUILD_CODIFICATION`, `BUILD_SV/WS/AAR`, the
`Qt6::SerialPort` IMPORTED target, and the GROUP5/Viewer wiring all exist after the
auto-merge (the 6 auto-merged files are not re-read by default — verify them).
- `LtsDataViewTest` registration: CTest `add_test` present, `QT_QPA_PLATFORM=offscreen`
test property present, auto-exit `QTimer` present in `test.cpp`.
- Docker build script: every target group, apt package, and build option both sides added
is present (see the script checks in the merge recipe); the container-side script still
starts with `set -euo pipefail`.
## Code generation rules
If generated files are required (not expected for this merge):
- reconstruct the real legacy generation flow
- generate into the build tree
- consume from the build tree
- list complete OUTPUT and BYPRODUCTS
- set correct DEPENDS and MAIN_DEPENDENCY where useful
- use deterministic WORKING_DIRECTORY
- use VERBATIM
- wire generated sources with target_sources
- wire generated include dirs with target_include_directories
- ensure compilation depends on generation
- ensure incremental rebuilds trigger on input/template changes
Never commit generated .idl, .h, .hpp, or .cpp outputs. Never consume generated outputs from the source tree. Never fabricate generated outputs.
## Tests
- Both sides' test suites must build and run; this merge adds no new feature tests.
- Keep the theirs-side `LtsDataViewTest` adaptations (auto-exit timer, offscreen
property, unconditional link) — they are what make the viewer-only ctest pass in CI.
- If a conflict resolution changed C++ semantics (it should not), add CTest tests under
`./qt-migration-legatus/qt6-after/qt6-migrated-legatus/tests/` that pin the legacy
behavior, registered with CTest, running with `BUILD_RTI=ON` and `BUILD_GRANTLEE=ON`,
policy-compatible names (`test_<name>.cpp`, …).
- No OFF-variant tests of `BUILD_RTI`/`BUILD_GRANTLEE`. No host-local paths.
## Docker and CI
Authoritative migration Dockerfile:
- `./app/Dockerfile`
Authoritative validation script (single script after the merge; the former
`docker_build.sh` was merged into it and deleted):
- `./qt-migration-legatus/qt6-after/qt6-migrated-legatus/new_docker_build.sh`
Validation container expectations:
- repository root at `/workspace` (the script's documented mount path)
- external dependencies under `/workspace/external` (including `external/rti_connext_dds-7.7.0`, `external/ArcGIS` where the scripts expect them)
- `./rti_license.dat` mounted read-only if RTI requires it
- no developer-local paths
Jenkins CI must be able to discover and run the merged test set. Inspect and minimally
update only if needed:
- `./qt-migration-legatus/ci/Dockerfile.*`
- `./qt-migration-legatus/ci/check_pr_policies.py`
Known pre-existing blocker (do not fix in this merge, record in the final report):
`ci/check_pr_policies.py` currently exits 1 because commits `881d44f4d` (services-side
tip, unsigned) and `36f077bce` (ours tip, unsigned) carry no SSH signature accepted by
`ci/allowed_signers`. Fixing it requires re-signing/history rewrite of source-branch
commits, which is out of scope here.
## Required procedure
1. Read the base prompts. Run `git fetch origin` and verify both remote tips and the merge base (incl. the `7659b167d`→`36f077bce` resync note above).
2. Create/checkout `feature/qt6-migration-basis-modules-merge-viewer-validation` from `origin/feature/qt6-migration-basis-modules-merge` in `./qt-migration-legatus` (working tree must be clean).
3. Re-run the dry-run merge in a throwaway worktree; confirm the conflict list (expected: 1).
4. Run the real merge: `git merge --no-ff origin/feature/lts-viewer-validation-testing-phase` (do not auto-commit; resolve first).
5. Run the deletion-guard sweep and resolve the conflicts one file at a time using the four-version method and the `new_docker_build.sh` merge recipe above.
6. Run the legacy comparison audit (previous section) over every resolved/edited file.
7. Run the regression checks: Qt5 links, removed modules, LogViewer, IDL warnings, stub locations, ON-variant-only CMake, docker script integrity (bash -n, --help, target-set and GROUP4 checks), CMake option union, CTest registration union.
8. Validate in Docker with `BUILD_RTI=ON` and `BUILD_GRANTLEE=ON` — all three runs below.
9. Run CTest in each validated build (executed as part of the docker runs).
10. Check Jenkins/policy compatibility (record the pre-existing signature blocker).
11. Create the merge commit (see Commits).
12. Report factual status.
Do not push. The merge result stays local on `feature/qt6-migration-basis-modules-merge-viewer-validation` until the user says otherwise.
## Required validation
From `./qt-migration-legatus/qt6-after/qt6-migrated-legatus`, run (in order):
```bash
# 1. Full default run (groups 1–3: DDS core, migration_tests, full migrated-service set)
BUILD_RTI=ON BUILD_GRANTLEE=ON ./new_docker_build.sh
# 2. Viewer-only run (validates the new theirs-side feature end to end;
# resolves the "(tbc)" of the branch tip)
BUILD_RTI=ON BUILD_GRANTLEE=ON ./new_docker_build.sh --build-viewer-only
# 3. Coverage run (Lts/Proxies + full Lts/Viewer incl. LtsFileDialog)
BUILD_RTI=ON BUILD_GRANTLEE=ON ./new_docker_build.sh --group4 --group5
```
If a direct clean build is useful, use:
```bash
cmake -S /workspace/qt-migration-legatus/qt6-after/qt6-migrated-legatus -B /workspace/build-merge-viewer-rti-on-grantlee-on -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBUILD_RTI=ON -DBUILD_GRANTLEE=ON
cmake --build /workspace/build-merge-viewer-rti-on-grantlee-on --parallel
ctest --test-dir /workspace/build-merge-viewer-rti-on-grantlee-on --output-on-failure
```
CTest baseline: ctest exits with code 8 when tests are "Not Run". A pre-existing set of
Not Run tests (for example nglcomp_test, NGLToolsQtSmoke, test_nglpdfwidget,
GrantleeParserSmoke, lts_coord_trans_unit_test, utils_test, aes_crypt_test, the
aes/bld suites, and — when `--group4`/`--group5` are OFF — ddsGenericDataTests/
ddsDataTopicTests/ddsFunctionTopicTests and their `_gtest` variants, taboc_serialtest,
LtsDataViewTest, LtsFileDialogTest) belongs to sibling targets or OFF groups outside
the run's target list and is not a failure. Treat only `***Failed` entries as failures.
Do not widen this exception to skip real failures, and do not add missing sibling targets
to fix the exit code. In the `--build-viewer-only` run, `LtsDataViewTest` (and
`LtsFileDialogTest` where built) MUST run and pass — if it does not, that is a merge
regression: fix it or report it as a blocker. If a previously passing test becomes Not
Run or Failed after the merge, that is a merge regression: fix it or report it as a
blocker.
Do not run or validate OFF variants of `BUILD_RTI`/`BUILD_GRANTLEE`.
## Commits
- Single author: the user's git identity. The user is the only author; do not add any co-author, co-authored-by, or bot attribution lines of any kind.
- Commit message: maximum 2 lines (one subject line plus at most one short body line), no blank-line separators, no extra metadata.
- Merge commit subject example (2 lines max):
`Merge feature/lts-viewer-validation-testing-phase into feature/qt6-migration-basis-modules-merge`
body line: `Resolves 1 conflict (new_docker_build.sh) keeping viewer-only + codification options; validates with BUILD_RTI=ON BUILD_GRANTLEE=ON.`
- If a conflict resolution requires an additional fix commit on top of the merge commit, the same 2-line / single-author rules apply.
- Follow `./prompts/commit-policy.prompt.md` for repository mapping and pre-commit checks. If it requires signed commits and signing is not configured in this repository context, stop and report the exact reason instead of committing unsigned.
## Success criteria
Success requires:
- `feature/qt6-migration-basis-modules-merge-viewer-validation` contains a merge commit with both parents `origin/feature/qt6-migration-basis-modules-merge` (or its verified successor tip) and `origin/feature/lts-viewer-validation-testing-phase` (or its verified successor tip)
- the single conflicted file (`new_docker_build.sh`) resolved with the four-version method + merge recipe; resolution evidence and the post-resolution script checks recorded
- deletion-guard sweep run and its output recorded
- both branches' functionality preserved: the full migrated-service set, GROUP4/GROUP5 wiring, stub relocation, and docker-script unification from the ours side; `--build-viewer-only`, `BUILD_CODIFICATION`, KDReports detection/`FindKDReports.cmake` rework, build-parts wiring, GROUP5 test targets, and the `LtsDataViewTest` adaptations from the theirs side
- legacy comparison audit done for every resolved file; zero unexplained `semantic-change` hunks
- configure, build, and CTest pass with `BUILD_RTI=ON` and `BUILD_GRANTLEE=ON` in all three validation runs
- `new_docker_build.sh` runs the merged test set and fails on test failure; `--build-viewer-only` builds the Viewer targets and passes its ctest (incl. `LtsDataViewTest`)
- Jenkins/policy discovery accepts the merged test set (or the pre-existing signature blocker is recorded as the only failure)
- no active Qt5 imported target links remain in the merged tree
- generated outputs are build-tree only, freshly produced, never committed or consumed from the source tree
- no fake generated files, dummy files, mocks, placeholders, or stubbed generated outputs
- required stubs/forward declarations only in allowed directories; `docker_build.sh` stays deleted
- removed modules remain removed; LogViewer preserved
- no OFF-variant logic, tests, or stubs introduced for `BUILD_RTI`/`BUILD_GRANTLEE`
- no push performed
## If blocked
Do not fake success. Report:
- failing command
- key error output
- affected file/branch
- category: project, path, merge, CMake, Qt API, codegen, Docker, RTI/license, Grantlee/KTextTemplate, KDReports, test, CTest, Jenkins CI, stub relocation, or environment
- which side (ours/theirs) the problematic hunk came from
- what was resolved safely
- what remains blocked
- whether stale artifacts were ruled out
- whether generated files were involved
- exact missing files, targets, or generator step
- whether tests and CTest integration succeeded
- whether Docker validation and Jenkins discovery succeeded
- the legacy comparison status for the unresolved files
## Final report
Keep it short. Include:
- status: validated, partially validated, or blocked
- merge commit hash, both parents, branch name
- per-conflicted-file resolution: file, method (union / four-version semantic / merge recipe), and the one-line reason
- `new_docker_build.sh` merge evidence: ours-side target-set check (GROUP3 intact, GROUP4 DDS tests present), theirs-side feature list (viewer-only, codification, build-parts, KDReports, prebuilt image name), and the post-resolution script checks
- deletion-guard sweep result (full KEEP / deleted-on-both-sides list)
- legacy comparison audit summary: per-file hunk counts by category, and every `semantic-change` hunk with its justification or fix
- files changed beyond the conflicted set (expected: none beyond the auto-merged theirs-side files)
- CTest registration union check result (incl. `LtsDataViewTest` property/auto-exit)
- Docker and Jenkins CI changes (incl. the recorded pre-existing signature blocker)
- Qt5 references removed or remaining
- confirmation that removed modules were not restored, LogViewer was preserved, and `docker_build.sh` stayed deleted
- exact validation commands and results for all three runs
- remaining blockers or risks