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)、记忆修复前备份。
This commit is contained in:
admin committed 2026-09-24 07:51:03 +08:00
commit ce8e6ceed9
396 files changed
+66045

No files matched your search

@@ -0,0 +1,298 @@
<!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>