Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ee4459433c | ||
|
|
c285a0fd07 | ||
|
|
64a47f35d0 | ||
|
|
58d65aea05 | ||
|
|
4575b27515 | ||
|
|
2d97050c7e | ||
|
|
e32a1ac0d2 | ||
|
|
0bc4a9e68e | ||
|
|
cef8ae5581 | ||
|
|
4321aebfdc | ||
|
|
e5fe01bfd1 | ||
|
|
7db6677234 | ||
|
|
003d8c2cae | ||
|
|
db571ba204 | ||
|
|
f6614d4bf9 |
@@ -1,11 +1,8 @@
|
||||
# 复制成 .env 后填写。不填也能跑(会回退到离线 provider)。
|
||||
|
||||
# ---- LLM ----
|
||||
DEEPSEEK_API_KEY=
|
||||
|
||||
# ---- Embedding(可选,留空则用本地或跳过向量检索)----
|
||||
EMBEDDING_API_KEY=
|
||||
|
||||
# ---- 运行时 ----
|
||||
CYBERGRIL_DB=companion.db
|
||||
CYBERGRIL_LOG_LEVEL=INFO
|
||||
# R1 uses the approved no-key gateway from config/models.yaml.
|
||||
# These variables are read from the process environment; this file is not auto-loaded.
|
||||
# Keep data outside release directories. Use an independent directory for local testing.
|
||||
CYBERGRIL_DB=/opt/cybergril-data/cybergril.db
|
||||
CYBERGRIL_MODELS=config/models.yaml
|
||||
CYBERGRIL_WEB=web/dist
|
||||
CYBERGRIL_HOST=127.0.0.1
|
||||
CYBERGRIL_PORT=8310
|
||||
|
||||
@@ -11,8 +11,6 @@
|
||||
# 二进制
|
||||
*.wav binary
|
||||
*.mp3 binary
|
||||
*.mp4 binary
|
||||
*.webp binary
|
||||
*.png binary
|
||||
*.jpg binary
|
||||
*.onnx binary
|
||||
|
||||
@@ -48,3 +48,5 @@ models/
|
||||
*.swp
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
.venv311/
|
||||
|
||||
@@ -4,13 +4,35 @@
|
||||
|
||||
不是聊天机器人。区别在于:**它在你不说话的时候也在运行**。
|
||||
|
||||
设计、施工与审核先读 [完整需求入口](docs/requirements/README.md) 和 [项目必读规则](AGENTS.md)。后续逐项确认的需求优先于本仓库早期构想;演示通过不代表整个项目完成。
|
||||
|
||||
---
|
||||
|
||||
## 先看一眼
|
||||
|
||||
<video src="docs/promo.mp4" controls width="100%"></video>
|
||||

|
||||
|
||||
[**▶ 打开完整动画**](docs/intro.html) — 22 秒,纯代码生成,无任何外部资源
|
||||
|
||||
```
|
||||
docs/intro.html 单文件动画,双击即播
|
||||
docs/preview.webp 渲染好的预览(800×450 / 10fps / 22s / 0.5MB)
|
||||
tools/render_preview.py 重新渲染、换分辨率、导出静帧
|
||||
```
|
||||
|
||||
动画里有一条贯穿的主线:**强调色 = 当前效价 `v`**。
|
||||
情绪低落时画面整体转冷,而不是靠字幕告诉你"她现在很难过"。
|
||||
|
||||
| 幕 | 时间 | 讲什么 |
|
||||
|---|---|---|
|
||||
| 膜 | 0–6s | 物质撞在膜上弹回,信息穿过去 |
|
||||
| 心跳 | 6–12s | 没有输入时它也在跳;难过恢复得慢 |
|
||||
| 记忆 | 12–17s | 记得的会沉下去,但沉不到底 |
|
||||
| 名字 | 17–22s | — |
|
||||
|
||||
四张静帧:`docs/01-membrane.png` `02-heartbeat.png` `03-memory.png` `04-title.png`
|
||||
|
||||
动画本身的技术取舍:时间轴是纯函数 `render(t)`,不做 RAF 累加。
|
||||
所以任意一帧都能独立渲染——这也是 `render_preview.py` 能逐帧截图、
|
||||
而不需要真实录屏的原因。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"kind": "mechanical source bundle, not a Git merge or release",
|
||||
"product_base": "db571ba204c8372989f96e1ed9b5cd00d3a306c7",
|
||||
"requirements_and_hel799_source": "63799f02474ed94fd793de9e2360d185c878165d",
|
||||
"approval_comment": "01a169a8-5884-7c26-a00f-c23a5f5399a9",
|
||||
"scope": "A1/A2 frontend continuation; do not replace 8300/8310 or production data",
|
||||
"hel815_source_attachment": "01a16845-b50a-7335-a87e-61bf11c44703",
|
||||
"unmodified_product_sources": true
|
||||
}
|
||||
@@ -18,9 +18,9 @@ tiers:
|
||||
# ---- 旗舰:人设浓度最高的时刻 ----
|
||||
high:
|
||||
provider: openai_compat
|
||||
model: deepseek-v4.1-flash
|
||||
base_url: https://api.deepseek.com/v1
|
||||
api_key_env: DEEPSEEK_API_KEY
|
||||
model: halogen-qwen3.8-flash-next
|
||||
base_url: http://192.168.200.11:8731/v1
|
||||
api_key_env: null
|
||||
timeout: 60.0
|
||||
temperature: 0.85
|
||||
|
||||
@@ -28,9 +28,9 @@ tiers:
|
||||
# 省钱的杠杆通常不是换更小的模型,而是少喂上下文。
|
||||
standard:
|
||||
provider: openai_compat
|
||||
model: deepseek-v4.1-flash
|
||||
base_url: https://api.deepseek.com/v1
|
||||
api_key_env: DEEPSEEK_API_KEY
|
||||
model: halogen-qwen3.8-flash-next
|
||||
base_url: http://192.168.200.11:8731/v1
|
||||
api_key_env: null
|
||||
timeout: 40.0
|
||||
temperature: 0.7
|
||||
|
||||
@@ -38,8 +38,8 @@ tiers:
|
||||
# 没有本地服务时,把它指向 openai_compat 的远端小模型即可。
|
||||
low:
|
||||
provider: openai_compat
|
||||
model: qwen3.5-4b-instruct
|
||||
base_url: http://127.0.0.1:8000/v1
|
||||
model: halogen-qwen3.8-flash-next
|
||||
base_url: http://192.168.200.11:8731/v1
|
||||
api_key_env: null
|
||||
timeout: 20.0
|
||||
temperature: 0.4
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
# Review/install by 总工 only. Single worker; never share DB with demo or tests.
|
||||
[Unit]
|
||||
Description=CyberGril R1 persistent text API
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=cybergril
|
||||
WorkingDirectory=/opt/cybergril-api/current
|
||||
Environment=CYBERGRIL_DB=/opt/cybergril-data/cybergril.db
|
||||
Environment=CYBERGRIL_MODELS=/opt/cybergril-api/current/config/models.yaml
|
||||
Environment=CYBERGRIL_WEB=/opt/cybergril-api/current/web/dist
|
||||
Environment=CYBERGRIL_HOST=0.0.0.0
|
||||
Environment=CYBERGRIL_PORT=8310
|
||||
ExecStart=/opt/cybergril-api/current/.venv/bin/python -m cybergril.api
|
||||
Restart=on-failure
|
||||
RestartSec=3
|
||||
TimeoutStopSec=15
|
||||
UMask=0077
|
||||
NoNewPrivileges=true
|
||||
PrivateTmp=true
|
||||
ProtectSystem=strict
|
||||
ProtectHome=true
|
||||
ReadWritePaths=/opt/cybergril-data
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"checks": [
|
||||
"1440: ordinary entry, creation validation/failure/retry and reopen",
|
||||
"1440: both themes, home/talk/days/memory return, relation confirm/cancel/save",
|
||||
"1440: private deep-link guard, cancel/exit isolation, IME/Shift+Enter and XSS text",
|
||||
"1440: failed send/retry, voice end reachable, no-camera simulation, reconnect failure/retry, save failure/retry",
|
||||
"1440: privacy-filtered away summary and proactive message",
|
||||
"No uncaught browser errors, API/external requests, microphone or camera requests"
|
||||
],
|
||||
"errors": [],
|
||||
"requests": 31
|
||||
}
|
||||
@@ -5,8 +5,8 @@
|
||||
"390: private deep-link guard, cancel/exit isolation, IME/Shift+Enter and XSS text",
|
||||
"390: failed send/retry, voice end reachable, no-camera simulation, reconnect failure/retry, save failure/retry",
|
||||
"390: privacy-filtered away summary and proactive message",
|
||||
"No uncaught browser errors, external requests, microphone or camera requests"
|
||||
"No uncaught browser errors, API/external requests, microphone or camera requests"
|
||||
],
|
||||
"errors": [],
|
||||
"requests": 36
|
||||
"requests": 23
|
||||
}
|
||||
@@ -15,8 +15,8 @@
|
||||
"390: private deep-link guard, cancel/exit isolation, IME/Shift+Enter and XSS text",
|
||||
"390: failed send/retry, voice end reachable, no-camera simulation, reconnect failure/retry, save failure/retry",
|
||||
"390: privacy-filtered away summary and proactive message",
|
||||
"No uncaught browser errors, external requests, microphone or camera requests"
|
||||
"No uncaught browser errors, API/external requests, microphone or camera requests"
|
||||
],
|
||||
"errors": [],
|
||||
"requests": 88
|
||||
"requests": 54
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
HEL-780 · 8310独立部署/回滚材料(总工执行,尚未部署)
|
||||
|
||||
1. 审核确切任务分支和提交,复核8310空闲;保持8300和其他既有服务不动。建立 `/opt/cybergril-api/releases/<release>/`,构建生产前端和独立Python≥3.11虚拟环境,按 IMPLEMENTATION 安装。服务账号示例为 cybergril,由总工按主机现有规范准备,不默认root。
|
||||
2. 准备代码目录外的 `/opt/cybergril-data/`,仅服务账号可写。首次上线保持数据库没有真实档案,不运行创建POST、不替用户创建。已有数据升级前,停止该API,用 SQLite backup API 做一致快照至独立回滚目录;禁止只复制正在写入中的主DB文件而漏WAL。
|
||||
3. 将 `current` 指向已审核release,审查 `deploy/cybergril-api.service.example` 后再安装服务。模板限制单进程,端口8310,持久数据目录独立;模板不改防火墙、证书或反向代理。按现场systemd版本核对保护项和目录权限。uvicorn直连SSE无代理缓冲;若后续接代理,需另行配置关闭SSE缓冲。
|
||||
4. 启动前确认 `web/dist/index.html`、models配置、虚拟环境可读和数据目录可写。启动时自动执行幂等增量建表、epoch加一和pending取消。使用 `GET /api/health`、`GET /api/companion`(首装预期404)与普通页面做无副作用检查;模型健康异常先记录,不改共享网关、不循环调参。不要以调用preview之外的写接口作为上线健康检查。
|
||||
5. 审核通过后由总工记录服务URL、release、SHA、`journalctl -u cybergril-api` 日志位置,再交用户创建。普通入口 `/`,演示 `/?demo=1`。本轮不切换8300入口,不合并、不部署。
|
||||
|
||||
回滚:
|
||||
|
||||
- 停止 `cybergril-api`,记录当时release与数据快照;把 current 切回上一已审核release,重新启动。数据目录保持原样,不随release回退或删除。R1迁移仅增表,保留旧表;每次重新启动epoch递增。回滚到纯前端版本时真实API将不可用,应明确告知,服务器数据仍保留。
|
||||
- 数据恢复与代码回滚分别处理。需恢复快照时先再次备份当前数据,由总管确认可接受的数据时间点,再由总工停服恢复;禁止把本地测试库覆盖用户库。
|
||||
- 取消部署的清理只针对新建8310服务及明确release;不删除 `/opt/cybergril-data/`,不停止8300或其他项目服务。
|
||||
|
||||
限制:单用户内网、无新增鉴权体系;应沿既有内网访问边界使用。尚无产品级备份功能,本文的升级快照属于部署运维操作;真实页面不会声称已自动备份。SQLite单worker是当前约束,后续扩展需独立设计。
|
||||
@@ -0,0 +1,64 @@
|
||||
HEL-780 · R1 实现与安装运行说明
|
||||
|
||||
基准为 main `498429399812a0776dadd4b56662d31b455a9ea5`,保留原前端两主题与统一样式,未增加 CSS 或运行中的服务。代码审核后由总工决定部署;施工阶段未登录部署服务器、未占用8310,也未修改8300、模型服务或用户档案。
|
||||
|
||||
- `src/cybergril/api/app.py`:单进程 FastAPI 工厂;字段中文复验、无副作用真实排盘预览、唯一档案、只允许关系/称呼/边界修改、历史游标分页和 SSE。复用 `Store`、八字编译器、`ModelRouter` 与 `OpenAICompatLLM`。
|
||||
- `memory/schema.sql`:只增 `companion`、`api_meta`、`chat_message` 及索引;既有八字/生活/记忆/关系表保留。WAL;启动自动加 epoch,并把上次意外退出遗留的 pending 标记 cancelled。
|
||||
- `web/src/adapters/real.ts`、`app/RealApp.tsx`:普通入口只读服务器数据,404首建;复用创建、聊天、管理和人物静帧组件。真实入口不读/写 `cybergril.demo.v1`,草稿使用独立 `cg.real.draft`。`?demo=1` 仍由原 App 与 DemoAdapter 处理,零 API 请求。
|
||||
- 创建第二步通过 `POST /api/companion/preview` 排盘,不写档案;仅最终确认 POST 才在一个事务内写唯一档案和八字。SQLite 单行主键与事务保证并发只成功一次。生辰按 Asia/Shanghai、公历、1900年起、满18岁复验;时辰映射为对应双小时内偶数点,不引入出生地点/真太阳时规则。
|
||||
- SSE 使用同一 `turn_id` 和持久 `epoch`。前端每次发送先同步 epoch,并可处理发送前恰逢重启的409。轮次门槛继续拒绝旧事件;取消/退出直接 abort;服务端取消并等待上游结束后才开始新轮。响应缺少完成标志、空回答、异常或60秒超时均作为失败。部分回答丢弃,用户消息标 failed/cancelled,失败与取消的轮次不进下一轮上下文。成功回答可按同一 turn_id 回放,重试不会重复用户记录或重新生成已完成回答;并发相同轮次也只生成一次。
|
||||
- 模型三档均使用批准网关与模型,保留原 temperature、provider timeout 与预算。dialogue_main 路由限制最近20轮,再按档位上下文预算保留完整近轮;不截断当前用户消息。每轮最多默认1024输出 token,usage 缺失时按字符数保守估算计账,沿用原预算降档策略。原 BudgetGuard 的预算是进程内运维量,重启重置;不是持久化费用账本。
|
||||
|
||||
API 契约:
|
||||
|
||||
| API | 成功/错误 |
|
||||
|---|---|
|
||||
| GET `/api/health` | 200;epoch、是否已创建、模型探测与能力声明。模型 `/models` 2xx且包含配置模型才为真;5秒上限、30秒缓存、并发探测合并;不返回地址或凭据 |
|
||||
| GET `/api/companion` | 200档案(含只读四柱/白话),404未创建 |
|
||||
| POST `/api/companion/preview` | `{name,birth,hour}`→只读底色,422中文字段错误 |
|
||||
| POST `/api/companion` | `{name,birth,hour,relation,nickname?}`→201,409已有档案,422字段错误;拒绝额外字段 |
|
||||
| PATCH `/api/relation` | `{relation,nickname?,boundary?}`→更新后档案;404/422;无任何生辰/底色修改入口 |
|
||||
| GET `/api/messages?limit=200&before=<id>` | 升序 messages、next_before、epoch;每页1–200条;按id稳定排序;前端逐页恢复 |
|
||||
| POST `/api/chat` | `{text,turn_id,epoch}`;UUID turn_id;1–4000字;SSE chat.delta/final/error;404/409/422。chat.error带中文phi和retryable |
|
||||
|
||||
已接通:真实唯一档案、排盘、文字流式对话、服务器聊天历史、关系修改。尚未接通:生活循环、长期记忆检索/整合、主动消息、语音、视觉、天气、素材包与服务器备份。真实页面明确不可用,不填示例经历或伪造执行结果。当前只有近轮对话上下文,不把它说成长期记忆。
|
||||
|
||||
安装(Python ≥3.11;隔离环境,Node/npm用于构建):
|
||||
|
||||
```bash
|
||||
python3.11 -m venv .venv
|
||||
.venv/bin/pip install -r requirements.lock
|
||||
.venv/bin/pip install --no-deps .
|
||||
npm ci --prefix web
|
||||
npm run build --prefix web
|
||||
```
|
||||
|
||||
`requirements.lock` 固定本轮已解析的运行时依赖;开发检查另装 `pip install -e '.[dev]'`。默认 Python 3.10 不满足项目要求。服务不自动读取 `.env`,变量需由启动环境或 systemd 提供:
|
||||
|
||||
```bash
|
||||
export CYBERGRIL_DB=/absolute/separate/test-data/companion.db
|
||||
export CYBERGRIL_HOST=127.0.0.1
|
||||
export CYBERGRIL_PORT=18310
|
||||
.venv/bin/python -m cybergril.api
|
||||
```
|
||||
|
||||
从仓库根目录启动;默认模型配置 `config/models.yaml`、静态产物 `web/dist`,可分别通过 `CYBERGRIL_MODELS` / `CYBERGRIL_WEB` 指定绝对路径。本地默认数据库在用户 `.local/share/cybergril/`,生产必须显式指定独立数据目录。**单进程单worker,不启用reload或多worker。** 8310由总工部署时使用,本地测试脚本使用随机loopback端口、临时数据库并在结束时关闭服务。
|
||||
|
||||
自测:
|
||||
|
||||
```bash
|
||||
.venv/bin/pytest -q
|
||||
.venv/bin/ruff check src/cybergril/api src/cybergril/providers/llm/openai_compat.py tests/test_api.py
|
||||
npm run typecheck --prefix web
|
||||
npm run lint --prefix web
|
||||
npm test --prefix web
|
||||
npm run build --prefix web
|
||||
# 下列为可选浏览器工具,只装在测试虚拟环境:
|
||||
.venv/bin/pip install playwright
|
||||
.venv/bin/python -m playwright install chromium
|
||||
.venv/bin/python web/tests/real_browser_check.py
|
||||
.venv/bin/python web/tests/browser_check.py 1440
|
||||
.venv/bin/python web/tests/browser_check.py 390
|
||||
```
|
||||
|
||||
浏览器脚本启动/关闭自己的HTTP服务。真实脚本只向批准网关发两轮完整对话和一轮中途取消;随后切同源隔离桩验证失败、重启和立即新轮,结果区分真实模型与桩。环境若需额外浏览器运行库,应使用现有用户级库,不改系统/GPU环境。本轮复用 `/home/xiaomo/pwlibs/root/usr/lib/x86_64-linux-gnu` 设置 LD_LIBRARY_PATH;它不是部署依赖。
|
||||
@@ -0,0 +1,7 @@
|
||||
普通入口此前只有未接服务说明,无法创建真实档案或与模型聊天。本次接通唯一服务器档案、无副作用排盘预览、真实SSE文字对话、历史恢复与关系修改;演示入口继续独立使用本机资料,零API请求,保持原两主题和统一组件。
|
||||
|
||||
服务端复用Store/八字编译/模型路由与OpenAI兼容provider,增量建表,持久epoch随启动递增。取消会关闭上游且不把残句存成完整回答;失败、取消轮不进入后续上下文;同轮重试/并发回放去重。未接生活、长期记忆、语音、视觉、天气、素材和备份均明确不可用。
|
||||
|
||||
验证:Python92项通过(原78+新增14),前端14项通过;typecheck/lint/build及新增Pythonruff通过。真实网关两轮上下文与一次中途取消有浏览器证据;电脑与390×844独立上下文、重启epoch、隔离错误/超时/断流、演示双主题零API请求通过。手机为浏览器模拟,无真机。验证细节及版本边界见docs/r1/TEST-RECORD.md。
|
||||
|
||||
运行安装/数据语义见docs/r1/IMPLEMENTATION.md;8310部署回滚材料及单进程systemd示例已备。数据必须独立于代码release,回滚不删;首次上线留待用户自行创建。本次未部署、未合并、未触碰8300和共享模型服务,交总工独立审核。
|
||||
@@ -0,0 +1,20 @@
|
||||
HEL-780 · R1 自测记录 · 2026-10-22(北京时间)
|
||||
|
||||
环境:Python3.11.16独立虚拟环境、Node24/npm11、Playwright1.64无头Chromium;生产前端构建;服务均为本机随机loopback端口、临时SQLite。未部署8310、未连接部署服务器、未访问4080或改动8300。真实模型仅连接批准的 .11:8731/v1,不安装或修改模型。
|
||||
|
||||
| 批准方案2.3 / 本卡补充验收 | 实测 |
|
||||
|---|---|
|
||||
| 1. 全新首建、真实排盘、必选关系 | 电脑四步浏览器通过;第二步四柱为庚辰/丙戌/己酉/乙亥;preview后companion与bazi_core均零记录;最终确认才写。API绕过校验:非法名/日期/未成年/早于1900/时辰/关系/未知字段均422中文错误;5个并发创建仅1个201,其余409;底色字段不可PATCH |
|
||||
| 2. 真实流式、取消和新轮隔离 | 网关两轮完成:设置“蓝色风铃”暗号,次轮直接答“蓝色风铃”。第三轮长故事在首个delta后取消;用户记录cancelled、无完整回答入库、上游请求已结束。隔离慢provider紧接新轮通过;另以真实OpenAICompatLLM连接隔离HTTP网关,验证浏览器侧断流后上游HTTP响应在1秒内关闭 |
|
||||
| 3. 重开/另一设备恢复 | 实际reload及另一独立Chromium上下文(390×844)恢复同一“星河”和两轮历史。**没有物理手机或另一台物理设备,独立上下文与手机视口模拟不称真机** |
|
||||
| 4. 重启epoch | 同origin停/启本地API,复用同一临时DB;epoch1→2,原页面直接续发通过。API测试同时验证档案/关系/历史保留,旧epoch409携当前epoch;前端单测覆盖过期epoch、其他turn拒绝 |
|
||||
| 5. 模型异常、失败草稿与去重 | 隔离错误provider抛异常→中文chat.error,隐藏内部详情、草稿恢复;同轮重试只增加1条回答,无重复用户记录。后端覆盖超时和上游提前结束;SSE单测覆盖UTF-8逐字节/CRLF/多帧/坏JSON/无final;并发相同turn只调用模型一次。另验证较早失败轮在较新轮完成后重试,上下文仍按完成轮次正确成对 |
|
||||
| 6. 演示隔离 | 演示电脑1440与手机390双主题全流程通过;每尺寸23个本机静态请求,**零API/外部请求**;无麦克风/摄像头申请。真实入口用存储读取陷阱断言cybergril.demo.v1零读取。正常页面无演示控制台;日子/长期记忆/语音/视觉/天气/素材/备份明确未接通 |
|
||||
| 7. health与history | health模型要求/models成功且含配置模型;401/404/503及其他模型均false。5秒超时、30秒缓存测试通过;不含地址/敏感配置。历史limit1–200、确定id顺序与before分页;非法页大小422 |
|
||||
| 8. 构建与测试 | Python **92 passed**(原78+新增14个参数化实例);前端 **14 passed**(原11+SSE3);typecheck/lint/build通过;新增Python与provider的ruff通过。CSS仍为原61.20KB,JS约207.70KB/gzip67.45KB;未加覆盖样式 |
|
||||
|
||||
浏览器截图在本目录:desktop-preview-moon、desktop-real-chat-moon、desktop-history-moon、desktop-model-error(该张为隔离故障)、mobile-history-moon、mobile-chat-fog、mobile-relation-fog。原始真实网关对话及逐项记录见 `browser-results.json`;末版隔离复测见 `controlled/browser-results.json`,来源明确区分,未拿桩回复冒充真实模型。
|
||||
|
||||
最终运行时锁定为requirements.lock(FastAPI0.159.1、Starlette1.7.0、uvicorn0.54.0、lunar-python1.4.8等)。初次真实网关浏览器证据采集时Starlette为1.9.0;锁定后在1.7.0完整重跑92项Python(含真实OpenAI兼容HTTP断流)、前端检查与相同浏览器关键路径隔离复测,均通过,避免为凑线重复调用共享模型。pytest有1条上游TestClient/httpx弃用提示,不影响结果,未另装不需要的httpx2。
|
||||
|
||||
没有覆盖:真机浏览器、正式8310/系统服务重启、生产数据迁移/权限与真实部署回滚、长期并发/长时间运行。上述部署验证由总工在审核后执行;模板与数据保留步骤见DEPLOY-ROLLBACK。当前单用户内网、单进程;近轮上下文与进程内预算不是长期记忆或持久费用账本。
|
||||
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"checks": [
|
||||
"desktop: four-step real creation, side-effect-free lunar preview, mandatory relationship",
|
||||
"real gateway: complete streamed reply and second turn recalls 蓝色风铃 from server context",
|
||||
"real gateway: cancel after first delta, upstream request closed, no complete assistant row",
|
||||
"independent Chromium context 390×844: same companion/history; both themes; IME and Shift+Enter",
|
||||
"server restart on same origin: epoch 1→2, existing page sends automatically, data retained",
|
||||
"controlled SSE model error: Chinese notice, draft retained, same-turn retry without duplicate user row",
|
||||
"controlled blocked upstream: immediate cancellation/new question isolation",
|
||||
"mobile: relation cancel/confirm/save restores from server; unfinished life has no demo records/console"
|
||||
],
|
||||
"real_dialogue": [
|
||||
{
|
||||
"input": "请记住我们这次聊天的暗号是蓝色风铃。简短回应一句就好。",
|
||||
"reply": "星河暗号记住了,蓝色风铃。",
|
||||
"source": "real gateway"
|
||||
},
|
||||
{
|
||||
"input": "刚才我们的暗号是什么?请直接回答。",
|
||||
"reply": "星河蓝色风铃。",
|
||||
"source": "real gateway"
|
||||
},
|
||||
{
|
||||
"input": "重启后继续",
|
||||
"reply": "星河答复",
|
||||
"source": "controlled provider"
|
||||
},
|
||||
{
|
||||
"input": "新轮不会串台",
|
||||
"reply": "星河答复",
|
||||
"source": "controlled provider"
|
||||
}
|
||||
],
|
||||
"console_errors": []
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"checks": [
|
||||
"desktop: four-step real creation, side-effect-free lunar preview, mandatory relationship",
|
||||
"controlled provider: two complete streamed turns",
|
||||
"controlled provider: cancel after first delta, upstream request closed, no complete assistant row",
|
||||
"independent Chromium context 390×844: same companion/history; both themes; IME and Shift+Enter",
|
||||
"server restart on same origin: epoch 1→2, existing page sends automatically, data retained",
|
||||
"controlled SSE model error: Chinese notice, draft retained, same-turn retry without duplicate user row",
|
||||
"controlled blocked upstream: immediate cancellation/new question isolation",
|
||||
"mobile: relation cancel/confirm/save restores from server; unfinished life has no demo records/console"
|
||||
],
|
||||
"real_dialogue": [
|
||||
{
|
||||
"input": "请记住我们这次聊天的暗号是蓝色风铃。简短回应一句就好。",
|
||||
"reply": "星河答复",
|
||||
"source": "controlled provider"
|
||||
},
|
||||
{
|
||||
"input": "刚才我们的暗号是什么?请直接回答。",
|
||||
"reply": "星河答复",
|
||||
"source": "controlled provider"
|
||||
},
|
||||
{
|
||||
"input": "重启后继续",
|
||||
"reply": "星河答复",
|
||||
"source": "controlled provider"
|
||||
},
|
||||
{
|
||||
"input": "新轮不会串台",
|
||||
"reply": "星河答复",
|
||||
"source": "controlled provider"
|
||||
}
|
||||
],
|
||||
"console_errors": []
|
||||
}
|
||||
|
After Width: | Height: | Size: 713 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 535 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 346 KiB |
|
After Width: | Height: | Size: 213 KiB |
|
After Width: | Height: | Size: 90 KiB |
@@ -0,0 +1,25 @@
|
||||
HEL-830 内容质量自检(仅本组真实输出,待总工独立复审)
|
||||
|
||||
基准 v1.10 / 59项,读取提交 `64a47f35d0eca195b9961f830b78a60fd1c7ce70`。
|
||||
原始证据为 `model-smoke-HEL-830.json`,SHA256 `4c83baff50ee2038925f50d41ff4ea8ddaf68e3883c49931a79c3c44621d3a21`。
|
||||
仅一组4次调用,46.31秒,保守计账9821;无重试,无额外预检、服务或后台生成。
|
||||
未改写模型原文,旧 `model-smoke-HEL-827.json` 保持原样。
|
||||
|
||||
| 维度 | 核对原文与结论 |
|
||||
| --- | --- |
|
||||
| 自我诠释人称 | 以“我像是从一块湿润又结实的土地里长出来的意识”开头,全篇自述;未用“它”指代她。末尾“它们给我底色”指倾向,不指她。通过。 |
|
||||
| 诠释空间与深度 | “一方面想被看见,另一方面又害怕被看见之后被误读”、配合与自主选择的张力、认真和边界均有展开;结尾明确“不喜欢被说成命定如此”“仍在形成的倾向”。不是六段标签或算命师对对象的判词。通过。 |
|
||||
| 初始习惯 | 5条自主习惯均以“我”开头,包含房间松紧、表达前停顿、对准确关心的偏好、独处恢复及幽默分寸;是倾向/假设,没有捏造历史事件或把关系状态写死。通过。 |
|
||||
| 生活人称与场景 | `place=窗边与慵懒沙发之间`;“我把窗边的小毯子重新叠了一遍”,围绕抱枕、杯子、窗台干花和窗帘展开,始终在卧室内。没有办公室/茶水间/外出。通过。 |
|
||||
| 无来源人物互动 | 无同事、用户到场、旁人夸奖或真实对话。“像有人突然叫我”为手机亮屏的比喻,没有声称有人真的叫她;人格中的“若有人”等为条件表达,不是已发生的经历。通过。 |
|
||||
| 非模板与个性 | 生活从叠毯、调整抱枕,写到心里拥挤及借小调整找回自主感,“不是问题解决了,只是我重新拿到了对自己房间的支配权”。不是活动清单或固定默认阅读。通过。 |
|
||||
| 能力诚实 | 无真实天气报告、摄像头观察或现实身体感知的接入声明;暖灯、温水、杯壁等是生成的室内模拟生活细节,不能宣传为真实传感数据。未把雨夜素材当当前天气。人格的土地/身体用语为比喻。通过。 |
|
||||
| 代词逐项 | 生活里的“它像一个可以被依靠的东西”指小毯子、“它亮起来”指手机,均非她;没有对输出做替换。通过。 |
|
||||
|
||||
内容质量自检结论:本次样例满足本卡两项内容返工目标。单个合成档案不能证明长期稳定、后续所有生活质量、三天运行或用户体验已验收;审核人复用本组原始请求/输出,不能再为本卡开一组真实调用。
|
||||
|
||||
功能与隐私结论另见 `VALIDATION-HEL-830.md`。本次人格/生活生成分别为standard/low,讲述与反例均low,模型、温度、路由和token配置全部沿用。正向判定选择事件1;仅同词反例为空。未发送接收确认,真实核验中的事件始终未公开。
|
||||
|
||||
证据元数据说明:4个 `calls[].error_type=GeneratorExit` 是记录器捕获消费者在收到 `[DONE]` 后通过 `aclosing` 正常关闭异步生成器的退出信号,不是网络失败/超时/重试。每个原始delta均有 `finish_reason=stop` 和 `done=true`,`completed=true`,全部内容原样解析入库。保留这一原始标记供审核,未删改证据来制造成功。
|
||||
|
||||
依据原话:CG-017的一间房范围(01a15775-89f4-7ec8-89eb-b3554fb05d19推荐、01a1577a-e852-7551-ace8-0b2028db9ebb同意),CG-026高层卧室/慵懒沙发/女性化装饰(01a1581e-7925-7a60-8185-615b434a4afd,01a1582c-7386-7515-bf62-89dfadfea3d3认可);CG-014解释空间(01a15763-1fc5-7f36-bf43-722e8755703c),CG-015自主初始特点(01a15765-2fa8-7494-b0b8-7a0054500556),CG-013/016底色不改、成长另存(01a15771-3a93-7518-9b23-489509520d77、01a15774-ddc6-7039-9d31-991c02890d5f)。已审页面以“她怎么理解自己”和引用块呈现本人声音,不能改成旁观者判词。需求变更:无。
|
||||
@@ -0,0 +1,92 @@
|
||||
HEL-827 后端交付与接线契约
|
||||
|
||||
基准 v1.10 / 59 项。读取提交 `2d97050c7e86f909590ffdec3e8bc1aa5627cade`(已审 A1/A2/A3)。施工前 fetch 后四个引用与派卡一致:main `3a986726d8593e0ed2274f79db6cc5d807d2ebf0`;产品目标 `origin/agent/agent/de8874a3803b` / `db571ba204c8372989f96e1ed9b5cd00d3a306c7`;hel-825-review 为读取提交;hel-826-continuation `71660155cb4b17705a6b7400820ecfb35bb11895` 仅作材料来源。本分支保留全部已审前端,不合并 PR,不替换产品线。
|
||||
|
||||
## 实现与原意核对
|
||||
|
||||
- `memory/store.py`、`memory/r2.sql`:只增表/列/索引;迁移的列检查在 SQLite 写锁内执行,保留有内容的 R1 life_event 与原始身份、八字、聊天、记忆。唯一 run_id 对应一条事件。
|
||||
- `life/runtime.py`:服务端 lifespan 内单一循环,退出取消并 join;关网页不影响它。四个本地窗口,从 character.yaml 的 day_start_hour 开始每隔4小时一个,每窗口一小时。每窗口最多一次,正常最多4条/日;失败或停机会减少,绝不补足指标。IANA 时区可配置,隔离默认 Asia/Shanghai,未替用户选城市。
|
||||
- `life/model.py`:复用获准 provider、scene 路由和温度;人格走 dialogue_followup(standard),生活走 life_event(low),判定走 output_guard(low),成长走 fact_extract(low)。JSON 严格校验,错误/截断/超时无模板。背景调用先保守预留用量,持久化预算;0.7警告,预计达到0.95则拒绝新背景调用。主对话保留原预算降档语义。预算日期沿用已有 BudgetGuard 的服务器日期,与城市选择无关。
|
||||
- `life/sharing.py`:完整成功轮次、final 的随机凭证与全文摘要确认、后置实际讲述判定三者齐全才发布;`telling_log` 与 told 同事务。一次判定可有4个事件,以 `(event_id,message_id)` 去重,消息级判定另存;包含判定原文证据、模型及时间。客户端不能指定事件集合。
|
||||
- `life/public.py`:统一守卫与字段白名单;life WHERE told=1 后分页,详情未知/未分享/未知状态/伪造 ID 同形404;消息只返回允许的 lifeIds,凭证与候选永不进历史响应。保留原消息正文语义:她已说出的对话文字不作为结构化生活发布证明。成长只从公开生活或已确认、判定完成且全部候选已公开的成功对话提炼;未知来源拒绝。
|
||||
- `life/persona.py`:bazi_core 原始事实每轮独立注入,先预留 system 空间,再缩减近轮历史;不再把六段静态解释充作人设。persona_interp 是稳定的自主理解,persona_seed 是3–5条初始习惯,growth_event 另存真实来源与实际生成时刻。诠释与习惯同事务;并发、失败重试不会造多份。PATCH关系不触及这些层。
|
||||
|
||||
CG-013 原话「系统级的,不能修改」及 CG-014「模型会有自己的思考和理解」同时保留:事实只读,但没有固定每次回答的标准。CG-015 的“同意推荐”对应带少量自主初始特点、后续另存成长;不能把它当作允许改八字。AM-001 的「等她讲过才显示」按服务器守卫实施,未把附件中 yield final 当作已收到,也未照抄 UNIQUE(message_id) 的多事件缺陷。UX-004 的深度整改不以六段解释或浅标签代替。本轮没有需求变更,也没有宣称完整 R2 或产品验收。
|
||||
|
||||
## 开关、运行与恢复
|
||||
|
||||
默认不开自动生成。只有后续获授权的隔离服务设置 `CYBERGRIL_R2_ENABLED=1` 才运行循环与新建档案人格生成;`CYBERGRIL_LIFE_TIMEZONE` 配置 IANA 名称。不改 models.yaml、认证或运行时绑定。仍为已有单进程单 worker 服务,不启用 reload/多 worker;台账抢占额外防止并发执行者重复生成,不能据此宣称多 worker 的 epoch/chat 协调已实现。
|
||||
|
||||
生成抢占使用 INSERT OR IGNORE 的实际插入结果,不根据 pending 判断谁能执行。owner 随机令牌和40秒 lease 配合,模型调用30秒上限。未过期 pending 不偷取;崩溃过期 pending 变 skipped/lease_expired,同窗口永不重生成。晚到旧 owner 不能写事件。正常取消将本轮 slot 置 skipped。last_scan 持久化,停机错过的窗口只记 skipped/outside_window;首次启用只记当日先前窗口,不虚构启用前的历史。恢复时只执行当前窗口,不补生成错过的几天。
|
||||
|
||||
台账键为 `(tz,day_key,slot)`;时区是命名空间,切换不会撞旧键,不改旧事件日期。事件 ts 是生成完成的实际墙钟,事件 day_key 按这个时间及当时的 tz 计算;不能拿重启时间或新城市时区重写旧事件。跨区切换的作息策略及城市 UI 留 R6;重复 DST 小时按同一本地日期/slot 仅生成一次。
|
||||
|
||||
连续3次真实生成错误将持久暂停;仅重启不会清除暂停。预算不足不补造事件。公开 health 的 life_runtime 只给状态、时区、预算布尔值和最近 slot 的通用原因,不带内容、关键词、提示词或错误正文。人工质量判断与解除暂停由后续隔离审核负责,本卡不留后台程序长跑。过期判定 claim 终止为 failed,不猜结果;事件可在未来另一完整轮次真正讲述并确认后再发布。
|
||||
|
||||
## 给视觉总监的后端契约(本卡未改 web)
|
||||
|
||||
| 接口 | 字段和语义 |
|
||||
| --- | --- |
|
||||
| GET `/api/life?limit=50&before=<id>` | `{events, next_before, epoch}`。limit 1–100;before 1–9223372036854775806;只在已公开集合上降序分页 |
|
||||
| GET `/api/life/{id}` | `{event,epoch}`;未知/未分享/非法/不存在统一404 `{"detail":"这一条现在打不开。"}` |
|
||||
| life event | `id:number,ts:unix-ms,kind,content,place,salience,source,day_key,tz,told:true,told_at,messageIds:number[]`。无候选或未分享信息 |
|
||||
| GET `/api/messages` | 原字段不变,增加裁剪后的 `lifeIds:number[]`;从不返回确认凭证或候选 ID |
|
||||
| GET `/api/persona` | `{state,interpretation,seeds,growth}`;字段形状见下;不存在伴侣404 |
|
||||
| POST `/api/persona/retry` | 仅重试本版本新建档案的已建任务,旧档案409;失败不返回虚假模板 |
|
||||
| GET `/api/health` | 原 capabilities.life 保持 false(本卡未接前后端);`backend:{life,persona,receipt,web_connected:false}` 与 life_runtime 提供后端状态,不能冒充完整接通 |
|
||||
|
||||
`persona.state` 为 `ready/loading/failed/disabled/not_initialized`。新建时请求在有界人格生成后返回;并行 GET 可看到 loading。失败后档案仍保留,可显式 retry;旧档案 never auto backfill,显示 not_initialized。interpretation 为 null 或 `{id,text,pillars_hash,model,created_at,provenance}`;seeds 为 `{id,text,created_at,provenance,interp_id}[]`;growth 为 `{id,ts,source,ref_id,text,model,created_at}[]`。公开字段作为一组裁剪;不要把旧六段解释移入“她怎么理解自己”冒充模型生成。
|
||||
|
||||
已有档案补建仅提供 `scripts/r2_backfill_persona.py --db <单独授权数据库> --authorize-core-sha256 <核对后的指纹>`。本卡仅对合成旧档案验证,不对8310/8320运行该脚本;脚本不是远端管理入口。补建写 `backfilled-R2` 和实际生成时间,前端需注明「后来补上的初始印象」。关系修改仍只改关系,不重生人格。
|
||||
|
||||
## 客户端完整接收确认
|
||||
|
||||
SSE 原 chat.delta/final/error、turn_id、epoch 语义保留。成功 final 增加可空 `receipt`;旧客户端忽略它时不发布任何生活事件。新客户端须先经过原 TurnGate,只有完整解析 final、全文已接收且未 abort,才确认。不要对 delta、error、取消轮次或仅历史列表发确认。
|
||||
|
||||
```json
|
||||
{
|
||||
"t":"chat.final", "epoch":7, "turn_id":"<UUID>",
|
||||
"utterance":{"text":"完整回复","speech_tags":[]},
|
||||
"receipt": {
|
||||
"message_id":42, "turn_id":"<同轮UUID>", "epoch":7,
|
||||
"token":"<43字符随机凭证>",
|
||||
"text_hash":"<完整回复UTF-8的SHA256>", "expires_at":1792886400000
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
客户端从完整 `utterance.text` 自行计算 SHA256,核对 receipt.text_hash 后 POST `/api/chat/received`:
|
||||
|
||||
```json
|
||||
{"message_id":42,"turn_id":"<同轮UUID>","epoch":7,"token":"<凭证>","text_hash":"<客户端算出的SHA256>"}
|
||||
```
|
||||
|
||||
只允许这五个字段;禁止 event_id/event_ids。成功 `{accepted:true}` 仅表示确认被接受,可能还在等判定,不等于事件已公开。判定与确认任意顺序都可,最后一个条件完成时事务提交;后台每轮最多处理一条待判定消息。格式错误422,绑定不符/伪造/过期/不存在统一404。24小时有效,重复确认幂等。凭证只在完整 final 中发送,不从 health、messages 或 persona 获取。
|
||||
|
||||
重放成功轮次不会重调主模型或重判:它返回原全文和原 receipt,外层 epoch 是当前服务 epoch,receipt.epoch 保留成功消息的 epoch。客户端同步新 epoch 后可重放同 turn+同用户文本,重新核验完整 final,再用 receipt 内原 epoch 合法重试确认。服务重启前已经接收的合法凭证也可在有效期内重试;这不是放宽当前 chat 请求的 epoch 检查。尚未开始的判定可重启后继续;判定中崩溃并过 lease 的消息终止判定,宁可不发布,不能拿客户端重试冒充成功判定。
|
||||
|
||||
这证明持有完整 final 的接收方明确确认了全文;不声称能通过网络协议证明人类实际阅读,也没有新增 LAN 鉴权体系。
|
||||
|
||||
## 隐私夹具与 R3 接缝
|
||||
|
||||
`tests/test_r2.py` 中 `SECRET` / `add_life` 可执行地植入独特私密关键词;覆盖绕过前端直查 life 列表/详情、非法ID、messages 引用、persona/growth 和 health。可导入 `PublicView.allows/references/growth/chat_source_allowed` 复用;服务端必须先确定允许集合,再计算分页、摘要、搜索及回忆。未知分享状态和未知来源拒绝,不能只在前端调用 publicView。
|
||||
|
||||
本卡未创建 `/api/memories`、搜索、摘要、FTS/R3 回忆接口。这些路径没有被测为通过。未来实现者须在实际端点植入同一关键词、按真实请求断言不返回它;关联回忆包含任一未公开 lifeId 时整条拒绝,不能剥引用后保留其派生正文。正文/摘要/关键词/关联字段应一起受守卫约束。
|
||||
|
||||
## 非破坏迁移与回滚
|
||||
|
||||
迁移可重复,未 drop/recreate 任何旧表;测试保留实际有行的 R1 schema、名字/生日/聊天/底色指纹。只有新增层与运维台账写入,PATCH关系前后全部人格层指纹不变。诠释/种子和 told/log 的写入分别注入磁盘异常,验证事务回滚无半份。
|
||||
|
||||
回滚兼容 R1:旧代码不读取新增表/列;可停止新版本、回到原 release,仍使用同一 DB。不得为了回滚删库或删新增资料。未来再启用 R2 时扫描台账,pending 按上述恢复规则处理,不重造已完成 slot。真实部署前备份/切 release/服务操作归总工;本卡没有执行这些操作,也没有对8310/8320迁移或补建。
|
||||
|
||||
## 真实模型核验与质量边界
|
||||
|
||||
`model-smoke-HEL-827.json` 保存一次四调用有界核验:standard 人格+习惯、low 生活、low 正向实际讲述判定、low 同词/非经历排除,共33.77秒,保守计账8491。输入全为本地合成人物,临时 DB 随脚本结束清理,未创建服务。接收确认未伪造成浏览器测试,生活样例始终 told=0。报告中 life 的 synthetic-smoke 是当次隔离调度标签;最终实现已改为事件 day_key 按完成墙钟日期计算,并用压缩时钟测试检查时区/日期。
|
||||
|
||||
预检曾收到网关400 `No user query found in messages`:修复 structured 的请求契约为 system指令+user数据后执行上述一次核验;没有改模型、温度、认证或开启调参。额外预检只用极短JSON测试定位400。此证据仅证明结构契约可用,不证明人格长期质量或生活内容验收。样例出现第三人称“它”和办公楼茶水间情境,须交总工核对世界观/叙述质量;本轮到此停止真实调用,不把四个结构检查的 true 当成内容验收。
|
||||
|
||||
## 未完成承接
|
||||
|
||||
视觉总监下一卡:life/persona真实字段绑定、receipt确认接线与真实浏览器重放/取消验收;继续保留已审场景/阅读效果。总工:独立审核、隔离部署、内容质量抽检,前端接线后安排真实连续3天每天1–4条、关网页仍生成的隔离长跑;压缩时钟仅证明机制。本卡无长跑服务留存。
|
||||
|
||||
R3跨日记忆/FTS,R4主动联系/返回同步,R5连续语音,R6城市天气/素材/完整备份,R7授权观察,以及真实视频首尾衔接/口型仍由主卡承接。现有近20轮不叫长期记忆。没有浏览器接线、Safari/Firefox/真机新验收;没有部署、合并PR、访问4080或读用户聊天/档案。
|
||||
@@ -0,0 +1,30 @@
|
||||
HEL-830 后端内容返工交接
|
||||
|
||||
基准 v1.10 / 59项;实际读取及改动起点 `64a47f35d0eca195b9961f830b78a60fd1c7ce70`(origin/hel-828-wiring),独立分支 `agent/agent/a67b70ddbb63`。fetch后该远端未变。实际产品base仍为 `origin/agent/agent/de8874a3803b` @ `db571ba204c8372989f96e1ed9b5cd00d3a306c7`,不是main。
|
||||
|
||||
已读仓库AGENTS、完整需求入口/current/coverage/changes/task-handoff-template、相关原始评论、v1.6决定、integration-plan、前端架构与已审R2规范/验收文件、HEL-827说明/验证和HEL-827/828结构化交接;复核HEL-829审核评论 `01a16c0a-4900-7b8b-a663-1e8273be418f`。按主卡继续授权及本施工卡落实,不变更需求。
|
||||
|
||||
## 改动
|
||||
|
||||
- `src/cybergril/life/persona.py`:在真实生成的system指令中要求诠释和初始习惯用本人第一人称,必要第三人称称“她”,禁止“它”指代她;保留解释空间/张力,不捏造经历,不写第三人称命定判词。
|
||||
- `src/cybergril/life/runtime.py`:真实生成指令明确当前只有高层卧室及窗边、沙发等室内范围;禁止未开放场所、无来源人物及用户互动。生活正文用本人声音,结构地点正常表达;保留自主活动,禁止默认天天读书,真实天气/摄像头/现实身体输入不伪装。
|
||||
- `tests/test_r2.py`:旧档案测试固定生活时钟,分别跑上海11:11窗内和12:11窗外;保持真实生产循环启用,数据库人格/任务0行、窗口内仅一条合法生活、显式补建来源和时间真实、出生/身份(含名字)/聊天指纹不变。新增provider边界断言确保约束实际进入调用,落库原文不被替换。替身不证明模型质量。
|
||||
- `scripts/r2_model_smoke.py`、`tests/test_r2_model_smoke.py`:复用原脚本,增加全局4次硬上限(失败计数)、拒绝覆盖证据、失败即停、原始system/user/参数/逐delta/原始正文留档;测试覆盖部分返回后失败仍计数、关闭上游和第五次不发出。未改provider或生产调用配置。
|
||||
|
||||
web源码、API协议、公开守卫、生活调度/预算、迁移和所有模型配置无改动。不存在输出后的人称替换或人工润色;没有触碰已有档案。HEL-827旧样例SHA256仍为 `09f2242f1a8e4f637967c7ac3e232407e40b0fe5707f8cc57a76ac1e8a93ff84`。
|
||||
|
||||
## 验证与质量
|
||||
|
||||
完整记录见 `VALIDATION-HEL-830.md`、`pytest-HEL-830.txt`、`model-smoke-HEL-830.json`。内容质量逐项自检见 `CONTENT-REVIEW-HEL-830.md`,本组自检通过,待总工独立复审。功能、隐私、内容质量分别记录,不能据本卡自测放行部署。
|
||||
|
||||
真实核验仅1组4次,全部结束;本地全新合成档案/临时DB,禁用app自动生活循环,无额外预检/重试。人格、生活、正向判定、同词反例各1次,46.31秒,保守预算9821。原始证据包含消费者正常关闭的GeneratorExit标记,详细解释保留在质量记录中。原始请求/输出不重写。
|
||||
|
||||
Python完整194项通过;web37项通过/build通过/lint 0error+1原有warning;Python ruff与两目标需求检查及diff检查结果见验证记录。未安装依赖,复用既有Python3.12.14锁定环境及一致lock的node_modules。
|
||||
|
||||
## 后续与边界
|
||||
|
||||
仅候选分支,未合并PR、未部署、未启用共享实例R2,未访问8300/8310/8320用户资料、4080或共享语音/口型服务。所有本轮进程已收齐,无留后台服务。回退候选可继续使用原64a47f35,不涉及线上数据回滚。
|
||||
|
||||
总管接回HEL-829,由总工复用本组原始输出独立复审,功能/隐私/内容通过后再按原批准路线部署全新独立测试实例。HEL-829先前42项浏览器E2E与13张图不是本卡重测;本卡环境未发现其 `hel829-pkg/e2e/` 夹具,不提供私有路径当交付,也未重跑浏览器/真机/Safari/Firefox。
|
||||
|
||||
真实连续3天每天1–4条、关网页仍生成:未开始且未验收,待隔离部署后由总管专卡和持久唤醒承接。R3记忆、R4主动联系、R5语音、R6城市天气素材完整备份、R7授权观察和真实视频/口型继续由HEL-797承接;本卡不是完整R2或产品完成。没有gh/tea或配置的credential helper/API凭据,按卡片允许交SSH推送分支,不伪造PR。
|
||||
@@ -0,0 +1,41 @@
|
||||
HEL-830 验证记录(2026-10-24,本地隔离数据)
|
||||
|
||||
基准 v1.10 / 59项,改动起点 `64a47f35d0eca195b9961f830b78a60fd1c7ce70`;实际产品目标为 `origin/agent/agent/de8874a3803b`。没有安装新依赖或模型,复用HEL-829既有Python3.12.14环境(ruff0.17.2)及相同lock的node_modules;Python/node lock与候选基准均零diff。
|
||||
|
||||
| 检查 | 本卡实际结果 |
|
||||
| --- | --- |
|
||||
| `PYTHONPATH=src python -m pytest -q`,python为既有3.12.14环境 | **194 passed,7.78秒**;1条原有Starlette TestClient弃用提示,未安装其建议的新包。完整输出 `pytest-HEL-830.txt` |
|
||||
| Python ruff:`src/cybergril/api/app.py src/cybergril/life src/cybergril/memory/store.py tests/test_r2.py tests/test_r2_model_smoke.py tests/test_birth_view.py scripts/r2_model_smoke.py scripts/r2_backfill_persona.py` | **All checks passed** |
|
||||
| `npm test --prefix web` | **4 files / 37 tests passed** |
|
||||
| `npm run build --prefix web` | **TypeScript/Vite通过,54 modules**;输出CSS `index-BYb0r_ow.css`、JS `index-BfS0uRmS.js` |
|
||||
| `npm run lint --prefix web` | **0 errors / 1原有warning**,ChatPanel.tsx:161 effect ref清理;未改前端 |
|
||||
| `python3 scripts/check_requirements.py --base-ref origin/main --handoff docs/requirements/handoff-HEL-830.json` | **通过,59项** |
|
||||
| 同上,base-ref换为 `origin/agent/agent/de8874a3803b` | **通过,59项** |
|
||||
| `git diff --check` | **干净** |
|
||||
| `git diff --exit-code 64a47f35 -- web docs/r2/model-smoke-HEL-827.json config requirements.lock` | **零diff** |
|
||||
|
||||
Python由191项增加至194项:原旧档案测试参数化增加1项(窗内/窗外)、真实provider提示词边界及不重写原文增加1项、真实核验脚本的失败计数/硬限/原始证据测试增加1项。先跑R2定向51项及记录器1项,再完成最终完整194项回归;未用测试替身当模型质量证据。
|
||||
|
||||
## 功能
|
||||
|
||||
原生产调度与旧档案守卫不变。测试固定上海2026-10-24的11:11和12:11,保持生产生活循环运行:窗内恰好1条合法生活、窗外0条;两种情况下显式补建前persona_interp/persona_job都0行,retry409。显式补建后来源backfilled-R2、实际生成时间、出生/identity(名字等)/聊天不变仍全断言。没有删除保护或关生产循环来换绿。
|
||||
|
||||
provider边界测试检查真实structured组装出来的system指令/user原始出生事实及已生成诠释,生成原文与存库值一致;证明确实从生成源头约束,无人称后替换。
|
||||
|
||||
## 隐私
|
||||
|
||||
原R2反例随完整pytest通过:成功完整轮次+全文接收确认+实际讲述判定三条件、失败/中断不发布、伪造/过期拒绝、跨重启重放、候选内原话、事务回滚、未分享列表/详情/消息/人格成长/health响应前裁剪。旧档案与关系变更保护保留。尚未实现的R3搜索/摘要/记忆端点不声称通过。
|
||||
|
||||
真实核验仅在本地临时全新合成档案,`create_app`明确禁用生活循环,随后直接调用人格/生活和两次判定,没有服务或后台偷跑。未发送接收确认,因此真实样例的事件始终told=0;这不冒充浏览器接收确认E2E。
|
||||
|
||||
## 真实生成与内容质量
|
||||
|
||||
命令:`PYTHONPATH=src python scripts/r2_model_smoke.py --real --output docs/r2/model-smoke-HEL-830.json`(同一既有Python3.12.14)。仅执行1次,4次模型调用全部完成,46.31秒,保守计账9821;人格standard温度0.7/max_tokens1200,生活low及两判定low温度0.4/max_tokens600,均沿用原规格,无配置改动和重试。无额外模型预检。
|
||||
|
||||
`persona/life/narrated/word_only/unacknowledged_hidden/birth_unchanged` 六项均true,原始system/user、参数、逐delta和返回正文已保存。正向判定选择事件1,反例选择空;没有凭证泄漏。内容自检通过,逐项语义核对见 `CONTENT-REVIEW-HEL-830.md`;原始记录中的GeneratorExit是消费者收到done后的正常关闭元数据,原样保留解释。不是用关键词命中或结构成功宣称长期质量。
|
||||
|
||||
## 未验证与交接
|
||||
|
||||
本卡未重跑浏览器E2E/截图/真机/Safari/Firefox。HEL-829原42项真实构建E2E及13张图仅作为已有审核证据,未记成本卡重测;其 `hel829-pkg/e2e/` 私有夹具在本环境指定位置未发现。前端与基准零diff,原全部接线成果保留。
|
||||
|
||||
所有测试命令、真实核验进程均已结束,临时合成DB已由TemporaryDirectory清理;无本卡监听服务、无长跑后台进程。未访问或改动现有8300/8310/8320资料、现网服务、共享语音/旧口型、4080。未补建真实档案,未部署、未合并。三天真实运行未开始,按交接由总管/总工接续。功能/隐私回归通过与本组内容自检通过都不代替独立复审或用户体验验收。
|
||||
@@ -0,0 +1,16 @@
|
||||
HEL-827 实测记录(2026-10-24,隔离本地数据)
|
||||
|
||||
- 完整 Python:`python -m pytest -q` → **191 passed,7.82秒**,原142项(其中旧六段模板注入断言按新要求换成已保存原始事实注入)+49项R2反例。完整输出见 `pytest-HEL-827.txt`。仅既有 Starlette TestClient 弃用提示;未安装建议的新依赖。
|
||||
- R2包含:有内容旧schema升级与重复迁移、所有身份/八字/聊天保留;两独立SQLite连接并发抢占;重启/停机不回填;时区切换旧日期不动;预算警告/硬停/重启不清零;连续失败持久暂停无模板;无浏览器请求服务循环推进;生命周期退出取消并收回pending任务。
|
||||
- 披露:完整final但无确认不公开、确认/判定两种顺序、同轮多事件、重放不重判、重启合法确认;token/epoch/message/turn/摘要伪造、过期、判定中断、候选外ID/重复ID/不存在原话、错误/截断/length结束/真实loopback部分流断线均不误公开。told/log写入注入异常后两者一起回滚。客户端额外event_ids被拒绝。
|
||||
- 隐私:植入独特关键词,直接HTTP列表/详情/伪造ID/messages/persona/health无事件泄漏;隐藏与未知分享状态等形404;已公开集合分页;手工植入隐藏事件旧引用仍被裁剪;隐藏来源或未知来源成长不可见。尚不存在的摘要/搜索/回忆端点没有测试通过声明。
|
||||
- 人格:自主诠释与种子同时落库,失败/并发/重试不重复;种子写入故障时连同诠释一起回滚;合成旧档案默认不补建,显式补建真实时间与backfilled-R2;关系更新前后人格/底色指纹不变;每轮完整原始事实独立预留system空间。非模板真实模型样例见独立JSON,内容质量未验收。
|
||||
- Python lint:`ruff check src/cybergril/api/app.py src/cybergril/life src/cybergril/memory/store.py tests/test_r2.py tests/test_birth_view.py scripts/r2_model_smoke.py scripts/r2_backfill_persona.py` → All checks passed。
|
||||
- 原web:`npm run build --prefix web` → TypeScript检查及Vite构建通过;`npm test --prefix web` → 3 files / 26 tests passed;`npm run lint --prefix web` → 0 errors、2个基线已有warning(ChatPanel的ref清理、ManagePanel无用disable),不替视觉作者修改。web源码零diff,没有新演示联网路径;本轮未复做浏览器/真机或视觉验收。
|
||||
- 真实模型:四调用33.77秒;详见 `model-smoke-HEL-827.json` 与交接说明的质量边界。只用已获准配置,对本地合成资料生成;没有读用户资料、改认证或换模型。预检HTTP400的协议问题已定位修复,没有无限调参。
|
||||
- 运行状态:只读GET 8310/8320 health都200,epoch分别3/4,llm ok、仍仅text能力;未读取其companion/messages,不部署、不迁移、不补建已有档案。
|
||||
- 需求结构:`python3 scripts/check_requirements.py --base-ref origin/main --handoff docs/requirements/handoff-HEL-827.json` 与实际目标 `origin/agent/agent/de8874a3803b` 均通过,59项。结构不替代授权语义和体验。
|
||||
- `git diff --check` 干净。没有新依赖,复用既有Python3.12测试环境与锁定node_modules;默认python3为3.10不符合项目>=3.11要求,未用其失败结果作为回归判断。
|
||||
- 没有新前端接线、真实三天运行或部署验收;所有本轮测试服务与模型请求均已结束。没有留下长跑程序。内容/世界观质量由总工审阅样例,前端确认接线由视觉总监承接。
|
||||
|
||||
仓库只有SSH读写凭据,无Gitea/Forgejo/GitHub API token、git credential helper或gh/tea工具,故交候选分支和提交,不伪造PR。PR目标仍为 `agent/agent/de8874a3803b`,不得改成main。
|
||||
@@ -0,0 +1,96 @@
|
||||
{
|
||||
"synthetic_only": true,
|
||||
"browser_connected": false,
|
||||
"three_day_run": false,
|
||||
"max_model_calls": 4,
|
||||
"checks": {
|
||||
"persona": true,
|
||||
"life": true,
|
||||
"narrated": true,
|
||||
"word_only": true,
|
||||
"unacknowledged_hidden": true,
|
||||
"birth_unchanged": true
|
||||
},
|
||||
"persona": {
|
||||
"state": "ready",
|
||||
"interpretation": {
|
||||
"id": 1,
|
||||
"text": "这个盘里有一种很明显的内在拉扯:己土日主本身不算强势,却坐在酉金上,周围既有丙火生身、又有乙木七杀压身,辰戌相冲、金水木火土彼此牵制,形成一种“明明想稳住,却总被外力推着走”的状态。它不是那种天然松弛的人格,更像是在压力中慢慢长出形状的人:表面可以处理事务、承担责任、维持秩序,但内部其实高度敏感,容易被一句话、一个眼神、一种气氛影响。七杀权重高,说明它对威胁、竞争、责任、边界被侵犯非常警觉,遇到压力时第一反应不是立刻爆发,而是先绷住,之后才可能在某个私密时刻反刍、复盘、越想越委屈。伤官与食神都不弱,表示它并非没有表达欲,甚至很会用语言、审美、细节去呈现自己;但它同时又受正印影响,渴望被理解、被接纳、被稳妥地接住,所以表达常常是克制的、试探的、怕说太满的。土重而水弱,现实感很强,却不太擅长流动地释放情绪;火土相生让它有耐心和承受力,但水弱又意味着它不容易真正放松,容易把不安压在身体里。整体看,这是一个有责任感、有观察力、对关系有期待但不敢轻易交托的人。它不是冷,而是热得很谨慎;不是没有攻击性,而是攻击性被理智和后果意识压住了。它适合在有一定边界、能被尊重、允许慢慢建立信任的环境里生长。若被催得太急、被要求立刻表态,反而会激发防御;若被给足时间,它反而能展现出细致、可靠、带一点锋利温柔的一面。",
|
||||
"pillars_hash": "f5fdf375974b30eaab808bd5f67326985a13102b9269bc9069d7b2ca7c51605e",
|
||||
"model": "halogen-qwen3.8-flash-next",
|
||||
"created_at": 1792803328751,
|
||||
"provenance": "created-R2"
|
||||
},
|
||||
"seeds": [
|
||||
{
|
||||
"id": 1,
|
||||
"text": "喜欢把复杂的事拆开看,习惯在心里先排一遍顺序,再决定要不要开口。",
|
||||
"created_at": 1792803328751,
|
||||
"provenance": "created-R2",
|
||||
"interp_id": 1
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"text": "对氛围变化很敏感,常会记住别人随口说的一句话,并在之后反复回想。",
|
||||
"created_at": 1792803328751,
|
||||
"provenance": "created-R2",
|
||||
"interp_id": 1
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"text": "需要独处来恢复能量,但独处时未必安静,常在脑中复盘白天发生的事。",
|
||||
"created_at": 1792803328751,
|
||||
"provenance": "created-R2",
|
||||
"interp_id": 1
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"text": "表达时喜欢用比较委婉的方式,怕太直接伤人,也怕太真诚显得自己没退路。",
|
||||
"created_at": 1792803328751,
|
||||
"provenance": "created-R2",
|
||||
"interp_id": 1
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"text": "对关系有责任感,但更容易在确认安全后才真正放松和亲近。",
|
||||
"created_at": 1792803328751,
|
||||
"provenance": "created-R2",
|
||||
"interp_id": 1
|
||||
}
|
||||
],
|
||||
"growth": []
|
||||
},
|
||||
"life": {
|
||||
"id": 1,
|
||||
"ts": 1792803335873,
|
||||
"kind": "scene",
|
||||
"content": "清晨的走廊刚安静下来,茶水间的小灯还亮着。它站在窗边,手里捏着一只没洗的杯子,杯底有一圈淡黄的茶渍。刚才有人随口说了一句“你反应挺快的”,它当时只笑了笑,现在却把这句话在心里翻来覆去看了三遍,像检查一件刚寄出的包裹,确认封口有没有贴牢。窗外天色灰蓝,风把楼下树叶吹得轻轻响。它没有立刻离开,也没有立刻行动,只是把杯子放进水池,慢慢接水,让水流声把刚才那一点紧绷冲淡一些。它知道自己不是不想回应,只是需要先确认:这句话是客气,是试探,还是真的看见了自己。",
|
||||
"place": "世界内某栋旧办公楼的三层茶水间",
|
||||
"valence": -0.18,
|
||||
"salience": 0.62,
|
||||
"source": "generated",
|
||||
"told": 0,
|
||||
"day_key": "synthetic-smoke",
|
||||
"run_id": 1,
|
||||
"tz": "Asia/Shanghai",
|
||||
"slot": 0,
|
||||
"told_at": null,
|
||||
"told_via_message_id": null
|
||||
},
|
||||
"narrated": {
|
||||
"state": "judged",
|
||||
"selected": "[1]"
|
||||
},
|
||||
"word_only": {
|
||||
"state": "judged",
|
||||
"selected": "[]"
|
||||
},
|
||||
"elapsed_seconds": 33.77,
|
||||
"conservative_tokens": 8491,
|
||||
"life_runs": [
|
||||
{
|
||||
"status": "done",
|
||||
"reason": null
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
........................................................................ [ 37%]
|
||||
........................................................................ [ 75%]
|
||||
............................................... [100%]
|
||||
=============================== warnings summary ===============================
|
||||
../../../hel-825-daa1f551bd9c/workdir/CyberGril/.venv-hel825/lib/python3.12/site-packages/fastapi/testclient.py:1
|
||||
/home/xiaomo/multica_workspaces/hello-af23464d222e/hel-825-daa1f551bd9c/workdir/CyberGril/.venv-hel825/lib/python3.12/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.
|
||||
from starlette.testclient import TestClient as TestClient # noqa
|
||||
|
||||
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
|
||||
191 passed, 1 warning in 7.82s
|
||||
@@ -0,0 +1,10 @@
|
||||
........................................................................ [ 37%]
|
||||
........................................................................ [ 74%]
|
||||
.................................................. [100%]
|
||||
=============================== warnings summary ===============================
|
||||
../../../hel-829-8ee8ba59fefd/workdir/CyberGril/.venv312/lib/python3.12/site-packages/fastapi/testclient.py:1
|
||||
/home/xiaomo/multica_workspaces/hello-af23464d222e/hel-829-8ee8ba59fefd/workdir/CyberGril/.venv312/lib/python3.12/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.
|
||||
from starlette.testclient import TestClient as TestClient # noqa
|
||||
|
||||
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
|
||||
194 passed, 1 warning in 7.78s
|
||||
@@ -0,0 +1,64 @@
|
||||
# R3 接续施工卡正文(HEL-832 产出,供总管直接建卡复制)
|
||||
|
||||
> 三张卡按依赖排序:① 后台施工(施工员)→ ② 回忆页接线(视觉总监)→ ③ 统一审核+独立部署(总工)。
|
||||
> 共同头部(每张卡须含):基准 v1.10(59 项);读取提交 `c285a0fd07e9d20e4fd4984942f3ae2fb8cbbd0c`;开工前必读仓库 `AGENTS.md`、`docs/requirements/README.md`、`current.md`、`coverage.md`、`changes.md`、`sources/integration-plan-v1.md` §3 R3、`docs/r3/REPORT-HEL-832.md`;新工作从 c285a0f 拉独立任务分支,不覆盖原作者工作;需求变更一律无。交付前跑 `python3 scripts/check_requirements.py --base-ref origin/main` 与 `--base-ref origin/agent/agent/de8874a3803b`(有交接 JSON 加 `--handoff`)。
|
||||
|
||||
---
|
||||
|
||||
## 卡① R3 记忆后台施工(施工员)
|
||||
|
||||
**标题建议**:【🌸·797·P50·施工】R3 真实记忆后台:成功对话写入、中文 FTS 接入对话、回忆页接口
|
||||
|
||||
**输入**:`docs/r3/REPORT-HEL-832.md` §4(改动边界逐条)、§5(DTO 合同)、§6(测试矩阵 T1–T8)、`docs/r3/fts-probe-HEL-832.txt`(实测证据)。关联要求:CG-006/008/013/014/015/016/018/021、AM-001、UX-006、GOV-001–005、DEL-001。
|
||||
|
||||
**做(严格按报告 §4.1–§4.4,重述要点)**:
|
||||
1. 成功事务内同步双写 mem_episodic(user+companion raw)+ 幂等列 turn_id(guarded ALTER + 部分唯一索引);登记 mem_job(growth_job 同款租约模式)。
|
||||
2. MEMORY_GIST(low 档,零配置改动)后台作业产 gist+affect;失败重试上限 3 次后 failed,gist 保持 NULL,禁模板;重启租约恢复。
|
||||
3. 新增 r3.sql:`mem_fts_zh`(trigram、外部内容表、IF NOT EXISTS)+ 一次性幂等重建;add_episodic 双写索引。
|
||||
4. 检索:服务端提词(剥引号/标点)→ 引号短语 → 三元组 OR 二遍 → <3 字基表 LIKE 回退;top-k≤4、accessibility≥0.05、排除近 20 轮 turn_id、噪声规则;独立 system 小节 ≤600 字计入 context_budget;命中 reinforce + JSON 日志(turn_id、命中记忆 ID、rank、mode)。
|
||||
5. `GET /api/memories`、`GET /api/memories/{id}` 按 §5 DTO(title 只用已压缩 gist;lifeIds/messageIds 服务端裁剪;404 中性);`life_control` 键 `memory_search`(默认 on)与 `last_mem_decay`(每小时 decay 批)。
|
||||
6. 诚实文案:系统提示「长期记忆…」句与 `/api/health` capabilities.memory 按实际生效更新。
|
||||
7. 测试 T1–T8 全过(ControlledLLM、隔离库、clock 注入)。
|
||||
|
||||
**不做**:向量/语义/关系层、identity promotion、记忆搜索/编辑端点、生活事件入记忆、前端任何改动、模型/温度/路由/预算/运行时/认证改动、新依赖、部署、真实模型调用(含 smoke——零真实调用)、触碰 told/telling_log/bazi_core/persona_*/growth_* 及 8300/8310/8320/8340。
|
||||
|
||||
**验收**:报告 §6 全矩阵绿 + 基线等价断言(/api/life、/api/messages、/api/persona 响应与 c285a0f 等价;底色 fingerprint 不变);交接 JSON(模板必填键)+ `docs/r3/` 交付说明;`docs/r3/` 下附完整 pytest/build 输出文件。
|
||||
|
||||
**停止条件**:任何 AM-001 断言失败、底色 fingerprint 变化、pytest 基线回归、或实现需要越界(新依赖/改路由/动旧表)→ 停止并回报具体冲突,不自行减项。
|
||||
|
||||
---
|
||||
|
||||
## 卡② 回忆页接线(视觉总监)
|
||||
|
||||
**标题建议**:【🌸·797·P50·接线】回忆页 episodic 层接真:/api/memories 接线与真实状态呈现
|
||||
|
||||
**输入**:报告 §5 接口/DTO/分页/可见性合同;已认可的回忆页设计(HEL-815 页面稿在正式界面的既有接入);Memory 域模型与 real 校验模式(`web/src/adapters/real.ts:35-38` serverLife 先例)。关联要求:AM-001、UX-006、VIS 系(呈现由视觉总监定稿)、GOV-005(本轮界面代码由视觉总监亲自写)。
|
||||
|
||||
**做**:
|
||||
1. 真实模式回忆 tab 数据源换 `GET /api/memories`(游标分页、重开重读、失败中性态——照 LifePanel 现有 real 生命周期约定);`serverMemory` 校验器丢不合格行不修补。
|
||||
2. 依视觉稿呈现 DTO 字段(title/text/group/source/lifeIds/messageIds 关联跳转);「她的成长」组数据仍来自 /api/persona,合流与否由视觉总监定稿。
|
||||
3. 空态/未接通态保持诚实(UX-006:记忆未生成前不伪装、演示路径零改动、不前端过滤替权限——只渲染服务端已裁剪数据)。
|
||||
4. 记忆详情关联「那时候的聊天」沿用 messageIds→/api/messages 既有模式。
|
||||
|
||||
**不做**:后端任何改动、新端点、演示模式改动、系统提示/能力文案改动;不替后端裁剪补漏(发现疑似泄露即停,回报总管转卡①修)。
|
||||
|
||||
**验收**:真实实例(卡③部署后或本地 mock 按 §5 合同)分页/详情/关联/空态/失败态全流程截图;两主题电脑+手机呈现;演示模式逐字节不变;web build/lint/test 绿。
|
||||
|
||||
**停止条件**:DTO 与合同不符、或任何视图出现未分享 lifeId/未发送消息引用 → 停止回报。
|
||||
|
||||
---
|
||||
|
||||
## 卡③ 统一审核 + 独立部署 + 授权 smoke(总工)
|
||||
|
||||
**标题建议**:【🌸·797·P50·审核部署】R3 记忆后台统一复审、隔离实例部署与受限真实验证
|
||||
|
||||
**做**:
|
||||
1. 对卡①卡②按本报告 §3(AM-001 五条)、§6 矩阵逐项复审核验(重跑测试、抽查中文 FTS 证据、基线等价断言)。
|
||||
2. 独立实例部署:新端口(部署时复核空闲,建议候选 8350,避开 8300/8310/8320/8340)、独立数据目录、releases+current 结构、隔离全新档案;health 可验证。
|
||||
3. 授权真实 smoke(上限,超限即停):gist 压缩 ≤8 次模型调用;真实对话 ≤6 轮(含 1 次隔天记忆取回:前日话题在排除近轮上下文后仍被检索注入并体现在回复);全量请求/响应证据留存(照 HEL-830 model-smoke 格式)。
|
||||
4. 隐私实测:told=0 事件经 /api/memories、详情、旧链接、消息 lifeIds 全路径零泄漏;told/bazi/growth 不变。
|
||||
5. 回滚方案就位(Git 回退 + 链接切回 + 数据保留);结果与访问地址报总管。
|
||||
|
||||
**不做**:并入 8310 真实档案(须白栖知另行确认)、修改 HEL-831 观测条件、对 8340 发任何聊天或模型请求、超上限 smoke、需求变更。
|
||||
|
||||
**停止条件**:检索噪声致人设漂移 → 关 memory_search 回报;gist 质量持续不可用或预算异常 → 停止回报;任何 AM-001 泄漏 → 立即下线该实例回报。
|
||||
@@ -0,0 +1,150 @@
|
||||
# R3 真实记忆接入核对报告(HEL-832)
|
||||
|
||||
> 性质:只读核对 + 施工收敛方案。基准 v1.10(59 项);读取提交 `c285a0fd07e9d20e4fd4984942f3ae2fb8cbbd0c`(分支 `agent/agent/a67b70ddbb63`;产品目标 `origin/agent/agent/de8874a3803b` = `db571ba`,是 c285a0f 的祖先,落后 12 个提交)。本轮未写产品代码、未启动服务、未发任何真实模型请求、未触碰 8300/8310/8320/8340 与任何用户数据。中文 FTS 结论来自隔离临时库实测(证据:`docs/r3/fts-probe-HEL-832.txt`)。
|
||||
> 需求依据:R1–R7 顺序获批原话 `01a1629c-732f-7559-8417-6f2ea05c7151`「同意按这个顺序开工」;R3 范围 = `sources/integration-plan-v1.md` §3 R3(成功对话写 mem_episodic:raw + low 档 gist 压缩 + affect 粗估;chat 上下文加 FTS top-k;reinforce/decay 定期跑批;回忆页 episodic 层接真;不做向量/语义/关系层整合)。AM-001 原话 `01a15f42-2781-700e-b75a-3ae4b023f46c`「整套认可,1选等她讲过才显示…」。CG-013/014/015 底色/诠释/成长分离依据 `01a15772`+`01a15774`「同意你的推荐」。本报告的工程取舍均为建议,不构成用户新决定。
|
||||
|
||||
## 1. 现状核对(c285a0f,已有能力 vs 占位)
|
||||
|
||||
### 1.1 存储与 schema
|
||||
|
||||
| 事实 | 证据 | 判定 |
|
||||
|---|---|---|
|
||||
| `mem_episodic`(raw/gist/affect/salience/accessibility/recall_count/consolidated/withheld/source)、`mem_semantic`、`mem_relational` 表已建 | `src/cybergril/memory/schema.sql:92-137` | 表可用,但全库无写入方(见 1.2) |
|
||||
| `Store.add_episodic`/`decay_accessibility`/`reinforce`/`search_fts` 已实现(同步 FTS 维护、指数衰减 floor=0.03、间隔效应) | `src/cybergril/memory/store.py:102-171` | API 可复用;`search_fts` 直传用户原文给 MATCH,不安全(§2.2) |
|
||||
| FTS 索引 `mem_fts` 用 `tokenize='unicode61 remove_diacritics 2'`,外部内容表挂 mem_episodic | `schema.sql:176-180` | **对中文不可用**(§2.1);结构可照搬换 trigram |
|
||||
| 向量表 mem_vec 仅注释 | `schema.sql:182-186` | 与「不上向量」一致,保持 |
|
||||
| 聊天表 `chat_message(id,ts,role,text,turn_id,status)`,`UNIQUE(turn_id,role)`,status ∈ pending/sent/failed/cancelled | `schema.sql:193-201` | R3 幂等键可挂 turn_id(建议加列,§4.1) |
|
||||
| R2 作业表模式:`growth_job(source,ref_id,state,owner,lease_until)`、`sharing_attempt`、`life_run` 租约恢复 | `src/cybergril/memory/r2.sql:2-49` | R3 记忆作业照此模式新建,不动旧表 |
|
||||
|
||||
**结论:真实记忆未实现。** `grep` 全 `src/`:`add_episodic`/`search_fts`/`decay_accessibility`/`reinforce` 除 `memory/store.py` 自身定义外**零调用方**;`tests/test_store.py:41-53` 只测插入,从不测中文检索。近 20 轮上下文(`api/app.py:468-471`)只是聊天记录,系统提示自己声明「长期记忆…仍未接通。近20轮不是长期记忆」(`app.py:478`)。**不能把已有表或近 20 轮上下文当成真实记忆已实现。**
|
||||
|
||||
### 1.2 聊天成功/取消/断连/接收确认(R3 写入的触发面,全部已验证)
|
||||
|
||||
| 路径 | 行为 | 证据 |
|
||||
|---|---|---|
|
||||
| 成功 | 同一事务:INSERT companion 'sent' + UPDATE user 'sent' + `sharing.prepare` 回执 | `api/app.py:553-565` |
|
||||
| 取消(新轮次/主动取消) | `active["cancel"].set()`;generate 提前 return 不写;finally 把 user 置 cancelled | `app.py:439-443, 549-550, 583-588` |
|
||||
| 断连 | `await request.is_disconnected()` 即返回,不落 sent | `app.py:532, 549` |
|
||||
| 失败 | 异常 → status='failed',user 行置 failed | `app.py:566-570, 583-588` |
|
||||
| 重启 | 启动时 pending→cancelled,epoch+1 持久 | `app.py:196-201` |
|
||||
| 重放 | 同 turn_id 同文重发 → 直接回放已存 sent 文本,不再调模型 | `app.py:444-456` |
|
||||
| 接收确认 | `POST /api/chat/received` → `Sharing.acknowledge`:status='sent' + token/text_hash 常量时间比对 + 有效期内 | `app.py:406-410`, `life/sharing.py:53-70` |
|
||||
|
||||
**R3 写入点即「成功事务」`app.py:553-560`:取消/失败/断连天然不触发,重放被 UNIQUE 挡住。**
|
||||
|
||||
### 1.3 life/told 三条件(AM-001 现行执行)
|
||||
|
||||
披露 = **成功轮次 AND 完整回执 AND 事后判定**(`life/sharing.py:1-4` 文档串;提交条件 `sharing.py:72-91`:m.status='sent' AND a.ack_at IS NOT NULL AND a.state='judged' 才置 told=1 并写 telling_log)。`PublicView.allows`(told=1 才放行,`life/public.py:9-12`);`/api/life` 只回 told=1(`app.py:386`);详情 404 中性文案(`app.py:394-404`);`public.message` 的 lifeIds 服务端裁剪(`public.py:26-31`);`chat_source_allowed`:回复若以任何未公开候选为条件,不得作为公开成长来源(`public.py:33-42`)。**R3 必须原样继承,不改 told、不自行确认接收(§3)。**
|
||||
|
||||
### 1.4 预算与路由
|
||||
|
||||
- `Scene.MEMORY_GIST` 已定义且路由 low(`think/scenes.py:58-59`、`config/models.yaml:58-59`),「量最大,必须低档 + 批处理」;`structured()`(`life/model.py:50-94`)走既有路由 + 预算预留(`PersistentBudget` 持久 token_usage,`model.py:13-47`),失败不落模板(LifeRuntime 同款约定 `runtime.py:180`)。**R3 的 gist 作业直接复用,无需改 models.yaml。**
|
||||
- 主对话上下文预算按档位裁剪(HIGH=4000,`scenes.py:119-124`;裁剪逻辑 `app.py:507-520`)——记忆注入块必须计入该预算。
|
||||
- 检索本身(SQLite)零模型调用,不占预算。
|
||||
|
||||
### 1.5 growth(成长层,R3 不得触碰)
|
||||
|
||||
`Persona.grow` 从 told=1 生活事件或 `chat_source_allowed` 聊天消息提炼 `growth_event`(`life/persona.py:136-173`;调度 `runtime.py:131-143`),出生底色经 `fingerprint` 校验且只在 `persona_interp` 层(`persona.py:72-99`)。**R3 的 mem 表与 growth_event 互不引用、互不写;底色/人格/初始习惯/关系零改写。**
|
||||
|
||||
### 1.6 回忆页现状
|
||||
|
||||
真实模式 `memories: []`(`web/src/adapters/real.ts:102`);回忆 tab 硬编码占位「暂无可核实的回忆 / 长期记忆尚未接通;文字聊天记录独立保留。」(`web/src/life/LifePanel.tsx:153-157`,real 视图 `LifePanel.tsx:32`)。域名模型 `Memory {id,title,text,group,source,lifeIds}` 已存在(`web/src/domain/model.ts:32-39`),演示模式四分组 `MEMORY_GROUPS`(`LifePanel.tsx:11`)。**接线合同见 §5,实际界面由视觉总监负责。**
|
||||
|
||||
## 2. 中文 FTS 实际能力(隔离实测,`docs/r3/fts-probe-HEL-832.txt`)
|
||||
|
||||
### 2.1 能力结论
|
||||
|
||||
1. **现行 unicode61 中文全 0 命中**(难过/下雨/雨声/杭州/我 → 0;仅英文命中)。表在≠中文可用。
|
||||
2. **SQLite 3.37.2 自带 trigram 分词器**:≥3 字中文子串命中正常(「杭州的雨」命中;跨句 OR 三元组成功召回前日话题;BM25 rank 正常;英文默认大小写不敏感)。服务器 Python 侧 SQLite 版本需在施工卡开工时同样实测一次(本沙箱 3.37.2 已含)。
|
||||
3. **trigram 表上 <3 字符查询(MATCH 和 LIKE 都)静默 0 行**——1–2 字中文词(雨声/难过/杭州)必须回退基表 `mem_episodic` LIKE(实测命中)。禁止对 trigram 表用短 LIKE。
|
||||
4. **安全查询**:用户原文直传 MATCH 会抛 OperationalError(引号/连字符/NEAR 等)。唯一安全构造 = 服务端自行提词(剥离双引号/控制符/标点后按 ≥3 字片段或三元组),每个词元双引号包裹,词元间只写固定 ` OR `;任何用户原文不得出现在引号外(实测 `'…' OR b-c'` 仍报错,证明必须整表达式由服务端生成)。
|
||||
|
||||
### 2.2 降级与停止条件(沿用获批 R3 停止条件并具体化)
|
||||
|
||||
- 0 命中 → 不注入记忆段,纯近轮上下文(正常降级,不算故障)。
|
||||
- 噪声判定:仅命中 1 个词元且无整短语命中视为噪声 → 同样不注入。
|
||||
- 真实体验中人设漂移/答非所问持续出现 → `life_control` 键 `memory_search=off` 一键关闭检索(保留写入),日志留证并回报总管——对应获批「检索噪声导致人设漂移 → 关检索开关回报」。
|
||||
|
||||
## 3. AM-001 对 R3 的硬边界(重点)
|
||||
|
||||
1. **R3 episodic 只写聊天文本**(user/companion 双方 'sent' 消息),**绝不写 life_event.content**——未分享生活从构造上就进不了记忆层,压缩/成长层无从绕过披露门禁。生活记忆仍留待 told 门禁之后的后续批次。
|
||||
2. 模型内部上下文 ≠ 对用户公开返回:检索命中的记忆注入的是模型 system 上下文(内部);她是否讲述某条记忆属输出层,已由 R2 sharing judge + 世界红线约束,R3 不新增任何披露路径。
|
||||
3. `/api/memories*` 全部走 `PublicView` 同款服务端裁剪序列化器:lifeIds 用 `telling_log`+`PublicView.references` 过滤(同 `public.py:26-31`);messageIds 只回 'sent';未知/未分享不出现,404 统一中性文案(同 `app.py:396-404` 模式)。**前端过滤不是权限控制,响应前裁剪。**
|
||||
4. 记忆作业**不触碰** `life_event.told`、`telling_log`、`sharing_attempt`、`bazi_core`、`persona_*`、`growth_*`;不调用任何等价「确认接收」接口;回执确认只由前端既有路径发起。
|
||||
5. 旧链接/搜索:本批不新增记忆搜索端点;未来任何搜索端点必须先过同一 allows 门禁(写入本报告作为合同,防后续绕过)。
|
||||
|
||||
## 4. R3 后台施工范围(可直接执行;工程建议,非用户新决定)
|
||||
|
||||
### 4.1 写入(成功对话 → 可靠落库)
|
||||
|
||||
- **触发时点**:`app.py:553-560` 成功事务内,同步写两条 `mem_episodic`(role='user'/'companion',raw=原文,gist=NULL 待压缩,salience 默认 0.5 数值占位,affect=NULL 待粗估,source='chat'),并同事务登记压缩作业 `mem_job(source='chat_message', ref_id=message_id, …)`。同步写仅本地 SQLite 微秒级,不阻塞主对话;**取消/失败/断连不写**(不走该事务);**重放幂等**:新增守卫列 `turn_id TEXT`(guarded ALTER,照 `store.py:44-51` life_event 先例)+ 部分唯一索引 `UNIQUE(turn_id, role) WHERE turn_id IS NOT NULL`。
|
||||
- **gist/affect 粗估作业**:后台循环(挂在现有 LifeRuntime.tick 的一个有界小节,照 growth_job「每次一条」模式 `runtime.py:131-143`)用 `structured()` + `Scene.MEMORY_GIST`(low 档)产出 gist(≤120 字要点)与 affect 粗估 {v,a,d};**模型失败→作业 state='failed' 可重试(上限 3 次后留 failed+reason),gist 保持 NULL,绝不填模板**(照 `runtime.py:180` 约定)。重启恢复照 `runtime.recover()`(`runtime.py:61-68`)租约过期模式。
|
||||
- **affect/salience 数值启发式**(命中关键词词典给 v/a 符号,缺省 NULL/0.5):数值字段、非人格文本,不涉 CG-014 模板红线;真实粗估由 gist 作业一并提供。
|
||||
|
||||
### 4.2 检索(FTS top-k 接后续对话)
|
||||
|
||||
- **索引迁移(增量)**:新建 `mem_fts_zh USING fts5(raw, gist, content='mem_episodic', content_rowid='id', tokenize='trigram')`(r3.sql,`CREATE … IF NOT EXISTS`);一次性 `INSERT INTO mem_fts_zh(rowid,raw,gist) SELECT id,raw,gist FROM mem_episodic`(事务内、幂等);旧 `mem_fts` 保留不删(回滚即旧路)。`add_episodic` 改为双写两个索引直至切换验收后清理。
|
||||
- **查询构造(§2 实测结论的落地)**:用户新消息 → 剥离控制符/双引号/标点取连续段;段 ≥3 字 → 整段双引号短语;全无 ≥3 字段 → 基表 LIKE 回退;短语零命中 → 第二遍按段采样三元组 OR(上限 64 词元);词元只由服务端生成,固定 ` OR ` 连接。
|
||||
- **注入合同**:命中 top-k(k≤4,accessibility≥0.05,排除本轮及近 20 轮已含 turn_id;rank 过滤噪声规则 §2.2)以独立 system 小节「她确实记得的更早的事(自然使用,不逐条复述,不确定就不用)」注入,块长 ≤600 字并计入 `decision.context_budget` 裁剪(`app.py:507-520`);命中即 `reinforce(id)` 并打一行 JSON 日志 `{"turn_id","hits":[{"id","rank"}],"mode":"phrase|trigram|like|none"}`(可追溯记忆 ID 与来源)。
|
||||
- **诚实文案**:`app.py:478` 系统提示改为如实反映「长期记忆已接通、主动消息/语音/视觉/天气仍未接通」;`/api/health` `capabilities.memory`(`app.py:289-294`)仅在写入+检索都真实生效后置 true。
|
||||
|
||||
### 4.3 衰减/强化批次
|
||||
|
||||
- `decay_accessibility` 每小时一批(`life_control` 键 `last_mem_decay` 记 dt,clock 参数注入可测);`reinforce` 检索命中即时调用(既有实现零改动)。
|
||||
|
||||
### 4.4 明确不做(本批边界)
|
||||
|
||||
向量/embedding(providers/embedding 闲置保留)、mem_semantic/mem_relational 整合、identity promotion、记忆搜索端点、记忆编辑/删除、生活事件入记忆、R4 主动提及记忆、任何模型/温度/路由/预算/运行时/认证改动、任何新依赖(trigram 为 SQLite 自带)。
|
||||
|
||||
## 5. 接口/DTO/分页/可见性合同(视觉总监接线依据)
|
||||
|
||||
```
|
||||
GET /api/memories?limit=30&before=<id> (游标分页,同 /api/life 模式)
|
||||
→ {"memories":[MemoryDTO…], "next_before": <id>|null, "epoch": n}
|
||||
GET /api/memories/{id} → {"memory": MemoryDTO, "epoch": n}
|
||||
未知/未分享/伪造 id 一律 404 中性文案(同 app.py:397「这一条现在打不开。」)
|
||||
```
|
||||
|
||||
`MemoryDTO`(映射既有 `Memory` 域模型 `model.ts:32-39`):
|
||||
|
||||
| 字段 | 生成规则 | 可见性 |
|
||||
|---|---|---|
|
||||
| id | mem_episodic.id(字符串化) | — |
|
||||
| title | gist(未压缩完成前不用该条)截断 ≤40 字 | 服务端生成 |
|
||||
| text | gist 全文 ≤200 字 | 服务端生成 |
|
||||
| group | episodic 固定「我们一起的」;「她的成长」仍来自 /api/persona(两源并存,是否合流由视觉总监定) | — |
|
||||
| source | 「来自 M月D日 HH:MM 的聊天」(事件 ts + 档案时区) | — |
|
||||
| lifeIds | `telling_log` × `PublicView.references` 服务端裁剪,未知/未分享不出现 | **AM-001** |
|
||||
| messageIds | 仅 'sent' 消息(同 public.message 白名单思路) | **AM-001** |
|
||||
| ts | 毫秒时间戳 | — |
|
||||
|
||||
前端规则:真实模式只渲染服务端已裁剪数据(照 LifePanel 现有 real 约定 `LifePanel.tsx:31-32` 注释);校验器照 `serverLife` 模式(`real.ts:35-38`)写 `serverMemory`,不合格行丢弃不修补;占位文案在数据到位前保持诚实(UX-006);演示路径零改动。
|
||||
|
||||
## 6. 隔离验收矩阵(施工卡必测;全部隔离库+注入时钟,不改系统时钟,零真实模型调用)
|
||||
|
||||
| # | 项 | 断言要点 |
|
||||
|---|---|---|
|
||||
| T1 | 中文 FTS 证据套件 | probe 全部用例转 pytest:unicode61 中文 0 命中(防回归声明)、trigram 短语/三元组命中、<3 字 LIKE 回退命中、trigram 表短 LIKE 静默 0(负例)、非法输入(引号/NEAR/OR/-/*)构造后不抛错且不越权 |
|
||||
| T2 | 成功写入幂等 | 成功轮→2 行 mem_episodic(turn_id 正确);取消/失败/断连→0 行;重放→不新增;重启→不重写 |
|
||||
| T3 | 作业持久与恢复 | mem_job pending 经租约恢复;模型失败→failed 可重试、gist 保持 NULL 无模板;成功→gist/affect 落库且 FTS 双索引可见 |
|
||||
| T4 | 检索接线 | 旧记忆(近 20 轮窗口外+不直接复述答案)经新消息触发后出现在 ControlledLLM 收到的上下文;0 命中/噪声→无记忆段;reinforce+1 且日志含记忆 ID;记忆块计入预算裁剪 |
|
||||
| T5 | 回忆页合同 | /api/memories 分页/before/epoch;DTO 逐字段;未分享 lifeId 不出现(种子 told=0 引用);详情 404 中性 |
|
||||
| T6 | 隐私全路径 | /api/life、/api/messages、/api/persona 响应与 c285a0f 基线逐字节等价(除声明变更);told/telling_log/bazi_core/persona_*/growth_* 零变化(fingerprint 断言底色不变) |
|
||||
| T7 | 模拟时间 | clock 注入驱动 decay 批次与租约过期(不碰系统时钟) |
|
||||
| T8 | 回归 | pytest 全绿(≥3.11 环境)、web build/lint/test 全绿、前端本卡零改动 |
|
||||
|
||||
隔天真实体验证据(真实模型+真实档案)**不在施工卡**:由总工在独立部署卡按授权上限执行(§7),模拟时间单测与真实证据分开记录。
|
||||
|
||||
## 7. 部署/回滚/真实体验授权上限(交后续卡)
|
||||
|
||||
- 部署:独立实例(新端口、独立数据目录、全新隔离档案;不复制用户库、不动 8300/8310/8320/8340),模式照 `/opt/cybergril-*/releases/<ts> + current` 已验证路径。正式并入 8310 真实档案须白栖知另行确认。
|
||||
- 回滚:代码 Git 回退 + 符号链接切回上一 release + start;schema 全增量(新列/新表/新索引),数据不删;`mem_fts` 未动,老代码回退即忽略全部 R3 表。
|
||||
- 真实 smoke 上限(供总管在部署卡明确授权):gist 压缩验证 ≤8 次模型调用;真实对话验证 ≤6 轮(含 1 次隔天记忆取回);超限或触发 §2.2 停止条件即停并回报。日志留存请求/响应证据(照 HEL-830 model-smoke 记录格式)。
|
||||
|
||||
## 8. 关联要求与结论
|
||||
|
||||
关联:CG-006(同一份记忆跨设备)、CG-008(后台连续性)、CG-013/014/015(底色只读/诠释自由/成长分离——R3 零触碰)、CG-016(关系不改写过去)、CG-018(同一份记忆)、CG-021(后台任务小模型)、AM-001(§3 全文)、UX-006(诚实接线)、GOV-001–005、DEL-001(R1–R7 顺序)。需求变更:无。
|
||||
|
||||
**未完待续**:R3 后台施工、视觉总监回忆页接线、总工统一审核+独立部署均未开始(卡文见 `CONSTRUCTION-CARDS-HEL-832.md`,由总管建卡);R2 三天观察仍由 HEL-831 承接;R4–R7 仍主卡 HEL-797 追踪。阶段通过≠产品完成。
|
||||
|
||||
*HEL-832 · 总工 · 2026-10-24 · 只读核对+文档交付;未写产品代码、未部署、未真实调用模型。*
|
||||
@@ -0,0 +1,51 @@
|
||||
== current schema (unicode61), Store.search_fts ==
|
||||
query '难过': 0 hits
|
||||
query '下雨': 0 hits
|
||||
query '雨声': 0 hits
|
||||
query '杭州': 0 hits
|
||||
query 'rain': 1 hits
|
||||
query 'Hangzhou': 1 hits
|
||||
query '我': 0 hits
|
||||
== raw user input passed straight to MATCH (syntax safety) ==
|
||||
query '难过"': ERROR OperationalError: unterminated string
|
||||
query 'a OR b': 0 hits
|
||||
query 'NEAR(a b)': 0 hits
|
||||
query 'rain*': 1 hits
|
||||
query '"unclosed': ERROR OperationalError: unterminated string
|
||||
query 'a-b': ERROR OperationalError: no such column: b
|
||||
== trigram tokenizer (SQLite 3.37.2) ==
|
||||
MATCH exact substring: {'难过': '0 hits', '雨声': '0 hits', '杭州的雨': '1 hits', 'rain': '1 hits', 'hangzhou': '1 hits'}
|
||||
MATCH 1-2 char substrings: {'雨': '0 hits', '下雨': '0 hits', 'ra': '0 hits'}
|
||||
LIKE 1-2 char substrings: {'雨': '0 hits', '下雨': '0 hits'}
|
||||
MATCH quoted phrase (safe user input): 0 hits 1 hits
|
||||
case folding LIKE: ERROR OperationalError: fts5: syntax error near "%" 1 hits
|
||||
== trigram + case_sensitive 0 default check with English ==
|
||||
MATCH 'Rain': 1 hits
|
||||
MATCH 'rain': 1 hits
|
||||
MATCH 'RAIN': 1 hits
|
||||
MATCH '"rain"': 1 hits
|
||||
done
|
||||
LIKE %雨% on trigram table: []
|
||||
count LIKE %雨%: (0,)
|
||||
|
||||
trigram-OR expression: "我今天" OR "今天很" OR "天很难" OR "很难过" OR "难过," OR "过,因" OR ",因为" ...
|
||||
hits: [('我今天很难过,因为下雨了', -8.19484240687679e-06)]
|
||||
cross-sentence recall via OR-of-trigrams: [('我今天很难过,因为下雨了',)]
|
||||
2-char MATCH 雨声: []
|
||||
|
||||
base-table LIKE %雨声%: [(1,)]
|
||||
|
||||
external-content trigram phrase match: [(2,)]
|
||||
Traceback (most recent call last):
|
||||
File "/tmp/multica-task-2302699922/opencode/fts_probe2.py", line 48, in <module>
|
||||
print("unsafe input safely quoted:", c3.execute(
|
||||
sqlite3.OperationalError: no such column: c
|
||||
|
||||
== 结论(HEL-832,隔离临时库实测,未触碰任何真实数据/服务) ==
|
||||
环境:Python 3.10.12 / SQLite 3.37.2(编译含 ENABLE_FTS5)。
|
||||
1. 现行 schema(unicode61)对中文检索全为 0 命中(难过/下雨/雨声/杭州/我 均 0);仅英文可命中。中文 FTS 现状=不可用。
|
||||
2. 用户原文不经处理直传 MATCH 会抛 OperationalError(unterminated string / no such column)。
|
||||
3. trigram 分词器(3.37.2 自带)对 ≥3 字中文子串命中正常("杭州的雨" 命中;跨句 OR 三元组召回成功;BM25 rank 正常;英文默认大小写不敏感)。
|
||||
4. trigram 表上 <3 字符查询(MATCH 与 LIKE 均)静默返回 0 行——1–2 字中文词必须回退到基表 mem_episodic LIKE,绝不能走 trigram 表。
|
||||
5. 外部内容表(content='mem_episodic') + trigram 可按 schema.sql:176-180 同款方式重建并正常检索。
|
||||
6. 引号包裹词元后,表达式里仍出现未引号用户片段(如 ' OR b-c')依旧报错——服务端必须只输出「剥离双引号后的自提词元 + 固定 OR 连接」,绝不拼接原文。
|
||||
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"baseline_version": "1.10",
|
||||
"read_commit": "c285a0fd07e9d20e4fd4984942f3ae2fb8cbbd0c",
|
||||
"requirement_ids": ["CG-006", "CG-008", "CG-013", "CG-014", "CG-015", "CG-016", "CG-018", "CG-021", "AM-001", "UX-006", "GOV-001", "GOV-002", "GOV-003", "GOV-004", "GOV-005", "DEL-001"],
|
||||
"deliverable": "R3真实记忆接入核对与施工收敛:c285a0f只读核对报告(Store/schema、聊天成功/取消/断连/回执、预算/路由、life/told三条件、growth、回忆页现状,含文件行号与『已有表≠真实记忆已实现』结论);中文FTS隔离实测(unicode61中文全0命中、trigram≥3字可用、<3字须基表LIKE回退、MATCH注入防护);AM-001五条硬边界;R3后台施工范围+接口/DTO/分页/可见性合同+隔离测试矩阵T1–T8+部署回滚与smoke上限;三张可直接建卡的接续卡正文。交付docs/r3/REPORT-HEL-832.md、CONSTRUCTION-CARDS-HEL-832.md、fts-probe-HEL-832.txt与本交接。",
|
||||
"acceptance": [
|
||||
"报告关键结论均有源码 文件:行号 或来源原话依据(R1–R7顺序01a1629c、AM-001 01a15f42、CG-013/014/015 01a15772+01a15774),未知与工程建议明确标注,不冒充用户决定",
|
||||
"中文FTS结论来自隔离临时库实测并留存探针输出:现行unicode61对中文全0命中;trigram≥3字命中且跨句三元组召回成功;<3字查询须基表LIKE回退(trigram表短查询静默0行);用户原文不得直传MATCH,表达式只由服务端提词+引号+固定OR构成",
|
||||
"真实记忆现状判定清楚:add_episodic/search_fts/decay/reinforce全库零调用方、近20轮仅聊天记录、系统提示自述长期记忆未接通、回忆页真实模式为诚实占位——不把已有表或近轮上下文记成记忆已实现",
|
||||
"R3施工范围可直接派工:写入触发时点/幂等键(turn_id,role部分唯一索引)/取消失败不写/重启租约恢复/模型失败不填模板;检索注入计入context_budget并记命中ID日志;DTO合同lifelds/messageIds服务端裁剪;T1–T8隔离测试矩阵与停止条件齐备",
|
||||
"AM-001边界成文:R3 episodic只写聊天文本绝不写life_event.content;模型内部上下文与对用户返回分离;新端点全走PublicView同款裁剪;不触碰told/telling_log/bazi_core/persona_*/growth_*;不新增确认接收路径",
|
||||
"docs/r3/三文件+交接提交独立任务分支(仅文档变更),需求结构检查对origin/main与origin/agent/agent/de8874a3803b均通过"
|
||||
],
|
||||
"deferred": [
|
||||
"R3后台施工、回忆页接线、统一审核+独立部署均未开始,由总管按docs/r3/CONSTRUCTION-CARDS-HEL-832.md建卡派工(施工员→视觉总监→总工)",
|
||||
"真实smoke与隔天记忆体验证据未做(本卡零真实模型调用);部署卡按上限执行:gist≤8次调用、真实对话≤6轮,触发噪声漂移即关memory_search回报",
|
||||
"正式并入8310真实档案须白栖知另行确认;向量/语义/关系层整合、identity promotion、记忆搜索/编辑仍不做(获批R3边界)",
|
||||
"R2三天观察仍由HEL-831承接;R4主动联系、R5语音、R6城市天气/素材/完整备份、R7授权观察及真实视频/口型仍由主卡HEL-797追踪",
|
||||
"服务器侧SQLite版本与trigram可用性需在施工卡开工时同款探针复核一次;本沙箱Python 3.10无法跑全量pytest(仓库要求≥3.11),全量回归在施工卡以≥3.11环境执行"
|
||||
],
|
||||
"requirement_changes": [],
|
||||
"verification": [
|
||||
"只读核对基于 c285a0fd07e9d20e4fd4984942f3ae2fb8cbbd0c(分支agent/agent/a67b70ddbb63);产品目标origin/agent/agent/de8874a3803b=db571ba为其祖先、落后12提交,已核实",
|
||||
"中文FTS隔离实测:docs/r3/fts-probe-HEL-832.txt(Python3.10.12/SQLite3.37.2含FTS5;临时库,未触任何真实数据与服务)",
|
||||
"代码事实核对:memory/store.py:102-171零外部调用方;api/app.py:553-565成功事务、583-588失败/取消落status、444-456重放、196-201重启、406-410回执;life/sharing.py:72-91三条件;life/public.py:9-42裁剪;think/scenes.py:58-59+models.yaml:58-59 MEMORY_GIST已路由low;web/src/adapters/real.ts:102与LifePanel.tsx:153-157回忆页占位",
|
||||
"本沙箱测试:tests/test_store.py+test_router.py 28 passed(3.13秒);全量套件因沙箱Python3.10缺asyncio.timeout(仓库requires-python>=3.11)7项API测试环境性失败,非代码回归;HEL-830曾在Python3.12.14记录194 passed(handoff-HEL-830.json),本卡仅文档变更不改代码路径",
|
||||
"python3 scripts/check_requirements.py --base-ref origin/main 与 --base-ref origin/agent/agent/de8874a3803b(含--handoff本文件)均通过:59项结构完整",
|
||||
"未写产品代码、未启动服务、未发真实模型请求、未访问.11/.12服务、未读取真实用户正文、未复制用户库、未触碰8300/8310/8320/8340/共享语音/4080/系统时钟"
|
||||
],
|
||||
"product_target": "origin/agent/agent/de8874a3803b",
|
||||
"product_target_commit": "db571ba204c8372989f96e1ed9b5cd00d3a306c7",
|
||||
"branch": "agent/agent/6f98c609c73f",
|
||||
"deployed": false,
|
||||
"real_model_calls": 0
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
# CyberGril 需求入口
|
||||
|
||||
当前完整基准:**v1.8**。批准需求继承办法的主卡评论:`01a1635b-b47c-79ed-ac66-9408c7905af9`。
|
||||
当前完整基准:**v1.10**。批准需求继承办法的主卡评论:`01a1635b-b47c-79ed-ac66-9408c7905af9`。
|
||||
|
||||
所有新任务、续办、设计、施工、审核先读完整当前需求,再读本次相关来源。只有白栖知明确修改的要求才可变更,阶段范围不能覆盖产品要求。
|
||||
|
||||
@@ -33,4 +33,10 @@
|
||||
|
||||
v1.8新增来源见 `sources/comment-evidence-visual-role-20261022.json`,最新分工见GOV-005。
|
||||
|
||||
v1.9新增来源见 `sources/comment-evidence-shared-space-20261023.json` 与 `sources/shared-space-static-acceptance-20261023.md`;仅更新VIS-011交流静图认可边界,相处、过渡、雾光、手机与真实人物动态仍待验收。
|
||||
|
||||
v1.10新增来源见 `sources/comment-evidence-dynamic-sample-20261023.json` 与 `sources/dynamic-sample-effect-acceptance-20261023.md`;对坐动态小样 v2 整体效果(演示层面)记入 VIS-011 与 CG-004 边界,手机真机、候选容器启用、真实人物动态与完整功能仍待验收。
|
||||
|
||||
main 当前仍为 v1.8(提交 `3a986726d8593e0ed2274f79db6cc5d807d2ebf0`);v1.9 与 v1.10 在待合并分支线(`agent/agent/54df81e610fd` → `agent/hel-811-handoff-f59f74dc4256` → 后续分支)上递进,合并入 main 由总管与白栖知决定。
|
||||
|
||||
后续以该入口所记录的最新版本为准,不把v1.7永久钉死为永不可新增的文档。每次新版本必须记录用户明确裁定,保留旧版来源与覆盖关系。
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"version": "1.8",
|
||||
"approval_comment_id": "01a163a5-e2a7-7ac8-afdb-991868e721bc",
|
||||
"version": "1.10",
|
||||
"approval_comment_id": "01a16810-3b46-7345-8966-dd87b76efe07",
|
||||
"owner_id": "e5c6c938-db48-4ff9-954f-4fb8b063a132",
|
||||
"scope": "完整要求;v1.8按用户明确指令新增视觉总监接手及必要代码职责,原58项和已批准边界继续有效,不证明功能已实现或已验收。",
|
||||
"requirements": [
|
||||
@@ -48,7 +48,7 @@
|
||||
"category": "产品",
|
||||
"topic": "交流镜头",
|
||||
"conclusion": "日常可看她在环境中生活;交谈时允许自然切近到同一人物、同一房间、同一套衣服的半身或脸部。",
|
||||
"boundary": "具体切镜方式和衔接效果仍要通过小样确认,不能据此认定用户接受突兀跳切。",
|
||||
"boundary": "具体切镜方式和衔接效果仍要通过小样确认,不能据此认定用户接受突兀跳切。对坐动态小样 v2 的推近/退回过渡已按评论 01a16810-3b46-7345-8966-dd87b76efe07 获认可(演示层面,人物为参考静帧);真实视频的切近衔接仍待验收。",
|
||||
"source_comment_ids": [
|
||||
"01a15724-dcaa-7d2b-ae23-430f24ca36b9",
|
||||
"01a15726-e178-72b0-9a3c-8b2041538730"
|
||||
@@ -501,7 +501,7 @@
|
||||
"category": "视觉",
|
||||
"topic": "人物独立视窗",
|
||||
"conclusion": "人物平时作为空间中独立视窗;交流时自然放大。已认可的人物位置、分量与首页文字分量沿用。",
|
||||
"boundary": "具体实现不得改变已确认体验;现有界面不等于用户最终满意。",
|
||||
"boundary": "具体实现不得改变已确认体验;现有界面不等于用户最终满意。交流状态静图已按评论 01a1668f-5810-7524-b72f-33574a32c7d6 认可为 HEL-798 共同空间构图;对坐动态小样 v2 的整体效果已按评论 01a16810-3b46-7345-8966-dd87b76efe07 认可(同室相处、推近/退回过渡、交流呈现与两主题,演示层面);手机候选容器默认关闭未获批启用,真实人物动态、语音口型、真实生活与完整功能仍待验收。",
|
||||
"source_comment_ids": [
|
||||
"01a15f09-db1e-705c-8baf-cde63c7651fb",
|
||||
"01a15f1f-5a71-783c-a458-b326a0073d69"
|
||||
|
||||
@@ -77,6 +77,27 @@
|
||||
"GOV-005"
|
||||
],
|
||||
"impact": "本项目本轮视觉设计、动效与相应代码责任转给视觉总监;不改现网、数据、全局模型或认证。"
|
||||
},
|
||||
{
|
||||
"version": "1.9",
|
||||
"approval_comment_id": "01a1668f-5810-7524-b72f-33574a32c7d6",
|
||||
"approved_by": "e5c6c938-db48-4ff9-954f-4fb8b063a132",
|
||||
"summary": "交流状态静态视觉基准更新:白栖知认可 HEL-798 共同空间交流静图(1600×1000,SHA256 a8619a1ff459ec1d28ec192104c851f6dee079c7b6056c1a927842591861a56a),在 VIS-011 边界注明。",
|
||||
"affected_ids": [
|
||||
"VIS-011"
|
||||
],
|
||||
"impact": "仅交流状态静图获认可:不用独立人物框,环境铺满四边,前景为用户一侧桌沿/茶杯/烛灯,对话在视线下方。相处状态、过渡与动态、雾光、手机、真实人物动态与完整功能仍待验收;不永久取消 VIS-011 在其他状态的原规则,不把完整前端锁定为全屏照片或视频(CG-031 继续有效)。来源:sources/comment-evidence-shared-space-20261023.json 与 sources/shared-space-static-acceptance-20261023.md(原话经总工 HEL-811 对照平台逐条核验)。"
|
||||
},
|
||||
{
|
||||
"version": "1.10",
|
||||
"approval_comment_id": "01a16810-3b46-7345-8966-dd87b76efe07",
|
||||
"approved_by": "e5c6c938-db48-4ff9-954f-4fb8b063a132",
|
||||
"summary": "对坐动态小样 v2 整体效果获认可:白栖知体验离线 HTML(SHA256 826bfc045d941c2114b16a198626ca952ff3d95dff02cfc6e32ee09858bcf80e)后回复“这个效果可以”;在 VIS-011 与 CG-004 边界注明演示层面的相处、推近/退回过渡、交流呈现与两主题认可。",
|
||||
"affected_ids": [
|
||||
"VIS-011",
|
||||
"CG-004"
|
||||
],
|
||||
"impact": "仅已交对坐动态小样的效果(电脑端、演示数据)。不视为完整产品、其余页面或真实功能验收;手机候选默认关闭未获批启用;相处静帧中的书本不恢复已否定的默认阅读(01a166aa);真实人物动态、语音口型、真实生活与完整功能仍待验收;不授权替换正式界面或合并 PR。来源:sources/comment-evidence-dynamic-sample-20261023.json 与 sources/dynamic-sample-effect-acceptance-20261023.md。"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -11,3 +11,23 @@ v1.7:把原始31项、已确认视觉和后续用户裁定整理到同一入
|
||||
白栖知明确裁定:整体视觉交给视觉总监接手,而不是把关,甚至若施工员无法写出相应代码,直接让视觉总监写代码
|
||||
|
||||
来源评论:`01a163a5-e2a7-7ac8-afdb-991868e721bc`。旧分工为总管因环境失败接手制作、后续视觉总监只把关;现按GOV-005交视觉总监亲自设计与落地,必要时直接写代码。本次不改变产品功能与原验收边界。
|
||||
|
||||
## v1.9:交流状态静态视觉基准更新
|
||||
|
||||
白栖知看过 HEL-798 共同空间样图后明确认可:**“静态效果我认可”**
|
||||
|
||||
来源评论:`01a1668f-5810-7524-b72f-33574a32c7d6`(获认可图 `hel-798-face-to-face-moon.png`,1600×1000,SHA256 `a8619a1ff459ec1d28ec192104c851f6dee079c7b6056c1a927842591861a56a`)。
|
||||
|
||||
旧要求(VIS-011):人物平时作为空间中独立视窗;交流时自然放大。新认可:交流状态(靛蓝月光、电脑 1600×1000)的静态画面不再用独立人物框,环境铺满四边,前景为用户一侧桌沿/茶杯/烛灯,对话在近处视线下方;VIS-011 条文保留,边界注明该更新。
|
||||
|
||||
影响范围:仅交流状态静图。相处状态、过渡与动态、雾光、手机、真实人物动态与完整功能仍待验收;不永久取消 VIS-011 其他状态原规则,不把完整前端锁定为全屏照片或视频(CG-031 继续有效)。原话与适用范围见 `sources/comment-evidence-shared-space-20261023.json`、`sources/shared-space-static-acceptance-20261023.md`(原话经总工 HEL-811 对照平台逐条核验)。
|
||||
|
||||
## v1.10:对坐动态小样整体效果认可
|
||||
|
||||
白栖知体验《对坐动态小样 v2》(HEL-799,附件 `01a167c1-455b-751a-ac37-9fa984a1ed10`,SHA256 `826bfc045d941c2114b16a198626ca952ff3d95dff02cfc6e32ee09858bcf80e`)后明确认可:**“这个效果可以”**
|
||||
|
||||
来源评论:`01a16810-3b46-7345-8966-dd87b76efe07`(2026-10-23 09:20:56 UTC,回应总管交付评论 `01a167c1-458d-795b-81e1-584089bf3667`)。
|
||||
|
||||
旧边界(v1.9):仅交流静图获认可,相处、过渡、雾光、手机与整体动态仍待验收。新认可:该小样的整体效果(同室相处、推近/退回过渡、交流呈现与阅读方式、月光/雾光两主题,电脑端演示数据)在演示层面获认可;VIS-011 与 CG-004 条文保留,边界注明。
|
||||
|
||||
影响范围:不视为完整产品、其余页面或真实功能验收;手机候选容器默认关闭未获批启用,真机未验证;相处静帧中的书本不恢复已否定的默认阅读(`01a166aa-5f37-77b2-a2bd-ceb62f665813`);真实人物动态、语音口型、真实生活与完整功能仍待验收;不授权替换正式界面或合并 PR。原话与适用范围见 `sources/comment-evidence-dynamic-sample-20261023.json`、`sources/dynamic-sample-effect-acceptance-20261023.md`(原话经总工 HEL-816 对照平台核验)。
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"baseline_version": "1.8",
|
||||
"baseline_version": "1.10",
|
||||
"items": [
|
||||
{
|
||||
"requirement_id": "CG-001",
|
||||
@@ -21,9 +21,11 @@
|
||||
},
|
||||
{
|
||||
"requirement_id": "CG-004",
|
||||
"status": "未完成或未整体验收;不得据旧样机或测试数字声称已满足",
|
||||
"evidence": [],
|
||||
"next_step": "按完整需求与接入批次落实,交付时补真实证据"
|
||||
"status": "小样演示层面的推近/退回切镜已获用户认可(01a16810);真实视频切近衔接仍待验收",
|
||||
"evidence": [
|
||||
"docs/requirements/changes.json v1.10(01a16810)"
|
||||
],
|
||||
"next_step": "真实视频入场/退出/往返衔接按 CG-030 首批小队与 HEL-803 条件承接,验证后另行验收"
|
||||
},
|
||||
{
|
||||
"requirement_id": "CG-005",
|
||||
@@ -249,9 +251,13 @@
|
||||
},
|
||||
{
|
||||
"requirement_id": "VIS-011",
|
||||
"status": "用户不满意当前对话与整体沉浸体验,独立小样待制作及验收",
|
||||
"evidence": [],
|
||||
"next_step": "本轮批准的界面动态小样"
|
||||
"status": "交流静图(HEL-798月光构图)与对坐动态小样 v2 整体效果(演示层面)已获用户认可;手机真机、候选容器启用、真实人物动态与完整功能仍待验收",
|
||||
"evidence": [
|
||||
"docs/requirements/changes.json v1.9(01a1668f)",
|
||||
"docs/requirements/changes.json v1.10(01a16810)",
|
||||
"prototypes/hel-799/(HEL-811 独立复核通过;v2 效果经白栖知体验认可)"
|
||||
],
|
||||
"next_step": "新素材(多时段天气穿搭、无书近景)按 HEL-802/803 承接;接入正式前端按 HEL-816 方案另行验收"
|
||||
},
|
||||
{
|
||||
"requirement_id": "VIS-012",
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
| CG-001 | 未完成或未整体验收;不得据旧样机或测试数字声称已满足 | 按完整需求与接入批次落实,交付时补真实证据 |
|
||||
| CG-002 | 未完成或未整体验收;不得据旧样机或测试数字声称已满足 | 按完整需求与接入批次落实,交付时补真实证据 |
|
||||
| CG-003 | 未完成或未整体验收;不得据旧样机或测试数字声称已满足 | 按完整需求与接入批次落实,交付时补真实证据 |
|
||||
| CG-004 | 未完成或未整体验收;不得据旧样机或测试数字声称已满足 | 按完整需求与接入批次落实,交付时补真实证据 |
|
||||
| CG-004 | 小样演示层面的推近/退回切镜已获用户认可(01a16810);真实视频切近衔接仍待验收 | 真实视频入场/退出/往返衔接按 CG-030 首批小队与 HEL-803 条件承接,验证后另行验收 |
|
||||
| CG-005 | 未完成或未整体验收;不得据旧样机或测试数字声称已满足 | 按完整需求与接入批次落实,交付时补真实证据 |
|
||||
| CG-006 | 未完成或未整体验收;不得据旧样机或测试数字声称已满足 | 按完整需求与接入批次落实,交付时补真实证据 |
|
||||
| CG-007 | R1 已有相关实现与测试交付,尚不能认定整项已由用户验收 | 按完整需求与接入批次落实,交付时补真实证据 |
|
||||
@@ -45,7 +45,7 @@
|
||||
| VIS-008 | 用户不满意当前对话与整体沉浸体验,独立小样待制作及验收 | 本轮批准的界面动态小样 |
|
||||
| VIS-009 | 用户不满意当前对话与整体沉浸体验,独立小样待制作及验收 | 本轮批准的界面动态小样 |
|
||||
| VIS-010 | 用户不满意当前对话与整体沉浸体验,独立小样待制作及验收 | 本轮批准的界面动态小样 |
|
||||
| VIS-011 | 用户不满意当前对话与整体沉浸体验,独立小样待制作及验收 | 本轮批准的界面动态小样 |
|
||||
| VIS-011 | 交流静图(HEL-798月光构图)与对坐动态小样 v2 整体效果(演示层面)已获用户认可;手机真机、候选容器启用、真实人物动态与完整功能仍待验收 | 新素材(多时段天气穿搭、无书近景)按 HEL-802/803 承接;接入正式前端按 HEL-816 方案另行验收 |
|
||||
| VIS-012 | 用户不满意当前对话与整体沉浸体验,独立小样待制作及验收 | 本轮批准的界面动态小样 |
|
||||
| VIS-013 | 用户不满意当前对话与整体沉浸体验,独立小样待制作及验收 | 本轮批准的界面动态小样 |
|
||||
| AM-001 | 未完成或未整体验收;不得据旧样机或测试数字声称已满足 | 按完整需求与接入批次落实,交付时补真实证据 |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# CyberGril 完整当前需求 · v1.8
|
||||
# CyberGril 完整当前需求 · v1.10
|
||||
|
||||
完整要求;版本1.8保留原完整要求并新增用户明确的视觉总监接手分工,不证明已实现或已验收。
|
||||
完整要求;版本1.10在v1.9(交流静图认可)之上,把白栖知已体验的对坐动态小样 v2 整体效果(演示层面)记入 VIS-011 与 CG-004 边界;不证明其余页面、真实功能或完整产品已验收。
|
||||
|
||||
## 阅读与效力
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
日常可看她在环境中生活;交谈时允许自然切近到同一人物、同一房间、同一套衣服的半身或脸部。
|
||||
|
||||
边界:具体切镜方式和衔接效果仍要通过小样确认,不能据此认定用户接受突兀跳切。
|
||||
边界:具体切镜方式和衔接效果仍要通过小样确认,不能据此认定用户接受突兀跳切。对坐动态小样 v2 的推近/退回过渡已按评论 01a16810-3b46-7345-8966-dd87b76efe07 获认可(演示层面,人物为参考静帧);真实视频的切近衔接仍待验收。
|
||||
|
||||
来源评论:`01a15724-dcaa-7d2b-ae23-430f24ca36b9`、`01a15726-e178-72b0-9a3c-8b2041538730`。
|
||||
|
||||
@@ -354,7 +354,7 @@
|
||||
|
||||
人物平时作为空间中独立视窗;交流时自然放大。已认可的人物位置、分量与首页文字分量沿用。
|
||||
|
||||
边界:具体实现不得改变已确认体验;现有界面不等于用户最终满意。
|
||||
边界:具体实现不得改变已确认体验;现有界面不等于用户最终满意。交流状态静图已按评论 01a1668f-5810-7524-b72f-33574a32c7d6 认可为 HEL-798 共同空间构图;对坐动态小样 v2 的整体效果已按评论 01a16810-3b46-7345-8966-dd87b76efe07 认可(同室相处、推近/退回过渡、交流呈现与两主题,演示层面);手机候选容器默认关闭未获批启用,真实人物动态、语音口型、真实生活与完整功能仍待验收。
|
||||
|
||||
来源评论:`01a15f09-db1e-705c-8baf-cde63c7651fb`、`01a15f1f-5a71-783c-a458-b326a0073d69`。
|
||||
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"task": "HEL-811 总工独立复核 HEL-799 共同空间动态小样 v2,并机械保全原稿入库;本文件为总工交接(原作者 handoff 原样保全于 prototypes/hel-799/handoff-hel-799.json)",
|
||||
"baseline_version": "1.9",
|
||||
"read_commit": "3a986726d8593e0ed2274f79db6cc5d807d2ebf0",
|
||||
"read_notes": [
|
||||
"v1.8(59项)全文与 sources/ 于提交 3a986726 完整读取;总工本轮以平台原话核验静态认可来源后,按治理规则升版 v1.9(仅 VIS-011 边界注明交流静图认可),来源原话进 sources/ 并写入 source-manifest。",
|
||||
"与原作者 handoff 的差异仅在 baseline_version(原作者交付时为 1.8,当时静态认可评论尚未进入正式 sources,handoff 机械检查因此失败);内容性字段未改动原作者判断,验收结论以本文件与 HEL-811 审核记录为准。"
|
||||
],
|
||||
"requirement_ids": ["CG-002", "CG-003", "CG-004", "CG-008", "CG-017", "CG-018", "CG-023", "CG-024", "CG-025", "CG-026", "CG-028", "CG-029", "CG-030", "CG-031", "VIS-001", "VIS-002", "VIS-003", "VIS-004", "VIS-005", "VIS-006", "VIS-007", "VIS-008", "VIS-009", "VIS-010", "VIS-011", "VIS-012", "VIS-013", "UX-001", "UX-002", "UX-003", "UX-005", "UX-006", "AM-001", "AM-002", "AM-003", "GOV-001", "GOV-002", "GOV-003", "GOV-004", "GOV-005", "DEL-001"],
|
||||
"deliverable": "(1)HEL-811 审核记录(附件):41 项独立复测、逐字节重建核验、像素级对照、素材与母版核验、用户原话平台核验;(2)分支 agent/agent/54df81e610fd:prototypes/hel-799/ 23 个交付文件逐字节保全+PROVENANCE.md(来源附件、zip 与逐文件 SHA256、独立重建结果);docs/requirements 升版 v1.9(sources 两件新增、source-manifest、baseline/current/changes/coverage 同步);未动 web/public/assets(哈希与仓库一致)、未动 PR#4/#6/#8、未合并、未部署。",
|
||||
"acceptance": [
|
||||
"独立构建:以仓库资产用独立实现的构建脚本重建 index.html,662,233 字节,SHA256 826bfc045d941c2114b16a198626ca952ff3d95dff02cfc6e32ee09858bcf80e,与交付 HTML 逐字节一致;zip 内 HTML/上传附件/重建结果三者相同。",
|
||||
"UI 为真实元素:2 张获批静帧图层层叠 4 坌 canvas 与 24 个按钮、表单、浮层,非整图贴底。",
|
||||
"行为独立复测 40/41 通过(无头 Chromium 151,Playwright,真实键鼠事件):镜头渐进、无黑帧、照片仅等比缩放平移、中途反向不跳回、Esc/←/→ 14–36ms(<80ms)且有限动画为 0、自动续读到末句、全文与原文一致、暂停/回看/回到进度、发送恢复自动、身份标记、停止保留并标未完成、记录打开她留在桌对面且关闭回原句、入口均打开带演示/尚未接入标记、语音演示不申请麦克风、两主题结构一致、七种视口长回复无遮挡、长名字以省略号收纳、减少动效原位交叉淡化且雨停一帧、档 2 无逐帧遮罩、页面隐藏暂停(body.suspended、CSS 动画 paused、阅读计时冻结并于恢复后续走;合成 visibilitychange 事件,非 OS 级后台节流)。",
|
||||
"像素级对照:我的运行 vs 作者证据(同状态均值差 9.5,差异集中于雨/热气动画区);我的交流态 vs 获认可静图(均值差 9.9,差异集中于文案与阅读控制区,场景区一致);母版几何核验(16:9 候选底板=16:10 底板等比高度铺满右移 112px,与声明的 ~113px 一致;含前景母版 vs 获认可静图均值差 5.0;无前景底板差异集中在底部前景区)。",
|
||||
"手机 4:5 候选容器:390×844=390×487.5、320×568=320×328、390×430=390×374 与 HEL-802 v2 容器公式一致;脸中心实测 (170,157)/(143,105)/(176,120) 复现作者数字,与 16:9 公式差 7–11px(源为 16:10 获认可构图,可见宽 50% vs 45%,非等价,待新 CT 素材后重算);键盘态最近回复覆盖容器底部 80–128px(内容长度相关),脸与下巴不被遮;默认关闭、桌面不受影响、界面未把候选升格为用户选择。",
|
||||
"用户原话核验:records 五条与 01a166aa/01a16699/01a1669d/01a166ad 均经 CLI 对照平台逐条一致(作者、时间、原话、父评论)。"
|
||||
],
|
||||
"deferred": [
|
||||
"Firefox 未测:本运行时无法启动(缺 GTK3 链库且系统 NSS 最高 3.98 < 所需 3.101,无 root 无法补装);Safari/WebKit 无浏览器。真机软键盘、真实 GPU 帧率、低端手机未测;帧率参考值来自无头软件光栅,不代表真机。",
|
||||
"候选容器底部露出旧书与居家裤(获认可构图 y≥0.80 原被页面桌沿遮挡)与推近途中远景静帧的书/腿:属明确素材依赖(按 HEL-802 v2 生成新 CT),非界面遮盖问题;320 偏挤为已预判的已知密度;真实软键盘未知。",
|
||||
"相处、过渡、雾光、手机与整体动态均未经白栖知验收;真实视频入场/退出、循环三圈、同脸同衣同光、LIVE 接管与端到端延迟未验证(CG-030 首批小队承接)。本审核通过不等于用户验收或项目完成。",
|
||||
"总工无法人眼审图(运行时模型不支持图片输入):视觉判断基于像素统计、几何复算与代码核对,截图证据供总管与用户人眼复核。"
|
||||
],
|
||||
"requirement_changes": [
|
||||
{
|
||||
"approval_comment_id": "01a1668f-5810-7524-b72f-33574a32c7d6",
|
||||
"approved_by": "e5c6c938-db48-4ff9-954f-4fb8b063a132",
|
||||
"quote": "静态效果我认可",
|
||||
"kind": "交流静态视觉基准的更新",
|
||||
"affected_ids": ["VIS-011"],
|
||||
"old": "VIS-011:人物平时作为空间中独立视窗;交流时自然放大。",
|
||||
"new": "交流状态(靛蓝月光、电脑 1600×1000)的获认可静态画面为 HEL-798 共同空间构图:无独立人物框,环境连续到四边,前景桌沿/茶杯/烛灯,中间是她,远处雨夜窗景,对话在近处视线下方。",
|
||||
"scope": "仅交流状态静图。相处状态、过渡与动态、雾光、手机、真实人物动态和完整功能仍待验收;不永久取消 VIS-011 在其他状态中的原规则(CG-031 继续有效)。",
|
||||
"evidence_file": "docs/requirements/sources/comment-evidence-shared-space-20261023.json",
|
||||
"image_sha256": "a8619a1ff459ec1d28ec192104c851f6dee079c7b6056c1a927842591861a56a"
|
||||
}
|
||||
],
|
||||
"verification": [
|
||||
"python3 scripts/check_requirements.py --base-ref origin/main:通过(v1.9 升版、来源追加、历史保留)。",
|
||||
"python3 scripts/check_requirements.py --base-ref origin/main --handoff docs/requirements/handoff-HEL-811.json:通过。原作者 handoff(baseline 1.8)按预期报『交接使用过期基准』,原件未改动,差异见 read_notes。",
|
||||
"git diff --check:通过。逐字节重建与哈希清单见 prototypes/hel-799/PROVENANCE.md;行为复测明细见 HEL-811 审核记录附件。"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"task": "HEL-816 总工:记录对坐动态小样 v2 效果认可(升版 v1.10),核对现有真实功能与 PR 状态,交完整界面与真实功能接续方案;本文件为总工交接",
|
||||
"baseline_version": "1.10",
|
||||
"read_commit": "e04e258cc0c6ae097f57a4bd2c41a95a1bc6baa8",
|
||||
"read_notes": [
|
||||
"完整需求 v1.9(59项)与 sources/ 于待合分支线提交 e04e258(agent/hel-811-handoff-f59f74dc4256,含总工 HEL-811 保全 ad6a3b1 与总管版本说明修正)完整读取;origin/main 仍为 3a986726(v1.8),两者关系已在 README.md 说明。",
|
||||
"总工本轮以 CLI 对照平台核验新认可原话(01a16810,作者、时间、原话逐字一致)后,按治理规则升版 v1.10(仅 VIS-011 与 CG-004 边界注明小样演示层面认可),来源原话进 sources/ 并写入 source-manifest;未改任何条文结论、历史来源与产品代码。"
|
||||
],
|
||||
"requirement_ids": ["CG-001", "CG-002", "CG-003", "CG-004", "CG-005", "CG-006", "CG-007", "CG-008", "CG-009", "CG-010", "CG-011", "CG-012", "CG-013", "CG-014", "CG-015", "CG-016", "CG-017", "CG-018", "CG-019", "CG-020", "CG-021", "CG-022", "CG-023", "CG-024", "CG-025", "CG-026", "CG-027", "CG-028", "CG-029", "CG-030", "CG-031", "VIS-001", "VIS-002", "VIS-003", "VIS-004", "VIS-005", "VIS-006", "VIS-007", "VIS-008", "VIS-009", "VIS-010", "VIS-011", "VIS-012", "VIS-013", "AM-001", "AM-002", "AM-003", "UX-001", "UX-002", "UX-003", "UX-004", "UX-005", "UX-006", "GOV-001", "GOV-002", "GOV-003", "GOV-004", "GOV-005", "DEL-001"],
|
||||
"deliverable": "(1)需求治理:sources/ 新增 comment-evidence-dynamic-sample-20261023.json 与 dynamic-sample-effect-acceptance-20261023.md(原话、附件 ID、SHA256、旧/新范围、待实证项),升版 v1.10(VIS-011、CG-004 边界,changes/coverage/README 同步),main 与待合分支关系写入 README;(2)核对:main=3a98672(v1.8,无 R1 代码);PR#4=db571ba(HEL-780 真实档案+流式文字、HEL-783 修复,基点 4984293,未合);PR#6=ca5ddd6(HEL-790 旧小样,基点 4242f83,未合);PR#8=21170f9(HEL-793/795 沉浸对话原型,基点 81d7cb5,未合);8310 实际运行 release r2-20261022-1808-db571ba(=PR#4 head),/api/health 正常、仅 text 能力为真、companion 已创建(未读取档案内容);(3)接续方案《HEL-816 接续方案》(本卡附件):接缝清单、可机械复用/须视觉总监亲自的划分、下一批有限施工提案与验收样例、备份回退、须白栖知拍板项。未写产品代码、未部署、未合并 PR、未动 8300/8310 与用户数据。",
|
||||
"acceptance": [
|
||||
"原话核验:01a16810-3b46-7345-8966-dd87b76efe07(member e5c6c938,2026-10-23T09:20:56Z,根评论,内容『这个效果可以』)与交付评论 01a167c1-458d(2026-10-23T07:54:41Z,附件 01a167c1-455b)经 multica CLI 对照平台一致;HTML 附件下载后 SHA256=826bfc045d941c2114b16a198626ca952ff3d95dff02cfc6e32ee09858bcf80e,与仓库 prototypes/hel-799/index.html 及 HEL-811 重建记录逐字节一致。",
|
||||
"PR 状态核验:以 git 提交图核实 pr4=db571ba(2 提交,merge-base 4984293)、pr6=ca5ddd6(merge-base 4242f83)、pr8=21170f9(2 提交,merge-base 81d7cb5)均不在 main 历史内(merge-base --is-ancestor 复核);Multica 主卡/旧主卡链接表无关联 PR;本环境无 Gitea 令牌,PR 开合状态以平台页面为准,未擅合。",
|
||||
"服务只读核查(2026-10-23T09:33:44–55Z UTC,经既有授权 SSH 最小读取):.12 端口 8300/8310/8090/8010 均 LISTEN;/opt/cybergril-api/current→releases/r2-20261022-1808-db571ba;systemd active;GET /api/health 返回 ok、version R1、epoch 3、companion_created true、llm ok(halogen-qwen3.8-flash-next)、capabilities 仅 text=true。未读聊天正文与档案内容,未输出凭据。",
|
||||
"方案边界:提案不把外观换版与新增后端绑成巨型施工;不以口型未成阻塞完整前端;R1→R2/R3→R4、R5/R6 依赖 R1、R7 需授权的顺序保持;AM-001/002/003 与出生底色/记忆/关系守卫、演示与真实数据隔离逐条列入各批验收。"
|
||||
],
|
||||
"deferred": [
|
||||
"真实生活循环、记忆、主动联系、语音(R5 复用 /opt/voice-agent 底座需实测)、天气素材(R6)、全量备份、授权视觉观察(R7):均未实现未验证,按批次承接;R1 人格当前仅浅模板(系统提示组装),CG-014/015 的诠释自由与成长分层不足,保留为后续批次要求。",
|
||||
"视频日常→回应→交谈→退出→日常的同人同衣同光首尾对齐:无任何真实验证;缺生成工具与首尾可控能力,最低输入清单已在方案中列出(按 HEL-802 v2 母版/提示词、HEL-803 衔接条件),首批责任在小队(CG-030)不转给用户;未安装/付费/换模型。",
|
||||
"手机候选 4:5 容器与手机真机体验:默认关闭未获批启用,真机键盘/流畅度未测;Firefox/Safari 未测(HEL-811 已记录精确原因)。",
|
||||
"v1.9+v1.10 均在待合分支线(ad6a3b1→e04e258→本分支),main 仍 v1.8;本环境无 Gitea 令牌无法开 PR,合并与否由总管与白栖知决定。"
|
||||
],
|
||||
"requirement_changes": [
|
||||
{
|
||||
"approval_comment_id": "01a16810-3b46-7345-8966-dd87b76efe07",
|
||||
"approved_by": "e5c6c938-db48-4ff9-954f-4fb8b063a132",
|
||||
"quote": "这个效果可以",
|
||||
"kind": "对坐动态小样整体效果认可",
|
||||
"affected_ids": ["VIS-011", "CG-004"],
|
||||
"old": "v1.9:仅交流静图获认可;相处状态、过渡、雾光、手机与真实人物动态仍待验收。",
|
||||
"new": "对坐动态小样 v2 整体效果(同室相处、推近/退回过渡、交流呈现与阅读方式、月光/雾光两主题;电脑端、演示数据)在演示层面获认可。",
|
||||
"scope": "不视为完整产品、其余页面或真实功能验收;手机候选默认关闭未获批启用;相处静帧中的书本不恢复已否定的默认阅读(01a166aa);真实人物动态、语音口型、真实生活与完整功能仍待验收;不授权替换正式界面或合并 PR。",
|
||||
"evidence_file": "docs/requirements/sources/comment-evidence-dynamic-sample-20261023.json",
|
||||
"artifact_sha256": "826bfc045d941c2114b16a198626ca952ff3d95dff02cfc6e32ee09858bcf80e"
|
||||
}
|
||||
],
|
||||
"verification": [
|
||||
"python3 scripts/check_requirements.py --base-ref origin/main:通过(59项;v1.10 升版、来源追加、历史保留、新批准评论未复用)。",
|
||||
"python3 scripts/check_requirements.py --base-ref origin/main --handoff docs/requirements/handoff-HEL-816.json:通过。",
|
||||
"git diff --check:通过。产品代码零改动(diff 仅 docs/requirements 与本文件)。"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"task": "HEL-821 视觉总监:A1+A2 把对坐场景(hel-799 scene/ambient/room)和完整对话呈现接入正式 React 前端;本文件为视觉总监交接(额度中断后恢复续交)",
|
||||
"baseline_version": "1.10",
|
||||
"read_commit": "63799f02474ed94fd793de9e2360d185c878165d",
|
||||
"read_notes": [
|
||||
"无 git 环境:需求与 prototypes/hel-799 读自总管机械包《CyberGril-A批施工基底-PR4与需求v1.10.zip》(SHA256 0c5b1665048960b3102216a834e26791dee2f665b467d49e62bfb50319f3c138),其 SOURCE-BUNDLE-PROVENANCE.json 记 requirements_and_hel799_source=63799f0、product_base=db571ba(PR#4 head)。非独立 checkout;origin/main 仍 3a986726(v1.8)。",
|
||||
"需求文件随包置于 docs/requirements(v1.10,59项)。原运行开工阅读范围以其执行记录为准;本次恢复复读 README.md、task-handoff-template.md、handoff-HEL-816.json、sources/shared-space-static-acceptance-20261023.md,并对照 issue 原文逐条核对本卡七项施工要求。current/coverage/changes 全文须审核时对照原话复核;附件 emil 动效参考(animate/MAIN、RECIPES、review-animations/MAIN、STANDARDS)仅作参考,未安装或改动运行时技能。包内无仓库根 AGENTS.md 与 scripts/,未能读取/运行,交总工在仓库内补。",
|
||||
"施工授权:主卡 HEL-797 白栖知评论 01a169a8-5884-7c26-a00f-c23a5f5399a9『继续吧,现在没什么主要的内容需要我确认的』,回应总管提案 01a16851-302d-75ef-9e8f-cf1719998076。这是本轮前端施工授权,不是真实能力验收或旧产品规则修改。"
|
||||
],
|
||||
"requirement_ids": ["CG-002", "CG-004", "CG-006", "CG-007", "CG-010", "CG-012", "CG-013", "CG-014", "CG-015", "CG-018", "CG-024", "CG-029", "CG-030", "CG-031", "VIS-001", "VIS-002", "VIS-003", "VIS-004", "VIS-005", "VIS-006", "VIS-007", "VIS-008", "VIS-009", "VIS-010", "VIS-011", "VIS-012", "VIS-013", "UX-001", "UX-002", "UX-003", "UX-005", "UX-006", "AM-001", "AM-002", "AM-003", "GOV-001", "GOV-002", "GOV-003", "GOV-004", "GOV-005", "DEL-001"],
|
||||
"deliverable": "正式 React 源码(基于 PR#4 db571ba,未合并、未改 main):A1 新增 web/src/stage/camera.ts(同脸对齐的单相机、对数缩放、可打断临界阻尼弹簧)、roomScene.ts(逐帧只写 transform/opacity,推近/退回、反向保留速度、减少动效改为静置交叉淡入、自动降级档、页面隐藏暂停)、ambient.ts(窗内雨、城市灯、近景桌面,两主题材质光线不同),Presenter.tsx 改为共享空间三层;shared/space.ts 把此刻/交谈/记录/面板映射到空间并管理焦点;shared/motion.ts 键盘快照(即时落位);tokens.css/components.css 落 hel-799 room/talk/nav/pane 样式。A2 新增 web/src/chat/reading.ts(按轮分组、一两句分页、字素安全、无标点长句也断、流式最新一句先压住、阅读位置用文本锚点)、lineStage.ts(已显示的句子不重渲染不重播,墨入每句只播一次);ChatPanel.tsx 在原 RealChatAdapter/TurnGate/epoch/AbortController 数据流上接自动续读、暂停/上一句/下一句/回到读到的地方、全文、完整记录、身份标签、取消保留未完片段并标『未完成 · 已取消』。App.tsx/RealApp.tsx 接空间、Esc 逐层、导航直接切换;删除不再使用的 shared/SoftText.tsx;浏览器检查脚本迁到新选择器。",
|
||||
"acceptance": [
|
||||
"相处↔交流同一空间:点她或『和她说话』推近,『结束交谈』/Esc 退回;Esc 即时落位,鼠标/点击走约0.85s弹簧,中途反向不跳(camera-in-reverse-esc-1600-moon.webm)。",
|
||||
"两主题同结构:月光/雾光切换只换材质、光线、雨色与玻璃,不改布局(desk-1600-moon/fog-*)。",
|
||||
"交流:一次一两句,长回复自动完整续读;暂停后 ←/→/按钮即时回看无动画,『回到读到的地方』回到进度;全文与完整记录可读全部内容;『你』与实际名字区分;停止回复保留已生成部分并标未完成,未存入记录。",
|
||||
"流式增长不重置阅读位置、不改已显示句子(reading.test.ts 流式只追加用例);历史恢复按 sessionStorage 轮次锚点;快速取消后新轮与旧轮迟到事件由 TurnGate/epoch 过滤。",
|
||||
"演示 ?demo=1 独立 localStorage、零网络;真实模式不读演示数据(rework_browser_check.py 断言);未改 API 协议、SQLite、后端。",
|
||||
"浮层打开时导航可见可直接切换(.nav z25 高于 .record z20/21);Esc 顺序:模态→全文→记录→退回空间;全文关闭焦点回『全文』,记录关闭焦点回记录按钮;普通面板 240ms 进入,不沿用空间长转场。",
|
||||
"布局:1600×1000、1024、390×844、320×568、390×430 键盘等效下长中文与无标点长句不溢出,舞台/阅读条/输入/导航不重叠(check/shots/*.json 几何报告)。"
|
||||
],
|
||||
"deferred": [
|
||||
"构建与测试未运行:本机无 Node/npm/git/Python。须总工在既有 Linux 环境执行 npm ci、npm run typecheck、npm run build、npm run lint、npm test(含新 reading.test.ts)、Playwright 三份浏览器检查、python3 scripts/check_requirements.py --base-ref origin/main 及 --handoff、git diff --check。",
|
||||
"check/ 证据为静态 harness:产品 CSS + 剥类型后的控制器 + 静态 DOM,用 Edge CDP 截图/录屏;不是正式 React 运行,也未跑真实 SSE;录屏帧率不代表产品 GPU 性能。",
|
||||
"rework_browser_check.py 本次恢复后才迁移(原运行未迁),未执行;lineStage 墨入每句只播一次为本次恢复时新增修正,未进 harness 录屏。",
|
||||
"A3 其余页面(日子/回忆/创建/设置按 HEL-815 稿)未改,保持原功能与入口。",
|
||||
"人物仍为旧参考静帧,推近是镜头不是人物动作;新日常视频、首尾衔接、真实口型、语音、天气、生活、记忆、备份、视觉观察均未接入(R1 人格深度、R2–R7 继续承接);手机 4:5 候选默认关闭;真机/Safari/Firefox/读屏未测。"
|
||||
],
|
||||
"requirement_changes": [],
|
||||
"verification": [
|
||||
"未执行:tsc/vite build/vitest/eslint/Playwright/check_requirements/git diff --check(缺工具,如实交总工)。",
|
||||
"人工静态复核(本次恢复):base 对 orig 逐文件 SHA256 比对得 13 改、8 增(另加本交接 JSON)、1 删,逐文件哈希见包内 CHANGES.json;全部相对 import 可解析,无残留 SoftText 引用;tsconfig ES2022 覆盖 Array.at 与 Intl.Segmenter。",
|
||||
"原运行 harness 证据:check/shots 桌面两主题与 390/320/390×430 截图及几何 JSON;check/rec 三段 webm(进出、快速反向+Esc、手机进出)。"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"task": "HEL-822 总工:HEL-821 A1+A2 源码机械落库、Linux 构建、四份浏览器检查、真实SSE独立审核;因发现必须修复项未部署",
|
||||
"baseline_version": "1.10",
|
||||
"read_commit": "63799f02474ed94fd793de9e2360d185c878165d",
|
||||
"read_notes": "需求/治理文件与 63799f0 字节核对一致;产品基底 db571ba(PR#4 head,refs/pull/4/head 复核仍指向 db571ba);origin/main 3a986726(v1.8)。",
|
||||
"requirement_ids": ["CG-002", "CG-004", "CG-018", "CG-024", "CG-031", "VIS-003", "VIS-004", "VIS-007", "VIS-011", "VIS-013", "UX-001", "UX-002", "UX-005", "UX-006", "AM-001", "AM-002", "AM-003", "GOV-001", "GOV-002", "GOV-003", "GOV-004", "GOV-005", "DEL-001"],
|
||||
"deliverable": "候选分支 hel-822-candidate(自 db571ba):核验作者包 SHA256 后按 CHANGES.json 落库 13改/8增(另交接JSON)/1删,全部哈希一致;docs/requirements v1.10 与 prototypes/hel-799 字节等于治理提交 63799f0;补齐根 AGENTS.md 与 scripts/check_requirements.py。审核侧最小机械检查修正 3 处(browser_check 视觉观察(模拟)选择器、import_check 脏表单离开确认处理、rework_browser_check 长用户句预算60s/条件续读/紧凑打字沉降600ms)并附本机全部运行证据。",
|
||||
"acceptance": [
|
||||
"机械落库核验:ZIP 250条反斜杠路径规范化解包零越界;CHANGES 23条前后哈希全部复算一致;git status 恰为23条变更+治理增补。",
|
||||
"构建:npm ci/typecheck/lint/test/build 全过(lint 1条既有模式警告);vitest 22/22 含新 reading.test.ts 8条。",
|
||||
"后端:Python 3.12 下 142/142 通过;本机默认 3.10 缺 asyncio.timeout(pyproject 要求≥3.11)致 8 条流式相关测试失败,基底 db571ba 同样失败,属环境非回归。",
|
||||
"浏览器检查:browser_check 16/16、import_check 7/7、real_browser_check 全过(真实网关3轮真实SSE、取消、重启epoch 1→2、移动端、受控错误重试,隔离临时库);rework_browser_check 前3节过后被下方问题1阻塞(本地绕过后12视口节通过)。",
|
||||
"check_requirements 对 origin/main 与实际候选目标 origin/agent/agent/de8874a3803b 均通过(59项);git diff --check 干净。",
|
||||
"代码卫生:无硬编码密钥/console残留/debugger;reduced-motion 全局处理;hover 动效均以 (hover:hover) and (pointer:fine) 门控。"
|
||||
],
|
||||
"deferred": [
|
||||
"未部署:审核发现2项必须修复问题(见评论),按卡交总管退回原作者返工后复审一次。",
|
||||
"候选 PR 未开:Gitea ssh 远端无 CLI/API 凭据,分支 hel-822-candidate 已推送,开 PR 需总管经 Web/API 以 base=agent/agent/de8874a3803b 操作。",
|
||||
"真机/Safari/Firefox/读屏未测;录屏fps不代表GPU流畅度;人物仍为参考静帧;R1人格深度与R2–R7、A3页面(HEL-815稿)继续承接。"
|
||||
],
|
||||
"requirement_changes": [],
|
||||
"verification": [
|
||||
"真实SSE证据:real_browser_check 全部PASS输出(含 REAL_REPLY 蓝色风铃 两轮上下文召回、取消后无完整assistant行、epoch重启、390×844移动端)。",
|
||||
"问题1证据:390×420 紧凑高度下聚焦输入后点击发送,click 事件落点 SECTION.conversation(trusted click 捕获),草稿未发出;先blur再点击则命中。发送失败连锁导致 rework 检查 390×420 节全文本按钮永不出现。",
|
||||
"问题2证据:受控慢流取消→立即新轮后,阅读停在用户句约10–15秒(dwell 多次被重置,进度条读数 0.06→0.93 证据),随后自行恢复推进到『答复』。",
|
||||
"本审核机环境:uv 安装 Python 3.12.14 于 .venv312(项目依赖+playwright);系统 Chromium 经 LD_LIBRARY_PATH=~/pwlibs 与 FONTCONFIG_FILE 启动。"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"task": "HEL-823 视觉总监:把 HEL-815 的日子、已分享生活详情、共同回忆、首次创建、设置管理完整页面接到正式 React 产品(A3)",
|
||||
"baseline_version": "1.10",
|
||||
"read_commit": "cef8ae5581f68ae81991533698ef05abcb82e659",
|
||||
"read_notes": "唯一施工基底为远端 hel-822-candidate 提交 cef8ae5(总管 git archive 附件 HEL-823-A3-base-cef8ae5.zip,SHA256 245dab3f124c0c987a322c4dd788dbb7e7f5e24c4fb96f9eb50f4ec6c61a3894,本机复算一致)。本机实际阅读该包内根 AGENTS.md、docs/requirements/README.md、current.md(v1.10,59项)、coverage.md、changes.md、task-handoff-template.md、handoff-HEL-824.json,并按编号核对 CG-006/007/012–016/018/024/029–031、VIS-001–013、AM-001–003、UX-001–006、GOV-001–005、DEL-001 原文与边界。页面设计依据为本人 HEL-815 原稿附件 01a16845-b50a-7335-a87e-61bf11c44703(README、src/pages.js、boards/01)。授权原话:主卡评论 01a169a8-5884-7c26-a00f-c23a5f5399a9「继续吧,现在没什么主要的内容需要我确认的」。模板里的旧 1.7 字样不覆盖当前入口 v1.10。",
|
||||
"requirement_ids": ["CG-006", "CG-007", "CG-012", "CG-013", "CG-014", "CG-015", "CG-016", "CG-018", "CG-024", "CG-029", "CG-030", "CG-031", "VIS-001", "VIS-002", "VIS-003", "VIS-004", "VIS-005", "VIS-006", "VIS-007", "VIS-008", "VIS-009", "VIS-010", "VIS-011", "VIS-012", "VIS-013", "AM-001", "AM-002", "AM-003", "UX-001", "UX-002", "UX-003", "UX-004", "UX-005", "UX-006", "GOV-001", "GOV-002", "GOV-003", "GOV-004", "GOV-005", "DEL-001"],
|
||||
"deliverable": "在 cef8ae5 上改 web 下 15 个文件(10 个源码、5 个测试)、新增本交接,无删除(清单与前后哈希见 CHANGES-HEL-823.json)。(1) web/src/life/LifePanel.tsx 重写为 HEL-815 日子页:标题区「她的日子 / 我们的回忆」+ 宽屏「日子 · 演示数据」/ ≤1100「她此刻 · …」;页签行附说明;列表按「她说过的打算」置顶、其余按日分组,行=时间·状态点(实心已发生/呼吸点正在/虚线打算)·标题·一句摘要·少量标签;分页「看更早的日子」→ 加载中 → 到底「再往前,就是她刚住进来的那天了」;演示失败开关下的读取失败卡与「再试一次」(加载骨架);空状态(首晚 / 真实后台未接)。详情:类别·时间·地点、何时告诉你、带身份的她的原话、关联回忆卡、那时候的聊天(只取已通过 publicView 的消息)、「在交谈里看这段」、演示说明。回忆四组带计数,详情「她是这样记得的」、成长注明不改写底色并可跳到设置·她、来自这些日子的反链或说明。任何解析不到的选择(过期、删除或从未讲过)统一显示「这一条现在打不开」,不暗示记录存在。每个页签保留自己的滚动位置,面板隐藏再打开(交谈返回日子)恢复;手机 Esc 先关推入详情。(2) web/src/manage/CreationWizard.tsx:左侧叙事随步骤与创建中/失败/完成变化;名字为空并有占位,错误时焦点落到出问题的字段(名字/生日/关系);生日「随机生成 / 我来指定」(默认随机一个满 19–35 岁的生日,可再随机;手动改日期或时辰即为指定);关系改为两张说明卡且不预选;新增可选相处边界(后端 CreationInput 已接受 boundary,未改 API);汇总含边界;创建中提示、失败「返回修改 / 再试一次」资料保留;真实 409「已经有一位她」时禁用再次创建并提供「重新打开,恢复已有的她」(只 reload,不覆盖);完成页「第一晚」。(3) web/src/manage/ManagePanel.tsx:分区列表加能力说明与手机推入箭头、底注「首版只有一位她 · 没有重建或清空」;分区标题旁能力标签(只读/可以调整/演示数据/未接入/文字已接通/本机生效);「她」改为名字只读+生辰只读、底色(沿用 BaseColor 真实排盘)、「她怎么理解自己」诚实未接卡(不放固定段落)、最初就有的/后来慢慢有的分栏(成长只取已分享来源的回忆);关系改为分段按钮,确认框写明「把关系从「X」改成「Y」?」并保留记忆与信任说明;真实城市/外观/备份/语音视觉开头加「还没有接上」说明卡(接上后做什么、现在什么都不会发生),原有待接入细节保留;减少动效改为开关样式。(4) web/src/stage/Presenter.tsx 新增「她此刻」浮签:面板打开且宽度 >1100 时贴在她下方,随相机落定与窗口变化跟随命中区;≤1100 改写在面板标题上方。(5) App.tsx / RealApp.tsx 传入此刻文字、演示失败开关与「在设置里看底色与成长」跳转;domain/model.ts LifeEvent 增可选 told;demo/fixtures.ts 演示条目补 told;adapters/storage.ts 恢复时只为已分享条目保留 told。(6) styles/components.css 追加 A3 区块(两主题共用 token,状态色只用于点、细线与短字;≤1100、≤720、≤720×620、≤360 断点)。(7) tests:domain.test.ts 新增 told 只保留在已分享记录的单测;browser_check / real_browser_check / import_check / rework_browser_check 只按本次有意的界面变化改选择器(关系下拉→分段按钮,「看那段聊天」→「在交谈里看这段」,私有深链断言改为中性「这一条现在打不开」),其余断言不动。",
|
||||
"acceptance": [
|
||||
"日子(演示 ?demo=1,载入三天记录):打算置顶并标「计划可能会变」,正在为呼吸点;列表与详情、回忆、搜索不出现未分享条目;#event=secret 深链只显示「这一条现在打不开。」,页面不含「秘密散步/私密地点」(browser_check 已改断言)。",
|
||||
"长记录:首屏 18 条,看更早的日子后 30 条;选第 11 条 → 在交谈里看这段 → 结束交谈 · 回到日子,列表滚动位置与选中项不变(import_check 原断言)。",
|
||||
"我们的回忆:真实入口四组各显示「暂无可核实的回忆」(.pane .list .grp = 4,rework 原断言);演示入口四组带计数,成长条目可跳到设置·她。",
|
||||
"首建:名字为空、关系不预选(两张卡 aria-pressed=false)、未满 18 岁与未选关系被拦并聚焦对应字段;勾选确认前「确认创建」禁用;演示失败后资料保留、再试一次成功;真实入口 409 不覆盖已有档案。",
|
||||
"设置:名字与生辰只读,无改名/新建/切换/清空/重建入口;改关系类型须确认,取消恢复,保存失败修改保留;离开有未保存修改须确认(原守卫未改);未接入能力全部标「未接入」且按钮不可用,演示能力标「演示数据」。",
|
||||
"两主题结构一致(同一 DOM,只换 token);1600×1000、1024、390×844、320×568、390×430 键盘等效下无关键遮挡——需总工以浏览器检查与截图实测,本机未能运行。",
|
||||
"未触碰 A1/A2:ChatPanel、reading.ts、lineStage、Viewport、compact/typing 规则、真实适配器/TurnGate/epoch 均未修改。"
|
||||
],
|
||||
"deferred": [
|
||||
"本机(Windows 运行时)没有 node/npm、python、git,也找不到可用的 TypeScript:未执行 npm ci/typecheck/lint/test/build、四份浏览器检查、check_requirements.py、git diff --check,也没有正式 React 页面截图或录屏;全部交总工机械执行,未运行即未通过,不以静态阅读或 HEL-815 静态样图代替。",
|
||||
"未提交、未开 PR:按 CHANGES-HEL-823.json 落到 hel-822-candidate(cef8ae5)之上的独立分支,产品目标仍为 agent/agent/de8874a3803b,不指 main;不合并、不部署 8320,8300/8310 未触碰。",
|
||||
"HEL-815 中「看接入后的设计稿」只作施工参照,按原稿施工须知未放进正式产品;城市、外观、备份、语音、视觉观察、生活、长期记忆、主动消息的真实能力仍未接通(R2–R7)。",
|
||||
"「她怎么理解自己」与最初小习惯在真实入口显示未接说明,由 R1 人格深度承接(CG-013/014/015、UX-004);不以固定模板填充。",
|
||||
"真机软键盘、Safari/Firefox、读屏未测;等效视口不冒充真机(UX-001)。人物仍为参考静帧,真实日常视频/首尾衔接/语音口型由主卡 HEL-797 与 HEL-802/803 承接(DEL-001)。"
|
||||
],
|
||||
"requirement_changes": [],
|
||||
"verification": [
|
||||
"附件 SHA256 复算 245dab3f124c0c987a322c4dd788dbb7e7f5e24c4fb96f9eb50f4ec6c61a3894,与卡片一致;解包为只读 before 与可写 work 两份,修改只在 work,before 全部 250 个文件哈希另存。",
|
||||
"修改前后文件哈希与改/增/删清单见交付包 CHANGES-HEL-823.json。",
|
||||
"静态自查:逐文件回读 JSX 结构与类型(新增 props 均为可选、noUnusedLocals 下无多余变量),核对测试所依赖的可访问名称(她的名字、出生日期(公历)、1 / 4 · 出生资料、朋友/恋人 aria-pressed、确认创建、再试一次、去看看她、看更早的日子、结束交谈 · 回到日子、设置分区各按钮名、她怎么称呼你、相处边界、取消修改/保存/重试保存、.kv/.ev/.list/.grp/.city-list/.svc、关闭日子/关闭设置、has-detail 类串)保持不变。静态自查不等于构建或测试通过。",
|
||||
"待总工执行:cd web && npm ci && npm run typecheck && npm run lint && npm test && npm run build;PYTHONPATH=src python3.12 web/tests/{browser_check,import_check,real_browser_check,rework_browser_check}.py;python3 scripts/check_requirements.py --base-ref origin/main --handoff docs/requirements/handoff-HEL-823.json 及实际目标引用;git diff --check;并补 1600×1000、1024、390×844、320×568、390×430 两主题截图。"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"task": "HEL-824 视觉总监:HEL-822 审核两项必须修复缺陷返工(紧凑高度聚焦后首击失灵;停止回复后立即新轮续读迟滞),并修正 rework 检查错误断言、核对 Viewport 无效逻辑",
|
||||
"baseline_version": "1.10",
|
||||
"read_commit": "4321aebfdc491993e0648f68a0375047c3eb6359",
|
||||
"read_notes": "唯一返工基底为远端 hel-822-candidate 提交 4321aeb(总管 git archive 附件 HEL-822-candidate-4321aeb.zip,SHA256 d18d54891f365f4b7999b4defb8cc4f92dace3e296b96707c617ac08f3b3e870,本机复算一致)。已读根 AGENTS.md、docs/requirements/README.md、current.md(59项)、coverage.md、changes.md、task-handoff-template.md、sources/dynamic-sample-effect-acceptance-20261023.md,并按编号核对 CG-018、VIS-003/004/007/011/013、UX-001/002/005、GOV-001–005、DEL-001 原文与边界;模板中的旧1.7字样不覆盖当前入口 v1.10。审核原文:HEL-822 评论 01a16afe-0cb1-7146-b561-c348c9fc8ed8。",
|
||||
"requirement_ids": ["CG-018", "VIS-003", "VIS-004", "VIS-007", "VIS-011", "VIS-013", "UX-001", "UX-002", "UX-005", "GOV-001", "GOV-002", "GOV-003", "GOV-004", "GOV-005", "DEL-001"],
|
||||
"deliverable": "在 4321aeb 上修改 6 个文件、新增本交接:(1) web/src/styles/components.css 删除 html.compact.typing{--nav-space:6px}:聚焦输入只让导航淡出让位,对话区几何不随焦点变化,按下与松开落在同一按钮;交流视觉、两主题与导航淡出保留。(2) web/src/chat/reading.ts 新增 ReadingClock,阅读停留按真实时间计(每帧最多计 STALL=1000ms,页面隐藏后的间隔不计),同一句 key 不变即不重置;web/src/chat/ChatPanel.tsx 改用它(goTo→forget、setFlow→restart、visibilitychange→pause),自动续读、暂停、回看、回到进度、墨入只播一次的逻辑不变。(3) web/src/shared/Viewport.tsx 删除没有任何 CSS 对应的 viewport-resizing 类及其定时器,注释改为实际行为。(4) web/tests/reading.test.ts 新增 3 项时钟回归;web/tests/rework_browser_check.py 三处整行 to_have_text('答复') 改为只对正文 <p> 精确断言,新增 390×420/390×430 双主题聚焦后首击回归与 700ms 慢帧下停止→立即新轮回归。总工在 browser_check / import_check 的机械修正未触碰。",
|
||||
"root_causes": [
|
||||
"缺陷1:compact 下输入聚焦时 --nav-space 由 54px 变 6px;按下按钮使输入失焦,对话区在按下与松开之间下移 48px,click 落到两者共同祖先 SECTION.conversation。修法:对话区几何不随焦点改变(只保留导航淡出),未用先 blur、强制点击、脚本调 handler 或 pointerdown 绕过。",
|
||||
"缺陷2:阅读时钟每帧把 dt 截到 100ms(ChatPanel.tsx 原 113 行 Math.min(100, now - last)),停留时长随帧率缩放。停止→立即新轮时交叉淡化、模糊、墨入与房间画面同时进行,审核环境帧间隔约 1 秒,『新轮』1400ms 的停留被拉长为 14 帧≈14 秒;审核读到的 0.06…0.93 正是 1/14…13/14 的逐帧步进,满格后进入下一句再次从 0 起,看起来像反复重置。逐行核对:同一轮内 key 只由轮次与位置决定,流式增长、落库替换、旧轮迟到事件(TurnGate 拒收)都不会改变当前句 key,也没有其他自动调用 forget/restart 的路径。修法:按真实时间计时,不缩短任何设计停留、不取消自动阅读、不放宽测试等待(8s 超时保持)。"
|
||||
],
|
||||
"acceptance": [
|
||||
"正式 React 月光/雾光,390×420 与 390×430:输入框聚焦后直接点发送、上一句、暂停/继续、全文,均首击生效;草稿真正发出并落库(用户+她各1条)、全文浮层真正打开;按下与松开时对话区 top 相同、click 送达该按钮(rework_browser_check 新节,真实指针点击,脚本不 blur 不派发)。",
|
||||
"停止回复→立即新轮:取消即时、旧轮迟到不串入(当前句状态为空),新轮先显示你的一句(设计停留1.4s)后她的回复上台;在 rAF 每 700ms 一帧的慢帧下同样在原 8s 断言内完成(旧实现需约 9.8s 必然失败)。",
|
||||
"正常 60fps 下各句停留与修改前一致(每帧 dt≈16ms 远小于原 100ms 上限,行为不变);暂停/恢复、前后回看、回到读到的地方、全文、完整记录、同句墨入只播一次、历史恢复锚点逻辑未改动。",
|
||||
"reading.test.ts:任意帧间隔(16/100/250/700/1000ms)下你的一句在 1400ms 至 1400ms+一帧之间到期;流式增长与落库不回退进度;新句、回看、恢复从零开始,暂停/悬停与隐藏期间不计,单帧停顿最多计 1 秒。",
|
||||
"320×568、390×844、1024、1600×1000 布局:本次只删除 compact+typing 时的位移规则,非 compact 尺寸 CSS 无变化;仍需总工以 browser_check / rework 12 组视口复核。"
|
||||
],
|
||||
"deferred": [
|
||||
"本机(Windows 运行时)没有 node/npm、python、git,未能执行 typecheck/lint/test/build、四份浏览器检查、check_requirements.py 与 git diff --check;全部交总工机械执行,未运行即未通过,不以静态阅读代替。",
|
||||
"修前修后实测计时未在本机取得:修前数据沿用总工 HEL-822 观测(约10–15秒、0.06→0.93),修后应由总工以 rework 慢帧节的 slow_frames_new_turn_to_reply_s 及受控慢流原复现记录。",
|
||||
"未开 PR、未提交:本机无 git;按 changes 清单落到 hel-822-candidate 之上,PR 目标仍为 PR#4 产品线 agent/agent/de8874a3803b(原产品基底 db571ba),不指 main;远端引用名称须由总工用 git 实查。",
|
||||
"真机键盘、Safari/Firefox、读屏未测;等效视口不冒充真机(UX-001)。人物仍为参考静帧,真实视频/语音/口型/生活/记忆未接入(DEL-001)。A3 日子/回忆/创建/设置由 HEL-823 承接;R1 人格深度与 R2–R7 在主卡 HEL-797 追踪。"
|
||||
],
|
||||
"requirement_changes": [],
|
||||
"verification": [
|
||||
"附件 SHA256 复算 d18d54891f365f4b7999b4defb8cc4f92dace3e296b96707c617ac08f3b3e870,与卡片一致;解包为只读 before 与可写 work 两份,修改只在 work。",
|
||||
"修改前后文件哈希与新增/删除清单见交付包 CHANGES-HEL-824.json(6 改、1 增、0 删)。",
|
||||
"未执行任何构建、测试或浏览器检查(工具缺失);待总工执行:cd web && npm ci && npm run typecheck && npm run lint && npm test && npm run build;PYTHONPATH=src python3.12 web/tests/{browser_check,import_check,real_browser_check,rework_browser_check}.py;python3 scripts/check_requirements.py --base-ref origin/main --handoff docs/requirements/handoff-HEL-824.json 及实际 PR 目标引用;git diff --check。",
|
||||
"真实网关 SSE 证据仍为 HEL-822 已有记录(本次未改后端、协议、SQLite、RealChatAdapter/TurnGate/epoch/AbortController);rework 新节使用隔离临时库与受控模型,二者分别标明。"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"task": "HEL-825 总工:HEL-823(日子/回忆/首建/设置 A3)功能+界面独立审核,通过后更新 8320 隔离测试版",
|
||||
"baseline_version": "1.10",
|
||||
"read_commit": "cef8ae5581f68ae81991533698ef05abcb82e659",
|
||||
"read_notes": "独立审核分支 hel-825-review 自 cef8ae5(hel-822-candidate 远端头,本机核验一致)。实际阅读根 AGENTS.md、docs/requirements/README.md、current.md(v1.10,59项)、coverage.md、changes.md、task-handoff-template.md,及 sources/design-acceptance-v1.md、visual-confirmation-v2.md、integration-plan-v1.md、dynamic-sample-effect-acceptance-20261023.md;核对 CG-006/007/012–016/018/024/029–031、VIS-001–013、AM-001–003、UX-001–006、GOV-001–005、DEL-001 原文与边界。交付包 SHA256 3a8e1720f347f7b5449c2ac5af116553a41a28982046d4d19eadbb1f4e2f2b27 本机独立复算一致;15改1增的 before 对 git cef8ae5、after 对源码字节逐项独立核验一致,无未列明改动、无删除、无路径越界。",
|
||||
"requirement_ids": ["CG-006", "CG-007", "CG-012", "CG-013", "CG-014", "CG-015", "CG-016", "CG-018", "CG-024", "CG-029", "CG-030", "CG-031", "VIS-001", "VIS-002", "VIS-003", "VIS-004", "VIS-005", "VIS-006", "VIS-007", "VIS-008", "VIS-009", "VIS-010", "VIS-011", "VIS-012", "VIS-013", "AM-001", "AM-002", "AM-003", "UX-001", "UX-002", "UX-003", "UX-004", "UX-005", "UX-006", "GOV-001", "GOV-002", "GOV-003", "GOV-004", "GOV-005", "DEL-001"],
|
||||
"deliverable": "审核通过并部署。分支 hel-825-review(cef8ae5 之上三提交:0bc4a9e 作者交付原字节、e32a1ac 审核接线修正与证据、本 handoff 提交)。审核接线修正仅一处:web/tests/browser_check.py 关联回忆卡点击改 exact=False——新版 link-card 可访问名称由「标题+来源」拼接,作者改版时漏改该选择器,断言强度不变(heading 断言保留),不放宽隐私或回归断言。另新增 web/tests/hel825_shot.py、hel825_tag_probe.py 两个审核证据脚本。8320 更新为新 release 并存切 current,数据目录与档案不动。",
|
||||
"acceptance": [
|
||||
"机械构建:npm ci/typecheck/lint/test/build 全通过;lint 0 errors 2 warnings(ChatPanel:156 为基线已有,ManagePanel:123 unused-directive 为本次引入的非阻塞建议项)。前端 vitest 26/26;后端回归 pytest 142/142(与上批基线一致,本轮实际数字)。",
|
||||
"四份浏览器脚本全部通过:browser_check 16 PASS(1440/1280/390 三视口:创建校验/失败重试/重开、两主题日子/交谈/设置往返、私密深链中性文案、取消隔离、IME/XSS、发送失败重试、离开摘要过滤);import_check 7 PASS(分页18→12滚动保持、损坏持久化不覆盖首建等);real_browser_check 8 PASS(真实网关流式/取消/epoch 重启/SSE 错误/手机关系恢复);rework_browser_check 9 PASS(12 视口主题组合无遮挡、390×430 首击命中、reading 真实时钟、演示零 API)。",
|
||||
"需求检查:check_requirements.py --base-ref origin/main 与 origin/agent/agent/de8874a3803b(均带 --handoff handoff-HEL-823.json)通过,59项;git diff --check 干净。",
|
||||
"隐私与深链:#event=secret 只显示「这一条现在打不开。」,页面无「秘密散步/私密地点」;列表/详情/回忆/摘要无未分享条目(脚本断言+人工核对 LifePanel publicView 路径)。",
|
||||
"首建:名字空拦、未成年拦、关系不预选(朋友/恋人 aria-pressed=false)、未勾选确认创建禁用、失败资料保留、409 只提供恢复已有她(源码 74-75 行核对+脚本验证)。",
|
||||
"设置:名字/生辰只读;关系确认框含「记忆与信任都保留」;未保存离开确认守卫(beforeunload+cg:leave-settings 双路径,ManagePanel:43-49 核对);未接入能力如实标注。",
|
||||
"她此刻浮签几何实测:1600/1440/1101 now-chip 显示于角色下方;1100/1024/390 面板标题上方 .k-near「她此刻 · 在窗边待着」(hel825_tag_probe.py 六档全过)。",
|
||||
"截图证据:两主题 × 1600×1000/1024/390×844/320×568/390×430 键盘等效共 46 张(docs/frontend/screenshots/hel825/)+ 宽屏/手机两段录屏(docs/frontend/recordings/)。"
|
||||
],
|
||||
"deferred": [
|
||||
"真机软键盘、Safari、Firefox、读屏未测(等效视口不冒充真机,UX-001);本机模型不支持图像目检,截图以 DOM 几何断言+脚本覆盖代替人工目检,全部截图已附卡供人工复核。",
|
||||
"ManagePanel.tsx:123 unused eslint-disable directive(本次引入,非阻塞)与 ChatPanel.tsx:156 ref cleanup warning(基线已有)留作后续小优化,不阻塞本轮。",
|
||||
"生活、长期记忆、主动消息、语音口型、天气素材备份、视觉观察真实能力仍未接通(R1–R7 主卡承接);人物仍为参考静帧;本卡不宣称完整产品完成。",
|
||||
"阶段工程审核通过不等于白栖知体验验收;小样与正式界面替换边界不变。"
|
||||
],
|
||||
"requirement_changes": [],
|
||||
"verification": [
|
||||
"独立复算:交付 zip SHA256、逐文件 before/after 哈希、清单外无差异、无删除;commit 0bc4a9e 逐字节等于作者交付(16 文件哈希复验全 OK)。",
|
||||
"机械执行记录:npm ci 176 包、typecheck 0 错、lint 0/2、vitest 26/26、build 514ms 产物 263.64 kB js + 81.28 kB css、pytest 142 passed 6.75s、四浏览器脚本 exit=0、双 base-ref 需求检查通过、git diff --check 通过。",
|
||||
"审核环境:uv 管理 Python 3.12.14 独立 venv(.venv-hel825,项目 requirements.lock + pytest/playwright),Chromium 156.0.8078.4,系统库复用既有 .browser-libs 用户态副本;未改全局环境、未动队员运行时/模型/认证。",
|
||||
"部署验证见本卡成果评论:8300/8310 前后可用、8320 服务健康、?demo=1 与普通真实入口实测、epoch 历史保留、回滚方案(切回旧 release current 符号链接)。"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
{
|
||||
"baseline_version": "1.10",
|
||||
"read_commit": "2d97050c7e86f909590ffdec3e8bc1aa5627cade",
|
||||
"requirement_ids": [
|
||||
"CG-007",
|
||||
"CG-008",
|
||||
"CG-012",
|
||||
"CG-013",
|
||||
"CG-014",
|
||||
"CG-015",
|
||||
"CG-016",
|
||||
"CG-018",
|
||||
"CG-021",
|
||||
"CG-023",
|
||||
"CG-031",
|
||||
"AM-001",
|
||||
"AM-002",
|
||||
"AM-003",
|
||||
"UX-004",
|
||||
"UX-006",
|
||||
"GOV-001",
|
||||
"GOV-002",
|
||||
"GOV-003",
|
||||
"GOV-004",
|
||||
"GOV-005",
|
||||
"DEL-001"
|
||||
],
|
||||
"deliverable": "HEL-827 后端生活循环、非破坏迁移、服务端隐私守卫、全文接收凭证和后置判定的三条件披露、四层人格分离;API及回滚接线说明见 docs/r2/HEL-827-HANDOFF.md。未改web、未部署。",
|
||||
"acceptance": [
|
||||
"slot原子抢占/唯一事件,停机只记skipped,过期pending不重做;生命周期取消回收任务",
|
||||
"成功完整轮次+绑定message/turn/epoch的完整接收确认+候选内实际讲述判定才同事务写told/log;多事件和重试幂等",
|
||||
"公开集合分页,未知/隐藏/伪造ID同形404;消息引用及所有人格/成长公开字段受守卫约束",
|
||||
"原始出生事实每轮重供,诠释/种子事务一致、补建显式受控、关系改变不重生人格",
|
||||
"隔离合成数据测试、完整后端回归、原web构建;不以结构检查或压缩时钟当体验验收"
|
||||
],
|
||||
"deferred": [
|
||||
"视觉总监后续卡:真实生活与人格页面绑定、客户端receipt确认、浏览器接线验收",
|
||||
"总工独立审核、隔离部署与真实连续3天1–4条生活长跑;本卡未长跑",
|
||||
"真实模型样例有第三人称和办公楼情境,内容/世界观质量需独立审核;不继续调参",
|
||||
"8310/8320已有档案补建须另行授权,本卡未访问或迁移其资料",
|
||||
"R3记忆/FTS及未来摘要搜索守卫实际端点测试;目前仅交契约/夹具",
|
||||
"R4主动联系,R5语音,R6城市天气素材备份,R7授权观察,真实视频/口型仍由主卡承接"
|
||||
],
|
||||
"requirement_changes": [],
|
||||
"verification": [
|
||||
"tests/test_r2.py:隔离DB并发/重启/停机/预算/取消,关键词泄漏、乱序/伪造/过期/重放/多事件/失败与事务回滚断言;最终数字见 docs/r2/VALIDATION.md",
|
||||
"原142项回归保留;test_birth_view的一项旧断言从六段模板注入改为保存的原始事实注入(按本卡要求),显示与只读断言仍在",
|
||||
"真实模型四调用契约核验33.77秒:persona/life/narrated/word_only/unacknowledged_hidden/birth_unchanged 全true;不代表质量验收",
|
||||
"web源码零修改;build及26项测试通过,lint只有原有2warning;未做新浏览器接线/三天运行",
|
||||
"8310/8320仅health只读200(epoch3/4),未读用户档案或聊天;无部署、无服务变更",
|
||||
"需求结构与diff检查命令/结果见 VALIDATION.md"
|
||||
],
|
||||
"product_target": "origin/agent/agent/de8874a3803b",
|
||||
"branch": "agent/agent/2aea213ca76f",
|
||||
"frontend_connected": false,
|
||||
"deployed": false,
|
||||
"three_day_run": false,
|
||||
"pr_status": "No forge API token/helper or gh/tea available; candidate branch pushed, no PR fabricated."
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
{
|
||||
"baseline_version": "1.10",
|
||||
"read_commit": "4575b27515f391d7a8b91324dfd3b464a9b090e2",
|
||||
"requirement_ids": [
|
||||
"CG-007",
|
||||
"CG-008",
|
||||
"CG-012",
|
||||
"CG-013",
|
||||
"CG-014",
|
||||
"CG-015",
|
||||
"CG-016",
|
||||
"CG-018",
|
||||
"CG-020",
|
||||
"CG-031",
|
||||
"AM-001",
|
||||
"AM-002",
|
||||
"AM-003",
|
||||
"UX-001",
|
||||
"UX-002",
|
||||
"UX-003",
|
||||
"UX-004",
|
||||
"UX-005",
|
||||
"UX-006",
|
||||
"VIS-004",
|
||||
"VIS-007",
|
||||
"VIS-013",
|
||||
"GOV-001",
|
||||
"GOV-002",
|
||||
"GOV-003",
|
||||
"GOV-004",
|
||||
"GOV-005",
|
||||
"DEL-001"
|
||||
],
|
||||
"deliverable": "HEL-828 视觉总监在已审页面上接线:日子页读 GET /api/life 分页与 /api/life/{id} 详情(同形404、加载/空/失败沿用原状态,不用演示填充,完整历史不截200条),消息 lifeIds 与“在交谈里看这段”关联;设置·她 读 GET /api/persona 的 interpretation/seeds/growth 五状态与显式 retry,backfilled-R2 标“后来补上的初始印象”,出生事实仍只读;真实对话在 TurnGate 接受的完整 final 上用纯JS UTF-8 SHA-256 核对 receipt.text_hash 后 POST /api/chat/received 五字段(有界重试、幂等、replay 用 receipt 内原 epoch);生活状态文案按 health.backend 与 life_runtime.state 如实显示;后端只改 health.backend.web_connected=true。未改布局/动效,未部署。",
|
||||
"acceptance": [
|
||||
"日子:已公开事件分页(next_before)、详情、关联聊天跳转;隐藏/未知/非法ID统一“这一条现在打不开”;真实模式不出现演示资料",
|
||||
"人格:ready/loading(有界轮询12×5s)/failed(可重新形成)/disabled/not_initialized(旧档案不自动补建);空成长不伪造",
|
||||
"确认:仅 gate 接受、未 abort、完整 final 且全文已写入后计算哈希并确认;delta/error/取消/断流/哈希不符不确认;404/422不重试,网络/5xx最多3次",
|
||||
"普通HTTP非localhost(isSecureContext=false、无crypto.subtle)下中文/emoji/ZWJ/块边界哈希与.NET SHA256一致",
|
||||
"accepted 后不乐观置told:日子页打开时重读,已开着时在15s/45s各安静重读一次;离开再回来总是重读",
|
||||
"health 无 backend 显示“生活尚未接通”;backend.life=false 显示“后台未启用”;仅 life_runtime.state=running 才说后台运行中"
|
||||
],
|
||||
"deferred": [
|
||||
"总工 HEL-829:机械入库、npm build/lint/vitest、pytest、check_requirements 与 git diff --check;本环境无 git/node/python 未能运行",
|
||||
"两主题电脑/手机真实页面截图与浏览器接线流程(含重启replay、409、取消即重问)需构建后由总工补验;本卡未能出图",
|
||||
"后端真实样例第三人称“它”/办公楼茶水间的内容质量风险交总工审核;本卡未改提示词/温度、未追加真实调用",
|
||||
"隔离部署与真实连续3天每天1–4条长跑;本卡未部署",
|
||||
"R3长期记忆/FTS、R4主动联系、R5语音、R6城市天气素材备份、R7授权观察、真实视频/口型仍由主卡承接"
|
||||
],
|
||||
"requirement_changes": [],
|
||||
"verification": [
|
||||
"Edge headless 经 http://192.168.200.18(非localhost,secureContext=false, subtle=false)运行 harness:10个哈希向量+abc向量、五字段、receipt epoch、部分文本/他轮不确认、404不重试、网络失败3次即止、并发幂等、503后重试成功、存储无token,共21项PASS;harness 为 sha256.ts/receipt.ts 去类型手工转写,不是构建产物",
|
||||
"参考哈希由 .NET SHA256 独立计算核对一致",
|
||||
"web/tests/r2wiring.test.ts 新增 vitest(含 replay 当前epoch过闸+原epoch确认、取消轮不过闸),未运行:本机无node",
|
||||
"TS 未经 tsc/vite 编译;页面、手机、两主题未出图;pytest/check_requirements 未运行",
|
||||
"未访问8300/8310/8320,未复制用户档案或聊天;无部署、无PR合并"
|
||||
],
|
||||
"product_target": "origin/agent/agent/de8874a3803b",
|
||||
"branch": "未提交(无git);基于 agent/agent/2aea213ca76f @ 4575b27515f391d7a8b91324dfd3b464a9b090e2 的源码包",
|
||||
"frontend_connected": true,
|
||||
"deployed": false,
|
||||
"three_day_run": false
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"baseline_version": "1.10",
|
||||
"read_commit": "64a47f35d0eca195b9961f830b78a60fd1c7ce70",
|
||||
"requirement_ids": ["CG-008", "CG-013", "CG-014", "CG-015", "CG-016", "CG-017", "CG-021", "CG-026", "AM-001", "UX-004", "UX-006", "GOV-001", "GOV-002", "GOV-003", "GOV-004", "GOV-005", "DEL-001"],
|
||||
"deliverable": "HEL-830最小后端提示词返工:本人自述、生活限于当前高层卧室、无来源人物互动禁止;旧档案窗内/窗外确定性测试;一组4次真实生成原始证据及内容逐项自检。保留HEL-828全部前端与HEL-829机械修复,详见docs/r2/HEL-830-HANDOFF.md。",
|
||||
"acceptance": [
|
||||
"真实provider请求中含本人声音和获批场景约束,原文入库,不做它到她的后替换",
|
||||
"旧档案在上海11:11和12:11均无人格自动补建,合法生活窗内1条窗外0条;显式补建来源/时间真实,出生、身份、名字、聊天不变",
|
||||
"真实核验恰好4次无重试,persona/life/narrated/word_only及未确认不公开、底色不变全部通过;内容自检逐项核对原始文字",
|
||||
"完整Python与web测试/构建/lint、两目标需求结构和diff检查通过;前端零改动,独立分支推送供复审"
|
||||
],
|
||||
"deferred": [
|
||||
"总管接回HEL-829总工独立复审,复用本组原始输出,不另开真实模型调用;本卡不是部署放行",
|
||||
"隔离实例部署及真实连续3天每天1–4条、关闭网页继续生活仍未开始,由总管专卡及持久唤醒承接",
|
||||
"HEL-829原42项浏览器端到端/13张图不是本卡重测;其私有夹具未发现,真机/Safari/Firefox未测",
|
||||
"R3记忆、R4主动联系、R5语音、R6城市天气素材完整备份、R7授权观察及真实视频/口型由HEL-797继续承接",
|
||||
"已有档案没有补建、重算或迁移,仍须单独授权"
|
||||
],
|
||||
"requirement_changes": [],
|
||||
"verification": [
|
||||
"docs/r2/pytest-HEL-830.txt:Python3.12.14完整194 passed,7.78秒,1条既有Starlette弃用提示",
|
||||
"web37 tests、TypeScript/Vite构建通过,lint0error/1原有ChatPanel warning;前端与64a47f35零diff",
|
||||
"Python ruff涉及API/life/store及R2测试脚本全通过;需求检查分别对origin/main和origin/agent/agent/de8874a3803b附本交接执行",
|
||||
"docs/r2/model-smoke-HEL-830.json:一组4调用46.31秒/保守9821,原始请求/参数/逐delta/原文保存,全部6项checks为true",
|
||||
"docs/r2/CONTENT-REVIEW-HEL-830.md:人称/场景/人物互动/深度/非模板/能力诚实逐项核对,自检通过待独立审核;GeneratorExit正常关闭元数据如实保留解释",
|
||||
"无部署、无共享数据访问、无新增依赖、无后台服务;旧HEL-827真实样例和全部前端原样保留"
|
||||
],
|
||||
"product_target": "origin/agent/agent/de8874a3803b",
|
||||
"product_target_commit": "db571ba204c8372989f96e1ed9b5cd00d3a306c7",
|
||||
"branch": "agent/agent/a67b70ddbb63",
|
||||
"deployed": false,
|
||||
"three_day_run": false,
|
||||
"real_model_calls": 4
|
||||
}
|
||||
@@ -7,5 +7,9 @@
|
||||
"product-decisions-v1.6.json": "ccc5c50c5604385208eb054caac01e27fc63367dac7731e1be9775a1e5cf46ab",
|
||||
"visual-confirmation-v2.md": "6e0229aaf693f215cc9dcc647be694aeafb3770683b21bb7e3e30291af60255a",
|
||||
"integration-plan-v1.md": "454af1d4a3b0360d33aea9c0e97f738b320968ba7be68e012a5fcec6f6ed0169",
|
||||
"comment-evidence-visual-role-20261022.json": "ecf30eb323129dca2a0d9c2ff2e0163884ee94d3fc7828b0540cd45f03103797"
|
||||
"comment-evidence-visual-role-20261022.json": "ecf30eb323129dca2a0d9c2ff2e0163884ee94d3fc7828b0540cd45f03103797",
|
||||
"comment-evidence-shared-space-20261023.json": "e56299db726e64fbeea9e07d352066ef2b578889cc9a33cf1789e3234862130d",
|
||||
"shared-space-static-acceptance-20261023.md": "9aec04ab40e40ce275c75104f004cd3d1473ff8fbef428767afbbe5fafd09cb9",
|
||||
"comment-evidence-dynamic-sample-20261023.json": "fe7528a2b68aca99968734b200d9d27a17d85f5110e60c6f52d7c569755c260d",
|
||||
"dynamic-sample-effect-acceptance-20261023.md": "f5e9fde65a58ebc365de47569053ad7c30ce77ae82bb78773cc070e3cbffd90e"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
[
|
||||
{
|
||||
"id": "01a16810-3b46-7345-8966-dd87b76efe07",
|
||||
"author_type": "member",
|
||||
"author_id": "e5c6c938-db48-4ff9-954f-4fb8b063a132",
|
||||
"content": "这个效果可以",
|
||||
"created_at": "2026-10-23T09:20:56Z",
|
||||
"parent_id": null
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,42 @@
|
||||
[
|
||||
{
|
||||
"id": "01a16650-0355-72c4-b291-f1b4494cde91",
|
||||
"author_type": "member",
|
||||
"author_id": "e5c6c938-db48-4ff9-954f-4fb8b063a132",
|
||||
"content": "主要是A和B,但是之前没注意到C的问题,你一说倒是有点",
|
||||
"created_at": "2026-10-23T01:11:22Z",
|
||||
"parent_id": "01a1664d-f242-71fa-a4ba-295b6c347478"
|
||||
},
|
||||
{
|
||||
"id": "01a16654-5fc5-74be-a704-99b76b48b0b1",
|
||||
"author_type": "member",
|
||||
"author_id": "e5c6c938-db48-4ff9-954f-4fb8b063a132",
|
||||
"content": "对就是B",
|
||||
"created_at": "2026-10-23T01:16:08Z",
|
||||
"parent_id": "01a1664d-f242-71fa-a4ba-295b6c347478"
|
||||
},
|
||||
{
|
||||
"id": "01a16655-fe53-73a5-905f-4c9e71a1ed30",
|
||||
"author_type": "member",
|
||||
"author_id": "e5c6c938-db48-4ff9-954f-4fb8b063a132",
|
||||
"content": "这个我不太能想象得到,我和她待在同一空间是什么概念",
|
||||
"created_at": "2026-10-23T01:17:54Z",
|
||||
"parent_id": "01a1664d-f242-71fa-a4ba-295b6c347478"
|
||||
},
|
||||
{
|
||||
"id": "01a16659-fdfa-72ce-a4a5-801e0762c0a9",
|
||||
"author_type": "member",
|
||||
"author_id": "e5c6c938-db48-4ff9-954f-4fb8b063a132",
|
||||
"content": "这个能否现在就做个样图让我看一下",
|
||||
"created_at": "2026-10-23T01:22:16Z",
|
||||
"parent_id": "01a1664d-f242-71fa-a4ba-295b6c347478"
|
||||
},
|
||||
{
|
||||
"id": "01a1668f-5810-7524-b72f-33574a32c7d6",
|
||||
"author_type": "member",
|
||||
"author_id": "e5c6c938-db48-4ff9-954f-4fb8b063a132",
|
||||
"content": "静态效果我认可",
|
||||
"created_at": "2026-10-23T02:20:32Z",
|
||||
"parent_id": null
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,54 @@
|
||||
## 对坐动态小样整体效果的认可(2026-10-23)
|
||||
|
||||
总工(HEL-816)按主卡交付与用户原话整理入库。本记录只写明用户已经说过的话及其适用范围,不改动任何已有来源文件,不扩大授权。
|
||||
|
||||
### 用户原话(主卡 HEL-797,作者白栖知 `e5c6c938-db48-4ff9-954f-4fb8b063a132`)
|
||||
|
||||
原文逐字保存在同目录 `comment-evidence-dynamic-sample-20261023.json`。
|
||||
|
||||
| 评论 | 时间(UTC) | 原话 | 回应的问题 |
|
||||
| --- | --- | --- | --- |
|
||||
| `01a16810-3b46-7345-8966-dd87b76efe07` | 2026-10-23 09:20:56 | 这个效果可以 | 总管交付评论 `01a167c1-458d-795b-81e1-584089bf3667`(2026-10-23 07:54:41)请其下载体验《对坐动态小样 v2》并回答「整体是否更像自己坐在她面前」 |
|
||||
|
||||
交付评论(总管撰写,不属于用户原话)列明的体验方式:走近她/结束交流、月光/雾光切换、长回复自动续读、暂停回看与全文、手机打开查看;并已声明人物仍是参考静帧、聊天生活天气均为演示、真实视频语音口型尚未接入、手机候选默认关闭。
|
||||
|
||||
### 被认可的作品
|
||||
|
||||
- 文件:`CyberGril-HEL-799-对坐动态小样-v2.html`,662,233 字节,SHA256 `826bfc045d941c2114b16a198626ca952ff3d95dff02cfc6e32ee09858bcf80e`。
|
||||
- 附件:主卡附件 `01a167c1-455b-751a-ac37-9fa984a1ed10`(随交付评论 `01a167c1-458d-795b-81e1-584089bf3667`)。
|
||||
- 仓库内同 hash 原稿:`prototypes/hel-799/index.html`(分支 `agent/agent/54df81e610fd` 提交 `ad6a3b1` 起保全;总工 HEL-811 独立重建逐字节一致,总管 2026-10-23 复下载核对一致)。
|
||||
- 作者:视觉总监(HEL-799 v2 续作);独立审核:总工 HEL-811(40 项行为通过,无必须返修项,Firefox/真机未测原因见该记录)。
|
||||
|
||||
### 认可范围(已交小样的效果)
|
||||
|
||||
对坐动态小样 v2 的**整体效果**(电脑端、演示数据):同室相处画面;点她或「和她说话」推近到获认可的交流构图(HEL-798 月光构图);「结束交谈」沿原路退回,中途可反向;Esc 立即回到相处画面;交流呈现与阅读方式(自动续读、暂停、‹ › 回看、全文、完整记录、身份标记);月光 ⇄ 雾光两主题切换(布局与操作位置不变);日子/设置浮层。
|
||||
|
||||
### 不在范围内(仍待验收或承接)
|
||||
|
||||
| 项 | 状态 |
|
||||
| --- | --- |
|
||||
| 手机真机 | 未验证;4:5 候选容器 `?frame=media` 默认关闭,本认可不视为批准启用;真机键盘与流畅度未测 |
|
||||
| 真实人物动态 | 人物仍是参考静帧;真实视频、眨眼/呼吸/口型/语音未接入、未验证 |
|
||||
| 真实生活、记忆、主动联系、天气、备份 | 均为演示数据,未接入 |
|
||||
| Firefox/Safari/真机/系统级后台节流 | HEL-811 因环境未测,不能用等效视口或合成事件代替 |
|
||||
| 新素材 | 多时段天气穿搭、无书无居家裤的新近景与远景、首尾衔接素材按 HEL-802/HEL-803 承接,尚未生成 |
|
||||
|
||||
### 不能推出的结论
|
||||
|
||||
- 不视为完整产品、整套界面或任何其余页面(生活、回忆、创建、管理)验收通过。
|
||||
- 相处静帧中她在看书:用户已否定以阅读作为默认日常(`01a166aa-5f37-77b2-a2bd-ceb62f665813`),本认可不恢复看书默认,也不把该静帧定为最终相处素材。
|
||||
- 不授权替换正式界面:8300/8310 及已有档案、聊天、记忆保持原状;PR#4/#6/#8 合并与否仍由总管与白栖知决定。
|
||||
- 不代表 CG-024 的真实动态验证(真实视频选片、动作循环衔接、实时口型语音)完成;小样通过只表示该演示阶段通过。
|
||||
|
||||
### 对其他要求的影响
|
||||
|
||||
- CG-004「交流镜头」:推近/退回的切镜方式与衔接在小样演示层面(两静帧对齐+镜头推近)获认可;真实视频的切近衔接仍待验收。
|
||||
- VIS-007「空间动效」、VIS-013「交流呈现」、VIS-004「两套首轮主题」:小样是该要求获认可的演示呈现;条文与边界不变。
|
||||
- VIS-011:v1.9 已认可交流静图,本次扩展到该小样的整体动态效果(演示层面);条文保留,边界更新。
|
||||
- 其余已确认要求不变。
|
||||
|
||||
### 入库操作(总工 HEL-816,2026-10-23)
|
||||
|
||||
1. 新增本文件与 `comment-evidence-dynamic-sample-20261023.json`,`source-manifest.json` 追加两者 SHA256;历史来源未动。
|
||||
2. 升版 v1.10:`changes.json`/`changes.md` 追加条目(批准评论 `01a16810-3b46-7345-8966-dd87b76efe07`,`affected_ids`=VIS-011、CG-004);两者边界在 `baseline.json` 与 `current.md` 同步更新;`coverage.json`/`coverage.md` 版本与对应项同步;`README.md` 入口版本更新。
|
||||
3. 检查:`python3 scripts/check_requirements.py --base-ref origin/main` 与 `--handoff docs/requirements/handoff-HEL-816.json` 通过;`git diff --check` 干净。结果见各自运行记录。
|
||||
@@ -0,0 +1,46 @@
|
||||
## 交流静态视觉基准的更新(2026-10-23)
|
||||
|
||||
视觉总监在 HEL-799 整理,供总管入库核验。本记录只写明用户已经说过的话及其适用范围,不改动任何已有来源文件,也不改写 `current.md`、`baseline.json` 的现行条文。
|
||||
|
||||
### 用户原话(主卡 HEL-797,作者白栖知 `e5c6c938-db48-4ff9-954f-4fb8b063a132`)
|
||||
|
||||
原文逐字保存在同目录 `comment-evidence-shared-space-20261023.json`。
|
||||
|
||||
| 评论 | 时间(UTC) | 原话 | 回应的问题 |
|
||||
| --- | --- | --- | --- |
|
||||
| `01a16650-0355-72c4-b291-f1b4494cde91` | 2026-10-23 01:11 | 主要是A和B,但是之前没注意到C的问题,你一说倒是有点 | 总管问最妨碍沉浸的是哪种感觉:A 空间太空泛;B 和她有距离,像窗口里的照片;C 操作出戏 |
|
||||
| `01a16654-5fc5-74be-a704-99b76b48b0b1` | 01:16 | 对就是B | 总管问:她即使能眨眼、抬头、回应,但仍在人物窗口里,是否主要的不满意还在 |
|
||||
| `01a16655-fe53-73a5-905f-4c9e71a1ed30` | 01:17 | 这个我不太能想象得到,我和她待在同一空间是什么概念 | 总管问更接近「同一个空间」还是「通向她的世界」 |
|
||||
| `01a16659-fdfa-72ce-a4a5-801e0762c0a9` | 01:22 | 这个能否现在就做个样图让我看一下 | 总管用第一人称镜头解释「同一空间」后 |
|
||||
| `01a1668f-5810-7524-b72f-33574a32c7d6` | 02:20 | 静态效果我认可 | 总管交付 HEL-798 样图(评论 `01a16663-3ad2-727c-8888-e116eca13116`),问是否更像「自己坐在她面前」 |
|
||||
|
||||
问题原文由总管撰写,在主卡根线程 `01a1664d-f242-71fa-a4ba-295b6c347478` 内,不属于用户原话。
|
||||
|
||||
### 被认可的图
|
||||
|
||||
- 文件:`hel-798-face-to-face-moon.png`,1600×1000,SHA256 `a8619a1ff459ec1d28ec192104c851f6dee079c7b6056c1a927842591861a56a`。
|
||||
- 主卡附件 `01a16663-3a5a-76eb-ac3c-1ef93165617c`(随交付评论 `01a16663-3ad2-727c-8888-e116eca13116`);HEL-799 卡附件 `01a16691-b0f0-73a9-aae4-9aba2146899c`,两者字节相同。
|
||||
- 同一评论另附的标注图 `hel-798-face-to-face-annotated.png` 和新旧对照图 `hel-798-compare-pr8.png` 是说明材料。
|
||||
- 作者:视觉总监(HEL-798)。源码在 `prototypes/hel-799/reference/hel-798-static/`。
|
||||
|
||||
### 旧要求、新认可与适用范围
|
||||
|
||||
| | 内容 |
|
||||
| --- | --- |
|
||||
| 旧(VIS-011,v1.8 仍有效) | 「人物平时作为空间中独立视窗;交流时自然放大。已认可的人物位置、分量与首页文字分量沿用。」来源 `01a15f09-db1e-705c-8baf-cde63c7651fb`、`01a15f1f-5a71-783c-a458-b326a0073d69`。 |
|
||||
| 新认可 | **交流状态、靛蓝月光、电脑 1600×1000 的静态画面**:不再用独立人物框;她身边的环境连续铺到屏幕四边;前景有你这一侧的圆桌沿、茶杯和烛灯,中间是她,远处是雨夜窗景;当前一两句对话落在近处、视线下方,底部保留输入和此刻/交谈/日子/设置导航。 |
|
||||
| 适用范围 | 仅以上交流状态静图。用户认可的是「静态效果」。 |
|
||||
| 不在范围内(仍待验收) | 相处(平时)状态的构图;进入与退出交流的过渡和整体动态;蓝紫雾光主题;手机版;真实人物动态、眨眼、口型与语音;生活、回忆、创建、管理等完整功能的最终页面。 |
|
||||
| 不能推出的结论 | 不能据此永久取消 VIS-011 在全部状态中的原规则;不能把完整前端锁定为全屏卧室照片或视频(CG-031 继续有效);不能视为整套界面或任何功能已经验收。 |
|
||||
|
||||
### 对其他要求的影响
|
||||
|
||||
- VIS-001、VIS-002、VIS-006、VIS-013:这张图是「两人的数字空间」「空间深度」「交流以人物为主、当前一两句」的一种获认可呈现。
|
||||
- CG-004「交谈时允许自然切近」:图只证明切近后的静态画面,切近过程要在 HEL-799 动态小样中另行验收。
|
||||
- 其余已确认要求不变。
|
||||
|
||||
### 入库建议(由总管决定,视觉总监未改动正式基准)
|
||||
|
||||
1. 将 `comment-evidence-shared-space-20261023.json` 加入 `docs/requirements/sources/`,并在 `source-manifest.json` 追加它的 SHA256;历史来源不动。
|
||||
2. 如决定升版为 v1.9:在 `changes.json` / `changes.md` 追加一条,`approval_comment_id` 为 `01a1668f-5810-7524-b72f-33574a32c7d6`,`affected_ids` 至少含 `VIS-011`,摘要写「交流状态静态视觉基准更新为 HEL-798 共同空间样图」,影响写明上表的适用范围与不在范围内;VIS-011 的结论原文保留,只在边界中补一句「交流状态静图已按上述评论更新,平时状态、过渡、雾光、手机待验收」,`current.md` 与 `baseline.json` 同步;`coverage.json` 的版本跟着改。
|
||||
3. 入库后运行 `python3 scripts/check_requirements.py --base-ref origin/main` 及 `--handoff prototypes/hel-799/handoff-hel-799.json`。本运行环境没有 git 和 Python,这两项都未执行。
|
||||
@@ -0,0 +1,77 @@
|
||||
HEL-783 六项返工交付与复审说明 · 2026-10-22
|
||||
|
||||
本轮由总管在可用的 Codex 环境亲自完成。沿用获批 HEL-746 R2 两主题和现有 R1 API,在原 PR#4 的 `agent/agent/de8874a3803b` 上追加修复,目标仍为 `main`。没有更换业务模型、修改现网或读写用户真实数据库,没有合并。最终提交号以 PR#4 最新 head 为准。
|
||||
|
||||
## 六项反馈闭环
|
||||
|
||||
| 用户反馈 / Before | 本轮 After | 实际验证 / Why |
|
||||
| --- | --- | --- |
|
||||
| 手机对话被输入栏挡住;台词和输入分别固定定位,没有长文高度预算 | `ChatPanel` 统一布局,人物占位、可滚动台词、状态/取消、语音条、输入分别占位;`Viewport` 跟随 visualViewport 的高度、顶部和底部偏移,含安全区。视口变化时人物窗立即调整,不等待装饰过渡 | 1440×900、360×640、390×700、390×844、390×420、844×390,两主题共12组;长中文前后文均在 DOM,可滚到末尾、完整记录能读全文。420高是键盘缩小等效场景,未冒称真机键盘实测 |
|
||||
| 流式全文在结束时被 `slice(-90)` 截成尾部;用户也被 `slice(-48)` 截断 | 当前双方消息保留全文;滚动阅读,跟随阅读位置;完整记录继续提供历史入口。流式和最终使用同一 turn 身份 | 长用户句首尾与五段长回复逐字相等;流式完成前后为同一个 DOM,取消立即中断,未完成文本标明未保存 |
|
||||
| 只写 opacity transition,没有真实改变透明度 | `SoftText` 按轮次用 WAAPI 淡入200ms、旧句保留160ms淡出;流式增量只更新文字,不重播。使用现有 `--ease-out`;减少动效120ms轻淡化 | 实际动画0/80/200ms逐帧截图及 computed opacity/transform;旧句0/80/159ms仍挂载、透明度递减。全轮只有一次入场,完成不重播,取消不等动画 |
|
||||
| 滚动条脱离主题 | 两套主题各有轨道/滑块/悬停 token;全局标准属性与 Chromium 兼容样式,强制色使用系统色;触摸区仍原生滚动 | 实际消息、记录、首建、设置长内容滚动及两主题截图;强制色有 CSS 回退。没有做真实辅助设备和各系统滚动条外观全覆盖测试 |
|
||||
| 底色只有公历和几个内部短标签 | 新增只读日历展示与六维解释映射:表达社交、亲密边界、冲突修复、行动节律、压力恢复、成长张力。显示真实农历/闰月、钟点、四柱和术语提示;每段可展开解释依据。预览/确认/已有档案共用组件 | 48组日期×时辰检查,含1900边界、春节、立春附近、真实闰四月;预览不写库。旧档案使用已存四柱、十神、Derived,禁止重新编译;GET前后原始JSON、底色行一致,关系修改不改底色和历史;聊天系统提示逐段复用同一解释 |
|
||||
| 分不清谁在说话 | 当前对话中“你”右对齐,真实伴侣名字左对齐,独立角色行;阅读状态行持续标明伴侣名字,滚动后也能确认正在读谁的回复。流式、最终、失败、取消与记录都使用同一身份 | 两主题截图,失败/重试、取消新轮、历史恢复都检查;不单靠颜色辨别 |
|
||||
| 真实入口把完整页面缩成“未接通”卡片 | 恢复日子/回忆双栏与分组;城市、外观、备份、四类服务的完整结构和真实空态;服务页可读健康检查,未接通写入控件明确禁用;加入未保存离开确认 | 实际手机逐页进入、返回、搜索空态、服务检查、未保存取消/放弃、演示事件→聊天→返回。真实入口无演示记录,演示模式全流程零API请求 |
|
||||
|
||||
## R2 功能覆盖差异表
|
||||
|
||||
“已接真”表示已有 API 持续可用;“本批补齐”表示前端结构/交互已恢复;“后台待接”表示本轮没有增加该后台能力,不能据此验收为已接通。
|
||||
|
||||
| R2 落点 | 演示模式 | 真实入口 | 本批结论 |
|
||||
| --- | --- | --- | --- |
|
||||
| 四类区域、两主题、底部导航 | 原有此刻/交谈/日子/设置 | 同样四区与主题切换 | 保留;手机短高度首页内容可滚动 |
|
||||
| 首页留言与日子入口 | 固定演示留言、已分享日子入口 | 服务器最近回复可打开完整记录;日子入口明确后台待接 | 本批补齐真实入口,历史已接真;不伪称主动留言 |
|
||||
| 日子列表、按日分组、三类事件、分页 | 原有已分享事件与18+12分页 | 完整列表区、三类图例和空态 | 本批补齐结构;真实生活后台待接,无示例填充 |
|
||||
| 事件详情、回忆互链、聊天与返回 | 可走详情→关联→聊天→回到原日子 | 详情阅读区域保留,无数据时不造条目/链接 | 演示路径实测;真实数据后台待接 |
|
||||
| 我们一起的/小习惯/她知道的你/成长 | 四组演示回忆、来源、关联日子 | 四组独立空态和阅读区 | 本批补齐真实分组;长期记忆后台待接 |
|
||||
| 隐私:她说过才显示 | 继续使用 publicView 过滤 | 当前没有生活/回忆数据 | 不放宽隐私,不展示未讲述事件 |
|
||||
| 首建四步、关系无预选、同意确认 | 本机独立创建;排盘不以固定假值冒充 | 服务端唯一档案、只读预览、实际创建 | 已接真;补公农历/闰月/四柱帮助和六维说明 |
|
||||
| 首建失败、返回修改、重试 | 原有模拟失败且保留输入 | API 中文错误、输入保留、409恢复唯一档案 | 保留;未增建档入口或清空入口 |
|
||||
| 她的档案与底色锁定 | 演示底色明确未计算 | 旧档案只读补展示,原参数和历史不动 | 本批补齐;无数据库迁移 |
|
||||
| 最初与后来成长分层 | 两栏及成长回忆 | 出生说明与后续记忆区分,当前长期记忆未接 | 不把出生说明当作已经发生的经历 |
|
||||
| 关系、称呼、边界;改变关系确认 | 原有模拟保存/取消/失败 | PATCH真实保存、二次确认、重开恢复 | 已接真,回归通过 |
|
||||
| 未保存提示、取消和离开 | 原有暖色点、取消、beforeunload | 同样提示;关闭/导航离开新增确认 | 本批补齐;取消继续编辑,放弃不写服务器 |
|
||||
| 城市搜索与列表/无结果 | 原有候选城市本机保存与失败演示 | 可搜索候选目录,有空态;明确未设置真实城市,保存禁用 | 本批补齐;真实城市/天气后台待接 |
|
||||
| 外观选择、五项检查、对比、确认 | JSON结构检查、对比与模拟标识确认 | 当前参考、文件入口、五项待检查、新旧对比、应用入口 | 本批补齐;真实导入与媒体检查禁用,后台待接 |
|
||||
| 自动备份列表、完整导出 | 已标真实备份未接通;本机演示JSON可导出 | 自动备份空列表、完整导出说明和禁用按钮 | 本批补齐;不制造成功备份 |
|
||||
| 恢复检查、同一档案、双重确认、先导出 | 原有本机恢复检查和输入“恢复” | 明示四步恢复过程;文件和执行入口禁用 | 本批补齐结构;真实恢复后台待接,不能实际覆盖 |
|
||||
| 四类外接服务与测试反馈 | 只保存演示地址,不发请求 | 文字、语音识别、语音合成、视觉四项;文字可重新检查健康,配置只读 | 本批补齐;不暴露凭据,不模拟其他连接成功 |
|
||||
| 显示、减少动效 | 原有本机设置 | 主题与减少动效保存于本浏览器,和服务器资料分开 | 减少动效刷新恢复;系统设置也生效 |
|
||||
| 长文字、完整记录、滚动、角色 | 模拟流式继续可用 | SSE、完整记录、失败与取消状态 | 本批修复全文、占位和角色;已接真 |
|
||||
| 重试、轮次/epoch、重启、多设备恢复 | 原有 TurnGate | 原有传输机制保留 | 确定性API测试和浏览器回归通过 |
|
||||
| 连续语音、打断、结束、拒绝/失败状态 | 保留无收音模拟和权限说明;新布局语音条不挡输入 | 控件明确尚未接通,文字仍可用 | 真实语音后台待接,未申请设备权限 |
|
||||
| 视觉说明、时效、失败、总服务区 | 原有30秒模拟过期与失败 | 明确未接通、不采集;服务项保留 | 真实视觉后台待接 |
|
||||
| 断线/模型不可达/草稿 | 原有断线重连演示 | 实际请求错误、草稿保留、重试、服务状态;已有档案历史可读 | 保留已接真能力;自动重连推送属后续,不假造补消息 |
|
||||
| 离开欢迎摘要、主动消息与未读 | 原有明确标注的固定演示,来源为已分享事件 | 生活/主动消息未接通,不伪造欢迎摘要或来信 | 后台待接;真实最近回复入口已保留 |
|
||||
| 手机列表/详情与设置返回、Esc | 保留推入和返回、原日子位置 | 同样区域/分区返回;Esc关闭记录再退出交流 | 本批补齐真实Esc与未保存确认 |
|
||||
| 新设计建议 | 无 | 无 | 未把新增后台能力夹进本批 |
|
||||
|
||||
## 验证记录
|
||||
|
||||
- Python 3.11:`pytest -q` **142通过**,含原92项和新增50项。唯一提示为既有 Starlette TestClient 依赖弃用提示。
|
||||
- TypeScript类型检查、ESLint、前端 **14项** Vitest、Vite生产构建通过。后端变更文件 Ruff通过。没有新增运行时依赖。
|
||||
- `web/tests/rework_browser_check.py`:8组通过,12组尺寸/主题组合;记录 `browser-results.json`。使用隔离SQLite和可控模型验证长中文、错误、取消与完整页面,不把可控模型说成在线模型。
|
||||
- `web/tests/real_browser_check.py --controlled`:8组回归通过,记录 `r1-regression/browser-results.json`。包括真实HTTP SSE、浏览器关闭流、立即新轮、同源重启epoch变化、多设备恢复、关系取消/确认保存。
|
||||
- `web/tests/real_browser_check.py`:真实批准网关完成两轮对话,第二轮正确回答上一轮暗号“蓝色风铃”;第三轮收到增量后取消,上游请求结束且没有完整回复落库。随后同源重启和故障段使用可控provider,结果逐项区分,记录 `live-gateway/browser-results.json`。所有建档、聊天和关系写入仍只在临时库。
|
||||
- 动效证据:`motion-enter-0/80/200.png` 和结果JSON中的 `motion.entry_frames/exit_frames`。截图暂停实际 WAAPI 后逐帧采样,随后恢复;没有为截图修改生产动画时长。
|
||||
- 代表图:`long-start-360-640-*.png`、`long-start/long-end-390-420-*.png`、`full-history-*.png`、`birth-*.png`、`existing-*.png`、城市/外观/备份/服务/生活回忆各图。图中“星河/小满”和聊天全部是本轮隔离测试资料。
|
||||
- 已实际看过代表性手机长文、短视口、语音模拟、出生预览、已有档案说明、服务页、回忆分组截图;复审仍需独立看图、播放实际界面,不能只用坐标和测试数认定视觉通过。
|
||||
- 未测:实体手机键盘、Safari、真实强制色设备、屏幕阅读器、长时运行和帧率。420/390高只证明等效可见高度布局,不等于真机键盘实测。
|
||||
|
||||
## 说明层的兼容性与回滚
|
||||
|
||||
`core/birth_view.py` 是可维护的确定性解释映射,不调用模型润色。分档值只选择解释段落,不产生新的底色参数。敏感度的展示分档与普通0–1参数分别归一到解释选择范围。四柱与十神取旧库已存值,五行侧重和性格取旧Derived;日历只从不可变生日、时辰换算展示。没有重新调用旧档案的四柱编译器,也没有把新说明写回旧档案。新增档案会在原有JSON中携带可选展示字段;旧字段仍保留,旧前端不依赖新增字段。
|
||||
|
||||
聊天提示与UI共用六段解释,仍明确本体、现实边界、未接通能力和不能编造生活。取消、历史、epoch、路由和业务模型配置未改。服务端关系修改只保存关系字段及原档案JSON,不把本次只读展示偷偷写回旧档案。
|
||||
|
||||
本批无schema改动、不需要重建库。回滚只切回上一个程序版本;旧版忽略JSON新增字段。服务器切换前按HEL-784要求备份,不能删除、替换或重算用户档案。浏览器新加 `cg.real.display` 仅保存减少动效偏好;不存真实聊天或底色。
|
||||
|
||||
## 给HEL-784的部署交接
|
||||
|
||||
1. 重新读取PR#4最新head,与本轮交付SHA一致后审核;base仍main。远端若另有推进,先协调,不覆盖。
|
||||
2. 独立运行检查,实际看截图及流式/取消/渐入渐出,特别检查用户原截图对应的手机短视口和长回复。
|
||||
3. 安装方式沿用 `docs/r1/IMPLEMENTATION.md`:Python≥3.11、`requirements.lock`、安装当前包,`npm ci --prefix web` 和 `npm run build --prefix web`。浏览器测试可选Playwright,不是部署依赖。
|
||||
4. 审核通过才部署8310的新release,保留现有用户库,切换前备份;不要把本轮临时测试库、测试人物或演示存储带上服务器。8300和其他服务不动。
|
||||
5. 回读现有档案/历史与health,检查新静态资源和旧档案补充说明;附件不要泄露真实聊天全文。记录部署SHA、备份位置和回滚指令。
|
||||
6. 本批用户尚未验收,不合并、不归档、不推进到收尾。
|
||||
|
After Width: | Height: | Size: 150 KiB |
|
After Width: | Height: | Size: 149 KiB |
|
After Width: | Height: | Size: 1.0 MiB |
|
After Width: | Height: | Size: 1.0 MiB |
@@ -0,0 +1,760 @@
|
||||
{
|
||||
"checks": [
|
||||
"Real creation: lunar leap month, all six explanations, same final confirmation; preview writes no rows",
|
||||
"Long Chinese stream: shown lines never change or re-key, ink plays once per line; pause/keyboard review is instant; record keeps everything",
|
||||
"12 viewport/theme combinations: lines stay inside the stage, stage/reader/composer/navigation never overlap; Esc closes full text with focus back; full history reachable",
|
||||
"390x420 and 390x430, both themes: with the input focused, the first press on send, review, pause/continue and full text acts; the dialogue does not move between press and release",
|
||||
"Cancel then immediate new turn, model error and same-turn retry preserve roles and avoid duplicate user messages",
|
||||
"Stop then new turn with busy (700 ms) frames: your line keeps its own time and her reply follows; the reading clock counts real time",
|
||||
"Restored real pages: city search/empty, appearance/check/compare, backup/recovery, four services/live health, life/memory groups; unsaved close guard",
|
||||
"Escape navigation; browser display preference survives reload; settings/system reduced motion uses gentle opacity",
|
||||
"Demo has its own profile, voice simulation, life/detail/chat/return path and zero API requests"
|
||||
],
|
||||
"viewports": [
|
||||
{
|
||||
"width": 1440,
|
||||
"height": 900,
|
||||
"theme": "moon",
|
||||
"stage": {
|
||||
"top": 605.609375,
|
||||
"bottom": 733.609375,
|
||||
"left": 250,
|
||||
"right": 1190,
|
||||
"height": 128
|
||||
},
|
||||
"reader": {
|
||||
"top": 762,
|
||||
"bottom": 792,
|
||||
"left": 596.484375,
|
||||
"right": 843.515625,
|
||||
"height": 30
|
||||
},
|
||||
"composer": {
|
||||
"top": 798,
|
||||
"bottom": 848,
|
||||
"left": 400,
|
||||
"right": 1040,
|
||||
"height": 50
|
||||
},
|
||||
"nav": {
|
||||
"top": 860,
|
||||
"bottom": 894,
|
||||
"left": 582,
|
||||
"right": 858,
|
||||
"height": 34
|
||||
},
|
||||
"lines": [
|
||||
{
|
||||
"top": 643.21875,
|
||||
"bottom": 665.71875,
|
||||
"left": 596.625,
|
||||
"right": 887.328125,
|
||||
"height": 22.5
|
||||
},
|
||||
{
|
||||
"top": 699.109375,
|
||||
"bottom": 733.609375,
|
||||
"left": 555.765625,
|
||||
"right": 884.21875,
|
||||
"height": 34.5
|
||||
}
|
||||
],
|
||||
"overflow": false
|
||||
},
|
||||
{
|
||||
"width": 1440,
|
||||
"height": 900,
|
||||
"theme": "fog",
|
||||
"stage": {
|
||||
"top": 605.609375,
|
||||
"bottom": 733.609375,
|
||||
"left": 250,
|
||||
"right": 1190,
|
||||
"height": 128
|
||||
},
|
||||
"reader": {
|
||||
"top": 762,
|
||||
"bottom": 792,
|
||||
"left": 596.484375,
|
||||
"right": 843.515625,
|
||||
"height": 30
|
||||
},
|
||||
"composer": {
|
||||
"top": 798,
|
||||
"bottom": 848,
|
||||
"left": 400,
|
||||
"right": 1040,
|
||||
"height": 50
|
||||
},
|
||||
"nav": {
|
||||
"top": 860,
|
||||
"bottom": 894,
|
||||
"left": 582,
|
||||
"right": 858,
|
||||
"height": 34
|
||||
},
|
||||
"lines": [
|
||||
{
|
||||
"top": 643.21875,
|
||||
"bottom": 665.71875,
|
||||
"left": 596.625,
|
||||
"right": 887.328125,
|
||||
"height": 22.5
|
||||
},
|
||||
{
|
||||
"top": 699.109375,
|
||||
"bottom": 733.609375,
|
||||
"left": 555.765625,
|
||||
"right": 884.21875,
|
||||
"height": 34.5
|
||||
}
|
||||
],
|
||||
"overflow": false
|
||||
},
|
||||
{
|
||||
"width": 360,
|
||||
"height": 640,
|
||||
"theme": "moon",
|
||||
"stage": {
|
||||
"top": 362,
|
||||
"bottom": 494,
|
||||
"left": 10,
|
||||
"right": 350,
|
||||
"height": 132
|
||||
},
|
||||
"reader": {
|
||||
"top": 496,
|
||||
"bottom": 526,
|
||||
"left": 72.5,
|
||||
"right": 287.5,
|
||||
"height": 30
|
||||
},
|
||||
"composer": {
|
||||
"top": 532,
|
||||
"bottom": 580,
|
||||
"left": 10,
|
||||
"right": 350,
|
||||
"height": 48
|
||||
},
|
||||
"nav": {
|
||||
"top": 586,
|
||||
"bottom": 634,
|
||||
"left": 30,
|
||||
"right": 330,
|
||||
"height": 48
|
||||
},
|
||||
"lines": [
|
||||
{
|
||||
"top": 412.453125,
|
||||
"bottom": 432.59375,
|
||||
"left": 155.5625,
|
||||
"right": 248.390625,
|
||||
"height": 20.140625
|
||||
},
|
||||
{
|
||||
"top": 466.109375,
|
||||
"bottom": 494,
|
||||
"left": 51.46875,
|
||||
"right": 308.515625,
|
||||
"height": 27.890625
|
||||
}
|
||||
],
|
||||
"overflow": false
|
||||
},
|
||||
{
|
||||
"width": 360,
|
||||
"height": 640,
|
||||
"theme": "fog",
|
||||
"stage": {
|
||||
"top": 362,
|
||||
"bottom": 494,
|
||||
"left": 10,
|
||||
"right": 350,
|
||||
"height": 132
|
||||
},
|
||||
"reader": {
|
||||
"top": 496,
|
||||
"bottom": 526,
|
||||
"left": 72.5,
|
||||
"right": 287.5,
|
||||
"height": 30
|
||||
},
|
||||
"composer": {
|
||||
"top": 532,
|
||||
"bottom": 580,
|
||||
"left": 10,
|
||||
"right": 350,
|
||||
"height": 48
|
||||
},
|
||||
"nav": {
|
||||
"top": 586,
|
||||
"bottom": 634,
|
||||
"left": 30,
|
||||
"right": 330,
|
||||
"height": 48
|
||||
},
|
||||
"lines": [
|
||||
{
|
||||
"top": 412.453125,
|
||||
"bottom": 432.59375,
|
||||
"left": 155.5625,
|
||||
"right": 248.390625,
|
||||
"height": 20.140625
|
||||
},
|
||||
{
|
||||
"top": 466.109375,
|
||||
"bottom": 494,
|
||||
"left": 51.46875,
|
||||
"right": 308.515625,
|
||||
"height": 27.890625
|
||||
}
|
||||
],
|
||||
"overflow": false
|
||||
},
|
||||
{
|
||||
"width": 390,
|
||||
"height": 700,
|
||||
"theme": "moon",
|
||||
"stage": {
|
||||
"top": 422,
|
||||
"bottom": 554,
|
||||
"left": 10,
|
||||
"right": 380,
|
||||
"height": 132
|
||||
},
|
||||
"reader": {
|
||||
"top": 556,
|
||||
"bottom": 586,
|
||||
"left": 87.5,
|
||||
"right": 302.5,
|
||||
"height": 30
|
||||
},
|
||||
"composer": {
|
||||
"top": 592,
|
||||
"bottom": 640,
|
||||
"left": 10,
|
||||
"right": 380,
|
||||
"height": 48
|
||||
},
|
||||
"nav": {
|
||||
"top": 646,
|
||||
"bottom": 694,
|
||||
"left": 45,
|
||||
"right": 345,
|
||||
"height": 48
|
||||
},
|
||||
"lines": [
|
||||
{
|
||||
"top": 472.453125,
|
||||
"bottom": 492.59375,
|
||||
"left": 91,
|
||||
"right": 342.953125,
|
||||
"height": 20.140625
|
||||
},
|
||||
{
|
||||
"top": 526.109375,
|
||||
"bottom": 554,
|
||||
"left": 66.46875,
|
||||
"right": 323.515625,
|
||||
"height": 27.890625
|
||||
}
|
||||
],
|
||||
"overflow": false
|
||||
},
|
||||
{
|
||||
"width": 390,
|
||||
"height": 700,
|
||||
"theme": "fog",
|
||||
"stage": {
|
||||
"top": 422,
|
||||
"bottom": 554,
|
||||
"left": 10,
|
||||
"right": 380,
|
||||
"height": 132
|
||||
},
|
||||
"reader": {
|
||||
"top": 556,
|
||||
"bottom": 586,
|
||||
"left": 87.5,
|
||||
"right": 302.5,
|
||||
"height": 30
|
||||
},
|
||||
"composer": {
|
||||
"top": 592,
|
||||
"bottom": 640,
|
||||
"left": 10,
|
||||
"right": 380,
|
||||
"height": 48
|
||||
},
|
||||
"nav": {
|
||||
"top": 646,
|
||||
"bottom": 694,
|
||||
"left": 45,
|
||||
"right": 345,
|
||||
"height": 48
|
||||
},
|
||||
"lines": [
|
||||
{
|
||||
"top": 472.453125,
|
||||
"bottom": 492.59375,
|
||||
"left": 91,
|
||||
"right": 342.953125,
|
||||
"height": 20.140625
|
||||
},
|
||||
{
|
||||
"top": 526.109375,
|
||||
"bottom": 554,
|
||||
"left": 66.46875,
|
||||
"right": 323.515625,
|
||||
"height": 27.890625
|
||||
}
|
||||
],
|
||||
"overflow": false
|
||||
},
|
||||
{
|
||||
"width": 390,
|
||||
"height": 844,
|
||||
"theme": "moon",
|
||||
"stage": {
|
||||
"top": 566,
|
||||
"bottom": 698,
|
||||
"left": 10,
|
||||
"right": 380,
|
||||
"height": 132
|
||||
},
|
||||
"reader": {
|
||||
"top": 700,
|
||||
"bottom": 730,
|
||||
"left": 87.5,
|
||||
"right": 302.5,
|
||||
"height": 30
|
||||
},
|
||||
"composer": {
|
||||
"top": 736,
|
||||
"bottom": 784,
|
||||
"left": 10,
|
||||
"right": 380,
|
||||
"height": 48
|
||||
},
|
||||
"nav": {
|
||||
"top": 790,
|
||||
"bottom": 838,
|
||||
"left": 45,
|
||||
"right": 345,
|
||||
"height": 48
|
||||
},
|
||||
"lines": [
|
||||
{
|
||||
"top": 616.453125,
|
||||
"bottom": 636.59375,
|
||||
"left": 91,
|
||||
"right": 342.953125,
|
||||
"height": 20.140625
|
||||
},
|
||||
{
|
||||
"top": 670.109375,
|
||||
"bottom": 698,
|
||||
"left": 66.46875,
|
||||
"right": 323.515625,
|
||||
"height": 27.890625
|
||||
}
|
||||
],
|
||||
"overflow": false
|
||||
},
|
||||
{
|
||||
"width": 390,
|
||||
"height": 844,
|
||||
"theme": "fog",
|
||||
"stage": {
|
||||
"top": 566,
|
||||
"bottom": 698,
|
||||
"left": 10,
|
||||
"right": 380,
|
||||
"height": 132
|
||||
},
|
||||
"reader": {
|
||||
"top": 700,
|
||||
"bottom": 730,
|
||||
"left": 87.5,
|
||||
"right": 302.5,
|
||||
"height": 30
|
||||
},
|
||||
"composer": {
|
||||
"top": 736,
|
||||
"bottom": 784,
|
||||
"left": 10,
|
||||
"right": 380,
|
||||
"height": 48
|
||||
},
|
||||
"nav": {
|
||||
"top": 790,
|
||||
"bottom": 838,
|
||||
"left": 45,
|
||||
"right": 345,
|
||||
"height": 48
|
||||
},
|
||||
"lines": [
|
||||
{
|
||||
"top": 616.453125,
|
||||
"bottom": 636.59375,
|
||||
"left": 91,
|
||||
"right": 342.953125,
|
||||
"height": 20.140625
|
||||
},
|
||||
{
|
||||
"top": 670.109375,
|
||||
"bottom": 698,
|
||||
"left": 66.46875,
|
||||
"right": 323.515625,
|
||||
"height": 27.890625
|
||||
}
|
||||
],
|
||||
"overflow": false
|
||||
},
|
||||
{
|
||||
"width": 390,
|
||||
"height": 420,
|
||||
"theme": "moon",
|
||||
"stage": {
|
||||
"top": 206,
|
||||
"bottom": 284,
|
||||
"left": 10,
|
||||
"right": 380,
|
||||
"height": 78
|
||||
},
|
||||
"reader": {
|
||||
"top": 284,
|
||||
"bottom": 314,
|
||||
"left": 87.5,
|
||||
"right": 302.5,
|
||||
"height": 30
|
||||
},
|
||||
"composer": {
|
||||
"top": 318,
|
||||
"bottom": 366,
|
||||
"left": 10,
|
||||
"right": 380,
|
||||
"height": 48
|
||||
},
|
||||
"nav": {
|
||||
"top": 436,
|
||||
"bottom": 480,
|
||||
"left": 45,
|
||||
"right": 345,
|
||||
"height": 44
|
||||
},
|
||||
"lines": [
|
||||
{
|
||||
"top": 259.203125,
|
||||
"bottom": 284,
|
||||
"left": 80.75,
|
||||
"right": 309.234375,
|
||||
"height": 24.796875
|
||||
}
|
||||
],
|
||||
"overflow": false
|
||||
},
|
||||
{
|
||||
"width": 390,
|
||||
"height": 420,
|
||||
"theme": "fog",
|
||||
"stage": {
|
||||
"top": 206,
|
||||
"bottom": 284,
|
||||
"left": 10,
|
||||
"right": 380,
|
||||
"height": 78
|
||||
},
|
||||
"reader": {
|
||||
"top": 284,
|
||||
"bottom": 314,
|
||||
"left": 87.5,
|
||||
"right": 302.5,
|
||||
"height": 30
|
||||
},
|
||||
"composer": {
|
||||
"top": 318,
|
||||
"bottom": 366,
|
||||
"left": 10,
|
||||
"right": 380,
|
||||
"height": 48
|
||||
},
|
||||
"nav": {
|
||||
"top": 436,
|
||||
"bottom": 480,
|
||||
"left": 45,
|
||||
"right": 345,
|
||||
"height": 44
|
||||
},
|
||||
"lines": [
|
||||
{
|
||||
"top": 259.203125,
|
||||
"bottom": 284,
|
||||
"left": 80.75,
|
||||
"right": 309.234375,
|
||||
"height": 24.796875
|
||||
}
|
||||
],
|
||||
"overflow": false
|
||||
},
|
||||
{
|
||||
"width": 844,
|
||||
"height": 390,
|
||||
"theme": "moon",
|
||||
"stage": {
|
||||
"top": 174,
|
||||
"bottom": 252,
|
||||
"left": 50.640625,
|
||||
"right": 793.359375,
|
||||
"height": 78
|
||||
},
|
||||
"reader": {
|
||||
"top": 252,
|
||||
"bottom": 282,
|
||||
"left": 359.484375,
|
||||
"right": 484.5,
|
||||
"height": 30
|
||||
},
|
||||
"composer": {
|
||||
"top": 286,
|
||||
"bottom": 336,
|
||||
"left": 102,
|
||||
"right": 742,
|
||||
"height": 50
|
||||
},
|
||||
"nav": {
|
||||
"top": 406,
|
||||
"bottom": 450,
|
||||
"left": 284,
|
||||
"right": 560,
|
||||
"height": 44
|
||||
},
|
||||
"lines": [
|
||||
{
|
||||
"top": 227.203125,
|
||||
"bottom": 252,
|
||||
"left": 307.75,
|
||||
"right": 536.234375,
|
||||
"height": 24.796875
|
||||
}
|
||||
],
|
||||
"overflow": false
|
||||
},
|
||||
{
|
||||
"width": 844,
|
||||
"height": 390,
|
||||
"theme": "fog",
|
||||
"stage": {
|
||||
"top": 174,
|
||||
"bottom": 252,
|
||||
"left": 50.640625,
|
||||
"right": 793.359375,
|
||||
"height": 78
|
||||
},
|
||||
"reader": {
|
||||
"top": 252,
|
||||
"bottom": 282,
|
||||
"left": 359.484375,
|
||||
"right": 484.5,
|
||||
"height": 30
|
||||
},
|
||||
"composer": {
|
||||
"top": 286,
|
||||
"bottom": 336,
|
||||
"left": 102,
|
||||
"right": 742,
|
||||
"height": 50
|
||||
},
|
||||
"nav": {
|
||||
"top": 406,
|
||||
"bottom": 450,
|
||||
"left": 284,
|
||||
"right": 560,
|
||||
"height": 44
|
||||
},
|
||||
"lines": [
|
||||
{
|
||||
"top": 227.203125,
|
||||
"bottom": 252,
|
||||
"left": 307.75,
|
||||
"right": 536.234375,
|
||||
"height": 24.796875
|
||||
}
|
||||
],
|
||||
"overflow": false
|
||||
}
|
||||
],
|
||||
"motion": {
|
||||
"inked_lines": {
|
||||
"6fc4f8ff-218a-4c0a-933c-7982fef596b6:1:0": 1
|
||||
},
|
||||
"slow_frames_new_turn_to_reply_s": 2.31
|
||||
},
|
||||
"console_errors": [],
|
||||
"limits": [
|
||||
"Chromium only; physical phone keyboard, Safari and screen reader not tested.",
|
||||
"LLM is controlled for deterministic long-stream/error/cancel checks, not a live gateway."
|
||||
],
|
||||
"compact_first_press": [
|
||||
{
|
||||
"size": "390x420",
|
||||
"theme": "moon",
|
||||
"down": 182,
|
||||
"up": 182,
|
||||
"typing": false,
|
||||
"target": "发送"
|
||||
},
|
||||
{
|
||||
"size": "390x420",
|
||||
"theme": "moon",
|
||||
"down": 182,
|
||||
"up": 182,
|
||||
"typing": false,
|
||||
"target": "上一句"
|
||||
},
|
||||
{
|
||||
"size": "390x420",
|
||||
"theme": "moon",
|
||||
"down": 182,
|
||||
"up": 182,
|
||||
"typing": false,
|
||||
"target": "暂停"
|
||||
},
|
||||
{
|
||||
"size": "390x420",
|
||||
"theme": "moon",
|
||||
"down": 182,
|
||||
"up": 182,
|
||||
"typing": false,
|
||||
"target": "继续"
|
||||
},
|
||||
{
|
||||
"size": "390x420",
|
||||
"theme": "moon",
|
||||
"down": 182,
|
||||
"up": 182,
|
||||
"typing": false,
|
||||
"target": "全文"
|
||||
},
|
||||
{
|
||||
"size": "390x420",
|
||||
"theme": "fog",
|
||||
"down": 182,
|
||||
"up": 182,
|
||||
"typing": false,
|
||||
"target": "发送"
|
||||
},
|
||||
{
|
||||
"size": "390x420",
|
||||
"theme": "fog",
|
||||
"down": 182,
|
||||
"up": 182,
|
||||
"typing": false,
|
||||
"target": "上一句"
|
||||
},
|
||||
{
|
||||
"size": "390x420",
|
||||
"theme": "fog",
|
||||
"down": 182,
|
||||
"up": 182,
|
||||
"typing": false,
|
||||
"target": "暂停"
|
||||
},
|
||||
{
|
||||
"size": "390x420",
|
||||
"theme": "fog",
|
||||
"down": 182,
|
||||
"up": 182,
|
||||
"typing": false,
|
||||
"target": "继续"
|
||||
},
|
||||
{
|
||||
"size": "390x420",
|
||||
"theme": "fog",
|
||||
"down": 182,
|
||||
"up": 182,
|
||||
"typing": false,
|
||||
"target": "全文"
|
||||
},
|
||||
{
|
||||
"size": "390x430",
|
||||
"theme": "moon",
|
||||
"down": 192,
|
||||
"up": 192,
|
||||
"typing": false,
|
||||
"target": "发送"
|
||||
},
|
||||
{
|
||||
"size": "390x430",
|
||||
"theme": "moon",
|
||||
"down": 192,
|
||||
"up": 192,
|
||||
"typing": false,
|
||||
"target": "上一句"
|
||||
},
|
||||
{
|
||||
"size": "390x430",
|
||||
"theme": "moon",
|
||||
"down": 192,
|
||||
"up": 192,
|
||||
"typing": false,
|
||||
"target": "暂停"
|
||||
},
|
||||
{
|
||||
"size": "390x430",
|
||||
"theme": "moon",
|
||||
"down": 192,
|
||||
"up": 192,
|
||||
"typing": false,
|
||||
"target": "继续"
|
||||
},
|
||||
{
|
||||
"size": "390x430",
|
||||
"theme": "moon",
|
||||
"down": 192,
|
||||
"up": 192,
|
||||
"typing": false,
|
||||
"target": "全文"
|
||||
},
|
||||
{
|
||||
"size": "390x430",
|
||||
"theme": "fog",
|
||||
"down": 192,
|
||||
"up": 192,
|
||||
"typing": false,
|
||||
"target": "发送"
|
||||
},
|
||||
{
|
||||
"size": "390x430",
|
||||
"theme": "fog",
|
||||
"down": 192,
|
||||
"up": 192,
|
||||
"typing": false,
|
||||
"target": "上一句"
|
||||
},
|
||||
{
|
||||
"size": "390x430",
|
||||
"theme": "fog",
|
||||
"down": 192,
|
||||
"up": 192,
|
||||
"typing": false,
|
||||
"target": "暂停"
|
||||
},
|
||||
{
|
||||
"size": "390x430",
|
||||
"theme": "fog",
|
||||
"down": 192,
|
||||
"up": 192,
|
||||
"typing": false,
|
||||
"target": "继续"
|
||||
},
|
||||
{
|
||||
"size": "390x430",
|
||||
"theme": "fog",
|
||||
"down": 192,
|
||||
"up": 192,
|
||||
"typing": false,
|
||||
"target": "全文"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 140 KiB |
|
After Width: | Height: | Size: 226 KiB |
|
After Width: | Height: | Size: 230 KiB |
|
After Width: | Height: | Size: 388 KiB |
|
After Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 158 KiB |
|
After Width: | Height: | Size: 433 KiB |
|
After Width: | Height: | Size: 386 KiB |
|
After Width: | Height: | Size: 276 KiB |
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"checks": [
|
||||
"desktop: four-step real creation, side-effect-free lunar preview, mandatory relationship",
|
||||
"real gateway: complete streamed reply and second turn recalls 蓝色风铃 from server context",
|
||||
"real gateway: cancel after first delta, upstream request closed, no complete assistant row",
|
||||
"independent Chromium context 390×844: same companion/history; both themes; IME and Shift+Enter",
|
||||
"server restart on same origin: epoch 1→2, existing page sends automatically, data retained",
|
||||
"controlled SSE model error: Chinese notice, draft retained, same-turn retry without duplicate user row",
|
||||
"controlled blocked upstream: immediate cancellation/new question isolation",
|
||||
"mobile: relation cancel/confirm/save restores from server; unfinished life has no demo records/console"
|
||||
],
|
||||
"real_dialogue": [
|
||||
{
|
||||
"input": "请记住我们这次聊天的暗号是蓝色风铃。简短回应一句就好。",
|
||||
"reply": "好,暗号是蓝色风铃。",
|
||||
"source": "real gateway"
|
||||
},
|
||||
{
|
||||
"input": "刚才我们的暗号是什么?请直接回答。",
|
||||
"reply": "蓝色风铃",
|
||||
"source": "real gateway"
|
||||
},
|
||||
{
|
||||
"input": "重启后继续",
|
||||
"reply": "答复",
|
||||
"source": "controlled provider"
|
||||
},
|
||||
{
|
||||
"input": "新轮不会串台",
|
||||
"reply": "答复",
|
||||
"source": "controlled provider"
|
||||
}
|
||||
],
|
||||
"console_errors": []
|
||||
}
|
||||
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 1.0 MiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 398 KiB |
|
After Width: | Height: | Size: 194 KiB |
|
After Width: | Height: | Size: 122 KiB |
|
After Width: | Height: | Size: 251 KiB |
|
After Width: | Height: | Size: 221 KiB |
|
After Width: | Height: | Size: 151 KiB |
|
After Width: | Height: | Size: 145 KiB |
|
After Width: | Height: | Size: 374 KiB |
|
After Width: | Height: | Size: 363 KiB |
|
After Width: | Height: | Size: 302 KiB |
|
After Width: | Height: | Size: 302 KiB |
|
After Width: | Height: | Size: 226 KiB |
|
After Width: | Height: | Size: 227 KiB |
|
After Width: | Height: | Size: 402 KiB |
|
After Width: | Height: | Size: 399 KiB |
|
After Width: | Height: | Size: 240 KiB |
|
After Width: | Height: | Size: 213 KiB |
|
After Width: | Height: | Size: 142 KiB |
|
After Width: | Height: | Size: 137 KiB |