This eco uses independent SemVer per repo (see VERSIONING.md). That gives each component its own release cadence, but raises an obvious question: which combinations of versions are actually tested together?
The answer lives in compatibility-matrix.json.
Two named matrices:
stable— the most recent combination of released versions that has been tested end-to-end. New users getting "the eco" install these versions.next— the bleeding edge: the latest commit on each repo'smainbranch. CI runs the integration tests against this matrix on every PR to any eco repo.
Additional matrices (e.g. lts, enterprise) can be added without breaking
existing consumers.
nextupdates automatically — release-please bumpsmainreferences as components advance. No manual edit needed.stableis updated by hand — when you cut a coordinated release of the eco. The release engineer:- Verifies CI green on
nextmatrix. - Tags each component repo at the version that's about to be in
stable. - Updates
stablein this file with those versions, in a single PR. - Releases.
- Verifies CI green on
.shared-templates/workflows/compatibility-test.yml.tmpl is a reusable
workflow that:
- Reads
compatibility-matrix.jsonfrom the eco repo. - Checks out each component at the version listed in the named matrix.
- Builds + tests the cross-repo integration scenarios.
It runs on:
- Push to
mainof any eco repo. - A nightly schedule.
- Manual dispatch (e.g. before cutting a
stablerelease).
- Bug reports become triageable. "I ran hawk 0.4 with eyrie 0.2" — you immediately know whether that combination was ever tested.
- Consumers can pin reliably. Downstream projects that vendor multiple eco packages can pin to a known-good stable matrix instead of guessing.
- Coordinated releases are a real thing. When you want to ship "the eco v1.0", you have a definition of what that means.
- Drift is visible. A component that's never updated in
nextbut is fine instableshows up as a drift candidate in CI reports.
The file is validated against compatibility-matrix.schema.json
in CI. To validate locally:
# Quick check using ajv (Node)
npx ajv-cli validate \
-s compatibility-matrix.schema.json \
-d compatibility-matrix.json
# Or with Python
python3 -c "
import json, jsonschema
schema = json.load(open('compatibility-matrix.schema.json'))
data = json.load(open('compatibility-matrix.json'))
jsonschema.validate(data, schema)
print('ok')
"
{ "components": ["hawk", "eyrie", ...], // canonical eco roster "dependencies": { "hawk": ["eyrie", ...] }, // who depends on who "matrices": [ { "name": "stable", "components": { "hawk": "0.2.0", "eyrie": "0.2.0", ... } }, { "name": "next", "components": { "hawk": "main", "eyrie": "main", ... } } ] }