From 4be2c247bedaf1ad67804f290f5c6a7d4a877212 Mon Sep 17 00:00:00 2001 From: Lovebug MCP Date: Tue, 30 Jun 2026 19:09:07 +0000 Subject: [PATCH] =?UTF-8?q?mcp:=20project-plan=20=E2=80=94=20PBS=20n8n=20U?= =?UTF-8?q?pdate=20=E2=80=94=20Import=20&=20Mock-Harness?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/Dev/pbs-n8n-update.md | 64 +++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 Sources/Dev/pbs-n8n-update.md diff --git a/Sources/Dev/pbs-n8n-update.md b/Sources/Dev/pbs-n8n-update.md new file mode 100644 index 0000000..0166397 --- /dev/null +++ b/Sources/Dev/pbs-n8n-update.md @@ -0,0 +1,64 @@ +--- +created: '2026-06-30' +path: Sources/Dev +project: pbs-n8n-update +tags: +- pbs +- n8n +- automation +- mysql +- docker +- python +- cloudflare +type: project-plan +--- + +# PBS n8n Update — Import & Mock-Harness + +Bring the live PBS Instagram-automation n8n workflows up on the sandbox test server, driven by synthetic feeds, so their logic can be worked on without the real Instagram/Facebook/Cloudflare/Google-Chat edges. + +## Goal + +Import the 9 production n8n workflows from `petal-power/pbs-n8n` into the existing n8n on the PBS test server (VM 202 / `pbs-wp-test`, 10.0.21.101) and get them **running end-to-end against mocked Instagram feeds**, resolving against the real prod-dump MySQL data, with every outbound message captured to a trackable file sink. + +**Success condition (the run is done when):** 8 of the 9 workflows — all **except `PBS_Cloudflare_Cache_Warmer_5_days`** — are imported, active, and demonstrably **respond to input and produce output, as close to live production behavior as possible**. That means: a synthetic Instagram feed POSTed to the webhook drives the workflow chain, the MySQL lookups resolve against real `platform_posts`/`pbs_recipes` rows, and the resulting messages land in the sink. The cache-warmer is explicitly excluded from the running condition. + +## Locked Decisions + +- **Target box:** VM 202 `wp-dev-vm` / `pbs-wp-test` (10.0.21.101). Existing n8n at `:5678`, MySQL `wordpress_mysql` with full prod dump. Full verified access reference lives in Trellis thread **`pbs-dev-connect` (#995)** — SSH, n8n API, MySQL, and PVE lifecycle API all tested 2026-06-30. +- **Import into the EXISTING n8n.** It already runs **8 live PBSII monitoring/healer/security workflows** (incl. a `PBS: Google Chat Notify` sub). Import the 9 as a **self-contained, isolated cluster**, re-link them only among themselves, and **touch nothing existing**. +- **MySQL = real, full prod data.** The IG-reply lookup chain (`platform_posts` → `projects` → `pbs_recipes`) resolves against actual rows (platform_posts ~169, pbs_recipes 100). +- **Sink:** one Flask catcher → JSONL (`timestamp`, `sink-label`, `body`). All outbound — Google Chat ×3, Facebook ×2, Cloudflare purge — repointed at it, each **labeled so messages are identifiable**. +- **HMAC `x-hash` gate disabled** for the harness — it's proven in production, safe to bypass to inject synthetic events. +- **Feeds to mock:** `reel-publish` + `new-comment`. **No subscribe handshake.** +- **Import path:** n8n public API with `X-N8N-API-KEY` (key verified working, no expiry; stored in the thread). +- **Out of scope for "running":** `PBS_Cloudflare_Cache_Warmer_5_days`. + +## Open Items + +- Exact synthetic payload shapes — to be reversed from each webhook's IF/`set` nodes during Phases A/D. +- Name near-collision: existing `PBS: Google Chat Notify (Sub-Workflow)` vs the import's own copy — keep the import isolated, don't repoint onto the live one. +- gitea container on 202 is unhealthy (unrelated; flagged in #995). + +## Phases + +**0 — Safety.** `vmstate=1` snapshot of VM 202 (`pre-n8n-import`) via the PVE token *before* touching the box. n8n carries live monitoring, so the snapshot is load-bearing, not tidy. Rollback path: one API call (see #995). + +**A — Import & re-link.** Push the 9 JSON via the n8n API. Repair every `executeWorkflow` cross-reference (they carry stale n8n internal IDs that won't survive import) — re-linking **only within the imported set**. Disable the `x-hash` node in `insta-webhook` and the matching `stopAndError` gate in `PostPBSUpdate`. Leave the 8 existing workflows untouched. + +**B — Sink.** Stand up the Flask catcher on 202 → JSONL. Repoint all outbound httpRequest nodes (Google Chat ×3, FB ×2, CF purge) at it, each tagged with a sink label. + +**C — MySQL wiring.** Point the imported workflows' MySQL credential at `wordpress_mysql:3306` / `pbs_automation` (user `pbs_api`). Verify `platform_posts`, `pbs_recipes`, `instagram_posts_processed`, `instagram_replies`. + +**D — Mock feeds.** Reverse the exact payload shape from the webhook's IF/`set` nodes, build `reel-publish` + `new-comment` synthetic events, POST to the webhook path. The comment event uses a **real reel ID from `platform_posts`** so the reply lookup resolves recipe→keyword→reply. + +**E — Observe / prove success.** Fire both feeds; tail the catcher JSONL; confirm `instagram_replies` / `instagram_posts_processed` inserts. Verify the 8 in-scope workflows respond-to-input and produce-output ≈ live. + +## Notes + +- Workflows cloned to `~/dev-projects/pbs-n8n` on herbys-dev — 9 exports, single commit. Cluster shape: Instagram pipeline (insta-webhook + 3 subs), Cloudflare cache (purge + warmer), chat/notify (PostPBSUpdate + 2 senders). +- The stale-internal-ID cross-references are the #1 thing that breaks on import. +- Exports carry **live secrets** (Google Chat API keys, CF zone id) — fine for a throwaway harness, flagged. +- **Execution model:** a worker on herbys-dev SSHing into 202 does the import/sink/feed work on the box. +- **Deliverables:** working 8-workflow set in n8n · the catcher service · the mock-feed injector scripts · a short runbook (how to fire a feed, where to watch output). +- **Unattended tier:** version-warrior (done = version running). Run contract recorded in the Trellis thread before going heads-down. \ No newline at end of file