Files
sow-tools/internal/topdata/MASTERFEATS_CONTRACT.md
T
archvillainette dc93feb176 Topdata Migration (#2)
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>
2026-04-09 07:14:01 +00:00

1.5 KiB

masterfeats Canonical Contract

masterfeats is a stable native canonical family consumed directly by feat generation, class-feat expansion, and inheritance/ref resolution.

Current canonical scope:

  • dataset root: topdata/data/masterfeats/
  • required files:
    • base.json
    • lock.json
  • generated output:
    • masterfeats.2da

base.json

Canonical shape:

{
  "output": "masterfeats.2da",
  "columns": ["LABEL", "STRREF", "DESCRIPTION", "..."],
  "rows": [
    {
      "id": 0,
      "key": "masterfeats:weaponfocus",
      "LABEL": "WeaponFocus",
      "STRREF": "6490",
      "DESCRIPTION": "436"
    }
  ]
}

Rules:

  • output must be exactly masterfeats.2da
  • columns must include LABEL, STRREF, and DESCRIPTION
  • every canonical row must have a non-empty key
  • row keys must start with masterfeats:
  • inline TLK payloads are allowed in STRREF and DESCRIPTION
  • numeric/text references are both allowed where the native TLK compiler already supports them

lock.json

Canonical shape:

{
  "masterfeats:weaponfocus": 0
}

Rules:

  • every key must start with masterfeats:
  • every value must be numeric
  • the lockfile remains the canonical stable id source for authored keys

Module contributions

This family continues to support the shared canonical module shapes already used by native datasets:

  • entries
  • overrides
  • rows

Those shapes are validated generically in topdata.go; this contract only adds the family-specific guarantees for masterfeats.