言与行不是两个入口,而是一段对话有没有绑工作目录。欢迎页输入框上方的「目录」小签空着,这一纸就是言 · 对谈;填了路径(或点「选择…」以系统对话框选取,Windows 上是资源管理器风格的现代对话框,带地址栏与搜索;不记「最近选过的目录」,每次自己选——删掉的目录若还列着,点一下又会把它绑回来、发消息时重建),就是行 · 执事。侧栏的一枚印只显示当前的态,改态去目录签。目录可以在对话中途绑上——侧栏对话「⋯」里的「绑定目录」——此后工具与提示词随之而变,历史一字不丢,适合先聊清一个想法、再带着上下文动手;同一处「更换目录」可更换或解开,解开即回到言。侧栏历史是一条时间线(置顶 / 今天 / 过去七天 / 更早):绑了同一目录的对话归在一个带「工」印的组里,组按组内最近动过的那条排(一条有动静,整组靠前),组内按时间;没绑目录的对话按自己的时间散在其间;点组头收起 / 展开(收起时仍露出当前打开的那条),组头右侧的「+」在该目录另起一纸。
言与行的文件工具落脚处、作风与确认各不相同:言拿产出文件所需的五件(run_command / write_file / read_file / list_files / download_file)并用短说明,行另多逐字替换与代码检索两件;要它看看电脑就用 run_command 直查,沙箱的目录约束只管改动、不管查看。行落在工作目录,系统提示只交代环境(目录、平台、shell、沙箱的界)与收尾时交代几句;言落在卷宗目录,除明确要求检查电脑外,只在用户要可交付文件时动用文件工具。执事是一个只做代码工作的轻量 Agent,下面是它常用的几件(download_file 见模型):
list_files:列出目录树(目录以/结尾,文件后跟字节数);给pattern时按 glob 找文件(*.ts、src/**/*.js),跳过 node_modules、.git 等search_files:按正则(或原文)在文本文件里逐行检索,返回文件:行号:内容,可限定子目录(给一件文件就只搜它)与 glob;用于定位代码。写不成的正则按字面搜,结果前头说一声。正则在某个文件上回溯超过两秒即中止并告诉模型改写,写坏的正则卡不死桥接read_file:读取文本文件,带行号、可按 offset / limit 分段;认得 UTF-8(含 BOM)、UTF-16(Windows PowerShell 5.1 的>与Out-File写出的就是它)与 GBK,编码不是 UTF-8 的会告诉模型edit_file:精确替换一段文本,old必须与文件逐字一致且唯一(或显式replace_all),CRLF 文件自动保持换行,UTF-16 与带 BOM 的文件照原来的编码写回(GBK 的不逐字改,请模型整体重写或先转码);本段对话里没读过或写过的文件不允许编辑,模型必须对着真实内容改;old对不上时,报错附上文件里最像的那一段(照现在的样子、带行号),模型照着重改,不必先重读;步骤卡上以前后片段展示改动write_file:新建或整体重写文件run_command:在工作目录中执行一条指令(Windows 上有 PowerShell 7 就用它,没装的退回系统自带的 5.1;其他系统使用 sh。输入输出均为 UTF-8,指令另行解析、不受命令行引号规则影响,写错了报的是读得懂的解析错;输出里的终端颜色码去掉),返回退出码、用时与输出;timeout是前台等多久(默认 120 秒,至多 600 秒),等满还没完不掐,转入后台接着跑、把编号与已有输出交回,结束时照后台指令叫醒;用户补言、主模型给帮手递话时,正跑着的前台指令也当场转入后台,话随即递上;cmdlet 出错同样以非零退出码返回,错误文本已还原为纯文字。开发服务器、长任务这类要跑一阵的,带background放到后台:先回几秒的输出与一个编号(bg1…);它结束时会叫醒模型(见下文「候」),不必轮询;要看中途输出或提前结束它,用check_command;桥接退出时后台指令一并收掉set_timer:到点叫醒自己——at(本地时刻,如2026-10-31 09:00;只写09:00即下一个这个钟点)或after(秒)给一个,note是到时给自己的话,every(秒)则此后周期再叫;编号 t1…,check_command看几时到或stop取消(见下文「候」)
路径相对工作目录;设置 → 工具 →「文件工具可及范围」默认「全盘」(问而后行开着沙箱时不生效,一律目录内),此时完整的绝对路径可以指向目录之外(系统级配置、别处的资料都读得到,写之前模型会先说明),改成「目录内」则一律拒绝越出(含借符号链接 / junction 越出的情形;列目录与检索不跟进链接,链接以 @ 标出);工作目录须是完整限定的绝对路径(Windows 上须带盘符);执事接口只接受本站页面与本机脚本的请求,file:// 页面接不上桥接;文件系统错误以可读说明返回。系统提示只交代环境(目录、平台、shell、沙箱的界)与收尾时交代几句;怎么读、怎么改、什么不能猜,写在各工具的说明里(见 prompts/)。
上传 ZIP 等压缩包后,模型会收到本机原件路径,可用 run_command 先复制到工作目录,再解压到独立的临时子目录读取。原件保留,解压命令照这段对话的权限规则处理;需要开启模型的本机工具,且系统里有对应格式的解包程序。
模型自己安排、到时叫醒它的都叫候,叫醒的条件有两种:进程结束(后台指令)与时刻到(set_timer)。挂上就不必守着,模型布置完、只剩等它,这一答就写完。到时照帮手回报的路子寄给这段对话:没在作答就另起一答,两答之间一道细线;正作答(模型布置完还在干别的)就在回合边界递进这一答,行迹里它到达的那一刻落一小步「回报」,与补言一样大小,不另起一答。
- 后台指令结束:桥接等它结束再回话,结果(退出码、用时、之后的新输出)递上;细线写「后台「重启预览」已结束」(引号里是起它时
description那句白话,没写的写编号 bg1;退出码不为 0 的写出退出码),点它回到挂它的那一步,那一步上随之写「已结束 · 退出码 n」。写一个条件满足才退出的小循环,就是盯着某件事(隔几分钟看一眼 PR 评论、训练日志、某个网页)。桥接退出(重启 start.cmd、关机)后台指令随之结束,进程不在了等不下去:签上写「随桥接重启而止」,不叫醒对话——重启是人自己动的手,挂着的多是预览、服务;模型下一问从行迹摘要里看得到它止了,要不要重开由它定。 - 时刻到:时刻记在桥接(存储根
候/约.json),不占进程;桥接重启后读回,错过的当场补叫,写明迟了多久(「候「看 PR #151 有无回复」到点 · 迟 40 分」)。every的周期候叫过即排下一回,睡过去的几回不补。电脑睡眠、桥接没开时到点的,都在醒来、开桥接后补叫。到点的那一回先落进存储根候/到点/再交给页面:页面关着时攒着,开页即递;几处页面同开,谁认领到谁递(改名即认领),那段对话别处正在答的留给别处。
书眉的漏列着所有在等的候,分「在跑」「约定」两节:后台指令写已跑多久,等时刻的写几时到(「明 9:00 · 每 1 天」);几段对话的都在时,对话名写在每行下面的小字里,当前这段朱字;悬停看编号与整条指令或定的时刻。「止」只停生成,不碰候:后台指令照跑、结束照样叫醒,约好的时刻照旧——之前挂的事与眼前这一答无关;要撤跟模型说,由它自己 check_command 结束或取消(手动撤了模型不知道)。重答、删对话时挂候的那一步没了,连进程收掉,那几答约的时刻一并取消。几处页面同开,后台结束桥接只报一回;模型自己用 check_command 看到它结束的,不再叫醒。帮手挂的后台指令叫醒的是帮手自己(见下文「差遣」);set_timer 只给主模型。
跨多答的长活,任务活在目录里、不活在哪一段对话里:模型在目录下立一份 .yan/账本.md,自己维护,只记对这件工程持续有约束、又不是一条结论的——定下的约束与取舍、做法与环境上的要点;要立住的结论、进展与走不通的路归意。过时的删、相近的并,不记流水账。每一答开工时读一回,附在这一问之后送给模型(之前的问不带,免得一份账本背上几十遍;附在问上不进系统提示,改了也不冲掉前面的缓存;这一问的首段标作缓存点,账本另起一段接在后面)。于是压缩了前文、被回报或后台指令叫醒另起一答、换一段对话绑同一目录接着做,看到的都是同一份。账本记多少不设上限——有的活真要记很多;限的只是每一问附多少:随模型窗口走(附件预算的一半,没填窗口约 12k token)。附不下就附开头一段,并写明「共 n 行,只附了开头 m 行,其后要看用 read_file」——所以账本宜作索引:常要看的写在前面,细的记录(实验数据、长清单、调研所得)另写成 .yan/ 下的文件、账本里留一行指向它,要看时按需读、按需搜。附着全文即算读过,主模型可径直 edit_file;附的是截过的就不算,改之前得先读,免得一笔覆盖掉它没看到的后半截。帮手领命时附一份只读的(账本只由主对话写),领命那一刻现读——先立下约束再派活,帮手拿到的就是刚立的那份;开头提过的一条小约束不会在分出去的活里丢了。没有这个文件就什么都不附。
账本记约束与取舍,意记结论:一件长活要立住哪几条,各以什么为前提、凭什么。模型用 update_intent 在目录下立一份 .yan/意.json(桥接是唯一的写者,带版本写,几处同时改不互相覆盖),每一问与账本一样附在问之后——换对话、压缩前文、被叫醒另起一答,看到的都是同一份。程序只给形式约束与可见性,成立与否由模型照每一项的验收自判。
- 结构:一项是一句要成立的结论(事件、功能、文件不分类型),写怎么算成立(
check)、以哪几项为前提(needs,any即几条路线择一)、凭什么(anchors)。前提要在、不成环,不合的整批退回;新立意时只有一项要立的也退回——一项不成图,一答之内做得完的活用不着意。没有谁以它为前提的是根——整件工程最终要立的结论;立根时记下用户那一问的原话(当初漏标、后来补标的,记补标那一问),根的说法只照用户的意思改,改时留痕、那一问一并附着。 - 嵌套:一项拆开还有许多步即是模块,细项写
in指向它,至多两层;模块以里面收口的几项为隐含前提,里面立住它才算立住。模块只是分组,前提可跨模块——依的是哪一项就连哪一项(评测依训练里那一步,不必依整个训练模块),图仍是一张 DAG,查环时连模块到收口项那几条一并算。附给模型时,立住的模块折成一行,没立住的才展开。开着的一层不过 15 项,全部不过 60 项(了结的不算)。名字至多 24 个汉字(字母数字 48 个),空格、冒号、@ 之类照规矩改写成_、回给模型时说一声;说法变了、旧名不贴切的用rename改名,前提与所属随之改,只改名不改说法的照旧立住。 - 传播与回归:标成立要前提先立住(同一批一起标也算;模块即里面收口的几项),自己做完而前提未立的仍标进行中,不合即退回。前提事后转待复核,上面的就跟着不算立住。标成立(或假定)时记下各凭据的指纹与各前提的说法版本;此后凭据变了、说法改了、后添了前提,它就转待复核。凭据四种:文件(裸写路径)、目录(
dir:,底下整片,新增删除也算)、探针(cmd:,一条指令的输出,罩得住部署、服务、依赖版本这类外部状态)、测试(test:,一条指令过没过——只看退出码是否为 0,输出里的耗时、行号变了不算);探针与测试跟着对话的档位走,问而后行里只自动跑明确只读的——只比变没变,不判对错。一答之内每轮工具做完重取一回文件与目录的指纹(探针与测试只在每答开工、标成立与收尾前跑),新转待复核的接在那一轮的工具结果后当场告诉模型;同一项一答之内第三回被打回即说「相持」,摆出同挂一条凭据、也被打回的那几项——只提醒,不拦。凭据是一张登记表(src/19-intent/05-anchors.js),加一种只加一份登记。 - 降级与取舍:借外部结论、不自己做的标「假定」(
note写出处),算立住,往上记着借了几条。卡在人手里、要等人拍板的标「待定」(waiting,note写等谁、定什么),不算立住,换了对话也看得见卡在谁那儿。主线上走过、不通的路标「弃」:不算数、不上图,留作记号,附给模型的意里点到名,免得再走一遍;方案改了、写错了的标removed整项撤去,指向它的前提一并抹掉,只留一笔痕。图里已有根时,又没有谁以它为前提、也没声明为根的一项算「孤悬」——多半是手上的一步忘了连到它所撑的那一项,悄悄成了又一个根;这一批写到的若成了孤悬即退回,提示它写进所撑那一项的 needs、归进模块,或本是界限就标守。 - 了结:一个目录可以先后做几件事,一棵根一件,不必分仓库、也不用另设任务。根立住,从它走得到的那些项就了结(这一答才立住的留到这一答收尾):不再附着、不比凭据、不计进度与上限,收尾对照也不看,只在题下与卡片上给你看。所以旧事不会因后来的活改了同一个文件、清了旧目录又翻回来;图是专项的,要一直成立的归守。接着做时模型到文件里找到它,把根改回
doing,或写进新一项的needs:开着的根走得到它,它就又开了,这时才再比凭据。了结不存盘,由图算出。旧事都了结时再单立一项,与新立意一样退回;新立的项撞了了结的名字也退回,请它接着做或换个名字。 - 收尾前对照:这一答动过意(改过它,或它所挂的凭据在这一答里变过;动过手——写过、改过文件或跑过指令——的那一答,收尾前先重跑一回探针与测试,有项因此转待复核也算),模型说完要收尾时拦一次——摆出此刻的意(重读一回、探针也跑,各根附原话)、这一答里转待复核过的几项、改了而意里没有凭据罩着的文件(至多列八个),请它对照原话自判能否收尾,未尽的接着做。只拦一回,不替它验,要不要派帮手核对由它定;递的话记在行迹里,往后重装这一答照原处插回。对照完没再动手就收尾的,之前那段话仍作答复留在外面,对照那一步照实际的先后画在答复之后、它引出的话之前,请它不必复述、只补对照所得。
- 守(钩子):按任务设、一直要守的条件(「改完收尾前测试要过,不过接着改」「对外接口不改」),在意里标作守(
keep),不另设钩子。守不是要交付的结论:不上图、不计进度、不挂前提也不作前提;立时记下用户那一问的原话。只为某一件事守的写in指向它,那件了结即不再作数,否则一直作数。守分三等,能走钩子的走钩子,不行再靠收尾重查,再不行就凭模型自觉。钩子:限的是某类动作的(「只往测试机推」「批准前不发布」),守上写on(一条正则,比将要做的那一步:指令原文、文件路径、网址或工具名)。此后这段对话里(帮手做的也算)有副作用的一步对得上它,就在动手前、请示之前把关,分三样:挂了test:的先跑这条测试,将要做的经环境变量YAN_TOOL(工具名)、YAN_TARGET(指令、路径或网址)交给它,不过就不做这一步,测试的输出作这一步的结果回给模型;没挂测试的即禁令,对上就不做;标了ask的是关口——测试过了(或没挂)还要请你批,不论权限档位(径行也问,切档位也不放行它),请示条写守的原话与将要做的,只有准许与跳过,批过的这一步不再另问。拦下的,行迹右侧写「守拦下 · 名字」,没准的写「守未准 · 名字」。限制用前两样,留给你拍板的才标ask;撤了on,ask随之撤。钩子挂的测试平时不跑、不取指纹,收尾时也不重查;问而后行里只自动跑明确只读的,别的不跑,因为那一步本就要人批。改意本身不过钩子。收尾重查:限的是结果的(「改完测试要过」)。告诉模型一声,它就立一条守、凭据挂test:npm test,标成立时记下「过」;此后哪一答动过手(写、改文件或跑过指令),收尾前重跑守挂的测试与探针,有条转为不过就拦一次——行迹里那一步右侧朱字写「测过 · 测试不过」,模型接着改;收尾后再取一回,书眉照实画。测试照旧过的照常收尾,不多费一轮。显示:卡片里簿录之后另起「守」一节,行同目标那几行,出了事的说法换成事由;题下与书眉那一排只排目标,守出了事才在末尾隔一道丝栏写「守」跟它的记号。守没有进度:模型顺手带的 open、doing 之类照作数,不退回;要撤,让模型撤了它(removed)。跨任务、处处都要守的不归这里,归沙箱、权限档位或预设的提示词。 - 看意:题下一行与书眉常显一枚石青「意」:进度、一排记号,只数开着的事;眼下没有开着的就只写「往事 n」,点开即卡片;行迹里「意」那一步也点得开。卡片的图只画开着的事,页头右端「往事 n」点开,图下换成往事,一件一行、新的在上,点「›」进它自己那张图;没有开着的事时打开就是这一页。卡片只给看、不给改(要改的往往不是一两个字,直接告诉模型),由程序照文件画:页头写进度与更新于何时,右端「墨痕」是改意、弃、撤、归入的来历(只为查考,点开才换到图下);一张图,前提在左、根在右,只画一层,模块带「里面已立几项 ›」、点这个数即钻入;跨模块的前提在这一层左侧画成淡影(名后小字写它在哪),点它跳过去;里面细项之间的跨模块依赖,在上一层提成模块之间的一道淡线;记号是符号——青绿勾已立、泥金勾假定、泥金问号存疑(自称成立而前提未立)、泥金虚圈进行中、正墨两竖待定、朱圈待复核;图下是这一层的簿录,一项一行写说法,有事的换成事由(待复核的缘由、卡在哪个前提、假定的出处、待定的等谁定什么);弃了的不上图,记在墨痕里。点图上一项或簿录一行,就地展开它的验收、前提与支撑、凭据与缘由——这些因果由程序从图与指纹推出,不经模型。
上一答的行迹会压成一行「[上一答的行迹]…」冠在下一问的开头送给模型(页面上不显示),它才记得自己读过、改过哪些文件,不必每轮从头再探。摘要不接在助手自己的话后面:那样模型会把它学成自己回复的格式,答末照写一行。
执事对话里的「行迹」是一条时间线:模型边做边说的话与各步按先后穿插排列,进行中摊开可看过程,题头写「行进中 · n 秒」边做边走,做完自动收起成一行「行迹 · n 秒 · n 步 · 改 n 个文件」,只留最后的总结在外,点开可回看全过程;各步默认摊开的只有两种:目录清单(露前 10 行)与修改的 diff(两侧各 10 行),底下一行「展开全部」可看全;指令输出、读取、搜索、检索与翻阅这些有明确行数、往往又长的,默认折起(一答几十次检索,命中全摊开要占一整屏),标题行上有结果与行数,点标题行展开;报错的也折起。运行中摊开、运行完收起是行迹与帮手时间线的定例:整答收尾时行迹一律收起,帮手做完它的小时间线也一并收起。对谈里仍是折起的注脚。每一答的末尾附一行改动摘要「n 个文件已更改 · +增 −减」,点开可见逐文件的行数增减(edit_file 与覆盖写的 write_file 都按前后两版的逐行差异计,本答新建的按全文计),逐轮可查。思绪与各步都有进行中的呼吸点、完成后的勾;后几轮的思绪各在自己的分组里,工具参数还在流式拟定时先显示「正在拟 写入 xxx · n 字」。
一答头一回动手改文件(写、改、跑指令、下载、作画)之前,言先把它的目录此刻的样子记下来;这一答的回复动作里随之多一枚「退回」,点了先列出要动哪几件(改回、补回、删去),确认后把目录退回到这一答开工前——写的、指令改的一并退回,此后别的几答与人手改的也一并退掉。退过之后的下一问,开头注明退过,模型不会以为它先前写下的还在。只有行(绑了目录)记检查点:言的成品落在卷宗,卷宗是几段对话共用的,退回一答会把别处后来放进去的一并删掉。
不靠 git:目录不必是仓库,本机也不必装 git。言自己存在存储根的 检查点/ 里:内容按哈希存、同样的只存一份,目录也按层存成对象,没变的子目录共用;第二回起只读大小或修改时刻变了的文件,头一回相当于把目录拷一份。不记的:node_modules、.git、dist 这类列目录也不钻的,.gitignore(连同 .git/info/exclude)里写了的,链接,以及存储根本身(工作目录把它包在里面时);读不了的文件记作不明,退回时不动它。删了对话,它各答的检查点跟着删,没人再用的内容清掉。
只管目录里的文件:指令写到目录之外的、MCP 改的远端(开的 PR、发的消息)退不了——这是本地文件的一道底,不是后悔药。
遇到可以自成一段的大块子任务(通读一批文件并归纳、在某个模块里排查一个问题、按已定方案实现独立的一部分),模型可用 delegate 差遣一名「帮手」去做。帮手用同一个模型、同一个工作目录、同一套工具(但不再差遣、不请示用户,记忆只读——可 recall、查旧谈,不能 remember / forget)另起一段对话独立跑自己的工具轮次(默认最多 40 轮,设置里可改),做完把最后一轮的回报连同改动摘要寄回主模型;帮手看不到主对话,任务说明得把背景、目标、边界与要回报的内容写全。帮手的思考强度由主模型按活的难易给(effort:照章办事用 low,要权衡的 medium / high,难查的毛病、设计与复查用 max;模型不认的那一档落到最近的一档),省略则同主答所选,续派沿用它上一趟的;所用档位标在签的计数之后(「… · 思考低」)。同一轮里可差遣多名帮手,他们并行开工(分派时由主模型保证各自改的文件不重叠;桥接那头同一文件的写入与修改按先后排队,edit_file 的读—改—写在锁内完成,不同文件照常并行;run_command 不拿锁——对谈的工作目录都是卷宗,整目录的锁会让所有对话的指令排成一队,指令恰好改到 edit_file 手里的文件时由原文比对兜住)。读、写、改都由桥接捎回一枚文件指纹记在那一步上,再写再改时带上自己最后见到的那枚:读过之后被别人(别的帮手、主模型、编辑器、指令)改过的,write_file 不覆盖、请它重读,回话里点名是谁改的;edit_file 要改的那段原文仍对得上就照改,回话里提一句,此后整份覆盖前须重读。页面上每名帮手是行迹里一枚带「遣」印、衬淡金的「差遣」签(朱色留给印章与删减),只写标题与「n 步 · 改 m 个文件 · 几秒」(做着时是「n 步 · 几秒」,用时边做边走),做事时呼吸;点开是一扇全屏的窗,里面是帮手自己的小时间线——每轮的思绪、说的话、各步,与主行迹同一套画法:进行中摊开、最新的思绪与话实时跟着流,每一轮的各步折成一行「检索 18 · 翻阅网页 30 · 48 步」,那一轮跑着时摊开、跑完收起(亲手开合过的不动),说的话与末尾的回报始终在外,不被几十条检索顶到几屏之下;帮手工作期间输入框上方常驻一条帮手条(一行一名,写着它正在做的那一步,点一下开它的窗),行迹标题也显示「帮手「…」· n 步 · 进行中」——派它的那一答写完了也一样;指令沿用所在对话的权限档位,改动计入这一答的改动摘要与「改 n 个文件」,用量计入上下文成本(每一轮请求回来就扣进右下角的余墨,差遣面板题下写着这名帮手耗的墨,做着时也跟着跳),下一问的行迹摘要里也带着它改过的文件。帮手读过的文件不算主模型读过(反之亦然):谁要改,谁先读。对谈模式同样可以差遣(帮手带联网与文档工具)。
帮手在后台做,不随派它的那一答收尾:主模型派完活、自己也没别的可做,这一答就写完了,没有谁醒着干等。帮手做完,回报若赶上这段对话正在作答(主模型还在忙别的,或用户刚问了一句),就进那一答的收件口,在回合边界递上,行迹里它到达的那一刻落一小步「回报 · 帮手「…」回报」(点开即它的窗);没在作答,就另起一答,回报作这一问——页面上不是用户的气泡,而是一道细线,中间写「帮手「…」回报」(未做完的写「未完成」),点名字开它的窗;同一刻到的几份并成一问。这样一件长活分几段落在几答里,每一段写了什么都留在正文里看得到,不会被下一轮的话冲掉。另起的那一问前面照例冠着上一答的行迹,还没回来的帮手在里头记作「后台进行中」。这期间输入框照常可用:写了话是新的一问;案上空着时印是「止」,按下即叫停后台所有帮手(叫停的不回报,也就不再另起一答)。帮手的用量记在派它的那一答的「耗墨」上,做完时补记(余墨早已逐轮扣过)。页面刷新或关掉,后台的帮手随之中断,签上写明。派它的那一答若断着(断网中断、报错),回报不另起一答——另起的多半也是断,还会在断处底下留一截,续上那一答时成了残留、主线也分成两头:回报先记在这段对话上,中断的那一答随即自己续上、回报在开工时递进去;还断着就原样记着,等下一答(手点「继续生成」、重试或新的一问)开工时递上。旧对话里已留下的那截「回报 + 没写出东西的空答」,续写时收回来一并递上。
帮手与主答守同一句话:只剩等待就睡,信到了就醒。帮手挂了后台指令(训练、长构建、等一个条件),说完这一趟手上只剩它在跑,就把此刻的话作为进展交给主对话(「帮手「…」暂告一段,正等后台指令 bg1 结束」),随即睡下——不发请求,签上写「等后台」,仍算在做(帮手条里挂着它、「止」照样叫停它)。指令结束的消息寄给帮手自己,落在它自己的时间线里(一步「回报 · 后台 bg1 已结束」),它醒来据输出接着做,做完再交一次差;主对话这边先后收到进展与回报两份。于是一件长活可以整段交给一名帮手:开训练 → 睡 → 醒来评估 → 不满意再开一轮 → 交差,主模型全程不必盯着。先交进展而不是攒着,是为了主模型不干等、也不会被一条忘了停的开发服务器挂住(帮手的系统提示里有一句:不必等的收工前结束它)。等的指令随桥接重启而止,帮手醒来见没有信就此收工,进展即它最后的话,不再重报;主模型经 helper 递话照样叫醒它。页面刷新时睡着的帮手与做着的一样随之中断。
主模型可用 helper 按差遣时起的任务名给帮手递话。正做着的,话进它自己的收件口,与用户的补言同一套:它正说着就等到句尾再停这一轮递上,正跑工具就等结果交回时递(跑着的前台指令当场转入后台,结果即刻交回),不掐断;这句话落在帮手自己的时间线里(一步「传话」,递到打勾)。已收工的即续派:同一名帮手带着先前的经过接着做——它记得自己上一趟领的命、交的回报与行迹,回报照样寄回。叫停只停正做着的那一名,主答照常;它已做的照「未完成」回报送到,写明是按吩咐叫停。递话、续派、叫停在主行迹里也各是一枚金签:续派与传话的签标「已更新」,点开即那名帮手——续派开的是新的这一趟(面板顶上「所领之命」即新交代的活,‹ › 可翻回它的上一趟),传话开到递去的那句话。
回报只是帮手的结论。要核对它跑了哪些指令、出了什么,主模型用 helper 带 read 翻它的经过:领的命、说的话与做的步骤按先后穿插,指令带输出的末尾;几趟都列,还在做的做到哪写到哪。工具结果的原文不存,别的步骤只有签上的字。行迹里落一枚「翻看」签,点开即那名帮手。
帮手断了不回报、挂着等人续:不是谁叫停的就算断(连不上接口——远端先撑五分钟上下、额度用完、页面刷新或桥接重启时它正做着),断网时主模型多半也连不上,叫醒它只会跟着断,所以既不回报也不叫醒。签上状态位换成续写那一笔(与消息上的「续写」同一笔),签上写「中辍 · 缘由 · 几步」,行迹折起了也看得见——输入框上方的工作条上挂着「帮手「…」中辍于第 n 步」,末尾同样一笔续写,直到续上,差遣面板里时间线末尾照主答断了的样子落一句「…已做的都在,可由此续上」。点那一笔,帮手从断处接着做:已写的话、做过的步骤与「请接着做」照主答续写的写法排进它的历史,用的还是原来那张签,做完照常回报——主模型歇着也续得上,回报到了另起一答叫醒它。主答断着时点它的「续写」,这段对话里断着的帮手一并续上。主模型在下一问的行迹摘要里看得到它中辍、等用户续上,也可以自己用 helper 续派一趟新的(先前断着的那一趟随之作罢)。
长活不会因上下文满了而白做:一答(主答、旁注、每名帮手各自)之内的工具往来叠到快撑破窗口时,先请模型把较早的往来压成一份「工作笔记」(查明的事实、改过的文件、验证与否、走不通的路、下一步),代替原文接着做,最近两轮原样留着;这一答之前的对话与帮手的任务说明不动;若放不下的正是这一答之前的对话,主答会先把它压成摘要(与「压缩前文」同一份,落成分隔),旁注与帮手不压。填了模型的「上下文窗口」,送出前估到七成半就压;没填,接口回说放不下时压了再发一回。页面上的步骤一步不少,只是送给模型的少了;帮手压过的,签上记「压缩 n 回」。两答之间的「压缩前文」照旧,见对谈。
稳定性边界:一次回答默认最多 80 轮工具调用(帮手另计,默认 40 轮),「设置 → 工具」可改,超出后收回工具、请模型直接收尾;停止生成、页面刷新或连接中断时,运行中与等待确认的步骤一并收束,正在跑的指令连同它起的子进程整棵一起被桥接杀掉(taskkill /T),不会在后台继续改文件;每次发送前确认桥接在线与工作目录仍在(被删除时自动重建)。
工具参数按 prompts/tools.js 里的 schema 理顺(src/15-tools/01-arguments.js):常见的写法出入自动归位(file_path → path、cmd → command 之类的别名,数字与布尔写成了字符串,该是数组的只给了一项,ask_user 把单个问题摊在顶层),理顺后仍缺必填项的才不执行,并把收到的键与原文回给模型。模型输出被最大长度截断时,参数 JSON 会被尽量补齐——只读工具(读、列、搜、检索)照用,有副作用的(run_command / write_file / edit_file / download_file / http_request / remember / forget / delegate)一律拒绝并告诉模型原因,不会把截掉了 content 的 write_file 当成空文件写下去。同一答里相同参数的检索、翻阅、文档与请示复用已有结果,但只缓存成功的,临时的超时与报错不会被复用。