The custom palette taxonomy (#46) pins display strings to fixed TLK
ids in tlk/custom.tlk.yml. registerInlineAtID demanded those ids be
free, but .tlk_state.json is a gitignored, per-machine cache: on any
machine built before #46, a ref could have dynamically grabbed a
now-pinned id (e.g. feat:yuanti/alternate_form.feat holding 2689),
failing the build with "TLK id N is already reserved by ...".
Make the pin authoritative over the cache: a stale cached owner on a
pinned id is evicted and reallocated a fresh id when next made active.
Only two pins fighting over one id in custom.tlk.yml is now an error.
This self-heals on the next build without deleting the state file.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The legacy normalize migration is done (confirmed). This deletes the dead migration path: NormalizeProject + 26 *_migrate.go files, the importLegacyItempropsRegistry cluster, loadLegacyTLK, and their tests (~7.9k lines, -33 files worth). mergeLegacyTLK moved into tlk_native.go since the live TLK compiler still uses it for base_dialog.json. make check passes.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Reviewed-on: #45
Reviewed-by: gitea-bot <gitea-bot@noreply.git.westgate.pw>
Co-authored-by: vickydotbat <vickydotbat@tutamail.com>
Co-committed-by: vickydotbat <vickydotbat@tutamail.com>
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>