Explorer
/proc/29656/root/tmp/fast-one-27.json
← Zurück ↓ Download
{"queue_id": 27, "relative_path": "Solutions/SMA_PUBLISH_WORKFLOW_REPORT.md", "title": "SMA_PUBLISH_WORKFLOW_REPORT", "import_key": "7499d72978653e4c5f7d7462fd0743f9187ba88fc9c5df3fe0cddfc33a98e4d4", "chunk_count": 27, "created_nodes": 28, "created_relationships": 53, "body": null, "chunks": [{"chunk_key": "57564f04c5d397444b3e7289f07d90ff6055cada354eb237628fbb55d899f783", "chunk_index": 0, "heading": "SMA_PUBLISH_WORKFLOW_REPORT", "text": "# SMA_PUBLISH_WORKFLOW_REPORT\nSMA Publish Workflow MVP — Implementierungsdokumentation\nDatum: 2026-05-28 | Status: PRODUKTIV\n\n---", "text_hash": "c01141594a475c5693761bc8996a57419e2b442eccf757e12fb006c1bf6461ed"}, {"chunk_key": "78f3f05f46cc3e0c0f226525a90a1287603136538bdf407f3d92158413c39e41", "chunk_index": 1, "heading": "Pflichturteil", "text": "# SMA_PUBLISH_WORKFLOW_REPORT\nSMA Publish Workflow MVP — Implementierungsdokumentation\nDatum: 2026-05-28 | Status: PRODUKTIV\n\n---\n## Pflichturteil\n\n**VOLLSTAENDIG IMPLEMENTIERT**\n\nAlle 6 Status-Werte, alle Operator-Aktionen, Queue-Sektion, Archiv-Sektion und Duplikat-Schutz sind im Cockpit aktiv. Keine echten Social-APIs. Reiner manueller Workflow — exakt wie spezifiziert.\n\n---", "text_hash": "b49aa03c5a3498c1f403d97736a66e3d31ba0031546aecaa9a68f94b1695b22a"}, {"chunk_key": "d1423d521bca66f5e9afea67de71f9660d6451bb965d311fb63093b1a9b50cf4", "chunk_index": 2, "heading": "Geaenderte Dateien", "text": "-Sektion, Archiv-Sektion und Duplikat-Schutz sind im Cockpit aktiv. Keine echten Social-APIs. Reiner manueller Workflow — exakt wie spezifiziert.\n\n---\n## Geaenderte Dateien\n\n| Datei | Aenderung | Backup |\n|-------|-----------|--------|\n| `/opt/struktur/social-media-radar/signals.db` | 2 neue Spalten + 1 neue Tabelle | — |\n| `/opt/struktur/social-media-agent/app.py` | 5 neue API-Routen | `app.py.bak.publish_workflow` |\n| `/opt/struktur/social-media-agent/templates/cockpit.html` | 7 Patches | `cockpit.html.bak.publish_workflow` |\n| `K:\\Projekte-AG\\Hermes Agent\\deploy\\sma_pw_migrate.py` | Migrationsskript (lokal) | — |\n| `K:\\Projekte-AG\\Hermes Agent\\deploy\\sma_pw_routes.py` | Routen-Patch (lokal) | — |\n| `K:\\Projekte-AG\\Hermes Agent\\deploy\\sma_pw_cockpit.py` | HTML-Patch (lokal) | — |\n\n---", "text_hash": "2a7efaa5ad68ebcbec8a633362bdcc944e3198441830bb6aa0a2f4f1e08d1e5b"}, {"chunk_key": "056c64e55dd0b5be9140edd2a902e875fbacfdcf35929f5f674d1d26bb7d4dfd", "chunk_index": 3, "heading": "1. Datenmodell", "text": "s Agent\\deploy\\sma_pw_routes.py` | Routen-Patch (lokal) | — |\n| `K:\\Projekte-AG\\Hermes Agent\\deploy\\sma_pw_cockpit.py` | HTML-Patch (lokal) | — |\n\n---\n## 1. Datenmodell", "text_hash": "2b1f4f94d73db72b0e446e8e3053afaa8d9ad714a5539dc1ee62283d54f1b0b6"}, {"chunk_key": "d93afc2b879ceca39d348fff688ca5e48b3eabc62ea65cd8e0933828d794b35f", "chunk_index": 4, "heading": "Neue Spalten in `signals`", "text": "## 1. Datenmodell\n### Neue Spalten in `signals`\n\n| Spalte | Typ | Default | Beschreibung |\n|--------|-----|---------|--------------|\n| `publish_status` | TEXT | NULL | Aktueller Publish-Workflow-Status |\n| `publish_status_at` | TEXT | NULL | ISO-Timestamp der letzten Status-Aenderung |", "text_hash": "91cc6c8bfd1dec35462a307ee399e234da0811d3954f22e54bb99a1bfe422093"}, {"chunk_key": "18c946e2518580cbe26e594e682483ddcae99a4270d233e3c3bdea27f85fbf31", "chunk_index": 5, "heading": "Neue Tabelle `posting_log`", "text": "publish_status` | TEXT | NULL | Aktueller Publish-Workflow-Status |\n| `publish_status_at` | TEXT | NULL | ISO-Timestamp der letzten Status-Aenderung |\n### Neue Tabelle `posting_log`\n\n```sql\nCREATE TABLE posting_log (\n    log_id          TEXT PRIMARY KEY,\n    signal_id       TEXT NOT NULL,\n    posted_at       TEXT NOT NULL,\n    platform        TEXT DEFAULT '',\n    caption_used    TEXT DEFAULT '',\n    visual_path     TEXT DEFAULT '',\n    topic_normalize TEXT DEFAULT '',\n    operator_note   TEXT DEFAULT '',\n    FOREIGN KEY(signal_id) REFERENCES signals(signal_id)\n)\n```\n\nIndizes: `idx_plog_signal`, `idx_plog_posted`, `idx_plog_topic`", "text_hash": "b4af1c54540a08e7109e058d764a8838f58b38e6ebe954e3a7d58e58ba4163a0"}, {"chunk_key": "9b794414e1a6b335e5f437c801dedede45425df038a73246bc153159d54f3798", "chunk_index": 6, "heading": "Status-Werte", "text": "ote   TEXT DEFAULT '',\n    FOREIGN KEY(signal_id) REFERENCES signals(signal_id)\n)\n```\n\nIndizes: `idx_plog_signal`, `idx_plog_posted`, `idx_plog_topic`\n### Status-Werte\n\n| Status | Bedeutung | Setzen per |\n|--------|-----------|------------|\n| `NULL` | Neu / ungeprueft | Default |\n| `geprueft` | Operator hat Signal begutachtet | Button ✅ |\n| `paket_generiert` | Posting-Paket erzeugt | Button 📦 (bei Paket-Generierung) |\n| `bereit_zum_posten` | Freigegeben fuer naechsten Post | Button 📋 |\n| `gepostet` | Manuell als gepostet markiert | Button 🚀 |\n| `verworfen` | Aus Workflow entfernt | Button ❌ |\n\n---", "text_hash": "ea5812686af7e33668cb219270c480612980a78a1467ae66380bdfac083f9785"}, {"chunk_key": "3d728c23adabd86539e8f88f58dafd446907e14a7c5f3485cd66f50f10118da1", "chunk_index": 7, "heading": "2. API-Routen", "text": "ben fuer naechsten Post | Button 📋 |\n| `gepostet` | Manuell als gepostet markiert | Button 🚀 |\n| `verworfen` | Aus Workflow entfernt | Button ❌ |\n\n---\n## 2. API-Routen", "text_hash": "41b45cccaa49e46af6c4f08fe73a73c826a451f8d8df7a51ca5ae1b7a2f6b83a"}, {"chunk_key": "ba189127b4f0676c9f21d12c105db7374f50d9e9afa4ea95ddd5ecfeedab562a", "chunk_index": 8, "heading": "`POST /api/signal/<signal_id>/publish-status`", "text": "## 2. API-Routen\n### `POST /api/signal/<signal_id>/publish-status`\nSetzt `publish_status` eines Signals.\n\n**Request:** `{\"publish_status\": \"geprueft\"}`\n**Response:** `{\"ok\": true, \"publish_status\": \"geprueft\"}`\n**Validierung:** Nur Werte aus `{geprueft, paket_generiert, bereit_zum_posten, gepostet, verworfen}`", "text_hash": "25e8b615aece7dc42833d9cf4fa0d7f7a784ec8a1839394490701054460d7247"}, {"chunk_key": "0e856f19744c8d13638af10c03c5fb62d6b184eeabf1cf7007a8905651568384", "chunk_index": 9, "heading": "`POST /api/signal/<signal_id>/mark-posted`", "text": "e:** `{\"ok\": true, \"publish_status\": \"geprueft\"}`\n**Validierung:** Nur Werte aus `{geprueft, paket_generiert, bereit_zum_posten, gepostet, verworfen}`\n### `POST /api/signal/<signal_id>/mark-posted`\nMarkiert Signal als gepostet + schreibt `posting_log` Eintrag.\n\n**Request:** `{\"platform\": \"facebook\", \"caption_used\": \"...\", \"visual_path\": \"...\", \"operator_note\": \"...\"}`\n**Response:** `{\"ok\": true, \"log_id\": \"uuid\", \"posted_at\": \"2026-...\"}`", "text_hash": "2cc6b2b9bfc65f7a380c0d7281b5e1706fb7a8396809de71526f989bfbf9d8e5"}, {"chunk_key": "7a9eb9e7639fad318f58724a14549d2a2294b301a6b8aee631f1d43737ef6753", "chunk_index": 10, "heading": "`GET /api/publish/queue`", "text": "cebook\", \"caption_used\": \"...\", \"visual_path\": \"...\", \"operator_note\": \"...\"}`\n**Response:** `{\"ok\": true, \"log_id\": \"uuid\", \"posted_at\": \"2026-...\"}`\n### `GET /api/publish/queue`\nLiefert alle Signale mit `publish_status='bereit_zum_posten'`, neueste zuerst.\n\n**Response:** `{\"ok\": true, \"count\": 2, \"items\": [...]}`", "text_hash": "b56aafcebe50b5df5629d00919092ced7ba427ad0d1441b998ebf7a12f9c1207"}, {"chunk_key": "c602aeb19fee40813feeb3e24bd1e1e4adf01c3199bb3eb78737f9a1e571a0df", "chunk_index": 11, "heading": "`GET /api/publish/archive?limit=50`", "text": "ublish/queue`\nLiefert alle Signale mit `publish_status='bereit_zum_posten'`, neueste zuerst.\n\n**Response:** `{\"ok\": true, \"count\": 2, \"items\": [...]}`\n### `GET /api/publish/archive?limit=50`\nLiefert `posting_log` Eintraege inkl. Signal-Metadaten, neueste zuerst.\n\n**Response:** `{\"ok\": true, \"count\": 1, \"items\": [...]}`", "text_hash": "bd66d4f6efa1526fa9fc1b5c4d44b62a625fd38f1fb3801a22f7b5d6e14646fc"}, {"chunk_key": "78a9f41c2c58ada559735de70227c18a66d5d21af8874a050e1630c992b2d631", "chunk_index": 12, "heading": "`GET /api/signal/<signal_id>/dup-check`", "text": "sh/archive?limit=50`\nLiefert `posting_log` Eintraege inkl. Signal-Metadaten, neueste zuerst.\n\n**Response:** `{\"ok\": true, \"count\": 1, \"items\": [...]}`\n### `GET /api/signal/<signal_id>/dup-check`\nPrueft ob Signal mit aehnlichem Thema in letzten 72h gepostet wurde.\n\n**Response (kein Duplikat):** `{\"ok\": true, \"dup\": false}`\n**Response (Duplikat):** `{\"ok\": true, \"dup\": true, \"matched_signal_id\": \"...\", \"posted_at\": \"...\", \"platform\": \"facebook\", \"hours_ago\": 14.5}`\n\n**Duplikat-Logik:** `topic_normalize` = erstes 60 Zeichen des bereinigten Topics (lowercase, Sonderzeichen entfernt). Kein Hard-Block — nur Advisory-Warnung.\n\n---", "text_hash": "2c41791db4264c4be5bb47567c17c9475404605e098e61b69296b771df5bfd53"}, {"chunk_key": "d2a2001bb3e1cf170b37fef7a991bfa87c2fc1a41b55c0d80dbeed54bb1357b0", "chunk_index": 13, "heading": "3. Cockpit-Aenderungen", "text": "ogik:** `topic_normalize` = erstes 60 Zeichen des bereinigten Topics (lowercase, Sonderzeichen entfernt). Kein Hard-Block — nur Advisory-Warnung.\n\n---\n## 3. Cockpit-Aenderungen", "text_hash": "0274a36b1fc4282f796b6cf62a76a42eb26f146c7fbbf3f1a3e7d077c04ff35b"}, {"chunk_key": "74bd4dae8acfff50bcd53733e4c548c3eecdbffde42dc992fd7684ee64bbf727", "chunk_index": 14, "heading": "Neue Tabs", "text": "## 3. Cockpit-Aenderungen\n### Neue Tabs\n- **\"Bereit\"** — Zeigt Queue (`publish_status='bereit_zum_posten'`), laedt bei Tab-Wechsel\n- **\"Gepostet\"** — Zeigt Archiv (posting_log), laedt bei Tab-Wechsel", "text_hash": "8ca20530766ed45f9b8e3e1d09796ec8e70c1cf370a60592514d7d6dcd7c36cc"}, {"chunk_key": "4f910ffb2e64be90fb857a190ea67ea41f443e4a5fc9b7c2e2560d7f4ce9e069", "chunk_index": 15, "heading": "Signal-Panel — Neue Aktions-Buttons (Nächste Schritte)", "text": "it\"** — Zeigt Queue (`publish_status='bereit_zum_posten'`), laedt bei Tab-Wechsel\n- **\"Gepostet\"** — Zeigt Archiv (posting_log), laedt bei Tab-Wechsel\n### Signal-Panel — Neue Aktions-Buttons (Nächste Schritte)\n```\n✅ Als geprüft markieren    → doPubStatus(sid, 'geprueft')\n📋 Bereit zum Posten        → doPubStatus(sid, 'bereit_zum_posten') + Duplikat-Check\n🚀 Als gepostet markieren   → doMarkPosted(sid) [Plattform-Prompt]\n❌ Verwerfen                → doPubStatus(sid, 'verworfen') [Confirm-Dialog]\n```", "text_hash": "13f31bc9ed08ad755b19ecb84acde1a076c7536b172286a15f2ce66dc0fb126f"}, {"chunk_key": "efcf5a61c195e9609664dca085fd8d6fca3c28f5db5069511403d7d15fcfcd22", "chunk_index": 16, "heading": "Queue-Ansicht (\"Bereit\"-Tab)", "text": "heck\n🚀 Als gepostet markieren   → doMarkPosted(sid) [Plattform-Prompt]\n❌ Verwerfen                → doPubStatus(sid, 'verworfen') [Confirm-Dialog]\n```\n### Queue-Ansicht (\"Bereit\"-Tab)\n- Signal-Titel, Kategorie, Score, Plattform-Empfehlung\n- \"Bereit seit\" Timestamp\n- Direkter \"🚀 Als gepostet markieren\"-Button je Eintrag", "text_hash": "b86c4ee792fd2886d0f3394db9144dfc8fb8cc2d41c5ea8ef737d2f213bc321f"}, {"chunk_key": "a88ceb42a6f824982b0584fe085efd313f2467b3415d1d780a002cfba72b0203", "chunk_index": 17, "heading": "Archiv-Ansicht (\"Gepostet\"-Tab)", "text": "\"Bereit\"-Tab)\n- Signal-Titel, Kategorie, Score, Plattform-Empfehlung\n- \"Bereit seit\" Timestamp\n- Direkter \"🚀 Als gepostet markieren\"-Button je Eintrag\n### Archiv-Ansicht (\"Gepostet\"-Tab)\n- Titel, Kategorie, Plattform, Posted-Timestamp\n- Neueste zuerst", "text_hash": "14723c88aaba22b9bcdd010915a445a2fc36dda98372181cbfcda68f3a999aff"}, {"chunk_key": "6150afad73098682eb008e52f407921c2517224e769926a928963767baecd9cc", "chunk_index": 18, "heading": "CSS-Stile (publish_status Badges)", "text": "### Archiv-Ansicht (\"Gepostet\"-Tab)\n- Titel, Kategorie, Plattform, Posted-Timestamp\n- Neueste zuerst\n### CSS-Stile (publish_status Badges)\n\n| Status | Farbe |\n|--------|-------|\n| `geprueft` | Blau (#60a5fa) |\n| `paket_generiert` | Lila (#a78bfa) |\n| `bereit_zum_posten` | Gruen (#34d399) |\n| `gepostet` | Hell-Gruen (#4ade80) |\n| `verworfen` | Rot (#f87171) |", "text_hash": "439d8401d377ff3d1f7f86e401f61c3b10c865003aeb4c74939c5a81435d46c6"}, {"chunk_key": "516600b946aaf8804a9d5a70c396b24408eb72c9220008082cc4f37c51297cf6", "chunk_index": 19, "heading": "JS-Funktionen (neu)", "text": "| `paket_generiert` | Lila (#a78bfa) |\n| `bereit_zum_posten` | Gruen (#34d399) |\n| `gepostet` | Hell-Gruen (#4ade80) |\n| `verworfen` | Rot (#f87171) |\n### JS-Funktionen (neu)\n\n| Funktion | Zweck |\n|----------|-------|\n| `doPubStatus(sid, ps)` | Status setzen + Duplikat-Check bei bereit_zum_posten |\n| `doMarkPosted(sid)` | Plattform-Prompt + mark-posted API |\n| `loadQueue()` | Queue-Tab laden (REST-Fetch) |\n| `loadArchive()` | Archiv-Tab laden (REST-Fetch) |\n| `_pwToast(msg)` | Gruener Bestaetigungs-Toast unten rechts |\n\n---", "text_hash": "6b74fbc792d76edf674290b99e81c0761d61af993e57671110d8432f0110316f"}, {"chunk_key": "61182abb707fd06158485cb9c5bf795fd0baddd92d2a493363f1f06213eea760", "chunk_index": 20, "heading": "4. Testergebnisse", "text": "Queue-Tab laden (REST-Fetch) |\n| `loadArchive()` | Archiv-Tab laden (REST-Fetch) |\n| `_pwToast(msg)` | Gruener Bestaetigungs-Toast unten rechts |\n\n---\n## 4. Testergebnisse\n\n| Test | Erwartung | Ergebnis |\n|------|-----------|----------|\n| T1: Neues Signal | `publish_status = NULL` | PASS |\n| T2: geprueft markieren | `{\"ok\": true, \"publish_status\": \"geprueft\"}` | PASS |\n| T3: paket_generiert | Status korrekt gesetzt | PASS |\n| T4: bereit_zum_posten | Status gesetzt, Queue zeigt 2 Eintraege | PASS |\n| T5: mark-posted | Log-Eintrag in posting_log, Status = gepostet | PASS |\n| T5b: Archiv-Endpunkt | count=1, posted_at korrekt | PASS |\n| T6: Duplikat-Check | dup=true bei gleichem Signal (0.0h), dup=false bei anderem | PASS |\n| T7: verworfen | Status gesetzt, Queue zeigt 1 (nicht verworfen) | PASS |\n| T8: Ungueltiger Status | HTTP 400 + Fehlermeldung | PASS |\n\n**8/8 Tests PASS**\n\n---", "text_hash": "37ed5c752222fec9c874f640f6699b2946a8e450945d33b96b776ad55deacabd"}, {"chunk_key": "3fdfabd525da989c3ded47817115e5a392c260bdf5d56304130653c73d691747", "chunk_index": 21, "heading": "5. Status-Uebersicht", "text": "orfen | Status gesetzt, Queue zeigt 1 (nicht verworfen) | PASS |\n| T8: Ungueltiger Status | HTTP 400 + Fehlermeldung | PASS |\n\n**8/8 Tests PASS**\n\n---\n## 5. Status-Uebersicht\n\n```\nSignal Eingang\n     |\n     v\n  [NULL/neu]\n     |\n  ✅ geprueft markieren\n     v\n  [geprueft]\n     |\n  📦 Paket generiert (optional)\n     v\n  [paket_generiert]\n     |\n  📋 Bereit zum Posten\n     v\n  [bereit_zum_posten] ──── QUEUE TAB ──── 🔔 Duplikat-Check (72h Advisory)\n     |\n  🚀 Als gepostet markieren (Plattform-Prompt)\n     v\n  [gepostet] ──────────── ARCHIV TAB ──── posting_log Eintrag\n\nJederzeit:\n  ❌ Verwerfen → [verworfen] (nach Confirm-Dialog)\n```\n\n---", "text_hash": "1c9f8d65bd81a6ad30fdeb3749a0b6f5b3fce977bb9a5d9671120c4073406997"}, {"chunk_key": "2582c28e640fcc772f0ba6da8c2377364ad248c4b75b8d36ae01d60b8ce39a4a", "chunk_index": 22, "heading": "6. Offene Risiken", "text": "rm-Prompt)\n     v\n  [gepostet] ──────────── ARCHIV TAB ──── posting_log Eintrag\n\nJederzeit:\n  ❌ Verwerfen → [verworfen] (nach Confirm-Dialog)\n```\n\n---\n## 6. Offene Risiken\n\n| Risiko | Schwere | Beschreibung |\n|--------|---------|--------------|\n| Keine Status-Transition-Validierung | NIEDRIG | Operator kann z.B. von \"verworfen\" zu \"bereit_zum_posten\" wechseln. Kein harter Schutz -- akzeptabel fuer MVP. |\n| Duplikat-Check topic_normalize zu aggressiv | NIEDRIG | \"Mallorca hat europaweit...\" und \"Mallorca Zeitung: Luftfeuchtigkeit...\" werden als NICHT-Duplikate erkannt, wenn topic_de unterschiedlich. Beabsichtigt: nur echte Duplikate blockieren. |\n| `paket_generiert` noch nicht automatisch gesetzt | NIEDRIG | Wenn Operator das Posting-Paket erzeugt (📦-Button), wird der Status noch nicht automatisch auf `paket_generiert` gesetzt. Muss manuell gesetzt werden oder bei Paket-API integriert werden. |\n| Kein Filter \"verworfen\" aus Radar-Liste | TRIVIAL | Verworfene Signale sind weiterhin sichtbar (nur leicht ausgeblendet). Kein Filter-Tab. Akzeptabel. |\n\n---", "text_hash": "4e123c860df92e747106fd693aba5962477b28bfc68e7f3a7ba87e0546151487"}, {"chunk_key": "46020df1d3097250d1b6e11a212786efa5cf21f6c53fbd1b079f8e286cab5600", "chunk_index": 23, "heading": "7. Naechste sinnvolle Evolutionsstufe", "text": "lter \"verworfen\" aus Radar-Liste | TRIVIAL | Verworfene Signale sind weiterhin sichtbar (nur leicht ausgeblendet). Kein Filter-Tab. Akzeptabel. |\n\n---\n## 7. Naechste sinnvolle Evolutionsstufe", "text_hash": "57fab73405cdb17bec82760dd1ab46c61fc8470f2a44477dac27dbd21bfe438b"}, {"chunk_key": "a43474859c57d69ab695f96f9194eb2b8efc9249631bdcc5fd760666b1c4c3e0", "chunk_index": 24, "heading": "Kurzfristig (1-2 Sessions)", "text": "## 7. Naechste sinnvolle Evolutionsstufe\n### Kurzfristig (1-2 Sessions)\n1. **Auto-Status bei Paket-Generierung:** `api_generate_package()` setzt automatisch `publish_status='paket_generiert'`\n2. **Caption in posting_log:** Beim \"als gepostet\"-Dialog optional die verwendete Caption speichern\n3. **Queue sortierbar:** nach Score / Plattform / Datum", "text_hash": "d3d7ccc5ad5d4232b10efcc2b46071e979822199b290bd3812ec95b60c7c56c4"}, {"chunk_key": "2de46dcc3a70eb124ba0eaf41a9f9e559984a0d255d8609628e12c49f0eff1a6", "chunk_index": 25, "heading": "Mittelfristig (nach Go-live)", "text": "Caption in posting_log:** Beim \"als gepostet\"-Dialog optional die verwendete Caption speichern\n3. **Queue sortierbar:** nach Score / Plattform / Datum\n### Mittelfristig (nach Go-live)\n4. **Social-API-Integration:** Meta Graph API → tatsaechliches Posting aus Queue-Tab\n5. **Geplante Posts:** `scheduled_at` Feld in posting_log, Cronjob-basiertes Auto-Posting\n6. **Posting-Statistiken:** Posted/Woche, Kategorien-Verteilung, Performance-Tracking", "text_hash": "cce087e69ffeb6b64bd39b5c9fb4224fac7a7a7625a13ea33e33811724511a79"}, {"chunk_key": "61872499a1ccbfa4cb1ace32002b1f29b01a6c3cdcdc2ee5bcc3bea6ad8b6857", "chunk_index": 26, "heading": "Langfristig", "text": "cheduled_at` Feld in posting_log, Cronjob-basiertes Auto-Posting\n6. **Posting-Statistiken:** Posted/Woche, Kategorien-Verteilung, Performance-Tracking\n### Langfristig\n7. **Multi-Operator:** Wer hat was gepostet (operator_id Feld)\n8. **Engagement-Rueckmeldung:** Likes/Kommentare manuell erfassen fuer Lernschleife\n\n---\n\n*Erstellt: 2026-05-28 | Autor: AG (Claude Sonnet 4.6)*\n*Tests: 8/8 PASS | API-Routen: 5 | DB-Aenderungen: 2 Spalten + 1 Tabelle | Cockpit-Patches: 7/7*", "text_hash": "f762ffabdeecb520a390cb02e8936d5a496057df1638bd469b4f5da3f4cecd43"}], "elapsed_s": 0.098}