ProfitsLocal / WebJuice — 项目总览 · SSOT 页面

⭐ 这是 Matthew 指定的 唯一 SSOT 页面(2026-06-02)· 所有核心流程/决策/进展都汇到这里 · 实时维护(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
                              │
                              ▼
                          【给他做网站】

三条铁律:

  1. 入口千变万化,下游只有一条管子。 每条线索先收敛成唯一的公司身份,之后全部走同一条「搜索 → 判相关 → 找官网 → 多源采集 → master.md」流程。
  2. 漏斗 = 成本分级。 最便宜的排除先做(免费查库/启发式规则);最贵的活(全站爬取 + 拿照片)只对走到漏斗底部的线索做。绝不在不合格的线索上花钱。
  3. master.md 是漏斗底部的成品 —— 给「确定要做的客户」的丰富素材文档(有官网走 redesign 版;无官网走背景调研版)。

已扎实 vs 待办: 统一流程 + 漏斗的「零件」基本都有了(身份判官、社媒抓取、牌照门、外部内容挖掘都已落地)。待办:(a) 图片/链接入口还没接到收敛口;(b) 漏斗的成本分级总控(入口收敛 → 分阶段 gate → 逐层深挖)还不是一个显式控制器(pl:run-funnel 是雏形);(c) 采集骨干(页面规模准确、免费优先爬虫、验证层、master.md 汇总)是 SPEC-GATHER-MODULE.md 计划。

进展(2026-06-02):


🚦 快速筛选漏斗(代码级 · 从 SSOT 自动生成)

一条线索进来,按"最便宜的先筛"逐道过,全是便宜/快的信号;只有活下来的才进昂贵的详细审计。 此表从 core/leads/fast-filter.js(唯一真相源)直接渲染,不会和代码走偏。✅在用 · 🔄待前置(便宜但还没接进快筛) · 🔭观察。
#关卡信号工具成本动作状态
1niche_relevance类目 vs 搜索 niche 匹配LLM cascade (cached) / stem-match即时·$0排除✅在用
2gbp_triageGBP 信号: 电话/评分/评价数/网站/图片/类目gbpTriage即时·$0打分✅在用
3exclusion_precheck抓取前先排除明显不合格 (省下后面的抓取)runExclusionFilter (no cheapAudit)即时·$0排除✅在用
4licence_kill_observe牌照吊销/过期 (仅身份已确认)lookupLicense + observeLicenceKill免费·本地只观察🔭观察
5homepage_fetch抓首页 (markdown + 原始HTML)tinyfishFetchUrls免费·抓取补上下文✅在用
6site_quick_scanHTTPS/viewport/正文薄/CTA/陈旧年份siteQuickScan即时·$0打分✅在用
7page_scale_nav前端导航页 ≤20 (sitemap 不算)navScope + pageScaleGate即时·$0闸门(超阈值归档)✅在用
8pagespeed_mobile移动端性能分 + LCP (慢=更值得重做)pagespeedAudit(mobile) + pagespeedNeed免费·API~25s打分✅在用
9cheap_audit_decisionfinal_score = gbp*0.4 + redesign_need*0.6 → actioncheapAuditV2即时·$0打分✅在用
10exclusion_final3 层排除 (数据质量/业务类型/时机)runExclusionFilter (with cheapAudit)即时·$0排除✅在用

━━━ 昂贵分界线 ━━━

仅作证据(不当门):域名年龄 (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

ProfitsLocal 核心业务 8 个 Milestone

2026-06-04。当前只考虑 roofer niche。目标不是多做工具,而是把一条可复制的业务闭环跑通:找到好客户,确认值得做,生成可信资料,做出网站样本,再把它卖出去。

总目标

把 roofer lead 做成一条稳定流水线:

lead 进入系统
→ 快速排除
→ 找出高潜客户
→ 背景调查和身份确认
→ master.md 总档案
→ 建站资料包
→ 一页网站样本
→ audit 和事实检查
→ 销售材料
→ outreach
→ 结果回写

商业判断:

Milestone 1 · 业务现状盘点清楚

目标

把当前 roofer lead 池讲清楚:谁已经排除,谁值得继续,谁缺资料,谁可以进入建站资料包,谁只能做内部概念。

当前依据

产出

完成标准

Milestone 2 · 快速筛选规则定死

目标

把便宜、快速、不花钱的检查提前,用它们排除大多数不适合客户。

优先使用的快工具 / 快信号

筛选结果

完成标准

Milestone 3 · 搜索和身份确认流程跑稳

目标

解决核心风险:搜出来的结果到底是不是同一个客户。

两条入口

AI 判断重点

搜索结果分层

完成标准

Milestone 4 · master.md 分层写入

目标

所有进入系统的 lead 都有 master.md,但内容不能混成一锅。

master.md 要承接

分层规则

完成标准

Milestone 5 · 建站资料包跑通

目标

master.md 抽出 Design / 建站能直接使用的资料,而不是让模型随便读一大坨资料乱写。

当前稳定路线

core-extract.json
→ site-ctx.json + facts.json
→ handoff/content/*
→ handoff/od-package/content/*
→ single-page-brief.yaml
→ 网站文案和页面

必须保护的事实

完成标准

Milestone 6 · 第一个完整客户样本跑通

目标

拿一个真实客户跑完整闭环,验证不是纸面流程。

推荐样本

Mr Roof Solutions。

原因

产出

完成标准

Milestone 7 · 销售材料和 outreach 包跑通

目标

网站做好之后,要变成能卖的材料。

销售包至少包括

完成标准

Milestone 8 · 批量复制和结果回写

目标

把单个样本变成可重复系统。

批量动作

排序标准

完成标准

推荐推进顺序

  1. 先完成 Milestone 1:把当前 roofer lead 状态表锁清楚。
  2. 再补 Milestone 2:把快筛排除规则变成可执行清单。
  3. 然后推进 Milestone 6:用 Mr Roof Solutions 跑第一个完整样本。
  4. 样本跑通后,回头用 Milestone 7 生成销售包。
  5. 最后进入 Milestone 8:批量挑 Top 5,开始复制。

当前下一步

下一步不是再讨论大方向,而是进入 Milestone 1:

盘点当前 roofer lead
→ 标出排除 / 保留 / starter / website-ready / sales-ready
→ 每个重点 lead 写下一步动作
→ 把状态同步到 SSOT 页面

Milestone 1 · 当前 roofer lead 状态盘点

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 客户污染。

当前总数

项目数量
本地扫过 entity249
当前 roofer lead247
不适合进入 Design / 建站219
有网站且资料 ready24
无网站 starter 资料 ready4

快筛分布

快筛桶数量当前意思
reject_fast149快速排除,不继续花资源
light_touch58轻触达,不默认深挖
identity_needed12先确认是不是同一个客户
ready_for_deep_research10值得深挖
website_problem_candidate14有网站问题候选
no_website_candidate4无网站强候选

当前可进入建站资料准备的客户

无网站 starter ready

客户评价下一步发布前注意
Mr Roof Solutions65准备 starter 页面输入发布前注意官网 licence 号和 registry/master 不一致;公开文案只用 locked facts
NP Roof Repairs20准备 starter 页面输入缺 ABN;可以做内部概念,公开发布前要补
Ultra Roof Restorations93准备 starter 页面输入缺 ABN;可以做内部概念,公开发布前要补
Prime Roof Restorations29准备 starter 页面输入缺 ABN;可以做内部概念,公开发布前要补

有网站 material ready

客户评价快筛桶下一步
L.J. Ellery Roofing Pty Ltd52website_problem_candidate / ready_for_deep_research去重后再决定是否进 Top 5
Ace Roofing Service37website_problem_candidate / ready_for_deep_research去重后再决定是否进 Top 5
GC Roof Tiling Solutions0ready_for_deep_research检查资料厚度和销售理由
Roof Repair Gold Coast0ready_for_deep_research检查资料厚度和销售理由
Sydney Roofing Specialists0ready_for_deep_research检查资料厚度和销售理由
Queensland Roofing Pty Ltd35website_problem_candidate可进入建站资料包候选
KW Roofing Pty Ltd25website_problem_candidate可进入建站资料包候选
VIP Roofing Brisbane19ready_for_deep_research可进入建站资料包候选
North Brisbane Metal Roofing Pty Ltd62website_problem_candidate可进入建站资料包候选
Geraldton Roofing0ready_for_deep_research有重复记录,先去重
FastFix Roofing43website_problem_candidate可进入建站资料包候选
Ascent Roofing Pty Ltd36website_problem_candidate可进入建站资料包候选
ALL-SIDE ROOFING - Roof Repairs & Roof Restoration Adelaide63website_problem_candidate可进入建站资料包候选
Triple C Professional Roofing184website_problem_candidate高评价,重点看网站是否真的有大问题
Pro Roof Restoration Brisbane18ready_for_deep_research可进入建站资料包候选
Geelong Roofing Pros32website_problem_candidate可进入建站资料包候选
Diamond Roof Tiling & Restoration64website_problem_candidate可进入建站资料包候选
Brisbane Roof Restoration Experts23website_problem_candidate可进入建站资料包候选
Goldfields Metal Roofing22website_problem_candidate可进入建站资料包候选
iFix Roofing86website_problem_candidate已验证为有网站强问题目标,可作为后续样本之一

需要先清理的风险点

1. ready 列表里有疑似非 roofer

C.J Honeysett Plumbing 当前被算进 website_material_ready,但名字明显像 plumbing。它需要进入 roofer-only 清理队列,不能直接进入 Top 5。

2. ready 列表里有重复客户

这些客户至少出现过两条 ready 记录,需要先合并再排序:

3. “资料 ready”不等于“最值得卖”

website_material_ready 只说明资料够准备 Design / 建站,不等于它一定是最好的销售对象。

进入 Top 5 前还要再看:

Milestone 1 结论

当前客户池不是空白,已经有一批可以继续推进的对象:

但进入下一步前,必须先做两件事:

  1. 清理 ready 列表里的非 roofer 和重复客户。
  2. 把 28 个 ready 候选重新按商业价值排序,挑出 Top 5。

下一步

进入 Milestone 2 前,先补一张 Top 5 候选排序表:

28 个 ready 候选
→ 去掉非 roofer
→ 合并重复客户
→ 按“没有网站 / 网站大问题 / 联系清楚 / 资料够 / 销售理由强 / 发布风险低”排序
→ 选出 Top 5

Milestone 1 · Top 5 候选初版

2026-06-04。基于当前本地 ready 候选做的只读排序。不联网、不调用慢工具、不写客户档案。这个表是“下一步优先级”,不是最终销售名单。

排序原则

优先级不是只看“资料 ready”。真正要看商业价值:

  1. 没有独立官网,或者入口没有官网且资料足够。
  2. 有网站但问题很明显,我们的一页网站能明显改善。
  3. 客户能联系到。
  4. 评分和评价数量足够支撑销售。
  5. Design / 建站资料已经够用。
  6. 发布前风险可控,例如 ABN、牌照、官网身份冲突。
  7. 不是重复客户,不是非 roofer。

先清理

当前 28 个 ready 候选里:

Top 5 初版

排名客户类型为什么排前面当前风险 / 注意
1Mr Roof Solutions入口无官网,后期找到官网资料链最完整;评分 4.9、65 reviews;brand kit 和建站资料已通;适合跑第一个完整样本不能简单按“无网站客户”销售;已找到 mrroof.com.au,需要按“官网后期确认”重新看网站问题;官网 licence 与 registry/master 不一致
2Ultra Roof Restorations无网站强候选5.0、93 reviews;无官网入口;已有 starter 资料和外部素材;销售故事清楚缺 ABN,公开发布前要补;内部 concept 不受影响
3Prime Roof Restorations无网站强候选4.8、29 reviews;无官网入口;starter 资料 ready缺 ABN;评价数比 Ultra / Mr Roof 少,销售证据稍弱
4NP Roof Repairs无网站强候选4.7、20 reviews;无官网入口;starter 资料 ready缺 ABN;评价数最低,优先级低于前 3 个 starter
5Triple C Professional Roofing有网站强问题目标5.0、184 reviews;现有网站问题明显;audit 有视觉弱、旧站、高 traction 旧站等信号需要复核网站是不是真的适合一页替换,不要碰太复杂的现有站

Top 5 下一步资源投入表

客户现在该做现在先不做
Mr Roof Solutions跑第一个完整闭环样本:master.md → 建站资料 → 网站样本 → 销售材料;同时把“后期确认官网”写进销售叙事不再花时间证明它“没有网站”;不要公开使用冲突 licence
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 Roofing4.5、86 reviews;已验证为有网站强问题目标适合做有网站 redesign 样本
Diamond Roof Tiling & Restoration4.9、64 reviews;audit 强重做信号需要检查服务区和页面复杂度
North Brisbane Metal Roofing Pty Ltd4.8、62 reviews;audit 强重做信号曾出现重复 entity 风险,先确认唯一客户
L.J. Ellery Roofing Pty Ltd4.9、52 reviews;audit 分数很低,问题强有重复记录,先合并
ALL-SIDE ROOFING4.7、63 reviews;视觉 / 信任问题明显需要确认页面复杂度和销售切入点

Milestone 1 完成判断

Milestone 1 的业务状态已经清楚:

下一步建议

进入 Milestone 2 时,先把快筛规则和 Top 5 选择规则对齐:

快筛排除大多数
→ ready 候选去重 / 去非 roofer
→ 按商业价值排 Top 5
→ Top 1 跑完整闭环
→ Top 2-5 只准备下一步,不立刻花慢资源

第一条完整闭环我仍建议用 Mr Roof Solutions,因为它最接近“能从 master.md 到网站样本再到销售材料”的完整演示。 但销售叙事要写准确:它不是纯粹“没有网站”,而是“入口没有官网,后期确认了官网,因此要把官网现状也纳入对比”。

Milestone 2 · 快筛规则到 Top 5 选择

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 前必须先过这几步:

  1. 是 roofer,或者至少主营 roofing。
  2. 不是重复客户。
  3. 能联系到。
  4. 身份基本可信。
  5. 没有网站,或者网站有明显大问题。
  6. 一页网站能明显帮到他。
  7. 建站资料够,或者补资料成本很低。
  8. 销售理由讲得清楚。

直接排除

这些不进入 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 候选清理结果

当前 ready 候选共 28 个。清理后,真正进入排序池的大约是 24 个。

非 roofer 风险

客户当前状态为什么不能直接进 Top 5
C.J Honeysett Plumbingwebsite_material_ready名字和官网都指向 plumbing,不应混进 roofer Top 5

处理方式:

重复客户

客户重复来源保留哪条做排序
L.J. Ellery Roofing Pty Ltddomain 记录 + Place 记录,同官网 ljelleryroofing.com.au保留有 52 reviews 的 Place 记录进入排序
Ace Roofing Servicedomain 记录 + 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 完成标准

Milestone 2 做完时,应该能回答:

下一步

继续推进时,优先做两件事:

  1. 对 Mr Roof Solutions 做“入口无官网 → 后期找到官网”的路线修正,再决定它的网站样本和销售叙事。
  2. 给 Top 5 每个客户写“下一步资源投入表”:哪些可以立刻做网站样本,哪些只补 ABN,哪些先复核网站复杂度。

Milestone 6 · Mr Roof 第一个完整闭环样本

2026-06-04。目标:用 Mr Roof Solutions 跑第一条完整业务闭环:master.md → 建站资料 → 网站样本 → 事实检查 → 销售材料。这不是批量建站,而是验证整条业务流程能不能从头走到尾。

为什么选 Mr Roof

Mr Roof Solutions 当前最适合做第一个完整样本:

路线修正

Mr Roof 不是简单的“完全没有网站”客户。

准确说法:

入口数据没有官网
→ 按无网站 starter 路线补资料
→ 后期搜索确认 mrroof.com.au 与客户同名同电话
→ 可用官网 logo / brand 作为建站素材
→ 但官网 licence 与 registry/master 有冲突,公开文案必须用 locked facts

所以销售材料不能说:

你没有网站。

应该说:

你在 Google / lead 入口里没有清楚带出可用官网;
我们后续确认了官网和品牌资料,但现有线上资料还需要统一和转化强化。

当前事实边界

可以公开使用

字段当前值来源
Business nameMr Roof SolutionsGoogle Place / master.md
Phone1300 023 230Google Place / confirmed website
Address104 Wynyard St, Cleveland QLD 4163Google Place / single-page brief
ABN76656868905official registry
QBCC15365053official registry / master locked fact
Rating4.9Google Place
Reviews65Google Place
Logo / brandexisting logo brand kitconfirmed website name + phone match

可以给 Design 做文案种子,但不能当硬事实

类型内容边界
Service areaBrisbane, Redlands, Sunshine Coast来自确认社媒正文,可做 copy seed,不写成 footer locked area
Specialtiesroof ventilation, solar whirlybird, roof ventilation可做服务灵感,不写成认证或承诺

只能给销售 / 内部参考

类型内容为什么不能进网站
Awards / social proofABA100® Winner for Eco Innovation in The Australian Brand Awards 2024需要确认这是客户自己的奖项,不是产品或合作方奖项
iSwirl Official installer合作产品 / 第三方品牌背景不能写成客户官方认证,除非再次确认

不能用

字段冲突
官网 header QBCC 15346199与 registry / master locked QBCC 15365053 不一致,不能复制进网站

第一条闭环要产出什么

1. 建站资料

必须已有或生成:

当前状态:已具备,single-page-brief PASS。

2. 网站样本

目标不是做最终上线版本,而是做一个可展示的一页样本。

页面应该强调:

页面不能写:

3. 事实检查

网站样本生成后必须检查:

4. 销售材料

网站样本之后,要生成销售材料:

当前已生成:

产物路径状态
Sales pack JSONclients/mr-roof-solutions/v2/outreach/sales-pack.jsonPASS · 已接入现有截图/视频工具
Sales pack MDclients/mr-roof-solutions/v2/outreach/sales-pack.mdPASS · 给人看的销售材料
Email draftclients/mr-roof-solutions/v2/outreach/email/01-draft.mdPASS · 备用,不是主路线
Desktop screenshotclients/mr-roof-solutions/v2/outreach/screenshots/desktop.pngPASS · 1440 x 8674
Mobile screenshotclients/mr-roof-solutions/v2/outreach/screenshots/mobile.pngPASS · 390 x 9914
Scroll videoclients/mr-roof-solutions/v2/outreach/demo.mp4PASS · 现有 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
licence 冲突已记录PASS
现有 composer 已跑出 editorial-output/index.htmlPASS
starter 事实锁测试PASS · scripts/test/test-cycle27-starter-fact-locked-compose.mjs
identity fact verifyPASS · 0 finding
audit-v4 fastBLOCKED · 事实/品牌 PASS,但内容量不足
sales pack safety testPASS · scripts/test/test-cycle27-mr-roof-sales-pack.mjs · 6 checks
outreach capture assetsPASS · 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/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

当前 audit-v4 fast 结果:

T1: PASS
T2: 91/100
Composite: N/A_BLOCKED
Reason: GATE 3 · minimum_content_signal · services 4 / suburbs 2 / reviews 1 · need 3/3/(1 or banner)

业务判断:

Milestone 7 · Outreach 使用与回写闭环

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
→ 销售看板识别为 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 = 客户资料和销售记录的长期保存位置

Profile 必须保存的联系渠道

每个进入系统的 lead,不管最后做不做,都必须在 profile 里集中保存所有能联系客户的入口:

渠道用途
邮箱可以发 cold email / 回复跟进
电话可以电话 / 短信 / WhatsApp 判断
官网判断有没有网站,也给后续 audit / 背景调查用
Contact us 页面没有邮箱时优先用表单触达
Google Maps / GMB核对商家身份、地址、评论入口
Social profile linksFacebook / Instagram / LinkedIn / TikTok / YouTube / WhatsApp 等
地址判断地区、服务范围、同名公司冲突
推荐触达方式AI/规则给销售人的建议,比如 call_or_contact_form

当前统一字段:

record.contactProfile

它会被后台 /admin/leads 使用,显示在 lead profile、CRM 快照、审计表格和搜索里。这样销售时不用到处找邮箱、电话、官网、社媒和地址。

真实看板状态:

字段当前值
clientmr-roof-solutions
stagemockup_ready
packclients/mr-roof-solutions/v2/outreach/sales-pack.json
markdownclients/mr-roof-solutions/v2/outreach/sales-pack.md
assetsdesktop / mobile / scroll video ready
channelcall_or_contact_form
emailnot verified, 不作为主路线

为什么 M7 很重要

筛选和建站做得再好,如果销售动作没有回写,就会出现三个问题:

所以 M7 的核心不是“写一封更好看的 email”,而是:

销售动作必须回到 v2/outreach
销售结果必须改变看板状态
客户回复必须成为后续 master.md / 网站 / 报价的输入

当前已接通的回写位置

所有 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

事件怎么记录

1. 第一次联系

使用:

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

2. 客户回复

客户明确回复时,记录 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 回复
→ 决定补资料 / 发样本 / 进入报价 / 继续跟进 / 跳过

3. 安排下一次跟进

如果客户没回,但有明确下次动作:

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

4. 跳过

如果连续跟进无意义,或者客户明确不适合:

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

5. 成交交接

客户明确有兴趣并进入正式报价 / 成交时:

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 写回 v2PASS · scripts/test/test-cycle27-roofer-outreach-note-v2.mjs
写回后看板进入 follow-upPASS
master.md 能显示 outreach historyPASS · 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

master.md 如何吃回写记录

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不使用不进入任何下游

当前规则:

复杂回复用 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

仍要继续补的地方

下一步必须补:

M7 当前结论

M7 已经从“有销售材料”推进到“销售材料能进入看板,第一次触达/跟进能回写,master.md 能显示 outreach history,并且客户回复事实会先分层”。

但 M7 还没有完全结束,因为“客户回复事实 → 自动刷新 site-ctx / 网站 / audit”的触发规则还要继续接。

模块 7 · 建站内容(中文)

目标:说明 master.md 之后,系统怎么把客户资料变成网站可用的事实、文案、服务、评价、覆盖区域和最终建站输入。

一句话

模块 7 不是“让模型读 master.md 随便写网站”。

它分两条线:

  1. 事实线:确定性生成,不能编。
  2. 文案线:LLM 写 hero、服务、about、FAQ,所以必须被事实锁和质检管住。

当前稳定顺序:

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 依据:

事实线:不能编

1. core-extract.json

core-extract.json 的核心是 brief.real_facts。这里放的是已经从客户资料、官网、评价、GBP 等来源抽出来的事实。

后面电话、地址、ABN、服务、服务区、评价、品牌信号,优先从这里走。

2. pl:extract-site-ctx

命令:

npm run pl:extract-site-ctx -- --slug <slug> --force
npm run pl:extract-site-ctx -- --slug <slug> --write-content --force

它读取:

它写出:

代码依据:

注意:reviews.jsoncoverage.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,所以是风险最高的一段:可能写得空、写得夸、或者把没有核实的东西写成承诺。

代码依据:

打包线:编辑稿和渲染稿分开

当前有两个内容目录:

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/*

代码依据:

旧文案保护

如果编辑稿比渲染稿新,pl:compose-editorial 默认会停,不会悄悄用旧文案。

修法:

npm run pl:assemble-handoff -- --slug <slug> --skip-checkpoint

或者渲染时加:

npm run pl:compose-editorial -- --slug <slug> --auto-assemble

代码依据:

最终事实锁:single-page-brief.yaml

命令:

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 开工包 v1

当前不要再走旧的 design-handoff.md / Open Design handoff 路线。带 pl:build-design-handoff 的旧命令已经被 _deprecated-guard 默认封住;它属于旧路,不是现在的建站主线。

现在给 Design / 建站看的开工包分两层:

Logo / brand 入口

brand_tokens_path 不是手工随便补一个颜色文件。它应该来自 logo / brand skill 的产物。

现有 skill 路线:

情况用哪个 skill结果
客户已有 logo:官网、截图、PNG、JPG、PDF、SVG、社媒头像等existing-logo-brand保真转换,输出 SVG variants、source audit、brand tokens、视觉规则
客户没有 logo,或者无网站 starter 没有可用 logologo-design新设计一个 website-ready logo / brand kit
一批 lead 批量处理,先记录状态和缺口local-brand-logo 的 batch lead mode每个 lead 记录是否有 logo、用哪个模式、输出目录、下一步
明确要高级感 / 高端 logopremium-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

代码依据:

写入这个目录后,single-page-brief.yamlbrand_tokens_path 应指向:

clients/<slug>/v2/handoff/od-package/brand/brand-tokens.css

这层解决的是“网站有品牌基础”,不是“客户已经批准最终 logo”。无网站 starter 可以先用 demo brand kit 做销售预览,但必须在销售材料里标清:logo / brand 可替换,不能假装是客户现有官方 logo。

Logo 设计语言边界

brand kit 不只是 logo 图片。它至少应该把这些设计语言写清楚:

现有 skill 已经会产出:

visual-style-contract.md
agent-handoff.md
brand-assets.md
logo-qa-checklist.md

这些文件现在是给建站 agent / 人审读的视觉规则层。后续增强必须复用这层,不要另开一套“设计语言说明”。

A. starter 概念开工包

用于“无网站客户先做一版 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 可以用:

Design 不能用:

B. 发布前事实锁

发布前必须再跑:

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;官网 licence 号和 registry/master 不一致,发布文案只用 locked facts
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 区域候选,所以“服务区数量不足”的发布前卡点已解除;但这些只是“附近区域候选”,不能写成客户亲口确认的服务区。

代码依据:

渲染器读取顺序

pl:compose-editorial 读取:

内容优先级大致是:

区块优先读取不够时兜底
herohero-copy.jsoncore-extract 公式
servicesservices.jsoncore-extract 服务列表
aboutabout.mdcore-extract narrative
reviewsreviews.jsoncore-extract 真实评价
coveragecoverage.jsonsingle-page-brief.yaml / real_facts

代码依据:

发布前的内容保护

模块 7 至少有这些保护:

  1. pl:data-checkpoint

- 数据太薄会挡住建站。 - 如果服务文案文件存在但为空/像停放域名,会变 RED。

  1. pl:validate-single-page-brief

- 检查最终事实锁。

  1. pl:compose-editorial freshness guard

- 防止用旧文案渲染。

  1. ctx-snapshot.json

- 渲染后记录每个区块到底用了哪个来源。

代码依据:

当前结论

模块 7 已经有一条能跑的主路。

事实线相对稳:core-extract.jsonsite-ctx.jsonsingle-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

模块 8 · 网站渲染(中文)

目标:说明网站 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

代码依据:

输入

pl:compose-editorial 会读:

代码依据:

默认模板

默认模板:

templates/roofing/editorial-newsletter/template.html

可选已收录模板:

npm run pl:compose-editorial -- --slug <slug> --template trade-classic

模板规则:

代码依据:

默认是单页

当前 Phase B 只支持 roofing 单页网站。

不是多页站,不是整站 LLM 自由生成,也不是 OD daemon。

代码/文档依据:

质量门

生产渲染不能绕过 checkpoint.json

pl:compose-editorial 默认会:

  1. 要求 checkpoint.json 存在。
  2. 如果 checkpoint.verdict === RED,直接停止。
  3. 检查编辑稿和渲染稿是否有旧稿问题。

--skip-checkpoint 只能开发/排查时用,不能当生产路径。

代码依据:

输出溯源

渲染后会写:

editorial-output/ctx-snapshot.json

它记录每个区块用了哪个来源:

这个文件后面排查“页面上这段话从哪里来”很有用。

代码依据:

图片

图片有三类来源:

  1. 客户真实图片。
  2. stock-library 里的行业图。
  3. layout-plan 指定的图片。

默认路径会复制 stock 图片和已有真实项目图。使用 --use-layout-plan 时,如果计划里指定了真实图片但文件不存在,会直接停止,不会默默换成别的。

代码依据:

Logo / brand 如何影响模板

现有模板系统已经吃进去一部分品牌信息:

代码依据:

但当前还要诚实区分:

当前状态后续方向
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 去写另一套网站生成器。

可选增强:layout-plan / block / recipe

有一套新的灵活模块系统,但它不是默认批量主路。

命令:

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:

关键边界:

代码依据:

旧渲染路已经封住

不要走:

这些命令有 seal guard,默认会拒绝运行。

代码依据:

当前结论

模块 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

模块 9 · 网站质检(中文)

目标:说明网站渲染完成后,哪些检查会拦发布,哪些只是建议;以及手机端、事实错误、假牌照、内容太薄分别由谁抓。

一句话

网站建完不能直接发。当前质检分三类:

  1. 发布硬门:数据不够、手机端硬问题、事实/身份错误、内容太薄。
  2. 网站质量分:品牌、结构、证据、视觉、文案密度。
  3. 买家视角建议:文案有没有打动目标客户。

主要命令

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

代码依据:

发布硬门

发布前按顺序看:

  1. checkpoint.json

- RED:不发布。 - YELLOW:只能预览,并且页面要有 preview 提醒。

  1. single-page-brief.yaml

- GREEN 客户必须有,并且要能验证。

  1. 最小内容量

- 服务不能太少。 - 覆盖区域不能太少。 - 评价没有真实内容时,页面要明确是预览/占位。

  1. 手机端硬问题

- 390px 不能横向溢出。 - 手机端要有 sticky CTA。 - 关键按钮/输入区域要够大。

  1. 快速质检分

- T1 事实检查要过。 - 品牌/语气/证据/事实交叉检查不能明显低。

文档依据:

代码依据:

pl:copy-audit 管什么

pl:copy-audit 主要管两件事:

  1. 确定事实不能错。

- 商家名。 - 电话。 - 地址。 - ABN。 - 牌照。

  1. 文案不能密度太离谱。

- hero 副标题太长。 - 服务描述太长。 - about 太长。

它不会因为普通营销话术、轻微泛泛而自动挡发布。那些是建议,不是硬门。

代码依据:

pl:audit-v4 管什么

pl:audit-v4 是主质检工具。

fast 版:

npm run pl:audit-v4 -- --slug <slug> --tier fast

主要看:

full / premium 版会加视觉和设计判断,成本更高,结果会受模型波动影响,所以需要看模型和多次运行统计。

代码依据:

手机端是硬门

手机端不是“扣一点分”。

这些会直接挡发布:

代码依据:

pl:persona-copy-audit 管什么

这是买家视角文案审查。

它会问:这个页面对这个客户画像有没有说服力?

它看 8 项:

但它是建议,不是批量硬门。Matthew 可以用它来判断“这页值不值得发”,但系统不应该只因为这个分低就自动挡所有发布。

代码依据:

当前结论

模块 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

Roofer 业务流程 6 阶段推进目标

2026-06-03。当前只考虑 roofer niche。目标不是手工做业务,而是把 lead 从进入系统到 Design / 建站可开工这条流程理顺、跑通、清掉冲突。

总目标

把 roofer lead 做成一条可重复的流水线:

发现客户
→ 判断入口是否已有可信官网 / Google Place / 基础身份
→ 有官网/Place:先便宜快速筛选
→ 无官网/Place:先搜索确认身份,找到官网再合流,找不到官网但是真公司就走无网站 starter
→ 分层采集和 audit
→ master.md 总档案
→ 销售资料 + Design / 建站资料包

这条线的硬原则:

双入口主线 · 2026-06-03 锁定

入口进来时通常有什么第一段该做什么搜索什么时候做合流点
Maps / Docker / Places API公司名、电话/地址、评分/评价、place_id,可能已有官网先跑便宜初筛:GBP、官网首页、PageSpeed、页面规模、license、ABN后期补背景、社媒、第三方资料初筛后进入详细审计 / 后置补强 / Design 资料包
图片 / 公司名 / license 数据可能只有名字、图片、license 记录;官网和 place_id 不确定先搜索找官网、Google Map、place_id、电话、地址第一步就搜索找到官网并确认同一家公司后,回到“有官网便宜初筛”;找不到官网但是真公司,走无网站 starter

这个锁定解决一个旧混乱:搜索不是一个固定阶段。 它的位置由入口资料决定。

已核实依据

阶段 1 · 身份确认和背景资料归属

目标 先把“搜出来的这个页面是不是同一个客户”跑稳。没有这个,后面会把别人的官网、评价、社媒、论坛帖子混进客户档案。

要解决

当前完成

本阶段验收

验收状态 · 2026-06-03

阶段 2 · master.md 分层写入

目标 每条 lead 的所有资料都进入 master.md,但不是混成一锅。要分清正式事实、外部背景、销售参考、待确认、丢弃原因。

要解决

本阶段验收

当前进度 · 2026-06-03

- 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。

阶段 3 · roofer 初筛和排除标准

目标 把一直变化的筛选标准定成一张表:哪些直接排除,哪些只是观察,哪些会提高优先级,哪些进入人工少量复核。

要解决

本阶段验收

当前进度 · 2026-06-03

- 牌照风险只观察,不自动踢。 - PageSpeed 慢是销售证据,不是淘汰门。 - 页面规模是硬门:前端导航页太多会提前归档。 - 快筛幸存者统一 predict=C + audit_now=true;真正 A/B/C/D 在详细审计后给。

阶段 4 · 分层 audit 和资料采集

目标 把 audit 拆成便宜快跑和贵的深跑。先用免费工具和本地工具筛出值得深挖的客户,再跑 PageSpeed、完整网站 audit、视觉审计、Places 付费接口等。

要解决

本阶段验收

当前进度 · 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,不重复跑。

阶段 5 · 销售资料和 Design / 建站资料包

目标master.md 自动抽出两类资料:销售要用的说服材料,Design / 建站要用的开工材料。

要解决

本阶段验收

当前进度 · 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_candidate219快筛后不该给 Design:快速排除、先补身份、轻触达等
website_material_ready24有网站问题 / 值得深挖客户,已有详细审计、截图、master.md,可准备 Design 资料包
starter_material_ready4无网站强候选,已有基础资料 + 至少 2 个硬证据,可准备 starter 页面输入
starter_material_gap0当前无网站强候选已无资料缺口

4 个无网站强候选已经全部从 starter_material_gap 升到 starter_material_ready,并且已经接入当前建站事实链。现在不再只是“资料够”,而是已经能生成 starter 版 core-extract.json,再进入 site-ctx.jsonsingle-page-brief.yaml

但这里必须分清两层:

starter_material_ready = 可以准备 starter 页面输入
validate-single-page-brief PASS = 发布前事实锁通过

当前 4 个 starter 都已有概念开工包。Mr Roof Solutions 已先跑通 logo / brand kit 链路,其余 3 个还不是发布就绪:

客户发布前事实锁当前卡点
Mr Roof SolutionsPASS已用确认官网 mrroof.com.au 的现有 logo 做 website-ready brand kit;官网 licence 号和 registry/master 不一致,发布文案只用 locked facts
NP Roof RepairsFAIL缺 ABN;starter/demo brand kit 已生成,本地 QBCC 只返回弱匹配,不能用
Ultra Roof RestorationsFAIL缺 ABN;starter/demo brand kit 已生成,本地 QBCC 只返回弱匹配,不能用
Prime Roof RestorationsFAIL缺 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 没有可用 logologo-design 生成 starter/demo brand kit
批量处理很多 leadlocal-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 / 建站资料包
→ 不够就只补缺口,不扩大乱搜

阶段 6 · 清理、退役和固定主路

目标 把冲突、过期、被证伪的文档和代码处理掉,让项目只剩一条清楚主路。

要解决

本阶段验收

当前推进点

现在继续阶段 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

下一步检查重点:

阶段 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 / 建站事实。

ProfitsLocal 客户筛选标准(中文)

2026-06-03 · 第一版。目的:把不断变化过的客户筛选逻辑重新分清楚。 核心问题不是“谁分数高”,而是“谁是我们这种单页网站产品真正能服务的客户”。

一句话

我们的目标客户不是所有本地商家,而是:

有真实业务、有转化机会、现有线上形象有明显问题,并且一个标准单页网站就能明显改善结果的客户。

所以筛选要分三层:

  1. 先把所有便宜、快速、不花钱的工具前置跑一遍。
  2. 能排除的先排除,先清资源。
  3. 再从幸存者里判断谁是强目标。
  4. 最后才决定是否投入慢工具、付费 API、深度审计和 Design 资料包。

这一层对应命令:

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 覆盖等已经在第一轮或进入慢工具前使用
只观察但已跑1license 本地库已跑,但只记录风险,不自动踢客户
还没全自动第一轮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_routesearch_timingnext_step 放在一起。打开单个 lead 的总档案,就能知道它为什么继续、为什么轻触达、为什么停。

快筛之后怎么决定能不能给 Design

筛出来以后,不是马上建站。还要过一层“资料能不能开工”的只读检查:

npm run pl:design-material-readiness -- --all-roofers --markdown

这条命令回答:

当前全 roofer 回放:

资料状态数量下一步
not_design_candidate219不给 Design;按快筛桶停止、补身份或轻触达
website_material_ready24可以准备有网站 redesign 资料包
starter_material_ready4可以准备无网站 starter 页面输入
starter_material_gap0当前无网站强候选已无资料缺口

这个结果说明:第一轮筛选的核心不是“找到很多客户”,而是把 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 SolutionsQBCC / ABN + GBP 基础资料未补商户照片前不做项目图片 claim
NP Roof RepairsGBP 基础资料 + 6 张 Places 商户照片牌照弱匹配候选不进 real_facts
Ultra Roof RestorationsGBP 基础资料 + 6 张 Places 商户照片牌照弱匹配候选不进 real_facts
Prime Roof RestorationsGBP 基础资料 + 6 张 Places 商户照片牌照弱匹配候选不进 real_facts

补充进展:搜索/enrich 资料不再只是旁边放着。现在已新增一层 external_material

当前 4 个 starter 已开始跑外部正文挖掘。结果不是“搜索到就写入”,而是按客户分化:

客户外部正文结果是否进入 Design
Mr Roof Solutions写入 6 个 external_facts:服务、服务区、专长、奖项、认证、social proof2 条进入 Design;奖项 / social proof 给销售核实;iSwirl 相关只作背景参考
NP Roof Repairsdry run:Facebook 能确认同一客户,但没有挖到可用事实;多个目录页空抓取或不够确定不进入
Ultra Roof Restorations写入 2 个 external_factsservice_listsuburbs_served;Facebook 主页确认同一客户2 条进入 Design
Prime Roof Restorationsdry run:目录页能辅助背景确认,但没有达到可写入线或没有可用事实不进入

这证明搜索/enrich 的定位应该是:先排除错误来源,再补强少数高价值客户;不是把所有搜索结果都塞进网站资料包。

2026-06-03 真实回放补充:


目标客户画像

我们想要的客户

类型为什么适合
没有独立网站,但有真实业务和口碑我们做一个网站,价值很直接
有网站,但网站老、慢、难用、手机端差我们能用单页网站直接改善转化
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

路径 A · 没有网站

业务逻辑

没有网站的客户,理论上最容易说明价值:我们给他一个可打开、可提交表单、能介绍服务的站。

但它的问题是:资料更少。没有官网可抓,就要靠 Google Search、Places、GBP、评价、外部结果去确认这家公司到底是谁。

关键判断

问题判断
是不是真公司必须用电话、地址、Places、评价、牌照或外部资料确认
有没有足够业务信号至少要有名称、电话或地址、服务类别、地区
有没有口碑或活动痕迹GBP 评分 / 评价 / 照片 / 营业时间有帮助
能不能写页面服务、地区、联系方式不够就不能硬编

适合继续的情况

容易卡住的情况

路径 B · 有网站

业务逻辑

有网站的客户,我们不能只说“你有网站”。我们要找到会影响转化的核心问题:

关键判断

问题判断
问题够不够大网站问题要能影响转化
我们能不能解决单页网站能解决,而不是要迁一整个复杂系统
页面规模合不合适前端导航页太多就不适合标准产品
是否已有成熟运营如果广告、分析、blog、CRM 都很重,可能不是目标客户

适合继续的情况

不适合继续的情况


当前筛选层级

第 1 层 · 直接排除

这些情况不值得继续投入。

当前主要依据:core/leads/exclusion-filter.jscore/scoring/lead-grading.js

信号处理原因
没电话、没邮箱、没网站,补资料后仍没有归档无法联系 / 无法确认
已关店归档不是真目标
测试名 / demo 名归档数据污染
行业不匹配归档不是目标客户
政府 / 学校 / charity归档不符合产品
web design / SEO / marketing 同行归档不是客户
大企业 / 评论数远超行业阈值归档不是快交付客户
评分很低且评价不少归档口碑问题比网站问题更大
近 12 个月刚重做网站归档销售时机不对
页面规模超过产品包归档一个标准单页解决不了

第 2 层 · 只观察,不直接踢

这些信号有用,但不应该单独决定归档。

信号当前处理原因
牌照过期 / 吊销观察必须先确认同一家公司,避免误伤
PageSpeed 慢加重做价值慢是机会,不是坏客户
没 ABN / 没牌照观察 / 发布前谨慎不能编造,但不一定挡内部预览
外部资料说法参考需要身份确认和来源标记
社媒 / 外部提及参考可做背景,不自动变核心事实

第 3 层 · 加权判断

这些决定客户优先级,不一定直接挡住。

信号用途
GBP 评分判断业务可信度
评价数判断业务规模和口碑基础
是否有网站分成没网站路径 / 有网站路径
图片数量判断素材是否足够
官网问题判断重做价值
手机端体验判断是否影响转化
CTA / 表单问题判断我们能否改善

A/B/C/D 和 ready-to-build 不一样

这里必须分清。

A/B/C/D · 销售优先级

当前依据:core/scoring/lead-grading.js

等级含义
A值得全力追,口碑强、网站问题明显
B值得做预览试探
C批量轻触,不主动重投入
D跳过 / 归档

A/B/C/D 回答的是:这个客户值不值得我们投入销售精力。

ready-to-build · 资料够不够开工

当前依据:core/scoring/qualification-scorecard.jspl:data-checkpoint

ready-to-build 回答的是:资料够不够给 Design / 建站用。

一个客户可以是 B,但资料不够开工。 一个客户也可以资料够,但销售优先级不高。


初筛之后 · 下一步怎么选

初筛结束后,不是直接跑所有工具。先把 lead 分到下一条路。

当前下一步只允许这些:

下一步什么时候选继续做什么不做什么
停止后续投入已归档、D 级、行业不对、页面规模超出、明显不是目标客户保留 master.md 和归档原因不再跑 Docker reviews / Places / Firecrawl / Playwright
身份和资料补查没官网、资料薄、同名多、官网/社媒/目录页不确定是不是同一家公司搜索、OpenCLI、Tinyfish 读正文、电话/地址/地区核对不把候选来源直接给 Design
无网站高口碑 · 补资料没官网,但有电话/地址,rating ≥ 4.5,review_count ≥ 20Docker reviews、Places Details、图片候选、服务/地区补全不跑 Playwright / Firecrawl,因为没有官网
有网站 · 进详细审计有独立官网,通过页面规模和排除规则,但还没有 detailed auditPlaywright 抓站、截图、表单、手机端、详细打分不先跑 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 放在一起。

这就是“初筛之后选择下一步”的标准,不是按工具顺序硬跑。

2026-06-04 · 全 roofer 回放结果

这次回放只读本地资料,不联网、不调用 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 / 图片时补;不是“必须花钱”
无网站资料补强4Docker 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。

成本分层详见:

ProfitsLocal 成本分层筛选(中文)

2026-06-03 · 第一版。目的:把“先用免费快工具筛,再决定是否进入耗资源审计 / 付费 API”这件事讲清楚。

一句话

筛选客户不能一上来就跑全套深度审计。正确顺序应该是:

免费 / 秒级
→ 免费 / 几秒到几十秒
→ 免费但慢一点
→ 付费 API / 视觉 / 深度审计
→ 建站资料整理

每往下一层,成本和时间都更高,所以必须先问:

这一层拿到的信息,能不能帮我们判断“他是不是我们的目标客户”?


分层总表

前置快筛原则 · 先清资源

从现在开始,顺序要改成:

所有便宜 / 快速 / 不花钱的工具
→ 先集中扫一遍
→ 能排除的先排除
→ 只把留下来的潜力客户交给慢工具 / 付费工具

对应命令:

npm run pl:frontloaded-screening-plan -- --markdown

第一轮清资源现在只用这些;搜索归属判断也已接到无官网 / 身份不稳的第一步:

顺序工具主要作用
1lead 原始字段排除非 roofer、假数据、已归档、完全无法识别
2Google Maps / GBP 自带字段用评分、评价数、类目、官网状态判断业务基础
3roofer 行业相关判断排除非目标行业、供应商、平台、同行
4三层排除预检抓首页 / PageSpeed 前先挡明显不合格
5官网类型判断防止把社媒、目录页、报价平台误当官网
6Tinyfish / direct fetch 首页免费读首页,判断官网是否可用、是否像同一家公司
7首页基础质量快扫看 HTTPS、手机 viewport、CTA、电话、内容薄、陈旧年份
8页面规模 / 产品适配导航页太多、业务太复杂,直接挡掉
9PageSpeed / Lighthouse 免费额度只做重做价值证据,不当硬否决
10license 本地库观察查牌照风险,但身份没确认前不自动踢
11ABN / WHOIS / Wayback查公司身份、域名年龄、是否刚重做
12搜索结果 title/snippet + AI 同一公司判断没官网 / 身份不稳时先确认同一家公司
13master.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 已有字段排除假数据、行业不对、没联系方式
L1L0 没排除免费 / 秒级GBP 字段、review_count、rating、category、websiteStatus判断业务基础和大概价值
L2有官网时免费 / 几秒Tinyfish / direct-fetch 首页看官网是否薄、旧、没 CTA、没电话
L3有官网首页 HTML 后免费 / 秒级页面规模、viewport、基础 HTML 检查判断是否一个单页产品能解决
L4L2/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 和销售证据

L0 · 免费秒级:基础排除

目的 先踢掉明显不值得看的。

看什么

信号怎么处理
没公司名、没电话、没网站直接排除或先补资料
已关店排除
测试名 / demo 名排除
行业不匹配排除
政府 / 学校 / charity / 同行排除

现有依据

业务解释

这一层不解决“好不好”,只解决“是不是明显不该继续”。


L1 · 免费秒级:GBP / 地图初筛

目的 判断这个客户有没有基本业务价值。

看什么

信号用途
电话能不能联系,没网站客户尤其重要
地址判断真实业务和服务地区
rating业务口碑
review_count业务规模和可信度
category是否目标行业
websiteStatus分成没网站 / 有网站两条路径
image_count是否有素材基础

现有依据

怎么用

情况下一步
没网站 + 有电话 / 地址 + GBP 信号还行进入“没网站路径”继续补资料
有网站 + 口碑不错进入官网快扫
评价极少 / 评分差降低优先级或归档
类目不对归档

L2 · 免费快:Tinyfish / direct-fetch 首页快扫

目的 有网站的客户,先只看首页,不跑全站。

看什么

信号为什么有用
没 HTTPS明显信任问题
首页文字很薄可能是空壳站 / 模板站
没本地城市 / suburblocal SEO 和信任弱
电话不在首屏转化问题
没 CTA客户不知道下一步
年份过旧维护差
没 Services/About/Contact/Reviews/FAQ结构薄
没 mobile viewport手机端可能坏
表格布局 / 低质量图片老旧信号

现有依据

业务解释

这一层是“有网站客户”的关键初筛:不需要完整 audit,只要首页已经暴露明显转化问题,就值得继续。


L3 · 免费快:页面规模 / 产品适配

目的 判断这个客户是不是一个标准单页网站能服务的。

当前标准

信号处理
前端导航页 ≤ 20可以继续
前端导航页 > 20归档 / 超出产品包
没有导航页数据用 sitemap 内容页 fallback
sitemap 内容页 > 500安全归档

现有依据

业务解释

这一步不是看客户有没有价值,而是看我们能不能交付。 如果他的网站太复杂,一个单页产品解决不了,就不是当前目标客户。


L4 · 免费但稍慢:PageSpeed / Lighthouse

目的 性能问题是很好的销售证据,但不应该作为单独否决门。

看什么

信号用途
mobile performance慢说明重做价值更强
LCP / FCP / CLS / INP变成客户能理解的“打开慢 / 跳动 / 不稳定”证据
HTTPS / basic perf辅助判断老站问题

当前处理

现有依据


L5 · 免费:牌照 / ABN / 域名历史

目的 补信任事实,同时发现风险。

工具

工具成本用途
license SQLite免费本地查牌照候选 / 已确认牌照
ABN / ABR免费公共 API工商登记
WHOIS/RDAP免费公共 API域名年龄
Wayback免费公共 API是否刚重做、历史状态

怎么用

信号处理
确认牌照 / ABN可以进入建站事实
候选牌照但没确认同一家公司只观察
牌照过期 / 吊销只观察或人工判断
近 12 个月刚重做可能归档,销售时机不对
域名很旧、站很旧增加重做理由

重点

牌照不能乱写。必须先确认是同一家公司,才能进建站事实。


L6 · 免费但慢:Docker reviews / Playwright 简审

目的 对 L0-L5 里看起来值得的客户,补更强证据。

工具

工具成本 / 时间用途
Docker Google reviews免费 / 30-60 秒拉更多评价,比 Places 5 条更丰富
Playwright免费 / 30-60 秒截图、表单、移动端、真实页面体验
本地 LLM / Ollama免费 / 慢评价总结、视觉初判、身份辅助

什么时候跑

只给通过前面免费快筛的客户跑,不给每条线索默认跑。

2026-06-03 锁定触发条件

工具允许触发不触发写回位置能不能给 Design 用
Docker reviewsA/B 候选、高评价没网站客户、销售需要真实评价主题时L0-L5 已经排除、评分/评价太薄、同一客户还没确认master.md 的评价 / 口碑 / 销售资料区真实评价可用;AI 总结只做销售参考
Playwright 详细抓站有官网并且快筛活下来,或需要截图 / 表单 / 手机端证据页面规模已超、官网明显不是客户官网、无网站 starter 路径detailed-audit fixture、audit report、master.md 旧站问题区截图和表单事实可用;问题解读给销售 / 设计参考
本地 LLM / Ollama评价总结、视觉初判、同一客户辅助判断没有原始资料时不能编事实观察区 / 销售资料区不能单独当事实来源

代码核对:


L7 · 付费 / 耗资源:深度资料和深度审计

目的 只对值得继续的客户花钱或花大时间。

工具

工具成本什么时候用
Google Places Details付费,约 $0.017 / 次需要官方电话、地址、营业时间、少量评价
Places photos付费确定要建站 / 需要素材时
Firecrawl付费兜底免费抓取失败且客户值得
视觉 LLM订阅 / 慢已过筛,需要视觉审计或页面质量判断
完整 detailed audit时间更长通过便宜筛选后

原则

这层不是用来“找客户”的,而是用来“确认和丰富已经值得看的客户”。

2026-06-03 锁定触发条件

工具允许触发不触发写回位置能不能给 Design 用
Places Details需要官方电话 / 营业时间 / types / photo refs,且客户已是 B+ 或人工指定只是为了初筛、同一客户没确认、已有足够官方事实entity.latest.places_enrichmentmaster.md 核心事实 / 素材候选官方字段可用
Places reviewsDocker 不可用,或只需要官方少量评价补充每条 lead 默认跑、C/D 客户、没有 place_idreview fixture → master.md 评价区原文评价可用;只限真实返回内容
Places photos确定值得建站、需要真实图片素材时还没过筛、图片只为初筛图片素材候选区需质量筛选后可用
Firecrawl免费 direct-fetch / Tinyfish 拿不到足够页面,且客户已经值得继续默认抓站、初筛找客户、低价值客户multi-page crawl 结果,标记来源只用抓到的原始页面事实
视觉 LLM已有截图并需要判断视觉老旧 / 信任感 / 转化问题没截图、同一客户没确认视觉审计 / 销售证据作为设计方向,不当事实

代码核对:


推荐的筛选顺序

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

当前需要补清楚的决策

  1. 没网站路径的最低资料门槛:没有官网时,至少要哪些字段才继续。
  2. L6/L7 实跑样本:用 5 个真实 roofer 记录耗时、失败率、有效信息量。
  3. 资料包抽取边界:哪些评价 / 图片 / 官网内容能进入 Design,哪些只能做销售参考。
  4. PageSpeed 的使用方式:保持“销售证据 / 重做价值”,不要变成误伤客户的硬门。

2026-06-03 代码核对结果

这次核对后,可以先锁住以下现状:

层级状态代码证据结论
快筛 10 道便宜关卡已接上core/leads/fast-filter.js:17SSOT 页面“快速筛选漏斗”直接从这份代码生成
昂贵分界线已接上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=Caudit_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 分数直接决定是否进审计”不准确。分数解释重做机会和排序;真正挡住的是排除规则、页面规模门、后续资格硬门。

2026-06-03 · L6/L7 5 个 roofer 样本回放

命令:

npm run pl:l6-l7-trigger-replay -- --markdown

这次是 report-only:只读本地 entity / fixture,不联网、不调用 Docker、不调用 Places、不发 Discord。

样本

客户当前状态为什么选它
iFix Roofingready-to-build · B · 86 reviewsB/ready,高口碑,应该触发后置补强
A & J Roofing Solutionsoutreach-active · C · 有官网C 客户,应该证明不会默认花钱
Ultra Roof Restorationsqueued_for_audit · 无网站 · 93 reviews没网站但口碑强,应该走无网站补资料
Brisbane Roofing Solutionsarchived · D · 118 reviews高评价但已归档,应该停止所有慢/付费工具
Vicwest Roofingoutreach-active · C · 已有 Places + reviews已有资料,应该避免重复跑

回放结果

工具runalready_donefallback_onlyafter_places_detailsholdskip
Playwright 详细抓站030002
Docker reviews210002
Places Details210002
Places reviews012002
Places photos000212
Firecrawl000032

结论

  1. B/ready 客户:可以触发 Docker reviews + Places Details;Places reviews 只做 Docker 失败时的补充。
  2. C/outreach 客户:不默认拉评论,不默认跑 Places Details;已有 Playwright 详细抓站就不重复跑。
  3. 无网站但高口碑客户:不跑 Playwright / Firecrawl;应该补 Docker reviews 和 Places Details,让 master.md 有足够事实和评价素材。
  4. 已归档 / D 客户:即使评价很多,也停止所有 L6/L7 慢工具和付费工具。
  5. Firecrawl 本轮 0 个触发;它仍然只是免费抓取失败后的兜底,不是常规步骤。

下一步要打通的判断

本段已把 L6/L7 触发条件锁成表,并完成 5 个 roofer 样本回放。

2026-06-03 追加完成:

  1. 新增 pl:resource-plan-replay,把“目标客户类型”和“资源投入阶段”合并成一张业务判断表。
  2. master.md 的“筛选与去向记录”已经写入 resource_band、现在可跑、暂缓 / 兜底、明确不跑。
  3. iFix / Ultra 已完成 Docker reviews + Places Details 小批量实跑;iFix 进入 Design 资料包,Ultra 继续无网站 starter 素材缺口。

2026-06-04 追加完成:

  1. pl:frontloaded-screening-rules -- --all-roofers --markdown 可以对本地全部 roofer 线索做只读快筛回放。
  2. pl:resource-plan-replay -- --all-roofers --markdown 可以对同一批 roofer 线索做只读资源投入回放。
  3. 当前本地数据:249 个 entity,247 个 roofer 相关;pl:master-md-coverage 通过,249/249 都有 master.md、筛选记录和下一步行动。

全 roofer 快筛结果:

快筛桶数量资源含义
快速排除149第一轮就停止,不跑慢工具和付费工具
先补身份12只做身份确认,不进 Design
无网站候选4进入无网站资料补强
有网站问题候选14可进入详细审计或后置补强
轻触达58保留证据,不默认继续花资源
太好或太复杂0当前没有命中
值得深挖10才允许后续慢工具 / 付费工具

全 roofer 资源投入结果:

资源阶段数量默认动作
stop149停止投入
light_touch39轻触达,不默认加重研究
identity_first17搜索确认同一家公司
deep_audit_allowed16免费本地详细审计优先
slow_free_then_paid16看缺口补强;不等于自动花钱
no_website_materials4reviews / Places / 图片候选补齐
design_ready3抽 Design / 销售资料包
manual_review2人看 master.md 风险
operator_review_before_spend1花资源前复核

这组数字说明成本分层已经有实际效果:先用 L0-L5 便宜工具把 149 条停掉,再把 Docker / Playwright / Places / Firecrawl 限制在少数有把握的客户上。

下一步要做的是:

  1. 验证补回来的图片候选是否按边界进入 master.md / starter 素材区。
  2. 继续找一个“免费抓取失败但值得继续”的真实案例,专门验证 Firecrawl 兜底路径。
  3. 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单独开清理,不挡筛选主线

资料来源 → master.md 写回表(中文)

2026-06-03 · 目标 1 产物。 核心原则:任何 lead 进入系统后,都应该有 master.md;后续筛选、audit、销售、Design / 建站资料,都从 master.md 这份总档案抽。

一句话

master.md 是 lead 的总档案,不是建站后才有的文件。

所以所有资料都要回答 5 个问题:

  1. 从哪里来?
  2. 什么时候跑?
  3. 免费还是付费?
  4. 写进 master.md 哪一块?
  5. 后面能不能用于客户网站?

写回分级

等级含义能不能上客户网站
核心事实已核实的名字、电话、地址、服务、牌照、ABN、评价等可以
建站素材可用于页面结构、服务说明、图片、FAQ、信任块只用已核实部分
销售资料用来写销售报告、外联话术、客户痛点不一定
风险观察牌照风险、资料冲突、身份不确定、页面复杂度不直接上网站
缺口记录缺电话、缺地址、缺官网、资料太薄不上网站

资料来源总表

资料来源工具 / 位置成本什么时候跑写进 master.md后续用途
Maps / gosom 原始线索pl:scrape-docker免费lead 入口公司基础资料、来源、评分、评价数、官网初筛、销售背景
Google Placespl:places-search-intake / Places API付费需要官方资料或补缺时名字、电话、地址、营业时间、少量评价、照片引用身份确认、事实补强
单客户补录pl:single-enrich视来源Matthew 给具体客户时公司基础资料、补录来源人工入口统一进档
路线判断lead-route-decision.js免费每次生成 master.mdentry_routesearch_timingnext_step让运营知道搜索该早做还是后置、下一步该去哪
牌照库pl:license-lookup / SQLite免费身份基本可信后牌照状态、候选、确认程度风险观察;确认后可做信任事实
ABN / ABR公共 API免费需要工商事实时ABN、注册实体、状态核心事实或风险观察
Tinyfish / direct-fetch 首页tinyfishFetchUrls / direct fetch免费有官网时的早期快筛首页问题、电话/CTA/本地词、结构薄厚筛选、销售痛点
PageSpeed / Lighthousepagespeed-insights.js免费额度首页快筛后,值得继续时性能分、LCP/FCP/CLS/INP销售证据,不单独挡客户
页面规模page-scale-gate.js免费有官网 HTML 后前端导航页数、是否超产品包判断能不能用单页服务
WHOIS / RDAPdomain-history.js免费有官网时域名年龄、注册历史销售证据、风险观察
Waybackdomain-history.js免费有官网时是否刚重做、历史状态销售时机判断
Docker reviewspl:docker-reviews-enrich / fetch-reviews-local.js免费但慢高价值客户 / A/B 候选评价样本、口碑主题、可引用评价销售、信任块;不自动退到 Places reviews
Places reviewsfetch-reviews.js付费Docker 不可用或需要官方补充Google 返回的少量评价信任证据
官网多页 crawlmulti-page-crawl.js免费优先,Firecrawl 兜底付费通过快筛后服务、关于、联系、图片、表单、结构化数据master.md、建站素材
外部搜索 / 提及Tinyfish / DDG / mine-background免费身份确认后外部背景资料,单独标来源销售参考,不直接当事实
社媒 / OpenCLIOpenCLI免费但默认后置需要背景时社媒活动、外部状态参考 / 销售,不默认跑
图片 / Places photosPlaces photos / 本地分类付费或已有素材确定值得建站时图片候选、分类理由建站素材,需质量筛选
视觉审计Vision LLM / Ollama fallback订阅或本地通过快筛后视觉年龄、信任感、转化问题销售证据、设计方向
表单 / 手机端 / 截图Playwright免费但慢值得继续时截图、表单问题、手机端问题audit report、销售证据

L6 / L7 资料写回边界

这一段专门锁定“慢工具 / 付费工具”怎么进入 master.md,避免它们重新变成默认初筛。

来源触发条件写进 master.md 哪里Design / 建站能不能用
Docker reviewsA/B 候选、高价值没网站客户、销售需要评价主题评价样本、口碑主题、销售切入点真实评价原文可用;AI 总结不能当事实
Places reviewsDocker 不可用或需要官方少量评价补充官方评价样本、评分 / 数量核对真实评价原文可用;只限 Google 返回内容
Playwright 截图 / 表单 / 手机端有官网并通过快筛旧站问题、截图证据、表单问题、手机体验截图事实可用;问题解释给销售 / 设计参考
Places DetailsB+、人工指定、需要官方电话 / 营业时间 / types / photo refs核心事实、营业时间、电话、素材候选官方字段可用
Places photos确定值得建站,且需要真实图片素材图片候选、来源、筛选状态质量筛选后可用
Firecrawl免费抓取失败,且客户值得继续多页抓取结果,明确标 Firecrawl 来源只用抓到的页面事实
视觉 LLM有截图后判断旧站视觉问题视觉审计、销售证据、设计方向方向可参考,不能编事实

代码来源:

总边界

master.md 可以记录所有来源,但 Design / 建站资料包只能抽已核实事实、真实评价、真实图片、官网原文和明确来源的截图证据。搜索候选、AI 判断、风险观察、未确认社媒内容不能直接抽给 Design。


没网站路径

没网站的 lead 也必须有 master.md

先写入

然后补

补什么工具写入方式
官方身份Places / 搜索 / 电话 / 地址核心事实或身份观察
服务范围GBP 类目、评价、外部资料建站素材候选
口碑Docker reviews / Places reviews销售资料和信任素材
图片GBP / Places photos建站素材候选
牌照 / ABNlicense / ABR风险观察或核心事实

关键判断

没网站客户不是自动通过。要看:


有网站路径

有网站的 lead 也必须有 master.md

先写入

然后补

补什么工具写入方式
首页薄 / 没 CTA / 没电话Tinyfish / direct fetch销售痛点
性能慢PageSpeed销售证据
页面太多page-scale产品适配判断
表单 / 手机端问题Playwrightaudit 证据
视觉旧Vision LLM设计方向 / 销售证据
服务 / 关于 / 联系 / 图片multi-page crawl建站素材候选

关键判断

有网站客户不是自动适合。要看:


写入 master.md 的推荐结构

每个 master.md 应该逐步形成这些块:

内容
入口与来源从哪里发现、搜索词、批次、人工输入
公司身份名字、电话、地址、官网、place_id、身份确认状态
筛选与去向记录entry_routesearch_timingnext_step,说明这条 lead 在哪条路上
免费初筛GBP、评价数、评分、类目、是否有网站、直接排除项
成本分层结果L0-L7 哪些跑了、哪些没跑、为什么
筛选判断直接挡 / 只观察 / 加权参考 / 人工判断
旧站问题有网站时写首页、速度、手机端、CTA、页面规模
没网站资料缺口没网站时写缺哪些事实、需要怎么补
采集资料官网、GBP、评价、牌照、ABN、域名、外部背景
销售切入点为什么客户会在意、我们能解决什么
建站素材服务、地区、评价、图片、FAQ、信任证据
决策记录A/B/C/D、ready-to-build、归档或下一步

哪些能抽给 Design / 建站

可以抽:

不能直接抽:


当前代码 / 流程缺口

这份表是目标状态。下一阶段需要核对真实代码是否已经做到:

  1. lead 进入系统后是否一定生成骨架 master.md
  2. 免费初筛结果是否写进 master.md
  3. 成本分层 L0-L7 跑过 / 没跑是否写进 master.md
  4. 归档 lead 是否仍保留并更新 master.md
  5. 没网站路径是否有专门的 master.md 结构。
  6. audit report 是否全部从 master.md 抽,而不是另起资料源。
  7. Design / 建站资料包是否只从 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 登录态,不是正式客户事实。

结论

登录受限来源主要是社媒:

来源网站链接数涉及客户数账号准备
Facebook3812优先准备
Instagram145优先准备
LinkedIn95优先准备

说明:

OpenCLI 实测状态

2026-06-03 已做只读 smoke test:

项目结果
OpenCLI1.8.1
Daemon已连接
Browser Bridge已连接,当前 profile z3wvy2xe
读取开关ENABLE_OPENCLI_FETCH=1 后可读
LinkedIn smoke testhttps://www.linkedin.com/company/linkedin 读取成功,返回 13,751 字符
备用恢复命令npm run pl:opencli-recover -- --profile z3wvy2xe --smoke-url <url>

备用方案:

  1. 主路:opencliFetch 只读读取 Facebook / Instagram / LinkedIn。
  2. 第一备用:pl:opencli-recover 自动检查 OpenCLI,必要时重启 daemon,并打开独立 Chrome profile /Users/matthew/.opencli/chrome-leads 加载 /Users/matthew/opencli-extension/v1.0.17
  3. 第二备用:如果 profile 没登录对应社媒,保留 login_required 清单,不阻塞 lead 主流程,也不把标题/摘要当事实。
  4. 禁止做法:不能把 dry-run 结果手动写进 core-extract;必须 live smoke 通过,再由 pl:mine-background --write 写入外部资料区。

真实 roofer 样本也已跑过一次:

样本命令结果
A & J Roofing Solutionspl:observe-search-identity --opencli16 个搜索链接;OpenCLI 读完后 login_required=0fetch_failed=0

这次真实样本里,社交来源读完后的归属结果:

结果数量说明
AI 高信心同一客户1Facebook 主页读到正文后,有 owned_domain 证据
可能同一客户3Facebook 照片页、Facebook reviews、LinkedIn 个人页,证据不够强
明确不同3Instagram 帖子读完后判断不是这个客户
需要登录后判断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 高信心同一可能同一明确不同读取失败仍需登录
Instagram602400
Facebook411200
LinkedIn / 地区 LinkedIn301200
Facebook 地区域名202000

对应报告:

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

阶段结论:

当前样本统计

指标数量
已完成客户20
搜索链接282
AI 高信心同一客户95
可能同一客户5
明确不同公司117
登录受限65
抓取失败0

原始来源清单

来源网站链接数涉及客户数建议
facebook.com3612优先准备登录态
instagram.com145优先准备登录态
au.linkedin.com64优先准备登录态
ca.linkedin.com11优先准备登录态
id-id.facebook.com11优先准备登录态
id.linkedin.com11优先准备登录态
linkedin.com11优先准备登录态
ms-my.facebook.com11优先准备登录态

完整机器生成清单:

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

账号准备优先级

  1. Facebook

先登录一个专用账号。当前样本里 Facebook 量最大,且很多 roofer 会把项目照片、评价、营业状态放在 Facebook。

  1. Instagram

第二优先。Instagram 常见内容是项目照片、短视频、施工动态,适合做背景资料和图片线索。

  1. LinkedIn

第三优先。LinkedIn 更常出现负责人、公司员工、职业背景;对 Design 正式事实帮助有限,但对销售背景调查有用。

使用边界

下一步

🏗️ 我们怎么做一个网站(canonical 流程 · 用人话)

这是唯一的建站流程pl:compose-editorial 模板渲染 · 免费 · 可重复 · 不靠外部设计团队、不靠 OD)。 老路(OD 守护进程 / V2 拼装 / 整页 LLM 渲染 / families 模板)已全部封死(32 个废命令一跑就报错)。

第一段:把客户研究透 → master.md

  1. 抓客户(Google 地图 / 牌照库)→ 名字/电话/评分/有没有官网
  2. 筛掉不合适的(太小/关店/连锁/同行)
  3. 审老网站(程序爬 + 打分 12 维 + 视觉大模型看截图)
  4. 定级 A/B/C/D(值不值得做、做哪种)
  5. 出 master.md —— 客户研究档案,后面一切的源头

第二段:master.md → 真网站(5 步 · 全确定性 · $0 渲染)

工具干什么性质
① 深挖背景llm-extract-core融成 core-extract.json锁定事实(ABN/牌照/电话/评分) + 丰富叙述(公司背景/团队/客户原话)大模型 · 事实的真源头
② 抽中间合同extract-site-ctxsite-ctx.json(所有文案工具读它)零 LLM · 确定性 · 已稳
③ 写文案enrich-handoffhero / 服务 / 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),单页。

出网站之后:质检(见「网站审计」tab)

Copy 审计怎么放(前置为主,后置兜底)

Matthew 的判断是对的:copy 不能主要等页面出来以后才审。很多文案、排版、信息边界的问题,建站前多花一点时间更值,后面 audit 再补会很浪费。

现在 copy 分三层:

  1. 生成前 / 打包时先审文案包

写文案源头已经统一注入客户可见边界:services / about / hero 都明确告诉 AI 哪些能发挥、哪些不能编。之后 assemble-handoff 会清洗客户可见文案;site-build-doctorcopy_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 pageoperatorbefore publishingthe page should... 这类容易被复制到页面里的句子。starter customer brief 生成器本身也已改干净,Mr Roof 当前 customer-brief 设计输入检查 = PASS。

  1. 页面出来后再审整体表达

copy-audit 不是用来替代前置检查,而是看最终页面:有没有事实错、文案堆砌、重复、转化弱、上下文不顺、模块组合后读起来不自然。它是兜底,不是主战场。

  1. 重点客户再做人群视角审

准备给 Matthew 看、准备销售、或者客户价值高时,再跑 persona-copy-audit / 人眼快速看一遍。批量阶段不每个都花这份资源。

AI 可以发挥的边界:

Audit 资源怎么花(不要全量乱跑)

原则:能在建站前做对的,不等 audit 后返工;能用轻量工具发现的,不上重型视觉/付费工具。

建站前多花 10 分钟
→ 少做 1 小时 audit 修补
→ 少浪费一次视觉 / full audit / 人工看图
档位什么时候用跑什么不跑什么目的
A · 建站前必做每个准备生成页面的客户data-checkpointsingle-page-brief、brand/logo 检查、layout-plan --auto-recipe、文案包新鲜度视觉 LLM、full audit先把事实、文案、模块、设计方向定好
B · 生成后轻量必做每个已生成页面site-build-doctorcopy-auditaudit-v4 --tier fastaudit-v4 full/premiumpersona-copy-audit 批量跑免费/低成本地挡住事实错、内部话泄漏、转化点缺失、基础品牌问题
C · 值得推进客户高价值、准备给 Matthew 看或准备销售desktop/mobile 截图、scroll video、人工快速视觉看一眼、必要时 persona-copy-auditfull/premium 反复跑确认页面真长得像一个能卖的本地业务网站
D · 重点客户 / 发布前高把握客户、准备正式发布或给客户认真演示audit-v4 full/premium --vision-runs 3、视觉模型、设计风格复核、截图留档无意义重复 fast audit花钱/花时间买更强确认
E · 暂缓接入当前不是瓶颈,或主要审老网站PageSpeed、AI GEO、图片优化、form audit、third-party weight 等未接主线模块不放进每个建站样本等主链稳定后,按销售价值逐个接,不一次性全接

截图要做,但要放对位置:

当前推荐顺序:

资料 checkpoint
→ 文案和模块计划
→ brand / logo / design language
→ 生成页面
→ site-build-doctor
→ copy-audit
→ audit-v4 fast
→ 截图 desktop/mobile
→ 重要客户:persona-copy-audit / full vision audit / 人眼复核

三条要记住的

  1. 事实可靠、文案要打磨:电话/牌照/评分走确定性、锁死;真功夫在第③步把事实变成好文案。
  2. 只有一条建站路compose-editorial 模板渲染。
  3. 老路全封死:32 个废命令一跑报错(PL_ALLOW_DEPRECATED=1 才能强行跑,仅供重测)。

当前优先级:先把网站制作跑顺

现在先不优先做 sales,也不急着加一堆新模板。建站主链路要先能稳定回答:

数据输入够不够
→ AI copy 有没有生成、有没有同步到渲染稿
→ logo / brand kit 能不能被模板吃到
→ single-page-brief 事实锁有没有
→ 模板和 layout-plan 用的是哪条路
→ HTML 有没有生成,来源快照有没有
→ 电话 / 表单 / Logo / 品牌色 / 社交账号 / FAQ 有没有真正进页面
→ owner / 经验 / 社媒主页这些证明材料有没有真实来源,候选帖子不能直接进 footer
→ customer-brief 给设计代理前有没有清掉内部操作说明
→ audit 卡在哪个门

新增体检命令:

npm run pl:site-build-doctor -- --slug <slug>

它只读文件,不调用大模型,不改客户资料。输出每一站的 PASS / WARN / BLOCK 和下一步建议命令。

新增的「本地营销稳定检查」专门防这类浪费:

新增的「证明 / 触达补强」专门防这类误用:

新增的「无官网 / 社交证据」接法:

当前 Mr Roof 真实体检结果说明:

网站已经能渲染
AI 文案包齐
brand / logo 基础齐
single-page-brief 已存在
layout-plan 已存在,recipe = trust-heavy
服务区域 = 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。
  页面本身已经过 fast audit,可用于 starter preview / sales pack;
  但不叫最终发布 ready,直到薄资料补强为 GREEN。

所以接下来建站主线的优先顺序是:

  1. 让每个候选客户都能跑 pl:site-build-doctor,一眼知道卡在哪。
  2. 先补资料和内容闸门,让页面从 preview/starter 稳定进入可 audit 状态。
  3. 再打开 layout-plan --auto-recipe / --use-layout-plan,把 FAQ / trust-heavy / local-seo 这类模块真正渲染进页面。
  4. 模板新增放最后:只有现有 2 个模板和 recipe 不能覆盖真实客户时,再按 template inventory SOP 增加。

真实样本验证:

A-J Roofing Solutions
问题:FAQ 资料已经存在,layout-plan 也有 FAQ,但旧 HTML 没按 layout-plan 渲染,所以 FAQ 没进页面。
修法:pl:compose-editorial --auto-assemble --use-layout-plan
结果:site-build-doctor = ship_ready,audit-v4 fast = SHIP,copy-audit = APPROVE。

Mark Squire Roof Restorations
问题:FAQ 里写了 “Are you VBA licensed?”,但最终事实锁是 `license.status=omit`,不能显示牌照确认。
修法:渲染前自动过滤牌照确认类 FAQ;没有锁定牌照号就不让这类问答进页面。
结果:copy-audit 从 REJECT 变 APPROVE,site-build-doctor = ship_ready。

Vicwest Roofing
问题:FAQ / team / guarantee 有资料但旧页面没按智能模块渲染;另一个误报是页面写 `Victorian Building Authority`,事实锁写 `VBA`。
修法:`pl:plan-layout --auto-recipe` 选出 `trust-heavy`,再 `compose --use-layout-plan`;事实检查器接受常见牌照机构简称/全称。
结果:site-build-doctor = ship_ready,audit-v4 fast = SHIP,copy-audit 从 REJECT 变 APPROVE。

Mr Roof Solutions
问题:这是 thin-data / starter-preview 样本。页面能生成,但旧 `core-extract/site-ctx` 的 FAQ 和 hero 种子里一度残留 “starter page / before publishing / SEO coverage claims” 这种内部提示;另外 audit 旧规则会把 “2 个区域 + 完整地址” 错误挡在 Gate 3。
修法:生成前统一清洗客户可见文案;FAQ 守门不只查 licence,也会把内部建站 FAQ 拿掉;site-build-doctor 同一规则查 `site-ctx` 种子、`customer-brief` 设计输入、文案包和最终 HTML;`audit-v4` 与 brief 规则对齐,完整地址支撑的 2 个区域可预览,不再 BLOCK;checkpoint 不再要求 AI 编评论,Google 评分/评论数可作为无 quote 的证明摘要。
结果:site-ctx 种子 PASS,customer-brief 设计输入 PASS,本地营销稳定检查 PASS,copy-audit = APPROVE,audit-v4 fast = SHIP;checkpoint YELLOW,所以整体是 preview_ready,不是最终发布 ready。

当前架构的自由度(灵活模块系统 · R170-R184 · codex 全程签字 ✅)

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:哪个积木放哪个区、什么条件出现),排版大脑按客户数据自动拼装。

- FAQ 常见问题 — 有 ≥3 条真实问答才出现(放服务区后) - 质保承诺带 — 核实过有质保年限才出现(放评价区后);只读已有质保数据、不新增任何信息源 - 施工流程 — 通用流程文案;默认关(配置 optional_blocks.include_generic_process),要开再开

安全底线:实时渲染仍走老的整页模板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(Matthew 钦定 · 综合分加权)

最终综合分 = 这 5 项加权:

P0权重看什么
内容准确 content_accuracy25%电话/牌照/ABN/地址有没有写错或造假(确定性硬核对 · 错就直接挂)
文案质量 copy_quality25%事实性 / 语气 / 具体度 / 说服力(4 个子维度,大模型判 + 校准过)
品牌还原 brand_fidelity20%配色/字体/logo 有没有忠实落地
内容丰富 content_richness15%信息够不够厚、有没有空洞
设计一致 design_consistency15%视觉/排版/留白/可读性

二、三层检查(各管一段)

  1. T1 确定性检测器(7 个 · GATE-A 硬门):硬事实核对 · 出处追踪 · 套话泄漏 · 服务/信任/占位符检查。不靠大模型猜——能挂就挂。
  2. T3 视觉大模型:看真实截图判 布局/字体/配色/可读性/文案厚度(受 vision 置信度把关)。
  3. 移动端否决(mobile veto):手机上点击区太小/排版崩 → 直接否决,分数再高也不发。这是 AU 本地生意的铁规。

三、为什么"牛"

四、当前标定基线(editorial-newsletter)

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
→ 确保内部提示、待确认话术、不能展示的事实不进页面

页面生成之后
→ copy-audit 看最终页面诚实度 / 重复 / 堆砌 / 转化表达
→ audit-v4 看 5 个 P0 + 移动端
→ 重点客户再跑 persona-copy-audit / 人眼看

所以 copy-audit 是成品兜底,不是唯一文案把关;能在建站前审掉的问题,必须在建站前审掉。

六、薄资料 starter 的服务区域规则

不要再用“8 个区域”挡 starter 网站。

核心里程碑(中文)· 我们收集什么 · 用什么工具 · 成本 · 有什么用 · 用没用上

6 个里程碑,覆盖一条线索从数据采集到网站上线。每个标清楚:产出什么 · 内容结构 · 工具 · 免费/付费(成本) · 时间 · 用途 · 写手→读者 · 闸门 · 弱/没用时该怎么办。 数据使用状态:✅ 已接进流程 · 🔭 有工具但偏后置/默认不跑 · ❌ 建了但没被调用 · ⚠️ 花钱/贵。更新于 2026-06-03(模块 3 采集核对)。

⚠️ 数据使用状态总览(你最关心的"有没有用到流程里")

数据/能力工具成本状态
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 社媒抓取属于偏后置能力;继续核对它们什么时候该跑,避免一开始就增加成本。

里程碑 1 · 数据采集 / 富集(master.md 之前的输入)

里程碑 2 · master.md · 汇总档案(漏斗底部的基石)

里程碑 3 · 建站前审计 · 客户现状网站(筛选 + 销售角度)

里程碑 4 · 能不能开工 · 数据就绪闸门 + 交付前审(codex 说这是最该补的里程碑)

里程碑 5 · 交给设计 / 渲染的包(od-package · 锁定契约)

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 章(事实/品牌/内容/架构/图片/审计/边界/建站指令)

里程碑 6 · 建站后审计 + 上线(发布闸门)


销售/外联(结账→Stripe→改稿→发布 · SALES_FUNNEL)是下游业务流,用上面这些产出,但不算"建站核心里程碑",本页先不展开。

项目路线图(中文 · 实时维护)

这是我们按它推进的计划,也是 Matthew 唯一看的页面。状态:✅ 已实现(线上跑) · 🔭 已建·只观察(不真动手,等放行) · 🔄 计划中(还没建/没批)。 所有 SSOT 文档都在本页"文档索引"列出 + 在"锁定决策"tab 里能读。命令 npm run pl:publish-business-map 重新发布本页。更新于 2026-06-02。

📌 进展日志(最新在上)

- 摸清现状(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 暂缓。

📚 文档索引(SSOT · 全部在 docs/v3/

关键的两份已渲染进本页 tab("锁定决策"=CANONICAL §0 · "漏斗清单/控制层"=技术细节)。完整源文件在仓库 docs/v3/

一、整条漏斗(多入口 → 一个身份 → 成本分级筛选 → master.md → 建站)

入口(都收敛成"一个公司身份")

统一流程(所有入口共用)

成本分级筛选(最便宜的先筛)

深度采集 + 产出

二、身份识别 + 金标准(精度优先 · 误认率必须 0)

三、控制层(Discord / Agent / Skill · 模块化)

四、建造顺序(codex 定 · 我们按这个推)

  1. 漏斗记账上线pl:run-funnel --rollup · 看每层淘汰多少 · R148)
  2. Phase B 页面规模修复(前端导航页门 + 救回 24 客户 · R149)—— 刚完成
  3. Phase 2 · master.md 整合(外部资料 + 精选图片汇进建站素材 · codex R154 审计签字)—— 刚完成
  4. Phase 3 · 身份写入通道(先"提议+观察",真写入等金标准 300-500 通关 · 你已暂停
  5. 🔄 Phase 4 · 采集骨干(SPEC-GATHER-MODULE):✅ Phase A 免费爬虫已上线(默认翻成免费·砍 Firecrawl);🔄 剩 Phase D 验证模型 + Phase C 统一采集接口
  6. 🔄 重爬 83 个无抓取记录的被错杀客户(等下游稳定后批量做)

五、"新筛选逻辑"现状(你问的)

核心文档(中文)

业务过程中的核心文档,三类:C 从头梳理模块 + B 每个客户产出的文档链 + A 定义流程的 SOP(只列核实在用的,旧的/不确定的标清楚)。 状态:✅ 核实在用 · ⚠️ 代码在用但文档可能有偏差(待核) · 🗑️ 旧的别看。更新于 2026-06-03。

C · 从头梳理模块(当前推进用)

这组文档是为了把业务从 SSOT 页面往下拆清楚,再一层层推进:

B · 每个客户产出的文档链(业务的实物产出)

一条线索走完流程,会沉淀这条链(clients/<slug>/v2/)。带 ★ 的是"数据之记录"(CANONICAL 认定的核心,其余多是实验/历史 churn,别被淹没):

顺序文档是什么哪一步产出(writer)★记录
1data/leads/entities/<id>.json线索档(名字/电话/地址/状态/历史)发现:pl:scrape-docker/pl:places-search-intake/pl:lead-discovery
2handoff/od-package/facts.json + multi-page-crawl/ + photos/富集产物(事实 + 爬取页 + 选好的照片)富集:pl:enrich-entity + pl:places-enrich + 图片分类(vision)
3core-extract.json核实过的事实(real_facts 带来源;本会话加了 external_facts 外部资料)pl:llm-extract-core / buildCoreExtract
4master.md核心:背景 + 审计 + 建站素材(这条链的基石,21+ 章)leads:build-master-md
5single-page-brief.yaml建站 brief(12 项交叉校验)pl:build-single-page-brief
6checkpoint.json数据够不够建站的闸门(RED/YELLOW/GREEN)pl:data-checkpoint
7internal-audit-report.html + customer-facing-audit.html审计报告(内部 + 客户版)leads:run-pipeline / pl:build-customer-audit
8editorial-output/index.html渲染出的网站pl:compose-editorial
提醒:客户目录里还有 40+ 个文件(audit-a/b/ccore-extract-codex/ollamacomparison-* 等)= 实验/历史 churn,不是核心。核心就上面这 8 个(带 ★ 的 6 个是数据之记录)。

A · 流程 SOP(只列核实在用的 · 按阶段)

每份都对着代码核实过 CLI 是否还在、是否接进线上。✅ 才放,⚠️/🗑️ 标清楚。

发现 / 进件

审计

数据就绪 / 建站准备

渲染 / 建站

销售 / 运营

⚠️ 代码在用、但文档可能有偏差(待核对,先别全信文档)

🗑️ 旧的 · 别看

锁定决策(中文视图)

这是 CANONICAL.md §0 的中文版。锁定 = 没有实证 + codex 共识不能改。 权威源是英文 docs/v3/CANONICAL.md(codex/agent 读英文)。更新于 2026-06-02(v1.7)。

建站 / 渲染侧(已锁定)

管线 / 数据(已锁定)

筛选侧(本会话新加 · 见路线图)

废弃路径(别复活 · 除非满足重测条件)

控制层(中文)· Discord / Agent / Skill

漏斗怎么被触发、任务怎么排队、谁来执行、哪些检查负责发现“用户看不见”的失败。更新于 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 回写"]

对应代码:

Discord 入口

入口状态说明
#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/,核心字段是:

模糊任务会进 human,不会硬跑。操作员可以用 reaction 做 retry / archive。

漏斗入口

pl:run-funnel 是获客漏斗的轻量入口。

它串联:

注意:

容易混淆的命令

pl:pipeline-all 名字像“全流程”,但它不是获客漏斗。

它真正做的是:

Agent / Hermes

当前状态:

Skill 层

现在真正进入运行时的 PL skills 主要是 3 个数据型 skill:

它们由 scripts/cli/skills-build.jsSKILL.md 生成 JSON,给审计、文案口吻、页面结构使用。

其他 profitslocal-* skills 多数是说明书 / 工作流 / agent 提示,不是自动运行器。

Doctor 检查

检查用途
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 漂移

本轮实测状态:

当前最大缺口

  1. 旧的“选错入口”问题已补三层。

已补:模型提示词不再暴露 pl:scrape-docker;执行器遇到 pl:scrape-docker 但没有 --batch-id 会直接失败并发可见提醒;intake-doctor 会检查最近 batch 是否有 Discord thread,且用 Discord API 抽查是否存在。

  1. 发布已有最小 Discord 入口,但还没有完整 Hermes 外壳。

现在 Discord 可把 publish <slug> to <email> 路由到 pl:ship-customer;缺邮箱或 slug 会转人工。Hermes 可调用包装还没做。

  1. 建站发布不是一个完整自动按钮。

还没有一条已锁定路线从“图片 / 链接 / 找客户”一路跑到“发布 + Discord 回写 + SSOT 更新”。

  1. pl:ship-customer 交付写回已补,仍需非 dry-run 验证。

真实发布完成后会写 cf-pages-deploy.jsonentity.deploy。下一步用一个客户跑非 dry-run,确认线上 URL、表单邮件、publish-doctor、Discord profile card 都同步。

下一步

  1. 给 M3 发布补 Hermes 可调用外壳。
  2. 处理 skills:check 漂移和 lead-journey-doctor 旧数据红灯。
  3. 整理图片 / 链接入口到下游的实际接法。