Explorer
/tmp/fast-one-13.json
← Zurück ↓ Download
{"queue_id": 13, "relative_path": "Runbooks/MANUAL_EMAIL_WORKFLOW.md", "title": "Manual Email Ingestion Workflow — Hermes Agent", "import_key": "cb4746377bdeab4fde425292eb18ace851c232f0760c0ac925515cd776bbbe33", "chunk_count": 22, "created_nodes": 23, "created_relationships": 43, "body": null, "chunks": [{"chunk_key": "31684afe526d5fb21c4cd582106dc7df3f12abacdbc5ed3e766cc2ee9cab1c87", "chunk_index": 0, "heading": "Manual Email Ingestion Workflow — Hermes Agent", "text": "# Manual Email Ingestion Workflow — Hermes Agent\n\n**Version:** 1.0\n**Status:** Verbindlich\n**Erstellt:** 2026-05-22\n**Phase:** Manuell kontrolliert — keine Dauerautomation\n\n---", "text_hash": "e97be91dac6febd2bfcd1727d3435b1f782f3225c9b8e6ebf98fb1f609d6c78b"}, {"chunk_key": "f47edaa59c7309337d6180afa99181b5750aa3bfe8db21bf622b0a24fbc66844", "chunk_index": 1, "heading": "Grundsatz", "text": "orkflow — Hermes Agent\n\n**Version:** 1.0\n**Status:** Verbindlich\n**Erstellt:** 2026-05-22\n**Phase:** Manuell kontrolliert — keine Dauerautomation\n\n---\n## Grundsatz\n\nE-Mails werden manuell und einzeln ingestiert.\nKeine automatische Mailbox-Anbindung.\nKeine Batch-Verarbeitung ohne Sichtprüfung.\nJede Ingestion ist ein bewusster Akt.\n\n---", "text_hash": "06f393de924f3d39e1ca1f6a230a8efaa44d054c28096b2195cec31dc107365d"}, {"chunk_key": "4829107c28dde6252884ee5f6150ecef58b70d6a750516490511302a4af3078e", "chunk_index": 2, "heading": "Verzeichnisstruktur", "text": "l und einzeln ingestiert.\nKeine automatische Mailbox-Anbindung.\nKeine Batch-Verarbeitung ohne Sichtprüfung.\nJede Ingestion ist ein bewusster Akt.\n\n---\n## Verzeichnisstruktur\n\n```\n/opt/struktur/ingestion/email/\n├── inbox/          ← .eml Dateien ablegen (manuell)\n├── raw/            ← Gespeicherte Original-Inhalte (SHA256.json, write-once)\n├── extracted/      ← Reiner Text aus E-Mail (SHA256.txt)\n├── classified/     ← Projektzuordnung (SHA256.json)\n├── masked/         ← PII-maskierter Text (SHA256.txt)\n├── processed/      ← Erfolgreich verarbeitete .eml Dateien\n├── failed/         ← Fehlerhafte Ingestions mit Fehlerprotokoll\n├── rejected/       ← Duplikate (Pipeline frühzeitig gestoppt)\n├── approved/       ← Nach Human-Review approved (Phase 2, noch leer)\n└── ingestion_audit.jsonl  ← Vollständiges Audit-Log\n```\n\n**Review-Queue** (außerhalb der Ingestion-Struktur):\n```\n/opt/struktur/memory/review-queue/  ← proposed_facts warten auf Human-Review\n```\n\n---", "text_hash": "2541232db874c4b7cc59fbbbc87ec6c02d414fedeb3c8c03b1fe0d4720feac4c"}, {"chunk_key": "66efb153ae5aa7fadb0561e7de88fe51e2b27818e6da3fbac07f8f541d68e204", "chunk_index": 3, "heading": "Workflow", "text": "og\n```\n\n**Review-Queue** (außerhalb der Ingestion-Struktur):\n```\n/opt/struktur/memory/review-queue/  ← proposed_facts warten auf Human-Review\n```\n\n---\n## Workflow", "text_hash": "ea9c8680ddd1e0f00e1087e14f03ef472fea267727c8b528d1fc9d385651f79e"}, {"chunk_key": "d6cd0f9d8bd0b626718100e5fbc3b822c5bd873e572fdf97f66f434ac92cb22b", "chunk_index": 4, "heading": "Schritt 1 — .eml Datei vorbereiten", "text": "## Workflow\n### Schritt 1 — .eml Datei vorbereiten\nE-Mail im .eml Format exportieren (Thunderbird, Apple Mail, Outlook: \"Als .eml speichern\").", "text_hash": "6a456337cd06d653216939f7881b66963a83ff91f84f49483cd6e23d09aebb68"}, {"chunk_key": "b318674e830126913cd2310728bef188d9eebac0eabdbdc12ad5151105a81018", "chunk_index": 5, "heading": "Schritt 2 — Datei in inbox/ ablegen", "text": "### Schritt 1 — .eml Datei vorbereiten\nE-Mail im .eml Format exportieren (Thunderbird, Apple Mail, Outlook: \"Als .eml speichern\").\n### Schritt 2 — Datei in inbox/ ablegen\n```bash\ncp /pfad/zur/email.eml /opt/struktur/ingestion/email/inbox/\n```", "text_hash": "a902367b01f5c329e2f9f0af0942b22d74edd93b90c5aab0561623fc65e77dbb"}, {"chunk_key": "53a13234e93b02ac1007185f7fbc17df5b5ca0aa28eff622b713551f956847ca", "chunk_index": 6, "heading": "Schritt 3 — Ingestion manuell auslösen", "text": "### Schritt 2 — Datei in inbox/ ablegen\n```bash\ncp /pfad/zur/email.eml /opt/struktur/ingestion/email/inbox/\n```\n### Schritt 3 — Ingestion manuell auslösen\n```bash\npython3 /opt/struktur/ingestion/ingest_email.py \\\n  /opt/struktur/ingestion/email/inbox/email.eml\n```", "text_hash": "fd76a66eba319360466281b71b63a32bb1cedc7f48741945c6751d8fdc7325dd"}, {"chunk_key": "07f1f26c04f80bbbe82ed32f7a8823e6cda3a0e3f76ae201c5617b56f0789fe9", "chunk_index": 7, "heading": "Schritt 4 — Ergebnis prüfen", "text": "# Schritt 3 — Ingestion manuell auslösen\n```bash\npython3 /opt/struktur/ingestion/ingest_email.py \\\n  /opt/struktur/ingestion/email/inbox/email.eml\n```\n### Schritt 4 — Ergebnis prüfen\n```bash", "text_hash": "8849f97ff9146c34bea2210ccc2322a3eb3200f214635da5412fd7ae027d2781"}, {"chunk_key": "3c2249746c5b4204e84093b97b91260e415ba68ba8f35fc68ab4b3930c9b5bc4", "chunk_index": 8, "heading": "Letzte Ingestion", "text": "### Schritt 4 — Ergebnis prüfen\n```bash\n# Letzte Ingestion\ncat /opt/struktur/ingestion/email/last_ingestion_result.json", "text_hash": "5da2f1ca6846e69f0a5a1f843cc25ba030dbd40c3e47015c8289e7737e007621"}, {"chunk_key": "1519cd117e5c8e16ee448cefdc1d462bce7ce7892cda20a268cee89895c3591d", "chunk_index": 9, "heading": "Audit-Log", "text": "# Letzte Ingestion\ncat /opt/struktur/ingestion/email/last_ingestion_result.json\n# Audit-Log\ntail -20 /opt/struktur/ingestion/email/ingestion_audit.jsonl", "text_hash": "f47e3a9d74a36ccadba0def6a98ae30ddf3680a2ec7c49f37eff4b5d8fc0b4b9"}, {"chunk_key": "277cad8d02c7e049933bc2ad9ea4993762b823e9d602e36f542167e1363bf6f2", "chunk_index": 10, "heading": "Review-Queue", "text": "# Audit-Log\ntail -20 /opt/struktur/ingestion/email/ingestion_audit.jsonl\n# Review-Queue\nls /opt/struktur/memory/review-queue/\n```", "text_hash": "4f9078593769985cacb6e5a0733c6d48bf5a774593c6ca3b722b67ff0a419119"}, {"chunk_key": "a12b7c5dcab067f58974f8bcbce106bf1446f2b22f0391f72a336f9d743ede25", "chunk_index": 11, "heading": "Schritt 5 — Review-Queue abarbeiten", "text": "# Review-Queue\nls /opt/struktur/memory/review-queue/\n```\n### Schritt 5 — Review-Queue abarbeiten\nManuell nach REVIEW_DECISION_PROTOCOL.md.\n\n---", "text_hash": "43c7003ea1830ec7d025e194546238d052e195937646320a0daed1cf459e0c27"}, {"chunk_key": "2555a74fd8490fd041a2a8fbaf2bf0547153a557bbf749283003bd47c3d397a8", "chunk_index": 12, "heading": "Pipeline intern (automatisch bei Aufruf)", "text": "### Schritt 5 — Review-Queue abarbeiten\nManuell nach REVIEW_DECISION_PROTOCOL.md.\n\n---\n## Pipeline intern (automatisch bei Aufruf)\n\n```\n.eml Datei\n    │\n    ▼\nSHA256 berechnen (über Message-ID + Subject + Date)\n    │\n    ▼ Duplikat? → rejected/ + Pipeline stop\n    │\n    ▼\nraw/ speichern (from/to sofort maskiert)\n    │\n    ▼\nText extrahieren (Subject + Body, plain text)\n    │\n    ▼\nPII maskieren (E-Mail, Telefon, IBAN, API-Keys, Passwörter)\n    │\n    ▼\nProjekt erkennen (Keyword-Matching, Score-basiert)\n    │\n    ▼\nRetrieval (POST /retrieval/context)\n    │\n    ▼\nproposed_facts erzeugen (status: inferred, max. 5)\n    │\n    ▼\nReview-Queue Einträge erstellen\n    │\n    ▼  Erfolg → processed/\n    │  Fehler → failed/ + Fehlerprotokoll\n    ▼\nAudit-Log aktualisieren\n```\n\n---", "text_hash": "20ee269050cd6cefd410351b3dada1752277f669a2f89bc9077f3e25eecfdfca"}, {"chunk_key": "a5f7aa9da11846f1b166c5d9f33aa8e8044c5809c939ed37cf0cc9625929338b", "chunk_index": 13, "heading": "Regeln", "text": "   ▼\nReview-Queue Einträge erstellen\n    │\n    ▼  Erfolg → processed/\n    │  Fehler → failed/ + Fehlerprotokoll\n    ▼\nAudit-Log aktualisieren\n```\n\n---\n## Regeln\n\n| Regel | Detail |\n|-------|--------|\n| Original niemals verändern | .eml Datei nach processed/ verschoben, nicht verändert |\n| SHA256 immer zuerst | Vor jedem weiteren Schritt |\n| Duplikat → sofort stoppen | Keine redundante Verarbeitung |\n| Kein Obsidian-Write | Kein Endpunkt freigegeben |\n| Kein Graphiti-Write | Kein Endpunkt freigegeben |\n| Kein Silent Fail | Jeder Fehler → failed/ + Audit |\n| Max. 5 Facts pro E-Mail | Schutz vor Queue-Flut |\n| Status immer `inferred` | E-Mail ist unverified Quelle |\n| Kein Auto-Approve | Jeder Review einzeln per Human |\n\n---", "text_hash": "3eb4a761751892ab184960a4e925c585876c4a3418dd564e66a3d05db93880a5"}, {"chunk_key": "2f6899036697032cbb43485e5f702c41e8e761c024fe7f5989a3e5952700592a", "chunk_index": 14, "heading": "Fehlerfälle", "text": "-Mail | Schutz vor Queue-Flut |\n| Status immer `inferred` | E-Mail ist unverified Quelle |\n| Kein Auto-Approve | Jeder Review einzeln per Human |\n\n---\n## Fehlerfälle\n\n| Fehler | Verhalten |\n|--------|-----------|\n| .eml nicht lesbar / kein Body | → failed/, Audit-Eintrag, kein Review |\n| Duplikat (SHA256 bekannt) | → rejected/, Pipeline stop, kein Review |\n| Gateway nicht erreichbar | → Facts trotzdem erzeugt, Risk-Flag in Review |\n| Projekt unerkannt | → `unclassified`, Pipeline läuft weiter |\n| Review-Queue-Write schlägt fehl | → failed/, kein Silent Fail |\n| PII-Masking-Fehler | → failed/, Raw bleibt unverändert |\n\n---", "text_hash": "682b9fe59039122e8908deed40d80b65c854299b6166d0c6db4132e31745f513"}, {"chunk_key": "333c2fa13b82803e61a4c7659e4cf2ed4c6e7a3b31a34e4b9a833155591a7f4e", "chunk_index": 15, "heading": "Vor IMAP/Gmail-Anbindung: Voraussetzungen", "text": "eline läuft weiter |\n| Review-Queue-Write schlägt fehl | → failed/, kein Silent Fail |\n| PII-Masking-Fehler | → failed/, Raw bleibt unverändert |\n\n---\n## Vor IMAP/Gmail-Anbindung: Voraussetzungen\n\nDiese Punkte müssen erfüllt und beobachtet sein bevor automatische Verarbeitung freigebeben wird:\n\n| Voraussetzung | Prüfkriterium |\n|--------------|--------------|\n| PII-Masking zuverlässig | Mindestens 20 echte E-Mails ohne PII-Leck |\n| Projekterkennung stabil | Weniger als 10% `unclassified` bei Projekt-E-Mails |\n| Duplikat-Check funktioniert | Kein doppelter Review-Eintrag bei mehrfachem Trigger |\n| Review-Queue wird abgearbeitet | Keine älteren als 7 Tage offenen Reviews |\n| Fehlerrate < 5% | `failed/` Ordner hat weniger als 1 von 20 Eingaben |\n| Audit vollständig | Jeder Schritt in ingestion_audit.jsonl nachvollziehbar |\n| Expire-Job läuft | Cron aktiv (0 6 * * *), keine verwaisten Reviews |\n\nErst wenn alle Punkte über mindestens 10 reale Ingestions beobachtet wurden → IMAP-Anbindung freigeben.\n\n---", "text_hash": "8d607e9a75ac8a30194e440f621b9e8a66dbe4b7fb85dbd50373aca99b715724"}, {"chunk_key": "c71bd59a8f155c14e271d014f23c677c4e125996c8ba386a01b6cb6f3324f71a", "chunk_index": 16, "heading": "Nützliche Befehle", "text": " (0 6 * * *), keine verwaisten Reviews |\n\nErst wenn alle Punkte über mindestens 10 reale Ingestions beobachtet wurden → IMAP-Anbindung freigeben.\n\n---\n## Nützliche Befehle\n\n```bash", "text_hash": "fde31f0d02dcc02ebb06387be221726f3d124092886ce821fbbb5b8a2e3ef14e"}, {"chunk_key": "d234436d15ceb332d49a072095c84886f4bcdefb332079bc80885a7cb5e140ba", "chunk_index": 17, "heading": "Vollständige Ingestion einer Datei", "text": "## Nützliche Befehle\n\n```bash\n# Vollständige Ingestion einer Datei\npython3 /opt/struktur/ingestion/ingest_email.py /pfad/datei.eml", "text_hash": "14e8a42497a16dd7bc39f7ca5212b89e27d3ee8f68bad7dd6ff2cb1803ef0d77"}, {"chunk_key": "5c04f01d94d1456969745af168018f20f6ac833e83188efd893cc974dae168db", "chunk_index": 18, "heading": "Audit-Log (letzte 20 Einträge)", "text": "# Vollständige Ingestion einer Datei\npython3 /opt/struktur/ingestion/ingest_email.py /pfad/datei.eml\n# Audit-Log (letzte 20 Einträge)\ntail -20 /opt/struktur/ingestion/email/ingestion_audit.jsonl | python3 -c \"\nimport json, sys\nfor l in sys.stdin:\n    e = json.loads(l)\n    print(f\\\"{e['timestamp'][:19]} [{e['status']:8}] {e['step']:18} {e['detail']}\\\")\n\"", "text_hash": "e7c59e93aa58b07bb7ad3810e80fa00dfb384dcc171f39d2133155a2e4bf2953"}, {"chunk_key": "333748608bf7c6fdf69a2fba73da83b5c1d798eaf57a841968cf1e4531542fd3", "chunk_index": 19, "heading": "Offene Reviews anzeigen", "text": "-c \"\nimport json, sys\nfor l in sys.stdin:\n    e = json.loads(l)\n    print(f\\\"{e['timestamp'][:19]} [{e['status']:8}] {e['step']:18} {e['detail']}\\\")\n\"\n# Offene Reviews anzeigen\npython3 -c \"\nimport json\nfrom pathlib import Path\nq = Path('/opt/struktur/memory/review-queue')\nfor f in sorted(q.glob('*.json')):\n    r = json.load(open(f))\n    if r['status'] == 'pending':\n        print(f\\\"{r['review_id']} | {r.get('source_type','?'):6} | {r['proposed_fact'][:60]}\\\")\n\"", "text_hash": "0740ad0019e66850d2b2c71f659b550f331d1dfafe67944bbb1da62b6cc4f7c9"}, {"chunk_key": "15b430f4a61ed27ff8eae6301eb7cc5250bb7e8f21a42ff2825ca0d04aff5504", "chunk_index": 20, "heading": "Duplikat-Schutz testen (gleiche Datei nochmals)", "text": " json.load(open(f))\n    if r['status'] == 'pending':\n        print(f\\\"{r['review_id']} | {r.get('source_type','?'):6} | {r['proposed_fact'][:60]}\\\")\n\"\n# Duplikat-Schutz testen (gleiche Datei nochmals)\npython3 /opt/struktur/ingestion/ingest_email.py /pfad/datei.eml", "text_hash": "c68989cc7a3e7a59eb9b6c80ee7f4f89eef734854005a120e93a5e0e4aef8aab"}, {"chunk_key": "050397814a41d571ff1fbc6ffcdc373513c0431b8cafbee3c38e7d71cca1609b", "chunk_index": 21, "heading": "Erwartung: DUPLICATE — Pipeline gestoppt", "text": "# Duplikat-Schutz testen (gleiche Datei nochmals)\npython3 /opt/struktur/ingestion/ingest_email.py /pfad/datei.eml\n# Erwartung: DUPLICATE — Pipeline gestoppt\n```\n\n---\n\n*Workflow-Datei: `/opt/struktur/hermes-carlo/ingestion/MANUAL_EMAIL_WORKFLOW.md`*\n*Pipeline-Script: `/opt/struktur/ingestion/ingest_email.py`*\n*Architektur: `/opt/struktur/hermes-carlo/ingestion/EMAIL_INGESTION_ARCHITECTURE.md`*", "text_hash": "ea7bcd82bcb78c6b22d5024cd8d33495db4c48c6f6533ddeb77fcae9467af270"}], "elapsed_s": 0.066}