Halfling daughter of Bramble and Poppy Thorn, younger sister of Wren.
Portrait cropped of its frame and downsized to 450px wide.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Parents now live in the father/mother fields, so "son/daughter/child of
X [and Y]" is redundant noise in Relationships / Notes.
- app:npc:strip-parent-text removes that clause and tidies leftover
punctuation ("Son of X, husband of Y" -> "Husband of Y"; standalone
"Son of X and Y" -> cleared). Keeps "grandson of", "father of",
"daughter-in-law of". 92 rows cleaned.
- data/npcs.csv regenerated from the DB with the cleaned text plus new
Father / Mother name columns
- app:npc:import resolves those optional columns in a second pass, so a
fresh install reproduces the parent links without app:npc:link-parents
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Npc entity (village spreadsheet columns) + game_notes text field for
the DM's live play notes, plus updated_at touched on every change
- Race / VillageStatus / BloodCartInvolvement / MysteryImportance as
string-backed PHP enums, rendered as dropdowns on the edit form
- /npcs: server-side DataTables (paging, global search and column sort
all run in the backend via NpcRepository::findForDataTable); name cell
links to the edit page, game notes shown truncated
- /npcs/{id}: Bootstrap-themed edit form (all fields + a large game
notes textarea); Symfony forms now use the bootstrap_5 theme
- app.js: generic server-side DataTable wiring driven by data-* on the
<table>/<th> (data-datatable-src, data-row-url, data-format)
- app:npc:import console command - upserts from data/npcs.csv by
(family, name), never overwrites game_notes; --purge / --dry-run
- data/npcs.csv: 180 villagers exported from the working spreadsheet
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>