视觉审核完成30%

This commit is contained in:
rain
2026-07-16 18:12:59 +08:00
parent cb25317412
commit 23cfd365a1
89 changed files with 3740 additions and 403 deletions
@@ -0,0 +1,52 @@
# A01 品牌 Logo 尺寸微调实施计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 将 A01 顶部品牌 Logo 精确缩小到 `184×221rpx`,其他布局保持不变。
**Architecture:** 继续使用现有 `brand-seal.png` 和绝对定位叠层,只调整页面内唯一的尺寸所有者 `.brand-seal`。静态契约负责防止尺寸回退,真实 H5 截图负责视觉判断。
**Tech Stack:** uni-app Vue、SCSS、PowerShell 契约测试、Chrome CDP 截图与运行 smoke。
## Global Constraints
- 只修改 A01 Logo 尺寸和对应契约。
- 不使用 worktree,不执行 Git 暂存、提交、推送、重置或清理。
- 不把 H5 截图写成 Android 或用户整页验收。
---
### Task 1: 锁定并实现 Logo 尺寸
**Files:**
- Modify: `tests/a01-a02-ui-contract.ps1`
- Modify: `pages/auth/a01-entry.vue`
**Interfaces:**
- Consumes: `.brand-seal` 现有样式规则和 `brand-seal.png`
- Produces: 精确的 `184×221rpx` H5 显示槽位。
- [ ] **Step 1: 写入失败契约**
在测试中解析 `.brand-seal`,要求 `width: 184rpx;``height: 221rpx;``top: 64rpx;``left: 50%;`
- [ ] **Step 2: 确认 RED**
运行:`powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1`
预期:因页面仍为 `220×264rpx` 而失败。
- [ ] **Step 3: 最小实现**
`.brand-seal` 的宽高改为:
```scss
width: 184rpx;
height: 221rpx;
```
- [ ] **Step 4: 验证 GREEN 与真实运行**
运行 A01 静态合同、四档运行 smoke、412×915 截图和 `git diff --check`;人工确认 Logo 无拉伸、裁切或新的层级问题。
项目禁止 Git 操作,因此本计划不包含提交步骤。
@@ -0,0 +1,197 @@
# A01 Scroll Skins V3 Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. The user forbids subagents, worktrees, commits, and all Git mutation commands, so execution stays inline in the current worktree and every commit step is intentionally omitted.
**Goal:** Replace A01's current button, Toast, and verification-panel visuals with the user-approved option-2 scroll-and-cloud family while preserving live text, exact slot ratios, interaction behavior, and old assets.
**Architecture:** Keep the approved board as the immutable visual target. Generate one clean master per surface, then use the existing Node/Pillow pipeline to remove presentation backgrounds, preserve fixed decorative caps/corners, stretch only safe centers, and emit exact versioned outputs. A01 consumes the new outputs only after manifest and pixel tests pass; H5 comparison uses the approved board plus real runtime screenshots.
**Tech Stack:** uni-app/Vue, SCSS, Node.js 24, native `node:test`, Python 3.14, Pillow 12.3.0, PowerShell contracts, Chrome CDP 9222, built-in ImageGen.
## Global Constraints
- Scope is A01 only; do not edit other page implementations.
- Preserve `STKaiti`, `KaiTi`, live button copy, WeChat icon, verification copy, interactions, and current logical slots.
- Keep all old assets; write only versioned v3 outputs.
- Do not use `scaleToFill` to hide a ratio mismatch.
- Master and output assets contain no text, icons, logo, white halo, green fringe, or presentation shadow.
- A01 remains `[~]`; H5 output is internal evidence only until Android/HBuilderX and user review.
- Do not run worktree, subagent, `git add`, `commit`, `push`, `reset`, `checkout`, upload, delete, or cleanup commands.
---
### Task 1: Preserve Exact Individual Masters
**Files:**
- Reference: `docs/design/assets/a01-vnext/A01-shared-scroll-skins-with-dialog-approved.png`
- Create: `docs/design/assets/a01-vnext/masters/a01-scroll-primary-master-v3.png`
- Create: `docs/design/assets/a01-vnext/masters/a01-scroll-secondary-master-v3.png`
- Create: `docs/design/assets/a01-vnext/masters/a01-scroll-toast-master-v3.png`
- Create: `docs/design/assets/a01-vnext/masters/a01-scroll-dialog-master-v3.png`
**Interfaces:**
- Consumes: the approved four-component board and the measured slots from the design spec.
- Produces: four committed-quality visual masters with flat chroma presentation backgrounds, no text, and quiet safe centers.
- [ ] **Step 1: Generate the four masters independently**
Use ImageGen once per master. Attach the approved board every time. Require the exact family, one isolated component, a flat `#00ff00` background for deterministic extraction, no external shadow, and these target ratios: `622:92`, `622:100`, `590:82`, `620:520`.
- [ ] **Step 2: Inspect every master**
Open all four with `view_image`. Reject any master with text, asymmetric clouds, cropped scroll rods, missing gold lines, landscape above the dialog's lower 22%, or decoration crossing the live-content safe center.
- [ ] **Step 3: Save only the approved individual masters**
Copy each generated result to the exact master path without overwriting an existing file. Keep ImageGen originals untouched.
### Task 2: Declare the V3 Machine Contract
**Files:**
- Create: `design-pipeline/manifests/a01-scroll-skins-v3.json`
- Modify: `design-pipeline/tests/manifest-v2.test.mjs`
- Modify: `design-pipeline/package.json`
**Interfaces:**
- Consumes: four master paths from Task 1.
- Produces: manifest assets `a01-scroll-primary-v3`, `a01-scroll-secondary-v3`, `a01-scroll-toast-v3`, and `a01-scroll-dialog-v3`.
- [ ] **Step 1: Write failing manifest tests**
Add assertions that the manifest declares exactly four unique outputs, exact logical/output dimensions, `uniform-only` for fixed button/dialog outputs, `nine-slice` for Toast, and A01 consumer selectors.
- [ ] **Step 2: Run RED**
Run `npm.cmd --prefix design-pipeline run test:v2`. Expected: failure because `a01-scroll-skins-v3.json` does not exist.
- [ ] **Step 3: Add the manifest and scripts**
Declare outputs:
```text
static/assets/foundation/transparent/a01-scroll-primary-v3.png 1866×276
static/assets/foundation/transparent/a01-scroll-secondary-v3.png 1866×300
static/assets/foundation/transparent/a01-scroll-toast-v3.png 1770×246
static/assets/modules/auth/transparent/a01-scroll-dialog-v3.png 1860×1560
```
Add `build:a01-scroll-skins` and `verify:a01-scroll-skins` package scripts. All paths must remain inside the workspace.
- [ ] **Step 4: Run GREEN**
Run the Node tests and manifest validator. Expected: all tests pass and `MANIFEST-V2 PASS` names the v3 manifest.
### Task 3: Build Exact Clean Outputs
**Files:**
- Create: `design-pipeline/tests/test_build_scroll_skins.py`
- Create: `design-pipeline/scripts/build_scroll_skins.py`
- Create: `design-pipeline/scripts/build-a01-scroll-skins.mjs`
- Modify: `design-pipeline/scripts/asset_quality.py`
**Interfaces:**
- Produces: `remove_chroma_background(image, key, tolerance)`, `stretch_safe_center(image, output_size, insets)`, and `build_manifest(manifest, workspace)`.
- [ ] **Step 1: Write failing synthetic tests**
Tests must prove that chroma pixels become transparent black, decorative caps/corners remain pixel-identical after resizing, only the declared center stretches, exact output dimensions are returned, and a dialog with `alpha.required=false` remains opaque.
- [ ] **Step 2: Run RED**
Run the Python unittest discovery command. Expected: import failure for `build_scroll_skins`.
- [ ] **Step 3: Implement minimal Pillow processing**
Use RGBA conversion, chroma-distance Alpha removal, bounding-box trim, manifest insets, Pillow LANCZOS only for target-height normalization, center-only stretching, transparent-black cleanup, sRGB chunk writing, and optimized PNG output.
- [ ] **Step 4: Run GREEN and build actual assets**
Run Python tests, `npm.cmd --prefix design-pipeline run build:a01-scroll-skins`, and the quality verifier. Expected for every asset: exact dimensions, zero visible chroma residue, zero light fringe, zero transparent RGB, and no manifest errors.
- [ ] **Step 5: Inspect all four outputs**
Use `view_image`; reject seams, cropped rods, distorted clouds, weak gold contrast, center-knot drift, or dialog landscape entering the content region.
### Task 4: Integrate A01 Test-First
**Files:**
- Modify: `tests/a01-a02-ui-contract.ps1`
- Modify: `tests/a01-asset-alpha-audit.ps1`
- Modify: `tests/a01-responsive-runtime-smoke.js`
- Modify: `pages/auth/a01-entry.vue`
**Interfaces:**
- Consumes: four verified v3 outputs.
- Produces: A01 using v3 visuals without changing behavior or live content.
- [ ] **Step 1: Extend contracts before page changes**
Require the four v3 paths, exact sizes, no old A01 button/Toast/dialog references in A01, no `scaleToFill` on these skins, and the approved runtime selectors.
- [ ] **Step 2: Run RED**
Run both PowerShell contracts. Expected: failure because A01 still uses v2 buttons and the old dialog/code-native Toast.
- [ ] **Step 3: Make the minimal A01 change**
Replace only the decorative skin layers. Preserve copy, icon, state, click handlers, normal-flow layout, overlay positioning, and slot dimensions. Use `aspectFit` for exact button/dialog assets; use the Toast v3 asset through its declared adaptive rendering strategy.
- [ ] **Step 4: Run GREEN**
Run the PowerShell contracts and Python quality audit. Expected: pass.
### Task 5: Real Runtime and Visual Comparison
**Files:**
- Modify: `scripts/capture-chrome-page.js`
- Create ignored evidence under: `tmp/a01-scroll-skins-v3-*.png`
- Modify: `design-qa.md`
**Interfaces:**
- Produces: password, Toast, and verification-dialog runtime evidence at `412×915`, plus four-viewport structural verification.
- [ ] **Step 1: Add deterministic capture states**
The capture tool must support `password-tab`, `invalid-login`, and `verification-dialog` without arbitrary click timing. Runtime smoke must assert all four v3 assets load at expected natural dimensions.
- [ ] **Step 2: Run four viewports**
Run `node tests/a01-responsive-runtime-smoke.js`. Expected: pass at `320×568`, `360×640`, `360×800`, and `412×915`, with natural scrolling at 320×568 and no horizontal overflow.
- [ ] **Step 3: Capture and compare**
Capture the three meaningful A01 states. Compare the approved visual board and runtime evidence together. Fix P0/P1/P2 mismatches; do not loop on P3 polish.
- [ ] **Step 4: Update QA truthfully**
Record the exact source and runtime images in `design-qa.md`. The result may say H5 passed only; Android and user acceptance remain pending.
### Task 6: Documentation and Final Verification
**Files:**
- Modify: `docs/design/设计资产生产流水线规范.md`
- Modify: `docs/design/P00_页面结构与资产清单.md`
- Modify: `docs/交接记录.md`
- [ ] **Step 1: Record implemented facts**
Document the selected visual source, four v3 outputs, build/verify commands, A01-only scope, preserved old assets, and remaining Android/user gates.
- [ ] **Step 2: Run the focused verification set**
```powershell
npm.cmd --prefix design-pipeline run test:v2
npm.cmd --prefix design-pipeline run build:a01-scroll-skins
npm.cmd --prefix design-pipeline run verify:a01-scroll-skins
design-pipeline/.venv/Scripts/python.exe -m unittest discover -s design-pipeline/tests -p "test_*.py" -v
powershell -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
powershell -NoProfile -ExecutionPolicy Bypass -File tests/a01-asset-alpha-audit.ps1
node tests/a01-responsive-runtime-smoke.js
git diff --check
```
Expected: all focused checks pass; `git diff --check` has no whitespace error. CRLF notices alone are not failures.
- [ ] **Step 3: Report remaining gates**
State explicitly: H5 internal evidence completed or blocked, Android/HBuilderX pending, user page acceptance pending, A01 remains `[~]`, no Git mutation commands executed.
@@ -0,0 +1,117 @@
# A04 同步 A01 新视觉体系实施计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 将 A04 页面内旧认证视觉全部替换为 A01 已审核的新体系,并移除非最终的自定义滑动验证面板。
**Architecture:** A04 继续独立拥有注册字段和校验逻辑,只复用 A01 已生产的位图资产与全局字体合同。主按钮按固定比例等比显示,Toast 使用同一张可切片资产;真实滑动验证由后续接口组件负责,当前有效提交只显示待接入反馈。
**Tech Stack:** uni-app Vue 3、SCSS、PowerShell 静态契约、Chrome CDP 运行 smoke。
## Global Constraints
- A04 Logo 必须为 `184×221rpx``top: 64rpx`、水平居中。
- 禁止 A04 引用 `a01-primary-button.png``a01-secondary-button.png``a02-login-panel.png` 或局部 `STSong/SimSun`
- 注册主按钮使用 `a01-scroll-primary-v3.png``aspectFit`Toast 使用 `a01-scroll-toast-v3.png``border-image`
- 协议图标、返回箭头、宗祠底板保留。
- 不使用 worktree,不执行 Git 暂存、提交、推送、重置或清理。
- 不修改 A01 或其他页面,不对接接口,不把 H5 写成 Android 或用户整页验收。
---
### Task 1: 用契约锁定 A04 新视觉和验证边界
**Files:**
- Modify: `tests/a04-registration-contract.ps1`
- Modify: `tests/a04-registration-runtime-smoke.js`
**Interfaces:**
- Consumes: A04 当前页面结构与 A01 v3 资产路径。
- Produces: 旧资产禁止、Logo 精确尺寸、Toast 切片和有效提交反馈的回归合同。
- [ ] **Step 1: 写入失败静态契约**
要求 A04 包含 `a01-vnext-divider-v1.png``a01-scroll-primary-v3.png``a01-scroll-toast-v3.png``width: 184rpx;``height: 221rpx;``border-image-slice:` 和“滑动验证待接口接入”;禁止三个旧资产、`verificationVisible``verification-layer``feedback-toast__skin``font-family:`
- [ ] **Step 2: 更新运行 smoke 的期望**
有效表单提交后等待 `.feedback-toast`,断言文案为“滑动验证待接口接入”,并断言页面不存在 `.verification-layer`;四档尺寸改为 `320×568``360×640``360×800``412×915`
- [ ] **Step 3: 运行测试确认 RED**
运行:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a04-registration-contract.ps1
```
预期:因 A04 仍引用旧主按钮和旧验证面板而失败。
---
### Task 2: 最小迁移 A04 页面
**Files:**
- Modify: `pages/auth/a04-register.vue`
**Interfaces:**
- Consumes: `a01-vnext-divider-v1.png``a01-scroll-primary-v3.png``a01-scroll-toast-v3.png` 与全局字体。
- Produces: A04 新默认态、错误态、协议态和滑动验证待接入反馈。
- [ ] **Step 1: 替换模板资产**
将标题分隔和主按钮改为新资产与 `aspectFit`,删除验证弹层模板及 Toast 内部拉伸图片。
- [ ] **Step 2: 收敛脚本状态**
删除 `verificationVisible``closeVerification``confirmVerification`;有效提交改为:
```js
showFeedback('滑动验证待接口接入')
```
- [ ] **Step 3: 同步样式**
`.brand-seal` 改为 `184×221rpx`;移除所有局部 `font-family`;主按钮保持现有点击槽但等比承载 v3 皮肤;Toast 使用:
```scss
border: 16rpx solid transparent;
border-width: 16rpx 74rpx;
border-image-source: url('/static/assets/foundation/transparent/a01-scroll-toast-v3.png');
border-image-slice: 58 280 fill;
border-image-width: 16rpx 74rpx;
border-image-repeat: stretch;
```
- [ ] **Step 4: 运行静态合同确认 GREEN**
运行静态合同,预期输出 `A04-REGISTRATION-CONTRACT PASS`
---
### Task 3: 真实运行验证与浏览器交付
**Files:**
- Modify: `design-qa.md`
**Interfaces:**
- Consumes: A04 已迁移页面与 CDP 调试页。
- Produces: 四档响应式结果和浏览器中的 A04 默认态。
- [ ] **Step 1: 运行 A04 smoke**
运行 `node tests/a04-registration-runtime-smoke.js`,预期输出 `A04-REGISTRATION-RUNTIME-SMOKE PASS`
- [ ] **Step 2: 捕获并检查 412×915**
运行 `capture-chrome-page.js` 捕获 A04 默认态,人工检查 Logo、标题、字段、按钮、协议和底部留白。
- [ ] **Step 3: 更新 QA 边界**
`design-qa.md` 的 A04 段记录新资产和真实滑动验证延期;不得写成用户已验收。
- [ ] **Step 4: 最终聚焦验证**
重新运行静态合同、运行 smoke、截图合同和 `git diff --check`;将浏览器停在 A04 默认态供用户审核。
项目禁止 Git 操作,因此本计划不包含提交步骤。
@@ -0,0 +1,167 @@
# A05 向 A01 视觉体系收拢实施计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use `superpowers:executing-plans` inline. 本任务集中修改同一 A05 页面,不派发子代理;项目禁止 worktree、Git 暂存、提交和推送。
**Goal:** 让 A05 的 Logo、字体、标题分隔、按钮、Toast 和成功结果容器统一使用 A01 已确定的新视觉资产,同时保留四字段重设流程。
**Architecture:** `pages/auth/a05-reset-password.vue` 继续独立拥有表单和本地状态。页面直接消费 A01 正式资产;静态 PowerShell 合同负责禁止旧资产回退,Chrome CDP 烟测负责验证交互与多尺寸运行态。
**Tech Stack:** uni-app、Vue 3 `<script setup>`、SCSS、PowerShell、Node.js、Chrome CDP。
## Global Constraints
- 只修改 A05、A05 聚焦测试、A05 QA/验收记录和必要计划文档。
- 不接接口;真实滑动验证使用后续组件自带样式,本轮只显示待接入 Toast。
- 不使用原生 UniApp Toast、Modal、Loading、ActionSheet。
- 320×568 允许自然纵向滚动;同时复核 360×640、360×800、412×915。
- A05 保持 `[~]`H5 证据不等于 Android/HBuilderX 或完整用户验收。
---
### Task 1: 收紧 A05 静态视觉合同
**Files:**
- Modify: `tests/a05-reset-password-contract.ps1`
- Test: `tests/a05-reset-password-contract.ps1`
**Interfaces:**
- Consumes: `pages/auth/a05-reset-password.vue` UTF-8 源码。
- Produces: 新资产必需项、旧资产禁用项、Logo/字体/九宫格渲染约束。
- [x] **Step 1: 写失败合同**
要求以下源码片段存在:
```powershell
'a01-vnext-divider-v1.png'
'a01-scroll-primary-v3.png'
'a01-scroll-toast-v3.png'
'a01-scroll-dialog-v3.png'
'width: 184rpx;'
'height: 221rpx;'
"border-image-source: url('/static/assets/foundation/transparent/a01-scroll-toast-v3.png');"
'border-image-slice: 58 280 fill;'
```
禁止以下旧路径和结构:
```powershell
'a01-primary-button.png'
'a01-secondary-button.png'
'a02-login-panel.png'
'auth-divider-knot.png'
'feedback-toast__skin'
'verificationVisible'
'verification-layer'
'font-family:'
```
- [x] **Step 2: 运行合同并确认 RED**
Run: `powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a05-reset-password-contract.ps1`
Expected: FAIL,首个失败原因是 A05 尚未引用新标题分隔或新按钮资产。
---
### Task 2: 最小迁移 A05 页面
**Files:**
- Modify: `pages/auth/a05-reset-password.vue`
- Test: `tests/a05-reset-password-contract.ps1`
**Interfaces:**
- Consumes: A01 的 `brand-seal.png``a01-vnext-divider-v1.png``a01-scroll-primary-v3.png``a01-scroll-toast-v3.png``a01-scroll-dialog-v3.png`
- Produces: 原选择器和表单 API 保持可用;获取验证码入口改为待接入 Toast。
- [x] **Step 1: 替换模板资产**
```vue
<image class="reset-divider" src="/static/assets/modules/auth/transparent/a01-vnext-divider-v1.png" mode="aspectFit" />
<image class="reset-submit__skin" src="/static/assets/foundation/transparent/a01-scroll-primary-v3.png" mode="aspectFit" />
<image class="success-dialog__skin" src="/static/assets/modules/auth/transparent/a01-scroll-dialog-v3.png" mode="aspectFit" />
<image class="success-action__skin" src="/static/assets/foundation/transparent/a01-scroll-primary-v3.png" mode="aspectFit" />
```
删除旧验证层和 Toast 图片子层;Toast 只保留真实文字节点。
- [x] **Step 2: 收敛行为验证占位**
```js
const prepareGetCode = () => {
if (!/^1\d{10}$/.test(phone.value)) {
fieldErrors.value.phone = '请输入正确手机号'
return
}
fieldErrors.value.phone = ''
showFeedback('滑动验证待接口接入')
}
```
删除 `verificationVisible``closeVerification``confirmVerification`,不伪造验证码已发送。
- [x] **Step 3: 对齐样式**
Logo 改为 `184×221rpx`;删除全部局部 `font-family`;按钮图片使用 `aspectFit`;Toast 复制 A04 已验证的九宫格 `border-image` 参数;成功卷轴按现有遮罩居中,不改变返回登录逻辑。
- [x] **Step 4: 运行合同并确认 GREEN**
Run: `powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a05-reset-password-contract.ps1`
Expected: `A05-RESET-PASSWORD-CONTRACT PASS`
---
### Task 3: 更新运行烟测并完成 RED/GREEN
**Files:**
- Modify: `tests/a05-reset-password-runtime-smoke.js`
- Test: `tests/a05-reset-password-runtime-smoke.js`
**Interfaces:**
- Consumes: Chrome `9222` 调试端口与 `http://localhost:5173` H5 页面。
- Produces: 默认态、手机号错误、待接入 Toast、全字段错误、密码不一致和成功结果证据。
- [x] **Step 1: 将旧验证层断言改为新 Toast 断言**
点击“获取验证码”后等待 `.feedback-toast`,断言文字为“滑动验证待接口接入”;同时断言不存在 `.verification-layer`,表单值未清空。
- [x] **Step 2: 运行烟测**
Run: `node tests/a05-reset-password-runtime-smoke.js http://localhost:5173`
Expected: `A05-RESET-PASSWORD-RUNTIME-SMOKE PASS`
---
### Task 4: 真实截图、文档和最终验证
**Files:**
- Modify: `design-qa.md`
- Modify: `docs/验收规划.md`
- Modify: `docs/交接记录.md`
- Modify: `docs/design/P00_页面结构与资产清单.md`
- Update ignored evidence: `tmp/a05-*.png`
**Interfaces:**
- Consumes: 实际 H5 运行页与静态/运行测试输出。
- Produces: A05 待审核候选证据,不产生正式验收或冻结结论。
- [x] **Step 1: 捕获四档视口并审视**
用 Chrome CDP 捕获 320×568、360×640、360×800、412×915,检查 Logo、标题、四字段、验证码入口、按钮边缘、Toast、成功卷轴、滚动和横向溢出。
- [x] **Step 2: 更新 A05 记录**
只记录新视觉迁移与内部 H5 证据;A05 仍为 `[~]`,真实滑动验证、接口结果和 Android/HBuilderX 仍待审核。
- [x] **Step 3: 运行最终验证**
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a05-reset-password-contract.ps1
node tests/a05-reset-password-runtime-smoke.js http://localhost:5173
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/capture-chrome-page-contract.ps1
git diff --check
```
Expected: 三项测试 PASS`git diff --check` 退出码 0,允许已有 CRLF 提示。
@@ -0,0 +1,17 @@
# A06 向 A01 视觉体系收拢实施计划
> 当前会话内联执行;不使用子代理、worktree 或任何 Git 暂存、提交、推送操作。
**Goal:** 在不改变 A06 三种阻断状态逻辑的前提下,统一 Logo、字体、标题分隔、按钮和恢复说明层。
**Architecture:** `pages/auth/a06-auth-status.vue``statusConfig` 继续作为状态合同唯一所有者;只替换展示层资产与尺寸。PowerShell 合同禁止旧视觉回退,Chrome CDP 验证多状态和四档尺寸。
**Tech Stack:** uni-app、Vue 3、SCSS、PowerShell、Node.js、Chrome CDP。
## Tasks
- [x]`tests/a06-auth-status-contract.ps1` 要求 `a01-vnext-divider-v1.png`、两次 `a01-scroll-primary-v3.png``a01-scroll-dialog-v3.png``184×221rpx``aspectFit`;禁止旧三项资产与 `font-family:`,运行得到 RED。
- [x]`pages/auth/a06-auth-status.vue` 最小替换资产和样式,保持 `statusConfig`、查询参数、恢复层与导航逻辑不变,运行合同得到 GREEN。
- [x]`tests/a06-auth-status-runtime-smoke.js` 尺寸补齐为 320×568、360×640、360×800、412×915,运行三状态、未知回落、弹层与返回 A01 烟测。
- [x] 捕获并检查 412×915 风险默认态和恢复说明层,以及 320×568 短屏;更新 `design-qa.md`、验收规划、交接记录和资产清单。
- [x] 运行 A06/A05/A04/A01 聚焦合同、A06 运行烟测、截图合同、状态统计和 `git diff --check`A06 保持 `[~]`
@@ -0,0 +1,16 @@
# A06 路由封存实施计划
> 用户于 2026-07-16 选择从正式路由移除 A06,但保留页面源码、测试、视觉证据与文档。禁止删除文件、worktree 和任何 Git 写操作。
**Goal:** 将 A06 从当前基础版本路由和验收队列中封存,使正式路由从 53 条变为 52 条,同时保留可恢复实现。
**Contract owner:** `pages.json` 是当前可发布路由的唯一所有者;`docs/交接记录.md` 记录 A06 封存原因、保留路径与恢复条件。
## Tasks
- [x] 先修改路由合同:A06 源码必须存在,但 `pages.json` 不得注册 A06A01/A02/A03/full-page 合同统一期待 52 条,运行得到 RED。
- [x]`pages.json` 删除 A06 单一路由项,不移动或删除 `pages/auth/a06-auth-status.vue`、A06 测试和证据,运行静态合同得到 GREEN。
- [x] 让 A06 runtime smoke 在路由封存时明确输出 SKIP 并成功退出;恢复路由后仍执行原多状态烟测。
- [x] 从 52 页活动验收表移出 A06,后续序号减一;新增“封存页面”记录,不计入 `[~]/[x]/[!]` 统计。
- [x] 更新交接记录、视觉手册、P00、证据索引和 Design QA:A06 保留用途为未来阻断登录流程,恢复条件为产品重新启用并补真实入口/接口/Android 复核。
- [x] 验证 52 条路由、52 个 `[~]`、0 `[x]`、0 `[!]`、A06 源码/测试/证据存在、活动路由不存在 A06,并运行相关合同及 `git diff --check`
@@ -0,0 +1,284 @@
# Design Asset Pipeline v2 Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Subagents and worktrees are prohibited for this project.
**Goal:** Upgrade the existing Node/Sharp A01 pipeline with a strict manifest v2, a portable Python/Pillow pixel-quality gate, and two clean, exact-ratio A01 button v2 assets verified in the real uni-app page.
**Architecture:** Keep `design-pipeline/` as the single orchestration root. Node validates the manifest, checks consumers and runtime slots, and invokes Python; Pillow deterministically rebuilds versioned assets from committed masters and analyzes Alpha/edge contamination. A new pilot manifest is added beside schema v1 so the current reproducible pipeline is not broken before the pilot passes.
**Tech Stack:** Node.js 24 / native `node:test`, Sharp 0.34.5, Python 3.14, Pillow 12.3.0, PowerShell contracts, Chrome CDP 9222, uni-app/HBuilderX.
**Execution record (2026-07-16):** All six implementation tasks were executed in the current worktree. The importable Python module is `rebuild_a01_buttons.py` and the Node entry is `rebuild-a01-buttons.mjs`. The focused automated gates and four H5 viewports passed; Android/HBuilderX, a second-computer rebuild, and user acceptance remain outstanding. Existing handoff evidence was not overwritten; the latest internal 412×915 check stays under ignored `tmp/`.
## Global Constraints
- Do not use a worktree, subagent, `git add`, `git commit`, `git push`, `git reset`, `git checkout`, upload, or destructive cleanup.
- Preserve the current A01 and documentation changes already in the dirty worktree.
- Do not overwrite or delete `a01-primary-button.png` or `a01-secondary-button.png`; v2 outputs use new paths.
- Do not promote the pipeline beyond A01 in this implementation.
- A01 stays `[~]`; H5 evidence is internal only and Android/user verification remains outstanding.
- Fixed assets must match the actual logical slots: primary `622×92rpx`, secondary `622×100rpx`.
- Produce 3× files: primary `1866×276px`, secondary `1866×300px`.
- Button text and the WeChat icon remain code/UI nodes and must not be baked into the bitmaps.
- Every production-code task follows RED → GREEN and ends with a focused diff/status checkpoint instead of a commit.
---
### Task 1: Strict Manifest v2 Validator
**Files:**
- Create: `design-pipeline/manifests/a01-buttons-v2.json`
- Create: `design-pipeline/scripts/manifest-v2.mjs`
- Create: `design-pipeline/scripts/validate-manifest-v2.mjs`
- Create: `design-pipeline/tests/manifest-v2.test.mjs`
- Modify: `design-pipeline/package.json`
**Interfaces:**
- Consumes: a JSON file path supplied on the command line.
- Produces: `loadAndValidateManifest(filePath): Promise<ManifestV2>` and CLI output `MANIFEST-V2 PASS <path>`.
- [ ] **Step 1: Write failing Node tests**
Use `node:test` to assert that a valid fixture returns schema version 2 and that validators reject duplicate IDs, path escape, ratio mismatch over 0.5%, `uniform-only` with `scaleToFill`, unknown asset classes, and missing consumers.
```js
import test from 'node:test'
import assert from 'node:assert/strict'
import { validateManifest } from '../scripts/manifest-v2.mjs'
test('rejects a fixed bitmap whose output ratio differs from its slot', () => {
const manifest = validManifest()
manifest.assets[0].outputPixels.height = 300
assert.throws(() => validateManifest(manifest, workspace), /ratio/i)
})
```
- [ ] **Step 2: Run RED**
Run: `node --test design-pipeline/tests/manifest-v2.test.mjs`
Expected: FAIL because `manifest-v2.mjs` does not exist.
- [ ] **Step 3: Implement the minimal strict validator**
Validate these exact properties: `schemaVersion`, `page`, unique `assets[].id`, `assetClass`, workspace-safe `source/output`, `logicalSlot`, `outputPixels`, `render.scalePolicy`, `render.uniMode`, `alpha`, `edge`, `quality.maxBytes`, and non-empty `consumers`. Reject unknown top-level asset classes and calculate ratio drift as:
```js
const slotRatio = widthRpx / heightRpx
const outputRatio = width / height
const ratioDrift = Math.abs(outputRatio / slotRatio - 1)
if (ratioDrift > 0.005) throw new Error('asset ratio drift exceeds 0.5%')
```
- [ ] **Step 4: Add pilot manifest and package scripts**
Add scripts:
```json
{
"test:v2": "node --test tests/manifest-v2.test.mjs",
"validate:a01-buttons": "node scripts/validate-manifest-v2.mjs manifests/a01-buttons-v2.json"
}
```
The manifest declares the two old committed masters as `source`, versioned v2 outputs, exact slot/output dimensions, `uniform-only`, transparent outer padding, no chroma residue, sRGB, and the A01 consumer selectors `.login-submit` / `.wechat-login`.
- [ ] **Step 5: Run GREEN and checkpoint**
Run:
```powershell
npm.cmd ci --prefix design-pipeline
npm.cmd --prefix design-pipeline run test:v2
npm.cmd --prefix design-pipeline run validate:a01-buttons
git diff --check
git status --short
```
Expected: Node tests and manifest validation pass; only scoped files plus pre-existing changes appear.
### Task 2: Portable Python Pixel Quality Gate
**Files:**
- Create: `design-pipeline/requirements.txt`
- Create: `design-pipeline/scripts/asset_quality.py`
- Create: `design-pipeline/tests/test_asset_quality.py`
- Create: `design-pipeline/scripts/verify-assets.py`
**Interfaces:**
- Consumes: manifest v2 and its output PNG files.
- Produces: `analyze_asset(path: Path, spec: dict) -> dict`, non-zero CLI exit on violations, and `ASSET-QUALITY PASS <id>` per asset.
- [ ] **Step 1: Pin the supported dependency**
Create:
```text
Pillow==12.3.0
```
Pillow 12.3.0 supports Python 3.10+ including 3.14; do not add OpenCV unless a failing test proves Pillow is insufficient.
- [ ] **Step 2: Write failing Python unit tests with synthetic PNGs**
Use `unittest` and temporary images to cover exact dimensions, RGBA requirement, transparent corners, transparent outer padding, green residue, light fringe on partially transparent edge pixels, sRGB metadata warning/reporting, and maximum bytes.
```python
def test_rejects_visible_green_residue(self):
image = Image.new("RGBA", (32, 16), (0, 0, 0, 0))
image.putpixel((16, 8), (0, 255, 0, 255))
report = analyze_asset(self.save(image), self.spec())
self.assertIn("chroma residue", " ".join(report["errors"]))
```
- [ ] **Step 3: Run RED**
Run outside the sandbox if required:
```powershell
python -m venv design-pipeline/.venv
design-pipeline/.venv/Scripts/python.exe -m pip install -r design-pipeline/requirements.txt
design-pipeline/.venv/Scripts/python.exe -m unittest discover -s design-pipeline/tests -p 'test_*.py' -v
```
Expected: FAIL because `asset_quality.py` does not exist.
- [ ] **Step 4: Implement the minimal analyzer**
Implement row-wise Pillow analysis without OpenCV. Count chroma residue only where Alpha is visible. Evaluate light fringe only on pixels with `0 < alpha < 255`, so the intentionally warm-white secondary-button interior is not rejected. Require the declared transparent outer padding and exact dimensions.
- [ ] **Step 5: Implement manifest CLI and run GREEN**
`verify-assets.py` imports the analyzer, reads the manifest, validates each existing output, writes an ignored JSON report under `design-pipeline/generated/a01-buttons-v2/quality-report.json`, and exits non-zero on any error.
Run unit tests and `git diff --check`; expected unit-test PASS. Output verification remains RED until Task 3 creates v2 assets.
### Task 3: Deterministic A01 Button Rebuilder
**Files:**
- Create: `design-pipeline/scripts/rebuild-a01-buttons.py`
- Create: `design-pipeline/scripts/rebuild-a01-buttons.mjs`
- Create: `design-pipeline/tests/test_rebuild_a01_buttons.py`
- Modify: `design-pipeline/package.json`
**Interfaces:**
- Consumes: the two committed v1 master PNGs plus manifest v2.
- Produces: versioned v2 PNGs at exactly `1866×276` and `1866×300`, with transparent outer padding and no baked text/icons.
- [ ] **Step 1: Write failing reconstruction tests**
Generate synthetic framed masters with deliberately contaminated outer rows. Assert that `rebuild_button(source, output_size, trim, padding, cap_width)` removes the contaminated border, keeps transparent corners/padding, preserves left/right caps, and returns exact output size.
- [ ] **Step 2: Run RED**
Run the Python unittest command. Expected: FAIL because the rebuilder module does not exist.
- [ ] **Step 3: Implement nine-slice-like offline rebuilding**
Use Pillow only:
1. Crop the manifest-declared contaminated outer trim.
2. Split into left cap, stretchable center, and right cap.
3. Resize caps uniformly to the inner target height.
4. Resize only the center horizontally to fill the remaining width.
5. Paste onto an RGBA target with the declared transparent padding.
6. Save optimized sRGB PNG.
This is offline raster production, not runtime nine-slice; the page receives a complete exact-ratio bitmap.
- [ ] **Step 4: Add a Node orchestration script**
Add `rebuild:a01-buttons` to `package.json`, calling a small Node launcher that selects `PYTHON` or `python`, validates the manifest, runs the Python rebuilder, then runs `verify-assets.py`. A non-zero Python exit must propagate.
- [ ] **Step 5: Build actual v2 assets and run GREEN**
Run the rebuild command with Python available outside the sandbox if required. Inspect both output images with `view_image`, then run Python unit tests and output verification. Expected: exact sizes, transparent outer padding, no detected fringe/chroma residue.
### Task 4: A01 Asset Contract and Page Integration
**Files:**
- Modify: `tests/a01-a02-ui-contract.ps1`
- Modify: `tests/a01-asset-alpha-audit.ps1`
- Modify: `pages/auth/a01-entry.vue`
**Interfaces:**
- Consumes: v2 button paths and manifest render policy.
- Produces: A01 references v2 skins with no text/icon baked in and no ratio distortion.
- [ ] **Step 1: Extend the PowerShell contracts first**
Require v2 asset references, forbid the two v1 paths in A01, require `mode="aspectFit"` on both button skins, and verify exact v2 pixel sizes/Alpha corners. Keep v1 files present because other pages may still consume them.
- [ ] **Step 2: Run RED**
Run both A01 contracts. Expected: FAIL because A01 still references v1 assets with `scaleToFill`.
- [ ] **Step 3: Make the minimal page change**
Change only the two `button-skin` sources and their `mode`; do not change button copy, WeChat icon, click behavior, layout heights, or unrelated A01 styles.
- [ ] **Step 4: Run GREEN**
Run the A01 contracts and `git diff --check`. Expected: PASS.
### Task 5: Runtime Slot and Visual Verification
**Files:**
- Create: `design-pipeline/scripts/verify-runtime-slots.mjs`
- Create: `design-pipeline/tests/runtime-slot-contract.test.mjs`
- Modify: `design-pipeline/package.json`
**Interfaces:**
- Consumes: manifest v2 runtime URL, selectors, Chrome port 9222.
- Produces: `RUNTIME-ASSET-SLOTS PASS` after checking loaded sources, slot dimensions, ratio, overflow, and four viewports.
- [ ] **Step 1: Write failing Node tests for pure slot comparison**
Extract `compareSlot(actual, expected, tolerance)` and test exact match, tolerance, and mismatch. Run RED before implementation.
- [ ] **Step 2: Implement the CDP verifier**
Use the same native WebSocket request pattern as `scripts/capture-chrome-page.js`. Navigate without the existing reload race, wait for both images to load, and inspect 320×568, 360×640, 360×800, and 412×915. Assert no horizontal overflow and natural scroll at 320×568.
- [ ] **Step 3: Run Node tests and real runtime verification**
Keep HBuilderX H5 and the dedicated Chrome 9222 page running. Expected: pure tests PASS and `RUNTIME-ASSET-SLOTS PASS`.
- [ ] **Step 4: Capture one representative screenshot**
Overwrite the existing ignored A01 412×915 runtime representative instead of generating multiple similar images. Open it with `view_image` and inspect both button edges, corners, line sharpness, text/icon separation, and page layout.
### Task 6: Portable Handoff and Final Verification
**Files:**
- Modify: `docs/design/设计资产生产流水线规范.md`
- Modify: `docs/交接记录.md`
- Modify: `docs/design/P00_页面结构与资产清单.md`
**Interfaces:**
- Consumes: actual commands, paths, reports, and observed verification results.
- Produces: another Windows computer can restore Node/Python dependencies and repeat the verified static pipeline.
- [ ] **Step 1: Update documentation with facts only**
Replace “target contract” wording only for components actually implemented. Record Pillow 12.3.0, Python 3.10+ support, environment commands, manifest path, script names, v2 asset dimensions, and remaining Android/user-validation gap.
- [ ] **Step 2: Run the complete focused verification set**
Run:
```powershell
npm.cmd --prefix design-pipeline run test:v2
npm.cmd --prefix design-pipeline run validate:a01-buttons
npm.cmd --prefix design-pipeline run rebuild:a01-buttons
design-pipeline/.venv/Scripts/python.exe -m unittest discover -s design-pipeline/tests -p 'test_*.py' -v
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-a02-ui-contract.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File tests/a01-asset-alpha-audit.ps1
npm.cmd --prefix design-pipeline run verify:a01-buttons:runtime
git diff --check
git status --short
```
- [ ] **Step 3: Report exact verification layers**
Report static pipeline, Python tests, H5 runtime and screenshot evidence separately. Do not claim Android or user acceptance. Do not commit, stage, push, upload, delete v1 assets, or promote the pipeline to other pages.
@@ -0,0 +1,34 @@
# G01 Application Card Spacing Implementation Plan
> **For agentic workers:** 本计划在当前会话内执行;用户禁止 worktree、多代理及任何 Git 写操作。
**Goal:** 让 G01“加入申请”组三张独立卷轴卡片之间保持 `12rpx` 间距。
**Architecture:** 保留现有模板和资产,仅使用相邻兄弟选择器为第二张及后续申请卡增加上间距。静态合同锁定精确值,运行烟测与真实截图确认页面未溢出且视觉接缝消失。
**Tech Stack:** Vue 3、uni-app、SCSS、PowerShell 静态合同、Chrome CDP 截图。
## Global Constraints
- 只修改 G01 当前审核区域。
- 不新增或替换资产。
- 不执行 Git 暂存、提交、推送、重置或检出。
- H5 截图只是当前视觉审核证据,Android/HBuilderX 仍待复核。
---
### Task 1: 锁定并实现申请卡间距
**Files:**
- Modify: `tests/g01-visual-contract.ps1`
- Modify: `pages/genealogy/g01-my-genealogies.vue`
**Interfaces:**
- Consumes: 现有 `.application-record` 相邻兄弟结构。
- Produces: `.application-record + .application-record { margin-top: 12rpx; }`
- [x]`tests/g01-visual-contract.ps1` 增加精确间距断言。
- [x] 运行合同,确认因缺少 `12rpx` 间距而失败。
- [x] 在 G01 样式中加入相邻兄弟选择器,不调整其他样式。
- [x] 重新运行 G01 静态合同与运行烟测并确认通过。
- [x] 捕获并检查 412×915 默认状态,确认三张申请卡之间有小间隔且没有横向溢出。
@@ -0,0 +1,53 @@
# G01 List Background Assets Implementation Plan
> **For agentic workers:** 当前会话内执行;禁止 worktree、多代理和任何 Git 写操作。
**Goal:** 保存三个 G01 背景母版,并建立可在另一台电脑确定性重建候选输出的 Python+Node 流水线。
**Architecture:** ImageGen 输出作为受控母版;候选清单是生成提示、源路径和处理模式的唯一所有者。Python 进行像素处理,Node 校验路径并编排,生成结果只进入可再生的忽略目录。
**Tech Stack:** Node.js 22+、Python 3、Pillow 12.3.0、JSON、PNG。
## Global Constraints
- 不修改 G01 页面滚动结构或运行资产引用。
- 不覆盖现有 `footer-mountain-bamboo.png`
- 不把候选写入 handoff 截图目录。
- 不执行 Git 暂存、提交、推送、重置或检出。
---
### Task 1: 候选母版与机器清单
**Files:**
- Create: `design-pipeline/manifests/g01-background-candidates.json`
- Create: `design-pipeline/tests/g01-background-candidates.test.mjs`
- [ ] 先写清单合同测试并确认缺少清单时失败。
- [ ] 写入三个母版、完整提示、源尺寸、处理模式和输出路径。
- [ ] 运行 Node 测试并确认清单通过。
### Task 2: 确定性像素构建
**Files:**
- Create: `design-pipeline/scripts/build_g01_backgrounds.py`
- Create: `design-pipeline/scripts/build-g01-backgrounds.mjs`
- Create: `design-pipeline/tests/test_build_g01_backgrounds.py`
- Modify: `design-pipeline/package.json`
- [ ] 先写纯绿、抗锯齿绿边和不透明母版测试并确认失败。
- [ ] 实现绿幕转 Alpha、去绿污染、透明 RGB 清零和不透明母版标准化。
- [ ] 添加 Node 编排入口和 npm 命令。
- [ ] 运行 Python/Node 测试与实际候选构建。
### Task 3: 交接与清理审计
**Files:**
- Modify: `docs/design/设计资产生产流水线规范.md`
- Modify: `docs/design/P00_页面结构与资产清单.md`
- Modify: `docs/交接记录.md`
- Create: `docs/design/G01_列表背景候选与换机重建.md`
- [ ] 记录三母版、构建命令、依赖、不可逐像素重新生成的边界和页面滚动待讨论事项。
- [ ] 扫描截图、候选和未跟踪文件的文档引用,生成精确清理清单。
- [ ] 不删除历史 handoff 证据;任何含糊项留给用户确认。
@@ -0,0 +1,16 @@
# A01 品牌 Logo 尺寸微调设计
## 目标
将 A01 顶部现有 `brand-seal.png``220×264rpx` 缩小为 `184×221rpx`,降低它对宗祠主体的遮挡感,同时保持“谱”字清晰可辨。
## 已确认方案
- 资产、宽高比、水平中心线和 `top: 64rpx` 均不变。
- 只修改 `.brand-seal``width``height`
- 不移动标题、宗祠底图、登录内容或其他页面。
- 412×915 真实运行截图中,Logo 应完整位于宗祠区域、没有拉伸或裁切,并与标题保持清楚的上下层级。
## 验证边界
先用 A01 静态契约锁定精确尺寸,再运行四档 H5 smoke,并人工查看 412×915 截图。H5 通过仍不代表 Android/HBuilderX 或用户整页验收完成。
@@ -0,0 +1,101 @@
# A01 公用卷轴云纹皮肤设计规格
> 日期:2026-07-16
> 状态:用户已确认第 2 套卷轴云纹四件套视觉,待用户复核本规格后进入实施计划。
> 初选视觉源:`docs/design/assets/a01-vnext/A01-shared-skin-family-option-2-selected.png`
> 最终视觉源:`docs/design/assets/a01-vnext/A01-shared-scroll-skins-with-dialog-approved.png`
## 1. 目标与范围
本轮只重新设计并落地 A01 的公用视觉皮肤,不改登录流程、文案、图标、字号、按钮槽位或接口状态。
需要形成同一视觉家族中的四个独立成品:
1. 朱砂主按钮皮肤:用于登录等主操作。
2. 暖宣纸次按钮皮肤:用于微信登录等次操作。
3. 暖宣纸提示框皮肤:用于项目自定义 Toast;与次按钮同族,但更轻、更简洁并允许内容增高。
4. 暖宣纸验证弹窗皮肤:用于安全验证弹窗;使用同族卷轴金线、祥云和底部淡墨山水。
按钮版和提示版不强行共用同一张最终 PNG。它们共享纹样语言、色板和生产组件,但分别适配自己的槽位与伸缩行为。
## 2. 选定视觉语言
- 方向:第 2 套卷轴云纹。
- 主按钮使用深朱砂纸面、古金双线、左右卷轴端头、清晰祥云角花和上下中心盘长结。
- 次按钮使用暖宣纸纸面和同构古金纹样,边线对比度必须高于当前按钮,缩到 320px 屏幕仍能识别花纹。
- Toast 使用同族暖宣纸和祥云,但减少卷轴端头与边线层级,避免抢占错误文案;不能看成缩小的微信按钮。
- 验证弹窗使用清晰的祥云角花和古金双线,淡墨山水仅占底部约 22%,中央保持安静,不能干扰标题、说明和操作按钮。
- 文字、微信图标和提示文案全部由 Vue 保持为活内容,不烘焙进资产。
- 不引入现代渐变、玻璃拟态、高亮白外圈、绿色残边或与宗祠头图冲突的重阴影。
## 3. 公用资产结构
### 3.1 按钮皮肤
按钮采用“横向三段式主皮肤 + 独立中心结饰”的结构:
- 左端:固定宽度,保存卷轴端头、左侧祥云和角线。
- 中段:只保存连续朱砂/宣纸纹理与直线,可横向伸缩。
- 右端:固定宽度,保存卷轴端头、右侧祥云和角线。
- 中心结饰:单独透明叠加,始终几何居中,不随中段拉伸。
这样既忠实保留选定图中的端头、祥云和中心结,又不会把花纹整体横向拉扁。定位只用于皮肤层、结饰层和文字层叠放;按钮本身仍参与正常文档流。
### 3.2 Toast 皮肤
Toast 使用独立的轻量九宫格/三段式皮肤:
- 左右祥云和折角固定。
- 中央纸面与直线允许横向伸缩。
- 上下方向允许在字体放大或文案换行时增高。
- 不使用按钮卷轴端柱,避免提示框显得过重。
如果 Android WebView 对九宫格表现不一致,则由同一 master 通过 Python 离线导出项目已知槽位尺寸,不允许回退到 `scaleToFill` 整图拉伸。
### 3.3 验证弹窗皮肤
验证弹窗使用独立九宫格皮肤:
- 四角祥云、折角和双层金线固定,不随弹窗宽高变化而拉伸。
- 中央暖宣纸区域允许双向伸缩,用于活标题、说明文案和操作区。
- 底部淡墨山水作为独立安全区,只能在水平方向延展或按目标槽位离线导出,不能侵入正文区域。
- 弹窗内容与操作按钮保持代码原生;遮罩、关闭交互和验证流程不改变。
- 现有 `a02-login-panel.png` 约为 `944×1668px` 竖版图,却被 `scaleToFill` 铺进 `620×520rpx` 横向槽位,属于明确比例变形;新资产不得沿用该比例和渲染方式。
## 4. 尺寸合同
| 成品 | 逻辑槽位 | 3× 基准输出 | 伸缩策略 |
| --- | --- | --- | --- |
| 主按钮 | `622×92rpx` | `1866×276px` | 左右端固定,中段横向伸缩,结饰独立居中 |
| 次按钮 | `622×100rpx` | `1866×300px` | 左右端固定,中段横向伸缩,结饰独立居中 |
| Toast | `590×82rpx` 起 | `1770×246px` 起 | 四角固定,中部可横向和纵向扩展 |
| 验证弹窗 | `620×520rpx` | `1860×1560px` | 四角与底部山水固定安全区,中央双向伸缩 |
320×568 下按钮允许随页面自然滚动,不为同屏展示压缩按钮高度。Toast 宽度不得超出安全区,字体放大后不得裁字。
## 5. 生产方法
1. 以选定视觉图作为艺术方向,不直接从带展示背景的整图粗裁最终资产。
2. 使用 ImageGen 分别生成无文字、无图标、无展示阴影的主按钮、次按钮、Toast 和验证弹窗 master。
3. 用 Python/Pillow 完成透底、去白边/绿边、对称校正、切片、sRGB 与精确尺寸导出。
4. Node manifest 记录 master、切片安全区、消费者、槽位和输出;禁止页面重复定义同一合同。
5. A01 先作为唯一试点,Android 和用户确认前不推广到其他页面。
## 6. 验收标准
- 320px 宽真实运行截图中,卷轴端头、祥云和金线能够清楚识别。
- 左右纹样对称;中心结不偏移、不拉伸;按钮文字与微信图标不被纹样干扰。
- 主/次按钮没有白边、绿边、黑边、透明 RGB 或比例变形。
- Toast 在短文案、长文案和字体放大状态下均不裁字、不拉坏角花。
- 验证弹窗在 `620×520rpx` 槽位中不得出现横向压扁、模糊角花或山水侵入正文;标题、说明和两个操作入口必须保持清晰。
- `320×568``360×640``360×800``412×915` H5 检查通过。
- Android/HBuilderX 真机或模拟器复核通过后,才具备公用推广资格。
- 用户没有明确说“通过”前,A01 始终保持 `[~]`
## 7. 非目标
- 不修改 A01 以外页面的按钮。
- 不清理旧按钮资产或历史截图。
- 不对接登录接口。
- 不制作深色主题。
- 不把内部 H5 截图写成用户验收证据。
@@ -0,0 +1,39 @@
# A04 同步 A01 新视觉体系设计
## 目标
将 A04 注册账号页内仍在使用的旧认证视觉替换为 A01 已经通过用户审核的新体系,同时保持 A04 的注册字段、校验逻辑、协议入口和返回登录流程不变。
## 已确认方案
用户选择“方案 1:完整同步 A01 新体系”。本次只修改 `pages/auth/a04-register.vue`、A04 聚焦测试和必要文档,不修改 A01 或其他页面。
### 视觉合同
- 继续使用现有宗祠水墨底板和 `brand-seal.png`
- A04 Logo 与 A01 完全一致:`184×221rpx``top: 64rpx`、水平居中。
- 页面不再声明 `STSong/SimSun`,统一继承全局 `STKaiti / KaiTi`
- 标题分隔改用 `a01-vnext-divider-v1.png``aspectFit`
- 注册主按钮改用 `a01-scroll-primary-v3.png``aspectFit`;文字继续由 Vue 独立承载。
- 反馈 Toast 改用 `a01-scroll-toast-v3.png``border-image` 切片;文案继续由 Vue 承载。
- A04 协议勾选/未勾选图标继续使用 A01 当前已审核的同款资产,不因文件名含 `a02` 而重复造图。
- 返回箭头和宗祠底板属于仍在使用的共享资产,不列为旧视觉替换对象。
### 滑动验证边界
- 删除 A04 当前 `a02-login-panel.png` 自定义安全验证占位视觉及对应开关状态。
- 完整本地校验通过后,只用新版自定义 Toast 提示“滑动验证待接口接入”。
- 后续接口阶段由真实滑动验证组件的自带滑块、轨道、拼图和结果样式接管;本轮不制作新的自定义验证面板。
## 状态与交互
- 保留手机号、设置密码、确认密码三字段和就近错误提示。
- 保留协议未勾选错误、勾选后即时清除、返回 A01 和协议入口。
- 不接注册接口,不伪造注册成功,不新增页面或路由。
## 验证
- 测试先锁定新资产、全局字体、Logo 尺寸和旧资产禁用,再实施页面修改。
- 检查默认、字段错误、协议错误、协议勾选和滑动验证待接入 Toast。
- H5 覆盖 320×568、360×640、360×800、412×915412×915 在用户当前 Chrome 中逐状态审核。
- H5 通过不代表 Android/HBuilderX 或用户整页验收完成,A04 保持 `[~]`
@@ -0,0 +1,48 @@
# A05 向 A01 视觉体系收拢设计
> 设计决定:2026-07-16 用户确认采用完整收拢方案。本文只约束 A05 的视觉资产与字体迁移,不改变接口边界和重置密码业务流程。
## 目标
把 A05 重设密码页仍在使用的旧认证视觉替换为 A01 已确定的新体系,使 A01、A04、A05 在品牌 Logo、字体、标题分隔、主按钮和项目自定义 Toast 上保持一致。
## 唯一视觉真源
- A01 当前真实运行视觉与 `docs/design/screens/handoff/2026-07-16/A01-current-password-sms-contact-824x915.png`
- 全局字体合同:`styles/global.scss` 中的 `"STKaiti", "KaiTi", serif`
- Logo`static/assets/foundation/transparent/brand-seal.png`A05 使用与 A01 相同的 `184×221rpx` 槽位、`top: 64rpx` 和水平居中规则。
- 标题分隔:`static/assets/modules/auth/transparent/a01-vnext-divider-v1.png`,使用 `aspectFit`,不得拉伸。
- 朱砂主按钮:`static/assets/foundation/transparent/a01-scroll-primary-v3.png`,用于“确认重设”和成功结果中的“返回登录”,使用 `aspectFit`
- 浅色卷轴 Toast`static/assets/foundation/transparent/a01-scroll-toast-v3.png`,使用九宫格 `border-image`,不得用绝对定位图片层拉伸。
## 页面结构
1. 保留现有红色宗祠水墨底图、返回按钮、标题、副标题、四字段表单、获取验证码入口、重设提示和返回登录入口。
2. 删除 A05 内所有局部 `font-family`,统一继承项目全局楷体。
3. Logo 缩小到 A01 已确认尺寸;不改底图,不把 Logo 烘焙进背景。
4. 标题分隔线、页面主按钮和成功结果按钮换成 A01 新资产;按钮文字仍由真实 DOM 承担。
5. Toast 删除旧 `feedback-toast__skin` 图片层,改用新浅色卷轴九宫格背景。
## 行为验证与结果态边界
- A05 仍在“获取验证码”前校验手机号。
- 真实滑动验证必须使用后续接口组件自带样式;旧 `a02-login-panel.png` 验证面板不作为最终视觉证据。
- 本轮移除旧自定义验证面板的最终视觉依赖。手机号通过后只显示“滑动验证待接口接入”的项目自定义 Toast,不伪造滑块完成、验证码发送成功或倒计时。
- 四字段本地校验和成功结果层继续保留,用于当前页面视觉流程审核;成功结果层换用 `a01-scroll-dialog-v3.png` 作为国风卷轴容器,但该资产在滑动验证场景仍不得冒充真实组件。
- 返回登录仍使用 `/pages/auth/a01-entry`,不恢复已删除的 A02。
## 不变范围
- 不接短信、滑动验证、重置密码或登录接口。
- 不新增路由,不修改 A01、A04 或其他页面。
- 不改变手机号、验证码、新密码、确认新密码的字段和现有就近错误文案。
- 不新增深色主题,不压缩 320×568;短屏继续自然纵向滚动。
- 不使用 `uni.showToast``uni.showModal``uni.showLoading``uni.showActionSheet`
## 验收标准
- 静态合同要求 A05 引用新 Logo 尺寸、标题分隔、两处朱砂按钮与九宫格 Toast,且不再引用旧主按钮、旧次按钮、旧登录面板或局部字体。
- 运行时覆盖默认空表单、手机号错误、滑动验证待接入 Toast、全字段错误、密码不一致和成功结果层。
- 320×568、360×640、360×800、412×915 无横向溢出;320×568 允许纵向滚动。
- 只保存一张 412×915 代表图或一张复杂状态联系表;H5 只作为候选证据。
- Android/HBuilderX、真实滑动验证和真实接口结果继续待审,A05 保持 `[~]`,不冻结。
@@ -0,0 +1,26 @@
# A06 向 A01 视觉体系收拢设计
> 2026-07-16 用户确认直接收拢。本文复用 A01/A04/A05 已确定的认证视觉合同,不探索新方向。
## 目标与真源
- A06 保留 `frozen|disabled|risk` 三种阻断状态、未知状态回落、原因/影响/恢复信息、恢复说明层与返回 A01 行为。
- Logo 使用 `brand-seal.png` 与 A01 相同的 `184×221rpx``top: 64rpx` 居中槽位。
- 页面删除全部局部 `font-family`,继承 `styles/global.scss` 的全局楷体。
- 标题分隔使用 `a01-vnext-divider-v1.png``aspectFit`
- 页面“查看恢复方式”和恢复层“我知道了”使用 `a01-scroll-primary-v3.png``aspectFit`
- 恢复说明层使用 `a01-scroll-dialog-v3.png``aspectFit`,仅作为项目自定义信息层,不冒充接口结果。
## 不变范围
- 不改状态文案、查询参数、状态回落、打开/关闭恢复层和返回 A01 的逻辑。
- 不接账号申诉、身份核验或恢复接口。
- 不修改其他页面,不清理旧资产文件。
- 基础版本仅浅色;320×568 自然纵向滚动。
- A06 保持 `[~]`,真实入口、接口和 Android/HBuilderX 仍待复核。
## 验收
- 静态合同要求四项新资产、Logo 尺寸、两处新版按钮和全局字体继承;禁止旧按钮、旧面板、旧分隔与局部字体。
- 运行态覆盖冻结、停用、风险限制、未知回落、恢复说明层关闭和返回 A01。
- 复核 320×568、360×640、360×800、412×915,无横向溢出,短屏可滚动。
@@ -0,0 +1,23 @@
# G01 加入申请卡片间距设计
## 决定
G01“加入申请”组三张记录继续使用现有独立卷轴卡片资产。相邻卡片之间增加 `12rpx` 垂直间距,第一张卡片与分组标题之间保持现状。
## 原因
- 每张卡片代表一条独立申请,适度留白能强化独立点击与状态扫读。
- 现有卷轴卡片包含完整上下边框和四角装饰;直接相连会造成双边框和角花碰撞。
- `12rpx` 能消除接缝拥挤,同时保持三条记录属于同一分组,不明显增加页面长度。
## 范围
- 只修改 `pages/genealogy/g01-my-genealogies.vue` 中相邻 `.application-record` 的垂直间距。
- 不修改卡片资产、卡片高度、内边距、文案、状态颜色、分组标题、其他家谱卡片和页面导航。
- 在 412×915 Chrome H5 真实运行画面复核;Android/HBuilderX 仍留在最终设备验收阶段。
## 验收
- `.application-record + .application-record``margin-top``12rpx`
- 第一张申请卡没有新增顶部间距。
- 页面不存在横向溢出,三张卡片边框不再相接。
@@ -0,0 +1,31 @@
# G01 列表背景资产设计
## 当前决定
先生成并保留三个 G01 列表背景母版,不修改页面滚动结构,也不替换现有运行资产。下一轮先由用户选择方向,再创建唯一正式运行资产并接入页面。
## 已生成方向
- A:上方远山、左下亭台、右侧竹影,纯绿幕背景,适合提取透明叠加层。
- B:上下远山形成纵向框景、左中亭台、右侧竹影,纯绿幕背景,适合提取透明叠加层。
- C:云气、树枝、亭台、竹影和山水从上到下连续分布,带完整暖宣纸底,适合直接作为不透明列表背景。
三个母版都只作为候选,不等于用户已选择,也不进入页面引用。母版位于 `docs/design/assets/g01-background/masters/`
## 生产合同
1. ImageGen 只负责艺术母版;准确提示词、母版路径和处理模式写入 `design-pipeline/manifests/g01-background-candidates.json`
2. Python/Pillow 负责解码、绿幕转 Alpha、去绿边、清理透明 RGB、sRGB 输出和确定性压缩。
3. Node 负责校验清单路径与源尺寸、调用 Python,并把结果写入已忽略的 `design-pipeline/generated/g01-background/`
4. 另一台电脑使用仓库内母版构建时应得到相同像素结果;再次调用模型只能得到同方向的新母版,不能保证逐像素一致。
5. 用户选择方向前,不创建 `static/assets/` 正式输出,不修改 G01 页面。
## 下一轮页面结构待讨论
用户提出 G01 应只滚动下方列表:红色标题栏、当前家谱大卡片、四个快捷入口和分隔线固定;从“我创建的”开始独立滚动。新背景预计固定在列表滚动窗口背后,而不是作为列表末尾内容。该结构尚未批准实施,下一轮继续讨论并进行四档尺寸验证。
## 质量与仓库边界
- 候选生成结果不写入 `docs/design/screens/handoff/`,避免扩大交接截图合同。
- `generated/`、虚拟环境、Node 依赖和 `tmp/` 不进入 Git。
- 三个母版是当前选择尚未完成时的必要设计输入;选定正式方向后,再由用户决定是否保留未选母版。