feat: 对齐 R3/R4 验收树,并落地会话、聊天与控制台诚实片 - #2
Merged
Merged
Conversation
六个实施包 + 主控接线 + 三轮独立审查/验证的完整交付。
代码闸(node scripts/acceptance/run-acceptance.mjs --with-frontend):
927 通过 / 0 失败 / 3 跳过(930 测试),退出码 0
部署漂移 exit 1 走 ADVISORY 通道,不参与退出码
各套件: dsh-agos 174(172/0/2) · dsh-agos-router 124 · dsh-fleet 148
cn-capabilities 114 · dsh-mcp-bridge 4 · frontend-verify 366(365/0/1)
真实检查 vs 静态检查(详见 docs/engineering/agos-round2-20260908/VERIFICATION.md):
真宿主 + 真浏览器端到端 9/9 —— 仅 macOS,场景 8 证明范围比标题窄(证据条自报 404)
macOS Seatbelt 真子进程隔离 7 项
Linux OS 隔离 —— 本机五种容器运行时全缺,如实维持 verification-unavailable,零运行时证据
干净机器可复现性 —— 未验证(dsh-kimicode-swarm 不可公网复现,须操作者显式提供)
三轮独立质量门的发现均已逐条处置并反证:
两名审查者(执行/持久化、前端/协议)
一名接线审查者复核主控自身接线 —— 抓出计划文件名四处只修三处(P1)
一名独立验证者复算 —— 抓出计数下限门 fail-open、抗碰撞修复可被削弱绕过
本轮反复出现同一失误模式并已在文档中记名:
「注释/文档说得比代码做到的强」(修 5 处)
「把命中 0 / diff 为空当证据而未先跑正控」(修 2 处)
「反证只试移除,不试削弱」(修 2 处)
未 push、未合 main、未部署。
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
P1 turn-evidence 断尾行:追加前检查文件尾字节,不以换行结尾先补分隔符; tail 检查失败拒绝写入并如实报 persisted:false;读侧残片永不恢复。 可选 fsync 路径(短写循环+首条记录覆盖),默认写=页缓存可见、fsync=断电持久, 注释写明差别。测试:截断→追加→重开、无尾换行、tail 不可读、连续写入无空行、 进程内交替、真双子进程并发;原钉住故障的断言反转为钉住修复。 P2 空库 vs 无匹配:proposeSessionMemory fallback 三态 empty-store/empty-query/no-overlap,空库 note 不再声称「按重要度回注」, method=null。新增 fallback:'empty-store' 枚举为纯增量(前端不消费该字段)。 P2 转述否决误伤:OWN_PREFERENCE_AFTER_CONTRAST_RE——转折小句内第一人称 自身偏好不连坐;收紧人称(他她它您)/宾语我(希望让叫要求逼)/亲属称谓三种 误放行,距离上限 10 字;无转折的对本人转述与纯转述仍拒。+9 行合成语料。 P2 评估盲区:evaluateExtraction 检查全部 items(多吐进 extraItems); evaluateRetrieval 被拒 pin 的期望召回计入漏召回、完整 served 集合比对、 未声明被拒 pin 报 unexpectedRefused;mustNotAppear 重言式改为可证伪的 敏感句+邻句拼段断言;新增 2 条评估器自检负控(注入坏实现必须红)。 边界零回退:skills-evolve.js 零改动;store 键仍三件套;无 TTL/清理; 私有语料 2 项保持 skip。独立复核 APPROVE(2 P2 已在本轮整改落地)。 验收:dsh-agos 闸 183 tests / 181 pass / 0 fail / 2 skip,exit 0。
- cn-capabilities: 移除 linux-unshare(读范围=整个宿主),Linux 唯一后端 bubblewrap+smoke; manifest 新增结构化 isolation 字段(readScope/writeScope/network/environment/processCleanup/checks[]), 每项声明对应真实执行过的检查;非 darwin 测试显式 skip,撤回不存在的 'Linux runner' 声明 - dsh-agos-router: publicizeDecision 剥 taskRef、bind 不回显 expected 指纹、 unverified 行持久化 taskUnverified 标记、foldLedger 重验落盘数据; reviewer 材料与台账预览分离(raw 全文+截断告知+REVIEW_*_TRUNCATED 诚实门); 新增 acquireLedgerLockAsync/withLedgerLockAsync(超时/取消,fail-closed,仅等待异步); pinDispatchConfig 钉住 dispatch 起始配置快照 lib/index.js 接线补丁见 docs 交接(KIMI.md),由主控集成
Luna 核查未通过的根因是「测试测的是替身,不是货」。本轮按八项逐一修到有负例守着。 #1/#2 验收器(scripts/acceptance) - selftest 从 1 pass/13 fail 修到 37/37 exit 0:合成自测拿到真实合成 floor, 「缺基线必须失败」单独保留为负例(NC10 系列仍退 78,生产不再静默通过)。 - 正式门完整性补真子进程负例:Luna 的原始复现(全部必需套件缺失 → tests=0/ green=true/exit0)由 NC11c 钉死;整包缺失、空目录、缺 floor 条目、空/坏基线、 全 skip、计数下降各有负例。selftest 与依赖树校验接入正式门,哨兵防递归(NC16)。 - 合成运行自报 authoritative=false 且拒绝写基线,防假套件树洗掉真基线(NC19)。 - 嵌套 node test 环境传播:为孙子进程斩断 NODE_TEST_CONTEXT/NODE_OPTIONS(NC17)。 #3 依赖可复现性与安装路径安全 - dsh-kimicode-swarm 定性为**宿主环境集成**而非包依赖:registry 版逐版 npm pack 实测缺 publishProgress 等导出,其 installSettingsSection 又把 dsh-settings 拽回 0.1.0-rc.6 引发 peer 冲突。纯工具函数内联(有与真 swarm 的差分测试), publishProgress/runNormalizedBatch 改为运行期可选集成并显式披露降级。 - 依赖 11 → 6。dsh-timeout 与 react 是完整导入图扫出来的真依赖(动态 import 与 CommonJS require,静态匹配漏掉),已补进显式声明;schemastery 对齐 3.18.1。 - npm ci 从公开 registry 实测 exit 0(31 包),不用 --force/--legacy-peer-deps。 - --check 改用完整静态导入图,缺包点名文件与行号,静态定不了值的动态导入如实披露。 - prepare-host-modules 写入前校验祖先真实路径与所有权(O_NOFOLLOW), 经 symlink 指向 live profile 一律拒绝且零写入;TOCTOU 残留窗口在报告里写明。 #4/#5 宿主联测 - 判定词汇补齐 pass/fail/blocked/skipped,未覆盖层点名进汇总;blocked 不计入 passed。scenario8 不再用 `if (strip.count() > 0)` 静默跳过证据条:真挂 turn-evidence 插件并以运行中宿主的 probe 校验,没答就报 blocked。 - scenario7 加可观测重叠屏障:持住分页响应直到实时事件真的抵达, 不再以 Promise.all 冒充「竞争已测」。 - 跨 chunk 脱敏(单字节喂入/对半切/多字节边界/内存上限)、Playwright 拒借 live profile、浏览器源围栏、cleanup 按 runId+owner+进程身份(拒绝 pid 复用)、 createHarness 逐级回收含「放弃后才到达的资源」。HOME/CODEX_HOME 一字未动。 #6 会话删除的真实宿主判据 - host.describe 在固定提交 a66e470204 全仓零匹配(vendoring 记录原文: 「host.describe removed」),那次内调必然 404 → 删除永久 503。已删除该死代码。 - session.list → session/list(0.1.2 把点号换成斜杠)。 - 挂载权威谓词取宿主自己那一个:ctx.sessions.get(id)!==undefined (list.ts:172)。并证实 running **不能**当挂载判据:宿主对「挂载但空闲」与 「磁盘冷会话」都产出 running:false(list.ts:125 vs :178),二者不可区分。 - 三个生产接线函数此前零覆盖(host.germane 因此腐烂一整轮),现已导出并补 13 项测试。 #7 Fleet 远端产物 - probe 与 stream 合并为单次远端执行,读任何字节前绑定并验证实际打开对象; 缺少远端安全执行能力时明确拒绝,不用前后 stat 冒充安全打开。 - fake SSH 真跑 /bin/sh 执行生成命令,覆盖 guard→cat、find→tar、probe→stream、 目录与叶子替换、symlink/hardlink、合法正控、GNU stat 分支;只读合成根外 sentinel。 #8 整合 - 智谱 e6c1045、Kimi 3c61727 均已核验基线/SHA/diff/所有权后 cherry-pick,零冲突。 - Kimi 的 router index.js 接线补丁已应用(异步锁 + auditFile 钉住), wiring 测试移入正式套件;我作为非作者做了否证:拆接线两测各变红,恢复即绿。 - 顺手补掉其复核员指出的残留:写路径响应递归剥 task/taskRef, 否则 taskRef 漏出会让 GET /routes 成为确认预言机、并能把 unverified 绑定回灌成 verified。 未验证与限制见 docs/engineering/agos-fix-20260909/。
上一提交把八项都修到有负例守着,但**跑全量验证时又被三个"测试测的是替身"的老毛病咬了**。 这一提交修的都是验证过程中实测暴露的,不是设想的。 一、依赖面预检的两个反向口子(scripts/acceptance/run-acceptance.mjs) 假绿:提交里那份 dependency-surface.json 测于 2026-09-08 的 7e7e359 —— 比 swarm 解耦还早,只认识 69 个套件、通篇没有 swarm。门据它报「无缺失」,而它描述的是一棵 已经不存在的树。判新旧改看**内容**(新增 lib/surface-inputs.mjs 的 inputsDigest, 覆盖各插件 test/ 与 lib/、宿主依赖树 package.json),不看 gitHead —— 产物自己要被提交, 按 HEAD 判会「永远陈旧」,等于把这层预检永久关掉,比不加还糟(NC20f 专钉这条)。 陈旧不硬失败(可能只是没重测),但降级为参考:不据此判失败、点名本来会被判谁、 写明权威判定在 host-modules-check。 假红:预检不认 host-integrations.json。用当前树重测后,它把 cn-capabilities 与 dsh-fleet 判成缺 dsh-kimicode-swarm —— 而这两套件按设计优雅降级、实跑 exit 0。 现在复用权威检查那份清单做豁免,且豁免必须**点名**出现在输出里,不许静默。 清单坏掉时不豁免任何东西(坏清单不得变成万能放行证)。 新增 NC20a–g 七条真子进程负例,并给 run-acceptance 加 --host-integrations 注入口 (与 --surface 同族,计入 SYNTHETIC,用了就不许写基线)。NC4 的合成产物补上当前指纹 —— 它测的是「缺包→失败」,不是「陈旧→降级」。 二、Router 锁活性判据在量机器负载(plugins/dsh-agos-router/test/index-async-wiring.test.mjs) 六套件并行把机器跑满时,Kimi 这条测试的「持锁期间定时器 tick ≥ 10」只走了 7 → 报 「事件循环被 park」。那是**绝对吞吐**阈值,量的是机器有多闲。判据换成两条与负载无关的: tick > 0(单线程循环一旦被同步自旋占住,定时器恰好一个都不走)+ 与同进程无锁基线比 不得低于 1/4。否证:真同步自旋 0 tick 判红、当初误报的 7 tick 判绿、基线 10% 仍判红。 更要命的是那次误报**挂了 40 分钟**:clearInterval 与持锁子进程回收写在断言之后, 一条断言抛出就把 interval 和子进程漏在世界上,node:test 报 "Promise resolution is still pending" 直到 runner 超时。清理移进 finally,现在同一失败 3 秒变红。 三、Fleet 拒绝上报断言耦合了事件顺序(plugins/dsh-fleet/test/remote-artifact-race.test.mjs) `refusals.at(-1)?.refused === true` 断言的是「拒绝必须是最后一个事件」。实测(整套件 + 8 路 CPU 负载,三跑复现两次)数组是 [{kind:'tgz', refused:true, error:'artifact refused: symlink'}, {kind:'tgz', error:'ssh exit null'}] 第 0 条正是要断言的拒绝,第 1 条是清理时 ssh 子进程被杀留下的。机器一忙拆解事件先落, at(-1) 就读到它 —— 红的是排序耦合,产品一点问题没有。改成「存在一条 refused:true 且理由/kind 匹配」:去掉无意义的顺序耦合,判别力反而更强(原来那条不看理由)。 其中不可区分 404 那一路不核对理由文案 —— 它对内对外本就是同一句 'artifact not found',硬要理由等于替代码规定它没有的行为(我第一版就这么写错了)。 否证:拆掉生产端的 refused 标志,该断言变红。同条件连跑 3 次全绿(改前 3 跑红 2)。 四、写路径响应递归剥 task/taskRef(plugins/dsh-agos-router/lib/index.js) Kimi 复核员指出 GET 视图早已剥,POST 没有。taskRef 是任务全文的 sha256,漏出去会让 GET /routes 成为确认预言机,更糟的是客户端能把它回灌、把 unverified 绑定说成 verified。 七个写路径统一走 publicize(递归,因为 assemble/dispatch 把决策行嵌在字段里)。 落盘台账照旧记指纹,剥的只是响应。四项守护测试。 五、宿主联测在真宿主跑通 9/9(0 blocked / 0 skipped) 隔离 Playwright:C 的守卫拒绝借操作者 live profile 后联测起不来 —— 按其提示给 frontend 自己的树装了钉死版 playwright-core@1.62.1(registry,无 --force), 实测解析到 repo:frontend/package.json,不是 ~/.dsh。 scenario8 的判据第一版用「历史轮次号不得出现在证据条任何位置」,真宿主上立刻误报: 最旧轮次是 1,而证据条本来就写着「步骤 1」。改成内容判别 —— 每跳 prompt 是专属原文 (`历史构建 N`),证据条把本跳 query 原样摆在「问句」后面,于是串轮次就是页面上多出 另一段话;并收口到集合相等(任何别的轮次都不许出现,不止最旧那轮)。7 例否证全中。 六、计数下限从这次真全绿运行重生成 基线文件自己写着「整树转绿后 controller 应当从一次真全绿运行重新生成」,--write-floors 也只接受全绿。dsh-agos 172→194、router 124→156、fleet 148→176、selftest 37→44, 无一下降 —— 原来 +22/+32/+28 的余量等于允许删掉那么多测试还是绿的。 最终门:pass 1054 / fail 0 / skip 8(tests 1062),exit 0。 8 项 skip = 3 项私有语料(未读真实语料)+ 5 项 swarm 不在场(宿主集成的直接后果)。
文档围绕最终状态写。历史结论在 VERIFICATION 文末单列并标明作废原因,共四条: 「验收器自测 14/14」「依赖树可复现,11 个包」「依赖面预检无缺失」 「scenario 8 PASS(历史证据隔离已验)」,外加本轮自己修正的「M16 被 11 条负例抓到」。 日志脱敏口径写在每份文件头部三行(一次路径前缀替换 <HOME>/<REPO>/<TMP>,此外未作删改), SHA256 针对**脱敏后**的文件本身 —— 不隐改日志又沿用旧 hash(上一轮独立验证者抓的就是这条)。 SHA256.txt 不含自身摘要(自指无意义),12 份日志全部校验通过。 REVIEW.md 里自列了「我认为最该被质疑的三处」与「如果我是审查者会先查的五处」, 每处写明「改坏它,哪条测试该变红」。 未宣布全部验收通过:按任务书,等独立审查与最终生产接线验证。
git diff --check 相对真实基线抓到 clean-npm-ci.txt 末尾多一个空行。按任务书 「原样日志空白使用明确策略处理,不能隐改日志又沿用旧 hash」,做了三件事: 1. 空白策略写进每份日志头部并对全部 12 份统一执行:正文末尾规范化为恰好一个换行 (捕获噪音),行内空白一字未动。不是只修被 diff --check 点到的那一份 —— 逐份特事特办的话,声明就不成立了。 2. 头部声明原先把真实主目录路径**写在了脱敏说明里**,脱敏声明本身成了泄露源。 改成只描述映射关系不写实际路径,并加了全库扫描断言(HOME / REPO / /var/folders 零命中)。 3. SHA256 按处理后的内容重算,校验 12/12 通过;SHA256.txt 不含自身摘要。
三条都是**独立复核抓出来的**,不是我自己发现的,且都落在我的所有权内。
一、session/list 内调的 payload 缺整个 args 层(plugins/dsh-agos/lib/index.js)
上一跳只改对了方法名(点号→斜杠),payload 还是 `{}`,于是照样永久失败,只换了个
失败理由。固定宿主 gateway/src/index.ts:950-953 要求 payload 含**恰好一个**
plain-object args 字段;assertExactArguments(:1112-1137)再要求 args 的键与
descriptor 对上。session/list 的形参是 `_request` —— 本仓 api-client:71 的权威映射
与 :131 的 `payload: { args }` 信封构造,以及宿主 e2e 的 `'session/list', {_request:{}}`
三处一致。改成 `payload: { args: { _request: {} } }`。
我原有 13 项测试全绿是因为假 fetch 只断言了 url 和 method,请求体其余部分没人看 ——
测试对准了"方法名"一个维度,真实失败面还有"信封形状"这一维。现在假 fetch 逐字实现
宿主那两条谓词(gatewayFetch),并配一条元证明负控:把四种错形状喂给同一个假 gateway,
断言它真的会拒 —— 否则"形状对了"这条测试永远绿,等于没测。
否证:payload 退回 `{}` 变红;args 键名写成 `request` 也变红。
二、Fleet 40KB 预览把拒绝吞成空的 200(plugins/dsh-fleet/lib/index.js)
原先是两趟 SSH(probe + read),且第二趟管进 `head -c 40000` —— 管道退出码是 head 的,
远端 exit 9(拒绝)传不出来。不泄漏根外内容(字节那趟本来就绑描述符),但操作者
分不清"产物是空的"和"产物被安全守卫拒了"。改成单次远端执行 + 判决行先到再决定
状态码,limitBytes 在已持有的 fd 上截断(`head -c N <&3`),是同一对象的更小一次读,
不是第二次解析名字。顺带删掉两个不再使用的 probe 导入。
新增 test/ws-preview-verdict.test.mjs(6 项):走**真实路由 handler**,stub ssh 用
/bin/sh 真跑生成的命令,打在临时目录搭的假远端树上。覆盖正控、硬链接 409、
符号链接 404、sentinel 零泄漏、单次远端执行、40000 字节截断。
否证:退回 `| head -c 40000` 时硬链接与符号链接两条变红。
三、裸 --write-floors 被静默忽略(scripts/acceptance/run-acceptance.mjs)
opt() 只认 `--name=value`,裸标志落回 null,写基线那段直接不执行,而且**输出与
不加时逐字相同**。我自己就踩了:跑完看到全绿,以为下限已随新增测试上调,实际
文件一字未动,差点带着过期下限交付 —— 过期下限不会让门变红,只会让它不再拦人,
正是本轮在追的假绿。改成在参数解析处立即退 78(放在写盘处会先打完"退出码 = 0"
再补报错,读者容易只看见前一句)。负控 NC19c 兼钉"必须在跑任何闸之前退出"。
计数下限已从这次全绿运行重算:dsh-agos 196/194→198/196、dsh-fleet 177/176→183/182、
selftest 44/44→45/45,其余不变,无一下降。
正式门:pass 1063 / fail 0 / skip 8(tests 1071),exit 0。
数字全部重取(1054/0/8 → 1063/0/8;dsh-agos 194→196、dsh-fleet 176→182、selftest 44→45), 六份受影响的日志重抓并重算 SHA256(12/12 校验通过,泄露扫描干净)。 旧数字只在一处保留,作为"上一跳是多少"的显式对照。 REVIEW.md 新开"零"节,标题就是对我不利的那句:任务书第 6 项我据 13 项全绿测试 宣布完成,而那 13 项从未看过请求体 —— 方法名改对了,信封形状仍是错的, web profile 上删除照样永久 503。这条是独立复核抓的,不是我自查发现的。 教训写成可执行的一句:修"调用对方的方式错了"这类问题时,替身式假对象天然会放过我, 因为替身的宽容度由我自己写。所以现在假 fetch 换成实现宿主谓词的假 gateway, 并配元证明负控 —— 没有那条负控,"形状对了"这个断言本身就没有根据。 VERIFICATION §8 从三项扩到六项(8.4 信封形状、8.5 Fleet 预览吞拒绝、8.6 裸 --write-floors), 每项写清"我的测试为什么没抓到";§7 计数下限表加了重算说明(第一次用裸标志被静默忽略)。 TASKS §9 补 9.4/9.5/9.6 并注明来源:两项独立复核抓出,一项我自己踩。
这是**第三轮经 Luna 独立执行验收后保留的差异**,此前一直以未提交状态存在于工作树。 第四轮开工前先把它落成提交,免得任何一次 checkout 悄悄丢掉已验收修复。 来源与归属:业务代码修改全部由 5 名 gpt-5.6-luna 执行者完成,另有 1 名执行整体验证、 1 名独立复审;主控核对差异与证据、退回错误判断。本提交不含第四轮任何新开发。 落地前的三重核对(不是"看起来对"): · HEAD = cf5ee88,与验收记录一致; · git diff 快照 sha256 = 774cfefc32051fd196870189c0a7b94c1dfb786dedee46ba4626a889a4901589, 与 LUNA-EXECUTION-ACCEPTANCE.md 记录的值逐字符相同 → 工作树与验收时逐字节相同; · 596 个 tracked 文件逐文件 sha256 对照 phase3/pre-tracked-sha256.txt, 0 不一致、0 多出、0 缺失。 保留的修复(逐项对应验收表): · 验收脚本:自定义计划/递归哨兵抑制必需门时,运行标 authoritative:false 且禁止改写 正式 floors;空 `--write-floors=` 在执行套件前退 78;非正式运行来源进 JSON 与终端。 · CN 计划测试:恢复合成模块覆盖(分波/上游注入/批准写回/字符串步骤 ID/真实计划标签/ presentationMeta),真实 scheduler 检查改为 AGOS_PLAN_RUN_REAL_SWARM=1 子进程, 宿主缺席时明确 skip —— 不再以"函数存在"充作运行证明。 · 浏览器访问边界:拒绝 file:,只允许声明的 HTTP↔WS / HTTPS↔WSS 同协议族。 · 启动失败清理:launcher 已生成浏览器后抛错时,部分启动的子进程进 unwind 回收。 · 清理归属:owner identity 缺失/空/unknown 时保留目录(不判 orphan); killRecorded 在发信号前刷新 PID、启动时间、命令行。 · 中文记忆评估器:重复召回不再被 Set 吞掉,计入误召回 —— 这是评估器修正, 不是"线上存在重复召回"的证据。 明确不含:Fleet 的 `cat list | tar` 退出码修改已被执行者撤回 —— POSIX pipeline 取最后一个命令的状态,原判断不成立,不计作已修复缺陷。 该状态的实测(第三轮 phase3,非本轮结果):正式门 authoritative:true、exit 0、 1074 tests / 1069 pass / 0 fail / 5 skip;5 skip = 私有语料 3 + 真实 swarm 2。 未验证:真实 swarm、私有语料、Linux/bubblewrap 运行时。
独立复跑正式门 1263 pass / 0 fail / 5 skip,exit 0。Linux 在 Darwin 上仍 blocked,swarm 来源不可审计。 Co-authored-by: Cursor <cursoragent@cursor.com>
create 信封仍无 title,主题走 rename;不存在的 CWD 先 workspace-stat 拦下,避免再建再删。 Co-authored-by: Cursor <cursoragent@cursor.com>
缺插件时写未采集并给出重试,标题只说机器与机架,不再写死 Homelab。 Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
活 Remote 要顶层 ns/ops/expectedRevision;Skills 缺扫描不再装成零调用。全绿后 floors 升到 1330/0/5。 Co-authored-by: Cursor <cursoragent@cursor.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
24bc17e对齐到已复跑的 Round 2–4 工程树(含 Luna 八项),并保留验收门、宿主联测与计数下限。session/rename(create 信封不带 title)、非法工作目录先POST /api/agos/workspace-stat、顶栏「新会话」与侧栏同一对话框。session/prompt的mode: queue。宿主没有 suggest/complete,不做本地补全冒充建议。settings/mutate把ns/ops/expectedRevision铺在 args 顶层;只写permission.defaultPreset与agent-default-model。凭据仍只读。loadURLhttp://127.0.0.1:3091/agos/或 Vite:3092/agos/。Vite 绑 IPv4 loopback。不是第 10 个官方宿主场景。run-acceptance.mjs行为未改。Test plan
node scripts/acceptance/run-acceptance.mjs --with-frontend --write-floors=scripts/acceptance/expected-counts.json(2026-09-13)→ 1330 pass / 0 fail / 5 skip;frontend-verify 414/413settings-p4.mjs→ 13/13,permission 与 agent-default-model 都是 mutate-oknpm run desktop -- --mode=development --probe-only→http://127.0.0.1:3092/agos/HTTP 200desktop-main.cjs http://127.0.0.1:3092/agos/(未写入 package.json)session-p1.mjs、chat-p2.mjs、console-p3.mjs(2026-09-11)node tests/host-integration/run.mjs→ pass=9 fail=0Out of scope
/api/agos/routes/decide接到 SPAsecrets-gate,不把组装自动变成 swarmcredentials/set/settings/update/settings/replacepatch.ymldistIndex;不拷 DSH Desktop.app / AgOS.appelectron,开窗用仓外缓存