cd07e435d9
New internal/config package: Config struct (HCL tags), Load(paths...), MergeOverrides(flags, env) with flag>env>file>default precedence (D-039). No package-level state (AD-023). --config persistent flag on root command; daemon uses cfg.ListenAddr when flag at default. 11 config tests + 2 cli tests. ---ci--- project: orca phase: 2 milestone: v0.7 status: verify requirements: covered: [REQ-054] partial: [] ---/ci---
2.9 KiB
2.9 KiB
Phase 2 Verification Report — v0.7: HCL Config File Parsing
Phase: 2
Branch: phase/02-config-parser
REQ Coverage: REQ-054
Milestone: v0.7 (Hardening & Completion)
Structural Verification
Files Created
internal/config/config.go—Configstruct (HCL tags),CapacityConfig,Flags,Environ,Load(paths...),(*Config).MergeOverrides(flags, env)internal/config/config_test.go— 11 tests (Load valid/missing/malformed/first-existing, MergeOverrides precedence all 4 layers, NodeCapacity)internal/config/testdata/config.hcl— example fixture
Files Modified
internal/cli/root.go— added--configpersistent flag,configCtxKey,configFromCtxhelper;PersistentPreRunEloads config if--configset (AD-023)internal/cli/daemon.go— daemon usescfg.ListenAddrfrom config when flag is at default (:8080) (D-039 precedence: flag > config)internal/cli/root_test.go— addedTestConfigFlagRegistered+TestConfigFlagLoadsFile
Behavioral Verification
Test Results
go test ./... → all PASS (exit 0)
go test -race ./internal/config/... ./internal/cli/... → all PASS
go vet ./... → clean
make build → clean (v0.6.1)
API Surface
func Load(paths ...string) (*Config, error)
func (c *Config) MergeOverrides(flags Flags, env Environ) *Config
Loadreturns zero&Config{}if no file exists (no error)MergeOverridesprecedence: flag > env > file > default (D-039)- No package-level state (AD-023)
CLI Verification
./bin/orca --help → shows --config string flag
Security Verification
- Config file is read-only (no writes); parsed via
hclsimple.Decode(no eval, no external commands) - No secrets in config (paths only; no tokens/keys in config.hcl)
- Config file permissions not enforced (operator's responsibility; config contains no secrets)
Quality Verification
- No new dependencies (
hashicorp/hcl/v2already in go.mod for jobspec) - No comments added (per project convention)
- Test style matches existing
jobspec/spec_test.go+cli/root_test.go go.modunchanged
Must-Haves Checklist
internal/config/config.go— Config struct + Load + MergeOverridesinternal/config/config_test.go— 11 tests (all 4 precedence layers)internal/config/testdata/config.hcl— example fixtureinternal/cli/root.go—--configpersistent flag + context wiringinternal/cli/daemon.go— usescfg.ListenAddr(flag still wins)internal/cli/root_test.go— config flag registration + load test
Verdict
PASS — all 4 verification layers pass. REQ-054 is fully covered. The internal/config package provides HCL config file parsing with flag > env > file > default precedence, wired into the root command via --config and consumed by the daemon.