docs: add Android app implementation harness

This commit is contained in:
QiuSW
2026-08-04 17:09:52 +08:00
commit fdb20b8ae5
13 changed files with 1799 additions and 0 deletions
+71
View File
@@ -0,0 +1,71 @@
# 失败记忆与防回归台账
> 状态:初始风险基线;实现和运营过程中持续追加
> 用途:把容易重复的错误转化为持久约束和机械反馈
## 1. 已知高风险模式
| ID | 失败模式 | 常见症状 | 持久护栏 | 验证 |
|---|---|---|---|---|
| FM-001 | 六爻顺序被反转 | 已知输入显示成另一卦;初爻画在顶部 | 领域统一 bottom-up,仅展示适配层反转 | 已知夹具 + 4,096 组合测试 + UI 语义测试 |
| FM-002 | 6/7/8/9 映射错误 | 6/9 未变或 7/8 被标成动爻 | `LineValue` 封闭枚举,禁止散落 `% 2`/magic number | 8 种币面与映射参数化测试 |
| FM-003 | 用二进制序号冒充文王卦序 | 阴阳形正确但卦号/卦名错误 | 经审核的完整模式映射表 | 64 模式唯一性与已知卦测试 |
| FM-004 | UI top-down 数据回流领域层 | 保存后再打开结果颠倒 | DTO 字段名强制 `BottomUp`,序列化往返测试 | Room/DTO round-trip |
| FM-005 | AI 参与或改写起卦 | AI 前后卦号变化;网络失败无结果 | `CastEngine` 纯 Kotlin;解释状态与结果分离;依赖检查 | 请求前后不可变测试、离线 E2E |
| FM-006 | 用户未点击就发起 AI 请求 | 进入结果页即出现网络流量 | 显式调用门与同意状态机 | fake server 调用次数为 0 |
| FM-007 | 生产密钥进入 APK | BuildConfig/strings/NDK 中出现 key | 后端代理、secret scan、APK 检查 | CI secret scan + release artifact scan |
| FM-008 | 敏感问题进入日志 | crash/HTTP 日志出现原文 | 结构化脱敏错误码;发布关闭 body logger | 日志捕获测试与人工抓取 |
| FM-009 | 内容缺失时数组错位 | 第 N 卦显示第 N+1 卦文本 | 以显式卦号查表;启动/构建期 schema 校验 | 缺失/重复条目负向测试 |
| FM-010 | 使用未授权现代译文 | 上架投诉或无法说明来源 | 每段 `sourceRefs` + 许可证清单 + 发布签核 | 内容校验 + 人工版权审核 |
| FM-011 | “国风”装饰损害可用性 | 低对比水墨、毛笔正文、小铜币按钮 | 语义令牌、48dp、对比度和反模式清单 | accessibility test + 真机评审 |
| FM-012 | 动爻只用朱砂色表示 | 色觉用户/读屏无法识别 | 颜色 + 形状/符号 + 文本 | TalkBack 和去色检查 |
| FM-013 | 旋转或进程重建重复提交 | 丢轮次、重复 AI 扣费 | SavedState、idempotency key、显式请求状态 | 重建/并发/取消测试 |
| FM-014 | AI 输出被当 HTML/命令执行 | 恶意链接、样式或脚本进入 UI | 结构化纯文本 schema、长度和字符校验 | 对抗性响应测试 |
| FM-015 | 高风险问题得到命令式答案 | 模型要求买卖、停药、立即分手 | 服务端安全提示、测试集、本地降级 | 高风险金丝雀用例 |
| FM-016 | 为通过测试关闭门禁 | ignored test、宽泛 catch、destructive migration | DoD 与评审规则,失败必须归因 | CI 检查 skipped tests/配置差异 |
| FM-017 | 文档与实现漂移 | 代理按旧命令/旧结构工作 | 文档状态、链接检查、行为变更同提交 | CI docs check + 里程碑熵清理 |
| FM-018 | 将实时 AI 当唯一测试 oracle | 测试不稳定、成本和输出漂移 | fake server + 固定 schema fixtures | JVM/integration tests 无外网依赖 |
## 2. 故障登记模板
可复现且有再次发生价值的故障追加如下记录:
```markdown
## INCIDENT-YYYYMMDD-NN:短标题
- 发现日期:
- 影响需求:
- 环境/版本:
- 用户症状:
- 最小复现:
- 根因:
- 为什么旧护栏没捕获:
- 修复:
- 新增测试/静态规则:
- 相关提交或 issue:
- 后续观察:
```
不要记录密钥、真实用户问题或完整 AI 回复;使用脱敏夹具。
## 3. 提升规则
- 同类问题第一次出现:修复并加回归测试。
- 第二次出现:在本文件登记,并优先增加 lint、架构测试、schema 或聚合验证。
- 影响领域确定性、隐私、密钥、内容授权或高风险 AI 的问题:第一次即登记并加入发布门禁。
- 只写“以后注意”不算护栏;必须指出由什么测试、脚本、类型或评审入口阻止复发。
## 4. 定期审计问题
每个里程碑检查:
1. 是否出现新的裸数字 2/3/6/7/8/9 业务逻辑?
2. 是否有非 `CastEngine` 代码重新推导卦象?
3. 是否有新增网络路径在用户同意前发送内容?
4. 是否有日志或测试夹具包含类似真实问题的文本?
5. 是否有卦辞、字体、图片缺少来源?
6. 是否有页面绕过主题令牌或无障碍语义?
7. 是否有依赖方向、测试命令或文档链接已经过期?
8. 是否有多次出现但仍只靠人工评审发现的问题?
审计输出应形成小型、可评审的修复任务,而不是一次大规模无边界重写。