REQ 1.1a.1 (Single source-of-truth)
↓
File: engine/internal/config/manager.go
Type: ConfigManager struct + Load() method
Code:
func (cm *ConfigManager) Load(ctx context.Context) (*Config, error) {
base := loadYAML("config.base.yaml")
env := loadYAML(fmt.Sprintf("config.%s.yaml", os.Getenv("ENVIRONMENT")))
// Merge with proper precedence
return cm.merged(base, env)
}
✅ Unit Test: TestConfigManagerLoadBaseFile
✅ Unit Test: TestConfigManagerLoadWithEnvOverrides
Coverage: manager.go:45-75 (Load method)
REQ 1.1a.2 (Inheritance hierarchy)
↓
File: engine/internal/config/manager.go
Type: ConfigManager.mergeConfigs() private method
Code:
func (cm *ConfigManager) mergeConfigs(base, override map[string]interface{}) map[string]interface{} {
for k, v := range override {
base[k] = v
}
return base
}
✅ Unit Test: TestConfigManagerLoadWithAllOverrides
✅ Unit Test: TestConfigManagerPriorityOrder
Coverage: manager.go:95-110 (merge logic)
REQ 1.1a.3 (Schema validation)
↓
File: engine/internal/config/schema.go
Type: Validator struct + Validate() method
Code:
type Validator struct {
rules []ValidationRule
}
func (v *Validator) Validate(config *Config) error {
for _, rule := range v.rules {
if err := rule.Check(config); err != nil {
return err
}
}
return nil
}
✅ Unit Test: TestConfigValidateRequiredFields
✅ Unit Test: TestConfigValidateSchema
Coverage: schema.go:30-60 (Validate method)
REQ 1.1a.4 (Secrets via env vars)
↓
File: engine/internal/config/manager.go
Type: ConfigManager.substituteEnvVars() method
Code:
func (cm *ConfigManager) substituteEnvVars(config map[string]interface{}) map[string]interface{} {
// Replace ${VAR_NAME} with os.Getenv("VAR_NAME")
return substituteRecursive(config)
}
✅ Unit Test: TestConfigManagerEnvVarSubstitution
✅ Unit Test: TestConfigManagerMissingEnvVarError
Coverage: manager.go:120-145 (env var substitution)
REQ 1.1a.5 (Type-safe access)
↓
File: engine/internal/config/schema.go
Type: Config struct + typed accessors
Code:
type Config struct {
Service ServiceConfig
Database DatabaseConfig
Cache CacheConfig
}
func (c *Config) GetString(key string) (string, error)
func (c *Config) GetInt(key string) (int, error)
func (c *Config) GetBool(key string) (bool, error)
✅ Unit Test: TestConfigGetStringType
✅ Unit Test: TestConfigGetIntType
✅ Unit Test: TestConfigTypeMismatchError
Coverage: schema.go:80-130 (accessor methods)
REQ 1.1a.6 (Cross-field validation)
↓
File: engine/internal/config/schema.go
Type: CrossFieldValidator struct
Code:
func (v *CrossFieldValidator) ValidateProdRequirements(config *Config) error {
if config.Environment == "production" && config.Service.Replicas < 3 {
return fmt.Errorf("production requires at least 3 replicas")
}
return nil
}
✅ Unit Test: TestConfigValidateCrossFieldConstraints
✅ Unit Test: TestConfigProdReplicas
Coverage: schema.go:140-160 (cross-field rules)
REQ 1.1a.7 (Required fields)
↓
File: engine/internal/config/schema.go
Type: Validator.checkRequired() method
Code:
func (v *Validator) checkRequired(config *Config) error {
required := []string{"service.name", "database.host", "cache.host"}
for _, field := range required {
if config.GetString(field) == "" {
return fmt.Errorf("required field missing: %s", field)
}
}
return nil
}
✅ Unit Test: TestConfigValidateRequiredFields
✅ Unit Test: TestConfigMissingServiceName
Coverage: schema.go:165-180 (required field checks)
REQ 1.1a.8 (DI wiring)
↓
File: engine/cmd/api/main.go
Type: Dependency injection in main function
Code:
func main() {
cfg, _ := configMgr.Load(ctx)
container := fx.New(
fx.Provide(func() *Config { return cfg }),
// Other providers...
)
}
✅ Unit Test: TestConfigInjectionIntoContainer
✅ Integration Test: TestConfigAccessFromService
Coverage: main.go:15-30 (DI setup)