Pantheon · n8n Instance · Security Posture
| Workflow | Endpoint | Mutating? | Caller auth | Verdict |
|---|---|---|---|---|
| Cal.com Booking Receiver v2 JklF5eKPa4dyzSvb · active |
POST /cal-booking | yes — Supabase meetings/events write | CF edge HMAC shield → header-auth (x-shield-verified) | SECURE |
| Boas.dev Contact Form qZxNwivyV5VDALPJ · active · tier:production |
POST /contact | yes — sends email (SMTP) | no webhook auth · Cloudflare Turnstile siteverify + input validation + CORS→boas.dev | MITIGATED ⚠ |
| Mimir Error Triage oTn0mXWKo2jnJxG2 · active |
POST /mimir/error-triage | yes — PATCH Supabase mimir_errors | none — no compensating control found | OPEN HOLE |
| Mímir Daily Report yWvHQU8q8hvmIkEV · active |
POST /daily-report | read / generate — no external write on this path | none | LOW-RISK OPEN |
| Signal Intake Pipeline Llgb0uUbCRppj6L2 · active · no errorWorkflow |
POST /trading-signal | yes — PUT R2 + POST localhost | none — no compensating control | OPEN HOLE |
| Talos Alert → Slack (live) k7IC13Ot26XvAhLa · active |
POST /talos-alerts | posts to Slack | header-auth | SECURE |
| Mimir Dropbox → Link Resolver Gpagw9kZoqh1NEUQ · active · errWf wired |
POST /mimir/agent-dropbox-link | resolve only — no mutating sink found | none | LOW-RISK OPEN |
| AI Research Publishing 3ao5SbXExaSpsVKc · active · community template |
/pblog | calls Perplexity (paid API) | none — cost-abuse risk | DEACTIVATE/GATE |
| Viska Corpus Watcher yZEBcxz94H6giYoV · inactive |
webhook (header-auth) | yes — corpus.chunks ingest | header-auth + default-deny gate (by design) | SECURE · DORMANT |
| Cal Booking Receiver (v1, bespoke) TBtUfGhMRqSM23MN · inactive |
POST /cal-booking | superseded by v2 | none (retired) | RETIRED STUB |
Fingerprint → dedup → occurrence-count → fix-or-disable. The default errorWorkflow target.
Cron 4h: attaches the default errorWorkflow to every workflow missing one. Coverage engine.
Batch-retries failed executions, excludes sentinel-handled IDs.
Shared mrkdwn notifier, 9-field input contract. Single alert sink.
NEW (P1). Asserts output non-empty / min-count / required-fields; emits silent_failure verdict + fans to Slack. Built & validated — inactive, unadopted, no ledger persist yet.
AI-classifies errors → routes → PATCH DB. Useful, but its ingress is the open webhook hole (§01).
/mimir/error-triageActive, POST, no caller auth, PATCHes Supabase mimir_errors. Matches rule #19 predicate (mutating ∧ public ∧ unauthenticated). Remediate via CF edge shield or header-auth.
/trading-signal (Signal Intake)Active, POST, no caller auth, writes to R2 + localhost. Rule #19 predicate. Also has no errorWorkflow attached — a failure here is doubly invisible. Remediate: header-auth/edge shield + wire the error handler.
The Turnstile secret is inlined as a literal in a Code node (value redacted here). Secrets in workflow JSON violate credential isolation (rule #10/#04) — move to $env / credential store + rotate. Turnstile still gates the endpoint, so exposure is the issue, not an open door.
The entire error stack is errorTrigger-gated → invisible to success-with-bad-output (exec #34460). Partially closed: Output Assertion Guard built, but not yet active, adopted, or persisting to a ledger.
A scheduled workflow that silently stops firing is undetectable — no expected-cadence registry. Sibling failure mode to #34460.
6 errorTrigger workflows fire on the same failure → duplicate alerts + race on error_log. Consolidate to one dispatcher.
error_log (sentinel Supabase) vs mimir_errors (viska Supabase). No unified ledger; the new guard has nowhere canonical to persist.
/pblogAI Research Publishing template is active + unauth + calls Perplexity (paid API) → cost-abuse vector. Deactivate or gate.
Purpose/Risks auto-stub (empty) → P5 backfillJklF5 Cal v2 — auth read: shield + header-auth ✅qZxNwiv Contact form — full node read: Turnstile + hardcoded-secret 🔴oTn0m Mimir Triage — auth read: none 🔴Llgb0/k7IC1/Gpagw/3ao5S — 4 ingress now read: 1 hole, 1 secure, 2 lowMgPSv guard — built & validate-clean (6 nodes)