Engine by_time ledgers now include the full candidate set so posterior columns can look up fit and windows. Delivery turns keep up to three sentences after idle persist; the card subtracts repeated traits and folds the board chart. Co-authored-by: Cursor <cursoragent@cursor.com>
53 lines
4.9 KiB
Markdown
53 lines
4.9 KiB
Markdown
# PROGRESS · 三列对比卡修正与减法(BUG-614/615,2026-09-09)
|
||
|
||
工作树:`.worktrees/rectification-compare-card-polish-20260909`
|
||
分支:`codex/rectification-compare-card-polish-20260909`
|
||
任务书:`docs/tasks/TASK-rectification-compare-card-polish-20260909.md`
|
||
基线:任务书写 `origin/staging` @ `365ad799`;本 worktree 按开工时的 `origin/staging` `3005e36d`(任务书本身)切出。合入前 rebase 到当时的 `origin/staging`(含 `17b36f3a` 咨询 BUG-612/613、`584a56bd` 报告图布局 brief、`ca921c3f` 采集按钮/时间轴/已采用列,BUG-618~620)。已采用列继续 `disabled={busy || adopted}`,不把 BUG-618 冲掉。
|
||
|
||
本单状态:**待验收**。合入 staging 时更新落点 SHA。
|
||
|
||
预检:本机已跑 `python3 scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45`(含 `diagnose_external_engine_adapters.py --json`),远端可见性 `verified`。前端用 worktree 里指向主仓的 `frontend/node_modules` 符号链接。
|
||
|
||
未改:采用 RPC、各道门槛、`SCORE_DELTA`、四选项合同、时间轴、Skill 版本 / `references/conversation-strategy.md`。
|
||
|
||
## 做了什么
|
||
|
||
- **BUG-614** `column_times_for_compare(..., limit=9)` 覆盖引擎 `candidate_times` 去重全集。客户端 `lookupByTime` 缺键 → `fit: null` / `windows: null`,灰字「这一分钟还没对照」,不再把空表渲染成 `0 · 0 · 0`。
|
||
- **BUG-615** `trimSpokenTurnForInterview` 在 `persistNextInterviewIfIdle` **之后**执行:仍有下一问裁到一句;`terminalNote` 保留 ≤3 句。不得在 `streamAttempt` 里先裁。裁完若与流式正文不同,再发一条 `answer.delta` `replace`,气泡与落库一致。
|
||
- **卡片减法** 两列及以上共有性格句提到卡顶并改写成「两个/三个时间的…都在…」;列内 `fit_line` / `window_line`;无 `<h3>`;禁用「强相关 / 有关联 / 弱关联」。
|
||
- **右栏** `VedicChartSvg` 北印星盘;宫位表与换升时刻默认 `<details>`(summary「换升时刻 · N 个」);显示层并入同一折叠。换分钟只高亮变化宫,无动画。
|
||
|
||
## 三栏
|
||
|
||
| 用例 | 原值 | 新值 | 理由 |
|
||
| --- | --- | --- | --- |
|
||
| 引擎 5 个候选、卡片后验前三与引擎前三不同 | 后验列查不到键 → `0 · 0 · 0` / 「没有窗口」 | `by_time` 含全部候选分钟;列 `fit`/`windows` 有数 | 决策 1:按引擎候选集算,不是按卡片前三 |
|
||
| `by_time` 缺某一列的键 | 空数组当 0、当没有窗 | `fit === null`,DOM「这一分钟还没对照」 | 没算 ≠ 没有 |
|
||
| 三列 D10 同在巨蟹 | 三列各写一遍 | 卡顶一句「三个时间的事业盘都在巨蟹座:…」 | 相同句只写一次 |
|
||
| 交付轮模型写 4 句 | BUG-606 裁成 1 句 | `terminalNote` 时留 3 句 | 决策 2;BUG-595 三句口径 |
|
||
| 普通证据轮 3 句 | 1 句 | 仍 1 句 | BUG-606 采集轮不变 |
|
||
| 右栏本命 | 宫位表常驻 | 北印星盘 + 宫位表折叠 | 读屏仍可打开表 |
|
||
| 右栏换升时刻 | 逐分钟常驻列表 | 默认折叠「换升时刻 · N 个」 | 时间轴已表达同一件事 |
|
||
|
||
## 测试
|
||
|
||
- `frontend` `./node_modules/.bin/tsc --noEmit`:exit 0
|
||
- `npm run lint`:0 error / 107 warning(仓库既有 warning,无新增 error)
|
||
- 任务书切片 `tsx --test tests/rectification-*.test.ts tests/agent-voice-copy-contract.test.ts`(排除 database):**1063 passed / 0 failed**
|
||
- 本单针对性:`rectification-v9-agent.test.ts` 交付 4→3 句、证据 3→1 句;`rectification-range-delivery-20260907.test.ts` 后验前三有 `fit`、缺键「还没对照」;`rectification-board-model.test.ts` 北印星盘 + 换升默认折叠
|
||
- `.venv/bin/python -m pytest tests/test_rectification_v5_services.py::RectificationV5ServicesTest::test_compare_ledgers_cover_all_engine_candidate_times` 与 `test_compare_returns_ledger_and_windows_by_candidate_time`:**2 passed**。同文件 `test_block_scan_seven_events_finishes_within_fifteen_seconds` 本机 41s 超 15s 预算,与本单无关(既有壁钟断言,见 BUG-570 P2)
|
||
- 浏览器真人走查:无登录态,未见真实交付卡/右栏像素
|
||
|
||
## 偏离
|
||
|
||
1. 任务书基线 `365ad799`;worktree 从已推任务书的 `3005e36d` 切出。未把后续 staging 提交 rebase 进来。
|
||
2. 代表分钟缺 `by_time` 键时,经历 ledger 仍可回退到该分钟自己的 `eventDashaLedger`(不是填 0);窗口没有回退。缺键列只要 `windows == null` 仍显示「还没对照」。
|
||
3. 单列不把性格句提到卡顶(任务书写的是三列共有)。
|
||
4. 浏览器真人走查:本会话无登录态,未见真实交付卡/右栏像素。合同测试覆盖 DOM 字符串,不把它们写成已经看见真实会话。
|
||
5. 裁句后补一条 `answer.delta replace`。任务书只要求 idle 之后裁句;不补这条的话流式气泡会停在未裁正文。
|
||
|
||
## 环境缺口
|
||
|
||
无登录态、无生产/staging 走查。不把合同测试写成已经看见真实像素。
|