- Add .github/scripts/ci-validate-upgrade.sh (single source for Docker validation)
- validate-on-os: run script inside container instead of inline bash -c
- Avoids nested quoting and glob/exit behavior differences across shells
- Same script can be run locally: bash .github/scripts/ci-validate-upgrade.sh
- stable branch has no plogical/versionFetcher.py; CI #23 failed on smoke-key-files and validate-python
- validate-python: run only if hashFiles('plogical/versionFetcher.py') != ''
- smoke-key-files and validate-on-os: require only preUpgrade, loader, upgrade.py, install.py; versionFetcher optional
- CI: when upgrade_modules/ exists, check all 12 modules and grep Branch_Check in modules
- CI: syntax-check upgrade_modules/*.sh in validate-shell and validate-on-os
- Loader: BRANCH_FOR_MODULES default 'stable' so one-liner works without -b
- Loader: show both stable and -b v2.5.5-dev in root-check message