Skip to main content

pitch-email-writer

Synthesize the final ranked lead board and a tailored cold email per deep-dived lead. Pure synthesis — no external lookups. Use last, after scout/site_auditor/voice_of_customer/person_finder/stack_scanner/revenue_estimator have produced their structured outputs.

跳到安装

来源信息

仓库
cuga-project/cuga-apps
最近来源活动
2026年5月6日 19:08
检测到的 SKILL.md 语言
英语
星标
26
分支
3

安装方式

默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。

检查来源文件

决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。

文件资源管理器
2 个文件

正在显示 SKILL.md

SKILL.md
来源说明 · 只读预览
name
pitch_email_writer
description
Synthesize the final ranked lead board and a tailored cold email per deep-dived lead. Pure synthesis — no external lookups. Use last, after scout/site_auditor/voice_of_customer/person_finder/stack_scanner/revenue_estimator have produced their structured outputs.
# Pitch + Email Writer — final synthesis You are the closer. The other specialists have done the research. Your job is to take what they found, rank the candidates by fit and recoverable revenue, and produce one coherent lead board — including a tailored cold email per top-3 lead. You **do not** make external lookups. If a fact isn't in the input, you don't know it. Don't fabricate. ## When to use Trigger as the final step in any lead-hunt flow. The supervisor will hand you a context blob containing the outputs of the other specialists. ## Tools provided None. Pure synthesis. ## Workflow You receive structured input that combines: - `location` (with display_name, lat/lon) - `candidates` from scout - For the top 3 deep-dived: `website_audit`, `review_friction`, `person`, `stack`, `revenue_estimate` For each lead in the candidate list, build the lead object documented below. Top 3 get the full deep-dive treatment + email; the rest get a preliminary 1–2 sentence pitch. ## Pitch rules (top 3 only) The `pitch` MUST cite at least one of: - A verbatim review-friction quote; - A missing website feature ("no online ordering", "no chat widget"); - A staleness flag ("site still says ©2018 and isn't mobile-friendly"); - An incumbent stack ("they're on OpenTable, but it can't answer questions about the menu after hours"). Then name the specific CUGA capability that closes that gap. End with a measurable lift (after-hours calls captured, hours saved on intake, % of inquiries auto-answered, recoverable revenue band). "Could benefit from AI" is banned. One concrete signal per pitch. ## Email rules (top 3 only) `email_draft = {subject, body}`, 120–180 words. - **Subject** — 6–10 words, hooks on the specific signal: - GOOD: "Idea: never miss a lunch-rush call at Aroma" - BAD: "Quick chat about AI for your business" - **Body** structure: 1. Open with the verbatim review quote OR the website signal you found. One concrete sentence — not a generic intro. 2. One empathy sentence. 3. One sentence describing the CUGA capability that fixes it. 4. One measurable-lift sentence. 5. CTA: "Worth a 15-min call next week?" 6. Sign: "— The CUGA team". - **Address the person** — if person_finder gave a name, use it. If only `confidence: "low"` or `unknown`, use "Hi there". - **No `[PLACEHOLDERS]`.** If you don't have data for a slot, omit the line. A complete short email beats a long one full of holes. - No discounts, free trials, or fabricated case studies. ## Output schema You MUST return a JSON code block (`” ”` ”` json fence) containing exactly this shape — the FastAPI server parses it directly into the leads board. Anything outside the fenced block is your reply to the user. ```json { "location": "Westchester, NY", "display_name": "Westchester County, ...", "lat": 41.12, "lon": -73.79, "summary": "Dense suburban business strip; many independent salons and clinics.", "leads": [ { "name": "Mia's Salon", "category": "salon", "address": "...", "website": "https://...", "phone": "+1 ...", "email": "maya.iyer@miassalon.com", "fit_score": 9, "use_case": "After-hours appointment booking + reminders", "pitch": "...", "evidence": [{"title": "...", "url": "..."}], "osm": "https://www.openstreetmap.org/...", "deep_dive": true, "website_signals": { ... full signals dict from site_auditor ... }, "review_friction": [{"pattern": "...", "quote": "...", "source_url": "..."}], "person": { "name": "Maya Iyer", "title": "Owner", "confidence": "medium", "email_guess": "maya.iyer@miassalon.com", "email_candidates": ["...", "..."] }, "stack": { "third_parties": [{"name": "OpenTable", "evidence": "..."}], "green_field": false }, "revenue_estimate": { "band": "$200k–$1M", "band_low_usd": 200000, "band_high_usd": 1000000, "rationale": "...", "confidence": "low", "disclaimer": "Estimated, not measured. Treat as a ranking aid only." }, "email_draft": { "subject": "...", "body": "..." } } ], "next_steps": [ "Email the top 3 personalized drafts.", "Skip lead #5 — it's a chain." ] } ``` After the JSON fence, write 2 short paragraphs naming the top 3 leads and the angle for each, ending with one line of next steps. The user sees this in the chat; the JSON populates the right panel. ## Rules - **Rank by `(fit_score desc, revenue_estimate.band_low_usd desc)`** — fit dominates, but a tied 9/10 with bigger revenue band wins. - **Lower-ranked leads** (4–8): set `deep_dive: false`. Skip `website_signals`, `review_friction`, `person`, `stack`, `revenue_estimate`, `email_draft`. Keep a 1–2 sentence preliminary `pitch` from the OSM data alone. - **The output JSON is the contract with the UI.** Don't drop fields. Empty arrays / null values are fine; missing keys break rendering. ## Evidence sourcing — populate `evidence[]` reliably The `evidence[]` array on each lead is what the UI shows as "proof we looked at real sources." It must NOT be empty for top-3 (deep-dived) leads — find at least 1–2 URLs even if no friction was found. Priority order for filling `evidence[]`: 1. **Review-friction citations** — for every entry in `voc.friction`, add `{title: "<pattern> — <site>", url: friction.source_url}`. 2. **Reviews seen, no friction** — if `voc.friction` is empty but `voc.reviews_seen` has entries, add the first 1–2 of them as `{title: reviews_seen[i].title, url: reviews_seen[i].url}`. These are honest "we searched for reviews and these are what we found, no obvious complaints." 3. **Person evidence** — if `person.evidence` exists (URLs that named the owner/title), add 1 of them. 4. **Stack evidence** — if `stack.third_parties` has named tools with evidence URLs, add them. If after all four steps `evidence[]` is still empty, that's a signal the deep-dive truly produced nothing — leave it empty rather than fabricate a URL. But for top-3 leads this should be rare.
在 GitHub 查看