Commit Graph

243 Commits (e783fa5441f68ca2f53d0764df8c1f1d21d948ab)

Author SHA1 Message Date
VinPropane b76fc60c09 NEO-153: remove redundant Skills/Encounters usings in contract tests.
CS8019 hints came from per-file imports duplicating GlobalUsings.cs
(NeonSprawl.Server.Game.Skills) and unused Encounters in ContractApiTests.
2026-06-28 13:20:30 -04:00
VinPropane 0888262f13 NEO-151: Address code review findings for contract HTTP API
Return 404 for whitespace path on issue POST, add seed-field validation
tests, inline Postgres ListForPlayer active query, Postgres list test,
Bruno whitespace-path 404 check, and strike through resolved review items.
2026-06-28 10:25:58 -04:00
VinPropane c0252ee8be NEO-151: Add contract issue POST and per-player contract GET HTTP API
Wire ContractIssueApi and ContractListApi with ListForPlayer store reads,
integration tests, Bruno issue/clear/GET spine, and docs reconciliation.
2026-06-28 10:21:10 -04:00
VinPropane 70e3e9a17d NEO-150: Address code review findings
Extract ContractPrototypeTestFixtures, add skill XP over-cap test,
null-guard template, validation-order comment, and NEO-151 handoff note.
2026-06-28 10:01:08 -04:00
VinPropane 3d49230c3c NEO-150: Add issue-time contract economy validation
Introduce ContractEconomyValidation.TryValidateTemplate and wire it
into TryIssue before persist with economy_cap_exceeded and
invalid_reward_bundle deny codes.
2026-06-28 09:20:09 -04:00
VinPropane 299de3c796 chore: address cleanup review follow-ups and Postgres test flake
Fix gig persistence integration flake with FakeTimeProvider on the Postgres
host, restore StringComparer.Ordinal on quest counter copies, remove the Bruno
docs block, and record resolved review items.
2026-06-27 23:24:18 -04:00
VinPropane b233fa040d chore: analyzer cleanup for server and tests
Apply Roslyn/dotnet-format fixes across NeonSprawl.Server and
NeonSprawl.Server.Tests: collection expressions, concrete helper
return types, record XML docs, logging guards, quest store refactors,
and removal of redundant usings via GlobalUsings.cs. Extend
csharp-style.md with the recurring patterns.
2026-06-27 22:55:50 -04:00
VinPropane eb6a4fedde NEO-149: fix CraftResult and craft API analyzer warnings
Move CraftResult param docs to primary-constructor summaries (RCS1263),
use CraftIoAppliedJson[] return and collection expression in MapIoRows,
prefer is true for debug log guard (CDT1001), and add MapResponse deny test.
2026-06-27 21:56:52 -04:00
VinPropane 6f735f8643 NEO-149: fix analyzer warnings in encounter wiring
RCS1123 parentheses in quest wiring test, CA1873 guarded LogDebug,
CA1859 List parameter for CompensatingRemoveGrants.
2026-06-27 21:52:13 -04:00
VinPropane 68ba26724b NEO-149: address code review follow-ups
Update E7.M4 alignment register, add quest-fixture contract reset
API test, align mark-complete deny codes with instance reason codes,
refactor idempotent replay test AAA, strike review findings done.
2026-06-27 21:51:17 -04:00
VinPropane bcf6fd2641 NEO-149: wire contract completion on encounter clear
Add ContractCompletionOperations orchestrator (deliver-then-mark,
outcome audit), hook from EncounterCompletionOperations after E5.M3
loot and quest wiring, extend dev fixture reset for contract rows,
Bruno quest-fixture reset request, and cover with tests (904 green).
2026-06-27 21:48:17 -04:00
VinPropane 76ce1943c7 NEO-148: add contract completion reward router and delivery store extension
TryDeliverContractCompletion reuses the quest grant-apply path with
contract-specific idempotency keys and source-kind-aware delivery store rows.
2026-06-27 19:58:07 -04:00
VinPropane c237bead53 NEO-147: guard DenyCreateFailure when create snapshot is null 2026-06-27 19:43:44 -04:00
VinPropane 81f4cde673 chore: remove redundant test namespace using in gate tests 2026-06-27 19:40:13 -04:00
VinPropane 58a188eac0 chore: dedupe faction id constants in gate operation tests 2026-06-27 19:30:28 -04:00
VinPropane 3549b647a5 NEO-147: add standing and duplicate-seed review follow-up tests 2026-06-27 19:23:17 -04:00
VinPropane c37c3c76a3 NEO-147: use class-level grid faction id in generator tests 2026-06-27 19:18:23 -04:00
VinPropane 44f4e4c3ce NEO-147: mark faction id locals const in generator tests 2026-06-27 19:15:43 -04:00
VinPropane 87a0eb25ec NEO-147: add contract generator unit and integration tests 2026-06-27 19:15:14 -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 237e39c8ca NEO-146: simplify using declarations in outcome persistence tests
Apply IDE0063 where braced scopes have no name clashes with later blocks.
2026-06-24 21:11:53 -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 56bc22c70d NEO-145: address review findings — tests and decomposition docs.
Rename cross-ref unit test; add loader freeze-overflow and missing-schema
negatives; update E7.M4/CT.M1 alignment tables and strike through review.
2026-06-20 19:36:25 -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 7011a56755 NEO-140: address code review — grid-contract rep and wire-level gate test
Add integration coverage for +10 Rust Collective reputationGrants,
JsonDocument omission test for factionGateRules, extend accept Bruno,
fix manual QA link, strike through review findings.
2026-06-17 19:12:33 -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 0fe182565e NEO-139: address review — trim-path tests and Bruno folder note.
Add whitespace-only 404 and padded-path playerId echo tests; document seq 4 standing side effect in faction-standing folder docs.
2026-06-16 17:26:40 -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 69c3ad4915 NEO-138: address code review follow-ups.
Fix Bruno grid-contract status expectation, add race rep rollback and
multi-row audit-failure tests, audit-row assertion, and doc comments.
2026-06-15 22:29:36 -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 64920792ee chore: address Bruno self-reset review — README, Postgres test, nits.
Document resetQuestIds, resource-node fixture, and cooldown clear in server README; add TryClearProgress Postgres integration test; sync-review doc and Bruno require paths.
2026-06-15 21:53:44 -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