Files
CyberGril/docs/r3/REPORT-HEL-834.md
T

8.0 KiB
Raw Blame History

HEL-834 R3 回忆页接线(视觉总监,待独立审核)

完整基准 v1.10/59项;读取的代码是后台交付提交 89d53b6c53fdfc26af8b1a2fa0244ac41efc731b(分支 agent/agent/4d31c9a5ed04,PR#9)。按这份精确源码续作,没有回到旧 main。产品目标是 origin/agent/agent/de8874a3803b。需求变更:无。

开工前读了 AGENTS.md、需求入口 README、current.md(CG-006、CG-018、AM-001、UX-006、DEL-001 等原文)、coverage.md、changes.md、交接模板、REPORT-HEL-832 §1.6/§3/§5、STATUS-HEL-833、handoff-HEL-833.json,以及后台 api/app.py 中的 /api/memories* 和 memory/episodic.py 中 dto()/page()/source() 的实际实现。

本机环境与交付方式

运行机器上没有 git、python 或 node,所以无法按卡要求推独立分支、开 PR,也跑不了 scripts/check_requirements.py(它需要 python3 和 git 引用)。补救办法:

  • 源码:从 Gitea 下载 89d53b6 的归档包(HTTP 200),在副本上修改。交付用源码包加 MANIFEST,由总工入库(同 HEL-828 的做法)。
  • 构建与测试:从 nodejs.org 下载官方 Node v22.11.0 便携版,放在任务工作目录,SHA256 已对照官方 SHASUMS256 核实。npm ci 按仓库 package-lock 安装,没有新增依赖。build、lint、test 都用仓库自带脚本跑,并保存了输出。
  • 没有改动队员运行时、模型或认证,也没有改系统环境。

改了什么(只改前端)

文件 改动
web/src/adapters/real.ts 新增 serverMemory 校验器(照 serverLife 的写法),以及 memoryPage(limit=30,带 before 游标)和 memoryDetail(详情页;伪造、非法或隐藏的 id 统一按 404 处理,非法 id 根本不发请求)。404/405 映射为 NotWired(老服务没有这个路由),与失败分开处理。新增 memoryNote:服务器报 capabilities.memory===true 时首页才说"回忆保存在服务器",否则保持原来更保守的说法。
web/src/domain/model.ts Memory 增加可选字段 messageIds(只有真实模式会有)。
web/src/life/LifePanel.tsx 真实模式的回忆页接入服务端数据,生命周期与"她的日子"相同:每次打开都重新读取,失败时显示中性提示并可重试,用游标看更早的回忆,伪造的 #memory= 旧链接按 id 去取。接收确认后在 15 秒和 45 秒各重新看一次(伴侣来源同样受确认门禁限制)。详情页的"那时候的聊天"只显示 messageIds 对应的消息,按实际说话人标注"你"或她的名字。"来自这些日子"只用服务端裁剪过的 lifeIds,没加载到的日子按 id 读取 /api/life/{id}。"她的日子"详情里的"和这件事有关的回忆"由服务端 lifeIds 反查。
web/src/app/RealApp.tsx 新增 openSaid(messageIds):从回忆跳到交谈记录时直接定位到那几条消息,不往消息上写 lifeIds,避免回忆 id 和日子 id 混用。首页那一行改用 memoryNote。
web/src/chat/ChatPanel.tsx 新增可选参数 focusIds:给每条消息加 data-mid,命中的消息用原有的 hl 高亮并滚动到可见处。原来的 focusLife 逻辑不变。
web/src/styles/components.css 修正一个原有样式缺陷:回忆列表和详情抬头里的圆点 i.k.mem 被 .mem 卡片规则误套,变成了整行加内边距的空框(演示模式里同样存在)。现在只把圆点恢复成既有规范的 9px 描边圆点,没有改其他样式。
web/tests/r3memory.test.ts 新增 5 项单元测试:合同字段映射与游标、坏行丢弃、空列表/未接通/失败三态、详情 404 与非法 id、首页说法。
web/tests/hel834_mock.mjs、hel834_shots.mjs 本地隔离的合同 mock 和 Edge CDP 浏览器检查脚本,可以重跑。

视觉决定(沿用已认可的回忆页,没有新建组件)

  • 真实模式下,"我们一起的"一组展示服务端回忆。"你们的小习惯"和"她知道的你"后台没有生成能力,不画成看起来会自己填满的空组。若以后服务端返回其他分组,会按原组件自动出现。
  • "她的成长"仍然只来自 /api/persona,放在设置页。这里只保留分组标题,加一句说明和"在设置里看底色与成长"的入口,不把成长当成回忆来计数或合流。
  • 后台的 title 和 text 截自同一段 gist,直接显示会重复。处理方式:服务端截短的标题加"…";列表第二行和详情引文只在提供了新内容时才显示。
  • 状态文案分开写:
    • 读取中:"正在翻你们的回忆…"
    • 失败:"回忆一时没翻出来",并提供重试。
    • 老服务未接通:"这台服务的长期记忆尚未接通"。
    • 空列表:"还没有可以展示的回忆",并说明整理需要一段时间,还没整理好的或来源不能公开的都不会出现。这里不断言"从未聊过",也不伪造压缩进度。
    • 隐藏或旧链接:统一显示"这一条现在打不开"。
  • 布局、动效、两套主题和手机推入式详情都沿用原有实现。

隐私边界(AM-001)

真实模式只渲染服务端已经裁剪好的字段。前端没有补任何关联,也没有放宽门禁:没有把同一轮的伴侣回复拼进回忆,没有补 lifeIds,没有改 told 状态,也不发送任何确认。"那时候的聊天"取自用户本人的 /api/messages 记录,按 messageIds 精确匹配,排除取消和失败的消息。若某条消息在本地找不到,显示中性的"现在打不开"。本次自测的 mock 里没有出现未分享生活、未发送消息或未知的私密引用。真实后台的来源门禁以 HEL-833 的自测和总工审核为准,本卡只验证前端如实渲染。

实际验证

  • docs/r3/web-build-HEL-834.txt:tsc --noEmit && vite build 通过。
  • docs/r3/web-lint-HEL-834.txt:0 个错误,1 个警告,就是原有的 ChatPanel ref 警告。
  • docs/r3/web-test-HEL-834.txt:vitest 42 项通过(原 37 项加新增 5 项)。
  • docs/r3/browser-HEL-834.txt:headless Edge 对本地 mock 跑 23/23 项检查全部通过。覆盖:首页 30 条、坏行被丢弃、next_before 翻页到 32 条、详情字段、messageIds 对应的聊天和说话人、已加载与未加载日子的关联、按 id 打开更早的日子、用户自己的话标为"你"、"在交谈里看这段"精确高亮、日子详情反查回忆、重新打开时重读并出现新回忆、隐藏旧链接显示中性提示、可见回忆的深链、空/失败/未接通三种状态互不混淆、失败后重试、首页说法两种情况、真实文字聊天收发正常、演示路径零 /api 请求且零外部请求。
  • 截图(随交付评论附上,未入仓库):月光和雾光两套主题,各有电脑 1440×900 和手机 390×844(DPR2,触控模拟)的列表与详情;另有月光主题的电脑和手机空/失败/未接通状态、雾光主题的电脑空/失败/未接通状态、隐藏链接和演示入口。手机图是等效视口,没有在真机或 Safari 上测试。
  • 真实模型调用 0 次。没有部署,没有合并,没有动 8300/8310/8320/8340 等现网端口和真实档案。

未做和未验证(交总工 HEL-835 补充)

  • 没有推独立分支、没有开 PR、没有跑 check_requirements.py 双目标检查:本机没有 git/python。请总工入库到新分支,开 PR 指向 agent/agent/de8874a3803b 后补跑:--base-ref origin/main 和 --base-ref origin/agent/agent/de8874a3803b,两次都加 --handoff docs/r3/handoff-HEL-834.json。
  • 只用 mock 测试过前端;没有与真实 R3 后台(ControlledLLM 隔离库)做端到端联调。原有的 Python 浏览器检查(web/tests/*_browser_check.py)没有运行。
  • 真实模型的压缩质量、隔天能否取回、服务器部署、手机真机和 Safari 都没有验收。用户还没有体验过本页。
  • HEL-831 的三天观察,以及 R4–R7、真实视频口型,仍由主卡 HEL-797 追踪。阶段完成不等于产品完成。