# #121–#123 与 #128 修复验证记录(已合并,随 0.2.28 发布) 本轮按“先修能修的”处理。以下代码已包含于正式 0.2.28(最终 Core 5.8.20);下方早期 Core 5.8.17 产物与验证记录保留为形成过程证据,未单独发行。 没有原始复现、没有设备或仍依赖上游的项目继续保留,不能用自动测试代替这些证据。 ## 修复范围 | 报告条目 | 开发分支中的变更 | 验证方式 | | --- | --- | --- | | #121 B-18 | JavaScript 验收脚本使用 Electron 的 Node 子进程模式;不再把脚本交给桌面应用模式运行。 | 真实 Electron 44.7.0 执行 ESM;旧实现失败、修复后通过;追加 Linux/macOS/Windows CI。 | | B-19 | 区分脚本缺失、启动失败、非零退出、超时、输出超限和输出格式错误;保留退出码、stderr 尾部及前 200 字节完整 UTF-8 输出。 | 真实子进程成功、退出 3、错误输出、缺失文件和取消回归。 | | B-20 / #122 F-10 | 生成前被阻止的请求也留下失败运行;保留每次运行的错误。已取消/失败的历史记录不再被后续验收改成运行中。删除章节后的运行继续存在于归档,可显式列出并定位原始产物。 | 三次被阻止的请求留下三份 V1/V2 记录;删除归档后的历史与原始字节读取;取消后再次写作不改写旧运行。 | | B-21 / F-13 | 返回结构化 `delivery_diagnostics`,列出未定论检查、未评范围、服务商错误和实际未提供的上下文字段。保留兼容的字符串 `delivery_reason`。不从“正典检查未定论”直接推断一定缺结算;降级后的总分为 null,并给 `score_valid`。 | 正典与部分审稿诊断、评分有效性、持久化和 DoG 消费回归。 | | B-23 | 区分流水线执行完成、作者确认和 DoG 交付判定;工作流页提示“审稿执行完成”不代表交付通过。 | 下方映射表;工作流组件回归。 | | B-24 | 分别返回 Agent 会话缺失、plan 模式、沙盘策略服务不可用、只读沙盘的具体代码与恢复提示。只读 DoG 查询继续可用。 | 四类拒绝条件及只读放行回归。 | | B-25 / F-12 | 工作流页展示作者确认的工具入口、参数及核对顺序;不自动代替作者确认,也不把确认当成补跑结算。 | 组件显示确认提示与执行/交付区别。 | | #122 F-01 | 现有异步写作/取消接口接上请求内模型取消;流式接收时检查取消并关闭流,停止后续模型请求。每段更新草稿,而非只保留第一段;恢复部分草稿创建新运行,核对上下文、源文件和项目配置。 | 流关闭及部分正文保留;取消→拒绝变化后的输入且零新增调用→恢复原输入续写→分阶段提交;旧取消记录保持不变。 | | F-02 | 每次写作模型请求记录阶段、分段号、重试次数、reasoning token、用量及提供方成本。V2 的 draft/fact_extract/settle 分别保存自己的用量;失败请求和部分稿保留用量记录。 | 分段与失败调用账本、reasoning 明细相加、阶段用量归属、提供方零费用和缺失费用回归。 | | F-03 | 项目可选择上一章全文、结尾字符或已核对的章节摘要;摘要缺失/过期会明确报错。 | 两层上下文组装与实际 writer 预览一致。 | | F-04 | `novel_review_chapter` 增加 `depth=quick/full` 和域选择。quick 审 coherence/canon/prose 与 safety;已选范围单独报告分数与结论,不冒充完整交付批准。 | 参数透传、非法范围拒绝、部分范围全通过而整章仍未批准。 | | F-05 | manifest 按文档记录原始/组装字符数及 compressed/excluded,包含 craft 文档。 | 预算压力下逐份字符数与实际组装文本一致。 | | F-06 | `novel_write_chapter(dry_run=true)` 组装所选模型档案下的 writer 输入,包含传入的 guidance/target_words 与文档尺寸,不创建写作任务。 | 工具→HTTP 路由参数测试;Studio dry-run 不调用 writer。 | | F-07 | `outline_extra_keys` 允许登记章级扩展字段,解析、缓存、受保护的章节要求和 writer 大纲均保留;未登记字段有解析诊断及警告。 | 大纲源→缓存→双层上下文→writer 预览回归。 | | F-09 | 同一来源对同一组章节、同一正文版本重复接纳复用操作,不重复失效化。不同来源(例如历史恢复)仍保留独立操作语义。 | 重复请求无额外写入;正文变化生成新操作;历史恢复既有回归。 | | F-11 | 单章和批量工具均明确异步返回 task_id;单章可取消,连续写作以批次任务查询进度。 | 工具描述、任务接口与取消回归;不另造重复的异步入口。 | | #128 D-01 / D-02 | 新增作者可查的 [95 项工具参考](TOOLS.md) 与 [上下文槽位参考](CONTEXT_SLOTS.md),README 提供入口。工具参数从注册定义生成;槽位、来源、保护规则和默认配额从固定 Core 源码生成。进阶体系 YAML 实际进入设定上下文,参与原有预算与逐文档用量。 | 95 个运行时注册名称与说明逐项一致;20 个来源条目覆盖,生成物漂移检查纳入 CI;创建真实结构化进阶资产后,验证普通及无 world/ 目录的装配、writer 输入、来源与文档尺寸。 | 成本仅在提供方明确报告时视为已知。`cost_summary.reported_usd` 是已报告部分,`complete=false` 表示存在未知费用;未知值不会伪装成零,也不会把估算当作账单。 取消是协作式操作:`requested` 与 `cancelled` 分开,等待提供方响应时不承诺瞬间停止计费;已收到的流内容与已完成段落会保留,后续请求不再调度。 CI 额外发现并修复归档路径缺陷:排除规则只判断作品内部相对路径,父目录或作品 ID 为 `tmp`、`cache`、`secrets` 或 `exports` 不会再误删大纲等必需内容。四种父目录及四种作品 ID、内部凭据/缓存排除与正文逐字节恢复均有回归。 真实 OpenCode Go 取消测试发现 LiteLLM 的同步包装流没有 `close()`,原清理逻辑未关闭它持有的 HTTP 流。现在取消和流式总时限耗尽时,沿包装流找到本次请求拥有的底层连接并关闭,不关闭共享客户端。直接流和包装流的取消、包装流超时均有回归;真实 Go 测试只有一次服务商请求,取消后已收到的正文保留、HTTP 响应确认关闭,后续请求在调用服务商前被拒绝,`~/my_novel` 文件未改变。实测源码的文件哈希与冻结 Core 提交核对一致。 Windows 全量 CI 又暴露 12 个失败。任务快照读取与写入互斥,并对 Windows 共享冲突做有限重试;正文搜索、工作台、接纳、审稿和历史使用原始 UTF-8 字节计算版本,结构化预览/应用/撤销和场景失败回滚保留行尾。大纲新增内容跟随原有 LF/CRLF。研究进程使用跨平台输出读取和进程树取消,Windows pnpm 脚本通过 Node 入口执行;测试中的 `/bin/echo` 改为真实 Python 子进程。POSIX 权限位断言只适用于 POSIX,凭据不出现在接口的断言在每种系统都运行。新增 20 项专门回归,另将搜索与场景回滚的既有测试扩为 LF/CRLF 两种输入。 字节版本已同步到章节记忆、角色状态索引、导出预检及相关文档接口;搜索检索仍使用规范化行文本,来源版本则保持与原文件一致。旧历史记录缺少格式标记时,兼容其当年的行尾规范化校验,只返回其校验值所代表的文本,不改写旧产物。新记录标为 `source_revision_format=utf8-bytes`,行尾改变也会触发完整性错误。 DSH rc.3 的依赖安装时间固定为发布日之后的 `2026-10-24T00:00:00Z`。原来的未来时间边界会让上游正在发布的一批依赖进入验收,已出现依赖声明早于实际包发布六秒的安装失败;历史依赖图已在 npm 官方 registry 成功解析,最终仍以完整宿主验收为准。 安装回归还发现自动恢复的进度更新会清空上一次后端崩溃原因;现在恢复期间保留该诊断,直到进入 ready 或结束恢复。回归会在新后端启动的边界核对诊断,避免靠观察时机碰巧通过。源码校验从固定 Git 提交归档还原字节并关闭行尾转换,再逐文件比较 wheel;CRLF 检出副本已验证可还原匹配,存在本地改动时拒绝覆盖。 任务快照读取只在文件句柄打开期间互斥,YAML 解析在锁外进行,避免观察进度阻塞后台写入。阻塞解析的并发回归在旧实现失败、修复后通过。异步功能测试允许慢速磁盘下的有限等待,降低轮询频率;错误终态立即失败,超时附最后状态,不把超时或失败任务视为成功。 ## 使用补充 项目 `novel_config.yaml` 可配置: ```yaml previous_chapter_mode: tail # full / tail / summary,默认 full previous_chapter_tail_chars: 800 outline_extra_keys: - 故事线 - 视角人物 ``` 在章纲中按 `> 故事线: 雨钥线` 填写扩展字段。summary 模式要求上一章有与当前正文匹配的有效章节记忆;不能用过期摘要继续写作。 只组装不生成:`novel_write_chapter {chapter_id, dry_run:true, guidance, target_words}`。 普通写作立即返回 task_id,用 `novel_task_get` 查询,用 `novel_task_cancel` 请求取消。 取消后使用 `resume_from_draft:true` 续写最近可用的部分稿;原上下文或源文件变动时会拒绝自动续写,需先检查草稿。 新运行通过 `resumed_from_run_id` 指向旧运行,费用记录分别保留。 历史运行:`novel_chapter_run_action {action:"list", chapter_id, include_archived:true}`。 删除章节会把原运行及产物移动到 `data/chapter_deletions//`,不会删除这些历史;返回的 `archive_directory` 和 artifact 指向归档位置。 当前没有自动清除运行的保留策略。列表默认 20 条、最多 200 条,可按章节和时间筛选;这不是磁盘保留上限。 ## 三套阶段的对应关系 | 语义 | Chapter Run V2 | 工作流页 | DoG 交付图 | | --- | --- | --- | --- | | 输入准备 | context / plan | context_assembly | writing 的上游依据 | | 草稿生成、事实提取和入库 | draft / fact_extract / settle / validate / commit | writing | writing 检查已入库正文及版本 | | 执行一次模型审稿 | review(completed 只表示调用与保存完成) | review | review 检查当前正文对应的审稿结论 | | 作者核对验收影响 | 验收台账中的 acknowledge | user_confirm | closure 的交付依据之一 | | 文风/压缩诊断 | 上下文与写作产物 | styling / compression | 不直接等于交付通过 | | 修订到最终交付 | 修订记录与再次审稿 | 不由单个绿色步骤代表 | revision / application / rereview / closure | `gate_status` 表示硬门禁,`delivery_status` 表示完整交付结论;硬门禁通过仍可能因未评范围、证据不足或质量不足而不能交付。 部分审稿使用 `scope_status=partial`、`scope_quality_score`、`scope_passed` 和 `unreviewed_dimensions`;完整章总分保持 null,完整交付仍需全范围检查。 ## 验证边界和发布限制 冻结 Core 提交本地全量 1531 passed / 32 skipped,包含新增 20 项定向回归;DoG 64 项(含真实 macOS Electron 二进制)、界面 310 项组件、两项真实 HTTP 路由回归通过。最终 22 项 CI 全部成功,Linux/macOS/Windows 各 1531 passed / 32 skipped、HTTP 各 2 passed、真实 Electron 各 5 passed;32 项为缺失旧样例的既有跳过。修复 PR #126/#127 已合并,最终源码、产物哈希和报告范围见 [候选验收记录](RELEASE_ACCEPTANCE.md#0228-候选未发布)。 本轮 Go 快速审稿先遇到本机 CLI 凭据读取错误,排查后四次流式请求成功、无服务商错误;所选范围通过,整章交付仍按部分审稿保持未定论,作品文件未改变。提供方未返回 token/费用明细,不将零占位计为已知账单。该实测发生于 `61c3f68`,之后完善审稿诊断与 Windows 文件处理,模型请求协议未改动。另一次 Go 取消验收使用的流处理模块与最终冻结提交逐文件哈希一致,已确认 HTTP 连接关闭。 #121/#122 的报告条目已修复、验收并合并,现已关闭。代码已随 0.2.28 发行;以下原场景验证与外部依赖继续独立跟踪。 [#123](https://github.com/LiPu-jpg/Openwrite/issues/123) 继续跟踪: - #98.1 宿主原生升级补丁正式发布,仍取决于上游;插件停机绕行工具不等于宿主已修。 - #105 已由报告者补充 Windows Electron 旧会话恢复成功的[实机证据](https://github.com/LiPu-jpg/Openwrite/issues/123#issuecomment-6422870871),本项验收完成。 - #109 B-13 已由报告者确认行中 `>` 与混合行尾锚点的 [Windows 实测通过](https://github.com/LiPu-jpg/Openwrite/issues/123#issuecomment-6423904648),本项验收完成。 - #111 Android/Termux 真机及外部 Studio 验收;没有 Android 原生运行时。 此前缺少材料时保留四项;报告者新回复已补齐其中两项,现只保留宿主正式发布及 Android/Termux 实机两项。回复中新发现的代码问题另见 [补修记录](ISSUE_123_FOLLOWUP.md),本阶段候选未单独发行,代码已纳入正式 0.2.28(最终 Core 5.8.20)。