content(creation): the eleven origin fragments

race.fragment + calling.fragment compose the DM origin panel on the creation
screen. Authored prose, not stubs — this is the first sentence the player reads.
Parity-tested: a missing or empty fragment fails the suite.
This commit is contained in:
2026-07-13 14:02:47 -05:00
parent 17ef142689
commit e4db022c4b
12 changed files with 25 additions and 11 deletions

View File

@@ -130,3 +130,17 @@ func test_blurb_content_carries_no_mechanics():
"nightsight", "claws", "keen_scent"]:
assert_false(db.races[id].has(banned),
"%s.json leaks the mechanic '%s' — that lives in Races" % [id, banned])
func test_every_race_and_calling_carries_a_fragment():
# The DM origin panel (M4-b) composes race.fragment + calling.fragment. A
# missing one degrades to the blurb at runtime rather than crashing — but it
# must never SHIP missing, so the suite is where it fails.
for id in Races.IDS:
assert_true(db.race(id).has("fragment"), "race %s has no fragment" % id)
assert_ne(str(db.race(id).get("fragment", "")).strip_edges(), "",
"race %s has an empty fragment" % id)
for id in Callings.IDS:
assert_true(db.calling(id).has("fragment"), "calling %s has no fragment" % id)
assert_ne(str(db.calling(id).get("fragment", "")).strip_edges(), "",
"calling %s has an empty fragment" % id)