Files
dsh_ai1net_server/docs/会话与接续/会话阈值自动接续_机制方案与成本实测_20260916.html
admin ce8e6ceed9 chore(工作区): 纳入版本控制基线(回收 411 MB 过程产物)
回收 411 MB(470 M → 58.8 M),全部经回收站,可恢复:
- 待清理/(146.2 M,含 relay 分片 128 M 与 42 项过程目录)
- tmp/(32.4 M,按接续棒命名的过程临时区)
- .workbuddy/tmp/(39.5 M)
- 4 份 workbuddy.db 冗余副本(101 M,09-23 事故的坏副本 / 抢救产物)
- tmp/im16/gw/centrifugo 二进制(63.9 M,可重下)+ 缓存残留

入库范围:常驻规则(CODEBUDDY.md / README.md / state.py)、在途接续入口与
接续包、docs/、交付物/、交接单/、归档/、scripts/、.codebuddy/、
.workbuddy/memory/;共 398 件,其中 >60 KB 的 26 件全为文档。

排除(.gitignore):tmp/、待清理/、运行态日志与缓存、*.db 与 DB 备份整目录、
打包二进制(*.tar.gz / *.tgz)、记忆修复前备份。
2026-09-24 07:51:03 +08:00

299 lines
25 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>会话阈值自动接续 · 机制方案与成本实测(2026-09-16)</title>
<style>
:root{--bg:#f6f7f9;--card:#fff;--ink:#16191d;--dim:#5b6470;--line:#e2e6ec;
--red:#c0392b;--green:#1e7a46;--amber:#b06d00;--blue:#1b5fa8;--violet:#6b3fa0;}
*{box-sizing:border-box}
body{margin:0;padding:34px 22px 70px;background:var(--bg);color:var(--ink);
font:15px/1.72 -apple-system,"Segoe UI","Microsoft YaHei",sans-serif;}
.wrap{max-width:940px;margin:0 auto}
h1{font-size:25px;margin:0 0 6px;letter-spacing:-.2px}
.sub{color:var(--dim);font-size:13px;margin-bottom:26px}
h2{font-size:18px;margin:38px 0 12px;padding-left:11px;border-left:4px solid var(--blue)}
h3{font-size:15px;margin:22px 0 8px;color:var(--dim);font-weight:600}
p{margin:9px 0}
code{background:#eef1f5;padding:1.5px 5px;border-radius:4px;font-size:13px;
font-family:ui-monospace,Consolas,monospace}
.card{background:var(--card);border:1px solid var(--line);border-radius:11px;
padding:18px 20px;margin:14px 0;box-shadow:0 1px 3px rgba(16,24,40,.05)}
.verdict{background:#fff;border-left:5px solid var(--red);border-radius:9px;padding:16px 20px;margin:18px 0}
.verdict b{color:var(--red)}
table{border-collapse:collapse;width:100%;font-size:13.5px;margin:12px 0}
th,td{border:1px solid var(--line);padding:7px 10px;text-align:left}
th{background:#eef1f5;font-weight:600;font-size:12.5px;color:var(--dim)}
td.n{text-align:right;font-variant-numeric:tabular-nums;font-family:ui-monospace,Consolas,monospace}
tr.hi td{background:#fdf3f2}
tr.lo td{background:#f2f9f4}
.tag{display:inline-block;font-size:11.5px;padding:1px 7px;border-radius:20px;
border:1px solid currentColor;line-height:1.6}
.t-red{color:var(--red)}.t-green{color:var(--green)}.t-amber{color:var(--amber)}
.t-blue{color:var(--blue)}.t-violet{color:var(--violet)}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:14px}
@media(max-width:760px){.grid2{grid-template-columns:1fr}}
ul,ol{margin:8px 0 8px 20px;padding:0}
li{margin:5px 0}
.kv{display:flex;gap:10px;font-size:13.5px;margin:5px 0}
.kv .k{color:var(--dim);min-width:126px}
.bar{height:15px;border-radius:3px;display:inline-block;vertical-align:middle}
.note{font-size:12.5px;color:var(--dim);margin-top:8px}
.big{font-size:22px;font-weight:700;font-variant-numeric:tabular-nums}
.chain{font-family:ui-monospace,Consolas,monospace;font-size:12.5px;line-height:2;
background:#f2f4f8;border-radius:8px;padding:14px 16px;overflow-x:auto;white-space:pre}
</style>
</head>
<body><div class="wrap">
<h1>会话阈值自动接续:机制方案 + 成本实测</h1>
<div class="sub">2026-09-16 · 数据源 = <code>workbuddy.db</code> 的 <code>session_usage.credit_json</code> 与 <code>automation_runs.runs_json</code>(宿主真实计费字段,非估算)</div>
<div class="verdict">
<b>判定三句:</b><br>
① <b>「token 达阈值自动开新会话」能建,但只建成「半自动」</b>——宿主无创建会话的 API,唯一通道是自动化(<b>已实测</b>:每次自动化运行都产生新 <code>sessionId</code>);钩子只能注入指令,末段动作必须由模型调 <code>automation_update</code> 完成。<br>
② <b>但它救不了你看到的那 7–8 积分</b>——实测那 7–8 分来自<b>一轮里跑了 31–54 次工具调用</b>,与会话新旧<b>无关</b>。三个自动化全部是<u>全新会话的第一轮</u>,分别烧掉 <b>8.93 / 10.05 / 13.82</b> 积分。<br>
③ <b>真杠杆是「一轮内的工具调用次数」,不是「会话寿命」</b>。换会话能省的只是「水位带来的约 3 倍单价膨胀」,属次要项。<br>
④ <b>接得上才是前提</b>——新会话必须能<u>校验</u>上一会话的进度,不能只读文字描述(实证:上一条接续点把对象写错了)。已升级为「接续包 v2 + 开机四步」,见 <b>§五</b>。
</div>
<h2>一、实测成本模型(8 次自动化运行,宿主原始计费字段)</h2>
<table>
<tr><th>自动化运行</th><th>上下文 input tokens</th><th>工具调用</th><th>积分</th><th>积分 / 工具</th><th>缓存命中</th></tr>
<tr class="hi"><td>覆盖网络线·归档接续</td><td class="n">200,013</td><td class="n">54</td><td class="n">13.82</td><td class="n">0.256</td><td class="n">99.8%</td></tr>
<tr class="hi"><td>决策方法-2</td><td class="n">168,040</td><td class="n">37</td><td class="n">10.05</td><td class="n">0.272</td><td class="n">99.9%</td></tr>
<tr class="hi"><td>覆盖网络线·接续(优化版)</td><td class="n">141,401</td><td class="n">31</td><td class="n">8.93</td><td class="n">0.288</td><td class="n">99.8%</td></tr>
<tr class="lo"><td>代码仓三方同步 ③</td><td class="n">87,177</td><td class="n">20</td><td class="n">1.93</td><td class="n">0.097</td><td class="n">99.8%</td></tr>
<tr class="lo"><td>代码仓三方同步 ①</td><td class="n">64,876</td><td class="n">15</td><td class="n">1.66</td><td class="n">0.111</td><td class="n">97.9%</td></tr>
<tr class="lo"><td>遗留项自动推进</td><td class="n">82,712</td><td class="n">12</td><td class="n">1.20</td><td class="n">0.100</td><td class="n">98.7%</td></tr>
<tr class="lo"><td>代码仓三方同步 ④</td><td class="n">63,147</td><td class="n">16</td><td class="n">1.18</td><td class="n">0.074</td><td class="n">99.7%</td></tr>
<tr class="lo"><td>代码仓三方同步 ②</td><td class="n">56,422</td><td class="n">11</td><td class="n">0.82</td><td class="n">0.075</td><td class="n">98.5%</td></tr>
</table>
<h3>图:工具调用次数 → 积分(近乎线性)</h3>
<div class="card">
<div style="font-size:12.5px;color:#5b6470;margin-bottom:6px">红 = 水位 &gt;14 万(单价 ≈0.27)|绿 = 水位 &lt;9 万(单价 ≈0.09)</div>
<div style="display:flex;flex-direction:column;gap:7px;font-size:12.5px">
<div><span style="display:inline-block;width:150px">归档接续 54 次</span><span class="bar" style="width:414px;background:#c0392b"></span> <b>13.82</b></div>
<div><span style="display:inline-block;width:150px">决策方法-2 37 次</span><span class="bar" style="width:301px;background:#c0392b"></span> <b>10.05</b></div>
<div><span style="display:inline-block;width:150px">接续优化版 31 次</span><span class="bar" style="width:268px;background:#c0392b"></span> <b>8.93</b></div>
<div><span style="display:inline-block;width:150px">三方同步③ 20 次</span><span class="bar" style="width:58px;background:#1e7a46"></span> <b>1.93</b></div>
<div><span style="display:inline-block;width:150px">三方同步① 15 次</span><span class="bar" style="width:50px;background:#1e7a46"></span> <b>1.66</b></div>
<div><span style="display:inline-block;width:150px">遗留项推进 12 次</span><span class="bar" style="width:36px;background:#1e7a46"></span> <b>1.20</b></div>
<div><span style="display:inline-block;width:150px">三方同步④ 16 次</span><span class="bar" style="width:35px;background:#1e7a46"></span> <b>1.18</b></div>
<div><span style="display:inline-block;width:150px">三方同步② 11 次</span><span class="bar" style="width:25px;background:#1e7a46"></span> <b>0.82</b></div>
</div>
<div class="note">同一批任务的 4 次「三方同步」单价 0.074–0.111(水位 5.6–8.7 万);三份覆盖网络/决策方法文档任务单价 0.256–0.288(水位 14–20 万)。</div>
</div>
<div class="card">
<b>成本公式(可复算)</b>
<div class="chain">一轮积分 ≈ 单价 × 该轮工具调用次数
单价 —— 随会话水位上升,实测同一会话内:
水位 &lt;10 万 ⇒ ≈ 0.10 积分 / 次工具调用
水位 15 万 ⇒ ≈ 0.41 积分 / 次工具调用 ← 4 倍
固定注入(每请求都要重发):
tools 20,734 + systemPrompt 10,395 + skills 3,919 + mcp 144 = 35,192 token
但缓存命中 99.5% ⇒ 固定注入被缓存价抹平,不是主因
(b08b1c35 实测:63,488 命中 / 1,388 未命中 = 97.9% 命中率)</div>
<div class="note">上表「单价」两簇(0.09 / 0.27)的差异来源:新会话 b08b1c35 内部给出了<b>同会话、同模型、仅水位不同</b>的对照——第 1 轮单价 0.106(起始水位 0),第 2 轮单价 0.412(水位 14.9 万)。⇒ 水位效应成立,非模型档位差异。</div>
</div>
<h2>二、为什么「开新会话」没省到钱</h2>
<div class="card">
<p><b>铁证</b>:三次「新建会话跑一次」的积分 = <b>8.93 / 10.05 / 13.82</b>,与你观察到的「提一轮就 7 8 个积分」完全吻合。而它们<b>每一个都是全新会话的第一轮</b>——证据在 <code>automation_runs.metadata_json</code>:</p>
<div class="chain">{"runKind":"scheduled","conversationId":"3b096fe1-…","sessionId":"3b096fe1-…"}
{"conversationId":"32d97b9a-…","sessionId":"32d97b9a-…"}
…每次自动化运行 = 一个此前不存在的 sessionId</div>
<p>⇒ <span class="tag t-green">已核实</span> 自动化确实是「开新会话」的通道,<b>但新会话第一轮的 31–54 次工具调用照旧收费</b>,而且开局水位为零也没让它变便宜。</p>
</div>
<div class="card">
<p><b>为什么不变便宜?</b>因为成本 = <b>请求次数 × 每次请求量</b>。开新会话把「每次请求量」的<u>增量部分</u>清零了,但:</p>
<ul>
<li>每次请求仍要重发 <b>35,192 token</b> 固定注入(工具定义 + 系统提示 + 技能清单)——这是跑不掉的「入场费」;</li>
<li>一跑 54 次工具 = 54 次请求 ⇒ 入场费 ×54;</li>
<li>缓存命中 99.5% 让入场费打折,所以它<u>不是</u>主因,但也没被消掉。</li>
</ul>
<p>⇒ <b>「会话多大」影响的是单价,不是总价;「跑多少次工具」才决定总价。</b></p>
</div>
<h2>三、真杠杆排序(按效力)</h2>
<table>
<tr><th>#</th><th>杠杆</th><th>效力</th><th>做法</th></tr>
<tr><td>①</td><td><b>一轮内的工具调用次数</b></td><td><span class="tag t-red">主导 · 线性</span></td><td>批量活写成脚本「一次跑完」:1 次 Bash 顶 20 次 Read/Edit/Bash。31 次 → 5 次 ⇒ 8.93 分 → <b>约 0.5 分</b></td></tr>
<tr><td>②</td><td>会话水位</td><td><span class="tag t-amber">次要 · 约 3 倍</span></td><td>到阈值换会话(就是你想建的那套机制)</td></tr>
<tr><td>③</td><td>固定注入 35,192 token</td><td><span class="tag t-green">很轻</span></td><td>缓存命中 99.5%,基本不用管</td></tr>
</table>
<p class="note">⚠️ 顺序不能反:<b>先治 ①,再治 ②</b>。只换会话不减工具调用 = 每次省一点单价、总量照旧,这正是「没达到节约效果」的成因。</p>
<h2>四、机制设计:能建,但只能建成「半自动」</h2>
<div class="card">
<h3>现状:缺口只有一个</h3>
<div class="kv"><span class="k">水位探测</span><span><span class="tag t-green">已有</span> <code>stop-dialog-guard.py</code> 三级阈值 <b>12 万 / 20 万 / 30 万</b>,数据源 = 转录里的真实 <code>usage.input_tokens</code>,同级去重只报一次</span></div>
<div class="kv"><span class="k">指令注入</span><span><span class="tag t-green">已有</span> 三级文案 = 强制收口(落盘 → 接续包 → 告知开新会话)</span></div>
<div class="kv"><span class="k">创建会话</span><span><span class="tag t-red">缺</span> 钩子事件只有 <code>SessionStart</code> / <code>PreToolUse</code> / <code>UserPromptSubmit</code>,输出只有「注入上下文」与「拦工具」两种,<b>没有任何创建 / 切换会话的能力</b></span></div>
<div class="kv"><span class="k">可用通道</span><span><span class="tag t-blue">自动化</span> 模型可调 <code>automation_update</code> 登记一次性自动化;宿主调度到点即开新会话</span></div>
<div class="note">⛔ 钩子脚本<b>不能</b>直接写数据库来建自动化——自动化只能经 <code>automation_update</code> 创建,这是硬约束。</div>
</div>
<div class="card">
<h3>建议链路(在现有三级告警上追加一段)</h3>
<div class="chain">[硬] 水位 ≥ 30 万
↓ stop-dialog-guard.py 注入(已有文案 + 新增第 ④ 条)
[软] 模型执行收口四步:
① 落盘:在途状态写进 .workbuddy/memory/
② 出接续包:目标/已完成/在途/下一步/关键决定/回滚点
③ 【新增】调 automation_update 登记一次性自动化
name = "<原会话名>-2"
prompt = "读 <接续包路径>,从「下一步」起继续。
⛔ 第一轮必须把批量活写成脚本一次跑完,工具调用 ≤ 8 次。"
时间 = 当前时刻 + 2 分钟
④ 终结本会话
↓
[硬] 宿主到点执行 ⇒ 新会话(实测通道可靠)</div>
<p><b>它的真实价值</b>:把「被迫收口 → 用户手工开新会话」变成「自动续上」,省掉人工一步,并把<u>单价膨胀</u>(约 3 倍)压回去。<b>它不省工具调用次数</b>——所以第 ③ 步 prompt 里那句「工具调用 ≤ 8 次」才是真正值钱的部分。</p>
<p><b>它的局限(如实说)</b>:末段是<b>软环节</b>——钩子只能要求模型照做,模型若不调 <code>automation_update</code> 则链条断在最后一步。硬保证只有前半段(提醒 / 强制收口)。</p>
</div>
<h2>五、让新会话「明确知道进度 + 未执行项」</h2>
<div class="card">
<p>这是自动接续能不能用的<b>真正前提</b>——接不上状态,「自动开销」只是白花钱重新探索一遍。原规范(工作区根《会话接续规范》)已有 6 项内容清单,本轮补的是<b>可校验性</b>:<b>文字会失真,证据不会。</b></p>
<p><b>实证</b>:上一条接续点原话写「清理被截断的 <code>.workbuddy/memory/MEMORY.md</code>」——照做就会改错对象(真正被截断的是<b>用户级</b>那份)。<b>凡是结论,必须附一条能复现的命令。</b></p>
</div>
<div class="card">
<h3>接续包 v2 · 固定表头(新会话机械读取)</h3>
<div class="chain">## 接续点 · &lt;工作线名&gt; · &lt;YYYY-MM-DD HH:MM&gt;
- 来源会话: &lt;sid&gt; | 结束原因: &lt;水位 N 万强制收口 | 用户要求&gt;
- 原目标: &lt;用户原话,不翻译、不缩写&gt;
- 基线: HEAD=&lt;git sha&gt; | 远端 master=&lt;sha&gt; | 全局锁=&lt;无 | 占用者&gt;
- 产物: &lt;绝对路径1&gt; | &lt;绝对路径2&gt; ← 新会话逐一确认存在
- 校验命令: &lt;一条命令&gt; → 期望输出: &lt;关键片段&gt; ← 证明"上一步真完成"
- 未完成: ①&lt;…&gt; ②&lt;…&gt; ← 用户要的、还没做的
- 下一步: 第 1 个动作 = &lt;具体命令&gt; ← ⛔ 不写"继续处理"
- 关键决定: &lt;已定项 + 为什么&gt; ← 防新会话推翻重来
- 回滚点: &lt;能退回的位置&gt;
- ⛔ 不要重做: &lt;已完成的,免得重复劳动&gt;</div>
<p class="note"><b>硬要求</b>:① 「校验命令」必填,只读、30 秒内跑完、输出可判真假;② 「下一步」第 1 条必须可直接执行;③ 产物 / 未完成 / 不要重做 三节一个都不能空(空写「无」);④ 全篇 ≤3 KB,只写「在哪 + 什么状态」。</p>
</div>
<div class="card">
<h3>新会话开机四步(接手方强制动作)</h3>
<table>
<tr><th>#</th><th>动作</th><th>为什么</th></tr>
<tr><td>1</td><td><b>只读接续包</b>(⛔ 不许一上来就全库探索 / 扫全盘)</td><td>探索是最贵的动作;接续包就是用来免掉它的</td></tr>
<tr><td>2</td><td><b>跑「校验命令」并比对期望输出</b>——不符就停下报告,⛔ 不许照文字硬做</td><td>文字会失真;跑不通的校验会伪装成"通过"</td></tr>
<tr><td>3</td><td><b>复述「未完成」与「下一步」</b>,确认与用户当时要的一致</td><td>防目标漂移(本线最大历史坑)</td></tr>
<tr><td>4</td><td><b>从「下一步」第 1 条开工</b>;⛔ 不重做「不要重做」列的东西</td><td>省掉重复劳动</td></tr>
</table>
<p class="note">⚠️ <b>接续包会过期</b>:写完后又改了东西,必须回头改接续包并同步「基线」里的 sha 与时间戳。</p>
</div>
<div class="card">
<h3>自动接续任务 · 标准 prompt 模板(照抄填空)</h3>
<div class="chain">读「&lt;接续包绝对路径&gt;」的「接续点」。
① 先跑其中的「校验命令」,输出与期望不符 ⇒ 停下、只报告,⛔ 不许照文字硬做。
② 从「下一步」第 1 条开工;⛔ 不重做「不要重做」列的东西。
③ 批量活必须先写成脚本一次跑完,⛔ 不许逐份探索;本脚本工具调用 ≤ 8 次。</div>
<p><b>第 ③ 条才是钱的开关</b>:31 次工具调用 = 8.93 积分;压到 8 次 ≈ <b>1 分</b>。前两条保证「不跑偏」,第 ③ 条保证「不贵」。</p>
</div>
<h2>六、顺带发现(只报告,未动手)</h2>
<div class="card">
<p><b>1. 两个「定时」自动化仍在按钟点烧钱</b>——它们与水位<b>无关</b>,是「定时触发」而非「阈值触发」,恰好是你这次想改掉的那种:</p>
<table>
<tr><th>自动化</th><th>周期</th><th>频率</th><th>已跑</th><th>已花</th></tr>
<tr><td>代码仓三方同步(DSH)</td><td><code>FREQ=HOURLY;INTERVAL=3</code></td><td>约 8 次/天</td><td>4 次</td><td class="n">5.59</td></tr>
<tr><td>遗留项自动推进(DSH 平台)</td><td><code>FREQ=HOURLY;INTERVAL=8</code></td><td>约 3 次/天</td><td>1 次</td><td class="n">1.20</td></tr>
</table>
<p class="note">合计约 <b>11 次/天 × 每次新建会话</b>;按实测均值 ≈1.4 积分/次估算 ⇒ <b>约 15 积分/天</b>纯自动化消耗,且每次都会在仓库里产生一个新会话与新的未提交改动。</p>
<p><b>2. 五个一次性自动化已过期但仍为 ACTIVE</b>(08-27 ×2、08-30、08-31,以及今天的三个覆盖网络/决策方法一次性任务)⇒ 属清理项。</p>
<p><b>3. 前一轮对本问题的结论需要更正</b>:<code>stop-dialog-guard.py</code> 里写着「③ 因此本级不做自动开,做强制收口」并注明「自动开这一半无法实现」。前半句仍成立(钩子确实做不到),但后半句<b>不准确</b>——经自动化这一通道,自动接续<b>可以做到半自动</b>。此处属发现,未改脚本。</p>
</div>
<h2>七、落地清单(按效力排序,待你点头后执行)</h2>
<ol>
<li><b>(最高)给两个周期自动化的 prompt 加硬约束</b>:写明「批量活必须先写脚本一次跑完,工具调用上限 8 次」。预期把单次 8–14 分压到 1–2 分。<span class="tag t-red">收益最大</span></li>
<li><b>接续包换成 §五 的 v2 表头 + 新会话按「开机四步」启动</b> —— 这正是你要的「新会话明确知道上个会话的进度与未执行内容」。规范已就地升级(工作区根《会话接续规范》,§3.1.1–3.1.4 / §3.2.1),下次收口即生效。<span class="tag t-blue">已就绪 · 靠纪律</span></li>
<li><b>在 <code>stop-dialog-guard.py</code> 三级文案后追加第 ④ 条</b>(提示模型登记 +2 分钟一次性自动化)。改动在 hook 脚本内、即刻生效,无需重启。<span class="tag t-amber">收益次要 · 消除人工一步</span></li>
<li><b>清理 5 个过期的一次性自动化</b>;与 ③ 一起或单独做。</li>
<li><b>重估两个周期自动化的存在必要</b>——「代码仓三方同步」每 3 小时一次是否真需要;若只是兜底,改日频即可。</li>
</ol>
<p class="note">⚠️ 落地 ③ 需改文档库脚本 ⇒ 要抢全局执行锁 + 推镜像 + 复跑对账。本轮为无人值守运行,<b>未动任何脚本 / 自动化 / 文档库,未抢锁、未提交、未推送</b>;只升级了工作区根《会话接续规范》(本工作区自有文档,非文档库)。</p>
<h2>八、附:为什么自动化会话要跑那么多工具调用</h2>
<div class="verdict">
<b>你的感觉对,但原因不是「自动化」这个身份。</b><br>
实测今日 6 个会话:<b>自动化平均每轮 5.6–8.9 积分,手动平均每轮 3.3 积分</b>(约 2–3 倍)。差距来自三件事,全都可以改。
</div>
<div class="card">
<h3>对比(今日同一工作区、同一类任务)</h3>
<table>
<tr><th>会话</th><th>类型</th><th>轮数</th><th>积分总计</th><th>平均每轮</th></tr>
<tr class="hi"><td>自动化·接续优化版</td><td>自动化</td><td class="n">1</td><td class="n">8.93</td><td class="n">8.93</td></tr>
<tr class="hi"><td>自动化·决策方法-2</td><td>自动化</td><td class="n">5</td><td class="n">44.77</td><td class="n">8.95</td></tr>
<tr class="hi"><td>自动化·确认覆盖网络待办</td><td>自动化</td><td class="n">2</td><td class="n">11.17</td><td class="n">5.59</td></tr>
<tr class="lo"><td>手动·检查覆盖网络方案</td><td>手动</td><td class="n">5</td><td class="n">16.52</td><td class="n">3.30</td></tr>
</table>
<p class="note">⚠️ 手动会话的总量<b>并不小</b>(原会话 <code>e2e090be</code> 累计 221 次工具调用,比任何自动化都多)——差别在<b>单轮</b>。</p>
</div>
<div class="card">
<h3>根因一:一条指令里塞了几件事</h3>
<p>你手动说「继续 XX 任务」,通常<b>只指一件事</b>;而自动化的 prompt 会把一整段工作串起来。以「决策方法-2」那条为例,它同时要求:三项任务 + 抢全局锁 + 只做三项 + 脚本化 + 反序释放锁 + 写简报 + 写记忆 + 不许承诺降低消耗 —— <b>八件事塞进一条指令,模型只能一路做到底</b>。</p>
</div>
<div class="card">
<h3>根因二:没人能打断(最关键)</h3>
<p><b>实证</b>:新会话 <code>b08b1c35</code> 那一轮,用户只说了「先确认待办事项」。实际发生的:</p>
<div class="chain">第 1–3 次 读接续入口 / 简报 / 会合中继方案
第 4–6 次 抢锁(PATH 被 shim 重置,重试 2 次)
第 7–24 次 连续 17 次深度取证:ssh config、106 的 env、47 的 psql、
47 的 systemd drop-in、remote-spawner.ts、proxy.ts 勘误…
第 25 次 加载技能 dsh-change-workflow
第 28 次 ⚠️ 已经在写 S0 的代码了 —— src/net/reachability.ts
(用户要的是「确认待办」,不是开工)</div>
<p>模型自己的思考留了痕:<b>「重要取证完成」「取证非常完整了」「现在证据链完整了」—— 三次自我加码。</b>你在场时,看到第三次就会说「够了,先停」;无人值守时没人喊停,它就自己给自己加码。</p>
</div>
<div class="card">
<h3>根因三:我的规则本身在制造调用</h3>
<p>「接手前人结论先做最小取证」「交付门禁四层验证」「抢锁 / 反序释放锁」「写简报 + 写记忆」都是项目硬规则,<b>每一条都是一个或多个工具调用</b>。规则是对的,但把它们全塞进一条无人值守的指令里,就成了「必须一路做完」。</p>
<p class="note">另有一笔环境税:Bash 每次都要重写 <code>export PATH=…</code>(shim 重置 PATH),虽不增加调用次数,但让每次调用都变长。</p>
</div>
<div class="card">
<h3>最根本的一条:单次调用极便宜,模型没有代价感</h3>
<p>从转录里逐次请求的 <code>credit</code> 字段(与数据库 <code>credit_json</code> 合计<b>完全对上</b>,两个独立源交叉验证):</p>
<table>
<tr><th>会话</th><th>请求次数</th><th>单次中位</th><th>单次最低 / 最高</th><th>合计</th></tr>
<tr><td>自动化·确认覆盖网络待办</td><td class="n">67</td><td class="n">0.11</td><td class="n">0.05 / 2.06</td><td class="n">11.17</td></tr>
<tr><td>手动·检查覆盖网络方案</td><td class="n">44</td><td class="n">0.21</td><td class="n">0.07 / 2.84</td><td class="n">16.52</td></tr>
</table>
<div class="chain">第 1 次调用(冷启动): prompt=52,856 hit=12,288 miss=40,568 credit=0.60 ← 最贵
第 67 次调用(末次) : prompt=197,376 hit=197,120 miss=256 credit=0.11 ← 命中 99.9%</div>
<p><b>每一次调用只要 0.1 分左右</b>——所以模型在单步决策时<u>几乎感觉不到代价</u>,它看不到「累计已经 67 次了」。<b>没有人喊停,它就没有刹车。</b>你在场时,你那句「够了,先停」就是唯一的刹车;无人值守时,刹车片不存在。</p>
<p class="note">⛔ 注意:这里也顺带<b>推翻了"自动化一定比手动贵"</b>——按累计算,手动那个会话 16.52 反而更贵(水位 21.7 万、单次中位 0.21)。差别只在<b>单轮塞了多少事</b>。</p>
</div>
<div class="card">
<h3>修法:改 prompt,不改流程</h3>
<p>在现有模板(§五)后面再加两条,直接掐掉前两个根因:</p>
<div class="chain">⛔ 本轮只做一件事:&lt;具体那件&gt;。做完即停。
不许顺手做归档 / 整理 / 写入口 / 开工别的任务。
⛔ 取证只做一次、最多 3 个命令;发现要动代码或改配置 ⇒ 停下来报告,不要动手。</div>
<p><b>预期效果</b>:<code>b08b1c35</code> 那一轮 77 次 → 约 8 次,11.17 分 → <b>约 1 分</b>。这就是「把第一优先杠杆(一轮工具次数)压下去」的具体做法。</p>
<p class="note">⚠️ 附带一条真实修正:早前记录写「转录 <code>rawUsage</code> 恒为空」——<b>不准确</b>。实测 <code>b08b1c35</code> 的 jsonl 里有 <b>67 条带 <code>credit</code> 的 <code>rawUsage</code></b>,且逐次合计 11.17 与数据库 <code>credit_json</code> 完全一致。该字段<b>可用</b>,是逐次成本的最佳来源。</p>
</div>
</div></body></html>