← 回普通工程日志
# 【9000/9001「任务进度」面板:改名 + 完整同步任务栏 + 可直接批阅(通过/驳回 + 理由输入框)】(用户 2(2026-10-15)
机器: 电脑A | 通用: 否

### 10-15 17:11 【9000/9001「任务进度」面板:改名 + 完整同步任务栏 + 可直接批阅(通过/驳回 + 理由输入框)】(用户 2
(这条待办条目已被删除)
# #5 【9000/9001「任务进度」面板:改名 + 完整同步任务栏 + 可直接批阅(通过/驳回 + 理由输入框)】(用户 2026-10-15 交办,晚风润色) ① 命名:把 9000/9001 里现在那个「看后台作业」按钮**改名为「任务进度」**;点开就是**任务栏目前的状态**(在聊天页就能看,不必来回切到 8190)。 ② 数据必须**完整匹配任务栏**:**完成度 / 已完成 / 未完成**与看板条目**同一时间同步**(同一数据源,不许各存一份;看板一改,面板立即跟着变)——用户明说这是有工作量的部分。 ③ 在面板里**直接批阅**:每条待验收条目上有【通过】【驳回】两个操作;**驳回时能填理由**(一个输入框,简单输入即可);提交后**同步写回看板状态 + 工程日志**(跟现有验收状态机一致,禁止另起一套逻辑)。 ④ 代码要解耦写干净:**换皮不影响机制**(用户后期会给任务看板/聊天页换皮)→ 数据接口独立、状态机独立、外观可换;禁止把逻辑写死进样式。 验收:① 按钮名就是「任务进度」✓ ② 打开看到任务栏实时状态,完成度/已完成/未完成与看板一致 ✓ ③ 面板内能点通过/驳回,驳回能填理由,回看板与工程日志都同步 ✓ ④ 改样式(换皮)后机制照常工作 ✓ ⑤ **只交报告=没完成** ✗;必须真改线上文件 + 上线 + 备份 ✓

归属日期: 2026-10-15
序号: 5
当前状态: ✅ 已通过(第1次)
被接手次数: 1

该任务出现时间为
2026-10-15-本次第一次

---

## 2026-10-15 第1次
- 执行者: Qwen3.8-27B(晚风/Hermes)
- 做了什么:
  1. `~/hermes-webchat/hermes_bridge.py`(改前备份 `.bak_20261015_taskpanel`):
     - 新增常量 `TASK_MD/TASK_STATE/TASK_REVIEW_URL`(改后 L71-76,可用 CHAT_TASK_* 环境变量覆盖)
     - 新增 `_task_key()` / `_task_board()` / `_task_review()`(改后 L190-260):`_task_board` 每次现读 `~/桌面/待办.md` + `~/手机待办/task_state.json`(解析规则、md5 状态 key 与 `todo_server.py` 完全一致,桥侧不缓存、不存副本);`_task_review` 用 http.client 把 idx/result/note 以表单编码代理到 `127.0.0.1:8190/review`(状态机唯一发生地)
     - do_GET 加 `GET /api/taskboard`(改后 L1502-1504);do_POST 加 `POST /api/taskboard/review`(改后 L1688-1698,参数校验后代理)
  2. `~/hermes-webchat/ui.html`(改前备份 `.bak_20261015_taskpanel`):
     - 按钮「看后台作业」→「任务进度」:L398 `<button id="taskLink">`(原 L378 `#jobsLink`)
     - 面板 `#jobsPanel`→`#taskPanel`(原 L382);CSS 整块替换为 `#taskLink/#taskPanel/.tp-*`(原 L321-345)
     - JS 整块替换(原 L1738-1851 作业逻辑):`loadTasks/renderTasks/taskReview/toggleTasks`;面板=完成度条 + 🤖待你验收/📌未完成/✅已完成 三分区(分区口径与 8190 `render()` 一致);待验收条目带【✅通过】【❌驳回】+ 理由输入框(驳回空理由前端拦截并提示);批阅成功后重新读同源;面板打开时 10s 轮询同源
     - 暗色毛玻璃组 `.jobrow`→`.tp-row`(原 L353/L354)
  3. 未动:`todo_server.py`、`待办.md`、`task_state.json`、工程日志结构、编号规则、27B 配置、8190/8188/8001/B:8080 全部未碰(md5 前后一致)。
- 证据(真命令 + 原始输出):
  ```
  # 改前基线(线上)
  $ curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:9000/api/taskboard
  404
  $ curl -s http://127.0.0.1:9000/ | grep -o '看后台作业'
  看后台作业

  # 沙箱 E2E(/tmp/taskpanel_test:看板副本@9513 + 测试桥@9510,指向沙箱数据)
  $ curl http://127.0.0.1:9510/api/taskboard   # 与沙箱 待办.md/task_state.json 逐条比对
  per-item match: True   done count: 1 == source done count: 1
  $ curl -d '{"idx":11,"result":"pass","note":"沙箱自验:通过"}' http://127.0.0.1:9510/api/taskboard/review
  {"ok": true}   # 看板侧:status=passed,日志追加「## 2026-10-15 验收通过 - 备注: 沙箱自验:通过」,条目打钩
  $ curl -d '{"idx":12,"result":"fail","note":"沙箱自验:这里不对,返工"}' http://127.0.0.1:9510/api/taskboard/review
  {"ok": true}   # 看板侧:status=rework attempts=1,日志追加「第2次(验收失败)」+原因,条目取消勾选
  $ curl -d '{"idx":12,"result":"banana"}' -o /dev/null -w '%{http_code}\n' http://127.0.0.1:9510/api/taskboard/review
  400
  # 看板改标题→面板立刻同步(无缓存)
  before: 【8001 网盘·三项交互改进】用户 2    after: 【8001 网盘·三项交互改进(已编辑自验)】

  # DOM 级(headless Chrome CDP @9522 打 9510 页面)
  buttonText = "任务进度"
  panelSummary = "🤖 待你验收(2),📌 未完成(10),✅ 已完成(2) || 4/14"
  点 seq13【✅通过】→ chip 变 "✅ 已通过"
  点 seq14【❌驳回】空理由 → toast「驳回必须填理由(返工指令)」,状态不变
  填理由再点驳回 → chip 变 "🔁 2次出现"
  输入框内容 "输入框存活测试" 在开面板+批阅后原样保留(不碰 #4 的约束)

  # 上线(systemctl --user restart hermes-webchat hermes-webchat-27b,11:43:42 恢复 active)
  $ curl http://127.0.0.1:9000/api/taskboard  # 与真实 待办.md/task_state.json 逐条比对
  live 9000: ok=True total=10 done=1 left=9
  live 9001: ok=True total=10 done=1 left=9
  $ curl -s http://127.0.0.1:9000/ | grep -o '任务进度'
  任务进度
  $ curl -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8190/
  200
  $ md5sum -c pre_restart_md5.txt
  /home/zyf/桌面/待办.md: OK
  /home/zyf/手机待办/task_state.json: OK
  ```
- 结论: 改名 + 同源同步 + 面板内批阅(通过/驳回+理由)全部落地并实测;批阅走看板自己的 /review,状态机/日志/编号零改动;接口独立于样式(/api/taskboard*),换皮只动 CSS/HTML 类名。
- 遗留/卡点: 面板打开时 10s 轮询同源(与旧作业条同节奏),非 WebSocket 推送——如需秒级推送可后续在 8190 加事件流,本次不改看板。

## 2026-10-15 验收通过
- 验收人: 用户
- 备注: (无)
电脑A 10-20 22:34