本专栏不神化某个模型,而谈怎么把一群助手装进可控的 Harness:上下文、工具、环境、目标与检测、规则与禁忌,以及编排协作与人机边界。每篇只攻一块,尽量带可复现的小实验或对照(公开数据、沙箱账号),避免把私有项目写进公网。文末有完整专栏地图。「工具」区已经分享过几篇(Context7 调研闭环、显式连接对照、论文检索等)。本篇落在「编排」与「人机」交界:用假目标把独立验收、双 Bot 会诊和日终人闸跑通一遍。
问题
多助手一上线,最容易出现三种「看起来在协作、其实在自嗨」的情况:
- 执行方自己验自己:写完报告再写「验收通过」,数字错了也过不了关------因为没人对照夹具复算。
- 故障会诊变成一人独白:两个角色本该独立写根因,却共享同一可写工作区,后写的把先写的「润色」掉,分歧消失。
- 机器通过被当成已合并:质检验收全绿之后,助手静默合并 / 发帖,人只在出事时才知道。
技术预研里不一定立刻有生产仓库。能不能用假目标 + 合成夹具,先把这三道闸的形状练出来?可以。下面三节对应三次沙箱试验。
三机制
机制一:执行方 / 验收方分角色(独立验收)
| 角色 | 可写 | 不可做 |
|---|---|---|
| 执行方 | 交付物目录 | 改任务说明 / 改金标 |
| 验收方 | 仅验收报告 | 改交付物;自己给自己「修到过」 |
硬约束用产物指纹:验收前记下 SHA256,报告末尾复录,须一致。验收方的工具策略上应禁用对交付物目录的写权限;指纹是给人看的第二道证。
任务说明里写清:必交付路径、表头、复算公式、文末字面来源行。金标放在任务说明的验收方段落,执行方按公式从夹具算,而不是抄金标数字。
#mermaid-svg-2ySnAdY4OhU205ak{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-2ySnAdY4OhU205ak .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-2ySnAdY4OhU205ak .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-2ySnAdY4OhU205ak .error-icon{fill:#552222;}#mermaid-svg-2ySnAdY4OhU205ak .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2ySnAdY4OhU205ak .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-2ySnAdY4OhU205ak .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2ySnAdY4OhU205ak .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2ySnAdY4OhU205ak .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-2ySnAdY4OhU205ak .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2ySnAdY4OhU205ak .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2ySnAdY4OhU205ak .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2ySnAdY4OhU205ak .marker.cross{stroke:#333333;}#mermaid-svg-2ySnAdY4OhU205ak svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2ySnAdY4OhU205ak p{margin:0;}#mermaid-svg-2ySnAdY4OhU205ak .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-2ySnAdY4OhU205ak .cluster-label text{fill:#333;}#mermaid-svg-2ySnAdY4OhU205ak .cluster-label span{color:#333;}#mermaid-svg-2ySnAdY4OhU205ak .cluster-label span p{background-color:transparent;}#mermaid-svg-2ySnAdY4OhU205ak .label text,#mermaid-svg-2ySnAdY4OhU205ak span{fill:#333;color:#333;}#mermaid-svg-2ySnAdY4OhU205ak .node rect,#mermaid-svg-2ySnAdY4OhU205ak .node circle,#mermaid-svg-2ySnAdY4OhU205ak .node ellipse,#mermaid-svg-2ySnAdY4OhU205ak .node polygon,#mermaid-svg-2ySnAdY4OhU205ak .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-2ySnAdY4OhU205ak .rough-node .label text,#mermaid-svg-2ySnAdY4OhU205ak .node .label text,#mermaid-svg-2ySnAdY4OhU205ak .image-shape .label,#mermaid-svg-2ySnAdY4OhU205ak .icon-shape .label{text-anchor:middle;}#mermaid-svg-2ySnAdY4OhU205ak .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-2ySnAdY4OhU205ak .rough-node .label,#mermaid-svg-2ySnAdY4OhU205ak .node .label,#mermaid-svg-2ySnAdY4OhU205ak .image-shape .label,#mermaid-svg-2ySnAdY4OhU205ak .icon-shape .label{text-align:center;}#mermaid-svg-2ySnAdY4OhU205ak .node.clickable{cursor:pointer;}#mermaid-svg-2ySnAdY4OhU205ak .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-2ySnAdY4OhU205ak .arrowheadPath{fill:#333333;}#mermaid-svg-2ySnAdY4OhU205ak .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-2ySnAdY4OhU205ak .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-2ySnAdY4OhU205ak .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2ySnAdY4OhU205ak .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-2ySnAdY4OhU205ak .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2ySnAdY4OhU205ak .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-2ySnAdY4OhU205ak .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-2ySnAdY4OhU205ak .cluster text{fill:#333;}#mermaid-svg-2ySnAdY4OhU205ak .cluster span{color:#333;}#mermaid-svg-2ySnAdY4OhU205ak div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-2ySnAdY4OhU205ak .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-2ySnAdY4OhU205ak rect.text{fill:none;stroke-width:0;}#mermaid-svg-2ySnAdY4OhU205ak .icon-shape,#mermaid-svg-2ySnAdY4OhU205ak .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2ySnAdY4OhU205ak .icon-shape p,#mermaid-svg-2ySnAdY4OhU205ak .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-2ySnAdY4OhU205ak .icon-shape .label rect,#mermaid-svg-2ySnAdY4OhU205ak .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2ySnAdY4OhU205ak .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-2ySnAdY4OhU205ak .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-2ySnAdY4OhU205ak :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 一致且数字对
数字错或指纹变
执行方写交付物
验收方只读复算
写验收报告
指纹对照
通过
未通过
机制二:双 Bot 会诊 + 对照方出表(保留分歧)
同一故障任务说明、同一份假日志,两个会话各自只写自己的假设文件;第三人(对照方)只读两边产物出对照表。
| 约束 | 做法 |
|---|---|
| 防串改 | A/B 互斥对方假设文件的写权限;或分分支 / 分工作树(worktree) |
| 证据 | 必须引用日志原文行,不写「感觉是」 |
| 下一步 | 只列只读核对(A0,只读);不杀进程、不改配置、不发帖 |
| 成功标准 | 至少一处主因分歧显式留在表上,等人拍板 |
分歧本身是产物。把分歧抹平,才是编排失败。
#mermaid-svg-DNm4QnlkN58Lq9Tv{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DNm4QnlkN58Lq9Tv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DNm4QnlkN58Lq9Tv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DNm4QnlkN58Lq9Tv .error-icon{fill:#552222;}#mermaid-svg-DNm4QnlkN58Lq9Tv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DNm4QnlkN58Lq9Tv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DNm4QnlkN58Lq9Tv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DNm4QnlkN58Lq9Tv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DNm4QnlkN58Lq9Tv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DNm4QnlkN58Lq9Tv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DNm4QnlkN58Lq9Tv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DNm4QnlkN58Lq9Tv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DNm4QnlkN58Lq9Tv .marker.cross{stroke:#333333;}#mermaid-svg-DNm4QnlkN58Lq9Tv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DNm4QnlkN58Lq9Tv p{margin:0;}#mermaid-svg-DNm4QnlkN58Lq9Tv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DNm4QnlkN58Lq9Tv .cluster-label text{fill:#333;}#mermaid-svg-DNm4QnlkN58Lq9Tv .cluster-label span{color:#333;}#mermaid-svg-DNm4QnlkN58Lq9Tv .cluster-label span p{background-color:transparent;}#mermaid-svg-DNm4QnlkN58Lq9Tv .label text,#mermaid-svg-DNm4QnlkN58Lq9Tv span{fill:#333;color:#333;}#mermaid-svg-DNm4QnlkN58Lq9Tv .node rect,#mermaid-svg-DNm4QnlkN58Lq9Tv .node circle,#mermaid-svg-DNm4QnlkN58Lq9Tv .node ellipse,#mermaid-svg-DNm4QnlkN58Lq9Tv .node polygon,#mermaid-svg-DNm4QnlkN58Lq9Tv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DNm4QnlkN58Lq9Tv .rough-node .label text,#mermaid-svg-DNm4QnlkN58Lq9Tv .node .label text,#mermaid-svg-DNm4QnlkN58Lq9Tv .image-shape .label,#mermaid-svg-DNm4QnlkN58Lq9Tv .icon-shape .label{text-anchor:middle;}#mermaid-svg-DNm4QnlkN58Lq9Tv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DNm4QnlkN58Lq9Tv .rough-node .label,#mermaid-svg-DNm4QnlkN58Lq9Tv .node .label,#mermaid-svg-DNm4QnlkN58Lq9Tv .image-shape .label,#mermaid-svg-DNm4QnlkN58Lq9Tv .icon-shape .label{text-align:center;}#mermaid-svg-DNm4QnlkN58Lq9Tv .node.clickable{cursor:pointer;}#mermaid-svg-DNm4QnlkN58Lq9Tv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DNm4QnlkN58Lq9Tv .arrowheadPath{fill:#333333;}#mermaid-svg-DNm4QnlkN58Lq9Tv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DNm4QnlkN58Lq9Tv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DNm4QnlkN58Lq9Tv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DNm4QnlkN58Lq9Tv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DNm4QnlkN58Lq9Tv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DNm4QnlkN58Lq9Tv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DNm4QnlkN58Lq9Tv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DNm4QnlkN58Lq9Tv .cluster text{fill:#333;}#mermaid-svg-DNm4QnlkN58Lq9Tv .cluster span{color:#333;}#mermaid-svg-DNm4QnlkN58Lq9Tv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DNm4QnlkN58Lq9Tv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DNm4QnlkN58Lq9Tv rect.text{fill:none;stroke-width:0;}#mermaid-svg-DNm4QnlkN58Lq9Tv .icon-shape,#mermaid-svg-DNm4QnlkN58Lq9Tv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DNm4QnlkN58Lq9Tv .icon-shape p,#mermaid-svg-DNm4QnlkN58Lq9Tv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DNm4QnlkN58Lq9Tv .icon-shape .label rect,#mermaid-svg-DNm4QnlkN58Lq9Tv .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DNm4QnlkN58Lq9Tv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DNm4QnlkN58Lq9Tv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DNm4QnlkN58Lq9Tv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 同一假日志
Bot A 写假设
Bot B 写假设
对照方只读出表
主因分歧保留
人拍板
机制三:角色图 + 18:00 人闸(机器验 ≠ 人批)
单目标拆角色:协调拆票与汇总;调研 / 执笔 / 质检验收方各写各的路径;日终人闸只在收闸门包时介入。
关键分离:
- 质检验收方「通过」= 机器侧对照任务说明 / 夹具通过
- 18:00 人闸 = 是否允许合并、是否对外;未批则停
- 开合并请求 ≠ 合并;沉默 / 未回复 ≠ 默认批准
闸门包最小字段:状态一览、变更摘要、待批问项(合并?对外?打回?)、闸后动作表。真发帖走审批通道;沙箱只写包、不发。
#mermaid-svg-ujkiNGtpq5NVYEM0{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ujkiNGtpq5NVYEM0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ujkiNGtpq5NVYEM0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ujkiNGtpq5NVYEM0 .error-icon{fill:#552222;}#mermaid-svg-ujkiNGtpq5NVYEM0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ujkiNGtpq5NVYEM0 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ujkiNGtpq5NVYEM0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ujkiNGtpq5NVYEM0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ujkiNGtpq5NVYEM0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ujkiNGtpq5NVYEM0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ujkiNGtpq5NVYEM0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ujkiNGtpq5NVYEM0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ujkiNGtpq5NVYEM0 .marker.cross{stroke:#333333;}#mermaid-svg-ujkiNGtpq5NVYEM0 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ujkiNGtpq5NVYEM0 p{margin:0;}#mermaid-svg-ujkiNGtpq5NVYEM0 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ujkiNGtpq5NVYEM0 .cluster-label text{fill:#333;}#mermaid-svg-ujkiNGtpq5NVYEM0 .cluster-label span{color:#333;}#mermaid-svg-ujkiNGtpq5NVYEM0 .cluster-label span p{background-color:transparent;}#mermaid-svg-ujkiNGtpq5NVYEM0 .label text,#mermaid-svg-ujkiNGtpq5NVYEM0 span{fill:#333;color:#333;}#mermaid-svg-ujkiNGtpq5NVYEM0 .node rect,#mermaid-svg-ujkiNGtpq5NVYEM0 .node circle,#mermaid-svg-ujkiNGtpq5NVYEM0 .node ellipse,#mermaid-svg-ujkiNGtpq5NVYEM0 .node polygon,#mermaid-svg-ujkiNGtpq5NVYEM0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ujkiNGtpq5NVYEM0 .rough-node .label text,#mermaid-svg-ujkiNGtpq5NVYEM0 .node .label text,#mermaid-svg-ujkiNGtpq5NVYEM0 .image-shape .label,#mermaid-svg-ujkiNGtpq5NVYEM0 .icon-shape .label{text-anchor:middle;}#mermaid-svg-ujkiNGtpq5NVYEM0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ujkiNGtpq5NVYEM0 .rough-node .label,#mermaid-svg-ujkiNGtpq5NVYEM0 .node .label,#mermaid-svg-ujkiNGtpq5NVYEM0 .image-shape .label,#mermaid-svg-ujkiNGtpq5NVYEM0 .icon-shape .label{text-align:center;}#mermaid-svg-ujkiNGtpq5NVYEM0 .node.clickable{cursor:pointer;}#mermaid-svg-ujkiNGtpq5NVYEM0 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ujkiNGtpq5NVYEM0 .arrowheadPath{fill:#333333;}#mermaid-svg-ujkiNGtpq5NVYEM0 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ujkiNGtpq5NVYEM0 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ujkiNGtpq5NVYEM0 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ujkiNGtpq5NVYEM0 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ujkiNGtpq5NVYEM0 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ujkiNGtpq5NVYEM0 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ujkiNGtpq5NVYEM0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ujkiNGtpq5NVYEM0 .cluster text{fill:#333;}#mermaid-svg-ujkiNGtpq5NVYEM0 .cluster span{color:#333;}#mermaid-svg-ujkiNGtpq5NVYEM0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ujkiNGtpq5NVYEM0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ujkiNGtpq5NVYEM0 rect.text{fill:none;stroke-width:0;}#mermaid-svg-ujkiNGtpq5NVYEM0 .icon-shape,#mermaid-svg-ujkiNGtpq5NVYEM0 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ujkiNGtpq5NVYEM0 .icon-shape p,#mermaid-svg-ujkiNGtpq5NVYEM0 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ujkiNGtpq5NVYEM0 .icon-shape .label rect,#mermaid-svg-ujkiNGtpq5NVYEM0 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ujkiNGtpq5NVYEM0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ujkiNGtpq5NVYEM0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ujkiNGtpq5NVYEM0 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 人批
未批
单目标拆角色
各角色写交付
机器验收通过
18:00 提交闸门包
允许合并 / 对外
停手
沙箱证据(标明沙箱)
三次试验均在沙箱目录完成;数字与端口来自合成夹具 / 假 CI 日志,可公开讲。
A · 故意算错成功率,验收方抓到
夹具 metrics.csv(5 行合成跑数):金标 mean=131.0,max=200,success_rate_pct=80.0(4/5)。
执行方交付物把成功率写成 100.0(丢掉失败行后按 4/4 计)。验收方逐条对照:
| 准则 | 结果 | 证据(摘要) |
|---|---|---|
| 文件存在 / 首段固定句 / 表头三指标 / 文末来源行 | 通过 | 交付物路径与字面匹配 |
mean_latency_ms=131.0、max_latency_ms=200 |
通过 | 与夹具复算一致 |
success_rate_pct=80.0 |
未通过 | 产物 100.0 vs 复算 80.0 |
| 产物 SHA 验收前后一致 | 通过 | 指纹未变 → 验收方未改产物 |
| 总体 | 未通过 | 符合「至少演示一条失败」 |
可带走:表格「看起来整齐」不够;独立复算 + 指纹,才能证明「验的人没偷偷改交付物」。
B · 同一假日志,主因故意分歧
假 CI 日志(preview-api smoke):两次 bind 均 errno=98 EADDRINUSE;诊断行指向另一工作树残留 node(pid=4412);同时有 PREVIEW_API_TOKEN unset 的 WARN;listen_addr 回落默认 18080;健康检查从未发出。
| 维度 | Bot A(环境) | Bot B(配置) | 裁定 |
|---|---|---|---|
| 主根因 | 端口残留 / 工作树未隔离端口 | 缺强制环境变量 + 默认端口契约 | 分歧 |
| 共享证据 | errno=98、diag pid、listener_bind |
同上 + token WARN、default 回落 | 同意 |
| 下一步 | 只读复读 / ss / 文档 |
只读 yaml / 环境变量键名 / 重试定义 | 全 A0(只读) |
| 自动修复 | 否 | 否 | 同意:无自动修复 |
A 的主因叙事正是「文件隔离 ≠ 端口隔离」;B 则把问题抬到启动契约------这与环境区同一话题可对照,本篇不展开端口实验。对照方不裁判对错,只把分歧和只读下一步交给人。
C · 单目标角色图 + 18:00 包,写死不自动合并
假目标:合成周指标 → 一页纸 Markdown。角色边:执行 → 协调 → 人;质检验收方对齐机制一。
时间线要点(Asia/Shanghai,示意):
| 节点 | 级别 | 红线 |
|---|---|---|
| 读任务说明 / 算金标 | A0(只读) | 不改状态 |
| 写笔记 / 草稿 / 验收报告 / 开草稿合并请求 | A1(受限写) | 开合并请求 ≠ 合并 |
| 18:00 提交闸门包 | A2(需人批)汇总 | 人未批则停 |
| 人批合并 | A2(需人批) | 禁止静默自动合并 |
| 对外发布 | A3(仅负责人) | 默认不做;仅负责人 |
闸门包里显式写:合并进共享主干 = 未执行 --- 等人闸;人沉默时助手 什么都不合并、不发帖。验收方「通过」出现在状态表里,但不等于已合并。
可带走的清单
- 验收方与执行方分离:分会话或分写权限;用 SHA 证明验收过程未改产物。
- 故意失败样例要留着:全通过的演示教不出检测;至少一条算错 / 绑失败,才证明闸门有用。
- 双会诊的成功标准是「分歧可见」:共享证据、各写各的、对照方只出表;下一步默认只读。
- 机器验 ≠ 人批:质检 / 验收通过后,合并与对外仍进 18:00(或同等)人闸包;未批 = 停手。
- 单目标角色图:一个日闸只服务一个目标,减少多票抢同一人批。
- 对外与政策另算:专栏发表、改审批政策等走更高一级;沙箱演示不发真实审批帖。
- (附)审批路由选择题(A0--A3)可做成技能自测;「团队频道非紧急帖」等条文若政策未写明,先标待确认,再补政策------本篇不展开营销式工具安利。
数据与来源
- 沙箱台账与产物:试验 A(验收方独立验证)、试验 B(双 Bot 根因会诊)、试验 C(角色图 + 18:00 人闸);汇总见同目录汇总。
- 观点仅代表作者沙箱实践,与具体平台或厂商无关。
专栏地图
用 Agents / Bots 搭一支研究团队 ------ Harness 实践笔记
写给谁:想把「一个人 + 一群助手」跑成可持续研发流程的工程师与研究者。
背景:多助手协作已经便宜,真正难的是上下文从哪来、工具接不接、环境是否可复现、目标怎么验、规则与禁忌怎么落地。本专栏按 Harness 拆零件,每篇只攻一块,并尽量带对照实验;演示默认沙箱与公开数据。
分区地图:
- 上下文(Context)--- 对话、记忆、技能、仓库与文档如何进入视野;什么该进、什么不该进。
- 工具(Tools)--- 显式连接器 vs 隐式搜索;何时值得接官方 API。已分享:Context7 调研闭环;Context7 vs 纯 Cursor 量化对照;论文检索(S2 限流后的备胎栈)。
- 环境(Environment)--- 沙箱机、浏览器、CI、GPU、密钥与登录态;演示环境与真实环境隔离。
- 目标与检测方法(Goals & Evaluation)--- 可验收目标、例程、指标、失败样例与回归。本篇机制一可作入口旁证。
- 规则、约束与禁忌(Rules & Guardrails)--- 审批闸门、安静时段、发布前检查与信息安全清单。
- 编排与协作(Orchestration)--- 多 Bot 分工、频道订阅、交接与去重。本文(独立验收 · 双会诊 · 日闸)。
- 人机边界(Human-in-the-loop)--- 必须人点的步骤;草稿卡、发布审批、失败时如何停手。本文 18:00 闸门包与之重叠。
写法:问题 → 机制/工具 → 小实验或对照 → 可带走的结论。观点仅代表作者实践,与平台无关。