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

28 KiB
Raw Permalink Blame History

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:

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.

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):

# 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:

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