Standardize D&D prompt asset filenames

This commit is contained in:
2026-08-05 14:37:18 +00:00
parent 257bca0dc2
commit 8ed99ceaee
29 changed files with 31 additions and 145 deletions

View File

@@ -41,7 +41,7 @@ messages:
- role: user - role: user
content_file: ./sharedassets/common-dnd-npcs.md content_file: ./sharedassets/common-dnd-npcs.md
- role: user - role: user
content_file: ./grounding.md content_file: ./combat-grounding.md
- role: user - role: user
content_file: ./task.md content_file: ./task.md
- role: user - role: user

View File

@@ -33,7 +33,7 @@ messages:
- role: user - role: user
content_file: ./sharedassets/common-dnd-extraction-evidence.md content_file: ./sharedassets/common-dnd-extraction-evidence.md
- role: user - role: user
content_file: ./locations.md content_file: ./location-registry.md
- role: user - role: user
content_file: ./task.md content_file: ./task.md
- role: user - role: user

View File

@@ -38,7 +38,7 @@ messages:
- role: user - role: user
content_file: ./sharedassets/common-dnd-npcs.md content_file: ./sharedassets/common-dnd-npcs.md
- role: user - role: user
content_file: ./catalog.md content_file: ./spell-catalog.md
- role: user - role: user
content_file: ./task.md content_file: ./task.md
- role: user - role: user

View File

@@ -12,7 +12,6 @@ import (
"path/filepath" "path/filepath"
"reflect" "reflect"
"runtime" "runtime"
"sort"
"strings" "strings"
"sync" "sync"
"sync/atomic" "sync/atomic"
@@ -153,42 +152,6 @@ func TestProductionCatalogCoversMaintainedConfigurations(t *testing.T) {
t.Fatalf("enemy event extract validator chain = %#v, want %#v", got, enemyEventExtractChain) t.Fatalf("enemy event extract validator chain = %#v, want %#v", got, enemyEventExtractChain)
} }
assetNames := productionAssetNames(t, components.assets.PromptFS)
requiredAssets := []string{
"dnd.scenes/dnd.scenes.yaml",
"dnd.scenes/instructions.md",
"dnd.scenes/sharedassets/common-dnd-references.md",
"dnd.scenes/sharedassets/common-dnd-system.md",
"dnd.scenes/sharedassets/common-dnd-transcript-full.md",
"dnd.scenes/task.md",
"dnd.spells/dnd.spells.yaml",
"dnd.spells/catalog.md",
"dnd.spells/instructions.md",
"dnd.spells/sharedassets/common-dnd-references.md",
"dnd.spells/sharedassets/common-dnd-system.md",
"dnd.spells/sharedassets/common-dnd-transcript-chunk.md",
"dnd.spells/task.md",
"dnd.combat_turns/dnd.combat_turns.yaml",
"dnd.combat_turns/instructions.md",
"dnd.combat_turns/sharedassets/common-dnd-references.md",
"dnd.combat_turns/sharedassets/common-dnd-system.md",
"dnd.combat_turns/sharedassets/common-dnd-transcript-chunk.md",
"dnd.combat_turns/task.md",
"dnd.item_events/dnd.item_events.yaml",
"dnd.item_events/instructions.md",
"dnd.item_events/sharedassets/common-dnd-extraction-evidence.md",
"dnd.item_events/sharedassets/common-dnd-identity.md",
"dnd.item_events/sharedassets/common-dnd-references.md",
"dnd.item_events/sharedassets/common-dnd-system.md",
"dnd.item_events/sharedassets/common-dnd-transcript-chunk.md",
"dnd.item_events/task.md",
"dnd.enemy_events/dnd.enemy_events.yaml",
"dnd.enemy_events/grounding.md",
"dnd.enemy_events/instructions.md",
"dnd.enemy_events/task.md",
}
assertProductionContains(t, "production prompt assets", assetNames, requiredAssets)
catalog := catalogFromRegistries(registries) catalog := catalogFromRegistries(registries)
for _, test := range []struct { for _, test := range []struct {
stage pipeline.ModuleStage stage pipeline.ModuleStage
@@ -984,28 +947,6 @@ func writeProductionContractConfig(t *testing.T, content string) string {
return path return path
} }
func productionAssetNames(t *testing.T, getFS func() (fs.FS, error)) []string {
t.Helper()
fileSystem, err := getFS()
if err != nil {
t.Fatalf("load production prompt assets: %v", err)
}
var names []string
if err := fs.WalkDir(fileSystem, ".", func(path string, entry fs.DirEntry, err error) error {
if err != nil {
return err
}
if !entry.IsDir() {
names = append(names, path)
}
return nil
}); err != nil {
t.Fatalf("walk production prompt assets: %v", err)
}
sort.Strings(names)
return names
}
func assertProductionContains[T comparable](t *testing.T, name string, got, required []T) { func assertProductionContains[T comparable](t *testing.T, name string, got, required []T) {
t.Helper() t.Helper()
available := make(map[T]struct{}, len(got)) available := make(map[T]struct{}, len(got))

View File

@@ -16,7 +16,7 @@ const promptAssetRoot = "assets/prompts"
var promptAssetManifest = shared.PromptAssetManifest{ var promptAssetManifest = shared.PromptAssetManifest{
ModuleDir: "dnd.scenes", ModuleDir: "dnd.scenes",
ModuleFiles: []promptfs.ModulePromptFile{ ModuleFiles: []promptfs.ModulePromptFile{
{Name: "dnd.scenes.yaml", Path: "prompts/dnd.scenes.yaml"}, {Name: "prompt.yaml", Path: "prompts/prompt.yaml"},
{Name: "task.md", Path: "prompts/task.md"}, {Name: "task.md", Path: "prompts/task.md"},
{Name: "instructions.md", Path: "prompts/instructions.md"}, {Name: "instructions.md", Path: "prompts/instructions.md"},
}, },

View File

@@ -16,7 +16,7 @@ const promptAssetRoot = "assets/prompts"
var promptAssetManifest = shared.PromptAssetManifest{ var promptAssetManifest = shared.PromptAssetManifest{
ModuleDir: "dnd.combat_turns", ModuleDir: "dnd.combat_turns",
ModuleFiles: []promptfs.ModulePromptFile{ ModuleFiles: []promptfs.ModulePromptFile{
{Name: "dnd.combat_turns.yaml", Path: "prompts/dnd.combat_turns.yaml"}, {Name: "prompt.yaml", Path: "prompts/prompt.yaml"},
{Name: "task.md", Path: "prompts/task.md"}, {Name: "task.md", Path: "prompts/task.md"},
{Name: "instructions.md", Path: "prompts/instructions.md"}, {Name: "instructions.md", Path: "prompts/instructions.md"},
}, },

View File

@@ -16,8 +16,8 @@ const promptAssetRoot = "assets/prompts"
var promptAssetManifest = shared.PromptAssetManifest{ var promptAssetManifest = shared.PromptAssetManifest{
ModuleDir: "dnd.enemy_events", ModuleDir: "dnd.enemy_events",
ModuleFiles: []promptfs.ModulePromptFile{ ModuleFiles: []promptfs.ModulePromptFile{
{Name: "dnd.enemy_events.yaml", Path: "prompts/dnd.enemy_events.yaml"}, {Name: "prompt.yaml", Path: "prompts/prompt.yaml"},
{Name: "grounding.md", Path: "prompts/grounding.md"}, {Name: "combat-grounding.md", Path: "prompts/combat-grounding.md"},
{Name: "task.md", Path: "prompts/task.md"}, {Name: "task.md", Path: "prompts/task.md"},
{Name: "instructions.md", Path: "prompts/instructions.md"}, {Name: "instructions.md", Path: "prompts/instructions.md"},
}, },

View File

@@ -16,7 +16,7 @@ const promptAssetRoot = "assets/prompts"
var promptAssetManifest = shared.PromptAssetManifest{ var promptAssetManifest = shared.PromptAssetManifest{
ModuleDir: "dnd.item_events", ModuleDir: "dnd.item_events",
ModuleFiles: []promptfs.ModulePromptFile{ ModuleFiles: []promptfs.ModulePromptFile{
{Name: "dnd.item_events.yaml", Path: "prompts/dnd.item_events.yaml"}, {Name: "prompt.yaml", Path: "prompts/prompt.yaml"},
{Name: "task.md", Path: "prompts/task.md"}, {Name: "task.md", Path: "prompts/task.md"},
{Name: "instructions.md", Path: "prompts/instructions.md"}, {Name: "instructions.md", Path: "prompts/instructions.md"},
}, },

View File

@@ -16,8 +16,8 @@ const promptAssetRoot = "assets/prompts"
var promptAssetManifest = shared.PromptAssetManifest{ var promptAssetManifest = shared.PromptAssetManifest{
ModuleDir: PromptID, ModuleDir: PromptID,
ModuleFiles: []promptfs.ModulePromptFile{ ModuleFiles: []promptfs.ModulePromptFile{
{Name: "dnd.location_occurrences.yaml", Path: "prompts/dnd.location_occurrences.yaml"}, {Name: "prompt.yaml", Path: "prompts/prompt.yaml"},
{Name: "locations.md", Path: "prompts/locations.md"}, {Name: "location-registry.md", Path: "prompts/location-registry.md"},
{Name: "task.md", Path: "prompts/task.md"}, {Name: "task.md", Path: "prompts/task.md"},
{Name: "instructions.md", Path: "prompts/instructions.md"}, {Name: "instructions.md", Path: "prompts/instructions.md"},
}, },

View File

@@ -16,7 +16,7 @@ const promptAssetRoot = "assets/prompts"
var promptAssetManifest = shared.PromptAssetManifest{ var promptAssetManifest = shared.PromptAssetManifest{
ModuleDir: PromptID, ModuleDir: PromptID,
ModuleFiles: []promptfs.ModulePromptFile{ ModuleFiles: []promptfs.ModulePromptFile{
{Name: "dnd.locations.yaml", Path: "prompts/dnd.locations.yaml"}, {Name: "prompt.yaml", Path: "prompts/prompt.yaml"},
{Name: "task.md", Path: "prompts/task.md"}, {Name: "task.md", Path: "prompts/task.md"},
{Name: "instructions.md", Path: "prompts/instructions.md"}, {Name: "instructions.md", Path: "prompts/instructions.md"},
}, },

View File

@@ -16,7 +16,7 @@ const promptAssetRoot = "assets/prompts"
var promptAssetManifest = shared.PromptAssetManifest{ var promptAssetManifest = shared.PromptAssetManifest{
ModuleDir: "dnd.npc_interactions", ModuleDir: "dnd.npc_interactions",
ModuleFiles: []promptfs.ModulePromptFile{ ModuleFiles: []promptfs.ModulePromptFile{
{Name: "dnd.npc_interactions.yaml", Path: "prompts/dnd.npc_interactions.yaml"}, {Name: "prompt.yaml", Path: "prompts/prompt.yaml"},
{Name: "task.md", Path: "prompts/task.md"}, {Name: "task.md", Path: "prompts/task.md"},
{Name: "instructions.md", Path: "prompts/instructions.md"}, {Name: "instructions.md", Path: "prompts/instructions.md"},
}, },

View File

@@ -16,7 +16,7 @@ const promptAssetRoot = "assets/prompts"
var promptAssetManifest = shared.PromptAssetManifest{ var promptAssetManifest = shared.PromptAssetManifest{
ModuleDir: "dnd.npcs", ModuleDir: "dnd.npcs",
ModuleFiles: []promptfs.ModulePromptFile{ ModuleFiles: []promptfs.ModulePromptFile{
{Name: "dnd.npcs.yaml", Path: "prompts/dnd.npcs.yaml"}, {Name: "prompt.yaml", Path: "prompts/prompt.yaml"},
{Name: "task.md", Path: "prompts/task.md"}, {Name: "task.md", Path: "prompts/task.md"},
{Name: "instructions.md", Path: "prompts/instructions.md"}, {Name: "instructions.md", Path: "prompts/instructions.md"},
}, },

View File

@@ -16,7 +16,7 @@ const promptAssetRoot = "assets/prompts"
var promptAssetManifest = shared.PromptAssetManifest{ var promptAssetManifest = shared.PromptAssetManifest{
ModuleDir: "dnd.scene_descriptions", ModuleDir: "dnd.scene_descriptions",
ModuleFiles: []promptfs.ModulePromptFile{ ModuleFiles: []promptfs.ModulePromptFile{
{Name: "dnd.scene_descriptions.yaml", Path: "prompts/dnd.scene_descriptions.yaml"}, {Name: "prompt.yaml", Path: "prompts/prompt.yaml"},
{Name: "task.md", Path: "prompts/task.md"}, {Name: "task.md", Path: "prompts/task.md"},
{Name: "instructions.md", Path: "prompts/instructions.md"}, {Name: "instructions.md", Path: "prompts/instructions.md"},
}, },

View File

@@ -16,8 +16,8 @@ const promptAssetRoot = "assets/prompts"
var promptAssetManifest = shared.PromptAssetManifest{ var promptAssetManifest = shared.PromptAssetManifest{
ModuleDir: "dnd.spells", ModuleDir: "dnd.spells",
ModuleFiles: []promptfs.ModulePromptFile{ ModuleFiles: []promptfs.ModulePromptFile{
{Name: "dnd.spells.yaml", Path: "prompts/dnd.spells.yaml"}, {Name: "prompt.yaml", Path: "prompts/prompt.yaml"},
{Name: "catalog.md", Path: "prompts/catalog.md"}, {Name: "spell-catalog.md", Path: "prompts/spell-catalog.md"},
{Name: "task.md", Path: "prompts/task.md"}, {Name: "task.md", Path: "prompts/task.md"},
{Name: "instructions.md", Path: "prompts/instructions.md"}, {Name: "instructions.md", Path: "prompts/instructions.md"},
}, },

View File

@@ -16,7 +16,7 @@ const promptAssetRoot = "assets/prompts"
var promptAssetManifest = shared.PromptAssetManifest{ var promptAssetManifest = shared.PromptAssetManifest{
ModuleDir: PromptID, ModuleDir: PromptID,
ModuleFiles: []promptfs.ModulePromptFile{ ModuleFiles: []promptfs.ModulePromptFile{
{Name: "dnd.locations.normalize.yaml", Path: "prompts/dnd.locations.normalize.yaml"}, {Name: "prompt.yaml", Path: "prompts/prompt.yaml"},
{Name: "task.md", Path: "prompts/task.md"}, {Name: "task.md", Path: "prompts/task.md"},
{Name: "candidates.md", Path: "prompts/candidates.md"}, {Name: "candidates.md", Path: "prompts/candidates.md"},
}, },

View File

@@ -16,7 +16,7 @@ const promptAssetRoot = "assets/prompts"
var promptAssetManifest = shared.PromptAssetManifest{ var promptAssetManifest = shared.PromptAssetManifest{
ModuleDir: PromptID, ModuleDir: PromptID,
ModuleFiles: []promptfs.ModulePromptFile{ ModuleFiles: []promptfs.ModulePromptFile{
{Name: "dnd.npcs.normalize.yaml", Path: "prompts/dnd.npcs.normalize.yaml"}, {Name: "prompt.yaml", Path: "prompts/prompt.yaml"},
{Name: "task.md", Path: "prompts/task.md"}, {Name: "task.md", Path: "prompts/task.md"},
{Name: "candidates.md", Path: "prompts/candidates.md"}, {Name: "candidates.md", Path: "prompts/candidates.md"},
}, },

View File

@@ -42,22 +42,22 @@ func TestRegisterAddsDNDFamily(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("PromptFS() error = %v", err) t.Fatalf("PromptFS() error = %v", err)
} }
if _, err := fs.ReadFile(promptFS, "dnd.npcs.normalize/dnd.npcs.normalize.yaml"); err != nil { if _, err := fs.ReadFile(promptFS, "dnd.npcs.normalize/prompt.yaml"); err != nil {
t.Fatalf("normalization prompt asset = %v, want registered private prompt", err) t.Fatalf("normalization prompt asset = %v, want registered private prompt", err)
} }
for _, name := range []string{ for _, name := range []string{
"dnd.scenes/dnd.scenes.yaml", "dnd.scenes/prompt.yaml",
"dnd.spells/dnd.spells.yaml", "dnd.spells/prompt.yaml",
"dnd.npcs/dnd.npcs.yaml", "dnd.npcs/prompt.yaml",
"dnd.combat_turns/dnd.combat_turns.yaml", "dnd.combat_turns/prompt.yaml",
"dnd.enemy_events/dnd.enemy_events.yaml", "dnd.enemy_events/prompt.yaml",
"dnd.item_events/dnd.item_events.yaml", "dnd.item_events/prompt.yaml",
"dnd.npc_interactions/dnd.npc_interactions.yaml", "dnd.npc_interactions/prompt.yaml",
"dnd.scene_descriptions/dnd.scene_descriptions.yaml", "dnd.scene_descriptions/prompt.yaml",
"dnd.npcs.normalize/dnd.npcs.normalize.yaml", "dnd.npcs.normalize/prompt.yaml",
"dnd.locations/dnd.locations.yaml", "dnd.locations/prompt.yaml",
"dnd.locations.normalize/dnd.locations.normalize.yaml", "dnd.locations.normalize/prompt.yaml",
"dnd.location_occurrences/dnd.location_occurrences.yaml", "dnd.location_occurrences/prompt.yaml",
} { } {
content, err := fs.ReadFile(promptFS, name) content, err := fs.ReadFile(promptFS, name)
if err != nil { if err != nil {
@@ -295,61 +295,6 @@ func TestRegisterAddsDNDFamily(t *testing.T) {
if got := registries.ValidatorChains.Validators(pipeline.StageMerge, interactionextract.Key); got != nil { if got := registries.ValidatorChains.Validators(pipeline.StageMerge, interactionextract.Key); got != nil {
t.Fatalf("NPC interaction merge validator chain = %#v, want absent", got) t.Fatalf("NPC interaction merge validator chain = %#v, want absent", got)
} }
assertAssetNamesContain(t, assets.PromptFS, []string{
"dnd.scenes/dnd.scenes.yaml",
"dnd.scenes/instructions.md",
"dnd.scenes/sharedassets/common-dnd-references.md",
"dnd.scenes/sharedassets/common-dnd-system.md",
"dnd.scenes/sharedassets/common-dnd-transcript-full.md",
"dnd.scenes/task.md",
"dnd.spells/dnd.spells.yaml",
"dnd.spells/instructions.md",
"dnd.spells/sharedassets/common-dnd-references.md",
"dnd.spells/sharedassets/common-dnd-system.md",
"dnd.spells/sharedassets/common-dnd-transcript-chunk.md",
"dnd.spells/task.md",
"dnd.npcs/dnd.npcs.yaml",
"dnd.npcs/instructions.md",
"dnd.npcs/sharedassets/common-dnd-references.md",
"dnd.npcs/sharedassets/common-dnd-system.md",
"dnd.npcs/sharedassets/common-dnd-transcript-chunk.md",
"dnd.npcs/task.md",
"dnd.npcs.normalize/candidates.md",
"dnd.npcs.normalize/dnd.npcs.normalize.yaml",
"dnd.npcs.normalize/sharedassets/common-dnd-entity-reconciliation.md",
"dnd.npcs.normalize/sharedassets/common-dnd-system.md",
"dnd.npcs.normalize/sharedassets/common-dnd-transcript-windows.md",
"dnd.npcs.normalize/task.md",
"dnd.combat_turns/dnd.combat_turns.yaml",
"dnd.combat_turns/instructions.md",
"dnd.combat_turns/sharedassets/common-dnd-references.md",
"dnd.combat_turns/sharedassets/common-dnd-system.md",
"dnd.combat_turns/sharedassets/common-dnd-transcript-chunk.md",
"dnd.combat_turns/task.md",
"dnd.enemy_events/dnd.enemy_events.yaml",
"dnd.enemy_events/grounding.md",
"dnd.enemy_events/instructions.md",
"dnd.enemy_events/task.md",
"dnd.item_events/dnd.item_events.yaml",
"dnd.item_events/instructions.md",
"dnd.item_events/sharedassets/common-dnd-extraction-evidence.md",
"dnd.item_events/sharedassets/common-dnd-identity.md",
"dnd.item_events/sharedassets/common-dnd-references.md",
"dnd.item_events/sharedassets/common-dnd-system.md",
"dnd.item_events/sharedassets/common-dnd-transcript-chunk.md",
"dnd.item_events/task.md",
"dnd.npc_interactions/dnd.npc_interactions.yaml",
"dnd.npc_interactions/instructions.md",
"dnd.npc_interactions/sharedassets/common-dnd-npcs.md",
"dnd.npc_interactions/task.md",
"dnd.scene_descriptions/dnd.scene_descriptions.yaml",
"dnd.scene_descriptions/instructions.md",
"dnd.scene_descriptions/sharedassets/common-dnd-identity.md",
"dnd.scene_descriptions/sharedassets/common-dnd-references.md",
"dnd.scene_descriptions/sharedassets/common-dnd-system.md",
"dnd.scene_descriptions/sharedassets/common-dnd-transcript-chunk.md",
"dnd.scene_descriptions/task.md",
})
assertAssetNamesContain(t, assets.SchemaFS, []string{ assertAssetNamesContain(t, assets.SchemaFS, []string{
"dnd_scenes.v1.json", "dnd_scenes.v1.json",
"dnd_spells_llm.v1.json", "dnd_spells_llm.v1.json",