npm run pl:publish-business-map)· 从 docs/v3 预渲染。实时维护。这是整个业务怎么运转的唯一一张图:**多入口 → 收敛成一个公司身份 → 统一采集流程 → 成本分级筛选漏斗 → 逐层深挖 → master.md → 建站。** 架构细节见docs/v3/SPEC-FUNNEL-ORCHESTRATION.md·docs/v3/SPEC-GATHER-MODULE.md。 图例:✅ 已建 · 🔄 在做/规划中 · ⚠️ 缺口(入口未接 / 未统一)。_更新于 2026-05-31。_
【入口 · 多个】────────────► 全部收敛成「一个公司身份」(名字 / 电话 / 地址 / 唯一标识)
· Docker 地图爬 (pl:scrape-docker / gosom) ✅
· Google Places API (pl:places-search-intake) ✅
· 牌照数据库 — 42 万行 SQLite ✅
· Google 搜索 → 拿结果 (tinyfish + ddg) ✅
· 你发的一张图片 ⚠️ 入口未接
· 你发的一个链接 ⚠️ 入口未接
│
▼
【统一流程 · 所有入口共用这一条管子】
1. 搜索(多引擎 · 5 条线) ✅
2. AI 判断相关性 + 是不是同一家(防同名冒牌 · 红线) ✅(身份判官 R143)
3. 找到官方网站 ✅
4. 爬官网 + Google 地图 + Places API + 社媒(多来源) ✅(社媒抓取走 OpenCLI)
5. 交叉验证 → 整理 → master.md 🔄(验证层 + 汇总 · R146)
│
▼
【筛选漏斗 · 最便宜最快的先筛 · 尽早排除非客户】
阶段 0(免费/秒级):无联系方式 / 已关店 / 测试名 → 排除 ✅ exclusion-filter
阶段 1(免费/查库):牌照吊销或过期 → 观察 ✅ observe(确认同一家公司才标风险,不自动踢)
阶段 2(便宜): 太大 / 连锁 / 政府 / 同行 → 排除 ✅ exclusion-filter
阶段 3(中等): 问题有多大 = 我们能帮多少(先 cheap audit,后详细审计) ✅ 审计分级
阶段 4(中等): 在不在经营?付不付得起?(活跃度信号) ⚠️ 部分
│ 每一层踢掉不合格的;活下来的才往下走(越往下越贵)
▼
【深度采集 · 只对走到这里的线索做 · 最贵的几步】
· 全站爬取 + 真实照片 + 评价 + 社媒背景 ✅ 零件都有
· → 丰富的 master.md(建站素材) 🔄 R146 Phase E
│
▼
【给他做网站】
三条铁律:
已扎实 vs 待办: 统一流程 + 漏斗的「零件」基本都有了(身份判官、社媒抓取、牌照门、外部内容挖掘都已落地)。待办:(a) 图片/链接入口还没接到收敛口;(b) 漏斗的成本分级总控(入口收敛 → 分阶段 gate → 逐层深挖)还不是一个显式控制器(pl:run-funnel 是雏形);(c) 采集骨干(页面规模准确、免费优先爬虫、验证层、master.md 汇总)是 SPEC-GATHER-MODULE.md 计划。
进展(2026-06-02):
pl:run-funnel --rollup):每层淘汰多少、为什么、活下来几个、master.md 出了没 —— 漏斗现在「看得见」。nav-scope + pl:analyze-page-scale):按「前端菜单能点到的页」算规模,而不是 sitemap。实测 33 个有抓取记录的被归档站点 没有一个超过 30 个导航页(而它们的 sitemap 是 313–1448 页)—— 证明 sitemap 严重高估。按导航页阈值算:≤20 页能救回 24/33。一条线索进来,按"最便宜的先筛"逐道过,全是便宜/快的信号;只有活下来的才进昂贵的详细审计。 此表从 core/leads/fast-filter.js(唯一真相源)直接渲染,不会和代码走偏。✅在用 · 🔄待前置(便宜但还没接进快筛) · 🔭观察。
| # | 关卡 | 信号 | 工具 | 成本 | 动作 | 状态 |
|---|---|---|---|---|---|---|
| 1 | niche_relevance | 类目 vs 搜索 niche 匹配 | LLM cascade (cached) / stem-match | 即时·$0 | 排除 | ✅在用 |
| 2 | gbp_triage | GBP 信号: 电话/评分/评价数/网站/图片/类目 | gbpTriage | 即时·$0 | 打分 | ✅在用 |
| 3 | exclusion_precheck | 抓取前先排除明显不合格 (省下后面的抓取) | runExclusionFilter (no cheapAudit) | 即时·$0 | 排除 | ✅在用 |
| 4 | licence_kill_observe | 牌照吊销/过期 (仅身份已确认) | lookupLicense + observeLicenceKill | 免费·本地 | 只观察 | 🔭观察 |
| 5 | homepage_fetch | 抓首页 (markdown + 原始HTML) | tinyfishFetchUrls | 免费·抓取 | 补上下文 | ✅在用 |
| 6 | site_quick_scan | HTTPS/viewport/正文薄/CTA/陈旧年份 | siteQuickScan | 即时·$0 | 打分 | ✅在用 |
| 7 | page_scale_nav | 前端导航页 ≤20 (sitemap 不算) | navScope + pageScaleGate | 即时·$0 | 闸门(超阈值归档) | ✅在用 |
| 8 | pagespeed_mobile | 移动端性能分 + LCP (慢=更值得重做) | pagespeedAudit(mobile) + pagespeedNeed | 免费·API~25s | 打分 | ✅在用 |
| 9 | cheap_audit_decision | final_score = gbp*0.4 + redesign_need*0.6 → action | cheapAuditV2 | 即时·$0 | 打分 | ✅在用 |
| 10 | exclusion_final | 3 层排除 (数据质量/业务类型/时机) | runExclusionFilter (with cheapAudit) | 即时·$0 | 排除 | ✅在用 |
━━━ 昂贵分界线 ━━━
enqueueDetailedAudit → 此线之后: Playwright 全渲染 · Lighthouse · 视觉LLM · 39 规则详细审计 · 表单测试 · 全站爬 — 都贵,不在快速筛选里仅作证据(不当门):域名年龄 (WHOIS/Wayback · 老站=更可能想重做)
代码位置:1.core/leads/cheap-audit-queue.js· 2.core/scoring/cheap-audit-v2.js· 3.core/leads/exclusion-filter.js· 4.core/leads/cheap-audit-queue.js· 5.core/extractors/tinyfish.js· 6.core/scoring/site-quick-scan.js· 7.core/leads/cheap-audit-queue.js· 8.core/audit/pagespeed-insights.js· 9.core/scoring/cheap-audit-v2.js· 10.core/leads/exclusion-filter.js
2026-06-04。当前只考虑 roofer niche。目标不是多做工具,而是把一条可复制的业务闭环跑通:找到好客户,确认值得做,生成可信资料,做出网站样本,再把它卖出去。
把 roofer lead 做成一条稳定流水线:
lead 进入系统 → 快速排除 → 找出高潜客户 → 背景调查和身份确认 → master.md 总档案 → 建站资料包 → 一页网站样本 → audit 和事实检查 → 销售材料 → outreach → 结果回写
当前主目标:
先把建站主链路稳定到可复制: master.md 总档案 → 核实事实 / 可发挥文案 / 不可使用候选资料分清 → AI 消化成建站资料 → 一页 roofer 网站稳定生成 → site-build-doctor / copy-audit / audit-v4 能说清楚能不能给 Matthew 看、能不能销售、还缺什么资料
商业判断:
master.md 是每个 lead 的总档案。搜索、audit、评价、图片、ABN、牌照、销售话术、建站资料,都要能追溯回这里。目标
把当前 roofer lead 池讲清楚:谁已经排除,谁值得继续,谁缺资料,谁可以进入建站资料包,谁只能做内部概念。
当前依据
master.md、销售资料和建站资料包。产出
完成标准
目标
把便宜、快速、不花钱的检查提前,用它们排除大多数不适合客户。
优先使用的快工具 / 快信号
筛选结果
完成标准
目标
解决核心风险:搜出来的结果到底是不是同一个客户。
两条入口
AI 判断重点
搜索结果分层
完成标准
目标
所有进入系统的 lead 都有 master.md,但内容不能混成一锅。
master.md 要承接
分层规则
完成标准
master.md 是真正的总档案。master.md 和已核实事实抽取。master.md。目标
从 master.md 抽出 Design / 建站能直接使用的资料,而不是让模型随便读一大坨资料乱写。
当前稳定路线
core-extract.json → site-ctx.json + facts.json → handoff/content/* → handoff/od-package/content/* → single-page-brief.yaml → 网站文案和页面
必须保护的事实
完成标准
目标
拿一个真实客户跑完整闭环,验证不是纸面流程。
推荐样本
Mr Roof Solutions。
原因
master.md。site-build-doctor 是 preview-ready:页面能生成,fast audit 可过,但最终销售前仍要补强薄资料。产出
完成标准
master.md 到网站样本可以走通。site-build-doctor 能明确分清 preview-ready、sales-ready、publish-ready。目标
网站做好之后,要变成能卖的材料。
销售包至少包括
完成标准
master.md 或 audit 证据。目标
把单个样本变成可重复系统。
批量动作
master.md 和客户状态。排序标准
完成标准
master.md → 建站资料包 → 一页网站 → 轻量质检 跑成可复制样板。下一步不是再讨论大方向,而是继续围绕 Milestone 5 + 6,把建站主链路彻底稳定:
确认每个建站输入来自哪里 → AI 文案能发挥但不能编硬事实 → 模块能按资料自动显示 / 跳过 → 跳过原因能变成补资料清单 → copy 和 audit 问题尽量前置发现 → 用 Mr Roof / A-J / Vicwest / Mark Squire 这类真实 roofer 样本回放
2026-06-04。只读本地资料生成,不联网、不调用 Docker、不调用 Places、不写客户档案。来源命令:node --env-file-if-exists=.env.local scripts/cli/pl-design-material-readiness-replay.js --all-roofers --examples-per-status 999 --json。
先把当前 roofer lead 池讲清楚:哪些已经排除,哪些值得继续,哪些能给 Design / 建站,哪些只是内部 starter 概念。
这一阶段不做新客户网站,不跑慢工具。先把状态表锁住,避免后面 Top 5 被错误客户、重复客户、非 roofer 客户污染。
| 项目 | 数量 |
|---|---|
| 本地扫过 entity | 249 |
| 当前 roofer lead | 247 |
| 不适合进入 Design / 建站 | 219 |
| 有网站且资料 ready | 24 |
| 无网站 starter 资料 ready | 4 |
| 快筛桶 | 数量 | 当前意思 |
|---|---|---|
reject_fast | 149 | 快速排除,不继续花资源 |
light_touch | 58 | 轻触达,不默认深挖 |
identity_needed | 12 | 先确认是不是同一个客户 |
ready_for_deep_research | 10 | 值得深挖 |
website_problem_candidate | 14 | 有网站问题候选 |
no_website_candidate | 4 | 无网站强候选 |
| 客户 | 评价 | 下一步 | 发布前注意 |
|---|---|---|---|
| Mr Roof Solutions | 65 | 作为第一条完整闭环样本继续跑;当前是 preview-ready | 不能再当纯“无网站客户”讲;sales 前补 owner / experience 真实来源、确认社交主页、质保 / guarantee |
| NP Roof Repairs | 20 | 准备 starter 页面输入 | 缺 ABN;可以做内部概念,公开发布前要补 |
| Ultra Roof Restorations | 93 | 准备 starter 页面输入 | 缺 ABN;可以做内部概念,公开发布前要补 |
| Prime Roof Restorations | 29 | 准备 starter 页面输入 | 缺 ABN;可以做内部概念,公开发布前要补 |
| 客户 | 评价 | 快筛桶 | 下一步 |
|---|---|---|---|
| L.J. Ellery Roofing Pty Ltd | 52 | website_problem_candidate / ready_for_deep_research | 去重后再决定是否进 Top 5 |
| Ace Roofing Service | 37 | website_problem_candidate / ready_for_deep_research | 去重后再决定是否进 Top 5 |
| GC Roof Tiling Solutions | 0 | ready_for_deep_research | 检查资料厚度和销售理由 |
| Roof Repair Gold Coast | 0 | ready_for_deep_research | 检查资料厚度和销售理由 |
| Sydney Roofing Specialists | 0 | ready_for_deep_research | 检查资料厚度和销售理由 |
| Queensland Roofing Pty Ltd | 35 | website_problem_candidate | 可进入建站资料包候选 |
| KW Roofing Pty Ltd | 25 | website_problem_candidate | 可进入建站资料包候选 |
| VIP Roofing Brisbane | 19 | ready_for_deep_research | 可进入建站资料包候选 |
| North Brisbane Metal Roofing Pty Ltd | 62 | website_problem_candidate | 可进入建站资料包候选 |
| Geraldton Roofing | 0 | ready_for_deep_research | 有重复记录,先去重 |
| FastFix Roofing | 43 | website_problem_candidate | 可进入建站资料包候选 |
| Ascent Roofing Pty Ltd | 36 | website_problem_candidate | 可进入建站资料包候选 |
| ALL-SIDE ROOFING - Roof Repairs & Roof Restoration Adelaide | 63 | website_problem_candidate | 可进入建站资料包候选 |
| Triple C Professional Roofing | 184 | website_problem_candidate | 高评价,重点看网站是否真的有大问题 |
| Pro Roof Restoration Brisbane | 18 | ready_for_deep_research | 可进入建站资料包候选 |
| Geelong Roofing Pros | 32 | website_problem_candidate | 可进入建站资料包候选 |
| Diamond Roof Tiling & Restoration | 64 | website_problem_candidate | 可进入建站资料包候选 |
| Brisbane Roof Restoration Experts | 23 | website_problem_candidate | 可进入建站资料包候选 |
| Goldfields Metal Roofing | 22 | website_problem_candidate | 可进入建站资料包候选 |
| iFix Roofing | 86 | website_problem_candidate | 已验证为有网站强问题目标,可作为后续样本之一 |
C.J Honeysett Plumbing 当前被算进 website_material_ready,但名字明显像 plumbing。它需要进入 roofer-only 清理队列,不能直接进入 Top 5。
这些客户至少出现过两条 ready 记录,需要先合并再排序:
website_material_ready 只说明资料够准备 Design / 建站,不等于它一定是最好的销售对象。
进入 Top 5 前还要再看:
当前客户池不是空白,已经有一批可以继续推进的对象:
但进入下一步前,必须先做两件事:
进入 Milestone 2 前,先补一张 Top 5 候选排序表:
28 个 ready 候选 → 去掉非 roofer → 合并重复客户 → 按“没有网站 / 网站大问题 / 联系清楚 / 资料够 / 销售理由强 / 发布风险低”排序 → 选出 Top 5
2026-06-04。基于当前本地 ready 候选做的只读排序。不联网、不调用慢工具、不写客户档案。这个表是“下一步优先级”,不是最终销售名单。
优先级不是只看“资料 ready”。真正要看商业价值:
当前 28 个 ready 候选里:
C.J Honeysett Plumbing 需要先从 roofer Top 5 排序里拿掉。| 排名 | 客户 | 类型 | 为什么排前面 | 当前风险 / 注意 |
|---|---|---|---|---|
| 1 | Mr Roof Solutions | 入口无官网,后期找到官网 | 资料链最完整;评分 4.9、65 reviews;brand kit、建站资料、页面、fast audit 已通;适合跑第一个完整样本 | 不能简单按“无网站客户”销售;当前是 preview-ready,sales 前要补 owner / experience 真实来源、确认社交主页、质保 / guarantee |
| 2 | Ultra Roof Restorations | 无网站强候选 | 5.0、93 reviews;无官网入口;已有 starter 资料和外部素材;销售故事清楚 | 缺 ABN,公开发布前要补;内部 concept 不受影响 |
| 3 | Prime Roof Restorations | 无网站强候选 | 4.8、29 reviews;无官网入口;starter 资料 ready | 缺 ABN;评价数比 Ultra / Mr Roof 少,销售证据稍弱 |
| 4 | NP Roof Repairs | 无网站强候选 | 4.7、20 reviews;无官网入口;starter 资料 ready | 缺 ABN;评价数最低,优先级低于前 3 个 starter |
| 5 | Triple C Professional Roofing | 有网站强问题目标 | 5.0、184 reviews;现有网站问题明显;audit 有视觉弱、旧站、高 traction 旧站等信号 | 需要复核网站是不是真的适合一页替换,不要碰太复杂的现有站 |
| 客户 | 现在该做 | 现在先不做 |
|---|---|---|
| Mr Roof Solutions | 跑第一个完整闭环样本:master.md → 建站资料 → 网站样本 → 质检 → 销售材料;同时把“后期确认官网”写进销售叙事 | 不再花时间证明它“没有网站”;不让候选社媒、owner、质保这类未确认资料进客户页面 |
| Ultra Roof Restorations | 保留为真正无官网 starter 样本;补 ABN / 牌照作为发布前事项 | 不把 ABN 缺口变成内部 concept 的阻塞 |
| Prime Roof Restorations | 保留 starter 概念;补 ABN / 牌照;销售证据先靠 Place 和评价 | 不优先花 OpenCLI 长时间深挖,除非准备做第二个 starter 网站 |
| NP Roof Repairs | 保留 starter 概念;补 ABN / 牌照;确认是否有更多外部资料 | 不优先进入第一个样本,因为评价数和资料厚度较弱 |
| Triple C Professional Roofing | 先复核网站复杂度和现有页面问题,再决定是否做 redesign 样本 | 不直接开建,避免它其实是多页复杂站 |
如果要优先验证“有网站但问题很大”的路线,可以从这些里选:
| 客户 | 为什么可看 | 注意 |
|---|---|---|
| iFix Roofing | 4.5、86 reviews;已验证为有网站强问题目标 | 适合做有网站 redesign 样本 |
| Diamond Roof Tiling & Restoration | 4.9、64 reviews;audit 强重做信号 | 需要检查服务区和页面复杂度 |
| North Brisbane Metal Roofing Pty Ltd | 4.8、62 reviews;audit 强重做信号 | 曾出现重复 entity 风险,先确认唯一客户 |
| L.J. Ellery Roofing Pty Ltd | 4.9、52 reviews;audit 分数很低,问题强 | 有重复记录,先合并 |
| ALL-SIDE ROOFING | 4.7、63 reviews;视觉 / 信任问题明显 | 需要确认页面复杂度和销售切入点 |
Milestone 1 的业务状态已经清楚:
进入 Milestone 2 时,先把快筛规则和 Top 5 选择规则对齐:
快筛排除大多数 → ready 候选去重 / 去非 roofer → 按商业价值排 Top 5 → Top 1 跑完整闭环 → Top 2-5 只准备下一步,不立刻花慢资源
第一条完整闭环我仍建议用 Mr Roof Solutions,因为它最接近“能从 master.md 到网站样本再到销售材料”的完整演示。 但销售叙事要写准确:它不是纯粹“没有网站”,而是“入口没有官网,后期确认了官网,因此要把官网现状也纳入对比”。
2026-06-04。目标:把“便宜快速筛选”真正接到商业决策。不是筛完就完,而是决定下一步花多少资源。
快筛的目的不是找到所有可能客户,而是尽早排除大多数客户,把资源集中到少数最可能成交、最适合一页网站产品的 roofer。
| 快筛桶 | 当前动作 | 资源投入 |
|---|---|---|
reject_fast | 停止投入 | 不跑慢工具,不进 Top 5 |
too_good_or_complex | 标为不适合当前产品 | 不跑标准一页网站流程 |
identity_needed | 先确认身份 | 只做搜索和同一客户判断,不给 Design |
light_touch | 轻触达 | 不默认跑 Docker reviews / Places / Firecrawl |
no_website_candidate | 准备 starter 资料 | 可进 Top 5,但发布前要查 ABN / 牌照 |
website_problem_candidate | 进入详细审计或资料包 | 可进 Top 5 |
ready_for_deep_research | 可以深挖或准备资料包 | 可进 Top 5,但要看销售理由强不强 |
这些工具 / 信号要尽早用:
| 信号 | 用途 | 结果怎么影响筛选 |
|---|---|---|
| 公司名 / 电话 / 地址 / Place 身份 | 判断是不是一个真实可联系客户 | 缺太多就先补身份 |
| 是否有官网 | 决定搜索是在前面还是后面 | 无官网先找官网;有官网先快筛 |
| 官网能否打开 | 判断是否有明显机会或死链 | 死链 / 第三方页可能加机会 |
| 首页电话 / CTA / 服务区 | 判断转化缺口 | 缺明显 CTA 加机会 |
| 页面规模 | 判断是否适合一页网站 | 页面太多、业务太复杂就排除 |
| PageSpeed / mobile | 找销售证据 | 慢不是排除,是问题证据 |
| Tinyfish / direct fetch 首页 | 快速读首页内容 | 看本地词、服务、电话、结构 |
| ABN / 牌照低成本查询 | 风险观察和事实确认 | 不能确认时不直接写进网站 |
| Google Place 评分 / 评价数 | 判断业务基础 | 没网站但评价强,是高价值机会 |
进入 Top 5 前必须先过这几步:
这些不进入 Top 5:
这些可以保留,但不花深度资源:
这些才允许进入 Top 5 或慢工具:
| 客户 | 为什么能进 | 需要注意 |
|---|---|---|
| Mr Roof Solutions | 资料链最完整,可跑完整闭环样本 | 后期找到官网,不能当纯无网站客户讲 |
| Ultra Roof Restorations | 真正无网站强候选,评价最多 | 缺 ABN,公开前补 |
| Prime Roof Restorations | 无网站强候选,资料 ready | 评价数中等,ABN 未确认 |
| NP Roof Repairs | 无网站强候选,资料 ready | 评价数最低,ABN 未确认 |
| Triple C Professional Roofing | 有网站强问题,评价很强 | 先复核网站复杂度,避免超出一页产品 |
当前 ready 候选共 28 个。清理后,真正进入排序池的大约是 24 个。
| 客户 | 当前状态 | 为什么不能直接进 Top 5 |
|---|---|---|
| C.J Honeysett Plumbing | website_material_ready | 名字和官网都指向 plumbing,不应混进 roofer Top 5 |
处理方式:
| 客户 | 重复来源 | 保留哪条做排序 |
|---|---|---|
| L.J. Ellery Roofing Pty Ltd | domain 记录 + Place 记录,同官网 ljelleryroofing.com.au | 保留有 52 reviews 的 Place 记录进入排序 |
| Ace Roofing Service | domain 记录 + Place 记录,同官网 aceroofingservice.com.au | 保留有 37 reviews 的 Place 记录进入排序 |
| Geraldton Roofing | 两条 Place 记录,同官网 geraldtonroofing.com.au | 暂时只保留一条;因为 rating / reviews 都缺,优先级低 |
处理方式:
从现在开始,Top 5 排序使用这个口径:
28 个 ready 候选 → 移出明显非 roofer 风险 1 个 → 合并 3 组重复 → 剩约 24 个真实候选 → 按商业价值排序
Milestone 2 做完时,应该能回答:
继续推进时,优先做两件事:
2026-06-04。目标:用 Mr Roof Solutions 跑第一条完整业务闭环:master.md → 建站资料 → 网站样本 → 事实检查 → 销售材料。这不是批量建站,而是验证整条业务流程能不能从头走到尾。
Mr Roof Solutions 当前最适合做第一个完整样本:
master.md 已存在并刷新。single-page-brief.yaml 验证 PASS。76656868905。15365053。Mr Roof 不是简单的“完全没有网站”客户。
准确说法:
入口数据没有官网 → 按无网站 starter 路线补资料 → 后期搜索确认 mrroof.com.au 与客户同名同电话 → 可用官网 logo / brand 作为建站素材 → 但销售叙事不能说“你没有网站”,只能说入口资料和线上资料需要统一、转化需要强化
所以销售材料不能说:
你没有网站。
应该说:
你在 Google / lead 入口里没有清楚带出可用官网; 我们后续确认了官网和品牌资料,但现有线上资料还需要统一和转化强化。
| 字段 | 当前值 | 来源 |
|---|---|---|
| Business name | Mr Roof Solutions | Google Place / master.md |
| Phone | 1300 023 230 | Google Place / confirmed website |
| Address | 104 Wynyard St, Cleveland QLD 4163 | Google Place / single-page brief |
| ABN | 76656868905 | official registry |
| QBCC | 15365053 | official registry / master locked fact |
| Rating | 4.9 | Google Place |
| Reviews | 65 | Google Place |
| Logo / brand | existing logo brand kit | confirmed website name + phone match |
| 类型 | 内容 | 边界 |
|---|---|---|
| Service area | Brisbane, Redlands, Sunshine Coast | 来自确认社媒正文,可做 copy seed,不写成 footer locked area |
| Specialties | roof ventilation, solar whirlybird, roof ventilation | 可做服务灵感,不写成认证或承诺 |
| 类型 | 内容 | 为什么不能进网站 |
|---|---|---|
| Awards / social proof | ABA100® Winner for Eco Innovation in The Australian Brand Awards 2024 | 需要确认这是客户自己的奖项,不是产品或合作方奖项 |
| iSwirl Official installer | 合作产品 / 第三方品牌背景 | 不能写成客户官方认证,除非再次确认 |
| 缺口 | 当前处理 |
|---|---|
| owner / experience | 缺真实来源;页面不能让 AI 猜 |
| social footer | 只有候选帖子 / 提及;确认是客户自己的主页后才能进 footer |
| warranty / guarantee | 缺确认年限或明确承诺;质保模块跳过,不编 |
必须已有或生成:
clients/mr-roof-solutions/v2/master.mdclients/mr-roof-solutions/v2/core-extract.jsonclients/mr-roof-solutions/v2/site-ctx.jsonclients/mr-roof-solutions/v2/handoff/od-package/content/external-material.jsonclients/mr-roof-solutions/v2/handoff/od-package/brand/brand-tokens.cssclients/mr-roof-solutions/v2/single-page-brief.yaml当前状态:已具备,single-page-brief PASS。
目标不是做最终上线版本,而是做一个可展示的一页样本。
页面应该强调:
页面不能写:
网站样本生成后必须检查:
15365053。网站样本之后,要生成销售材料:
当前已生成:
| 产物 | 路径 | 状态 |
|---|---|---|
| Sales pack JSON | clients/mr-roof-solutions/v2/outreach/sales-pack.json | PASS · 已接入现有截图/视频工具 |
| Sales pack MD | clients/mr-roof-solutions/v2/outreach/sales-pack.md | PASS · 给人看的销售材料 |
| Email draft | clients/mr-roof-solutions/v2/outreach/email/01-draft.md | PASS · 备用,不是主路线 |
| Desktop screenshot | clients/mr-roof-solutions/v2/outreach/screenshots/desktop.png | PASS · 1440 x 8674 |
| Mobile screenshot | clients/mr-roof-solutions/v2/outreach/screenshots/mobile.png | PASS · 390 x 9914 |
| Scroll video | clients/mr-roof-solutions/v2/outreach/demo.mp4 | PASS · 现有 capture 工具生成 |
当前销售路线:
首选 phone / contact form 原因:locked facts 里没有已验证 email;电话已验证。
外发话术不能直接说“你没有网站”,也不能说样本已经可以直接上线。正确角度是:
你们公开资料在 Google / 官网 / licence 展示上不够统一; 我们做了一个保守的一页预览,把 verified phone / ABN / QBCC 保持一致, 并把未确认的奖项、合作方、服务范围说法都先拿掉。
| 检查 | 结果 |
|---|---|
| master.md 已刷新 | PASS |
| brand kit 实际存在 | PASS |
| single-page-brief 验证 | PASS |
| external-material 分层 | PASS |
现有 composer 已跑出 editorial-output/index.html | PASS |
| starter 事实锁测试 | PASS · scripts/test/test-cycle27-starter-fact-locked-compose.mjs |
| identity fact verify | PASS · 0 finding |
| site-build-doctor | preview-ready · 页面和轻量质检可用;最终销售前还要补强薄资料 |
| readiness | preview=ready · sales=limited · publish=not_ready |
| copy-audit | APPROVE |
| audit-v4 fast | SHIP · Composite 91 |
| sales pack 当前性检查 | PASS · site-build-doctor 显示 sales pack 与当前轻量质检一致 |
| sales pack safety test | PASS · scripts/test/test-cycle27-mr-roof-sales-pack.mjs · 6 checks |
| site-ctx 客户文案种子清洗 | PASS · scripts/test/test-cycle27-site-ctx-customer-seed-sanitizer.mjs |
| preview/sales/publish 三档口径 | PASS · scripts/test/test-cycle27-site-build-doctor.mjs |
| outreach capture assets | PASS · desktop / mobile / scroll video |
当前 Mr Roof 已经能用现有建站链生成一个“事实安全的 starter 预览”,但还不是可发布客户站。
已验证:
node scripts/test/test-cycle27-starter-fact-locked-compose.mjs node scripts/test/test-cycle27-mr-roof-sales-pack.mjs node scripts/test/test-cycle27-site-ctx-customer-seed-sanitizer.mjs node --env-file-if-exists=.env.local scripts/test/test-cycle27-site-build-doctor.mjs node scripts/outreach/capture-assets.js --file clients/mr-roof-solutions/v2/outreach/sales-pack.json --timeout 45000 npm run pl:validate-single-page-brief -- --slug mr-roof-solutions npm run pl:fact-verify -- --slug mr-roof-solutions npm run pl:audit-v4 -- --slug mr-roof-solutions --tier fast npm run pl:site-build-doctor -- --slug mr-roof-solutions
当前 audit-v4 fast 结果:
T1: PASS T2: 91/100 Composite: 91 Verdict: SHIP
业务判断:
free quote、emergency/storm、Colorbond replacement、award / iSwirl。2026-06-04。目标:网站样本和销售材料不是终点。它们必须能被拿去联系客户,并且每一次联系、回复、跟进、跳过、成交交接都能回写到系统里,避免销售动作散在聊天记录或人工记忆里。
Mr Roof 当前已经走到:
master.md / site-ctx → fact-safe starter website → audit-v4 fast → sales-pack.json / sales-pack.md → desktop screenshot / mobile screenshot / scroll video → site-build-doctor 确认 sales pack 与当前轻量质检一致 → 销售看板识别为 mockup_ready
主工作台是后台:
/admin/leads
它读取现有 lead/outreach index,把每个客户放进销售阶段:
new_lead → researching / needs_human → ready_for_mockup → mockup_building → mockup_ready → draft_ready → outreach_sent / follow_up_due / replied → paid_handoff / skipped
Discord 不是唯一销售系统。Discord 的作用是:
所以当前关系是:
后台 admin pipeline = 销售推进主工作台 Discord channel/profile card = 可视化同步层 + 人工提醒层 master.md / v2/outreach = 客户资料和销售记录的长期保存位置
每个进入系统的 lead,不管最后做不做,都必须在 profile 里集中保存所有能联系客户的入口:
| 渠道 | 用途 |
|---|---|
| 邮箱 | 可以发 cold email / 回复跟进 |
| 电话 | 可以电话 / 短信 / WhatsApp 判断 |
| 官网 | 判断有没有网站,也给后续 audit / 背景调查用 |
| Contact us 页面 | 没有邮箱时优先用表单触达 |
| Google Maps / GMB | 核对商家身份、地址、评论入口 |
| Social profile links | Facebook / Instagram / LinkedIn / TikTok / YouTube / WhatsApp 等 |
| 地址 | 判断地区、服务范围、同名公司冲突 |
| 推荐触达方式 | AI/规则给销售人的建议,比如 call_or_contact_form |
当前统一字段:
record.contactProfile
它会被后台 /admin/leads 使用,显示在 lead profile、CRM 快照、审计表格和搜索里。这样销售时不用到处找邮箱、电话、官网、社媒和地址。
真实看板状态:
| 字段 | 当前值 |
|---|---|
| client | mr-roof-solutions |
| stage | mockup_ready |
| pack | clients/mr-roof-solutions/v2/outreach/sales-pack.json |
| markdown | clients/mr-roof-solutions/v2/outreach/sales-pack.md |
| assets | desktop / mobile / scroll video ready |
| sales pack current | PASS · site-build-doctor 显示与当前 copy-audit / audit-v4 一致 |
| readiness | preview=ready · sales=limited · publish=not_ready |
| channel | call_or_contact_form |
| not verified, 不作为主路线 |
当前销售 / 发布状态池(2026-06-04 复跑):
| client | readiness | sales pack | 截图/视频 | 主要限制 |
|---|---|---|---|---|
mr-roof-solutions | preview=ready · sales=limited · publish=not_ready | PASS | PASS | owner/experience、社媒主页、质保未确认 |
a-j-roofing-solutions | preview=ready · sales=limited · publish=not_ready | PASS | PASS | checkpoint YELLOW、owner 来源薄、guarantee 未确认 |
vicwest-roofing | preview=ready · sales=ready · publish=ready | PASS | PASS | 当前 15 项检查全 PASS |
mark-squire-roof-restorations | preview=ready · sales=limited · publish=not_ready | PASS | PASS | checkpoint YELLOW |
统一生成命令:
npm run pl:copy-audit -- --slug <slug> npm run pl:render-design-input-brief -- --slug <slug> npm run pl:build-roofer-sales-pack -- --slug <slug> npm run outreach:capture-assets -- --file clients/<slug>/v2/outreach/sales-pack.json --timeout 45000 npm run pl:site-build-doctor -- --slug <slug>
批量看销售/发布队列:
npm run pl:site-readiness-matrix -- --slugs mr-roof-solutions,a-j-roofing-solutions,vicwest-roofing,mark-squire-roof-restorations,abc-roof-restoration-brisbane,west-coast-roofing
当前结果:publish_ready=1、sales_limited=3、rebuild_required=2。销售动作优先从 publish_ready 和 sales_limited 里挑,不要从 rebuild_required 里继续写销售包。
这个生成器不是老的通用 outreach-pack.json。roofer v2 销售前资料统一写:
clients/<slug>/v2/outreach/sales-pack.json clients/<slug>/v2/outreach/sales-pack.md clients/<slug>/v2/outreach/email/01-draft.md
筛选和建站做得再好,如果销售动作没有回写,就会出现三个问题:
所以 M7 的核心不是“写一封更好看的 email”,而是:
销售动作必须回到 v2/outreach 销售结果必须改变看板状态 客户回复必须成为后续 master.md / 网站 / 报价的输入 销售包必须引用当前网站、当前截图、当前 copy-audit、当前 audit-v4
新增安全点:site-build-doctor 会检查 sales-pack.json / sales-pack.md / email draft 是否还在引用旧 audit 或旧销售叙事。比如当前 audit-v4 已经 SHIP,但 sales pack 仍写 BLOCKED / minimum_content_signal;或者销售话术还残留旧的 licence mismatch / QBCC number mismatch,都会 WARN。
所有 v3 roofer 客户优先写这里:
clients/<slug>/v2/outreach/lead-notes.jsonl
Mr Roof 对应:
clients/mr-roof-solutions/v2/outreach/lead-notes.jsonl
已验证:
node scripts/test/test-cycle27-roofer-outreach-note-v2.mjs
结果:
PASS · v3 roofer outreach notes write to v2 and update the sales index
使用:
npm run funnel:record-lead-note -- --client mr-roof-solutions --company "Mr Roof Solutions" --note "Called the business and asked who should receive the preview." --next-follow-up-due 2026-06-07
应该写入:
clients/mr-roof-solutions/v2/outreach/lead-notes.jsonl
看板状态:
mockup_ready → follow_up_due
客户明确回复时,记录 action:
npm run funnel:record-lead-note -- --client mr-roof-solutions --company "Mr Roof Solutions" --action mark_replied --note "Owner replied and asked to see the preview link."
看板状态:
replied
下一步:
处理 prospect 回复 → 决定补资料 / 发样本 / 进入报价 / 继续跟进 / 跳过
如果客户没回,但有明确下次动作:
npm run funnel:record-lead-note -- --client mr-roof-solutions --company "Mr Roof Solutions" --note "Sent contact form message. Follow up by phone." --next-follow-up-due 2026-06-10
看板状态:
follow_up_due
如果连续跟进无意义,或者客户明确不适合:
npm run funnel:record-lead-note -- --client mr-roof-solutions --company "Mr Roof Solutions" --action skip_lead --note "No response after follow-up; keep out of active sales queue."
看板状态:
skipped
客户明确有兴趣并进入正式报价 / 成交时:
npm run funnel:record-lead-note -- --client mr-roof-solutions --company "Mr Roof Solutions" --action move_to_paid_handoff --note "Customer wants the website scoped and priced."
看板状态:
paid_handoff
| 检查 | 结果 |
|---|---|
| v3 sales pack 能进入销售看板 | PASS · scripts/test/test-cycle27-roofer-sales-pack-index.mjs |
| Mr Roof 真实 sales pack 被识别 | PASS · mockup_ready |
| v3 outreach note 写回 v2 | PASS · scripts/test/test-cycle27-roofer-outreach-note-v2.mjs |
| 写回后看板进入 follow-up | PASS |
| master.md 能显示 outreach history | PASS · scripts/test/test-cycle27-master-md-outreach-history.mjs |
| 客户回复事实会先分层 | PASS · scripts/test/test-cycle27-customer-reply-fact-tiers.mjs |
| profile 集中保存所有可联系渠道 | PASS · scripts/test/test-cycle27-contact-profile-channels.mjs |
| Discord profile card 显示完整联系方式 | PASS · scripts/test/test-cycle27-profile-card-contact-profile.mjs |
scripts/leads/build-master-md.js 现在会读取:
clients/<slug>/v2/outreach/lead-notes.jsonl
然后在 master.md 里生成:
## Outreach 回写记录
这一段会显示:
客户回复不是“直接写网站”的通行证。M7 现在把客户回复里的事实分成四类:
| 类别 | 可以做什么 | 不能做什么 |
|---|---|---|
design_usable_facts | 给网站文案 / Design brief 做种子 | 不能当 locked fact / schema / footer claim |
sales_only_facts | 给销售判断、后续沟通用 | 不能进公开网站 |
needs_confirmation_facts | 等待证据或正式来源确认 | 不能进公开网站、不能进 schema |
blocked_facts | 不使用 | 不进入任何下游 |
当前规则:
service_list、suburbs_served、specialties 可以变成 Design 种子。needs_confirmation_facts。blocked_facts。复杂回复用 JSON 输入:
npm run funnel:record-lead-note -- --input tmp/mr-roof-reply.json
示例 payload:
{
"client_slug": "mr-roof-solutions",
"company": "Mr Roof Solutions",
"actor": "matthew",
"action": "mark_replied",
"note": "Owner replied with services and asked to see the preview.",
"customer_confirmed": true,
"customer_facts": {
"service_list": ["roof restoration", "gutter repairs"],
"phone": "1300 999 999",
"awards": ["Best Roofing Business 2025"]
}
}
会写入:
clients/mr-roof-solutions/v2/outreach/lead-notes.jsonl clients/mr-roof-solutions/v2/outreach/customer-reply-facts.jsonl
下一步必须补:
site-ctx、网站样本和 audit。v2/brand,影响后续模板语言。M7 已经从“有销售材料”推进到“销售材料能进入看板,第一次触达/跟进能回写,master.md 能显示 outreach history,并且客户回复事实会先分层”。
但 M7 还没有完全结束,因为“客户回复事实 → 自动刷新 site-ctx / 网站 / audit”的触发规则还要继续接。
目标:说明 master.md 之后,系统怎么把客户资料变成网站可用的事实、文案、服务、评价、覆盖区域和最终建站输入。
模块 7 不是“让模型读 master.md 随便写网站”。
它分两条线:
当前稳定顺序:
core-extract.json → pl:extract-site-ctx → site-ctx.json + facts.json → pl:enrich-handoff → handoff/content/* → pl:assemble-handoff → handoff/od-package/content/* → pl:build-single-page-brief → single-page-brief.yaml → pl:compose-editorial
代码和 SOP 依据:
docs/v3/SOP-MASTER-MD-TO-WEBSITE.md:27-47docs/v3/SOP-MASTER-MD-TO-WEBSITE.md:80-100scripts/cli/_deprecated-guard.js:7-17core-extract.jsoncore-extract.json 的核心是 brief.real_facts。这里放的是已经从客户资料、官网、评价、GBP 等来源抽出来的事实。
后面电话、地址、ABN、服务、服务区、评价、品牌信号,优先从这里走。
pl:extract-site-ctx命令:
npm run pl:extract-site-ctx -- --slug <slug> --force npm run pl:extract-site-ctx -- --slug <slug> --write-content --force
它读取:
master.md 开头资料。core-extract.json 的 real_facts、brand_signals、ai_extensions、narrative。它写出:
clients/<slug>/v2/site-ctx.jsonclients/<slug>/v2/facts.jsonhandoff/od-package/content/reviews.jsonhandoff/od-package/content/coverage.json代码依据:
scripts/cli/pl-extract-site-ctx.js:1-27scripts/cli/pl-extract-site-ctx.js:237-339scripts/cli/pl-extract-site-ctx.js:365-456注意:reviews.json 和 coverage.json 是从真实评价/服务区整理出来的,优先级比公式兜底高。
命令:
npm run pl:enrich-handoff -- --slug <slug> npm run pl:enrich-handoff -- --slug <slug> --only B1,B2,B3
它写到:
clients/<slug>/v2/handoff/content/services.json clients/<slug>/v2/handoff/content/about.md clients/<slug>/v2/handoff/content/hero-copy.json clients/<slug>/v2/handoff/content/faq.json
这一段会调用 LLM,所以是风险最高的一段:可能写得空、写得夸、或者把没有核实的东西写成承诺。
代码依据:
scripts/cli/pl-enrich-handoff.js:1-16scripts/cli/pl-enrich-handoff.js:139-178scripts/cli/pl-enrich-handoff.js:188-215scripts/cli/pl-enrich-handoff.js:240-266当前有两个内容目录:
handoff/content/ # 编辑稿,pl:enrich-handoff 写这里 handoff/od-package/content/ # 渲染稿,pl:compose-editorial 读这里
中间必须跑:
npm run pl:assemble-handoff -- --slug <slug>
它会把 handoff/content/* 复制到 handoff/od-package/content/*。
代码依据:
scripts/cli/pl-assemble-handoff.js:123-168scripts/cli/pl-assemble-handoff.js:170-188如果编辑稿比渲染稿新,pl:compose-editorial 默认会停,不会悄悄用旧文案。
修法:
npm run pl:assemble-handoff -- --slug <slug> --skip-checkpoint
或者渲染时加:
npm run pl:compose-editorial -- --slug <slug> --auto-assemble
代码依据:
scripts/cli/pl-compose-editorial.js:425-447docs/v3/SOP-MASTER-MD-TO-WEBSITE.md:80-90命令:
npm run pl:build-single-page-brief -- --slug <slug> npm run pl:validate-single-page-brief -- --slug <slug>
single-page-brief.yaml 是渲染前的最终事实锁。它不写文案,不调用 LLM,不补假事实。
优先级:
core-extract.json 的 real_facts > master.md 开头资料 > null / data gap
它会特别保护:
牌照只信高把握的官方查询;AI 推出来的服务区候选不会被当作正式覆盖区域。
当前不要再走旧的 design-handoff.md / Open Design handoff 路线。带 pl:build-design-handoff 的旧命令已经被 _deprecated-guard 默认封住;它属于旧路,不是现在的建站主线。
现在给 Design / 建站看的开工包分两层:
brand_tokens_path 不是手工随便补一个颜色文件。它应该来自 logo / brand skill 的产物。
现有 skill 路线:
| 情况 | 用哪个 skill | 结果 |
|---|---|---|
| 客户已有 logo:官网、截图、PNG、JPG、PDF、SVG、社媒头像等 | existing-logo-brand | 保真转换,输出 SVG variants、source audit、brand tokens、视觉规则 |
| 客户没有 logo,或者无网站 starter 没有可用 logo | logo-design | 新设计一个 website-ready logo / brand kit |
| 一批 lead 批量处理,先记录状态和缺口 | local-brand-logo 的 batch lead mode | 每个 lead 记录是否有 logo、用哪个模式、输出目录、下一步 |
| 明确要高级感 / 高端 logo | premium-logo | 多方向高质量品牌系统;默认不用于普通 starter 批量流程 |
标准输出分两层,不能混:
clients/<slug>/v2/brand/
这是 logo / brand skill 的作者目录,也是 pl:assemble-handoff 的品牌来源。每次组装时,它会被快照进:
clients/<slug>/v2/handoff/od-package/brand/ brand-assets.md brand-tokens.css brand-spec.json logo-dark.svg logo-light.svg logo-mark.svg logo-horizontal.svg 或 logo-wordmark.svg favicon.svg social-avatar.svg visual-style-contract.md agent-handoff.md logo-qa-checklist.md logo-review.md 或 source-logo-audit.md
代码依据:
scripts/cli/pl-assemble-handoff.js:52-115scripts/cli/pl-assemble-handoff.js:179-183写入这个目录后,single-page-brief.yaml 的 brand_tokens_path 应指向:
clients/<slug>/v2/handoff/od-package/brand/brand-tokens.css
这层解决的是“网站有品牌基础”,不是“客户已经批准最终 logo”。无网站 starter 可以先用 demo brand kit 做销售预览,但必须在销售材料里标清:logo / brand 可替换,不能假装是客户现有官方 logo。
brand kit 不只是 logo 图片。它至少应该把这些设计语言写清楚:
现有 skill 已经会产出:
visual-style-contract.md agent-handoff.md brand-assets.md logo-qa-checklist.md
这些文件现在是给建站 agent / 人审读的视觉规则层。后续增强必须复用这层,不要另开一套“设计语言说明”。
用于“无网站客户先做一版 starter 页面概念”。这层可以开始设计,但不代表已经可以发布。
必须有:
clients/<slug>/v2/master.md clients/<slug>/v2/core-extract.json clients/<slug>/v2/site-ctx.json clients/<slug>/v2/facts.json clients/<slug>/v2/single-page-brief.yaml clients/<slug>/v2/handoff/od-package/content/coverage.json clients/<slug>/v2/handoff/od-package/content/external-material.json
Design 可以用:
single-page-brief.yaml:电话、地址、ABN、牌照、服务、服务区等事实锁。site-ctx.json:结构化业务资料、评价、FAQ seed、外部资料分桶。external-material.json 里的 design_usable_facts:身份确认后的服务、服务区、专长、项目线索、客户语言。external-material.json 里的 context_only_facts:只作背景理解,不能写成客户自己的 claim。Design 不能用:
sales_only_facts 里的老板名、年限、奖项、团队规模等敏感资料,除非后面有更强来源确认。blocked_facts 里的电话、地址、ABN、牌照、官网候选。发布前必须再跑:
npm run pl:validate-single-page-brief -- --slug <slug>
这层比 starter 开工包更严格。它会拦:
所以结论是:
starter_material_ready = 可以开始准备 starter 页面输入 validate-single-page-brief PASS = 发布前事实锁通过
两者不是一回事。
2026-06-04 当前 4 个无网站 starter 的状态:
| 客户 | starter 概念开工包 | 发布前事实锁 | 还缺什么 |
|---|---|---|---|
| Mr Roof Solutions | 已有 | PASS | 已用确认官网 mrroof.com.au 的现有 logo 做 brand kit;当前页面和 fast audit 可过,但 sales 前还要补 owner / experience 真实来源、确认社交主页、warranty / guarantee |
| NP Roof Repairs | 已有 | FAIL | 缺 ABN;starter/demo brand kit 已生成,本地 QBCC 弱匹配不能写入 |
| Ultra Roof Restorations | 已有 | FAIL | 缺 ABN;starter/demo brand kit 已生成,社媒头像读取不作为发布前硬门 |
| Prime Roof Restorations | 已有 | FAIL | 缺 ABN;starter/demo brand kit 已生成,本地 QBCC 弱匹配不能写入 |
已跑 pl:geo-suburbs 给 4 个 starter 补了离线 geo_derived 区域候选,所以“服务区数量不足”的发布前卡点已解除;但这些只是“附近区域候选”,不能写成客户亲口确认的服务区。
代码依据:
scripts/cli/pl-build-single-page-brief.js:1-18scripts/cli/pl-build-single-page-brief.js:47-71scripts/cli/pl-build-single-page-brief.js:98-128scripts/cli/pl-build-single-page-brief.js:149-172pl:compose-editorial 读取:
checkpoint.jsoncore-extract.jsonsingle-page-brief.yamlhandoff/od-package/content/*facts.jsonmaster.md内容优先级大致是:
| 区块 | 优先读取 | 不够时兜底 |
|---|---|---|
| hero | hero-copy.json | core-extract 公式 |
| services | services.json | core-extract 服务列表 |
| about | about.md | core-extract narrative |
| reviews | reviews.json | core-extract 真实评价 |
| coverage | coverage.json | single-page-brief.yaml / real_facts |
代码依据:
scripts/cli/pl-compose-editorial.js:364-457scripts/cli/pl-compose-editorial.js:776-806scripts/cli/pl-compose-editorial.js:870-884scripts/cli/pl-compose-editorial.js:1241-1262docs/v3/CANONICAL.md:30-37模块 7 至少有这些保护:
pl:data-checkpoint- 数据太薄会挡住建站。 - 如果服务文案文件存在但为空/像停放域名,会变 RED。
pl:validate-single-page-brief- 检查最终事实锁。
pl:compose-editorial freshness guard- 防止用旧文案渲染。
ctx-snapshot.json- 渲染后记录每个区块到底用了哪个来源。
代码依据:
scripts/cli/pl-data-checkpoint.js:81-111scripts/cli/pl-data-checkpoint.js:251-262scripts/cli/pl-compose-editorial.js:420-447scripts/cli/pl-compose-editorial.js:1241-1262模块 7 已经有一条能跑的主路。
事实线相对稳:core-extract.json → site-ctx.json → single-page-brief.yaml。
主要风险在文案线:pl:enrich-handoff 写出来的 hero/services/about/FAQ 质量不一定稳定,所以后面模块 9 网站质检必须继续盯:
本模块核对后需要至少跑:
node scripts/test/test-brief-builder.mjs npm run test:content-validator-locked-facts node scripts/test/test-data-checkpoint-service-content.mjs npm run pl:publish-business-map -- --dry
目标:说明网站 HTML 是怎么从模块 7 的内容资料生成出来的,哪些渲染方式是主路,哪些只是可选增强,哪些旧路不能碰。
当前网站渲染主路只有一条:
npm run pl:compose-editorial -- --slug <slug>
它输出:
clients/<slug>/v2/editorial-output/index.html clients/<slug>/v2/editorial-output/assets/ clients/<slug>/v2/editorial-output/ctx-snapshot.json
代码依据:
scripts/cli/pl-compose-editorial.js:1-27scripts/cli/pl-compose-editorial.js:1225-1325docs/v3/CANONICAL.md:89-98pl:compose-editorial 会读:
core-extract.jsonmaster.mdcheckpoint.jsonsingle-page-brief.yamlhandoff/od-package/facts.jsonhandoff/od-package/content/*handoff/photos/selected.jsonhandoff/od-package/brand/*layout-plan.jsonwireframes/wireframe-home-<llm>.json代码依据:
scripts/cli/pl-compose-editorial.js:5-19scripts/cli/pl-compose-editorial.js:364-457默认模板:
templates/roofing/editorial-newsletter/template.html
可选已收录模板:
npm run pl:compose-editorial -- --slug <slug> --template trade-classic
模板规则:
editorial-newsletter:默认,偏温暖 editorial。trade-classic:更直接的澳洲 trade voice。代码依据:
scripts/cli/pl-compose-editorial.js:355-362scripts/cli/pl-compose-editorial.js:1170-1174docs/v3/CANONICAL.md:20-37docs/v3/INFRASTRUCTURE-INVENTORY.md:299-310当前 Phase B 只支持 roofing 单页网站。
不是多页站,不是整站 LLM 自由生成,也不是 OD daemon。
代码/文档依据:
docs/v3/CANONICAL.md:27-29docs/v3/CANONICAL.md:89-98scripts/cli/pl-compose-editorial.js:1317-1322生产渲染不能绕过 checkpoint.json。
pl:compose-editorial 默认会:
checkpoint.json 存在。checkpoint.verdict === RED,直接停止。--skip-checkpoint 只能开发/排查时用,不能当生产路径。
代码依据:
scripts/cli/pl-compose-editorial.js:420-447docs/v3/CANONICAL.md:107-128渲染后会写:
editorial-output/ctx-snapshot.json
它记录每个区块用了哪个来源:
hero-copy.json 或公式兜底。services.json 或 core-extract。about.md 或 core-extract narrative。reviews.json 或真实评价兜底。coverage.json 或服务区兜底。这个文件后面排查“页面上这段话从哪里来”很有用。
代码依据:
scripts/cli/pl-compose-editorial.js:1241-1262图片有三类来源:
默认路径会复制 stock 图片和已有真实项目图。使用 --use-layout-plan 时,如果计划里指定了真实图片但文件不存在,会直接停止,不会默默换成别的。
代码依据:
scripts/cli/pl-compose-editorial.js:408-415scripts/cli/pl-compose-editorial.js:673-723scripts/cli/pl-compose-editorial.js:826-859scripts/cli/pl-compose-editorial.js:1225-1315现有模板系统已经吃进去一部分品牌信息:
brand-tokens.css。--brand-primary、--brand-accent、--surface、--text 等变量。pl:audit-v4 会检查 logo 引用、深浅背景上的 logo 版本、品牌颜色是否真的出现在页面里。代码依据:
scripts/cli/pl-compose-editorial.js:418scripts/cli/pl-compose-editorial.js:895-897scripts/cli/pl-compose-editorial.js:977-993scripts/cli/pl-compose-editorial.js:1264-1284templates/roofing/editorial-newsletter/template.html:29-43templates/roofing/editorial-newsletter/template.html:316-319templates/roofing/editorial-newsletter/template.html:577scripts/cli/pl-audit-v4.js:705-778但当前还要诚实区分:
| 层 | 当前状态 | 后续方向 |
|---|---|---|
| logo 图片 | 已接入模板 | 继续用现有 brand kit,不新建 logo 路径 |
| 品牌颜色 | 已接入模板 | 继续用 brand-tokens.css |
| logo 深浅版本 | audit 已检查 | 保持 logo-light / logo-dark / logo-mono-light 命名 |
| 视觉语言文件 | 已有 visual-style-contract.md / agent-handoff.md | 后续让模板选择、recipe、layout-plan 读取或参考它 |
| 整站气质自动适配 | 还没有完全自动化 | 在 pl:compose-editorial / pl:plan-layout 上增强,不重造建站系统 |
所以现在的原则是:
brand kit 先定调 → compose-editorial 吃 logo + tokens → audit-v4 检查品牌一致性 → 需要更强视觉适配时,只在现有 template / recipe / layout-plan 上增强
不能因为 logo 设计语言还没完全自动驱动模板,就绕开 pl:compose-editorial 去写另一套网站生成器。
有一套新的灵活模块系统,但它不是默认批量主路。
命令:
npm run pl:plan-layout -- --slug <slug> --base npm run pl:plan-layout -- --slug <slug> --recipe trust-heavy npm run pl:plan-layout -- --slug <slug> --auto-recipe npm run pl:compose-editorial -- --slug <slug> --use-layout-plan
它会写:
clients/<slug>/v2/layout-plan.json clients/<slug>/v2/layout-plan.audit.json
可选 recipe:
editorial-defaulttrust-heavyvisual-firstlocal-seo关键边界:
pl:plan-layout 可以默认 smart 地规划模块。pl:compose-editorial --use-layout-plan 默认是关的。--use-layout-plan,实际渲染还是老的单页模板。代码依据:
scripts/cli/pl-plan-layout.js:1-11scripts/cli/pl-plan-layout.js:58-107scripts/cli/pl-compose-editorial.js:396-407scripts/cli/pl-compose-editorial.js:1175-1223docs/v3/CANONICAL.md:30-37docs/v3/HANDOFF-NEXT-SESSION.md:24-44不要走:
pl:compose-site这些命令有 seal guard,默认会拒绝运行。
代码依据:
scripts/cli/_deprecated-guard.js:1-22docs/v3/CANONICAL.md:130-170模块 8 当前可批量使用的是:
npm run pl:compose-editorial -- --slug <slug>
可选增强是:
npm run pl:compose-editorial -- --slug <slug> --template trade-classic npm run pl:plan-layout -- --slug <slug> --recipe <recipe> npm run pl:compose-editorial -- --slug <slug> --use-layout-plan
但批量推进时,默认应先守住 editorial-newsletter 主路;recipe 和 real-photo layout 只对具体客户逐个打开。
本模块核对后需要至少跑:
npm run test:deprecated-seal npm run test:layout-plan-parity npm run test:recipe-spine npm run test:auto-recipe npm run pl:publish-business-map -- --dry
目标:说明网站渲染完成后,哪些检查会拦发布,哪些只是建议;以及手机端、事实错误、假牌照、内容太薄分别由谁抓。
网站建完不能直接发。当前质检分三类:
npm run pl:copy-audit -- --slug <slug> npm run pl:audit-v4 -- --slug <slug> --tier fast npm run pl:audit-v4 -- --slug <slug> --tier full npm run pl:persona-copy-audit -- --slug <slug> --runs 3
代码依据:
package.json:428-452scripts/cli/pl-copy-audit.js:20-25scripts/cli/pl-audit-v4.js:27-36scripts/cli/pl-persona-copy-audit.js:10-13发布前按顺序看:
checkpoint.json- RED:不发布。 - YELLOW:只能预览,并且页面要有 preview 提醒。
single-page-brief.yaml- GREEN 客户必须有,并且要能验证。
- 服务不能太少。 - 覆盖区域不能太少。 - 评价没有真实内容时,页面要明确是预览/占位。
- 390px 不能横向溢出。 - 手机端要有 sticky CTA。 - 关键按钮/输入区域要够大。
- T1 事实检查要过。 - 品牌/语气/证据/事实交叉检查不能明显低。
文档依据:
docs/v3/CANONICAL.md:107-168docs/v3/SOP-AUDIT-STANDARD-V2.md:177-188代码依据:
scripts/cli/pl-audit-v4.js:1025-1102scripts/cli/pl-audit-v4.js:1390-1430scripts/cli/pl-audit-v4.js:1550-1631pl:copy-audit 管什么pl:copy-audit 主要管两件事:
- 商家名。 - 电话。 - 地址。 - ABN。 - 牌照。
- hero 副标题太长。 - 服务描述太长。 - about 太长。
它不会因为普通营销话术、轻微泛泛而自动挡发布。那些是建议,不是硬门。
代码依据:
scripts/cli/pl-copy-audit.js:1-25scripts/cli/pl-copy-audit.js:31-70scripts/cli/pl-copy-audit.js:300-339pl:audit-v4 管什么pl:audit-v4 是主质检工具。
fast 版:
npm run pl:audit-v4 -- --slug <slug> --tier fast
主要看:
single-page-brief.yaml 对得上。full / premium 版会加视觉和设计判断,成本更高,结果会受模型波动影响,所以需要看模型和多次运行统计。
代码依据:
scripts/cli/pl-audit-v4.js:1-39scripts/cli/pl-audit-v4.js:1025-1102scripts/cli/pl-audit-v4.js:1530-1631手机端不是“扣一点分”。
这些会直接挡发布:
代码依据:
scripts/cli/pl-audit-v4.js:1390-1430docs/v3/CANONICAL.md:130-134docs/v3/SOP-AUDIT-STANDARD-V2.md:177-188pl:persona-copy-audit 管什么这是买家视角文案审查。
它会问:这个页面对这个客户画像有没有说服力?
它看 8 项:
但它是建议,不是批量硬门。Matthew 可以用它来判断“这页值不值得发”,但系统不应该只因为这个分低就自动挡所有发布。
代码依据:
scripts/cli/pl-persona-copy-audit.js:1-13scripts/cli/pl-persona-copy-audit.js:62-96core/audit/persona-copy-judge.js:1-27模块 9 当前的发布前最小检查应该是:
npm run pl:copy-audit -- --slug <slug> npm run pl:audit-v4 -- --slug <slug> --tier fast
如果要更稳,再加:
npm run pl:persona-copy-audit -- --slug <slug> --runs 3 npm run pl:audit-v4 -- --slug <slug> --tier full --vision-runs 3
其中 persona-copy-audit 是买家视角建议;audit-v4 full 要看模型和波动,不能和不同模型跑出的旧分数直接比。
本模块核对后需要至少跑:
npm run test:fact-verify npm run test:content-validator-locked-facts node scripts/test/test-grid-balance.mjs npm run pl:audit-v4 -- --slug vicwest-roofing --tier fast --json npm run pl:publish-business-map -- --dry
2026-06-03。当前只考虑 roofer niche。目标不是手工做业务,而是把 lead 从进入系统到 Design / 建站可开工这条流程理顺、跑通、清掉冲突。
把 roofer lead 做成一条可重复的流水线:
发现客户 → 判断入口是否已有可信官网 / Google Place / 基础身份 → 有官网/Place:先便宜快速筛选 → 无官网/Place:先搜索确认身份,找到官网再合流,找不到官网但是真公司就走无网站 starter → 分层采集和 audit → master.md 总档案 → 销售资料 + Design / 建站资料包
这条线的硬原则:
master.md。它是总档案,不是网站本身。master.md 分层保存,再从里面抽销售资料、audit report、Design / 建站资料包。| 入口 | 进来时通常有什么 | 第一段该做什么 | 搜索什么时候做 | 合流点 |
|---|---|---|---|---|
| Maps / Docker / Places API | 公司名、电话/地址、评分/评价、place_id,可能已有官网 | 先跑便宜初筛:GBP、官网首页、PageSpeed、页面规模、license、ABN | 后期补背景、社媒、第三方资料 | 初筛后进入详细审计 / 后置补强 / Design 资料包 |
| 图片 / 公司名 / license 数据 | 可能只有名字、图片、license 记录;官网和 place_id 不确定 | 先搜索找官网、Google Map、place_id、电话、地址 | 第一步就搜索 | 找到官网并确认同一家公司后,回到“有官网便宜初筛”;找不到官网但是真公司,走无网站 starter |
这个锁定解决一个旧混乱:搜索不是一个固定阶段。 它的位置由入口资料决定。
docs/v3/BUSINESS-OVERVIEW-CN.md:7-11。docs/v3/FLOW-END-TO-END-CN.md:8-22。master.md 是客户研究档案,后续建站和销售都要读,见 docs/v3/BUSINESS-OVERVIEW-CN.md:103-109。docs/v3/BUSINESS-OVERVIEW-CN.md:66-70。scripts/cli/pl-observe-search-identity.js:3-8。scripts/cli/pl-observe-search-identity.js:37-77。scripts/cli/pl-observe-search-identity.js:126-158。scripts/cli/pl-observe-search-identity.js:168-235。scripts/cli/pl-observe-search-identity.js:275-287。目标 先把“搜出来的这个页面是不是同一个客户”跑稳。没有这个,后面会把别人的官网、评价、社媒、论坛帖子混进客户档案。
要解决
当前完成
npm run pl:observe-search-identity。docs/v3/LOGIN-REQUIRED-SOURCES-CN.md。本阶段验收
master.md 的哪个区域。验收状态 · 2026-06-03
docs/v3/LOGIN-REQUIRED-SOURCES-CN.md,并发布到 SSOT 页面“登录来源 · OpenCLI准备”。目标 每条 lead 的所有资料都进入 master.md,但不是混成一锅。要分清正式事实、外部背景、销售参考、待确认、丢弃原因。
要解决
本阶段验收
master.md 有固定的“来源归属记录”区域。当前进度 · 2026-06-03
data/leads/search-result-identity-queue/<key>.json → master.md 的“搜索来源归属记录”区域。 - clients/ace-roofing-service/v2/master.md:AI 高信心同一 5、需要登录后判断 3、不同公司 7。 - clients/adelaide-roofs/v2/master.md:AI 高信心同一 3、需要登录后判断 9、不同公司 6。 - clients/spalding-roofing/v2/master.md:AI 高信心同一 6、需要登录后判断 8、不同公司 1。
pl:observe-search-identity --fetch-open-web 会只对 AI 高信心的非社交候选读取正文,然后再判断一次同一客户。owned_domain。master.md 已显示“已读正文后的验证(非社交候选)”;检查确认社媒和第三方候选没有进入 frontmatter,只有官网作为正式字段保留。z3wvy2xe 可以只读 LinkedIn 页面。A & J 用 --opencli 跑真实样本后,登录待读从 7 条变 0 条,读取失败 0 条;Facebook 主页升级为 AI 高信心同一客户候选,3 条社交页保留为可能同一客户,3 条 Instagram 判为不同。opencli-source-stats.md/json,用于看 Facebook / Instagram / LinkedIn 的读取效果。external_facts 不会流入 site-ctx.json、facts.json、coverage.json、reviews.json、single-page-brief。external_facts → Design 可参考素材 分级通道:身份确认过的外部服务、服务区、专长、项目线索、客户语言可以进入 site-ctx.external_material.design_usable_facts 和 handoff/od-package/content/external-material.json;电话、地址、牌照、ABN、老板名等硬字段仍不能被搜索资料覆盖。pl:mine-background dry 已证明能从已确认 Instagram 正文挖出服务、服务区等素材;同时发现 LLM 会吐 Not explicitly stated 这类空话,已补过滤和测试 test-mine-background(13 passed)。这类素材暂不写入,直到“客户自己的事实”和“合作产品/第三方品牌事实”分开。external-material.json 现在有 context_only_facts。例如 iSwirl 安装、iSwirl 官方安装商、Australia Wide Delivery 这类只做背景/销售参考,不给 Design 写成客户自己的 claim;awards 从 Design 素材移到销售/人工核实。npm run pl:opencli-recover -- --profile z3wvy2xe --smoke-url <url>。它会检查 doctor、必要时重启 daemon、打开独立 Chrome profile 并加载 /Users/matthew/opencli-extension/v1.0.17,再跑 smoke;不点、不填、不抓业务内容,只恢复只读通道。pl:mine-background --write 成功写入 6 个 external_facts,real_facts.phone 仍是 1300 023 230。重建后 external-material.json 分桶为 2 design、2 sales、2 context:Design 只看到服务区和专长;奖项 / social proof 进销售核实;iSwirl 服务和认证进背景参考。external_facts(service_list、suburbs_served),real_facts.phone 仍是 0484 621 090。重建后 external-material.json 分桶为 2 design、0 sales、0 context、0 blocked;Instagram 仍为不够确定,不写入。pl:mine-background dry:目录页、问答页能作为背景调查来源,但这轮没有挖到可用事实;没有写入 external_facts。结论是:搜索结果的第一作用仍然是排除和确认,只有正文里有明确服务/区域/特色等信息,才进入 Design 资料包。single-page-brief.yaml 生成器本来能输出 1300 023 230,但验证器只认 +61 电话;已补红测再修,让 1300/1800 商业电话能通过事实锁格式检查。目标 把一直变化的筛选标准定成一张表:哪些直接排除,哪些只是观察,哪些会提高优先级,哪些进入人工少量复核。
要解决
本阶段验收
当前进度 · 2026-06-03
core/leads/fast-filter.js 为准,SSOT 页面“快速筛选漏斗”直接从这份代码生成。cheap-audit-queue 先跑行业相关、GBP、排除预检、牌照观察、Tinyfish 首页、页面规模、PageSpeed、cheap audit、三层排除;活下来的客户进入 enqueueDetailedAudit。 - 牌照风险只观察,不自动踢。 - PageSpeed 慢是销售证据,不是淘汰门。 - 页面规模是硬门:前端导航页太多会提前归档。 - 快筛幸存者统一 predict=C + audit_now=true;真正 A/B/C/D 在详细审计后给。
test:fast-filter 已加防回归。npm run pl:target-fit-replay -- --sample --markdown。它不只看能不能 audit,而是判断 lead 是否属于“无网站强目标”或“有网站强问题目标”。目标 把 audit 拆成便宜快跑和贵的深跑。先用免费工具和本地工具筛出值得深挖的客户,再跑 PageSpeed、完整网站 audit、视觉审计、Places 付费接口等。
要解决
master.md,并变成销售切入点。本阶段验收
当前进度 · 2026-06-03
- Playwright 详细抓站:core/audit/site-fetch-full.js,本地免费但慢,用于 HTML、手机端、表单、性能、截图。 - Docker reviews:core/reviews/fetch-reviews-local.js,本地免费但 30-60 秒,适合 A/B 候选或高价值客户。 - Places reviews:core/reviews/fetch-reviews.js,付费少量评价,不作为每条 lead 默认动作。 - Places Details:scripts/cli/pl-places-enrich.js,手动或 grade ≥ B 触发,有额度保护。 - Firecrawl:core/audit/multi-page-crawl.js,默认不跑,只有免费抓取失败且明确开兜底才跑。
- docs/v3/COST-LAYERED-SCREENING-CN.md - docs/v3/MODULE-05-DEEP-AUDIT-CN.md - docs/v3/DATA-SOURCES-TO-MASTER-MD-CN.md
- “Firecrawl 默认抓多页”退役;现在默认免费优先。 - “每条 lead 都拉评论”退役;评论深挖只给 A/B 候选或人工指定。
- iFix Roofing:B/ready,Docker reviews + Places Details 已完成;下一步变成 Design / 建站资料包。 - A & J Roofing Solutions:C/outreach,不默认拉评论、不默认跑 Places。 - Ultra Roof Restorations:无网站但 93 reviews,Docker reviews + Places Details 已完成;继续走无网站资料补强,不跑 Playwright / Firecrawl。 - Brisbane Roofing Solutions:已归档 D,即使 118 reviews,也停止所有慢/付费工具。 - Vicwest Roofing:已有 Places + reviews,不重复跑。
master.md 的“筛选与去向记录”:entry_route、search_timing、next_step。打开 lead 档案就能看到搜索该早做还是后置、下一步该补资料 / 审计 / 轻触达 / Design / 归档。master.md 已用 --no-discord 重建。core-extract.json、site-ctx.json、handoff/od-package/content/reviews.json、handoff/od-package/content/coverage.json、single-page-brief.yaml 已生成;brief 验证通过。core-extract.json → site-ctx.json → single-page-brief.yaml。目标 从 master.md 自动抽出两类资料:销售要用的说服材料,Design / 建站要用的开工材料。
要解决
本阶段验收
master.md 来源。当前进度 · 2026-06-04
已新增一条只读回放命令,专门回答“快筛之后,哪些客户已经能给 Design / 建站准备资料,哪些还缺东西”:
npm run pl:design-material-readiness -- --all-roofers --markdown
它不联网、不调用 Docker、不调用 Places、不改客户档案,只读现有 entity、快筛判断、starter 资料判断、详细审计 fixture、截图、master.md 和 audit HTML。
当前 247 个 roofer 全量回放结果:
| 资料状态 | 数量 | 意义 |
|---|---|---|
not_design_candidate | 219 | 快筛后不该给 Design:快速排除、先补身份、轻触达等 |
website_material_ready | 24 | 有网站问题 / 值得深挖客户,已有详细审计、截图、master.md,可准备 Design 资料包 |
starter_material_ready | 4 | 无网站强候选,已有基础资料 + 至少 2 个硬证据,可准备 starter 页面输入 |
starter_material_gap | 0 | 当前无网站强候选已无资料缺口 |
4 个无网站强候选已经全部从 starter_material_gap 升到 starter_material_ready,并且已经接入当前建站事实链。现在不再只是“资料够”,而是已经能生成 starter 版 core-extract.json,再进入 site-ctx.json 和 single-page-brief.yaml。
但这里必须分清两层:
starter_material_ready = 可以准备 starter 页面输入 validate-single-page-brief PASS = 发布前事实锁通过
当前 4 个 starter 都已有概念开工包。Mr Roof Solutions 已先跑通 logo / brand kit 链路,其余 3 个还不是发布就绪:
| 客户 | 发布前事实锁 | 当前卡点 |
|---|---|---|
| Mr Roof Solutions | PASS | 已用确认官网 mrroof.com.au 的现有 logo 做 website-ready brand kit;当前页面和 fast audit 可过,但 sales 前还要补 owner / experience 真实来源、确认社交主页、warranty / guarantee |
| NP Roof Repairs | FAIL | 缺 ABN;starter/demo brand kit 已生成,本地 QBCC 只返回弱匹配,不能用 |
| Ultra Roof Restorations | FAIL | 缺 ABN;starter/demo brand kit 已生成,本地 QBCC 只返回弱匹配,不能用 |
| Prime Roof Restorations | FAIL | 缺 ABN;starter/demo brand kit 已生成,本地 QBCC 只返回弱匹配,不能用 |
已跑 pl:geo-suburbs 给 4 个 starter 补了 18 个离线区域候选,服务区数量卡点已解除;这些是 geo_derived 附近区域,不能写成客户已确认服务区。
品牌 token 缺口不需要人工硬补颜色。现有 logo/brand skill 路线已经确认:
| 情况 | 标准动作 |
|---|---|
| 客户已有 logo(官网、图片、社媒头像、PDF/PNG/JPG/SVG) | 用 existing-logo-brand 保真转换成 website-ready brand kit |
| 无网站 starter 没有可用 logo | 用 logo-design 生成 starter/demo brand kit |
| 批量处理很多 lead | 用 local-brand-logo batch lead mode 记录每个客户 has_existing_logo、output_mode、blockers、next_action |
| 明确追求高级 logo | 才用 premium-logo,不作为普通批量默认 |
标准输出目录是 clients/<slug>/v2/handoff/od-package/brand/,发布前 single-page-brief.yaml.brand_tokens_path 应指向 clients/<slug>/v2/handoff/od-package/brand/brand-tokens.css。
新增主线命令:
npm run pl:build-starter-core-extract -- --entity-key <entity-key> npm run pl:extract-site-ctx -- --slug <slug> --force --write-content npm run pl:build-single-page-brief -- --slug <slug>
边界:这条命令只读本地 entity / GBP / Places / confirmed licence,不联网、不调用 LLM、不读取搜索候选正文;弱牌照候选、搜索结果、需要登录的社交资料都不能进入 real_facts。
当前具体补法:
| 客户 | 现在已有 | 下一步 |
|---|---|---|
| Mr Roof Solutions | 基础资料 + Google reviews + QBCC confirmed licence / ABN + 6 条外部资料 + 18 个离线区域候选 + 现有 logo brand kit | 可进入下一步 website composition;发布前核对官网 licence 冲突 |
| NP Roof Repairs | 基础资料 + Google reviews + 6 张 Places 商户照片 + 18 个离线区域候选 + starter/demo brand kit | 发布前补 ABN;当前弱 QBCC token match 不能写入 |
| Ultra Roof Restorations | 基础资料 + Google reviews + 6 张 Places 商户照片 + 2 条外部资料 + 18 个离线区域候选 + starter/demo brand kit | 发布前补 ABN;社媒可后期再挖官方头像,但不能阻塞 starter concept |
| Prime Roof Restorations | 基础资料 + Google reviews + 6 张 Places 商户照片 + 18 个离线区域候选 + starter/demo brand kit | 发布前补 ABN;当前弱 QBCC token match 不能写入 |
这条检查把阶段 3/4 和阶段 5 接起来:
前置快筛 → 无网站候选:starter 资料够不够 → starter core-extract:只把确认事实和带标记的 starter 默认内容接入主线 → external-material:把身份确认过的搜索/enrich 正文分成 Design 可参考、销售参考、禁止使用 → 有网站问题候选:详细审计、截图、master.md 是否够 → 够了再给 Design / 建站资料包 → 不够就只补缺口,不扩大乱搜
目标 把冲突、过期、被证伪的文档和代码处理掉,让项目只剩一条清楚主路。
要解决
本阶段验收
现在继续阶段 2 的下半段。
3 个真实 roofer 的 master.md 样例已经接上:
data/leads/search-result-identity-queue/<entity-key>.json → npm run leads:build-master-md -- --entity-key <entity-key> → clients/<slug>/v2/master.md
下一步检查重点:
core-extract.json 和 site-ctx.json 是否仍然只吃正式事实。阶段 2B 的非社交正文验证命令:
npm run pl:observe-search-identity -- --limit 1 --niche roof --judge-provider ollama --route-result-limit 3 --max-candidates 18 --fetch-open-web --open-web-fetch-limit 1
这个命令仍然是观察模式:写观察报告和搜索来源队列,不改客户正式档案、不发 Discord。
阶段 2C 的社交登录验证命令:
ENABLE_OPENCLI_FETCH=1 AUTH_FETCH_PROFILE=z3wvy2xe npm run pl:observe-search-identity -- --limit 1 --niche roof --judge-provider ollama --route-result-limit 3 --max-candidates 18 --opencli --concurrency 1
这个命令同样是观察模式:OpenCLI 只读 Facebook / Instagram / LinkedIn 候选页,读完后重新判断是不是同一客户;读到的内容仍然先留在候选来源区,不直接进入 Design / 建站事实。
2026-06-03 · 第一版。目的:把不断变化过的客户筛选逻辑重新分清楚。 核心问题不是“谁分数高”,而是“谁是我们这种单页网站产品真正能服务的客户”。
我们的目标客户不是所有本地商家,而是:
有真实业务、有转化机会、现有线上形象有明显问题,并且一个标准单页网站就能明显改善结果的客户。
所以筛选要分三层:
这一层对应命令:
npm run pl:frontloaded-screening-plan -- --markdown
慢工具和付费工具不用于第一轮找客户。第一轮只用原始字段、GBP 字段、官网类型、Tinyfish / direct fetch 首页、页面规模、PageSpeed 免费额度、license/ABN/WHOIS/Wayback、搜索结果归属判断和 master.md 覆盖检查。
第一轮快筛的结果只允许进入这些桶:
| 筛选桶 | 怎么进来 | 下一步 |
|---|---|---|
| 快速排除 | 已归档 / skipped / D、无身份、三层排除命中、已关店、评分很低且评价不少 | 停止投入,不跑慢工具和付费工具 |
| 先补身份 | 没官网、没 place_id、没电话地址,或搜索结果无法确认同一家公司 | 先搜索和 AI 判断同一客户 |
| 无网站候选 | 无独立官网、可联系、rating ≥ 4.5、review_count ≥ 20 | 补评价、官方资料、图片候选、starter 页面素材 |
| 有网站问题候选 | 有独立官网,首页快扫 / PageSpeed / cheap audit 发现明显问题 | 进入详细审计或高价值后置补强 |
| 轻触达 | 有一点机会,但口碑、评价数或网站问题强度不够 | 批量外联,不默认深挖 |
| 太好或太复杂 | 页面太多、业务复杂、网站运营成熟,单页产品不适合 | 不进入标准产品投入 |
| 值得深挖 | 快筛活下来,且有明确业务基础或明显网站问题 | 才允许 Docker / Playwright / Places 等资源 |
对应命令:
npm run pl:frontloaded-screening-rules -- --sample --markdown
覆盖检查命令:
npm run pl:frontloaded-screening-doctor -- --markdown
当前不能把“工具存在”和“已经第一轮自动用上”混在一起。覆盖检查现在的结论是:
| 状态 | 数量 | 意义 |
|---|---|---|
| 已第一轮使用 | 12 | 原始字段、GBP、行业判断、排除预检、官网类型、Tinyfish 首页、首页快扫、页面规模、PageSpeed、ABN/WHOIS/Wayback、搜索结果归属判断、master.md 覆盖等已经在第一轮或进入慢工具前使用 |
| 只观察但已跑 | 1 | license 本地库已跑,但只记录风险,不自动踢客户 |
| 还没全自动第一轮 | 0 | 暂无 |
搜索结果归属判断现在的边界:
| 规则 | 意义 |
|---|---|
| 只在无官网 / 无 Place / 身份不稳时自动跑 | 避免每条强身份 lead 都重复搜索 |
写 data/leads/search-result-identity-queue/<entityKey>.json | 进入 master.md 候选来源区 |
| 不写官网 / 社媒 / Design 正式事实 | 防止同名公司污染 |
| 社媒默认标记需要登录 | 等 OpenCLI 登录态读取后再重新判断 |
5 个真实样本当前快筛桶:
| 客户 | 快筛桶 | 意义 |
|---|---|---|
| iFix Roofing | 有网站问题候选 | 有官网,快筛看到重做机会 |
| Ultra Roof Restorations | 无网站候选 | 无官网,高口碑,可联系 |
| A & J Roofing Solutions | 轻触达 | 有问题但不默认加重投入 |
| Vicwest Roofing | 轻触达 | 有资料但不重复深挖 |
| Brisbane Roofing Solutions | 快速排除 | 已归档 / D,不再花资源 |
筛选不是为了“减少 lead 数量”,而是为了在大数据里找出少数高把握客户。
当前要找的强目标只有两类:
| 强目标 | 必须满足 | 为什么值得投入 |
|---|---|---|
| 无网站强目标 | 真 roofer、可联系、有 Place / GBP / 评价 / 营业时间 / 图片等身份和素材信号、没有独立官网 | 我们做一个单页网站,价值最直接 |
| 有网站强问题目标 | 有真实口碑和业务基础,但网站慢、旧、手机端差、CTA 弱、信任证据没展示,且页面规模适合单页 | 我们能用一个强单页解决明显转化问题 |
不是强目标的客户也可能保留,但只走轻触达或观察,不默认消耗慢工具和付费工具。
当前有一个 report-only 回放命令,用来检查 5 个真实 roofer 样本是不是被分到正确目标类型:
npm run pl:target-fit-replay -- --sample --markdown
它回答的不是“工具要不要跑”,而是:
当前样本结果:
| 客户 | 目标类型 | 处理 |
|---|---|---|
| iFix Roofing | 有网站强问题目标 | 已到 Design 资料包 |
| Ultra Roof Restorations | 无网站强目标 | 继续补无网站 starter 资料 |
| A & J Roofing Solutions | 有问题但先轻触达 | 不默认加重投入 |
| Vicwest Roofing | 有问题但先轻触达 | 不重复跑慢工具 |
| Brisbane Roofing Solutions | 不适合当前产品 | 已归档停止 |
这个判断已经写回 master.md 的“筛选与去向记录”:target_fit、值得继续的证据、卡点 / 排除理由会和 entry_route、search_timing、next_step 放在一起。打开单个 lead 的总档案,就能知道它为什么继续、为什么轻触达、为什么停。
筛出来以后,不是马上建站。还要过一层“资料能不能开工”的只读检查:
npm run pl:design-material-readiness -- --all-roofers --markdown
这条命令回答:
master.md 和 audit HTML。当前全 roofer 回放:
| 资料状态 | 数量 | 下一步 |
|---|---|---|
not_design_candidate | 219 | 不给 Design;按快筛桶停止、补身份或轻触达 |
website_material_ready | 24 | 可以准备有网站 redesign 资料包 |
starter_material_ready | 4 | 可以准备无网站 starter 页面输入 |
starter_material_gap | 0 | 当前无网站强候选已无资料缺口 |
这个结果说明:第一轮筛选的核心不是“找到很多客户”,而是把 247 个 roofer 压到少数值得花设计/建站资源的客户;无网站客户虽然价值高,但必须先补硬证据,否则页面会变成 AI 猜测。当前 4 个无网站强候选都已补到 starter ready,并已通过 pl:build-starter-core-extract 接进当前事实链:core-extract.json → site-ctx.json → single-page-brief.yaml。
已跑通的 4 个无网站 starter:
| 客户 | 已进入事实链 | 仍然不能当事实的内容 |
|---|---|---|
| Mr Roof Solutions | QBCC / ABN + GBP 基础资料 | 未补商户照片前不做项目图片 claim |
| NP Roof Repairs | GBP 基础资料 + 6 张 Places 商户照片 | 牌照弱匹配候选不进 real_facts |
| Ultra Roof Restorations | GBP 基础资料 + 6 张 Places 商户照片 | 牌照弱匹配候选不进 real_facts |
| Prime Roof Restorations | GBP 基础资料 + 6 张 Places 商户照片 | 牌照弱匹配候选不进 real_facts |
补充进展:搜索/enrich 资料不再只是旁边放着。现在已新增一层 external_material:
design_usable_facts:身份确认过的服务、服务区、专长、项目线索、客户语言,可给 Design / 文案作参考。sales_only_facts:老板名、成立年份、年限、团队规模等敏感背景,先只给销售参考。blocked_facts:电话、地址、牌照、ABN、官网等硬字段,不能被搜索资料覆盖。当前 4 个 starter 已开始跑外部正文挖掘。结果不是“搜索到就写入”,而是按客户分化:
| 客户 | 外部正文结果 | 是否进入 Design |
|---|---|---|
| Mr Roof Solutions | 写入 6 个 external_facts:服务、服务区、专长、奖项、认证、social proof | 2 条进入 Design;奖项 / social proof 给销售核实;iSwirl 相关只作背景参考 |
| NP Roof Repairs | dry run:Facebook 能确认同一客户,但没有挖到可用事实;多个目录页空抓取或不够确定 | 不进入 |
| Ultra Roof Restorations | 写入 2 个 external_facts:service_list、suburbs_served;Facebook 主页确认同一客户 | 2 条进入 Design |
| Prime Roof Restorations | dry run:目录页能辅助背景确认,但没有达到可写入线或没有可用事实 | 不进入 |
这证明搜索/enrich 的定位应该是:先排除错误来源,再补强少数高价值客户;不是把所有搜索结果都塞进网站资料包。
2026-06-03 真实回放补充:
z3wvy2xe 可读,Mr Roof 单客户回放把 14 条登录待读降到 0,但耗时 387 秒,所以只放在高价值客户后期深挖。pl:mine-background 已从 Mr Roof 的已确认 Instagram 正文 dry-run 挖出服务和服务区素材,但也出现合作产品/第三方品牌内容,例如 iSwirl 奖项。写入前必须分清“客户自己的事实”和“合作产品事实”;没分清前只当销售参考,不进网站文案。context_only_facts 专门放合作产品/第三方品牌背景。带 iSwirl、Australia Wide Delivery、supplier、manufacturer 等语义的内容不能进入 Design 文案种子;awards 也不能从外部资料直接进网站文案,必须先人工/强来源确认是客户自己的奖项。pl:opencli-recover 可自动恢复 Browser Bridge 连接,主动作是重启 OpenCLI daemon、打开独立 Chrome profile、加载本地 extension、再跑 smoke。external_facts,再分到 design_usable_facts / sales_only_facts / context_only_facts。Design 当前只得到服务区和专长;奖项和 iSwirl 相关内容不会变成网站 claim。external_facts,再分到 design_usable_facts。这说明登录源不是初筛工具,但对后期深挖有价值。| 类型 | 为什么适合 |
|---|---|
| 没有独立网站,但有真实业务和口碑 | 我们做一个网站,价值很直接 |
| 有网站,但网站老、慢、难用、手机端差 | 我们能用单页网站直接改善转化 |
| GBP 口碑不错,但网站表现拖后腿 | 有可信业务基础,重做网站有销售理由 |
| 服务范围清楚,业务不复杂 | 单页网站能覆盖主要目标 |
| 电话、地址、服务、评价等资料能核实 | 能写成可信页面,不靠编 |
| 类型 | 为什么不适合 |
|---|---|
| 明显不是目标行业 | 做了也卖不出去 |
| 假数据 / 测试数据 / 已关店 | 不是真客户 |
| 已经做得很好 | 没有明显重做理由 |
| 页面很多、业务复杂 | 标准单页站解决不了 |
| 电商、会员、booking、portal 很重 | 会牵涉系统迁移,不是当前产品 |
| 大企业 / 连锁 / 政府 / 学校 / charity | 决策复杂,不是快交付客户 |
| 口碑太差 | 网站不是核心问题 |
这里要先分清:搜索不是固定早期,也不是固定后期。
搜索放在哪里,取决于 lead 进来时有没有可信的官网 / Google Place / 基础身份。
| 入口类型 | 进来时有什么 | 搜索放在哪里 | 第一段主动作 |
|---|---|---|---|
| 入口 A · Maps / Docker / Places | 公司名、电话/地址、评分/评价、可能已有官网 / place_id | 后期为主 | 先跑便宜初筛:GBP、官网首页、PageSpeed、页面规模、license、ABN |
| 入口 B · 图片 / 公司名 / license 数据 | 可能只有名字、图片、license 记录,官网和 place_id 不确定 | 第一步 | 先搜索找官网、Google Map、place_id、电话、地址,并用 AI 判断是不是同一家公司 |
合流规则:
| 搜索结果 | 下一步 |
|---|---|
| 找到可信官网,并且 AI 判断是同一家公司 | 回到“有官网入口”的便宜初筛流程 |
| 没找到官网,但确认是真公司、有联系方式或口碑 | 走“无网站 starter”路径,这是主要目标客户之一 |
| 找到多个疑似官网 / 同名公司 / 信息冲突 | 进入身份和资料补查,不给 Design 用 |
| 找不到足够身份资料 | 暂缓或归档,不能硬编 |
所以真正的主线是:
入口已有官网/Place 基础资料 → 先便宜初筛 → 后期再搜索补背景 入口没有官网/Place 基础资料 → 先搜索确认身份 → 找到官网就合流到便宜初筛 → 没官网但是真公司就走无网站 starter
业务逻辑
没有网站的客户,理论上最容易说明价值:我们给他一个可打开、可提交表单、能介绍服务的站。
但它的问题是:资料更少。没有官网可抓,就要靠 Google Search、Places、GBP、评价、外部结果去确认这家公司到底是谁。
关键判断
| 问题 | 判断 |
|---|---|
| 是不是真公司 | 必须用电话、地址、Places、评价、牌照或外部资料确认 |
| 有没有足够业务信号 | 至少要有名称、电话或地址、服务类别、地区 |
| 有没有口碑或活动痕迹 | GBP 评分 / 评价 / 照片 / 营业时间有帮助 |
| 能不能写页面 | 服务、地区、联系方式不够就不能硬编 |
适合继续的情况
容易卡住的情况
业务逻辑
有网站的客户,我们不能只说“你有网站”。我们要找到会影响转化的核心问题:
关键判断
| 问题 | 判断 |
|---|---|
| 问题够不够大 | 网站问题要能影响转化 |
| 我们能不能解决 | 单页网站能解决,而不是要迁一整个复杂系统 |
| 页面规模合不合适 | 前端导航页太多就不适合标准产品 |
| 是否已有成熟运营 | 如果广告、分析、blog、CRM 都很重,可能不是目标客户 |
适合继续的情况
不适合继续的情况
这些情况不值得继续投入。
当前主要依据:core/leads/exclusion-filter.js、core/scoring/lead-grading.js。
| 信号 | 处理 | 原因 |
|---|---|---|
| 没电话、没邮箱、没网站,补资料后仍没有 | 归档 | 无法联系 / 无法确认 |
| 已关店 | 归档 | 不是真目标 |
| 测试名 / demo 名 | 归档 | 数据污染 |
| 行业不匹配 | 归档 | 不是目标客户 |
| 政府 / 学校 / charity | 归档 | 不符合产品 |
| web design / SEO / marketing 同行 | 归档 | 不是客户 |
| 大企业 / 评论数远超行业阈值 | 归档 | 不是快交付客户 |
| 评分很低且评价不少 | 归档 | 口碑问题比网站问题更大 |
| 近 12 个月刚重做网站 | 归档 | 销售时机不对 |
| 页面规模超过产品包 | 归档 | 一个标准单页解决不了 |
这些信号有用,但不应该单独决定归档。
| 信号 | 当前处理 | 原因 |
|---|---|---|
| 牌照过期 / 吊销 | 观察 | 必须先确认同一家公司,避免误伤 |
| PageSpeed 慢 | 加重做价值 | 慢是机会,不是坏客户 |
| 没 ABN / 没牌照 | 观察 / 发布前谨慎 | 不能编造,但不一定挡内部预览 |
| 外部资料说法 | 参考 | 需要身份确认和来源标记 |
| 社媒 / 外部提及 | 参考 | 可做背景,不自动变核心事实 |
这些决定客户优先级,不一定直接挡住。
| 信号 | 用途 |
|---|---|
| GBP 评分 | 判断业务可信度 |
| 评价数 | 判断业务规模和口碑基础 |
| 是否有网站 | 分成没网站路径 / 有网站路径 |
| 图片数量 | 判断素材是否足够 |
| 官网问题 | 判断重做价值 |
| 手机端体验 | 判断是否影响转化 |
| CTA / 表单问题 | 判断我们能否改善 |
这里必须分清。
当前依据:core/scoring/lead-grading.js。
| 等级 | 含义 |
|---|---|
| A | 值得全力追,口碑强、网站问题明显 |
| B | 值得做预览试探 |
| C | 批量轻触,不主动重投入 |
| D | 跳过 / 归档 |
A/B/C/D 回答的是:这个客户值不值得我们投入销售精力。
当前依据:core/scoring/qualification-scorecard.js 和 pl:data-checkpoint。
ready-to-build 回答的是:资料够不够给 Design / 建站用。
一个客户可以是 B,但资料不够开工。 一个客户也可以资料够,但销售优先级不高。
初筛结束后,不是直接跑所有工具。先把 lead 分到下一条路。
当前下一步只允许这些:
| 下一步 | 什么时候选 | 继续做什么 | 不做什么 |
|---|---|---|---|
| 停止后续投入 | 已归档、D 级、行业不对、页面规模超出、明显不是目标客户 | 保留 master.md 和归档原因 | 不再跑 Docker reviews / Places / Firecrawl / Playwright |
| 身份和资料补查 | 没官网、资料薄、同名多、官网/社媒/目录页不确定是不是同一家公司 | 搜索、OpenCLI、Tinyfish 读正文、电话/地址/地区核对 | 不把候选来源直接给 Design |
| 无网站高口碑 · 补资料 | 没官网,但有电话/地址,rating ≥ 4.5,review_count ≥ 20 | Docker reviews、Places Details、图片候选、服务/地区补全 | 不跑 Playwright / Firecrawl,因为没有官网 |
| 有网站 · 进详细审计 | 有独立官网,通过页面规模和排除规则,但还没有 detailed audit | Playwright 抓站、截图、表单、手机端、详细打分 | 不先跑 Firecrawl;Firecrawl 只兜底 |
| 看缺口补强 | A/B、ready-to-build、或人工指定,且 reviews / Places 资料还缺 | 先看 master.md 缺什么;Docker reviews、Places Details;Places reviews 只做 Docker 失败补充 | 不给 C/D 默认跑慢工具或付费工具 |
| 补资料缺口 | qa-pending,或者资料不够给 Design | 补电话、服务、地区、评价、图片、ABN/牌照状态 | 不硬编内容 |
| 补 logo / brand kit | 无网站 starter 或品牌素材缺失 | 有现有 logo 就用 existing-logo-brand;没有 logo 就用 logo-design;批量状态记录用 local-brand-logo | 不拿 generic house icon 冒充客户品牌 |
| 准备 Design / 建站资料包 | ready-to-build,且已核实事实足够 | 从 master.md 抽已核实事实、真实评价、图片和截图证据;starter 概念包和发布前事实锁分开检查 | 不抽搜索候选、AI 猜测、风险观察 |
| 轻触达 / 不加重投入 | C 级、outreach-active,已有基础报告但不值得继续花慢工具 | 批量销售、轻量外联、保留已有 audit 证据 | 不默认跑 Docker reviews、Places、Firecrawl |
| 少量人工复核 | 系统信号冲突,无法稳定判断 | 人看 master.md 缺口和风险记录 | 不让自动流程强行推进 |
工具视角回放用这个命令:
npm run pl:l6-l7-trigger-replay -- --markdown
业务资源阶段回放用这个命令:
npm run pl:resource-plan-replay -- --sample --markdown
全 roofer 本地回放用这个命令:
npm run pl:frontloaded-screening-rules -- --all-roofers --markdown npm run pl:resource-plan-replay -- --all-roofers --markdown
它把“目标客户判断”和“工具是否可跑”合在一起,回答:这条 lead 现在应该停止、补身份、补无网站资料、进详细审计、高价值补强、准备 Design,还是轻触达。
当前资源阶段结果:
| 客户 | 资源阶段 | 原因 |
|---|---|---|
| iFix Roofing | 准备 Design 资料包 | 有网站强问题目标,reviews / Places / detailed audit 已补齐 |
| A & J Roofing Solutions | 轻触达 / 不加重投入 | 有问题但口碑和销售把握不够,不默认再花钱 |
| Ultra Roof Restorations | 无网站资料补强 | 无官网但 5★ / 93 reviews,reviews / Places 已补,下一步看图片候选和 starter 素材缺口 |
| Brisbane Roofing Solutions | 停止后续投入 | 已归档 D,即使 118 reviews 也不继续投入 |
| Vicwest Roofing | 轻触达 / 不加重投入 | 有问题但先轻触达,且已有 Places + reviews,不重复跑 |
这个资源阶段已经写回 master.md 的“筛选与去向记录”:resource_band、现在可跑、暂缓 / 兜底、明确不跑,会跟 target_fit 放在一起。
这就是“初筛之后选择下一步”的标准,不是按工具顺序硬跑。
这次回放只读本地资料,不联网、不调用 Docker、不调用 Places、不写客户档案。
快筛桶结果:
| 快筛桶 | 数量 | 当前理解 |
|---|---|---|
| 快速排除 | 149 | 不再花慢工具 / 付费工具;保留 master.md 和原因 |
| 先补身份 | 12 | 先确认官网、Place、电话地址是不是同一家公司 |
| 无网站候选 | 4 | 直接符合“没官网但口碑强,可做 starter 页面”的主目标 |
| 有网站问题候选 | 14 | 有官网且快筛看到明显重做机会 |
| 轻触达 | 58 | 有一点机会,但不默认继续花资源 |
| 太好或太复杂 | 0 | 当前本地资料里没有被页面规模挡住的样本 |
| 值得深挖 | 10 | 已有明确业务基础或已到 ready-to-build |
资源投入结果:
| 资源阶段 | 数量 | 下一步 |
|---|---|---|
| 停止投入 | 149 | 不跑 Docker / Places / Playwright / Firecrawl |
| 轻触达 | 39 | 保留证据,走轻量销售,不加重研究 |
| 先补身份 | 17 | 搜索确认同一家公司,候选来源不能给 Design |
| 允许详细审计 | 16 | 先跑本地 Playwright / detailed audit,不先用 Firecrawl |
| 看缺口补强 | 16 | 只在确实缺 reviews / Places / 图片时补;不是“必须花钱” |
| 无网站资料补强 | 4 | Docker reviews、Places Details、图片候选、服务/地区补全 |
| 准备 Design 资料包 | 3 | 从 master.md 抽已核实事实、真实评价、截图和图片候选 |
| 少量人工复核 | 2 | 信号冲突,先看 master.md 缺口和风险 |
| 花资源前复核 | 1 | 工具有可跑项,但业务阶段不够清楚 |
这说明当前筛选线已经能先排掉大部分低价值线索,再把资源集中到 4 个无网站强候选、14 个有网站问题候选、以及少量已 ready 的客户上。
这些先作为默认规则执行,后面如果真实样本证明误伤,再改阈值。
代码里的统一来源是 core/leads/screening-defaults.js。快筛、入口下一步、目标客户判断都从这里读。
| 问题 | 决定 | 说明 |
|---|---|---|
| 无网站强候选阈值 | rating ≥ 4.5、reviews ≥ 20、可联系、有 Place 身份 | 先作为硬规则;这是我们最想找的客户 |
| 低口碑排除 | rating < 3.0 且 reviews ≥ 5 直接快速排除 | 自动流程不留例外;只有你点名某客户时才人工覆盖 |
| 轻触达客户 | 默认不跑 Docker / Places / Firecrawl | 只保留已有证据,走批量轻外联 |
| 补强阶段名字 | 用“看缺口补强” | 避免误解成“高价值就立刻花钱” |
| 社交 / 登录来源 | Facebook 第一,Instagram 第二,LinkedIn 第三 | Facebook/Instagram 更常给真实照片、服务、营业痕迹;LinkedIn 多用于销售背景 |
| 页面规模 | 前端导航页 > 20 才挡;sitemap > 500 安全挡 | 保持当前单页产品边界 |
| Discord 旧 404 | 单独开清理,不挡筛选主线 | 本地资料是干净的;远端旧 thread/card 404 另做修复 |
页面规模是最容易混乱的标准之一。
当前正确理解:
| 情况 | 当前处理 |
|---|---|
| 前端导航页 ≤ 20 | 可继续 |
| 前端导航页 > 20 | 归档 / 超出标准产品 |
| 没拿到导航页 | 用 sitemap 内容页 fallback |
| sitemap 内容页 > 500 | 安全归档,通常太复杂 |
当前依据:core/audit/page-scale-gate.js。
重点:不再把 sitemap 噪音当成真实页面规模。真正看用户前端能点到多少页面。
我们适合解决:
| 问题 | 为什么适合 |
|---|---|
| 没网站 | 单页站直接补空白 |
| 网站视觉旧 | 模板和素材能明显改善 |
| 手机端差 | 单页响应式能解决 |
| CTA 不清楚 | 结构和文案能解决 |
| 服务讲不清 | 建站资料包能整理 |
| 信任证据没展示 | 评价、评分、照片、资质能补 |
| 表单 / 电话不明显 | 单页转化结构能补 |
我们不适合解决:
| 问题 | 为什么不适合 |
|---|---|
| 大型多页迁移 | 当前产品不是迁站项目 |
| 电商 / checkout | 牵涉交易系统 |
| 客户 portal / dashboard | 牵涉软件系统 |
| 大量 blog / 内容迁移 | 超出标准单页 |
| 复杂 booking / CRM | 风险高,重建会破坏现有业务 |
| 口碑差 / 服务差 | 网站不是根因 |
下一步要把所有筛选信号归成 4 类:
| 类别 | 说明 | 示例 |
|---|---|---|
| 直接挡 | 命中就归档 | 行业不对、已关店、页面太复杂 |
| 只观察 | 记录风险,不单独踢 | 牌照风险、外部资料冲突 |
| 加权参考 | 改变优先级 | 评分、评价数、PageSpeed、图片数 |
| 人工判断 | 系统不能自动决定 | 同名公司、资料冲突、复杂边界案例 |
最终目标:Matthew 一看就知道某个客户为什么留下、为什么被踢、为什么只是暂缓。
筛选标准还要配合成本分层一起看。
原则是:免费、快、低风险的工具先跑;只有客户看起来值得,才跑耗资源审计或付费 API。
成本分层详见:
docs/v3/COST-LAYERED-SCREENING-CN.md2026-06-03 · 第一版。目的:把“先用免费快工具筛,再决定是否进入耗资源审计 / 付费 API”这件事讲清楚。
筛选客户不能一上来就跑全套深度审计。正确顺序应该是:
免费 / 秒级 → 免费 / 几秒到几十秒 → 免费但慢一点 → 付费 API / 视觉 / 深度审计 → 建站资料整理
每往下一层,成本和时间都更高,所以必须先问:
这一层拿到的信息,能不能帮我们判断“他是不是我们的目标客户”?
从现在开始,顺序要改成:
所有便宜 / 快速 / 不花钱的工具 → 先集中扫一遍 → 能排除的先排除 → 只把留下来的潜力客户交给慢工具 / 付费工具
对应命令:
npm run pl:frontloaded-screening-plan -- --markdown
第一轮清资源现在只用这些;搜索归属判断也已接到无官网 / 身份不稳的第一步:
| 顺序 | 工具 | 主要作用 |
|---|---|---|
| 1 | lead 原始字段 | 排除非 roofer、假数据、已归档、完全无法识别 |
| 2 | Google Maps / GBP 自带字段 | 用评分、评价数、类目、官网状态判断业务基础 |
| 3 | roofer 行业相关判断 | 排除非目标行业、供应商、平台、同行 |
| 4 | 三层排除预检 | 抓首页 / PageSpeed 前先挡明显不合格 |
| 5 | 官网类型判断 | 防止把社媒、目录页、报价平台误当官网 |
| 6 | Tinyfish / direct fetch 首页 | 免费读首页,判断官网是否可用、是否像同一家公司 |
| 7 | 首页基础质量快扫 | 看 HTTPS、手机 viewport、CTA、电话、内容薄、陈旧年份 |
| 8 | 页面规模 / 产品适配 | 导航页太多、业务太复杂,直接挡掉 |
| 9 | PageSpeed / Lighthouse 免费额度 | 只做重做价值证据,不当硬否决 |
| 10 | license 本地库观察 | 查牌照风险,但身份没确认前不自动踢 |
| 11 | ABN / WHOIS / Wayback | 查公司身份、域名年龄、是否刚重做 |
| 12 | 搜索结果 title/snippet + AI 同一公司判断 | 没官网 / 身份不稳时先确认同一家公司 |
| 13 | master.md 覆盖检查 | 防止重复跑工具,判断资料缺口 |
第一轮不跑这些:
Docker reviews Playwright full fetch / detailed audit Places Details Places photos Firecrawl 视觉 LLM
这些只给通过前置快筛、仍然有潜力的客户用。
快筛结果分桶命令:
npm run pl:frontloaded-screening-rules -- --sample --markdown
这条规则把快工具结果统一变成 7 个桶:快速排除、先补身份、无网站候选、有网站问题候选、轻触达、太好或太复杂、值得深挖。后面的资源投入只看这些桶,不直接按工具顺序硬跑。
| 层级 | 什么时候跑 | 成本 / 速度 | 主要工具 | 作用 |
|---|---|---|---|---|
| L0 | 刚拿到线索 | 免费 / 秒级 | Maps scrape 原始字段、entity 已有字段 | 排除假数据、行业不对、没联系方式 |
| L1 | L0 没排除 | 免费 / 秒级 | GBP 字段、review_count、rating、category、websiteStatus | 判断业务基础和大概价值 |
| L2 | 有官网时 | 免费 / 几秒 | Tinyfish / direct-fetch 首页 | 看官网是否薄、旧、没 CTA、没电话 |
| L3 | 有官网首页 HTML 后 | 免费 / 秒级 | 页面规模、viewport、基础 HTML 检查 | 判断是否一个单页产品能解决 |
| L4 | L2/L3 值得继续 | 免费 / 20-30 秒 | PageSpeed / Lighthouse 免费额度 | 判断性能问题是否能变成销售证据 |
| L5 | 身份基本可信后 | 免费 / 本地或公共 API | 牌照库、ABN、WHOIS/RDAP、Wayback | 查风险、查历史、补信任事实 |
| L6 | 值得继续的客户 | 免费但慢 / 30-60 秒 | Docker reviews、Playwright 简审 | 补评价、截图、表单、手机端证据 |
| L7 | 通过前面筛选 | 付费 / 慢 | Places Details、Places photos、Firecrawl、视觉 LLM | 深挖资料,做 master.md 和销售证据 |
目的 先踢掉明显不值得看的。
看什么
| 信号 | 怎么处理 |
|---|---|
| 没公司名、没电话、没网站 | 直接排除或先补资料 |
| 已关店 | 排除 |
| 测试名 / demo 名 | 排除 |
| 行业不匹配 | 排除 |
| 政府 / 学校 / charity / 同行 | 排除 |
现有依据
core/leads/exclusion-filter.jscore/leads/fast-filter.js业务解释
这一层不解决“好不好”,只解决“是不是明显不该继续”。
目的 判断这个客户有没有基本业务价值。
看什么
| 信号 | 用途 |
|---|---|
| 电话 | 能不能联系,没网站客户尤其重要 |
| 地址 | 判断真实业务和服务地区 |
| rating | 业务口碑 |
| review_count | 业务规模和可信度 |
| category | 是否目标行业 |
| websiteStatus | 分成没网站 / 有网站两条路径 |
| image_count | 是否有素材基础 |
现有依据
core/scoring/cheap-audit-config.jsoncore/scoring/cheap-audit-v2.js怎么用
| 情况 | 下一步 |
|---|---|
| 没网站 + 有电话 / 地址 + GBP 信号还行 | 进入“没网站路径”继续补资料 |
| 有网站 + 口碑不错 | 进入官网快扫 |
| 评价极少 / 评分差 | 降低优先级或归档 |
| 类目不对 | 归档 |
目的 有网站的客户,先只看首页,不跑全站。
看什么
| 信号 | 为什么有用 |
|---|---|
| 没 HTTPS | 明显信任问题 |
| 首页文字很薄 | 可能是空壳站 / 模板站 |
| 没本地城市 / suburb | local SEO 和信任弱 |
| 电话不在首屏 | 转化问题 |
| 没 CTA | 客户不知道下一步 |
| 年份过旧 | 维护差 |
| 没 Services/About/Contact/Reviews/FAQ | 结构薄 |
| 没 mobile viewport | 手机端可能坏 |
| 表格布局 / 低质量图片 | 老旧信号 |
现有依据
core/scoring/cheap-audit-config.jsoncore/scoring/site-quick-scan.jscore/leads/fast-filter.js业务解释
这一层是“有网站客户”的关键初筛:不需要完整 audit,只要首页已经暴露明显转化问题,就值得继续。
目的 判断这个客户是不是一个标准单页网站能服务的。
当前标准
| 信号 | 处理 |
|---|---|
| 前端导航页 ≤ 20 | 可以继续 |
| 前端导航页 > 20 | 归档 / 超出产品包 |
| 没有导航页数据 | 用 sitemap 内容页 fallback |
| sitemap 内容页 > 500 | 安全归档 |
现有依据
core/audit/page-scale-gate.js业务解释
这一步不是看客户有没有价值,而是看我们能不能交付。 如果他的网站太复杂,一个单页产品解决不了,就不是当前目标客户。
目的 性能问题是很好的销售证据,但不应该作为单独否决门。
看什么
| 信号 | 用途 |
|---|---|
| mobile performance | 慢说明重做价值更强 |
| LCP / FCP / CLS / INP | 变成客户能理解的“打开慢 / 跳动 / 不稳定”证据 |
| HTTPS / basic perf | 辅助判断老站问题 |
当前处理
现有依据
core/audit/pagespeed-insights.jscore/leads/fast-filter.jsdocs/v3/MILESTONES-CN.md目的 补信任事实,同时发现风险。
工具
| 工具 | 成本 | 用途 |
|---|---|---|
| license SQLite | 免费本地 | 查牌照候选 / 已确认牌照 |
| ABN / ABR | 免费公共 API | 工商登记 |
| WHOIS/RDAP | 免费公共 API | 域名年龄 |
| Wayback | 免费公共 API | 是否刚重做、历史状态 |
怎么用
| 信号 | 处理 |
|---|---|
| 确认牌照 / ABN | 可以进入建站事实 |
| 候选牌照但没确认同一家公司 | 只观察 |
| 牌照过期 / 吊销 | 只观察或人工判断 |
| 近 12 个月刚重做 | 可能归档,销售时机不对 |
| 域名很旧、站很旧 | 增加重做理由 |
重点
牌照不能乱写。必须先确认是同一家公司,才能进建站事实。
目的 对 L0-L5 里看起来值得的客户,补更强证据。
工具
| 工具 | 成本 / 时间 | 用途 |
|---|---|---|
| Docker Google reviews | 免费 / 30-60 秒 | 拉更多评价,比 Places 5 条更丰富 |
| Playwright | 免费 / 30-60 秒 | 截图、表单、移动端、真实页面体验 |
| 本地 LLM / Ollama | 免费 / 慢 | 评价总结、视觉初判、身份辅助 |
什么时候跑
只给通过前面免费快筛的客户跑,不给每条线索默认跑。
| 工具 | 允许触发 | 不触发 | 写回位置 | 能不能给 Design 用 |
|---|---|---|---|---|
| Docker reviews | A/B 候选、高评价没网站客户、销售需要真实评价主题时 | L0-L5 已经排除、评分/评价太薄、同一客户还没确认 | master.md 的评价 / 口碑 / 销售资料区 | 真实评价可用;AI 总结只做销售参考 |
| Playwright 详细抓站 | 有官网并且快筛活下来,或需要截图 / 表单 / 手机端证据 | 页面规模已超、官网明显不是客户官网、无网站 starter 路径 | detailed-audit fixture、audit report、master.md 旧站问题区 | 截图和表单事实可用;问题解读给销售 / 设计参考 |
| 本地 LLM / Ollama | 评价总结、视觉初判、同一客户辅助判断 | 没有原始资料时不能编事实 | 观察区 / 销售资料区 | 不能单独当事实来源 |
代码核对:
core/reviews/fetch-reviews-local.js:4-10:Docker reviews 免费但慢,适合高价值客户,能拉比 Places 更多评价。core/audit/site-fetch-full.js:4-10:Playwright 本地免费但慢,产出 raw HTML、手机端 HTML、性能、截图。scripts/leads/build-internal-report.js:112-121:--with-reviews 已按最终 A/B 限制,不给 C/D 默认跑。目的 只对值得继续的客户花钱或花大时间。
工具
| 工具 | 成本 | 什么时候用 |
|---|---|---|
| Google Places Details | 付费,约 $0.017 / 次 | 需要官方电话、地址、营业时间、少量评价 |
| Places photos | 付费 | 确定要建站 / 需要素材时 |
| Firecrawl | 付费兜底 | 免费抓取失败且客户值得 |
| 视觉 LLM | 订阅 / 慢 | 已过筛,需要视觉审计或页面质量判断 |
| 完整 detailed audit | 时间更长 | 通过便宜筛选后 |
原则
这层不是用来“找客户”的,而是用来“确认和丰富已经值得看的客户”。
| 工具 | 允许触发 | 不触发 | 写回位置 | 能不能给 Design 用 |
|---|---|---|---|---|
| Places Details | 需要官方电话 / 营业时间 / types / photo refs,且客户已是 B+ 或人工指定 | 只是为了初筛、同一客户没确认、已有足够官方事实 | entity.latest.places_enrichment → master.md 核心事实 / 素材候选 | 官方字段可用 |
| Places reviews | Docker 不可用,或只需要官方少量评价补充 | 每条 lead 默认跑、C/D 客户、没有 place_id | review fixture → master.md 评价区 | 原文评价可用;只限真实返回内容 |
| Places photos | 确定值得建站、需要真实图片素材时 | 还没过筛、图片只为初筛 | 图片素材候选区 | 需质量筛选后可用 |
| Firecrawl | 免费 direct-fetch / Tinyfish 拿不到足够页面,且客户已经值得继续 | 默认抓站、初筛找客户、低价值客户 | multi-page crawl 结果,标记来源 | 只用抓到的原始页面事实 |
| 视觉 LLM | 已有截图并需要判断视觉老旧 / 信任感 / 转化问题 | 没截图、同一客户没确认 | 视觉审计 / 销售证据 | 作为设计方向,不当事实 |
代码核对:
scripts/cli/pl-places-enrich.js:5-9:Places enrich 是手动或 grade ≥ B 触发,并且有月额度保护。core/reviews/fetch-reviews.js:4-7:Places reviews 是付费少量评价,不是深度评价挖掘。core/audit/multi-page-crawl.js:344-349:多页 crawl 默认免费优先,Firecrawl 只有显式兜底才跑。core/audit/multi-page-crawl.js:383-387:实际执行时先 direct fetch;失败且 FIRECRAWL_LASTRESORT=1 才用 Firecrawl。1. Maps / Places / 手动入口拿到初始客户 2. L0 基础排除 3. L1 GBP / 地图初筛 4. 分叉: A. 没网站:免费搜索 + 身份确认 + 资料够不够 B. 有网站:Tinyfish 首页快扫 + 页面规模 5. L4 PageSpeed 作为重做价值证据 6. L5 牌照 / ABN / 域名历史补风险和信任事实 7. 如果仍值得:Playwright 详细抓站 / 截图 / 表单 / 手机端证据 8. 如果最终看起来是 A/B 或人工指定:Docker reviews / Places Details / GBP extras 9. 如果确定要建站或免费抓取不足:Places photos / Firecrawl 兜底 / 视觉 LLM 10. 生成 master.md 11. 再判断资料够不够给 Design / 建站
这份分层回答的是:先跑哪个工具,后跑哪个工具。
SCREENING-STANDARDS-CN.md 回答的是:拿到信号后怎么决定。
两者合起来才完整:
| 问题 | 看哪份 |
|---|---|
| 先用哪个工具查 | COST-LAYERED-SCREENING-CN.md |
| 查出来后怎么判断 | SCREENING-STANDARDS-CN.md |
| 这一步在总流程哪里 | FLOW-END-TO-END-CN.md |
这次核对后,可以先锁住以下现状:
| 层级 | 状态 | 代码证据 | 结论 |
|---|---|---|---|
| 快筛 10 道便宜关卡 | 已接上 | core/leads/fast-filter.js:17 | SSOT 页面“快速筛选漏斗”直接从这份代码生成 |
| 昂贵分界线 | 已接上 | core/leads/fast-filter.js:40 | 过了 10 道便宜关卡,才进入详细审计 |
| 牌照风险 | 已接上但只观察 | core/leads/cheap-audit-queue.js:147 | 牌照过期 / 吊销不自动踢,避免同名误伤 |
| Tinyfish 首页抓取 | 已接上 | core/leads/cheap-audit-queue.js:163 | 有网站、行业相关、没被预排除时才抓 |
| 页面规模门 | 已接上,会提前归档 | core/leads/cheap-audit-queue.js:182 | 前端导航页太多会直接停,省掉详细审计 |
| PageSpeed | 已接上,只加证据 | core/leads/cheap-audit-queue.js:217 | 慢是重做理由,不是淘汰理由 |
| 三层排除 | 已接上 | core/leads/cheap-audit-queue.js:239 | 先排除明显不是客户,再谈分数 |
| 幸存者进详细审计 | 已接上 | core/leads/cheap-audit-queue.js:248 | 快筛活下来的统一 predict=C、audit_now=true |
| 无网站资格检查 | 已分流 | scripts/cli/pl-check-qualification.js:62 | 无网站客户不走有网站 qualification,走 starter 路径 |
| 资格复核省钱门 | 已接上 | scripts/cli/pl-check-qualification.js:74 | 能用便宜信号判断失败时,跳过贵的 brief |
命令:
npm run pl:frontloaded-screening-doctor -- --markdown
当前结论:
| 工具组 | 第一轮状态 | 处理 |
|---|---|---|
| 原始字段 / GBP / roofer 判断 / 三层排除 / 官网类型 | 已第一轮使用 | 继续保留在最前面 |
| Tinyfish 首页 / 首页快扫 / 页面规模 / PageSpeed | 已第一轮使用 | 有独立官网且没被预排除时先跑,页面太多可以提前停 |
| license 本地库 | 只观察但已跑 | 记录风险,不自动踢,避免同名误伤 |
master.md 覆盖检查 | 已第一轮使用 | 进入慢工具前先看缺什么,避免重复跑 |
| ABN / WHOIS / Wayback | 已第一轮使用 | 在 Tinyfish / PageSpeed / 详细审计前补身份和域名时机判断 |
| 搜索结果同一公司判断 | 已第一轮使用 | 只写候选来源 sidecar,不写正式事实;社媒默认等登录读取 |
因此,现在真实说法是:13 个快工具都已经进入第一轮或明确观察使用;目前 12 个完整前置,1 个已跑但只观察。
| 旧说法 | 现在以这个为准 |
|---|---|
| “predict A/B 才进详细审计” | 错。现在是快筛幸存者统一 predict=C,并且 audit_now=true,详细审计后再给真正 A/B/C/D。 |
| “牌照过期 / 吊销直接踢掉” | 错。现在只观察;只有身份确认后才记录风险,仍不自动归档。 |
| “cheap audit 分数直接决定是否进审计” | 不准确。分数解释重做机会和排序;真正挡住的是排除规则、页面规模门、后续资格硬门。 |
命令:
npm run pl:l6-l7-trigger-replay -- --markdown
这次是 report-only:只读本地 entity / fixture,不联网、不调用 Docker、不调用 Places、不发 Discord。
| 客户 | 当前状态 | 为什么选它 |
|---|---|---|
| iFix Roofing | ready-to-build · B · 86 reviews | B/ready,高口碑,应该触发后置补强 |
| A & J Roofing Solutions | outreach-active · C · 有官网 | C 客户,应该证明不会默认花钱 |
| Ultra Roof Restorations | queued_for_audit · 无网站 · 93 reviews | 没网站但口碑强,应该走无网站补资料 |
| Brisbane Roofing Solutions | archived · D · 118 reviews | 高评价但已归档,应该停止所有慢/付费工具 |
| Vicwest Roofing | outreach-active · C · 已有 Places + reviews | 已有资料,应该避免重复跑 |
| 工具 | run | already_done | fallback_only | after_places_details | hold | skip |
|---|---|---|---|---|---|---|
| Playwright 详细抓站 | 0 | 3 | 0 | 0 | 0 | 2 |
| Docker reviews | 2 | 1 | 0 | 0 | 0 | 2 |
| Places Details | 2 | 1 | 0 | 0 | 0 | 2 |
| Places reviews | 0 | 1 | 2 | 0 | 0 | 2 |
| Places photos | 0 | 0 | 0 | 2 | 1 | 2 |
| Firecrawl | 0 | 0 | 0 | 0 | 3 | 2 |
master.md 有足够事实和评价素材。本段已把 L6/L7 触发条件锁成表,并完成 5 个 roofer 样本回放。
2026-06-03 追加完成:
pl:resource-plan-replay,把“目标客户类型”和“资源投入阶段”合并成一张业务判断表。master.md 的“筛选与去向记录”已经写入 resource_band、现在可跑、暂缓 / 兜底、明确不跑。2026-06-04 追加完成:
pl:frontloaded-screening-rules -- --all-roofers --markdown 可以对本地全部 roofer 线索做只读快筛回放。pl:resource-plan-replay -- --all-roofers --markdown 可以对同一批 roofer 线索做只读资源投入回放。pl:master-md-coverage 通过,249/249 都有 master.md、筛选记录和下一步行动。全 roofer 快筛结果:
| 快筛桶 | 数量 | 资源含义 |
|---|---|---|
| 快速排除 | 149 | 第一轮就停止,不跑慢工具和付费工具 |
| 先补身份 | 12 | 只做身份确认,不进 Design |
| 无网站候选 | 4 | 进入无网站资料补强 |
| 有网站问题候选 | 14 | 可进入详细审计或后置补强 |
| 轻触达 | 58 | 保留证据,不默认继续花资源 |
| 太好或太复杂 | 0 | 当前没有命中 |
| 值得深挖 | 10 | 才允许后续慢工具 / 付费工具 |
全 roofer 资源投入结果:
| 资源阶段 | 数量 | 默认动作 |
|---|---|---|
| stop | 149 | 停止投入 |
| light_touch | 39 | 轻触达,不默认加重研究 |
| identity_first | 17 | 搜索确认同一家公司 |
| deep_audit_allowed | 16 | 免费本地详细审计优先 |
| slow_free_then_paid | 16 | 看缺口补强;不等于自动花钱 |
| no_website_materials | 4 | reviews / Places / 图片候选补齐 |
| design_ready | 3 | 抽 Design / 销售资料包 |
| manual_review | 2 | 人看 master.md 风险 |
| operator_review_before_spend | 1 | 花资源前复核 |
这组数字说明成本分层已经有实际效果:先用 L0-L5 便宜工具把 149 条停掉,再把 Docker / Playwright / Places / Firecrawl 限制在少数有把握的客户上。
下一步要做的是:
master.md / starter 素材区。slow_free_then_paid 的内部 id 暂时保留,中文统一叫“看缺口补强”,避免误以为所有这类客户都要立刻花钱。代码里的统一来源是 core/leads/screening-defaults.js。改阈值先改这里,再跑全 roofer 回放。
| 问题 | 决定 |
|---|---|
| 无网站强候选 | rating ≥ 4.5、reviews ≥ 20、可联系、有 Place 身份,先作为硬规则 |
| 低口碑客户 | rating < 3.0 且 reviews ≥ 5,自动快速排除;人工点名才例外 |
| 轻触达客户 | 不默认跑 Docker / Places / Firecrawl,只走轻量销售 |
| 补强阶段 | 中文统一叫“看缺口补强”;先看 master.md 缺什么再决定是否跑工具 |
| 登录来源优先级 | Facebook → Instagram → LinkedIn |
| 页面规模 | 继续用前端导航页 > 20 挡,sitemap > 500 安全挡 |
| Discord 旧 404 | 单独开清理,不挡筛选主线 |
2026-06-03 · 目标 1 产物。 核心原则:任何 lead 进入系统后,都应该有master.md;后续筛选、audit、销售、Design / 建站资料,都从master.md这份总档案抽。
master.md 是 lead 的总档案,不是建站后才有的文件。
所以所有资料都要回答 5 个问题:
master.md 哪一块?| 等级 | 含义 | 能不能上客户网站 |
|---|---|---|
| 核心事实 | 已核实的名字、电话、地址、服务、牌照、ABN、评价等 | 可以 |
| 建站素材 | 可用于页面结构、服务说明、图片、FAQ、信任块 | 只用已核实部分 |
| 销售资料 | 用来写销售报告、外联话术、客户痛点 | 不一定 |
| 风险观察 | 牌照风险、资料冲突、身份不确定、页面复杂度 | 不直接上网站 |
| 缺口记录 | 缺电话、缺地址、缺官网、资料太薄 | 不上网站 |
| 资料来源 | 工具 / 位置 | 成本 | 什么时候跑 | 写进 master.md | 后续用途 |
|---|---|---|---|---|---|
| Maps / gosom 原始线索 | pl:scrape-docker | 免费 | lead 入口 | 公司基础资料、来源、评分、评价数、官网 | 初筛、销售背景 |
| Google Places | pl:places-search-intake / Places API | 付费 | 需要官方资料或补缺时 | 名字、电话、地址、营业时间、少量评价、照片引用 | 身份确认、事实补强 |
| 单客户补录 | pl:single-enrich | 视来源 | Matthew 给具体客户时 | 公司基础资料、补录来源 | 人工入口统一进档 |
| 路线判断 | lead-route-decision.js | 免费 | 每次生成 master.md | entry_route、search_timing、next_step | 让运营知道搜索该早做还是后置、下一步该去哪 |
| 牌照库 | pl:license-lookup / SQLite | 免费 | 身份基本可信后 | 牌照状态、候选、确认程度 | 风险观察;确认后可做信任事实 |
| ABN / ABR | 公共 API | 免费 | 需要工商事实时 | ABN、注册实体、状态 | 核心事实或风险观察 |
| Tinyfish / direct-fetch 首页 | tinyfishFetchUrls / direct fetch | 免费 | 有官网时的早期快筛 | 首页问题、电话/CTA/本地词、结构薄厚 | 筛选、销售痛点 |
| PageSpeed / Lighthouse | pagespeed-insights.js | 免费额度 | 首页快筛后,值得继续时 | 性能分、LCP/FCP/CLS/INP | 销售证据,不单独挡客户 |
| 页面规模 | page-scale-gate.js | 免费 | 有官网 HTML 后 | 前端导航页数、是否超产品包 | 判断能不能用单页服务 |
| WHOIS / RDAP | domain-history.js | 免费 | 有官网时 | 域名年龄、注册历史 | 销售证据、风险观察 |
| Wayback | domain-history.js | 免费 | 有官网时 | 是否刚重做、历史状态 | 销售时机判断 |
| Docker reviews | pl:docker-reviews-enrich / fetch-reviews-local.js | 免费但慢 | 高价值客户 / A/B 候选 | 评价样本、口碑主题、可引用评价 | 销售、信任块;不自动退到 Places reviews |
| Places reviews | fetch-reviews.js | 付费 | Docker 不可用或需要官方补充 | Google 返回的少量评价 | 信任证据 |
| 官网多页 crawl | multi-page-crawl.js | 免费优先,Firecrawl 兜底付费 | 通过快筛后 | 服务、关于、联系、图片、表单、结构化数据 | master.md、建站素材 |
| 外部搜索 / 提及 | Tinyfish / DDG / mine-background | 免费 | 身份确认后 | 外部背景资料,单独标来源 | 销售参考,不直接当事实 |
| 社媒 / OpenCLI | OpenCLI | 免费但默认后置 | 需要背景时 | 社媒活动、外部状态 | 参考 / 销售,不默认跑 |
| 图片 / Places photos | Places photos / 本地分类 | 付费或已有素材 | 确定值得建站时 | 图片候选、分类理由 | 建站素材,需质量筛选 |
| 视觉审计 | Vision LLM / Ollama fallback | 订阅或本地 | 通过快筛后 | 视觉年龄、信任感、转化问题 | 销售证据、设计方向 |
| 表单 / 手机端 / 截图 | Playwright | 免费但慢 | 值得继续时 | 截图、表单问题、手机端问题 | audit report、销售证据 |
这一段专门锁定“慢工具 / 付费工具”怎么进入 master.md,避免它们重新变成默认初筛。
| 来源 | 触发条件 | 写进 master.md 哪里 | Design / 建站能不能用 |
|---|---|---|---|
| Docker reviews | A/B 候选、高价值没网站客户、销售需要评价主题 | 评价样本、口碑主题、销售切入点 | 真实评价原文可用;AI 总结不能当事实 |
| Places reviews | Docker 不可用或需要官方少量评价补充 | 官方评价样本、评分 / 数量核对 | 真实评价原文可用;只限 Google 返回内容 |
| Playwright 截图 / 表单 / 手机端 | 有官网并通过快筛 | 旧站问题、截图证据、表单问题、手机体验 | 截图事实可用;问题解释给销售 / 设计参考 |
| Places Details | B+、人工指定、需要官方电话 / 营业时间 / types / photo refs | 核心事实、营业时间、电话、素材候选 | 官方字段可用 |
| Places photos | 确定值得建站,且需要真实图片素材 | 图片候选、来源、筛选状态 | 质量筛选后可用 |
| Firecrawl | 免费抓取失败,且客户值得继续 | 多页抓取结果,明确标 Firecrawl 来源 | 只用抓到的页面事实 |
| 视觉 LLM | 有截图后判断旧站视觉问题 | 视觉审计、销售证据、设计方向 | 方向可参考,不能编事实 |
代码来源:
core/reviews/fetch-reviews-local.js:4:Docker reviews 免费但慢,适合高价值客户。core/reviews/fetch-reviews.js:4:Places reviews 付费,只返回少量评价。core/audit/site-fetch-full.js:4:Playwright 提供截图、手机端、表单、性能等证据。scripts/cli/pl-places-enrich.js:5:Places Details 手动或 grade ≥ B 后触发。core/audit/multi-page-crawl.js:344:Firecrawl 不是默认入口,是免费抓取失败后的显式兜底。总边界
master.md 可以记录所有来源,但 Design / 建站资料包只能抽已核实事实、真实评价、真实图片、官网原文和明确来源的截图证据。搜索候选、AI 判断、风险观察、未确认社媒内容不能直接抽给 Design。
没网站的 lead 也必须有 master.md。
website = null 或第三方页面状态。| 补什么 | 工具 | 写入方式 |
|---|---|---|
| 官方身份 | Places / 搜索 / 电话 / 地址 | 核心事实或身份观察 |
| 服务范围 | GBP 类目、评价、外部资料 | 建站素材候选 |
| 口碑 | Docker reviews / Places reviews | 销售资料和信任素材 |
| 图片 | GBP / Places photos | 建站素材候选 |
| 牌照 / ABN | license / ABR | 风险观察或核心事实 |
没网站客户不是自动通过。要看:
有网站的 lead 也必须有 master.md。
| 补什么 | 工具 | 写入方式 |
|---|---|---|
| 首页薄 / 没 CTA / 没电话 | Tinyfish / direct fetch | 销售痛点 |
| 性能慢 | PageSpeed | 销售证据 |
| 页面太多 | page-scale | 产品适配判断 |
| 表单 / 手机端问题 | Playwright | audit 证据 |
| 视觉旧 | Vision LLM | 设计方向 / 销售证据 |
| 服务 / 关于 / 联系 / 图片 | multi-page crawl | 建站素材候选 |
有网站客户不是自动适合。要看:
每个 master.md 应该逐步形成这些块:
| 块 | 内容 |
|---|---|
| 入口与来源 | 从哪里发现、搜索词、批次、人工输入 |
| 公司身份 | 名字、电话、地址、官网、place_id、身份确认状态 |
| 筛选与去向记录 | entry_route、search_timing、next_step,说明这条 lead 在哪条路上 |
| 免费初筛 | GBP、评价数、评分、类目、是否有网站、直接排除项 |
| 成本分层结果 | L0-L7 哪些跑了、哪些没跑、为什么 |
| 筛选判断 | 直接挡 / 只观察 / 加权参考 / 人工判断 |
| 旧站问题 | 有网站时写首页、速度、手机端、CTA、页面规模 |
| 没网站资料缺口 | 没网站时写缺哪些事实、需要怎么补 |
| 采集资料 | 官网、GBP、评价、牌照、ABN、域名、外部背景 |
| 销售切入点 | 为什么客户会在意、我们能解决什么 |
| 建站素材 | 服务、地区、评价、图片、FAQ、信任证据 |
| 决策记录 | A/B/C/D、ready-to-build、归档或下一步 |
可以抽:
不能直接抽:
这份表是目标状态。下一阶段需要核对真实代码是否已经做到:
master.md。master.md。master.md。master.md。master.md 结构。master.md 抽,而不是另起资料源。master.md 和已核实事实抽。第一目标不是先改代码,而是先锁住主线:
lead 进入系统 → master.md 骨架 → 每个筛选 / 采集 / audit 结果写回 master.md → 销售、audit report、Design / 建站资料包都从 master.md 抽
这条线锁住后,再看哪些脚本没写回、哪些文档还在绕开 master.md。
2026-06-03 · 来自 roofer 搜索身份观察 20 个唯一客户汇总 2026-06-03T10-15-20-757Z-combined-20。用途是给 Matthew 准备账号和 OpenCLI 登录态,不是正式客户事实。
登录受限来源主要是社媒:
| 来源网站 | 链接数 | 涉及客户数 | 账号准备 |
|---|---|---|---|
| 38 | 12 | 优先准备 | |
| 14 | 5 | 优先准备 | |
| 9 | 5 | 优先准备 |
说明:
facebook.com、id-id.facebook.com、ms-my.facebook.com 可以先按同一个 Facebook 登录态处理。linkedin.com、au.linkedin.com、ca.linkedin.com、id.linkedin.com 可以先按同一个 LinkedIn 登录态处理。2026-06-03 已做只读 smoke test:
| 项目 | 结果 |
|---|---|
| OpenCLI | 1.8.1 |
| Daemon | 已连接 |
| Browser Bridge | 已连接,当前 profile z3wvy2xe |
| 读取开关 | ENABLE_OPENCLI_FETCH=1 后可读 |
| LinkedIn smoke test | https://www.linkedin.com/company/linkedin 读取成功,返回 13,751 字符 |
| 备用恢复命令 | npm run pl:opencli-recover -- --profile z3wvy2xe --smoke-url <url> |
备用方案:
opencliFetch 只读读取 Facebook / Instagram / LinkedIn。pl:opencli-recover 自动检查 OpenCLI,必要时重启 daemon,并打开独立 Chrome profile /Users/matthew/.opencli/chrome-leads 加载 /Users/matthew/opencli-extension/v1.0.17。login_required 清单,不阻塞 lead 主流程,也不把标题/摘要当事实。core-extract;必须 live smoke 通过,再由 pl:mine-background --write 写入外部资料区。真实 roofer 样本也已跑过一次:
| 样本 | 命令 | 结果 |
|---|---|---|
| A & J Roofing Solutions | pl:observe-search-identity --opencli | 16 个搜索链接;OpenCLI 读完后 login_required=0、fetch_failed=0 |
这次真实样本里,社交来源读完后的归属结果:
| 结果 | 数量 | 说明 |
|---|---|---|
| AI 高信心同一客户 | 1 | Facebook 主页读到正文后,有 owned_domain 证据 |
| 可能同一客户 | 3 | Facebook 照片页、Facebook reviews、LinkedIn 个人页,证据不够强 |
| 明确不同 | 3 | Instagram 帖子读完后判断不是这个客户 |
| 需要登录后判断 | 0 | 本次样本登录待读清零 |
| 读取失败 | 0 | 本次样本没有 OpenCLI 读取失败 |
对应观察报告:
data/leads/search-result-identity-observe-runs/2026-06-03T10-44-38-396Z
2026-06-03 又补了两个含社交候选的真实 roofer 样本:A & J Roofing Solutions、Apex Roofing。
| 指标 | 数量 |
|---|---|
| 客户样本 | 2 |
| OpenCLI 已读社交链接 | 15 |
| AI 高信心同一客户 | 1 |
| 可能同一客户 | 6 |
| 明确不同 | 8 |
| 读取失败 | 0 |
| 仍需登录后判断 | 0 |
按来源网站拆开:
| 来源网站 | 已读 | AI 高信心同一 | 可能同一 | 明确不同 | 读取失败 | 仍需登录 |
|---|---|---|---|---|---|---|
| 6 | 0 | 2 | 4 | 0 | 0 | |
| 4 | 1 | 1 | 2 | 0 | 0 | |
| LinkedIn / 地区 LinkedIn | 3 | 0 | 1 | 2 | 0 | 0 |
| Facebook 地区域名 | 2 | 0 | 2 | 0 | 0 | 0 |
对应报告:
data/leads/search-result-identity-observe-runs/2026-06-03T10-49-26-073Z/opencli-source-stats.md data/leads/search-result-identity-observe-runs/2026-06-03T11-01-48-898Z/opencli-source-stats.md
阶段结论:
pl:mine-background --write 写入 6 个外部资料;重建 external-material.json 后,Design 只得到服务区和专长,奖项 / social proof 只给销售核实,iSwirl 服务和认证进入背景参考。pl:mine-background --write 写入 2 个外部资料;重建后 2 条都进入 Design 可参考素材。Instagram 这轮仍不够确定,未写入。external_facts。| 指标 | 数量 |
|---|---|
| 已完成客户 | 20 |
| 搜索链接 | 282 |
| AI 高信心同一客户 | 95 |
| 可能同一客户 | 5 |
| 明确不同公司 | 117 |
| 登录受限 | 65 |
| 抓取失败 | 0 |
| 来源网站 | 链接数 | 涉及客户数 | 建议 |
|---|---|---|---|
| facebook.com | 36 | 12 | 优先准备登录态 |
| instagram.com | 14 | 5 | 优先准备登录态 |
| au.linkedin.com | 6 | 4 | 优先准备登录态 |
| ca.linkedin.com | 1 | 1 | 优先准备登录态 |
| id-id.facebook.com | 1 | 1 | 优先准备登录态 |
| id.linkedin.com | 1 | 1 | 优先准备登录态 |
| linkedin.com | 1 | 1 | 优先准备登录态 |
| ms-my.facebook.com | 1 | 1 | 优先准备登录态 |
完整机器生成清单:
data/leads/search-result-identity-observe-runs/2026-06-03T10-15-20-757Z-combined-20/login-required-sources.md data/leads/search-result-identity-observe-runs/2026-06-03T10-15-20-757Z-combined-20/login-required-sources.json
先登录一个专用账号。当前样本里 Facebook 量最大,且很多 roofer 会把项目照片、评价、营业状态放在 Facebook。
第二优先。Instagram 常见内容是项目照片、短视频、施工动态,适合做背景资料和图片线索。
第三优先。LinkedIn 更常出现负责人、公司员工、职业背景;对 Design 正式事实帮助有限,但对销售背景调查有用。
login_required,还不能写入正式客户档案。z3wvy2xe 可以做读取验证,但长期不要把日常浏览 profile 当生产读取 profile。--opencli,观察 Facebook / Instagram / LinkedIn 的成功率和误判情况。这是唯一的建站流程(pl:compose-editorial 模板渲染 · 免费 · 可重复 · 不靠外部设计团队、不靠 OD)。 老路(OD 守护进程 / V2 拼装 / 整页 LLM 渲染 / families 模板)已全部封死(32 个废命令一跑就报错)。
| 步 | 工具 | 干什么 | 性质 |
|---|---|---|---|
| ① 深挖背景 | llm-extract-core | 融成 core-extract.json:锁定事实(ABN/牌照/电话/评分) + 丰富叙述(公司背景/团队/客户原话) | 大模型 · 事实的真源头 |
| ② 抽中间合同 | extract-site-ctx | → site-ctx.json(所有文案工具读它) | 零 LLM · 确定性 · 已稳 |
| ③ 写文案 | enrich-handoff | hero / 服务 / about / faq | 大模型 · 唯一弱环节(正在优化:直接吃①的背景写) |
| ④ 锁渲染合同 | build-single-page-brief | 把铁的事实再锁一遍,防文案写错 | 零 LLM · 确定性 |
| (桥) 打包同步 | assemble-handoff | 把文案同步到渲染要读的地方(有新鲜度闸防旧文案) | — |
| ⑤ 渲染网站 | compose-editorial | 套模板 + 填文案 → editorial-output/index.html(就是网站) | 模板+Mustache · $0 |
模板:2 个 canonical —— editorial-newsletter(均分91) / trade-classic(均分84),单页。
copy-audit(诚实门:造假/堆砌)· persona-copy-audit(买家视角分)· audit-v4(视觉+结构,5 个 P0)Matthew 的判断是对的:copy 不能主要等页面出来以后才审。很多文案、排版、信息边界的问题,建站前多花一点时间更值,后面 audit 再补会很浪费。
现在 copy 分三层:
写文案源头已经统一注入客户可见边界:services / about / hero 都明确告诉 AI 哪些能发挥、哪些不能编。之后 assemble-handoff 会清洗客户可见文案;site-build-doctor 的 copy_package 会在渲染前检查 services / about / hero / FAQ 有没有漏出内部提示。比如 “before publishing / draft copy / primary contact path / customer confirmation” 这类话,不能进客户页面。 no-website / starter 路径也已前置:starter-core-extract 生成的 FAQ / hero 种子必须是客户可见语言,不能再出现 “starter page / before publishing / operator / SEO coverage claims” 这种内部话;老 build-handoff 的 roofer 默认 FAQ 也不能再编 24h、牌照、质保、保险理赔。 新增一关:site-build-doctor 会在 site-ctx 阶段先查客户可见种子(FAQ / hero / service brief)。如果上游 site-ctx.json 还残留内部提示,即使最终 HTML 暂时没污染,也先 BLOCK,要求重抽 site-ctx 和重打包,避免以后重跑又复发。 设计输入也已单独守住:customer-brief.md 可以是内部长简报,但给设计 / OD / 图片生成代理使用前必须先经过共享清洗,去掉操作员提示、发布前确认话术、starter page、operator、before publishing、the page should... 这类容易被复制到页面里的句子。现在有正式入口 pl:render-design-input-brief -- --slug <slug>,输出 handoff/design/customer-brief.design-input.md;site-build-doctor 会优先认这个干净版文件。
copy-audit 不是用来替代前置检查,而是看最终页面:有没有事实错、文案堆砌、重复、转化弱、上下文不顺、模块组合后读起来不自然。它是兜底,不是主战场。
准备给 Matthew 看、准备销售、或者客户价值高时,再跑 persona-copy-audit / 人眼快速看一遍。批量阶段不每个都花这份资源。
AI 可以发挥的边界:
原则:能在建站前做对的,不等 audit 后返工;能用轻量工具发现的,不上重型视觉/付费工具。
建站前多花 10 分钟 → 少做 1 小时 audit 修补 → 少浪费一次视觉 / full audit / 人工看图
| 档位 | 什么时候用 | 跑什么 | 不跑什么 | 目的 |
|---|---|---|---|---|
| A · 建站前必做 | 每个准备生成页面的客户 | data-checkpoint、single-page-brief、brand/logo 检查、layout-plan --auto-recipe、文案包新鲜度 | 视觉 LLM、full audit | 先把事实、文案、模块、设计方向定好 |
| B · 生成后轻量必做 | 每个已生成页面 | site-build-doctor、copy-audit、audit-v4 --tier fast | audit-v4 full/premium、persona-copy-audit 批量跑 | 免费/低成本地挡住事实错、内部话泄漏、转化点缺失、基础品牌问题 |
| C · 值得推进客户 | 高价值、准备给 Matthew 看或准备销售 | desktop/mobile 截图、scroll video、人工快速视觉看一眼、必要时 persona-copy-audit | full/premium 反复跑 | 确认页面真长得像一个能卖的本地业务网站 |
| D · 重点客户 / 发布前 | 高把握客户、准备正式发布或给客户认真演示 | audit-v4 full/premium --vision-runs 3、视觉模型、设计风格复核、截图留档 | 无意义重复 fast audit | 花钱/花时间买更强确认 |
| E · 暂缓接入 | 当前不是瓶颈,或主要审老网站 | PageSpeed、AI GEO、图片优化、form audit、third-party weight 等未接主线模块 | 不放进每个建站样本 | 等主链稳定后,按销售价值逐个接,不一次性全接 |
截图要做,但要放对位置:
sales-pack.json 的客户,site-build-doctor 会检查 desktop/mobile 截图和 scroll video 是否真的存在;缺了只 WARN 并提示 outreach:capture-assets,不把薄资料客户一刀切挡死。当前推荐顺序:
资料 checkpoint → 文案和模块计划 → brand / logo / design language(不是只看有没有文件,也查默认品牌色和视觉语言厚度) → 生成页面 → site-build-doctor → copy-audit → audit-v4 fast → 截图 desktop/mobile → 重要客户:persona-copy-audit / full vision audit / 人眼复核
compose-editorial 模板渲染。PL_ALLOW_DEPRECATED=1 才能强行跑,仅供重测)。现在先不优先做 sales,也不急着加一堆新模板。建站主链路要先能稳定回答:
数据输入够不够 → AI copy 有没有生成、有没有同步到渲染稿 → logo / brand kit 能不能被模板吃到 → single-page-brief 事实锁有没有 → 模板和 layout-plan 用的是哪条路 → ctx-snapshot 有没有记录实际吃到的 brand 色、Logo、recipe、模块、hero 图 → HTML 有没有生成,来源快照有没有 → 电话 / 表单 / Logo / 品牌色 / 社交账号 / FAQ 有没有真正进页面 → owner / 经验 / 社媒主页这些证明材料有没有真实来源,候选帖子不能直接进 footer → customer-brief 给设计代理前有没有清掉内部操作说明 → audit 卡在哪个门
新增体检命令:
npm run pl:site-build-doctor -- --slug <slug>
它只读文件,不调用大模型,不改客户资料。输出每一站的 PASS / WARN / BLOCK 和下一步建议命令。
它现在还会输出三档业务状态:
readiness · preview=ready|not_ready · sales=ready|limited|not_ready · publish=ready|not_ready
preview=ready:页面可用于内部预览 / starter preview。sales=limited:销售包、截图、copy-audit、audit 都对齐,但仍有薄资料,只能保守销售,不能承诺可上线。sales=ready:销售包和证据齐,且没有会影响销售话术的薄资料提醒。publish=ready:没有 BLOCK/WARN,可进入发布前最后确认。publish=not_ready:还有资料、证明、社媒、质保、audit 或销售包当前性问题没处理。新增的「本地营销稳定检查」专门防这类浪费:
customer-brief.md 原文如果含内部操作说明,设计输入会先清洗;如果清洗后仍有内部话,才 BLOCK。准备交给设计/图片/建站代理前,要先跑 pl:render-design-input-brief -- --slug <slug>,把干净版留在 handoff/design/customer-brief.design-input.md。这个文件存在且比原始 brief 新时,设计输入检查直接 PASS。single-page-brief 没有可显示牌照号。VBA / Victorian Building Authority 这种同一机构的简称/全称不能被误判成事实冲突。ctx-snapshot.json 会记录实际使用的 recipe、渲染/跳过模块、每个模块的资料门槛和跳过原因、hero 图、品牌色、Logo 文件、视觉语言字数、真正进 footer 的社交主页,以及 team / guarantee / service-area 这些 proof 模块实际吃到的核实资料;以后判断“这个页面到底用了什么设计输入、为什么某个模块没显示、哪些社交账号真的展示了、哪些证明资料真的用了”不用靠猜。site-build-doctor 现在会把模块缺口翻译成补资料建议:team(0/1) 会提示补 owner/team 真实来源,guarantee-strip(0/1) 会提示补确认过的 warranty/guarantee 年限,service-area-map 会提示当前确认区域数量和地图模块门槛,footer social 会提示候选账号还没确认主页。site-build-doctor 会 WARN,要求重跑 copy-audit / fast audit,避免重渲染后还拿旧报告当当前报告。sales-pack.json 不能继续引用旧 audit:如果当前 audit-v4 已 SHIP,但销售包还写 BLOCKED / minimum_content_signal,或者销售话术还残留旧的 licence mismatch / QBCC number mismatch,site-build-doctor 会 WARN。新增的「证明 / 触达补强」专门防这类误用:
instagram.com/reel/...、Facebook group/post、profile.php、占位符 # 都不会进 footer。locked_facts.social_links 后,site-build-doctor 会继续检查它有没有真的显示在 footer。ctx-snapshot.contact.footer_social_links 会留档真正显示的社交主页;帖子、小组、reel、profile.php、占位链接不会进页面,也不会进快照。ctx-snapshot.proof 会留档 team members、guarantee items、warranty 年限/类型、verified service suburbs;模块显示和证明资料来源可以反查。acceptedFields:例如 team 会指出可补 brief.real_facts.owner_name / team_members[] 或 locked_facts.owner_name / team_members[];guarantee 会指出可补 warranty_years / guarantee;footer social 会指出要补 locked_facts.social_links。这样缺口不只是“缺什么”,而是“补到哪里”。新增的「无官网 / 社交证据」接法:
external-evidence.json。pl:data-checkpoint 现在会承认 identity_status=same、promotable=true、mined=true 的外部证据:它可以补 sources_consumed,也会给 real_business_signal 最多 4 个信号点。pl:llm-extract-core 会把同一份 external-evidence.json 放进大模型资料包,让搜索/enrichment 得到的资料真正进入网站文案和 customer brief。single-page-brief 和 audit-v4 fast 都只 WARN,不 BLOCK,因为可以用 pl:geo-suburbs 按地址离线推断周边候选区。AI 猜的区域仍然不算确认事实。当前 Mr Roof 真实体检结果说明:
网站已经能渲染 AI 文案包齐 brand / logo 基础齐 brand 检查 = PASS(不是默认模板色;视觉语言文件够厚) single-page-brief 已存在 layout-plan 已存在,recipe = trust-heavy ctx-snapshot design = trust-heavy;FAQ 已渲染;team/guarantee 因缺核实资料跳过;每个跳过模块有 count/min_items 原因;品牌色 #0B6F7A / #F2B84B 已记录 ctx-snapshot proof = team/guarantee 空;warranty 为空;service-area 留档 Cleveland / Brisbane 2 个确认区,service-area-map 未显示 site-build-doctor module proof = 提示补 owner/team、确认 warranty/guarantee、确认社媒主页 服务区域 = 2(Cleveland / Brisbane,地址支撑;最终销售前建议再补 1 个区域或跑 geo-suburbs) copy-audit = APPROVE · 2 low findings(可接受的轻微文案优化建议) site-ctx 文案种子 = PASS(FAQ / hero 不再有 starter page / before publishing / SEO coverage claims) 设计输入简报 = PASS(customer-brief 可直接作为干净设计输入) AI 文案包 = PASS(services/about/hero/FAQ 渲染前已无内部提示) FAQ 模块 = PASS(layout-plan trust-heavy 已渲染进页面) 视觉留档 = PASS(desktop/mobile 截图 + scroll video 已存在) audit-v4 fast:T1 PASS,品牌 91/100,Composite 91,Grade A,Verdict SHIP 当前主要卡点: 1. checkpoint = YELLOW:核心资料已够预览,但最终销售前还要补强薄资料 2. customer-brief 已有 deterministic starter 版本(3913 words / 19 sections),设计输入检查 PASS 3. checkpoint rich = 4/6:服务/区域/Google 评分摘要已可用;仍缺 owner / experience 的真实来源 4. proof/contact = WARN:ABN/licence 已确认;owner / experience 缺真实来源;Instagram 帖子是候选社媒,不能直接进 footer 结论: Mr Roof 当前 site-build-doctor = preview_ready。 readiness = preview ready / sales limited / publish not_ready。 页面本身已经过 fast audit,可用于 starter preview / sales pack; 但不叫最终发布 ready,直到薄资料补强为 GREEN。
所以接下来建站主线的优先顺序是:
pl:site-build-doctor,一眼知道卡在哪。layout-plan --auto-recipe / --use-layout-plan,把 FAQ / trust-heavy / local-seo 这类模块真正渲染进页面。真实样本验证(2026-06-04 复跑):
| 样本 | 当前状态 | 能做什么 | 主要卡点 | 下一步 |
|---|---|---|---|---|
| Mr Roof Solutions | preview=ready · sales=limited · publish=not_ready | 可内部预览;销售包可保守使用 | checkpoint YELLOW;owner/experience 缺真实来源;社媒主页/质保未确认 | 补 owner/经验/确认社媒/质保后再升 publish |
| A-J Roofing Solutions | preview=ready · sales=limited · publish=not_ready | 可内部预览;销售包可保守使用 | checkpoint YELLOW;owner 缺来源;guarantee 未确认 | FAQ 已通过 compose --use-layout-plan 渲染进页面;clean design input brief 已生成;后续只需补 owner/质保等薄资料 |
| Vicwest Roofing | preview=ready · sales=ready · publish=ready | 销售包可用;当前检查已到发布前确认线 | 当前 site-build-doctor 15 项 PASS | 第一个完整 publish-ready roofer 样本;后续可作为建站主链标杆 |
| Mark Squire Roof Restorations | preview=ready · sales=limited · publish=not_ready | 可内部预览;销售包可保守使用 | checkpoint YELLOW | clean design input brief 已生成;根据销售优先级决定是否补薄资料 |
| ABC Roof Restoration Brisbane | preview=not_ready · sales=not_ready · publish=not_ready | 旧残留样本,不能当成已建站样本 | 缺 core-extract/site-ctx/facts、文案包、brand tokens、single-page-brief | 回到建站资料链从头补 |
| West Coast Roofing | preview=not_ready · sales=not_ready · publish=not_ready | 旧残留样本,不能当成已建站样本 | 缺 site-ctx、文案包、brand tokens、single-page-brief;旧 HTML 仍有内部提示 | 回到建站资料链从头补,旧页面准备退役 |
这次复跑修正了一个关键口径:没有 BLOCK、只有 WARN 时,页面可以 preview ready。WARN 是销售前 / 发布前要补的事,例如 FAQ 没显示、owner 来源薄、customer-brief 原文还需要清洗;它们不能把“内部可预览”误判成不能看。
A-J 的真实修复也验证了上游清洗:pl:extract-site-ctx --force --write-content 现在会清洗 FAQ / services / hero 这些客户可见种子,旧的 “before publishing / customer confirmation / SEO coverage claims” 不再进入 site-ctx.json。
销售前资料包生成也已接上主线:pl:build-roofer-sales-pack -- --slug <slug> 会读取当前 copy-audit-summary.json、audit-v4-summary.json、site-ctx.json 和页面路径,生成 outreach/sales-pack.json、sales-pack.md、email/01-draft.md。再跑 outreach:capture-assets 抓 desktop/mobile/scroll video 后,site-build-doctor 可以把客户从 sales=not_ready 升到 sales=limited。A-J、Vicwest、Mark Squire 都已经用同一条流程验证过。
批量推进时不要人工逐个猜下一步,先跑矩阵:
npm run pl:site-readiness-matrix -- --slugs <slug-a>,<slug-b>,<slug-c>
当前 6 个真实样本矩阵:
| 分流 | 数量 | 样本 | 下一步 |
|---|---|---|---|
| publish_ready | 1 | vicwest-roofing | 作为完整标杆;保持页面、copy-audit、audit、截图、sales pack 同步 |
| sales_limited | 3 | mr-roof-solutions、a-j-roofing-solutions、mark-squire-roof-restorations | 可保守销售;补 owner、经验、社媒主页、warranty/guarantee 这类薄资料 |
| rebuild_required | 2 | abc-roof-restoration-brisbane、west-coast-roofing | 不当作已建站样本;回到 core-extract / site-ctx / 文案包 / brand / single-page-brief |
分流规则:
publish_ready:没有 BLOCK/WARN,preview/sales/publish 全 ready。sales_limited:页面和销售资料能用,但还有薄资料 WARN;销售时必须保守,不说 ready to go live。preview_only:内部可看,但销售包、截图、copy-audit 或 fast audit 还没齐或过期。rebuild_required:有 BLOCK;先回到建站资料链,不要继续补销售材料。2026-06-03 新增 · 配方 + 自动选 + 2个新模块(全 opt-in · 正在标定): - 配方(recipe):4套命名布局 ——editorial-default(不变) /trust-heavy(信任优先) /visual-first(视觉优先) /local-seo(本地优先)。--recipe <名>选用。 - 自动选配方--auto-recipe:系统按已核实数据自动挑布局(有质保+执照+口碑+团队→信任优先;真实工程照≥3→视觉优先;核实小镇≥12→本地优先;信号弱/打平→默认)。纯数据驱动、不用大模型。 - 2个新模块:团队(显示核实过的人·首字母头像·不编假脸)/ 服务区地图(覆盖区变体·核实小镇做成"中心+周边"视觉·不用iframe)。 - 守纪律:每套配方硬不变量(hero第一·联系/页脚收尾·不许两个数据条挨着);新模块只读已核实数据;质保检测抽成一个共享源(detect-signals.js)compose和选配方共用。全 opt-in、默认行为没变、一致性 31/31。要设成自动默认得过标定A/B+你眼检。
积木式搭建:网站模块拆成了独立「积木」(templates/roofing/blocks/ + 登记表 index.json:哪个积木放哪个区、什么条件出现),排版大脑按客户数据自动拼装。
pl:plan-layout 默认就智能拼装)。固定骨架仍在(hero 永远第一、联系/页脚永远收尾),可选积木插进对应区位;--base 可拿回纯净老顺序。 - FAQ 常见问题 — 有 ≥3 条真实问答才出现(放服务区后) - 质保承诺带 — 核实过有质保年限才出现(放评价区后);只读已有质保数据、不新增任何信息源 - 施工流程 — 通用流程文案;默认关(配置 optional_blocks.include_generic_process),要开再开
image-manifest.json 权威否决)。安全底线:实时渲染仍走老的整页模板(compose --use-layout-plan 默认关)—— 智能拼装目前只改「计划文件」、没真正上线。一致性测试全程 31/31 绿(智能版 vs 老版逐字节一致)。审计同评委对比:智能版 67 ≥ 老版 66,零倒退(还略升)。
建出来的网站不是"看着差不多就行"——每个网站过一套多层、可量化、带否决权的审计,分数低就不发。 标准源头:docs/v3/SOP-AUDIT-STANDARD-V2.md(canonical)。工具:pl:audit-v4+pl:copy-audit+pl:persona-copy-audit。
最终综合分 = 这 5 项加权:
| P0 | 权重 | 看什么 |
|---|---|---|
| 内容准确 content_accuracy | 25% | 电话/牌照/ABN/地址有没有写错或造假(确定性硬核对 · 错就直接挂) |
| 文案质量 copy_quality | 25% | 事实性 / 语气 / 具体度 / 说服力(4 个子维度,大模型判 + 校准过) |
| 品牌还原 brand_fidelity | 20% | 配色/字体/logo 有没有忠实落地 |
| 内容丰富 content_richness | 15% | 信息够不够厚、有没有空洞 |
| 设计一致 design_consistency | 15% | 视觉/排版/留白/可读性 |
copy-audit --validate 必须先在金标准集上证明"能抓到人眼看到的问题",才被允许给文案把关。persona-copy-audit 站在目标客户角度打分(参考分,不当批量硬门,留给人眼 + Matthew 拍板)。module-render-policy.json)渲染端和审计端读同一个文件,不会两边对不上。vicwest 91 · a-j 89 · mark-squire 93(均分 91)。trade-classic 均分 84。
质检不是只放在页面生成之后。
生成前 / 打包时 → site-build-doctor 先查 site-ctx 的客户可见种子(FAQ / hero / service brief) → customer-brief 给设计/OD/图片生成前先清洗内部操作说明 → assemble-handoff 清洗客户可见文案 → site-build-doctor 的 copy_package 检查 services/about/hero/FAQ → site-build-doctor 的 brand 检查默认品牌色 / Logo / 视觉语言厚度 → 确保内部提示、待确认话术、不能展示的事实不进页面 页面生成之后 → copy-audit 看最终页面诚实度 / 重复 / 堆砌 / 转化表达 → audit-v4 看 5 个 P0 + 移动端 → 重点客户再跑 persona-copy-audit / 人眼看
所以 copy-audit 是成品兜底,不是唯一文案把关;能在建站前审掉的问题,必须在建站前审掉。
不要再用“8 个区域”挡 starter 网站。
single-page-brief 只 WARN,audit-v4 fast 不用 Gate 3 BLOCK;最终销售前建议跑 pl:geo-suburbs 或补一个确认区域。6 个里程碑,覆盖一条线索从数据采集到网站上线。每个标清楚:产出什么 · 内容结构 · 工具 · 免费/付费(成本) · 时间 · 用途 · 写手→读者 · 闸门 · 弱/没用时该怎么办。 数据使用状态:✅ 已接进流程 · 🔭 有工具但偏后置/默认不跑 · ❌ 建了但没被调用 · ⚠️ 花钱/贵。更新于 2026-06-03(模块 3 采集核对)。
当前只围绕 roofer niche。主目标不是再增加一堆新工具,而是把核心业务链路跑顺:
lead 进入系统 → 先用便宜快速检查排除不适合客户 → 值得继续的客户才做深度调查 → 所有资料进入 master.md 总档案,并分清事实 / 候选 / 销售参考 / 不可用 → AI 从已核实资料里生成建站文案和 customer brief → compose-editorial 生成一页 roofer 网站 → site-build-doctor / copy-audit / audit-v4 判断 preview-ready、sales-ready、publish-ready → 销售材料引用当前网站、截图、audit 和 master.md 证据 → outreach 结果回写
当前优先级:
master.md → 建站资料包 → 一页网站 → 轻量质检 稳定成可复制样板。当前真实样本:
| 数据/能力 | 工具 | 成本 | 状态 |
|---|---|---|---|
| Google Places(名/址/电话/评分/营业时间/照片) | Places API | ⚠️ 付费 ~$0.017/次(已记 452 次) | ✅ 用了 |
| 网站爬取(全站 HTML/正文/图) | direct-fetch + tinyfish;Firecrawl 兜底 | 免费为主;Firecrawl 显式兜底才付费 | ✅ 用了(默认免费优先) |
| 搜索(找官网/社媒/提及) | Tinyfish + DuckDuckGo | 免费 | ✅ 用了 |
| ABN/ABR 工商登记 | 公共 API | 免费 | ✅ 用了 |
| WHOIS/RDAP + Wayback(域名年龄/历史) | 公共 API | 免费 | ✅ 用了 |
| 评价(口碑) | Docker(免费) / Places API(付费) | 免费/⚠️付费 | ✅ 用了(A/B 优先 Docker) |
| 文案/视觉/判断(LLM) | Ollama本地(免费) / codex·claude(订阅) | 免费/⚠️订阅 | ✅ 用了(本地优先) |
| 牌照库(42 万行 SQLite) | license-lookup | 免费/本地 | ✅ 已接筛选观察;确认后可写牌照 |
| PageSpeed/Lighthouse(性能真实数据) | 免费 API 25k/天 | 免费 | ✅ 已接 cheap screen(移动端先跑) |
| Places 照片(单独抓) | Places API + Cloudinary | ⚠️付费 | 🔭 有工具,偏付费后素材补充 |
| OpenCLI 社媒登录抓取 | 本地浏览器 | 免费 | 🔭 已清关但默认关(env 开关) |
可行动:Places 照片、OpenCLI 社媒抓取属于偏后置能力;继续核对它们什么时候该跑,避免一开始就增加成本。
pl:run-enrichment-batch / pl:enrich-entity / pl:places-enrich → 写 handoff/od-package/facts.json + multi-page-crawl/ + photos/ → 读者 = 核心提取 + 审计。clients/<slug>/v2/handoff/od-package/facts.json。buildCoreExtract(融合 GBP+爬取+评价+提及+图片) → core-extract.json → leads:build-master-md。LLM 走级联(本地优先)。pl:llm-extract-core/leads:build-master-md → 读者 = 渲染器 pl:compose-editorial + 销售。external_facts(外部资料)已可作为参考区进入 master.md,但不能混进正式事实。clients/<slug>/v2/master.md + core-extract.json(real_facts 带来源)。leads:run-pipeline → data/v2/fixtures/detailed-audit/<key>.json → 读者 = 分级 + master.md 卖点。checkpoint.json = RED/YELLOW/GREEN(GREEN 多页 · YELLOW 单页+提示 · RED 拦住不建);② pl:audit-handoff = 建站前对 od-package 的 7 层检查(结构/manifest/品牌/内容/语言/事实/设计)。pl:data-checkpoint → checkpoint.json → 读者 = 渲染器(RED 直接拒渲染)。clients/<slug>/v2/checkpoint.json。od-package/ facts.json ← 锁定事实(名/址/电话 · 逐字不改) brand/ ← logo 多变体 SVG + brand-tokens.css + brand-spec.json content/ ← services.json · about.md · hero-copy.json · faq.json · reviews.json (LLM抽取·带_source来源) structure/ ← page-map.json · header/footer/cta-system · seo-strategy.md assets/ ← 真实客户照片 + 缺图用图库兜底 + asset-prompts.md shared/ ← header.html · footer.html · shared.css(每页复用) DESIGN-MANIFEST.json← 机器读:family · read-order · factsPolicy(mustNotInvent 清单) DESIGN-HANDOFF.md ← 人读:8 章(事实/品牌/内容/架构/图片/审计/边界/建站指令)
pl:build-handoff(脚手架) → pl:enrich-handoff(B1-B7 LLM抽真内容) → pl:assemble-handoff(打包成 od-package)。pl:compose-editorial(读 od-package 的 facts/content/brand + core-extract/master.md/checkpoint/照片/persona/模板)。pl:compose-site = 已废弃的旧全包消费者,别用。pl:copy-audit(诚实门·唯一硬否决=编造身份) · pl:persona-copy-audit(买家视角) · grid-balance。editorial-output/audit-v4-*.json。pl:publish-dir --with-functions → CF Pages · 联系表单 → Resend 邮件(leads@profitslocal.com)。销售/外联(结账→Stripe→改稿→发布 · SALES_FUNNEL)是下游业务流,用上面这些产出,但不算"建站核心里程碑",本页先不展开。
这是我们按它推进的计划,也是 Matthew 唯一看的页面。状态:✅ 已实现(线上跑) · 🔭 已建·只观察(不真动手,等放行) · 🔄 计划中(还没建/没批)。 所有 SSOT 文档都在本页"文档索引"列出 + 在"锁定决策"tab 里能读。命令 npm run pl:publish-business-map 重新发布本页。更新于 2026-06-02。
--auto-recipe:按已核实数据自动挑布局(质保+执照+口碑+团队→信任优先;真实工程照→视觉优先;小镇多→本地优先;弱/平→默认)·纯数据驱动不用大模型·codex 保守兜底规则。④ SSOT 守门:质保检测抽成共享源(detect-signals.js)compose+选配方共用·不重复。全 opt-in·默认零改动·一致性31/31·8个测试套件全绿(配方38/团队14/服务区17/自动选16…)。codex 全程审/修(R181抓3问题+R182抓2问题已修)。正在跑配方标定 A/B(base=70)·过了+你眼检才设自动默认。首图支线(R179):宽幅航拍替掉产品特写·视觉+4(66→69)·真实照片反而更差→保留库存(已收口)。templates/roofing/blocks/ + 登记表),渲染器按登记表拼装。② 3 个新可选模块:FAQ常见问题(≥3问答)/ 质保承诺带(核实有质保·只读不新增写手)/ 施工流程(默认关·配置开)。③ 排版大脑智能拼装(pl:plan-layout 默认 --smart):自动把可选块摆到对应区位(质保后于评价、FAQ后于覆盖区),但显不显示由登记表门槛决定——排版只摆位置、门槛只一处、不重复。④ 诚实门槛:「全保险/不用外包/0外包」没核实就不显示。⑤ 审计可复现:锁定视觉评委模型 + 记录型号(之前换评委分数漂 13 分)。证据:测试 31+20+13+14+12 全过;智能版 vs 老版 同评委 67≥66 零倒退(还略升);buyer文案审计 78分0诚实问题;Matthew 亲眼过截图。安全:实时渲染仍走老整页模板(--use-layout-plan 默认关)、智能拼装只改计划文件未上线、--base 可拿回纯净老版、一致性逐字节 31/31。下一步(codex 建议·独立):修首图(真实屋顶照·审计唯一扣分点)→ 再观察几客户后把智能渲染设实时默认。pl:plan-layout 决定"用哪些模块 + 每个位置放哪张图",写成可检查的 layout-plan.json,渲染器按它出图(默认关 --use-layout-plan·生产不受影响)。Phase 2A:规划层会真去挑客户的真实照片放 hero+服务(以 image-manifest.json 为权威否决层:必须真实照片·非logo·质量分达标 hero≥7/服务≥6·跨槽去重)。codex 抓出并修了一个 P0(logo 被当 hero)。A/B 同评委对账(vicwest):用真实照片 vs 库存图 综合分都是 79(真实照片在视觉两维略高)→ 不掉分。codex 裁决:过关·保持 flag-gated 不默认启用·按客户人工眼检后再逐个开。顺带修了审计视觉卡死(加 LLM_SKIP_TO 切 codex/本地 ollama 视觉·守住"必须有本地 fallback"规矩)。待办(codex 归类·非阻塞):质保标题截断 / 页脚太薄 / 文案差异化不足 / claude视觉健康后重测 canonical 基线。 - 摸清现状(hard evidence):交付流水线已建好且能全自动跑(6 个命令 build→enrich→设计文档→评分→打包→审计)。vicwest 已是 93/100「可发版」。 - 真测一个全新客户(apex-roofing)从头跑——证明流水线真能自动产出(hero/分章/图片绑定/fix-matrix 全自动,不靠人工),落在 56/100「需先修关键项」。 - 修了 codex 锁的 4 个 bug(每个都重跑 apex 验证):① hero 按钮显示成 [object Object] ② 锁定电话没按"数字相等"判(格式不同被误杀)③ 页头/页脚/CTA 没自动生成(已接进流水线·§13/14/15 现在有了)④ 打包命令 --skip-checkpoint 失效。 - 建了一键编排命令 pl:build-complete-handoff:一条命令把 6 步串起来 + 算一个"能不能交付"总闸(设计文档✓ 评分=可发版 ✓ 校验✓ 打包✓ 7 层审计✓),每个客户产出一份 _complete-handoff-status.json 列出还差什么。这把"离能交付还有多远"变成机器可量化的清单。 - 深度审计(P1-P7)又暴露了更完整的差距:品牌包/logo 没生成(logo 技能还没接)、image-manifest 漏建一步、锁定电话格式过审计、模板 family 名对不上。这些 + 2 个待裁定(商家名要在哪些地方逐字出现 / 一个查空目录的废校验器要不要退役)都在等 codex(codex 暂时用量到顶·约 5:03pm 恢复)。 - 下一步:codex 回来→裁定 2 个问题 + 决定品牌包是否算"设计交付"硬门→补齐 apex 到「可发版」→试点 3-5 个→批量 ~74 个。Phase D/C 暂缓。
core/leads/fast-filter.js(唯一真相源·声明 10 道便宜关卡的顺序 + 昂贵分界线),页面「🚦快速筛选漏斗」tab 直接从它渲染(代码改了表自动变·不走偏)。盘了所有审计项,把便宜的(页面规模nav·牌照状态)标为"待前置"。48 测试。下一步:把"待前置"的真接进快筛 + 让 cheap-audit-queue 消费这个 SSOT。--rollup);第一次跑就发现 16/30(全库116) 死在旧页面规模 bug 上 → 直接催生 Phase B。docs/v3/)关键的两份已渲染进本页 tab("锁定决策"=CANONICAL §0 · "漏斗清单/控制层"=技术细节)。完整源文件在仓库 docs/v3/:
CANONICAL.md —— 主 SSOT:锁定决策 + 废弃路径 + 质量门 + 重测触发条件(本页"锁定决策"tab 是它的 §0)INFRASTRUCTURE-INVENTORY.md —— 全部已建模块/CLI/数据/发布流 + 路径 + 状态(开工前必读,别重造轮子)ROADMAP-CN.md —— 本文档(中文路线图 + 进展)HANDOFF-NEXT-SESSION.md —— 上一会话交接 + 下一步选项SPEC-FUNNEL-ORCHESTRATION.md —— 漏斗总控设计(阶段 1-7 · ADR-6..10)SPEC-GATHER-MODULE.md —— 采集骨干设计(阶段 5-6 · ADR-1..6 · 免费爬虫/页面规模/验证层)SPEC-IDENTITY-RESOLUTION.md —— 身份识别三层 + 金标准门FUNNEL-INVENTORY.md / AGENTS-SKILLS-DISCORD.md —— 漏斗清单 / 控制层(本页技术 tab)OPENCLI-SECURITY-REVIEW.md —— OpenCLI 安全审查 + 清关记录pl:scrape-docker)pl:places-search-intake)pl:license-lookup)pl:single-enrich)pl:ingest-image 有,但自动 OCR 还没做)judgeEnrichmentMatches)pl:mine-background · R145 · 确认身份才挖 · 单独存 external_facts,不碰核心事实)exclusion-filter 第1层)lead-grading)resolve-identity)pl:mine-gold-candidates / pl:label-gold / 网页版)pl:run-funnel --rollup · 看每层淘汰多少 · R148)业务过程中的核心文档,三类:C 从头梳理模块 + B 每个客户产出的文档链 + A 定义流程的 SOP(只列核实在用的,旧的/不确定的标清楚)。 状态:✅ 核实在用 · ⚠️ 代码在用但文档可能有偏差(待核) · 🗑️ 旧的别看。更新于 2026-06-03。
这组文档是为了把业务从 SSOT 页面往下拆清楚,再一层层推进:
BUSINESS-OVERVIEW-CN.md —— 当前业务总览:roofing 线索 → master.md → 单页网站 → 审计 → 发布。BUSINESS-MODULES-CN.md —— 11 个业务模块拆分:入口、身份、采集、筛选、审计、master.md、建站、质检、发布、控制层。FLOW-END-TO-END-CN.md —— 端到端流程地图:入口、筛选、采集、Design / 建站资料包、质检、发布怎么串起来。ROADMAP-6-PHASES-ROOFER-CN.md —— 当前 6 阶段推进目标:只做 roofer,从身份确认一路走到 Design 可开工资料包。LOGIN-REQUIRED-SOURCES-CN.md —— 搜索/背景调查里需要登录读取的信息源:Facebook / Instagram / LinkedIn 账号准备清单。WORKPLAN-FROM-SCRATCH-CN.md —— 本轮从头梳理计划:先理流程,不先跑客户业务。MASTER-MD-SSOT-PRINCIPLE-CN.md —— master.md 总档案原则:所有进入系统的 lead 都应该有 master.md,所有报告/销售/建站资料都从这里抽。DATA-SOURCES-TO-MASTER-MD-CN.md —— 资料来源写回表:每类资料从哪里来、什么时候跑、写进 master.md 哪里、能不能给客户网站用。EXISTING-WORK-INVENTORY-CN.md —— 已有工作盘点:哪些在用、哪些半接上、哪些被证伪或准备退役,避免重复劳动。MODULE-IO-RETIREMENT-MAP-CN.md —— 模块输入/输出/去向/退役风险总表:逐模块推进用。NO-WEBSITE-VS-HAS-WEBSITE-FLOW-CN.md —— 无网站 / 有网站两条客户路径:starter 与 redesign 怎么分流。FIRST-CODE-CANDIDATES-CN.md —— 第一批最小代码改动候选:达到 95% 信心后怎么按测试先行推进。SCREENING-STANDARDS-CN.md —— 客户筛选标准:没网站 / 有网站两条路径,直接挡、只观察、加权参考、人工判断。COST-LAYERED-SCREENING-CN.md —— 成本分层筛选:免费快工具先跑,耗资源 audit / 付费 API 后置。DISCORD-404-CLEANUP-CN.md —— Discord 旧 thread/card 404 清理清单:只读盘点,不挡筛选主线。SSOT-PAGE-MAP-CN.md —— pl-business-map.pages.dev 每个 tab 从哪里来、改哪份源文件、怎么发布。MODULE-01-ENTRY-CN.md —— 模块 1 入口:Maps / Places / 单商家 / 牌照 / 图片 / 链接的真实状态。MODULE-02-IDENTITY-CN.md —— 模块 2 公司身份:怎么防同名误认、哪些结果只能观察、何时能写正式档案。MODULE-03-GATHER-CN.md —— 模块 3 采集:官网/Places/PageSpeed/牌照/外部背景/图片素材分别怎么进流程。MODULE-04-FAST-FILTER-CN.md —— 模块 4 快速筛选:哪些会归档、哪些只观察、活下来怎么进详细审计。MODULE-05-DEEP-AUDIT-CN.md —— 模块 5 深度审计:审什么、怎么分 A/B/C/D、D 级怎么停、哪些输出给 master.md。MODULE-06-MASTER-MD-CN.md —— 模块 6 master.md:资料总档案、正式事实/参考资料边界、建站如何读取。MODULE-07-WEBSITE-CONTENT-CN.md —— 模块 7 建站内容:事实线、文案线、打包线、最终事实锁。MODULE-08-WEBSITE-RENDER-CN.md —— 模块 8 网站渲染:默认模板、可选 recipe/block、输出和旧路封禁。MODULE-09-WEBSITE-QA-CN.md —— 模块 9 网站质检:发布硬门、事实检查、手机端、买家视角建议。MODULE-10-PUBLISH-DELIVERY-CN.md —— 模块 10 发布交付:Cloudflare Pages、表单邮箱、发布记录写回和 publish-doctor。MODULE-11-CONTROL-LAYER-CN.md —— 模块 11 控制层:Discord 任务、任务队列、Hermes、skills、doctors、漏斗总入口。一条线索走完流程,会沉淀这条链(clients/<slug>/v2/)。带 ★ 的是"数据之记录"(CANONICAL 认定的核心,其余多是实验/历史 churn,别被淹没):
| 顺序 | 文档 | 是什么 | 哪一步产出(writer) | ★记录 |
|---|---|---|---|---|
| 1 | data/leads/entities/<id>.json | 线索档(名字/电话/地址/状态/历史) | 发现:pl:scrape-docker/pl:places-search-intake/pl:lead-discovery | ★ |
| 2 | handoff/od-package/facts.json + multi-page-crawl/ + photos/ | 富集产物(事实 + 爬取页 + 选好的照片) | 富集:pl:enrich-entity + pl:places-enrich + 图片分类(vision) | ★ |
| 3 | core-extract.json | 核实过的事实(real_facts 带来源;本会话加了 external_facts 外部资料) | pl:llm-extract-core / buildCoreExtract | ★ |
| 4 | master.md | 核心:背景 + 审计 + 建站素材(这条链的基石,21+ 章) | leads:build-master-md | ★ |
| 5 | single-page-brief.yaml | 建站 brief(12 项交叉校验) | pl:build-single-page-brief | ★ |
| 6 | checkpoint.json | 数据够不够建站的闸门(RED/YELLOW/GREEN) | pl:data-checkpoint | ★ |
| 7 | internal-audit-report.html + customer-facing-audit.html | 审计报告(内部 + 客户版) | leads:run-pipeline / pl:build-customer-audit | |
| 8 | editorial-output/index.html | 渲染出的网站 | pl:compose-editorial | ★ |
提醒:客户目录里还有 40+ 个文件(audit-a/b/c、core-extract-codex/ollama、comparison-*等)= 实验/历史 churn,不是核心。核心就上面这 8 个(带 ★ 的 6 个是数据之记录)。
每份都对着代码核实过 CLI 是否还在、是否接进线上。✅ 才放,⚠️/🗑️ 标清楚。
发现 / 进件
SOP-1-FLOW.md —— Discord 进件 → pl:places-search-intake → master.md 骨架(2026-05-14 验证 live)LEAD_PROFILE_SCHEMA.md —— 线索对象 schema(与 data/leads/entities/*.json 实际结构一致)审计
SOP-2-FLOW.md —— M2 审计管线(leads:run-pipeline → 22 章 master.md + 素材)SOP-AUDIT-STANDARD-V2.md —— 当前审计标准(CANONICAL 锁定),pl:audit-v4 实现它(T1-T5 + 5 个 P0 轴)数据就绪 / 建站准备
SOP-DATA-CHECKPOINT.md —— pl:data-checkpoint 写 checkpoint.json(RED/YELLOW/GREEN),schema 与脚本一致SOP-MASTER-MD-TO-WEBSITE.md —— master.md → 网站的 5 步内容管线(5 个 CLI 都在 · 2026-05-29)渲染 / 建站
SOP-3-FLOW.md —— M2 产出 → pl:build-from-reference → CF Pages(10 个客户 live · curl 200)销售 / 运营
SALES_FUNNEL.md —— 预览 → 结账 → Stripe → 审批/改稿 → 发布(34 个 funnel:* CLI 全接通)PROFITSLOCAL_OPERATING_RULES.md —— 产品边界(单页 $399/$799yr)+ GitHub SSOT + Cloudinary 资产⚠️ 代码在用、但文档可能有偏差(待核对,先别全信文档)
SOP-READY-TO-BUILD.md —— 资格 7 硬门 + 5 维打分。代码 qualification-scorecard.js 确实在用(本会话刚改过它的页面规模门),但文档是 D39 初版(2026-05-14 "awaiting validation"),细节可能与代码有偏差。LEAD_QUALIFICATION_ENGINE.md —— 筛选引擎。底层 exclusion-filter.js(cycle-23) + lead-grading.js 在用,但此文档较旧(2026-05-06),含部分构想,描述与现状可能脱节。🗑️ 旧的 · 别看
SOP-AUDIT-STANDARD.md(v1)—— 已被 V2 取代,仅作回归基线。CORE_BUSINESS_FLOW_SOP.md —— 高层概览、非操作手册,已被上面分阶段 SOP 取代(看本页"概览/路线图"即可)。这是CANONICAL.md§0 的中文版。锁定 = 没有实证 + codex 共识不能改。 权威源是英文docs/v3/CANONICAL.md(codex/agent 读英文)。更新于 2026-06-02(v1.7)。
pl:compose-editorial(V1 · 模板 + Mustache · 确定性 · $0)。要换得满足"审计提升≥5分 + token覆盖≥80 + 5次跑变动≤3分"。editorial-newsletter(暖编辑风 · 均91)+ trade-classic(澳洲行业稳重蓝橙 · 均84)。只做单页。加新模板要走 SOP + 3 个标定客户都≥80分。brand-tokens.css 必须放进 <style> 块内(D2.5 配色审计靠它读 hex)。/api/client-contact(Resend)。发件域名 leads@profitslocal.com(已验证)。fabricated_license_or_identity(确定性核对 牌照/ABN/电话/名字/地址 vs brief)。其它(项目数/评价/AI证言/吹嘘)= demo 占位,只提示不否决。身份事实绝不交给大模型判,只用确定性核对。pl:persona-copy-audit 买家视角打分 = 顾问性质,不当批量门。确定性的当门,主观质量当参考 + Matthew 亲眼。templates/roofing/blocks/ + 登记表)。3 个可选块:FAQ(≥3问答)/质保条(核实有质保·只读不新增写手)/施工流程(默认关·配置开)。排版大脑 pl:plan-layout 默认智能拼装(摆位置)+ 登记表门槛决定显不显示(一处门槛不重复);--base 拿回纯净顺序。实时渲染仍走老整页模板(--use-layout-plan 默认关),智能拼装只改计划文件、未上线。智能版 vs 老版 审计同评委 67≥66 零倒退、一致性 31/31。audit-v4 视觉打分锁定模型(AUDIT_VISION_MODEL·默认 sonnet)并记录 vision_model;分数只能和同一评委的基线比(之前 haiku→sonnet 漂移让 vicwest 79→66 但页面没变)。pl:extract-site-ctx(零 LLM · 确定性)= 所有下游 copy 工具的中间契约。buildCoreExtract(融合 GBP + 爬取 + 评价 + 提及 + 图片 + master.md → 一份 core-extract.json)。pageScaleGate。修这个救回了 24 个客户。pl:run-funnel --rollup 看每层淘汰多少。pl:compose-site):被 editorial-newsletter 取代。漏斗怎么被触发、任务怎么排队、谁来执行、哪些检查负责发现“用户看不见”的失败。更新于 2026-06-03。更细拆解见 docs/v3/MODULE-11-CONTROL-LAYER-CN.md。
控制层现在是半自动:Discord 可以进任务,任务可以排队执行,检查器也不少;但从入口到上线还不是一个完整自动按钮。
flowchart TD A["Discord #website-tasks"] --> B["pl-task-listener"] B --> C["intent-router"] C --> D["data/tasks 任务文件"] D --> E["pl-task-dispatcher"] E --> F["目标 CLI"] F --> G["客户资料 / master.md / 审计结果"] G --> H["Discord 回写"]
对应代码:
scripts/cli/pl-task-listener.js:监听 Discord 新 thread / reaction。core/tasks/intent-router.js:判断任务类型和要跑的命令。core/tasks/task-store.js:把任务写进 data/tasks/。scripts/cli/pl-task-dispatcher.js:领取任务、跑命令、回写结果。| 入口 | 状态 | 说明 |
|---|---|---|
#website-tasks | ✅ | 发任务入口:自然语言找客户、Places intake、单商家补录、图片识别、网站审计、模糊任务转人工 |
#website-leads | ✅ | 每条线索一个 thread,显示阶段 / 分级 / 记录 |
#website-projects | ⚠️ | 项目 thread 代码存在,但历史消息和 profile card 要靠 doctor 保证 |
#lead-discovery-runs | ⚠️ | 批次进度 thread 是关键可见结果,之前出现过“任务 done 但 Discord 上看不到”的问题 |
#paid-websites | 🔄 | 付款后网站交付阶段,还不是当前主线 |
原则:Discord 上看不见,就不能只按任务文件 done 算完成。
任务存在 data/tasks/,核心字段是:
kind:任务类型。status:pending / running / done / failed / human。source:通常是 Discord。input:原始文字 / 附件。target.cli 和 target.args:要跑的 npm script 和参数。discord:thread / message 信息,方便回写。模糊任务会进 human,不会硬跑。操作员可以用 reaction 做 retry / archive。
pl:run-funnel 是获客漏斗的轻量入口。
它串联:
pl:scrape-docker 或 pl:places-search-intakepl:run-enrichment-batchleads:run-pipeline --all-audit-candidates注意:
--execute 才会跑。--resume 可以继续中断的批次。--rollup 只看已有数据的淘汰账,不写数据。pl:pipeline-all 名字像“全流程”,但它不是获客漏斗。
它真正做的是:
clients/<slug>/v2/ 跑资料检查。inferred-data.json。pipeline.html 和 experiments/pipeline-index.html。当前状态:
data/agent-tasks/<client>/*.json 任务包已经存在。pl:compose-editorial 包装。pl:publish-dir 包装。现在真正进入运行时的 PL skills 主要是 3 个数据型 skill:
pl-au-trade-voicepl-audit-rubricpl-local-trade-page-spec它们由 scripts/cli/skills-build.js 从 SKILL.md 生成 JSON,给审计、文案口吻、页面结构使用。
其他 profitslocal-* skills 多数是说明书 / 工作流 / agent 提示,不是自动运行器。
| 检查 | 用途 |
|---|---|
pl:lead-journey-doctor | 看客户生命周期数据是否一致 |
pl:goals-doctor --quick | 文件层检查核心目标 |
pl:goals-doctor | 完整模式会查 Discord 和线上链接 |
pl:publish-doctor | 检查已发布 URL 是否还活着 |
cycle:doctor | 检查 Discord 可见内容、thread 状态、阶段消息和过期说法 |
skills:check | 检查 skill JSON 有没有跟 SKILL.md 漂移 |
本轮实测状态:
pl:run-funnel -- --niche roofing --rollup ✅ 能读漏斗账:30 进入,7 进入深度,1 pending。pl:publish-business-map -- --dry ✅ 能生成 9 个 tab。test-cycle26-cross-file-integrity ✅ 15/15 通过。pl:intake-doctor -- --json ✅ 6/6 通过:Docker scraper、Places key、master.md backlog、router regex、batch thread 可见性都通过。pl:ship-customer 非 dry-run ✅ Vicwest Roofing 发布成功,写回 cf-pages-deploy.json 和 entity.deploy,表单 POST 返回 200。pl:publish-doctor -- --json ✅ alert_count=0,Vicwest URL spot-check 200。publish vicwest-roofing to matthewkiata@gmail.com → kind=publish → pl:ship-customer;缺邮箱会转人工。skills:check ❌ pl-audit-rubric.json 和 SKILL.md 已漂移,需要重建或审查。pl:lead-journey-doctor --json ❌ 当前客户库有 38 个旧 key 前缀、1 个旧 phase。 已补:模型提示词不再暴露 pl:scrape-docker;执行器遇到 pl:scrape-docker 但没有 --batch-id 会直接失败并发可见提醒;intake-doctor 会检查最近 batch 是否有 Discord thread,且用 Discord API 抽查是否存在。
现在 Discord 可把 publish <slug> to <email> 路由到 pl:ship-customer;缺邮箱或 slug 会转人工。Hermes 可调用包装还没做。
还没有一条已锁定路线从“图片 / 链接 / 找客户”一路跑到“发布 + Discord 回写 + SSOT 更新”。
pl:ship-customer 交付写回已补,仍需非 dry-run 验证。 真实发布完成后会写 cf-pages-deploy.json 和 entity.deploy。下一步用一个客户跑非 dry-run,确认线上 URL、表单邮件、publish-doctor、Discord profile card 都同步。
skills:check 漂移和 lead-journey-doctor 旧数据红灯。