# @v2/hathor-npc-adapter

V2-side bridge from open-world encounter hooks to Hathor `@hathor/llm-npc`.

The adapter only accepts World Tour, Tekken Force, Devil Within, DJ street,
MyCAREER backstage, and SC Chronicles overworld requests. Every request must set
`rollbackPolicy: "off-rollback-only"` and `deterministicGameplay: false`; the
bridge returns outputs on the `v2.npc.off_rollback` side channel with
`rollbackResultPolicy: "ignored_by_rollback"`.

The package does not place live LLM output in 1v1 rollback state. Match banter,
intros, taunts, and win quotes continue to come from prebaked Hathor
`@hathor/lore-compiler` banks.

Dialogue-like outputs are cached through `V2NpcDialogueCache`. The file-backed
implementation writes JSON entries under
`V2/ue/Content/Generated/NPCDialogue/<mode>/<hook>/<hash-prefix>/<hash>.json`,
where `<hash>` is `sha256(seed + "\n" + contextHash)`. The cache rationale is
cross-platform consistency, cost containment, and repeatability for QA/content
sign-off; it is not a replay-determinism mechanism.

Every dialogue response is validated before it is exposed or cached. The bridge
requires the Hathor persona identity to match the requested NPC, recognizes only
the declared emotion and intent vocabulary, bounds action identifiers, and
requires `memoriesTriggered` to equal the retrieved-and-validated memory
attribution. `confidenceScore` must exactly match the supplied calibrated
confidence evidence, and an answered response must clear its abstention
threshold. Abstentions cannot carry actions or triggered memories. Missing,
foreign, malformed, or contradictory evidence fails closed as
`invalid_runtime_output`.
