Apply completionRewardBundle.reputationGrants via ReputationOperations with
compensating rollback; thread faction stores through quest wiring; add operator
chain Bruno helper and grid-contract accept success; update README and E7.M3 docs.
Document resetQuestIds, resource-node fixture, and cooldown clear in server README; add TryClearProgress Postgres integration test; sync-review doc and Bruno require paths.
Extend quest and resource-node fixture APIs so Bruno pre-requests can reset shared dev-local-1 state (cooldowns, nodes, inventory, quest progress) instead of relying on a fresh Postgres baseline.
Add POST …/__dev/quest-fixture to mark quests completed without reward
delivery; wire Bruno pre-request and CI flag. Multi-rule AND unit test,
README notes, gate deny comment, review strikethroughs.
Evaluate FactionGateRule rows before TryActivate; deny with faction_gate_blocked
when standing is below minStanding. Integration and Bruno deny smoke included.
Update decomposition docs for E7M3-03, add in-memory read-clamp test via
test seed hook, fix empty factionId deny code, AAA integration test,
Postgres FK orchestration notes, and strike review suggestions Done.
Per-player IFactionStandingStore with clamped reads/writes and fail-closed
unknown-faction deny; append-only IReputationDeltaStore; in-memory plus
Postgres V009/V010 when configured. Tests, Bruno health smoke, README.
Cross-link E7.M1 doc to E7M3 five-quest roster; remove dead
_prototype_e7m1_quest_gate; add faction standing-band CI gate;
clarify server roster error strings; grid-contract loader test asserts.
Add two prototype factions, extend quest bundles with reputationGrants
and factionGateRules, freeze five-quest roster in validate_content.py,
and sync minimal server quest roster parity for green startup tests.
Track perks unlocked per grant and remove only those on race loss instead
of restoring a full pre-apply snapshot; re-run ReevaluateAfterLevelUp at
post-rollback levels so a concurrent winner's path-auto unlocks survive.
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.
Wire QuestStateOperations.TryAccept at POST /game/players/{id}/quests/{questId}/accept
with shared quest row projection, integration tests, and Bruno accept flows.
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.
Align test DI resolution with encounter pattern, add unknown_quest
advance/complete tests, catalog quest id constants, refactor
TryMarkComplete readability, and update decomposition docs.
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.
Derive expected quest id order from PrototypeE7M1QuestCatalogRules,
assert refine craft_recipe objective in integration test, and update
module dependency register plus review doc strikethroughs.