Commit Graph

216 Commits (b20d7d001ea599ebd3eab2b5d375403297b8f058)

Author SHA1 Message Date
VinPropane c237bead53 NEO-147: guard DenyCreateFailure when create snapshot is null 2026-06-27 19:43:44 -04:00
VinPropane 39805ef8e6 chore: fix QuestDefinitionCatalogLoader analyzer warnings 2026-06-27 19:26:52 -04:00
VinPropane 7f62f43f92 NEO-147: add ContractGeneratorOperations.TryIssue orchestrator 2026-06-27 19:15:11 -04:00
VinPropane 1cf80a4e4e NEO-146: fix stale active index race in TryGetActiveForPlayer
Read the active index under the player lock and remove stale entries
only when the indexed instance id still matches, preventing concurrent
get/complete/reissue from dropping a newer active pointer.
2026-06-24 21:21:02 -04:00
VinPropane 93bd45d49a NEO-146: fix in-memory outcome idempotency race and clear parity
Lock idempotency keys alongside row ids in TryAppend so concurrent
duplicate keys cannot both succeed; return true from TryClearInstance
when the row is absent to match Postgres idempotent DELETE behavior.
2026-06-24 21:13:42 -04:00
VinPropane 6c4221072a NEO-146: fix in-memory create/complete lock ordering
Nest player and instance locks in TryCreateActive, TryMarkComplete, and
TryClearInstance so concurrent create and complete cannot leave a stale
active index or mismatched snapshot.
2026-06-24 21:05:56 -04:00
VinPropane 7740d2145f NEO-146: address Bugbot findings on contract outcome stores
Ensure instance schema before outcome DDL, require matching player/instance
on Postgres append, catch unique violations on concurrent duplicates, and
add parity plus concurrency integration tests.
2026-06-24 20:58:17 -04:00
VinPropane b087c03a47 NEO-146: address re-review in-memory outcome guard parity
InMemoryContractOutcomeStore checks IContractInstanceStore.TryGet before
append; add unit test, README/plan updates, and close r2 review items.
2026-06-24 20:52:49 -04:00
VinPropane 01e82f38f6 NEO-146: fix record struct docs and collection spread in tests
Replace param XML on record struct mutation outcomes with summary cref
docs to avoid Roslynator RCS1263 false positives; apply IDE0305 in
RewardRouterOperationsTests and update style guide guidance.
2026-06-24 20:47:40 -04:00
VinPropane b519f4e9eb NEO-146: fix mutation outcome docs and null-check style
Add summary and Kind param XML docs on mutation outcome records, simplify
PostgresDockerHelper null guard with ?? throw, and document RCS1139/IDE0270.
2026-06-24 20:46:23 -04:00
VinPropane b6b0b87534 NEO-146: fix remaining C# analyzer style warnings
Apply using simplification, inline declarations, const locals, and
Lock in PostgresDockerHelper; document RCS1118 and IDE0018 in style guide.
2026-06-24 20:44:30 -04:00
VinPropane e0877fea7f NEO-146: use collection spread in EncounterProgressApi
Apply IDE0305 to defeated-target ordering, assert stable sort in API
tests, and document sorted defeatedTargetIds in Bruno.
2026-06-24 20:41:40 -04:00
VinPropane b455ff5ad5 NEO-146: apply C# collection and using style fixes
Replace .ToArray() with collection spread, simplify single-statement
await using blocks, use Lock for Postgres schema gates, and document
IDE0063/IDE0305/IDE0330/CA1859 conventions in csharp-style.md.
2026-06-24 20:41:25 -04:00
VinPropane 1922900477 NEO-146: address code review findings for contract stores
Add Postgres race/deny tests, duplicate instance id coverage, FK-safe
outcome append, MakeInstanceKey locking, decomposition alignment updates,
and strike-through review doc.
2026-06-24 20:37:16 -04:00
VinPropane ae641a4dd0 NEO-146: add contract instance and outcome stores with Postgres split
Durable per-player contract instances (one active) and append-only
outcome audit rows, mirroring NEO-116/135 store patterns with V011/V012
migrations, AAA tests, README docs, and Bruno health smoke.
2026-06-24 20:27:32 -04:00
VinPropane 93fd8864dc chore: fix contract catalog analyzer warnings.
Primary constructor on ContractTemplateCatalog; concrete List return
types in loader parse helpers; collection spread in NormalizeBundle;
const emptyCatalog in roster gate test.
2026-06-20 19:46:39 -04:00
VinPropane 5ab5022704 NEO-145: add fail-fast contract template catalog load and registry.
Startup loader mirrors validate_content.py E7M4 gates (roster, freeze,
cross-ref, band caps); IContractTemplateRegistry resolves templates by id.
Bruno health smoke confirms host boot after catalog validation.
2026-06-20 19:31:54 -04:00
VinPropane 3a509d560e chore: silence IDE0301 and redundant await linter warnings
Use static empty bundle grant lists in RewardRouterOperations; drop
redundant await on synchronous GdUnit assert_signal in quest defs test.
2026-06-17 21:19:27 -04:00
VinPropane e39622893b chore: use collection expressions for empty grant fallbacks
Replace Array.Empty<T>() with [] in RewardRouterOperations (IDE0301).
2026-06-17 21:13:29 -04:00
VinPropane 0a4450a199 NEO-141: address review — backlog wording and class summary
Align E7M3-09 in-scope bullet with ops-only hook anchors; pluralize
FactionGateOperations telemetry remark; mark review findings done.
2026-06-17 19:27:27 -04:00
VinPropane 73403622f2 NEO-141: consolidate faction telemetry hook comment sites
Complete reputation_delta anchor in ReputationOperations, extend
faction_gate_blocked on both gate deny paths, remove router duplicate
stub, and add README Faction telemetry hooks subsection.
2026-06-17 19:25:25 -04:00
VinPropane 2b4a0d1e34 NEO-140: project faction gates and rep grants on quest HTTP GETs
World quest-definitions expose optional factionGateRules; quest-progress
completionRewardSummary maps GrantedReputation to reputationGrants.
2026-06-17 19:08:37 -04:00
VinPropane 3f08812e93 NEO-139: add GET faction-standing snapshot API with tests and Bruno.
Expose client-readable standing for all catalog factions; 404 unknown players via position gate; Bruno asserts +15 after operator chain.
2026-06-16 17:19:50 -04:00
VinPropane 6999eb3303 NEO-138: clear delivery and audit on quest fixture reset.
resetQuestIds now clears IRewardDeliveryStore rows and quest-completion
audit deltas so Bruno re-runs re-apply rep grants after standing reset.
2026-06-15 23:10:58 -04:00
VinPropane 4ee29e867b NEO-138: quest-fixture resetFactionIds for gate deny Bruno.
Clear prototype faction standing in seq 10 pre-request so stale +15 from
prior seq 11 runs does not pass the grid contract gate locally.
2026-06-15 23:00:21 -04:00
VinPropane 3466f1ee32 NEO-138: reward router reputation grants, Bruno quest-flow, docs.
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.
2026-06-15 22:18:27 -04:00
VinPropane 95cf5d1f83 chore: add Bruno self-reset dev fixtures for order-independent collection runs.
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.
2026-06-15 21:50:22 -04:00
VinPropane a36e7b56b5 NEO-137: Address review — quest fixture for Bruno CI and test/docs nits.
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.
2026-06-15 21:24:21 -04:00
VinPropane 0241cc31e3 NEO-137: Wire FactionGateOperations into quest accept with tests and docs.
Evaluate FactionGateRule rows before TryActivate; deny with faction_gate_blocked
when standing is below minStanding. Integration and Bruno deny smoke included.
2026-06-15 21:11:27 -04:00
VinPropane ddaf33ce87 NEO-136: fix rollback applied delta and normalize ids at ops boundary 2026-06-15 20:52:04 -04:00
VinPropane 8aae9625e7 NEO-136: add ReputationOperations auditable standing apply 2026-06-15 20:48:42 -04:00
VinPropane 94acf57e5b NEO-135: apply standing deltas from clamped effective value
Compute newStanding from previousStanding + deltaAmount so stale
out-of-band persisted values match TryGetStanding before mutation.
2026-06-15 20:35:24 -04:00
VinPropane 2ac804ed6c NEO-135: validate faction before player gate in in-memory store
Match PostgresFactionStandingStore check order so unknown faction ids
return unknown_faction even when the player is not writable.
2026-06-15 20:32:53 -04:00
VinPropane d5f16f4cf4 NEO-135: address code review findings
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.
2026-06-15 20:27:36 -04:00
VinPropane 4fca45bf7c NEO-135: add faction standing and reputation delta audit stores
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.
2026-06-15 20:23:57 -04:00
VinPropane aa3eb3597c NEO-134: address code review findings
Update decomposition tracking docs, add faction loader integration tests,
reorder standing-band gate before freeze, and guard success logging.
2026-06-15 20:11:55 -04:00
VinPropane 48bca98467 NEO-134: fail-fast faction catalog load with E7M3 quest gates
Add Game/Factions loader, registry, and CI-parity prototype rules; extend
quest catalog to parse faction gates/rep grants and cross-check at startup.
2026-06-15 20:08:46 -04:00
VinPropane 6cb7dfbb46 NEO-133: address code review — roster docs, CI cleanup, band gate
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.
2026-06-15 19:52:42 -04:00
VinPropane 0948d9d4a8 NEO-133: land faction catalog, quest gate/rep schemas, and CI gates
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.
2026-06-14 14:54:20 -04:00
VinPropane 1333da2938 NEO-130: Address review feedback on unlock_granted stub.
Document E9.M1 durable-emit gating for rollback paths; reconcile plan
bullet for class summary; strike through resolved review items.
2026-06-07 22:49:00 -04:00
VinPropane c461a822f1 NEO-130: Add comment-only reward telemetry hook sites.
Anchor future E9.M1 reward_delivery and unlock_granted events in
RewardRouterOperations; document hooks in server README and module docs.
2026-06-07 22:46:27 -04:00
VinPropane 78e805e428 NEO-129: add completionRewardSummary to quest-progress GET.
Project IRewardDeliveryStore grant snapshots onto completed quest rows;
extend tests, Bruno gather-intro spine, and docs.
2026-06-07 18:38:37 -04:00
VinPropane da99769ddf NEO-128: wire quest complete to reward router deliver-then-mark.
TryMarkComplete delivers completionRewardBundle before marking complete;
objective wiring and upstream ops thread reward dependencies. Tests cover
bundle delivery, idempotent replay, and inventory-full deny.
2026-06-07 18:24:01 -04:00
VinPropane 039672cdac NEO-127: avoid clobbering winner perks on TryRecord race rollback
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.
2026-06-07 18:10:56 -04:00
VinPropane be9bb8f961 NEO-127: restore perk state on TryRecord race rollback
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.
2026-06-07 18:04:06 -04:00
VinPropane 71fbf3d628 NEO-127: rollback duplicate grants when TryRecord loses race
Mirror EncounterCompletionOperations compensating rollback: concurrent
losers undo item and skill XP applies before returning the winner event.
2026-06-07 17:53:20 -04:00
VinPropane 5b84ffd75a NEO-127: add RewardRouterOperations for quest completion bundles
Apply item grants and mission_reward skill XP with compensating rollback,
idempotent IRewardDeliveryStore recording, and AAA integration tests.
2026-06-07 17:47:32 -04:00
VinPropane 2a8fe31b14 NEO-126: add IRewardDeliveryStore for quest completion rewards
In-memory RewardDeliveryEvent store with idempotent TryRecord,
grant summaries for future HTTP projection, DI registration, and tests.
2026-06-07 17:31:45 -04:00
VinPropane 766837d7e8 NEO-125: address code review findings for bundle validation
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.
2026-06-07 15:27:55 -04:00
VinPropane 3924695619 NEO-125: fail-fast quest completionRewardBundle validation at startup
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.
2026-06-07 15:25:58 -04:00