Part of PAR-166 (spin out /find). Migration-blocking data-completeness gap.
chestshop_shop is populated lazily — MarketListener only upserts on ShopCreated/Transaction/InventoryClose. There is no chunk-scan resync writing to MarketApi, so every pre-existing shop that hasn't been touched since the hook went live is missing from the registry. The legacy plugin has /csdb resync precisely to index all existing shops, so at cutover Treasury's view is incomplete.
Do:
chestshop-database Shop table → chestshop_shop (map world UUID→name, owner_name→structured owner via Treasury/Business lookup, estimated_capacity/visible/hologram once those columns exist). Idempotent on the uq_shop_location unique key.MarketApi.upsertShop is safe to call in bulk from an authoritative scan (idempotent upsert, no duplicate rows, sane last_seen/stock_at). The admin /find resync command that drives the scan lives in the new plugin (sub-issue of PAR-166); this issue is the importer + the idempotent write path it depends on.Acceptance: after backfill, the count/contents of chestshop_shop (active shops) matches the legacy Shop table; a second run is a no-op.