Engineering quality
Spice treats verification as part of each repository’s public contract. This core module requires Go 1.26.5 and a Go-owned verifier that behaves the same from PowerShell, Linux, and macOS.
Core commands
make fmt # apply goimports and gofumptmake fast # changed packages and their in-module reverse dependency closuremake check # boundaries, docs, formatting, modules/vendor, and vetmake coverage # shuffled race-enabled public tests and the 85% floormake lint # allowlisted golangci-lint plus NilAwaymake security # gosec plus govulncheckmake test # same single race/coverage pass as make coveragemake fuzz # bounded SDK/config/expression/web fuzz smokemake offline # -mod=vendor public tests with network resolution disabledmake verify # complete core gatemake fast is the portable default for focused feedback. The Go orchestrator
derives changed package ownership from Git and go list, includes reverse
ordinary and test-import consumers, and widens to all packages when ownership
is uncertain. It runs the selected tests once with network access disabled;
there is no Bash or PowerShell selection script. Explicit focused go test
commands remain useful while working within one known package.
The complete gate does not run separate broad ordinary, race, and coverage suites: one shuffled race-enabled invocation proves all three outcomes and computes aggregate coverage across exactly 51 public packages.
Pinned tools
Quality tools live in the isolated tools module so they cannot enter the
standard-library-only public module:
| Tool | Pin | Purpose |
|---|---|---|
| golangci-lint | v2.12.2 | allowlisted static-analysis policy |
| gofumpt | v0.10.0 | canonical formatting |
| goimports / x-tools | v0.48.0 | deterministic import organization |
| gosec | v2.28.0 | source security analysis |
| govulncheck | v1.1.4 | reachable vulnerability analysis |
| NilAway | f4f8ac24c032dec36186896ecca26c1f232ef777 |
nil-flow analysis |
The root go.mod intentionally has no third-party requirement or tool
directive. Applications authorize the separately versioned Spice CLI and
annotation tool in their own module.
Linter policy
.golangci.yml starts from default: none and allowlists correctness,
error handling, nil flow, contexts, security, documentation, maintainability,
architecture, and suppression-discipline rules. Broadly noisy style policies
such as lll, varnamelen, mnd, funlen, paralleltest,
wrapcheck, and err113 are deliberately excluded.
Public packages may not import core internals, compiler/CLI paths, or optional starter implementations. Forbid rules reject debug printing, fatal logging, and process exit outside the verifier entrypoint. Tests have only narrow, documented exceptions.
Ownership of specialized quality gates
Compiler and generator latency/allocation budgets live in
spice-framework/toolchain.
Installed-IDE screenshots and interaction tests live in
spice-framework/goland.
Real external-system matrices live with each starter. Spring feedback
comparison and end-to-end generated application acceptance live in
spice-framework/petclinic.
The development repository coordinates those independently green artifacts by exact revision. Core does not clone them or duplicate their implementation tests.