Commit Graph

328 Commits (365e57799a5a9bec5c4cbf4e3772a3cfa708c07c)

Author SHA1 Message Date
VinPropane 7deb10bf21 NEO-153: use CompareOrdinal in contract instance sort tie-break.
Fixes Roslynator RCS1235 on redundant string.Compare overload.
2026-06-28 13:47:43 -04:00
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 0d089a6dff NEO-152: Add comment-only contract telemetry hook sites.
Anchor contract_issued, contract_complete, and reward_anomaly
for E9.M1; document hooks in server README and module docs.
2026-06-28 12:08:05 -04:00
VinPropane d6ebc767e6 NEO-151: Fix Postgres ListForPlayer read race with single CTE query
Bugbot: active and completed rows now load in one statement snapshot so
GET /contracts cannot return the same instance twice after completion.
2026-06-28 11:17:21 -04:00
VinPropane 50df06a3f9 NEO-151: Fix Bruno helper path for collection-root scripts resolution
Move reset-contract-instances-helper.js to neon-sprawl-server/scripts/
and fix encounter-clear bru requires so CI can resolve modules.
2026-06-28 11:16:13 -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 d5de4e81ef NEO-150: Document economy validation at issue and reconcile plan
Update server README, E7.M4 module doc, alignment register, and
implementation plan reconciliation for E7M4-07.
2026-06-28 09:20:10 -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 7268935bc7 NEO-148: address code review doc follow-ups
Add E7.M4 alignment register entry, E7.M2 cross-ref, Postgres store-key
migration note, and defer contract fixture reset to NEO-149.
2026-06-27 21:24:12 -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 39805ef8e6 chore: fix QuestDefinitionCatalogLoader analyzer warnings 2026-06-27 19:26:52 -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 60aa0be4f0 NEO-147: document generator operations and reconcile plan 2026-06-27 19:15:14 -04:00
VinPropane 87a0eb25ec NEO-147: add contract generator unit and integration tests 2026-06-27 19:15:14 -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 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 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 b4d48f6e36 NEO-141: remove server-only manual QA doc after story end
Comment-only infrastructure story — acceptance fully covered by dotnet
test; align with NEO-140 and planning-implementation-docs skip rule.
2026-06-17 19:36:33 -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 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