Move scene semantics to deterministic validation

This commit is contained in:
2026-07-24 14:40:54 +00:00
parent e2cb0d901a
commit dc7c0e2f9e
4 changed files with 25 additions and 15 deletions

View File

@@ -70,17 +70,24 @@ func TestExtractPassesOptionalReferencesAndUsesEmptyPlaceholders(t *testing.T) {
}
}
func TestExtractPreservesTheModelKindWithoutRepair(t *testing.T) {
func TestExtractReturnsSemanticallyInvalidResponseForDeterministicValidation(t *testing.T) {
schema, err := loadResponseSchema()
if err != nil {
t.Fatalf("loadResponseSchema() error = %v", err)
}
if err := validateJSONSchema(t, map[string]any{"kind": "unrecognized", "title": " ", "summary": ""}, schema.JSONSchema); err != nil {
t.Fatalf("semantic candidate rejected by private schema: %v", err)
}
client := &fakeSceneDescriptionsLLMClient{response: extractionResponse{
Kind: dnd.SceneKind("unrecognized"), Title: " Untitled scene ", Summary: " Summary ",
Kind: dnd.SceneKind("unrecognized"), Title: " ", Summary: "",
}}
result, err := newExtractor(t, client).Extract(context.Background(), extractionRequest())
if err != nil {
t.Fatalf("Extract() error = %v, want nil", err)
}
scene := result.Value.Scenes[0]
if scene.Kind != dnd.SceneKind("unrecognized") || scene.Title != "Untitled scene" || scene.Summary != "Summary" {
t.Fatalf("scene = %#v, want model kind preserved and textual fields trimmed", scene)
if scene.Kind != dnd.SceneKind("unrecognized") || scene.Title != "" || scene.Summary != "" {
t.Fatalf("scene = %#v, want semantic candidates returned for deterministic validation", scene)
}
}