6.2 KiB
D&D Shared Module Helper Roadmap
This roadmap defines the target state for consolidating Dungeons & Dragons helper code that is currently duplicated across the implemented D&D modules. The refactor should preserve runtime behavior: module keys, prompt IDs, prompt versions, Scriptorium-visible prompt files, message order, response schemas, reference slot compatibility, manifests, diagnostics policy, and CLI/config semantics should not change.
Motivation
The dnd/scenes chunker and dnd/spells extractor now share several D&D prompt
and reference conventions:
- prompt inputs named
transcript,players,party, andglossary; - deprecated
rosterreference bindings mapped to thepartyprompt input; - D&D reference media-type declarations;
- deterministic rendering of one or more reference files into prompt input materials;
- shared D&D prompt fragments currently under
internal/modules/sharedassets; - prompt hash inclusion for shared D&D prompt fragments.
Keeping this logic duplicated makes future D&D modules more likely to drift. It also makes small prompt-contract changes expensive because each module must update the same reference-slot, prompt-input, and test helper behavior.
Target Package Boundary
D&D-specific shared helpers should live under:
internal/modules/sharedassets/dnd
The package name should be dnd. This keeps generic shared asset plumbing in
internal/modules/sharedassets while giving D&D-specific prompt and reference
policy a clear home.
internal/modules/sharedassets should continue to own:
- generic shared prompt asset registration;
ModulePromptFSand related prompt filesystem layout helpers;- non-domain-specific embedded asset plumbing;
- future prompt assets only when they are truly domain-neutral.
internal/modules/sharedassets/dnd should own D&D-specific reusable helpers:
- D&D shared prompt fragments;
- accepted reference media types for D&D reference slots;
- reference slot definitions for
players,party,glossary, and the deprecatedrosteralias; - prompt input assembly for D&D modules that use the shared prompt fragments;
- deterministic reference material rendering;
- shared D&D prompt hash parts.
Concrete D&D modules should continue to own:
- stage contracts and module registration;
- module keys and provided/required capabilities;
- prompt IDs and prompt versions;
- module-local prompt definitions, task prompts, and instruction prompts;
- response schema definitions and schema metadata;
- artifact interpretation, scene interpretation, validators, and output conversion.
Framework, core, and CLI packages must not import
internal/modules/sharedassets/dnd.
The intended asset layout is:
internal/modules/sharedassets/
assets.go
prompt_fs.go
internal/modules/sharedassets/dnd/
assets.go
prompt_inputs.go
references.go
assets/
prompts/
common-dnd-system.md
common-dnd-transcript.md
common-dnd-references.md
The parent sharedassets package should have no hard-coded knowledge of
common-dnd-* files. It should provide generic composition primitives that a
domain package such as sharedassets/dnd can use.
Desired End State
The dnd/scenes and dnd/spells modules should remain small owners of their
stage-specific behavior. Shared D&D helpers should remove duplicated mechanics
without hiding module semantics.
After the refactor:
- both modules should call one shared helper to build the D&D prompt input set from source input and resolved references;
- both modules should use one shared source of truth for D&D reference slots and accepted media types;
- D&D shared prompt files should live in
internal/modules/sharedassets/dndbeside the code that owns the D&D prompt contract; - generic shared asset plumbing should compose caller-provided shared prompt files without knowing which domain owns them;
- deprecated
rosterbindings should continue to work as an alias forparty; - reference rendering behavior should remain deterministic and covered by tests in the shared D&D helper package;
- real prompt asset tests should remain decoupled from exact embedded prompt prose;
- D&D module tests should focus on module contracts, request construction, response interpretation, validators, diagnostics, and manifest metadata rather than duplicate reference rendering details.
Documentation Outcome
Current-behavior docs should describe the D&D shared helper package only where it helps future maintainers understand ownership:
- Internal Modules should mention that common D&D
prompt/reference helper behavior lives under
internal/modules/sharedassets/dnd. - Internal Overview may mention the package if it lists shared module-support packages.
User-facing docs should not describe internal helper placement unless behavior visible to users changes. This refactor should not change visible behavior.
Resolved Decisions
Should generic reference-slot cloning move to contracts?
Decision: move generic cloning to internal/framework/contracts, for example
as CloneReferenceSlots. The operation is not D&D-specific and exists because
contracts.ReferenceSlot contains mutable slices. Keeping the clone helper with
the contract type makes defensive copying easier to reuse in future modules
without introducing domain imports.
Should shared D&D prompt hash parts move into sharedassets/dnd?
Decision: move D&D shared prompt hash helpers into
internal/modules/sharedassets/dnd. The hash parts are D&D-specific prompt
provenance, and placing them beside the D&D prompt contract reduces drift.
Should D&D shared prompt assets move into sharedassets/dnd?
Decision: move D&D shared prompt assets into
internal/modules/sharedassets/dnd/assets/prompts. The current
common-dnd-system.md, common-dnd-transcript.md, and
common-dnd-references.md files are not truly generic; they are part of the
D&D prompt contract. Keeping the files beside D&D reference slots, prompt input
assembly, reference rendering, and prompt hash helpers gives the package clear
ownership of reusable D&D prompt behavior.
The parent internal/modules/sharedassets package may still contain prompt
assets in the future, but only when they are genuinely domain-neutral.