migration-ready-schema

Featured

Data-model rules that make a schema importable from day one, so the migration-import-engineer is never blocked on missing columns. Every SMB Product-Builder product must let a customer bring their data from an incumbent (ServiceTitan/Toast/Mindbody/Shopify) — that requires provenance (source_ref) and rollback (import_batch_id) on importable entities, and modelling real-world actors as entities rather than inline fields. Applied by architect when writing the data model in ARCH-{slug}.md, and checked by migration-import-engineer. One cheap rule set prevents the migration↔architecture seam gap from recurring across all 40 products.

API & Backend 92 stars 13 forks Updated today MIT

Install

View on GitHub

Quality Score: 91/100

Stars 20%
66
Recency 20%
100
Frontmatter 20%
70
Documentation 15%
100
Issue Health 10%
50
License 10%
100
Description 5%
100

Skill Content

# Migration-ready schema — importable from day one Every SMB product's wedge is **low switching cost** — the customer brings their data from the incumbent. If the schema can't receive that data idempotently and reversibly, the `migration-import-engineer` blocks and the wedge is a slogan. These rules are cheap at design time and impossible to retrofit cleanly. **Apply them to the data model in ARCH, before any import is designed.** ## The three rules (the ones that actually block imports) ### 1. Importable entities carry `source_ref` (provenance) Any entity that can be populated from an incumbent export or a third-party sync gets a nullable, **unique** `source_ref` column: ``` source_ref text UNIQUE NULL -- e.g. "servicetitan:pricebook:8842" ``` - It is the **dedup key** for idempotent re-import (re-running an export never duplicates). - Namespaced `{source}:{type}:{id}` so two incumbents can't collide. - Nullable because natively-created rows have no source. ### 2. Importable entities carry `import_batch_id` (rollback) ``` import_batch_id uuid NULL -- tags every row written by one import run ``` Rollback = delete where `import_batch_id = ?`. Without it there is no undo, and an import with no undo is one a user will never trust enough to run. ### 3. Model real-world actors as entities, not inline fields A customer, contact, vendor, member, or tenant is an **entity with its own table**, even if v1 only stores a name + phone. Reason: imports populate these **before...

Details

Author
avelikiy
Repository
avelikiy/great_cto
Created
5 months ago
Last Updated
today
Language
JavaScript
License
MIT

Integrates with

Bundled in these plugins

Similar Skills

Semantically similar based on skill content — not just same category