Make macOS support best effort

This commit is contained in:
2026-09-12 18:30:59 +00:00
parent 88e86de03e
commit 5760614834
8 changed files with 52 additions and 18 deletions

View File

@@ -1,11 +1,11 @@
{ {
"schema_version": 2, "schema_version": 2,
"commit": "7f46c947dd56f437077df475ba5bba8fd864e2e1", "commit": "88e86de03ebd87038b0c98b164865f2c3b82a94c",
"indexed_at": "2026-09-12T16:26:42Z", "indexed_at": "2026-09-12T18:30:58Z",
"project": "home-eric-Workspace-ConfigKit", "project": "home-eric-Workspace-ConfigKit",
"nodes": 1625, "nodes": 1641,
"edges": 7824, "edges": 7961,
"original_size": 8126464, "original_size": 8126464,
"compressed_size": 1329933, "compressed_size": 1350795,
"compression_level": 3 "compression_level": 3
} }

Binary file not shown.

View File

@@ -2,6 +2,9 @@
An opinionated Go library for applications that use YAML configuration files. An opinionated Go library for applications that use YAML configuration files.
Linux is release-validated; macOS support is best-effort. See the
[platform support policy](docs/policy/release.md#platform-support) for details.
ConfigKit's initial loader accepts one strict YAML ConfigKit's initial loader accepts one strict YAML
source (or explicit defaults-only input), optionally traverses explicit path and glob source (or explicit defaults-only input), optionally traverses explicit path and glob
imports, strictly composes their disjoint definitions, applies typed defaults, and imports, strictly composes their disjoint definitions, applies typed defaults, and

View File

@@ -2,7 +2,7 @@
**Base Policy Version:** 0.1.0 **Base Policy Version:** 0.1.0
**Last Updated:** 2026-09-07 **Last Updated:** 2026-09-12
## Purpose ## Purpose
@@ -35,6 +35,20 @@ can still break consumers. Human diagnostic wording is stable only where a
contract expressly promises it. Minimum Go version and platform support changes contract expressly promises it. Minimum Go version and platform support changes
also require an explicit compatibility assessment. also require an explicit compatibility assessment.
### Platform support
Linux is the release-validated platform. macOS has best-effort support: keeping
it working remains desirable, but neither native macOS validation nor Darwin
cross-builds are release gates. Missing macOS evidence or a macOS-specific failure
does not by itself block a release. Voluntary checks and fixes are welcome; there
is no guarantee that each release has been validated on macOS.
The [release procedure](../release.md#release-identity-and-support) owns target
architectures and required Linux checks. This support change applies to upcoming
releases; historical release notes and their validation records remain unchanged.
The next release note must explain the change in Compatibility, with version
selection following this policy's existing compatibility rules.
## Release Model ## Release Model
A release consists of: A release consists of:

View File

@@ -14,11 +14,14 @@ binary, container image, generated package, or separate registry publication.
- Tags: stable Semantic Versions such as `v0.1.0`; prerelease tags are not supported - Tags: stable Semantic Versions such as `v0.1.0`; prerelease tags are not supported
- Minimum Go language/toolchain line: Go 1.25, tested with a supported patched - Minimum Go language/toolchain line: Go 1.25, tested with a supported patched
Go 1.25 toolchain and one newer supported toolchain Go 1.25 toolchain and one newer supported toolchain
- Build targets: Linux and macOS on amd64 and arm64 - Release-gated build targets: Linux on amd64 and arm64
- Best-effort targets: macOS on amd64 and arm64, under the
[platform support policy](policy/release.md#platform-support)
The automated checker cross-builds all four targets. Before release, the maintainer The automated checker cross-builds the Linux targets. Before release, the maintainer
must also obtain native test, race, symlink, and permission-fixture evidence on Linux must also obtain native test, race, symlink, and permission-fixture evidence on Linux;
and macOS; cross-compilation is not native execution evidence. cross-compilation is not native execution evidence. Native macOS checks and Darwin
cross-builds are optional and do not gate publication.
## 1. Prepare access and tools ## 1. Prepare access and tools
@@ -97,10 +100,10 @@ release note until there is a real candidate and reviewed content.
## 4. Validate the source candidate ## 4. Validate the source candidate
Run the complete checker from the repository root after dependencies have been Run the complete checker on Linux from the repository root after dependencies have been
acquired. It validates module manifests in a disposable copy, both supported Go acquired. It validates module manifests in a disposable copy, both supported Go
toolchains, offline default tests, the native race detector, vet, native builds, toolchains, offline default tests, the native race detector, vet, native builds,
CGO-disabled cross-builds, formatting and whitespace (including untracked files), CGO-disabled Linux cross-builds, formatting and whitespace (including untracked files),
examples, package isolation, and local documentation links. examples, package isolation, and local documentation links.
```sh ```sh
@@ -120,9 +123,9 @@ Complete these manual gates and record their evidence with the candidate:
- The maintainer inspects `git status --short`, `git diff`, and the candidate file - The maintainer inspects `git status --short`, `git diff`, and the candidate file
list for credentials, private data, generated output, unintended files, and list for credentials, private data, generated output, unintended files, and
unrelated changes. unrelated changes.
- The maintainer records successful native checker runs on Linux and macOS, including - The maintainer records a successful native checker run on Linux, including
filesystem capability tests. If either host is unavailable, release remains filesystem capability tests. Missing required Linux evidence blocks release;
blocked unless platform support is formally narrowed in current documentation. no macOS run, sign-off, or cross-build result is required.
- The maintainer removes completed, obsolete documents under `docs/roadmap/`, repairs - The maintainer removes completed, obsolete documents under `docs/roadmap/`, repairs
inbound links, and reruns the checker. ADR rationale remains historical. inbound links, and reruns the checker. ADR rationale remains historical.
- The maintainer reviews the exact version-matched release note for accuracy and - The maintainer reviews the exact version-matched release note for accuracy and

View File

@@ -48,5 +48,5 @@ selected.
Publication remains a maintainer decision. Release preparation must choose the Publication remains a maintainer decision. Release preparation must choose the
version, write a version-matched note, retire this completed roadmap with link version, write a version-matched note, retire this completed roadmap with link
repair, obtain exact-candidate Linux/macOS evidence, and follow the repair, obtain the required exact-candidate Linux evidence, and follow the
[release procedure](../release.md). [release procedure](../release.md).

View File

@@ -47,7 +47,7 @@ func TestCheckScriptsHandleFilenamesAndStopOnFailure(t *testing.T) {
} }
// Isolate expensive toolchain commands: this test owns shell orchestration, // Isolate expensive toolchain commands: this test owns shell orchestration,
// not Go's compiler or the production tests exercised by the real checker. // not Go's compiler or the production tests exercised by the real checker.
write(filepath.Join(bin, "go"), []byte("#!/bin/sh\nprintf '%s\\n' \"$*\" >> \"$CONFIGKIT_TEST_GO_LOG\"\nif [ \"${CONFIGKIT_TEST_FAIL-}\" = yes ] && [ \"${1-}\" = test ]; then exit 37; fi\n"), 0700) write(filepath.Join(bin, "go"), []byte("#!/bin/sh\nprintf '%s/%s %s\\n' \"${GOOS-native}\" \"${GOARCH-native}\" \"$*\" >> \"$CONFIGKIT_TEST_GO_LOG\"\nif [ \"${CONFIGKIT_TEST_FAIL-}\" = yes ] && [ \"${1-}\" = test ]; then exit 37; fi\n"), 0700)
write(filepath.Join(bin, "gofmt"), []byte("#!/bin/sh\nprintf '%s\\000' \"$@\" > \"$CONFIGKIT_TEST_FMT_LOG\"\n"), 0700) write(filepath.Join(bin, "gofmt"), []byte("#!/bin/sh\nprintf '%s\\000' \"$@\" > \"$CONFIGKIT_TEST_FMT_LOG\"\n"), 0700)
init := exec.Command("git", "init", "-q") init := exec.Command("git", "init", "-q")
init.Dir = root init.Dir = root
@@ -67,6 +67,8 @@ func TestCheckScriptsHandleFilenamesAndStopOnFailure(t *testing.T) {
} }
cmd := exec.Command("/bin/bash", filepath.Join(root, "scripts", scriptName)) cmd := exec.Command("/bin/bash", filepath.Join(root, "scripts", scriptName))
cmd.Env = append(os.Environ(), "PATH="+bin+string(os.PathListSeparator)+os.Getenv("PATH"), "CONFIGKIT_BASELINE_TOOLCHAIN=test-baseline", "CONFIGKIT_NEWER_TOOLCHAIN=test-newer", "CONFIGKIT_TEST_FMT_LOG="+log, "CONFIGKIT_TEST_GO_LOG="+calls) cmd.Env = append(os.Environ(), "PATH="+bin+string(os.PathListSeparator)+os.Getenv("PATH"), "CONFIGKIT_BASELINE_TOOLCHAIN=test-baseline", "CONFIGKIT_NEWER_TOOLCHAIN=test-newer", "CONFIGKIT_TEST_FMT_LOG="+log, "CONFIGKIT_TEST_GO_LOG="+calls)
// Log only targets selected by the script, not inherited host settings.
cmd.Env = append(cmd.Env, "GOOS=", "GOARCH=")
if name == "failed-go-check" { if name == "failed-go-check" {
cmd.Env = append(cmd.Env, "CONFIGKIT_TEST_FAIL=yes") cmd.Env = append(cmd.Env, "CONFIGKIT_TEST_FAIL=yes")
} }
@@ -101,6 +103,17 @@ func TestCheckScriptsHandleFilenamesAndStopOnFailure(t *testing.T) {
if fail && strings.Contains(string(invoked), "vet ./...") { if fail && strings.Contains(string(invoked), "vet ./...") {
t.Fatal("checker continued after failed test") t.Fatal("checker continued after failed test")
} }
if scriptName == "release-check.sh" && !fail {
// These are selected release gates, not incidental loop details.
for _, target := range []string{"linux/amd64", "linux/arm64"} {
if !strings.Contains(string(invoked), target+" build ./...") {
t.Errorf("checker omitted required target %s", target)
}
}
if strings.Contains(string(invoked), "darwin/") {
t.Fatal("checker requires best-effort macOS validation")
}
}
}) })
} }
}) })

View File

@@ -81,7 +81,8 @@ run_go "$newer_toolchain" test ./examples/consumers
run_go "$newer_toolchain" test . -run '^TestLocalDocumentationLinks$' run_go "$newer_toolchain" test . -run '^TestLocalDocumentationLinks$'
run_go "$newer_toolchain" test . -run '^TestDependencyImportBoundary$' run_go "$newer_toolchain" test . -run '^TestDependencyImportBoundary$'
for target in linux/amd64 linux/arm64 darwin/amd64 darwin/arm64; do # Only release-validated targets gate publication; macOS is best-effort.
for target in linux/amd64 linux/arm64; do
target_os=${target%/*} target_os=${target%/*}
target_arch=${target#*/} target_arch=${target#*/}
GOTOOLCHAIN="$newer_toolchain" GOPROXY=off CGO_ENABLED=0 GOOS="$target_os" GOARCH="$target_arch" go build ./... GOTOOLCHAIN="$newer_toolchain" GOPROXY=off CGO_ENABLED=0 GOOS="$target_os" GOARCH="$target_arch" go build ./...