Index: src/config/database.js
===================================================================
--- src/config/database.js	(revision ad107154f7df0224781cab7686f02aa6148d5a9e)
+++ src/config/database.js	(revision e84ce323dc022a50b67b2190764a08eff6302a1b)
@@ -405,4 +405,16 @@
     );
     CREATE INDEX IF NOT EXISTS idx_ap_blocks_target ON ap_blocks(target);
+    CREATE TABLE IF NOT EXISTS ap_guardianships (
+      id INTEGER PRIMARY KEY AUTOINCREMENT,
+      slug TEXT NOT NULL,          -- our local site in this relation (guardianship module)
+      role TEXT NOT NULL,          -- 'guardian' (slug guards other) | 'ward' (other guards slug)
+      other_uri TEXT NOT NULL,     -- the counterpart actor URI (local or remote)
+      other_handle TEXT,           -- cached @user@host for display
+      status TEXT NOT NULL,        -- 'offered' (handshake pending) | 'accepted'
+      offer_id TEXT,               -- the Offer activity id (FEP-633c section 3)
+      created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+      UNIQUE(slug, role, other_uri)
+    );
+    CREATE INDEX IF NOT EXISTS idx_ap_guardianships_slug ON ap_guardianships(slug, role, status);
     CREATE TABLE IF NOT EXISTS ap_delivery (
       id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -485,4 +497,5 @@
   ensureColumn('ap_outbox', 'to_actors', 'TEXT');   // JSON array of recipient actor URIs for direct notes
   ensureColumn('ap_outbox', 'help_request', 'INTEGER'); // FEP-633c shaer:helpRequest (ward's call for help)
+  ensureColumn('ap_mentions', 'help_request', 'INTEGER'); // inbound ward call-for-help (Guardian PWA message centre)
   ensureColumn('ap_followers', 'name', 'TEXT');    // cached display name (shaer-aa3)
   ensureColumn('ap_followers', 'handle', 'TEXT');  // @user@host
