Commit Graph

34 Commits

Author SHA1 Message Date
Bastian Wagner
081c9f83f9 docs 2026-08-22 16:41:47 +02:00
Bastian Wagner
2dd0f32f88 docs: fill a glossary gap the survey missed -- combat page monster level
combat-page.component.html's "Stufe {{ combat.monster.level }}" fighter
badge was found by the original content survey but never made it into
the design doc's Combat glossary section, so Task 5's brief never
carried it. Task 5's implementer correctly left the string untouched
rather than inventing a translation without direction -- exactly the
right call.

Adds the missing row now: "Level {{ combat.monster.level }}", the same
treatment as the identical monster-level display already specified for
encounter-card.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 21:41:24 +02:00
Bastian Wagner
74fc89dfe5 docs: implementation plan for Slice 0.6.6 English Game Content Foundation
10 tasks, batched by layer (per subagent-driven-development's batching
guidance -- this is same-shape content/copy work across ~40 files, not
one task per file): API seed content, API reputation rank labels, web
static label maps, web error-message maps, then five feature-area
template sweeps (combat, inventory, world/travel, hunting,
layout/shared), closing with the shared test fixture and a repo-wide
grep sweep as the Definition-of-Done gate.

Unlike Slice 0.6.5, this plan has no designed red-build window: every
task changes string VALUES only, never a field/interface a sibling
task still reads, so both the API build and the Angular bundle compile
stay green throughout.

All test-filter commands in every task were run and verified against
this worktree before being written into the plan, rather than assumed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 19:50:51 +02:00
Bastian Wagner
9214bf99d2 docs: design doc for Slice 0.6.6 English Game Content Foundation
Full-repo survey of every player-facing German string (seed content,
API-computed reputation rank labels, five client-side error-message
translation maps, six static Angular label maps, all combat-log
generation, ~30 component templates), plus rulings on everything the
source spec leaves open: monster keys stay unchanged (only name
changes), no migration is needed (content lives in seed-file values,
not schema), reputation rank labels move on the API side, combat log
templates are freely composed rather than translated 1:1, and the
Renown/Reputation German-only "Ansehen"/"Ruf" split carries over as
"World Renown"/"Reputation" without the German-specific collision
problem that motivated it.

A complete glossary gives every implementer the exact English value to
use verbatim -- no translation judgment calls left to task execution.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 19:43:41 +02:00
Bastian Wagner
cedd87f648 Merge branch 'master' into worktree-playable-slice-0.6.5-renown-reputation
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>
2026-08-21 19:23:10 +02:00
Bastian Wagner
221819880c arts und agents 2026-08-21 17:32:05 +02:00
Bastian Wagner
df4c0c5527 fix(web): use the German "Ansehen" for Renown in the Topbar
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>
2026-08-21 14:59:01 +02:00
Bastian Wagner
2579b23a5c Add implementation plan for persistent HP and out-of-combat regeneration
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-21 14:12:38 +02:00
Bastian Wagner
a75a670509 Add design doc for persistent character HP and out-of-combat regeneration
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-21 13:56:43 +02:00
Bastian Wagner
987242541d inventory 2026-08-21 12:52:44 +02:00
Bastian Wagner
152499acfc Pair every API suite verification with a build
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>
2026-08-21 09:07:37 +02:00
Bastian Wagner
e14f6dcbce Fix two plan defects found in SDD pre-flight scan
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>
2026-08-21 08:39:43 +02:00
Bastian Wagner
a376fb7128 Add implementation plan for Playable Slice 0.6.5 (Renown & Reputation)
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>
2026-08-21 08:34:22 +02:00
Bastian Wagner
65dfb466cd Add design doc for Playable Slice 0.6.5 (Renown & Reputation Foundation)
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>
2026-08-21 08:21:14 +02:00
Bastian Wagner
96d04d8ba3 Fix plan defect found in SDD pre-flight scan: Task 8 fixture patch
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>
2026-08-20 21:04:19 +02:00
Bastian Wagner
9d396b7d96 Add implementation plan for Playable Slice 0.6 (Full First Combat)
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>
2026-08-20 20:51:17 +02:00
Bastian Wagner
2526ac230d items 2026-08-20 17:07:40 +02:00
Bastian Wagner
8a5f57fa1c specs 2026-08-20 16:17:19 +02:00
Bastian Wagner
ec91f3ac7b grafiken 2026-08-20 15:11:17 +02:00
Bastian Wagner
624c47e5a6 Merge branch 'worktree-slice-0.4-first-loot' 2026-08-20 10:33:39 +02:00
Bastian Wagner
b92aecb71a renaming 2026-08-20 10:16:51 +02:00
Bastian Wagner
1a7a766f2b docs(slice-0.4): record First Loot verification results
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 10:04:26 +02:00
Bastian Wagner
b0e769d0da combat 2026-08-20 09:47:24 +02:00
Bastian Wagner
f008e53cc6 docs(slice-0.4): add the First Loot implementation plan
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 23:14:25 +02:00
Bastian Wagner
85184e6e53 Cursor 2026-08-19 16:06:51 +02:00
Bastian Wagner
f24a5fea9c sprites 2026-08-19 14:43:25 +02:00
Bastian Wagner
deab7a31f1 docs: plan playable slice 0.2 first hunt
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 14:39:27 +02:00
Bastian Wagner
5b662aad4c docs 2026-08-19 11:14:17 +02:00
Bastian Wagner
1bb4feb6fb docs: correct fidelity ledger's claim about the map background artwork
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.
2026-08-19 10:50:10 +02:00
Bastian Wagner
ec6c34e341 test: verify first visible vertical slice
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).
2026-08-19 10:13:40 +02:00
Bastian Wagner
1e2bfe6e4b feat: render interactive ashen fields world 2026-08-19 08:25:42 +02:00
Bastian Wagner
4a689238e6 docs: plan first visible vertical slice 2026-08-18 17:18:17 +02:00
Bastian Wagner
a6ebaf0493 docs: specify first visible vertical slice 2026-08-18 17:12:23 +02:00
Bastian Wagner
9e92731645 chore: bootstrap ashen realms monorepo 2026-08-18 17:01:21 +02:00