- Fix arrow selection line count calculation (overcounted by 1 due to
trailing newline, causing progressive line truncation on each redraw)
- Replace sync Loreline bridge with queue-based async pattern to avoid
"Cannot wait on monitors" WASM deadlock
- Add bounded input buffer (8 keys, DropOldest) to prevent held-key
accumulation
- Set Spectre.Console Profile.Height on all AnsiConsole.Create calls to
prevent PlatformNotSupportedException on Console.WindowHeight
- Add explicit Loreline.dll reference + TrimmerRootAssembly for WASM
- Use MSBuild CopyGameContent target instead of Content/Link for static
file serving in Blazor WASM
- Add WASM guards for file I/O in ContentRegistry, LocalizationManager,
AdventureEngine
- Enforce min 120x30 terminal dimensions in xterm.js
- Add Playwright E2E tests (6 tests: page load, language selection,
full flow, multi-box progression, extended play, adventure)
Redesign the interaction mechanic into a recursive chain reaction system
where items can trigger cascading reactions. Keys now open themed chests
which produce items that may trigger further reactions, with chain bonus
rewards for multi-step chains (x2/x3/x4+).
- Add 6 themed chests + mysterious chest + alchemist stone catalyst
- Rewrite InteractionEngine with recursive chain loop (max depth 10)
- Add ConsumeTrigger field to InteractionRule for catalyst support
- Add ChainBonusEvent and enrich InteractionTriggeredEvent with context
- Update rendering to show both reacting items and chain indicators
- Add item descriptions with anticipation hints for chain partners
- Update GDD Section 5 with full chain reaction specification
- Remove ChatPanel/EventLog entirely (UIFeature, GameState, MetaEngine,
SpectreRenderer, Program, ChatPanelTests, meta_chat item/box/strings)
- Retouch Space adventure: expand AlienEncounter with 3 proper endings
(RareBoxStory, AlienTrade, BoxContest with flair secret branch),
expand SpaceExploration with fuel-gated choices and deeper branching
- Add (NOUVEAU/NEW) prefix to adventure action when no adventure completed
- Translate character names via localization keys (character.* in en/fr.json)
- Replace hardcoded "(unavailable)" with localized hint or fallback text
- Fix snapshot path to use CallerFilePath instead of fragile ../ chain
- Add Workstations summary section to item_utility_report.txt
Workstations now appear as soon as they are unlocked, not only when a job
is active. Idle stations display a waiting-for-ingredients status (⏳/~).
Add craft.idle localization key and update empty message to "no workshops
unlocked".
Snapshot now writes to tests/snapshots/ at repo root instead of the test
bin output directory, so it can be committed and diffed across changes.
Crafting entries now show the workstation (e.g. "@ DrawingTable") for both
ingredients and outputs. Removed timestamp from report header to keep
snapshots stable across runs.
Strip Health, Mana, Food, Stamina, Oxygen, Energy — only Gold and Blood
remain as they serve as adventure gates (Contemporary ≥30, DarkFantasy ≥20).
Remove 22 orphaned items, 5 recipes, and the AlchemyTable workstation.
Replace energy_cell in rocket_boots recipe with cosmic_shard.
Change box_endgame condition from AllResourcesVisible to BoxesOpenedAbove:500.
Add ItemUtilitySnapshot test that maps every item to its usage contexts
(loot sources, crafting, interactions, adventures) and generates a report.
DEBUG overwrites the snapshot; RELEASE asserts no changes.
Update specifications.md and CLAUDE.md to reflect resource cleanup.
Remove obsolete bugs.md and refactoring_plan.md.
Update ShowGameState test to expect box counter output (added in
proposals_2.md). Add refactoring_plan.md documenting Black Box Sim
pattern violations and prioritized fixes.
- Localize box names and rarity in PlaythroughCapture test events
- Fix name truncation to account for 2-char prefix (► / ) in inventory table
- Add AdventureToken detail panel showing linked adventure name
- Show remaining quantity after consuming an item
- Localize inventory column headers (Nom, Rareté, Qté in FR)
- Resolve box names via BoxDefinition.NameKey instead of showing raw IDs
- Reorder inventory categories: Box → Consumable → Lore → Cosmetic → Material → Meta
- Replace English category/rarity text with emoji icons and localized rarity labels
- Show box description in detail panel when selecting a box item
- Add lore collection progress counter (N/10) in lore fragment detail panel
- Add FR rarity translations (Commun, Peu commun, Rare, Épique, Légendaire, Mythique)
- Reorder meta unlocks for better early-game pacing (visual panels first)
- Portrait always visible, cosmetics shown only when panel unlocked
- Auto-equip first cosmetic of each slot
- Transform ChatPanel into event log with localized title
- Compact UI feature announcements (Panel instead of FigletText)
- FullLayout-only screen clearing, inline resource summary pre-unlock
- Lore fragment named keys for inventory display
- Interactive inventory with ↑↓ selection, detail panel, and Enter to act
- Consumable items usable via UseItemAction pipeline
- Lore fragments readable in dedicated display panel
- Add InventoryRenderCapture test and document render capture workflow
Integrate stats, resources, and cosmetics into adventures via conditional
branches gated by game state checks. Each of the 9 adventures now has a
secret branch that rewards exploration and encourages replay with subtle
hints on locked choices. The endgame box now triggers a Destiny adventure
that acknowledges all completed adventures and secret branches, with four
ending tiers culminating in an ultimate ending when all 9 secrets are found.
Also adds the crafting engine, CLAUDE.md and specifications.md for faster
onboarding.
Bug fixes:
- Fix double "NEW FEATURE UNLOCKED" message and broken enum-to-key mapping for all UIFeatures
- Fix Spectre markup crash when opening inventory with colors unlocked (unescaped rarity brackets)
- Fix latent Spectre markup crash in ResourcePanel (unescaped bar brackets)
- Fix WeightedRandom.PickMultiple picking with replacement causing duplicate drops
- Fix double AddItem bug (BoxEngine + RenderEvents both adding to state)
- Add StatType and FontStyle fields to ItemDefinition (were in JSON but missing from C# record)
New features:
- Endgame box (Mythic) that appears when all 8 resources are discovered, contains Crown of Completion
- Completion percentage tracker as mid-game meta unlock (tier 3), shown in both renderers
- Adventure pool depletion: adventure sub-boxes with already-unlocked themes are removed from loot pool
- Global error handling with log file output (openthebox-error.log)
- Tiered meta progression: 5 sequential meta boxes replacing single box_meta
New tests (180 new, 228 total):
- 5 panel rendering test classes covering all enum values (Portrait, Resource, Stats, Inventory, Chat)
- RenderContext and RendererFactory logic tests
- SpectreRenderer output tests across 4 context configurations
- BasicRenderer output and input method tests
- Simulation state mutation and full-run completion tests
- Fix LootTable.GuaranteedRolls type (int -> List<string>) to match JSON schema
- Fix BoxEngine guaranteed rolls to iterate item IDs directly
- Fix BoxEngine resource condition evaluation for "any" targetId
- Make ItemDefinition.DescriptionKey optional
- Fix font meta item nameKeys to use proper localization keys
- Add 43 xUnit content validation tests (deserialization, cross-refs, localization)
- Add self-contained single-file publish via publish.ps1
- Update README with distribute and test sections