Versioning and Release Policy Template (SemVer, CalVer, CRA)
Versioning policy: SemVer or CalVer rules, release types and cadence, changelog conventions, support tiers, LTS, CRA support period, backports, yanking
उपयोग कैसे करें: Use it when you need one organisation-wide rule set for version numbers, release cadence and how long each version is supported. Fill the product inventory and the scheme per product first, then the support windows you can actually staff. The main pitfall is promising support windows without owners or a backport budget.
प्रीव्यू
Versioning and Release Policy: [Organisation or product line]
Policy that sets how [Organisation] numbers, releases, supports and retires its software: the versioning scheme (Semantic Versioning 2.0.0 or Calendar Versioning spec 26.0), release types and cadence, commit and changelog conventions (Conventional Commits 1.0.0, Keep a Changelog 1.1.0), support tiers and end-of-life windows, long-term support, security-fix backports, deprecation, publication and yanking. It includes the support-period duty of the EU Cyber Resilience Act (Regulation (EU) 2024/2847, Article 13(8) to 13(11) and 13(19), with the related points of Annex I, Part II) for products with digital elements. Replace every
[bracketed]value and every row marked Example. The CRA parts are a documentation format, not legal advice: check the consolidated text and confirm scope with counsel.
Document control
| Field | Value |
|---|---|
| Document ID | [POL-REL-001] |
| Version | [0.1] |
| Status | [Draft / Approved / Superseded] |
| Owner | [@release-engineering-lead] |
| Approvers/reviewers | [@vp-engineering], [@head-of-product], [@product-security-lead], [@head-of-support], [@legal-counsel] |
| Last updated | YYYY-MM-DD |
| Classification | [Public / Internal] |
| Applies to | [Product lines, repositories and artefact types in section 1] |
| Effective from | YYYY-MM-DD |
| Next scheduled review | YYYY-MM-DD |
| Public support page | [https://example.com/support-lifecycle] |
| CRA in scope | [Yes, for products listed in section 7.4 / No / Under assessment] |
Approvals
| Role | Name | Decision | Date |
|---|---|---|---|
| VP Engineering | [@name] | [Approve / Approve with conditions / Reject] | YYYY-MM-DD |
| Head of Product | [@name] | [Decision] | YYYY-MM-DD |
| Product Security Lead | [@name] | [Decision] | YYYY-MM-DD |
| Head of Support | [@name] | [Decision] | YYYY-MM-DD |
| Legal counsel (CRA and contracts) | [@name] | [Decision] | YYYY-MM-DD |
Revision history
| Version | Date | Author | Change summary |
|---|---|---|---|
| 0.1 | YYYY-MM-DD | [@name] | First draft |
| 1.0 | YYYY-MM-DD | [@name] | Example: Approved; Corvid Edge Agent moved to an LTS train with a 5-year support period |
| 1.1 | YYYY-MM-DD | [@name] | Example: Storefront web app moved from SemVer to CalVer YYYY.0M.MICRO |
Contents
- Purpose, scope and principles
- Roles and responsibilities
- Policy statements
- Versioning scheme
- Release types and cadence
- Commit conventions, changelog and release notes
- Support tiers, LTS and end of life
- Security fixes and backports
- Deprecation and breaking changes
- Publication, immutability and yanking
- Exceptions and risk acceptance
- Compliance measurement
- Review cycle
- Glossary and references
1. Purpose, scope and principles
1.1 Purpose
This policy makes version numbers a reliable promise. A consumer who reads a version must be able to tell whether an upgrade is safe, how long that version will receive fixes, and where the list of changes is. A team that ships must know which numbers it may use, how often it may release, and what it owes to customers on older versions.
1.2 Scope
The policy covers every artefact that [Organisation] publishes or deploys and that carries a version: libraries and SDKs, command-line tools, installable agents and appliances, container images, Helm charts and other deployment packages, mobile and desktop applications, and the release labels of continuously deployed services. It does not cover internal build numbers that never leave the pipeline, and it does not set HTTP API version numbers, which follow the API Versioning and Deprecation Policy (architecture/api-deprecation-policy).
1.3 Product inventory
| Product ID | Product | Artefact types | Consumers | Scheme (section 4) | Support model (section 7) |
|---|---|---|---|---|---|
| PRD-001 (Example) | Corvid Checkout SDK (JavaScript, Java, Python) | npm, Maven, PyPI packages | External merchants and partners | SemVer 2.0.0 | Current major Active; earlier majors Security-only until 5 years after their first release |
| PRD-002 (Example) | Corvid Storefront web app | Container image deployed by Corvid | End users through the browser; no installed versions | CalVer YYYY.0M.MICRO | Latest only (continuous delivery) |
| PRD-003 (Example) | Corvid Edge Agent | Signed installer and container image run on customer premises | Enterprise merchants in the EU and US | SemVer; every major is an LTS train | LTS 5 years from first release of each train; CRA support period |
| PRD-004 (Example) | Corvid CLI | Homebrew, winget and tarballs | Developers | SemVer 2.0.0 | Latest minor only |
| [PRD-NNN] | [Product] | [Artefacts] | [Consumers] | [Scheme] | [Model] |
1.4 Principles
- The source repository and its signed tags are the source of truth for what a version contains.
- A published version is immutable. A mistake is fixed by a new version, never by replacing the old one.
- Version numbers describe compatibility for consumers, not effort or marketing. Marketing names may exist alongside, but never instead.
- Support promises are public, dated and staffed.
- Security fixes reach every supported version, not only the newest.
2. Roles and responsibilities
| Activity | Release engineering | Product owner | Engineering team (product) | Product security (PSIRT) | Support | Legal |
|---|---|---|---|---|---|---|
| Choose and change versioning scheme | A | C | R | I | I | I |
| Decide version number for a release | C | I | A/R | I | I | - |
| Approve a major release | C | A | R | C | C | I |
| Publish release calendar | A/R | C | C | I | I | - |
| Set support tiers and end-of-life dates | C | A | R | C | C | C |
| Backport security fixes | C | I | R | A | I | - |
| Publish support lifecycle page | R | A | C | C | C | C |
| Declare and communicate end of life | R | A | C | I | R | C |
| Approve exceptions (section 11) | C | A | R | C | C | C |
R = responsible, A = accountable, C = consulted, I = informed.
| Role | Named holder | Duties |
|---|---|---|
| Release engineering lead | [@name] | Owns this policy, tooling, tag protection, release calendar and compliance metrics |
| Product owner (per product) | [@name] | Owns the support lifecycle and end-of-life decisions for the product |
| Engineering team lead (per product) | [@name] | Applies the scheme, writes changelog entries, staffs backports |
| Product security lead | [@name] | Decides which supported versions receive which security fix and when; links to the Security Advisory (security/security-advisory) |
| Head of support | [@name] | Aligns support contracts and customer communication with section 7 |
3. Policy statements
| ID | Statement | Checked by |
|---|---|---|
| VRP-01 | Every published artefact MUST carry a version that follows the scheme recorded for its product in section 1.3. | Pipeline version lint |
| VRP-02 | A product with external consumers of a programmatic interface MUST use Semantic Versioning 2.0.0, or document in section 4.1 why another scheme fits better. | Policy review |
| VRP-03 | A breaking change to a public interface MUST NOT ship in a minor or patch release of a SemVer product at 1.0.0 or later. | API diff check, review |
| VRP-04 | Every release MUST be built from a signed, protected tag whose name equals the version, prefixed by v where the ecosystem expects it. | Tag protection rules |
| VRP-05 | A published version MUST NOT be overwritten or re-tagged; corrections ship as a new version (section 10). | Registry immutability settings |
| VRP-06 | Every release MUST have a changelog entry in Keep a Changelog 1.1.0 form before it is published. | Release checklist |
| VRP-07 | Commit messages on the default branch SHOULD follow Conventional Commits 1.0.0 so that version bumps and changelog drafts can be derived. | Commit lint |
| VRP-08 | Each product MUST publish a support lifecycle with the end date of every supported version, at least month and year. | Support page audit |
| VRP-09 | A fix for a vulnerability rated High or Critical MUST be released for every version in Active or Security-only support within the target in section 8.2. | PSIRT metrics |
| VRP-10 | A deprecation MUST be announced at least one minor release and the notice period in section 9.2 before removal. | Changelog Deprecated entries |
| VRP-11 | End of life MUST be announced at least [6] months in advance for products with installed versions. | Support page history |
| VRP-12 | Products in CRA scope MUST record the support-period determination in their technical documentation and meet sections 7.4 and 8. | CRA technical file review |
| VRP-13 | Pre-release versions SHOULD NOT be used in production by customers and MUST be labelled as such in every channel. | Registry dist-tags, release notes |
4. Versioning scheme
4.1 Choosing a scheme
| Criterion | Semantic Versioning 2.0.0 | Calendar Versioning (spec 26.0) |
|---|---|---|
| Main signal to consumer | Compatibility of the public API | Age of the release and position in a release train |
| Best fit | Libraries, SDKs, CLIs, agents and plug-ins with a declared public interface | Continuously deployed services, OS-style distributions, data and content bundles, products with time-boxed support |
| Breaking change signal | Increment MAJOR | Must be communicated separately (changelog, upgrade notes) |
| Support policy fit | Support by major line | Support by year or train, for example two latest year releases |
| Registry compatibility | Native in npm, Cargo, Go modules and most package managers | Only if the chosen format is also a valid version string for that registry |
Decision for each product is recorded in section 1.3. A product that changes scheme MUST make the new numbers sort after the old ones (for example from 4.9.2 to 2026.10.0), and MUST state the change in its changelog and release notes.
4.2 Semantic Versioning rules
For products using Semantic Versioning 2.0.0 (semver.org):
- The version has the form
MAJOR.MINOR.PATCH, three non-negative integers without leading zeros. - The product MUST declare its public API in its documentation. Without a declared public API, compatibility claims are meaningless.
- Increment PATCH for backward-compatible bug fixes, MINOR for backward-compatible new functionality or a deprecation, and MAJOR for any incompatible change to the public API. Lower components reset to zero when a higher one increments.
- Major version zero (
0.y.z) is initial development: anything may change. A product MUST reach 1.0.0 before it is offered to external customers under a support contract. - Treat the following as public API for compatibility purposes, in addition to the code interface: configuration file keys, CLI flags and exit codes, environment variables, on-disk and wire formats, and the minimum supported runtime (dropping a runtime version is a MAJOR change unless the runtime itself is end of life and this was announced under section 9; on an LTS train, section 7.3 applies).
4.3 Calendar Versioning rules
For products using Calendar Versioning (calver.org, spec 26.0):
- Choose the format from the CalVer tokens:
YYYY(full year),YY(short year),0Y(zero-padded year),Mand0M(month),Wand0W(week of year),Dand0D(day), plus non-date parts such asMAJOR,MINORandMICRO. - Spec 26.0 deprecates the
MM,WWandDDtokens because a doubled letter is commonly read as two digits. Write0M,0Wor0Dfor zero-padded fields andM,WorDotherwise. - Zero-padded fields are not valid SemVer numbers. For artefacts published to a SemVer-only registry (npm, Cargo) use the non-padded tokens, for example
YYYY.M.MICRO. - The date in the version is the date of the release cut, in UTC, not the deployment date.
- A
MICRO(or other non-date) segment starts at 0 for the first release in each date period and resets when the date part changes, so2026.10.0is the first release cut in October 2026. - Go modules: avoid CalVer. Go treats a major version of 2 or more as part of the module path, so every new year would need a new
/vYYYYimport path and an edit in every consumer.
| Product | Format | Example version | Meaning |
|---|---|---|---|
| PRD-002 (Example) | YYYY.0M.MICRO | 2026.10.3 | Fourth release cut in October 2026 |
| [PRD-NNN] | [Format] | [Version] | [Meaning] |
4.4 Pre-release and build metadata
- Pre-release identifiers follow the patch number after a hyphen, for example
3.2.0-rc.1. They have lower precedence than the release, so3.2.0-rc.1sorts before3.2.0. - Allowed pre-release labels:
alpha.N,beta.N,rc.N. Numbered identifiers sort numerically, so userc.10safely afterrc.9. - Build metadata follows a plus sign, for example
3.2.0+sha.4f2a9c1. Build metadata is ignored for precedence and MUST NOT be the only difference between two published artefacts. - Pre-releases MUST be published to a pre-release channel (for example an npm dist-tag
next) so that default installs never receive them.
4.5 Version source of truth and tags
| Item | Rule |
|---|---|
| Source of truth | The signed annotated git tag; manifests (package.json, pom.xml, pyproject.toml) are stamped from it by the pipeline |
| Tag format | v<version> for SemVer products, <version> for CalVer products, <component>/v<version> in monorepos |
| Tag protection | Only the release pipeline identity can create tags matching the release pattern; deletion is blocked |
| Version in artefact | Exposed by --version, an HTTP /version endpoint or image labels, matching the tag exactly |
| Provenance | Each release artefact has build provenance referencing the tag and commit (see Software Supply Chain Security, security/supply-chain-security) |
5. Release types and cadence
5.1 Release types
| Type | SemVer effect | Contents allowed | Trigger | Approval |
|---|---|---|---|---|
| Major | MAJOR + 1 | Breaking changes, removals announced under section 9, new features, fixes | Planned, on the major calendar | Product owner and release engineering |
| Minor | MINOR + 1 | New backward-compatible features, deprecations, fixes | Release train or on demand | Engineering team lead |
| Patch | PATCH + 1 | Backward-compatible fixes only | On demand | Engineering team lead |
| Security | PATCH + 1 on each supported line | Security fix and the minimum needed to ship it, kept separate from functionality changes where technically feasible | PSIRT decision (section 8) | Product security lead |
| Hotfix | PATCH + 1 | Fix for a production incident, outside the train | Incident commander or team lead | Team lead plus one reviewer; retrospective approval within [2] business days |
| Pre-release | -alpha.N, -beta.N, -rc.N | Anything planned for the target version | On demand | Team lead |
5.2 Cadence
| Product | Major | Minor | Patch | Freeze before release |
|---|---|---|---|---|
| PRD-001 (Example) | At most once per 24 months | Every 4 weeks (train) | As needed | Feature freeze 5 business days before the train date |
| PRD-002 (Example) | Not used (CalVer) | Not used | Continuous, several per day; CalVer MICRO increments | None; feature flags gate unfinished work (Feature Flag Policy, dev/feature-flag-policy) |
| PRD-003 (Example) | New LTS train (major) every 36 months | Quarterly, on the Active LTS train only | Monthly patch bundle plus security releases on every supported train | Code freeze 10 business days before a minor |
| [PRD-NNN] | [Cadence] | [Cadence] | [Cadence] | [Freeze rule] |
The release calendar for the next two quarters is published at [calendar link]. Moving a train date by more than [5] business days needs product owner approval and a note to customers on the support page.
5.3 Release flow
Each release runs the Release Checklist (dev/release-checklist). The checklist is per release; this flow is the policy view of it.
6. Commit conventions, changelog and release notes
6.1 Commit messages
Teams SHOULD write commits in Conventional Commits 1.0.0 form: <type>[optional scope][!]: <description>, with optional body and footers. The mapping to version increments is:
| Commit signal | Version effect | Changelog section |
|---|---|---|
fix: | PATCH | Fixed |
feat: | MINOR | Added or Changed |
! after type or scope, or a BREAKING CHANGE: (or synonym BREAKING-CHANGE:) footer | MAJOR (house rule: MINOR while in 0.y.z) | Changed or Removed, plus upgrade notes |
perf:, refactor: | PATCH when user-visible, otherwise none | Changed, or omitted |
docs:, test:, ci:, build:, chore: | None | Omitted unless user-visible |
revert: | Same as the reverted change | Same section as the reverted change |
Footer Deprecated: (house convention) | MINOR | Deprecated |
Footer Security: with advisory ID (house convention) | PATCH | Security |
Only feat and fix and the breaking-change markers carry meaning in the specification; the other types and the Deprecated: and Security: footers are conventions of this policy. Squash merges MUST produce a compliant subject, because the squash commit is what tools read.
6.2 Changelog
- Each product keeps a
CHANGELOG.mdin Keep a Changelog 1.1.0 form: anUnreleasedsection at the top, then one section per version with an ISO 8601 date, newest first, and change groupsAdded,Changed,Deprecated,Removed,FixedandSecurity. - Entries are written for the consumer: what changed and what to do, not which file was edited. Use the Changelog template (
dev/changelog). - A yanked version stays in the changelog, marked
[YANKED]after the date, with the reason (section 10.3). - Generated drafts from commit messages are allowed; a human from the owning team MUST edit and approve the entry before release.
6.3 Release notes
Major and minor releases of products with external consumers have release notes written from the Release Notes template (dev/release-notes): highlights, breaking changes with migration steps, deprecations, security fixes with advisory and CVE references, and known issues. Patch releases MAY rely on the changelog entry alone.
7. Support tiers, LTS and end of life
7.1 Support tiers
| Tier | Includes | Excludes |
|---|---|---|
| Active | Bug fixes, security fixes, new minor features, documentation updates, support tickets | None |
| Security-only (maintenance) | Fixes for vulnerabilities and for critical defects causing data loss or outage; support tickets | New features, non-critical bug fixes |
| Extended (contract only) | Security fixes for named customers under a paid extended support agreement | Everything else |
| End of life (EOL) | Archived artefacts remain downloadable with a warning | Fixes, support tickets, compatibility testing |
7.2 Support windows by product
This table is the single source of truth for support windows. Sections 1.3, 7.3, 7.4 and the public support page restate it and MUST be updated in the same change when it changes.
| Product | Active | Security-only | Support period (CRA where in scope) | EOL rule | Notice before EOL |
|---|---|---|---|---|---|
| PRD-001 (Example) | Current major | Every earlier major, from the release of the next major until 5 years after the earlier major's first release | 5 years from the first release of each major | A major reaches EOL 5 years after its first release | 6 months |
| PRD-002 (Example) | Latest deployed release only | Not applicable | Not applicable (service, no installed versions) | Previous releases are replaced by deployment | Not applicable |
| PRD-003 (Example) | Current LTS train | Previous LTS train, from the release of the next train until 5 years after its own first release | 5 years from the first release of each LTS train | A train reaches EOL 5 years after its first release | 12 months |
| PRD-004 (Example) | Latest minor | None | [Not set: CRA scope assessment pending with counsel; if in scope, latest-minor-only support cannot meet Article 13(8) and must change] | Any older minor | Not applicable; users are told to upgrade |
| [PRD-NNN] | [Window] | [Window] | [Period] | [Rule] | [Notice] |
Capacity check (Example): PRD-001 ships a major at most every 24 months (section 5.2) and supports each for 5 years, so at most three majors are supported at once (the current one and two in Security-only). PRD-003 ships a train every 36 months with a 5-year period, so at most two trains overlap, which matches the LTS limit in section 7.3. Recompute this check whenever the cadence or the period changes.
7.3 Long-term support (LTS)
- An LTS train is a major release line designated for long-term support. The first release of an LTS train is designated LTS on the day it is published, never retroactively.
- While a train is Active it receives minor and patch releases. Once the next LTS train ships, the previous train receives PATCH releases only (security fixes and critical defect fixes) until its support period ends. Features never backport into a train in Security-only support.
- At most [2] LTS trains of one product are supported at the same time. More trains multiply backport cost and test matrices; set the train cadence so that this limit holds (section 7.2 capacity check).
- Runtime and dependency support: an LTS train names the runtimes and operating systems it supports. When one of those reaches its own end of life, the product owner decides, under section 9, whether to keep it until the end of the train or drop it in the next LTS train. Dropping a runtime inside a train needs an exception under section 11.
| LTS train | First release | Active until | Security-only until | Support period end (month and year) |
|---|---|---|---|---|
| Corvid Edge Agent 5.x (Example) | 2025-03-18 | Release of 6.0 (2028-03, planned) | 2030-03 | March 2030 |
| Corvid Edge Agent 6.x (Example) | 2028-03 (planned) | Release of 7.0 (2031-03, planned) | 2033-03 | March 2033 |
| [Train] | YYYY-MM-DD | [Event or date] | YYYY-MM | [Month year] |
7.4 EU Cyber Resilience Act support period
Regulation (EU) 2024/2847 (Cyber Resilience Act) applies in general from 11 December 2027; the reporting obligations of Article 14 apply from 11 September 2026. Check the consolidated text on EUR-Lex for current dates and any delegated acts. The provisions below are paraphrased from the Official Journal text. This is a documentation format, not legal advice.
| Provision | Duty, paraphrased | How this policy meets it |
|---|---|---|
| Article 13(8), first subparagraph | When placing the product on the market and for the whole support period, handle vulnerabilities of the product and its components effectively and in line with the vulnerability handling requirements of Annex I, Part II. | Sections 7.2 and 8 |
| Article 13(8), support period determination | Set the support period to the time the product is expected to be in use, taking into account in particular reasonable user expectations, the nature and intended purpose of the product, and relevant Union law on product lifetime. The manufacturer may also consider support periods of comparable products from other manufacturers, the availability of the operating environment, the support periods of third-party components that provide core functions, and guidance from the ADCO and the Commission. Apply these factors proportionately. | Determination table below; factors recorded in the CRA Technical Documentation (security/cra-technical-documentation) |
| Article 13(8), minimum | The support period is at least five years. Where the product is expected to be in use for less than five years, the support period equals the expected use time. The Commission may set minimum support periods for specific product categories by delegated act. | Section 7.2 support period column; section 13 review trigger for delegated acts |
| Article 13(8), records and CVD | Record the information used to determine the support period in the Annex VII technical documentation. Keep policies and procedures, including a coordinated vulnerability disclosure policy (Annex I, Part II, point (5)), to process and remediate reported vulnerabilities. | CRA technical file; Vulnerability Disclosure Policy (security/vulnerability-disclosure-policy) and PSIRT process (section 8) |
| Article 13(9) | Each security update (Annex I, Part II, point (8)) made available during the support period remains available for at least ten years after it is issued, or for the rest of the support period if that is longer. | Section 10.2 retention |
| Article 13(10) | Where the manufacturer has placed later, substantially modified versions of a software product on the market, it may meet the vulnerability remediation requirement of Annex I, Part II, point (2) for the version last placed on the market only, provided that users of earlier versions can get that version free of charge and do not incur extra costs to adapt the hardware and software environment in which they use the original version. All other duties, including the other points of Annex I, Part II, continue to apply. | Section 8.3 records where this route is used instead of a backport |
| Article 13(11) | Public archives of historical versions are allowed if users are clearly and accessibly told the risks of using unsupported software. | Section 10.2 archive warning |
| Article 13(19) | Show the end date of the support period, at least month and year, clearly at the time of purchase, and on the product, its packaging or digitally where applicable; where technically feasible, notify users when support ends. | Support lifecycle page, in-product notice of PRD-003 (Example) |
| Annex I, Part II, point (2) | Address and remediate vulnerabilities without delay in relation to the risk, including by security updates; where technically feasible, ship security updates separately from functionality updates. | Section 5.1 Security release type; section 8.2 targets |
| Annex I, Part II, point (8) | Disseminate available security updates without delay and free of charge (unless otherwise agreed with a business user for a tailor-made product), with advisory messages telling users what to do. | Section 8.1 coordinated release; Security Advisory template |
Support period determination for each CRA product (the support period itself is set in section 7.2):
| Product | Expected use time and evidence | Support period (from section 7.2) | End of earliest supported line (month and year) | Recorded in |
|---|---|---|---|---|
| PRD-003 (Example) | Customers run agents a median of 4 years before hardware refresh; enterprise contracts run 3 to 5 years; base operating system images are supported upstream for at least 5 years | 5 years from first release of each LTS train (expected use time is below 5 years, so the 5-year minimum applies) | March 2030 for 5.x | CRA technical file, section 5 |
| PRD-001 (Example) | Libraries embedded in merchant apps typically stay pinned for 2 to 4 years; comparable payment SDKs publish support of 3 to 5 years | 5 years from first release of each major | [Month year] for 4.x | CRA technical file |
| [PRD-NNN] | [Evidence] | [Period] | [Month year] | [Reference] |
Vulnerability handling and reporting under Articles 13 and 14 are run through CRA Vulnerability Handling (security/cra-vulnerability-handling) and the PSIRT process (security/psirt-vulnerability-handling).
7.5 End-of-life process
- The product owner proposes the EOL date and records it in the support lifecycle table at least the notice period in section 7.2 ahead.
- Support informs affected customers through account contacts, the support page and, where available, in-product notices.
- Release engineering marks the version line EOL in registries where supported (for example deprecation messages on packages) and on the download archive, with a pointer to the supported upgrade path.
- On the EOL date, CI stops building the line, branch protection is kept, and the branch is archived read-only.
- Within [10] business days after EOL, the product owner confirms the step list above in the revision history of the support page.
8. Security fixes and backports
8.1 Backport rules
- A security fix is developed on the default branch first, unless the affected code exists only on older lines.
- The PSIRT decides the affected version range and the target lines.
- Fixes are cherry-picked to every affected release line in Active, Security-only or contracted Extended support.
- Each backport ships as a PATCH release on its line, with a changelog
Securityentry referencing the advisory. - Coordinated release: all supported lines are published in the same release window, so the fix in one line does not disclose the vulnerability in another.
8.2 Targets
| Severity (from the Vulnerability Management Policy) | Fix released on all supported lines within | Communication |
|---|---|---|
| Critical (Example) | 7 calendar days from confirmation | Security advisory and direct notice to contracted customers |
| High (Example) | 30 calendar days | Security advisory |
| Medium (Example) | Next scheduled minor or patch, at most 90 days | Changelog Security entry; advisory if exploitable |
| Low (Example) | Next scheduled release | Changelog entry |
Severity ratings and exploitation context come from the Vulnerability Management Policy (security/vulnerability-management-policy) and the PSIRT process. Advisories use the Security Advisory template (security/security-advisory), and VEX statements follow the SBOM and VEX Policy (security/sbom-vex-policy).
8.3 When a backport is not possible
If a fix cannot be made safely on an older line (for example it needs a breaking change), the PSIRT and the product owner record an exception under section 11 with the compensating guidance for customers, and offer a free upgrade path to a fixed line. For CRA products this may use the Article 13(10) route, which covers only the remediation requirement of Annex I, Part II, point (2), is available only where later, substantially modified versions of the software have been placed on the market, and requires that users can move to the latest version free of charge and without extra costs to adapt their hardware and software environment. Record the decision and the evidence for each condition in the technical file; every other CRA duty, including disclosure of fixed vulnerabilities and the support period itself, still applies to the older line.
9. Deprecation and breaking changes
9.1 Rules
- A feature, option, interface or supported platform is deprecated in a MINOR release with a
Deprecatedchangelog entry, documentation note and, where technically possible, a runtime warning naming the replacement. - Removal happens only in a MAJOR release (SemVer products) or after the notice period (CalVer products), never in a patch.
- Each breaking change in a major release has upgrade notes with before and after examples and, where possible, an automated migration tool or codemod.
9.2 Notice periods
| Product type | Minimum notice between deprecation and removal |
|---|---|
| Public SDK or library (Example) | 6 months and at least one major release boundary |
| Installable product on an LTS train (Example) | Not removed within the LTS train |
| CLI (Example) | 3 months |
| HTTP or event API | Per API Versioning and Deprecation Policy (architecture/api-deprecation-policy) |
9.3 Breaking change register
| ID | Product | Change | Deprecated in | Removed in | Migration aid |
|---|---|---|---|---|---|
| BRK-001 (Example) | PRD-001 | createCheckout(options) callback form removed in favour of promises | 4.6.0 (2026-04) | 5.0.0 (2026-11) | Codemod corvid-migrate v5 |
| BRK-002 (Example) | PRD-003 | Support for Node.js 20 dropped after its upstream end of life | 5.8.0 | 6.0.0 | Upgrade guide section 2 |
| [BRK-NNN] | [Product] | [Change] | [Version] | [Version] | [Aid] |
10. Publication, immutability and yanking
10.1 Publication
- Releases are published only by the release pipeline identity; no personal tokens publish to production registries.
- Artefacts are signed and carry build provenance; SBOMs are produced as set in the SBOM and VEX Policy (
security/sbom-vex-policy). - Container images are referenced by digest in deployment manifests. Moving tags (
latest,stable,5) MAY exist for convenience but never for production deployment.
10.2 Retention and archives
| Artefact | Retention |
|---|---|
| Release artefacts, signatures, provenance and SBOMs | At least 10 years after release, and for CRA products at least 10 years after each security update or the rest of the support period if longer (Example values; align with legal) |
| Pre-releases | 12 months after the final release (Example) |
| EOL versions | Kept in the archive with a visible warning that they are unsupported and may contain known vulnerabilities |
10.3 Yanking and corrections
- If a release is broken or dangerous, publish a corrected version immediately (PATCH + 1); never re-publish the same number.
- Mark the bad version as yanked or deprecated in the registry where supported, so new installs avoid it while existing lock files still resolve.
- Add
[YANKED]and the reason to its changelog heading. - Delete an artefact only for legal reasons or leaked secrets, with release engineering and legal approval, and record it as an incident.
11. Exceptions and risk acceptance
An exception request states the policy statement affected (section 3), product and versions, reason, risk to consumers, compensating measures, and expiry date. Exceptions expire after at most [6] months and are reviewed in the next policy review.
| ID | Statement | Product | Reason | Compensating measures | Approver | Expires |
|---|---|---|---|---|---|---|
| EXC-REL-001 (Example) | VRP-03 | PRD-001 4.x | A security fix requires removing an unsafe option in 4.9.1 | Option removal documented in advisory; codemod; direct notice to the 14 merchants using it | Product owner and product security lead | 2027-04-30 |
| EXC-REL-002 (Example) | VRP-09 | PRD-003 4.x (extended) | Fix needs a kernel driver change not possible on 4.x | Free upgrade to 5.x; mitigation guide | Product security lead | 2027-01-31 |
| [EXC-REL-NNN] | [VRP-NN] | [Product] | [Reason] | [Measures] | [@name] | YYYY-MM-DD |
Risk acceptance for exceptions that leave a known vulnerability unfixed on a supported line is recorded in the Risk Register (compliance/risk-register).
12. Compliance measurement
| ID | Metric | Formula | Target (Example) | Source |
|---|---|---|---|---|
| REL-M01 | Releases with valid version and signed tag | releases passing version lint and tag signature check / all releases x 100 | 100% | Pipeline logs |
| REL-M02 | Non-major releases with breaking changes | non-major releases later found to contain a breaking change / non-major releases x 100 | 0% | API diff reports, incident log |
| REL-M03 | Changelog coverage | releases with an approved changelog entry / all releases x 100 | 100% | Repository |
| REL-M04 | Security backport lead time | median days from fix merged on default branch to release on the last supported line | Within section 8.2 target | Advisory log |
| REL-M05 | Supported lines with all High and Critical fixes | supported lines with no overdue High or Critical fix / supported lines x 100 | 100% | PSIRT tracker |
| REL-M06 | EOL notice compliance | EOL events announced at least the notice period ahead / EOL events x 100 | 100% | Support page history |
| REL-M07 | Customers on unsupported versions | active installations on EOL versions / active installations x 100 (where telemetry or licence data exists with consent) | Below 5% | Licence server |
Worked example (Example): in Q3 2026 Corvid released 42 versions of PRD-001; 41 passed tag signature checks, so REL-M01 = 41 / 42 x 100 = 97.6%. The failure was a manual tag pushed during an outage and was recorded as an incident.
Results are reported quarterly to the engineering leadership review.
13. Review cycle
- Scheduled review every 12 months by the release engineering lead with the approvers listed in Document control.
- Early review when: a new product line is added; a major regulatory change applies (for example CRA delegated acts setting minimum support periods for a product category); a referenced specification publishes a new version (SemVer, CalVer, Conventional Commits, Keep a Changelog); an exception is renewed twice; or REL-M02 or REL-M05 misses target for two consecutive quarters.
- The review outcome is recorded in the revision history, even when nothing changes.
14. Glossary and references
14.1 Glossary
| Term | Meaning in this policy |
|---|---|
| Public API | Every interface consumers can depend on, declared in documentation, including configuration, CLI and formats |
| Breaking change | A change that can make a correct consumer fail or behave differently without the consumer changing anything |
| Release line | All versions sharing a MAJOR |
| LTS train | A major release line designated for long-term support: minor and patch releases while Active, PATCH only after the next train ships |
| Support period | The time during which a version receives at least security fixes; for CRA products, the period under Article 13(8) |
| End of life (EOL) | The date after which a version receives no fixes or support |
| Yank | Marking a published version as not to be installed, without deleting it |
| Pre-release | A version with a hyphenated identifier, lower in precedence than the release |
| Backport | Applying a fix made on the default branch to an older release line |
14.2 References
| Reference | Use |
|---|---|
| Semantic Versioning 2.0.0, semver.org (CC BY 3.0) | Section 4.2, 4.4 |
| Calendar Versioning, calver.org, spec 26.0 (2026; CC BY-SA 4.0) | Section 4.3 |
| Conventional Commits 1.0.0, conventionalcommits.org | Section 6.1 |
| Keep a Changelog 1.1.0, keepachangelog.com (MIT) | Section 6.2 |
| Regulation (EU) 2024/2847 (Cyber Resilience Act), Official Journal L, 20 November 2024, eur-lex.europa.eu: Article 13(8) to 13(11), 13(19) and Annex I, Part II, points (2), (5) and (8) | Sections 7.4 and 8.3 |
| NIST SP 800-218 SSDF v1.1 (February 2022); SP 800-218 Rev. 1 (SSDF v1.2) initial public draft (December 2025), which adds practice PS.4 on robust and reliable software updates | Sections 8 and 10 (draft cited for direction only) |
Release Checklist (dev/release-checklist) | Per-release tasks |
Changelog (dev/changelog), Release Notes (dev/release-notes) | Change communication |
API Versioning and Deprecation Policy (architecture/api-deprecation-policy) | HTTP and event APIs |
Branching Strategy (dev/branching-strategy), CI/CD Pipeline Design (dev/ci-cd-pipeline-design) | Branches, tags, pipeline |
Software Configuration Management Plan (quality/scm-plan) | Configuration identification and baselines |
Software Maintenance Plan (dev/software-maintenance-plan) | Maintenance resourcing |
Dependency Management Policy (dev/dependency-management-policy) | Runtime and dependency support |
CRA Technical Documentation (security/cra-technical-documentation), CRA Vulnerability Handling (security/cra-vulnerability-handling) | CRA support period and vulnerability duties |
Vulnerability Disclosure Policy (security/vulnerability-disclosure-policy) | Coordinated vulnerability disclosure under Annex I, Part II, point (5) |
PSIRT Vulnerability Handling (security/psirt-vulnerability-handling), Security Advisory (security/security-advisory) | Security fixes and advisories |
Standard and licence note
Based on Semantic Versioning 2.0.0 (semver.org, CC BY 3.0, by Tom Preston-Werner), Calendar Versioning spec 26.0 (calver.org, CC BY-SA 4.0), Conventional Commits 1.0.0 (conventionalcommits.org, CC BY 3.0) and Keep a Changelog 1.1.0 (keepachangelog.com, MIT), and on Regulation (EU) 2024/2847 (Cyber Resilience Act), Article 13(8) to 13(11) and 13(19) and Annex I, Part II, with NIST SP 800-218 (SSDF, a work of the United States Government) cited for context. Rules from these specifications are summarised in original wording; no specification text is reproduced. The CalVer token rules in section 4.3 are adapted from calver.org, whose page footer marks the site content CC BY-SA 4.0 (the site's source repository, github.com/mahmoud/calver, carries a separate BSD-style licence): if you redistribute an adapted version of that material, attribute calver.org and share it under the same licence. CRA provisions are paraphrased; check the consolidated text on EUR-Lex and any delegated or implementing acts before relying on them. This is a documentation format, not legal advice. Check the current official version of each specification before adopting this policy. Original text written for this collection. Template licence: MIT.
संबंधित टेम्पलेट
Code Ownership Policy Template (CODEOWNERS)
Code ownership policy: ownership models, RACI, MUST/SHOULD rules, CODEOWNERS standard and example, review SLAs, escalation, orphaned code, transfers, metrics
सॉफ़्टवेयर और इंजीनियरिंगDependency Management Policy Template (SSDF, Scorecard)
Dependency policy: tiers, intake scoring, approved sources, lock files and SHA pinning, cooldown, update targets, malicious packages, licences, forks, metrics
सॉफ़्टवेयर और इंजीनियरिंगFeature Flag Policy Template (OpenFeature)
Feature flag standard: flag types and lifetimes, naming, metadata, lifecycle, rollout stages, kill switches, change control, testing, privacy, flag debt