| Slug | Side | Stage | Company |
|---|---|---|---|
| hr-com | sell | signed_contract | HR.com Ltd |
| design-precast | buy | first_meeting | Design Precast |
| capstone-construction | buy | first_meeting | Capstone Construction Partners |
| aquascience | sell | closed_lost | AquaScience |
| wieser-concrete | buy | closed_lost | Wieser Concrete |
| air-control | sell | closed_lost | Air Control |
| springer-floor | sell | closed_lost | Springer Floor |
The commit warning says "nc_app lacks ALTER privileges." This is true — but nc_app is the PostgREST REST API role. It has restricted read-only access by design, and it never touches schema DDL. Migrations run via SUPABASE_POSTGRES_CONN — a direct postgres superuser connection string stored in Doppler. The ALTER TABLE statements ran as postgres superuser, succeeded, and the nc_app warning fires afterward as a routine runtime observation.
The live deals table has both legacy columns (company_name, status, deal_type) and new schema columns (slug, side, stage, client_company, etc.). This is the expected output of migration 0010's additive strategy: it uses ADD COLUMN IF NOT EXISTS rather than DROP + CREATE. The old columns are inert — no current code reads them. They will be removed in migration 0017.
The synthesis initially conflated public.schema_migrations (the custom 0004 ledger) with the Supabase CLI's internal supabase_migrations.schema_migrations table. These are two different systems. apply-deal-tracker-migrations.sh uses supabase migration repair --status applied which writes to the Supabase CLI internal table. migrate.sh (the newer runner) uses raw psql and writes to neither. The gap: public.schema_migrations (custom 0004) is not written to by either script.
| Priority | Item | Owner |
|---|---|---|
| P2 | public.schema_migrations (custom 0004 ledger) not written to by migrate.sh — seed migrations could re-run and overwrite live edits. Fix: add INSERT to ledger after each psql call. |
Claude drafts, Ewing applies |
| P2 | Orphan columns (company_name, status, deal_type) on deals table. Write migration 0017 to DROP them — before next major schema change cycle. |
Claude drafts, Ewing applies |
| P3 | iss_0094: 11,058-row contacts table has duplicate emails — uniq_contacts_email cannot be created. Claude produces dedup query; Ewing decides strategy. |
Ewing decision |
| From → To | Score | Why |
|---|---|---|
| storyteller → conductor | +30 (3×10) | nc_app "self-cancelling alarm" framing — changed how conductor reads privilege warnings |
| storyteller → architect | +15 (3×5) | Legacy column families coexist by design — gave architect the schema-read audit directive |
| quarterback → conductor | +30 (3×10) | PR #36 state correction: OPEN → MERGED. Critical fact preventing re-work |
| debrief → conductor | +15 (3×5) | "Live data = applied" rule — changes primary migration audit indicator |
| debrief → architect | +15 (3×5) | Two-actor disambiguation framework — reusable model for future runs |
| listener → conductor | +10 (2×5) | One-line Ewing answer drafted, used verbatim |
| architect → all | +10 (2×5) | sha256 drift blindspot in migration runner — medium priority improvement |