← Back to brief

reference approval queue

memory · reference_approval_queue.md

Top section of brief.josephbowens.com (2026-04-22+)

The PWA now shows an Approvals collapsible as the FIRST thing you see — above the Morning Brief. Any pending items from any of four outreach channels surface here with deep-links to the native tool where approval happens.

URL: https://brief.josephbowens.com
Auto-opens if there are pending items; stays collapsed when queue is clear.

Four independent channels

EmojiChannelSource skillState fileDeep-link target
✉️Direct draftsgmail-deep-scan (Step 5b)pending_drafts.jsonlGmail draft URL
📧SmartLeaddaily-beenverified-enrichment (future wiring)pending_smartlead_batches.jsonlSmartLead campaign URL
📬Postcardsgrand-county-property-scout (future wiring)pending_postcard_batches.jsonlPostcard workbook / Jasmine draft
🤝Realtor introsnightly-consolidation (future wiring)pending_realtor_intros.jsonlGmail search URL for Rachel's intro thread
HubSpot Sequences are NOT a channel — decommissioned 2026-04-22. See project_hubspot_sequences_running.md.

File paths

Item schema (canonical)

json
{
  "id": "unique-string",
  "channel": "direct_drafts" | "smartlead" | "postcards" | "realtor_intros",
  "title": "short summary < 80 chars",
  "context": "1-3 line elaboration",
  "deep_link": "URL to native tool",
  "created_at": "ISO8601",
  "urgency": "RED" | "YELLOW" | "INFO",
  "source_skill": "skill-name",
  "meta": { / channel-specific fields / }
}

Rendering rules

Current state (as of 2026-04-22)

How source skills populate the queues (writer contract)

Each source skill is responsible for:
1. Appending new items when it detects a pending state (e.g., gmail-deep-scan sees a new draft in Gmail → writes pending_drafts entry)
2. Removing items when the pending state is resolved (draft was sent, batch was activated, etc.)
3. Updating urgency based on age + content (e.g., draft to active-deal person > 24h = RED)

Cleanup rules:

Wiring status per source skill (all 4 wired 2026-04-22)

Architectural decision: smart inbox vs swipe-to-approve

v1 is smart inbox (deep links to native tools for native approval). No backend. v2 candidate (future): swipe-to-approve via Cloudflare Pages Functions + KV, where tapping "Approve" executes the action server-side. Held back until v1 is in daily use and the deep-link friction is the actual bottleneck.

How to apply