Context
The build-optimizer persona (sat=5, the lone cross_persona_sat holdout) plays a seeded canon figure as PC (e.g. Devella Fountainhead, an L10 Paladin via load_canon_character). Ground-truth from its live snapshot showed the canon figure arrives incompletely built, and the item inspector lacks SRD armor metadata. These are legitimate D&D-completeness gaps a real player adopting a canon figure also hits.
The 5 optimizer majors, root-caused:
| # |
Complaint |
Root cause |
Status |
| 1 |
L10 Paladin "Choose Subclass" — no Sacred Oath |
_apply_srd_class_defaults only granted subclass features if sub (already set) → canon figure kept subclass=null |
FIXED #895 (auto-set the sole SRD subclass on canon-load seat at/past the choice level) |
| 5 |
No Fighting Style selected (blank at L10) |
The Character model has no fighting_style field — "Fighting Style" is only a feature name; no specific style is tracked/selected |
OPEN — needs a fighting_style field + a default-on-canon-load (multiple SRD styles, so pick a sensible default e.g. Defense, or surface as a build choice) + viewer render |
| 2 |
Only 3 of 7 spells prepared (under-prepared) |
Canon record supplied 3 spells; the seat path's starter-loadout only fires when spell lists are empty (server.py ~1392), so it never tops a canon caster up to the prepared cap |
OPEN — on canon-load, fill an under-prepared prepared-caster to the SRD prepared-max (level/2 + ability mod) from _preparable_spells |
| 3 |
No spell-preparation UI in Rest & Prepare |
Viewer: the rest-prep spell-selection step (the #887 engine half landed) isn't reachable/rendered |
OPEN — viewer (OpenWorlds Rest & Prepare dialog) |
| 4 |
Chain Mail inspector shallow — no category/STR-req/stealth |
Engine itemcatalog Chain Mail has armor_category: heavy, ac: 16, weight: 55 but lacks stealth_disadvantage and str_requirement (STR 13 in SRD 5.2); the inspector also doesn't render category/STR-req/stealth |
OPEN — add SRD armor metadata (stealth-disadvantage, STR-req) to the heavy/medium armor catalog entries (Chain Mail STR 13, Plate/Splint STR 15, etc.) + render in the viewer item inspector |
Suggested next wave (engine = my lane; viewer separate)
Evidence
Snapshot (vm2-optimizer @27d8002): classes:[{Paladin,10,subclass:null}], pending_choices:[], spells_prepared:[Bless,Cure Wounds,Shield of Faith] (3, cap 7), no fighting_style field. Item: itemcatalog.resolve("Chain Mail") → {armor_category:heavy, ac:16, weight:55} (no stealth/STR-req).
NOTE: #895 (oath auto-set) lands the #1 fix; a fresh sweep @3582dc2 will show the residual optimizer sat after it.
Context
The build-optimizer persona (sat=5, the lone cross_persona_sat holdout) plays a seeded canon figure as PC (e.g. Devella Fountainhead, an L10 Paladin via
load_canon_character). Ground-truth from its live snapshot showed the canon figure arrives incompletely built, and the item inspector lacks SRD armor metadata. These are legitimate D&D-completeness gaps a real player adopting a canon figure also hits.The 5 optimizer majors, root-caused:
_apply_srd_class_defaultsonly granted subclass featuresif sub(already set) → canon figure keptsubclass=nullfighting_stylefield — "Fighting Style" is only a feature name; no specific style is tracked/selectedfighting_stylefield + a default-on-canon-load (multiple SRD styles, so pick a sensible default e.g. Defense, or surface as a build choice) + viewer render_preparable_spellsitemcatalogChain Mail hasarmor_category: heavy,ac: 16,weight: 55but lacksstealth_disadvantageandstr_requirement(STR 13 in SRD 5.2); the inspector also doesn't render category/STR-req/stealthSuggested next wave (engine = my lane; viewer separate)
autoset_single_subclass-style gating, only onload_canon_character): add afighting_stylefield + sensible default when the class grants Fighting Style and none is set; top up an under-prepared canon prepared-caster to the prepared cap. Additive (complete builds + non-canon-load paths byte-identical).stealth_disadvantage+str_requirementto the SRD heavy/medium armor catalog; render category/AC/STR-req/stealth/weight in the inspector (builds on fix(#756): item inspector shows AC / damage / Versatile two-handed / properties + Examine panel + compare-to-equipped #872/fix(viewer): Market inspector renders F09-6 armor dex rule (acDisplay), consistent with Stash (#756 / F09-6 / F09-7 / #874) #876).Evidence
Snapshot (vm2-optimizer @27d8002):
classes:[{Paladin,10,subclass:null}],pending_choices:[],spells_prepared:[Bless,Cure Wounds,Shield of Faith](3, cap 7), nofighting_stylefield. Item:itemcatalog.resolve("Chain Mail")→{armor_category:heavy, ac:16, weight:55}(no stealth/STR-req).NOTE: #895 (oath auto-set) lands the #1 fix; a fresh sweep @3582dc2 will show the residual optimizer sat after it.