docs(blog): postmortem — five freshness incidents in 47 days - #5087
Conversation
Paired en/zh article with three diagrams: a redacted postmortem of one long-running advisory deployment that answered from stale, partial, or unread sources five times while every health signal stayed green, why local fixes were not enough, and the source-freshness and projection envelope contracts (#5075, #5085, both still in review). Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com>
huangruiteng
left a comment
There was a problem hiding this comment.
Request changes conclusion (author-owned PR; GitHub blocks formal self-review)
结论:REQUEST_CHANGES。主要阻塞是公开内容的来源边界。 完整评审 head 7ebc49b78a14a6305162305c2f3e932cdafbc253,基线 71dbfd5e605da4e7efdb58c87cd3f4a96d39e0e5。构建和浏览器检查通过,但技术可用性不能证明私有部署叙述适合公开。
动机
文章希望帮助读者区分“配置正常、调用成功”和“信源新鲜、投影完整”,这个教育目标有实际价值。两种语言、图解、合同说明和明确限制让静态阅读路径基本完整。但当前公开文案仍围绕真实私有运行记录组织,未达到仓库要求的公开安全来源边界;开篇与部分图注也把候选合同效果写成当前能力。持续维护的公共边界和读者对当前产品能力的理解都受到影响,因此不能以构建通过认定这个发布目标完成。
改动思路
页面复用了现有双语博客布局、公共样式、目录、语言切换和可键盘聚焦的横向图形区域,适合这类解释性内容。运行时事实 owner 仍是相关 Decision Context 和 TypeScript kernel 的合同;此 PR 只增加静态呈现,不实现新检测或授予读取权限。我同时读了 #5075、#5085 的候选改动和当前状态:两者仍未合入。文章已有正确的未发布、provider 计数、Agent 合规与待接入入口限制,应保留这些边界并把它们带到首次出现效果声明的位置。
具体改动
十个文件覆盖英文和中文文章、三类图解的六份 SVG,以及两个索引的新入口。两篇文章解释失效类型、逐次修复为何不能形成统一保证、信源字段与投影 envelope 的职责,再给出示例、限制和启示。图解分别呈现时间线、信号与事实的差异、读取事实到 kernel 封装的路径。索引和语言链接正确,metadata、canonical/hreflang 与 sitemap 检查通过;共用 CSS 没有变化。问题需要在所有语言、图形标签和入口摘要一起修复,单改正文的一段无法清除来源或能力措辞的传播。
关键代码讲解
blog/five-freshness-incidents/index.html:60的部署与事故段落:新增的是解释性 HTML,没有运行时调用。来源声明仍强调按原始记录保留事件组织,后面的双语正文和时间线沿用这一来源,这正是需要重新泛化的边界。- 同文件
:117的合同段落:source freshness 与 envelope owner 分工基本清楚,但“每个投影”和当前渲染效果的措辞超过未合入候选当前覆盖的三个入口;应就地写明候选状态和范围。 - 同文件
:158的限制段落:已经正确承认未发布、空正文检测依赖 provider 报告计数、消费者披露不能被强制,以及其他入口尚未接入。这里不是缺少限制,而是前面的声明需要与这些限制一致。 - 两个
blog/index.html的新增条目:实际把文章置于公共发现路径,构建会复制文章和六份图形资产。因此 source/privacy 判断是发布前的实际义务,不能仅凭扫描器未命中来放行。
对主干的风险
[P1] 公开安全改写必须先完成。 英文来源声明及其中文镜像明确依赖真实私有部署的 turn/repair 记录,事故段落和图形仍按这些记录重建运行过程。仓库 Public And Private Boundary 禁止把价值依赖私有组织或本地运营语境的规划、状态及运行叙述放入公共制品;删除名称并不能替代泛化。最低修复是把两篇文章、图形、索引摘要改为明确的合成案例、provider 无关的失败类型,或可追溯的公共复现行为。原始证据留在忽略的私有位置,不要为证明文章而上传原始记录。已推送历史引用或缓存如需处理,由维护者另行处理并保留明确剩余项。
[P2] 候选效果需要就地标明。 lead、部分图注、合同的全部投影措辞和示例引导语采用当前时态,而 #5075/#5085 仍开放。后文虽然已有正确限制,第一次阅读仍可能理解为当前可用。请在这些位置明确“候选/提议”,并把覆盖范围写为候选的 status、global-summary、global-gates;保留现有 provider 与消费者限制。这个措辞建议本身不构成新增运行时缺陷,主要阻塞仍是 P1。
实际验证:双语索引 smoke 通过(四组文章);site build/SEO 通过;两篇新文章与六个 SVG 实际返回 200,基线对应路由缺失,共用样式逐字节相同。英文/中文在桌面与 390px 宽度没有整页溢出,三幅图加载成功,滚动区域可接受键盘焦点。六项风险选择 canary 与 diff 检查通过。没有读取或等待远端 CI,也没有执行私有信源读取。首屏的 owner 审批仍是独立要求,此技术评审不替代它。
语义与 CI 对齐
这里违反的是已经生效的公共/私有来源义务,不是要求实现未来 RFC。触发是新的公共叙述持续使用私有运行来源;观察来自完整双语正文和图形,静态工具无法替代这个来源判断。改写后重读完整 diff,并重跑双语索引、构建、SEO、公共边界扫描和具体首屏预览。合同字段复用相关候选词汇即可,无须在这篇文章增加新的 schema、检测器或 Agent 强制义务。
我的整体评价
REQUEST_CHANGES:静态呈现与链接路径完成,持续维护的来源边界和读者对现有能力的判断仍有实质问题。最小修复在现有内容 owner 内,保留有用的图解结构,压缩真实运行时间线为可复用公共案例,并统一候选状态。未来维护方向是公共可复现来源和清晰的发布边界,无须新增框架。修复后重新审两种语言、六份图和索引,并取得首屏 owner 认可;不能把当前通过的构建当作文章事实或发布权限的证明。
English verdict: REQUEST_CHANGES - head 7ebc49b. The new public narrative retains private deployment-derived operating context; generalize both editions, figures and index copy before publication. Clarify proposed versus shipped contract effects. Build, SEO, bilingual, browser and local canary checks passed; these do not certify source provenance or grant first-screen approval.
Summary
Adds a paired en/zh blog post, Five freshness incidents in 47 days: a LoopX postmortem. It includes three diagrams and a listing at the top of both blog indexes.
The post is a redacted postmortem of one long-running advisory deployment on LoopX. Five times in 47 days, the agent answered from stale, partial, unread, or wrong-scope sources while every health signal stayed green, and LoopX raised no alert. The post covers:
coverage=1/48excerpt;Accuracy notes
71dbfd5e6.Validation
node examples/blog-bilingual-index-smoke.mjs: ok (4 paired articles)apps/presentation/site:npm run build+npm run smoke:seopass; both new routes appear insitemap-pages.xmlloopx check --scan-pathon all 10 changed files: public boundary scan cleangit diff --checkcleanFirst-screen review requested per
docs/development/design.md. Not self-merging.