Explorer
/opt/struktur/AA-046.md
← Zurück ↓ Download
# AA-046 – Vollständige MAS/AS-Architekturtrennung

**Auftrag:** AA-046, direkte Fortsetzung von AA-045  
**Ausführungsdatum:** 2026-08-28  
**Status:** ERLEDIGT – alle zentralen Trennungs- und Testkriterien nachgewiesen.

## 1. Ausgangszustand aus AA-045

AA-045 hatte den gemeinsamen `sma_core` identifiziert, MAS explizit gebunden und die AS-Verzeichnisse angelegt. Offen waren die physischen AS-Datenbanken, die AS-Runtime sowie der vollständige Isolationstest.

Produktive MAS-Pfade vor AA-046:

- Signals: `/var/lib/sma-data/signals.db`
- Cases/Studio: `/opt/struktur/social-media-agent/cases.db`
- MAS-Signale vor/weiterhin: 2.101
- MAS-Publication-Packages vor/weiterhin: 35

## 2. Backup-Prüfung

Das AA-045-Backup ist vollständig vorhanden und lesbar:

- `/root/backups-aa045-20260828T185539Z`
- `opt-social-media.tar.gz`: 524.596.098 Bytes, SHA-256 `b3eda33691293a305d36ffd23c95ae9435641869c58a8cd08581b1725cf30d02`
- `varlib-sma-data.tar.gz`: 9.905.936 Bytes, SHA-256 `e2fb65fea3a49e61f11e492c771ec217fa86bd4f323b00394d4f3033725670ef`
- `SHA256SUMS`: SHA-256 `737e9686ce6fb40ffb762a7c72c8e364754c39d1d70dfe2cf91b9a5c7439428a`

Inkrementelles AA-046-Backup der seit AA-045 geänderten Dateien:

- `/root/backups-aa046-20260828T2109Z`
- 13 Dateien
- Manifest-SHA-256: `5b58edb06c4a8635a04882c268b126cfad43167687c330dcb88a6ed91925098d`

## 3. Schema-only-Erzeugung der AS-Datenbanken

Die AS-Datenbanken wurden als neue SQLite-Dateien erzeugt. Es wurde keine MAS-Datenbank kopiert, geleert, gelöscht oder durch `VACUUM` nach einer Massenlöschung bearbeitet.

Methode:

1. MAS-Schema ausschließlich lesend aus `sqlite_master` gelesen.
2. Tabellen-DDL, Indizes und Trigger extrahiert.
3. `user_version=0` und `application_id=0` ausgelesen.
4. Neue Dateien angelegt.
5. Ausschließlich DDL ausgeführt; `sqlite_sequence` wurde als SQLite-internes Objekt nicht manuell angelegt.
6. Integrität, Fremdschlüssel, Tabellen- und Objektgleichheit geprüft.

AS-Datenbanken:

- `/var/lib/sma-data/agent-solutions-signals.db`
  - 75 Tabellen
  - 263 vergleichbare Schemaobjekte
  - `signals=2` nach dem kontrollierten synthetischen AA-046-Test; beide mit Marker `AA046_ISOLATION_TEST`
  - `content_drafts=2`
  - `integrity_check=ok`
  - `foreign_key_check=0`
- `/var/lib/sma-data/agent-solutions-cases.db`
  - 17 Tabellen
  - 38 vergleichbare Schemaobjekte
  - `cases=0`
  - `content_items=1` synthetischer Testdatensatz
  - `publication_packages=1` synthetisches internes Testpaket
  - `integrity_check=ok`
  - `foreign_key_check=0`

Schemavergleich:

```text
signals:  source_objects=263, target_objects=263, equal=True
cases:    source_objects=38,  target_objects=38,  equal=True
```

MAS-Datenbanken nachher:

- `/var/lib/sma-data/signals.db`: `signals=2101`, unverändert
- `/opt/struktur/social-media-agent/cases.db`: `publication_packages=35`, unverändert

## 4. Runtime-Konfiguration

### MAS

- Brand: `mas` / Mallorca AirServices
- Signals DB: `/var/lib/sma-data/signals.db`
- Cases DB: `/opt/struktur/social-media-agent/cases.db`
- Knowledge: `/opt/struktur/brands/mallorca-airservices/knowledge`
- Sources: `/opt/struktur/brands/mallorca-airservices/config/sources_multi.yaml`
- Review/Bereit: `/opt/struktur/brands/mallorca-airservices/bereit`
- Artefakte: `/opt/struktur/brands/mallorca-airservices/data`

### AS

- Brand: `as` / Agent Solutions
- Signals DB: `/var/lib/sma-data/agent-solutions-signals.db`
- Cases DB: `/var/lib/sma-data/agent-solutions-cases.db`
- Knowledge: `/opt/struktur/brands/agent-solutions/knowledge`
- Sources: `/opt/struktur/brands/agent-solutions/config/sources_multi.yaml`
- Radar: `/opt/struktur/brands/agent-solutions/radar`
- Facebook: `/opt/struktur/brands/agent-solutions/facebook-studio`
- LinkedIn: `/opt/struktur/brands/agent-solutions/linkedin-studio`
- Review/Bereit: `/opt/struktur/brands/agent-solutions/bereit`
- Artefakte: `/opt/struktur/brands/agent-solutions/data`
- Posts DB: `/var/lib/sma-data/agent-solutions-posts.db`
- AS-Quellen enthalten keine kopierten MAS-Quellen. Die AS-Quellkonfiguration ist eigenständig und enthält nur AS-Themen; es wurden keine produktiven Quellen erfunden.

## 5. Service-/Prozessstruktur

- Gemeinsamer technischer Core: `/opt/struktur/social-media-radar/sma_core` sowie `/opt/struktur/social-media-core`
- MAS Legacy Studio: `social-media-agent.service`, Port 8652
- AS isolierte Studio-Runtime: `agent-solutions-social-media.service`, Port 8653
- AS systemd-Umgebung bindet explizit:
  - `SMA_BRAND_CONFIG`
  - `SMA_DATABASE_PATH`
  - `SMA_CASES_DATABASE_PATH`
  - `SMA_POSTS_DATABASE_PATH`
  - `SMA_PACKAGES_DIR`
  - `SMA_VISUALS_DIR`
- Aktiver Status: alle vier relevanten Dienste `active`:
  - `social-media-agent.service`
  - `agent-solutions-social-media.service`
  - `sma-core-api.service`
  - `agent-solutions-cockpit.service`

AS-Radar-Testlauf:

```text
SMA_BRAND_CONFIG=...agent-solutions... radar.py --report
Header: SOCIAL MEDIA RADAR — Agent Solutions
DB: /var/lib/sma-data/agent-solutions-signals.db
exit=0
```

## 6. Facebook-/LinkedIn-Studio

Der gemeinsame technische Studio-Core liegt in:

- `/opt/struktur/social-media-core/brand_studio.py`
- `/opt/struktur/social-media-radar/brand_studio.py`

Er fordert Signal und Brand-Kontext per Dependency Injection an und verweigert unterschiedliche `brand_id`-Werte. Der AS-Test erzeugte lokal:

- `/opt/struktur/brands/agent-solutions/facebook-studio/AA046_ISOLATION_TEST_facebook.txt`
- `/opt/struktur/brands/agent-solutions/linkedin-studio/AA046_ISOLATION_TEST_linkedin.txt`
- `/opt/struktur/brands/agent-solutions/bereit/AA046_ISOLATION_TEST_metadata.json`

Die Ausgabe ist `brand_id=as` zugeordnet. Es gab keinen externen Provider-Schreibaufruf und keine Publikation.

## 7. Kontrollierter AS-End-to-End-Test

Testmarker: `AA046_ISOLATION_TEST`  
Signal-ID: `ef46db3a-3d4f-4689-bd45-f94817b0bba6`

Kette:

```text
AS synthetisches Signal
→ AS signals.db
→ AS content_drafts: 2 (Facebook + LinkedIn)
→ AS Facebook-Ausgabe
→ AS LinkedIn-Ausgabe
→ AS content_items: 1
→ AS publication_packages: 1
→ AS Review/Bereit-Metadaten
```

Status: PASS. Das Testpaket steht auf `approval_status=pending`, `package_status=publish_ready`, `publication_state=not_published`. Die Testdaten bleiben gemäß Auftrag mit eindeutigem Marker bestehen.

## 8. MAS-Regression

| Test | Soll | Ist | Status | Nachweis |
|---|---|---|---|---|
| MAS-Service | active | active | PASS | `systemctl is-active` |
| MAS-Cockpit | HTTP 200 | HTTP 200, 192.882 Bytes | PASS | `http://127.0.0.1:8652/cockpit` |
| MAS Signals API | HTTP 200 | HTTP 200, 9.857 Bytes | PASS | `/api/signals?days=5&limit=3` |
| MAS Signals DB | `/var/lib/sma-data/signals.db` | exakt dieser Pfad | PASS | systemd Environment/SQLite |
| MAS Cases DB | `/opt/struktur/social-media-agent/cases.db` | exakt dieser Pfad | PASS | systemd Environment |
| MAS bestehende Test-Suites | keine Regression | 269 passed, 15 Subtests passed | PASS | `pytest` |
| MAS Agent-Suite | keine Regression | 38 passed | PASS | `pytest` |

## 9. Cross-Brand-Isolationstest

| Test | Soll | Ist | Status | Nachweis |
|---|---|---|---|---|
| A: MAS + AS Signals DB | Start verweigert | `SMA_DATABASE_PATH contradicts brand config for mas` | PASS | Runtime-Test Exit 1 |
| B: AS + MAS Signals DB | Start verweigert | `SMA_DATABASE_PATH contradicts brand config for as` | PASS | Runtime-Test Exit 1 |
| C: MAS + AS Knowledge | Start verweigert | `knowledge_path points into the other brand` | PASS | Runtime-Test Exit 1 |
| D: AS + MAS Sources | Start verweigert | `sources_path points into the other brand` | PASS | Runtime-Test Exit 1 |
| E: MAS + AS Bereit | Start verweigert | `review_path points into the other brand` | PASS | Runtime-Test Exit 1 |
| F: AS + MAS Artefakte | Start verweigert | `artifact_path points into the other brand` | PASS | Runtime-Test Exit 1 |
| G: AS-Marker in MAS-Daten/Outputs | 0 Treffer | 0 Treffer | PASS | MAS DBs und MAS Brand-Pfad durchsucht |
| H: MAS-Signal-ID in AS DB | nicht abrufbar | Trefferanzahl 0 | PASS | direkte SQLite-Abfrage |

Ergebnis: **0 unbeabsichtigte Cross-Brand-Zugriffe**.

## 10. MAS-Foreign-Key-Befunde

Die fünf Befunde sind Legacy-Datenprobleme in der unveränderten MAS-Datenbank, kein Fehler der neuen Brand-Isolation:

| Tabelle | Row-ID | Parent-Tabelle | FK-Definition | Befund | AA-046-Einfluss |
|---|---:|---|---|---|---|
| `signal_sources` | 1934 | `signals` | `signal_sources.signal_id → signals.signal_id` | Parent `signals` mit Row-ID/Referenzwert `0` nicht vorhanden | keiner nachgewiesen |
| `signal_sources` | 1935 | `signals` | `signal_sources.signal_id → signals.signal_id` | Parent `signals` mit Row-ID/Referenzwert `0` nicht vorhanden | keiner nachgewiesen |
| `signal_sources` | 1936 | `signals` | `signal_sources.signal_id → signals.signal_id` | Parent `signals` mit Row-ID/Referenzwert `0` nicht vorhanden | keiner nachgewiesen |
| `signal_sources` | 1937 | `signals` | `signal_sources.signal_id → signals.signal_id` | Parent `signals` mit Row-ID/Referenzwert `0` nicht vorhanden | keiner nachgewiesen |
| `signal_sources` | 1944 | `signals` | `signal_sources.signal_id → signals.signal_id` | Parent `signals` mit Row-ID/Referenzwert `0` nicht vorhanden | keiner nachgewiesen |

Direkter technischer Nachweis:

```text
PRAGMA integrity_check = ok
PRAGMA foreign_key_check = 5 rows
('signal_sources', 1934, 'signals', 0)
('signal_sources', 1935, 'signals', 0)
('signal_sources', 1936, 'signals', 0)
('signal_sources', 1937, 'signals', 0)
('signal_sources', 1944, 'signals', 0)
```

Keine Reparatur und keine Löschung durchgeführt.

## 11. Geänderte und neue Dateien

Wesentliche Änderungen:

- `/opt/struktur/social-media-core/brand_runtime.py` – verschärfte fail-closed Brand-/Pfadprüfung.
- `/opt/struktur/social-media-radar/brand_runtime.py` – Runtime-Kopie.
- `/opt/struktur/social-media-core/brand_studio.py` – gemeinsamer markenfähiger Facebook-/LinkedIn-Studio-Core.
- `/opt/struktur/social-media-radar/brand_studio.py` – importierbare Core-Kopie.
- `/opt/struktur/social-media-radar/radar.py` – Brand-Name im Radar-Header.
- `/opt/struktur/social-media-radar/intake/multi_intake.py` – konfigurierbarer Quellenpfad.
- `/opt/struktur/social-media-radar/multi_cluster.py` – konfigurierbarer Quellenpfad.
- `/opt/struktur/social-media-agent/db.py` – konfigurierbarer Posts-Datenbankpfad.
- `/opt/struktur/social-media-agent/cases_db.py` – expliziter Cases-Datenbankpfad.
- `/opt/struktur/social-media-agent/radar_database.py` – expliziter Signals-Datenbankpfad.
- `/etc/systemd/system/agent-solutions-social-media.service` – neue isolierte AS-Instanz auf Port 8653.
- `/etc/systemd/system/social-media-agent.service.d/aa045-brand.conf` – explizite MAS-Bindung.

Neue Konfigurationen und Pfade:

- `/opt/struktur/brands/mallorca-airservices/config/brand.json`
- `/opt/struktur/brands/agent-solutions/config/brand.json`
- getrennte MAS-/AS-Quellenkonfigurationen
- getrennte Knowledge-, Radar-, Facebook-, LinkedIn-, Review- und Artefaktpfade
- `/var/lib/sma-data/agent-solutions-signals.db`
- `/var/lib/sma-data/agent-solutions-cases.db`
- `/var/lib/sma-data/agent-solutions-posts.db`

## 12. Keine externen Publikationen

- Facebook-Veröffentlichungen: 0
- LinkedIn-Veröffentlichungen: 0
- sonstige externe Social-Media-Schreibaktionen: 0
- AS-Testpaket: `not_published`
- MAS-Publication-Events: unverändert 0

## 13. Abschlussmatrix

| Bereich | Status |
|---|---|
| Gemeinsamer Social Media Core | PASS |
| MAS Runtime | PASS |
| MAS Radar | PASS |
| MAS Facebook Studio | PASS |
| MAS LinkedIn Studio | PASS |
| MAS Persistenz | PASS |
| AS Runtime | PASS |
| AS Radar | PASS |
| AS Facebook Studio | PASS |
| AS LinkedIn Studio | PASS |
| AS Persistenz | PASS |
| AS Bereit | PASS |
| Cross-Brand-Isolation | PASS |
| MAS Regression | PASS |
| AS End-to-End | PASS |
| Rollback-Fähigkeit | PASS |

```text
Cross-Brand-Leaks gefunden: 0
Externe Veröffentlichungen: 0
Datenverluste: 0
Echte Restblocker: 0
```

## 14. Verifikation

- Vollständige Radar-Test-Suite: `269 passed, 15 subtests passed`
- Legacy-Agent-Test-Suite: `38 passed`
- MAS-Cockpit: HTTP 200
- AS-Cockpit: HTTP 200, 106.154 Bytes
- MAS-/AS-Dienste: aktiv
- AS-Datenbank-Schema: kompatibel, fachlicher Bestand nur synthetische Testdaten
- AS-Datenbank-Fremdschlüssel: 0 Befunde
- MAS-Datenbestand: unverändert

**Arbeitsauftrag AA-046 erledigt.**