2026-11-10 17:18:30 +00:00
package config
2026-11-10 20:39:00 +00:00
import (
"slices"
ck "go.maximumdirect.net/configkit"
)
2026-11-10 17:18:30 +00:00
func cloneSelection ( value * string ) * string {
if value == nil {
return nil
}
copied := * value
return & copied
}
2026-11-10 20:39:00 +00:00
func defaultNames ( r * ck . Resolution , path ck . Path , target * [ ] string , inherited [ ] string , reason string , source ck . Path ) {
if ! r . IsExplicit ( path ) {
ck . Default ( r , path , target , slices . Clone ( inherited ) , reason , source )
2026-11-10 17:18:30 +00:00
}
}
// resolveSettings records root-derived defaults after all explicit assignments.
func resolveSettings ( c * Config , r * ck . Resolution ) error {
glossaries := ck . Keys ( "glossaries" )
protection := ck . Keys ( "protected_terms" )
2026-11-10 20:39:00 +00:00
defaultNames ( r , protection , & c . ProtectedTerms , c . Glossaries , "protection defaults to selected glossaries" , glossaries )
2026-11-10 17:18:30 +00:00
rootValidation := ck . Keys ( "llm" , "validation_profile" )
rootValidationInfo , _ := r . EntryInfo ( rootValidation )
inheritedValidation := r . IsExplicit ( rootValidation ) && ! rootValidationInfo . Null && c . LLM . ValidationProfile != nil
2026-11-11 04:20:23 +00:00
rootRepair := ck . Keys ( "llm" , "correction_repair_profile" )
rootRepairInfo , _ := r . EntryInfo ( rootRepair )
inheritedRepair := r . IsExplicit ( rootRepair ) && ! rootRepairInfo . Null && c . LLM . CorrectionRepairProfile != nil
2026-11-10 17:18:30 +00:00
for i := range c . Pipeline . Stages {
item := & c . Pipeline . Stages [ i ]
base := ck . Keys ( "pipeline" , "stages" ) . Index ( i )
2026-11-10 20:39:00 +00:00
defaultNames ( r , base . Key ( "glossaries" ) , & item . Glossaries , c . Glossaries , "inherit root glossaries" , glossaries )
defaultNames ( r , base . Key ( "protected_terms" ) , & item . ProtectedTerms , c . ProtectedTerms , "inherit root protection" , protection )
2026-11-10 17:18:30 +00:00
threshold := ck . Keys ( "thresholds" , item . Module )
var value float64
switch item . Module {
case "glossary" :
value = c . Thresholds . Glossary
case "homophones" :
value = c . Thresholds . Homophones
case "spoken_word" :
value = c . Thresholds . SpokenWord
case "grammar" :
value = c . Thresholds . Grammar
}
ck . Default ( r , base . Key ( "confidence_threshold" ) , & item . ConfidenceThreshold , value , "inherit module threshold" , threshold )
llm := base . Key ( "llm" )
rootLLM := ck . Keys ( "llm" )
proposal := llm . Key ( "proposal_profile" )
ck . Default ( r , proposal , & item . LLM . ProposalProfile , cloneSelection ( c . LLM . ProposalProfile ) , "inherit proposal profile" , rootLLM . Key ( "proposal_profile" ) )
ck . Default ( r , llm . Key ( "transient_retries" ) , & item . LLM . TransientRetries , c . LLM . TransientRetries , "inherit retry budget" , rootLLM . Key ( "transient_retries" ) )
ck . Default ( r , llm . Key ( "repair_attempts" ) , & item . LLM . RepairAttempts , c . LLM . RepairAttempts , "inherit repair budget" , rootLLM . Key ( "repair_attempts" ) )
2026-11-11 04:20:23 +00:00
ck . Default ( r , llm . Key ( "correction_repair_attempts" ) , & item . LLM . CorrectionRepairAttempts , c . LLM . CorrectionRepairAttempts , "inherit correction repair budget" , rootLLM . Key ( "correction_repair_attempts" ) )
2026-11-10 17:18:30 +00:00
ck . Default ( r , llm . Key ( "operation_timeout" ) , & item . LLM . OperationTimeout , c . LLM . OperationTimeout , "inherit operation timeout" , rootLLM . Key ( "operation_timeout" ) )
ck . Default ( r , base . Key ( "validation" ) . Key ( "max_prompt_tokens" ) , & item . Validation . MaxPromptTokens , c . Validation . MaxPromptTokens , "inherit validation budget" , ck . Keys ( "validation" , "max_prompt_tokens" ) )
ck . Default ( r , base . Key ( "context" ) . Key ( "description" ) , & item . Context . Description , c . Context . Description , "inherit description" , ck . Keys ( "context" , "description" ) )
2026-11-11 04:20:23 +00:00
repair := llm . Key ( "correction_repair_profile" )
repairInfo , _ := r . EntryInfo ( repair )
if r . IsExplicit ( repair ) && repairInfo . Null {
item . LLM . CorrectionRepairProfile = cloneSelection ( item . LLM . ProposalProfile )
r . RecordDerivedDefault ( repair , "correction repair defaults to proposal profile" , proposal )
} else if inheritedRepair {
ck . Default ( r , repair , & item . LLM . CorrectionRepairProfile , cloneSelection ( c . LLM . CorrectionRepairProfile ) , "inherit correction repair profile" , rootRepair )
} else {
ck . Default ( r , repair , & item . LLM . CorrectionRepairProfile , cloneSelection ( item . LLM . ProposalProfile ) , "correction repair defaults to proposal profile" , proposal )
}
2026-11-10 17:18:30 +00:00
validation := llm . Key ( "validation_profile" )
info , _ := r . EntryInfo ( validation )
if r . IsExplicit ( validation ) && info . Null {
item . LLM . ValidationProfile = cloneSelection ( item . LLM . ProposalProfile )
r . RecordDerivedDefault ( validation , "validation defaults to proposal profile" , proposal )
} else if inheritedValidation {
ck . Default ( r , validation , & item . LLM . ValidationProfile , cloneSelection ( c . LLM . ValidationProfile ) , "inherit validation profile" , rootValidation )
} else {
ck . Default ( r , validation , & item . LLM . ValidationProfile , cloneSelection ( item . LLM . ProposalProfile ) , "validation defaults to proposal profile" , proposal )
}
}
2026-11-11 04:20:23 +00:00
if r . IsExplicit ( rootRepair ) && rootRepairInfo . Null {
c . LLM . CorrectionRepairProfile = cloneSelection ( c . LLM . ProposalProfile )
r . RecordDerivedDefault ( rootRepair , "correction repair defaults to proposal profile" , ck . Keys ( "llm" , "proposal_profile" ) )
} else {
ck . Default ( r , rootRepair , & c . LLM . CorrectionRepairProfile , cloneSelection ( c . LLM . ProposalProfile ) , "correction repair defaults to proposal profile" , ck . Keys ( "llm" , "proposal_profile" ) )
}
2026-11-10 17:18:30 +00:00
if r . IsExplicit ( rootValidation ) && rootValidationInfo . Null {
c . LLM . ValidationProfile = cloneSelection ( c . LLM . ProposalProfile )
r . RecordDerivedDefault ( rootValidation , "validation defaults to proposal profile" , ck . Keys ( "llm" , "proposal_profile" ) )
} else {
ck . Default ( r , rootValidation , & c . LLM . ValidationProfile , cloneSelection ( c . LLM . ProposalProfile ) , "validation defaults to proposal profile" , ck . Keys ( "llm" , "proposal_profile" ) )
}
return nil
}