# AA-045 – Architekturtrennung Mallorca AirServices / Agent Solutions **Ergebnis:** NICHT VOLLSTÄNDIG ABGESCHLOSSEN – technischer Sicherheitsblocker beim Anlegen des leeren Agent-Solutions-Datenbankklons. Es wurde keine produktive Social-Media-Datenbank geleert oder verändert. ## A. Ausgangsarchitektur Erfasst am 2026-08-28T18:54Z–19:05Z. - `/opt/struktur/social-media-radar` (37 MB, 2.080 Dateien): gemeinsamer SMA-Core, Collector-/Normalisierungs-/Dedup-/Scoring-/Review-Code, `sma_core`, `sma_runtime`, `sma_cockpit`, `radar.py`, `signal_db.py`, `sources_multi.yaml`. - `/opt/struktur/social-media-agent` (876 MB, 1.371 Dateien): Flask-Cockpit auf Port 8652, Facebook-/LinkedIn-Caption-/Package-/Bild-/Review-Funktionen, eigene `cases.db`, produktive Artefakte und Uploads. - `/opt/struktur/agent-solutions-cockpit`: separates Flask-Dashboard als systemd-Dienst, aber kein nachgewiesener eigener Social-Media-Radar-/Studio-/Datenfluss. - `/opt/struktur/social-media-agent-v2`: vorhandene separate, nicht produktiv angebundene Konfigurations-/Template-Basis. - Produktive Dienste: `social-media-agent.service` aktiv; `sma-core-api.service` aktiv auf 127.0.0.1:8765; `agent-solutions-cockpit.service` aktiv; `sma-core-worker.service` und `sma-core-scheduler.service` inaktiv. - Der aktive Cron-/Scheduler-Lauf wurde nicht als neuer Dienst eingerichtet; die vorhandene produktive Laufzeit ist systemd-/Service-basiert. Die relevanten Unit-Dateien wurden gesichert. - MAS-Radar-Datenbank: `/var/lib/sma-data/signals.db`, 2.101 `signals`, 2.210 `signal_sources`; zusätzlich 0 `content_queue` und 0 `content_packages`. - MAS-Studio-/Operationsdatenbank: `/opt/struktur/social-media-agent/cases.db`, 2 `cases`, 47 `content_items`, 35 `publication_packages`, 3 `media_briefs` in der jeweils vorhandenen Struktur. - Legacy-Datei `/opt/struktur/social-media-radar/signals.db` ist durch die vorhandene Guard-Logik verboten; der laufende MAS-Service verwendet `/var/lib/sma-data/signals.db`. ## B. Gefundene Vermischungen / Risiken 1. **Gemeinsamer MAS-Datenpfad ohne Markenparameter:** `sma_database.py`, `radar_database.py` und `app.py` hatten feste MAS-Defaults. Risiko: eine zweite Instanz würde bei fehlender expliziter Konfiguration MAS-Signale, Queues und Packages laden. 2. **Gemeinsamer fachlicher Quellkontext:** `sources_multi.yaml` enthält MAS-spezifische Suchthemen. Risiko: ein AS-Lauf könnte MAS-Themen übernehmen. 3. **AS-Dashboard ohne Social-Datenbindung:** `agent-solutions-cockpit` ist ein eigenständiges Dashboard für Services/Knowledge-Pipeline; ein vollständiger AS-Social-Flow war im Ist-Bestand nicht nachweisbar. Vorgenommene sichere Korrektur: eine fail-closed Brand-Bindung wurde in `/opt/struktur/social-media-core/brand_runtime.py` und als importierbare Runtime-Datei im Radar-Code angelegt. Der MAS-Dienst hat nun eine explizite MAS-Konfiguration. Die physische AS-Datenbank wurde wegen des Sicherheitswächters **nicht** angelegt. ## C. Zielarchitektur (vorgesehen, nicht vollständig ausgerollt) ```text /opt/struktur/social-media-core/brand_runtime.py /opt/struktur/brands/mallorca-airservices/ config/brand.json config/sources_multi.yaml knowledge/ radar/ facebook-studio/ linkedin-studio/ data/ bereit/ /opt/struktur/brands/agent-solutions/ config/brand.json config/sources_multi.yaml knowledge/ radar/ facebook-studio/ linkedin-studio/ data/ bereit/ ``` Der vorhandene `sma_core` bleibt der gemeinsame technische Core. Fachlicher Zustand muss je Instanz in eigenen Datenbanken, Knowledge-Pfaden, Quellen- und Output-Pfaden liegen. Diese Zielstruktur ist angelegt, aber AS-Persistenz und AS-Services sind nicht vollständig hergestellt. ## D. Geänderte Dateien - `/opt/struktur/social-media-core/brand_runtime.py` – neue fail-closed Validierung für `SMA_BRAND_CONFIG`, Datenbankpfade, Knowledge-/Quell-/Output-Pfade. - `/opt/struktur/social-media-radar/brand_runtime.py` – importierbare Kopie für die bestehende Laufzeit. - `/opt/struktur/social-media-radar/sma_database.py` – konfigurierter absoluter `SMA_DATABASE_PATH` statt ausschließlich festem Default; Legacy-Pfad bleibt verboten. - `/opt/struktur/social-media-agent/radar_database.py` – konfigurierter absoluter `SMA_DATABASE_PATH`. - `/opt/struktur/social-media-agent/cases_db.py` – `SMA_CASES_DATABASE_PATH` als expliziter, absolut aufgelöster Pfad. - `/opt/struktur/social-media-agent/app.py` – Startvalidierung via `validate_brand_runtime()`. - `/etc/systemd/system/social-media-agent.service.d/aa045-brand.conf` – explizite MAS-Bindung an Brand-Konfiguration, Radar-DB und Cases-DB. - `/opt/struktur/brands/mallorca-airservices/config/brand.json` – MAS-Bindung. - `/opt/struktur/brands/mallorca-airservices/config/sources_multi.yaml` – MAS-Quellkonfiguration, getrennte Kopie. - `/opt/struktur/brands/agent-solutions/config/brand.json` und `sources_multi.yaml` – AS-Konfigurationsentwurf; noch nicht produktiv gestartet. ## E. Datenbanken | Bestand | Status | |---|---| | `/var/lib/sma-data/signals.db` | unverändert, MAS, 2.101 Signale | | `/opt/struktur/social-media-agent/cases.db` | unverändert, MAS, 35 Publication Packages | | `/var/lib/sma-data/agent-solutions-signals.db` | NICHT ANGELEGT – Sicherheitswächter blockierte den Klon-Leervorgang | | `/var/lib/sma-data/agent-solutions-cases.db` | NICHT ANGELEGT – Sicherheitswächter blockierte den Klon-Leervorgang | Die bestehende produktive MAS-Datenbank meldet `PRAGMA integrity_check = ok`, aber `PRAGMA foreign_key_check` liefert 5 bestehende Befunde. Diese wurden nicht durch AA-045 erzeugt und nicht automatisch repariert. Es wurden keine Daten gelöscht; eine Datenmigration fand nicht statt. ## F. Backup - Backup-Pfad: `/root/backups-aa045-20260828T185539Z` - Umfang: Sourcecode von Radar, Agent, Agent-Solutions-Cockpit und v2; `/var/lib/sma-data`; systemd-Units; `/etc/sma`; SQLite-Snapshots von `signals.db`, `cases.db` und `posts.db`. - Größe: 519 MB. - SHA-256: - `opt-social-media.tar.gz`: `b3eda33691293a305d36ffd23c95ae9435641869c58a8cd08581b1725cf30d02` - `varlib-sma-data.tar.gz`: `e2fb65fea3a49e61f11e492c771ec217fa86bd4f323b00394d4f3033725670ef` - `SHA256SUMS`: `737e9686ce6fb40ffb762a7c72c8e364754c39d1d70dfe2cf91b9a5c7439428a` ## G. Tests | Test | Soll | Ist | Status | Nachweis | |---|---|---|---|---| | Python-Syntax | alle geänderten Python-Dateien kompilieren | `py_compile` ohne Fehler | PASS | Terminalausgabe `syntax=PASS` | | MAS-Service | aktiv nach Konfigurationsänderung | `active` | PASS | `systemctl is-active social-media-agent.service` | | MAS-Cockpit | HTTP 200 | HTTP 200, 192882 Bytes | PASS | `http://127.0.0.1:8652/cockpit` | | MAS-Signals-API | HTTP 200 | HTTP 200, 9857 Bytes | PASS | `/api/signals?days=5&limit=3` | | MAS-Datenbankintegrität | integrity ok, keine FK-Befunde | integrity ok, 5 FK-Befunde | FAIL/RESTPUNKT | direkte SQLite-PRAGMAs | | AS-Datenbank | physisch getrennt vorhanden | nicht vorhanden | FAIL | Pfadprüfung | | AS-End-to-End | eigener Radar/Studios/Queue | nicht ausführbar | NICHT VERIFIZIERT | keine AS-Social-Persistenz | | externe Veröffentlichung | 0 Posts | keine Publishing-API-Aktion ausgeführt | PASS | keine externen Schreibaufrufe | ## H. Cross-Brand-Test Der negative Test konnte nur teilweise ausgeführt werden. Die neue Startvalidierung verweigert eine fehlende oder widersprüchliche Brand-Konfiguration. MAS ist explizit an `/var/lib/sma-data/signals.db` und `/opt/struktur/social-media-agent/cases.db` gebunden. Ein AS-Prozess wurde jedoch wegen fehlender AS-Datenbanken nicht gestartet. Daher ist ein vollständiger Nachweis über Signale, Knowledge, Queues, Packages, Bildmetadaten und Review-Daten **nicht erbracht**. ## I. Restpunkte / echter Blocker 1. AS-Signals- und AS-Cases-Datenbank als schemaidentische, leere physische Stores anlegen; der Leervorgang muss in einem einzeln freigegebenen, nicht kombinierten Schritt erfolgen. 2. AS-Profile/Quellen/Scoring/Knowledge in der gemeinsamen Core-API vollständig provisionieren, ohne MAS-Profilwerte zu kopieren. 3. AS-Radar-/Studio-Services mit separaten Mounts, Ports, Runtime-/Artifact-Pfaden und Healthchecks anbinden. 4. Vollständige positive MAS- und AS-Regression sowie gezielte Cross-Brand-Leakage-Matrix ausführen. 5. Die 5 bereits vorhandenen Foreign-Key-Befunde der MAS-Datenbank separat untersuchen; keine Reparatur wurde ohne eigenen Auftrag vorgenommen. ## J. Abschlussstatus | Bereich | Status | |---|---| | Social Media Core | PASS – vorhandener `sma_core` identifiziert; Brand-Binding ergänzt | | MAS Radar | PASS – laufender Bestand nicht ersetzt; Service nach Änderung aktiv | | MAS Datenbank | PASS mit Restpunkt – unverändert, Integrity ok, 5 bestehende FK-Befunde | | MAS Facebook Studio | PASS – bestehender Agent-Service/Cockpit erreichbar; E2E-Contentlauf nicht erneut mutiert | | MAS LinkedIn Studio | PASS – bestehender technischer Generator vorhanden; E2E-Contentlauf nicht erneut mutiert | | MAS Bereit | PASS – bestehende Packages vorhanden; keine externe Veröffentlichung | | Agent Solutions Trennung | FAIL – AS-Datenbanken/Services nicht vollständig angelegt | | Cross-Brand-Isolation | NICHT VERIFIZIERT – vollständiger AS-Gegenlauf fehlt | | Datenmigration | PASS – keine Löschung/Migration ausgeführt; AS-Migration offen | | Rollback-Fähigkeit | PASS – Backup mit Snapshots und SHA-256 vorhanden | **Abschluss:** Der Auftrag ist wegen des echten technischen Blockers nicht vollständig erledigt. Die produktive MAS-Instanz blieb erreichbar; Datenverlust und externe Veröffentlichung wurden vermieden.