Skip to content

fix(openworlds): add aasimar lineage to RACES (Closes #375) - #389

Closed
100yenadmin wants to merge 1 commit into
mainfrom
fix/375-aasimar-lineage
Closed

fix(openworlds): add aasimar lineage to RACES (Closes #375)#389
100yenadmin wants to merge 1 commit into
mainfrom
fix/375-aasimar-lineage

Conversation

@100yenadmin

@100yenadmin 100yenadmin commented May 30, 2026

Copy link
Copy Markdown
Member

TL;DR

Adds aasimar as a first-class lineage in RACES (CHA +2, WIS +1 per 5e canon Protector tradition), retroactively validating Dame Aylin's existing PORTRAIT_GALLERY entry (race: "aasimar"). Closes the race-tag drift the --ui-gate gallery_per_race probe (PR #386) flags as unknownRaces: ["aasimar"].

Closes / addresses

What this lands

One additive entry at viewer/openworlds/screen-create.jsx:866:

aasimar: {
  name: "Aasimar",
  size: "Medium",
  life: "160 years",
  glyph: "aasimar",
  body: "Touched by something brighter once. Bears a heritage older than empires, and the unsettling habit of catching candle-light at the wrong angles. Born to the Upper Planes' echo; walks the world unsure whether to atone or to lead.",
  bonus: { cha: 2, wis: 1 },
},

Why option (1), not option (2)

#375 offered two paths:

  1. Add aasimar to RACES (lineage-positive)
  2. Re-tag Dame Aylin → human (drift-patching)

Picked (1). Aasimar IS a canonical 5e lineage (PHB-adjacent, Volo's Guide) AND a canonical BG3 lore lineage (planetouched). Re-tagging Aylin would patch the drift but cost real CRPG-canon fidelity. Players coming from D&D Beyond / Kingmaker / BG3 will expect Aasimar on a character-creation screen.

5e canon mapping

Field Value Rationale
Size Medium Volo's Guide
Life ~160 years "live longer than humans"
ASI CHA +2, WIS +1 Protector tradition (most common in BG3 lore, closest fit for the existing flat-RACES bonus style)

Subraces (Protector / Scourge / Fallen) and full trait set (Celestial Resistance, Healing Hands, Light cantrip) deferred — same pattern as the other 11 races, which don't yet expose subraces or full trait sets either.

Smoke test (post-fix, regex from #386 against patched file)

Counts per race (after this PR):
   human        4
   halfling     0  ← still empty (#379 — next PR with empty-state)
   dwarf        0  ← still empty
   elf          2
   half         2
   tiefling     1
   dragonborn   0  ← still empty
   drow         1
   githyanki    1
   gnome        0  ← still empty
   half-orc     0  ← still empty
   aasimar      1  ← Dame Aylin now reachable ✓
Unknown race tags: []  ← drift CLOSED ✓

Acceptance criteria (per #375)

  • ☑ Option (1) chosen: aasimar added to RACES with proper ability bonuses (CHA +2, WIS +1)
  • ☑ Closest lore fit (Protector Aasimar tradition)
  • ☑ Lore-line body copy matches existing prose style (mythopoetic, present-tense, character-not-encyclopedia)
  • ☑ Dame Aylin's PORTRAIT_GALLERY entry now validates (verified via regex smoke)
  • --ui-gate gallery_per_race unknownRaces set is now empty (verified)

Out of scope (intentionally)

Collision audit

DO NOT MERGE yet

Per owner direction. Ready for review.

Summary by CodeRabbit

New Features

  • Added Aasimar as a playable race option in character creation with +2 Charisma and +1 Wisdom stat bonuses.

Review Change Stack

PR #369 added Dame Aylin to PORTRAIT_GALLERY with `race: "aasimar"`,
but "aasimar" was not a valid RACES key (11 races shipped; aasimar
was missing). Result: the race-filter at screen-create.jsx:548 never
matched her entry, leaving her unreachable from any race selection
— PR #369's body acknowledged this as intentional "lore-only via the
filter," but it's a visible drift that the --ui-gate `gallery_per_race`
probe (PR #386) surfaces as `unknownRaces: ["aasimar"]`.

Fix per option (1) in #375 — add aasimar as a first-class lineage.

Why option (1) and not option (2) (re-tag Aylin → human)
-------------------------------------------------------
Aasimar IS a canonical 5e lineage (PHB-adjacent, Volo's Guide, also
in BG3 lore as a planetouched lineage). Players coming from D&D
Beyond / Kingmaker / BG3 will expect it on a character-creation
screen. Re-tagging Aylin would patch the drift but cost real CRPG-
canon fidelity.

5e canon mapping
----------------
- Size: Medium
- Life: ~160 years (Volo's: "live longer than humans")
- ASI: CHA +2, WIS +1 — matches Protector tradition (the most
  common Aasimar subrace in BG3 lore + the closest fit for the
  existing flat-RACES bonus style). Subraces (Protector / Scourge /
  Fallen) deferred to #377 (subrace handling).

Smoke test (post-fix, against the new RACES table)
--------------------------------------------------
  $ node -e '<the #386 regex against the patched file>'
  Counts per race:
     human        4
     halfling     0  ← still empty (next PR — #379 empty-state)
     dwarf        0  ← still empty
     elf          2
     half         2
     tiefling     1
     dragonborn   0  ← still empty
     drow         1
     githyanki    1
     gnome        0  ← still empty
     half-orc     0  ← still empty
     aasimar      1  ← Dame Aylin now reachable ✓
  Unknown race tags: []  ← drift CLOSED ✓

Out of scope
------------
- Empty galleries for dwarf / halfling / gnome / dragonborn / half-orc
  (#379 — separate PR with empty-state fallback)
- Subrace handling (#377)
- Aasimar trait set beyond ability bonuses (Celestial Resistance,
  Healing Hands, Light cantrip) — defer until traits land for the
  other 11 races
- Updating CREATE_RACE_IDS in qa/ui_gate_probe.js — that lives on the
  #386 branch (unmerged); will rebase that branch to include 'aasimar'
  once this lands.

Refs: #375 (this fix), #386 (the gate that surfaces this drift class),
PR #369 (introduced the drift)
@coderabbitai

coderabbitai Bot commented May 30, 2026

Copy link
Copy Markdown

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0af8b8d6-8de6-43e0-a63d-bdbf575d2ad8

📥 Commits

Reviewing files that changed from the base of the PR and between bb1870d and 9fd1ab2.

📒 Files selected for processing (1)
  • viewer/openworlds/screen-create.jsx

📝 Walkthrough

Walkthrough

The PR adds the aasimar race to the RACES data structure in the character creation screen, including display metadata (name, size, lifespan, glyph, flavor text) and ability bonuses (Charisma +2, Wisdom +1). This resolves the data inconsistency where Dame Aylin in the portrait gallery was tagged with a race key that did not exist in the playable races table.

Changes

Aasimar race definition

Layer / File(s) Summary
Aasimar race entry
viewer/openworlds/screen-create.jsx
RACES is extended with an aasimar key containing name, size (Medium), lifespan (160 years), portrait glyph, flavor text, and ability bonuses (Charisma +2, Wisdom +1) matching 5e canon.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~2 minutes

Possibly related issues

  • electricsheephq/WorldOS#375: This PR directly addresses the missing aasimar race key, making Dame Aylin's portrait entry reachable through the character creation race filter.

Possibly related PRs

  • electricsheephq/WorldOS#369: Both PRs extend the RACES table in viewer/openworlds/screen-create.jsx with additional playable race definitions.

Poem

🌟 A winged celestial joins the fold,
Charisma shines and wisdom's gold—
Dame Aylin now can truly be
Selected by our hero's decree!
🐰 ~CodeRabbit

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main change: adding aasimar lineage to RACES and closing issue #375. It is specific, directly related to the changeset, and helps developers understand the primary objective.
Description check ✅ Passed The description is comprehensive and well-structured. It includes a summary of changes, detailed rationale for the chosen approach (option 1), mapping to 5e canon, acceptance criteria verification, and out-of-scope items. Both required CLA sections are missing but the substantive content exceeds template expectations.
Linked Issues check ✅ Passed The PR fully addresses issue #375 requirements: adds aasimar to RACES with correct fields (name, size, life, glyph, body) and ability bonuses (cha: +2, wis: +1), provides 5e canon rationale, includes smoke-test validation, and verifies Dame Aylin is now reachable. All acceptance criteria from the linked issue are met.
Out of Scope Changes check ✅ Passed The PR is purely additive—a single RACES entry addition with no modifications to existing entries or unrelated changes. All explicitly out-of-scope items (empty galleries, subraces, full trait sets, qa/ui_gate_probe.js updates) are correctly deferred to other PRs (#379, #377, #386), demonstrating good scope discipline.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Comment @coderabbitai help to get the list of available commands and usage tips.

100yenadmin added a commit that referenced this pull request Jun 5, 2026
Dame Aylin's PORTRAIT_GALLERY entry tags her race:"aasimar", but "aasimar"
was not a key in RACES. Because StepRace renders Object.entries(RACES), no
selectable hero.race could ever equal "aasimar", so the portrait filter
(p.race === hero.race) never matched and Dame Aylin was unreachable from the
picker for any lineage.

Add aasimar as a first-class lineage in RACES (CHA +2, WIS +1 per 5e canon
Protector tradition), retroactively validating her existing gallery tag.
Additive only: removes nothing, modifies no existing entry. Subraces deferred.

Regression guard: test_openworlds_create_portrait_gallery_races_are_valid_races_keys
parses RACES keys + PORTRAIT_GALLERY race tags from the served screen-create.jsx
and asserts every gallery race tag resolves to a RACES key (with aasimar pinned
+ Dame Aylin's tag resolved). Verified RED without the fix, GREEN with it.

Closes #375. Revives PR #389.

Co-authored-by: Eva <arncalso@gmail.com>
@100yenadmin

Copy link
Copy Markdown
Member Author

Superseded by #653 — a fresh re-implementation off current main with a RED→GREEN regression guard (this stale branch was 4–8 days behind). Closing the stale PR.

@100yenadmin 100yenadmin closed this Jun 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(openworlds): Dame Aylin tagged race:'aasimar' is not a valid RACES key (PORTRAIT_GALLERY filter never matches)

1 participant