---
type: skill
agent_ready: true
schema_version: 1
bundle_version: "0.28.0"
name: memory-router
description: "Routet Inhalte, die der User dauerhaft im Second Brain festhalten will, als atomare Notiz in den Vault. Trigger sind Merk- und Speicher-Signale wie 'merk dir das', 'merk dir bitte', 'speicher das', 'speichere das', 'halt das fest', 'halte das fest', 'notier das', 'notiere das' oder semantisch äquivalente Sätze. Der Skill ruft das Hilfsskript write_inbox_note.py auf, das eine neue Markdown-Datei unter {vault_root}/01 Inbox/<Titel>.md mit Frontmatter (type: notiz, agent_ready, description, tags inkl. inbox, created, updated), H1 und einleitendem Absatz anlegt. Die volle PARA-Einsortierung übernimmt der User beim nächsten Session-Start. NICHT triggern für reine Memory-Einträge ins KI-interne System (CLAUDE.md, Memory-Datei)."
tags:
  - skill
  - memory-router
  - inbox
  - vault-schreiben
scope: vault
bundle_skill: true
default_active:
  allgemein: true
depends_on: []
conflicts_with: []
created: 2026-05-09
updated: 2026-05-13
---

# Memory-Router

Wenn der User dir sagt, du sollst dir etwas merken oder etwas speichern, soll der Inhalt nicht im Chat verpuffen, sondern als eigene Notiz im Second Brain landen. Dieser Skill nimmt das Gemerkte, formt eine atomare Markdown-Datei mit Frontmatter und legt sie in der Inbox ab. Von dort wird sie beim nächsten Session-Start nach PARA einsortiert.

Die Bundle-Variante ist absichtlich klein: sie routet ausschließlich in die Inbox. Die richtige PARA-Einsortierung übernimmt der User oder eine spätere Skill-Variante.

## Warum das wichtig ist

Ein vergessenes „merk dir das" ist verlorener Kontext. Ohne festen Schreib-Endpunkt landet die Notiz im Chat, scrollt weg und ist beim nächsten Mal nicht mehr auffindbar. Der memory-router macht den Schreibweg deterministisch: ein klarer Trigger, ein klares Hilfsskript, ein klarer Zielordner.

## Scope

**Aktiv** wenn der User signalisiert, dass ein Inhalt persistiert werden soll: „merk dir das", „speicher das", „notier das", „halt das fest" oder semantisch ähnliche Formulierungen.

**Nicht aktiv** für reine Memory-Einträge in das KI-interne Memory-System (CLAUDE.md, Memory-Datei). Wenn unklar ist, ob es in den Vault oder ins KI-Memory soll, einmal kurz rückfragen: „Soll das ins Second Brain oder reicht ein Memory-Eintrag?".

## Trigger-Erkennung

Skill startet, wenn der User explizit signalisiert, dass etwas im Vault festgehalten werden soll. Erkenne Intent, matche nicht auf exakten Wortlaut. Die Trigger-Beispiele in der Description sind nicht abschließend — semantisch äquivalente Sätze („das soll bleiben", „schreib das auf für später") greifen ebenfalls.

**Triggern:** „merk dir das", „merk dir bitte", „speicher das", „speichere das", „halt das fest", „halte das fest", „notier das", „notiere das", „das soll im Vault landen", „pack das ins Second Brain".

**Nicht triggern:** „erinnere dich daran" (im Sinne von „behalte das im Hinterkopf für diese Session"), „weißt du noch" (Rückfrage), Bitten um KI-Memory-Eintrag, allgemeines Plaudern über Erinnerung.

## Workflow

1. **Inhalt isolieren.** Aus dem Gespräch den Kern dessen herausarbeiten, was gemerkt werden soll. Keine Full-Transkription des Chats, sondern die eine Idee, der eine Fakt, die eine Entscheidung.

2. **Titel wählen.** Kurzer, sprechender Titel im Aussagestil (drei bis sechs Wörter). Wird zum Dateinamen. Beispiel: „Lieferant Tee liefert nur dienstags".

3. **Tags überlegen.** Mindestens `inbox`. Wenn das Thema klar ist, einen oder zwei zusätzliche thematische Tags vorschlagen.

4. **Hilfsskript aufrufen.** Siehe Abschnitt „Hilfsskript". Das Skript erzeugt die Datei deterministisch und gibt den finalen Pfad zurück.

5. **Bestätigung an den User.** Antworten mit dem Pfad der angelegten Datei und dem Hinweis, dass die Inbox beim nächsten Session-Start nach PARA einsortiert wird.

## Hilfsskript

Der Skill schreibt nicht direkt mit dem Write-Tool, sondern ruft `write_inbox_note.py` auf. Das hält die Pfad-Auflösung deterministisch, die Frontmatter-Erzeugung sauber gegen YAML-Bomben und die Schreib-Allowlist robust gegen Path-Traversal.

```bash
PYTHONUTF8=1 python .skills/memory-router/write_inbox_note.py \
  --title "Lieferant Tee dienstags" \
  --content "Lieferant Tee liefert nur dienstags an die Filiale." \
  --tags inbox,wissen \
  --vault-root /pfad/zum/vault
```

**Argumente:**

- `--title <Titel>` (Pflicht): Titel der Notiz. Wird zum Dateinamen, sanitisiert auf Latein-Buchstaben, Ziffern, Leerzeichen, deutsche Umlaute, Bindestrich, Underscore.
- `--content <Markdown-Body>` (Pflicht): Inhalt der Notiz. Mehrzeilig erlaubt — wird zum Body unter der H1. Die erste Zeile dient außerdem als Frontmatter-Description.
- `--tags <comma-separated>` (optional, Default `inbox`): Komma-separierte Tag-Liste. `inbox` wird automatisch hinzugefügt, falls nicht enthalten.
- `--vault-root <Pfad>` (Pflicht): Vault-Wurzel-Pfad. Inbox liegt unter `<vault-root>/01 Inbox/`, sofern nicht über die Config überschrieben.
- `--bundle-root <Pfad>` (optional): Bundle-Root für die Config-Auflösung. Default: Skill-Parent.
- `--dry-run` (optional): Gibt nur den Zielpfad aus, schreibt nichts.

**Verhalten:**

- Zielpfad ist `{vault_root}/01 Inbox/<sanitized-title>.md`. Bei Namens-Kollision wird `_YYYY-MM-DD` angehängt; bei mehrfachen Kollisionen am selben Tag zusätzlich ein laufender Counter.
- Frontmatter enthält `type: notiz`, `agent_ready: true`, `description: "..."` (immer in doppelten Anführungszeichen), `tags: [inbox, ...]`, `created`/`updated` als heutiges Datum.
- Body besteht aus `# <Titel>` plus dem `--content` als einleitender Absatz.
- Atomares Schreiben: Tempfile im Zielverzeichnis + `os.replace`, kein partieller Output.
- Schreib-Allowlist: nur innerhalb `{vault_root}/01 Inbox/`. Versuch außerhalb führt zu non-zero exit.
- Stdout: nur der finale Pfad bei Erfolg. Stderr: Fehlermeldungen. Returncode 0 bei Erfolg, ≠ 0 bei Fehler.

## Frontmatter-Schema der erzeugten Notiz

```yaml
---
type: notiz
agent_ready: true
description: "Ein-Satz-Zusammenfassung (immer in Anführungszeichen)."
tags:
  - inbox
  - <weitere Tags>
created: YYYY-MM-DD
updated: YYYY-MM-DD
---
```

Die `description` wird **immer** in doppelten Anführungszeichen gesetzt. Ohne Quoting bricht der YAML-Parser, sobald ein `: ` im Beschreibungstext steht (Beispiel: ein Eintrag wie „Backup-Strategie: 3-2-1-Regel" würde sonst als zwei YAML-Felder gelesen, Obsidian zeigt das Frontmatter dann roh als Body an).

## Bundle-MVP-Hinweise

Diese Variante ist absichtlich reduziert:

- Kein automatisches Einsortieren in andere Vault-Ordner. Die Inbox ist der einzige Zielordner.
- Kein Glossar-Abgleich der Eigennamen vor dem Speichern.
- Kein Konflikt-Check gegen bestehende Notizen mit ähnlichem Inhalt.
- Kein Tag-Vorschlag aus Vault-Statistik.

Wer die volle Variante braucht, kann den Skill nach dem Setup erweitern.

## Konfiguration

Vollständige Konfigurations-Vorlage: `skill.config.example.yaml`. Beispiel für eine minimale Anpassung:

```yaml
paths:
  inbox_dir: "{inbox}"
frontmatter:
  type: notiz
  tags: [inbox]
locale: de
```

Der Skill hat keine Feature-Flags — die Logik ist absichtlich Inbox-only. Erweiterungen erfolgen über User-eigene Folge-Skills, nicht über Config-Toggles.

## Locale

Default: `de`. Einstellbar über `locale` in `skill.config.yaml`. Dieser Skill nutzt das Locale aktuell nicht aktiv (keine Slug-Bildung, keine Stopwords), die Sektion ist aber Pflicht-Teil der Bundle-Config.

## Regeln

- **Nie außerhalb der Inbox schreiben.** Die Schreib-Allowlist im Hilfsskript ist die Garantie.
- **Nie halluzinieren.** Unbekannte Felder bleiben leer oder tragen den dokumentierten Fallback.
- **`description` immer quoten.** YAML bricht sonst still.
- **Trigger sind Intent-basiert.** Wortlaut-Matches sind Beispiele, kein abgeschlossener Kanon.

## Evals

```bash
PYTHONUTF8=1 python .skills/memory-router/run_evals.py --verbose
```

Erwartet 10/10 Assertions grün. Die Eval-Datei liegt unter `eval/memory-router.eval.json`.

## Verknüpfungen

- [[INDEX|INDEX.md]]
- [[AGENTS|AGENTS.md]]
