Versioning & Releases
The opensecstack ecosystem uses per-platform semantic versioning for independent release cadences and ecosystem release tags that pin a tested combination of platform versions for operators who want a single blessed configuration. This page covers the versioning rules, the compatibility matrix concept, the deprecation policy, and the post-quantum migration timeline. For how the platforms fit together structurally, see the Architecture overview.
Semantic versioning
Every platform follows semver.org. The rules are interpreted strictly:
| Change type | Version bump | Examples |
|---|---|---|
| Bug fix, docs only, internal refactor | patch (1.0.0 → 1.0.1) | Fix HMAC timing window, update README |
| New feature, backwards-compatible | minor (1.0.0 → 1.1.0) | New HTTP endpoint, new config knob |
| Breaking API change, config rename, schema migration that drops data | major (1.x.y → 2.0.0) | Remove endpoint, rename env var, drop DB column |
When in doubt, bump the higher version — over-bumping is cheap; under-bumping erodes trust. A new database migration alone is not a breaking change; a migration that removes a column is.
Per-platform release tags follow a module-scoped convention:
citadel/v1.1.0 irflow/v1.0.2 sdk/v1.0.0 apiguard/v1.3.0
This lets a platform ship a security patch without forcing every other platform through the release cycle. It aligns with the Go monorepo convention and how go get resolves module versions.
Release types & cadence
The ecosystem ships in two modes:
| Release type | Frequency | Description |
|---|---|---|
| Per-platform patch | As needed | Bug fixes and security patches; bypasses normal cadence for urgent security issues |
| Per-platform minor | Quarterly average | New backwards-compatible features |
| Per-platform major | Annually at most | Breaking changes; always accompanied by a migration guide |
| Ecosystem release | 2× per year (Q2 + Q4) | Named tag pinning a tested combination across all platforms; the "blessed configuration" for conservative operators |
Ecosystem releases are coordination events, not requirements. Individual platform upgrades between ecosystem releases are supported via the compatibility matrix. Emergency security patches bypass the cadence entirely and go directly to a tagged version with a GitHub Security Advisory.
An RC soak period precedes every final tag: 24 hours for patches, 3 business days for minor releases, 2 weeks for majors, and 4 weeks for ecosystem releases. The RC is deployed to a staging environment that mirrors production before the final tag is cut.
Compatibility matrix
The compatibility matrix is the authoritative answer to "can IRFlow 1.1 talk to CITADEL 1.0?" — the answer is in the table, not in a Slack thread. It has three dimensions: per-platform pair-wise compatibility, ecosystem release version pins, and support windows.
The current ecosystem releases are:
| Ecosystem release | Platforms included | Highlights |
|---|---|---|
ecosystem/v1.0.0 | APIGuard, NIS2 Compass, CITADEL, IRFlow, SDK — all at v1.0.0 | First stable release — 5-platform foundation |
ecosystem/v1.1.0 | +ThreatFlow, OpenCSIRT, OpenScrub, CyberPath, SecureLab, sinauth, SIN Community (all v1.0.0) | 7 more platforms through the real release pipeline; sinauth SSO adopted ecosystem-wide; OpenCSIRT CSAF 2.0 |
ecosystem/v1.2.0 | +VertGuard (v1.0.0) | The full originally-planned platform set complete — AI-attack defence, real-time deepfake/voice-clone detection, NIS3-ready security audit |
The compatibility rule across all platform pairs: minor versions are forward and backward compatible within the same major. SDK minor versions are forward and backward compatible within the same major; SDK 2.0 accompanies platform 2.0. Cross-major combinations are supported only during their explicit migration window.
Some cross-platform features require minimum versions on both sides:
| Feature | Requires |
|---|---|
| HMAC-signed webhooks with per-source secrets | IRFlow ≥ 1.0.0 and upstream platforms ≥ 1.0.0 |
| CITADEL MARSHAL Gate 4 AUGUR rule_03 (DATA_EXPORT block) | CITADEL ≥ 1.0.0 |
WORM chain anchor verification at /worm/verify | CITADEL ≥ 1.1.0 (planned) |
| Overlapping-secret rotation | IRFlow ≥ 1.1.0 and CITADEL ≥ 1.1.0 (both planned) |
| Playbook auto-triggering from webhooks | IRFlow ≥ 1.2.0 (planned) |
| Multi-writer WORM chain | CITADEL ≥ 2.0.0 (planned) |
HTTP APIs are versioned at the URL path level (/api/v1/..., /api/v2/...). When /api/v2/ lands, /api/v1/ continues to work for at least 12 months. A single server can expose multiple protocol versions during a transition window.
compatibility-report if you find a broken combo the matrix claims works.Support windows
| Category | Example | Support ends |
|---|---|---|
| Current stable | v1.1.x (latest minor) | When v1.3 ships |
| Previous stable | v1.0.x | 12 months after v1.1 ships |
| Older | v0.9 and earlier | Unsupported immediately on newer release |
| Ecosystem release | ecosystem/v1.2.0 (latest) | 12 months from the release date |
In practice, two minor versions back always receive security fixes. Everything older is archived. Released versions are immutable — we never yank a published release, because auditors and regulators may reference a specific version. If a bug is found post-release, a patch release (1.1.0 → 1.1.1) is the fix path; downgrade to the previous version is always valid.
Deprecation policy
Any deprecated-then-removed feature passes through three phases before it disappears:
| Phase | Minimum duration | What happens |
|---|---|---|
| Supported | — | Default state; no removal planned |
| Deprecated | 1 minor version and 6 calendar months (whichever is longer) | Feature still works; runtime WARN log on use; docs banner; CHANGELOG Deprecations entry; HTTP responses carry Deprecation and Sunset headers |
| Removed | — | Gone; requires a major version bump; migration guide published at docs/migrations/vX-to-vY.md |
Changes that trigger the deprecation process include:
- HTTP endpoints removed or changed (e.g.
DELETE /api/v1/incidents/archive→PATCH {status:"archived"}) - Request/response fields renamed or removed (e.g.
incident.criticality→incident.severity) - Config env vars renamed (e.g.
IRFLOW_WEBHOOK_SECRET→IRFLOW_WEBHOOK_<SOURCE>_SECRET) - SDK function signatures changed
- Event types renamed (e.g.
citadel.marshal.refuse→citadel.marshal.decision) - Default behaviour changes (e.g. webhook clock skew tolerance going from 10m to 5m)
Internal-only changes — unexported Go functions, private modules, undocumented behaviours — do not require the deprecation process. The contract is with documented interfaces only.
Experimental features — marked // Experimental at introduction — carry no deprecation obligation. They can change shape or disappear in any minor release. The marker must be user-visible in API docs and SDK function signatures. Experimental is not a loophole for insufficient design.
Post-quantum migration timeline
NIST finalised post-quantum standards (ML-KEM, ML-DSA, SLH-DSA) in August 2024. Quantum computers capable of breaking Ed25519 are plausibly 2030–2036. NIS3 (expected 2030–2032) is likely to mandate PQC migration for essential entities. Harvest-now-decrypt-later attacks are already active. OpenSecStack is migrating the CITADEL chain anchor signatures so historical audits remain attestable past the quantum threshold.
The components at risk are the Ed25519 chain anchor signatures in CITADEL and the X.509/ECDSA C2PA provenance in VertGuard's Module 1. HMAC-SHA256 webhooks and TripleHash integrity are safe — symmetric primitives have reduced margin but the core guarantee holds.
| Year | Milestone | Operator burden |
|---|---|---|
| 2026 | v1.0 shipped — Ed25519 anchors, TripleHash integrity | Nothing — deploy as-is; secure against classical adversaries |
| 2026–2027 | v1.1 — schema agility fields (signature.alg, digest_version) | Routine upgrade; no breaking change; historical entries stay valid |
| 2028 | v2.0 — hybrid signatures: every new anchor signed with both Ed25519 and ML-DSA-65; verifier accepts either | Routine upgrade; CITADEL_HYBRID_ANCHORS defaults to true; storage grows ~0.003% per anchor |
| 2029 | v2.5 — QuintHash default (5 primitives including 2 PQ-resistant candidates) | Routine upgrade; new writes adopt automatically |
| 2030 | v3.0 — ML-DSA becomes default; Ed25519 retained for verifying historical anchors only | Standard NIS3-compliance upgrade; confirm no part of deployment still relies on Ed25519 signing |
| 2033 | v4.0 — Ed25519 signing removed; historical anchors still verifiable | Confirm nothing broken; by this point the migration should be long complete |
SDK clients verify webhook signatures (HMAC-SHA256, unaffected by quantum). The anchor verification path is only used when a consumer calls /worm/verify — and that endpoint returns the algorithm identifier, so SDK clients need only call the appropriate verification code path. Updated SDK versions ship alongside each CITADEL version.
VertGuard's Module 1 (C2PA) is currently X.509/ECDSA-based. The C2PA specification is developing its own PQC migration; VertGuard will track and support hybrid C2PA manifests when the spec lands (~2028).
For the full architectural rationale and per-tier deployment guidance, see docs/post-quantum-roadmap.md and ADR-011 (Post-Quantum Agility) in the opensecstack repository.