41 KiB
Strict Qt6 Migration Prompt: Merge of feature/migrate-lts-projects-and-application (+ contained feature/migrate-lts-tools-d-and-l), cherry-pick 5501d1e50, and feature/qt6-migration-basis-modules-merge-viewer-validation
This prompt is binding task context. Keep changes minimal, scoped, and reproducible.
The only allowed outcome is a branch
feature/qt6-migration-projects-app-tools-viewer-validation that contains, in order:
- a cherry-pick commit of
5501d1e50(origin/bugfix/dds-fix-pre-existing-errors), and - a merge commit with parents
origin/feature/migrate-lts-projects-and-applicationandorigin/feature/qt6-migration-basis-modules-merge-viewer-validation
— such that the result contains the full work of feature/migrate-lts-tools-d-and-l,
feature/migrate-lts-projects-and-application, the cherry-picked commit, and the
viewer-validation branch, 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, no co-author/co-authored-by/bot attribution lines (see "Commits")
Task
Produce the result branch from three inputs (the tools branch is already contained — see below — so exactly two operations are performed: one cherry-pick, one merge):
- ours (merge target base):
feature/migrate-lts-projects-and-applicationremote tip at prompt writing (2026-09-27):b18844a20("Document GROUP10 validation results", Torsten Wierschin, 2026-09-25) - tools branch (verification only — already contained):
feature/migrate-lts-tools-d-and-lremote tip at prompt writing:2b8f3f02c("Add Group 9 (R,S,T,V,W) LTS Tools migration support", 2026-09-24). Verified 2026-09-27:git merge-base origin/feature/migrate-lts-tools-d-and-l origin/feature/migrate-lts-projects-and-applicationequals the tools tip2b8f3f02c— the tools branch is an ancestor of the projects tip. No merge is needed; the procedure below only verifies the containment. - cherry-pick:
5501d1e50("Qt6 Migration: Update stub headers to include generated files", Torsten Wierschin, 2026-09-22) — the tip oforigin/bugfix/dds-fix-pre-existing-errors(single commit after its fork point0997dcba7) - theirs (branch to merge in):
feature/qt6-migration-basis-modules-merge-viewer-validationremote tip at prompt writing:9c1ac7cbe("Merge feature/lts-viewer-validation-testing-phase into feature/qt6-migration-basis-modules-merge", berrux_dev, 2026-09-27) - merge base (projects × viewer-validation):
fd3e5e838("Add --build-viewer-only option to skip Groups 1-4 and build Viewer targets only", 2026-09-23) - result branch:
feature/qt6-migration-projects-app-tools-viewer-validation(does not exist yet; create it fromorigin/feature/migrate-lts-projects-and-application)
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:
git fetch originin./qt-migration-legatus.- Verify all four refs still match the hashes above:
git rev-parse origin/feature/migrate-lts-projects-and-application→b18844a20git rev-parse origin/feature/migrate-lts-tools-d-and-l→2b8f3f02cgit rev-parse origin/bugfix/dds-fix-pre-existing-errors→5501d1e50git rev-parse origin/feature/qt6-migration-basis-modules-merge-viewer-validation→9c1ac7cbe
- Re-verify the tools containment:
git merge-base --is-ancestor origin/feature/migrate-lts-tools-d-and-l origin/feature/migrate-lts-projects-and-applicationmust exit 0. If any tip moved or the containment check fails, recompute the merge base, re-run the dry run (step 3 of the procedure), and record the new state before touching anything. - Verify the working tree of
./qt-migration-legatusis clean (git status --short). Do not overwrite uncommitted user changes; if they block safe work, report the blocker. (Known state at prompt writing: the main worktree is onfeature/qt6-migration-basis-modules-merge-viewer-validationat9c1ac7cbe, clean.)
What each side contains
Understand all three inputs before resolving anything. The result must keep the work of ALL of them.
projects side (ours, 8 commits after the merge base, 47 files):
9f0076a19— LTS Tools Group 6 (D&L directories) Qt6 migration:GROUP6_TARGETS(dbAdministration, SettingsRemover, dbUpdate, tDataSampleGenerator, tDataSampleReceiver, DateTimeSyncer, ddsview, displayPanelSimulator, LicenceEditor, localDomainFinder, LogViewer)db8adbfe3— Tools Group 7 (A,B,C,E,I directories)1e1a3e6f3— Group 8 (J,M,N,P,Q) build script support + CTest infrastructure (34 files undertests/:tests/CMakeLists.txt+test_<Tool>.cppregistrations)2b8f3f02c— Tools Group 9 (R,S,T,V,W) — this is the tip offeature/migrate-lts-tools-d-and-l(the "alle Tools" branch); Groups 6–9 together are the complete LTS Tools migration168d03866— GROUP10 (LTS Projects: 9 project plugin targets — ProjectGuezPlugin, ProjectQatarMOUTPlugin, ProjectQatarPlugin, ProjectLegatusPlugin, ProjectDemoPlugin, ProjectL400P2Plugin, ProjectComMasterPlugin, ProjectAhtcPlugin, ProjectEtsPlugin) and GROUP11 (LTS Application: OperatorApplication, thp_viewer, aarApp)97a9992ce/4d6bef5fa— GROUP7–11 default initializations + Docker env passthrough (-e BUILD_GROUP6..11)b18844a20—GROUP10_VALIDATION_RESULTS.md: GROUP10 validated withBUILD_RTI=ON BUILD_GRANTLEE=ON BUILD_ARCGIS=ON; GROUP11 blocked by a pre-existingsvcPdmClient(Services/ProjectDataManagement) Qt6 MOC failure (base state, see "Tests")- touched
Lts/Tools/{ConfigX,DBAdministration,DBUpdate,ProjectSettingsEditor}sources (Qt6 fixes) andnew_docker_build.sh(+186/−1: Groups 6–11 usage/env/arg-parsing, GROUP6–11 target arrays,run_build_groupcalls, log_group lines for Groups 7–11 — Group 6 has no log_group line on this side)
viewer-validation side (theirs, 52 commits after the merge base, 1313 files):
- the full
feature/qt6-migration-basis-modules-mergework: complete Qt6/rtiddsgen 7.7 migration of residual Lts services/proxies/plugins (incl. the ProjectDataManagement service sources —a41001955), codegen fixes, Qt6::SerialPort IMPORTED target, GROUP3 full migrated-service target set (~200 targets incl. per-service tests and the PDM blocksvcPdmCommon/Client/Server,svcProjectDataManagement,pdmTests) - docker-script unification:
new_docker_build.shsingle validation script (docker_build.shdeleted and must stay deleted), consolidated single GROUP4 array (DDS testsddsGenericDataTests/ddsDataTopicTests/ddsFunctionTopicTests+ Lts/Proxies) and single Group-4run_build_groupcall,--cmake_build_flagsoption, prebuilt imagelegatus-qt6-prebuilt:latest - viewer-validation features:
--build-viewer-only,--codification, KDReports-qt6 detection (cmake/FindKDReports.cmake), build-partsBUILD_SV/WS/AAR,LtsDataViewTest/LtsFileDialogTestauto-exit adaptations (CIQTimer1000 ms,QT_QPA_PLATFORM=offscreen,TIMEOUT 30) - stub relocation (
4223ca2ff): theinclude/*/*_dtc.hstub headers were moved fromqt6-after/qt6-migrated-legatus/include/toqt6-after/qt6-migrated-legatus/.forward-declarations/include/— 111 files deleted from the old location;BUILD_STATUS_REPORT.mdadded - follow-up fixes:
ci/allowed_signersprincipal format (e748e82c8), record_replayfromQVariant+ PPM MOC exclusion (36f077bce), viewer-validation merge (c664611b8+9c1ac7cbe)
cherry-pick 5501d1e50 (1 commit, 40 files): updates the 38 stub headers
(include/*/*_dtc.h + pdm_enums.hpp + ppm.hpp + include/ParticipantManagement/ ppm_types.h) so they include the generated files from build4/Lts/Proxies/*, updates
the real service source Lts/Services/ParticipantManagement/ppm_types.h, and adds
BUILD_STATUS_REPORT.md. Note on the service source: the viewer-validation side made
the same change to it (both sides converge to byte-identical content at their tips —
verified 2026-09-27), so it auto-merges cleanly (it is not among the dry-run conflicts).
Supersession fact (verified 2026-09-27): the viewer-validation side already carries
the same change as 4223ca2ff (same author, same subject) applied to the relocated
.forward-declarations/include/ location: for include/FileManagement/flm_dtc.h and
include/ParticipantManagement/ppm_types.h the patches are byte-identical except the
path prefix, and the final content of ppm_types.h at the theirs tip equals the
content produced by 5501d1e50. BUILD_STATUS_REPORT.md is byte-identical between
5501d1e50 and the theirs tip. See "Cherry-pick handling".
Cherry-pick handling (5501d1e50) — required sequence
The cherry-pick must exist as a commit in the result history (do not merely document
it as superseded and skip it). Perform it FIRST, onto the clean projects base, where it
applies cleanly (verified 2026-09-27: git cherry-pick 5501d1e50 onto b18844a20
succeeds without conflicts, producing commit e07bc9a91 in the test run):
git cherry-pick -n -x 5501d1e50(no conflicts expected; if any, stop and report — it applied cleanly on 2026-09-27)- Commit it signed, keeping the original author (Torsten Wierschin — the author of
the work;
git cherry-pickalready sets the author from the source commit; do not reset it), with the original subject and body minus theCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>line (repository policy: no co-author/co-authored-by/bot attribution lines), and with the cherry-pick reference line ((cherry picked from commit 5501d1e50...)) kept. Max 2 lines of your own wording do not apply to the body of a cherry-picked message — the original body is preserved verbatim (minus the bot line) so the change stays attributable. - Only then start the merge (step 4 of the procedure).
Consequence of this order (verified by dry run 2026-09-27): the subsequent merge produces 24 modify/delete conflicts on the old-location stub files (modified by the cherry-pick on ours side, deleted by the relocation on theirs side). Their resolution is mechanical and safe — keep the deletion — because the updated content already exists at the new location. Before resolving, verify that per file (record any MISMATCH as a blocker):
MB=qt6-after/qt6-migrated-legatus
for f in $(git diff --name-only --diff-filter=U | grep '^qt6-after/qt6-migrated-legatus/include/'); do
rel=${f#$MB/include/}
git show origin/feature/qt6-migration-basis-modules-merge-viewer-validation:"$MB/.forward-declarations/include/$rel" > /tmp/newloc 2>/dev/null || { echo "MISSING-NEW-LOC: $f"; continue; }
git show 5501d1e50:"$f" > /tmp/oldloc
cmp -s /tmp/oldloc /tmp/newloc || echo "MISMATCH: $f"
done
Then resolve each with git rm <file> (keep deletion; the .forward-declarations/
copy is the canonical one). The 24 expected files (dry run 2026-09-27):
{AlarmManagement/alm, AreaEffectSimulation/aes, AssetManagement/asm, AudioVideoManagement/avm, Buildings/bld, CentralEffectSimulation/ces, ComponentMonitor/cmo, Core/core, EffectShowClient/esc, EffectShowManagement/esm, Evaluations/evl, ExerciseManagement/exm, GuezIedManagement/gim, GuezNasat/gna, NotificationManagement/nom, OcSituationServer/oss, ScenarioManagement/scm, SituationReplay/srp, SituationReplayManagement/srm, Skeleton/skl, SoundManagement/som, TrainingAreaBase/tab, TrainingAreaBaseOC/taboc}_dtc.h plus
ProjectDataManagement/pdm_enums.hpp.
The other 14 cherry-pick stub files ({CodificationManagement/cod, ExerciseEventManagement/eem, FileManagement/flm, InfrastructureManagement/ism, MeteoDataManagement/mdm, MarkerManagement/mrk, Messaging/msg, OperatorManagement/opm, PresentationManagement/pre, ReportManagement/rep, TargetManagement/tgt, WarehouseGuez/whg}_dtc.h + ParticipantManagement/ppm.hpp +
ParticipantManagement/ppm_types.h) were not relocated by the theirs side, so they
stay at the old include/ location with the cherry-pick's update — expected outcome,
do not "fix" it (the old include/ tree legitimately remains in the tree; relocated
copies also exist at the new location for them — pre-existing pattern on the theirs
side).
Known conflict surface (dry run 2026-09-27)
A dry run of the full sequence (cherry-pick onto b18844a20, then
git merge --no-commit --no-ff origin/feature/qt6-migration-basis-modules-merge-viewer-validation
in a throwaway worktree) found:
- 1 content conflict (UU):
qt6-after/qt6-migrated-legatus/new_docker_build.sh(3 conflict hunks — recipe below) - 24 modify/delete conflicts (UD): the old-location stub files listed above
- auto-merged (verified in the dry run, keep as-is unless a check below fails):
new_docker_build.shall other regions:GROUP3_TARGETS= theirs' expanded 179-target service set (incl. the PDM block), single consolidatedGROUP4_TARGETS(DDS tests + Proxies), the four-way GROUP5 conditional (BUILD_ARCGIS × BUILD_VIEWER_ONLY), the GROUP6–11 arrays +run_build_groupcalls for Groups 1,4,2,3,5,6,7,8,9,10,11, theBUILD_GROUP6..11container defaults (1–3 ON, 4–11 OFF), the-e BUILD_GROUP1..11docker passthrough, and theBUILD_VIEWER_ONLYswitch blockqt6-after/qt6-migrated-legatus/tests/CMakeLists.txt(both sides changed it: theirs' test additions + ours' 34 tool-test registrations — verify after the merge that both sets of registrations are present)BUILD_STATUS_REPORT.md(byte-identical on both sides → no conflict)Lts/Services/ParticipantManagement/ppm_types.h(cherry-pick's change on ours side converges to byte-identical content with the theirs-side change → no conflict; verify after the merge that the merged content equals the content at5501d1e50)- all 1313 theirs-side files (services/proxies/viewer rewrites,
.forward-declarations/tree,BUILD_STATUS_REPORT.md)
Re-run the dry run after the fetch and treat its output as authoritative; the list above is the expected starting point. If the dry run shows additional conflicts, resolve them with the four-version method (see below) and record them in the final report.
Conflict resolution rules
These rules exist to guarantee: the merged tree keeps all three inputs' 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.shthere is no legacy counterpart — pure Qt6 build machinery — so use the merge-base version as the third reference). - Never take
oursortheirswholesale 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. - 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 content conflict) — required merge recipe, 3 hunks:
- Usage text (~line 48): keep OURS' six
--group6 … --group11usage lines AND THEIRS' corrected--build-viewer-onlyline (Build only Viewer module targets (skip Groups 1-4, implies --group5 --codification; ctest runs)) — do not keep ours' stale--build-viewer-onlyline (… implies --group5 --no-ctest), which contradicts the handler (it setsRUN_CTEST=ON; the corrected theirs line was already validated in the viewer-validation merge). exportline (~line 898): union of both lists, i.e. exactly:export BUILD_ALL BUILD_RTI BUILD_GRANTLEE BUILD_ARCGIS BUILD_CODIFICATION BUILD_GROUP1 BUILD_GROUP2 BUILD_GROUP3 BUILD_GROUP4 BUILD_GROUP5 BUILD_GROUP6 BUILD_GROUP7 BUILD_GROUP8 BUILD_GROUP9 BUILD_GROUP10 BUILD_GROUP11 BUILD_VIEWER_ONLY RUN_CTEST TESTS_ONLY INTEGRATION_TEST USE_PREBUILT_IMAGE BUILD_PREBUILT_IMAGE DELETE_PREBUILT_IMAGE DOCKER_IMAGE CMAKE_BUILD_FLAGSlog_groupbanner lines (~line 1053): keep THEIRS' lines for Groups 1, 2, 3 (the correctedBuild Group 3 (application + service targets)label), 4 (Build Group 4 (DDS tests + Proxies)) and 5 (Build Group 5 (Viewer)), plus OURS' lines for Groups 7, 8, 9, 10, 11, in that order. Optionally (text-only, non-behavioral) add the missing ours-side Group 6 linelog_group "Build Group 6 (LTS Tools)" "$BUILD_GROUP6"so every group with arun_build_groupcall has a banner line — record if added.
Post-resolution script checks (record in the final report):
bash -non the host script and on the extracted container-side script--helprenders and lists--group6..--group11,--build-viewer-only,--codification,--cmake_build_flags; an unknown option is still rejected- target-set check:
GROUP3_TARGETS= 179 targets and still contains the PDM block (svcPdmCommon/Client/Server,svcProjectDataManagement,pdmTests);GROUP4_TARGETSsingle array containingddsGenericDataTests,ddsDataTopicTests,ddsFunctionTopicTests; GROUP5 four-way conditional intact; GROUP6–11 arrays,run_build_groupcalls, container defaults and-epassthrough all present - the
BUILD_VIEWER_ONLYblock still switches Groups 1–4 OFF / Group 5 ON before therun_build_groupcalls (Groups 6–11 remain OFF by default in that mode) - the prebuilt image name is
legatus-qt6-prebuilt:latesteverywhere (no second name); no reference todocker_build.shremains; the container-side script still starts withset -euo pipefail
CMake conflicts: none in the dry run. If the re-run shows new CMake conflicts (e.g. in
tests/CMakeLists.txt): 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 (theirs) side by side with the GROUP6–11 tool-test
registrations (ours). After resolving, verify with a fresh configure that both sides'
targets/options exist.
Mandatory build variants
Only these variants are valid:
BUILD_RTI=ONBUILD_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 them. Validation must useBUILD_RTI=ONandBUILD_GRANTLEE=ON. BUILD_ARCGIS: the projects side validated GROUP10/GROUP11 withBUILD_ARCGIS=ON(GROUP10_VALIDATION_RESULTS.md) andexternal/ArcGIS/MapsSDK_Qt_300.0.0exists at the pipeline root (mounted to the container's/workspace/external). UseBUILD_ARCGIS=ONin the coverage run that builds GROUP10/GROUP11 (run 2 below) and leave it at its default OFF in the other runs. This is not an RTI/Grantlee OFF variant; the prohibition above does not apply.- The viewer-validation side options
BUILD_VIEWER_ONLY(default OFF),BUILD_CODIFICATION(default OFF),BUILD_SV/BUILD_WS/BUILD_AAR(default ON) and the projects sideBUILD_GROUP6..11(default OFF) are design features: 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 any side.
Preserve LogViewer reinsert from commit 1fa789767 ("Added LogViewer again"): do not
remove, disable, or break LogViewer integration. Note: LogViewer is a GROUP6 target
on the projects side — it must survive in GROUP6_TARGETS after the merge.
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 all 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, the consolidated GROUP4 array, the GROUP6–11 groups, and the viewer-only/
codification options all survive the script merge (see the merge recipe above).
Preserve the stub relocation decision: the .forward-declarations/ tree is the
canonical location for relocated stubs; the 24 old-location stubs deleted by the
viewer-validation side stay deleted (see "Cherry-pick handling"); the 14 non-relocated
cherry-picked stubs stay at the old include/ location.
Preserve the projects side artifacts: the 34 tests/* tool-test files and their
tests/CMakeLists.txt registrations, GROUP10_VALIDATION_RESULTS.md, and the
Lts/Tools/{ConfigX,DBAdministration,DBUpdate,ProjectSettingsEditor} Qt6 fixes.
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.
-
This merge resolves 24 stub files to deletion (keep-theirs) and leaves 14 updated stubs at the old
include/location (pre-existing pattern) — both are the intended outcomes; see "Cherry-pick handling".
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 projects side touched
tests/CMakeLists.txt, Lts/Tools/* sources and new_docker_build.sh; the
viewer-validation side touched cmake infrastructure (cmake/NGLMacros.cmake,
cmake/FindKDReports.cmake, root CMakeLists.txt). After the merge, re-run the search
over ALL files touched by the merge (auto-merged files included), not just the
conflicted ones; 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 every file you edit during conflict resolution (expected:
new_docker_build.sh only — the 24 stub deletions are covered by the per-file
content check in "Cherry-pick handling"):
- 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 fornew_docker_build.sh), say so and compare against the merge base instead. - Produce three diffs: merge-base vs legacy (or: skip with justification), ours vs merge-base, theirs vs merge-base.
- Produce the audit diff: merged result vs merge base.
- Classify every hunk of the audit diff into exactly one category:
qt6-api: mandatory Qt5→Qt6 API adaptationrtiddsgen-api: generated-API adaptationbuild: CMake/docker/test-infra change with no runtime semanticsmerge-union: line present because both branches required itsemantic-change: anything else
- Every
semantic-changehunk 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 acceptsemantic-changehunks. (Fornew_docker_build.sh,build/merge-unionare the expected categories; asemantic-changethere means a behavior of one side's script was silently dropped.) - Record the per-file hunk classification (counts per category is sufficient; list
every
semantic-changehunk explicitly) in the final report.
Additional equivalence checks on the merged tree:
- CMake option union:
BUILD_VIEWER_ONLY,BUILD_CODIFICATION,BUILD_SV/WS/AAR,BUILD_GROUP6..11, theQt6::SerialPortIMPORTED target, GROUP5/Viewer wiring, and GROUP6–11 wiring all exist after the auto-merge (auto-merged files are not re-read by default — verify them). - CTest registration union:
tests/CMakeLists.txtcontains BOTH the theirs-side registrations (e.g.LtsDataViewTest,LtsFileDialogTest, service tests) AND the ours-side 34 tool-test registrations. LtsDataViewTestregistration:add_testpresent,QT_QPA_PLATFORM=offscreentest property present, auto-exitQTimerpresent intest.cpp.BUILD_STATUS_REPORT.mdandGROUP10_VALIDATION_RESULTS.mdboth present in the merged tree.- 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
- All three sides' test suites must build and run; this merge adds no new feature tests of its own.
- The ours-side 34
tests/test_<Tool>.cpptool tests (Groups 6–9) must be built and registered in the mergedtests/CMakeLists.txt; run them in the coverage run (run 2 below). If a tool test requires external hardware/services, classify Not Run/Timeout as base state (record the reason) — do not make them pass by weakening the test. - Keep the theirs-side
LtsDataViewTestadaptations (auto-exit timer, offscreen property, unconditional link) — they are what make the viewer-only ctest pass in CI. - Known base-state blocker (GROUP11): the projects side documents
(
GROUP10_VALIDATION_RESULTS.md) that GROUP11 (OperatorApplication, thp_viewer, aarApp) is blocked by a pre-existingsvcPdmClientQt6 MOC failure. The viewer-validation side completed the residual Lts service migration (a41001955, incl. ProjectDataManagement service sources) and the PPM MOC exclusion (36f077bce), so the blocker may be RESOLVED in the merged tree. In run 2, build GROUP11 and record which: (a)svcPdmClientnow builds — blocker cleared by the theirs-side service work (success, document it), or (b) it still fails with the same MOC error — base-state blocker, record it in the final report as remaining (do not fix it in this merge). - 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 withBUILD_RTI=ONandBUILD_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; 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(includingexternal/rti_connext_dds-7.7.0,external/ArcGISwhere the scripts expect them) ./rti_license.datmounted read-only if RTI requires it- no developer-local paths
- the prebuilt image
legatus-qt6-prebuilt:latestexists (6.23 GB at prompt writing) and is required for KDReports-qt6 (runs 2/3 use--use-prebuilt-image --docker-image legatus-qt6-prebuilt:latest; run 1 may use the base image)
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 a series of ancestor commits (33
unsigned commits on feature/qt6-migration-basis-modules-merge-viewer-validation since
merge base ed9fc51e7, e.g. 36f077bce, b6a97c39e, fd3e5e838; plus the
projects-side commits b18844a20, 4d6bef5fa, … which carry no SSH signature
accepted by ci/allowed_signers) fail the signature gate. Fixing it requires
re-signing/history rewrite of source-branch commits, which is out of scope here. The
new commits created by THIS task must be signed and verify Good.
Required procedure
- Read the base prompts. Run
git fetch originand verify the four ref hashes, the tools containment check, and the merge base (step 2 of "Branches and trees"). - Create/checkout
feature/qt6-migration-projects-app-tools-viewer-validationfromorigin/feature/migrate-lts-projects-and-applicationin./qt-migration-legatus(working tree must be clean). - Re-run the dry run of the full sequence in a throwaway worktree
(cherry-pick
5501d1e50, thengit merge --no-commit --no-ff origin/feature/qt6-migration-basis-modules-merge-viewer-validation); confirm the conflict list (expected: 1 UU content conflict + 24 UD modify/delete conflicts). - Cherry-pick
5501d1e50(see "Cherry-pick handling", steps 1–2). - Run the real merge:
git merge --no-ff origin/feature/qt6-migration-basis-modules-merge-viewer-validation(do not auto-commit; resolve first). - Run the 24-file stub content check, resolve the 24 UD conflicts as deletions, and
resolve the
new_docker_build.shcontent conflict hunk by hunk using the four- version method and the merge recipe above. - Run the legacy comparison audit (previous section) over every resolved/edited file.
- Run the regression checks: Qt5 links, removed modules, LogViewer (incl. the GROUP6
entry), IDL warnings, stub locations, ON-variant-only CMake, docker script
integrity (bash -n, --help, target-set and GROUP4/GROUP6–11 checks), CMake option
union, CTest registration union (both sides' registrations in
tests/CMakeLists.txt). - Validate in Docker with
BUILD_RTI=ONandBUILD_GRANTLEE=ON— all three runs below (run 2 additionally withBUILD_ARCGIS=ON). - Run CTest in each validated build (executed as part of the docker runs).
- Check Jenkins/policy compatibility (record the pre-existing signature blocker).
- Create the merge commit (see Commits).
- Report factual status.
Do not push. The result stays local on
feature/qt6-migration-projects-app-tools-viewer-validation until the user says
otherwise.
Required validation
From ./qt-migration-legatus/qt6-after/qt6-migrated-legatus, run (in order):
# 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. Coverage run: Proxies + Viewer + ALL Tools groups (6–9) + Projects (10)
# + Application (11) + codification; ArcGIS ON because the projects side
# validated GROUP10/11 with BUILD_ARCGIS=ON and external/ArcGIS is mounted
BUILD_RTI=ON BUILD_GRANTLEE=ON BUILD_ARCGIS=ON ./new_docker_build.sh \
--use-prebuilt-image --docker-image legatus-qt6-prebuilt:latest \
--group4 --group5 --group6 --group7 --group8 --group9 --group10 --group11 --codification
# 3. Viewer-only run (validates the theirs-side feature end to end)
BUILD_RTI=ON BUILD_GRANTLEE=ON ./new_docker_build.sh --build-viewer-only \
--use-prebuilt-image --docker-image legatus-qt6-prebuilt:latest
If a direct clean build is useful, use:
cmake -S /workspace/qt-migration-legatus/qt6-after/qt6-migrated-legatus -B /workspace/build-projects-tools-viewer-rti-on-grantlee-on -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBUILD_RTI=ON -DBUILD_GRANTLEE=ON
cmake --build /workspace/build-projects-tools-viewer-rti-on-grantlee-on --parallel
ctest --test-dir /workspace/build-projects-tools-viewer-rti-on-grantlee-on --output-on-failure
CTest baseline: ctest exits with code 8 when tests are "Not Run". The pre-existing Not
Run class (duplicate _gtest registrations, sibling targets of OFF groups, hardware-
dependent tests such as taboc_serialtest, bld_bsm_test) is not a failure. In
addition, the following six were documented as base-state first-run failures in the
viewer-validation merge's final report
(./prompts/merge-lts-viewer-validation-into-basis-modules-merge.FINAL-REPORT.md) and
remain base-state here: ddsFunctionTopicTests (deterministic FTS/FTC signal defect),
bld_bsm_test/taboc_serialtest (hardware waits), bld_vwm_test/bld_vwm_xml_test
(manual-test data absent from the repo), LtsFileDialogTest (GUI blocks on DDS init
before the CI auto-exit timer fires). Treat only NEW ***Failed/***Timeout entries
beyond these as merge regressions: fix or report as a blocker.
Mandatory positive checks:
- Run 2: GROUP10 must build (the projects side validated it — regression if it breaks);
GROUP6–9 tool targets must build; the 34 tool tests must at least be registered;
LtsDataViewTestmust run and pass (where built); the GROUP11 outcome must be classified per "Tests". - Run 3:
LtsDataViewTest(andLtsFileDialogTestwhere 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
Two commits are created on the result branch:
- Cherry-pick commit of
5501d1e50(see "Cherry-pick handling"): keeps the original author (Torsten Wierschin — the author of the work), keeps the original subject and body minus theCo-authored-by: Copilotline, and keeps the(cherry picked from commit …)reference line. Signed. - Merge commit: 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. Message: maximum 2 lines (one subject line plus at most one short body line),
no blank-line separators, no extra metadata. Subject example:
Merge feature/qt6-migration-basis-modules-merge-viewer-validation into feature/migrate-lts-projects-and-applicationbody line example:Cherry-picks 5501d1e50 (stub-header updates, superseded by 4223ca2ff relocation); resolves 1 content + 24 modify/delete conflicts; validates BUILD_RTI=ON BUILD_GRANTLEE=ON incl. Tools Groups 6-11.
- The repository has
commit.gpgsign=false: sign every created commit explicitly (git commit -S,git cherry-pick -Sor the two-step form from "Cherry-pick handling"). Follow./prompts/commit-policy.prompt.mdfor 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. - If a conflict resolution requires an additional fix commit, the same 2-line / single-author (user) / no-attribution / signed rules apply.
Success criteria
Success requires:
feature/qt6-migration-projects-app-tools-viewer-validationcontains the cherry-pick commit of5501d1e50(signed, original author, no bot attribution line) and a merge commit (signed, user as sole author) with parentsorigin/feature/migrate-lts-projects-and-application(or its verified successor tip) andorigin/feature/qt6-migration-basis-modules-merge-viewer-validation(or its verified successor tip)- the tools containment is re-verified (
2b8f3f02cis an ancestor of the projects base) and recorded new_docker_build.shresolved hunk by hunk with the merge recipe; resolution evidence and the post-resolution script checks recorded- the 24 stub modify/delete conflicts resolved as deletions after the per-file content check (no MISMATCH); the 14 non-relocated cherry-picked stubs documented as staying at the old location
- both sides' functionality preserved: GROUP6–11 target sets, the 34 tool-test
registrations,
GROUP10_VALIDATION_RESULTS.md, and theLts/Toolsfixes from the projects side; the full migrated-service set, GROUP3 service target set, consolidated GROUP4 array, docker-script unification,--build-viewer-only,--codification, KDReports wiring, and theLtsDataViewTest/LtsFileDialogTestadaptations from the viewer-validation side - legacy comparison audit done for every resolved file; zero unexplained
semantic-changehunks - configure, build, and CTest pass with
BUILD_RTI=ONandBUILD_GRANTLEE=ONin all three validation runs (GROUP11 classified per "Tests"; the six documented base-state first-run failures may remain, all others must pass) - Jenkins/policy discovery accepts the merged test set (or the pre-existing signature blocker is recorded as the only failure); the new commits verify signed Good
- 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.shstays deleted - removed modules remain removed; LogViewer preserved (incl. the GROUP6 target)
- 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, cherry-pick, CMake, Qt API, codegen, Docker, RTI/license, Grantlee/KTextTemplate, KDReports, ArcGIS, test, CTest, Jenkins CI, stub relocation, or environment
- which side (ours/theirs/cherry-pick) 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
- both commit hashes (cherry-pick, merge), the merge's two parents, the branch name
- tools containment re-verification result
- cherry-pick evidence: clean apply on the projects base, per-file content check output (24/24 MATCH expected), the 14 non-relocated files documented
- per-conflicted-file resolution: file, method (union / four-version semantic / merge recipe / keep-deletion), and the one-line reason
new_docker_build.shmerge evidence: ours-side additions kept (Groups 6–11 usage/ arrays/calls/passthrough), theirs-side additions kept (viewer-only, codification, build-parts, prebuilt image name,--cmake_build_flags, corrected usage line), the three resolved hunks, and the post-resolution script checks- legacy comparison audit summary: per-file hunk counts by category, and every
semantic-changehunk with its justification or fix - files changed beyond the conflicted set (expected: none — the 24 stub deletions and the auto-merged theirs-side files excepted)
- CTest registration union check result (both sides' registrations in
tests/CMakeLists.txt;LtsDataViewTestproperty/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 (incl.
the GROUP6 target), and
docker_build.shstayed deleted - GROUP11 classification (svcPdmClient blocker cleared by the theirs-side service work, or still base-state)
- exact validation commands and results for all three runs
- remaining blockers or risks
Summary
- Write Summary for all migrated and merge branche like this example (MIGRATION_SUMMARY_Z_AND_PROXIES.md)