Accept the declarative validation ADR
This commit is contained in:
76
docs/adr/0003-declarative-validation.md
Normal file
76
docs/adr/0003-declarative-validation.md
Normal file
@@ -0,0 +1,76 @@
|
||||
# ADR 0003: Declare optional validation through a shared specification
|
||||
|
||||
## Status
|
||||
|
||||
Accepted.
|
||||
|
||||
## Date
|
||||
|
||||
2026-10-07
|
||||
|
||||
## Context
|
||||
|
||||
Consumers have different release-validation needs. Their additional checks
|
||||
include reusable mechanics such as formatting inspection and Go toolchain
|
||||
invocations, alongside assertions about product behavior. Maintaining the
|
||||
reusable mechanics in each application duplicates code and coordination work.
|
||||
|
||||
[ADR 0001](0001-public-facade.md) establishes facade ownership of public
|
||||
contracts. [ADR 0002](0002-routine-releases.md) prioritizes routine releases
|
||||
with little application-owned code or recurring developer effort. Optional
|
||||
validation needs a common selection and execution model that supports these
|
||||
decisions as shared capabilities grow.
|
||||
|
||||
## Decision
|
||||
|
||||
Consumers select shared validation through a typed, facade-owned specification
|
||||
and equivalent release-profile settings. Related settings belong together.
|
||||
Omitted optional settings preserve existing default validation behavior.
|
||||
|
||||
`Check` and `Publish` use one internal validation path bound to the captured
|
||||
candidate. ReleaseKit owns execution, ordering, coordination between selected
|
||||
checks, and propagation of failures and cancellation. The CLI maps profile
|
||||
settings to the facade and owns presentation.
|
||||
|
||||
Shared validation exposes consistent diagnostics through facade-owned errors.
|
||||
Findings identify the check and provide actionable detail where applicable.
|
||||
Error wrapping preserves underlying causes and cancellation semantics.
|
||||
Validation failures and publication outcomes retain their distinct meanings.
|
||||
|
||||
The existing `AdditionalChecks` callback and profile `checks` support
|
||||
product-specific assertions. Publication guards, artifact builds, and delivery
|
||||
retain their separate configuration and responsibilities. Validation execution
|
||||
and coordination remain internal implementation responsibilities.
|
||||
|
||||
Evaluate optional capabilities by the application maintenance they remove,
|
||||
their clarity of scope, configuration burden, and maintenance cost. A
|
||||
capability can serve a small subset of consumers when those benefits justify
|
||||
shared support. Consumers select the checks appropriate to their products.
|
||||
|
||||
GoDoc owns exact public API contracts, and the configuration reference owns
|
||||
profile settings. Roadmaps own feature scope and implementation sequencing.
|
||||
|
||||
## Alternatives considered
|
||||
|
||||
- Consumer-owned commands preserve local control and leave applications
|
||||
maintaining reusable inspection, invocation, and coordination code.
|
||||
- Independently configured check and publication paths allow separate
|
||||
validation choices and require consumers to keep those choices aligned.
|
||||
- A public validator-registration framework supports custom composition and
|
||||
expands the public lifecycle and ordering contracts. The existing
|
||||
additional-check extension point supports current product-specific needs.
|
||||
|
||||
## Consequences
|
||||
|
||||
Applications can replace repeated release mechanics with small declarations.
|
||||
Go callers and CLI users receive equivalent selected validation through the
|
||||
same release operations. Existing consumers retain their default behavior and
|
||||
additional-check integration as optional capabilities are introduced.
|
||||
|
||||
ReleaseKit assumes responsibility for maintaining shared checks, coordinating
|
||||
their interactions, and presenting useful diagnostics. Public selections and
|
||||
error contracts carry compatibility obligations. Verification must cover
|
||||
default behavior, equivalent API and profile selections, and failure propagation.
|
||||
|
||||
Internal execution can evolve within the facade boundaries. Each new capability
|
||||
requires a clear scope and evidence that shared ownership reduces consumer work.
|
||||
Reference in New Issue
Block a user