Files
sow-tools/internal/topdata/INHERITANCE_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.4 KiB

Topdata Inheritance Contract

Native topdata now supports two inheritance forms:

1. Row Sugar Compatibility

This is the existing narrow row helper:

{
  "PARENT": { "id": "custom:parent" },
  "inherit": {
    "from": "PARENT",
    "fields": ["VALUE", "ICON"]
  }
}

It remains supported for row-local field copying.

2. Generic Object Inheritance

This is the new reusable primitive:

{
  "inherit": {
    "ref": "masterfeats:skillfocus"
  },
  "LABEL": "FEAT_SKILL_FOCUS_ATHLETICS"
}

Or for a nested object:

{
  "DETAILS": {
    "inherit": {
      "ref": "custom:parent",
      "field": "DETAILS"
    },
    "meta": {
      "cost": "9"
    }
  }
}

Rules

  • inherit.ref must use stable dataset:key identity.
  • inherit.field is optional and selects an object-valued field on the target row.
  • Generic inheritance can appear on any authored object, not only top-level rows.
  • Merge precedence is local overrides inherited.
  • Scalars replace inherited values.
  • Arrays replace inherited values.
  • Objects merge recursively unless the local object is an atomic topdata value object such as:
    • TLK payloads
    • row refs
    • table refs
  • Cycles fail the build.
  • Missing targets fail the build.

Current Intended Consumer

feat is the first dataset expected to use this primitive heavily, especially for borrowing shared properties from masterfeats while keeping feat's own dataset contract and row model.