Require validation preparation internally

This commit is contained in:
2026-11-05 13:54:06 +00:00
parent 2f0f5fa607
commit 1e122f0473
9 changed files with 25 additions and 36 deletions

View File

@@ -53,10 +53,10 @@ type recordingValidationPreparer struct {
directValidateCalls int
}
type validationOnly struct{}
type nilPlanPreparer struct{}
func (validationOnly) Validate(context.Context, *domain.Artifact, domain.OutputContract) (domain.ValidationResult, error) {
return domain.ValidationResult{}, nil
func (nilPlanPreparer) PrepareValidation(context.Context, domain.OutputContract) (validate.PreparedValidation, error) {
return nil, nil
}
func (v *recordingValidationPreparer) Validate(
@@ -791,7 +791,7 @@ func TestRunnerPreparedExecutionWithoutValidatorSkipsValidation(t *testing.T) {
}
}
func TestRunnerPrepareExecutionRequiresValidationPreparer(t *testing.T) {
func TestRunnerPrepareExecutionRejectsNilValidationPlan(t *testing.T) {
reader := defaultArtifactReader()
runner := NewRunner(
&fakePromptRepo{def: promptDef(domain.FormatText, domain.ValidationBasic, 0)},
@@ -800,7 +800,7 @@ func TestRunnerPrepareExecutionRequiresValidationPreparer(t *testing.T) {
reader,
defaultRenderer(),
&fakeLLM{forbid: true},
validationOnly{},
nilPlanPreparer{},
nil,
)

View File

@@ -49,7 +49,7 @@ type Runner struct {
artifacts artifact.Reader
renderer prompt.Renderer
llm llm.Client
validator validate.Validator
validator validate.ValidationPreparer
repairer OutputRepairer
admitter RunAdmitter
defaultTransientRetries uint64
@@ -87,7 +87,7 @@ func NewRunner(
artifacts artifact.Reader,
renderer prompt.Renderer,
llmClient llm.Client,
validator validate.Validator,
validator validate.ValidationPreparer,
admitter RunAdmitter,
) *Runner {
return NewRunnerWithRepairer(
@@ -108,7 +108,7 @@ func NewRunnerWithRepairer(
artifacts artifact.Reader,
renderer prompt.Renderer,
llmClient llm.Client,
validator validate.Validator,
validator validate.ValidationPreparer,
repairer OutputRepairer,
admitter RunAdmitter,
defaultTransientRetries ...uint64,
@@ -409,11 +409,7 @@ func (r *Runner) prepareValidation(
if r.validator == nil {
return noOpPreparedValidation{contract: contract}, nil
}
preparer, ok := r.validator.(validate.ValidationPreparer)
if !ok {
return nil, fmt.Errorf("%w: validator does not support prepared validation", ErrValidation)
}
plan, err := preparer.PrepareValidation(ctx, contract)
plan, err := r.validator.PrepareValidation(ctx, contract)
if err != nil {
return nil, &OperationError{Category: ErrValidation, Cause: err}
}

View File

@@ -52,11 +52,7 @@ func prepareSmokeInferenceCase(
}, nil
case domain.SmokeTestStructuredOutput:
validator := validate.NewFSValidator(smokeSchemaFS, ".")
preparer, ok := validator.(validate.ValidationPreparer)
if !ok {
return nil, fmt.Errorf("%w: private validator does not support prepared validation", ErrValidation)
}
plan, err := preparer.PrepareValidation(ctx, domain.OutputContract{
plan, err := validator.PrepareValidation(ctx, domain.OutputContract{
Format: domain.FormatJSON,
ValidationMode: domain.ValidationJSONSchema,
SchemaPath: smokeStructuredSchemaPath,

View File

@@ -9,6 +9,7 @@ import (
"go.maximumdirect.net/promptkit/internal/configuration"
"go.maximumdirect.net/promptkit/internal/domain"
"go.maximumdirect.net/promptkit/internal/profile"
"go.maximumdirect.net/promptkit/internal/validate"
)
type selectionTestCollaborators struct {
@@ -41,9 +42,9 @@ func (c selectionTestLLM) Generate(context.Context, domain.GenerateRequest) (*do
type selectionTestValidator struct{ state *selectionTestCollaborators }
func (v selectionTestValidator) Validate(context.Context, *domain.Artifact, domain.OutputContract) (domain.ValidationResult, error) {
func (v selectionTestValidator) PrepareValidation(context.Context, domain.OutputContract) (validate.PreparedValidation, error) {
v.state.validationCalls++
return domain.ValidationResult{}, errors.New("validation must not occur during target selection")
return nil, errors.New("validation must not occur during target selection")
}
type selectionTestRepositories struct {