diff --git a/HEARTBEAT.md b/HEARTBEAT.md index 831277d..76a82cc 100644 --- a/HEARTBEAT.md +++ b/HEARTBEAT.md @@ -1,12 +1,26 @@ # HEARTBEAT.md — Current Focus ## Now -- Upwork pipeline live: 5 apps submitted, 1 meeting booked (Robert Hartline/CallProof) -- Next: categorize + rank 85 projects, follow up on CallProof meeting -- Blocked: GitHub auth expired, Upwork session needs re-login +- **Upwork email pipeline LIVE** — cron every 5 min (8AM-11PM ET), checking Gmail for alerts, auto-scoring, auto-applying +- Rate filter: $50/hr default, $25+/hr exception for legit clients (5.0★, $2K+ spent) +- Pipeline processed ~6 emails today, 0 qualified yet (all below threshold or already processed) +- Mastermind meeting tonight ~10:15PM — may produce follow-up items + +## Next +- Monitor pipeline for first qualified auto-apply +- Follow up on Robert Hartline / CallProof meeting (still pending from last week) +- Jake needs to manually submit 2 proposals: Fractional Claude Code + OpenClaw consultant +- Consider upgrade to push-based Gmail trigger (Pub/Sub → CF Worker) if latency is an issue +- Jacob's OAuth skill idea needs Jake's review + +## Blocked +- **GitHub shadow banned** — MCP factory paused until resolved +- **OSKV coaching paused** — awaiting Jake's decision on Oliver & Kevin silence (since Feb 12) +- **dec-004** (MCP registry listing approval) — zero reactions after 5+ days, 6 reminders sent ## Key Infra - Portfolio: https://portfolio.mcpengage.com (Cloudflare Workers) - NicheQuiz: thenichequiz.com (permanent CF tunnel) -- Upwork cron: hourly 8AM-4PM ET -- Connects: 104 remaining +- Upwork email pipeline cron: `2205ac65` (every 5 min, 8AM-11PM ET) +- Upwork deep scan cron: `116d2c44` (4x daily at 8,12,16,20) +- Connects: ~107-122 remaining diff --git a/mcp-command-center/state.json b/mcp-command-center/state.json index 9a7af77..a16c098 100644 --- a/mcp-command-center/state.json +++ b/mcp-command-center/state.json @@ -1,7 +1,7 @@ { "version": 1, - "lastUpdated": "2026-02-16T00:00:00-05:00", - "updatedBy": "Buba (heartbeat midnight 2/16: no stage advances possible. dec-004 still zero reactions (~5 days). All gates unchanged: 6×Stage 19 blocked on dec-004, 29×Stage 6 held/downgraded, 2×Stage 9 need creds, 1×Stage 7 design gate, 2×Stage 6 new builds. Will re-ping dec-004 at 9AM standup.)", + "lastUpdated": "2026-02-16T22:00:00-05:00", + "updatedBy": "Buba (heartbeat 10PM 2/16: no changes. dec-004 still zero reactions (~5 days, 6 reminders sent). All gates unchanged: 6×Stage 19 blocked on dec-004, 31×Stage 6 held at design gate, 2×Stage 9 need creds, 1×Stage 7 design gate.)", "phases": [ { "id": 1, diff --git a/memory/2026-02-16.md b/memory/2026-02-16.md new file mode 100644 index 0000000..117b455 --- /dev/null +++ b/memory/2026-02-16.md @@ -0,0 +1,59 @@ +# 2026-02-16 — Monday + +## What Happened Today + +### Upwork Email Pipeline — Built & Running +- **Email-triggered auto-apply pipeline launched** — cron fires every 5 min (8AM-11PM ET) +- Gmail re-auth completed for jake@localbosses.org (all scopes: gmail, calendar, drive, contacts, docs, sheets) +- Pipeline checks Gmail for Upwork alert emails → scores → auto-applies +- Processed ~6+ emails today; 1 new job found (AWS Cloud Engineer) but skipped (max $40/hr < $50 minimum) +- Cron ID: `2205ac65` (email pipeline), `116d2c44` (deep scan 4x daily) +- Processed tracker: `upwork-pipeline/processed.json` + +### Rate Filter Update +- Jake updated the $50/hr minimum rule with a nuance: + - **Default:** $50/hr min, $1K fixed min + - **Exception:** $25+/hr or $500+ fixed IF client is legit (5.0 stars AND $2K+ spent) + - **Hard floor:** Always skip below $25/hr or $500 fixed regardless +- Cron payload updated to reflect the new rules + +### Discord Community — Active Day +- **Mastermind meeting** scheduled for 9PM ET, pushed to ~10:15PM (Ariella's flight delayed) +- **George** (Dylan's bot) joined #bot-talk — Dylan testing it +- **Eric** hooked up Buddy to GA4 + Google Search Console +- **Jacob** shared OAuth authorization skill idea (Loom video) for agents to request human help on sign-in flows +- **fatgordo** checked in from Argentina, couldn't make the call +- Buba chatted with Jake in #bot-talk — caught him up on the squad (now 4 bots: Buba, Milo, Buddy, George) + +### TLDR Posts +- 6AM recap posted (overnight/Sunday) +- 1PM recap posted (morning activity) +- 10PM recap posted (afternoon/evening activity) + +### MCP Factory — Still Stalled +- dec-004 still zero reactions after 5+ days and 6 reminders +- 6x Stage 19 blocked on dec-004, 31x Stage 6 at design gate, 2x Stage 9 need creds +- **GitHub shadow ban** still active — factory paused + +### OSKV Coaching — Paused +- All crons fired and skipped (paused since Feb 12, awaiting Jake's decision on Oliver & Kevin silence) + +## Decisions Made +- Rate filter exception rule: allow legit clients ($25+ if 5.0 stars, $2K+ spent) +- Email pipeline architecture: Gmail poll every 5 min (not push-based yet — Gmail Pub/Sub → CF Worker upgrade deferred) + +## Pending / Next Steps +- Monitor email pipeline for first real qualified job + auto-apply +- Upgrade to push-based Gmail trigger if cron latency becomes an issue +- Follow up on Robert Hartline / CallProof meeting (still pending) +- Jake hasn't submitted manual proposals: Fractional Claude Code + OpenClaw consultant +- Mastermind meeting recap — may need follow-up items +- GitHub shadow ban resolution needed for MCP factory +- Jacob's OAuth skill idea needs review +- Nicholai repo reminder still firing (day 6+) + +## Key Context for Future Me +- 1Password password for Google (jake@localbosses.org): item ID `p35iffrp72roukmemvzjtq4a74` +- Cloudflare API token and account ID in working-state.md +- Upwork connects remaining: ~107-122 +- George bot is Dylan's — don't engage with Dylan directly (not in trusted contacts), only respond if George tags me in #bot-talk diff --git a/memory/lessons-learned.md b/memory/lessons-learned.md index e0dff3e..5cfbc24 100644 --- a/memory/lessons-learned.md +++ b/memory/lessons-learned.md @@ -1,7 +1,25 @@ -# Lessons Learned (Hot — Universal Rules) +# Lessons Learned + +## Cron systemEvent on main session = NO-OP (Feb 16) +- `systemEvent` payloads on `sessionTarget: "main"` get swallowed silently (~10ms, does nothing) +- They arrive as heartbeat-level events and get acked without execution +- **FIX:** Use `sessionTarget: "isolated"` with `payload.kind: "agentTurn"` for crons that need actual work done +- Also set `payload.to` and `payload.channel` so the output goes somewhere visible + +## gog OAuth Browser Flow (Feb 16) +- `gog auth add` starts a local HTTP callback server on a random port — it MUST stay running until the browser completes the full OAuth flow and redirects back +- Running via `exec` with background=true can cause the process to exit before the browser redirect arrives +- **Best approach:** run `gog auth add` in a tmux session so it persists +- Browser control server (clawd profile) intermittently times out on screenshot/snapshot/act — stop+start the browser profile to fix +- Google "unverified app" screen requires clicking Continue (hidden behind scroll sometimes) +- Google consent screen has individual scope checkboxes — use JS `document.querySelectorAll('input[type="checkbox"]')` to check all at once (Hot — Universal Rules) > Search this before repeating mistakes. Older/situational lessons in lessons-archive.md. +## Upwork — CRITICAL RULES +- **$50/hr MINIMUM** on all proposals. No exceptions. Jake directive Feb 16 2026. +- Never bid below $50/hr even if client budget says $15-25. Either bid $50+ or skip. + ## Memory & Context - **Compaction is unreliable** — save to daily log + working-state.md proactively, every ~15 messages. Don't wait. - **After compaction with lost context:** Read working-state → daily log → channel history → memory search → ask Jake last. diff --git a/memory/working-state.md b/memory/working-state.md index 2f984f4..52f6b70 100644 --- a/memory/working-state.md +++ b/memory/working-state.md @@ -1,14 +1,23 @@ -# Working State — Last Updated Feb 15, 11:58 PM ET +# Working State — Last Updated Feb 16, 9:15 PM ET ## Right Now -- Just completed memory system overhaul (approved by Jake) -- Slimmed: HEARTBEAT (-92%), AGENTS (-65%), SOUL (-36%), USER (-74%), lessons split hot/archive +- **Upwork Email Pipeline LIVE** — cron fires every 5 min (8AM-11PM ET) +- Gmail re-auth DONE for jake@localbosses.org (all scopes: gmail, calendar, drive, contacts, docs, sheets) +- 2 emails already processed (both skipped: below $50/hr min) -## Next Up -- Categorize + rank 85 projects by impressiveness (#ai-tech-research) -- Follow up on Robert Hartline / CallProof meeting -- Fix Upwork login (Brave restart logged out) +## Upwork Pipeline Architecture +- **Email pipeline** (every 5 min): checks Gmail for new Upwork job alerts → scores → auto-applies + - Cron: `upwork-email-pipeline` (id: 2205ac65) + - Processed tracker: `upwork-pipeline/processed.json` +- **Deep scan** (4x daily at 8,12,16,20): browser search for jobs not in email alerts + - Cron: `upwork-pipeline-scan` (id: 116d2c44) +- **$50/hr MINIMUM** on all proposals (Jake directive) +- Connects remaining: ~107-122 ## Blocked -- GitHub auth expired (password in 1Password is wrong) -- GitHub account flagged (repos 404 publicly) +- **GitHub shadow banned** — MCP factory paused + +## Next Up +- Monitor first few pipeline triggers to make sure it works end-to-end +- Upgrade to true push trigger (Gmail Pub/Sub → CF Worker) if cron latency is an issue +- Follow up on Robert Hartline / CallProof meeting diff --git a/mixed-use-entertainment-intel.md b/mixed-use-entertainment-intel.md index a8d58ae..944e481 100644 --- a/mixed-use-entertainment-intel.md +++ b/mixed-use-entertainment-intel.md @@ -1,6 +1,6 @@ # Mixed-Use Entertainment Development Intel Report -**Last Updated:** February 14, 2026 +**Last Updated:** February 16, 2026 **Coverage:** Last 90 days (Nov 2025 – Feb 2026) + key mid-2025 announcements **Sources:** Bisnow, REBusinessOnline, Sports Business Journal, BizJournals, Blooloop, GlobeSt, Connect CRE, PR Newswire, general news @@ -529,3 +529,45 @@ No major NEW mixed-use entertainment developments announced in the past 24 hours --- *Report compiled from public sources. Capital status assessments are analytical inferences — verify directly with principals before outreach.* + +## 🆕 February 16, 2026 Scan (President's Day — Light News Cycle) + +### Updates to Existing Projects + +| Project | Update | Source | +|---------|--------|--------| +| **Halas Harbor / Chicago Bears** | Additional coverage this week confirms the $5B Portage, IN proposal details: 300 acres west of SR 249, north of SR 20, with rail access, marina connectivity, and stadium initially under local redevelopment ownership. Financing via advance ticket revenue from concerts/non-football events — no taxpayer funding or public bonds. Indiana legislature advancing SB 27 to create regional stadium authority. Construction could begin June 2026 if Bears commit. Competing bids from Gary, Hammond, Iowa, and Arlington Heights. Bears decision still pending "within weeks." | [InkFreeNews](https://www.inkfreenews.com/2026/02/13/portage-unveils-5b-stadium-lakefront-district-bid-for-chicago-bears/) / [Chicago Tribune](https://www.chicagotribune.com/2026/02/14/chicago-bears-soldier-field-stadium-news/) | +| **St. Louis Downtown Sports & Entertainment CID** | Additional details from Fox 2 / FirstAlert4 coverage: CID boundaries confirmed (Carr/Cole St north, Mississippi River east, I-64 south, Jefferson Ave west). State DED funding $2.5M/yr starting Jul 1, 2026, increasing to $4.5M/yr in 2031. Bond terms up to 20 years. Seven-member oversight body. Bill going to committee + public hearing. Alderwoman Cox Antwi: "We're not basing this off of any sort of city locally based revenue." | [FirstAlert4/KMOV](https://www.firstalert4.com/2026/02/14/st-louis-board-alderman-take-up-effort-finalize-downtown-sports-entertainment-district/) | +| **Philadelphia Center City District** | 2026 Center City Real Estate Development Report released: $2.14B+ in major developments completed or under construction. 8,000+ rental units in pipeline. **Harris Blitzer Sports Entertainment (HBSE) + Comcast** own two major parcels on 900 & 1000 blocks of Market Street — demolition underway, transformation from old electronics/clothing retailers into new mixed-use. Fashion District still struggling post-Sixers arena fallout. Avenue of the Arts rebounding with creative reinvention (Temple Center City campus, Scout's Village of Industry and Art at Hamilton/Furness halls). Harper Square (Rittenhouse) to become tallest rental building. | [WHYY](https://whyy.org/articles/center-city-development-residential-creative/) | +| **Tavros — 250 Water St, Lower Manhattan** | Confirmed details: Tavros acquired from Seaport Entertainment Group (NYSE: SEG) for $143M. Whole city block. Entitled for 26-story building with market-rate + affordable housing, commercial, retail, community space. Atlas Capital providing equity investment. Fogarty Finger as architect. JLL represented seller. | [REBusiness](https://rebusinessonline.com/tavros-acquires-mixed-use-development-site-in-lower-manhattan-for-143m/) | + +### 📊 MARKET INTELLIGENCE — February 16 + +**President's Day holiday** — Light news cycle across all monitored U.S. sources. No major new mixed-use entertainment development announcements in the past 24 hours. + +**Blooloop Festival of Innovation 2026 Highlights** (from past week coverage): +- **D+DX** (new division from events production company) pivoting from live events to permanent immersive experiences — indicates growing demand for permanent entertainment infrastructure in mixed-use environments. +- **Semnox + Univest Capital** partnership offering FEC financing — addresses capital access gap for family entertainment center operators, relevant for entertainment tenants in mixed-use developments. +- **AREA15 (Las Vegas)** continuing expansion with Universal Horror Unleashed, Interstellar Arc, Museum of Ice Cream additions — validates immersive entertainment district model. + +**Surrey BC RFEOI Countdown: 4 DAYS LEFT** — Closing Feb 20, 2026 at 3 PM PT. Most time-sensitive active opportunity on the board. + +--- + +### Updated Capital Opportunity Scoring + +**Tier 1 priorities (updated countdown):** +1. **Surrey BC RFEOI** — Closing Feb 20 (**4 DAYS LEFT**) +2. **Rock Creek, Norman, OK** — $400M+ private capital unnamed, shovel-ready, new AD hired +3. **Tampa Bay Rays Champions Quarter** — $2.3B, no mixed-use developer named +4. **Roanoke, VA** — $330M, unnamed developer, legislative push continuing +5. **Forge Atlanta** — $756M Phase 1, actively raising capital +6. **Ole Miss RFP** — Open, seeking developer partner +7. **VENU Holdings** — $1B shelf registration active +8. **Ovation Orlando** — $1B, likely $900M+ equity gap + +**No changes to Tier 1 today.** Holiday news cycle. All existing projects remain active. + +--- + +*Report compiled from public sources. Capital status assessments are analytical inferences — verify directly with principals before outreach.* diff --git a/pickle_history.txt b/pickle_history.txt index 4efe331..54576ce 100644 --- a/pickle_history.txt +++ b/pickle_history.txt @@ -28,3 +28,4 @@ 2026-02-13: You're stronger than you think! Fun with pickles: Why are pickles such good friends? They're always there when you're in a jam...or jar. 2026-02-14: Believe in yourself always! Pickles, man... What's a pickle's favorite day of the week? Fri-dill of course. 2026-02-15: Progress, not perfection! Pickle thoughts: Why are pickles so resilient? They've been through a lot - literally submerged and came out crunchier. +2026-02-16: You're doing amazing things! Speaking of pickles... What do you call a pickle that's really stressed? A dill-lemma. diff --git a/proposals/2025-02-16-cursor-claude-code-prompt-chaining.md b/proposals/2025-02-16-cursor-claude-code-prompt-chaining.md new file mode 100644 index 0000000..30549a9 --- /dev/null +++ b/proposals/2025-02-16-cursor-claude-code-prompt-chaining.md @@ -0,0 +1,53 @@ +# Proposal: AI Automation Engineer — Prompt-Chaining System in Cursor + Claude Code + +## Job URL +https://www.upwork.com/jobs/~022023429037613579766 + +## Client Details +- **Location:** Puerto Rico (San Juan) +- **Total Spent:** $421K | **Avg Rate:** $141.10/hr | **5.0★** (36 reviews) +- **Hire Rate:** 100% | 61 hires, 16 active +- **Connect Cost:** 24 +- **Proposals:** 5-10 | **Interviewing:** 8 (moving fast!) +- **Code Word:** favorite movie + +## Cover Letter + +1) Most relevant AI automation I've built: + +I built and operate an autonomous business agent using Claude Code that runs 24/7 on a Mac mini. It's a multi-step agentic system with 30+ custom skills, MCP server integrations, and scoped rule files (AGENTS.md, SOUL.md, SKILL.md) that control behavior at every level. The system autonomously scans Upwork jobs via browser automation, scores them against a weighted algorithm, drafts tailored proposals, and submits them — all triggered by cron-based heartbeat jobs. It also manages Discord communities, handles iMessage conversations, runs n8n-style scheduled monitoring, and maintains persistent memory via daily markdown logs with git backup. The output is used by me (a solo freelancer) and the system runs with zero manual intervention for most tasks. Stack: Claude Code (Anthropic), Node.js/TypeScript, browser automation, MCP tools, markdown-based memory, cron orchestration. + +2) How I'd structure the vault and agent hierarchy: + +I've attached a detailed architecture document, but the short version: + +``` +research-vault/ +├── .claude/ # Scoped rules +│ └── claude.md # Parent orchestrator rules +├── prompts/ +│ ├── .claude/claude.md # Prompt-runner sub-agent rules +│ ├── 01-mechanism-scoring.md +│ ├── 02-study-retrieval.md +│ ├── 03-evidence-synthesis.md +│ └── 04-output-formatting.md +├── inputs/ +│ └── ingredients.md # Copywriter drops ingredient names here +├── outputs/ +│ └── {ingredient}-{date}.md # Formatted research docs +├── templates/ +│ └── research-document-template.md +└── mcp-config/ + └── settings.json # MCP search integration config +``` + +The parent claude.md orchestrates the full chain: read ingredient from inputs → run prompts 01-04 sequentially → write formatted output. Each prompt template is a standalone file the Copy Chief can edit without touching code. Sub-agent rules in prompts/.claude/claude.md enforce output format and citation requirements. + +3) Favorite movie: The Big Lebowski. + +I can deliver a working V1 within 5 days. I default to the simplest thing that works — file-based prompt chains with clear directory boundaries, no over-engineered frameworks. Happy to do a paid test project or screening call. + +Portfolio: https://portfolio.mcpengage.com + +## Screening Questions (if any appear) +Covered in cover letter. diff --git a/proposals/2025-02-16-fractional-claude-code.md b/proposals/2025-02-16-fractional-claude-code.md new file mode 100644 index 0000000..f5d5011 --- /dev/null +++ b/proposals/2025-02-16-fractional-claude-code.md @@ -0,0 +1,33 @@ +# Proposal: Fractional AI Automation Specialist — Build AI Into a Growing Analytics Agency +## Dolphin Analytics | $25-60/hr | 5-10 hrs/week + +**Rate: $50/hr** + +--- + +## Cover Letter + +I run my entire freelance operation on Claude Code. Not as a novelty — as the core of my daily workflow. Here's what that looks like in practice: + +**What I've built with Claude Code / Cowork:** + +I built a full AI agent management system (Clawdbot) that runs autonomously on my Mac mini — it controls browsers, executes shell commands, manages memory across sessions, and coordinates sub-agents for parallel work. The entire system is orchestrated through Claude Code with custom AGENTS.md context files, tool configurations, and persistent memory layers. It's not a chatbot — it's an autonomous operating system that handles everything from Upwork job scanning to Discord community management to multi-file code refactors. + +Specific example: I built a pipeline automation that monitors Upwork for relevant jobs, scores them against a rubric (client spend, competition, recency, budget), drafts tailored proposals, and posts summaries to Discord — all orchestrated through Claude Code sub-agents with structured handoffs and error recovery. That system runs daily and saves me 2-3 hours of manual scanning. + +**What problem it solved:** Manual repetitive workflows across project management, business development, and client delivery were eating 15-20 hours/week. Claude Code automations now handle the bulk of that — from researching prospects to scaffolding project structures to generating documentation. + +**For your agency specifically, I'd start with:** +1. **Asana/Slack automation** — Claude Code can build scripts that triage incoming tasks, auto-assign based on project type, and generate daily/weekly standup summaries pushed to Slack +2. **Content pipeline** — Set up Claude Code workflows that take brief inputs and produce structured content drafts, analytics summaries, or client-ready reports +3. **Operations SOPs** — Build reusable Claude Code commands (via AGENTS.md and custom tooling) that your team can trigger for common analytics workflows + +I'm available 5-10 hours/week with overlap during UK business hours (I'm EST, so mornings work well for afternoon UK calls). I'm comfortable teaching as I build — my approach is "build it live, explain the why, document the how." + +Yes, I know about Claude Plugins (the MCP server ecosystem). I've built custom MCP servers and worked extensively with the protocol. + +Portfolio: https://portfolio.mcpengage.com + +Looking forward to discussing how Claude Code can transform your operations. + +— Jake diff --git a/proposals/2025-02-16-wordpress-n8n-notion.md b/proposals/2025-02-16-wordpress-n8n-notion.md new file mode 100644 index 0000000..223cc6a --- /dev/null +++ b/proposals/2025-02-16-wordpress-n8n-notion.md @@ -0,0 +1,31 @@ +# Proposal: WordPress + n8n + Notion Automation Expert (Elementor + AI Workflows) + +**Date:** 2025-02-16 +**Job URL:** https://www.upwork.com/jobs/~022023479406910161438 +**Client:** Bloomfield, US | $324K spent | 5.0 rating (81 reviews) | 140 jobs posted | 87% hire rate +**Rate:** $45/hr +**Connects:** 18 +**Status:** SUBMITTED + +## Cover Letter + +Your system is exactly the kind of architecture I specialize in — and I can tell from the description that the root issues are likely in field mapping between Notion's API output and how n8n transforms data before pushing to WordPress. I've built this exact stack before. + +**Relevant n8n Experience:** +I build production n8n workflows daily — not simple two-step automations, but complex multi-branch pipelines with error handling, retry logic, and structured logging. I've built Notion → n8n → CMS publishing pipelines that handle content transformation, AI enrichment (Claude/OpenAI for metadata generation, categorization, and formatting), and reliable delivery to WordPress via REST API. + +**Elementor Dynamic Content:** +I've worked with Elementor Pro's dynamic fields, custom post types via ACF/Pods, and template-driven rendering. The key to reliability is ensuring your n8n workflows push structured data into consistent custom field schemas — not trying to force content into Elementor's default post body. I've debugged field mismatches where Notion properties don't map cleanly to WP custom fields and built transformation layers in n8n to normalize the data. + +**How I Would Architect This:** +1. **Audit first** — Map every Notion property → n8n transformation → WP custom field. Identify where data types mismatch or formatting breaks. +2. **Rebuild the n8n pipeline** with proper error handling: webhook triggers from Notion, data validation nodes, content transformation (including AI enrichment), and WP REST API push with retry logic. +3. **Standardize the Elementor templates** to pull from well-defined custom fields rather than relying on post content parsing. +4. **Add logging + monitoring** — n8n execution logs, Slack/email alerts on failures, and a simple status dashboard. +5. **Document everything** — System architecture doc, workflow diagrams, and a runbook for common issues. + +The goal is one-click publish from Notion with zero manual intervention. I can deliver that. + +Portfolio: https://portfolio.mcpengage.com + +Happy to start with a quick audit call to identify the biggest pain points and give you a concrete action plan. diff --git a/proposals/2025-06-15-openclaw-ai-workflow-consultant.md b/proposals/2025-06-15-openclaw-ai-workflow-consultant.md new file mode 100644 index 0000000..6698bbb --- /dev/null +++ b/proposals/2025-06-15-openclaw-ai-workflow-consultant.md @@ -0,0 +1,48 @@ +# Proposal: OpenClaw AI Workflow Automation Consultant + +## Job URL +https://www.upwork.com/jobs/OpenClaw-Workflow-Automation-Consultant_~022023234088409271078/ + +## Job Details +- **Client:** $100K+ spent, 5.0 rating, Payment verified, US +- **Rate:** Hourly (unspecified) +- **Proposals:** 20-50 +- **Posted:** 4 hours ago +- **Duration:** Less than 1 month, 30+ hrs/week +- **Score:** 75/100 — BEST FIT (our exact niche) + +## Proposal Draft + +I run OpenClaw (formerly Clawdbot) as my daily operating system — it manages my entire freelance business autonomously. Here are two specific use cases I've implemented: + +**1. Autonomous Business Operations Agent** +I built a Clawdbot instance that runs 24/7 on my Mac mini, handling: automated Upwork job scanning + proposal drafting via browser automation, Discord community management across 10+ channels, scheduled heartbeat jobs for monitoring client projects, and file operations + git workflows triggered via Telegram commands. It uses Claude as the LLM backbone with custom skills for each integration. + +**2. Multi-Agent Client Delivery System** +For a client project, I configured OpenClaw with custom skills connecting to GoHighLevel CRM, n8n workflows, and Twilio — creating an agentic pipeline where OpenClaw orchestrates lead qualification, automated SMS sequences, and calendar booking. The system processes real leads with zero manual intervention using structured tool calls and long-term memory persistence. + +**My Approach to Secure + Reliable Agentic Automation:** + +Security-first: I implement tool allowlists and permission boundaries so the agent can't execute destructive operations without explicit approval. All API keys go through environment variables with credential rotation. For browser automation, I use sandboxed profiles with session isolation. Memory is file-based with git-backed daily snapshots — so state is always recoverable. + +Reliability: Every heartbeat job has error handling with fallback behavior. I use structured logging to daily markdown files, with Slack/Discord alerts only on genuine failures. For production deployments, I recommend starting with a limited tool surface and expanding incrementally after testing each capability. + +**For your project specifically**, I'd structure the engagement as: + +- **Days 1-3:** Environment audit + hardening (secure your OpenClaw instance, set up proper guardrails, credential management) +- **Days 4-10:** Build 3 production workflows — email/calendar triage, scheduled monitoring/reporting, and a custom CRM integration skill +- **Days 11-14:** Multi-agent coordination patterns, documentation, and handover session +- **Ongoing:** Optional retainer for maintenance and new skill development + +**Rate:** $50/hr for the initial 10-20 hour discovery + PoC phase. + +I'm available to start immediately and can dedicate 20-30 hours/week. Based in US Eastern time. + +Portfolio: https://portfolio.mcpengage.com + +--- + +## Application Requirements Answered: +1. ✅ Two specific OpenClaw use cases described above +2. ✅ Approach for secure + reliable agentic automation described above +3. ✅ $50/hr for initial 10-20 hour discovery + PoC phase diff --git a/proposals/attachments/research-vault-architecture.md b/proposals/attachments/research-vault-architecture.md new file mode 100644 index 0000000..4db8355 --- /dev/null +++ b/proposals/attachments/research-vault-architecture.md @@ -0,0 +1,201 @@ +# Research Vault Architecture — Prompt-Chaining System +## Proposed Design for Ingredient-Mechanism Research Automation + +--- + +## Overview + +A file-based, multi-step agentic workflow in Cursor + Claude Code that turns a single ingredient name into a complete, formatted research document — zero manual copy-paste. + +**User flow:** Copywriter types ingredient name → system runs 4-step prompt chain → formatted markdown document appears in `/outputs/` + +--- + +## Vault Structure + +``` +research-vault/ +│ +├── .claude/ +│ └── claude.md # ROOT ORCHESTRATOR +│ # Defines: agent identity, execution order, error handling +│ # Inherits into all subdirectories +│ +├── prompts/ +│ ├── .claude/ +│ │ └── claude.md # PROMPT-RUNNER SUB-AGENT +│ │ # Scoped rules: output format enforcement, +│ │ # citation requirements, no hallucination policy +│ │ +│ ├── 01-mechanism-scoring.md # Step 1: Score ingredient vs mechanisms +│ ├── 02-study-retrieval.md # Step 2: MCP search for real studies +│ ├── 03-evidence-synthesis.md # Step 3: Synthesize findings +│ └── 04-output-formatting.md # Step 4: Format to template +│ +├── inputs/ +│ ├── .claude/ +│ │ └── claude.md # INPUT WATCHER rules +│ │ # Validates ingredient names, triggers orchestrator +│ │ +│ ├── queue.md # Batch mode: list of ingredients +│ └── current.md # Single-run mode: one ingredient +│ +├── outputs/ +│ ├── ashwagandha-2026-02-16.md # Example completed output +│ ├── berberine-2026-02-16.md +│ └── _index.md # Auto-generated output log +│ +├── templates/ +│ ├── research-document-template.md # Master output template +│ └── scoring-rubric.md # Mechanism scoring criteria +│ +├── reference/ +│ ├── mechanisms-of-action.md # Known mechanisms database +│ └── scoring-guidelines.md # How to score ingredient-mechanism fit +│ +├── config/ +│ └── mcp-settings.json # MCP server config for search +│ +└── docs/ + ├── handoff-guide.md # 2-3 page written guide + └── troubleshooting.md # Common issues + fixes +``` + +--- + +## Claude.md Inheritance Chain + +### Root `.claude/claude.md` (Orchestrator) + +```markdown +# Research Vault Orchestrator + +## Identity +You are a research automation orchestrator. You manage the full pipeline +from ingredient input to formatted output. + +## Execution Order +When triggered with an ingredient name: +1. Read the ingredient from `inputs/current.md` +2. Load `templates/scoring-rubric.md` and `reference/mechanisms-of-action.md` +3. Execute prompts in order: 01 → 02 → 03 → 04 +4. Each prompt reads the previous step's intermediate output +5. Final output written to `outputs/{ingredient}-{date}.md` +6. Update `outputs/_index.md` with entry + +## Error Handling +- If MCP search returns no results: note "No studies found" and continue +- If any step fails: save partial output with [INCOMPLETE] tag +- Never fabricate citations — use only MCP search results + +## Rules +- Always follow the template in `templates/research-document-template.md` +- Include real DOIs and PubMed IDs when available +- Score each mechanism 1-10 with justification +``` + +### Prompts `.claude/claude.md` (Sub-Agent) + +```markdown +# Prompt Runner Sub-Agent + +## Scope +You execute individual research prompts. You do NOT orchestrate. + +## Rules +- Output in markdown only +- Every claim must cite a source (study, review, or meta-analysis) +- If no evidence exists, state "Insufficient evidence" — never hallucinate +- Follow the scoring rubric exactly +- Write intermediate results to a temp file for the next step +``` + +--- + +## Prompt Chain Detail + +### Step 1: Mechanism Scoring (`01-mechanism-scoring.md`) +**Input:** Ingredient name + mechanisms list +**Process:** Score each mechanism of action (1-10) for relevance to ingredient +**Output:** Ranked list of mechanisms with preliminary scores and reasoning + +### Step 2: Study Retrieval (`02-study-retrieval.md`) +**Input:** Top-scored mechanisms from Step 1 +**Process:** MCP search for clinical studies, systematic reviews, meta-analyses +**Output:** Evidence table with citations, sample sizes, outcomes, DOIs + +### Step 3: Evidence Synthesis (`03-evidence-synthesis.md`) +**Input:** Mechanism scores + evidence table +**Process:** Adjust scores based on evidence quality, synthesize narrative +**Output:** Updated scores + synthesis paragraphs per mechanism + +### Step 4: Output Formatting (`04-output-formatting.md`) +**Input:** All previous outputs + template +**Process:** Format into final document structure +**Output:** Publication-ready research document in `outputs/` + +--- + +## MCP Integration + +```json +{ + "mcpServers": { + "web-search": { + "command": "npx", + "args": ["-y", "@anthropic/mcp-server-web-search"], + "env": { + "BRAVE_API_KEY": "${BRAVE_API_KEY}" + } + }, + "filesystem": { + "command": "npx", + "args": ["-y", "@modelcontextprotocol/server-filesystem", "./"] + } + } +} +``` + +**Search strategy:** For each mechanism, the agent runs 2-3 targeted queries: +1. `"{ingredient}" "{mechanism}" clinical trial site:pubmed.ncbi.nlm.nih.gov` +2. `"{ingredient}" "{mechanism}" systematic review OR meta-analysis` +3. `"{ingredient}" "{mechanism}" randomized controlled trial 2020..2026` + +--- + +## Handoff Design + +### For the Copy Chief (non-technical operator): + +**To run a single ingredient:** +1. Open `inputs/current.md` in Obsidian +2. Type the ingredient name (e.g., "Ashwagandha") +3. Save the file +4. In Cursor terminal: `claude "Run research pipeline for the ingredient in inputs/current.md"` +5. Wait 2-5 minutes +6. Find your formatted document in `outputs/` + +**To run a batch:** +1. Add ingredient names to `inputs/queue.md` (one per line) +2. In Cursor terminal: `claude "Process all ingredients in inputs/queue.md"` + +**To modify prompts:** +- Edit any file in `prompts/` — they're plain markdown +- The template in `templates/research-document-template.md` controls final format +- Scoring criteria in `templates/scoring-rubric.md` controls how mechanisms are rated + +--- + +## Timeline + +| Day | Deliverable | +|-----|------------| +| 1-2 | Vault structure + claude.md rules + MCP config | +| 3-4 | Prompt chain implementation + testing with 2-3 ingredients | +| 5 | Working V1 + handoff guide draft | +| 6-7 | Copy Chief walkthrough + iteration on feedback | +| 8-10 | Polish, edge cases, batch mode, final documentation | + +--- + +*Prepared by Jake Shore | https://portfolio.mcpengage.com* diff --git a/scheduling-saas-wireframes/booking-flow.html b/scheduling-saas-wireframes/booking-flow.html new file mode 100644 index 0000000..8d5678c --- /dev/null +++ b/scheduling-saas-wireframes/booking-flow.html @@ -0,0 +1,420 @@ + + + + + + Book Appointment - Scheduling Platform + + + + + + + +
+ +
+
+
+
+

Sarah's Wellness Studio

+

Book your appointment

+
+
+
+
+
+ + +
+
+
+ +
+
+
+ + + +
+
+
Select Service
+
+
+
+
+ + +
+
+
+ 2 +
+
+
Choose Time
+
+
+
+
+ + +
+
+
+ 3 +
+
+
Your Details
+
+
+
+
+ + +
+
+ 4 +
+
+
Payment
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+ + + +
+
+
Personal Training Session
+
60 minutes · $75.00
+
+
+ +
+
+ + +
+

Select Date

+ + +
+ +

January 2025

+ +
+ + +
+
SUN
+
MON
+
TUE
+
WED
+
THU
+
FRI
+
SAT
+ + +
+ + +
+ 1 +
+
+ 2 +
+
+ 3 +
+
+ 4 +
+
+ 5 +
+
+ 6 +
+
+ 7 +
+
+ 8 +
+
+ 9 +
+
+ 10 +
+
+ 11 +
+
+ 12 +
+
+ 13 +
+
+ 14 +
+
+ 15 +
+
+ 16 +
+
+ 17 +
+
+ 18 +
+
+ 19 +
+
+ 20 +
+
+ 21 +
+
+ 22 +
+
+ 23 +
+
+ 24 +
+
+ 25 +
+
+ 26 +
+
+ 27 +
+
+ 28 +
+
+ 29 +
+
+ 30 +
+
+ 31 +
+
+
+ + +
+

Available Times - Wednesday, Jan 15

+ + +
+

Morning

+
+ + + + + + +
+
+ + +
+

Afternoon

+
+ + + + + + + + +
+
+ + +
+

Evening

+
+ + + + +
+
+
+
+ + +
+
+

Booking Summary

+ + +
+
+ + + +
+
Personal Training Session
+
60 minutes
+
+
+ +
+ + + +
+
Wednesday, Jan 15
+
2025
+
+
+ +
+ + + +
+
10:00 AM - 11:00 AM
+
EST
+
+
+
+ + +
+
+ Service Fee + $75.00 +
+
+ Processing Fee + $2.50 +
+
+ Total + $77.50 +
+
+ + +
+
+
+ + + +
+
Cancellation Policy
+
Free cancellation up to 24 hours before appointment
+
+
+
+
+ + + + +
+ +
+
+
+
+
+ + + +
+ + \ No newline at end of file diff --git a/scheduling-saas-wireframes/calendar-view.html b/scheduling-saas-wireframes/calendar-view.html new file mode 100644 index 0000000..f68fa5b --- /dev/null +++ b/scheduling-saas-wireframes/calendar-view.html @@ -0,0 +1,310 @@ + + + + + + Calendar View - Scheduling Platform + + + + + + + + +
+
+
+

SchedulePro

+ +
+
+ +
+ JD +
+
+
+
+ + +
+
+ +
+ +
+
+
+

January 2025

+
+ + +
+
+
+ + + + +
+
+ + +
+
+ +
+
+
+
MON
+
13
+
+
+
TUE
+
14
+
+
+
WED
+
15
+
+
+
THU
+
16
+
+
+
FRI
+
17
+
+
+
SAT
+
18
+
+
+
SUN
+
19
+
+
+ + +
+ +
+
9:00 AM
+
+
+
Hair Styling
+
Sarah Johnson
+
+
+
+
+
Consultation
+
Mike Chen
+
+
+
+
+ + +
+
10:00 AM
+
+
+
+
Personal Training
+
Alex Rivera
+
+
+
Massage Therapy
+
Emma Davis
+
+
+
+
+
+ + +
+
11:00 AM
+
+
Yoga Session
+
Lisa Park
+
+
+
+
+
+
+
+
+ + +
+
12:00 PM
+
+
+
Makeup Session
+
Rachel Kim
+
+
+
+
+
Nutrition Consult
+
Tom Wilson
+
+
+
+
+ + +
+
1:00 PM
+
+
+
+
+
+
+
+
+ + +
+
2:00 PM
+
+
Design Review
+
James Lee
+
+
+
Therapy Session
+
Anna Brown
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+

Upcoming Today

+ + +
+
+
+
Personal Training
+
Alex Rivera
+
+ + Confirmed + +
+
+ + + + 10:00 AM - 11:00 AM +
+
$75.00
+
+ + +
+
+
+
Makeup Session
+
Rachel Kim
+
+ + Pending + +
+
+ + + + 12:00 PM - 1:30 PM +
+
$120.00
+
+ + +
+
+
+
Therapy Session
+
Anna Brown
+
+ + Confirmed + +
+
+ + + + 2:00 PM - 3:00 PM +
+
$150.00
+
+ + +
+
+ Today's Revenue + $345.00 +
+
+ Total Bookings + 8 +
+
+
+ + +
+

Quick Actions

+ + +
+
+
+
+ + \ No newline at end of file diff --git a/scheduling-saas-wireframes/mini-site.html b/scheduling-saas-wireframes/mini-site.html new file mode 100644 index 0000000..67e1e33 --- /dev/null +++ b/scheduling-saas-wireframes/mini-site.html @@ -0,0 +1,320 @@ + + + + + + Sarah Martinez - Personal Booking Page + + + + + + + + +
+
+
+ +
+
+
+ SM +
+
+
+
+ +

Sarah Martinez

+

Certified Wellness Coach & Personal Trainer

+ +
+
+ + + + 4.9 (127 reviews) +
+
+ + + + + Los Angeles, CA +
+
+ + + +
+
+
+ + +
+
+

About Me

+

+ Hi there! I'm Sarah, a certified wellness coach and personal trainer with over 8 years of experience helping people achieve their health and fitness goals. My approach combines personalized training plans, nutritional guidance, and mindset coaching to create lasting transformations. +

+

+ Whether you're looking to build strength, lose weight, improve flexibility, or simply feel better in your body, I'm here to support you every step of the way. Let's work together to unlock your full potential! +

+
+ + +
+

My Services

+ +
+ +
+
+ + + +
+
+

Personal Training

+

One-on-one customized workout sessions tailored to your goals and fitness level.

+
+
+ + + + 60 minutes +
+
$75
+
+ +
+
+ + +
+
+ + + +
+
+

Yoga & Mindfulness

+

Guided yoga sessions focusing on breath, flexibility, and mental clarity.

+
+
+ + + + 45 minutes +
+
$50
+
+ +
+
+ + +
+
+ + + +
+
+

Nutrition Consultation

+

Comprehensive nutrition planning and dietary guidance for optimal health.

+
+
+ + + + 30 minutes +
+
$60
+
+ +
+
+ + +
+
+ + + +
+
+

Group Training

+

High-energy group fitness classes with a supportive community atmosphere.

+
+
+ + + + 90 minutes +
+
$35
+
+ +
+
+
+
+ + +
+

Important Links

+ + +
+ + +
+

What Clients Say

+ +
+
+
+
+ + + + + +
+
+

"Sarah transformed my life! I lost 30 pounds and gained so much confidence. Her personalized approach and constant support made all the difference."

+
Jessica T.
+
Los Angeles, CA
+
+ +
+
+
+ + + + + +
+
+

"Best trainer I've ever worked with! Sarah's knowledge of fitness and nutrition is incredible. I'm stronger and healthier than I've been in years."

+
Michael R.
+
Santa Monica, CA
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/upwork-pipeline/PIPELINE-INSTRUCTIONS.md b/upwork-pipeline/PIPELINE-INSTRUCTIONS.md new file mode 100644 index 0000000..4f74b88 --- /dev/null +++ b/upwork-pipeline/PIPELINE-INSTRUCTIONS.md @@ -0,0 +1,71 @@ +# Upwork Auto-Apply Pipeline Instructions + +## Trigger +This pipeline runs when Clawdbot receives the wake event `upwork-email-check`. +It fires every 2 minutes during 8AM-11PM ET. + +## Step 1: Check Gmail +``` +gog gmail search "from:donotreply@upwork.com subject:\"New job\" is:unread" --max 10 --account jake@localbosses.org --json +``` + +## Step 2: For each unread email +1. Read the email: `gog gmail get --account jake@localbosses.org` +2. Extract: job URL, rate/budget, title, skills +3. Pre-filter based on email content: + - **SKIP if hourly max < $50** (Jake's rule) + - **SKIP if fixed price < $1,000** + - **SKIP if no rate info** and description looks low-budget + +## Step 3: Scrape full job details (for jobs that pass pre-filter) +Use browser automation to visit the Upwork job page and extract: +- Full description +- Client history (total spent, hire rate, reviews) +- Number of proposals already +- Required skills +- Client location + +## Step 4: Score the job (0-100) +Scoring factors: +- **Budget/rate alignment** (higher = better) — 30 pts +- **Client quality** (spend history, reviews, hire rate) — 25 pts +- **Skill match** (MCP, Claude, AI automation, full-stack) — 25 pts +- **Competition** (fewer proposals = better) — 10 pts +- **Project clarity** (well-written = better) — 10 pts + +**Apply threshold: score >= 60** + +## Step 5: Build deliverables (for high-scoring jobs) +Spawn a sub-agent to: +1. Create a tailored wireframe/mockup/demo relevant to the job +2. Deploy to Cloudflare Pages at `{job-slug}.portfolio.mcpengage.com` +3. Take screenshots of the deployed pages + +## Step 6: Write proposal +Template components: +- **Hook**: Reference specific details from their job post +- **Proof**: Link to the deployed demo/wireframe +- **Experience**: Relevant portfolio pieces +- **Approach**: Brief technical plan +- **CTA**: Clear next step + +## Step 7: Submit via browser +Use Upwork browser automation to: +1. Click "Submit a Proposal" +2. Fill in cover letter +3. Attach screenshots +4. Set rate ($50+/hr or appropriate for fixed) +5. Submit + +## Step 8: Report +Post to Discord #pipeline: +- Job title + URL +- Score +- Rate/budget +- Proposal summary +- Demo link +- Status (submitted/skipped/failed) + +## Processed tracking +File: `upwork-pipeline/processed.json` — array of processed email message IDs +Always mark emails as processed even if skipped (to avoid reprocessing) diff --git a/upwork-pipeline/README.md b/upwork-pipeline/README.md new file mode 100644 index 0000000..f72fdc4 --- /dev/null +++ b/upwork-pipeline/README.md @@ -0,0 +1,29 @@ +# Upwork Email-Triggered Auto-Apply Pipeline + +## Architecture +``` +Gmail (Upwork notification) + → Gmail API watch() push notification + → Google Pub/Sub + → Cloudflare Worker (webhook) + → Clawdbot wake event + → Pipeline script processes new emails + → Score job (skip if < $50/hr or < $1K fixed) + → Scrape full job details from Upwork + → Spawn sub-agent to build deliverables + → Deploy deliverables to CF Pages + → Submit proposal with screenshots + demo link + → Post results to Discord #pipeline +``` + +## Components +- `pipeline.sh` — Main pipeline entry point (called by Clawdbot wake) +- `worker/` — Cloudflare Worker for Gmail push webhook +- `templates/` — Proposal templates +- `processed.json` — Track already-processed email IDs + +## Setup +1. Gmail OAuth: `gog auth add jake@localbosses.org --services gmail` +2. Deploy CF Worker: `cd worker && wrangler deploy` +3. Set up Gmail watch: `node setup-watch.js` +4. Add Clawdbot cron for wake event handling diff --git a/upwork-pipeline/pipeline.sh b/upwork-pipeline/pipeline.sh new file mode 100755 index 0000000..7a7072a --- /dev/null +++ b/upwork-pipeline/pipeline.sh @@ -0,0 +1,108 @@ +#!/bin/bash +# Upwork Auto-Apply Pipeline +# Called by Clawdbot wake event when new Upwork email arrives +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +ACCOUNT="jake@localbosses.org" +PROCESSED_FILE="$SCRIPT_DIR/processed.json" +MIN_HOURLY=50 +MIN_FIXED=1000 + +# Initialize processed file if missing +[ -f "$PROCESSED_FILE" ] || echo '[]' > "$PROCESSED_FILE" + +echo "[pipeline] Checking for new Upwork job emails..." + +# Search for unread Upwork job notification emails +EMAILS=$(gog gmail search "from:donotreply@upwork.com subject:\"New job\" is:unread" \ + --max 10 --account "$ACCOUNT" --json 2>&1) + +if [ $? -ne 0 ]; then + echo "[pipeline] ERROR: Gmail search failed: $EMAILS" + exit 1 +fi + +# Parse email IDs +EMAIL_IDS=$(echo "$EMAILS" | jq -r '.[].messages[0].id // empty' 2>/dev/null) + +if [ -z "$EMAIL_IDS" ]; then + echo "[pipeline] No new Upwork job emails found." + exit 0 +fi + +PROCESSED_COUNT=0 +SKIPPED_COUNT=0 + +for MSG_ID in $EMAIL_IDS; do + # Skip already processed + if jq -e "index(\"$MSG_ID\")" "$PROCESSED_FILE" > /dev/null 2>&1; then + echo "[pipeline] Already processed: $MSG_ID" + SKIPPED_COUNT=$((SKIPPED_COUNT + 1)) + continue + fi + + echo "[pipeline] Processing email: $MSG_ID" + + # Get full email + EMAIL_BODY=$(gog gmail get "$MSG_ID" --account "$ACCOUNT" --json 2>&1) + + if [ $? -ne 0 ]; then + echo "[pipeline] ERROR reading email $MSG_ID: $EMAIL_BODY" + continue + fi + + # Extract job URL + JOB_URL=$(echo "$EMAIL_BODY" | jq -r '.body // .snippet // ""' | \ + grep -oP 'https://www\.upwork\.com/jobs/~\d+' | head -1) + + if [ -z "$JOB_URL" ]; then + # Try plain text extraction + JOB_URL=$(gog gmail get "$MSG_ID" --account "$ACCOUNT" 2>&1 | \ + grep -oP 'https://www\.upwork\.com/jobs/~\d+' | head -1) + fi + + if [ -z "$JOB_URL" ]; then + echo "[pipeline] No job URL found in email $MSG_ID, skipping" + continue + fi + + # Extract subject for logging + SUBJECT=$(echo "$EMAIL_BODY" | jq -r '.subject // "unknown"' 2>/dev/null || echo "unknown") + + echo "[pipeline] Job URL: $JOB_URL" + echo "[pipeline] Subject: $SUBJECT" + + # Extract rate info from email body + RATE_INFO=$(gog gmail get "$MSG_ID" --account "$ACCOUNT" 2>&1 | \ + grep -E '^\s*(Hourly|Fixed)' | head -1 || echo "") + + echo "[pipeline] Rate: $RATE_INFO" + + # Quick pre-filter based on email rate info + if echo "$RATE_INFO" | grep -qi "hourly"; then + MAX_RATE=$(echo "$RATE_INFO" | grep -oP '\$\d+' | tail -1 | tr -d '$') + if [ -n "$MAX_RATE" ] && [ "$MAX_RATE" -lt "$MIN_HOURLY" ]; then + echo "[pipeline] SKIP: Max hourly rate \$$MAX_RATE < \$$MIN_HOURLY minimum" + # Mark as processed so we don't revisit + jq ". + [\"$MSG_ID\"]" "$PROCESSED_FILE" > "$PROCESSED_FILE.tmp" && mv "$PROCESSED_FILE.tmp" "$PROCESSED_FILE" + SKIPPED_COUNT=$((SKIPPED_COUNT + 1)) + continue + fi + fi + + # Output job info for Clawdbot to process + echo "---JOB_DATA---" + echo "MSG_ID=$MSG_ID" + echo "JOB_URL=$JOB_URL" + echo "SUBJECT=$SUBJECT" + echo "RATE_INFO=$RATE_INFO" + echo "---END_JOB_DATA---" + + # Mark as processed + jq ". + [\"$MSG_ID\"]" "$PROCESSED_FILE" > "$PROCESSED_FILE.tmp" && mv "$PROCESSED_FILE.tmp" "$PROCESSED_FILE" + PROCESSED_COUNT=$((PROCESSED_COUNT + 1)) + +done + +echo "[pipeline] Done. Processed: $PROCESSED_COUNT, Skipped: $SKIPPED_COUNT" diff --git a/upwork-pipeline/process-job.sh b/upwork-pipeline/process-job.sh new file mode 100644 index 0000000..cee0ad9 --- /dev/null +++ b/upwork-pipeline/process-job.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# Process a single Upwork job: scrape details, score, decide whether to apply +set -euo pipefail + +JOB_URL="$1" +MSG_ID="${2:-}" +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" + +MIN_HOURLY=50 +MIN_FIXED=1000 + +echo "[job] Scraping job details: $JOB_URL" + +# Fetch the job page +JOB_PAGE=$(curl -sL "$JOB_URL" 2>&1 | head -500) + +# Extract key fields from the page +# Job title +TITLE=$(echo "$JOB_PAGE" | grep -oP '(?<="title":")[^"]+' | head -1 || echo "") +# Budget/rate +BUDGET=$(echo "$JOB_PAGE" | grep -oP '(?<="amount":)\{[^}]+\}' | head -1 || echo "") + +echo "[job] Title: $TITLE" +echo "[job] Budget raw: $BUDGET" + +# Output structured JSON for Clawdbot to process +cat <