{"as_of":"2026-10-08T18:58:39Z","schema_version":"2026-09-22.1","changelog":[{"at":"2026-09-22","field":"sites / sites_live / runs_published / pages_* / findings","change":"不再计入我们内部验收用测试账号建的站(变更当天还没有这类站,数值不变)","reason":"我们开始用专门的测试账号在线上完整走一遍建站流程来做验收。这些站由我们自己建、只用来检验产品,不是任何客户的站;计进来会让站数和页数看起来比真实使用多。它们存在期间不计,拆掉之后也不把它们的数补进累计量 —— 所以累计量不会因为这次变更回退。原先就计入的内部试点站(includes_internal_pilots)照旧计入,不追溯剔除。"},{"at":"2026-09-02","field":"sites_torn_down","change":"口径注补齐两个窄口径（数值不变；读取失败时由 0 改为 null）","reason":"第十六轮实测点名：这个字段返回 0，而**同一个返回体的 changelog 自己写着我们拆过一个站** —— 读者（含 AI 抓取器）只会得出「他们在自相矛盾」。两个数其实各自都对，错的是没说它们的范围不一样：①**自 2026-08-25 起计**（把拆除贡献冻进墓碑的机制是那天上线的，此前的拆除没有可累加的记录）；②**只计曾经发布过的站**（建到一半、从没发布过页面的站被拆掉，这个数不加 1）。★所以它是一个**下限**，不是「我们一共拆过几个站」。另：读取墓碑归档失败时（连接抖动/权限/数据坏了）此前静默回落成 0 —— 那会让累计量在没有任何东西报错的情况下悄悄缩水，正是 08-25 拍板要杜绝的那件事。现改为 null（没数到），与「真的是 0」分开。"},{"at":"2026-09-06","field":"suspended / suspended_reason","change":"新增两个字段：存活站为 0 时整份数字下线","reason":"v4 §4.4 把存量测试站整体拆掉之后，这份报告会诚实地读 0 —— 而一个写着「0 个站现在还活着」的公开页，对读者说的不是「我们在换代」，是「这家没有客户」（老板 2026-09-06 裁决：不接受读 0）。一个数都没有改写 —— 下线与造假是两件事：发 0 会被误读、编一个数是撒谎、这一轮不发是第三条路。3.0 案例站建出来之后自己恢复。"},{"at":"2026-08-25","field":"pages_written","change":"历史值 1045 → 1014（向下重算 31）","reason":"我们拆掉自己的测试站 dgchuanghe-r2 时，本字段是对【当前存活行】做 count(*)，那个站的 page_built 事件随之被删 → 历史被追溯改写。★不是口径变更：本字段的算法（count where kind='page_built'）自 2026-08-13 建立起从未改过，重烤发的是 site_rebaked、从来不在本字段里。已改为 append-only（拆除时把贡献冻进墓碑，累计量永不回退）；★但那一次拆除发生在修复之前、无墓碑归档，那 31 页不可复原 —— 我们不回填一个推算的数把 1045 凑回去。"},{"at":"2026-08-25","field":"topics_cut_by_gate / site_rebakes / sites_live / pages_published_live / sites_torn_down","change":"新增五个字段","reason":"原先只有 pages_cut_by_gate（站级闸裁掉已建成的页），而拦截点已前移到选题层（topic_dropped）—— 只报前者会让读者把“闸在变好”读成“闸停了”；重烤与存活数同理，各自单列并写明口径。"}],"coverage":{"markets_open":46,"langs_open":15,"markets_held":[{"code":"MY","lang":"ms"},{"code":"TH","lang":"th"}],"free_lang":"en","max_langs_paid":15},"sample":{"sites":91,"sites_live":14,"suspended":false,"suspended_reason":"","runs_published":98,"pages_published":519,"pages_published_live":84,"pages_written":2885,"pages_cut_by_gate":158,"topics_cut_by_gate":949,"site_rebakes":1191,"sites_torn_down":77,"first_publish_utc":"2026-09-07","includes_internal_pilots":true,"scope":{"sites":"含内部试点站。★**累计量（append-only）**：建过就算，之后被下线拆除也不会把它从历史里抹掉 —— 拆站是一个新事件，不是对历史的撤销。想知道【现在还活着几个】看 sites_live，拆除过几个看 sites_torn_down","sites_live":"当前还存活的站数（会因拆除而减少，这是它的本意）","pages_published_live":"当前存活站的已计费页数（同上，会减）","sites_torn_down":"已下线拆除的站数。拆除有三种来路：我们自己的试点/测试站、客户主动删除账号、免费站到期（免费站只活 30 天，到期真删）。★★这个数有**两个窄口径**，不一起读就会把它误读成「我们从没拆过站」：①**自 2026-08-25 起计** —— 把拆除贡献冻进墓碑的机制是那天上线的，在那之前拆掉的站没有留下可累加的记录，**不在这个数里**（本返回体 changelog 里 pages_written 1045→1014 那一条，说的就是其中一次）；②**只计曾经发布过页面的站** —— 一个建到一半、从没发布过的站被拆掉，这个数**不加 1**。★所以请把它读成**下限**：真实拆除次数只会比它多，不会比它少。★null = 归档没读出来（不是 0）","pages_published":"只算【已计费】的运行 —— 内部试点站不写计费表,故不计入(宁可少算,绝不多算)","pages_cut_by_gate":"站级质量闸【裁掉已经建成的页】的次数 —— 不含选题层拦截(那是下一条)","pages_written":"首次写出一页的次数 —— ★**不含整站重烤**（重烤是拿新渲染器把已有的页重新烤一遍，内容会真变、体积会真降，但不是新写的页），它的数在 site_rebakes","site_rebakes":"整站重烤的次数（一次 = 一个站被新渲染器重新烤过一遍）。★单列而不并进 pages_written：把“新写的页”和“重新渲染的页”混成一个数，读者就再也分不出哪些是新内容","topics_cut_by_gate":"选题层【压根不让它成页】的次数(词与产品对不上 / 内容太薄等)。★闸越早拦越好,所以这个数上升、pages_cut_by_gate 下降是【闸在变好】,不是闸停了"}},"thresholds":{"sites":30,"pages_published":300},"sample_sufficient":true,"findings":{"buyer_question_sources":{"n_runs":14,"n_pages":171,"by_source":{"benchmark":69,"catalog_attr":2,"conversion":13,"no_demand_ref":22,"signal":7,"sku_demand":4,"suggest":38,"topic":4,"trust":12},"source_labels":{"benchmark":"对手 SERP 头部页对标","catalog_attr":"目录属性页","conversion":"转化页(联系/询盘)","no_demand_ref":"没有需求信号支撑的页","sku_demand":"单品真实需求命中","suggest":"Google 搜索联想","topic":"实体层选题(产品事实驱动)","trust":"信任页(工厂/资质)"},"source_kind":{"benchmark":"search_signal","catalog_attr":"structural","conversion":"structural","no_demand_ref":"structural","sku_demand":"derived","suggest":"search_signal","topic":"derived","trust":"structural"},"unlabeled":["signal"],"scope":"已发布运行的【最后一次】建设产物,逐页的需求出处(这页凭什么存在)。只出来源通道名 —— 原始搜索词、店铺域名、对手域名一个字都不出。"},"language_mix":{"n_sites":14,"by_lang":{"en":14},"sites_multilang":0,"markets_of_lang":{"en":["AU","CA","GB","IE","IN","NG","NZ","PH","SG","US","ZA"]},"scope":"站点建站时选定的**语种**(同一站多次运行取并集,按站计一次)。★这不是国家分布:客户选的目标国家在入口就被折成语种落库,国家本身没有留存,语种→国家是一对多,反推不回来。markets_of_lang 给的是「该语种覆盖哪些市场」,**不等于**「这些国家被客户选过」。"},"search_volume_tiers":{"n_runs":0,"n_terms":0,"measured":0,"unmeasured":0,"tiers":{"0":0,"1-99":0,"100-999":0,"1000-9999":0,"10000+":0},"scope":"方案产物里【主语种】选题的逐条月搜索量(DataForSEO 真值)。★「真的没人搜」(0 档)与「这个词没测出量」(unmeasured)是两件事,分开计 —— 把后者当 0 会让长尾看起来比实际更长。副语种选题不在这份产物里,故不计入。"},"gate_cut_rate":{"n_runs":13,"runs_without_gate_record":1,"pages_kept":163,"pages_pruned":2,"pages_rewritten_for_difference":0,"pages_deferred":4,"cut_rate":0.0121,"scope":"分母 = 该运行【最后一次】建设里真正进了质量闸的页(发出的 + 被裁的)。★不用「累计写出过的页次」当分母 —— 它会随打回重跑膨胀,分母越大率越好看,等于这个数自己会往好里漂。重写(拉开差异)与延后发布不计入 pruned:它们不是拒稿。"}},"findings_status":{"buyer_question_sources":"computed","language_mix":"computed","search_volume_tiers":"computed","gate_cut_rate":"computed"},"will_publish":["buyer_question_sources","language_mix","search_volume_tiers","gate_cut_rate"],"license":"https://creativecommons.org/licenses/by/4.0/"}