每个工具页底部那行「最后核对」到底说明了什么(附站内 376 条的日期分布)
369 条记录停在同一天不是腐烂,是批次。日期能证明什么、不能证明什么,哪些字段坏得快,以及怎么用 30 秒自己复核一次。
全部数字来自 2026-09-18 对 376 条已发布记录的一次统计:日期分布数 `lastVerifiedAt`;「开源 / 有 API」取布尔字段 `openSource`、`hasApi`;「提到免费」= `pricing.detail.zh` 含「免费」或 free;「同一行含金额」= 该串再出现数字;「无数字」= 该串不含 0-9。长度统计按字符数取中位数。复算:`npx tsx` 里 `import { tools } from "@/lib/tools"` 后按上面的字段统计,或跑 `npm run validate:tools` 看时效那行。180 天窗口与 30 天提前预警写在 `src/lib/growth-snapshot.ts`(`catalogFreshness`,窗口默认 180 天、提前 30 天提醒),由 `scripts/validate-tools.ts` 调用——是代码常量,不是口头承诺。模型类数据基准日期:2026-09-15(数据集更新后此日期与正文数字一并复核)
先说结论:那行日期是一句范围声明,不是一句保证
每个工具详情页底部都写着「最后核对 2026-08-29」。它不承诺「核对日之后还这样」, 它承诺的是「这句话是在那天、对着官网和定价页写下的」。这两件事的差别,就是这篇文章的全部内容。
一、站内的日期长什么样
376 条已发布记录的 lastVerifiedAt 只有三个取值:2026-08-29 有 369 条,2026-09-14 有 4 条,2026-09-15 有 3 条。
所以「369 条停在同一天」听起来像整站三年没更新,其实是反过来的:我们做一次全量核对,绝大多数条目就是在那一天写就的;
之后只有零星条目因为改动过内容而单独复核。用 npx tsx 读站内同一个加载器(src/lib/tools,发布口径 376 条)就能数出来。
为什么这个分布重要:判断一个目录站靠不靠谱,不能看「有没有日期」,要看「日期是怎么分布的」。 如果 376 条里有 300 个不同的日期,说明维护是零敲碎打的,坏掉的条目会被新条目掩护; 如果全挤在一天(我们就是这样),说明有一次明确的普查,普查日之后的变化它一概不知道——这句话应该由站点自己说, 而不是等读者发现。
二、日期能证明什么、不能证明什么
能证明:
- 这一行不是抄来的口号。我们抄进
pricing.detail.zh的都是当天官网上的原文,例如「免费 / Plus $20/月 / Pro $200/月」。 - 我们敢把它写成可反驳的形式:任何人当天打开定价页都能验,错了也能指出来。
不能证明:
- **不能证明核对日之后没有变化。**厂商改版、涨价、把免费档改成试用,都不通知目录站。
- 不能证明我们对这个产品的全部认知。详情页里坏得最快的就是价格与免费额度,最慢的是「是否开源」「是否有 API」这类结构性事实:
站内
openSource为真的是 37 条、hasApi53 条,这些字段一年动不了几次。反面例子是额度:287 条提到「免费」, 其中 211 条同一行里还出现某个金额;但整站pricing.detail.zh的中位数只有 16 个字(最长 96 字), 而且有 76 条连一个数字都没有——也就是说「免费」后面通常没有限额,那是一句状态,不是一个额度。
三、我们自己的报警器长什么样
npm run validate:tools 每次跑都会打一行时效:条数、最早一条、多少天。规则是窗口 180 天、提前 30 天开始点名,
而且故意非阻断——把「太久没核对」做成硬失败,最后一定有人为了跑通构建把阈值改掉,那是自欺。
同一件事现在也被搬进了 GitHub Actions:每周日一条内容巡检流水线跑数据时效、搜索索引漂移与 AdSense 就绪度
(.github/workflows/content-audit.yml),结果写进流水线摘要,红不红都不拦人。
按现在的分布推算,369 条那批会在 2027-02 前后开始被预警。这一句是我们自己给自己下的定时器,写在这里就是为了让它能被指着问。
四、30 秒自查(不需要相信我们)
- 看日期,再看差值。你要买的不是「这个工具」,是「这个工具此刻的价格与额度」。核对日距今越久,越要重新看。
- 打开厂商的 changelog。没有公开 changelog 的产品,功能承诺的时效性最差——这条比日期本身更能预测「页面会不会写歪」。
- 只核你要用的那个字段。要买年约,就核价与退款条款;要用 API,就核
hasApi与配额; 不关心视频生成就别管那一类。整页核对是幻觉,字段核对才可完成。
五、这套做法管不了什么(诚实边界)
- 我们没有历史快照。只有「当前抄到的值 + 哪天抄的」,所以我们无法证明「这一条已经变了」,只能标明「这是那天的值」。
- 我们不做自动抓取:抓取会把厂商博客与第三方测评当事实源,那些东西写的是宣传口径。所以「全量核对」只能靠人一次一次做, 也所以日期才会这么集中。
- 日期不是评分。别把「刚核对过」当成「这个工具好」。它只回答「这句话有多新」,不回答「这句话有多对」。
一句话版本
日期告诉你的是范围,不是保证;结构字段能撑很久,价格与额度一天都不一定撑得住。 读任何目录(包括我们)时,先找那行日期,再决定要重新核哪几个字段。
常见问题
- 为什么不直接做实时价格?
- 因为「实时」要靠抓取,而抓取会把厂商博客、活动页和第三方测评当事实源,那些内容写的是宣传口径。我们宁愿把「哪天抄的」写清楚,让读者自己判断要不要复核,也不想给一个看起来精确、来源说不清的数字。
- 为什么不每周把 376 条全部重核一遍?
- 重核一条要打开官网、定价页、changelog,把原文抄进对应字段,还要保证不改写成厂商口吻——这个动作按人天算。我们的替代方案是把「多久没核」变成可见数据:时效报警器每周在 CI 里跑一次,超窗口的条目被点名,然后按需求量重那几条。
- 日期这么旧,我还能用这些记录做决定吗?
- 可以,但把用途降级:用它们做筛选和横向比较(谁有免费档、谁按席位、谁有 API),这部分的坏得慢;别把它们当付款依据。付款前只核两件事——定价页当天的内容,以及退款条款。我们页面上那句「以厂商定价页为准」就是为这个写的。
接着读
延伸阅读:这些条目可以直接开通
- GitHub Copilot$10/月 / $19/用户/月决定前把这条记录底部的日期与厂商定价页对一次。前往官网
What the verification date at the bottom of a tool page actually tells you (with the date spread across all 376 records)
369 records share one date because that was the batch, not because they rotted. What the date proves, what it cannot, which fields decay fastest, and a 30-second self-check.
Every number comes from one pass over the 376 published records on 2026-09-18: the date spread counts `lastVerifiedAt`; open-source and API claims read the boolean fields `openSource` and `hasApi`; 'mentions free' means `pricing.detail.zh` contains 免费 or free; 'also carries an amount' means the same string contains a digit; 'no digit at all' means it contains none of 0-9. Lengths are character counts, median over the whole set. Reproduce it with `npx tsx` by importing `{ tools } from "@/lib/tools"` and counting those fields, or run `npm run validate:tools` for the freshness line. The 180-day window and the 30-day advance warning are code constants in `src/lib/growth-snapshot.ts` (`catalogFreshness`), called from `scripts/validate-tools.ts` — not a promise.
The short version first: the date is a scope statement, not a warranty
Every tool page ends with a line like 'last verified 2026-08-29'. It does not promise that today is the same. It promises that the sentence was written, on that day, against the vendor's own site and pricing page. The gap between those two claims is the whole article.
1. What the dates in our catalog actually look like
The 376 published records only ever use three values for lastVerifiedAt: 369 records on 2026-08-29, four on
2026-09-14, three on 2026-09-15. So the fact that 369 records share one date is not evidence of three years of
neglect — the opposite happened. We did one full pass, almost everything was written that day, and since then only
a handful of records were re-checked because their content changed. You can count it yourself by loading the same
module the site uses (src/lib/tools, published count 376) with npx tsx.
Why the distribution matters. Judging a directory by whether it has dates is useless; judge it by how the dates are spread. 300 different dates means maintenance is incremental, and stale entries hide behind fresh ones. All dates in one day — our case — means there was a census, and everything after census day is unknown to us. That is a sentence the site should say out loud rather than let readers discover.
2. What the date proves, and what it cannot
What it proves:
- the line was not copied from a slogan. What we store in
pricing.detail.zhis the vendor's own wording from that day, for example 'Free / Plus $20/mo / Pro $200/mo'. - we wrote it in a falsifiable form: anyone who opens the pricing page the same day can check it, and can call it wrong if it is.
What it cannot prove:
- that it is still true today. Vendors redesign, raise prices, turn a free tier into a trial; they do not notify directories.
- that our whole picture of the product is current. The fields that decay fastest are price and free-tier limits;
the slowest are structural facts:
openSourceis true for 37 records andhasApifor 53, and those move a few times a year. Quotas are the other end of the spectrum: 287 records mention 免费 or free, 211 of them also carry an amount in the same line, yetpricing.detail.zhhas a median length of 16 characters (longest 96), and 76 of those 287 contain no digit at all. So what follows 'free' is usually a status, not a quota.
3. The alarm we installed for ourselves
npm run validate:tools prints a freshness line every run: how many records, the oldest one, how many days ago.
The rule is a 180-day window with a 30-day advance warning, and it is deliberately non-blocking — make
'stale data' a hard build failure and someone eventually raises the threshold to unblock the pipeline, which is
self-deception. The same check now also sits in GitHub Actions: a weekly content audit (.github/workflows/content-audit.yml)
runs data freshness, search-index drift and AdSense readiness, and writes the result into the run summary.
Extrapolating from the current spread, the 369-record batch starts tripping that alarm around February 2027. We are printing our own timer here precisely so that it can be pointed at.
4. A 30-second self-check (no need to trust us)
- Read the date, then the gap. You are not buying 'this tool', you are buying 'this tool at today's price and quota'. The older the check, the more you re-read.
- Open the vendor changelog. A product with no public changelog has the least durable feature promises — that predicts whether a directory page drifts better than the date itself.
- Verify only the field you are about to rely on. Signing an annual plan means price and refund terms; building
on the API means
hasApiand quotas. Checking the whole page is an illusion; checking one field is finishable.
5. What this practice cannot do (stated plainly)
- We keep no historical snapshots. Only 'the value we copied' plus 'the day we copied it', so we cannot prove 'this record has already changed' — we can only mark which day it reflects.
- We do not run scrapers. Scraping turns vendor blogs and third-party reviews into sources of fact, and those are written to sell. That is why a full pass is manual, and why the dates cluster.
- The date is not a score. 'A fresh date' does not mean 'a good product'. It answers how new the sentence is, not whether it is correct.
One-sentence summary
A verification date describes the scope of a claim, not its guarantee; structural facts age slowly, prices and quotas may not survive a day. When reading any directory — ours included — find that date first, then decide which fields you still need to re-check.
FAQ
- Why not just make the prices live?
- Because 'live' means scraping, and scraping turns vendor blogs, campaign pages and third-party reviews into sources of fact — all written to sell. We would rather print the day we copied something and let you decide whether to re-check it than show a number that looks precise but cannot name its source.
- Why not re-verify all 376 records every week?
- Re-verifying one record means opening the site, the pricing page and the changelog, copying the wording into the right field, and making sure nobody rewrites it into marketing voice — that costs human-days at scale. Our substitute is to make staleness visible: the freshness alarm runs weekly in CI, overdue records get named by slug, and we re-check in the order readers actually need.
- The dates are old. Can I still decide on these records?
- Yes, but narrow the job. Use the records to filter and compare — who has a free tier, who prices per seat, who exposes an API — those decay slowly. Do not use them as a payment basis. Before paying, check exactly two things: the pricing page as it reads that day, and the refund terms. That is why every page carries the line about deferring to the vendor's pricing page.
Where to go from here
- GitHub Copilot$10/mo / $19/user/moBefore deciding, put the date at the bottom of this record next to the vendor's pricing page.Open the site