Generated 2026-04-22 · combines branch-triage findings, inventory audits (master-crm-web, claude-skills, SPLIT-MANIFEST), live row counts, and archive-load results. One page to decide what must migrate before OLD is deleted.
STATUS — 2026-04-22 17:46 PT · OLD DECOMMISSIONED
DELETE complete. rdnnhxhohwjucvjwbwch is gone.
Supabase Management API DELETE /v1/projects/rdnnhxhohwjucvjwbwch → HTTP 200
Post-delete verify: GET project → HTTP 404, REST API URL → HTTP 410 Gone
All 74,021 rows preserved on NEW (dwrnfpjcvydhmhnvyzov) — 21 live + 43 archived + 17 empty, zero gaps
frozenhrcom-deal-room pipeline (5 write jobs) — import-time RuntimeError on OLD creds. Leaked Service Role JWT scrubbed from 3 public-facing files. Commits dfbaa23 + e31de20.
disabled Scheduled task old-supabase-drift-patch — was syncing OLD→NEW, now unnecessary.
scrubbed Every rdnn reference in ~/.claude/ memory + ~/repos/ docs rewritten to mark OLD decommissioned and point to NEW. Commits 09b1738 + e31de20.
leftover Three Lovable apps still hardcode OLD and will break at next load: Debbie Deal Room (a3bf07f3), Pixel Perfect Clone (01b7b849), Next Chapter Reports (70bfa70e). Repoint via VITE_SUPABASE_URL + VITE_SUPABASE_ANON_KEY in each Lovable env.
DELETEDOLD project
74,021Rows preserved on NEW
21Migrated live
43Archived
0Gap rows
3Lovable apps need repoint
TL;DR — What the audit proved (original finding)
The 2026-04-20 consolidation migrated 5 table SCHEMAS only — not data. Those 5 tables (deals, clients, timeline_events, client_documents, call_transcriptions) exist on NEW at 0 rows. Meanwhile OLD kept accumulating data. Inventory audits found this but were never merged into main, so nobody noticed.
Bottom line: 6 tables on NEW are missing rows that exist on OLD, and 37 entire tables on OLD have never been copied to NEW. Total rows at risk if OLD is deleted now: 65,837. resolved by 0007 + load_archive.py
1. Row-Level Diff — OLD vs NEW for the 27 overlapping tables
1a. Tables where NEW is MISSING rows OLD has migrate now
Table
OLD rows
NEW rows
Missing
Impact
companies
3,780
1,463
2,317
Company master records — source for TAM, dossiers, letters
call_log
1,395
0
1,395
Entire dialer call history — Salesfinity outcomes, timestamps
list_assignments
1,985
1,533
452
List membership (persons × lists) — drives dialer queueing
tam_verifications
6,330
6,113
217
TAM phone/email verifications
deals
87
0
87
Deal records — migration was schema-only
do_not_call
144
143
1
DNC list — 1-row drift, low impact
1b. Tables already matched safe
Table
Rows (both)
Note
tam_businesses
8,350
Largest table — migrated intact
tam_final
3,000
TAM curated list
dossier_provenance
2,322
call_analysis
2,273
Salesfinity scored calls
dossier_runs
1,638
dialer_queue
646
tam_owner_profiles
306
tam_scrape_runs
287
outreach_queue
82
sent_log, skills_registry, harvests, stories
27 / 23 / 21 / 11
Small tables, intact
1c. NEW grew past OLD NEW is authoritative
Table
OLD
NEW
Gained
targets
201
303
+102
deal_research
67
134
+67
dossier_final
10
27
+17
campaigns
5
21
+16
analysis
13
26
+13
acquisition_targets
9
18
+9
audits
2
6
+4
pipeline_log
1,343
1,345
+2
2. Tables only in OLD — never migrated at all
37 tables, 65,837 total rows. Plan: import to NEW as {name}_archive_2026_04_22 so they survive deletion of OLD without colliding.
3. Why this wasn't caught at 2026-04-20 consolidation
Missed because the auditing machine couldn't see 4 repos. The schema-audit branch (consolidation/supabase-audit, commit 714607f) was opened as a draft PR and abandoned. It would have shown these tables existed.
Repos not scanned at migration time
next-chapter-capital — likely the source of persons, phone_numbers, linkedin_identifiers, person_scores (Phoenix TAM)
next-chapter-dialer — likely the source of call_log, dialer_queue, lists, rep_*, opener_patterns, script_*
design-precast — entity-specific
and-call-command — the repo that OWNED the OLD instance (rdnnhxhohwjucvjwbwch is literally the "and-call-command" project)
Claude Skills audit surfaced a smoking gun
db-export/old-instance/*.json in claude-skills repo contains an earlier snapshot (14 files): companies=1068, persons=1844, list_assignments=1533. The list_assignments number exactly matches what's on NEW today (1,533) — proving the snapshot pre-dates the migration. NEW was seeded from that old snapshot, OLD kept going, and the delta was never re-synced.
4. Branch triage — what was shelved on GitHub
nextchapter-crm had 9 stale branches predating the 2026-04-09 main merge window. After today's clean-up there are zero stale branches on any of the 3 active repos.
Branch
Disposition
Why
frontend-v2-audit
Merged PR #5
Only truly unique branch — pure docs file docs/frontend-v2-audit-2026-04-08.md
backend-v2-bc4-integration-post-mortem
Closed
main already has commit e6f9e2a "BC4: integration_post_mortem section" (same title) + fix patches on top. File 27,065 B on main vs 21,324 B on branch.
worktree-agent-a23ace34
Closed
main has commit 829bf9f "BC1: deal_killer section — Q5 ... (cherry-pick from worktree-agent-a23ace34)" — literally cherry-picked.
backend-v2-br8-wiring
Closed
debbie-research JSONs regenerated on main via BX1 overnight regen (acb799f), C2 root fix (953cf81), dead-sections cleanup (0c273e7).
backend-v2-exa-verify
Closed
Same dossier regen chain supersedes Rippling/UKG/SAP JSONs.
backend-v2-rebuild
Deleted
ahead=0 (already fully merged)
frontend-v2-renderers
Deleted
ahead=0
clawdBot/nifty-liskov
Deleted
ahead=0, 147 commits behind
refactor/cross-domain-inventory
Deleted
ahead=0, 108 commits behind
5. Inventory audit results (consolidated from 3 PRs now merged)
5a. master-crm-web / nextchapter-crm
868 tracked files · 420 HTML pages · 10 Vercel API routes · 80+ Python backend scripts · 41 Supabase tables referenced by HTML
Risks: 9 files with hardcoded /Users/clawdbot/ paths · 13 HTML files inline the Supabase anon key (bypassing supabase-config.js) · PUBLIC repo with deal-sensitive buyer data
External services: Supabase, Lob ($1.50/letter), OpenRouter, Exa, Salesfinity, Telegram, Slack, Google Calendar, Gmail, SEC EDGAR
5b. claude-skills
288 tracked files · 45 Claude Code skill definitions · shared via symlink ~/claude-skills/skills → ~/.claude/skills
Finding:db-export/old-instance/*.json contains 14 JSON files of pre-migration snapshot data — this is the "evidence" that proved NEW was seeded from a stale snapshot (see §3)
No CI/CD, no pyproject.toml — version drift risk for Python helper scripts
doneApplied directly via psql with SUPABASE_DB_URL. Ledger recorded in schema_migrations with sha256.
doneLoaded rows via scripts/load_archive.py: 73,921 rows across 42 tables on first pass; call_log short by 24 (snapshot itself was partial).
doneDrift-patched via scripts/patch_archive_drift.py: pulled 50 new call_log + 26 new persons rows live off OLD. Archive now holds 74,021 rows = OLD's 74,021.
in progressStop writers to OLD. Salesfinity call-ingest on MacBook-27 (per harvest) and Lovable frontend are still POSTing to rdnnhxhohwjucvjwbwch. A daily drift-patch cron on this Mac Mini keeps the archive current meanwhile.
blockedFinal verification — run compare_old_live.py one more time after writers are cut; confirm zero drift.
manual confirmDelete OLD project rdnnhxhohwjucvjwbwch via Supabase Management API.
Cut-over policy for OLD — Option A: freeze OLD now (revoke write perms at DB level), do one final drift-patch, delete next week. Option B: leave OLD running indefinitely, rely on daily drift-patch, reroute writers one at a time. Option C: redirect ingest (Salesfinity → call_log/persons) to NEW immediately with a schema port. Daily drift-patch is already in place either way.
ADMIN_MIGRATION_SECRET length is 2 characters in Vercel env — bypassed for 0007 by running psql direct. Rotate before next migration?
Portal anon-key rotation — 13 HTML files in nextchapter-crm inline the anon key directly. Rotate NEW's anon key after OLD is gone?
nextchapter-crm repo visibility — currently PUBLIC with deal-sensitive buyer data. Flip to private?
Follow-up repos — next-chapter-capital, next-chapter-dialer, design-precast, and-call-command still need inventory audits. They own the 37 only-in-OLD tables.