Audit NPC item and location registries

This commit is contained in:
2026-08-08 22:18:29 +00:00
parent 3589d33468
commit 551e4daea2

View File

@@ -20,8 +20,9 @@ change only roadmap audit documents do not change that production target.
Pending final synthesis. The initial baseline is healthy. The architecture,
configuration/CLI, pipeline composition, reference/handoff, runtime, state,
LLM, generic/Seriatim, and shared D&D reviews have found three High findings,
four Medium findings, and sixteen Low findings, with no production dependency
LLM, generic/Seriatim, shared D&D, and registry-family reviews have found three
High findings, four Medium findings, and twenty Low findings, with no
production dependency
inversion, unbounded framework worker pool, completion-order-dependent result
assembly, debug-to-cache coupling, model-visible credential material in the
embedded LLM assets, or domain leakage across the Seriatim and generic module
@@ -56,6 +57,10 @@ Final cross-area ordering is pending synthesis.
| MOD-002 | Low | Efficiency | Reuse compiled response schemas within a prepared validator |
| MOD-003 | Low | Simplicity | Remove unreachable JSON metadata clone helpers |
| DND-CORE-001 | Low | Simplicity | Remove the unused lossy unit-reference constructor |
| DND-REG-001 | Low | Correctness | Reject reversed evidence ranges at the registry codec boundary |
| DND-REG-002 | Low | Correctness | Keep NPC extraction evidence inside the current chunk |
| DND-REG-003 | Low | Efficiency | Index item and location duplicate groups |
| DND-REG-004 | Low | Efficiency | Select location identity anchors without sorting |
## Findings
@@ -849,6 +854,147 @@ Final cross-area ordering is pending synthesis.
`go test ./internal/modules/dnd/shared/...`.
- **Grouping:** Independent.
### NPC, Item, And Location Registries
### DND-REG-001 — Reject reversed evidence ranges at the registry codec boundary
- **Severity:** Low
- **Category:** Correctness
- **Evidence:** All three registry integration contracts require that a source
range's start not follow its end
(`docs/integrations/dnd-npc-registry-artifacts.md:32``34`,
`dnd-item-registry-artifacts.md:33``35`, and
`dnd-location-registry-artifacts.md:34``36`). The three durable codec
validators check only that both endpoints are positive
(`internal/modules/dnd/codec/npcregistry/codec.go:96``106`,
`codec/itemregistry/codec.go:97``107`, and
`codec/locationregistry/codec.go:97``107`). Direct registry references are
decoded and identity-checked by `npcs/registry.loadRegistry`,
`items/registry.loadRegistry`, and `locations/registry.loadRegistry`, but do
not pass through the generated-output source-reference validators. A durable
artifact with `{start_unit_id: 2, end_unit_id: 1}` and otherwise valid
identity is therefore accepted; for locations, `validIdentityReference` at
`internal/modules/dnd/locations/identity/identity.go:170``171` also treats
that reversed range as a valid identity anchor.
- **Impact:** An externally supplied registry can be accepted as approved even
though its evidence cannot denote the documented forward source interval.
NPC and item prompt projections then hide the malformed provenance, while a
location can derive and retain a durable ID from it; only later consumers
that happen to construct contextual grounding against the same source may
reject it. Generated pipeline outputs remain protected by their source-
reference validator chains, which limits current exposure.
- **Recommendation:** Add the order-independent structural condition
`start_unit_id <= end_unit_id` to each registry codec's durable validation,
and make location identity reject reversed anchors as a defense in depth.
Keep document membership and current-chunk coverage in the existing
validators, where the source document is available.
- **Preserve:** Retain positive exact source-unit identifiers, strict unknown-
field/trailing-value rejection, location identity's earliest canonical
anchor policy, and the separation between source-independent durable shape
validation and source-dependent evidence validation.
- **Validation:** Add codec encode/decode cases for reversed ranges in all three
registry families, a location identity case that refuses a reversed-only
anchor, and direct registry resolver cases proving malformed referenced JSON
is rejected; run the three codec, identity, and registry package suites.
- **Grouping:** Independent.
### DND-REG-002 — Keep NPC extraction evidence inside the current chunk
- **Severity:** Low
- **Category:** Correctness
- **Evidence:** The NPC, item, and location extractors receive only the current
chunk and all three default extract chains run their family source-reference
validator. Item and location validators require a non-nil extraction chunk
and reject references whose endpoints are not in it
(`internal/modules/dnd/validate/itemregistry/source_refs/validator.go:37``55`
and `validate/locationregistry/source_refs/validator.go:37``55`). The NPC
validator at `validate/npcregistry/source_refs/validator.go:36``53` checks
only that a reference is valid somewhere in the complete source document; it
neither requires `req.Chunk` during extraction nor checks chunk membership.
Its focused tests include reversed, foreign, and out-of-document ranges but
no off-chunk range or missing-chunk case.
- **Impact:** If an NPC extraction response supplies a valid unit ID from
another chunk, the candidate can pass evidence validation despite the model
never receiving that passage. A name that also appears at the off-chunk range
can pass advisory relatedness without proving the current candidate, causing
duplicated or misattributed registry provenance across chunk results. The
model usually copies visible unit IDs, which limits the likelihood.
- **Recommendation:** Match the item/location extraction contract: require the
current chunk when `req.Stage` is extract and reject NPC references outside
that chunk. Keep whole-document validation for normalize and other non-
extraction validation calls.
- **Preserve:** Retain full-document source-ID/range validation, shape deferral,
bounded aggregate diagnostics, normalization without a chunk, direct factual
third-party mentions, and source-relatedness as an advisory check rather than
an identity gate.
- **Validation:** Add NPC source-reference cases for an existing off-chunk
range, a missing extraction chunk, an accepted in-chunk range, and normalize-
stage validation without a chunk; run the NPC registry validator, extractor,
and assembled pipeline tests.
- **Grouping:** Independent.
### DND-REG-003 — Index item and location duplicate groups
- **Severity:** Low
- **Category:** Efficiency
- **Evidence:** NPC preprocessing indexes normalized comparison names in a map,
but `comparisonNameGroups` in
`internal/modules/dnd/normalize/itemregistry/normalizer.go:242``259` scans
every previously formed group for each item and recomputes the first member's
comparison key. `exactDuplicateGroups` in
`normalize/locationregistry/normalizer.go:229``246` repeats that nested scan
and performs `reflect.DeepEqual` over canonical source-reference slices for
each candidate group. With distinct records, both paths are quadratic before
any LLM reconciliation request is built.
- **Impact:** Large merged registries spend avoidable deterministic CPU in
normalization, with the location cost also proportional to citation-list
comparisons. Normal registry sizes and the later LLM request dominate today,
so the issue is low severity.
- **Recommendation:** Preserve first-seen group order while maintaining a local
index from the complete duplicate identity to its group position. Use the
existing comparison key for items and an exact, collision-safe key over the
comparison name plus canonical source-reference sequence for locations;
verify equality on any hash collision rather than using lossy concatenation.
- **Preserve:** Item duplicates remain name-identity duplicates regardless of
evidence; locations collapse only equal comparison names with exactly equal
canonical evidence; group/member order, input-index provenance, warning
scopes, and later proposal-only semantic reconciliation remain unchanged.
- **Validation:** Add many-distinct and repeated-key cases that compare output
groups and warning order with current fixtures, plus a focused benchmark or
comparison-count hook demonstrating linear expected grouping work; run the
item and location normalizer tests.
- **Grouping:** Independent.
### DND-REG-004 — Select location identity anchors without sorting
- **Severity:** Low
- **Category:** Efficiency
- **Evidence:** Location identity depends only on the least valid source
reference. `earliestReference` nevertheless calls `canonicalReferences`,
which allocates a full copy, sorts it, and deduplicates it
(`internal/modules/dnd/locations/identity/identity.go:137``167`).
`ValidateRegistry` calls `earliestReference` once to check evidence and then
calls `DeriveID`, which invokes it again for every syntactically valid record
(lines 106121). Normalization has already canonicalized each location's
references before deriving its ID, but pays the same second ordering pass.
- **Impact:** Each validation performs two `O(r log r)` allocations/sorts per
location to obtain one minimum, and normalization adds another sort after
source-order canonicalization. Citation counts are bounded in ordinary
transcripts, so this is a localized allocation and CPU issue.
- **Recommendation:** Implement `earliestReference` as a non-mutating linear
minimum selection using the exact current source-ID/start/end comparator, and
compute that anchor once per record during identity validation before ID
comparison. Do not reuse document-position `SourceRefOrder`, whose ordering
contract differs from durable location identity.
- **Preserve:** Keep order-independent IDs, filtering of malformed anchors,
lexicographic source-ID then numeric start/end selection, same-name/different-
anchor distinction, exact compact JSON hash input, and input non-mutation.
- **Validation:** Retain the permuted-reference and same-name/different-anchor
identity fixtures, add mixed valid/invalid and tie-order cases, and use an
allocation or benchmark assertion to demonstrate one linear pass per record;
run the location identity, registry, and normalizer tests.
- **Grouping:** Independent.
<!--
Finding template for later audit stages:
@@ -883,14 +1029,14 @@ evidence projector.
| Family | Durable kind / Go type | Modules and execution class | Default validator chains (E / N) | Reference dependencies (E / N) | Codec, prompt, and schema ownership | Documented exception and later confirmation |
| --- | --- | --- | --- | --- | --- | --- |
| Spells | `dnd/spell-list` / `dnd.SpellList` | `dnd/spells` (LLM) → typed `appendorder` (deterministic) → `dnd/spells` (deterministic) | `B + catalog` / `B + catalog` | `C` plus optional `spell_catalog` and `npc_registry` / optional `spell_catalog` | `codec/spells`; extractor owns its prompt and private response schema; normalizer has no prompt | Catalog overlay and NPC caster grounding are optional and never evidence; confirm spell/catalog and scene-family behavior in the spells/scenes review. |
| NPC registry | `dnd/npc-registry` / `dnd.NPCRegistry` | `dnd/npc-registry` (LLM) → typed `appendorder` (deterministic) → `dnd/npc-registry` (LLM) | `B` / `B + identity` | `C` / none | `codec/npcregistry`; extractor and normalizer own prompts; extractor owns its response schema, while normalize uses the shared private entity-reconciliation schema | Normalization is proposal-only LLM reconciliation; confirm identity, merge safety, and same-name policy in the registry review. |
| NPC registry | `dnd/npc-registry` / `dnd.NPCRegistry` | `dnd/npc-registry` (LLM) → typed `appendorder` (deterministic) → `dnd/npc-registry` (LLM) | `B` / `B + identity` | `C` / none | `codec/npcregistry`; extractor and normalizer own prompts; extractor owns its response schema, while normalize uses the shared private entity-reconciliation schema | Confirmed: normalized comparison-name identity, deterministic exact duplicate consolidation, proposal-only semantic groups, collision-safe application, retry/fallback, and immutable name/identity projections; DND-REG-001 and DND-REG-002 record evidence-boundary gaps. |
| Combat turns | `dnd/combat-turn-list` / `dnd.CombatTurnList` | `dnd/combat-turns` (LLM) → typed `appendorder` (deterministic) → `dnd/combat-turns` (deterministic) | `B` / `B + invariants` | `C`, optional `npc_registry`, required `scene_descriptions` / optional `npc_registry` | `codec/combatturns`; extractor owns its prompt and private response schema; normalizer has no prompt | Scene descriptions gate LLM execution and NPC grounding is not evidence; confirm gate and empty-result semantics in the combat/enemy review. |
| Item occurrences | `dnd/item-occurrence-list` / `dnd.ItemOccurrenceList` | `dnd/item-occurrences` (LLM) → typed `appendorder` (deterministic) → `dnd/item-occurrences` (deterministic) | `B + registry` / `B + registry + invariants` | `C` plus required `item_registry` / required `item_registry` | `codec/itemoccurrences`; extractor owns its prompt and private response schema; normalizer has no prompt | Registry identity grounds current-transcript facts but never supplies evidence; confirm quantities, holders, and registry projection in the occurrence review. |
| Item registry | `dnd/item-registry` / `dnd.ItemRegistry` | `dnd/item-registry` (LLM) → typed `appendorder` (deterministic) → `dnd/item-registry` (LLM) | `B` / `B + identity` | `C` / none | `codec/itemregistry`; extractor and normalizer own prompts; extractor owns its response schema, while normalize uses the shared private entity-reconciliation schema | Normalization is proposal-only and preserves denominations/types rather than inventing instances; confirm identity and merge policy in the registry review. |
| Item registry | `dnd/item-registry` / `dnd.ItemRegistry` | `dnd/item-registry` (LLM) → typed `appendorder` (deterministic) → `dnd/item-registry` (LLM) | `B` / `B + identity` | `C` / none | `codec/itemregistry`; extractor and normalizer own prompts; extractor owns its response schema, while normalize uses the shared private entity-reconciliation schema | Confirmed: name identity, exact duplicate evidence union, proposal-only aliases, collision safety, and denomination/type-preserving currency gate; DND-REG-001 and DND-REG-003 record boundary/grouping gaps. |
| NPC occurrences | `dnd/npc-occurrence-list` / `dnd.NPCOccurrenceList` | `dnd/npc-occurrences` (LLM) → typed `appendorder` (deterministic) → `dnd/npc-occurrences` (deterministic) | `B + registry` / `B + registry + invariants` | `C` plus required `npc_registry` / `C` plus required `npc_registry` | `codec/npcoccurrences`; extractor owns its prompt and private response schema; normalizer has no prompt | Registry provenance cannot become occurrence evidence and `mentioned` remains a factual category; confirm category/identity handling in the occurrence review. |
| Scene descriptions | `dnd/scene-description-list` / `dnd.SceneDescriptionList` | `dnd/scene-descriptions` (LLM) → typed `appendorder` (deterministic) → `dnd/scene-descriptions` (deterministic) | `B` / `B + invariants` | optional `glossary`, `party`, and `players` / none | `codec/scenedescriptions`; extractor owns its prompt and private response schema; normalizer has no prompt | Each record has one `source_ref` rather than a slice; the separate `dnd/scenes` LLM chunker owns the full-transcript scene prompt. Confirm scene IDs, ordering, and classification in the spells/scenes review. |
| Enemy events | `dnd/enemy-event-list` / `dnd.EnemyEventList` | `dnd/enemy-events` (LLM) → typed `appendorder` (deterministic) → `dnd/enemy-events` (deterministic) | `B + engagements` / `B + invariants` | `C` plus required `npc_registry`, `scene_descriptions`, `combat_turns`, and `npc_occurrences` / required `npc_registry` | `codec/enemyevents`; extractor owns its prompt and private response schema; normalizer has no prompt | Four generated artifacts ground extraction without becoming event evidence; durable decode separately proves required JSON-field presence. Confirm combat gating, engagement uniqueness, and observation ordering in the combat/enemy review. |
| Location registry | `dnd/location-registry` / `dnd.LocationRegistry` | `dnd/location-registry` (LLM) → typed `appendorder` (deterministic) → `dnd/location-registry` (LLM) | `B` / `B + identity` | `C` / none | `codec/locationregistry`; extractor and normalizer own prompts; extractor owns its response schema, while normalize uses the shared private entity-reconciliation schema | Normalization is proposal-only and same-name locations require contextual evidence; confirm identity and merge policy in the registry review. |
| Location registry | `dnd/location-registry` / `dnd.LocationRegistry` | `dnd/location-registry` (LLM) → typed `appendorder` (deterministic) → `dnd/location-registry` (LLM) | `B` / `B + identity` | `C` / none | `codec/locationregistry`; extractor and normalizer own prompts; extractor owns its response schema, while normalize uses the shared private entity-reconciliation schema | Confirmed: comparison name plus earliest canonical evidence identity, same-name/different-anchor preservation, proposal-only aliases, and immutable context-qualified selectors without durable IDs; DND-REG-001, DND-REG-003, and DND-REG-004 record bounded gaps. |
| Location occurrences | `dnd/location-occurrence-list` / `dnd.LocationOccurrenceList` | `dnd/location-occurrences` (LLM) → typed `appendorder` (deterministic) → `dnd/location-occurrences` (deterministic) | `B + registry` / `B + registry + invariants` | `C` plus required `location_registry` / required `location_registry` | `codec/locationoccurrences`; extractor owns its prompt and private response schema; normalizer has no prompt | Registry grounding cannot become evidence and speculation remains distinct from unsupported inference; confirm category and identity handling in the occurrence review. |
Shared convention review classified the codec surface as safe typed adapters,
@@ -932,9 +1078,10 @@ cache identity, and semantic identity while retaining owned loaded values. The
entity-reconciliation helper keeps durable IDs out of prompts, rejects invalid
or colliding selectors and overlapping groups, bounds transcript context, and
returns owned safe groups. Shared comparison policy is versioned, and shared
diagnostics bound displayed issues and warning counts. Domain-specific identity,
merge, category, and eligibility decisions remain assigned to the subsequent
registry, occurrence, scene/spell, and combat/enemy reviews.
diagnostics bound displayed issues and warning counts. The registry review now
confirms the three noun-family identity and merge decisions; occurrence
categories and eligibility, scene/spell policy, and combat/enemy behavior remain
assigned to their subsequent reviews.
Finally, repeated `ManifestMetadata` and `CheckpointFingerprints` methods remain
module-local because their exact policy names, prompt/schema hashes, reference
@@ -1629,13 +1776,70 @@ mechanics that recur without erasing those distinctions.
helpers already consolidate prompt assets, candidate JSON, reference slots,
comparison, diagnostics, resolution, and reconciliation. No additional
callback- or reflection-driven helper reduced demonstrated drift.
- **Deferred lane questions:** Registry identity and reconciliation policy is
assigned to the registry review; occurrence categories and registry
projections to the occurrence review; spell catalog, scene chunking, scene
IDs, and scene classification to the spells/scenes review; and combat gates,
engagement uniqueness, collective labels, and enemy observation ordering to
the combat/enemy review. This area therefore remains `Revisit` until those
reviews confirm the matrix's documented exceptions.
- **Deferred lane questions:** Registry identity, reconciliation, and immutable
projection policy is now confirmed, with DND-REG-001 through DND-REG-004
recording the bounded gaps. Occurrence categories and registry projections
remain assigned to the occurrence review; spell catalog, scene chunking,
scene IDs, and scene classification to the spells/scenes review; and combat
gates, engagement uniqueness, collective labels, and enemy observation
ordering to the combat/enemy review. This area therefore remains `Revisit`
until those reviews confirm the remaining matrix exceptions.
### NPC, Item, And Location Registries
- **End-to-end artifact path:** Each LLM extractor decodes a private
name/evidence response, injects the current source ID, canonicalizes direct
citations, orders candidates by earliest evidence, and derives family-owned
IDs before the typed append-order merger. Normalizers own display cleanup,
exact duplicate consolidation, proposal-only semantic reconciliation,
deterministic fallback, final identity derivation, and owned output. Shape,
identity, current-source reference, schema, and advisory relatedness checks
remain ordered in the declared chains before canonical codec publication.
Generated references cross the strict typed codec boundary; external
approved references use the immutable family registry loaders. DND-REG-001
records the structural rule missing from that direct path, and DND-REG-002
records the NPC extractor's missing current-chunk evidence gate.
- **Identity and lookup policy:** NPC and item identity is the versioned Unicode
comparison name hashed through compact JSON, with duplicate comparison names
rejected after normalization. Location identity adds the lexicographically
earliest valid source anchor, intentionally permitting equal display names at
distinct anchors. Family registries validate IDs, clone retained records and
citations, build exact ID/name lookups where supported, publish semantic
durable and projection digests, and return defensive copies. DND-REG-004
concerns only repeated work in selecting the location anchor.
- **Reconciliation safety:** All three normalizers render source-free candidate
keys with bounded transcript context, invoke the shared strict reconciliation
schema only when at least two eligible candidates exist, reject unknown,
colliding, duplicate, or overlapping groups, apply only disjoint safe groups,
and retry discarded proposals before deterministic warning-bearing fallback.
NPCs consolidate aliases under the selected canonical name; items additionally
refuse groups that mix currency with non-currency or conflicting
denominations; locations union citations and recompute anchored identity.
DND-REG-003 records only the pre-reconciliation exact-group scan.
- **Proper-name and currency behavior:** NPC extraction requires a proper name,
stable title, or individually identifying alias and excludes players,
generic roles, groups, and hypotheticals. Location extraction requires a
stable physical proper or uniquely identifying designation and excludes
generic, relative, transient, and merely descriptive references. Item
extraction keeps named/unique concrete reusable objects, materially distinct
stable types, and each currency denomination while excluding generic or
vague mentions. Normalization proposes equivalence but cannot invent records,
source evidence, or unsupported canonical names.
- **Location grounding:** Immutable location grounding groups comparison names,
exposes name-only selectors for unique names, and exposes exact canonical
ranges plus cited context only when same-name records need disambiguation.
Durable IDs and source IDs remain model-invisible, selectors resolve by exact
contextual identity, collisions and invalid contextual citations fail
construction, and prompt/resolved values are defensively copied.
- **Test ownership:** Extractor tests own prompt manifests, strict response
decoding, citation adaptation, order, and fingerprints; identity/registry
tests own compact hash inputs, same-name behavior, lookup/digest projections,
direct resolution, empty placeholders, grounding, and mutation isolation;
normalizer tests own exact/semantic consolidation, currency and location
safety gates, diagnostics, retry/exhaustion fallback, context, and prompt
fingerprints; validator tests own shape deferral, identity diagnostics,
current-source/chunk evidence, relatedness warnings, and bounded messages.
The prescribed package suite passes.
## Validation Record
@@ -1683,6 +1887,9 @@ mechanics that recur without erasing those distinctions.
| 2026-08-08 | Audit target integrity before shared D&D review | `git diff --quiet 92e89076a268089e703978fb9d7176200e93344c..HEAD -- . ':(exclude)docs/roadmap/**'` | Pass; production target unchanged |
| 2026-08-08 | Shared D&D graph/code review | Scoped architecture, exact symbol reads, inbound traces, and complete implementation/test inspection across ten durable types/codecs, candidate JSON, source-reference utilities, resolver/reconciliation/diagnostics, typed mergers, evidence, registration, default chains, shared assets, and representative family prompt/schema owners | DND-CORE-001 recorded; family registration, codec ownership, reference/evidence separation, shared reconciliation safety, and typed adapter boundaries otherwise confirmed |
| 2026-08-08 | Required shared D&D tests | `go test ./internal/modules/dnd/codec/... ./internal/modules/dnd/shared/... ./internal/modules/dnd/register` | Pass |
| 2026-08-08 | Audit target integrity before registry-family review | `git diff --quiet 92e89076a268089e703978fb9d7176200e93344c..HEAD -- . ':(exclude)docs/roadmap/**'` | Pass; production target unchanged |
| 2026-08-08 | Registry-family graph/code review | Exact symbol reads, complexity queries, and call traces across NPC, item, and location extraction, canonicalization, identity, immutable registries and projections, reconciliation eligibility/application/retry/fallback, normalization, validation, codecs, prompt assets, schemas, and focused tests | DND-REG-001 through DND-REG-004 recorded; name/anchor identity, same-name location, currency, proposal safety, diagnostics, fallback, and immutable projection policies otherwise confirmed |
| 2026-08-08 | Required NPC, item, and location registry tests | `go test ./internal/modules/dnd/extract/npcregistry ./internal/modules/dnd/extract/itemregistry ./internal/modules/dnd/extract/locationregistry ./internal/modules/dnd/npcs/... ./internal/modules/dnd/items/... ./internal/modules/dnd/locations/... ./internal/modules/dnd/normalize/npcregistry ./internal/modules/dnd/normalize/itemregistry ./internal/modules/dnd/normalize/locationregistry ./internal/modules/dnd/validate/npcregistry/... ./internal/modules/dnd/validate/itemregistry/... ./internal/modules/dnd/validate/locationregistry/...` | Pass |
## Coverage Matrix
@@ -1697,7 +1904,7 @@ mechanics that recur without erasing those distinctions.
| LLM runtime, prompt filesystems, and assets | Reviewed | LLM internal/integration/configuration/operations docs and related ADRs; scheduled client, scheduler, PromptKit adapter/profile inspector, profile/source fingerprints, redaction, debug, asset registry, schema loader, promptfs implementations and focused tests; root assets, fallback profile, all fourteen module manifests and prompt YAML files, shared/model-visible fragments, private response schemas, and representative composed loaders | Target-integrity check, graph architecture/symbol/call review, content scan and exact prompt-order comparison, focused race tests, composed CLI and D&D prompt-cache tests | LLM-001, LLM-002, LLM-003, LLM-004 |
| Generic and Seriatim modules | Reviewed | Internal module guide; Seriatim, JSON output, chunk-map, and evidence-context integration contracts; all implementation/tests under `internal/modules/generic/` and `internal/modules/seriatim/`; framework evidence preparation/output paths and focused tests; maintained CLI example and production output contracts | Target-integrity check, graph architecture/symbol/call/caller review, direct import map, required module and codec tests, focused composed evidence/output tests | MOD-001, MOD-002, MOD-003 |
| Shared D&D types, codecs, and family mechanics | Revisit | D&D internal/module docs and all D&D integration contracts; root durable types; all ten codec packages and candidate JSON; shared references, ordering, citations, inputs, comparison, diagnostics, registry resolver, entity reconciliation, and assets; typed merger/evidence/default-chain/fallback/family registration; representative module asset declarations and focused tests | Target-integrity check, scoped graph architecture/search/traces, ten-family convention matrix, required codec/shared/register tests | DND-CORE-001 |
| NPC, item, and location registries | Pending | — | — | — |
| NPC, item, and location registries | Reviewed | NPC/item/location registry integration contracts and relevant identity/evidence ADRs; extractors, candidate models and response schemas; identity, immutable registry, prompt/identity projection, location grounding, reconciliation, normalizer, validators, codecs, prompt assets, and focused tests for all three families | Target-integrity check, scoped graph architecture/complexity/search/traces, full family comparison, required extractor/identity/registry/normalizer/validator tests | DND-REG-001, DND-REG-002, DND-REG-003, DND-REG-004 |
| NPC, item, and location occurrences | Pending | — | — | — |
| Spells, scene chunking, and scene descriptions | Pending | — | — | — |
| Combat turns and enemy events | Pending | — | — | — |