Record shared source version policy
This commit is contained in:
89
docs/adr/0013-shared-source-version-checks.md
Normal file
89
docs/adr/0013-shared-source-version-checks.md
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
# ADR 0013: Check Source Versions with One Shared Policy
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
Accepted. The [shared source-version roadmap](../roadmap/source-version-checks.md)
|
||||||
|
owns target behavior, and its [implementation plan](../roadmap/implementation.md)
|
||||||
|
owns delivery status and sequencing.
|
||||||
|
|
||||||
|
## Date
|
||||||
|
|
||||||
|
2026-10-15
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
Applications that assemble one configuration from independently authored
|
||||||
|
documents need a way to require that each contributing document declares a
|
||||||
|
version accepted by the application's existing `Definition.Version` checker.
|
||||||
|
Checking only the eventual composed value lets another source hide a rejected
|
||||||
|
declaration, while separate consumer-side parsing duplicates ConfigKit's source
|
||||||
|
handling and diagnostics.
|
||||||
|
|
||||||
|
The extension must preserve one application-owned acceptance policy and the
|
||||||
|
existing loading lifecycle. Source declarations are compatibility evidence, not
|
||||||
|
independent fragment schemas or values to compare for equality. Existing
|
||||||
|
composition, placement, precedence, source identity, diagnostics, and
|
||||||
|
sensitivity rules remain authoritative.
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
Provide a load-wide source-version mode for ordinary and layered loading. The
|
||||||
|
zero-value mode preserves current behavior. The enabled modes check declarations
|
||||||
|
when present or require them, using the existing `Definition.Version` path and
|
||||||
|
checker. Interpret the configured path relative to each participating source
|
||||||
|
before placement or composition. Different declarations may be accepted by the
|
||||||
|
same checker; ConfigKit adds no equality, SemVer, or expected-version rule.
|
||||||
|
|
||||||
|
Apply the selected policy to the actual main document, direct underlays,
|
||||||
|
imports, and selected overlays. Missing non-main declarations are skipped in
|
||||||
|
if-present mode and rejected in required mode. Existing main absence behavior
|
||||||
|
remains, with required mode additionally rejecting an absent declaration on an
|
||||||
|
actual main document. `NoSource`, unmatched optional inputs, synthetic field
|
||||||
|
operations, and empty groups do not become documents that need declarations.
|
||||||
|
|
||||||
|
Reuse the existing version vocabulary and validation boundary: absence, null,
|
||||||
|
exact strings, and strict decimal integers retain their established meanings;
|
||||||
|
unsupported present values fail version-type validation. Warnings remain
|
||||||
|
nonfatal, and source declarations do not replace final application decoding or
|
||||||
|
domain validation.
|
||||||
|
|
||||||
|
After an accepted non-main declaration is checked, consume exactly that node
|
||||||
|
before its remaining application content is composed or overlaid. Preserve the
|
||||||
|
main declaration and its value semantics. Keep the declaration, source-local
|
||||||
|
path, physical location, and checked absence as detached source evidence,
|
||||||
|
separate from effective application values and history. Apply established
|
||||||
|
sensitivity rules to that evidence, including original mounted paths and
|
||||||
|
ancestors; retain existing safe failure disclosure.
|
||||||
|
|
||||||
|
In enabled modes, the main declaration remains source-local while its protected
|
||||||
|
application path is derived from the main input's destination. This distinction
|
||||||
|
does not change default-mode path interpretation or weaken protection of
|
||||||
|
remaining payload and synthetic operations.
|
||||||
|
|
||||||
|
Public option-field additions and the enabled-mode interpretation for mounted
|
||||||
|
main inputs are compatibility considerations for separately authorized minor-
|
||||||
|
release preparation. This decision does not select a release version or
|
||||||
|
authorize release notes or publication.
|
||||||
|
|
||||||
|
## Alternatives Considered
|
||||||
|
|
||||||
|
- **Check only the final composed value.** Later sources can hide an earlier
|
||||||
|
rejected declaration, so this does not validate every contributing document.
|
||||||
|
- **Let consumers parse and check each source.** This duplicates acquisition,
|
||||||
|
source attribution, safe diagnostics, and lifecycle coordination in every
|
||||||
|
application.
|
||||||
|
- **Require declarations to be equal or impose a universal version grammar.**
|
||||||
|
Consumers already own the acceptance policy; ConfigKit need not invent an
|
||||||
|
expected value or a domain-specific compatibility rule.
|
||||||
|
- **Keep accepted non-main declarations in application payload.** A selected
|
||||||
|
source-local declaration is metadata for this policy and cannot also remain
|
||||||
|
an ordinary field at the same path without ambiguity.
|
||||||
|
|
||||||
|
## Consequences
|
||||||
|
|
||||||
|
Consumers can apply one existing version policy across contributing documents
|
||||||
|
and select gradual or required adoption per load. Accepted non-main headers no
|
||||||
|
longer participate in application composition; their inspectable evidence is
|
||||||
|
kept separate and subject to sensitivity classification. Default callers retain
|
||||||
|
current behavior. The implementation plan records the concrete API names,
|
||||||
|
integration order, and validation evidence.
|
||||||
@@ -50,6 +50,7 @@ public behavior.
|
|||||||
Accepted decisions:
|
Accepted decisions:
|
||||||
|
|
||||||
- [Separate composition and overlay](adr/0001-separate-composition-and-overlay.md)
|
- [Separate composition and overlay](adr/0001-separate-composition-and-overlay.md)
|
||||||
|
- [Check source versions with one shared policy](adr/0013-shared-source-version-checks.md)
|
||||||
- [Own YAML semantics behind a private parser boundary](adr/0002-own-yaml-semantics.md)
|
- [Own YAML semantics behind a private parser boundary](adr/0002-own-yaml-semantics.md)
|
||||||
- [Preserve presence and record application resolution](adr/0003-preserve-presence-and-resolution-history.md)
|
- [Preserve presence and record application resolution](adr/0003-preserve-presence-and-resolution-history.md)
|
||||||
- [Secret references and explicit bootstrap](adr/0004-secret-references-and-explicit-bootstrap.md)
|
- [Secret references and explicit bootstrap](adr/0004-secret-references-and-explicit-bootstrap.md)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Implement shared source version checks
|
# Implement shared source version checks
|
||||||
|
|
||||||
Status: planned; no implementation stages are complete.
|
Status: Stage 1 complete; runtime implementation has not started.
|
||||||
|
|
||||||
Audience: a Luna coding agent implementing one numbered stage per prompt, in
|
Audience: a Luna coding agent implementing one numbered stage per prompt, in
|
||||||
order. The [feature roadmap](source-version-checks.md) owns target behavior and
|
order. The [feature roadmap](source-version-checks.md) owns target behavior and
|
||||||
@@ -219,6 +219,15 @@ git diff --check
|
|||||||
Validate: local-link test and whitespace. Done: baseline and accepted decision
|
Validate: local-link test and whitespace. Done: baseline and accepted decision
|
||||||
recorded, with no runtime changes.
|
recorded, with no runtime changes.
|
||||||
|
|
||||||
|
Completion evidence: reviewed baseline `d9f08ff7198ad5a8fb5c49a43e7ccdad2ad0e707`
|
||||||
|
and the clean implementation worktree at `70c95bf660794809e58182d736c67c9085238705`;
|
||||||
|
confirmed ADR 0013 was unused. The everyday check passed with Go
|
||||||
|
`go1.26.8 linux/amd64` using
|
||||||
|
`GOTOOLCHAIN=local GOPROXY=off ./scripts/check.sh`. Documentation links and
|
||||||
|
whitespace are validated for this unit. No environmental limitation affected
|
||||||
|
these checks; validation was performed on Linux/amd64 only. No runtime changes
|
||||||
|
were made.
|
||||||
|
|
||||||
## Stage 2 — Share version interpretation without changing defaults
|
## Stage 2 — Share version interpretation without changing defaults
|
||||||
|
|
||||||
1. Separate reusable value interpretation and callback reporting from checkVersion,
|
1. Separate reusable value interpretation and callback reporting from checkVersion,
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# Shared Source Version Checks Roadmap
|
# Shared Source Version Checks Roadmap
|
||||||
|
|
||||||
Status: design decisions settled; implementation has not started. The
|
Status: design decisions are recorded in [ADR 0013](../adr/0013-shared-source-version-checks.md);
|
||||||
|
implementation has not started. The
|
||||||
[implementation plan](implementation.md) owns execution order, concrete API and
|
[implementation plan](implementation.md) owns execution order, concrete API and
|
||||||
integration decisions, and completion evidence. This roadmap develops the
|
integration decisions, and completion evidence. This roadmap develops the
|
||||||
partially accepted source-version request in
|
partially accepted source-version request in
|
||||||
|
|||||||
Reference in New Issue
Block a user