Skip to content

docs(blog): publish paired English editions and complete indexes - #4701

Merged
huangruiteng merged 3 commits into
mainfrom
codex/blog-index-completeness-20260918
Sep 18, 2026
Merged

huangruiteng merged 3 commits into
mainfrom
codex/blog-index-completeness-20260918

Conversation

@huangruiteng

@huangruiteng huangruiteng commented Sep 18, 2026 •

Copy link
Copy Markdown
Collaborator

Goal And Delivered Outcome

  • Goal/source and gap: The public English Blog index exposed only the original architecture article even though two newer Chinese articles were already published. The owner requested complete English editions and a durable, fast test that prevents later translation or index drift.
  • Observable before → after, with the validation row that proves it: /blog/ listed one post and the two corresponding English routes did not exist; it now lists all three posts, both newer articles have complete English pages, English diagrams or interaction copy, reciprocal language navigation, and canonical alternates. The focused source test and share-bundle integration row below dynamically discover and verify the bilingual catalog.
  • Issue/task and intended base: Direct owner request; base main at 092a28c4e7704828b134e21757edb29924ff9b03.

Scope And Continuation

  • Completed scope and remaining work: Complete within this scope. Published the English application-scenarios and agent-native Kanban editions, added four English Kanban diagrams, completed both Blog indexes and language switches, and replaced the hard-coded Blog inventory with a shared filesystem-discovered validator used by a fast source test and the packaged-site smoke.
  • Slice boundary / successor: N/A. The existing static-site owner, Vite export path, shared editorial styles, and Frontstage Pages workflow remain the owning boundary. The future-facing pass was applied by centralizing bilingual catalog validation instead of adding another manual allowlist.

Validation

  • Tested revision: 163cc3cc7d9e06ad2cde7da2a1ee09944a7ebcae
  • Run state: finished
  • Input classes: synthetic, public_fixture
Check kind Result Public-safe evidence / limitation
unit passed node examples/blog-bilingual-index-smoke.mjs; fast source-level discovery verifies three paired articles, both locale indexes, lang, canonical URLs, hreflang, counterpart links, visible titles, and paired section identities. Wired into Frontstage Pages CI.
integration passed uv run --extra test node examples/frontstage-share-bundle-smoke.mjs; built the public site, reused the bilingual validator against packaged output, and verified static fallback, scripts, diagrams, and repository-base links.
static passed node --check for the English interaction and bilingual-check scripts, xmllint --noout for all four English SVGs, examples/frontstage-pages-workflow-smoke.py, and git diff --check origin/main...HEAD.
manual passed Real-browser desktop and 390 px mobile inspection covered the English index and both new article first screens; all diagram requests returned SVG 200 responses; presentation mode and all synthetic pull-request states changed visible content correctly. The owner approved the first-screen preview before commit.
regression_parity passed English and Chinese editions have matching section identities and matching structural counts for sections, paragraphs, list items, and tables; the focused test rejects a missing locale directory, index link, alternate, counterpart link, or section.
static passed Exact-head loopx canary premerge --from-git-diff --git-diff-base origin/main --tier standard: 10 catalog canaries, 8 content-ops risk checks, diff hygiene, and the public-boundary scan passed with no manual holds. The initial earlier run exposed only a missing declared TypeScript parser dependency in the clean worktree; after npm ci --ignore-scripts, the failed semantic-vocabulary check and both subsequent full gates passed without lowering coverage.
  • Coverage and gaps: The changed surface is static editorial HTML, CSS-compatible SVG, one page-local progressive-enhancement script, the focused bilingual test, and packaged export validation. Desktop/mobile rendering, JavaScript and no-SPA export behavior, locale structure, assets, links, workflow wiring, and the public/private boundary are covered. Runtime and real-backend validation are not applicable.

Frontend / Visual Evidence

  • UI impact: changed
  • Before: The production English Blog index lists only the original architecture post; the two newer English article routes are absent.
  • After: The English index lists all three posts newest-first. Both new English articles use the existing LoopX editorial system, reciprocal language switches, and English diagrams or interaction content. Public-safe desktop and mobile previews were reviewed and approved by the owner before commit; generated review screenshots were not added to the repository.
  • States and viewports shown: Blog index and both article first screens at 1440×900 and 390×844; application-scenarios reading/presentation modes and four synthetic PR states; Kanban article diagrams.
  • Source data: synthetic, public_fixture

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Refactoring (no functional changes)
  • Documentation update
  • Test update

LoopX Area

  • Control plane (goals, todos, quota, scheduler, registry, runtime)
  • Benchmark boundary (adapters, runners, verifiers, scoring, evidence)
  • Capability or extension (providers, adapters, skills)
  • Public docs or presentation surface (README, protocols, dashboard)
  • Build, packaging, installer, or CI
  • Host or runtime integration

Technical Direction

  • Direction / acceptance reference, when applicable: N/A; this is a self-contained public Blog completeness repair.

Shared-authority RFC fixture impact

N/A. This PR does not claim shared Goal Authority or control-plane migration progress.

Boundary Checklist

  • Neither the diff nor this PR body/comments/attachments disclose private state, credentials, raw traces or verifier output, internal links, or local machine paths (including .loopx/, .codex/goals/, and live ACTIVE_GOAL_STATE.md).
  • I did not duplicate maintainer-owned benchmark work unless a maintainer split out a public issue for it.
  • I kept the change scoped to the linked issue/task.
  • I completed the visual evidence section for UI changes, or marked UI impact none.
  • Every commit includes a DCO Signed-off-by trailer (git commit -s).

Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
@huangruiteng
huangruiteng merged commit 147e563 into main Sep 18, 2026
18 checks passed
@huangruiteng
huangruiteng deleted the codex/blog-index-completeness-20260918 branch September 18, 2026 15:09

@huangruiteng huangruiteng left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approval conclusion (author-owned PR; GitHub blocks formal self-approval)

审查对象:4701@163cc3cc7d9e06ad2cde7da2a1ee09944a7ebcae(已合并,合并后审计)。merge base 092a28c4e7704828b134e21757edb29924ff9b03,14 个文件 +771/-9。

动机

站点上的 Blog 是双语的:apps/presentation/site/public/blog/ 对应英文,blog/zh/ 对应中文。但在 base 上,英文索引只列了 from-one-shot-agents-to-long-horizon-control 一篇文章,agent-facing-kanban 和 application-scenarios 只有中文版;同时唯一覆盖 Blog 的 examples/frontstage-share-bundle-smoke.mjs 用的是硬编码文章清单,并且对这两篇没有译文的文章直接跳过 hreflang 断言。结果是:缺译文、缺索引项、缺语言互链这三类真实缺陷都不会让任何检查变红——手维护清单本身就是问题来源,每加一篇文章都要重新冒一次风险。这个 PR 把“目录即事实”的规则固化下来,并补上缺失的英文版本与索引项。

改动思路

一条规则、一个所有者:把“双语目录必须成对、每个 locale 索引必须列出全部文章、每篇文章必须带 canonical / 对方语言链接 / en+zh-CN+x-default 互链、成对文章的 section id 必须一致”抽成 validateBilingualBlog(),由新脚本 examples/blog-bilingual-index-smoke.mjs 导出(含 collectArticleSlugs() 从磁盘发现文章集合)。旧的 frontstage-share-bundle-smoke.mjs 不再自带清单,而是直接 import 这个函数拿文章集合,并删掉那处按文章名判断 hreflang 的特例。检查入口接进 .github/workflows/frontstage-pages.yml,同时把新脚本加进 push/PR 两条 path filter,改动内容或改动检查都会触发。

具体改动

  • 新增 examples/blog-bilingual-index-smoke.mjs(87 行,无依赖):collectArticleSlugs() 用 readdir + existsSync(<dir>/index.html) 发现文章、排序;validateBilingualBlog() 断言两个 locale 的 slug 数组完全相等、两个索引都出现 href="<slug>/"、<html lang>、rel="canonical"、对方语言链接、三种 hreflang,并逐篇比较成对文章的 <section id> 序列。
  • 发布内容:新增英文版 blog/agent-facing-kanban/index.html(247 行)、blog/application-scenarios/index.html(201 行)及英文 presentation.js、四张英文 SVG 图;英文索引补上这两篇(1→3 条),两篇中文文章补上三种 hreflang 与 EN 语言切换链接。
  • examples/frontstage-share-bundle-smoke.mjs:改为 import { validateBilingualBlog },文章集合由发现结果驱动,删除原有 ["agent-facing-kanban/","application-scenarios/"] 的 hreflang 例外分支。
  • .github/workflows/frontstage-pages.yml:新增 path filter 两项与 “Validate bilingual Blog catalog” 步骤(node examples/blog-bilingual-index-smoke.mjs);apps/presentation/site/README.md 记录该不变量与两个 smoke 的职责。

对主干的风险

风险面是公开静态站点与 CI,不涉及运行时代码、LoopX 控制面、CLI/API 或持久化状态,回滚只需还原内容提交或摘掉该步骤。实测:node examples/blog-bilingual-index-smoke.mjs → ok (3 paired articles);两处变异都按预期失败——(1) 从英文索引删掉 href="application-scenarios/" 报 Blog index must link every en article: application-scenarios;(2) 只给英文 agent-facing-kanban 插入 <section id="mutation-probe"> 报 Paired Blog article sections must match: agent-facing-kanban。两点保留意见(均非阻塞,P3):断言基于渲染后 HTML 的子串匹配,理论上可被无关出现满足,结构性更强的部分是与成对 section id 的比较;本地跑完整 frontstage 链时卡在 examples/goal-channel-frontstage-fixture.py(PATH 上 python3 为 3.9.6,不支持 dataclass(slots=True)),该失败在 merge base 上同样复现,属既有机器环境限制,非本 PR 引入,因此这一步以合并后的 CI 结论为准。新英文页面的浏览器渲染未在本地验证,仅由静态 HTML 断言与 CI 覆盖。

我的整体评价

这是一个小而完整的收口:既补上了用户可见的缺失内容(两篇英文文章 + 两个索引项),又把导致缺陷长期潜伏的手维护清单换成了目录驱动的机器校验,并且让旧 smoke 复用同一规则而不是再存一份。迁移成本为负——删掉的清单比新增的检查更多;两处变异证明该检查确实会失败而不是空转。作为已合并精确 head 的合并后审计,证据支持通过。

English verdict: APPROVE (exact head 163cc3c)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant