Capture pre-skill-apply XP and perk snapshots; on TryRecord loss reverse
each applied skill row via negative delta and restore the perk snapshot so
level-up unlocks from the loser call are reverted without clobbering a
concurrent winner's XP.
Rename freeze-first loader tests, add PrototypeE7M2QuestCatalogRulesTests
for cross-ref paths, align missing skill-def error with Python, and
document bundle schema path resolution in server README.
Register bundle JSON Schemas, parse bundle DTOs on QuestDefRow, and run
E7M2 prototype gates (presence, freeze table, cross-ref, mission_reward)
with skill catalog input from DI.
Document quest_start, quest_step_complete, quest_complete, and quest_accept_denied
anchors for future E9.M1 ingest with README, manual QA, and module doc updates.
Add QuestObjectiveWiring with auto step advance/complete, hook into
GatherOperations, CraftOperations, EncounterCompletionOperations, and
QuestStateOperations accept/advance for inventory_has_item checks.
Add CanWritePlayer to IPlayerQuestStateStore and check before
prerequisite gate; map TryActivate/TryAdvanceStep store failures
from progress snapshots instead of always unknown_player.
Fix persistence test AAA layout, empty-id denial theory, frozen id constants,
Postgres rollback/JSONB read, XML doc cref, README Bruno link, and review doc.
Introduces IPlayerQuestStateStore (in-memory + V008 Postgres), QuestStepState
snapshots, DI wiring, AAA unit tests, and docs for E7M1-05 before NEO-117 ops.
Add IEncounterCompleteEventStore with in-memory implementation, record
events on successful TryCompleteAndGrant, and expand reward_delivery
hook comments for future QuestRewardBundle routing.
In-memory IEncounterProgressStore and IEncounterCompletionStore with
EncounterProgressOperations for activation, defeat tracking, and
all-targets-defeated checks; unit tests and docs.
Thin IEncounterDefinitionRegistry / IRewardTableDefinitionRegistry adapters
over NEO-101 catalogs with TryNormalizeKnown, DI registration, and 18 AAA tests.
Add explicit HTML slice anchors to epic_05, restore deep links across E5
backlogs and plans, fix E5M2 NEO-98 resolve vocabulary and E5.M3 Linear row,
and record review follow-up as Done.
Telegraph damage now looks up behavior attackAbilityId for baseDamage and
maxRange instead of using aggroRadius. Adds three NPC attack abilities, maxRange
on AbilityDef, attackAbilityId on NpcBehaviorDef, and cross-ref validation.
Clear threat holder and reset runtime to idle when combat-target HP
is defeated — on cast accept and as an AdvanceOne guard so telegraph
cycles cannot continue after the killing blow.
Replace NEO-93 placeholder comments with full telegraph_fired and
npc_state_transition E9.M1 anchors in NpcRuntimeOperations; document
in server README and E5.M2 module alignment.
Introduce IThreatStateStore with first-hit acquire on damaging casts
and deterministic leash clears on player move and pre-acquire checks.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace alpha/beta dummies with PrototypeNpcRegistry (melee/ranged/elite),
per-archetype max HP from INpcBehaviorDefinitionRegistry, and updated
server tests + Bruno smokes. Documents breaking client change for NEO-97.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add IPlayerGigProgressionStore (in-memory + Postgres V007), GET
/gig-progression snapshot, and CombatDefeatGigXpGrant on cast accept
when targetDefeated — 25 XP to breach, outside E2.M2 skill XP.
Includes tests, Bruno, README, manual QA, and plan reconciliation.
Add dev combat-targets fixture reset endpoint, Bruno pre-request helper, and enable fixture in CI Bruno step so combat-targets tests run after ability-cast defeat spine.
Invoke CombatOperations.TryResolve after E1 gates; nested combatResolution
on accept; per-ability catalog cooldown; target_defeated deny without
cooldown. Tests, Bruno defeat spine, README and module docs updated.