229 lines
17 KiB
Markdown
229 lines
17 KiB
Markdown
# Development
|
|
|
|
Start here when contributing to ConfigKit. Read the task-specific owners below
|
|
before making changes. The [component overview](internal/overview.md) maps
|
|
implementation responsibilities; the [configuration contract](config.md) owns
|
|
public behavior.
|
|
|
|
## Initial orientation
|
|
|
|
1. Inspect the working tree and preserve unrelated changes.
|
|
2. Use the Policy Reading Guide below to select applicable policies.
|
|
3. Read the contract and internal documents applicable to the task.
|
|
4. Inspect the relevant implementation and behavioral tests before changing them.
|
|
|
|
## Policy Reading Guide
|
|
|
|
| Policy | Read before… |
|
|
| --- | --- |
|
|
| [Policy set provenance](policy/meta.md) | Adopting policies, checking upstream revisions, or updating the adopted policy set. |
|
|
| [Agents](policy/agents.md) | Recommending, planning, or implementing repository changes. |
|
|
| [Architecture](policy/architecture.md) | Planning or changing Go library code or its structure. |
|
|
| [Testing](policy/testing.md) | Selecting validation for code changes, or adding, changing, removing, or evaluating tests. |
|
|
| [Documentation](policy/documentation.md) | Writing, revising, or reorganizing documentation. |
|
|
| [OSS](policy/oss.md) | Adding or updating dependencies or incorporated third-party material, or changing licensing or attribution. |
|
|
| [Release](policy/release.md) | Preparing or publishing a release, changing release procedures, or making versioning and compatibility decisions. |
|
|
|
|
- Read applicable policies before making decisions they govern; multiple policies
|
|
may apply.
|
|
- Select policies using the task triggers above. Follow cross-references to
|
|
relevant sections when needed to resolve a concrete question.
|
|
- Reuse policies already available in context; reread when changed or no longer
|
|
available.
|
|
- Expand reading when the task's scope expands.
|
|
- When revising a policy itself, read that policy and any provisions elsewhere
|
|
affected by the revision.
|
|
|
|
## Task-specific reading guide
|
|
|
|
| Task | Read |
|
|
| --- | --- |
|
|
| Repository orientation or component responsibility | [Component overview](internal/overview.md) |
|
|
| Input destinations | [Configuration contract](config.md#input-destinations), [ADR 0011](adr/0011-input-destinations.md), and the destination tests below |
|
|
| Shared source-version checks | [Configuration contract](config.md#shared-source-version-checks), [ADR 0013](adr/0013-shared-source-version-checks.md), and the version/source-version tests below |
|
|
| Documentation changes | The owning document |
|
|
| Licensing, dependencies, attribution, or release-document changes | [Project grant](../COPYRIGHT) and [attribution](oss/attribution.md); release changes also follow the release procedure |
|
|
| Architecture decisions or future work | [Future features](roadmap/future.md) and relevant ADRs listed below |
|
|
| Code and test changes | The owning contract and tests from the map below |
|
|
| Examples or copyable assets | The owning implemented contract and [consumer adoption guide](consumers/README.md) |
|
|
| Release preparation | [Release procedure](release.md) |
|
|
|
|
Accepted decisions:
|
|
|
|
- [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)
|
|
- [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)
|
|
- [Explicit overrides and safe explanation](adr/0005-explicit-overrides-and-safe-explanation.md)
|
|
- [Keep the public facade root-owned](adr/0006-public-facade.md)
|
|
- [Compare frozen effective configuration snapshots](adr/0010-effective-configuration-diff.md)
|
|
- [Place inputs at literal application mapping paths](adr/0011-input-destinations.md)
|
|
|
|
For cross-cutting changes, follow every applicable row. Completed implementation
|
|
and remediation plans are preserved in Git history at `cb5b435`; use current
|
|
contracts and the component overview for ongoing work. For example:
|
|
|
|
```sh
|
|
git show cb5b435:docs/roadmap/remediation.md
|
|
```
|
|
|
|
Release-candidate, publication, and verification work follows the operational
|
|
[release procedure](release.md). Its module-selected ReleaseKit `publish`
|
|
invocation validates the committed candidate and publishes only the intended
|
|
tag; those release checks remain distinct from the everyday development check.
|
|
|
|
The completed string-and-integer schema-version implementation and remediation
|
|
records are preserved in Git history at `244104f`. The
|
|
[configuration contract](config.md#application-schema-versions) owns current behavior.
|
|
|
|
The completed source-origins and public-facade roadmaps, implementation plan, and
|
|
resolved review findings are preserved in Git history at `5760614`, for example
|
|
`git show 5760614:docs/roadmap/remediation.md`. The earlier source-origins staged
|
|
plan remains at `28e7fc5:docs/roadmap/implementation.md`. Current resolution
|
|
behavior belongs to the [configuration contract](config.md#recorded-application-resolution),
|
|
and current facade ownership belongs to the [component overview](internal/overview.md).
|
|
|
|
## Baseline validation
|
|
|
|
The completed filesystem-source and underlay roadmap, original feature request,
|
|
implementation plan, and resolved remediation record are preserved in Git history
|
|
at `b604aa1` under `docs/roadmap/`. Current behavior belongs to the
|
|
[configuration contract](config.md#layered-loading). Built-in sibling
|
|
inheritance is now part of the [configuration contract](config.md#sibling-inheritance).
|
|
The completed request, roadmap, plan, and resolved review findings are preserved
|
|
in Git history at `83c59ea` under `docs/roadmap/`.
|
|
|
|
The completed overlay rename plan and release-workflow simplification record are
|
|
preserved in Git history at `73ce6e9` under `docs/roadmap/`. Current overlay
|
|
behavior belongs to the [configuration contract](config.md#selected-overlays),
|
|
and release operations belong to the [release procedure](release.md).
|
|
|
|
The completed ReleaseKit adoption, startup performance request and experiments,
|
|
benchmark evidence, performance audit, implementation plan, and remediation
|
|
record are preserved in Git history at `8e91a2b` under `docs/roadmap/`. For example:
|
|
|
|
```sh
|
|
git show 8e91a2b:docs/roadmap/startup-benchmark.md
|
|
```
|
|
|
|
Remaining optimization candidates belong to
|
|
[future performance experiments](roadmap/future.md#3-performance-experiments).
|
|
|
|
The completed effective-configuration diff roadmap, implementation plan, and
|
|
resolved review findings are preserved in Git history at `1c2610c` under
|
|
`docs/roadmap/`. The
|
|
[configuration contract](config.md#effective-configuration-diffs) owns current
|
|
comparison and disclosure behavior, and
|
|
[ADR 0010](adr/0010-effective-configuration-diff.md) records the decision.
|
|
|
|
The completed input-destination, relative-import-destination, and shared
|
|
source-version roadmaps, associated consumer request, implementation plan, and
|
|
resolved review findings are preserved in Git history at `e4270c9` under
|
|
`docs/roadmap/`. For example:
|
|
|
|
```sh
|
|
git show e4270c9:docs/roadmap/implementation.md
|
|
git show e4270c9:docs/roadmap/remediation.md
|
|
```
|
|
|
|
Current behavior belongs to the configuration contract's
|
|
[input destinations](config.md#input-destinations),
|
|
[imports](config.md#explicit-imports), and
|
|
[shared source-version checks](config.md#shared-source-version-checks) sections.
|
|
Explicit sequence-item placement and registered strict composition are owned by
|
|
the [strict composition](config.md#strict-document-composition) and
|
|
[imports](config.md#explicit-imports) sections. The
|
|
[maintained prompt catalog](consumers/README.md#identified-prompt-sequences)
|
|
shows the current consumer boundary, and [ADR 0014](adr/0014-sequence-placement-and-composition.md)
|
|
records the decision.
|
|
|
|
The completed sequence-composition roadmap, implementation plan, and resolved
|
|
remediation record are preserved in Git history at `008d2ba` under
|
|
`docs/roadmap/`. For example:
|
|
|
|
```sh
|
|
git show 008d2ba:docs/roadmap/sequence-composition.md
|
|
git show 008d2ba:docs/roadmap/implementation.md
|
|
git show 008d2ba:docs/roadmap/remediation.md
|
|
```
|
|
|
|
Potential enhancements are tracked in [future features](roadmap/future.md).
|
|
|
|
Install the Go version required by `go.mod` or a compatible newer toolchain.
|
|
Acquire declared dependencies explicitly before entering an offline
|
|
development or validation environment:
|
|
|
|
```sh
|
|
go mod download
|
|
```
|
|
|
|
Run the everyday check with Bash 3.2 or newer and Git:
|
|
|
|
```sh
|
|
./scripts/check.sh
|
|
```
|
|
|
|
[The script](../scripts/check.sh) runs from the repository root regardless of the
|
|
invocation directory. It checks Go formatting without rewriting files, checks
|
|
staged/unstaged and untracked whitespace, then runs `go test ./...`,
|
|
`go vet ./...`, and `go build ./...`, stopping on the first failure. It uses the
|
|
installed Go toolchain by default, honors an explicit `GOTOOLCHAIN`, and disables
|
|
dependency downloads. Acquire dependencies and any selected toolchain beforehand.
|
|
Format reported Go files with `gofmt -w <files>`.
|
|
|
|
The default suite includes executable examples, maintained consumer fixtures,
|
|
local documentation-link checks, and the dependency import-boundary check.
|
|
It must stay deterministic and runnable without network access or credentials.
|
|
Still inspect new/untracked content and review paths, examples, ownership, and
|
|
current-versus-planned claims; automated checks do not replace content review.
|
|
|
|
Use focused checks while iterating, with validation proportionate to the change
|
|
under the testing policy. Documentation-only work normally needs the local-link
|
|
check below and whitespace review; behavior-bearing examples and commands also
|
|
need execution. Use `go test -race ./...` for ownership or concurrency changes.
|
|
The [release procedure](release.md#4-publish-the-committed-candidate) performs
|
|
its selected validation through one `publish` invocation. The everyday checker
|
|
remains a development gate and is not a separate release prerequisite. CI never
|
|
gates a release.
|
|
|
|
## Task-to-test map
|
|
|
|
Commands run from the repository root after dependency acquisition. These are
|
|
starting points for focused iteration; run the everyday check before handing off
|
|
code changes. Use the component overview to find the corresponding implementation.
|
|
|
|
| Task | Behavioral test owners | Focused command |
|
|
| --- | --- | --- |
|
|
| YAML syntax, diagnostics, parser limits | [Adapter tests](../internal/yaml/parse_test.go), [source translation](../internal/engine/parse_test.go) | `go test ./internal/yaml` and `go test ./internal/engine -run '^TestParseSource'` |
|
|
| File/reader access, imports, globs, containment | [Sources](../internal/engine/source_test.go), [FIFO](../internal/engine/source_fifo_test.go), [imports](../internal/engine/imports_test.go), [relative destinations](../internal/engine/destination_import_test.go), [globs](../internal/engine/glob_test.go) | `go test ./internal/engine -run 'Source\|Import\|Glob\|Filesystem\|Nonregular\|RegularFile'` |
|
|
| Native filesystem and mapping sources | [Native acquisition](../internal/engine/native_filesystem_test.go), [filesystem facade](../facade_filesystem_test.go), [mapping facade](../facade_mapping_test.go) | `go test ./internal/engine -run 'NativeFilesystem'` and `go test . -run 'TestFacade'` |
|
|
| Composition, selected overlays, CLI precedence | [Composition](../internal/engine/compose_test.go), [overlay](../internal/engine/overlay_test.go), [selected overlays](../internal/engine/selected_overlay_test.go), [overrides](../internal/engine/override_test.go) | `go test ./internal/engine -run 'Compose\|Overlay\|Override'` |
|
|
| Sibling inheritance, provenance, history, sensitivity | [Expansion](../internal/engine/inheritance_test.go), [destination scopes](../internal/engine/inheritance_walk_test.go), [origins](../internal/engine/inheritance_origin_test.go), [history](../internal/engine/inheritance_history_test.go), [secrets](../internal/engine/inheritance_secret_test.go), [public loading](../facade_inheritance_test.go) | `go test ./internal/engine -run 'Inheritance\|Inherited'` and `go test . -run '^TestFacadeInheritance\|^TestFacadeInheritedSecrets'` |
|
|
| Layered loading and source equivalence | [Grouped lifecycle](../internal/engine/load_request_test.go), [layered facade](../facade_layered_test.go), [equivalence](../facade_equivalence_test.go) | `go test ./internal/engine -run '^TestGrouped'`, `go test . -run '^TestFacadeLayered'`, and `go test . -run '^TestEquivalentSourceForms'` |
|
|
| Input and relative-import destinations, mounted sources, and source ownership | [Destination engine tests](../internal/engine/destination_test.go), [tier tests](../internal/engine/destination_tiers_test.go), [import traversal and version tests](../internal/engine/destination_import_test.go), [accounting tests](../internal/engine/destination_accounting_test.go), [lifecycle inspection tests](../internal/engine/destination_import_lifecycle_test.go), [public source/error tests](../facade_destination_test.go), [resource contexts](../facade_resource_context_test.go), and [consumer examples](../examples/consumers/destinations_test.go) | `go test ./internal/engine -run 'Destination|Import|Glob|Mounted'`, `go test . -run 'Destination|Import|SourceContext|FacadeMounted'`, and `go test ./examples/consumers` |
|
|
| Shared source-version modes and evidence | [Engine source-version tests](../internal/engine/source_version_test.go), [public facade tests](../facade_source_version_mode_test.go), and [consumer example tests](../examples/consumers/layered_test.go) | `go test ./internal/engine -run 'SourceVersion'`, `go test . -run 'SourceVersion'`, and `go test ./examples/consumers` |
|
|
| Schema, defaults, projection, cloning | [Schema](../internal/engine/schema_test.go), [decoding](../internal/engine/decode_test.go), [projection](../internal/engine/projection_test.go) | `go test ./internal/engine -run 'Schema\|Decode\|Projection\|Clone\|Inline\|CompareDocument'` |
|
|
| Lifecycle, resolution, validation, callback ownership | [Loading](../internal/engine/load_test.go), [resolution](../internal/engine/resolution_test.go), [validation](../internal/engine/validation_test.go), [ownership](../internal/engine/callback_ownership_test.go), [independence](../internal/engine/independence_test.go) | `go test ./internal/engine -run 'Load\|Resolution\|Validation\|Validator\|Hook\|Callback\|Parallel'` |
|
|
| Paths, metadata, provenance | [Paths](../internal/engine/path_test.go), [metadata](../internal/engine/metadata_test.go), [provenance](../internal/engine/provenance_test.go) | `go test ./internal/engine -run 'Path\|Metadata\|Provenance\|Queries'` |
|
|
| Passive resource contexts | [Engine contexts](../internal/engine/resource_context_test.go), [public contexts](../facade_resource_context_test.go) | `go test ./internal/engine -run 'Resource'` and `go test . -run 'SourceContext'` |
|
|
| Secrets, bootstrap, redaction, explanation | [References](../internal/engine/secret_reference_test.go), [bootstrap](../internal/engine/secrets_test.go), [rendering](../internal/engine/render_test.go), [explanation](../internal/engine/explain_test.go) | `go test ./internal/engine -run 'Secret\|Bootstrap\|Effective\|Explain\|Explanation\|History\|Sensitivity'` |
|
|
| Effective configuration diff | [Engine comparison and masking tests](../internal/engine/diff_test.go), [engine operation tests](../internal/engine/diff_operation_test.go), [root facade tests](../facade_diff_test.go), and [consumer examples](../examples/consumers/diff_test.go) | `go test ./internal/engine -run 'Diff|Explain|History|Secret|Independent'`, `go test . -run 'Diff|FacadeInspection|PublicFacadeBoundary|DependencyImportBoundary'`, `go test ./examples/consumers`, and `go test . -run '^ExampleDiff$'` |
|
|
| Consumer examples and migration fixtures | [Consumer tests](../examples/consumers/consumers_test.go), [native, layered, and ordinary relative-import examples](../examples/consumers/layered_test.go), [mounted collection examples](../examples/consumers/destinations_test.go), [API examples](../example_test.go) | `go test ./examples/consumers` and `go test . -run '^Example'` |
|
|
| Assembly and layered scaling evidence | [Assembly benchmarks](../internal/engine/assembly_bench_test.go), [layered benchmarks](../internal/engine/underlay_bench_test.go) | `go test ./internal/engine -run '^$' -bench '^BenchmarkUnderlay' -benchmem`; repeat with `^BenchmarkCompose` and `^BenchmarkOverlay` |
|
|
| Inheritance scaling evidence | [Expansion benchmarks](../internal/engine/inheritance_bench_test.go) | `go test ./internal/engine -run '^$' -bench '^BenchmarkInheritance' -benchmem` |
|
|
| Documentation links and dependency isolation | [Link checks](../documentation_test.go), [import boundary](../import_boundary_test.go), [public boundary](../public_boundary_test.go) | `go test . -run 'TestLocalDocumentationLinks\|TestDependencyImportBoundary\|TestPublicFacadeBoundary'` |
|
|
| Development check behavior | [Development checker test](../development_check_test.go) | `go test . -run '^TestDevelopmentCheckHandlesFilenamesAndStopsOnFailure$'` |
|
|
| Release profile wiring | [Release profile test](../releasekit_profile_test.go) | `go test . -run '^TestReleaseKitProfile$'` |
|
|
|
|
## Fuzz validation
|
|
|
|
Run the bounded fuzz targets independently from the repository root. These exact
|
|
commands keep each campaign short and constrain concurrent workers:
|
|
|
|
```sh
|
|
go test ./internal/engine -run='^$' -fuzz='^FuzzParsePath$' -fuzztime=30s -parallel=2
|
|
go test ./internal/yaml -run='^$' -fuzz='^FuzzParseDocument$' -fuzztime=30s -parallel=2
|
|
go test ./internal/engine -run='^$' -fuzz='^FuzzCompositionAndOverlay$' -fuzztime=30s -parallel=2
|
|
```
|