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-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、老板名等硬字段仍不能被搜索资料覆盖。site-ctx:当前 external_material 都是 0,说明通道已接好,但这些客户还没跑“抓正文 → 挖 external_facts”。下一步要对 4 个 starter 的搜索候选跑 pl:mine-background,让搜索资料真正产出可用素材。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 素材移到销售/人工核实。core-extract.brief.external_facts 仍为空,避免污染。目标 把一直变化的筛选标准定成一张表:哪些直接排除,哪些只是观察,哪些会提高优先级,哪些进入人工少量复核。
要解决
本阶段验收
当前进度 · 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。
新增主线命令:
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 | 已生成 core-extract.json / site-ctx.json / single-page-brief.yaml;还缺品牌 tokens、更多服务区 |
| NP Roof Repairs | 基础资料 + Google reviews + 6 张 Places 商户照片 | 已生成 core-extract.json / site-ctx.json / single-page-brief.yaml;牌照仍只作弱匹配候选,不当事实 |
| Ultra Roof Restorations | 基础资料 + Google reviews + 6 张 Places 商户照片 | 已生成 core-extract.json / site-ctx.json / single-page-brief.yaml;牌照仍只作弱匹配候选,不当事实 |
| Prime Roof Restorations | 基础资料 + Google reviews + 6 张 Places 商户照片 | 已生成 core-extract.json / site-ctx.json / single-page-brief.yaml;牌照仍只作弱匹配候选,不当事实 |
这条检查把阶段 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 已重跑 site-ctx,但 external_material 仍为 0;原因是这 4 个还没跑外部正文挖掘。下一步不是再定规则,而是对这 4 个的候选来源跑 pl:mine-background,把搜索结果变成可用素材。
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 也不能从外部资料直接进网站文案,必须先人工/强来源确认是客户自己的奖项。external_facts 为空,避免把 dry-run 结果当正式资料。| 类型 | 为什么适合 |
|---|---|
| 没有独立网站,但有真实业务和口碑 | 我们做一个网站,价值很直接 |
| 有网站,但网站老、慢、难用、手机端差 | 我们能用单页网站直接改善转化 |
| 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/牌照状态 | 不硬编内容 |
| 准备 Design / 建站资料包 | ready-to-build,且已核实事实足够 | 从 master.md 抽已核实事实、真实评价、图片和截图证据 | 不抽搜索候选、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 字符 |
真实 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
阶段结论:
| 指标 | 数量 |
|---|---|
| 已完成客户 | 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)compose-editorial 模板渲染。PL_ALLOW_DEPRECATED=1 才能强行跑,仅供重测)。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。
建站链 ⑤ 渲染出 editorial-output/index.html 之后跑:copy-audit(诚实)→ audit-v4(5 P0 + 移动否决)→ persona-copy-audit(买家分)。全过才算"可发"。
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 社媒抓取属于偏后置能力;继续核对它们什么时候该跑,避免一开始就增加成本。
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 旧数据红灯。