Reconciles Slice 0.6.5 (Renown & Reputation Foundation) against master's
persistent-HP-and-regeneration slice, which landed independently and
touches several of the same files (Character entity, CombatService,
EquipmentService, the inventory detail panel).
Conflict resolutions:
- CharacterStatsService/EquipmentService constructor wiring: kept
master's CharacterVitalsService injection, which this branch's
version of the same files didn't have yet.
- CombatService.performAction: kept master's HP-guard logic
(characterTooWounded, vitals pause-on-enter) alongside this branch's
multi-line calculate() call style.
- Inventory detail panel (.html/.ts/.scss/.spec.ts): master had
redesigned the panel (wrapping section, rarity styling, flavour
text, a shared inventory.labels.ts) on top of the OLD level-gated
component, since this branch's removal of the level gate (R4, Task
8/14) hadn't reached master yet. Kept master's visual redesign in
full, but with the level-gate concept removed throughout: no
requiredLevel stat block, no meetsLevelRequirement() branch in the
equip button, no now-dead .detail__value--unmet SCSS rule. Kept both
branches' independent tests (non-equippable-item, flavour-text).
- inventory-page.component.ts: dropped master's dead characterLevel
computed (nothing in the template read it, and the level concept is
gone); kept its independent bagCells/bagUsed/bagCapacity grid
feature, which has nothing to do with renown or level.
Post-merge fixture repairs (three files failed the Angular bundle
compile because they predate master's hpRegenPerSecond/hpRegenSince
fields or master's item description field, neither conflict-marked
since git considered them non-overlapping edits):
- app.spec.ts: a 'renders loaded character values' test added on
master after this branch forked still used the abolished level/
experience fields on its decoy fixture -- retargeted to renown.
- inventory-detail-panel.component.spec.ts: the ashPelt fixture added
by this branch's final-review follow-up predates master's required
description field.
- top-bar.component.spec.ts: this branch's fixture predates master's
required hpRegenPerSecond/hpRegenSince fields.
No database migration touches the same column: master's
1792000000000-AddHpRegeneration only adds characters.hp_regen_since,
independent of this slice's 1791000000000-CreateRenownAndReputation.
Timestamp ordering between the two was already correct with no rename
needed.
Verified: API 288/288 (267 from this slice + 21 from master), API
build zero errors, web 237/237 (230 from this slice + 7 from master).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The Topbar rendered the English word "Renown", replacing the German
"Stufe" it showed before. That contradicted the slice's own global
constraint that all user-facing copy is German, and it was the single
English string in a component visible on every screen -- next to
"Silber", "Lebenspunkte" and "Charakterdaten werden geladen".
This was a spec defect, not an implementation one: the design doc and
the task brief both prescribed "Renown" literally. The document's
working language leaked into a copy-locked line.
"Ruf" is not available as the German term -- this project already uses
it for the separate per-faction Reputation system, and the two are
deliberately kept distinct. "Ansehen" (standing/prestige) is unclaimed
and matches the spec's own definition of Renown as the character's
overall significance in the world.
Records the decision as R17 in the design doc so later Renown UI does
not reintroduce the English term, and renames the now-inaccurate
top-bar__level class to top-bar__renown (nothing else referenced it).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
apps/api runs ts-jest with isolatedModules: true, which skips cross-file
type checking. Task 3 proved the gap concretely: the suite reported
233/234 green while npm run build reported 21 real errors across 6
files. Every full-suite step now runs test && build, with a Global
Constraints note explaining why the build half is not redundant.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
1. inventory.service.ts (API production code) surfaces requiredLevel in
its response DTO. Task 3 deletes the entity column, so this would
fail to compile and keep shipping a dead field. No task covered it:
Task 10 swept only test fixtures, Task 12 only the web model. Folded
into Task 10 as a new Step 0.
2. No web-side sweep task existed. Task 12's model changes break
CharacterResponse/InventoryItem fixtures in app.spec.ts,
world.store.spec.ts, and inventory.store.spec.ts, none of which
Tasks 13-16 touch. Added Task 17 mirroring Task 10's sweep rule.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
16 tasks: pure-function power curve and rank resolver, one migration
covering Character/ItemDefinition/ItemType/CombatReward changes plus
five new tables, three new domain services (Renown, Reputation,
TurnIn), XP removal from the combat reward pipeline, requiredLevel
gate removal, seed content for Grenzwacht/Räuberabzeichen/turn-ins,
a fixture sweep, and the web-side Renown/Reputation surfaces.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Records every judgment call the spec left open — Renown/Reputation
data model, service signatures, migration strategy, combat reward
pipeline changes, and API/frontend surface — as an explicit, auditable
ruling with its cost if wrong, per instruction to implement this slice
without confirmation stops.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
hunt-page.component.spec.ts and resume-combat.spec.ts each build a
direct type-annotated Combat literal that the new required
CombatPlayer/CombatMonster fields would break at compile time.
Verified with an isolated tsc --strict probe, and used the same probe
to confirm the combat.service.spec.ts `as Combat` fixtures do NOT
break (structural widening through the type assertion), so no change
needed there.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Covers the engine rewrite for HEAVY_STRIKE/SHIELD_BASH/DEFEND/POTION,
deterministic monster telegraphing/interrupt, the DB migration for the
new combat event types, and the web action bar + telegraph banner.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The ledger claimed the map scene renders per-location Suedtor/Aschestrasse
artwork, but world-page.component.scss hardcodes a single static world-map
background image; per-location artwork is only used in the context-panel
thumbnail. Corrected the description to match the shipped behavior.
Drives the full world/travel flow in Chromium via Playwright against the
live API and seeded Postgres, capturing the three required desktop
viewports and comparing them against the accepted design reference.
Fixes two evidenced defects found during verification:
- world-page scene sizing overflowed the viewport at all three required
desktop sizes, pushing the footer (and, at 1440x900/1366x768, the travel
button) below the fold; scene height now accounts for surrounding chrome
so nothing is clipped.
- the generic HTTP-failure fallback message was hardcoded in English while
the rest of the UI is German; now uses a matching German string.
Adds Playwright as a web devDependency for this and future browser
verification passes (no product-code dependency).