Accept ADR 0005 for module-scoped releases
This commit is contained in:
111
docs/adr/0005-module-release-scope.md
Normal file
111
docs/adr/0005-module-release-scope.md
Normal file
@@ -0,0 +1,111 @@
|
||||
# ADR 0005: Select a Go module as the unit of release
|
||||
|
||||
## Status
|
||||
|
||||
Accepted.
|
||||
|
||||
## Date
|
||||
|
||||
2026-10-09
|
||||
|
||||
## Context
|
||||
|
||||
A Go repository can contain independently versioned modules. CommandKit plans
|
||||
to release its core and optional integrations from one repository. Each module
|
||||
needs its own validation, release note, semantic version, and Git tag.
|
||||
|
||||
ReleaseKit currently couples the semantic version to the Git tag and uses the
|
||||
repository directory for Go validation and release-note discovery. Supporting
|
||||
independent modules through consumer-owned publication code would duplicate
|
||||
ReleaseKit's responsibilities.
|
||||
|
||||
[ADR 0002](0002-routine-releases.md) prioritizes routine releases with little
|
||||
application-owned code or recurring decision-making.
|
||||
[ADR 0003](0003-declarative-validation.md) establishes shared declarative
|
||||
validation. Module selection should give those checks a coherent release scope.
|
||||
|
||||
## Decision
|
||||
|
||||
Each check or publication invocation selects one Go module within a Git
|
||||
repository. Omitted module selection means the repository-root module. The
|
||||
public Go API and CLI/profile interface express the same selection. Consumers
|
||||
can use small per-module profiles through a shared launcher.
|
||||
|
||||
ReleaseKit distinguishes the repository directory, selected module directory,
|
||||
semantic version, and complete Git tag. It derives the tag using Go's module
|
||||
tag conventions and the selected module's committed declaration. Derivation
|
||||
accounts for major-version directories. For example, a module in
|
||||
`integrations/ckconfig` at `v0.2.0` uses the tag
|
||||
`integrations/ckconfig/v0.2.0`. A module declared with a `/v2` suffix and stored
|
||||
in `integrations/ckconfig/v2` uses `integrations/ckconfig/v2.0.0` for `v2.0.0`.
|
||||
|
||||
The semantic version identifies the module release. The complete tag identifies
|
||||
its source in the shared repository and governs uniqueness, tag creation,
|
||||
publication, source links, and recovery. Candidate evidence, publication
|
||||
results, and CLI output identify the selected module and both version and tag,
|
||||
alongside the existing commit and publication evidence. Failure outcomes retain
|
||||
the resolved identity for recovery.
|
||||
|
||||
Release notes belong at `<module-directory>/docs/releases/<version>.md` and
|
||||
identify the product and semantic version in their title. ReleaseKit reads the
|
||||
selected note from the captured candidate. Root-module releases retain the
|
||||
existing note layout and unprefixed tags. Modules can publish equal semantic
|
||||
versions through their distinct notes and tags.
|
||||
|
||||
Mandatory and optional release validation share the selected module's scope.
|
||||
Go tests, selected vet, and package compilation execute in that module with
|
||||
the existing offline environment. File checks inspect the module's committed
|
||||
contents and relevant release materials. Independently released nested modules
|
||||
are excluded from their parent's validation scope. Selecting the root module
|
||||
follows the same rule.
|
||||
|
||||
A check may inspect referenced material outside the selected module when needed
|
||||
to validate an in-scope item. Resolving a Markdown link to shared repository
|
||||
documentation does not add that destination's documents to the validation input
|
||||
set. The checkout remains the boundary for checks of outside-checkout links.
|
||||
Shared release materials follow established conventions and documented
|
||||
consumer requirements.
|
||||
|
||||
Product-specific checks receive the selected module context and repository
|
||||
context for deliberate composition checks. ReleaseKit applies module selection
|
||||
consistently across its shared checks, avoiding separate scope settings for
|
||||
each check.
|
||||
|
||||
Publication guards cover the shared repository: cleanliness, branch, candidate
|
||||
commit, authoritative endpoint, and the complete selected tag. The standard
|
||||
suite runs once for the selected candidate and module. Successful source-tag
|
||||
publication remains the completion point, with existing failure and uncertain
|
||||
publication outcomes preserved. Consumers prepare released sibling dependencies
|
||||
and choose their publication order.
|
||||
|
||||
## Alternatives considered
|
||||
|
||||
- Consumer-owned module publication gives each application responsibility for
|
||||
tag conventions, validation, and recovery, duplicating shared mechanics.
|
||||
- Module-local Go execution with repository-wide optional validation lets
|
||||
unrelated modules block a selected release and gives checks inconsistent
|
||||
scopes.
|
||||
- Independent scope settings for each check require consumers to coordinate
|
||||
multiple declarations of the same release boundary.
|
||||
- Coordinated multi-module publication adds release-set and dependency-ordering
|
||||
responsibilities beyond the demonstrated need for individual releases.
|
||||
|
||||
## Consequences
|
||||
|
||||
Consumers describe the module and product being released while ReleaseKit owns
|
||||
the common procedure. Existing single-module repositories retain their default
|
||||
behavior. Root modules containing independently released nested modules gain
|
||||
module-scoped validation; release notes and migration guidance must explain
|
||||
that change.
|
||||
|
||||
The shared candidate and publication paths must carry module scope and separate
|
||||
version and tag identity throughout validation, diagnostics, and recovery.
|
||||
Verification must cover root defaults, nested-module failures, equal versions
|
||||
across modules, major-version directories, validation boundaries, and exact-tag
|
||||
publication outcomes.
|
||||
|
||||
GoDoc and consumer documentation will own exact API and scope contracts.
|
||||
Configuration and CLI documentation will own profile fields, commands, and
|
||||
output. Implementation planning will define interactions with artifact builds
|
||||
and hosted delivery. ReleaseKit's maintainer release policy continues to govern
|
||||
ReleaseKit's own releases; consumers document their adopted module conventions.
|
||||
Reference in New Issue
Block a user