mcp: project-plan — PBS Content Hub Phase 6 — Trello Sync & Workflow Bridge

This commit is contained in:
Lovebug MCP 2026-05-31 03:20:29 +00:00
parent 093f66563c
commit ada0bfc4e2

View File

@ -0,0 +1,156 @@
---
created: '2026-05-31'
path: Sources/Dev
project: content-hub-phase6
tags:
- pbs
- n8n
- trello
- instagram
- automation
- flask
- mysql
type: project-plan
---
# PBS Content Hub Phase 6 — Trello Sync & Workflow Bridge
## Goal
Close the workflow gap between Jenny's existing tools (Trello, Canva, Instagram) and the Content Hub built in Phase 5.
The Phase 5 architecture assumed Jenny would create Stage 1 project records directly in the hub. She doesn't. Her planning lives in Trello, video work in Canva, posting in Instagram natively. Without Stage 1 records, the auto-match routine has nothing to match against, every published post falls into Needs Review, and the alert stream loses signal.
Phase 6 makes the hub a *bridge* between Jenny's existing tools and the automation — not a destination she has to adopt. Specifically:
1. Sync Jenny's Trello cards into hub projects so Stage 1 records exist by virtue of her existing planning.
2. Handle non-recipe posts (book promos, lifestyle) deterministically via a `no-reply` project type, eliminating false alerts.
3. Make the chat alert actionable: deep-link directly to the platform post detail page where the matching action can happen.
4. Bring the matching action to the platform post page itself, since that's the natural landing surface from an alert.
5. Add visual post recognition (thumbnails + LLM-generated fallback titles) so posts can be identified at a glance.
## Locked Decisions
### Decision 1: Trello → Hub Project Sync (One-Way Initially)
n8n watches Jenny's content Trello board. When a card is created or moves into specific lists, n8n creates or updates a corresponding hub Project via the existing API.
- **Source of truth:** Trello for project existence, title, status; hub for technical bindings (recipe link, platform post link).
- **Field mapping (initial):**
- Trello card title → Project title
- Trello list → Project status (e.g. Planned → `raw`, Posted → match candidate)
- Trello label or custom field → Project type (reel, recipe-video, shop-vlog, tip, no-reply)
- Trello card ID stored on Project for round-trip identification
- **Direction:** Trello → hub one-way for v1. Round-trip (hub status → Trello list) deferred until one-way is stable.
### Decision 2: `no-reply` Project Type
Add `no-reply` to the existing project type list. Projects of this type are explicitly non-actionable for the comment automation:
- When a platform post is linked to a no-reply project, the comment workflow never attempts a recipe lookup.
- No alert fires on comments to no-reply posts, regardless of keyword.
- Jenny tags book promos, lifestyle posts, announcements as no-reply in Trello via label or designated list.
Makes the non-recipe case explicit instead of inferred, with zero guessing on the workflow side.
### Decision 3: Alert as Google Chat Card with Deep Link
Replace the plain-text "Did not find a record!" message with a Chat Card containing:
- Platform badge (instagram / tiktok)
- Post thumbnail (fetched via Graph API)
- Post title (manual > LLM-generated > first caption sentence)
- Comment text + commenter handle
- **Action button "Open in pbs-hub"** → links to `/admin/platform-posts/{platform_post_id}`
Eliminates "copy ID from chat, switch tab, search by ID" entirely.
### Decision 4: Matching Action on the Platform Post Page
The platform post detail page gains a Link-to-Project action when no project is linked:
- Project picker (searchable dropdown over existing projects, fed by Trello sync)
- Inline "Create new project" option (rare, since Trello should populate most cases)
- Quick "Mark no-reply" action that creates and links a no-reply project in one step
Once linked, the page shows the linked project with an Unlink option as it does today.
### Decision 5: Visual Post Recognition
- Show the post thumbnail on the platform post detail page and in the platform posts list (fetched live from Graph API on page load; not stored).
- **Title precedence:** manual title > LLM-generated > first caption sentence.
- LLM title via a small Claude API call ("title this post in 35 words from its caption"), called once at post ingest and stored.
- Manual override always wins. LLM is the fallback that gives no-reply posts and unmapped posts a readable handle.
### Decision 6: Route by External ID
Change `/admin/platform-posts/{internal_id}` to `/admin/platform-posts/{platform_post_id}` so chat alerts can construct deep links from webhook data without a lookup query. Cleaner, more shareable, and the route the chat card targets.
### Decision 7: Hold-and-Flush for Held Comments
Verify or implement the Phase 4 "Queue and Retry Pattern (Option B)": comments on unmatched posts that pass the keyword gate are held in a `pending_comments` table with a TTL (default 24h). When the post gets matched (via Trello sync, auto-match, or manual action), held comments flush and the DM goes out. After TTL, they expire silently — no DM, no noise.
## Open Items
- [ ] Which Trello board is the content board? Shared, or Jenny-only?
- [ ] What signals project type in Trello: labels, lists, or a custom field?
- [ ] Trigger for Trello → hub sync: webhook, polling, or n8n Trello node?
- [ ] LLM title generation: at ingest, or lazy on first view?
- [ ] Hold-and-flush TTL — is 24h the right default?
- [ ] Round-trip Trello sync (hub status → Trello list): include or defer?
## Build Phases
### Target workflow after Phase 6
```
Jenny creates Trello card "Vegan Pimento Cheese reel"
n8n syncs → Project record created in hub (status: raw, type: reel)
Jenny links recipe to project (or via Trello custom field eventually)
Jenny posts to Instagram natively
IG webhook → n8n writes platform_posts → pings hub /api/match/run
Hub auto-matches by recipe.post_id or keyword
→ Match → status: live-matched, automation active
→ No match → status: needs-review, chat card sent with deep link
Travis taps card → lands on /admin/platform-posts/{id}
→ Picks the right project from the dropdown → done
→ Or marks as no-reply if it's a book promo → done, never alerts again
```
### Implementation steps
1. Survey Jenny's current Trello board — columns, labels, card patterns.
2. Define Trello ↔ Project field mapping with Jenny.
3. Build n8n Trello → hub sync workflow (one-way, additive, idempotent).
4. Add `no-reply` to project types (DB + UI).
5. Refactor platform post URL routing to use `platform_post_id`.
6. Replace plain-text alert with Google Chat card + deep-link button.
7. Add Link-to-Project action on platform post detail (picker + create-new + mark-no-reply).
8. Add thumbnail + LLM title to platform post ingest + detail page.
9. Verify or implement hold-and-flush with TTL.
10. Test end-to-end on staging: Trello card → publish → match → comment → DM.
## Notes
### Scope boundaries — not in Phase 6
- Round-trip Trello sync (hub → Trello). Deferred until one-way is stable.
- Caption authoring or scheduling from the hub. Jenny continues posting natively.
- Cross-platform parity (TikTok/YouTube). Phase 6 keeps Instagram as the primary path; other platforms inherit the bridge model but their detection workflows are separate efforts.
- Embedding pipeline / vector search (separate `pbs-hub-vector-search` project, deferred).
### Context from prior phases
Phase 5 designed and largely built the Content Hub around a project-centric data model: Projects link to Recipes (from WordPress) and to Platform Posts (from Instagram, TikTok). The auto-match routine, two-stage lifecycle, and "Needs Review" status are already designed there. Phase 6 builds on top — it does not replace any Phase 5 decisions.
Related: `content-hub-phase5-architecture`, `content-hub-phase5-planning`, `instagram-reel-sync-phase4`, `instagram-automation-content-hub-plan`.
### Key insight underlying this phase
The original Phase 5 plan made a single structural assumption that quietly broke the workflow in practice: Jenny would create Stage 1 records directly in the hub. Recognizing she doesn't — that her planning lives in Trello — reframes the hub from "a tool Jenny adopts" to "a bridge between her tools and the automation." Phase 6 is the consequence of seeing that.