Index: src/config/database.js
===================================================================
--- src/config/database.js	(revision 2248cd205170dcacc008a9a13c91cb9cbd894974)
+++ src/config/database.js	(revision 586f9dd9605ed30afdb2a737a910b483f2ecc11a)
@@ -50,4 +50,17 @@
   ensureColumn('sites', 'allow_circle', 'INTEGER DEFAULT 1');
 
+  // Eén EXPLICIETE primaire/hoofd-site (= de bedrijfs-/labelsite in hub-modus,
+  // de enige site in solo) i.p.v. de fragiele "oudste = hoofd"-conventie die op
+  // 4 plekken gedupliceerd stond. Backfill: markeer de oudste als er nog geen
+  // primaire site is, zodat bestaand gedrag exact behouden blijft.
+  ensureColumn('sites', 'is_primary', 'INTEGER DEFAULT 0');
+  try {
+    const hasPrimary = db.prepare('SELECT 1 FROM sites WHERE is_primary = 1 LIMIT 1').get();
+    if (!hasPrimary) {
+      const oldest = db.prepare('SELECT id FROM sites ORDER BY created_at ASC LIMIT 1').get();
+      if (oldest) db.prepare('UPDATE sites SET is_primary = 1 WHERE id = ?').run(oldest.id);
+    }
+  } catch (e) { /* sites-tabel nog leeg/afwezig bij verse init — ensurePrimarySite regelt 't */ }
+
   // v9 audit additions —————————————————————————————————————————
   // SEO/social columns the v9 template uses (most live in 001-init.sql already
