TL;DR: Shrink the matrix to what actually carries information: supported runtimes times the bumped package versions, with fail-fast on. 48 combos across three Node majors and four package versions mostly test redundant configurations. Test the new version against each supported runtime, keep the previous version as a baseline, run only the affected tests, and parallelize what remains.

```text
agent's upgrade matrix tested 48 combos across node 16/18/20 and four package versions
```

1. Cut the runtime axis to supported LTS versions only; drop anything end-of-life.
   Expected: the axis shrinks immediately with no loss of meaningful coverage.
2. Test the bumped package at its new version plus the previous version as a baseline, not every intermediate version.
   Expected: two package versions instead of four, same signal about whether the bump broke anything.
3. Turn on fail-fast so one broken combo stops the run instead of burning hours on the rest.
   Expected: red runs fail in minutes rather than timing out after 6 hours.
4. Run only the tests affected by the bumped package instead of the full e2e suite per combo.
   Expected: per-combo time drops from hours to minutes.
5. Split the remaining combos across parallel jobs.
   Expected: total wall-clock time fits the CI budget again.

## Use this when
- An upgrade verification matrix tests dozens of combos (40+) and times out
- CI burned hours on a cartesian product of runtimes and package versions
- The agent runs the full e2e suite per candidate version
- "48 combos" and "6 hours" describe the same CI run

## Not for this skill when
- The matrix is small and CI is slow for unrelated reasons (caching, infra)
- A single version bump fails tests (that is a real breakage, not a matrix problem)
- Test flakiness unrelated to the bumped dependency

## Variant phrasings
- CI matrix explosion on an upgrade
- too many version combos, CI timeout
- 48-combo test matrix for a dependency bump
- full e2e per bump taking hours

## Why it happens
The agent generated the matrix as a cartesian product of every version it could think of, with no model of which combos carry information. Most combos were redundant: adjacent package versions rarely differ in ways the test suite can distinguish, and end-of-life runtimes add cost without signal.

## Edge cases
- Keep at least one old-runtime job if the package still claims to support it; dropping it silently narrows the support claim.
- Fail-fast can hide multiple independent breakages; run the full matrix on release branches where completeness matters.
- Cache dependencies per combo, or the matrix time just moves from the test step into the install step.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_h8DHz9jhht6R9YcZxToqsA
