Explorer
/proc/106/root/tmp/fast-one-14.json
← Zurück ↓ Download
{"queue_id": 14, "relative_path": "Runbooks/IMAP_INGESTION_PLAN.md", "title": "IMAP Ingestion Plan — Hermes Carlo", "import_key": "0197925d274cc8e75a6aa7821ae6d26cc810de5cf0cf818ca5f540ef2e95be7a", "chunk_count": 27, "created_nodes": 28, "created_relationships": 53, "body": null, "chunks": [{"chunk_key": "8295553407dde4b6a9d6f19c13f4f493a355128449ffcf04911158c765f59f7b", "chunk_index": 0, "heading": "IMAP Ingestion Plan — Hermes Carlo", "text": "# IMAP Ingestion Plan — Hermes Carlo\n\n**Version:** 1.0\n**Status:** Entwurf — noch nicht aktiviert\n**Erstellt:** 2026-05-22\n**Gilt für:** hermes-carlo\n**Pipeline:** ingest_email.py v4\n\n---", "text_hash": "7f35508b97f77e0eeec9e1ab9f4fd8f16016bb27accd0aa029a294ab60321c80"}, {"chunk_key": "c16cd94d879cb86617d0b7ed53493b366c16e3f31aa15d00b12f6de235ca866e", "chunk_index": 1, "heading": "Ziel", "text": "\n**Version:** 1.0\n**Status:** Entwurf — noch nicht aktiviert\n**Erstellt:** 2026-05-22\n**Gilt für:** hermes-carlo\n**Pipeline:** ingest_email.py v4\n\n---\n## Ziel\n\nAutomatische Abholung von Projekt-E-Mails aus einer definierten Mailbox,\nWeiterleitung in die bestehende Ingestion-Pipeline v4,\nohne manuelle .eml-Platzierung in inbox/.\n\n**Wichtig:** Kein Auto-Write in Obsidian oder Graphiti. Kein Auto-Approve.\nAlle verarbeiteten Mails landen in der Review-Queue — manueller Freigabe-Schritt bleibt Pflicht.\n\n---", "text_hash": "9a60d68a567b2220369c1f7e025104814181d66610d4a35e07702b67aad393ab"}, {"chunk_key": "047d132b37514ec3673f6ddb3271a6415559f406e3b9c9452ca0973487d07fad", "chunk_index": 2, "heading": "1. Ziel-Mailbox", "text": "te in Obsidian oder Graphiti. Kein Auto-Approve.\nAlle verarbeiteten Mails landen in der Review-Queue — manueller Freigabe-Schritt bleibt Pflicht.\n\n---\n## 1. Ziel-Mailbox\n\n| Parameter | Wert |\n|-----------|------|\n| Mailbox | Wird in `imap_config.env` konfiguriert (Platzhalter in `imap_config.example.env`) |\n| Protokoll | IMAP4 over SSL (Port 993) |\n| Anbieter | Google Workspace / Gmail — oder anderer IMAP-kompatibler Anbieter |\n| Authentifizierung | App-Passwort oder OAuth2 — **nie Hauptpasswort** |\n\n---", "text_hash": "8641a75ef75e310f916a3853e47537dd48dc65212a436a0eb0866cceb7e8645a"}, {"chunk_key": "881b4837e269e7a7792268343bc78cf93a87c17e03d5a6146764974fad03ee8b", "chunk_index": 3, "heading": "2. IMAP-Fetch-Strategie", "text": "er | Google Workspace / Gmail — oder anderer IMAP-kompatibler Anbieter |\n| Authentifizierung | App-Passwort oder OAuth2 — **nie Hauptpasswort** |\n\n---\n## 2. IMAP-Fetch-Strategie", "text_hash": "463c4bc3bd7a47fc15011e6582d402e85d936e53527316057214de0f17ca81b6"}, {"chunk_key": "20c01e9edc3621beaf3879b4a9fafd3b510561d000a127f26e34facd19cd5b28", "chunk_index": 4, "heading": "2.1 Welche Ordner werden abgeholt", "text": "## 2. IMAP-Fetch-Strategie\n### 2.1 Welche Ordner werden abgeholt\n\nNur explizit konfigurierte Ordner. Standardmäßig:\n\n```\nIMAP_FOLDERS = [\"INBOX\", \"Projekte\"]\n```\n\nKeine vollständige Mailbox. Kein Sent, kein Trash, kein Spam.\n\nOptional: Gmail-Label-Filter (`[Gmail]/All Mail` ist explizit ausgeschlossen).", "text_hash": "03f89c3b260d862270a7f35a6b78d100d41fbd6bc1c21248c475a2cc208dc109"}, {"chunk_key": "51867e2536c41b170b28c72ce32ddb6dc45ba72847fa77f281a57814215e32d6", "chunk_index": 5, "heading": "2.2 Welche Mails werden geholt", "text": "e\"]\n```\n\nKeine vollständige Mailbox. Kein Sent, kein Trash, kein Spam.\n\nOptional: Gmail-Label-Filter (`[Gmail]/All Mail` ist explizit ausgeschlossen).\n### 2.2 Welche Mails werden geholt\n\nNur **UNSEEN** (ungelesen) Nachrichten. Nach erfolgreicher Verarbeitung wird die Mail als **SEEN** markiert — niemals vorher.\n\nZusätzlich optionaler Label-Filter:\n```\nIMAP_REQUIRED_LABEL = \"Hermes\"   # leer = kein Label-Filter\n```", "text_hash": "e764c8941212088569915c33a8c7ffa01fc283e02f650e67eaa0e1f28c3f5bcf"}, {"chunk_key": "81124741d4813f88c0ef2bafce551bcb7d23ecbd5465955d1528788e7617f08b", "chunk_index": 6, "heading": "2.3 Maximale Anzahl pro Lauf", "text": " Mail als **SEEN** markiert — niemals vorher.\n\nZusätzlich optionaler Label-Filter:\n```\nIMAP_REQUIRED_LABEL = \"Hermes\"   # leer = kein Label-Filter\n```\n### 2.3 Maximale Anzahl pro Lauf\n\n```\nIMAP_MAX_PER_RUN = 5   # Harter Limit. Erster Live-Test: 1\n```\n\nNach Erreichen des Limits stoppt der Fetcher. Nächster Lauf: nächste Cron-Ausführung.", "text_hash": "d2ed6fb1ad85c7009cc93c27375b9df00e2f1c2c063f3c5f77bba2ebc88cc3a2"}, {"chunk_key": "926076000832bd71cdc9184983b9cdfc3f9fe35133decc76edd4706b10d2fb3c", "chunk_index": 7, "heading": "2.4 Reihenfolge", "text": "\nIMAP_MAX_PER_RUN = 5   # Harter Limit. Erster Live-Test: 1\n```\n\nNach Erreichen des Limits stoppt der Fetcher. Nächster Lauf: nächste Cron-Ausführung.\n### 2.4 Reihenfolge\n\nÄlteste zuerst (`ORDER BY date ASC`), damit die chronologische Verarbeitungsreihenfolge erhalten bleibt.\n\n---", "text_hash": "06f41af3aec39f0c014331eb34aeff934a832e8b4517764d5dc704a5a2652d0e"}, {"chunk_key": "8e574843aa9980f0c9f6a024363e97a43f1e61c87fc768fa61badbc95a684571", "chunk_index": 8, "heading": "3. Duplikatprüfung vor Verarbeitung", "text": "### 2.4 Reihenfolge\n\nÄlteste zuerst (`ORDER BY date ASC`), damit die chronologische Verarbeitungsreihenfolge erhalten bleibt.\n\n---\n## 3. Duplikatprüfung vor Verarbeitung\n\nVor dem Einlesen jeder Mail:\n\n1. Mail-Header (Message-ID + Subject + Date) → SHA256 berechnen\n2. Prüfung: existiert `classified/{sha256}.json`?\n3. Falls ja → Mail überspringen, als SEEN markieren, Audit-Log-Eintrag `duplicate_skip`\n4. Falls nein → Verarbeitung starten\n\nDiese Prüfung ist identisch mit der bestehenden Pipeline-Logik in `ingest_email.py`.\n\n---", "text_hash": "19a85e862ee84f82f19fbbe3627e4a49772ea97b3324c20889b059df0f7c4752"}, {"chunk_key": "1da1b46ecea5c272a0059e43f3983604b06b3189b803d91cb7ee0a5f22d844fe", "chunk_index": 9, "heading": "4. Weiterleitung in Pipeline v4", "text": "ntrag `duplicate_skip`\n4. Falls nein → Verarbeitung starten\n\nDiese Prüfung ist identisch mit der bestehenden Pipeline-Logik in `ingest_email.py`.\n\n---\n## 4. Weiterleitung in Pipeline v4\n\nDer IMAP-Fetcher ist ein **vorgelagerter Schritt** — er bereitet .eml-Dateien vor und übergibt sie an die bestehende Pipeline:\n\n```\nIMAP-Fetcher\n  └── fetch_mail() → speichert .eml in inbox/\n  └── ingest_email.py {eml_path} → Pipeline v4\n        ├── step_raw()\n        ├── step_extract()\n        ├── step_mask()\n        ├── step_classify()\n        ├── step_propose_facts()\n        └── step_review_queue()\n```\n\n**Kein direkter LLM-Aufruf im Fetcher.** Alle KI-Schritte bleiben in `ingest_email.py`.\n\nDer Fetcher schreibt die .eml-Datei in `inbox/`, ruft dann `ingest_email.py` auf und wartet auf Rückgabecode.\n\n---", "text_hash": "e152b7702055080a7a5244405328b8e3a7d9a9babcfed685d243ad52c56207ea"}, {"chunk_key": "3dadc1f33270d0ebeb7e31b5cde48a39a8f1e6f95615a9e703fea3de76a70a2d", "chunk_index": 10, "heading": "5. Fehlerhandling", "text": "itte bleiben in `ingest_email.py`.\n\nDer Fetcher schreibt die .eml-Datei in `inbox/`, ruft dann `ingest_email.py` auf und wartet auf Rückgabecode.\n\n---\n## 5. Fehlerhandling\n\n| Fehler | Verhalten |\n|--------|-----------|\n| IMAP-Verbindungsfehler | Abbruch des Runs, Audit-Log-Eintrag, nächster Versuch beim nächsten Cron |\n| Timeout (>30s) | Verbindung trennen, abbrechen, Audit-Log |\n| Pipeline-Fehler (ingest_email.py crasht) | .eml bleibt in inbox/ für manuellen Retry, Mail bleibt UNSEEN, Audit-Log `pipeline_error` |\n| PII-Fehler | Pipeline gibt Fehler zurück → Mail nach failed/, bleibt UNSEEN |\n| SHA256-Duplikat | Überspringen, als SEEN markieren, kein Pipeline-Aufruf |\n| SSL-Zertifikat ungültig | Abbruch, keine unsichere Verbindung |\n| Max-Mails erreicht | Normaler Stop, kein Fehler |\n\n**Grundregel:** Im Zweifel Mail unberührt lassen (UNSEEN, nicht gelöscht).\n\n---", "text_hash": "cebc53a3893eeadad38bbf35d55e62bfe3423b3381a6a9804536eb733f8f5d91"}, {"chunk_key": "9eebb0da59f9ad93f365d86fb42855ef567c30574fecfecbab5d6567ccd23d7d", "chunk_index": 11, "heading": "6. Audit-Logging", "text": "here Verbindung |\n| Max-Mails erreicht | Normaler Stop, kein Fehler |\n\n**Grundregel:** Im Zweifel Mail unberührt lassen (UNSEEN, nicht gelöscht).\n\n---\n## 6. Audit-Logging\n\nJede Fetch-Aktion schreibt einen Eintrag in `/opt/struktur/ingestion/email/ingestion_audit.jsonl`:\n\n```json\n{\n  \"timestamp\": \"2026-05-22T08:00:00Z\",\n  \"actor\": \"imap-fetcher\",\n  \"imap_folder\": \"INBOX\",\n  \"message_id\": \"<abc123@mail.example.com>\",\n  \"subject\": \"Re: Anfrage\",\n  \"sha256\": \"a1b2c3...\",\n  \"action\": \"fetched | duplicate_skip | pipeline_error | seen_marked\",\n  \"detail\": \"...\"\n}\n```\n\nKein separates Log — Einträge landen im bestehenden `ingestion_audit.jsonl`.\n\n---", "text_hash": "36527382e1fc37e3e212291f943436566f26ce7cd82b614957ee9d3d88a13004"}, {"chunk_key": "24ce2681d69f1e6802c054d757bc656e973019a099dc751f2f990cf1bec7401d", "chunk_index": 12, "heading": "7. Secret-Handling", "text": "icate_skip | pipeline_error | seen_marked\",\n  \"detail\": \"...\"\n}\n```\n\nKein separates Log — Einträge landen im bestehenden `ingestion_audit.jsonl`.\n\n---\n## 7. Secret-Handling", "text_hash": "cacc797c5c24f4b3d508af44dc9ccdb9cad875be55f725e672007f05a3bb20e1"}, {"chunk_key": "d7aa7d4c9a7e5ebc6360436e8906e320d8b8d716d6b27ab9437257c85752ded4", "chunk_index": 13, "heading": "Regeln (absolut)", "text": "## 7. Secret-Handling\n### Regeln (absolut)\n\n1. **Kein Passwort, kein App-Token im Code** — niemals hardcoded\n2. **Credentials nur über Umgebungsvariablen oder `.env`-Datei**\n3. **`.env`-Datei im Pfad** `/opt/struktur/hermes-carlo/ingestion/imap_config.env`\n4. **`.env`-Datei nicht committen** — liegt außerhalb jedes Git-Repos\n5. **Minimale Berechtigungen:** App-Passwort nur für IMAP-Zugriff, kein SMTP, kein Delete\n6. **OAuth2 bevorzugt** — bei Gmail: Service Account oder OAuth2 App (kein Hauptpasswort)", "text_hash": "bc0ab95a06866706b5367f45842a6726907e3c767e430a29d3e8eeb861265a62"}, {"chunk_key": "1187bf556316fc591b9f61cd314c236c4913333fb117826fc8f41ed610ed753e", "chunk_index": 14, "heading": "Ladereihenfolge", "text": "** App-Passwort nur für IMAP-Zugriff, kein SMTP, kein Delete\n6. **OAuth2 bevorzugt** — bei Gmail: Service Account oder OAuth2 App (kein Hauptpasswort)\n### Ladereihenfolge\n\n```python", "text_hash": "ccce8139a28b01c0ef7d71b474f6a0b99b6d589011a51cea3117fc6480b6414b"}, {"chunk_key": "9d74318e35ea6c1cfff93743db15dd11173a406d6100137297465f2bd880ed1b", "chunk_index": 15, "heading": "Priorität: Umgebungsvariable → .env-Datei → Fehler", "text": "### Ladereihenfolge\n\n```python\n# Priorität: Umgebungsvariable → .env-Datei → Fehler\nIMAP_HOST     = os.environ.get(\"IMAP_HOST\") or _load_env(\"IMAP_HOST\")\nIMAP_USER     = os.environ.get(\"IMAP_USER\") or _load_env(\"IMAP_USER\")\nIMAP_PASSWORD = os.environ.get(\"IMAP_PASSWORD\") or _load_env(\"IMAP_PASSWORD\")\n```\n\nWenn `IMAP_PASSWORD` leer oder nicht gesetzt: Fetcher startet nicht, schreibt Fehler in Audit-Log.\n\n---", "text_hash": "8ffc5d7ee4c77bfd681f6eada064f2cd78fd8bfad22e8192008e4e98f63aa751"}, {"chunk_key": "a62d0bee1572958645035fd7106944df5ab03cec3fbe7278f0efbf41b1399296", "chunk_index": 16, "heading": "8. Rollback / Stop-Schalter", "text": "_PASSWORD\") or _load_env(\"IMAP_PASSWORD\")\n```\n\nWenn `IMAP_PASSWORD` leer oder nicht gesetzt: Fetcher startet nicht, schreibt Fehler in Audit-Log.\n\n---\n## 8. Rollback / Stop-Schalter", "text_hash": "2c29722be901c386522b2b26bb742aa1b9788eac29fd30a5bb04583bdfcf1bf8"}, {"chunk_key": "9d51cacfa96c8d52397925e24c2ed0b93a42c7c79baba2df261c69468fdf8803", "chunk_index": 17, "heading": "Stop-Datei (sofortiger Stopp)", "text": "## 8. Rollback / Stop-Schalter\n### Stop-Datei (sofortiger Stopp)\n\n```bash\ntouch /opt/struktur/hermes-carlo/ingestion/IMAP_STOP\n```\n\nDer Fetcher prüft beim Start und vor jedem Mail-Abruf, ob diese Datei existiert.\nWenn ja: sofortiger Abbruch ohne Verarbeitung, Audit-Log-Eintrag `stop_file_detected`.\n\nEntfernen:\n```bash\nrm /opt/struktur/hermes-carlo/ingestion/IMAP_STOP\n```", "text_hash": "377407344cd6f8cc4dac16102a0d73b9953035fd8f0a1ffaa374e9d50a166287"}, {"chunk_key": "5e00be68423bc7d2030fcd847fa9c4589d1bc780874e6a73b59d82bbd5f5166d", "chunk_index": 18, "heading": "Cron deaktivieren", "text": "ofortiger Abbruch ohne Verarbeitung, Audit-Log-Eintrag `stop_file_detected`.\n\nEntfernen:\n```bash\nrm /opt/struktur/hermes-carlo/ingestion/IMAP_STOP\n```\n### Cron deaktivieren\n\n```bash\ncrontab -e   # Cron-Zeile auskommentieren oder entfernen\n```", "text_hash": "628bb7eb0d314988fbd48ff0446906cbdcc8576ac223aa6ecdbdeda84179c24b"}, {"chunk_key": "1739c8a5cb6796ca10c7e7db7b757df4e3645064161ac332d2a4b2a85793cf3e", "chunk_index": 19, "heading": "Rollback-Protokoll (falls eine Mail falsch verarbeitet wurde)", "text": "### Cron deaktivieren\n\n```bash\ncrontab -e   # Cron-Zeile auskommentieren oder entfernen\n```\n### Rollback-Protokoll (falls eine Mail falsch verarbeitet wurde)\n\n1. Betroffene SHA256 aus `classified/` löschen (wie in `prepare_rerun.py`)\n2. Review-Einträge auf `superseded` setzen\n3. .eml aus `processed/` zurück nach `inbox/` kopieren\n4. Erneut manuell mit `ingest_email.py` verarbeiten oder verwerfen\n\n---", "text_hash": "31e304e6e8b415fedf40d601d96196a40362ba24536e4d7708ca351a955ee1e4"}, {"chunk_key": "f8bf07bb4b21384e4a9288155b906c740f283677a3b907e3f0e93d7427ad382c", "chunk_index": 20, "heading": "9. Sicherheitsregeln (Zusammenfassung)", "text": "auf `superseded` setzen\n3. .eml aus `processed/` zurück nach `inbox/` kopieren\n4. Erneut manuell mit `ingest_email.py` verarbeiten oder verwerfen\n\n---\n## 9. Sicherheitsregeln (Zusammenfassung)\n\n| Regel | Status |\n|-------|--------|\n| Kein Passwort im Code | Pflicht |\n| Credentials über `.env` | Pflicht |\n| Erster Live-Test: max. 1 Mail | Pflicht |\n| Kein Auto-Delete | Pflicht — niemals |\n| SEEN erst nach erfolgreicher Verarbeitung | Pflicht |\n| UNSEEN bei Fehler beibehalten | Pflicht |\n| Kein Zugriff auf Sent/Trash/Spam | Pflicht |\n| Keine Obsidian-Writes | Pflicht |\n| Keine Graphiti-Writes | Pflicht |\n| Stop-Datei-Check beim Start | Pflicht |\n| SSL-Zertifikat validieren | Pflicht — kein `ssl_verify=False` |\n| Max-Mails-Limit harter Stopp | Pflicht |\n\n---", "text_hash": "40dcb1f2977293367c8c727d0fab9a66a308eb51f13e94033117973394972015"}, {"chunk_key": "05ad23d6ea254de2594c4500932fb244cc83cd4bfcf9a7a2bc6a70d0670a8fc1", "chunk_index": 21, "heading": "10. Erster Live-Test — Ablaufplan", "text": "p-Datei-Check beim Start | Pflicht |\n| SSL-Zertifikat validieren | Pflicht — kein `ssl_verify=False` |\n| Max-Mails-Limit harter Stopp | Pflicht |\n\n---\n## 10. Erster Live-Test — Ablaufplan\n\n**Voraussetzungen (alle erfüllt, bevor Live-Test startet):**\n- [ ] `imap_config.env` mit echten Credentials angelegt (nicht committet)\n- [ ] `IMAP_MAX_PER_RUN = 1` in Config gesetzt\n- [ ] IMAP_STOP-Datei NICHT vorhanden\n- [ ] Test-Mail in Mailbox vorhanden und als UNSEEN markiert\n- [ ] `ingest_email.py` läuft fehlerfrei (Dry-Run bestätigt)\n- [ ] Review-Queue aktuell (letzte Menge bekannt)\n\n**Ablauf:**\n1. `python3 imap_fetch.py --dry-run` → zeigt welche Mail geholt würde, aber holt nicht\n2. Output prüfen: korrekte Mailbox, korrekter Ordner, korrekte Mail\n3. Wenn OK: `python3 imap_fetch.py --max 1`\n4. Prüfen:\n   - .eml in `processed/`\n   - Review-Eintrag in `/opt/struktur/memory/review-queue/`\n   - `ingestion_audit.jsonl` enthält Fetch-Eintrag\n   - Mail in Mailbox als SEEN markiert\n   - KEINE Schreibung in Obsidian oder Graphiti\n5. Ergebnis dokumentieren (SHA256, Review-ID, Entscheidung)\n\n**Abbruchbedingungen (sofort stoppen):**\n- Pipeline-Fehler beim ersten Lauf\n- Review-Eintrag fehlt\n- Mail als SEEN markiert ohne vollständige Verarbeitung\n- Fehlerhafte SHA256-Berechnung\n\n---", "text_hash": "f7010428d2714d20b95a3dc422df43ce3ff6f08028bc4f69d1525479a95af5bc"}, {"chunk_key": "e266735f13cbacbecace47bbae5b33cb8d2c82b21a19491652cc17e83147c4f8", "chunk_index": 22, "heading": "11. Cron-Plan (nach Live-Test-Freigabe)", "text": "- Pipeline-Fehler beim ersten Lauf\n- Review-Eintrag fehlt\n- Mail als SEEN markiert ohne vollständige Verarbeitung\n- Fehlerhafte SHA256-Berechnung\n\n---\n## 11. Cron-Plan (nach Live-Test-Freigabe)\n\n```cron", "text_hash": "cf43e03f2ce880271a78f5df1791797d7804686e269810e9e659a50f187cd1c4"}, {"chunk_key": "988baca5659fd8f375c5d80cc04f9b394bac9bea8045151bba4d3e72a8df9af8", "chunk_index": 23, "heading": "IMAP-Fetcher — nach manueller Freigabe aktivieren", "text": "## 11. Cron-Plan (nach Live-Test-Freigabe)\n\n```cron\n# IMAP-Fetcher — nach manueller Freigabe aktivieren", "text_hash": "8273f193dce508b5f19f84ab6e32996047686f38c301ebfbf5ec24881bdcc6c7"}, {"chunk_key": "449d0c1009cd0b6d6dd803751b05db53a2ec1003a12865afa438d3c3b8b3fc55", "chunk_index": 24, "heading": "0 */2 * * * python3 /opt/struktur/hermes-carlo/ingestion/imap_fetch.py >> /var/log/imap-fetch.log 2>&1", "text": "# IMAP-Fetcher — nach manueller Freigabe aktivieren\n# 0 */2 * * * python3 /opt/struktur/hermes-carlo/ingestion/imap_fetch.py >> /var/log/imap-fetch.log 2>&1\n```\n\nStartet deaktiviert (auskommentiert). Erst nach erfolgreichem Live-Test und expliziter Freigabe einkommentieren.\n\nEmpfohlenes Intervall initial: alle 2 Stunden.\n\n---", "text_hash": "5ae424bbad548f993087df2d12ce4acaa8a563433e978118f0347de695c4eab8"}, {"chunk_key": "9df560b1aa38b3ca0e2fb63335cad34faf99bc15329aa77d1261932c9d4d5196", "chunk_index": 25, "heading": "12. Dateien dieses Plans", "text": "iert (auskommentiert). Erst nach erfolgreichem Live-Test und expliziter Freigabe einkommentieren.\n\nEmpfohlenes Intervall initial: alle 2 Stunden.\n\n---\n## 12. Dateien dieses Plans\n\n| Datei | Zweck |\n|-------|-------|\n| `IMAP_INGESTION_PLAN.md` | Dieser Plan |\n| `imap_config.example.env` | Config-Vorlage, keine echten Secrets |\n| `imap_config.env` | **Nicht committen** — echte Credentials (noch nicht angelegt) |\n| `imap_fetch.py` | Fetcher-Script (noch nicht erstellt) |\n| `IMAP_STOP` | Stop-Schalter (Datei anlegen = sofortiger Stopp) |\n\n---", "text_hash": "344f0154ba856f18462bd8dcfd92eb627c4bdca24d922ca399f656abe09fc691"}, {"chunk_key": "7f252aaa6bddc86b76013e39c8f2b9e9066c14cfeef9bd22685fe442a12e7987", "chunk_index": 26, "heading": "13. Offene Entscheidungen vor Implementierung", "text": "h nicht angelegt) |\n| `imap_fetch.py` | Fetcher-Script (noch nicht erstellt) |\n| `IMAP_STOP` | Stop-Schalter (Datei anlegen = sofortiger Stopp) |\n\n---\n## 13. Offene Entscheidungen vor Implementierung\n\nFolgende Punkte müssen von Carlo entschieden werden, bevor `imap_fetch.py` geschrieben wird:\n\n| Entscheidung | Optionen | Default-Vorschlag |\n|--------------|----------|-------------------|\n| Ziel-Mailbox | Welche E-Mail-Adresse? | — |\n| Auth-Methode | App-Passwort oder OAuth2? | App-Passwort (einfacher) |\n| IMAP-Ordner | Nur INBOX oder zusätzliche? | `[\"INBOX\"]` |\n| Label-Filter | Nur gelabelte Mails? | Kein Label-Filter |\n| Fetch-Intervall | Alle X Minuten/Stunden? | Alle 2 Stunden |\n| Max pro Lauf | Wie viele Mails pro Lauf? | 5 (nach erstem Test) |\n\n---\n\n*Pfad: `/opt/struktur/hermes-carlo/ingestion/IMAP_INGESTION_PLAN.md`*\n*Pipeline: `/opt/struktur/ingestion/ingest_email.py` v4*\n*Nächster Schritt: Entscheidungen oben klären → `imap_fetch.py` implementieren → Live-Test*", "text_hash": "c3839703993f007d66d3bbb905bcfb92939bc43b6a0def14f4b40b9792e6dbf3"}], "elapsed_s": 0.098}