完成40%

This commit is contained in:
rain
2026-07-14 17:36:39 +08:00
parent 1015e60ff7
commit 8c98936da5
151 changed files with 5132 additions and 351 deletions
@@ -0,0 +1,38 @@
# A02 协议确认控件设计
> 状态:用户已确认方案并验收 A02;本文件只保留本轮已完成的 A02 调整记录。
## 目标
让直接进入 A02 的用户能在当前登录页完成协议确认,替换“请先在登录引导页阅读并确认协议”的被动提示,同时保持 A01 已验收的可见效果与既有入口行为不变。
## 范围与边界
- 只修改 A02 账号登录、其最小契约、两枚认证模块透明状态图标、A02 文字注册入口、相应资产台账和 A02 设计记录。
- A01 的页面结构、视觉、协议勾选、`agreed=1` 跳转和拦截行为均不改动。
- 不新建协议正文路由;《用户协议》《隐私政策》沿用当前“协议页面准备中”的提示行为。
- A03 已删除;A02 已验收。后续 A04--A06 必须各自审视与验收,不把 A02 表单直接复制过去。
## A02 交互合同
1. A02 的 `agreed` 是 A02 提交前协议状态的唯一所有者。
2. `agreed=1` 只作为从 A01 进入时的初始已同意值;直接进入 A02 时默认未同意。
3. 登录按钮下方提供整行可点击的协议确认控件。点击行切换状态,点击协议名称不切换状态。
4. 未同意时提交提示“请先阅读并同意相关协议”,不再要求返回 A01;已同意后保留既有账号密码、短信登录校验和登录待接入提示。
5. 协议行下方提供“还没有账号? 注册账号”入口;仅“注册账号”可点,且直接进入既有 A04,不以协议状态或新接口阻断新用户。
## 视觉与资产合同
- 控件位于 A02 卷轴面板内、登录按钮下方,使用至少 88rpx 高的点击区和不小于 24rpx 的正文。
- 未选中和选中图标分别使用 `static/assets/modules/auth/transparent/a02-agreement-unchecked.png``a02-agreement-checked.png`
- 图标为 96 × 96 的 RGBA PNG,四角透明;显示时只承担图标,不用 CSS 绘制圆环、勾号或底色。
- 文本与链接位于 Vue 文字层,保留项目既有墨褐与朱砂层级;不把文字烘焙进图标。
- 注册入口是无底色、无边框的文字导航,不伪造为 CSS 按钮,也不新增视觉资产;“注册账号”保持至少 88rpx 高的触点。
## 验收
- 最小 UI 契约先红后绿,覆盖 A02 协议行、两枚图标、初始状态、切换、当前页拦截与旧提示移除。
- 资产审计验证两枚图标存在、尺寸、RGBA 与透明角。
- 运行 A02 相关审计、编译审计、全路由合同;用 Chrome 截取 A02 未选中与 `agreed=1` 选中状态,并验证注册入口实际到达 A04。
- 截图脚本每次必须确认目标 URL 并创建新文档后再等待图片,不能复用同一路由遗留的 Vue 状态作为视觉证据。
- `design-qa.md` 已标记 `accepted`;A02 不再阻塞后续页面,但其可见效果保持冻结。
@@ -0,0 +1,40 @@
# A04 注册账号设计
> 状态:用户已于 2026-07-14 视觉验收通过;A04 可见效果冻结。本规格据已验收 A01、A02、G01 与 A04 真实运行截图制定。
## 目标
将 A04 从通用表单壳改为独立的账号注册页,让新用户在统一的家祠认证场景中完成手机号、密码确认与协议确认,并能回到 A02 登录。
## 2026-07-14 视觉平衡修订
本轮真实运行截图审视限定在 A04 的 360×800 与 412×915 窄屏。问题不是资产,而是登录页的短标签规格被直接用于“设置密码”“确认密码”:`126rpx` 标签列不足以留出文字与占位提示的间距;居中的“填写信息,开启家族记忆”不承担操作作用,却挤占了表单的视觉呼吸。
修订只作用于 A04:移除这句冗余引导,以现有 `auth-divider-knot.png` 位图在标题与表单之间建立有意图的分隔;标签列扩至 `154rpx`,保持三项输入、主按钮、协议、登录回流以及已选的位图面板不变。A01、A02、G01 不触碰;不生成新资产,不以 CSS 伪造装饰面。
## 视觉与结构
1. 顶部复用 A02 已验收的朱砂祠堂头和谱印,不改变 A01/A02/G01。
2. 正文使用既有 `a02-login-panel.png` 完整不透明卷轴面板;不创建 CSS 卡片、边框或按钮表面。
3. 面板标题为“注册账号”,副标题为“创建属于你的家谱账号”;设置返回动作。
4. 表单依次为手机号、设置密码、确认密码。使用真实 `input`,密码字段隐藏输入。
5. 主按钮使用已验收 `a01-primary-button.png`,文字为“注册账号”。
6. 主按钮下方放 A02 同款本页协议确认行;下方提供“已有账号? 登录”文字回流,其中“登录”跳转 A02。
## 交互合同
- A04 的 `agreed` 是注册提交前协议状态的唯一所有者,初始未同意;协议名称仍只显示“协议页面准备中”提示,不新增协议正文路由。
- 未同意协议、手机号无效、密码为空、两次密码不一致分别在当前页显示对应 toast;字段有效时显示“注册服务待接入”。
- “登录”只跳转 `/pages/auth/a02-login`;不接入真实注册、短信、微信或后端接口。
## 资产与边界
- 复用 A02 完整卷轴面板、A01 主按钮和 A02 两枚透明协议图标;现有资产完整,不使用 ImageGen。
- A04 从 `ModulePage``pageCatalog` 中移出,成为独立 Vue 页面。
- A01、A02、A04、G01 的可见效果冻结;若用户提出 A04 的新明确意见,必须先重新截图审视,再只修正被指出的范围。
## 验收
- 先写失败的 A04 契约,覆盖独立页面、完整位图面板/按钮、三项输入、协议状态、A02 回流、校验与禁止 CSS 伪造。
- 使用 Chrome 捕获并审视 360×800、412×915;小屏允许纵向滚动,不允许横向裁切、黑块或半渲染。
- 运行 A04 契约、A01/A02 契约、资产审计、编译审计、全路由合同与 `git diff --check`
@@ -0,0 +1,33 @@
# A05 重置密码设计
> 状态:用户已于 2026-07-14 视觉验收通过;A05 可见效果冻结。本规格以 A01、A02、A04、G01 与 A05 的已验收可见效果和本轮 A05 真实运行截图为依据。
## 目标
把 A05 从 `ModulePage` 通用白卡壳改为独立的认证页,让用户清楚完成“手机验证后重设密码”,并能返回 A02 登录。它只提供可审计的本地交互,不接真实短信或后端。
## 审视结论与选择
当前 360×800、412×915 截图中的 A05 具备手机号、验证码、新密码和确认按钮,但暴露内部编号 A-05、没有获取验证码动作、缺少确认密码,且通用白卡不属于已验收的认证场景。
本轮采用完整验证流程,而不是三字段简版或多步流程:在一张完整卷轴面板中依次放手机号、验证码(右侧“获取验证码”)、新密码、确认新密码;主按钮为“确认重设”,下方保留低强调的“想起密码了? 返回登录”。四项填写虽比简版多一行,但能在本页防止密码误输,也不引入新的路由、状态机或位图资产。
## 视觉与资产
1. 复用认证页纸纹、淡墨山水、朱砂祠堂头、谱印、完整卷轴面板、完整朱砂主按钮、标题祥云、结饰和返回箭头。
2. 标题为“重设密码”,副标题为“验证手机号后重新设置登录密码”;不显示 A-05 等内部编号。
3. 卷轴面板、主按钮和装饰面全部由既有位图承担,CSS 只处理布局、文字、输入和状态;不使用 ImageGen,因为资产已完整。
4. A01、A02、A04、G01 可见效果冻结;仅修改 A05,并从 `pageCatalog` 中移除 A05 临时入口。
## 交互合同
- 本页状态只有 `phone``verificationCode``password``confirmPassword`
- “获取验证码”只显示“验证码功能待接入”;不请求短信服务。
- 提交依次校验 11 位手机号、6 位验证码、密码非空、两次密码一致;依次显示对应当前页 toast,均通过时显示“密码重设服务待接入”。
- “返回登录”跳转 `/pages/auth/a02-login`;返回箭头执行 `uni.navigateBack()`
## 验收
- 先写失败的 A05 契约,覆盖独立页面、完整位图面板/按钮、四项输入、验证码动作、校验、A02 回流、移除目录项及禁止 CSS 伪造。
- 以 Chrome 捕获 360×800、412×915,审视标题、四项表单、验证码动作、按钮、登录回流和窄屏滚动;不得有横向裁切、黑块或通用白卡。
- 完成前运行 A05 契约、A01/A02/A04 保护回归、A03 移除、资产、截图、编译、全页契约及 `git diff --check`
@@ -0,0 +1,41 @@
# A06 登录状态设计规格
## 目标
将 A06 从通用 `ModulePage` 卡片替换为与 A02/A04/A05 一致的独立认证状态页,清晰承接登录未完成、登录失败、账号受限、注册未完成、微信授权取消和微信授权失败。
## 已审视的真实界面
- 入口:`http://localhost:5173/#/pages/auth/a06-auth-status`
- 基线截图:`docs/design/screens/runtime/2026-07-14/A06-before-360x800.png``docs/design/screens/runtime/2026-07-14/A06-before-412x915.png`
- 结论:现页是白色通用卡片、CSS 红色方形徽章和被压缩的按钮,既没有认证页面的卷轴与朱砂语言,也无法明确表达可执行的下一步。
## 状态合同
唯一入口仍是 `/pages/auth/a06-auth-status`H5 路由以 `?status=` 选择状态,未知值回落到 `normal`。不新增页面或路由。
| status | 主文案 | 主操作 | 次操作 |
| --- | --- | --- | --- |
| `normal` | 登录未完成 | 返回登录 | 无 |
| `failed` | 登录失败 | 返回登录 | 无 |
| `restricted` | 账号暂时受限 | 查看帮助(本地提示) | 返回登录 |
| `register-pending` | 注册尚未完成 | 继续注册 | 返回登录 |
| `wechat-cancelled` | 微信授权已取消 | 返回登录 | 无 |
| `wechat-failed` | 微信授权失败 | 返回登录 | 无 |
“查看帮助”仅展示“账号申诉功能待接入”的本地提示;不伪造客服、申诉、短信或后端能力。继续注册跳转 A04,返回登录跳转 A02。手机号绑定仍属于后续个人中心安全设置,本轮不涉及。
## 视觉与资产
- 页面壳复用 `auth-page-paper.png``auth-ink-scenery.png``auth-header.png``brand-seal.png`
- 内容面板、完整主按钮、标题云纹、分隔结与返回箭头分别复用 `a02-login-panel.png``a01-primary-button.png``auth-title-cloud.png``auth-divider-knot.png``chevron-right.png`
- 状态识别复用现有透明位图 `auth-login-outline.png`
- 不生成新图:现有认证资产已完整覆盖页面壳、面板、按钮和装饰面。不得用 CSS 绘制完整卡片、按钮、边框或状态图形。
## 范围与验收
- 不修改已验收并冻结的 A01、G01、A02、A04、A05 可见效果。
- 先新增失败的 A06 源码契约,再实现页面。
- 在 360×800、412×915 的真实 Chrome 截图核对默认态;另核对 `restricted` 状态的文案与操作。
- 完成前运行 A06 契约、受影响回归、编译审计、全页契约和 `git diff --check`
- 用户已于 2026-07-14 明确确认 A06;其可见效果现已冻结,后续开始 G02 时不得修改。
@@ -0,0 +1,47 @@
# G03 创建家谱流程收敛设计规格
## 背景与用户确认
页面与状态合并审计已判定 G04“始祖录入”是 G03“创建家谱”的后续步骤,不是可独立进入的主任务。用户于 2026-07-14 确认 G01 空状态通过,并要求继续推进已确认的收敛方案;本规格直接执行 G04→G03,不再重复请求审批。
## 目标
将创建家谱与录入首代人物收敛为唯一的 `pages/genealogy/g03-create-genealogy` 路由,以 `step=create|ancestor` 表示两步流程;删除 G04 路由和页面,同时保留原有的字段、校验、数据创建、家谱上下文和跳转至世系树的行为。
## 真实画面审视
本轮基线截图:
- `docs/design/screens/runtime/2026-07-14/route-audit/G03-before-360x800.png`
- `docs/design/screens/runtime/2026-07-14/route-audit/G04-before-360x800.png`
两页都使用相同的普通返回页头、圆角 CSS 表单卡和固定 CSS 红色底部按钮。它们的任务与结构连续,但视觉层级过于通用,且完整卡片、页头和按钮面由 CSS 构造,不符合当前位图资产规则。
## 方案与取舍
1. **推荐:G03 同路由双步骤。** `step=create` 提交成功后跳转 G03 的 `step=ancestor&genealogyId=…`;始祖提交成功后跳转 T01。路由数量从 57 变为 56,浏览器返回可回到创建步骤。采用 G01 的暖宣纸、朱砂页头和淡墨山水,表单卡使用完整不透明位图皮肤。
2. 保留 G04 仅复用视觉组件。开发量较小,但仍有两个路由承载同一创建任务,不符合已确认的页面收敛目标。
3. 两步放进同一页的本地切换而不更新 URL。实现更短,但无法深链或刷新恢复始祖录入步骤,且不利于契约测试;不采用。
## 视觉与资产
- 复用 G01 已验收的 `page-paper.jpg``footer-mountain-bamboo.png``root-header-cinnabar.jpg`、返回箭头和 `a01-primary-button.png`
- 当前仓库没有能承载家谱创建表单完整金线边框、角饰与下沿淡墨景的位图,因此使用 ImageGen 生成一个不透明的 `static/assets/modules/genealogy/opaque/g03-create-flow-panel.png`。它仅承载暖宣纸底、双古金线边框、回纹角饰、极淡云纹和底部淡墨山水;不包含文字、按钮、Logo 或透明区域。
- G03 的局部文字、字段控件和状态提示由 Vue/CSS 布局;面板、页头和按钮的完整视觉面必须是图片,不能以 CSS 绘制边框、背景或圆角。
- 创建步骤与始祖步骤共用同一面板皮肤,以保持流程连续;两步标题与输入内容不同。
## 路由与行为合同
- 仅保留 `pages/genealogy/g03-create-genealogy`;从 `pages.json` 删除 G04,删除 `pages/genealogy/g04-first-ancestor.vue`,不留兼容入口。
- `step=create` 是默认值。缺失或未知 `step` 统一回到创建步骤。
- 创建步骤仍要求姓氏与谱名;成功后调用 `appApi.createGenealogy`、写入 `genealogyContext`,跳转 `?step=ancestor&genealogyId=<id>`
- 始祖步骤从查询参数或 `genealogyContext` 读取家谱 ID,仍要求首代姓名;成功后调用 `appApi.createPerson` 并跳转 T01。
- 始祖步骤的返回操作回到 G03 默认创建步骤;默认创建步骤沿用 `uni.navigateBack()`
## 验证
1. 先写 G03 流程收敛契约,并确认其在 G04 仍存在时失败。
2. 静态契约检查唯一 G03 路由、G04 删除、两步 URL、两组校验/数据调用、位图资产与禁止 CSS 视觉面。
3. Chrome 运行时冒烟:填写创建页,真实进入始祖步骤;填写始祖,真实进入 T01;刷新带参数 URL 仍显示始祖步骤;默认 G03 仍显示创建步骤。
4. 截图 360×800、412×915;把 G03 默认态与已验收 G01 视觉基准并排审视,检查无黑角、横向裁切、图片未加载或固定按钮遮挡。
5. 运行受影响路由、资产、编译、A01/A02/A04/A05/A06/G01 回归与 `git diff --check`
@@ -0,0 +1,45 @@
# G06 公开家谱搜索流程合并设计
## 背景与依据
- 用户已授权继续推进,并已将 G03 双步骤流程视为通过;G01、G03 与认证页的已验收可见效果不在本轮改动范围内。
- 真实运行基线已保存为 `docs/design/screens/runtime/2026-07-14/route-audit/G06-before-360x800.png``G07-before-360x800.png`
- 基线审视发现:G06 在尚未搜索时直接展示一条结果;G07 使用另一套通用列表壳。两页实际是同一条“查找—得到结果—申请加入”的连续旅程。
## 选择的方案
采用单一 G06 路由、页面内三态的方案:
1. 初始态:仅显示检索提示与输入控件,不预先泄露公开家谱结果。
2. 有结果态:输入并提交后显示匹配的 `GenealogyCard` 列表;点选任一条仅跳转既有 G08 申请页,并携带 `genealogyId`
3. 无结果态:输入无匹配条件时,在同一页面显示明确的无结果说明与重新检索引导。
不保留 G07 兼容路由、跳转或占位页面。G07 的“结果列表”语义由 G06 的有结果态唯一拥有。
曾考虑保留 G07 作为可深链结果页,以及让 G06 默认展示热门家谱。前者重复了同一任务并增加路由;后者会让“尚未搜索”和“已搜索”混淆,均不采用。
## 视觉与交互
- G06 继续使用现有 `PageHeader``page-paper.jpg``footer-mountain-bamboo.png``GenealogyCard` 的已登记资产,不改动已验收页面。
- G06 顶部的 `PageHeader` 必须高于纸纹底图。公开检索是单步任务,不使用大型检索面板;用户最后选定「朱砂题签 + 宽输入框 + 搜索按钮」方向:`g06-search-title-strip.png`1122×220)、`g06-search-input-wide.png`1120×248)和 `g06-search-button.png`(300×132)作为独立完整表面直接置于页面纸纹。题签中的实际谱印必须叠放项目 `brand-seal.png`,不得使用生成图中的通用印玺;Vue 仅叠放真实输入框、文本和点击层,不用 CSS 伪造边框、卡片、按钮或装饰面。
- 结果条目继续复用 `GenealogyCard` 已有的完整题签框和谱印框位图,以保留与 G01 一致的家谱信息密度;传入“可申请”作为条目角色。
- 初始、加载、无结果状态不是额外页面或卡片。它们在题签和控件下方以留白、现有云纹资产和清晰文案表达。
## 状态所有权与行为
- `g06-search-genealogies.vue` 是本流程唯一状态拥有者:`keyword`、公开家谱数据、`searchState` 和筛选结果都只在这里维护。
- `searchState` 的合法值是 `initial``results``empty``loading`。初始加载完成后保持 `initial`,只有用户提交搜索才进入 `results``empty`
- 搜索匹配范围维持现有数据契约:`name``surname``location`;空关键词视为查看全部公开家谱,仍属于 `results`
- 点选结果不再直接调用 `appApi.applyToJoin` 或弹确认框;改为导航到 `/pages/genealogy/g08-join-application?genealogyId=<id>`,把填写申请作为 G08 的独立任务。
## 契约与验证
- 静态契约先红灯后转绿:G06 路由存在,G07 路由与文件不存在;G06 包含四态、可见页头、无大型控件面板、朱砂题签/宽输入/按钮三张完整位图、G08 导航与位图表面约束;三张位图的尺寸和四角 alpha 均正确。
- 运行冒烟先红灯后转绿:默认进入 G06 能看到初始态且没有结果卡;搜索“汤”显示结果卡;搜索不存在关键词显示无结果态;点选结果进入 G08。最后选定样式已重跑该契约和冒烟;视觉证据当前只确认 `G06-selected-strip-final-initial-360x800.png`,结果/无结果同版截图与用户验收仍待补。
- 全量页面契约和 A03 路由计数从 56 更新为 55,文档中的当前路由数和 G03 验收状态同步更新。
## 范围外
- 不修改 G01、G03、A01、A02、A04、A05、A06 的可见效果。
- 不重做 G08 的申请表设计,不引入新 API 字段,不实现真实远端搜索协议。
- 不执行任何 Git 暂存、提交、推送、重置或 worktree 操作。
@@ -0,0 +1,38 @@
# 移除 A03 重复认证页设计
> 状态:用户已于 2026-07-14 确认本规格;路由迁移已实施并完成相关验证。
> 范围:仅移除重复的 A03 独立页面与其合同,不改 A01、A02、G01 的可见效果。
## 1. 决策
1. A02 的“手机验证码登录”Tab 是手机号验证码登录的唯一入口;它拥有手机号、验证码、获取验证码和登录校验。
2. 删除独立的 `A03 手机验证` 路由与页面,不再保留第二个手机验证码表单。
3. 绑定手机号属于个人中心的安全设置流程,后续由个人中心的明确按钮跳转到独立页面;本轮不实现该入口或页面。
4. 微信授权取消、失败、受限等结果仍属于 A06 登录状态;A01 的“微信登录功能准备中”提示不变,不新增真实授权或跳转。
## 2. 合同迁移
- 唯一所有者:`pages/auth/a02-login.vue` 的短信 Tab 拥有手机号验证码登录;A03 不再拥有登录或授权职责。
- 删除:`pages/auth/a03-mobile-verify.vue``pages.json` 中的 A03 路由、`data/page-catalog.js``a03` 条目。
- 路由合同:最终页面数量从 59 调整为 58;`tests/full-page-visual-contract.ps1` 是唯一页面路径清单,必须同时更新数量与期望数组。
- 现有入口:A01 不指向 A03A02 的两个 Tab 和 A04/A05 跳转保持现状。不存在 A03 兼容跳转或重定向。
## 3. 文档边界
- 更新当前事实来源:`docs/规划.md``docs/交接记录.md``docs/design/视觉设计交接手册.md``docs/design/A01_启动登录引导_设计记录.md` 与 A02 设计记录,使它们不再把 A03 视为待做页面。
- 历史日期计划和设计证据保留当时决策,但在仍被引用为现行范围的位置注明“已被本规格取代”;不重写历史执行事实。
- 页面总数、账户模块清单与推进顺序均以删除 A03 后的 58 条最终路由为准。
## 4. 最小验证
1. 先写失败的路由合同:A03 不存在于 `pages.json``pageCatalog`、期望页面数组,且最终路由数为 58。
2. 删除 A03 后运行该合同并确认绿灯。
3. 运行 `tests/compile-audit.ps1` 与更新后的 `tests/full-page-visual-contract.ps1`;A01/A02 相关合同仍须通过,确保冻结页未受影响。
4. 使用 Chrome 访问 A02,确认其手机验证码 Tab 仍可切换;A03 URL 不再是注册路由。
5. 运行 `git diff --check`。不执行 Git 暂存、提交、推送、上传或重置。
## 5. 非目标
- 不做个人中心的绑定手机号入口或跳转页。
- 不新增真实短信、微信授权、登录、注册或后端接口。
- 不重做 A04、A05、A06,也不改变 A01、A02、G01 的可见效果。
@@ -0,0 +1,31 @@
# T01 世系树状态收敛设计
## 运行审视依据
- `T01-before-360x800.png`:无当前家谱时只显示“暂未录入族人”,无法说明是空数据、加载失败还是未选择家谱。
- `T01-populated-before-360x800.png`:已载入树的节点使用 CSS 方框且没有关系连线,底部信息条与页面视觉语言脱节。
- `T02-before-360x800.png`:小屏提示、无成员与加载失败被做成另一个通用状态页,和 T01 是同一个阅读任务的重复路由。
## 决定
删除 T02 路由与文件。`t01-tree-overview.vue` 是世系阅读任务的唯一所有者,并以 `state=tree|landscape|empty|error` 驱动同页状态:
1. `tree`:有 `genealogyId` 且树数据存在时,显示横向可滚动的世系图,点选节点保留现有的资料/添加亲属跳转。
2. `landscape`:小屏阅读提示,说明可横向拖动查看;不新增页面。
3. `empty`:没有当前家谱、没有成员或显式状态时,清晰引导用户先录入首代。
4. `error`:加载失败或显式状态时,说明无法加载并提供重新查看入口。
空关键词、无上下文和远端异常不再复用一条模糊文案;页面状态从查询参数和实际数据得出,T02 不保留兼容入口。
## 视觉
- 保留 `PageHeader`、暖宣纸与朱砂/古金/墨褐的已验收语言,不触及 A01、A02、A04--A06、G01、G03。
- 新增不透明位图:世系画布 `t01-tree-canvas.png`、成员节点 `t01-member-node.png`、底部成员信息条 `t01-member-sheet.png`。它们承载纸纹、边框、关系线和卡片表面;Vue 只叠放真实文本、滚动和点击层。
- 完整画布含轻古金三代关系线,适配当前 mock 的一祖、两中代、三后代布局;远端节点仍使用同一空白节点皮肤,保持可读优先。
- `landscape``empty``error` 使用画布内留白与现有透明云纹,不再生成一个通用状态卡页。
## 契约与验证
- 先红灯:T01 存在且 T02 路由/文件不存在;T01 有四态、三张位图、成员资料与新增亲属跳转;节点和信息条不允许 CSS 构造表面。
- 运行冒烟:默认 `?state=landscape``?state=empty``?state=error` 分别显示同页状态;`?genealogyId=1001` 显示节点并点选进入 T03。
- 更新全量路由契约至 54,更新交接/P00/规划;截图至少包含 tree、empty、error 与 412×915 tree。