Native topdata migration summary - Replaced the legacy 2dabuilder runtime path with the native topdata builder. - Native build, validate, compare, and convert flows now cover the canonical topdata pipeline. - compare-topdata is now a native self-check; legacy reference-builder runtime usage was removed. - Parts generation follows the native asset-scan contract and uses sow-assets via project asset resolution. - Generated feat families, class-feat injects, masterfeat/successor expansion, and dataset-derived feat generation were brought to parity and regression-covered. - Remaining mirrored datasets were migrated into native-owned canonical data while preserving lock IDs. - normalize-topdata bridge behavior and migration-era ownership markers were removed. - Documentation was rewritten around the native workflow and active contracts were cleaned up. - Final hardening pass removed stale validator assumptions and cleaned ignored/generated artifacts for PR readiness. Reviewed-on: https://gitea.westgate.pw/ShadowsOverWestgate/sow-tools/pulls/2 Co-authored-by: vickydotbat <vickydotbat@tutamail.com> Co-committed-by: vickydotbat <vickydotbat@tutamail.com>
3.6 KiB
3.6 KiB
feat Generated Families Contract
Canonical authored paths:
topdata/data/feat/base.jsontopdata/data/feat/lock.jsontopdata/data/feat/generated/skill_focus.jsontopdata/data/feat/generated/greater_skill_focus.jsontopdata/data/feat/generated/weapon_focus.jsontopdata/data/feat/generated/weapon_specialization.jsontopdata/data/feat/generated/greater_weapon_focus.jsontopdata/data/feat/generated/greater_weapon_specialization.jsontopdata/data/feat/generated/improved_critical.jsontopdata/data/feat/generated/overwhelming_critical.jsontopdata/data/feat/generated/proficiencies.jsontopdata/data/feat/modules/activecombat/core.jsontopdata/data/feat/modules/activecombat/specialattacks.jsontopdata/data/feat/modules/class/core.jsontopdata/data/feat/modules/combat/core.jsontopdata/data/feat/modules/defensive/core.jsontopdata/data/feat/modules/magical/core.jsontopdata/data/feat/modules/other/core.jsontopdata/data/feat/modules/proficiency/core.jsontopdata/data/feat/modules/racial/core.jsontopdata/data/feat/modules/removedandhidden/core.jsontopdata/data/feat/modules/skillfeat/affinity.jsontopdata/data/feat/modules/skillfeat/focus.jsontopdata/data/feat/modules/skillfeat/greaterfocus.jsontopdata/data/feat/modules/skillfeat/other.json
skill_affinity is no longer authored as a generated feat file. It is synthesized from
canonical racialtypes race grants.
Compact family-expansion shape:
{
"family": "skill_focus",
"family_key": "skillfocus",
"template": "masterfeats:skillfocus",
"child_source": {
"dataset": "skills",
"predicate": "accessible"
},
"overrides": {
"skills:craft_alchemy": {
"ICON": "ife_foc_alchm"
}
}
}
Weapon family shape:
{
"family": "weapon_focus",
"family_key": "weaponfocus",
"template": "masterfeats:weaponfocus",
"child_source": {
"dataset": "baseitems",
"column": "WeaponFocusFeat"
},
"overrides": {
"baseitems:heavymace": {
"ICON": "ife_wepfoc_Lma"
}
}
}
Rules:
- compact generated families are:
skill_focusgreater_skill_focusweapon_focusweapon_specializationgreater_weapon_focusgreater_weapon_specializationimproved_criticaloverwhelming_criticalproficiencies
- compact families must declare
template - compact families must also declare:
family_keychild_source.dataset
- weapon families must also declare
child_source.column - skill families use
child_source.predicate: "accessible"to meanHideFromLevelUp != 1 - compact
overridesare keyed by source dataset key:skills:*for skill familiesbaseitems:*for weapon families
- generated rows carry
meta.familyso the underscore family rule is preserved even before wiki generation exists - emitted feat keys must prefer existing canonical lock/TLK identities over newly derived child spellings
proficiencies.jsonis limited to the real masterfeat-backedweaponproficiencycommoner_*family- manual and irregular feat content continues to live under
feat/modules/ - generated families and module-authored feats are merged into the same final
feat.2dapipeline and share inheritance, override, TLK, and family-metadata behavior
Current rollout policy:
feat.2dastill builds nativelyfeat.2dais still excluded fromcompare-topdataoutput-catalog self-check coverage viacompare_reference: false- manual and irregular feat families remain authored directly in modules rather than compact generated-family files