# Ingest

> Quick single-pass ingest of a source (PDF/Markdown/URL/DOCX/PPTX/XLSX) into one note (frontmatter + overview + key points + original text). PDFs stay page-refs (no mirror enforcement). Block-refs to the source rendered as a discreet ↗ symbol per key point. No multi-turn dialog.

- **Type:** Skill
- **Install:** `agentstack add skill-pssah4-vault-operator-ingest`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [pssah4](https://agentstack.voostack.com/s/pssah4)
- **Installs:** 0
- **Category:** [AI & ML](https://agentstack.voostack.com/c/ai-and-ml)
- **Latest version:** 0.1.0
- **License:** Apache-2.0
- **Upstream author:** [pssah4](https://github.com/pssah4)
- **Source:** https://github.com/pssah4/vault-operator/tree/main/bundled-skills/ingest
- **Website:** https://pssah4.github.io/vault-operator/

## Install

```sh
agentstack add skill-pssah4-vault-operator-ingest
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# /ingest -- Schneller Single-Pass-Ingest

## Wann nutzen

Schnelle Inbox-Aufnahme, image-heavy PDFs, kurze Webclips,
Office-Files. Erwartung: 30 Sekunden bis 2 Minuten, eine Datei als
Output.

Nicht fuer tiefe Sense-Making-Notes (-> /ingest-deep), nicht fuer
Meeting-Transkripte (-> /meeting-summary).

## Kosten-Disziplin

- **Ein Tool-Call.** `ingest_document`. Keine read_document-Pre-Reads,
  keine list_files-Erkundung.
- **STOP-on-Error.** Bei Tool-Fehler: User informieren, fertig.

## Step 0a: Template lesen (Pflicht, vor dem ingest_document-Aufruf)

Das Frontmatter-Template kommt aus den Settings:
`vaultIngest.templates.ingestNoteTemplate` (vault-relativer Pfad).
Wird beim First-Run vom Wizard auf
`/Quelle Template.md` (DE) bzw.
`/Source Template.md` (EN) gesetzt
(siehe FEAT-29-14). Der TemplatesFolder kommt aus dem
Obsidian-Core-Templates-Plugin (`.obsidian/templates.json`).

Vorgehen (Reihenfolge ist Pflicht):

1. **Setting-Wert pruefen.** Wenn nicht-leer:
   - `read_file path=""` -> extrahiere den Frontmatter-
     Block zwischen den `---`-Zeilen.
   - Diese Felder bilden die Frontmatter-Basis fuer den
     `header_content`.
   - Werte aus der Quelle (Autor, Jahr, URL etc.) einfuellen,
     unbekannte Felder leer lassen.
   - **Bevorzuge IMMER das User-Template wenn vorhanden** -- es
     spiegelt die Konvention des Vaults wider (Sprache, custom
     Felder). Der Inline-Default unten ist NUR Fallback.
2. Wenn Setting leer: nutze den Inline-Default.

**Inline-Default (Fallback wenn Setting leer):**

```yaml
---
Zusammenfassung:
Autor:
Jahr:
ISBN:
URL:
Notizen:
Themen:
Konzepte:
Meeting-Notizen:
Kategorie:
  - Quelle
Typ:
tags:
Permanent: false
---
```

Pflicht-Felder die der Skill aus der Quelle ableitet und einfuellt:
`Zusammenfassung`, `Autor`, `Jahr`, `URL`, `Themen`, `Konzepte`,
`Typ`, `tags`.

**Kategorie-Wert (Pflicht-Format):** YAML-Listen-Element mit Bindestrich,
ein Wert. Englischer Vault: `- Source`. Deutscher Vault: `- Quelle`.
Niemals als Inline-Array `[Quelle]` -- das matcht den Auto-Trigger
nicht (FEAT-19-27).

## Step 0: Source-Typ und Tool-Wahl

Schau in deinen Kontext:

| Quelle | Aufruf |
|---|---|
| `` ohne `vault_path` (frisch in Chat geladen) | `ingest_document` mit `attachment_index: 0` -- **TURN 1 noch waehrend das Attachment lebt**. Auf spaeteren Turns ist das Attachment weg. |
| `` oder User nennt Vault-Pfad | `ingest_document` mit `source_path: ""` |
| Reine URL ohne Attachment | requestUrl + write_file (Tool-Pfad ohne ingest_document) |
| Markdown im Vault | `ingest_document` mit `source_path` ist optional; bei reinen MD-Sources reicht `update_frontmatter` + Block-IDs |

**Ablage-Regel:** ALLE Markdown-Outputs landen in `/`
(Default `Inbox/`, aus den Plugin-Settings). Originale Binaries
(PDF/DOCX/PPTX/XLSX) gehen nach `Attachements/--.`.
Keine neuen Ordner anlegen, kein `Sources/`, kein `Notes/`. Wenn der
defaultOutputFolder fehlt, legt das Plugin ihn beim ersten Schreibvorgang
an. Naming-Convention: `--` (englisch transliteriert,
Bindestriche statt Leerzeichen). Ohne bekannten Author/Year: ``.

## Step 1: ingest_document aufrufen

Aufrufkonvention:

```
ingest_document
  source_path | attachment_index = ""
  output_path = "/--.md"
  header_content = """
    ---
    source: ...
    source_type: pdf | docx | pptx | xlsx | md | url
    ingested_at: 
    cluster: 
    ---

    # 

    ## Overview

    

    ## Kernaussagen

    - . [[#Page |↗]]
    - . [[#^block-|↗]]
    ...
  """
```

Tool appended automatisch `## Originaltext` mit dem geparsten Text.

## Step 2: Position-Marker pro Kernaussage (Pflicht)

Jede Kernaussage in `## Kernaussagen` traegt am Satzende einen Marker:

| Source-Typ | Marker-Form |
|---|---|
| PDF | `[[#Page \|↗]]` -- N aus den `## Page N`-Headings im Originaltext |
| Markdown / Webclip | `[[#^block-\|↗]]` |
| URL mit Section-IDs | `[[#\|↗]]` |
| DOCX | `[[#^block-\|↗]]` |
| PPTX | `[[#Slide \|↗]]` |
| XLSX | `[[#Sheet \|↗]]` |

Pflicht-Layout:

- Display-Text immer **nur** `↗`. Kein "Quelle:", kein "[1]".
- Inline am Satzende, ein Leerzeichen vor dem Link.
- Eine Block-Ref pro Kernaussage.

## Step 3: Verifikation

Tool gibt einen `Position-Marker check: X of Y Kernaussagen carry refs`-
String zurueck. Bei `X "`
und den Frontmatter-Block zwischen den beiden `---`-Zeilen
**verbatim** als String halten. Werte werden hinter den Doppelpunkten
eingefuellt. Niemals YAML neu rendern -- das bricht das Frontmatter.

**Pflicht-Werte:**
- `Kategorie:` -> `- Quellen-Notiz` (DE) bzw. `- Source note` (EN).
  Aus dem Template uebernehmen wenn vorhanden.
- `Quellen:` -> `[[]]` (bidirektionaler Link).
- `Zusammenfassung:` -> 1-2-Satz-Quintessenz des Take-Aways.

### Step 4b: Naming-Konvention

Sense-Making-Note und Zettel sind **eigenstaendige Konzept-Notes** mit
aussagekraeftigen Titeln. Keinen Source-Basename als Prefix.

| ❌ Falsch | ✅ Richtig |
|---|---|
| `Karpathy ... -- Sense-Making.md` | `Karpathy zu Vibe Coding und Agentic Engineering.md` |
| `Karpathy ... -- LLMs als Ghosts.md` | `LLMs als Ghosts.md` |

Verbindung zur Quelle: Frontmatter `Quellen: [[]]` + Backlink
in der Source (Step 5).

### Step 4c (Modus A): Sense-Making-Note

EINE Note via `write_file`:

- **Pfad:** `/.md`
- **Content (Reihenfolge strikt, keine Leerzeile vor dem Frontmatter):**

```

# 

## Kernaussage

## Take-Aways

-  [[#Page |↗]]
-  [[#^block-|↗]]
- ...
```

### Step 4d (Modus B): Multi-Zettel

Ein Zettel pro Take-Away via `write_file`:

- **Pfad:** `/.md`
- **Content:**

```

# 

## Quelle

[[]] -- siehe [[#Page |↗]]
```

**Wichtig:** Body und Frontmatter-`Zusammenfassung:` ergaenzen sich.
Frontmatter ist die Quintessenz fuer Listing/Suche, Body ist die
Ausformulierung. Niemals Body leer lassen.

**Namens-Kollision:** Wenn `.md` schon existiert,
`read_file` der existierenden Note, User fragen ob Ergaenzung oder
Variante (` ().md`). Nie stillschweigend ueberschreiben.

## Step 5: Backlink in der Quelle (Pflicht nach Step 4)

Wenn in Step 4 Notes erstellt wurden:

1. Lade die Quelle-Note via `read_file`.
2. **Verifikation (AUDIT-024 I-1):** Pruefe im Frontmatter, dass die
   Note die `Kategorie: - Quelle` (oder `- Source` im englischen
   Vault) traegt. Wenn nicht, ist der Pfad falsch oder die Note ist
   die falsche -- STOP und frag den User, bevor du irgendwo
   `Notizen:` setzt.
3. Lies das `Notizen:`-Feld aus dem Frontmatter.
4. `update_frontmatter`-Tool: setze `Notizen:` auf eine Liste mit
   `[[note1]], [[note2]], ...`. Bestehende Werte beibehalten (append).

Damit zeigt der Obsidian-Graph die Verbindung Quelle  abgeleitete
Notes.

## Verbote

- Keine `[1]`-Marker im Perplexity-Stil.
- Kein Multi-Turn-Dialog. Wenn Dialog noetig, ist `/ingest-deep`
  das richtige Skill.
- Kein Markdown-Mirror-Zwang fuer PDFs.
- Kein Originaltext in der `## Kernaussagen`-Section duplizieren.
- **Kein `read_document` vor `ingest_document`.** Tool parst selber.
- **Kein `list_files` zur Pfad-Suche.** User fragen ist billiger.
- **Keine neuen Ordner.** Erlaubte Ziele sind ausschliesslich
  `Attachements/` (Binaries) und `/` (Markdown).
  Kein `Sources/`, kein `Notes/`.
- **Keine Source-Duplikate.** Liegt die Quelle bereits als Markdown im
  Vault (`source_path` zeigt auf eine `.md`-Datei), schreibe NICHT eine
  zweite Note in `/` -- nutze stattdessen
  `update_frontmatter` + manuelle Block-ID-Edits direkt in der
  Original-Note.
- **Kein Source-Prefix in Sense-Making-/Zettel-Titeln.** Konzept-
  Titel sind eigenstaendig, die Verbindung zur Quelle steht im
  Frontmatter (`Quellen:`).
- **Kein YAML-Re-Render des Templates.** Frontmatter-Block ist ein
  verbatim String, Werte hinter Doppelpunkten einsetzen. Niemals
  zerlegen und neu zusammensetzen -- das produziert doppelte `---`
  und kaputte YAML.
- **Keine Transkript-Schnipsel als Note-Body.** Eigene Worte, ein
  klarer Gedanke pro Note. Roher Source-Text gehoert nicht in den
  Body -- referenziere via Block-Ref.
- **`Themen` und `Konzepte` nicht vermischen.** `Themen:` haelt
  ausschliesslich Wikilinks auf Notes mit `Kategorie: Thema`
  (breit/generisch, Hub-Note, z.B. `[[Agentic AI]]`).
  `Konzepte:` haelt ausschliesslich Wikilinks auf Notes mit
  `Kategorie: Konzept` (spezifisch/abgegrenzt, z.B. `[[AI Agents]]`).
  Im Zweifel kurz mit `read_file` das `Kategorie:`-Feld der Ziel-Note
  pruefen, bevor du sie einsortierst.
- **Wikilink-Properties ausschliesslich als YAML-Listen.** `Themen`,
  `Konzepte`, `Personen`, `Quellen`, `Notizen` jede mit Eintraegen als
  Listen-Elementen, niemals als Komma-String. Block-Form
  (`Themen:\n  - "[[X]]"\n  - "[[Y]]"`) oder Flow-Form
  (`Themen: ["[[X]]", "[[Y]]"]`) sind beide ok; `Themen: [[X]], [[Y]]`
  ist falsch und wird von Obsidian nicht als Liste geparsed. Auch ein
  einzelner Wert bleibt eine ein-elementige Liste.

## Fehlerfaelle

| Fehler | Was tun |
|---|---|
| `Attachment index 0 out of range. 0 attachment(s) available.` | Attachment ist nicht (mehr) verfuegbar -- diesen Turn neu starten oder User um neues Upload bitten. Nicht retryen. |
| `File not found: ` | Pfad falsch. User fragen, nicht raten. |
| `File already exists: ` | output_path aendern (z.B. ` (2)` anhaengen) oder User fragen. |

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [pssah4](https://github.com/pssah4)
- **Source:** [pssah4/vault-operator](https://github.com/pssah4/vault-operator)
- **License:** Apache-2.0
- **Homepage:** https://pssah4.github.io/vault-operator/

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-pssah4-vault-operator-ingest
- Seller: https://agentstack.voostack.com/s/pssah4
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
