2026-08-20 决策记录(凌晨场)
会话
20260818_120425_ea421c(04:41–05:26)产生的决策。详情见 2026-08-20。
1. OpenRouter 账单根因定案:auxiliary 兜底通道付费,非视觉(05:22–05:26)
- 用户疑问:OpenRouter 用量出现
google/gemini-3.6-flash,怀疑视觉能力误用付费中转(而非免费 Gemini API) - 排查结论:视觉链干净——
auxiliary.vision= provider google / gemini-3.7-flash /env:GOOGLE_API_KEY(免费配额);vision_ask.py降级链仅 ui-tars / qwen,无 OpenRouter Gemini - 真凶:Hermes auxiliary 客户端(上下文压缩/摘要等辅助任务)默认通道连接错误 → 自动 fallback 到 OpenRouter
google/gemini-3.6-flash(付费 SKU,非:free) - 证据:agent.log
2026-08-19 11:54:20 WARNING agent.auxiliary_client: PAID lane engaged ... not a :free SKU+Auxiliary compression: connection error on auto — falling back to openrouter;8/16 openrouter 插件注册行 - 成本现状:OpenRouter 充值 10.002**(8/20 API 查询 total_credits=15, total_usage=10.002)——已花追不回
- 定案修复:
auxiliary.free_only: true(fallback 仅允许:free模型)——经hermes configCLI 写入D:\hermes\config.yaml;agent 直接写 config 被安全策略拒绝(正常防护) - 生效:下次 Hermes 重启后(watchdog 自动重启,kill 不丢上下文)
- 后续监视规则:重启后 OpenRouter 再出现非 free 模型账单 = 有别的调用方,需再查(OpenClaw / image_gen / 子代理)
2. 远程关机走既有 skill 流程确认(04:41–04:42)
- IDA PC 关机用
windows-remote-idaskill(WinRMStop-Computer -Force+ ping 验证),无需新流程 - 踩坑记录:git-bash/MSYS 路径转换会把
D:\hermes\...吞成D:\d\hermes\...——传 Windows 脚本路径给 python 时用 Windows 风格路径
2026-08-20 决策记录(午后场 12:26–15:01)
会话
20260818_120425_ea421c午后段(Anne 报价单 QUOANNE0001 优化定稿)产生的决策。详情见 2026-08-20;规范落 skill hsdesign-quotation-format。
3. 报价单格式规范定稿:同类合并仅限两类(12:30–12:43)
- 用户原话:「surface light 不要一个一个地写……写了对应的 surface light 之后,在下面以 bullet point 的方式列出分别对应哪个 area,以及用了多少粒」
- 定稿范围:同类 item 合并一行 + bullets(area × 数量)仅限 electrical work + ceiling/partition work(易臃肿);其他部分不整合——「过度的简约会显得不专业」;shower screen 不 2 合 1
- 优化 = 替换/合并,非追加:不得新旧 section 并存(本次 PI 曾加新 section 留旧 section = 重叠 bug);Aluminium glass 不拆两 section
- 原因记录:用户 12:40 指出重叠 + 过度整合两个问题后收窄规则——规则须防「好心办坏事」
4. TBC(hidden)栏位功能上线(14:48–15:01)
- 用户决策:窗帘等待屋主确认项不放主报价单,放 TBC 栏位(不计总额,见屋主时再定)
- 实现:
pricing.ts排除 hidden 项 + quotation PDF 独立「To Be Confirmed — 待屋主确认」栏位(代码级,未来所有报价单可用) - 候选漏项全砍:countertop/鞋柜/电视墙/窗花/晾衣架/镜/智能锁/轨道——屋主已确定自购,不列;只保留冷气安装(屋主自购机、我们收安装费)
- 教训:建议候选清单前先问「屋主是否自购」——本次清单大部分被否,白跑一轮 steer
5. 旧草稿取消 = 状态置 cancelled,非删除(14:27–14:35)
- HSP00015(8/15 未定价草稿)内容被子集覆盖 → 用户确认取消;取消 ≠ 删除:status=cancelled、17 items 完整保留、UI 灰徽标随时可查(INV-2026-003 同例)
- 差异对比方法:D1 直查 Quotation/QuotationItem 两单 items(49 行)一次性对比,用户看证据再拍板
6. 预览 PDF = 真预览铁律(12:42–13:25)
- 「点预览 PDF 弹保存框」= bug(Content-Disposition 写死 attachment);修复 = 全 12 个 PDF 端点改 inline(浏览器内嵌预览,Chrome viewer 自带保存)
- 已写入报价生成规范——以后 PDF 端点一律 inline
2026-08-20 决策记录(黄昏场 15:01–17:48)
会话
20260818_120425_ea421c黄昏段(报价编辑器修复 + 数据安全机制)产生的决策。详情见 2026-08-20。
7. autosave 修复定案:保存响应不替换 state(15:26–17:37)
- 根因:保存响应
setItems(d.quotation.items)整体替换 items state → 受控输入框 value 重设 → 光标跳尾;PUT = deleteMany + 重建;debounce 2000ms 偏短 - 修复:保存响应只取
updatedAt更新冲突基准(不替换 state);输入继续 → 保留编辑标记继续调度;debounce 2s→3s - 定案原则:保存响应不得替换正在编辑的 state(同类 bug 防复发)
8. 报价单数据安全机制定案(用户拍板,15:54–15:58)
- 用户原话:「autosave 只能 save 一个版本吗?……不能用 git 的方式吗?——保持质量但占用空间又小」
- 四层架构:① 乐观锁:保存时版本比对,被改过 → 提示用户(不静默覆盖)② 字段级保存:只提交改动 item(冲突面 100%→~0%)③ quotation_revisions 变更历史表:diff 存储(itemId+字段+旧值→新值,几十字节/次,每月几千次 ≈ 几 MB)+一键回滚任意版本 ④ 每日快照备份 → Drive 保留 30 天(灾难恢复)
- 原则:报价单是单线编辑——轻量 diff 历史即可,不需要完整 git(无分支/合并复杂度)
9. 数据丢失事件定案(15:54–15:58)
- 损失:用户填的 electrical 单价(07:34 后)被后续整单保存覆盖丢失;D1
backups=0(未启用)+ 无行级历史 → 服务器拿不回 - 确认:删 4 项为有意(aircon master 安装 / ceiling light master bath / family room electrical / toilet accessories);wardrobe 7500 / 13A 192 已落库
- 定案:用户自己重填 electrical 单价;填前先看编辑器当前版本(避免基于旧快照);直接 API 写库更稳(绕开 autosave)——防护上线后此类丢失不再发生
10. TBC 语义确认 = 给顾客呈现的待定项(15:17)
- 用户意图:不确定做不做 / 难报价的项 → 放 TBC 栏位(不计总额);PDF 呈现给顾客 → 见面不会忘(报价单里永远摆着)
- 已确认实现即所需:PDF 独立「To Be Confirmed — 待屋主确认」栏位(主表后、价格列 TBC、附注未含总额)
11. 编辑器渲染 = 按 tradeGroup 聚合(16:25–17:48)
- 用户报 5 个编辑器问题 → 根因:数据无错(Aluminium Glass 4 项同组 ✅),编辑器按行顺序渲染 → 后加 item 被孤立成「单独 section」
- 定案:编辑器与 PDF 对齐——同组聚合渲染(主行 + bullet 子行缩进);修复含:描述自动换行 + 子项删除按钮 + section 标题去重
12. 高峰时段不派新任务(16:03)
- 14:00–18:00 = 高峰时段(PI 执行慢)→ 用户拍板:当前任务收尾后不派新任务,等 18:00 off-peak 再开工
2026-08-20 决策记录(晚场 17:48–21:10)
会话
20260818_120425_ea421c晚段(冲突防护/编辑器修复上线 + Mr Mark 报价 + Anne 数据恢复)。详情见 2026-08-20。
13. 部署窗口协议:不刷新 + TXT 双保险(18:40–19:29)
- 事件:PI 部署窗口期 worker 重建 → 用户 autosave「保存中」卡住(请求发给正在重建的 worker)→ 用户担心数据又要丢
- 定案协议:① 部署窗口绝不刷新/关页面(浏览器内存 = 唯一最新副本)② 立即复制整页 TXT 双保险(存档
D:\hermes\cache\anne_quote_backup_0820.txt)③ 部署完成后再点保存落库 ④ 页面崩 → TXT 重建 - 附带认知:webwatch「工具结果 → 思考」相隔 ~1h = PI 工具调用挂起特征(本次 = 本地 wrangler 部署挂起 60 分钟,Windows libuv 老毛病)
14. MasterAPP 部署现状澄清:已上 GitHub Actions,勿重复迁移(19:31 + cron 验证)
- 用户质疑「为什么用 wrangler 部署?不是有新方式了吗」→ 会话内回答「MasterAPP 还没迁移」判断有误(查了 Drive 源码目录——Drive 源按铁律本来就没有 .github)
- 实证:
hsd-cashflow-git/.github/workflows/deploy.yml存在,8/18 已切生产(Preview 先行 → main 直部署) - 真正待办:PI 部署任务仍走本地 wrangler(本地构建 40min 超时 + Retrying → 1h 挂起)→ 应统一
git push触发 Actions;不是再次迁移 - 用户决策:报价单优先,部署链路统一排队(本轮修复完 + 报价单整理好后再做)
- 规则补充(防误判):判断某站是否已云端化,看
D:\hermes\hsdesign_work\*-git\.github\workflows\,不看 Drive 源码
15. Mr Mark 报价价格语义假设标注(21:02–21:04)
- 用户给 3G/4G 单价(灶台门 115/160 per ft、上橱 136/152 per sf、抽屉 525/set)→ 按惯例当成本处理(markup 20% → 卖价 RM16,158)
- 假设明确标注:若这些是用户打算的卖价 → 总价应为 13,465(待用户确认,未确认前维持现报价)
16. Anne 数据再次丢失定案:旧 tab 绕过保护机制(21:06–21:10)
- 丢失根因:浏览器仍开着旧版本编辑器(部署窗口被叮嘱别刷新)→ 保存走旧流程 → 不进 revision(QuotationRevision = 0);每日备份 cron 刚建未跑 → 服务器侧无法找回
- 恢复路径定案:用户 TXT → 字段级 PATCH 写回(12 项,乐观锁 version=2 → rev3,进 revision 历史)→ 验证 grandTotal 35,140 / totalCost 29,400 / 利润 5,740
- 铁律:部署完成后必须刷新页面再编辑——旧 tab 的保存绕过一切新保护机制
- 闭环确认:数据找回 + rev3 历史 + 乐观锁/字段级保存上线 + 每日备份 cron 已建 → 同类事故机制上已封死
2026-08-20 决策记录(深夜场 21:12–24:00)
会话
20260818_120425_ea421c深夜段(部署真相源定案 + watcher 退役 + 报价单防泄漏/加价铁律 + Mr Mark 修正闭环)。详情见 2026-08-20、2026-08-21。
17. 单一真相源架构定案:三层各一源,非三者并行(22:49–22:53)
- 用户问「唯一真相源在 Drive / GitHub / Cloudflare,还是三者并行?」→ 定案:每层单一真相源
- 代码真相源 = GitHub(
JakeBilu/hsd-cashflowprivate):改代码唯一入口,push = 部署 - 部署产物 = Cloudflare(Workers/Pages):线上只认 Actions 产物
- 业务数据 = D1 + Drive:报价/顾客数据在 D1;Drive 保留为编辑入口/资料库(方案 A:watcher 只同步不构建)
- 代码真相源 = GitHub(
- 动机:三者并行 = 部署互踩的根源(watcher 构建 vs 手动构建)
18. Drive watcher 退役:只同步不构建(22:47–22:55)
- 实锤(drive_watcher.log):22:05 watcher 检测 Drive 代码变化 → 自动触发本地构建 → 22:11 失败 rc=1(6 分钟白跑)——正是 PI 报的「与 watcher 构建互踩」
- 定案:watcher 停用构建触发,只保留 Drive→本地镜像同步;部署一律走 git push(22:48 停用、23:06 确认无新触发)
19. 部署铁律固化(21:44–21:45,写入 master-app/AGENTS.md)
- 「改代码 → git push origin main → GitHub Actions 云端构建部署(~4 分钟)」;❌ 严禁本地 wrangler deploy(8/20 实测挂起 1 小时根源)
- PI 每个任务自动读 AGENTS.md——无需每次 steer
20. 派发簿记 bug 根治:finish 校验 + lock 卡死检测(23:04–23:10)
- 现象:marknk_fix「被跳过」两次(任务书归档到 done/ 但无 LOG 无报告 = 没跑)——用户观察到的「有时会跳过某些东西」真凶
- 根因:
domain_ctl.sh的 finish 不校验任务名是否匹配 lock → steer 流程误调用时把没跑的任务归档 - 补丁(已生效):① finish 校验 lock 匹配(不匹配拒绝归档)② lock 指向任务不在 running/ → 自动清理继续派——「任务被跳过」机制封死
- 附带:杀掉 3 个残留/重复进程(僵尸 + 双跑)→ 单进程
21. 快照铁律:历史文档绝不篡改(23:11–23:14,写入 AGENTS.md)
- 已开的 Invoice/Receipt/VO = 开票时的快照(顾客资料/金额原样保留)——绝不改旧记录(防数据混乱/找不回旧资料)
- 只有新建文档才取最新顾客资料;用户原话「旧的资料我们不要擅自篡改它」
22. 报价描述防泄漏铁律(23:18–23:24,写入 AGENTS.md)
- ① 成本数字(RM115/525/136 等)绝不进 description(顾客可见)② 升级/加购只写总价(+RM1,998)——不写 per foot/sqft 单价(单价×数量可反推成本范围)③ description 价格数字越少越好——顾客只需「大概」
- 本次实例:抽屉描述误写成本 RM525、4G 升级误写「RM160/ft 成本」→ 全清
- 数据改动直接生效,PI 下次读 D1 自然看到——但规则必须写铁律(防再犯)
23. add-on markup 铁律:卖价 = 成本 × 1.2(23:30–23:32,写入 AGENTS.md)
- 用户类比:「卖 300k 的屋子抽 3000,卖 500k 却还抽 3000——不合逻辑」
- 任何 add-on / 升级 / 额外事项:卖价 = 成本 × 1.2(差价必须 markup);只加成本 = 零利润 = 白干
- 实例:Mr Mark 4G 升级灶台成本差 45 → 卖价差 54、上橱 16 → 19.2,全套升级赚 525
24. Mr Mark 付款阶段定案 15/65/15/5(23:25–23:36)
- 印度顾客谨慎收款(用户明确):① 15% confirm ② 65% 工厂完成(拍照为证)→ 付款 → 才出货 ③ 15% 送达开工日 ④ 5% 完工后两周
- 演变:先 15/45/35/5 → 用户 23:34 改第二笔 65%、第三笔 15%(autosave 没存上才发现)→ 最终 15/65/15/5 已写库
25. autosave 漏网根因:付款阶段编辑缺 markDirty(23:34–23:37)
- 用户改付款 % 预览 PDF 不变 → 查证:items/description 编辑都有 markDirty(触发防抖保存),付款阶段 4 处 setPaymentTerm 全漏 markDirty() → 改 % 不触发 autosave,只有手动点「保存」才存
- 不是「越修越多 bug」——是这个漏网一直存在,当晚正好碰到
26. GitHub 认证盘点定案(22:03–22:08)
- PI 报「GitHub API 未认证」= 用错方式,认证其实全配好:① git push 部署 → SSH(id_ed25519,永久,已验证
Hi JakeBilu!)② GitHub API → PAT fine-grained(D:\hermes\secrets\gh_pat_hermes_cicd.txt,8/25 前有效,4 仓库 CI)③ PAT classic 永久 token vault 只有打码记录(ghp_uI…e0ag,完整值未落盘)④ ❌ 不要 gh auth login - 凭据去向更新见 github-credentials、CloudDeploy_Graph
27. 删除 bug 根因 + Door/Plumbing 描述恢复(21:18–22:10)
- bug:单行 item 点 ✕ = 清空整个 description(lines.length⇐1 分支)+ 删除按钮用错索引(删最后一个而非当前行)
- 修复:✕ 只在 bullet 行显示(单行根除)+ itemId 精确定位(不再误伤)——生产实测零误伤
- 恢复:Door + Plumbing 的 description 从 revision 历史找回(13:15:31 删除记录旧值全在)→ 字段级 PATCH 恢复(恢复也进 revision)
28. Mr Mark 4G 升级差价补 markup(21:12–21:14)
- 首版升级差价漏 markup(灶台 +45/ft、上橱 +16/sf、全套 +2,625 = 零利润)→ 修正:灶台 +54/ft(45×1.2)、上橱 +19.2/sf、全套 +3,150
- 与 #23 同源——升级也要赚