You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Step D: add the Puppet 9 profile and wire the major through the pipeline
profiles/puppet_profiles.json gains 9-latest-maintained: Puppet 9.0.0 (the
deliberate starting point per the 2026-08-21 product decision, not "newest
9.x"), facter 4.21.0, Ruby 3.4, bundler 2.5.22, private gem source. No
9-previous-maintained — 9.0.0 is the first 9.x, so there is nothing previous
to pin until 9.1 ships.
Plumbing so the two majors stay independent (design §3, §5):
- classify_module_result.py resolves and stamps puppet_major from the run's
profile. update_ledger.py has keyed on that field since Step B but nothing
ever set it, so every row silently landed in puppet_majors["8"].
- detect_changes.py takes the major from PUPPET_MAJOR instead of a hardcoded
DEFAULT_MAJOR, so each caller's leanness is computed against its own
ledger slice.
- prepare-test-matrix exposes it as a puppet-major input; both callers set it
explicitly ('8' / '9') rather than leaning on the default.
- compatibility-runner-puppet9.yml gets its nightly cron (03:00 UTC, an hour
after the Puppet 8 caller — runner contention only; the shared
compat-ledger-* group already serializes the one racing step).
build_matrix.rb needed no change despite the design listing it: a caller
selects its major via the profile it passes to run-module-test, and per-major
leanness arrives pre-resolved in INCLUDE_IDS, so matrix rows are
major-agnostic. Added a comment saying so.
Facter is pinned by assumption, not lookup: 4.21.0 is the newest build known
to exist on the private source and satisfies Puppet 9.0.0's declared
facter >= 4.3.0, < 5. Without an API key here it couldn't be confirmed that
the private source pairs a different facter with 9.0.0. bootstrap.rb pins
facter exactly, so a wrong pin fails loudly at bundle install in the gate
dispatch.
Verified locally against the real ledger, no CI needed:
- PUPPET_MAJOR=9 includes all 75 modules (never-tested); PUPPET_MAJOR=8
includes 0 (all green and fresh).
- After merging a synthetic Puppet 9 run (one clean, one failing) into a
ledger copy: 74 included on 9 (73 never-tested + 1 unit-failing), still 0
on 8, with puppet-telegraf sitting at unit+acceptance on 8 and unit-failing
on 9 in the same row. That is §5's independence requirement end to end.
- render_status_dashboard.py rendered both majors' column pairs off that
ledger with no changes needed; build_matrix.rb built 74 unit rows from the
major-9 include list.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: AGENTS.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -38,7 +38,7 @@ must **not** be pre-emptively marked incompatible.
38
38
-`config/modules.schema.json`: schema for module config validation.
39
39
-`config/beaker/setfiles/`: Beaker host definition files (one per acceptance target, e.g. `el9.yml`).
40
40
-`scripts/validate_modules_config.py`: local schema validation helper.
41
-
-`.github/workflows/compatibility-runner-puppet8.yml`: CI pipeline and matrix execution for Puppet 8 (a `compatibility-runner-puppet9.yml` sibling is added in Step D of `docs/puppet-core-9-dual-major-support.md`). Shared prepare/publish logic lives in `.github/actions/prepare-test-matrix` and `.github/actions/publish-compatibility-results` — see that doc's §12 for why these are composite actions, not a reusable workflow.
41
+
-`.github/workflows/compatibility-runner-puppet8.yml` / `compatibility-runner-puppet9.yml`: CI pipeline and matrix execution, one self-contained caller per Puppet major (see `docs/puppet-core-9-dual-major-support.md` §4). They are deliberate near-copies — a diff between them should show only the profile name, concurrency-group suffix, `puppet-major` input, and cron hour; anything else is drift. Shared prepare/publish logic lives in `.github/actions/prepare-test-matrix` and `.github/actions/publish-compatibility-results` — see that doc's §12 for why these are composite actions, not a reusable workflow.
42
42
-`profiles/puppet_profiles.json`: profile constraints used by the runner.
43
43
-`docs/architecture-flow.md`: end-to-end architecture diagram and stage reference. Must be kept in sync with runner logic, classification rules, and CI workflow changes.
44
44
@@ -198,7 +198,7 @@ When you need a narrow CI run, use workflow input `modules_json` with only new o
198
198
| Downgrade override rules (`lib/module_tester/adapters.rb`) | Downgrade overrides table — add, remove, or update trigger conditions and reclassification outcome |
Workflows: [.github/workflows/compatibility-runner-puppet8.yml](.github/workflows/compatibility-runner-puppet8.yml) and [.github/workflows/compatibility-runner-puppet9.yml](.github/workflows/compatibility-runner-puppet9.yml) (one per Puppet major; both validate identically)
63
63
64
64
If schema validation fails, the `prepare` job fails and module test jobs are blocked.
- Stage logs per module: `results/.../artifacts/<module>/.stage-*.log`
33
33
- Per-module dependency status/message (`dependency_status`, `dependency_message`) in JSON report
34
-
- GitHub Actions workflow with module matrix: `.github/workflows/compatibility-runner-puppet8.yml`
34
+
- GitHub Actions workflow with module matrix, one per Puppet major: `.github/workflows/compatibility-runner-puppet8.yml`, `.github/workflows/compatibility-runner-puppet9.yml`
0 commit comments