# n8n Workflow Testing Status
_Last updated: 2026-05-25_

---

## ✅ Confirmed Working

| # | Workflow | Version | Notes |
|---|----------|---------|-------|
| 01 | Grafana Alert → AI + Gotify | v1.4 | Dedup + recovery branch confirmed |
| 08 | Class Recording RAG | v1.2 | Paperless + Gotify end-to-end confirmed |
| 09 | Class Transcript Ingest | v1.1 | Gotify confirmed |
| 14 | Paperless Inbox Reminder | current live alias + v1.2 artifact | Live auth header corrected again on 2026-05-18; repo artifact already matched `Token` auth |
| 15 | n8n Health Monitor | v1.2 | Fixed: workflow names (was showing IDs); Postgres dedup working |
| 16 | NFS Watchdog + Auto-Heal | v1.3 | Confirmed working; added calibre-web-automated to the /mnt/unraid/data recovery restart set |
| 07 | Git Commit → AI Summary → Gotify | v1.0 | Confirmed working |

## ⏸ Retired

| # | Workflow | Reason |
|---|----------|--------|
| 04 | Whisper Transcription | Replaced — transcription now runs via Docker on Rocinante (RTX 4090) and sends directly to n8n |
| temp | Temp Postgres Credential Probe | One-shot setup helper removed from live n8n during 2026-05-18 cleanup |
| temp | Temp School Intake Table Provision | One-shot provisioning helper removed from live n8n during 2026-05-18 cleanup |

## 🧹 Live Cleanup

- 2026-05-18: removed 22 no-longer-needed workflows from live n8n, including inactive superseded copies of Class Recording → RAG, Class Transcript Ingest v1.0, Grafana Alert → AI → Gotify v1.0/v1.1/v1.2, n8n Self-Health Monitor v1.0/v1.1, NFS Mount Watchdog + Auto-Heal v1.0, Paperless Inbox Reminder v1.0/v1.2, duplicate inactive Paperless Intake Triage flows, Whisper Transcription v1.0, RSS Digest v1.0, and the two active temp/setup leftovers.
- 2026-05-18: cleared 438 stale errored execution rows that still had `finished=false` despite already having `stoppedAt` set. Open execution count returned to `0`.

---

## 🔲 Not Yet Tested

### 02 — RAG Pipeline v1.0
**What it does:** Two webhooks — `POST /rag/ingest` chunks + embeds text into Qdrant; `POST /rag/query` embeds query, searches Qdrant, asks LiteLLM, returns answer.

**Pre-test checklist:**
- [ ] `knowledge_base` collection exists in Qdrant (`GET http://10.5.30.6:6333/collections`)
- [ ] `nomic-embed-text` model pulled in Ollama (`ollama list` on PD)
- [x] LiteLLM auth now reads `$env.LITELLM_API_KEY`; hardcoded key removed from repo artifacts

**Test approach:** POST `{"text": "some test content", "source": "test"}` to `/rag/ingest`, then POST `{"query": "test content question"}` to `/rag/query` and verify an answer comes back.

---

### 03 — Paperless AI Processing v1.0
**What it does:** Paperless webhook on new document → AI classifies (type/summary/tags) → adds note to doc + sends Gotify + applies tags (parallel branches after `Parse Analysis`).

**Pre-test checklist:**
- [ ] Paperless webhook configured to POST to `https://n8n.paccoco.com/webhook/paperless/new-document` on document add
- [x] Paperless auth now reads `$env.PAPERLESS_API_TOKEN`; hardcoded token removed from repo artifacts
- [x] LiteLLM auth now reads `$env.LITELLM_API_KEY`; hardcoded key removed from repo artifacts
- [ ] Gotify credential `ajvRjvj0QldLQYmo` ("Paperless") — already wired ✓

**Test approach:** Upload a test document to Paperless, then manually POST `{"document_id": <id>}` to the webhook to trigger processing. Check Paperless for note + tags, check Gotify for notification.

---

### 05 — Paperless → RAG v1.0
**What it does:** Webhook on `POST /paperless/rag-ingest` → fetches Paperless doc → chunks + embeds content → upserts to Qdrant `knowledge_base` → Gotify notification.

**Pre-test checklist:**
- [ ] `knowledge_base` collection exists in Qdrant (same as 02)
- [x] Paperless auth now reads `$env.PAPERLESS_API_TOKEN`; hardcoded token removed from repo artifacts
- [ ] Gotify credential `SETUP_REQUIRED` ("Paperless RAG") — needs wiring

**Test approach:** POST `{"document_id": <id>}` to the webhook. Verify chunks appear in Qdrant and Gotify notification fires.

---

### 06 — RSS Digest v1.0
**What it does:** Every 6 hours (+ manual webhook + manual trigger), fetches 33 RSS feeds, parses items, deduplicates via Postgres (`rss_seen_items` table), scores by keyword relevance/urgency, AI-summarizes new items per feed, pushes per-feed digests to Gotify.

**Pre-test checklist:**
- [ ] `rss_seen_items` table exists in Postgres
- [x] LiteLLM auth now reads `$env.LITELLM_API_KEY`; hardcoded key removed from repo artifacts
- [ ] Postgres credential `n9svoXemqSZoNNUB` — already wired ✓
- [ ] Gotify credential `ExUx3oqYQyhkqZcp` ("Rss Feed") — already wired ✓

**Test approach:** Use the "When clicking Execute workflow" manual trigger. First run will insert all items as new (expect lots of Gotify notifications). Second run should be silent (all deduped).

---

## 🐛 Known Issues / Tech Debt

| Workflow | Issue | Priority |
|----------|-------|----------|
| 15 | `includeData: false` means error messages show as "Unknown error" | Low |

---

### 17 — Paperless Intake Triage → Doris Review Queue v1.0
**What it does:** Paperless post-consumption webhook → fetch document → LiteLLM strict JSON triage → enforce review-first safety gate → write sanitized Doris Dashboard queue JSON → optional urgent Gotify notification. Safe title-only Paperless update branch exists but is disabled unless `PAPERLESS_TRIAGE_APPLY_SAFE=true`.

**Local artifact checks completed:**
- [x] Workflow JSON validates with `python3 -m json.tool`
- [x] Fixture JSON files validate with `python3 -m json.tool`
- [x] Dashboard example queue JSON validates with `python3 -m json.tool`

**Pre-test checklist:**
- [ ] Paperless webhook configured to POST `https://n8n.paccoco.com/webhook/paperless/intake-triage`
- [ ] `PAPERLESS_API_TOKEN` and `LITELLM_API_KEY` exposed to n8n through env vars; no hardcoded secrets
- [ ] `NODE_FUNCTION_ALLOW_BUILTIN=fs,path` set for queue file writer
- [ ] n8n has a writeable mount to `doris-dashboard/data/paperless_review.json`
- [ ] `PAPERLESS_TRIAGE_APPLY_SAFE=false` during initial validation

**Test approach:** Upload a harmless test document to Paperless, POST `{"document_id": <id>}` to the webhook, and confirm `doris-dashboard/data/paperless_review.json` contains a sanitized review item. Use a bill/due-date fixture to verify forced human review.

---

### 18 — Telegram School Intake → Postgres → Paperless v1.2
**What it does:** Accepts multipart school-work upload plus metadata (`class_name`, `assignment_name`, `submission_kind`, optional semester/course_code/paper_kind), uploads it into Paperless with a deterministic `intake_id`-based filename/title, and returns webhook success context.

**Local artifact checks completed:**
- [x] Workflow JSON validates with `python3 -m json.tool`
- [x] Companion helper script validates with `node --check school/intake/submit_to_n8n.js`
- [x] Class profile example JSON validates with `python3 -m json.tool`
- [x] v1.1 removes the `require('crypto')` dependency for easier live rollout
- [x] v1.2 fixes the Paperless multipart upload node to use `inputDataFieldName` for binary form upload
- [x] Live-tested 2026-05-14 with `Why am I here` DOCX; Paperless created document `49`

**Pre-test checklist:**
- [x] `PAPERLESS_API_TOKEN` exposed to n8n through env vars
- [x] Webhook path `https://n8n.paccoco.com/webhook/school/intake/upload` reachable from Doris/OpenClaw helper

**Test approach:** POST a small DOCX/PDF through the intake webhook and verify the document lands in Paperless with filename prefix `school-...` and deterministic title.

---

### 19 — Paperless School Intake Metadata Enrichment v1.1
**What it does:** Receives Paperless post-consumption webhook for intake-managed documents, resolves the deterministic `intake_id` from the stored filename, derives metadata from deterministic filename/title, then reapplies deterministic title/tags and optional correspondent mapping.

**Local artifact checks completed:**
- [x] Workflow JSON validates with `python3 -m json.tool`

**Pre-test checklist:**
- [x] Paperless webhook target configured to POST `https://n8n.paccoco.com/webhook/school/intake/paperless-enrich`
- [x] Workflow 18 working so intake-managed filenames exist in Paperless
- [x] `PAPERLESS_API_TOKEN` exposed to n8n
- [ ] Optional mapping env vars supplied when ready: `PAPERLESS_TAG_SCHOOL`, `PAPERLESS_TAG_ASSIGNMENTS`, `PAPERLESS_TAG_TELEGRAM`, `PAPERLESS_TAG_CLASS_MAP_JSON`, `PAPERLESS_TAG_SUBMISSION_KIND_MAP_JSON`, `PAPERLESS_CORRESPONDENT_CLASS_MAP_JSON`

**Test approach:** After a workflow-18 upload is consumed by Paperless, POST `{"document_id": <id>}` to `/webhook/school/intake/paperless-enrich` and verify title/tags enrichment succeeds. Live-tested on document `49`.
