Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
# 当前架构

> Status: AUTHORITATIVE
> Last updated: 2026-10-08
> Last verified: 2026-10-08,核对本地源码及回归;真实 provider 和长期运行未复验。

本文件描述当前代码,不是历史阶段的冻结设计。公共类型见 `src/interfaces.ts`,MCP schema 见 `src/mcp/schemas.ts`;共享边界见 [SHARED_CORE.md](SHARED_CORE.md)。

`src/mcp/main.ts` 仅为 Codex 入口;`src/host/stdio.ts` 组合宿主 profile、运行配置、TaskStore、DirectWorkspaceProvider、BridgeTaskManager 和 MCP server。启动不创建 ZCode session;坏的 Bridge 配置会明确阻止启动。doctor 对坏配置返回 error。

Manager 用进程内 promise 队列以及同一 data root 下的 `.tasks/.manager.lock` 序列化调度。锁记录 owner PID,活 owner 不因时间超限被驱逐;死 owner 由串行 reclaim guard 回收。未完成 owner 发布的异常锁明确报错。不同 data root 不共享调度锁,需要调用宿主避免向重叠目录提交冲突任务。PID 重用的跨进程身份强化尚未验证。
Manager 用进程内 promise 队列以及同一 data root 下的 `.tasks/.manager.lock` 序列化调度。锁记录 owner PID 与 best-effort 启动身份,活 owner 不因时间超限被驱逐;死 owner 由串行 reclaim guard 回收。获取时原子发布完整 owner;释放时原子移出完整目录,再清理私有 retired 目录,避免释放中退出留下缺 owner 的共享锁。不可读取的旧 owner 仍明确报错,不按年龄删除。恢复 single-flight 即使释放锁抛错也会复位。不同 data root 不共享调度锁,需要调用宿主避免向重叠目录提交冲突任务。锁 owner 回收仍依赖 PID 的 ESRCH,尚未按保存的 fingerprint 判断复用。

同一 data root 内,FIFO 队列按 worker 上限和执行路径重叠规则启动 detached worker。Spawner 显式传 attempt。worker 在进入 adapter 前通过 attempt 目录的永久 `execution.claim` 抢占执行权,拒绝重复、旧 attempt 和终态入场。`state.lock` 保护状态更新和结果提交;worker 提交还校验当前 attempt/非终态。Manager 的延迟 PID 写入只作用于仍 running 的同一 attempt。

未启动 worker 可重拉一次;抢占过的 attempt 不会重复执行。已开始的 worker 不自动重跑。worker 丢失但记录的 ZCode PID 仍存活时保留占用,要求 `zcode_cancel` 验证清理。清理失败的终态任务也保留目录与 slot;续跑被拒绝,再次 cancel 成功后才释放。进程身份依赖 PID;操作系统重用 PID 和自行脱离进程组的后代属于未充分验证的边界。
未启动 worker 可重拉一次;抢占过的 attempt 不会重复执行。已开始的 worker 不自动重跑。worker 丢失但记录的 ZCode PID 仍存活时保留占用,要求 `zcode_cancel` 验证清理。清理失败的终态任务也保留目录与 slot;续跑被拒绝,再次 cancel 或只读恢复探测确认退出后才释放,原 failed 结果不改写。进程恢复使用 PID 和启动 fingerprint;unknown 不当作已退出。Windows 强制清理先采集当前树及身份,再执行 taskkill,并核验采集到的根与后代均已退出;非零退出也可以由新退出证据解消,存活或 unknown 均不释放。公共错误使用稳定诊断代码,不转发本地化 taskkill 文本。采样后新建、根退出前已脱离树的后代,以及查询与发信号间的 PID 复用窗口仍属未充分验证边界。见 ADR-005。

worker 每 3 秒原子写入一次绑定 attempt 与 PID 的私有 heartbeat,字段含 session、turn、Bridge event 序号和已观测到的 ZCode event 序号。管理器遇到一次负向 PID 探测时,若 heartbeat 不超过 15 秒则暂缓失联判定。ZCode turn 完成后,worker 在清理进程前写入 outcome checkpoint,并在清理成功后更新验证标志;worker 在提交最终 result 之前退出时,管理器可据 checkpoint 恢复报告,清理未验证则保留 `cleanup_failed` 与 workspace 占用。

Expand All @@ -22,6 +26,6 @@ worker 每 3 秒原子写入一次绑定 attempt 与 PID 的私有 heartbeat,

TaskStore 的 JSON 用临时文件原子 rename;事件文件有独立短锁、字节上限、关键事件保留空间和稀疏索引。追加只读最后一个字节,不重新读取完整历史。worker 把模型输出拆为 2000 字符事件;容量用尽仍可能丢弃非关键事件,普通超长摘要明确标记截断。

损坏记录会显式诊断、隔离调度,并保留可确定的执行路径。健康且不重叠的任务可继续;无法确定损坏任务的执行范围时暂停新调度,不能猜测它已经释放目录。
损坏记录会显式诊断、隔离调度,并保留可确定的执行路径。健康且不重叠的任务可继续;无法确定损坏任务的执行范围时暂停新调度,不能猜测它已经释放目录。每次 pump 在调度锁内校验一次全库,快照复用于运行占用、损坏占用和 FIFO 队列;启动前重读 queued 状态。快照不跨操作缓存,终态健康检查仍保留,因此调度成本仍随历史任务数增长。

Desktop 索引同步是 best effort,事务内检查 schema 与 Bridge owner、更新有限状态字段,保留用户标题与额外 metadata。回归使用临时 SQLite。真实 Desktop schema/刷新/并发行为受安装版本影响,本轮未写入真实数据库。
6 changes: 6 additions & 0 deletions docs/INTERFACES.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# 当前接口与兼容边界

> Status: AUTHORITATIVE
> Last updated: 2026-10-08
> Last verified: 2026-10-08,本地源码与回归;原生 session/read 仍 NOT RUN。

准确类型与 schema 以 `src/interfaces.ts` 和 `src/mcp/schemas.ts` 为准。核心公共入口见 [SHARED_CORE.md](SHARED_CORE.md)。历史源码注释中的 V0.1/FROZEN 是沿革说明,不代表当前新增功能已经冻结。

默认 MCP 工具:`zcode_task`、`zcode_status`、`zcode_feedback`、`zcode_result`、`zcode_continue`、`zcode_cancel`、`zcode_events`、`zcode_interaction_reply`、`zcode_doctor`、`zcode_model_catalog`、`zcode_default_model`、`zcode_set_default_model`、`zcode_clear_default_model`。实验 progress probe 需显式启用。
Expand All @@ -8,6 +12,8 @@ TaskPackage 的五个数组必须存在,可为空。workspace 是绝对项目

任务状态为 queued/running/completed/failed/cancelled/waiting_for_master。后四种结束当前 attempt;completed 表示执行及报告解析完成,宿主仍独立验收。续跑只接受 completed/failed/waiting_for_master,且清理必须已验证;保留同 task ID、执行目录和旧 attempt 证据。

AgentReport 必须包含布尔型 needs_master_decision;缺失或字符串值仍返回 invalid_agent_report,不静默合成。该错误的显式续作使用仅修复报告的 prompt,携带 candidate 与有界原始响应,不重发原实现任务或测试命令,禁止模型编辑或重跑。Bridge 不自动增加修复 turn;禁止工具操作是 prompt 约束,不是 OS 沙箱。心跳而无业务事件时 observation.activity 为 starting(启动宽限内)或 unknown,不声称业务执行。固定反馈模板区分原 attempt 的 cleanup_failed 与后续 cleanup=verified;未确认清理标为未验证,不能写成 NOT RUN。决策见 ADR-005。

任务 objective、requirements、路径、验收、测试命令及续跑 feedback 不截断;完整 prompt 超过 60,000 字符会返回 TASK_INVALID。参考 context 与旧结果摘要仍有明确的截断标记,不能把安全约束只放在参考 context。

zcode_events 使用单调 seq cursor、limit 1–200、wait_ms 0–25,000、raw/summary view。summary 合并可见输出时会注明压缩。公开事件只包含可见文本、工具名称与状态,以及有限的生命周期 metadata;隐藏 reasoning 和未知 usage metadata 不进入公开事件。订阅前记录 `snapshot.runtime.eventSeq`。live 订阅连续 10 秒没有新事件时,每 5 秒按已观测序号向 `session/events` 补拉一次,重放仍经过同样的 session、单调 runtime seq 和 turn ID 过滤;runtime 明确拒绝该方法时降级为纯 live 订阅,连续 3 次失败后同样降级,两种情况都会发出可见的 `session_event_replay_unavailable` 事件。协议变化不能只靠字符串方法名推断支持。`session/read` 未接入,原生当前状态查询仍为 NOT RUN。运行时事件先核对 session、单调 runtime seq 和可用 turn ID;存在历史事件的 session 必须观察新 turn.started 后才接受结束事件。缺少某些身份字段的旧协议仍有兼容路径,真实跨版本行为未全部验证。
Expand Down
8 changes: 6 additions & 2 deletions docs/PROJECT_STATE.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Project State

> Status: AUTHORITATIVE
> Last updated: 2026-10-07
> Last verified: 2026-10-07,核对来源见文末。
> Last updated: 2026-10-08
> Last verified: 2026-10-08,本地源码与回归;发布与真实运行边界见下文。

当前状态快照,回答"现在什么能用、什么不能用"。路线图和优先级不在这里。

Expand All @@ -11,6 +11,7 @@
- 当前发布:`1.2.2`(`package.json`、`plugins/codex-zcode-bridge/plugin.json`)。
- 发布方式:release-please 监听 `master`,合并后自动开版本 PR;合并版本 PR 才产生 tag 与 GitHub Release。
- CI:`.github/workflows/ci.yml`,ubuntu 与 windows 两个作业,跑 typecheck、build、test、validate:plugin,并校验生成的 bundle 已随源码提交。
- 本地未发布修复:`codex/long-session-reliability-fixes`,包含按身份核验 Windows 进程树、原子释放锁、严格报告提示与续作、provider namespace 兼容、业务观察与清理反馈,以及调度单次快照。版本号未改,未更新安装缓存或重启其他会话服务;不能把本地代码当作已加载版本。决策见 ADR-005,验证结果见 [本次报告](reports/2026-10-08-long-session-reliability.md)。

## 稳定

Expand Down Expand Up @@ -42,6 +43,9 @@
- 真实 GUI 关闭时序、UI 响应与取消时延。
- 真实 Desktop 数据库写入与刷新行为。
- PID 重用,以及自行脱离进程组的后代进程。
- Windows 树采样后新增的后代,以及采样与发信号之间的身份变化;已运行的真实 Windows 树清理回归不能覆盖这些窗口。
- 旧不可读取 owner 与崩溃遗留 reclaim guard 的安全恢复;没有按年龄清除旧锁。
- 长会话真实 provider/报告一次合格率。调度已减少同次重复扫描,仍有随历史库增长的全量校验成本。

## 核对来源

Expand Down
16 changes: 9 additions & 7 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,26 +45,27 @@ English readers start at [README.md](../README.md). This index is bilingual; the
|---|---|---|---|
| [README.md](../README.md) | en | 2026-10-05 | 未记录 |
| [README.zh-CN.md](../README.zh-CN.md) | zh | 2026-10-03 | 未记录 |
| [PROJECT_STATE.md](PROJECT_STATE.md) | zh | 2026-10-07 | 2026-10-07 |
| [ARCHITECTURE.md](ARCHITECTURE.md) | zh | 2026-10-03 | 未记录 |
| [INTERFACES.md](INTERFACES.md) | zh | 2026-10-06 | 未记录 |
| [PROJECT_STATE.md](PROJECT_STATE.md) | zh | 2026-10-08 | 2026-10-08,本地源码/回归 |
| [ARCHITECTURE.md](ARCHITECTURE.md) | zh | 2026-10-08 | 2026-10-08,本地源码/回归 |
| [INTERFACES.md](INTERFACES.md) | zh | 2026-10-08 | 2026-10-08,本地源码/回归 |
| [SHARED_CORE.md](SHARED_CORE.md) | zh | 2026-10-06 | 未记录 |
| [ZCODE_RUNTIME.md](ZCODE_RUNTIME.md) | zh | 2026-10-03 | 未记录 |
| [ZCODE_RUNTIME.md](ZCODE_RUNTIME.md) | zh | 2026-10-08 | 2026-10-08,本地配置/假运行时 |
| [plugins/codex-zcode-bridge/README.md](../plugins/codex-zcode-bridge/README.md) | zh | 2026-10-03 | 未记录 |
| [plugins/codex-zcode-bridge/SECURITY.md](../plugins/codex-zcode-bridge/SECURITY.md) | zh + en | 2026-10-03 | 未记录 |
| [plugins/codex-zcode-bridge/skills/zcode-bridge/SKILL.md](../plugins/codex-zcode-bridge/skills/zcode-bridge/SKILL.md) | zh | 2026-10-06 | 未记录 |
| [plugins/codex-zcode-bridge/skills/zcode-bridge/SKILL.md](../plugins/codex-zcode-bridge/skills/zcode-bridge/SKILL.md) | zh | 2026-10-08 | 2026-10-08,本地源码/合同 |

`最后核对` 表示上一次有人把文档内容与代码逐条对照的日期。这一列目前全部为空,说明此前没有这个习惯;新建和修改文档时必须填写,否则该文档只能算"最后更新",不能算"已验证"。
`最后核对` 表示上一次有人把文档内容与代码对照的日期及范围;标记为未记录的条目仍缺少核对证据。新建和修改文档时必须填写,否则该文档只能算"最后更新",不能算"已验证"。本地回归不代表真实 provider 或长期运行通过。

### 决策 DECISION

| 文档 | 日期 | 说明 |
|---|---|---|
| [decisions/README.md](decisions/README.md) | 2026-10-07 | 决策索引 |
| [decisions/README.md](decisions/README.md) | 2026-10-08 | 决策索引 |
| [ADR-001](decisions/ADR-001-appserver-as-production-execution-path.md) | 2026-10-07 | Accepted:生产执行路径使用 app-server |
| [ADR-002](decisions/ADR-002-manager-owns-task-lifecycle.md) | 2026-10-07 | Accepted:Manager 独占生命周期,worker 通过 attempt claim 入场 |
| [ADR-003](decisions/ADR-003-execution-directory-prepared-by-host.md) | 2026-10-07 | Accepted:执行目录由调用宿主准备 |
| [ADR-004](decisions/ADR-004-observation-is-not-control.md) | 2026-10-07 | Proposed:本地材料只作观察面,待 Master 决策 |
| [ADR-005](decisions/ADR-005-long-session-reliability.md) | 2026-10-08 | Accepted:长会话清理、锁释放、报告修复与 provider 兼容 |
| [decisions/roadmap-decisions-2026-09-27.md](decisions/roadmap-decisions-2026-09-27.md) | 2026-09-27 | 路线图与决策讨论 |
| [decisions/reliability-repair-plan-v2-2026-10-03.md](decisions/reliability-repair-plan-v2-2026-10-03.md) | 2026-10-03 | 可靠性修复计划,含未完成项 |

Expand Down Expand Up @@ -93,6 +94,7 @@ English readers start at [README.md](../README.md). This index is bilingual; the
| 文档 | 说明 |
|---|---|
| [TASK_FEEDBACK_V01_IMPLEMENTATION_REPORT.md](../TASK_FEEDBACK_V01_IMPLEMENTATION_REPORT.md) | Task Feedback v0.1 的交付报告,一次性材料 |
| [reports/2026-10-08-long-session-reliability.md](reports/2026-10-08-long-session-reliability.md) | 长会话故障证据、本地修复、验证与未运行边界 |

### 自动生成 Generated

Expand Down
6 changes: 6 additions & 0 deletions docs/ZCODE_RUNTIME.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
# ZCode 运行配置边界

> Status: AUTHORITATIVE
> Last updated: 2026-10-08
> Last verified: 2026-10-08,本地配置及模型选择回归;真实 provider 未复验。

当前生产路径是 `node zcode.cjs app-server --stdio`,不是历史 CLI `--prompt --json`。解析入口为 `NodeRuntimeResolver`,配置项与用户设置方法见仓库 README。

Bridge 只读取官方 builtin/personal provider 配置,不复制、不改写内容,也不将环境或凭据写入任务 metadata。personal 配置的 `config.providerConfigRules.providerRules` 必须为非空数组或对象;已知空 stub 被拒绝。结构验证不能证明 provider 可用或账号有权限。

请求模型时优先保留 catalog 中的精确 provider/model。无前缀旧 provider 只有在 catalog 存在同 model 的 account 前缀项,或官方规则确立了对应 account 映射时才解析;不按模型显示名切换其他 provider,catalog 缺席仍由 session/setModel 验证配置标识与模型。account: 标识不重复加前缀。请求值与 runtime 确认值分别保留,不持久化为工作区默认。见 ADR-005。

persisted runtime-config 中已知字段只能是字符串或 null;缺文件允许环境/发现回退,存在但损坏、非 object 或超过 64 KiB 会报配置错误。默认 mode 仍为已披露的 yolo;不能把坏配置当成首次未设置而回退到该模式。

执行和模型目录 RPC 客户端都是私有集成实现,当前假运行时测试覆盖调用选择、事件、交互和清理。真实协议随安装版本变化;此前会话的 capability 记录属于历史观察,本轮没有新建真实 session 进行版本认证。
26 changes: 26 additions & 0 deletions docs/decisions/ADR-005-long-session-reliability.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# ADR-005:长会话清理与报告修复

> Status: DECISION
> Decision: Accepted(用户于 2026-10-08 授权执行本次修复)
> Date: 2026-10-08

## Context

LumeCAE 长会话的持久化证据包含 Windows 清理失败、报告字段缺失、旧 provider ID 选择失败与恢复锁阻塞。历史失败不应通过改写真实任务记录消除;个别 worker_lost 与旧损坏锁的根因仍不确定。

## Decision

1. Windows 清理在终止前采集当前进程树及启动身份,终止后核验采集到的所有身份。taskkill 非零退出不能独自决定失败;只有已记录身份全部退出才确认清理。仍存活或 unknown 均保持失败与占用,探测表明根身份已退出或重用时不向该 PID 发信号。不按本地化错误文本判定成功。
2. 锁释放先将完整目录原子移出共享锁名,再尽力清理私有 retired 目录。活 owner、不可读取的旧 owner 不按年龄删除。恢复 promise 的清理必须在锁释放异常时也执行。
3. AgentReport 继续严格校验,不补造缺失的 needs_master_decision,不自动发送修复 turn。任务提示提供合法 JSON 示例;报告续作只提供既有报告证据和反馈,省去原实现任务,禁止编辑文件或重跑测试。
4. 模型选择优先保持 runtime catalog 中的精确 provider/model;仅在精确值缺席且对应 account 前缀值真实存在时解析无前缀旧 ID。不能只按 model_id 或显示名称选择其他 provider。
5. 心跳且缺少业务事件时不声称正在执行业务;固定反馈投影只读取相同 task/attempt/status 的结果,业务时间从 observation 的业务事件年龄取得,不使用 status 更新时间。历史 cleanup_failed 与后续清理验证作为两个事实保留。公开任务状态、MCP schema、隐私边界和依赖保持不变。
6. 大历史库回归确认调度重复全量校验。每次持有调度锁的 pump 只采集一次健康性与状态快照,复用于 running、损坏记录占用和 FIFO queued 集合;启动前仍重读 queued 状态。快照不跨操作缓存,不省略终态健康检查,不降低损坏任务或 cleanup_unverified 的占用保护。调度复杂度仍随历史任务数增长,不能宣称消除了长期扩展限制。

## Rationale

按身份和实际退出证据消除收尾竞态,比忽略 taskkill 错误更保守;原子撤销锁避免释放中崩溃留下缺 owner 的共享目录。严格报告校验和显式续作保留 Master 决策权。

## Consequences

Windows 清理增加有界的系统进程树查询,使用已有 PowerShell 系统设施,无新包依赖。采样之后新建或自行脱离的后代仍为未充分验证的边界。旧损坏锁需要独立诊断,不自动修复真实任务库。模型输出仍可能违反合同;本修复不保证所有报告一次合格。真实 provider、跨版本协议和长期无人值守回归需另行验证。
3 changes: 2 additions & 1 deletion docs/decisions/README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# 决策记录 / Decisions

> Status: AUTHORITATIVE(仅指本索引)
> Last updated: 2026-10-07
> Last updated: 2026-10-08

本目录保存已批准的架构决策和带日期的决策记录。决策回答"为什么这样定",当前实现仍以 `ARCHITECTURE.md` / `INTERFACES.md` 为准。

Expand All @@ -11,6 +11,7 @@
|---|---|---|
| [roadmap-decisions-2026-09-27.md](roadmap-decisions-2026-09-27.md) | DECISION | 2026-09-27 的路线图与决策讨论。仍然成立的结论需要提炼进 `ARCHITECTURE.md` / `INTERFACES.md`;本文本身不是当前事实来源。 |
| [reliability-repair-plan-v2-2026-10-03.md](reliability-repair-plan-v2-2026-10-03.md) | DECISION | Bridge 可靠性修复计划。A/B 主要改动已实现;C/D 与宿主启动核验仍有未完成项。 |
| [ADR-005](ADR-005-long-session-reliability.md) | Accepted | 长会话 Windows 清理验证、原子锁释放、报告续作与 catalog provider 兼容;历史记录保持不变。 |

## 待补的 ADR

Expand Down
Loading
Loading