Commit Graph

275 Commits (e405d43d43a1fe3e3138add12fc5cd60ca2cd36b)

Author SHA1 Message Date
VinPropane 056b0e77f0 NEO-93: Fix delta cap LastAdvancedUtc to preserve gradual catch-up.
When simulation is capped, advance LastAdvancedUtc to windowEnd instead
of nowUtc so subsequent polls do not burst through missed NPC cycles.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-27 23:16:35 -04:00
VinPropane d3f178b5fb NEO-93: Address code review — AAA tests, single-call advance, windup fix.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-27 23:08:34 -04:00
VinPropane ecffba9e4b NEO-93: Reconcile plan, backlog, and docs for runtime state machine.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-27 22:02:41 -04:00
VinPropane 48813998d7 NEO-93: Add NPC runtime state machine and lazy tick advance.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-27 22:02:39 -04:00
VinPropane 843abf7126 NEO-92: Add threat store and aggro acquire/leash-clear wiring.
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>
2026-05-27 21:45:57 -04:00
Don 047237e651 NEO-91: address code review follow-ups
Add legacy alpha targeting integration test, elite HP assertion, AAA fix,
Bruno docs refresh, and module/alignment doc updates. Strike through
resolved items in the NEO-91 review.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-26 23:46:39 -04:00
Don fa9acc85ac NEO-91: migrate combat targets to three NPC instances
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>
2026-05-26 23:42:31 -04:00
VinPropane d3e765fb8f NEO-90: add GET /game/world/npc-behavior-definitions projection.
Expose read-only npcBehaviors envelope backed by INpcBehaviorDefinitionRegistry,
with integration tests, Bruno smoke, and doc reconciliation.
2026-05-25 17:49:01 -04:00
VinPropane 3134bb6ff6 NEO-89: Address code review — E5.M2 module doc and case-id test. 2026-05-25 17:28:46 -04:00
VinPropane e25b1406c7 NEO-89: Reconcile plan, backlog, and module docs for NPC registry. 2026-05-25 17:27:17 -04:00
VinPropane 70dc293246 NEO-89: Add INpcBehaviorDefinitionRegistry and DI registration. 2026-05-25 17:27:14 -04:00
VinPropane 83282e76f0 NEO-88: Fail-fast NPC behavior catalog load at server startup.
Mirror NEO-77 ability loader: JsonSchema.Net validation, E5M2 three-id
gate, leash > aggro numeric gate, DI singleton, Bruno health smoke, and
16 AAA loader/host tests.
2026-05-25 17:08:40 -04:00
VinPropane 3cbbcb6c2f NEO-84: Address code review — register sync and hook comment parity.
Append NEO-44/NEO-84 to E5.M1 dependency register note, fix E2.M2 NEO-44
status, and add playerId correlation hint on damage-path ability_used hook.
2026-05-25 13:06:04 -04:00
VinPropane 667a1a960a NEO-84: Add combat telemetry hook sites in CombatOperations.
Comment-only ability_used, enemy_defeat, and reserved encounter_start/player_death
markers; README and module docs updated. All 407 server tests pass.
2026-05-25 13:04:11 -04:00
VinPropane 9d9b53332f NEO-44: Address code review — docs, debug log, Bruno playerId.
Update E5.M1/E2.M2 module docs for gig XP path; LogDebug on failed
gig store write; Bruno defeat spine uses {{playerId}}; strike review items.
2026-05-25 12:08:21 -04:00
VinPropane 71a6761f3c NEO-44: Grant gig XP on combat defeat via dedicated store.
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.
2026-05-25 12:04:40 -04:00
VinPropane ea13b05196 NEO-83: Fix Bruno CI combat-targets HP state pollution.
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.
2026-05-25 11:28:13 -04:00
VinPropane 50a2c9ca9d NEO-83: Address code review follow-ups for combat-targets GET.
Fail fast on health store TryGet miss, tighten one-pulse integration test assertions, add fast Bruno cast→GET smoke, update review doc.
2026-05-25 11:23:32 -04:00
VinPropane 52b1d4d206 NEO-83: Add GET /game/world/combat-targets HP snapshot.
Wire CombatTargetsWorldApi backed by ICombatEntityHealthStore, Bruno happy + cast defeat spine, integration tests, README and module tracking docs.
2026-05-25 11:20:13 -04:00
VinPropane 52bf9fc4bf NEO-82: Fix cast definition lookup order and Bruno target isolation.
Load ability definition before TryResolve so cooldown lookup cannot deny
after HP mutation (Bugbot). Happy Bruno cast uses beta; defeat spine keeps
alpha; bump spine seq and cooldown sleep margin for CI.
2026-05-25 11:04:55 -04:00
VinPropane 322798b2ef NEO-82: Address code review doc sync and test AAA follow-ups.
Update E5.M1 module doc, dependency register, and alignment table for
NEO-82 landed; Bruno defeat spine HP stepping; refactor four-pulse cast
test Arrange/Act/Assert; strike through resolved review items.
2026-05-25 10:45:31 -04:00
VinPropane e8be100f80 NEO-82: Wire cast POST into combat engine and cast response.
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.
2026-05-25 10:36:42 -04:00
VinPropane c7aa75ebc5 NEO-81: Address code review doc sync and test follow-ups.
Update module tracking and E5M1 backlog for NEO-81 landed; tighten AAA
in four-pulse test, add guard/dash deny parity and dash smoke test.
2026-05-25 10:20:09 -04:00
VinPropane ca15e7a689 NEO-81: Add CombatOperations.TryResolve and CombatResult.
Pure server combat resolution applies catalog damage via the health store,
denies re-hits on defeated targets, and validates unknown ability/target ids.
2026-05-25 10:16:24 -04:00
VinPropane bfb0eb9306 NEO-80: Address code review follow-ups for health store. 2026-05-24 22:42:33 -04:00
VinPropane b060b9dffd NEO-80: add combat entity health store for prototype dummies.
Server-owned in-memory HP for prototype_target_alpha/beta with lazy
init at 100 HP, damage floor at zero, defeated flag, and DI registration.
2026-05-24 22:37:57 -04:00
VinPropane 94b6c67b07 NEO-78: Address code review follow-ups for ability-definitions GET.
Update dependency register and E5M1 backlog, tighten tests and Bruno
spot-checks, strike through resolved review items.
2026-05-24 22:26:54 -04:00
VinPropane 44e0056b37 NEO-78: Add GET /game/world/ability-definitions HTTP projection.
Expose versioned read-only ability catalog via IAbilityDefinitionRegistry,
with integration tests, Bruno folder, and docs alignment.
2026-05-24 22:22:48 -04:00
VinPropane 0e5bbbff2e NEO-79: Address code review — docs alignment, null-safe TryNormalizeKnown.
Update E5.M1 module page, dependency register, and alignment table for
NEO-79 landed; reconcile plan Bruno note; strike through review findings.
2026-05-24 22:07:37 -04:00
VinPropane bd4912004a NEO-79: Add IAbilityDefinitionRegistry and migrate hotbar/cast validation.
Injectable registry backed by AbilityDefinitionCatalog; PrototypeAbilityRegistry
keeps id constants only. Bruno smoke for unknown_ability deny paths.
2026-05-24 22:05:27 -04:00
VinPropane fd2ffee089 NEO-77: Address code review — Bruno folder, E5M1 gate test, docs.
Add ability-catalog folder.bru, extra-id E5M1 gate AAA test, dependency
register NEO-77 note, and strike through resolved review suggestions.
2026-05-24 21:44:02 -04:00
VinPropane 619089ca40 NEO-77: Add fail-fast ability catalog load at server startup.
Load content/abilities/*_abilities.json with CI-parity validation, E5M1
four-id gate, DI registration, AAA loader/host tests, and Bruno health check.
2026-05-24 21:40:58 -04:00
VinPropane 5f0f703555 NEO-71: address code review — CraftResult tense and README bullets 2026-05-24 18:32:08 -04:00
VinPropane 2d4751021b NEO-71: add craft telemetry hook comment sites and docs
Place item_crafted and craft_failed TODO(E9.M1) anchors in
CraftOperations.TryCraft; document in server README and mark E3.M2
Slice 3 server backlog complete.
2026-05-24 18:23:35 -04:00
VinPropane 87c27e231b NEO-70: Emit explicit nulls on CraftResponse optional fields.
Serialize reasonCode and xpGrantSummary as null when absent so Bruno
deny tests match inventory POST wire shape; assert JSON nulls in API tests.
2026-05-24 18:13:10 -04:00
VinPropane 8ebe83d701 NEO-70: Fix CI build — restore TestHost import for ConfigureTestServices. 2026-05-24 18:02:43 -04:00
VinPropane 5a3904c6bc NEO-70: Address code review findings for craft HTTP.
Rename wire DTO to PlayerCraftRequest, add store-missing and default-quantity
API tests, improve Bruno deny isolation, README success sample, and doc nits.
2026-05-24 18:00:26 -04:00
VinPropane 46393b8ca5 NEO-70: Add craft POST HTTP, Bruno spine, and docs.
Wire POST /game/players/{id}/craft to CraftOperations with CraftResponse DTOs,
integration tests, gather→refine→make Bruno folder, and module/README updates.
2026-05-24 17:57:55 -04:00
VinPropane c5115a3a13 NEO-69: Fix output-deny rollback order to prevent item loss.
Remove partial outputs before restoring inputs when output grant is
denied, matching StoreMissing and XP-failure compensating paths.
2026-05-24 17:33:27 -04:00
VinPropane 36adfd1897 NEO-69: Fix Bugbot pre-flight and output rollback issues.
Simulate input removal before output capacity checks, roll back partial
outputs on store-missing, and add tests for slot-freeing craft success.
2026-05-24 17:28:43 -04:00
VinPropane 51e9f1f5d0 NEO-69: Address code review findings for craft engine.
Fix AAA test layout, add batch quantity and simulate-add tests, restore
partial input rollback, and bump E3.M2 register status to In Progress.
2026-05-24 17:18:52 -04:00
VinPropane 308de6b50d NEO-69: Document craft engine and mark E3M2-05 acceptance complete.
Updates server README, module snapshot, alignment register, and backlog
after CraftOperations lands with full automated test coverage.
2026-05-24 17:17:01 -04:00
VinPropane e914d5fb96 NEO-69: Add CraftOperations engine with pre-flight and refine XP.
Introduces CraftResult orchestration over recipe registry and inventory
operations, including output capacity simulation and XP rollback on failure.
2026-05-24 17:16:59 -04:00
VinPropane 529cb616f5 NEO-68: Update docs and strike through code review findings.
Mark E3M2-04 landed, refresh alignment register and README, reconcile plan AC.
2026-05-24 17:08:18 -04:00
VinPropane 1636fdc2cb NEO-68: Add GET /game/world/recipe-definitions HTTP projection.
Wire RecipeDefinitionsWorldApi over IRecipeDefinitionRegistry with schema v1
DTOs, Bruno folder, manual QA, and FrozenEightInIdOrder integration test.
2026-05-24 17:08:15 -04:00
VinPropane 95d42803e1 NEO-67: address code review nits on recipe registry
Delegate TryGetDefinition to catalog.TryGetRecipe, cache ordered defs at
construction, and assert unknown recipeId in host DI test.
2026-05-24 16:58:38 -04:00
VinPropane 81b0e3fc4b NEO-67: add IRecipeDefinitionRegistry and DI adapter
Thin registry over RecipeDefinitionCatalog mirrors NEO-52/59: TryGetDefinition,
GetDefinitionsInIdOrder, AAA unit/host tests, README and alignment doc updates.
2026-05-24 16:57:17 -04:00
VinPropane 1fb4368a2c NEO-66: Address code review follow-ups for recipe catalog load.
Pin Content:RecipesDirectory in all host test factories, add loader tests
for empty dir/invalid JSON/unknown output itemId, document manual QA skip.
2026-05-24 16:45:36 -04:00
VinPropane f209636e7e NEO-66: Fail-fast server recipe catalog load at startup.
Add Game/Crafting loader, Slice 3 gate rules, DI registration, and AAA tests
mirroring item/resource-node catalog patterns; cross-check item and skill ids.
2026-05-24 16:41:48 -04:00
VinPropane a578d9b684 NEO-64: address code review follow-ups.
Nest gather_node_depleted hook in remainingGathers == 0 guard,
add E3M1-08 deny-branch out-of-scope note, and give README NEO-64
its own subsection anchor.
2026-05-24 16:00:02 -04:00
VinPropane 847cda97a3 NEO-64: add gather telemetry hook sites and doc updates.
Comment-only resource_gathered and gather_node_depleted anchors in
GatherOperations.TryGather; README, module docs, manual QA, and E3.M1
backlog marked complete.
2026-05-24 15:58:29 -04:00
VinPropane 3834b2316a NEO-63: address code review follow-ups.
AAA depletion test layout, source_kind_not_allowed assertion,
HTTP inventory_full deny test, trim duplicate XP test, doc comments.
2026-05-24 15:46:20 -04:00
VinPropane 01dc48a50a NEO-63: add plan, manual QA, and doc updates.
README gather-via-interact section; E3.M1 anchor coords; backlog landed.
2026-05-24 15:44:15 -04:00
VinPropane e681857778 NEO-63: wire interact to gather engine and expand registry.
Four resource_node anchors; gather denies map to InteractionResponse;
integration tests, Bruno gather/inventory and depletion flows.
2026-05-24 15:44:12 -04:00
VinPropane f58ab4a2eb NEO-62: update docs for gather engine landing.
README, E3.M1 module doc, alignment table, backlog checkboxes.
2026-05-24 15:41:28 -04:00
VinPropane f23af01687 NEO-62: add GatherOperations engine and tests.
Orchestrates inventory grant, salvage XP, and depletion commit
with compensating rollback on XP failure.
2026-05-24 15:41:26 -04:00
VinPropane 5dac6b2825 NEO-61: fix null snapshot on depletion deny path.
Check TryGetRemainingGathers return before using the out snapshot;
default struct had null InteractableId and threw on .Length.
2026-05-24 15:21:37 -04:00
VinPropane 0cc5bb8925 NEO-61: address code review follow-ups.
Fix AAA layout in depletion tests, add ResourceNodeInstanceIds.Normalize,
throw on failed lazy-init after catalog hit, and update dependency register
footnote plus review doc strikethroughs.
2026-05-24 15:15:25 -04:00
VinPropane 6d2d3c040a NEO-61: add world node instance depletion store.
Split IResourceNodeInstanceStore + ResourceNodeInstanceOperations with
lazy init from catalog maxGathers, atomic decrement, node_depleted and
unknown_node reason codes, V006 Postgres migration, and parity tests.
2026-05-24 15:03:05 -04:00
VinPropane 97f8f31682 NEO-60: add GET /game/world/resource-node-definitions endpoint
Versioned read-only projection backed by IResourceNodeDefinitionRegistry
with nested yield DTOs, integration test, Bruno, manual QA, and docs.
2026-05-24 14:47:23 -04:00
VinPropane 1e1ca5519c NEO-59: address code review follow-ups
Simplify GetDefinitionsInIdOrder to iterate key-value pairs directly,
avoiding the intermediate sorted-keys array and second dictionary lookup.
2026-05-24 14:31:20 -04:00
VinPropane 01dec2b6c8 NEO-59: document registry in README, alignment, and backlog
Mark acceptance criteria complete in the implementation plan.
2026-05-24 14:26:23 -04:00
VinPropane bd43951f80 NEO-59: add IResourceNodeDefinitionRegistry and DI adapter
Thin registry over ResourceNodeCatalog with node/yield lookup,
enumeration, and AAA unit + host DI tests mirroring NEO-52.
2026-05-24 14:26:23 -04:00
VinPropane 44fc8d7b62 NEO-58: address code review follow-ups
Document optional Bruno smoke in plan; add empty-catalog file loader tests;
tighten host DI test AAA; strike through resolved review items.
2026-05-24 14:04:42 -04:00
VinPropane 0384b63046 NEO-58: add fail-fast resource-node catalog load at startup
Loader, Slice 2 gates, DI registration, AAA tests, README and plan updates.
Cross-checks yield itemIds against ItemDefinitionCatalog loaded first.
2026-05-24 14:01:29 -04:00
VinPropane deed0c4314 NEO-56: address code review follow-ups
Extend E3.M3 dependency register footnote; expand post-mutation deny hook
comments; clarify Deny payload at call sites; strike review items Done.
2026-05-24 13:40:12 -04:00
VinPropane dc5141ed03 NEO-56: add inventory telemetry hook comment sites
item_created on successful TryAddStack; inventory_transfer_denied on
all Denied paths. README, module docs, manual QA, plan ACs updated.
2026-05-24 13:32:21 -04:00
VinPropane 1cbe6302b5 NEO-55: make inventory Bruno tests order-independent
Shared inventory-api-helper seeds stock and records baselines in
pre-request scripts; assertions use exact deltas instead of cumulative
at.least checks. Harden C# remove round-trip add assertion.
2026-05-23 22:57:53 -04:00
VinPropane fddbb95a45 NEO-55: address code review suggestions for inventory HTTP
Add remove round-trip and invalid_quantity API tests, Bruno remove request,
dependency register NEO-55 footnote, and strike-through review follow-ups.
2026-05-23 22:51:59 -04:00
VinPropane 69327f50b4 NEO-55: player inventory GET/POST HTTP, Bruno, and docs
Versioned snapshot read and mutationKind add/remove POST backed by
PlayerInventoryOperations; AAA API tests; Bruno happy path + deny case.
2026-05-23 22:45:27 -04:00
VinPropane 126d979939 NEO-54: dedupe slot cloning on PlayerInventorySnapshot 2026-05-23 19:54:27 -04:00
VinPropane 3f664261b7 NEO-54: preserve validation reason codes when player store missing
Deny helper returns Denied + reasonCode even without a snapshot bucket,
so invalid_quantity/invalid_item are stable before NEO-55 HTTP mapping.
2026-05-23 19:44:07 -04:00
VinPropane dafe3cb92f NEO-54: fix in-memory inventory races with atomic TryMutateSnapshot
Re-read snapshot under per-player lock; route add/remove through
TryMutateSnapshot so read-modify-write is serialized for in-memory
and wrapped in one transaction for Postgres.
2026-05-23 19:42:50 -04:00
VinPropane ac3900c194 NEO-54: address code review suggestions for inventory tests and docs 2026-05-23 19:31:26 -04:00
VinPropane 01e391b03a NEO-54: player inventory store, stack/slot rules engine, and tests 2026-05-23 19:26:57 -04:00
VinPropane 52590fa749 NEO-53: address code review suggestions
Register footnote NEO-53, Bruno exact id-order test, test indent fix,
review doc strikethroughs.
2026-05-23 19:12:20 -04:00
VinPropane 08428c4da4 NEO-53: GET world item-definitions, Bruno, docs, and tests
Registry-backed read model at /game/world/item-definitions; Bruno
collection, manual QA checklist, README and module alignment updates.
2026-05-23 19:09:46 -04:00
VinPropane 792b38d8a9 NEO-52: add IItemDefinitionRegistry with DI and lookup tests
Thin adapter over ItemDefinitionCatalog mirroring NEO-35 skill registry;
registers singleton in AddItemDefinitionCatalog with TryGetDefinition,
GetDefinitionsInIdOrder, and AAA unit + host DI tests.
2026-05-23 18:11:33 -04:00
VinPropane 38f0c56711 NEO-51: Address code review — tests, docs, review strikethroughs.
Add Slice 1 role/stackMax and missing-path loader tests; E3.M3 server
load bullet; register footnote; host test temp-dir cleanup.
2026-05-17 22:04:03 -04:00
VinPropane c2366eed4c NEO-51: Guard item catalog startup log for CA1873.
Skip LogInformation argument evaluation when Information is disabled.
2026-05-17 22:00:27 -04:00
VinPropane 0a3c28ae5c NEO-51: Primary constructor on ItemDefinitionCatalog; test tidy.
Restore explicit Content:ItemsDirectory in test factory; use const
for schema-violation fixture JSON.
2026-05-17 21:58:53 -04:00
VinPropane d23f6dd8ab NEO-51: Document item catalog boot and mark plan complete.
README, alignment register, and acceptance checklist updated.
2026-05-17 21:56:12 -04:00
VinPropane 2ba129dca1 NEO-51: Fail-fast item catalog load at server startup.
Mirror NEO-34/validate_content.py: *_items.json schema validation,
Slice 1 gate, ItemDefinitionCatalog DI, loader/host tests, Bruno health smoke.
2026-05-17 21:56:09 -04:00
VinPropane 00c5937872 NEO-48: revert WhenWritingNull on skill-progression grant API
Keep omit-null reasonCode only on new perk-state responses; restoring
the existing grant endpoint wire format (reasonCode: null on success).
2026-05-17 20:59:37 -04:00
VinPropane 12e52bccc9 NEO-48: fix in-memory TrySetSkillXpTotal zero on absent skill
Setting XP to 0 is a no-op success when no row exists, matching Postgres DELETE
semantics and TrySetSkillXpTotals behavior.
2026-05-17 20:46:55 -04:00
VinPropane aa83790703 NEO-48: omit null reasonCode from success JSON responses
WhenWritingNull on PerkBranchSelectResponse and SkillProgressionGrantResponse
matches hotbar/cast/interaction; fixes Bruno tier1 undefined check.
2026-05-17 20:46:28 -04:00
VinPropane aba26446d3 NEO-48: address r2 review — atomic fixture, tests, docs
Batch skillXp then resetPerkState with XP rollback; 400 for invalid skillXp;
MasteryFixtureApi gate tests; README fixture vs grant semantics; Bruno GET playerId.
2026-05-17 20:37:00 -04:00
VinPropane ffdbed26f2 NEO-48: dev mastery-fixture API for Bruno state setup
Replace fixture player ids with POST …/__dev/mastery-fixture (resetPerkState,
absolute skillXp). Bruno deny tests set state in pre-request on dev-local-1.
Gated to Development/Testing or Game:EnableMasteryFixtureApi.
2026-05-17 20:31:26 -04:00
VinPropane b72201b1f0 NEO-48: Bruno fixture players for deterministic perk deny tests
Seed neo48-perk-fresh and neo48-perk-branch via Game:FixturePlayerIds;
level_too_low uses isolated fresh player, branch_already_chosen sets up
neo48-perk-branch in pre-request instead of skipping on shared state.
2026-05-17 20:26:21 -04:00
VinPropane 3ba8300652 NEO-48: address code review — Bruno deny, API deny tests
Add self-contained branch_already_chosen Bruno request, HTTP deny smoke
for unknown track/tier/branch and null-body 400, folder docs for level_too_low.
2026-05-17 20:21:42 -04:00
VinPropane 39c54c3881 NEO-48: perk-state HTTP, Bruno, tests, and docs
GET/POST /game/players/{id}/perk-state with versioned JSON, engine-backed
branch selection, PerkStateApiTests, Bruno collection, README, and E2.M3 alignment.
2026-05-17 20:10:31 -04:00
VinPropane 5058bc1963 NEO-49: address code review follow-ups for telemetry hooks 2026-05-17 19:21:21 -04:00
VinPropane 38ef54c238 NEO-49: document perk_unlock hook sites in README, module, and manual QA 2026-05-17 19:10:14 -04:00
VinPropane 340dbbe60d NEO-49: add comment-only perk_unlock telemetry hook in TryUnlockPerks 2026-05-17 19:10:12 -04:00
VinPropane 0a2a6fe45b NEO-47: address code review follow-ups for perk unlock engine
Retroactive path-auto unlock on branch pick, unlock rollback, CanWritePlayer
gate, expanded deny tests, gather-hook smoke, decomposition docs, review strikethroughs.
2026-05-17 18:45:11 -04:00
VinPropane 38774a5b39 NEO-47: perk unlock engine, PerkState persistence, and tests
Add V004 perk tables, in-memory/Postgres stores, PerkUnlockEngine (tier-1 branch
pick, path-auto tier-2 unlocks), level-up hook in skill XP grants, and AAA tests.
Bruno docs note internal perk reevaluation on level-up (HTTP in NEO-48).
2026-05-17 18:38:41 -04:00
VinPropane 07fc566e2c NEO-46: address code review follow-up.
Add loader deny-path and registry enumeration tests, tierIndex 1..N gate
in validate_content.py, E2.M3 handoff doc update, and review strikethroughs.
2026-05-17 18:12:39 -04:00
VinPropane 174c390aa4 NEO-46: fail-fast mastery catalog load at server startup.
Mirror validate_content.py gates in MasteryCatalogLoader, expose IMasteryCatalogRegistry, cross-check skillIds against the skill catalog, and enforce tierIndex 1..N per track.
2026-05-17 18:06:50 -04:00
VinPropane 2af9b1c011 NEO-43: mission reward skill XP grant helper and docs 2026-05-15 20:30:43 -04:00
VinPropane caa400f43d NEO-42: address review — decomposition docs, plan AC, grant helper, test assert 2026-05-10 19:46:49 -04:00
VinPropane 15bf598228 NEO-42: add refine activity XP grant helper and tests 2026-05-10 19:38:30 -04:00
VinPropane 29a6c6d1a7 NEO-41: address code review (E3.M1 status, deny-path test) 2026-05-10 19:13:56 -04:00
VinPropane c1e77280e3 NEO-41: grant salvage activity XP on resource_node interact 2026-05-10 19:10:35 -04:00
VinPropane 35b666ed60 NEO-40: sync E2.M2 alignment doc; close review feedback 2026-05-10 18:54:17 -04:00
VinPropane effd234ee3 NEO-40: add progression telemetry hook comment sites 2026-05-10 18:49:40 -04:00
VinPropane 236040a5c2 NEO-39: add data-driven level curve with startup schema validation
Replace placeholder XP level math with content-backed thresholds validated in CI and at server boot, and update docs/manual QA/review artifacts to reflect NEO-39 delivery and follow-up fixes.
2026-05-06 23:10:06 -04:00
VinPropane 310d2b637b NEO-38: reset player_position before progression persistence test 2026-05-06 22:39:18 -04:00
VinPropane ad9259c308 NEO-38: set integration test host to Testing for deterministic JSON errors 2026-05-06 22:34:26 -04:00
VinPropane b2999f3ed9 NEO-38: address review — docs alignment, Bruno deny, README levelUps trim 2026-05-06 22:26:23 -04:00
VinPropane 33b2e917e4 NEO-38: skill XP POST grant, persistence, level-up response 2026-05-06 22:17:02 -04:00
VinPropane a3cbef063c NEO-37: treat skill progression JSON array order as non-contractual 2026-05-06 21:53:24 -04:00
VinPropane 9cd96a72c3 NEO-37: add skill progression snapshot GET API, tests, Bruno, docs 2026-05-06 21:48:17 -04:00
VinPropane a0c3599525 NEO-36: address code review (manual QA header, alignment, README, Bruno) 2026-05-04 20:44:52 -04:00
VinPropane ab597ff350 NEO-36: expose GET /game/world/skill-definitions with tests, Bruno, QA doc 2026-05-04 20:36:06 -04:00
VinPropane 035e915934 NEO-35: address NEO-35 code review (AAA, docs, null id, cleanup) 2026-05-04 19:53:53 -04:00
VinPropane fb863a457b NEO-35: add ISkillDefinitionRegistry and lookup tests 2026-05-04 19:50:49 -04:00
VinPropane 9da5e7dbf5 NEO-34: address code review follow-ups (docs, appsettings, AAA)
Update E2.M1 alignment table for landed catalog load; add Content placeholders
to appsettings.json; align implementation plan tests/appsettings notes; expand
manual QA header to project standard; strike review suggestions; tighten host
catalog test Arrange/Act/Assert.
2026-05-02 19:50:02 -04:00
VinPropane 1a9088c77c NEO-34: fail-fast skill catalog load at server startup
Register SkillDefinitionCatalog from content/skills with JsonSchema.Net validation
mirroring validate_content.py and the prototype Slice 1 gate. Resolve paths via
Content:SkillsDirectory or discovery from AppContext.BaseDirectory. Eager-load
after WebApplication build so bad catalogs block startup. Add unit and host
tests, pin test factories to repo skills, document config in server/README, add
manual QA checklist, and extend Bruno GET /health smoke tests.
2026-05-02 19:44:10 -04:00
VinPropane 7d64ed2adc NEO-32: prune expired cooldown entries on TryGetCooldownEndUtc 2026-04-30 21:58:40 -04:00
VinPropane f4ba4cdd92 NEO-32: optional NEON_SPRAWL_API_LOG stdout for ability-cast 2026-04-30 21:37:03 -04:00
VinPropane 361a6800d2 NEO-32: cooldown snapshot API, on_cooldown deny, client HUD sync 2026-04-30 21:19:32 -04:00
VinPropane 8a9a9bcf78 NEO-30: address code review follow-ups 2026-04-30 21:04:31 -04:00
VinPropane b5478782a8 NEO-30: cast funnel telemetry hook sites and docs 2026-04-30 20:59:47 -04:00
VinPropane e6ccc4453c chore: Apply Arrange/Act/Assert across server and client tests.
Split HTTP verification reads into Assert in C# API and integration tests.
Add # Arrange/# Act/# Assert to GdUnit suites and keep Act free of assertions
where casts and busy guards are under test.
2026-04-27 22:09:35 -04:00
VinPropane 7050bc12da chore: AAA rules — no required blank line after phase comments 2026-04-27 21:54:02 -04:00
VinPropane 31f9b74d3f chore: make AAA test layout mandatory in style rules and snippets 2026-04-27 21:52:39 -04:00
VinPropane 09e783a5e8 NEO-28: AAA layout for cast tests (C# + GdUnit) 2026-04-27 21:46:37 -04:00
VinPropane 7de8e7ecfd NEO-28: cast target authority, HUD feedback, tests + docs 2026-04-27 21:03:04 -04:00
VinPropane cc1c6f711e NEO-31: request_cast bool for telemetry hook; document cast API in server README 2026-04-27 20:44:40 -04:00
VinPropane 7c327994eb NEO-31: structure AbilityCastApiTests in explicit AAA sections 2026-04-27 20:23:02 -04:00
VinPropane 7e97eb4c1d NEO-31: ability cast POST, client hotbar keys, tests, Bruno 2026-04-27 20:17:57 -04:00
VinPropane 9ac4f27ea2 NEO-29: resolve follow-up review regressions
Fix the hotbar client test transport body construction so the suite parses and runs again, and normalize AAA marker ordering in the flagged C# tests to restore readability consistency with the test template.
2026-04-25 23:26:25 -04:00
VinPropane 71af7a5942 NEO-29: normalize test formatting across server and client suites
Audit all test files and bring them in line with formatting/style expectations by adding explicit AAA markers across server test methods and fixing GDScript test lint/format issues.
2026-04-25 22:57:05 -04:00
VinPropane 3dccab8edb NEO-29: normalize hotbar API tests to explicit AAA style
Add explicit Arrange/Act/Assert sections to each hotbar API test method to align with the C# test style guide while preserving existing coverage and behavior.
2026-04-25 22:52:03 -04:00
VinPropane e6f3d63318 NEO-29: move AAA enforcement to test authoring time
Remove the AAA pre-commit gate and instead provide write-time scaffolding via C# snippets and a test template, then document those defaults in the C# style and testing expectations rules.
2026-04-25 22:50:03 -04:00
VinPropane 4dc9f76f79 NEO-29: align hotbar persistence test to AAA style
Refactor the Postgres hotbar persistence integration test to explicit Arrange/Act/Assert structure so it matches the team testing style guide.
2026-04-25 22:47:44 -04:00
VinPropane d25d7d0211 NEO-29: apply code review follow-ups
Set E1.M4 documentation status to In Progress across decomposition tracking docs and add lower-bound slot validation coverage. Mark the corresponding review suggestions and nit as resolved in the saved review file.
2026-04-25 22:44:58 -04:00
VinPropane b92b86a407 NEO-29: cover hotbar edge paths and add Bruno requests
Add server/client tests for duplicate-slot, schema, missing-player, normalization, and busy/error handling paths, and include Bruno requests for the new hotbar routes with happy and representative failure checks.
2026-04-25 22:36:23 -04:00
VinPropane acde9e8145 NEO-29: add HotbarLoadout v1 contract and hydration path
Ship a server-owned hotbar loadout API with Postgres-or-memory persistence so slot bindings survive reconnects in configured environments. Wire client boot hydration and add tests/docs/manual QA to keep the prototype contract and policy explicit.
2026-04-25 22:29:52 -04:00
VinPropane 9c054fbcf2 NEO-27: add Slice 3 telemetry hook-site documentation
Map SelectionEvent to target_changed, reserve ability_cast_requested and ability_cast_denied hook locations, and align plan/manual QA/decomposition docs with TODO(E9.M1) telemetry follow-up.
2026-04-25 21:56:28 -04:00
VinPropane 0e72d98177 NEO-25: move resource_node anchor clear of Obstacle at (6,1,5) 2026-04-24 20:42:12 -04:00
VinPropane ce54fcc44f NEO-25: world interactables GET, registry rows, fetch-driven Godot props + glow 2026-04-24 20:36:15 -04:00
VinPropane d6ef4fd811 NEO-24: race-free target/select via optional positionHint
Followup #5: after locking alpha, walking into beta's ring, stopping and
pressing Tab could still return `out_of_range` even when client and server
agreed on position (Δ=0). The freshness-kick move-stream POST and the
target/select POST race on separate HTTP connections so the select can be
validated against a stale stored snap.

Extend TargetSelectRequest v1 with an optional positionHint {x,y,z}.
Server uses the hint for the radius check and for the echoed
targetState.validity; the hint is advisory and does not write to the
position store (move-stream stays the sole write path). Client attaches
the hint automatically whenever set_freshness_kick(...) is wired, so
headless unit tests that skip the wiring fall through to the no-hint
behavior. Freshness kick is kept in place to refresh the stored snap for
later validity GETs but is no longer load-bearing for denial correctness.

Server: 3 new tests (hint accepts when stored is stale, hint-far denies,
hint never writes to position store). Client: 1 new test asserting the
hint is in the POST body when wired. All 62 server + 96 client tests
pass.

Plan Decision 8, review follow-up #5, manual QA section 6, and NEO-23
contract notes updated. New bruno request exercises the hint path.
2026-04-21 23:52:20 -04:00
VinPropane a7453eb82f NEO-24: unify prototype target radius at 6 m, overlap rings at origin
All prototype targets now share `PrototypeTargetRegistry.SharedLockRadius`
(= 6 m). Anchors moved to alpha `(-3, 0.5, -3)` and beta `(3, 0, 3)` so
the two 6 m rings overlap ~3.5 m wide centered at origin, letting Tab
flip between targets without locomotion. Spawn `(-5, -5)` keeps alpha
in range (~2.83 m) and beta out (~11.31 m) so the existing soft-lock
denial QA path at spawn still holds.

`prototype_target_constants.gd` mirrors the shared radius + new anchors.
The range-aware Tab picker now **skips the currently-locked id** so Tab
always expresses a swap intent — if the only in-range target is already
locked, the fallback picks the next cycle id and the server denies
(preserves NEO-23's "Tab = visible denial when no swap possible" rule).

Tests:
- Server: new `PlayerTargetStateReaderTests.ComputeValidity_AtOrigin_…`
  asserts both targets report `Ok` at origin. Existing boundary test
  rewritten for the new alpha anchor.
- Client: new `test_tab_from_locked_alpha_at_origin_swaps_to_beta_when_both_in_range`
  and `test_tab_when_only_current_lock_is_in_range_falls_back_to_cycle_for_denial`.
  Existing in-range/out-of-range positions updated for the new layout.

Server 59/59 and client 95/95 suites pass.

Plan Decision 7, review follow-up #4, manual QA section 5 (new "Tab-flip
at origin" overlap sanity), and README updated. Per-target radii will
return with real combat design (E5.M1) — this is a prototype stub.
2026-04-21 23:37:42 -04:00
VinPropane 17f87aa747 NEO-23: code review follow-up (E1.M3 docs, GET 404 test, radius bounds) 2026-04-17 21:14:43 -04:00
VinPropane 465c4b14eb NEO-23: add targeting HTTP API (TargetState v1, select intent) 2026-04-17 21:06:59 -04:00
VinPropane a4095cb9bf NEO-22: Remove click-to-move client and legacy move POST/verify
Delete ground_pick and GroundPick wiring; PositionAuthorityClient now only
boot GET and move-stream POST. main.gd snaps on authoritative position only.
Update client/server READMEs, cursor rule example, NEO-22 plan note, and
GdUnit authority tests (stream 400 + boot resync).
2026-04-17 20:06:46 -04:00
VinPropane a2c6c9f93e NEO-22: add move-stream API and WASD client locomotion
Introduce POST /game/players/{id}/move-stream with ordered targets, full-chain
validation before apply, and PositionStateResponse. Godot client uses camera-
relative WASD, queues samples, and snaps to stream responses; debug builds keep
click-to-move via ground_pick. Update READMEs, E1.M1 snapshot, and tests.
2026-04-17 19:21:33 -04:00
VinPropane a442f02dbd NEON-29: Fix CI tests (horizontal step flag, idle_support vectors) 2026-04-15 23:57:13 -04:00
VinPropane a7ad695143 NEON-29: Apply stashed WIP (main.tscn, movement validation, docs) 2026-04-13 13:24:05 -04:00