Document shared validation integration
This commit is contained in:
@@ -67,6 +67,8 @@ publication owns endpoint guards, tag creation, push, and recovery around that
|
|||||||
same candidate validation path. `internal/validation.CandidateTree` reads
|
same candidate validation path. `internal/validation.CandidateTree` reads
|
||||||
committed blobs lazily and resolves local destinations from committed entries;
|
committed blobs lazily and resolves local destinations from committed entries;
|
||||||
it does not consult neighboring files or traverse submodule checkouts.
|
it does not consult neighboring files or traverse submodule checkouts.
|
||||||
|
See the [shared validation guide](validation.md) for checker, Go command, and
|
||||||
|
candidate-file integration mechanics.
|
||||||
|
|
||||||
## Capability owners and behavioral evidence
|
## Capability owners and behavioral evidence
|
||||||
|
|
||||||
|
|||||||
82
docs/internal/validation.md
Normal file
82
docs/internal/validation.md
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
# Shared validation mechanics
|
||||||
|
|
||||||
|
`internal/validation` owns reusable checks for one captured candidate.
|
||||||
|
`internal/candidate` captures the clean source revision and keeps the
|
||||||
|
validation sequence shared by local checking and publication. It calls the
|
||||||
|
shared executor, runs product-specific `AdditionalChecks` once, and owns the
|
||||||
|
post-validation build callback and local-state recheck. `internal/publish`
|
||||||
|
adds its endpoint guards, tag creation, push, and recovery around that same
|
||||||
|
candidate path.
|
||||||
|
|
||||||
|
The current executor runs the default offline Go suite. Its request carries the
|
||||||
|
captured repository directory and commit, output writer, and internal
|
||||||
|
settings. `Request.ReadCandidateTree` lets a selected file check request
|
||||||
|
candidate contents; the default Go-only path does not enumerate the tree.
|
||||||
|
`CandidateTree` gets metadata and bytes from Git objects, reads blob bytes
|
||||||
|
lazily, and resolves destinations without consulting the worktree or
|
||||||
|
neighboring files.
|
||||||
|
|
||||||
|
## Adding a shared check
|
||||||
|
|
||||||
|
When an optional check is accepted for implementation:
|
||||||
|
|
||||||
|
1. Define its typed Go setting in the root facade and its equivalent CLI-owned
|
||||||
|
JSON field. Specify zero-value and omitted-profile behavior in GoDoc and the
|
||||||
|
configuration reference. Keep future settings in the roadmap until their
|
||||||
|
check is implemented.
|
||||||
|
2. Add the corresponding internal setting and explicit conversions. Use the
|
||||||
|
same root request conversion for `Check` and `Publish`, and the shared CLI
|
||||||
|
request conversion for profile-based candidate commands.
|
||||||
|
3. Implement a plain check function owned by `internal/validation`. Keep its
|
||||||
|
rule semantics in the capability owner and pass only the captured candidate
|
||||||
|
inputs it needs. A file-oriented check can call `Request.ReadCandidateTree`
|
||||||
|
and read only the blobs it inspects.
|
||||||
|
4. Return an internal `*Failure` with the check identity, repository-relative
|
||||||
|
findings, useful locations where available, and the underlying cause. Let
|
||||||
|
the root facade convert those records to its own diagnostic types. Preserve
|
||||||
|
cancellation and process errors through `Unwrap`.
|
||||||
|
5. Add the check to the shared executor at the ordering point selected by its
|
||||||
|
capability. Stop on failure. Keep product assertions in `AdditionalChecks`
|
||||||
|
and profile `checks`; keep artifact building in `internal/build`.
|
||||||
|
6. Cover observable behavior through both the Go facade and profile path when
|
||||||
|
both are supported. Check default behavior, useful findings, cause
|
||||||
|
preservation, cancellation where relevant, and failure stopping. Reuse the
|
||||||
|
existing local Git and CLI fixtures.
|
||||||
|
7. Update only the canonical owners for behavior that has landed: GoDoc for the
|
||||||
|
API, configuration and CLI references for profile behavior, and this
|
||||||
|
inventory for internal ownership. Keep later feature contracts in the
|
||||||
|
product roadmap.
|
||||||
|
|
||||||
|
Do not add a public validator registration interface. The public specification
|
||||||
|
selects ReleaseKit-owned checks; `AdditionalChecks` remains the extension point
|
||||||
|
for product behavior.
|
||||||
|
|
||||||
|
## Prospective Go command recipe
|
||||||
|
|
||||||
|
The complete planned procedure uses one test invocation. Race selection
|
||||||
|
modifies that command. When a separate full vet pass is selected, run tests with
|
||||||
|
vet disabled and then run native `go vet`. Selected package-compilation targets
|
||||||
|
run after test and vet with the static Go environment, including
|
||||||
|
`CGO_ENABLED=0`. Keep these compatibility checks independent of executable
|
||||||
|
artifact declarations. These selections become operational as their checkers
|
||||||
|
are implemented.
|
||||||
|
|
||||||
|
Reuse `internal/gotool` for native and static environments and target handling.
|
||||||
|
Keep toolchain and module-cache discovery in `gotool`; do not reproduce its
|
||||||
|
environment logic in a checker. Build output names, version injection, native
|
||||||
|
smoke checks, and artifact digests remain owned by `internal/build`.
|
||||||
|
|
||||||
|
## File-check coordination
|
||||||
|
|
||||||
|
File checks consume the captured tree and return findings to the shared error
|
||||||
|
model. They do not read sibling worktrees or follow live symlink targets.
|
||||||
|
`CandidateTree.ResolveDestination` returns data describing entries,
|
||||||
|
directories, missing paths, checkout boundaries, submodule paths, and symlink
|
||||||
|
cycles; the caller selects which observations fail validation or are reported
|
||||||
|
as out of scope.
|
||||||
|
|
||||||
|
The Markdown capability will use PromptKit's current parser and anchor
|
||||||
|
conventions as its starting evidence. Supported link syntax, anchors,
|
||||||
|
diagnostics, and boundary policy belong to that feature's roadmap and
|
||||||
|
implementation prompt. This foundation provides only the committed-file and
|
||||||
|
destination-resolution primitives.
|
||||||
@@ -342,6 +342,11 @@ will add setting-specific mapping/equivalence cases at this established boundary
|
|||||||
|
|
||||||
## Stage 7: Record capability integration recipes and consumer shapes
|
## Stage 7: Record capability integration recipes and consumer shapes
|
||||||
|
|
||||||
|
**Completion:** Complete. Internal guidance now records setting and checker
|
||||||
|
ownership, Go command coordination, and candidate-file integration. The
|
||||||
|
prospective examples below compare the agreed declarations with the read-only
|
||||||
|
consumer review.
|
||||||
|
|
||||||
**Outcome:** Subsequent feature prompts can use the foundation without redesigning
|
**Outcome:** Subsequent feature prompts can use the foundation without redesigning
|
||||||
its ownership or inventing a public extension framework.
|
its ownership or inventing a public extension framework.
|
||||||
|
|
||||||
@@ -372,6 +377,172 @@ and the ownership table in `model.md`. Confirm product checks still fit the
|
|||||||
existing callback/profile extension point. Runtime tests are self-contained and
|
existing callback/profile extension point. Runtime tests are self-contained and
|
||||||
independent of the three sibling checkouts.
|
independent of the three sibling checkouts.
|
||||||
|
|
||||||
|
### Prospective consumer shapes
|
||||||
|
|
||||||
|
These examples show the agreed model before its optional settings are
|
||||||
|
implemented. The `Validation` field and the profile `validation` object are
|
||||||
|
prospective until their corresponding checkers land.
|
||||||
|
|
||||||
|
#### Audita: retain the existing artifact build
|
||||||
|
|
||||||
|
The zero-value validation selection preserves current defaults while the
|
||||||
|
existing Linux application artifacts remain declared separately:
|
||||||
|
|
||||||
|
```go
|
||||||
|
request := releasekit.ReleaseRequest{
|
||||||
|
Product: "Audita",
|
||||||
|
Version: version,
|
||||||
|
Validation: releasekit.ValidationSpec{}, // prospective; zero value keeps current validation
|
||||||
|
Build: &releasekit.BuildSpec{
|
||||||
|
MainPackage: "./cmd/audita",
|
||||||
|
BinaryName: "audita",
|
||||||
|
Targets: []releasekit.Target{
|
||||||
|
{OS: "linux", Arch: "amd64"},
|
||||||
|
{OS: "linux", Arch: "arm64"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Its profile keeps the existing build declaration and omits `validation`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"product": "Audita",
|
||||||
|
"remote": "origin",
|
||||||
|
"build": {
|
||||||
|
"main_package": "./cmd/audita",
|
||||||
|
"binary_name": "audita",
|
||||||
|
"targets": ["linux/amd64", "linux/arm64"]
|
||||||
|
},
|
||||||
|
"delivery": {
|
||||||
|
"base_url": "https://gitea.maximumdirect.net",
|
||||||
|
"owner": "eric",
|
||||||
|
"repository": "audita",
|
||||||
|
"token_env": "RELEASEKIT_GITEA_TOKEN"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### ConfigKit: select release compatibility checks
|
||||||
|
|
||||||
|
The declaration expresses its race test, separate full vet, and source-only
|
||||||
|
Linux compilation commitments without selecting executable artifacts:
|
||||||
|
|
||||||
|
```go
|
||||||
|
request := releasekit.ReleaseRequest{
|
||||||
|
Product: "ConfigKit",
|
||||||
|
Version: version,
|
||||||
|
Validation: releasekit.ValidationSpec{
|
||||||
|
Go: releasekit.GoValidationSpec{
|
||||||
|
Race: true,
|
||||||
|
FullVet: true,
|
||||||
|
CompileTargets: []releasekit.Target{
|
||||||
|
{OS: "linux", Arch: "amd64"},
|
||||||
|
{OS: "linux", Arch: "arm64"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"product": "ConfigKit",
|
||||||
|
"validation": {
|
||||||
|
"go": {
|
||||||
|
"race": true,
|
||||||
|
"full_vet": true,
|
||||||
|
"compile_targets": ["linux/amd64", "linux/arm64"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The consumer's baseline-toolchain requirement remains its compatibility
|
||||||
|
decision. The selection above describes checks, not a promise to run them with
|
||||||
|
every Go toolchain.
|
||||||
|
|
||||||
|
#### PromptKit: share mechanics and keep example assertions
|
||||||
|
|
||||||
|
Shared settings cover the maintained race and vet passes, Go formatting,
|
||||||
|
checkout-bounded Markdown links, and the two distribution rules. Substantive
|
||||||
|
example assertions remain in the existing `AdditionalChecks` extension point
|
||||||
|
or profile `checks`:
|
||||||
|
|
||||||
|
```go
|
||||||
|
request := releasekit.ReleaseRequest{
|
||||||
|
Product: "Promptkit",
|
||||||
|
Version: version,
|
||||||
|
Validation: releasekit.ValidationSpec{
|
||||||
|
Go: releasekit.GoValidationSpec{Race: true, FullVet: true},
|
||||||
|
GoFormat: true,
|
||||||
|
Markdown: &releasekit.MarkdownValidationSpec{EnforceCheckoutBoundary: true},
|
||||||
|
ModuleDistribution: releasekit.ModuleDistributionValidationSpec{
|
||||||
|
WorkspaceFiles: true,
|
||||||
|
LocalReplacements: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
AdditionalChecks: checkExamples,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"product": "Promptkit",
|
||||||
|
"validation": {
|
||||||
|
"go": {"race": true, "full_vet": true},
|
||||||
|
"go_format": true,
|
||||||
|
"markdown": {"enforce_checkout_boundary": true},
|
||||||
|
"module_distribution": {
|
||||||
|
"workspace_files": true,
|
||||||
|
"local_replacements": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"checks": [
|
||||||
|
{"args": ["python3", "scripts/check-examples.py"]}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The example-check command is illustrative of a product-owned check retained
|
||||||
|
from PromptKit's current release assertions; it is not a file in the reviewed
|
||||||
|
checkout.
|
||||||
|
|
||||||
|
### Read-only consumer review
|
||||||
|
|
||||||
|
Reviewed on 2026-10-07. All three local worktrees were clean. The declarations
|
||||||
|
were compared with Audita `bd62f36`, ConfigKit `dc09959`, and PromptKit
|
||||||
|
`7310ef3`; no sibling repository was modified.
|
||||||
|
|
||||||
|
- Audita's `releasekit.json` already declares its product, remote, Linux binary
|
||||||
|
build, and Gitea destination. Its nine-line `scripts/release.sh` builds the
|
||||||
|
module-selected ReleaseKit executable and delegates to it. It has no
|
||||||
|
additional candidate-validation block to remove; omitting optional
|
||||||
|
selections preserves its current validation. Module-selected CI bootstrap
|
||||||
|
remains separate later work.
|
||||||
|
- ConfigKit's 29-line `scripts/release-check.sh` selects one race test run with
|
||||||
|
test-time vet disabled, runs full vet, and compiles all packages for Linux
|
||||||
|
amd64 and arm64. Those invocation and target-loop mechanics correspond to
|
||||||
|
the shared Go settings. Its 133-line publication script also checks an
|
||||||
|
expected remote URL and advances `main` before publishing a tag. The
|
||||||
|
endpoint expectation is a separate publication capability; the main-branch
|
||||||
|
publication flow remains product-specific. Its `CONFIGKIT_BASELINE_TOOLCHAIN`
|
||||||
|
requirement covers cached supported Go 1.25 patch releases and remains a
|
||||||
|
consumer commitment.
|
||||||
|
- PromptKit's 152-line `scripts/release-check.sh` owns the race suite, separate
|
||||||
|
vet, tracked-Go formatting check, Markdown link and heading checks,
|
||||||
|
workspace-file and local-replacement checks, a vendor-directory rejection,
|
||||||
|
and substantive example output assertions. The shared validation settings
|
||||||
|
correspond to race, vet, formatting, Markdown, workspace-file, and
|
||||||
|
replacement mechanics; vendor and example assertions remain product checks.
|
||||||
|
Its 57-line `scripts/release.sh` also checks release-note sections and
|
||||||
|
publishes an annotated tag, which remain in the product's release procedure.
|
||||||
|
|
||||||
|
The file-size capability has no corresponding local check in these reviewed
|
||||||
|
scripts. Consumer migrations and measurements of realized code removal remain
|
||||||
|
outside this implementation plan.
|
||||||
|
|
||||||
## Stage 8: Verify and document the completed foundation
|
## Stage 8: Verify and document the completed foundation
|
||||||
|
|
||||||
**Outcome:** The enabling refactor is complete, its current boundary is clear,
|
**Outcome:** The enabling refactor is complete, its current boundary is clear,
|
||||||
|
|||||||
Reference in New Issue
Block a user