VinPropane
9c2ab5ae4d
NEO-113: address code review — docs, schema and chain terminal tests.
2026-05-31 22:36:26 -04:00
VinPropane
b841b64581
NEO-113: add fail-fast quest catalog load and loader tests.
2026-05-31 22:33:43 -04:00
VinPropane
a5182a4c14
NEO-108: Fix Bruno encounter-progress and combat-health smokes.
...
Use collection-relative ./scripts require path; reset encounter stores in
combat-targets dev fixture for inactive GET; combat-health uses slot 3.
2026-05-31 18:43:50 -04:00
VinPropane
25f3714554
NEO-108: Address code review findings for encounter-progress GET.
...
Add BuildSnapshot invariant tests, whitespace 404, idempotent second GET,
grant-order assertions; dedupe MapRow progress lookup; strike review items.
2026-05-31 18:39:52 -04:00
VinPropane
c1fd2053d0
NEO-108: Add GET encounter-progress API and integration tests.
...
Projects progress, completion, and event stores into versioned per-player
rows with inactive/active/completed state and commit-time grant summary.
2026-05-31 18:37:42 -04:00
VinPropane
f51617f8b5
NEO-107: Address code review findings for event store persistence.
...
Update E5.M3 module summary and NEO-105 snapshot, fix store test AAA
layout, add empty encounter id fail-closed test, strike through review items.
2026-05-31 18:27:28 -04:00
VinPropane
a02496c6bc
NEO-107: Persist EncounterCompleteEvent and wire E7.M2 hook stub.
...
Add IEncounterCompleteEventStore with in-memory implementation, record
events on successful TryCompleteAndGrant, and expand reward_delivery
hook comments for future QuestRewardBundle routing.
2026-05-31 18:26:11 -04:00
VinPropane
9c74933e6e
NEO-106: Address code review findings for combat encounter wiring.
2026-05-31 18:10:41 -04:00
VinPropane
f581cf412c
NEO-106: Wire encounter progress and completion from ability cast.
2026-05-31 18:08:28 -04:00
VinPropane
cbb6f137fd
NEO-105: Address code review findings for encounter completion.
...
Add apply-phase rollback test, E9.M1 deny hook comment, inventory
reason passthrough, and tighten idempotent replay assertions.
2026-05-31 17:02:32 -04:00
VinPropane
0cf82b9c0a
NEO-105: Add encounter completion operations and inventory grants.
...
TryCompleteAndGrant applies reward-table fixed grants with pre-flight
simulate, compensating rollback, and idempotent completion marking.
Returns EncounterCompleteEvent payload for NEO-107 persistence.
2026-05-31 16:57:53 -04:00
VinPropane
0289930897
NEO-104: Use subset check for all-targets-defeated predicate.
...
Matches documented semantics; extra defeated ids via direct store
calls no longer block completion readiness (Bugbot PR #143 ).
2026-05-31 16:44:48 -04:00
VinPropane
91f74b7d6e
NEO-104: Address code review findings for encounter stores.
...
Normalize encounter ids in IsAllRequiredTargetsDefeated, document TryActivate
completion gating, lock IsCompleted reads, add operations tests, and update
plan and review doc.
2026-05-31 16:37:22 -04:00
VinPropane
aaccbbbcaf
NEO-104: Add encounter progress and completion stores.
...
In-memory IEncounterProgressStore and IEncounterCompletionStore with
EncounterProgressOperations for activation, defeat tracking, and
all-targets-defeated checks; unit tests and docs.
2026-05-31 16:18:56 -04:00
VinPropane
e4e75f5dc7
NEO-103: Address code review follow-ups.
...
Mark E5M3-04 landed in module Summary, assert fixedGrants order in
C# test, add Bruno ordinal comment, strike through review items.
2026-05-31 15:43:37 -04:00
VinPropane
9b48ec5f39
NEO-103: Add GET /game/world/encounter-definitions API.
...
Expose schema v1 encounter list with nested completionCriteria and
rewardTable summary via encounter and reward-table registries.
2026-05-31 15:40:12 -04:00
VinPropane
734876cde9
NEO-102: add encounter and reward-table definition registries + DI
...
Thin IEncounterDefinitionRegistry / IRewardTableDefinitionRegistry adapters
over NEO-101 catalogs with TryNormalizeKnown, DI registration, and 18 AAA tests.
2026-05-31 00:38:38 -04:00
VinPropane
21749e7977
NEO-101: Address code review — schema tests, module snapshot, host boot.
...
Adds row-level JsonSchema violation tests for both loaders, symmetric empty reward-tables host boot test, and E5.M3 implementation snapshot; review doc marked Done.
2026-05-31 00:08:41 -04:00
VinPropane
f921095fb0
NEO-101: Fail-fast encounter and reward-table catalog load at startup.
...
Adds Game/Encounters loaders mirroring validate_content.py E5M3 gates, DI registration with reward-tables-before-encounters load order, 19 AAA tests, and server README catalog sections.
2026-05-31 00:05:57 -04:00
VinPropane
04126693e1
NEO-98: Update Bruno for seven abilities and attackAbilityId.
2026-05-30 18:06:42 -04:00
VinPropane
44fb4adbe5
NEO-98: Set melee strike to 2 m and elite slam to 4 m.
2026-05-30 17:55:10 -04:00
VinPropane
b9e2d2f4c9
NEO-98: Shorten NPC melee strike maxRange to 1 m.
2026-05-30 17:53:14 -04:00
VinPropane
3169106f28
NEO-98: Resolve NPC telegraph hits via attack ability maxRange.
...
Telegraph damage now looks up behavior attackAbilityId for baseDamage and
maxRange instead of using aggroRadius. Adds three NPC attack abilities, maxRange
on AbilityDef, attackAbilityId on NpcBehaviorDef, and cross-ref validation.
2026-05-30 17:49:21 -04:00
VinPropane
332cd4445f
NEO-98: stop defeated NPC aggro and runtime attacks
...
Clear threat holder and reset runtime to idle when combat-target HP
is defeated — on cast accept and as an AdvanceOne guard so telegraph
cycles cannot continue after the killing blow.
2026-05-30 17:38:27 -04:00
VinPropane
5efa5a4ad8
NEO-95: address code review — alignment docs and API nits
...
Append NEO-95 landed to E5.M2 tracking; echo route playerId on
combat-health GET; AttackExecute comment; tighten elite test AAA.
2026-05-28 23:45:07 -04:00
VinPropane
b702d9fb6f
NEO-95: add tests, Bruno smoke, and docs for player combat HP
...
Cover elite telegraph damage, fixture reset, and combat-health GET
verification; update E5M2 backlog and server README.
2026-05-28 23:42:20 -04:00
VinPropane
798c601bc5
NEO-94: Address code review — alignment doc and AAA test layout.
...
Append NEO-94 landed to E5.M2 tracking row; move ReadFromJsonAsync to Assert in snapshot integration tests.
2026-05-28 23:23:19 -04:00
VinPropane
a68d8aa782
NEO-94: Add GET /game/world/npc-runtime-snapshot with lazy AdvanceAll.
...
Expose versioned NPC runtime rows and nested activeTelegraph DTOs for client poll; wire route, AAA integration tests, Bruno smoke, and docs.
2026-05-28 23:17:57 -04:00
VinPropane
e4f08b2015
NEO-93: Preserve LastAdvancedUtc on clock regression and guard zero timings.
...
Do not move the lazy-tick marker backward when nowUtc regresses; reject
non-positive catalog durations and break the phase loop when cursor stalls.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-27 23:44:13 -04:00
VinPropane
83d1bb13e4
NEO-93: Reset LastAdvancedUtc on dev fixture runtime clear.
...
Fixture reset cleared NPC rows but left a stale lazy-tick marker, causing
catch-up bursts after re-acquire. Reset to MinValue with prototype rows.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-27 23:26:17 -04:00
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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