58 KiB
ML-CODE-PI-001 实施票据与依赖图
0. 文档信息
| 字段 | 值 |
|---|---|
| 关联 Spec | ML-CODE-PI-001 |
| 状态 | 实施中;PI-000 Done with explicit waivers |
| Task | 20260822-pi-runtime-spec-b6e2c9a4 |
PI-000 实施基线 |
2bc423ebc58589307442ebdaf1c81d83ec9dc2d5(feat: qualify Pi runtime cutover foundation) |
| 目标 | 把完整硬切换拆成可验证、无循环依赖的执行图 |
| 当前 Ready Frontier | PI-010, PI-020, PI-030(PI-000 已 Done with explicit waivers) |
| Phase-0 macOS | Explicitly Waived / Deferred by user on 2026-08-22;不是 Pass,实际验收移至 PI-150 |
| 真实 Provider | QG-004/QG-005 Explicitly Waived / Accepted Risk by user on 2026-08-22;不是 Pass,也不再阻断 release |
本文中的“票据”是仓库内实施单元,不代表已经创建 GitHub Issue、分支、PR 或子智能体。后续执行者可以把票据同步到外部 issue tracker,但票据 ID、依赖和验收语义必须保持。
0.1 当前规划状态(2026-08-22)
| 字段 | 当前判断 |
|---|---|
PI-000 实施任务 |
20260822-pi-runtime-qualification-c52e8a14;commit 2bc423e;ready_for_integration |
PI-000 状态 |
Done with explicit waivers;不是全部 QG Pass |
| 规划 frontier | PI-010, PI-020, PI-030;其余票据继续按 31 条依赖边锁定 |
PI-010 交接 |
20260822-pi-conversation-contracts-a61d9c42;基线 2bc423e;当前 planning |
| 资格证据 | .project-docs/50-evidence/topics/20260822-pi-runtime-qualification-c52e8a14__pi-runtime-qualification.md |
已确认事实:
PI-000已作为 commit2bc423ebc58589307442ebdaf1c81d83ec9dc2d5提交;实施工作树干净,任务登记为ready_for_integration。PI-010已在该 commit 上建立独立工作树并进入planning;这不改变依赖已满足的 Ready Frontier 定义。- 精确候选 pin 为
@earendil-works/pi-coding-agent@0.84.2;上游 tagv0.84.2、npmgitHead与 commit 均为914cf1472e715297caa30db4b9535d534a9eb718。 - Windows x64 的 workspace、临时 production closure,以及独立受控 Electron
Builder
dir/app.asarprobe 均可通过ELECTRON_RUN_AS_NODE=1启动 Pi RPC。受控 artifact 使用MakelorePiProbe.exe和resources/app.asar/dist/cli.js,刻意不继承 Makelore 正式electron-builder.yml的 OpenCode/Python/UV/signing/install hooks,也没有 改动最终产品打包 wiring。 - 受控 artifact 可定位 Pi 0.84.2、CLI、130 个 Windows 适用 production
packages、9 个按平台跳过项和 6 个 runtime WASM/native assets;
.node位于app.asar.unpacked。Electron Builder 把同版本@types/retry@0.12.0从p-retrynested layout 扁平化到 rootnode_modules,属于可解析布局变化,不是依赖丢失。 - 受控 packaged artifact 的 5 cold / 5 warm 样本分别为:cold p50/p95/max 668/682/682 ms,warm 660/663/663 ms;10 个 RSS 样本 138404/141320/141320 KiB;exit 16/18/18 ms。session/reopen、 deterministic failure、local shell overlap、单侧 abort isolation、stdin close 均通过,结束后没有 artifact 或 Pi RPC 残留进程。
- packaged runtime 上的
127.0.0.1HTTP/SSE 合同 probe 已覆盖openai-completions、openai-responses、anthropic-messages、openrouter。 每种协议恰好产生 4 个 POST,验证 base URL/path、环境凭据 header、custom header、model、PNG image、双 worker 成功 settled、turn 重叠、单侧 abort 与另一侧成功以及 stdin-close;最终收紧重跑的重叠时间依次为 304/309/290/297 ms。 - Anthropic 配置使用 Provider root,由 SDK 追加
/v1/messages;OpenAI 风格 base URL 以/v1结尾,再追加chat/completions或responses。该差异应 进入后续 Provider catalog fixture,而不能对四种协议统一拼接路径。 - 最终 focused suite 为 9 tests;scoped ESLint、typecheck、
build:vite、git diff --check和 project-doc drift gate 已通过。 - Linux x64 在 WSL2 Ubuntu 24.04、kernel
6.6.87.2-microsoft-standard-WSL2中取得 workspace、staged production closure 与 controlled Electron Builderdir/app.asar三层证据。隔离快照以 Node 22.22.2 和仓库 pinpnpm@10.33.4frozen install,运行 seam 为 Electron 43.4.0 与 embedded Node 24.18.1。 - Linux workspace 5 cold / 5 warm:cold p50/p95/max 426/853/853 ms,warm 432/437/437 ms,RSS p95 170388 KiB,exit p95 8 ms。staged closure:cold 426/428/428 ms,warm 423/440/440 ms,RSS p95 175956 KiB,exit p95 8 ms。
- Linux controlled
dir/app.asar:cold 526/545/545 ms,warm 545/569/569 ms,RSS p95 181928 KiB,exit p95 7 ms;131 个 Linux 适用 package、8 个 platform skip、6 个 runtime asset 和 unpacked native assets 均无缺失,只有 与 Windows 相同的同版本@types/retry@0.12.0flattening。 - Linux packaged 四协议 loopback 每种恰好 4 个 POST,路径、鉴权头、自定义 header、model、PNG image、双 worker overlap、单侧 abort isolation 与清理 均通过;overlap 依次为 292/290/277/288 ms,结束后无 artifact/Pi RPC 残留进程。Linux 报告代码也已移除运行时仍硬编码“Linux missing”的字段, 改为 cross-platform aggregate requirement;7 tests、scoped ESLint、 typecheck 和 1-sample integration probe 通过。
- macOS 实跑前发现并修复一个真实 packaged-closure path defect:旧 inspector
在 artifact 内用
dirname(process.execPath)/resources推导资源目录;macOS executable 位于<app>/Contents/MacOS/MakelorePiProbe,旧逻辑会错误读取Contents/MacOS/resources/app.asar,实际路径是Contents/Resources/app.asar。 - 修复后由外层 platform-aware
packagedResourcesDirectory()只计算一次资源 目录,并通过PI_PROBE_RESOURCES_DIRECTORY传入 artifact process;closure inspector 不再二次推导。focused test 已覆盖 darwin executable →Contents/Resources。 - 修复后的 Windows controlled packaged actual regression 以 1 cold / 1 warm 样本通过,ready 为 650/641 ms;130 个适用 package、6 个 runtime asset 与 unpacked native asset 均无缺失,证明显式资源目录传递没有破坏 Windows。 这只验证修法和 Windows 回归,不是 macOS 运行证据。
未验证但由用户于 2026-08-22 明确接受、且不再阻断 PI-000 或 release 的风险:
- 四协议 loopback 只证明 Pi request serialization、SSE parsing、图片/header/ model/credential plumbing、worker 重叠与 abort 隔离。它没有发起外部请求或 产生费用,也不证明任何真实 Provider Account、认证、proxy、rate-limit 或 provider-specific response variance;四协议真实 endpoint/account/credential/ successful settled/concurrency/abort/reopen/image-where-supported 样本仍缺失。
- 用户明确接受真实认证/endpoint/proxy/rate-limit/provider-specific response
variation,base URL/header/environment credential/model/image 的真实协议兼容,
真实 provider 并发或串行/限流,以及跨 worker abort/event/session/model/
credential 隔离风险。
QG-004、QG-005因此标记为 Explicitly Waived / Accepted Risk,不是 Pass;所有资格/发布报告继续保留realTurnVerified: false。
用户明确豁免并延期的 Phase-0 项(不是 Pass,也不再阻断 PI-000):
- 用户于 2026-08-22 决定跳过
PI-000的 macOS 实跑。macOS x64 与 macOS arm64 标记为 Explicitly Waived / Deferred by user;workspace、staged production closure、controlled packaged seam、packaged loopback、资源和 metrics 全部移至PI-150。 - darwin 资源路径 preflight defect 已修并有静态测试,但两个架构都尚未实际 运行,所以不得标记 macOS Pass。延后可能使 packaging/native/resource/ performance defect 到 release stage 才暴露并造成返工;这是用户接受的风险, 不是已消除风险。
范围限定和后续约束:
- 当前 Linux 证据来自真实 Ubuntu 24.04 x64 用户空间、Linux executable/native
selection、asar layout 和 process seam,但 kernel 为 WSL2 且 artifact 是
controlled Builder
dir。正式 Spec 的QG-002只明确要求 Linux packaged app,没有额外要求 non-WSL kernel、native compositor、AppImage 或 deb, 因此这些不是新增的PI-000blocker;若它们属于最终发行格式,仍必须在PI-150以实际 release artifact 验收。 - 已发布包的 shrinkwrap 是 production-only,但 package root 仍列出 10 个
devDependencies;npm 11 的直接
ci --omit=dev会在 omit 前因不同步失败。 当前资格 probe 只在临时副本移除该字段后复用原 shrinkwrap。PI-030必须把永久 staging 处理定义为显式、可复现的实现与验收项,不能把临时 workaround 当成最终打包已通过。 PI-150的 macOS handoff 要求 x64/arm64 各使用独立 checkout、对应架构 Node/Electron download 与 frozen install,依次运行 workspace 5+5、staged 5+5、controlled packaged 5+5、packaged loopback、closure/native/resource 检查和 metrics,再验证最终目标 artifact;不得跨架构复用node_modules或 artifact。PI-000waiver 不得在PI-150被当作证据。- 当前执行环境没有仓库 CI definition、macOS runner/SSH host、GitLab runner
CLI 或 Provider credential environment variable。internal GitLab remote 只能
提供源码远端,不能生成真实 Provider 证据,也不能提前补齐
PI-150延期的 macOS 证据;前者已由用户接受为非阻断风险,后者仍将在 release stage 阻断PI-150。
当前 QG 状态(编号严格以 ML-CODE-PI-001 第 8.1 节为准;实施证据中的
task-local 状态表不是规范编号来源):
| Gate | 状态 | 规划解释 |
|---|---|---|
QG-001 |
Pass | 精确 identity、pin、engine、CLI 已确认 |
QG-002 |
Pass | 修订后的 Phase-0 平台范围为 Windows x64 + Linux x64;两者 packaged qualification artifact 的 spawn/RPC/session/prompt/abort/settle/reopen/exit 已通过。macOS x64/arm64 Explicitly Waived / Deferred,不是 Pass |
QG-003 |
Pass | 修订后的 Phase-0 平台范围内,Windows/Linux controlled qualification artifact 的完整适用 package、WASM/native asset 可解析;最终产品 artifact 与 macOS 实跑留在 PI-150 |
QG-004 |
Explicitly Waived / Accepted Risk | 不是 Pass。Windows/Linux packaged 四协议 loopback 合同通过且 realTurnVerified=false;真实 Account/auth/endpoint/proxy/rate-limit/response variance 与真实 base URL/header/environment credential/model/image 兼容未验证,由用户接受风险 |
QG-005 |
Explicitly Waived / Accepted Risk | 不是 Pass。provider-shaped loopback two-worker overlap/单侧 abort 通过;真实 provider 并发或串行/限流及跨 worker abort/event/session/model/credential 隔离未验证,由用户接受风险 |
QG-006 |
Pass | 修订后的 Phase-0 平台范围内,Windows/Linux cold/warm/RSS/exit 的 p50/p95/max 与样本数已报告;macOS metrics Explicitly Waived / Deferred 到 PI-150,不是 Pass |
QG-007 |
Pending / 未触发 | 尚无已确认失败;只有未豁免的 packaging/provider-shaped contract/concurrency/abort/预算门确认失败才触发 utility-process SDK 修订。用户 waiver 不是失败 |
规划判断:逐项审计 PI-000 Required work、Acceptance 与 Stop condition 后,
所有未豁免要求均已有证据且没有已确认失败。macOS Phase-0 明确 deferred 到
PI-150;QG-004/QG-005 明确 Accepted Risk;两类均不是 Pass。QG-007
保持 Pending / not triggered。因此 PI-000 标记为 Done with explicit
waivers。按未修改的 DAG 重新计算,精确新 Ready Frontier 是 PI-010、
PI-020、PI-030。真实外部 Provider 不再是 PI-000/PI-150/release
blocker;macOS x64/arm64 在 PI-150 仍是不可豁免的 release blocker。若未来
任何未豁免的 packaging、provider-shaped contract/concurrency/abort 或预算门
出现确认失败,继续按 Stop condition 修订为 SDK-in-Electron-utility-process;
仍禁止 OpenCode fallback 或 RPC/SDK 双生产路径。
1. 执行规则
- 所有产品代码票据属于同一个 OpenCode → Pi 硬切换 release unit。中间提交可以存在新旧源码,但任何部分不得以双 runtime 形式发布。
PI-000是阻断式资格门;当前已 Done with explicit waivers。任何历史或未来执行中,它未完成前仍不得开始会制造迁移成本的产品实现;本图将所有实施票据显式依赖它。- 只有依赖全部
Done的票据才进入 Ready Frontier。依赖不满足时,不得以“先写一点”绕过。 - 每张票据只拥有其“主要文件/责任区”。共享文件必须由依赖更靠前的票据定义合同,后续票据按合同消费;需要改变合同必须先更新上游测试和关联 Spec。
- 一张票据只有在自身 acceptance 和 verification 全部通过后才能标
Done。仅编译、仅单测、仅人工体验均不充分。 PI-000~PI-150构成一个实施分支/PR 的完整代码范围;不得把未删除 OpenCode 的中间状态合入 release。PI-160是终端 Integration/Release Gate。它在实现 PR 完成后执行最终审阅、集成、canonical promotion 和发布阻断检查。- 本票据图不要求任何特定协作方式。当前文档任务按用户要求不创建子智能体;未来执行也必须遵守当时用户和仓库并发所有权规则。
2. 依赖图
flowchart TD
P000[PI-000 Runtime qualification gate]
P010[PI-010 Conversation contracts & reducer]
P020[PI-020 Schema v2 & migration]
P030[PI-030 Pi process/RPC foundation]
P040[PI-040 Provider & managed resources]
P050[PI-050 Worker pool & session registry]
P060[PI-060 Event projector & hydration]
P070[PI-070 Extension host, interactions & lease]
P080[PI-080 Subagent scheduler]
P090[PI-090 Product tools & change tracker]
P100[PI-100 Core /api/coding Host API]
P105[PI-105 Files/changes/skills Host API]
P110[PI-110 Renderer protocol store]
P120[PI-120 Core Chat & first-Conversation UX]
P130[PI-130 Feature-complete Coding UI]
P140[PI-140 OpenCode removal & cutover migration]
P150[PI-150 Packaging, E2E & performance release proof]
P160[PI-160 Integration and release gate]
P000 --> P010
P000 --> P020
P000 --> P030
P020 --> P040
P030 --> P040
P010 --> P050
P020 --> P050
P030 --> P050
P040 --> P050
P010 --> P060
P050 --> P060
P060 --> P070
P040 --> P070
P070 --> P080
P070 --> P090
P020 --> P090
P020 --> P100
P060 --> P100
P070 --> P100
P020 --> P105
P090 --> P105
P010 --> P110
P100 --> P110
P110 --> P120
P080 --> P130
P090 --> P130
P105 --> P130
P120 --> P130
P130 --> P140
P140 --> P150
P150 --> P160
3. 票据总览
| ID | 标题 | Depends on | 主要责任区 | 完成后解锁 |
|---|---|---|---|---|
PI-000 |
Runtime qualification gate | — | 精确版本、packaged probe、Provider/并发/RSS 证据 | 010, 020, 030 |
PI-010 |
Conversation contracts & reducer | 000 |
shared contracts、fixtures、in-memory runtime | 050, 060, 110 |
PI-020 |
Schema v2 & migration | 000 |
coding-projects、project/conversation schema、backup |
040, 050, 090, 100, 105 |
PI-030 |
Pi process/RPC foundation | 000 |
bundler、worker process、LF framer、RPC client | 040, 050 |
PI-040 |
Provider & managed resources | 020, 030 |
provider catalog、secret、prompt/skill/resource loader | 050, 070 |
PI-050 |
Worker pool & session registry | 010, 020, 030, 040 |
runtime、pool、registry、lifecycle、telemetry base | 060 |
PI-060 |
Event projector & hydration | 010, 050 |
live assembly、active leaf、snapshot/reconcile/recover | 070, 100 |
PI-070 |
Extension host, interactions & lease | 040, 060 |
managed extension bridge、ask_user、write lease | 080, 090, 100 |
PI-080 |
Subagent scheduler | 070 |
subagent.v1、child process、caps、abort |
130 |
PI-090 |
Product tools & change tracker | 020, 070 |
browser/game/task/changed-file/skills、change tracker | 105, 130 |
PI-100 |
Core /api/coding Host API |
020, 060, 070 |
project/conversation routes、SSE、interactions | 110 |
PI-105 |
Files/changes/skills Host API | 020, 090 |
file/search/change/skill routes | 130 |
PI-110 |
Renderer protocol store | 010, 100 |
typed facade、per-Conversation store、snapshot/patch | 120 |
PI-120 |
Core Chat & first-Conversation UX | 110 |
Composer、timeline、optimistic prompt、render batching | 130 |
PI-130 |
Feature-complete Coding UI | 080, 090, 105, 120 |
model/thinking/queue/compaction/interactions/subagents/changes | 140 |
PI-140 |
OpenCode removal & cutover migration | 130 |
删除旧 runtime/routes/deps/UI/tests/resources、migration notice | 150 |
PI-150 |
Packaging, E2E & performance proof | 140 |
artifact、real smoke、full E2E、Windows/Linux/macOS x64+arm64、perf report | 160 |
PI-160 |
Integration and release gate | 150 |
final review、zero residue、canonical docs、release decision | Release |
4. Ready Frontier 演进
下面是依赖完成后的预期 frontier,不是必须串行执行的阶段清单:
| 条件 | 新 Ready Frontier |
|---|---|
初始,以及 PI-000 完成前 |
PI-000(唯一 frontier;未 Done,无下游解锁) |
2026-08-22 PI-000 Done with explicit waivers |
PI-010, PI-020, PI-030 |
PI-020 + PI-030 Done |
PI-040(同时等待中的 PI-010 可继续) |
PI-010 + PI-020 + PI-030 + PI-040 Done |
PI-050 |
PI-050 Done |
PI-060 |
PI-060 Done |
PI-070;PI-100 仍等 PI-070 |
PI-070 Done |
PI-080, PI-090, PI-100 |
PI-090 Done |
PI-105 |
PI-100 Done |
PI-110 |
PI-110 Done |
PI-120 |
PI-080 + PI-090 + PI-105 + PI-120 Done |
PI-130 |
PI-130 Done |
PI-140 |
PI-140 Done |
PI-150 |
PI-150 Done |
PI-160 |
5. 票据详情
PI-000 — Runtime qualification gate
Objective
在写业务迁移前,证明选定 Pi 版本能在 Makelore qualification 打包边界中满足 runtime、四协议 packaged loopback/provider-shaped 并发、资源和退出要求;对明确未验证的真实外部 Provider 风险作出显式人类决定,确认失败时尽早终止错误架构。
Dependencies
- None。
Current planning status
- Done with explicit waivers;实施任务为
20260822-pi-runtime-qualification-c52e8a14。这不是全部 QG Pass。 - Windows x64 与 WSL2 Linux x64 的 workspace/staged/controlled packaged RPC、 session、process、closure、loopback 四协议合同与预算证据通过;受控 artifact 不是最终 bundler 或 release installer。
- 用户于 2026-08-22 将 macOS x64/arm64 明确标记为 Explicitly Waived /
Deferred for
PI-000。packaged resource path defect 已修并通过 focused path test 与 Windows actual regression,但 macOS 没有实跑、不是 Pass;workspace/ staged/controlled packaged/loopback/metrics 全部移交PI-150。 - 用户于 2026-08-22 明确接受四协议真实 Provider Account/兼容与真实双 worker
并发/隔离风险,
QG-004、QG-005为 Explicitly Waived / Accepted Risk, 不是 Pass。loopback 不得被归类为 Provider Account qualification,报告保持realTurnVerified=false。 - Linux 最终 release artifact 与 macOS 全套实跑属于
PI-150;macOS 仍是 release blocker。当前PI-000无剩余 Phase-0 blocker,已解锁PI-010、PI-020、PI-030。
Owns
- 精确 Pi version/tag/commit 决策。
- 最小 package pin 与 lockfile 变更。
- 最小
scripts/probe-pi-runtime.*、临时/受控 packaged probe、结果报告。 - 资格证据,不拥有最终 Chat、Host route 或迁移实现。
Required work
- 复核候选
@earendil-works/pi-coding-agent@0.84.2;锁定确切 package version、CLI entry、Node engine、RPC/session docs 对应 tag/commit。 - 以 Electron Node 在 Phase-0 平台范围 Windows x64、Linux x64 的 unpackaged 与 packaged qualification seam 启动 RPC。
- 验证
get_state、persistent session create/open、prompt accepted、abort、agent_settled、reopen、clean shutdown。 - 从 frozen dependency graph stage Windows x64、Linux x64 的最小完整 production closure,验证 packaged qualification artifact 的 WASM/native/optional resources;最终产品 artifact 留给
PI-150。 - 用 Windows/Linux packaged loopback 覆盖所有受支持协议的 base URL/path、headers、environment credential plumbing、模型、图片 request/SSE 合同;记录真实外部 Provider Account 验证已 Explicitly Waived / Accepted Risk,
realTurnVerified=false。 - 两个独立 worker 同时运行 provider-shaped loopback turn,证明受控时间窗口重叠、单侧 abort 与另一侧 settled;记录真实 provider 并发/串行/限流及跨 worker abort/event/session/model/credential 隔离为 Accepted Risk。
- 在 Windows x64、Linux x64 运行 cold/warm/RSS/exit samples,报告 p50/p95/max、样本数、平台和 artifact 状态。
- 明确
AGENTS.md/context、offline、trust、resource discovery、shell 的锁定版本行为。
macOS x64/arm64 在本票据中 Explicitly Waived / Deferred by user on
2026-08-22;这不是平台通过证据。对应 workspace/staged/controlled packaged/
loopback/metrics 工作由 PI-150 接管。
Closure audit(2026-08-22)
| Required work | 审计状态 | 依据 |
|---|---|---|
| 1. identity/pin/engine/entry | Pass | Pi 0.84.2、tag/commit、CLI、Electron Node engine 与 frozen lockfile 已确认 |
| 2. platform process seam | Pass + explicit macOS deferral | Windows x64 与 Linux x64 workspace/staged/controlled packaged 已通过;macOS x64/arm64 不是 Pass,转 PI-150 |
| 3. session/RPC lifecycle | Pass | get_state、create/open、prompt accepted、abort、settled、reopen、clean shutdown 已通过 |
| 4. production closure/assets | Pass | Windows/Linux 适用 packages、WASM/native/optional assets 在 qualification artifact 可解析;最终 artifact 留 PI-150 |
| 5. protocol compatibility | Explicitly Waived / Accepted Risk;替代 smoke Pass | 四协议 packaged loopback 的 base URL/path/header/environment credential plumbing/model/image request/SSE 已通过;真实外部 Provider 未验证且 realTurnVerified=false |
| 6. two-worker concurrency/isolation | Explicitly Waived / Accepted Risk;替代 smoke Pass | provider-shaped two-worker overlap、单侧 abort、另一侧 settled 与受控路由已通过;真实 provider 行为未验证 |
| 7. latency/RSS/exit budgets | Pass | Windows/Linux cold/warm/RSS/exit 样本与 p50/p95/max 已记录并满足预算 |
| 8. context/offline/trust/resources/shell | Pass | 锁定版本以 explicit no-discovery/no-context/no-approve/offline flags 运行,shell 与 abort 行为已验证 |
审计未发现除上述两类显式 waiver 外的未完成 Required work。Acceptance 的
非豁免证据均成立,Stop condition 没有已确认失败,因此 QG-007 不触发。
Acceptance
- Spec
QG-001、QG-002、QG-003、QG-006在修订后的 Phase-0 平台范围内有可重复证据;QG-004、QG-005有明确人类 waiver、完整风险记录和不可误标 Pass 的证据状态。 - cold
rpc.readyp95 ≤ 3,000 ms;warm p95 ≤ 1,500 ms;10 秒 operational deadline 内确定性失败。 - 两 worker packaged provider-shaped loopback turn 重叠;一个 worker abort/crash 不改变另一个受控状态。真实外部 Provider turn 不属于 hard gate。
- 完整 dependency closure 从 Windows/Linux packaged qualification artifact resolve,退出无遗留 Pi child;最终产品 artifact closure 属于
PI-150。 - Packaged loopback matrix 覆盖当前实际支持的每种协议类型;真实外部 Account 兼容保持
realTurnVerified=false和 Accepted Risk,不 silently fallback 或伪报 Pass。 - 精确 pin,不使用
^/~。 - macOS waiver 只允许
PI-000不等待该平台,既不构成 macOS Pass,也不满足PI-150的 cross-platform acceptance。 QG-004/QG-005waiver 只移除真实外部 Provider hard gate;Windows/Linux 及最终 artifact 的 packaged loopback/provider-shaped overlap/abort smoke 仍必须通过。
Stop condition
若修订后 Phase-0 范围内未豁免的 packaging、provider-shaped contract/concurrency/abort 或预算不通过:本票据保持或重新进入 Blocked,停止后续实现。只能通过修订 Spec/ADR 选择“Pi SDK in Electron utility process”后重新验收;不得引入 OpenCode fallback 或 RPC/SDK 双生产路径。缺少已豁免的真实外部 Provider 样本不是失败,不触发 QG-007。延期的 macOS 验证若在 PI-150 失败,则必须阻断 release 并返工或修订架构,不得以本 waiver 放行。
Verification
- Probe command 和结果可以在干净安装依赖后重跑。
- artifact dependency resolve verifier。
- 两 worker packaged provider-shaped loopback overlap/abort smoke;结果明确
realTurnVerified=false。 - process-tree clean-exit 检查。
PI-010 — Conversation contracts and reducer
Objective
先固化 vendor-neutral Conversation 领域协议,使 Main、Renderer 和测试不再围绕 OpenCode/Pi wire 结构耦合。
Dependencies
PI-000。
Owns
electron/coding-runtime/contracts.ts或 shared 等价位置。ConversationSnapshot、ConversationPatchEnvelope、node/run/queue/context/interaction/model/error DTO。- 统一 normalization reducer。
InMemoryConversationRuntime。- 锁定 Pi 版本的 wire fixture → product fixture 边界定义。
Required work
- 实现 Spec 第 5、10 节全部公开类型,公共 export 不导入 Pi/OpenCode。
- reducer 支持 snapshot replace、严格 generation/seq、gap invalidation、message/block/tool/queue/interaction/compaction/subagent/context ops。
- UI ID 与 durable source ID 分离;optimistic user node 通过
clientRequestIdreconcile。 - 用同一个 reducer 处理 live fixture 和 hydrated fixture。
- 实现 in-memory runtime,供 Renderer/Host product tests 使用。
- 明确 unknown op/schema 的 fail-closed 行为。
Acceptance
- 混合 text/thinking/tool、parallel tools、tool error、retry、compaction willRetry、queue、interaction、subagent、unknown custom fixture 全通过。
- seq gap 只 invalidates 目标 Conversation;旧 generation patch 被丢弃。
toolResult不成为 message;cumulative tool output 不重复。agent_endfixture 不产生 idle;agent_settled才产生 idle。- Renderer contract test 没有任何 Pi/OpenCode import。
Verification
- Focused contract/reducer unit tests。
- Type-level no-vendor import check 或 scoped
rgassertion。 - Snapshot → patches → snapshot equivalence fixture。
PI-020 — Project and Conversation schema v2 migration
Objective
把项目/伙伴/Conversation 产品数据从 OpenCode runtime identity 中解耦,并保证一次性迁移可回退、不会误删用户数据。
Dependencies
PI-000。
Owns
electron/coding-projects/project-config.ts。project-store.ts、conversation-store.ts、migration/backup helpers。- schema v2 types/tests。
- 项目、伙伴、空 Conversation 的 local-only create flow。
Required work
- 定义 project schema v2
ProductModelRef和 model unresolved 状态。 - 定义 Conversation schema v2、产品 UUID、optional Pi binding、opaque sessionKey。
- 实现 schema v1 backup → model mapping → v2 atomic write。
- 无唯一 model mapping 时保留 Agent,标记用户选择;禁止默认模型。
- v1 Conversation metadata 备份后初始化空 v2,不将旧 OpenCode Session 放入 sidebar。
- 只清理已证明未修改的 generated
.opencode/agent;uncertain/modified 移到 backup。 - project/partner/Conversation create 不调用 runtime。
Acceptance
- stable Agent ID/name/prompt/skills/archive 完整保持。
- 无 backup 时绝不覆写 v1;任意写失败保留可重试原状态。
sessionKeypath traversal/absolute path 被拒绝。- 两个并发首发只建立一个 Pi session binding(通过 store single-flight contract fixture;实际 runtime 在后续票据接入)。
- 旧 Conversation 不显示;一次性 notice 状态可被 UI 后续消费。
- userData/opencode 和不确定
.opencode内容未被递归删除。 - 项目、伙伴、Conversation metadata 性能可单独测量,且无 child process。
Verification
- Migration table tests:unique/unresolved/no-account/corrupt write/retry/modified Agent file。
- Atomic persistence tests。
- Local-create integration test with spawn spy = 0。
PI-030 — Pi process and RPC foundation
Objective
提供可打包、可测试、可恢复的 Pi child process/RPC 底座,不掺入项目 CRUD 或 Renderer 逻辑。
Dependencies
PI-000。
Owns
electron/coding-runtime/pi/worker-process.ts。rpc-framer.ts、rpc-client.ts、process errors。- 初版
scripts/bundle-pi-runtime.mjs与 runtime manifest。 - programmable fake Pi child test fixture。
Required work
- Electron Node +
ELECTRON_RUN_AS_NODE=1启动锁定 Pi entry。 - 显式 offline/no-approve/no-auto-resource 参数;stdout RPC only、stderr log only。
- 自有 strict LF framer,支持 chunk 边界和 U+2028/U+2029。
- command ID correlation、out-of-order response、event dispatch、timeout/AbortSignal。
- malformed/oversized stdout、unexpected exit、stderr sanitizer、backpressure。
- process graceful shutdown 3 秒 + forced kill,确保整个 child tree 清理。
- stage 完整 production closure 与 manifest。
- 为已发布 Pi package 的 production-only shrinkwrap 与 root 10 个
devDependencies 不同步选择并测试一个显式、可复现的永久 staging 机制;
不把
PI-000临时副本处理或受控 Electron Builder probe 直接当成最终 bundler。artifact verifier 按可解析 package/version/asset 验证 closure, 不把 Electron Builder 的同版本依赖扁平化误判为缺失。
Acceptance
- Spec
RPC-001~RPC-005全部通过。 - stdout 任意非 JSONL 导致目标 worker protocol error,不污染其他 worker。
- pending command 在 exit/abort/generation invalidation 时全部 settle,无 promise leak。
- prompt 类 command timeout 不自动重发。
- fake child 可脚本化输出 response/event/crash/partial line/large line,供后续 Main integration 使用。
- bundler 在 frozen install 上确定性生成相同 manifest 内容(不要求额外 checksum 文件)。
- 永久 staging 能在 npm 11 下从发布 package/shrinkwrap 可重复生成 production
closure,且测试覆盖 root devDependencies 不同步与同版本 nested-to-root
flattening;不依赖开发机已有
node_modules或受控 probe 的临时目录。
Verification
- Focused process/RPC unit tests。
- Real Pi
get_stateprotocol smoke。 - Packaged entry load/exit smoke。
PI-040 — Provider and managed resources
Objective
把当前 Provider Account、Works gateway、credential、伙伴 prompt 和 skills 映射为锁定 Pi 版本的受管输入,同时保持 Main-owned secret/trust 边界。
Dependencies
PI-020。PI-030。
Owns
electron/coding-runtime/pi/provider-config.ts。resource-loader.ts、prompt/Agent manifest cache。resources/coding-skills与 registry 映射。- Provider revision/staleness contract。
Required work
- 实现
PiProviderDescriptor和 account → runtime catalog 投影。 - 迁移 Works
/v1、proxy token、custom header/base URL 语义。 - credential 只通过 worker environment/受管 provider 注入,完整日志脱敏。
- account refresh single-flight;认证恢复最多一次。
- provider/resource revision:idle stale 下次 prompt 前重建,running settled 后重建。
- 生成受管伙伴 prompt/Agent manifest,不生成
.pi/agents。 - 移动内建 skills 到 vendor-neutral resources,仅显式传 selected paths。
Acceptance
- 当前支持的每种 Provider Account/协议配置 fixture 都能构建有效 catalog,并通过
packaged provider-shaped loopback 完成 prompt/settled;真实外部 Provider prompt
保持可选、非阻断,未取得证据时
realTurnVerified=false。 - 两个同 vendor account 的 runtime ID 不冲突。
- model/image capability 校验准确;不可用模型原子失败。
- token/header/prompt 内容不出现在 argv、snapshot、SSE、Renderer、diagnostics 或 test snapshot。
- 项目/用户
.piresources 不被自动加载。 - provider revision 不打断 running run;settled 后才重建。
Verification
- Provider catalog fixtures。
- Secret-redaction tests over argv/env-safe projection/stderr/API DTO。
- Resource discovery negative tests。
- Packaged provider-shaped loopback smoke from qualification matrix;可选 real account smoke 只能作为非阻断诊断,不得把 waiver 改写为 Pass。
PI-050 — Worker pool and session registry
Objective
实现一 Conversation 一 worker 的真实并发、session 持久绑定、资源调度和生命周期隔离。
Dependencies
PI-010。PI-020。PI-030。PI-040。
Owns
electron/coding-runtime/pi/runtime.ts。worker-pool.ts、session registry、permit queue、idle LRU。- prepare/prompt/queue/abort/model/thinking/compact/fork/dispose lifecycle orchestration。
- telemetry base/span correlation。
Required work
- per-Conversation
preparesingle-flight 和 lazy session open/create。 - worker state machine、generation、pending commands/interactions/children references。
- top-level running cap 4、warm idle cap 4、total process soft cap integration。
- running 不 eviction,idle LRU,app quit shutdown。
- prompt/steer/follow-up acceptance,不等待 settle。
- abort/model/thinking/compact/fork/recover/dispose 目标隔离。
- Provider/resource stale 在安全边界重建。
worker.queue_wait/spawn/rpc.ready/session.open/resources.ready/prompt.acceptedtelemetry。
Acceptance
- 一 worker 永不并行承载两个 Conversation。
- 第 5 个 top-level run 进入自己的 queue;前四个 settled 后按公平顺序继续。
- running worker 不被 LRU kill;idle 超限准确 eviction/reopen。
- crash generation 清理 pending RPC/permit/interaction/child reference,并不影响其他 worker。
- prompt HTTP/RPC acceptance 与 run completion 分离。
- model/thinking 只改变目标 Conversation;不可用模型不改变旧状态。
- app quit 3 秒后无遗留 parent worker。
Verification
- Worker-pool focused tests:single-flight、caps、fair queue、LRU、crash、quit、stale revision。
- Two-worker fake + packaged provider-shaped loopback concurrent run integration;真实外部 Provider 非阻断且不得写成已验证。
- Process-tree cleanup test。
PI-060 — Event projector, hydration, and recovery
Objective
把 Pi live RPC 和 persisted session tree 正确投影为 Makelore Snapshot/Patch,解决 streaming identity、active branch、settled reconciliation 和恢复。
Dependencies
PI-010。PI-050。
Owns
event-projector.ts。session-projector.ts。- attachment projection hooks。
- snapshot creation、durable reconcile、recover orchestration integration。
Required work
- 按
contentIndex组装 text/thinking/toolcall;message_end权威替换。 - cumulative
partialResultreplace;toolResultattach tool card。 - run/turn/retry/compaction/queue/interaction/usage/context 映射。
agent_endcheckpoint、agent_settledidle。- entries + leafId + parentId active path hydration;废弃分支排除。
- live UI ID 与 durable entry ID reconcile。
- generation/seq envelope、gap invalidation、snapshot rebuild。
- unknown/custom bounded diagnostics、large image attachment ref。
- recover:旧 generation close、资源清理、reopen、hydrate、新 snapshot。
Acceptance
- Spec 第 10、11、18 节 event/session/failure 规则全部有 fixture。
- live run 完成后的 Snapshot 与从 session 冷 hydrate 的 Snapshot 等价。
- compaction
willRetry不 idle;queue continuation 不提前释放 permit。 - abandoned branch 永不进入 active timeline。
- tool partial output 不重复;camel-case
toolResult不变 assistant。 - SSE gap/recover 只替换目标 Conversation。
- unreadable session 保留原文件并进入 recoverable error,不自动截断。
Verification
- Projector/session unit fixtures from exact Pi version。
- Fake Pi end-to-end run → settle → reopen comparison。
- Small real Pi drift smoke。
PI-070 — Managed extension host, interactions, and write lease
Objective
建立唯一受管 extension entry、最小 child→Main seam、用户 interaction 和同项目 mutation lease。
Dependencies
PI-040。PI-060。
Owns
extensions/makelore-runtime.ts。- extension internal endpoint/IPC bridge 与 worker token registry。
interaction.ts、write-lease.ts。- interaction Host-side store and projector integration。
Required work
- 只显式加载一个 versioned extension bundle。
- 每 worker loopback/IPC token,dispose/recover 后失效。
- 验证 conversationId/generation/runId 与 worker registry。
ask_userselect/confirm/input/editor;notify/status/widget/title/editor-text 安全投影。- 同项目 mutation write lease、可取消等待、所有终态释放。
- worker crash/abort 清理 interaction/lease。
- unknown UI/widget/details 只诊断,不 raw dump。
Acceptance
- 项目/用户第三方 Pi extension 不会被加载。
- 伪造旧 generation/token 的 request 被拒绝且不影响当前 worker。
- interaction response 严格按 ID;crash/abort 后全部 cancelled。
- 同项目 mutation 串行;不同项目并行;read-only 不等待 lease。
- complete/error/abort/timeout/crash 全部释放 lease,无永久占用。
- Textarea draft revision 已变化时
set_editor_text不覆盖。
Verification
- Extension integration tests through real bridge, not direct function-only mocks。
- Lease concurrency/cancellation matrix。
- Interaction lifecycle and stale-token tests。
PI-080 — Subagent scheduler and nested protocol
Objective
用 Makelore-owned subagent.v1 实现多 child Pi 调度,不依赖官方示例的非稳定 GUI details。
Dependencies
PI-070。
Owns
extensions/subagent.ts。- child process supervisor、global semaphore、parent-child registry。
subagent.v1schema/projector fixtures。
Required work
single、parallel、chaindispatch validation;单次最多 8 tasks。- 每 child 独立 Pi process/context,使用受管 Agent manifest/model/tool profile。
- 全应用最多 4 running child,和 parent process 组成 soft cap 8。
- read-only/coding tool profile;coding child 接入 write lease。
- parent abort/crash 传播 child;child exit 清理 permit。
- parallel 保留其他完成结果;chain 首失败停止并标 skipped。
- nested progress/details 只输出
subagent.v1。
Acceptance
- 1、4、8 tasks 的 single/parallel/chain fixture 正确;第 9 个 schema validation 拒绝。
- 两个 parent 争用全局 child semaphore 时总 running child ≤ 4。
- parent abort 后无 child orphan;permit 全释放。
- 一个 parallel child failure 不删除其他 summary/usage;chain 后续标 skipped。
- unknown schema/version 不崩 UI、不 dump raw JSON。
- 同项目 coding child 与 parent mutation 遵守同一 lease。
Verification
- Fake child scheduler integration tests。
- One real subagent child packaged smoke。
- Process-tree and semaphore leak check。
PI-090 — Product tools and Conversation change tracker
Objective
迁移 Makelore 真实使用的 browser、game asset、task/changed-file 和 skill 能力,并以 Main-owned tracker 替代 OpenCode Session diff。
Dependencies
PI-020。PI-070。
Owns
extensions/agent-browser.ts、game-assets.ts、task-state.ts、changed-file.ts。electron/coding-projects/skill-registry.ts。conversation-change-tracker.ts。- Main browser/attachment integration at the existing seam。
Required work
agent_browserextension 直连现有 Main browser service;删除对 MCP 的运行时依赖。- 迁移现有 game asset browse/review 产品语义,不复制 OpenCode plugin API。
task_state使用版本化 typed details;不暴露旧 todos endpoint。changed_file上报 relative touched paths。- run start 记录 git head/status baseline;settled 后刷新 status/diff,bash 触发 project-level refresh。
- 只读 changed path diff;untracked 有界 preview;无 per-file hash/checkpoint。
- selected skills registry 与 command catalog 安全投影。
Acceptance
- browser tool 不启动
@playwright/mcp/MCP child,screenshot 使用 attachment ID。 - game asset/product tool 有 real/fake integration coverage。
- changes panel 数据不来自 Pi message 文本猜测。
- write/edit touched path 精准刷新;bash 后能发现未上报改动。
- untracked preview 有界且无绝对路径。
- fork UI 不暗示文件回滚。
- 没有为 diff 增加 hash/checkpoint framework。
Verification
- Browser/game tool packaged smoke。
- Git/no-git/dirty/untracked/bash change tracker tests。
- Skill command and explicit-path tests。
PI-100 — Core /api/coding Host API
Objective
用产品域 Host API 连接 project/conversation service、runtime Snapshot/Patch 和 interactions,完全移除 Renderer 对 OpenCode route contract 的依赖。
Dependencies
PI-020。PI-060。PI-070。
Owns
electron/api/routes/coding-projects.ts。electron/api/routes/coding-conversations.ts。/api/coding/eventsSSE。- interactions route、runtime diagnostics 安全投影。
- Renderer typed facade 的 Main contract half。
Required work
- 实现 Spec 第 12.1 节除 files/skills/changes 外的核心 routes。
- prompt/steer/follow-up 返回 HTTP 202 acceptance;不等待 settle。
clientRequestIdbounded dedupe 与 uncertain request 行为。- SSE envelope、per-Conversation seq/generation、snapshot-first reconnect。
- request validation、conversation/project ownership、sanitized errors。
- diagnostics 只给 worker state/revision/stage summary,无 secret/absolute session path。
- interactions list/respond ID correlation。
Acceptance
- Renderer-facing core route 中不出现
/api/opencode或 Pi wire field。 - project/partner/Conversation create route 不启动 runtime。
- prompt 202 在 provider first token/settled 前返回。
- seq gap test 只 GET 目标 snapshot;SSE reconnect 不重发 prompt。
- duplicate accepted
clientRequestId返回相同 acceptance;uncertain mutation 不二次发送。 - raw stderr/provider/extension path/credential 不穿透。
Verification
- Route contract tests with in-memory and fake Pi runtime。
- Host API → SSE → snapshot integration。
- Error redaction and timeout tests。
PI-105 — Files, changes, skills, and command Host API
Objective
提供 vendor-neutral project file、search、changes、skills 和 command API,使 Renderer 不再依赖 OpenCode 的文件/Session diff/todo 路由。
Dependencies
PI-020。PI-090。
Owns
electron/api/routes/coding-files.ts。- file/status/find/content/search facade。
- Conversation changes、skills、commands route integration。
- Renderer typed facade 的 file/tool catalog contract half。
Required work
- 迁移现有受支持 file status/find/content/search 行为到 product service。
- 所有 path 相对 active project,保持现有内容/搜索边界。
- expose Conversation changes snapshot,不 expose Pi/session diff。
- 合并 Pi extension/skill commands 与 Makelore commands,稳定 DTO。
- 删除 todos/revert/unrevert/share 相关 API 外形。
Acceptance
- Renderer 无绝对项目路径和任意 filesystem proxy 能力。
- files/search 行为与现有受支持 UX 等价。
- changes 与 target Conversation/run 关联,数据来自 tracker。
- skills/commands 只包含显式受管资源。
- route/type/test 中无旧 todos/share/revert contract。
Verification
- Focused file/search/change/command route tests。
- Path boundary and redaction tests。
- Renderer facade contract tests。
PI-110 — Renderer Snapshot/Patch store
Objective
建立按 Conversation 分片、可 gap recovery、无 vendor import 的 Renderer 状态层和 typed Host facade。
Dependencies
PI-010。PI-100。
Owns
src/stores/coding-conversations.ts。src/types/coding-conversation.ts或 shared re-export。src/lib/coding-conversations.ts/existing Host API facade integration。- SSE subscription/reconnect、snapshot loader、draft state。
Required work
- 每 Conversation 独立 snapshot/run/error/queue/model/draft/unread/cursor。
- Snapshot first load + SSE live,generation/seq/gap reducer。
- hidden Conversation 只更新 lightweight summary。
- optimistic user node/draft revision/clientRequestId reconciliation。
- target-only error/recover;top-level error 只用于真实全局错误。
- Selector 粒度避免 token 时全 store rerender。
Acceptance
- 两 Conversation simultaneous patch 不串 node/run/error/queue/model/draft。
- seq gap 只刷新目标;旧 generation 丢弃。
- optimistic accept/reject/uncertain state 可恢复 draft/附件。
- hidden Conversation streaming 不触发其 Markdown component render。
- store/facade/types 无 Pi/OpenCode import/name。
- 旧
src/stores/opencode.ts不再被新 UI 读取;实际删除留PI-140。
Verification
- Store reducer/selector tests。
- Two-Conversation SSE integration。
- Render-count fixture for hidden/current Conversation。
PI-120 — Core Chat and first-Conversation UX
Objective
交付 vendor-neutral Chat core,彻底修复首次 Conversation 输入框被全局 runtime/loading 阻塞,并控制流式渲染成本。
Dependencies
PI-110。
Owns
CodingChatPanel核心组合层。- Composer、message/timeline/tool blocks 的 vendor-neutral components。
- optimistic prompt/recover UI。
- delta batching/attachment preview/render performance。
Required work
- Textarea enable rule严格实现
UX-010~UX-014。 - create/select Conversation 不等待 runtime;prewarm 仅显示局部状态。
- first send optimistic node、202 acceptance、preparing/queued/running/error/recover UI。
- message/thinking/tool/compaction/boundary 基础渲染。
- 16–33 ms Main batching 的 Renderer局部 block 更新;memo/折叠/虚拟化。
- attachment ID/preview URL,不持有重复 base64。
- 组件拆分,避免把旧 4k 行面板机械改名。
Acceptance
- Runtime/metadata response 被测试故意 hold 时,selected Agent 的 Textarea 仍可输入。
- fresh userData 选择首 Conversation → Composer p95 ≤ 500 ms。
- cold local prepare 超过 10 秒显示 recoverable error,Textarea 仍可编辑。
- prompt accepted 前后 user node不丢;Provider error 不回滚 user message。
- 100 KB cumulative tool/长 thinking 下 Main delta → Renderer commit p95 ≤ 50 ms,输出不重复。
- hidden Conversation 不做全文 Markdown rerender。
Verification
- Red-capable first-Conversation component test。
- Core Chat focused tests。
- Render commit/IPC payload benchmark fixture。
- First prompt Electron E2E。
PI-130 — Feature-complete Coding UI
Objective
在新协议上补齐需要保留的 Code 产品能力和多会话/subagent 交互,使旧 OpenCode UI 可以完整拆除。
Dependencies
PI-080。PI-090。PI-105。PI-120。
Owns
- model/thinking controls。
- steer/follow-up queue UI。
- compaction/retry/context UI。
- interactions、subagent nested graph、changes/files/browser/skills/commands UI。
- Conversation fork/title/archive/unread/recover/diagnostics UI。
Required work
- model/thinking Conversation setting,与伙伴默认分离。
- queue 两种 mode、position、等待和 abort。
- retry/compaction willRetry/settled 正确生命周期。
- select/confirm/input/editor interactions 与 stale/cancelled 状态。
subagent.v1nested nodes、parallel/chain error/abort。- Conversation changes/file preview、browser attachment、skills/commands。
- “从这里创建新对话分支”替代 revert 文案,不暗示文件回滚。
- 删除 share/todo/global runtime controls 的产品入口。
Acceptance
- 文本、图片、thinking、tools、retry、compaction、queue、interaction、model/thinking、files/changes、browser、skills 全部可在新 UI 使用。
- 两 Conversation 同时 streaming,切换/隐藏/abort/model 互不污染。
- subagent single/parallel/chain nested UI 正确;child error/abort 可理解。
agent_end不清 busy;agent_settled才释放 queue。- tool result 不独立 bubble;compaction summary/raw custom details 不泄露。
- share/unshare/revert/unrevert/todos/global runtime controls UI 不存在。
Verification
- Focused UI tests for every retained/removed behavior。
- Electron E2E:concurrency、model、queue、compaction、interaction、subagent、image、browser/skill、recover。
PI-140 — OpenCode removal and cutover migration
Objective
在新链路达到 feature completeness 后,删除所有生产 OpenCode 源码、依赖、route、资源、脚本和旧 UI,并接通最终一次性迁移/提示。
Dependencies
PI-130。
Owns
- 删除
electron/opencode、OpenCode route/manager/client/materialization/provider/plugin code。 - 删除/重命名
src/*opencode*、shared/opencode-*、旧 tests/E2E。 - package/lockfile OpenCode 与 MCP dependency removal。
.opencodepackaged resources、bundle/smoke script removal。- 迁移 notice、legacy data inert policy、release-facing removed-feature copy。
Required work
- 删除
/api/opencode/*与 Renderer 调用。 - 删除
opencode-ai、@opencode-ai/plugin、仅服务 OpenCode 的@playwright/mcp。 - 删除 manager/client/project-agent-runtime/provider-config/playwright-mcp/plugin materialization。
- 删除旧 store/types/normalizer/panel/runtime controls/diff preview 和浅 Implementation tests。
- 删除 share/unshare/revert/unrevert/todos/global runtime controls 的 route/type/test/doc copy。
- 移动保留的 product skills/assets 到 vendor-neutral 资源。
- 接通 schema migration、一次性 notice、userData inert/no-read。
- 保持 app id/protocol/storage identifiers。
Acceptance
- 生产源码/route/dependency/runtime resource 不包含 OpenCode。
rg -i只命中明确允许的历史/迁移文本,并逐项分类记录。- package/lockfile 无 OpenCode package/plugin/MCP dependency。
- 新应用不读取项目
.opencode或<userData>/opencode。 - uncertain/modified
.opencode/agent被 backup,未误删。 - stable Agent IDs/app id/protocol/storage 保持。
- 全部 Code UI/Host tests 已指向
/api/coding和新 store。
Verification
- Zero-residue source/package search。
- Migration E2E from schema v1 fixture。
- Full focused Code tests + typecheck/build before
PI-150。
PI-150 — Packaging, E2E, and performance release proof
Objective
把硬切换打成可发布 artifact,运行完整自动化、真实 Pi、三平台和性能验收,产出可审阅证据。
Dependencies
PI-140。
Owns
- 最终
bundle-pi-runtime、electron-builder staging、artifact verifier。 smoke:pi:real。- rewritten/new Electron E2E suite。
- performance harness/report、release note/runbook draft、README current product update。
- feature task verification record与 promotion candidates;canonical docs 留
PI-160Integration Gate。
Required work
- stage exact Pi production closure、extensions、skills、manifest。
- artifact verifier 检查 version/engine/resources/resolve/get_state/no-OpenCode/no-dev-path。
- actual packaged Pi smoke:通过受控 loopback/provider-shaped endpoint 覆盖 session、prompt、tool、abort、settle、reopen、two-worker overlap/isolation、subagent、shutdown;不要求真实外部 Provider Account,报告保持
realTurnVerified=false。 - 完整 typecheck/lint/unit/build/E2E。
- Windows x64、Linux x64 最终产品 artifact 的 packaged verifier/smoke。
- 对 macOS x64 与 arm64 分别使用独立 checkout/frozen install,运行 workspace 5+5、staged 5+5、controlled packaged 5+5、packaged loopback、closure/native/resource 检查和 metrics,再验证各自最终目标 artifact;不得用静态 path test、其他平台结果或
PI-000waiver 替代。 - Spec 第 17.3 节全部场景,报告 p50/p95/max/samples/RSS/IPC/commit。
- release note:旧 Conversation、删除能力、完整版本回退、Pi 新 Conversation 不兼容旧版。
- README 同步当前 runtime/功能,不写历史迁移日记。
Acceptance
pnpm run typecheck、pnpm run lint:check、pnpm test、pnpm run build:vite、pnpm run test:e2e全通过。- artifact verifier 与 real Pi smoke 全通过。
- 最终 packaged 四协议 loopback、provider-shaped two-worker overlap、单侧 abort 与另一侧 settled 全通过;真实外部 Provider waiver 不是 Pass,也不是 release blocker。
- Windows x64、Linux x64、macOS x64、macOS arm64 目标 artifact 与对应验证全部通过;macOS 任一架构缺失即不允许宣称 cross-platform release-ready。
PI-000的 macOS Explicitly Waived / Deferred 到本票据即失效;延期造成 release-stage packaging/native/resource/performance 返工的风险已经接受,但任何实际失败仍必须阻断 release。- Composer、worker、acceptance、render p95 全达 Spec 预算。
- 4 parent + 4 child 压力下 UI 可交互,无 orphan process/permit/lease。
- 最终 artifact 无 OpenCode package/binary/plugin/resource、无开发机绝对路径。
- 性能报告分离本地 overhead 与受控 provider-shaped first-event,不使用一次体验替代统计;可选真实外部 Provider 样本只能作为非阻断诊断。
Verification
- 保存命令、版本、artifact、平台、样本数和结果摘要到 task evidence。
- macOS x64/arm64 分架构保存 workspace/staged/controlled packaged/loopback/metrics 与最终 artifact 实跑证据;不得只记录 waiver 或静态测试。
- 保存最终 packaged loopback/provider-shaped concurrency/abort 证据并明确
realTurnVerified=false;不得因缺少真实外部 Account/credential 把 release 标为 Blocked,也不得把 waiver 写成 Pass。 - 对允许的
opencode搜索命中逐项解释。 - 更新 task record 的验证和未完成外部环境项;任何 release 阻断不得藏在 follow-up。
PI-160 — Integration and release gate
Objective
以 Integration Task 所有权完成最终 Spec/Standards 审阅、合并验证、canonical memory 提升和 release go/no-go;不让 feature branch 的自证替代集成事实。
Dependencies
PI-150。
Owns
- Integration Task record、merge/rebase conflict handling。
- merge tree 的最终验证与独立 Spec/Standards review。
- accepted ADR、canonical current state/architecture/data flow/domain/success/evidence/commitments 清理。
- release decision、tag/runbook handoff;不自动 push/release,除非用户另行授权。
Required work
- 重新运行 Concurrent Task Gate,确认 main/worktree ownership 和最新 base。
- 集成完整 feature tip,不选择性合并会留下双 runtime 的部分提交。
- 在 merge tree 重跑风险相称的 focused/full/build/E2E/artifact/real smoke/perf checks。
- 对照
ML-CODE-PI-001逐条审阅,不以 ticket 自报 Done 代替证据。 - 新增 accepted ADR:Pi 唯一 runtime、无 OpenCode fallback。
- 更新 system overview/module map/data flow/business rules/success criteria/current state/README/evidence。
- 关闭或改写仅对 OpenCode 有意义的 model-switch、dual-session、compaction、saturation commitments。
- 执行零残留和 release note/rollback runbook 审阅。
Acceptance
- 全部 Spec requirements 和 DoD 有可追踪证据,无未解释偏离。
- merge tree 与 feature tree 验证一致,无 main 回归。
- accepted ADR 和 canonical docs 描述实际 Pi 架构,不提前声称未跑的 macOS 或已豁免的真实外部 Provider 证据通过。
- accepted ADR、release note 与风险记录明确真实外部 Provider compatibility/concurrency/isolation 是用户接受的未验证风险,不声称 Pass;macOS x64/arm64 仍须有实际发布证据。
- OpenCode commitments 不再伪装为当前待办;需要保留的历史证据仍可追踪。
- 无 runtime fallback/compat layer/old route/dependency/artifact。
- release go/no-go 明确;若任一硬门不通过,状态保持 Blocked,不发布。
Verification
- Integration Gate scripts、documentation drift gate。
- Final full command suite + artifact/real/runtime/performance evidence review。
- Independent human/reviewer Spec and Standards review;不要求特定智能体机制。
6. 票据状态模板
后续若同步为 task/issue,每张票据至少维护:
Status: Pending | Ready | In progress | Blocked | Done
Depends on: <ticket ids>
Owner/worktree: <explicit owner>
Owned files/responsibility: <bounded scope>
Acceptance evidence: <tests, artifacts, measurements>
Contract changes: <none or linked upstream update>
Blockers: <concrete unmet condition>
禁止使用“代码基本完成”“看起来正常”“后续再测”作为 Done 证据。阻断项如果属于 Spec 硬门,必须留在当前 ticket,不得降级为 release 后 follow-up。