This is an automated email from the ASF dual-hosted git repository. imbajin pushed a commit to branch handoff/oink-site-improvements in repository https://gitbox.apache.org/repos/asf/hugegraph-doc.git
commit bba8d83864a351a24fa6737d7f91ed33a16a8287 Author: dark <[email protected]> AuthorDate: Sat Sep 5 23:19:30 2026 +0800 docs(goal): add portable OINK handoff - expose only the active OINK goal-task directory - record exact remote branches, CI state, and resume order - retain portable design and browser evidence --- .gitignore | 4 +- .goal-task/oink-site-improvements/design.md | 220 ++++++++ .../evidence/ask-ai-visual-directions.md | 41 ++ .../evidence/ask-ai-visual-directions.png | Bin 0 -> 1244536 bytes .../evidence/browser/cn-community-mobile-dark.png | Bin 0 -> 364601 bytes .../evidence/browser/cn-docs-desktop-dark.png | Bin 0 -> 361399 bytes .../evidence/browser/cn-search-mobile-dark.png | Bin 0 -> 368142 bytes .../evidence/browser/cn-sidebar-mobile-dark.png | Bin 0 -> 373961 bytes .../browser/en-community-desktop-light.png | Bin 0 -> 597410 bytes .../evidence/browser/en-docs-desktop-light.png | Bin 0 -> 384735 bytes .../evidence/browser/en-docs-mobile-light.png | Bin 0 -> 301023 bytes .../evidence/browser/en-search-desktop-light.png | Bin 0 -> 531488 bytes .../evidence/browser/en-sidebar-desktop-light.png | Bin 0 -> 789664 bytes .goal-task/oink-site-improvements/handoff.md | 94 ++++ .goal-task/oink-site-improvements/lessons.md | 224 ++++++++ .goal-task/oink-site-improvements/pr-a-body.md | 72 +++ .goal-task/oink-site-improvements/pr-b-body.md | 42 ++ .goal-task/oink-site-improvements/state.md | 568 +++++++++++++++++++++ .goal-task/oink-site-improvements/todo.md | 168 ++++++ 19 files changed, 1432 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index cc2d3a994..c80b4d30f 100644 --- a/.gitignore +++ b/.gitignore @@ -34,4 +34,6 @@ GEMINI.md .aider* .gemini/ WARP.md -/.goal-task +/.goal-task/* +!/.goal-task/oink-site-improvements/ +!/.goal-task/oink-site-improvements/** diff --git a/.goal-task/oink-site-improvements/design.md b/.goal-task/oink-site-improvements/design.md new file mode 100644 index 000000000..4a40294ac --- /dev/null +++ b/.goal-task/oink-site-improvements/design.md @@ -0,0 +1,220 @@ +# HugeGraph OINK 网站改进规划 + +## 1. 目标与优先级 + +聚焦 master 上的 OINK 网站;Docusaurus 预览站只参考 Ask AI、Community 等产品设计,不读取或迁移其实现与构建方式。交互以普通鼠标、触屏和快捷键用户为主,无障碍检查仅作为防回归护栏。 + +| 优先级 | 评分 | 已确认事项 | +|---|---:|---| +| P0 | 10.0 | 修复侧栏分层、隐藏焦点、移动抽屉和导航交互 | +| P0 | 9.8 | 增加 1.3/1.0,重构五版本 CI 与预发发布 | +| P0 | 9.6 | OINK 原生搜索内融合可选 Kapa Ask AI | +| P0 | 9.5 | Community 增加 ASF PMC/Committers 头像墙 | +| P1 | 9.0 | 统一 OINK 主题 token,补强 summary 搜索元数据 | +| P1 | 8.6 | LLMSFULL、Backlinks、图片缩放、复制链接、社交预览图和内容组件试点 | +| P2 | 8.0 | ASF-aware 数据驱动下载页,作为第二阶段 | +| Deferred | ≤6.5 | 全文索引及其他低收益或高外部依赖能力 | + +## 2. 第一阶段实现 + +### 2.1 OINK Shell、导航与侧栏 + +- 将 `#532fc9` 迁移为 `ui.theme_color`,导航、侧栏、焦点、选中态、搜索和 Ask AI 共用 OINK 明暗色 token,删除可替代的硬编码颜色。 +- 顶部保留 `Documentation / Download / Blog / Community`: + - Documentation 下拉改为“开始、组件、开发、运维、参考”五组图标入口。 + - 仅保留右侧 branch 图标作为版本选择器,消除重复版本菜单。 + - 采用 [OINK 官方站](https://oink.pgsty.com/)原生手感:hover/focus 展开、移出延迟关闭、点击标题进入文档首页、↓ 进入菜单、Esc 关闭。 +- 侧栏收起后完全离开布局和交互树,删除左缘 hover 浮层;只能点击显式按钮恢复。 +- 默认只展开当前页面祖先;用户手动展开的节点可持久化。 +- 折叠状态全站共享;节点状态使用 `oink.sidebar.v1.<version>.<locale>` 隔离,只保存稳定节点 ID,active path 始终优先,失效 ID 自动清理;localStorage 不可用时退化为当前祖先展开。 +- 移动抽屉关闭时隔离内部交互、恢复触发按钮、解除滚动锁;同时修复汉堡按钮低对比度。 + +### 2.2 本地搜索与 Ask AI + +本地搜索继续采用 `summary`,不会因 AI 服务替换、延迟或失效。 + +- 为 latest 中英文 12 组核心入口补充克制的 `search_keywords/search_boost/search_exclude`: + - Introduction、Server、HStore、PD、Computer、Loader、Hubble、Clients、REST、Config、Authentication、Download。 + - 用固定中英文查询集验证目标页进入前列,禁止全站机械堆词。 +- 明确区分“无匹配结果”和“索引加载失败”;失败态提供本地重试。 +- 有非空普通查询时,在本地结果末尾追加 Ask AI 行;空查询、命令模式和 choice 模式不显示。 +- 保留全站浮动 launcher;移动端使用紧凑尺寸和 safe-area,不遮挡正文。 +- launcher 打开空白 AI 会话;搜索结果中的 Ask AI 自动提交当前查询。 +- 只向 Kapa 发送裁剪后的查询字符串,不发送当前 URL、页面内容、版本信息或本地结果。 +- 历史版本入口和面板明确标注“回答基于 latest 文档”;第三方服务说明只在 AI 面板中显示。 +- Kapa 脚本仅在用户点击后加载;5 秒未完成脚本加载或 render 即进入非阻塞错误态,保留入口和本地结果并允许重试。迟到响应不得自动弹窗。 +- launcher 与搜索行共用 `idle/loading/ready/error` 状态机,防止双击、重复脚本和并发打开。 +- Kapa 不接管 `Cmd/Ctrl+K`;关闭 AI 后焦点返回真实触发入口。 + +配置契约: + +```yaml +params: + ai_search: + enabled: true + provider: kapa + website_id: 0b277570-4740-451e-96fa-1e4ac1ac5e88 + source_groups: + en: "<reviewed-latest-en-source-group-id>" + cn: "<reviewed-latest-cn-source-group-id>" +``` + +- `enabled=false` 时不输出 launcher、适配脚本或任何 Kapa 请求。 +- 开启时 provider、website ID 和两种语言 source group 缺一即构建失败;这些均为公开浏览器标识,不使用 secret。 +- bundle URL、5 秒超时和隐私策略固定在适配器中,不允许配置任意脚本地址。 +- 固定关闭 Kapa launcher、搜索模式、Command-K、consent、匿名 Cookie 和 fingerprint;保留现有 hCaptcha 防滥用。 +- Kapa 面板按 OINK token 完整覆盖字体、颜色、边框、圆角和浅/深色,禁止使用旧版红粉 UI。实现参考 [Kapa Functions](https://docs.kapa.ai/integrations/website-widget/javascript-api/functions)、[Theming](https://docs.kapa.ai/integrations/website-widget/configuration/theming) 和 [User Tracking](https://docs.kapa.ai/integrations/website-widget/features/user-tracking)。 +- 不复制 OINK 的完整 command palette 脚本;先利用现有 manual-init 与 model/registry 注入实现薄适配,并向 OINK 上游提交通用 `registerExtension({ placement: "search-tail", rows, activate })` API。上游发布后删除本站包装层。 +- CSP 仅允许 staging 实测确认的 Kapa、hCaptcha 和必要代理精确主机,不使用通配域名;生成 HTML 仍不得静态嵌入第三方 active resource。 + +### 2.3 Kapa 知识库 + +- latest EN/CN 文档根启用 OINK `LLMSFULL`,分别生成 `/docs/llms-full.txt` 和 `/cn/docs/llms-full.txt`。 +- Kapa 只摄取这两个 LLMSFULL 文件,不同时爬 HTML,避免重复引用。 +- 英文页面只启用 EN source group,中文页面只启用 CN source group。 +- Kapa 后台必须完成: + - 排除历史和旧 Docusaurus global sources。 + - 配置生产、OINK staging 两个允许域名。 + - 完成首次抓取并核对来源时间。 +- 初始 corpus、source group 与 CSP 未通过 staging 验证前保持 AI 关闭;通过后同一配置在 staging 和 production 启用,不做长期分阶段开关。 + +### 2.4 五版本与路由 + +版本菜单固定为: + +```text +latest / 1.7 / 1.5 / 1.3 / 1.0 +``` + +- 跳过 1.2;中英文使用相同短标签和顺序。 +- 历史内容分别取自 `release-1.7.0`、`release-1.5.0`、`release-1.3.0`、`release-1.0.0`。 +- 配置只展示分支名;每次运行开始时仍解析一次 SHA 并在该次任务中固定,避免矩阵任务读取不同提交。 +- 以 `versions.json` 为版本、顺序、ref、发布路径的单一真源,其他菜单和校验数据由它派生。 +- 增加版本化 route-map: + - 1.3/1.0 在构建 overlay 中迁移到当前五组信息架构。 + - 旧扁平 URL 生成静态 alias/redirect,canonical 指向迁移后的同版本路径。 + - 版本切换按逻辑页面 ID 查找等价页;成功时保留 query/hash,目标不存在时跳至目标版本文档根并丢弃无效 query/hash,同时显示一次说明。 + - 1.0 中文确实缺失的页面不补译、不展示英文伪中文页;语言切换回到该版本中文根。 + - 仅在真实等价双语页面间输出 hreflang。 +- 1.7/1.5/1.3/1.0 输出 `noindex,follow` 并从 sitemap 排除;保留自 canonical、直达 URL、归档提示和切换 latest 的入口。 + +### 2.5 Community PMC/Committers + +结合 [Issue #468](https://github.com/apache/hugegraph-doc/issues/468),在“参与社区”之后、成熟度 CTA 之前加入 Project members: + +- 角色权威来源: + - [committee-info.json](https://whimsy.apache.org/public/committee-info.json) 交叉校验 Chair/PMC。 + - [public_ldap_projects.json](https://whimsy.apache.org/public/public_ldap_projects.json) 提供 owners/members。 + - [public_ldap_people.json](https://whimsy.apache.org/public/public_ldap_people.json) 提供公开姓名。 +- `PMC = owners`;`Committers = members - owners`,禁止重复。Chair 第一,其余按 ASF 公开姓名 Unicode casefold 排序。 +- 中英文共用 `data/community/roster.json`;人工审核的 ASF ID→GitHub 映射放在 `data/community/github-map.json`,记录 numeric GitHub user ID,禁止按姓名、邮箱或提交记录猜账号。 +- 页面仅显示: + - 已映射:本地头像和 `@GitHub ID`,整卡链接 GitHub。 + - 未映射:姓名首字母和 ASF ID,链接 ASF phonebook。 + - ASF 姓名只用于排序和非视觉链接名称。 +- 复用 OINK Contributors token/class,但通过 site-local partial 直接读取嵌套数据;不依赖原生 shortcode 对嵌套路径的支持。 +- 固定 5/3/2 列:桌面 ≥1200px、平板 768–1199px、手机 <768px。 +- 头像使用同源 128×128 WebP、剥离元数据、懒加载;initials 先渲染,图片失败时无需 JavaScript 即可回退。 +- HTML、Print 和 Markdown 输出必须包含相同角色集合、顺序及 profile 链接。 + +提供: + +```bash +python3 scripts/community_roster.py refresh +python3 scripts/community_roster.py validate --warn-after-days 90 +``` + +- `refresh` 仅由维护者本地运行,生成普通 PR;不增加定时任务、机器人提交或直推。 +- 候选头像使用内容寻址文件名:先安装并验证新头像,最后原子替换 roster,再清理孤立旧头像;任何失败保持 last-good bundle。 +- `validate` 完全离线,检查 schema、集合、唯一 Chair、排序、映射闭集、账号/user ID 唯一性、头像 MIME/尺寸/hash 和渲染产物。 +- 90 天依据成功抓取的 `retrieved_at` 判断,只输出 Python/Actions warning,不进入 Hugo warning;未来日期或结构错误阻断构建。 + +### 2.6 其他已采纳 OINK 能力 + +- latest 文档启用 Backlinks,默认显示 5 条,超过后“查看全部”。 +- Docs 与 Blog 在五个版本中启用按需图片缩放。 +- Blog 页尾只提供“复制链接”,不增加社交平台跳转。 +- 使用现有 HugeGraph 品牌资产生成一张经人工审阅的 1200×630 默认社交预览图,为 Docs、Community 和 Blog 提供 fallback。 +- 仅在以下三组 latest 双语页面试点 OINK 原生内容组件: + - Server Quickstart:步骤、命令 filename/wrap/collapse。 + - Config Guide:长配置文件名、折叠与复制。 + - REST Vertex:字段锚点、宽表和请求/响应代码块。 +- 不机械改写其他页面或任何历史版本。 + +## 3. CI/CD 与交付并行 + +### 3.1 事件模型 + +| 事件 | 构建 | 发布 | +|---|---|---| +| PR | 五版本、production origin | 不发布 | +| master push | 五版本、production origin | 完整发布 `asf-site` | +| dispatch `staging-next/latest` | 指定 ASF 分支的 latest | 发布 `asf-staging-oink`;历史菜单指向 production | +| dispatch `staging-next/full` | 候选 latest + 四个历史版本 | 完整发布 `asf-staging-oink` | +| dispatch `production-history-refresh` | master shell + 五版本 | 完整发布 `asf-site` | + +- dispatch 仅能从 master 工作流启动;候选只接受 ASF 仓库普通分支,拒绝 fork、tag、裸 SHA 和输出分支。 +- staging 与 production 分别要求固定确认词;origin、profile 和目标分支全部由枚举映射,不接受自由文本。 +- 默认权限 `contents: read`;只有发布 job 使用 `contents: write`。发布 job 不 checkout 或执行候选分支代码,只下载本次 run/attempt 的明确 artifact。 +- 不新增 GitHub Environment;依靠最小权限、可信 ref、确认词、目标硬编码、新鲜度检查和 ASF `whoami`。 +- 保留 required check 名称 `deploy`;它只检查 prepare/build/aggregate/E2E 成功,不持有写权限。 +- 移除 `version × site` 笛卡尔矩阵: + - PR/master/full staging 最多 5 个并行版本构建。 + - 默认 latest staging 只运行 1 个构建。 +- 不缓存历史最终 artifact;保留现有 Go/Hugo 编译缓存。 +- resolved manifest/可发布 aggregate/E2E 报告保留 7 天,中间版本与 PR aggregate 保留 1 天。 +- 超时:prepare 10 分钟、单版本 build 20、aggregate 15、Chromium E2E 20、visual 15、deploy gate 5、publish 10。 + +### 3.2 PR 分组 + +采用两条并行第一阶段加一个第二阶段: + +1. **PR-A:OINK 核心平台** + - Shell、导航、侧栏、主题 token、搜索错误态、Ask AI、LLMSFULL、Backlinks、图片缩放、复制链接、社交卡片。 + - 五版本、route-map、CI/CD、Node/Playwright/Chromium 与发布安全。 + - 因共享 `hugo.yaml`、布局、样式、CSP、测试基座和 workflow,这些强依赖内容合入同一 PR;内部可按 UI/AI、versioning/CI、E2E 三个文件所有权 lane 并行开发。 + +2. **PR-B:Community 与内容体验** + - PMC/Committers 数据链路、独立 scoped 样式和三种输出。 + - 12 组搜索元数据、3 组双语内容组件试点。 + - 不修改 PR-A 所有的共享配置、shell 样式或 workflow,可与 PR-A 完全并行。 + +3. **PR-C:ASF 下载页第二阶段** + - 在第一阶段稳定后,把中英文下载事实收敛到单一数据源。 + - 复用 OINK 下载/checksum UI,明确支持 ASF mirror、正式 source artifact、ASC 和 SHA512;不得把 GitHub 自动 source archive 表述为 ASF 正式发行物。 + +### 3.3 Issue 与上游归档 + +- [Issue #467](https://github.com/apache/hugegraph-doc/issues/467): + - 先追加三套 Ask AI 视觉方案对比、选择结论和“旧红粉 UI 禁止复用”说明。 + - staging 验证后再追加最终浅/深色、桌面/移动截图和验证结论。 +- PR-B 使用 `Closes #468`。 +- 另建全文搜索 Issue,记录 summary 现状、content 模式约 233–243 KiB gzip/语言/版本的估算及性能预算;本轮不实现。 +- 向 OINK 上游分别提交通用 palette extension 和侧栏交互修复;上游工作不阻塞本站交付。 + +## 4. 测试与验收 + +- 保留现有 Python/链接/产物验证;补齐五版本顺序、1.2 缺席、route-map、aliases、noindex/sitemap、canonical/hreflang、1.0 语言缺页和 staging 跨 origin 菜单合同。 +- Node 24 只用于 `tests/e2e/`;提交锁文件,并在 `.gitignore` 中仅放行该目录的 lockfile。Hugo 生产构建不执行 npm。 +- Chromium 阻断测试: + - latest 中英文完整覆盖搜索、导航、侧栏、版本切换、Community 和 AI mock。 + - 四个历史版本中英文覆盖菜单、关键路由、归档、noindex、AI latest 提示及键盘冒烟。 + - AI 覆盖禁用零请求、结果尾 CTA、点击前零第三方请求、精确 query/locale、500、超时、CSP、迟到响应、双击和重试。 + - Community 覆盖 1440/900/390/320px 的 5/3/2 列、明暗色、长账号、缺 GitHub mapping、空 Committers、HTML/Print/Markdown 一致性。 +- axe WCAG 2.2 AA、隐藏侧栏零可聚焦元素、焦点恢复及颜色对比只作为回归护栏。 +- 视觉回归永久 advisory,不进入 `deploy` gate;固定导航、搜索、侧栏、Community 的桌面/移动和浅/深色状态,并要求 PR 提供 before → after 截图。 +- 部署后真实 Kapa smoke 只验证 bundle、CSP、render 和面板可打开,不提交问题;失败仅告警,不回滚或阻止原生站点发布。 +- 发布验收要求: + - production 与 staging 原生搜索在 Kapa 故障时完整可用。 + - 所有外部请求只在用户点击 Ask AI 后出现。 + - 五版本 URL、旧链接和语言切换无 404。 + - Community 页面无访客侧 GitHub/Whimsy 请求。 + - PR-A 与 PR-B 合并后运行一次完整五版本集成构建再发布。 + +## 5. 明确延期与默认假设 + +- 延期:全文本地索引、反馈、OpenAPI/Redoc、Giscus、analytics、Authors/Series/taxonomy、Custom commands、Translation notice、Reading time、PlantUML、Draw.io、Markmap、Asciinema、KaTeX、ECharts、PDF/EPUB、PWA、导航自动隐藏、Blog 视图切换、GitHub stars 及其他展示型 Landing。 +- Ask AI 是可选增强,任何外部故障均不得改变本地搜索结果、CI 核心结论或网站可发布性。 +- 历史版本只保留原始事实,不补译、不修饰为当前行为。 +- Community 只展示当前 ASF 官方角色,不按仓库贡献次数、组织成员或公司归属推断身份。 +- 所有新界面沿用当前 OINK/HugeGraph 视觉系统,不复刻 Docusaurus 旧 UI。 diff --git a/.goal-task/oink-site-improvements/evidence/ask-ai-visual-directions.md b/.goal-task/oink-site-improvements/evidence/ask-ai-visual-directions.md new file mode 100644 index 000000000..8383a1052 --- /dev/null +++ b/.goal-task/oink-site-improvements/evidence/ask-ai-visual-directions.md @@ -0,0 +1,41 @@ +# Ask AI Visual Directions + +- Method: built-in `image_gen` +- Asset: + `evidence/ask-ai-visual-directions.png` +- Dimensions: 1717×916 PNG +- SHA-256: + `68a97ffa93941608fa6d112e77331e464df59a824b8073ebf1c5543a472c98c2` + +## Directions + +1. Search Tail — append one Ask AI action after native results for a non-empty + ordinary query. +2. Floating Launcher — keep a global compact launcher that opens the AI modal + without submitting a query. +3. Side Panel — reserve a persistent right-side assistant surface. + +## Selection + +Use Search Tail and Floating Launcher as two entrypoints into one shared modal +and state machine. Do not adopt the persistent Side Panel because it competes +with the document TOC and reduces content width. Native summary results remain +the primary surface in every state. + +The old red/pink Docusaurus treatment is explicitly excluded. The selected +surface uses the OINK/HugeGraph purple token in light and dark modes. + +## Generation prompt + +```text +Use case: ui-mockup +Asset type: design-review comparison board for a documentation website +Primary request: create one polished landscape comparison board showing three clearly separated Ask AI interface directions for the Apache HugeGraph OINK documentation site. +Scene/backdrop: clean off-white product-design review canvas with a restrained header and three equal desktop UI panels. +Subject: Panel A shows an AI action appended as the final row of native documentation search results; Panel B shows a compact floating Ask AI launcher opening a centered modal; Panel C shows a right-side assistant panel beside documentation content. Each panel should visibly preserve native local search as the primary interface. +Style/medium: realistic shippable web product UI mockup, crisp and restrained, not concept art. +Composition/framing: 16:9 landscape, three equal columns, consistent browser chrome, strong comparison hierarchy, generous whitespace. +Color palette: OINK/HugeGraph purple #532FC9 with neutral white, charcoal, soft lavender, and a credible dark-mode inset; strictly no red or pink legacy UI. +Text (verbatim): "HugeGraph", "A · Search Tail", "B · Floating Launcher", "C · Side Panel", "Search documentation", "Ask AI", "Native results stay available". +Constraints: render the listed text exactly once where appropriate; preserve accessibility-minded contrast; use modest borders and 10–12px rounding; no gradients, no glassmorphism, no decorative blobs, no unrelated logos, no watermark, no red, no pink, no extra marketing copy. +``` diff --git a/.goal-task/oink-site-improvements/evidence/ask-ai-visual-directions.png b/.goal-task/oink-site-improvements/evidence/ask-ai-visual-directions.png new file mode 100644 index 000000000..bf63d6e3d Binary files /dev/null and b/.goal-task/oink-site-improvements/evidence/ask-ai-visual-directions.png differ diff --git a/.goal-task/oink-site-improvements/evidence/browser/cn-community-mobile-dark.png b/.goal-task/oink-site-improvements/evidence/browser/cn-community-mobile-dark.png new file mode 100644 index 000000000..d73d3d50c Binary files /dev/null and b/.goal-task/oink-site-improvements/evidence/browser/cn-community-mobile-dark.png differ diff --git a/.goal-task/oink-site-improvements/evidence/browser/cn-docs-desktop-dark.png b/.goal-task/oink-site-improvements/evidence/browser/cn-docs-desktop-dark.png new file mode 100644 index 000000000..7a5f5d853 Binary files /dev/null and b/.goal-task/oink-site-improvements/evidence/browser/cn-docs-desktop-dark.png differ diff --git a/.goal-task/oink-site-improvements/evidence/browser/cn-search-mobile-dark.png b/.goal-task/oink-site-improvements/evidence/browser/cn-search-mobile-dark.png new file mode 100644 index 000000000..070f6aeab Binary files /dev/null and b/.goal-task/oink-site-improvements/evidence/browser/cn-search-mobile-dark.png differ diff --git a/.goal-task/oink-site-improvements/evidence/browser/cn-sidebar-mobile-dark.png b/.goal-task/oink-site-improvements/evidence/browser/cn-sidebar-mobile-dark.png new file mode 100644 index 000000000..3f5240e33 Binary files /dev/null and b/.goal-task/oink-site-improvements/evidence/browser/cn-sidebar-mobile-dark.png differ diff --git a/.goal-task/oink-site-improvements/evidence/browser/en-community-desktop-light.png b/.goal-task/oink-site-improvements/evidence/browser/en-community-desktop-light.png new file mode 100644 index 000000000..01c44b95a Binary files /dev/null and b/.goal-task/oink-site-improvements/evidence/browser/en-community-desktop-light.png differ diff --git a/.goal-task/oink-site-improvements/evidence/browser/en-docs-desktop-light.png b/.goal-task/oink-site-improvements/evidence/browser/en-docs-desktop-light.png new file mode 100644 index 000000000..31ceff1a1 Binary files /dev/null and b/.goal-task/oink-site-improvements/evidence/browser/en-docs-desktop-light.png differ diff --git a/.goal-task/oink-site-improvements/evidence/browser/en-docs-mobile-light.png b/.goal-task/oink-site-improvements/evidence/browser/en-docs-mobile-light.png new file mode 100644 index 000000000..1e9856db1 Binary files /dev/null and b/.goal-task/oink-site-improvements/evidence/browser/en-docs-mobile-light.png differ diff --git a/.goal-task/oink-site-improvements/evidence/browser/en-search-desktop-light.png b/.goal-task/oink-site-improvements/evidence/browser/en-search-desktop-light.png new file mode 100644 index 000000000..93fb8de98 Binary files /dev/null and b/.goal-task/oink-site-improvements/evidence/browser/en-search-desktop-light.png differ diff --git a/.goal-task/oink-site-improvements/evidence/browser/en-sidebar-desktop-light.png b/.goal-task/oink-site-improvements/evidence/browser/en-sidebar-desktop-light.png new file mode 100644 index 000000000..655b16ccb Binary files /dev/null and b/.goal-task/oink-site-improvements/evidence/browser/en-sidebar-desktop-light.png differ diff --git a/.goal-task/oink-site-improvements/handoff.md b/.goal-task/oink-site-improvements/handoff.md new file mode 100644 index 000000000..ab82ee18a --- /dev/null +++ b/.goal-task/oink-site-improvements/handoff.md @@ -0,0 +1,94 @@ +# OINK Site Improvements — Cross-host Handoff + +This file is the portable entrypoint for continuing the OINK site-improvement +goal on another host. Read files in this order: + +1. `design.md` — authoritative product, interface, release, and acceptance + requirements. +2. `state.md` — execution contract, exact checkpoints, decisions, and gates. +3. `todo.md` — current work queue, dependencies, waits, and deferrals. +4. `lessons.md` — failure-derived constraints that must not regress. +5. `pr-a-body.md` and `pr-b-body.md` — prepared GitHub descriptions. +6. `evidence/` — retained design and browser screenshots. + +## Remote checkpoint + +- Repository: `https://github.com/apache/hugegraph-doc.git` +- Baseline `master`: `d88167dd797efafea50cec59909d57849703fde5` +- PR-A branch: `feat/oink-core-platform` +- PR-A exact head: `25f3e8c3f7982cbf1d08c4bda572e9da9add79eb` +- PR-A: <https://github.com/apache/hugegraph-doc/pull/472> +- PR-A CI run: <https://github.com/apache/hugegraph-doc/actions/runs/33934549197> + — all jobs passed; required human review is still pending. +- PR-B branch: `feat/oink-community-content` +- PR-B exact head: `bb270838626165ad2c98c11150dde39f4eb113c9` +- PR-B has no PR yet. Create it with `Closes #468` only after rechecking the + current PR-A/base state. +- Local integration checkpoint: + `81092317458740eeaf9da8b289cb0ea7f226aaf2`. Its tree was verified + byte-identical to the union of the two pushed branch heads and contains no + unique unpushed implementation. + +All remote revisions and GitHub states are time-sensitive. Refresh them before +any mutation: + +```bash +git fetch origin --prune +git ls-remote origin \ + refs/heads/master \ + refs/heads/feat/oink-core-platform \ + refs/heads/feat/oink-community-content +gh pr view 472 --repo apache/hugegraph-doc \ + --json state,isDraft,headRefOid,mergeStateStatus,reviewDecision,statusCheckRollup,url +gh pr list --repo apache/hugegraph-doc \ + --head feat/oink-community-content --state all +``` + +## New-host bootstrap + +The destination host needs: + +- an `apache/hugegraph-doc` clone with `origin` pointing to the Apache + repository; +- GitHub authentication capable of reading CI and, before writes, confirmed + Apache branch/PR permission; +- repository submodules and the Node/Hugo/Python/Chromium dependencies used by + the current source; +- Kapa login only when the reviewed staging LLMSFULL corpus is reachable. + +Suggested worktrees: + +```bash +git worktree add ../hgdoc-oink-pra origin/feat/oink-core-platform +git worktree add ../hgdoc-oink-prb origin/feat/oink-community-content +``` + +Recreate the integration worktree from refreshed remote heads instead of +copying the source-host worktree. Preserve PR-A and PR-B ownership boundaries +defined in `state.md`. + +## First continuation action + +1. Recheck PR #472 exact-head CI and required review. +2. Merge PR-A only when branch protection permits it, with no override. +3. Refresh `origin/master`. +4. Create PR-B from the already-pushed branch with `Closes #468`. +5. Continue independent staging/Kapa preparation while review is pending. +6. Begin PR-C only after the first-phase stability gate in `design.md` is met. + +The final integrated broad review already reached the user-approved three-round +cap and finished 3/3 clear. Do not start another broad review cycle. Only a new, +reproducible release-blocking Critical may receive a narrowly scoped fourth or +fifth round. + +## Source-host-only evidence + +Absolute paths under `/Users/zhu/...` and `/private/tmp/...` in `state.md` are +historical source-host evidence locations. They are not portable and must not be +treated as existing on the destination host. The committed screenshots under +`evidence/`, exact pushed commits, GitHub CI, and a fresh destination-host +validation are the portable evidence. + +No credential values are stored in this directory. The Kapa integration ID is a +public browser identifier; authenticated browser sessions and cookies are not +portable and must be re-established on the destination host if needed. diff --git a/.goal-task/oink-site-improvements/lessons.md b/.goal-task/oink-site-improvements/lessons.md new file mode 100644 index 000000000..0155cdb8f --- /dev/null +++ b/.goal-task/oink-site-improvements/lessons.md @@ -0,0 +1,224 @@ +# OINK Site Improvements — Reusable Lessons + +## Bound review-fix convergence + +Use at most three broad review-fix rounds for one milestone. A fourth or fifth +round is reserved for a reproducible release-blocking Critical and must be +narrowly scoped to that finding. Record remaining lower-severity work instead +of repeatedly invalidating an otherwise complete matrix; keep only the affected +gate open and continue independent lanes. + +## Parse browser request syntax, then validate emitted targets + +Regex-only URL scanning missed CSS escapes, quoted URLs with spaces, +`image-set()`, SVG IRIs, duplicate HTML attributes, and list-valued image +attributes. A publication gate should tokenize each browser request surface, +apply one scheme/authority policy, and resolve same-origin resources against +the emitted artifact so a safe-looking but missing target cannot pass. + +When a theme embeds `data:` control images but the site forbids rendered data +URLs, externalize the complete theme variable set and test historical overlay +copying. A successful latest build does not prove version artifacts contain the +same shared static resources. + +## Canonicalize both sides of destructive path checks + +- Symptom: the versioning output-cleanup regression test deleted two isolated + worktrees created below `/tmp`, even though the test expected repository-root + cleanup to be rejected. +- Root cause: on macOS, `/tmp` resolves to `/private/tmp`. The candidate output + path was canonicalized while the repository root used for the safety + comparison was not, so equal paths appeared different. +- Evidence: the first run removed the versioning worktree; a later full-suite + run independently removed the Community worktree after its focused tests and + Hugo build had passed. Both branch refs survived, but uncommitted files did + not. +- Partial fix: commit `f1bffd0827d217ad17eecf5ba00ace793ecf3ff3` + canonicalizes the current repository boundary and rejects its root, + ancestors, and descendants. Its focused regression passes, but a third + deletion of a different parallel worktree proves that current-checkout + protection alone does not establish cross-worktree safety. +- Complete guard: commit `178f300c59cebb3ea4b9c135162108a24aeab6ef` + enumerates every registered Git worktree, rejects equal/ancestor/descendant + relationships, detects `.git` markers for prunable or unregistered + checkouts, and fails closed when enumeration is unavailable. Its regression + first failed against the old implementation, then passed after the fix; a + live registered `/tmp` sibling was also rejected with deletion mocked. +- Prevention: before any recursive cleanup, resolve both the protected + boundary and candidate path, then test equality and both ancestor + directions. Include a platform alias case such as `/tmp` versus + `/private/tmp`, enumerate Git worktree boundaries when multiple checkouts + share one repository, and do not run broad cleanup tests until the + cross-worktree case is proven. + +## Checkpoint isolated parallel work before broad validators + +- Symptom: Community implementation that had already passed eight focused + tests, offline roster validation, and a Hugo build was lost when a later + unrelated full-suite validator removed its worktree. +- Cause: a broad validation surface exercised destructive code outside that + lane's ownership before the lane had made a recoverable checkpoint. +- Prevention: after each focused green batch in an isolated worktree, create a + scoped local commit before running broad cross-subsystem validation. Broad + validators remain mandatory, but they run after destructive-path guards and + from a location whose recovery boundary is understood. +- Additional evidence: the first reviewer-fix batch passed 16 focused tests but + was still lost before its checkpoint when the `/tmp` worktree disappeared a + third time. High-risk parallel work now uses a worktree under + `/Users/zhu/.codex/worktrees/` until the cross-worktree cleanup cause is + proven and fixed. + +## Isolate Hugo caches when debugging failed resource pipelines + +- Symptom: after a Sass compilation error, the next Hugo build waited with zero + CPU instead of reporting the next error. +- Evidence: a process sample showed Hugo goroutines waiting; rerunning the same + source with a fresh `HUGO_CACHEDIR` immediately reported the next unsupported + Sass expression, and the final isolated-cache build completed. +- Prevention: parallel worktrees and failure diagnosis use distinct Hugo cache + directories. Treat a post-failure cache wait separately from the source error + and do not infer that the template itself is deadlocked. + +## Preserve browser CSS functions through the repository Sass compiler + +- Symptom: Node UI contracts passed, but Hugo rejected CSS Level 4 + `rgb(r g b / a)` and tried to numerically evaluate `min()` containing + viewport units. +- Root cause: the current Sass transformer parses those functions before the + browser can evaluate them. +- Fix: use compatible `rgba(r, g, b, a)` colors and quote/unquote browser-owned + `min()`, `max()`, `env()`, and nested `calc()` expressions. +- Prevention: every style batch must pass the actual Hugo production build; + JavaScript or textual contract tests are insufficient compilation evidence. + +## Propagate release-scope inputs through every validation boundary + +- Symptom: a latest-only staging artifact validated immediately after build, + but aggregate revalidation would have interpreted historical selector URLs + without the production historical origin. +- Root cause: `historical_origin` reached build and direct validation but was + dropped by the aggregate CLI and workflow step. +- Fix: make the aggregate parser, artifact revalidation namespace, and workflow + environment/command carry the same value; validate both the production + five-version aggregate and a staging latest-only aggregate. +- Prevention: treat build, upload, download, aggregate, revalidation, and + publish as one parameter-propagation chain. A contract input is complete only + when the final consumer receives it and a workflow test proves the wiring. + +## Match browser fixtures to the contract under test + +- Symptom: latest UI, search, AI, and accessibility checks passed against a + direct Hugo build, while all aggregate/version-history checks failed. +- Root cause: the browser suite was pointed at a latest-only site, which cannot + contain aggregate metadata, archived routes, aliases, or the materialized + five-version selector. +- Prevention: run latest behavior against a direct fixture only when isolated + evidence is useful; run the full blocking suite against the exact + five-version aggregate. Classify fixture-shape failures separately from + product regressions, then rerun with the correct artifact before reporting. + +## Use fallback when a Playwright fault injector must preserve remapping + +- Symptom: integrated search retry made two requests but never rendered a + result; the same behavior had passed in PR-A alone. +- Root cause: the test-specific route aborted the first hashed index request + and used `route.continue()` for the second. That bypassed the shared handler + which remaps production-origin URLs to the local aggregate. PR-A passed only + because its hash happened to exist on production; the PR-B-integrated hash + correctly returned 404 there. +- Fix: use `route.fallback()` after the injected failure so the shared artifact + handler fulfills the retry from the local aggregate. +- Prevention: fault-injection routes should terminate only the intended + failure attempt. Successful attempts must delegate through the same fixture + routing chain used by the rest of the suite, so tests never depend on live + deployment hashes. + +## Validate version switching as a logical-page contract + +- Symptom: the five-version order, version roots, builds, and broad browser + checks were green, but switching from a deep documentation page still sent + users to the target version's Docs root. +- Root cause: root-level version metadata proved that each release existed but + did not encode whether the current logical page had an equivalent in each + target release. +- Fix: generate a deterministic route map from all five canonical inventories, + materialize page-specific selector options for every rendered artifact, and + use one Hugo partial for desktop, mobile, and Palette entry points. Preserve + query/hash only for true equivalents; otherwise use the matching locale Docs + root plus a one-shot fallback sentinel and notice. +- Prevention: validate exact forward, missing/null, and reverse equality + between the route map and every version's canonical inventory. Browser tests + must cover equivalent and missing EN/CN pages through all selector surfaces; + version ordering and root-URL assertions alone do not prove page semantics. + +## Keep manifest-derived behavior in every supported entry point + +- Symptom: CI artifacts had five route-aware versions, while the documented + direct `hugo server` and strict-build commands rendered no configured + versions. After adding a manifest-aware wrapper, native anchors became + correct but Palette still consumed root-only action-manifest options. +- Root cause: configuration, native links, and action manifests were produced + at different layers. Fixing only the command or visible anchors did not make + the render-time action contract equivalent to the postprocessed CI artifact. +- Prevention: every documented build/serve entry point must derive from the + same manifest and must prove both visible anchors and embedded action + manifests on a deep page. A live-reload server test must exercise Palette, + because build-after-processing evidence cannot prove development-server + behavior. + +## Test every publication-origin mode independently + +- Symptom: production and latest-only staging passed, but full staging would + fail when an archived version lacked a latest-shared page. +- Root cause: the missing shared-route rewrite hard-coded the production + origin. That happened to be correct for production and latest-only staging + history, but contradicted full staging where both current and historical + versions share the staging origin. +- Prevention: test production full, staging full, and staging latest as three + distinct origin matrices. Shared-route fallback follows the current artifact + origin; only historical selector destinations use `historical_origin`. + +## Model renamed-page equivalence separately from canonical identity + +- Symptom: historical readme-to-readme switching was fixed, but latest + `introduction` still could not reach older `introduction/readme` pages. +- Root cause: some versions contain both a section landing and a readme while + older versions contain only the readme. Collapsing both canonical pages into + one ID loses information; keeping them unrelated loses a valid migration. +- Prevention: keep the canonical inventory one-to-one and record explicit, + disjoint, locale-matched equivalence groups. Resolve an exact target first; + only a unique alternate may count as equivalent. Alias edges must terminate + at a canonical page in the same artifact before authorizing a cross-version + target. + +## Use dedicated contracts for corpus provenance and social images + +- Symptom: LLMSFULL existence checks accepted mixed-locale or non-canonical + `Source:` rows, while generic URL validation accepted `mailto:` as a social + image. +- Root cause: broad URL checks prove syntax classes, not corpus provenance or + image semantics. +- Prevention: parse every Source row, bind the first and subsequent rows to + the exact locale/origin/version, reject query/fragment delimiters and + normalized duplicates, and forbid historical corpora. Validate `og:image` + and `twitter:image` separately as HTTPS or safe local image targets that + actually exist. + +## Apply one browser-safe URL shape policy to every request surface + +- Symptom: strict alias checks rejected external and protocol targets, but + `https:///docs/...` still passed ordinary link, `srcset`, object/media, and + CSS validation because Python parsed it as an HTTP URL with no authority and + a local-looking path. +- Root cause: URL trust checks were attached to individual consumers. Python + RFC parsing and browser WHATWG parsing disagree on malformed slash, + backslash, whitespace, and authority forms, so a path-only check can + authorize a browser request to another host. +- Prevention: validate URL shape before resolution and apply it to links, + actions, meta refresh, active resources, every `srcset` candidate, object and + media fields, inline styles, static CSS, action manifests, and artifact + metadata. HTTP(S) always requires an authority; protocol-relative, + backslash, whitespace/control, and ambiguous forms fail before origin or + target checks. Artifact validation must invoke the complete rendered + security scan, not assume a prior build-stage scan covers post-processing or + downloaded artifacts. diff --git a/.goal-task/oink-site-improvements/pr-a-body.md b/.goal-task/oink-site-improvements/pr-a-body.md new file mode 100644 index 000000000..5604c2e23 --- /dev/null +++ b/.goal-task/oink-site-improvements/pr-a-body.md @@ -0,0 +1,72 @@ +## Before → after + +| Before | After | +| --- | --- | +| Three release entries were split across configuration and build behavior. | `versions.json` drives one immutable `latest / 1.7 / 1.5 / 1.3 / 1.0` release contract, including selectors, aliases, SEO, and aggregate metadata. | +| Summary search had no durable load-failure recovery path. | Native summary search remains primary and exposes distinct empty/error states with a stable keyboard-accessible retry. | +| No optional AI integration contract existed. | Kapa is disabled by default, locale-bound, and loaded only after an explicit click; timeout, late response, and retry remain isolated from native search. | +| CI mixed build and publication concerns. | Fixed event plans build immutable artifacts, revalidate the aggregate, run Chromium gates, and publish only to reviewed ASF targets with minimal permissions. | + +## Main changes + +- Add the shared OINK shell behavior for navigation, version/locale-scoped + sidebar state, mobile isolation, focus restoration, theme, image zoom, + Backlinks, and Blog copy-link behavior. +- Keep local summary search authoritative while adding an optional Search Tail + + Floating Launcher Kapa adapter with privacy-safe click gating. +- Generate bilingual latest-only `llms-full.txt` files without adding them to + historical releases or making Kapa a build dependency. +- Build five immutable releases and preserve production historical links from + latest-only staging. A deterministic 195-page route map keeps users on the + equivalent logical page when it exists and gives a locale-correct, + one-time-explained Docs-root fallback when it does not. +- Replace the previous workflow with fixed production/staging plans, + short-lived artifacts, aggregate/security validation, Node 24, Playwright, + Chromium, and fixed ASF publication targets. +- Apply one fail-closed rendered-request policy to HTML, SVG, CSS, list-valued + image attributes, runtime URLs, and authored content boundaries. Bootstrap + control SVGs and shared historical assets remain local and version-complete. + +## Ask AI direction + +The selected design combines a contextual Search Tail with a restrained +Floating Launcher. It excludes a persistent side panel and the old red/pink +assistant treatment. + +<img width="860" alt="Ask AI interaction direction comparison" src="https://github.com/user-attachments/assets/013cceaa-fd72-47cf-88ff-69224e0ce32b" /> + +Full decision record: https://github.com/apache/hugegraph-doc/issues/467#issuecomment-5541691334 + +## Validation + +- `bash dist/validate-links.sh` +- `python3 -m unittest discover -s scripts -p 'test_*.py' -v` — 124 passed +- `node --test tests/ui-ai/*.test.cjs` — 23 passed +- `node --test tests/e2e/workflow-contract.test.cjs` — 6 passed +- Five-version production aggregate — 1,082 HTML, 3,528 published files, + 10 error documents; all 195 logical route entries pass exact + forward/missing/reverse validation, including two explicit EN/CN renamed-page + equivalence groups +- Latest-only ASF OINK staging aggregate — 276 HTML, 845 published files, + 2 error documents; every historical selector remains on the production + origin +- Full ASF OINK staging aggregate — 1,082 HTML, 3,528 published files, + 10 error documents; current and historical routes remain on staging +- AI-enabled fixture — 276 HTML, 840 files +- EN/CN LLMSFULL — 87 canonical, unique, same-origin sources per locale; + historical LLMSFULL outputs remain absent +- Historical social metadata — 1,530 matching OG/Twitter entries with all four + version-scoped fallback images present; 59 static redirects are explicitly + distinguished from content pages +- Blocking Chromium suite — 32 passed, 3 expected PR-B-only skips +- Advisory visual matrix — 8/8 +- Authored-content boundary scan — ordinary, Print, and landing Print outputs + retain balanced markers; media nesting and duplicate attributes fail closed +- Final integrated re-review — exactly 3 independent reviewers, 3/3 CLEAR + +## Delivery boundaries + +- Kapa remains disabled until the reviewed EN/CN source groups, staging corpus, + CSP hosts, and live privacy/failure smoke checks pass. +- Community roster and content pilots remain isolated in PR-B. +- Full-content local search remains deferred and is tracked in #471. diff --git a/.goal-task/oink-site-improvements/pr-b-body.md b/.goal-task/oink-site-improvements/pr-b-body.md new file mode 100644 index 000000000..a089fe5ff --- /dev/null +++ b/.goal-task/oink-site-improvements/pr-b-body.md @@ -0,0 +1,42 @@ +## Before → after + +| Before | After | +| --- | --- | +| Community did not expose the ASF HugeGraph project roster. | One reviewed data bundle renders 12 PMC members and 10 Committers consistently in HTML, Print, and Markdown. | +| Member identity presentation could require browser-side lookups. | The page performs zero visitor-side roster requests; the confirmed empty GitHub mapping uses deterministic initials and ASF phonebook links. | +| Core documentation entry queries relied only on body text. | Restrained metadata for 12 bilingual entry groups places all 24 fixed queries in the Top 3 of the real OINK summary search. | +| Confirmed OINK content primitives were not exercised in product documentation. | Three latest-only bilingual page groups pilot steps, command/file controls, field anchors, wide tables, and request/response blocks. | + +## Main changes + +- Add a deterministic ASF roster refresh/validation pipeline using the public + committee, LDAP project, and LDAP people datasets. +- Preserve the last-good roster atomically: install and validate candidate + images first, replace the data bundle last, then clean orphaned assets. +- Render Project members after participation guidance with a 5/3/2 responsive + grid and same-origin 128×128 WebP assets. +- Keep GitHub mappings empty for this delivery. No identity is inferred from a + name, email address, organization membership, or commit history. +- Add bounded search metadata only to the 12 agreed EN/CN entry groups. +- Apply native OINK content components only to the three agreed bilingual + latest-page pilots. + +## Validation + +- Offline roster and rendering contracts: 35 passed +- Combined Python suite: 112 passed +- Actual OINK search ranking: 24/24 fixed queries in the Top 3 +- Community HTML/Print/Markdown parity: 12 PMC + 10 Committers +- Responsive grid: 5 columns at 1440px, 3 at 900px, 2 at 390/320px +- Integrated Node/Chromium gate: 49/49 +- Integrated five-version aggregate: 1,082 HTML, 3,414 files, + 10 error documents +- Advisory visual capture: 8/8 + +## Dependency + +This change is intentionally isolated from the shared shell, versioning, +workflow, and test workspace owned by #472. It will be rebased onto the merged +PR-A baseline before final merge. + +Closes #468 diff --git a/.goal-task/oink-site-improvements/state.md b/.goal-task/oink-site-improvements/state.md new file mode 100644 index 000000000..ace3b01bc --- /dev/null +++ b/.goal-task/oink-site-improvements/state.md @@ -0,0 +1,568 @@ +# OINK Site Improvements — Execution State + +## Status + +- Phase: cross-host handoff preparation after all local delivery code was + pushed. `handoff.md` is the portable destination-host entrypoint. +- PR-A is ready for review and its exact-head CI is fully green; required human + review remains pending. PR-B is pushed but its PR has not been created. +- Progress: 0/7 completion gates. +- Work-completion estimate: 65%; this is not a gate count and does not waive + any of the seven conjunctive completion gates. +- Resume entrypoint: refresh PR #472 exact head and required human review. CI + run `33934549197` is fully green as of the 2026-09-05 handoff refresh. If + branch protection permits, merge PR-A without override; then refresh + `master` and create PR-B from the already-pushed + `feat/oink-community-content` branch with `Closes #468`. + +Review-loop limit confirmed by the user: + +- Default to at most three review-fix rounds per milestone. +- Extend only a reproducible release-blocking Critical finding to a fourth or + fifth narrow re-review; never restart a broad review cycle. +- At the cap, record remaining non-high-severity findings in `todo.md` or the + final issue and continue independent work. An unresolved high-severity + finding keeps only its affected release gate open; it does not stop unrelated + lanes. + +## Confirmed outcome and scope + +Implement the complete plan in +`.goal-task/oink-site-improvements/design.md`: + +- PR-A: OINK core platform, five-version routing, Ask AI, CI/CD, and browser + acceptance. +- PR-B: ASF Project members, search metadata, and bilingual content-component + pilots. +- PR-C: the second-phase ASF-aware download experience after the first phase is + stable. +- Complete the specified Issue #467/#468 and full-text-search issue work, plus + the non-blocking OINK upstream proposals. + +The deferred list in the design is out of scope. Do not import the Docusaurus +implementation, translate missing historical content, mechanically rewrite +other pages, or make Kapa a dependency of native search or site publication. + +Unattended authority confirmed by the user: + +- Once required CI, branch protection, and any required human review all pass, + mark PR-A, PR-B, and PR-C ready and merge them without another prompt. +- Never use an administrator override or bypass a required review/check. +- Keep PR-B GitHub mappings empty and use the deterministic initials fallback; + do not infer or populate the 22 member identities. +- Continue the reviewed Kapa source-group/domain configuration without another + prompt. Only an expired session, CAPTCHA, or equivalent interactive account + challenge requires the user to return. + +## Current exact-head checkpoint + +Latest authoritative checkpoint at pause: + +- PR-A is clean and pushed at + `25f3e8c3f7982cbf1d08c4bda572e9da9add79eb`. PR #472 is no longer a draft; + it is `REVIEW_REQUIRED`. Exact-head CI run + `https://github.com/apache/hugegraph-doc/actions/runs/33934549197` completed + successfully across prepare, all five version builds, aggregate, E2E, + visual, and deploy; publish was correctly skipped for the PR event. Do not + merge until required human review and branch protection are green. +- PR-B is clean and pushed at + `bb270838626165ad2c98c11150dde39f4eb113c9` on + `origin/feat/oink-community-content`; no PR exists yet. +- Integration is clean at + `81092317458740eeaf9da8b289cb0ea7f226aaf2`. Its tree is byte-identical to + the synthetic union of the pushed PR-A and PR-B heads, so the local + integration branch contains no unique unpushed code. +- Remote `master` was rechecked immediately before both pushes and remained + `d88167dd797efafea50cec59909d57849703fde5`. +- The checkpoint applies one browser-safe contract to HTML, SVG, CSS, + `srcset`/`imagesrcset`, runtime `data-td-*` URLs, form/navigation attributes, + duplicate attributes, CSS escapes/functions, and local resource existence. + All rendered resource `data:` URLs are forbidden. Bootstrap's 20 embedded + control SVGs are now local files, and historical overlays copy those files + plus the two shared homepage hero images. +- PR-A exact-head matrix is fully green: links; Python 124/124; UI/AI 23/23; + workflow 6/6; production and staging-full five-version 1082-HTML aggregates; + 195-route byte equality; staging-latest 276 HTML; Chromium 32 passed with + three expected PR-B-only skips; visual 8/8. Evidence: + `/private/tmp/hgdoc-pra-25f-final.0CodtH/`. +- Integration exact-head matrix is fully green: links; Python 161/161; UI/AI + 23/23; workflow 6/6; production and staging-full five-version 1082-HTML + aggregates; route byte equality; staging-latest 276 HTML; Chromium 35/35 + with zero skips; visual 8/8; marker pairs 1009/1009 with zero unpaired; + Community landing HTML/Print EN/CN 4/4. Evidence: + `/private/tmp/hgdoc-integration-810-final.LiNnlr/`. +- The final integrated review stopped at the user-confirmed three-round cap. + The third round used exactly three independent reviewers and finished 3/3 + CLEAR with no unresolved material finding. +- Local preview servers at ports 4186 (PR-A) and 4187 (integration) were + stopped as part of the pause; both ports are no longer listening. +- PR-C baseline inventory is complete but implementation remains correctly + gated behind first-phase stability. EN/CN currently duplicate the same 31 + ASF artifacts and 93 mirror/ASC/SHA512 links per language. The planned + implementation uses one restricted ASF data source and a site adapter rather + than OINK's GitHub-release-only download resolver. + +Historical checkpoint detail below is retained as failure/recovery evidence; +any head or active status there is superseded by the latest checkpoint above. + +- PR-A local HEAD is + `73f31a44dd9c39e70fc2b8ce412ac56040d6b5b7`, twelve commits ahead of the draft + PR's remote head + `3adba9eeb7c0cbaa83d1568243954aab480f965a`. Remote `master` and the PR base + were re-fetched on 2026-09-05 and remain + `d88167dd797efafea50cec59909d57849703fde5`. +- The first exact-head PR-A matrix at `dc51b02e` passed links, Python 101/101, + UI/AI Node 23/23, workflow 6/6, and the first three production builds, then + correctly stopped when artifact validation exposed that the new social + validator rejected Hugo alias/redirect pages without social tags. Its + temporary evidence was removed after the failure was recorded here. +- Repair `127fbd733` identifies redirects before social validation, permits + only redirects with both social tags absent, and retains strict 1+1 matching + metadata on content pages and partial-tag failure. The final exact-head + PR-A matrix is fully green: links, Python 102/102, UI/AI Node 23/23, + workflow 6/6, production and staging-full five-version builds (1082 HTML), + staging-latest (276 HTML), 195-route byte equality, exact AI fixture, + Chromium 32 passed with three expected PR-B-only skips, and visual 8/8. Its + temporary evidence was removed after later validator commits superseded it. +- The integration worktree is clean at + `1d6e1303ff38bd1fc7e3b148e6da3628eb26a10c`, containing PR-A, PR-B, all + logical-equivalence/LLMS/social hardening, and the redirect-validator repair. + The superseded `aae94cdc6` matrix passed links, Python 136/136, UI/AI Node + 23/23, workflow 6/6, and all five production builds before reproducing the + same redirect false positive and stopping. That superseded temporary evidence + was removed after its failure was recorded. The final exact-head integration + matrix is now fully green: links, Python 137/137, UI/AI Node 23/23, + workflow 6/6, production and staging-full five-version builds (1082 HTML), + staging-latest (276 HTML), exact route equality, AI fixture, Chromium 35/35 + with zero skips, ranking 24/24, Community parity across all three artifact + modes, and visual 8/8. Evidence: + `/private/tmp/hgdoc-integration-97643.dYy6VS/` (removed after the new head + superseded it). Exactly three independent reviewers reviewed frozen clean + head `97643b328`: reviewer #1 was CLEAR; + reviewer #3 found that ordinary meta-refresh aliases can reuse a generic URL + validator that permits external/protocol URLs, while route generation can + discard an external authority and treat its path as local. The repair must + require same-origin, same-version-scope, existing artifact targets for + ordinary aliases while retaining only the exact `client-go` exception. + Reviewer #2 found that the security validator's fixed error-document list + covered only root/1.7/1.5 and omitted 1.3/1.0, even though the current ten + generated 404 pages are correct. The fix derives the complete set from the + version manifest and proves security-only publication checks reject SEO + regressions for every version. Those two fixes initially over-constrained + the intentional archived home redirects, which a new matrix and two + reviewers caught before push. Commit `8c99d6d` / integration `cca2d0b1e` + now permits only the exact archived English and Chinese home redirects while + retaining strict ordinary-alias validation. Focused tests and all four real + historical artifact validations pass. The next re-review found one remaining + WHATWG/parser ambiguity: `https:///...` has no authority under Python + `urlsplit` but browsers can interpret its first path segment as a host. + Commit `2b4e221` / integration `a7e349d` rejects authority-less HTTP(S) + aliases plus all whitespace/control characters and adds failing-first + fixtures. The following adversarial review proved aliases themselves closed + but found the same authority-less HTTP(S) ambiguity in ordinary rendered + links and the aggregate security-only validator. Commit `600b828` / + integration `8ad410135` centralizes the fail-closed URL-shape rule across + ordinary version validation and security-only/full aggregate scans, rejecting + authority-less HTTP(S), whitespace/control, backslashes, and protocol-relative + forms. The next adversarial review proved ordinary links closed but found + `srcset`, object/media resources, and CSS tokens were not all routed through + that policy. Commit `73f31a4` / integration `1d6e1303f` applies one shape + validator to every HTML/CSS request token and makes artifact validation call + the complete rendered security scan. Failing-first multi-resource fixtures, + Python 109/109, production/staging-full 1082-HTML scans, and staging-latest + 276-HTML validation pass. New exact-head matrices and all exactly three + adversarial reviews remain required. +- Draft [PR #472](https://github.com/apache/hugegraph-doc/pull/472) was + fast-forwarded without force to exact reviewed head `3adba9eeb`; remote + `master` remained `d88167dd7`. CI run + [33905024759](https://github.com/apache/hugegraph-doc/actions/runs/33905024759) + was cancelled while queued after the integrated review proved that head + incomplete; its cancelled jobs are not acceptance evidence. The PR remains + draft and `REVIEW_REQUIRED`; its body is prepared with the latest local + counts but must not be updated remotely until the new exact-head matrices and + three reviews clear. + +## Active truth and authority + +Use this order when sources conflict: + +1. latest user confirmation; +2. `.goal-task/oink-site-improvements/design.md`; +3. current source and tests at the refreshed Apache `master`; +4. Apache HugeGraph issues and PRs; +5. this state file and `todo.md`. + +Active paths: + +- `.goal-task/oink-site-improvements/design.md` — authoritative product, + interface, release, and acceptance design. +- `.goal-task/oink-site-improvements/state.md` — execution contract, gate + evidence, recovery entrypoint, and next action. +- `.goal-task/oink-site-improvements/todo.md` — item-level status, dependencies, + waits, and deferrals. +- `.goal-task/oink-site-improvements/lessons.md` — evidence-backed reusable + lessons promoted after concrete failures; not a progress log. +- `versions.json`, `hugo.yaml`, `.github/workflows/hugo.yml`, + `scripts/versioning.py`, `scripts/test_versioning.py`, and + `scripts/test_validate_site_output.py` — current implementation and validator + baseline. + +`AGENTS.md` still describes the pre-OINK Docsy/Hugo 0.102.3 site. Follow its +general bilingual and evidence requirements, but resolve obsolete technical +facts from the current source and CI. Updating it is not part of the confirmed +product scope. + +## Baseline + +- Initialized: 2026-09-04, Asia/Shanghai. +- Worktree: + `/Users/zhu/.codex/worktrees/10a2/hugegraph-doc`. +- Remote target: `https://github.com/apache/hugegraph-doc.git`. +- Baseline revision: `d88167dd797efafea50cec59909d57849703fde5`. +- `HEAD` and `origin/master` were equal and the worktree was clean at + the latest refresh. The primary worktree now uses + `feat/oink-core-platform` at that revision. +- GitHub account `imbajin` was authenticated with push access to + `apache/hugegraph-doc`. +- The refreshed baseline used OINK `v1.0.0`, Hugo `0.165.0`, and three + versions. PR-A now derives `latest / 1.7 / 1.5 / 1.3 / 1.0` from + `versions.json` and includes a Node 24/Playwright workspace. +- Issues #467 and #468 are open. No existing PR is assigned to PR-A, PR-B, or + PR-C. +- Full-content local search is now tracked separately in Apache + [Issue #471](https://github.com/apache/hugegraph-doc/issues/471); it records + the current summary baseline and labels the 233–243 KiB gzip figure as an + estimate rather than current-HEAD evidence. +- The Issue #467 Ask AI comparison board was generated with built-in + `image_gen` and saved as + `.goal-task/oink-site-improvements/evidence/ask-ai-visual-directions.png` + (1717×916, SHA-256 + `68a97ffa93941608fa6d112e77331e464df59a824b8073ebf1c5543a472c98c2`). + The recorded decision combines Search Tail and Floating Launcher, excludes a + persistent side panel and the old red/pink UI. It is published as + [Issue #467 V8 evidence](https://github.com/apache/hugegraph-doc/issues/467#issuecomment-5541691334); + final staging screenshots remain a later append-only checkpoint. +- Kapa website/integration ID + `0b277570-4740-451e-96fa-1e4ac1ac5e88` is confirmed in the authenticated + Apache HugeGraph admin project. The synchronized browser session is active. + Existing sources and the single `HugeGraph` product group were inspected + read-only; reviewed latest EN/CN source-group IDs do not yet exist. The + widget currently allows production and general staging, but not the + dedicated `https://hugegraph-oink.staged.apache.org` origin. Do not create + groups, sources, or the domain entry until the matching staging LLMSFULL + corpus exists. +- Baseline validation on the original initialization revision passed + `bash dist/validate-links.sh` and + `python3 -m unittest discover -s scripts -p 'test_*.py' -v` + (66 tests). +- Apache master then advanced through #470 from `b1ed7eb84` to + `d88167dd7`, synchronizing 1.7 content and changing 111 paths, including + `scripts/versioning.py`, its tests, both Docs roots, and planned content-pilot + pages. The primary and every implementation lane must use the new revision. +- A second direct `git fetch`, `git ls-remote origin refs/heads/master`, and + main-checkout comparison on 2026-09-04 confirmed + `origin/master = local master = d88167dd797efafea50cec59909d57849703fde5`. + PR-A, PR-B, UI, and versioning worktrees all reported this revision as an + ancestor before further integration. +- On `d88167dd7`, link validation and all 67 Python tests passed. + Baseline `hugo --minify` also passed with Hugo + `v0.165.0+extended`; it produced 520 EN/CN pages and 814 files in an isolated + temporary destination. +- The first versioning-lane baseline run exposed an existing path-safety defect: + `prepare_output_directory()` can treat a `/private/tmp` checkout root as a + disposable output after path canonicalization. The isolated worktree was + removed, its branch reference remained intact, and that lane must add a + regression guard for repository roots, ancestors, and checkout descendants + before continuing. +- The same defect later deleted the Community lane after its uncommitted roster + work had passed eight focused tests, offline validation, and a Hugo build. + The branch/worktree was rebuilt at `d88167dd7`; that lane is reconstructing + from retained tool evidence and must checkpoint small validated commits before + broader tests. Until the safety fix lands, no `/tmp` implementation worktree + may run the affected full versioning suite. +- Safety checkpoint `f1bffd0827d217ad17eecf5ba00ace793ecf3ff3` + was integrated into PR-A as `4753dedb7`; the focused deletion regression and + the complete 67-test Python suite both pass from the primary worktree. +- Despite that focused/current-checkout pass, the Community `/tmp` worktree was + deleted a third time while reviewer fixes were uncommitted. The versioning + lane and PR-B design review were interrupted; the Community branch was moved + to `/Users/zhu/.codex/worktrees/hgdoc-oink-community-review`. Cross-worktree + cleanup safety is an active high-priority investigation, and broad cleanup + tests remain paused outside the primary worktree. +- Read-only process and source audit found no command that intentionally + targeted the Community path and no surviving cleanup process. It confirmed a + remaining safety gap: `prepare_output_directory()` protects only its current + `ROOT`, not sibling or prunable Git worktrees. The active hypothesis is to + fail closed for every registered worktree plus any candidate below a `.git` + file/directory ancestor; a failing sibling-worktree regression must precede + the fix. +- Cross-worktree fix `5edda2d59` is now integrated. The old implementation + failed the new sibling-checkout regression before the fix; afterward four + focused safety tests, the complete 70-test Python suite, and a live + registered `/tmp` sibling check with `shutil.rmtree` mocked all rejected + deletion before it could occur. +- UI/AI checkpoints were integrated as `61e20f455` and `8d5bf876e`. + Integration found additional Sass compilation failures not covered by the + Node contracts. Commit `70fa04695` fixes the shared root cause; with an + isolated Hugo cache, the production build passes (520 pages, 817 files) and + all eight UI/AI Node tests pass. +- UI/AI hardening `4d6593dc6` is now integrated. The combined PR-A tree passes + 12/12 UI/AI Node contracts and all 67 Python tests. Default and AI-enabled + Hugo builds, enabled-artifact security validation, invalid-config failure, + sidebar/search browser interactions, click-before-zero-external-resource + checks, and the 1200×630 social image were independently exercised by the + lane; real Kapa opening and staging-derived CSP hosts remain external gates. +- Five-version core commit `9c14050d5` is integrated. The lane built and + validated latest, 1.7, 1.5, 1.3, and 1.0 from immutable refs with route, + canonical, manifest, alias, hreflang, and historical sitemap checks. The + workflow/E2E checkpoint and single-source handling for the static Hugo menu + remain under active integration. +- PR-A is now at `474874c` and includes the secure fixed-target workflow, + per-build immutable SHA fetch, 24-query browser ranking gate, shell/AI/ + Community/axe Chromium gates, eight advisory visual states, archive robots + fixes, and manifest-derived Hugo menus. The static version arrays were + removed from `hugo.yaml`. +- PR-A reviewer fixes are now checkpointed through `401134d`. Commit + `d3cf6cc` preserves production historical selectors in latest-only staging + and rejects existing parent symlinks before cleanup; `ffc41ad` stabilizes + search retry DOM, forces fresh Kapa retry requests, blocks late renders, + derives Kapa colors from the site token, and limits Backlinks to five before + expansion; `72989ad` propagates the historical origin through aggregate + revalidation and CI. The first reviewer re-review then found cross-operation + publication concurrency, a symlinked `RUNNER_TEMP` root, dark Kapa accent + drift, and a stale retry tooltip. Commits `79d12ba`, `1e7258f`, and + `67ff2e8` close those findings with targeted regressions. Current exact-HEAD + checks pass Python 77/77, UI/AI Node 15/15, and workflow contracts 5/5. A + direct latest-only browser fixture also + passes all 14 applicable latest/UI/AI/accessibility checks; the full + versioning browser lane passes against the current five-version aggregate: + 26 passed with 3 expected PR-B-only skips. The same aggregate contains 1082 + HTML files, 3413 published files, and 10 error documents; latest-only staging + aggregation contains 276 HTML and 822 published files with all historical + selectors remaining on the production origin. + The final three-reviewer cycle on `401134d` is clear for correctness, + design/accessibility, and security/privacy; no material finding remains. +- PR-A was pushed directly to Apache and opened as draft + [PR #472](https://github.com/apache/hugegraph-doc/pull/472). Its remote head + is exactly `fe551ba06a9afed24c864759acb8c257fb29c238` and base is `master`. + The first CI run built all five versions, then exposed a leading-dash + argparse seam in aggregate. Commit `fe551ba` binds the run-scoped suffix to + its option; workflow contracts are now 6/6 and the replacement exact-head CI + run is queued. No duplicate PR or branch existed before creation. +- PR-B implementation is checkpointed in six commits ending at + `d50bc28e85835e9325ff6b0e9ac789156a9e22bd`. Nine focused roster tests, + offline roster/render validation, minified Hugo build, 22-member parity + across six EN/CN HTML/Print/Markdown outputs, both LLMSFULL outputs, 276-HTML + security validation, link validation, and diff checks pass. Browser ranking, + the three-reviewer gate, and any human-reviewed GitHub mappings remain open. +- PR-B independent reviewer 1/3 reported four high-confidence Important + findings: unmapped ASF profile URLs were not enforced, equal public names + made ordering hash-dependent, orphan-cleanup failure could replace the + last-good roster, and product-output tests did not yet prove component/index/ + LLMSFULL behavior. The PR-B lane is fixing all four with targeted regression + evidence before reviewers 2/3 and re-review. +- Reviewer 1 re-review confirmed those first fixes, then found remaining gates + around real search ranking, CI wiring, strict Chair/avatar types and paths, + rollback-failure semantics, and fixed Hugo setup. Reviewer 2 found incorrect + Markdown ordering/title semantics, shared landing-dispatcher and LLMSFULL + ownership drift, and a stale ICC flag. Reviewer 3 added existing-avatar + verification, bounded/allowlisted network reads, actual WebP decoding, + identifier/Markdown escaping, and genuinely offline validation concerns. + PR-A now owns LLMSFULL plus ranking/CI setup; PR-B is addressing the remaining + data, section-specific rendering, and security findings before all three + reviewers re-review. +- PR-B is now at `b6e651c` after closing reviewer findings for pre-mutation path + validation, redirect allowlists, local and remote JSON schemas, real WebP + decoding, role-local real-link parsing/order, Markdown boundaries, and + cross-origin loading of its fingerprinted stylesheet. The fixed 24-query set + ranks 24/24 in the actual OINK search engine after the two targeted symmetric + boosts. +- PR-B final HEAD is `4d02fcb`. Exactly three independent reviewers re-reviewed + every fix and reported clear with no material finding. The integrated + ownership test also accepts PR-A's exact bilingual LLMSFULL contract while + continuing to reject LLMSFULL in standalone PR-B. +- Local integration branch `work/oink-integration` combines PR-A and PR-B. A + complete five-version production-origin run built and validated 3414 files, + 1082 HTML files, and 10 error documents. Blocking workflow contracts passed + 4/4 and Chromium passed 27/27; advisory visual capture passed 8/8. Screenshots + are retained under + `.goal-task/oink-site-improvements/evidence/browser/`. +- The refreshed integration head is `d91f5b55`. The first current-HEAD browser + run exposed that the search-retry fault injector used `route.continue()` and + bypassed the local aggregate remapper. Commit `58e7dba` switches the success + attempt to `route.fallback()`; the isolated regression passes and the + complete integrated Node/Chromium gate is now 49/49. The production + five-version aggregate remains green at 1082 HTML, 3414 files, and 10 error + documents; Python is 112/112 and advisory visuals are 8/8. +- OINK upstream proposals are filed as + [#40 search-tail/palette extension](https://github.com/pgsty/oink/issues/40) + and + [#41 sidebar disclosure/isolation contracts](https://github.com/pgsty/oink/issues/41). + The account has read-only code permission, so issues are the available + upstream delivery mechanism and upstream acceptance remains non-blocking. + +Refresh the remote revision, open PR/Issue state, staging/production deployment, +Kapa configuration, and write capability whenever those facts can affect an +action or claim. + +## Work structure and ownership + +- PR-A branch: create directly in `apache/hugegraph-doc` from the then-current + `master`. Use exclusive lanes for UI/AI, versioning/CI, and E2E. A single + integration owner owns shared configuration, lockfiles, workflows, generated + manifests, and the combined diff. +- PR-B branch: create directly in `apache/hugegraph-doc` from the then-current + `master`. It may run in parallel but must not edit PR-A-owned shared shell, + configuration, or workflow files. +- PR-C branch: create directly in `apache/hugegraph-doc` only after PR-A and + PR-B are integrated and the first-phase five-version build is stable. +- OINK upstream target: `github.com/pgsty/oink`. Upstream acceptance is not a + HugeGraph delivery gate; record the proposal/PR URL and retain the local + compatibility layer until a usable release exists. +- The authenticated GitHub account currently has read-only repository + permission on `pgsty/oink`; issue/proposal submission remains available, but + a direct upstream branch is not. OINK issue #24 already covered a distinct + cached-sidebar/JavaScript fallback bug and is closed, so new upstream reports + must avoid duplicating it. + +Every worker must record changed paths, exact commands, evidence, assumptions, +and unresolved risks. Workers must not overwrite another lane. The integration +owner resolves seams and reruns affected checks after combination. + +Current local branches/worktrees: + +- Integration: `feat/oink-core-platform` in the primary worktree. +- UI/AI lane: `work/oink-ui-ai` in `/tmp/hgdoc-oink-ui.Zix0W6`. +- Versioning/CI lane: `work/oink-versioning-ci`; its isolated worktree is being + reconstructed after the baseline path-safety failure described above. +- Community/content lane: `feat/oink-community-content` in + `/Users/zhu/.codex/worktrees/hgdoc-oink-community-review`. +- Integration validation: `work/oink-integration` in + `/Users/zhu/.codex/worktrees/hgdoc-oink-integration`. + +## Invariants + +- Native summary search remains complete and usable when AI is disabled, slow, + blocked, or broken. +- No Kapa active resource or request occurs before an explicit Ask AI action. + Only the trimmed query and locale-specific source group may leave the site. +- The five-version order and refs come from `versions.json`; all consumers are + derived from it. +- Historical content retains historical facts, missing Chinese pages are not + replaced with English, and only true bilingual equivalents receive + `hreflang`. +- Community roles derive from ASF public data; GitHub identity is never guessed. + Browser visitors make no GitHub or Whimsy roster requests. +- Publication code never executes untrusted candidate code in the write-enabled + job. `deploy` remains the required read-only gate. +- Staging and production native behavior remains usable if post-deploy Kapa + smoke fails. + +## Completion gates + +1. PR-A satisfies every behavior, versioning, AI, CI/CD, security, and artifact + contract in the design. +2. PR-B satisfies the deterministic roster, three-output parity, responsive + Community, search metadata, and bilingual component-pilot contracts. +3. PR-A and PR-B are merged or otherwise integrated on the reviewed target, and + one complete five-version integration build passes before publication. +4. Chrome or the available browser equivalent records functional and UI/UX + evidence for the required latest/history, EN/CN, desktop/mobile, light/dark, + keyboard, error, retry, and failure-isolation flows. Accessibility and + advisory visual results are reported separately. +5. Staging and production acceptance passes for native search, routes, legacy + aliases, language switching, Community privacy, and click-gated external + requests; initial Kapa corpus/source-group/CSP activation is verified before + enabling AI. Post-deploy Kapa smoke remains advisory as designed. +6. PR-C delivers the ASF-aware data-driven download page with mirror, official + source artifact, ASC, and SHA512 semantics, without presenting GitHub source + archives as ASF releases. +7. Issue #467, Issue #468 closure linkage, the new full-text-search issue, and + OINK upstream submissions are recorded; final integrated changes pass the + required independent review and re-review with no unresolved high-severity + finding. + +The existing confirmed repository checks include: + +```bash +bash dist/validate-links.sh +python3 -m unittest discover -s scripts -p 'test_*.py' -v +``` + +Record the exact added Node/Playwright commands only after their scripts and +lockfile exist. Do not replace browser interaction or publication acceptance +with a green build. + +## Execution loop + +Batch low-risk changes by shared module and validation surface. After each +frozen batch, run affected tests and targeted checks. Run complete builds, +browser matrices, aggregate checks, and integrated review at phase boundaries +and after the final diff freezes. Never weaken assertions, skip mandatory +checks, ignore exit codes, or report unobserved success. + +After each productive loop report: + +```text +Progress [██████░░░░] 60% (3/5 gates) +This loop: <completed work and evidence>; Remaining: <main open work>. +Next: <one primary action>. +``` + +Use the actual fixed denominator and never report 100% before all seven gates +pass. Before compaction, quota wait, handoff, or session end, update this file +with gate progress, latest commit, validation/review evidence, active waits, +uncommitted changes, and one next action. + +## Retry, waits, and recovery + +Try one failing item at most three times by default. Then record the exact +failure, evidence, attempted recovery, dependency, and unblock condition in +`todo.md`; mark it waiting, deferred, or needs input; move it and its dependents +behind independent work; continue the highest-value non-conflicting item; and +recheck at a phase boundary or when the condition changes. + +CI queues, downloads, Kapa/admin waits, staging propagation, quota limits, +first failures, and optional missing dependencies do not stop independent work. +Useful parallel work includes the next module inventory, non-conflicting +implementation, evidence maintenance, failure analysis, and acceptance +preparation. + +Set the overall goal `blocked` only when the same condition has recurred for at +least three goal turns and every meaningful remaining item, after recovery, +authorized alternatives, splitting, reprioritization, and completion of +independent work, still jointly depends on that same logical conflict, safety +boundary, or verified mandatory external dependency. + +## Authorization, safety, and remote effects + +All user-authorizable actions required inside this confirmed scope are already +approved, including local/environment changes, dependency installation, +browser uploads, entry of available credentials, worktrees, direct Apache +branches, commits, pushes, PR and Issue actions, tests, workflow dispatches, +review responses, and fixed staging/production publication. Do not ask again or +wait, defer, or mark work blocked because of an authorization prompt. + +This approval does not fabricate credentials, sessions, tools, source-group IDs, +or capabilities; override higher-priority safety boundaries; or authorize work +outside scope. Never expose or persist credential values in logs, screenshots, +state, commits, PRs, or issues. Record only redacted actions and outcomes. + +Before each destructive or remote mutation, record or verify its exact target +and impact. Direct source branches and PRs target `apache/hugegraph-doc`; +publication targets only `asf-staging-oink` or `asf-site` through the reviewed +workflow. Continue independent work when Kapa or another genuine capability is +unavailable while keeping its completion gate active. + +## Review and commits + +At every major behavior-change milestone, use exactly three independent +read-only reviewers on the integrated diff: correctness/tests, +design/boundaries, and security/maintainability. After fixes, re-review affected +changes. Run at most three fix/re-review rounds by default; unresolved failures +remain deferred and prevent completion. + +Create focused local milestone commits only after applicable validation and +review pass. Push the direct Apache branches only after rechecking their exact +head and target. A checkpoint commit may preserve a required baseline with +explicit unmet gates, but it does not imply review success or completion. diff --git a/.goal-task/oink-site-improvements/todo.md b/.goal-task/oink-site-improvements/todo.md new file mode 100644 index 000000000..47a22a91e --- /dev/null +++ b/.goal-task/oink-site-improvements/todo.md @@ -0,0 +1,168 @@ +# OINK Site Improvements — Work Items + +Item-level status, dependencies, waits, and deferrals live here. Update this +file after each productive loop; keep only counts and dependency summaries in +`state.md`. + +## Gate 1 — PR-A: OINK core platform + +- [x] Fix destructive output-path validation so canonical repository roots, + ancestors, and checkout descendants are rejected; focused regression passed + in checkpoint `f1bffd0827d217ad17eecf5ba00ace793ecf3ff3` and integration commit + `4753dedb7`. +- [x] Refresh `origin/master`, create the direct Apache PR-A branch/worktree, + and inventory current OINK extension seams, ownership boundaries, and tests. +- [x] Implement shared OINK theme tokens, five-group Documentation navigation, + single version selector, delayed pointer behavior, keyboard behavior, and + explicit sidebar collapse/restore. +- [x] Implement stable per-version/per-locale sidebar persistence, active-path + priority, stale-ID cleanup, localStorage fallback, mobile drawer isolation, + focus restoration, scroll unlock, and hamburger contrast. +- [x] Preserve summary search; add distinct no-results/load-failure states and + retry. +- [ ] Implement the click-loaded Kapa adapter and shared state machine with the + exact configuration, privacy, failure, timeout, late-response, focus, theme, + CSP, and disabled-mode contracts. Source/mock contracts are green; staging + source groups and exact observed CSP hosts remain. +- [x] EN/CN latest LLMSFULL outputs are implemented on PR-A and validated as + separate locale-specific files; real Kapa ingestion remains an external gate. +- [x] Add 1.3 and 1.0, finish making `versions.json` the sole source including + the static Hugo menu, implement immutable + ref resolution, route-map/aliases, logical-page switching, SEO/archive rules, + and genuine language fallbacks. Core build/validate is green. +- [x] Implement Backlinks, image zoom, Blog copy-link, reviewed social fallback + image, and the scoped non-content OINK capabilities assigned to PR-A. +- [x] Replace the Cartesian CI matrix with the confirmed event model, + permissions, artifact lifetimes, timeouts, aggregate/E2E/deploy gates, and + fixed publish targets. +- [x] Add the Node 24, lockfile, Playwright, and Chromium test workspace under + `tests/e2e/` without making Hugo production builds run npm. +- [x] Run targeted checks, full PR-A validation, browser acceptance, three + independent reviews, fixes, and re-review; then commit, push, and open PR-A. + Exact clean pushed head `25f3e8c` includes the rendered-request security and + authored-content boundary checkpoints. Its final matrix passes links, Python + 124/124, UI/AI 23/23, + workflow 6/6, production/staging-full five versions, staging-latest, + route-byte equality, Chromium 32 with three expected PR-B-only skips, and + visual 8/8. [PR #472](https://github.com/apache/hugegraph-doc/pull/472) is + ready for review at the exact head. +- [ ] Resume by checking CI run 33934549197 and required human review; merge + PR-A only when both are green, without override. + +## Gate 2 — PR-B: Community and content experience + +- [x] Refresh `origin/master`, create the direct Apache PR-B branch/worktree, + and confirm it does not modify PR-A-owned shared config, shell styles, + lockfiles, or workflow files. +- [x] Implement ASF roster refresh and offline validation with authoritative + owners/members/Chair/name rules, deterministic ordering, schema, staleness, + last-good atomic replacement, and orphan cleanup. +- [x] Populate any GitHub mappings only after login and numeric user ID receive + explicit human review; the current empty mapping intentionally avoids + inference and renders all 22 members through the required fallback. The user + explicitly confirmed this mapping must remain empty for this delivery. +- [x] Implement the bilingual Project members section, site-local partial, + same-origin 128×128 WebP assets, no-JS initials fallback, accessible profile + links, 5/3/2 responsive grid, and HTML/Print/Markdown parity. +- [x] Add restrained search metadata for the 12 fixed EN/CN latest entry + groups; the integrated real Lunr/Playwright gate ranks all 24 fixed queries + in the Top 3. +- [x] Apply OINK native content components only to the three confirmed latest + bilingual page groups. +- [x] Complete integrated browser matrices and exactly three independent + reviews with required fix/re-review. Final PR-B head `bb27083` is pushed to + `origin/feat/oink-community-content`; the exact integrated matrix and final + 3/3 review are green. +- [ ] After resume, create PR-B with `Closes #468`, then wait for CI/review and + merge without override. + +## Gate 3 — First-phase integration + +- [x] Combine PR-A and PR-B in a local integration worktree without changing + their independent PR ownership. +- [x] Resolve current seams and rerun source, build, aggregate, browser, + accessibility, privacy, route, CSP, and security checks. +- [x] Run one complete five-version integration build after both changes are + present. +- [x] Obtain three independent integrated-diff reviews and re-review all fixes. + Exact clean integration head `8109231` is the exact tree union of pushed + PR-A and PR-B. Its final matrix passes links, Python 161/161, UI/AI 23/23, + workflow 6/6, production/staging-full five versions, staging-latest, + route-byte equality, Chromium 35/35 with zero skips, visual 8/8, and all + marker/media/roster focused gates. The final third review round is 3/3 CLEAR. + +## Gate 4 — Browser and publication acceptance + +- [ ] Exercise every required latest/history, EN/CN, desktop/mobile, + light/dark, pointer/touch/keyboard, success/failure/retry flow in Chrome or + the available browser equivalent. The current automated matrix is 27/27 and + advisory visual capture is 8/8; delayed pointer/touch, real Kapa, and + post-deploy paths remain. +- [ ] Record each route/URL, action sequence, observed result, and before/after + screenshot; keep UI/UX, accessibility, build, artifact, CI, and PR evidence + distinct. +- [ ] Validate exact production-origin PR artifacts without publishing. +- [ ] Dispatch and validate `staging-next/latest` and `staging-next/full` using + trusted Apache branches and fixed confirmation mappings. +- [ ] Verify initial Kapa corpus, source groups, CSP, render, locale isolation, + privacy, timeout, and retry on staging before AI is enabled. +- [ ] Publish through the reviewed fixed-target workflow and verify production + and staging native-search failure isolation, routes, aliases, language + behavior, Community privacy, and click-gated external requests. +- [ ] Record post-deploy real Kapa smoke separately as advisory evidence. + +## Gate 5 — PR-C: ASF-aware download experience + +- [x] Inventory the current EN/CN download facts and OINK download resolver. + Both languages duplicate 31 ASF artifacts and 93 release links; OINK v1.0.0 + is GitHub-release-specific and has no ASC field, so PR-C needs a narrow ASF + data contract and site adapter. +- [ ] After first-phase stability, create the direct Apache PR-C branch from + refreshed `master`. +- [ ] Inventory duplicated EN/CN download facts and define the single + data-source contract without rewriting unrelated documentation. +- [ ] Implement the OINK download/checksum experience for ASF mirrors, official + source artifacts, ASC, and SHA512. +- [ ] Ensure GitHub-generated source archives are never labeled as ASF official + releases. +- [ ] Validate EN/CN parity, rendered links/artifacts, responsive browser + behavior, accessibility, three independent reviews, fixes, and re-review; + then commit, push, and open PR-C. + +## Gate 6 — GitHub issue and design evidence + +- [x] Add the prepared three-direction comparison + (`evidence/ask-ai-visual-directions.png`), the selected Search Tail + Floating + Launcher decision, and the prohibition on the old red/pink UI to + [Issue #467 V8](https://github.com/apache/hugegraph-doc/issues/467#issuecomment-5541691334). +- [ ] After staging validation, append final desktop/mobile, light/dark + screenshots and evidence to Issue #467 without overwriting history. +- [ ] Ensure PR-B closes Issue #468. +- [x] Open deferred full-text-search + [Issue #471](https://github.com/apache/hugegraph-doc/issues/471) with the + summary-search baseline, clearly labeled 233–243 KiB gzip planning estimate, + per-language/per-version performance boundary, and no implementation. + +## Gate 7 — OINK upstream and final closure + +- [x] Submit the generic search-tail extension API proposal to + `github.com/pgsty/oink`. +- [x] Submit the generic palette extension and sidebar-interaction fixes + upstream as OINK + [#40](https://github.com/pgsty/oink/issues/40) and + [#41](https://github.com/pgsty/oink/issues/41). +- [x] Record upstream URLs/status without making upstream acceptance block + HugeGraph delivery. +- [ ] Freeze the final integrated diff and evidence, rerun all applicable + completion gates, complete the final three-reviewer cycle and fix/re-review, + and confirm no unresolved high-severity finding. + +## Current waits and unresolved capabilities + +- Kapa EN source-group ID: create and record it after the reviewed staging + `/docs/llms-full.txt` corpus is reachable. +- Kapa CN source-group ID: create and record it after the reviewed staging + `/cn/docs/llms-full.txt` corpus is reachable. +- Kapa admin session/account: authenticated and inspected. The current source + groups and website integration are known; creation and activation remain + gated on the matching staging corpus and dedicated staging-domain entry.
