@openprd/cli 0.1.19 → 0.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/.openprd/changes/openprd-control-plane-v020/.openprd.yaml +2 -0
  2. package/.openprd/changes/openprd-control-plane-v020/design.md +78 -0
  3. package/.openprd/changes/openprd-control-plane-v020/proposal.md +54 -0
  4. package/.openprd/changes/openprd-control-plane-v020/specs/agent-requirements/spec.md +16 -0
  5. package/.openprd/changes/openprd-control-plane-v020/task-events.jsonl +27 -0
  6. package/.openprd/changes/openprd-control-plane-v020/tasks-002.md +35 -0
  7. package/.openprd/changes/openprd-control-plane-v020/tasks.md +427 -0
  8. package/.openprd/changes/remove-session-tracking-humane-approval/.openprd.yaml +2 -0
  9. package/.openprd/changes/remove-session-tracking-humane-approval/design.md +52 -0
  10. package/.openprd/changes/remove-session-tracking-humane-approval/proposal.md +35 -0
  11. package/.openprd/changes/remove-session-tracking-humane-approval/specs/agent-requirements/spec.md +16 -0
  12. package/.openprd/changes/remove-session-tracking-humane-approval/task-events.jsonl +1 -0
  13. package/.openprd/changes/remove-session-tracking-humane-approval/tasks.md +170 -0
  14. package/.openprd/design/active/asset-spec.md +19 -14
  15. package/.openprd/design/active/direction-plan.md +19 -3
  16. package/.openprd/design/active/facts-sheet.md +16 -7
  17. package/.openprd/design/active/image-preflight.md +6 -5
  18. package/.openprd/design/active/review-studio-v020-directions/compare-plan.json +34 -0
  19. package/.openprd/design/active/review-studio-v020-directions/contact-sheet.jpg +0 -0
  20. package/.openprd/design/active/review-studio-v020-directions/crops/01.png +0 -0
  21. package/.openprd/design/active/review-studio-v020-directions/crops/02.png +0 -0
  22. package/.openprd/design/active/review-studio-v020-directions/crops/03.png +0 -0
  23. package/.openprd/design/active/review-studio-v020-directions/focus-board.template.json +69 -0
  24. package/.openprd/design/active/review-studio-v020-directions/parallel-board.template.json +45 -0
  25. package/.openprd/design/active/review-studio-v020-directions/reference-set.json +143 -0
  26. package/.openprd/design/active/review-studio-v020-directions/source.png +0 -0
  27. package/.openprd/design/active/selected-direction.md +23 -9
  28. package/.openprd/engagements/active/control-plane-architecture.json +203 -0
  29. package/.openprd/engagements/active/control-plane-intake.json +418 -0
  30. package/.openprd/engagements/active/prd.md +183 -119
  31. package/.openprd/engagements/active/review-presentation-v0018.json +176 -0
  32. package/.openprd/i18n-config.json +12 -0
  33. package/.openprd/ledger/events.jsonl +6 -0
  34. package/.openprd/ledger/heads/ebea1a71a9daa566f1c91b53.json +10 -0
  35. package/.openprd/manifest.json +21 -0
  36. package/AGENTS.md +1 -0
  37. package/README.md +2 -0
  38. package/README_EN.md +2 -0
  39. package/package.json +1 -1
  40. package/skills/openprd-frontend-design/SKILL.md +16 -0
  41. package/skills/openprd-harness/SKILL.md +1 -1
  42. package/skills/openprd-quality/SKILL.md +1 -1
  43. package/skills/openprd-requirement-intake/SKILL.md +1 -1
  44. package/skills/openprd-shared/SKILL.md +1 -1
  45. package/src/adapters/adapter-spi.js +193 -0
  46. package/src/adapters/capability-envelope.js +98 -0
  47. package/src/adapters/event-normalizer.js +55 -0
  48. package/src/adapters/index.js +4 -0
  49. package/src/adapters/install-safety.js +249 -0
  50. package/src/agent-canonical-content.js +4 -2
  51. package/src/agent-integration.js +147 -42
  52. package/src/cli/args.js +63 -4
  53. package/src/cli/gate-print.js +17 -0
  54. package/src/cli/quality-commands.js +18 -0
  55. package/src/cli/quality-print.js +10 -0
  56. package/src/cli/runtime-print.js +24 -0
  57. package/src/codex-hook-runner-template.mjs +65 -77
  58. package/src/codex-runtime.js +48 -5
  59. package/src/context/cache.js +245 -0
  60. package/src/context/compiler.js +438 -0
  61. package/src/context/constants.js +30 -0
  62. package/src/context/index.js +39 -0
  63. package/src/context/redaction.js +84 -0
  64. package/src/context/stable.js +69 -0
  65. package/src/context/telemetry.js +42 -0
  66. package/src/dev-standards.js +57 -0
  67. package/src/fleet.js +112 -95
  68. package/src/gates/index.js +2 -0
  69. package/src/gates/scoped-gates.js +256 -0
  70. package/src/gates/store.js +126 -0
  71. package/src/gates/workspace.js +41 -0
  72. package/src/html-artifacts.js +725 -28
  73. package/src/kernel/atomic-store.js +299 -0
  74. package/src/kernel/event-envelope.js +166 -0
  75. package/src/kernel/index.js +4 -0
  76. package/src/kernel/project-ledger.js +467 -0
  77. package/src/kernel/project-manifest.js +205 -0
  78. package/src/knowledge-v3/index.js +1 -0
  79. package/src/knowledge-v3/lifecycle.js +290 -0
  80. package/src/knowledge.js +14 -7
  81. package/src/openprd.js +71 -2
  82. package/src/review-model.js +413 -0
  83. package/src/review-presentation.js +1 -1
  84. package/src/run-harness.js +431 -37
  85. package/src/runtime/cli_runtime_README.md +28 -0
  86. package/src/runtime/errors.js +66 -0
  87. package/src/runtime/index.js +44 -0
  88. package/src/runtime/lane-schema.js +141 -0
  89. package/src/runtime/lane-store.js +279 -0
  90. package/src/runtime/task-runtime.js +449 -0
  91. package/src/runtime/workspace.js +179 -0
  92. package/src/runtime/write-set.js +206 -0
  93. package/src/session-binding.js +16 -3
  94. package/src/session-registry.js +59 -1
  95. package/src/upgrade/fleet-mutation.js +166 -0
  96. package/src/upgrade/fleet-transaction.js +398 -0
  97. package/src/upgrade/transaction-store.js +416 -0
  98. package/src/visual-compare-core.js +66 -27
  99. package/src/visual-compare.js +18 -12
  100. package/src/workspace-core.js +109 -7
  101. package/src/workspace-registry.js +39 -1
  102. package/src/workspace-workflow.js +18 -15
@@ -1,122 +1,154 @@
1
- # 画布协同闭环:标注改图、双向结构化工具、尺寸契约与唤起机制
1
+ # OpenPrd 可解释项目控制平面与跨工具上下文升级
2
2
  > 语言规则:用户可见说明、PRD、spec 和 tasks 跟随用户当前主语言;无法判断时才使用简体中文兜底。PRD、OpenPrd、OpenSpec、API、SDK、CLI、TypeScript、JSON、HTTP、WebSocket、字段 key、命令名、品牌名、产品名和协议名等必要专有名词保留原文。
3
- - 版本: v0014
3
+ - 版本: v0018
4
4
  - 负责人: OpenPrd
5
5
  - 产品场景: 以 Agent 为主要使用场景
6
6
  - 场景模板: 以 Agent 为主要使用场景
7
7
  - 状态: synthesized
8
- - 生成时间: 2026-07-06 22:49:20
8
+ - 生成时间: 2026-07-10 23:07:12
9
9
  ## 元信息
10
10
 
11
- - 标题: 画布协同闭环:标注改图、双向结构化工具、尺寸契约与唤起机制
11
+ - 标题: OpenPrd 可解释项目控制平面与跨工具上下文升级
12
12
  - 负责人: OpenPrd
13
- - 状态: synthesized
14
- - 版本: v0014
13
+ - 状态: classified
14
+ - 版本: v0018
15
15
  - 产品场景: 以 Agent 为主要使用场景
16
- - 日期: 2026-07-06
16
+ - 日期: 2026-07-10
17
17
 
18
18
  ## 问题
19
19
 
20
- - 问题陈述: OpenPrd 画布目前只有单向的“发送给 Codex”整体交接:Agent 不能结构化读取用户在画布上的选区与标注,不能把生成图片精准放回画布锚点旁,标注修改意图靠用户口述或手动截图传递,协同链路断在“人标注完之后”这一步。
21
- - 为什么是现在: 对标 Cowart 已验证“标注改图闭环 + 画布双向结构化工具 + 生图尺寸契约 + 具名 skill 唤起”四件能力能显著降低人机视觉协同成本;OpenPrd 0.1.18 刚落地生图路由,正好把尺寸契约与路由串起来。
20
+ - 问题陈述: 统一项目事实、并发运行态和上下文编译,降低 token、延迟、错误目标与长期维护成本
21
+ - 为什么是现在: 0.1.19 已暴露多真相源、并发和跨版本迁移风险,需要在 0.1.20 建立兼容控制平面
22
22
  - 证据:
23
- - Cowart get_cowart_selection / insert_cowart_image / annotation-edit 元数据闭环已被 DeepWiki 调研确认
24
- - OpenPrd 画布现状只有 placeholderId 回填和整体 handoff,无结构化选区读取
25
- - 用户已确认按对标建议落地四项能力
23
+ - 30 817 Codex 线程中,362 个具有 OpenPrd CLI 形态,共 3145 次调用;run --context 554 次,93 个线程重复调用,额外调用 271 次,单线程最多 22 次。
24
+ - 56 个同项目 OpenPrd 线程在 5 分钟内并发启动;当前 feature-list、loop-state、current state 和全局镜像缺少 claim、lease、CAS 与 write-set 冲突协议。
25
+ - 当前 run-harness 已出现 findSessionWorkspaceCandidates 被删除但仍调用,以及显式 session 在精确解析前被 active change 抢占的回归。
26
+ - 当前 v0017 与 remove-session-tracking change 混入前一个 Canvas 需求内容,证明局部 capture 与多投影可以形成语义污染。
27
+ - 本机持久范围发现 86 个 .openprd,版本跨 0.1.0、0.1.11、0.1.15、0.1.19;Home 级 Codex Skill 还被 Claude 适配内容和软链接污染。
26
28
 
27
29
  ## 用户与相关方
28
30
 
29
31
  - 主要用户:
30
- - 使用 OpenPrd 画布做视觉协同的开发者与产品设计协作者
32
+ - 用自然语言驱动 Codex、Cursor、Claude Code 完成产品开发的非专业或半专业用户
33
+ - 在同一代码项目中并发运行多个 Agent、线程、worktree 的开发者
34
+ - 需要持续维护需求、代码健康、知识与版本迁移的项目负责人
31
35
  - 次要用户:
32
- - 待补充
36
+ - OpenPrd 集成与插件维护者
37
+ - 审阅业务范围、风险与验收结论的产品和业务协作者
33
38
  - 相关方:
34
- - OpenPrd 维护者
35
- - Codex/Cursor 上的 Vibe Coding 用户
39
+ - OpenPrd 产品与工程维护者
40
+ - OpenPrd 管理的本地项目所有者
41
+ - Codex、Cursor、Claude Code 适配层维护者
36
42
 
37
43
  ## 目标与成功标准
38
44
 
39
45
  - 目标:
40
- - 用户在画布上标注后,一句话就能让 Agent 读懂标注并生成修订图放回原图旁
41
- - Agent 能结构化读取画布选区并把图片锚定回填
42
- - 生图请求自动携带占位卡尺寸契约
43
- - 用户能用自然语言稳定唤起画布协同
46
+ - 用唯一 Project Ledger 管理项目业务事实,并把 current、task graph、review、knowledge index 等降为可重建投影
47
+ - 用 Lane/Task Runtime 支持同项目多线程、多 Agent、多 worktree 安全 claim、lease、heartbeat、write-set 与 CAS
48
+ - 用 Context Compiler 向 Agent 提供最精准、最小 token、可缓存、可增量、可解释且默认只读的上下文
49
+ - 用 scoped Evidence 和 Gate 让局部任务不被无关项目债务阻断,同时保持发布级门禁
50
+ - 从同一 ReviewModel 生成小白可懂的业务视图和工程可执行视图,并保持同一 digest 与决策链
51
+ - 统一 Codex、Cursor、Claude Code 的 Adapter SPI、能力协商、事件归一和跨版本协议
52
+ - 把 Knowledge Evolution 变为有作用域、证据、有效期、替代链和可回滚的持续维护系统
53
+ - 安全将产品版本升级到 0.1.20,并刷新所有真实本地 OpenPrd 安装与旧项目
44
54
  - 成功指标:
45
- - 标注改图闭环端到端可走通并有测试覆盖
46
- - selection/insert-image API 有集成测试
47
- - 尺寸契约出现在生图指引与占位卡 handoff 记录中
55
+ - 相同 revision 与请求生成稳定 context digest;默认完整 Capsule 不超过 800 tokens,Delta 不超过 250 tokens
56
+ - Context warm cache p95 小于 100ms,cold build p95 小于 500ms;run --context 对业务状态零写入
57
+ - 同一 task 的 100 个并发 claim 只允许一个成功;CAS 与 write-set 压力测试零 lost update
58
+ - 显式 session/thread/task/work-unit 目标解析准确率 100%,active change 只在无精确索引时作为 fallback
59
+ - 业务 Review 不泄露内部命令和实现噪声,工程 Review 保持文件、任务、测试、证据和版本全链路可追溯
60
+ - Codex、Cursor、Claude Code 通过同一适配契约 fixture,能力缺口被明确表达而不伪装支持
61
+ - 所有真实活跃本地项目升级到 0.1.20,归档未改动,单项目回滚演练成功,Home Skill 不再出现跨适配器漂移
48
62
  - 验收目标:
49
- - canvas 服务新增 GET /api/selection 与 POST /api/insert-image 且测试通过
50
- - 标注导出带 annotationEdit 元数据并能被 hook 指引消费
51
- - hook 对画布协同意图注入引导语
63
+ - 全量单元、集成、并发、迁移、回滚、性能和三平台契约测试通过
64
+ - 最新 Markdown/HTML 测试报告、质量报告、架构与视觉证据可追溯
65
+ - standards、quality、run verify 与 doctor 在发布/刷新前全部健康
66
+ - 所有真实项目刷新报告包含版本、checksum、备份、迁移结果和失败回滚状态
52
67
 
53
68
  ## 验证与创业闭环
54
69
 
55
70
  - 可触达社区:
56
- - 待补充
71
+ - 已经在本机真实项目中持续使用 OpenPrd、Codex、Cursor、Claude Code 的 Vibe Coding 用户与维护者
57
72
  - 第一批种子用户:
58
- - 待补充
73
+ - 当前 43 个活跃或真实旧项目的维护者
74
+ - 近一个月具有 OpenPrd CLI 行为的 362 个 Codex 线程代表的真实任务样本
59
75
  - 社区契合与触达依据:
60
- - 待补充
61
- - 当前替代方案: 待补充
76
+ - 团队本身就是高频 Vibe Coding 与多 Agent 协作者,拥有真实线程、真实项目、真实安装漂移和真实迁移样本,可以在自身工作流中完成 dogfood。
77
+ - 当前替代方案: 依赖 AGENTS.md、Skill、change/tasks、session binding、run-state、质量报告和人工记忆拼接上下文;发生冲突时靠重新运行 context、手工检查状态或切换线程。
62
78
  - 痛点与替代证据:
63
- - 待补充
79
+ - 重复 context、错误目标恢复、语义污染、全局 registry 膨胀、跨工具 Skill 漂移和 fleet 无事务更新均已在当前仓库与本机安装中复现。
64
80
  - 手工交付路径:
65
- - 待补充
81
+ - 先以兼容模式建立 manifest、事件信封、原子存储与 Ledger shadow-write,再逐层切换 Runtime、Context、Gate、Review、Knowledge 和 Adapter;每层均用真实项目 fixture 与旧版本 fixture 对账。
66
82
  - 手工作战卡:
67
- - 待补充
83
+ - 修复当前回归并冻结协议;建立 legacy/dual/ledger 三种存储模式;对每个旧项目执行 preflight、备份、临时生成、校验、原子替换与单项目回滚;按批次刷新 Home、Projects、Context 和活跃 worktree。
68
84
  - 承诺信号:
69
- - 待补充
70
- - 首个低成本验证: 生成 change 与任务拆解后按序实现
85
+ - 用户明确授权完整实施、自动解决中间问题并刷新全部真实本地版本
86
+ - 现有线程与安装盘点提供了可量化的前后对比基线
87
+ - 首个低成本验证: 在当前 OpenPrd 仓库先完成回归修复、项目 manifest、原子 Ledger、任务并发 Runtime 与只读 Context Capsule 的纵向闭环。
71
88
  - 先活下来方案:
72
- - 待补充
89
+ - 保持 0.1.x CLI 和现有生成文件兼容;新内核先 shadow-write,出现不一致时可切回 legacy read,禁止一次性破坏旧项目。
73
90
  - 付费验证信号:
74
- - 待补充
75
- - 第一版只做一件事: 待补充
76
- - 周末级验证: 待补充
91
+ - 本轮以真实使用频率、迁移覆盖、token 与执行时间下降、并发正确性和评审完成率作为价值证明,不引入商业收费动作。
92
+ - 第一版只做一件事: 0.1.20 首先交付可兼容的 Project Manifest、Event Envelope、Atomic Store、Project Ledger、Lane/Task Runtime、Context Capsule,以及安全 fleet 升级;双投影 Review、Adapter SPI 与 Knowledge Evolution 必须有可用纵向能力,但旧投影可保留兼容入口。
93
+ - 周末级验证: 用当前仓库、两个并发临时工作区、0.1.15/0.1.19 fixture 和 Home Skill 软链接 fixture 完成全链路演练。
77
94
  - 最小工具桥接:
78
- - 待补充
95
+ - 先修复 exact session 优先级并实现一个具备 expectedRevision、idempotencyKey、原子写入和可重建投影的 Ledger stream。
79
96
  - 产品化门槛:
80
- - 待补充
97
+ - 只有全量测试、并发压力、迁移幂等、回滚演练、三平台契约和真实项目 dry-run 均通过,才允许把 0.1.20 刷新到真实本地项目。
81
98
  - 第一批客户路径:
82
- - 待补充
83
- - 初始收费假设: 待补充
84
- - 客户 1 盈利路径: 待补充
99
+ - 先覆盖当前机器上的 OpenPrd 自身仓库与活跃项目,再把协议和迁移路径推广到其他 OpenPrd 用户。
100
+ - 初始收费假设: 本轮不改变开源 CLI 定价;价值通过更低上下文成本、更少返工和更稳定的长期项目维护体现。
101
+ - 客户 1 盈利路径: 单项目减少一次错误目标执行、一次全量 context 重注入或一次手工迁移回滚即可抵消升级成本。
85
102
  - 销售与增长纪律:
86
- - 待补充
87
- - 可逆性判断: 待补充
88
- - 客户真问题校验: 待补充
89
- - 价值观一致性: 待补充
103
+ - 先保证协议稳定、可回滚、可观测和旧项目兼容,再增加更多自动化;不以新增命令数量替代可验证的执行质量。
104
+ - 可逆性判断: 每个迁移阶段支持 legacy/dual/ledger 模式、preimage backup、幂等 migration id 与按项目 restore;归档和发布副本默认保持不可变。
105
+ - 客户真问题校验: 目标直接针对已观测的重复上下文、并发覆盖、错误目标、评审理解成本、跨版本漂移和长期知识失真,而不是为了架构整洁而重写。
106
+ - 价值观一致性: 坚持用户可理解、Agent 可执行、事实可追溯、风险可回滚、知识可持续演进的 OpenPrd 产品原则。
90
107
 
91
108
  ## 范围与非目标
92
109
 
93
110
  - 范围内:
94
- - canvas-workspace.js 新增选区状态持久化与查询 API
95
- - canvas-workspace.js 新增锚定插图 API(anchorShapeId/placement/replaceHolder)
96
- - canvas-app.html.js 标注修改请求导出(带元数据)与选区上报
97
- - 生图占位卡尺寸契约写入 handoff 与生图指引
98
- - codex-hook-runner-template.mjs 画布协同意图识别与引导注入
99
- - agent-canonical-content.js 画布协同指引
100
- - docs/basic README 同步
111
+ - Project Manifest、Event Envelope、Atomic Store、Project Ledger 与可重建投影
112
+ - Session/Lane/Task Runtime:claim、lease、heartbeat、write-set、CAS、worktree/branch trace
113
+ - Context Capsule、Delta、Cache、token budget、authority/freshness、引用解析与 secret redaction
114
+ - project/change/work-unit/task/lane/operation 分级 Gate 与 Evidence
115
+ - Review canonical model、业务/工程双投影、决策与 Canvas 标注绑定
116
+ - Knowledge v3 生命周期、检索预算、telemetry 分离、Learning/Growth 边界
117
+ - Codex/Cursor/Claude Code Adapter SPI、能力协商、runtime detection 与生成文件漂移修复
118
+ - 协议/reader/writer/adapter/projection 版本、N/N-1 兼容、幂等迁移、备份与回滚
119
+ - fleet nested legacy 扫描、symlink 安全、registry 隔离/压缩和真实本地项目批量刷新
120
+ - 面向普通用户的中文产品文案、i18n 提醒和 Review Studio 视觉交互验证
101
121
  - 范围外:
102
- - 不迁移 tldraw、不做 Codex widget 内嵌
103
- - 不新建独立 MCP stdio server,复用画布本地 HTTP 服务
104
- - 不改变现有发送给 Codex 的 app-server 桥接协议
122
+ - 不进行生产云端热修复、远程业务数据写入或替用户发布外部服务
123
+ - 不重写 Excalidraw/Canvas 引擎,不引入与控制平面无关的视觉资产系统
124
+ - 不静默删除历史 review、归档、release 副本或用户未提交源码改动
125
+ - 不在 0.1.20 直接移除全部 legacy 文件;先提供兼容投影和回滚窗口
126
+ - 不把 Codex、Cursor、Claude Code 不具备的生命周期能力伪装成已支持
127
+ - 不自动 push、npm publish 或创建远端 release,除非用户另行明确授权
105
128
 
106
129
  ## 场景与流程
107
130
 
108
131
  - 主流程:
109
- - 用户在画布圈选原图并批注,点“标注修改请求”,Agent 读标注生成修订图并放回原图右侧
110
- - Agent GET /api/selection 读取选中图形结构化数据
111
- - Agent POST /api/insert-image 把生成图锚定到指定图形旁
112
- - 用户说“打开画布一起改图”即唤起画布协同
132
+ - Agent 进入已有项目,Adapter 识别运行环境,Context Compiler 基于 lane/task/revision 在预算内生成 Capsule 或 Delta
133
+ - 多个线程并发执行同一项目,Runtime task write-set 原子 claim,冲突被结构化返回,不相交任务可并行
134
+ - 业务用户打开 Review,先看到问题、价值、范围、流程、风险和验收;工程视图从同一 model 展示 change/task/file/test/evidence
135
+ - 任务完成后 Evidence 只更新相关 task/work-unit 投影;阶段或发布门禁再聚合项目级质量
136
+ - 旧项目升级前生成 plan 与 backup,迁移到 dual 模式并验证;失败只回滚当前项目
137
+ - Knowledge 由 observation 进入 candidate,经证据验证后生效;过期、冲突或被替代的知识不再进入 Context
113
138
  - 边界情况:
114
- - 无选区时 selection API 返回空且 Agent 收到明确提示
115
- - 锚点图形不存在时 insert-image 报错不写脏数据
116
- - 占位卡无宽高时尺寸契约退化为默认比例
139
+ - 同一 session ID 在多个工作区有线索时不语义猜测,返回候选和安全阻断
140
+ - Agent 崩溃导致 lease 过期后,旧 heartbeat 不能覆盖新 claim
141
+ - Ledger JSONL 尾部半写、projection 损坏或 migration 重跑时可恢复且不重复应用
142
+ - workspace schema 过新时旧 writer 拒绝写入并说明最小兼容版本
143
+ - Home Skill 路径含跨目录 symlink 时拒绝跟随覆盖 canonical source,并给出可恢复迁移计划
144
+ - dirty worktree、detached worktree、归档、副本和 nested legacy 目录被明确分类,不误刷新
117
145
  - 失败模式:
118
- - 画布服务未启动时 API 调用失败要提示先运行 openprd canvas
119
- - 回填图片文件缺失时保持画布 scene 不变
146
+ - expectedRevision 不一致时返回 OPENPRD_REVISION_CONFLICT,不覆盖新状态
147
+ - write-set 冲突时保留当前 claim 并返回冲突任务、owner、lease 与重试条件
148
+ - Context 超预算时按 authority、scope、freshness 和 relevance 确定性裁剪,并列出 excluded reason
149
+ - 迁移校验失败时用 preimage 恢复当前项目,registry 不提交该项目新版本
150
+ - Adapter 能力不足时生成 capability gap,不继续要求不存在的 hook 或 UI
151
+ - Review model digest 不匹配时不接受确认,CSS/artifact 重渲染不得改变业务 model digest
120
152
 
121
153
  ## 可视化图表
122
154
 
@@ -124,30 +156,30 @@
124
156
 
125
157
  ```mermaid
126
158
  flowchart LR
127
- entry["入口触发<br/>用户在画布圈选原图并批注,点“标注修改请求”,Agent 读标注生成修订图并放回原图右侧"]
128
- experience["产品内步骤<br/>Agent GET /api/selection 读取选中图形结构化数据"]
129
- decision{"决策点<br/>无选区时 selection API 返回空且 Agent 收到明确提示"}
130
- success(["成功结果<br/>标注改图闭环端到端可走通并有测试覆盖"])
131
- failure[["失败与恢复<br/>画布服务未启动时 API 调用失败要提示先运行 openprd canvas"]]
132
- entry -->|"用户在画布圈选原图并批注,点“标注修改请求”,Agent 读标注生成修订图并放回原…"| experience
133
- experience -->|"Agent GET /api/selection 读取选中图形结构化数据"| decision
134
- decision -->|"用户在画布上标注后,一句话就能让 Agent 读懂标注并生成修订图放回原图旁"| success
135
- decision -.->|"画布服务未启动时 API 调用失败要提示先运行 openprd canvas"| failure
159
+ entry["入口触发<br/>Agent 进入已有项目,Adapter 识别运行环境,Context Compiler 基于 lane/task/revis…"]
160
+ experience["产品内步骤<br/>多个线程并发执行同一项目,Runtime task write-set 原子 claim,冲突被结构化返回,不相交任务…"]
161
+ decision{"决策点<br/>同一 session ID 在多个工作区有线索时不语义猜测,返回候选和安全阻断"}
162
+ success(["成功结果<br/>相同 revision 与请求生成稳定 context digest;默认完整 Capsule 不超过 800 tokens,…"])
163
+ failure[["失败与恢复<br/>expectedRevision 不一致时返回 OPENPRD_REVISION_CONFLICT,不覆盖新状态"]]
164
+ entry -->|"Agent 进入已有项目,Adapter 识别运行环境,Context Compi…"| experience
165
+ experience -->|"多个线程并发执行同一项目,Runtime task write-set 原…"| decision
166
+ decision -->|"用唯一 Project Ledger 管理项目业务事实,并把 current、ta…"| success
167
+ decision -.->|"expectedRevision 不一致时返回 OPENPRD_REVISION_…"| failure
136
168
  ```
137
169
 
138
170
  ### 架构
139
171
 
140
172
  ```mermaid
141
173
  flowchart LR
142
- users["主要用户<br/>使用 OpenPrd 画布做视觉协同的开发者与产品设计协作者"]
174
+ users["主要用户<br/>用自然语言驱动 Codex、Cursor、Claude Code 完成产品开发的非专业或半专业用户 · 在同一代码项目中并发运…"]
143
175
  subgraph solution["方案边界"]
144
- experience["Agent 使用场景层<br/>用户在画布圈选原图并批注,点“标注修改请求”,Agent 读标注生成修订图并放回原图右侧 · Agent GET /api…"]
145
- core["核心产品逻辑<br/>OpenPrd 画布目前只有单向的“发送给 Codex”整体交接:Agent 不能结构化读取用户在画布上的选区与标注,不能把生…"]
146
- integrations["依赖与集成<br/>依赖 openprd canvas 本地服务 · 依赖 0.1.18 生图路由协议"]
147
- governance[["约束与可靠性<br/>不写入敏感信息 · 画布数据留在本地项目目录"]]
148
- delivery["验证与交接<br/>标注改图闭环端到端可走通并有测试覆盖 · selection/insert-image API 有集成测试 · 尺寸契约出现在…"]
176
+ experience["Agent 使用场景层<br/>Agent 进入已有项目,Adapter 识别运行环境,Context Compiler 基于 lane/task/revis…"]
177
+ core["核心产品逻辑<br/>统一项目事实、并发运行态和上下文编译,降低 token、延迟、错误目标与长期维护成本"]
178
+ integrations["依赖与集成<br/>现有 OpenPrd CLI、skills、hooks、workspace schema、review renderer、qu…"]
179
+ governance[["约束与可靠性<br/>上下文与日志不得包含 API key、token、账号、个人隐私或未脱敏 prompt 原文 · 迁移备份只包含当前任务需要的…"]]
180
+ delivery["验证与交接<br/>相同 revision 与请求生成稳定 context digest;默认完整 Capsule 不超过 800 tokens,…"]
149
181
  end
150
- users -->|"用户在画布圈选原图并批注,点“标注修改请求”,Agent 读标注生成修订图并放…"| experience
182
+ users -->|"Agent 进入已有项目,Adapter 识别运行环境,Context Com…"| experience
151
183
  experience -->|"产品动作与编排"| core
152
184
  core -->|"依赖与外部服务"| integrations
153
185
  core -.->|"策略、可靠性与合规"| governance
@@ -159,67 +191,99 @@ flowchart LR
159
191
  ## 需求
160
192
 
161
193
  - 功能需求:
162
- - 选区状态随画布保存并可查询
163
- - 插图 API 支持 left/right/below 摆放与 holder 替换
164
- - 标注导出携带 annotationEdit 与源图形 ID 元数据
165
- - 生图占位卡 handoff 记录携带宽高与比例契约
166
- - hook 识别画布协同意图并注入闭环指引
194
+ - 提供 project manifest、ledger append/read/head/verify/rebuild、projection replay API
195
+ - 提供 task claim/heartbeat/release、lease recovery、write-set conflict、lane binding API 与 CLI
196
+ - 提供 context compile/diff/cache/render/reference API,保持 run --context 兼容入口
197
+ - 提供 scoped gate/evidence evaluation 与明确 approval ID 绑定
198
+ - 提供 ReviewModel 业务/工程投影与稳定确认合同
199
+ - 提供 adapter detect/capabilities/install/normalize/render/handoff SPI
200
+ - 提供 Knowledge v3 validate/promote/deprecate/supersede/query 生命周期
201
+ - 提供 upgrade plan/dry-run/backup/atomic apply/restore 与 fleet 安全批处理
202
+ - 提供 registry prune/compact 与测试环境 OPENPRD_HOME 隔离
167
203
  - 非功能需求:
168
- - 界面文案面向普通用户
169
- - API 只监听本地回环地址
170
- - 新增代码有集成测试覆盖
204
+ - Node.js 20.19+,优先零新增运行时依赖,复用现有 YAML 与 Sharp
205
+ - 所有核心写入具备原子替换、revision、幂等键、checksum 和 crash recovery
206
+ - 读取路径默认无业务状态写入;telemetry 与事实真相分离
207
+ - 面向普通用户的默认文案使用简体中文、结果导向且不暴露内部实现术语
208
+ - 新旧 CLI 在一个兼容周期内保持字段与退出码兼容,并标注 deprecated 字段
209
+ - 每个迁移步骤可重复执行、可审计、可单项目回滚
171
210
  - 业务规则:
172
- - 只做已确认四项能力,不扩 UI 引擎替换
173
- - 生图仍走 0.1.18 生图路由,不擅用付费 API
211
+ - Project Ledger 是业务事实唯一真相,Harness 只存运行态,Review/Current/Task/Knowledge Index 是投影
212
+ - 显式 ID 优先于语义和 active change fallback;不能用最近状态猜用户目标
213
+ - 局部 task 成功不因无关 workspace debt 失败;发布、handoff 和 fleet 刷新仍执行项目级门禁
214
+ - Knowledge 必须有作用域、来源和证据;telemetry 不得改变知识正文或检索真相
215
+ - 归档和备份默认不可变;真实刷新范围必须由 inventory 分类而非仅按目录名猜测
216
+ - 版本 0.1.20 验证通过前不得刷新真实项目
174
217
 
175
218
  ## 业务护栏
176
219
 
177
220
  - 成本来源:
178
- - 主要成本是生图调用次数与画布服务本地资源
221
+ - 全量线程与项目扫描、并发压力测试、Review 视觉验证、旧项目备份和批量迁移
222
+ - 重复上下文注入和过宽文档读取造成的 token 与执行时间
179
223
  - 额度与限制:
180
- - 首版按单画布会话协同,不开放批量自动改图
224
+ - 默认 context Capsule 800 tokens,Delta 250 tokens;超预算需可解释裁剪
225
+ - 真实 fleet 按 Home、Projects、Context、活跃 worktree 分批执行,归档不纳入
226
+ - 单项目迁移失败不继续覆盖该项目,也不阻断已经验证成功的其他项目
181
227
  - 滥用防护:
182
- - insert-image 校验锚点与文件存在性,避免脏写
183
- - API 仅本地回环访问
228
+ - 高风险操作绑定明确 lane/operation approval ID,短句确认不能放行其他 lane
229
+ - Symlink 路径、too-new schema、dirty archive 分类不明时拒绝破坏性写入
230
+ - Context 编译进行 secret redaction,Knowledge promotion 需要证据和 reviewer
184
231
  - 监控信号:
185
- - ops.json handoff 记录数、回填成功率、API 错误率
232
+ - context token、cold/warm p50/p95、cache hit、included/excluded reason
233
+ - claim 冲突、lease recovery、CAS conflict、lost update、write-set overlap
234
+ - projection digest、migration digest、rollback result、adapter drift、registry stale count
235
+ - 业务 Review 完成率、需求修订次数、用户可理解性检查与技术词泄漏
186
236
  - 报警阈值:
187
- - 回填连续失败时提示用户检查画布服务状态
237
+ - 任何 lost update、错误项目写入、归档 checksum 变化、secret 泄漏或无法回滚均为阻断
238
+ - Context 超预算、p95 超 SLO、adapter fixture 不一致或 migration 对账不一致阻断真实 fleet
239
+ - 质量报告 productionReady=false 时不得声称整体完成
188
240
  - 止损动作:
189
- - 异常时停止自动回填,保留原画布快照并回退到手动流程
241
+ - 切回 legacy read/storageMode,停止后续批次并按项目 restore preimage
242
+ - 保留失败报告、revision、digest 和 capability gap,不用写死逻辑绕过门禁
243
+ - 对分类不明的归档、副本或 symlink 目标保持只读
190
244
 
191
245
  ## 约束、依赖与风险
192
246
 
193
247
  - 技术约束:
194
- - 沿用 Excalidraw embed 与现有 canvas-sessions 文件存储
195
- - Node 内置测试框架
196
- - 不新增外部依赖
248
+ - 保持现有 CLI、JSONL/JSON workspace Codex/Claude/Cursor 生成路径的向后兼容
249
+ - 当前 git worktree 含既有 i18n 和 unfinished session 修改,必须保留用户改动并分层整合,禁止 reset/stash
250
+ - Repo-local canonical source 与生成文件必须区分,写入前检查任一路径祖先是否为 symlink
251
+ - 测试必须使用隔离 OPENPRD_HOME,禁止污染真实全局 registry
252
+ - Review Studio 改动必须复用现有视觉系统并提供前后、焦点、验证与对齐证据
197
253
  - 合规要求:
198
- - 不写入敏感信息
199
- - 画布数据留在本地项目目录
254
+ - 上下文与日志不得包含 API key、token、账号、个人隐私或未脱敏 prompt 原文
255
+ - 迁移备份只包含当前任务需要的最小文件并保留本机权限,不向外发送
256
+ - 不修改用户归档、远程仓库或生产环境
200
257
  - 依赖:
201
- - 依赖 openprd canvas 本地服务
202
- - 依赖 0.1.18 生图路由协议
258
+ - 现有 OpenPrd CLI、skills、hooks、workspace schema、review renderer、quality/standards/test infrastructure
259
+ - 本机 Node.js、npm 全局软链接与真实 OpenPrd 项目 inventory
260
+ - Codex、Cursor、Claude Code 当前可观测的 runtime capability 与生成协议
203
261
  - 假设:
204
- - 用户接受标注截图作为修改指令载体
205
- - Excalidraw selection 数据足以表达锚定需求
262
+ - 0.1.20 可在不移除 legacy 文件的前提下交付兼容控制平面纵向能力
263
+ - 现有 43 个活跃真实项目与历史 0.1.15/0.1.19 fixture 足以覆盖主要迁移形态
264
+ - Codex、Cursor、Claude Code 平台差异可通过 capability negotiation 明确表达
206
265
  - 风险:
207
- - Excalidraw 与 tldraw 数据模型差异导致锚定语义需要适配
208
- - 标注文字识别依赖 Agent 视觉能力
266
+ - 改造横跨状态、hook、CLI、review、knowledge 与迁移,若没有兼容分层会形成大爆炸式回归
267
+ - 当前 dirty worktree 与语义污染状态可能把既有用户改动误当成稳定基线
268
+ - Home 级 Skill symlink 与通用 skills-sync 可能再次制造跨适配器漂移
269
+ - 全局 registry 已被测试临时目录污染,直接 compact 或 fleet 可能误删仍需的定位索引
270
+ - Review 双投影若没有 canonical digest 会再次产生两套真相
209
271
  - 开放问题:
210
- - 后续是否把画布协同扩展为独立 MCP server 另行评估
272
+ - Ledger 默认读路径在 0.1.20 是否切换到 dual-read,或先保持 legacy-read + shadow ledger;本轮以安全对账结果决定
273
+ - Home 全局 Skill 最终采用 adapter-neutral shared 内容还是让外部 skills-sync 排除 OpenPrd;本轮优先实现兼容 shared 内容与 symlink fence
274
+ - 历史 Documents 归档保持不可变,只验证 scanner 排除,不纳入版本刷新
211
275
 
212
276
  ## 类型专项模块
213
277
 
214
278
  - 类型: Agent 使用场景专项
215
- - humanAgentContract: 标注意图由人给出,修订图生成与回填由 Agent 自动完成;替换原图等破坏性动作仍需人确认。
216
- - autonomyBoundary: Agent 可自动读选区、生成并旁位回填;不得覆盖或删除用户原图与标注。
217
- - toolBoundary: 使用画布本地 HTTP API、生图路由选定的内置生图工具与 OpenPrd CLI。
218
- - stateModel: 画布 scene/selection/ops 文件保存在 .openprd/harness/canvas-sessions/<session-key>/。
219
- - evalPlan: 集成测试覆盖 selection/insert-image/标注导出元数据/hook 引导注入,最终跑 dev-check 与发布前四项验证。
279
+ - humanAgentContract: 用户负责目标、范围和高风险外部动作授权;Agent 可在已授权范围内完成架构实现、测试、迁移、回滚和本地刷新。所有事实变更写入 Ledger,所有运行 ownership 写入 Lane/Task Runtime。
280
+ - autonomyBoundary: 本轮用户明确授权无需中途确认,Agent 可自动处理本地源码和本地 OpenPrd 项目;不得扩展到远程 push、npm publish、生产云写入、归档篡改或敏感信息外发。
281
+ - toolBoundary: 使用当前工作区代码、OpenPrd CLI、测试工具、Product Design 审计与视觉证据、本机只读 inventory;所有文件编辑通过可审计补丁,真实迁移先 dry-run 和备份。
282
+ - stateModel: Project Ledger 记录业务事实;Manifest 记录模型与兼容版本;Lane/Task Runtime 记录临时 ownership;Context Capsule 是只读编译结果;Review、Current、Task Graph、Knowledge Index、Learning 是可重建投影。
283
+ - evalPlan: 使用 characterization、unit、integration、concurrency、crash recovery、migration、rollback、performance、adapter parity、visual comparison、full regression、standards/quality/run/doctor 和真实 fleet readback 逐层验收。
220
284
 
221
285
  ## 交接
222
286
 
223
287
  - 负责人: OpenPrd
224
- - 下一步: 生成 change 与任务拆解后按序实现
225
- - 目标系统: OpenPrd CLI 画布子系统
288
+ - 下一步: 按阶段完成 P0 回归与协议冻结、P1-P8 纵向实现、全量验证、0.1.20 版本升级和真实本地项目分批刷新
289
+ - 目标系统: OpenPrd CLI、当前源码仓库、本机全局集成和所有真实活跃 OpenPrd 项目
@@ -0,0 +1,176 @@
1
+ {
2
+ "diagram": {
3
+ "type": "map",
4
+ "note": "从同一项目事实生成业务和工程两种阅读视图。"
5
+ },
6
+ "mapNodes": {
7
+ "problem": {
8
+ "title": "当前问题",
9
+ "text": "多份状态让上下文重复且目标易错"
10
+ },
11
+ "goal": {
12
+ "title": "升级目标",
13
+ "text": "一次编译精准上下文并安全并发"
14
+ },
15
+ "scope": {
16
+ "title": "本次范围",
17
+ "text": "统一事实、运行态、评审与迁移"
18
+ },
19
+ "flow": {
20
+ "title": "使用流程",
21
+ "text": "识别任务、领取执行、留证沉淀"
22
+ },
23
+ "risk": {
24
+ "title": "主要风险",
25
+ "text": "旧项目和本地改动必须可回滚"
26
+ }
27
+ },
28
+ "flowNodes": [
29
+ {
30
+ "id": "step1",
31
+ "text": "识别项目版本与当前任务"
32
+ },
33
+ {
34
+ "id": "step2",
35
+ "text": "按预算生成上下文并安全执行"
36
+ },
37
+ {
38
+ "id": "step3",
39
+ "text": "验证结果并沉淀可复用知识"
40
+ }
41
+ ],
42
+ "flowEdges": [
43
+ {
44
+ "from": "step1",
45
+ "to": "step2"
46
+ },
47
+ {
48
+ "from": "step2",
49
+ "to": "step3"
50
+ }
51
+ ],
52
+ "panels": {
53
+ "flow": [
54
+ {
55
+ "summary": "优化进入项目",
56
+ "detail": "Agent 先识别项目版本、当前任务和可用能力,只读取本次需要的事实。"
57
+ },
58
+ {
59
+ "summary": "新增安全领取",
60
+ "detail": "多个线程同时工作时先领取任务和文件范围,冲突会明确说明而不是互相覆盖。"
61
+ },
62
+ {
63
+ "summary": "优化执行上下文",
64
+ "detail": "首次提供完整摘要,后续只补变化内容,减少重复阅读和等待。"
65
+ },
66
+ {
67
+ "summary": "新增分级验收",
68
+ "detail": "单个任务先验证自己的结果,阶段和发布再汇总整个项目的健康度。"
69
+ },
70
+ {
71
+ "summary": "新增安全升级",
72
+ "detail": "旧项目先预检和备份,逐个升级;单个项目失败只回滚自己。"
73
+ }
74
+ ],
75
+ "function": [
76
+ {
77
+ "summary": "新增项目账本",
78
+ "detail": "需求、决定、任务和证据都从一份可追溯事实生成,不再由多份当前状态互相覆盖。"
79
+ },
80
+ {
81
+ "summary": "新增并行协调",
82
+ "detail": "任务领取、有效期、文件范围和版本检查共同保障多线程协作。"
83
+ },
84
+ {
85
+ "summary": "优化上下文",
86
+ "detail": "上下文按任务、风险和预算编译,并解释哪些内容被纳入或省略。"
87
+ },
88
+ {
89
+ "summary": "新增双视图",
90
+ "detail": "业务用户先看价值、范围、风险和验收,工程人员从同一结论查看任务与证据。"
91
+ },
92
+ {
93
+ "summary": "优化知识沉淀",
94
+ "detail": "经验有来源、适用范围、有效期和替代关系,过期内容不会继续误导 Agent。"
95
+ },
96
+ {
97
+ "summary": "统一三种工具",
98
+ "detail": "Codex、Cursor 和 Claude Code 使用同一适配合同,并如实说明能力差异。"
99
+ },
100
+ {
101
+ "summary": "新增版本协议",
102
+ "detail": "项目会明确记录可读写版本、迁移历史和回滚信息,避免新旧工具混用误写。"
103
+ }
104
+ ],
105
+ "guardrail": [
106
+ {
107
+ "summary": "限制上下文",
108
+ "detail": "完整摘要和增量摘要都有明确预算,超出时按重要性稳定裁剪。"
109
+ },
110
+ {
111
+ "summary": "保护用户改动",
112
+ "detail": "未提交代码、归档和发布副本不会被静默覆盖或清理。"
113
+ },
114
+ {
115
+ "summary": "隔离敏感信息",
116
+ "detail": "密钥、账号和个人信息不会进入上下文缓存、日志或知识正文。"
117
+ },
118
+ {
119
+ "summary": "保留回退路径",
120
+ "detail": "新账本先与旧状态并行对账,验证失败可以切回旧读取方式。"
121
+ },
122
+ {
123
+ "summary": "保持归档不变",
124
+ "detail": "历史备份只用于兼容验证,不纳入真实版本刷新。"
125
+ }
126
+ ],
127
+ "risk": [
128
+ {
129
+ "summary": "防止整体重写",
130
+ "detail": "升级按原子存储、账本、运行态、上下文、适配、评审和知识逐层切换。"
131
+ },
132
+ {
133
+ "summary": "修复旧状态污染",
134
+ "detail": "新的 v0018 与控制平面 change 取代混入 Canvas 内容的旧快照。"
135
+ },
136
+ {
137
+ "summary": "修复工具漂移",
138
+ "detail": "共享 Skill 内容不再写死某个平台,平台差异留在各自命令和运行能力中。"
139
+ },
140
+ {
141
+ "summary": "清理测试污染",
142
+ "detail": "测试改用隔离的 OpenPrd Home,真实 registry 再经过备份和有效路径校验后压缩。"
143
+ },
144
+ {
145
+ "summary": "防止双重真相",
146
+ "detail": "业务和工程评审共享同一模型摘要,样式变化不会改变已确认的业务结论。"
147
+ }
148
+ ]
149
+ },
150
+ "designDirections": {
151
+ "note": "三种方向均沿用现有 OpenPrd 视觉语言;本轮内部选择双轨证据工作台。",
152
+ "directions": [
153
+ {
154
+ "id": "guided-business-review",
155
+ "title": "业务评审导览",
156
+ "image": ".openprd/design/active/review-studio-v020-directions/crops/01.png",
157
+ "summary": "逐块引导非技术用户完成评审",
158
+ "tradeoff": "最易理解,但工程追溯需要另开入口"
159
+ },
160
+ {
161
+ "id": "dual-evidence-workbench",
162
+ "title": "双轨证据工作台",
163
+ "image": ".openprd/design/active/review-studio-v020-directions/crops/02.png",
164
+ "summary": "同一结论切换业务与工程视角",
165
+ "tradeoff": "兼顾理解与追溯,需控制默认密度"
166
+ },
167
+ {
168
+ "id": "project-cockpit",
169
+ "title": "项目驾驶舱",
170
+ "image": ".openprd/design/active/review-studio-v020-directions/crops/03.png",
171
+ "summary": "一屏掌握项目健康与并行任务",
172
+ "tradeoff": "全局感最强,但超出首版评审范围"
173
+ }
174
+ ]
175
+ }
176
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "version": 1,
3
+ "defaultLanguage": "zh-Hans",
4
+ "supportedLanguages": [
5
+ "zh-Hans",
6
+ "en"
7
+ ],
8
+ "enforceOnDevCheck": true,
9
+ "platforms": [],
10
+ "translationStrategy": "key-value-file",
11
+ "notes": "用户可随时修改此文件来调整默认语言、支持语种和检查策略"
12
+ }
@@ -0,0 +1,6 @@
1
+ {"schema":"openprd.event","version":1,"eventType":"workflow.next","projectId":"project_a63099e6-6438-424c-ac39-49337f485ede","streamId":"workflow:workspace","revision":1,"occurredAt":"2026-07-10T15:49:37.758Z","actor":{"type":"openprd-cli"},"causationId":null,"correlationId":null,"payload":{"type":"next","at":"2026-07-10 23:49:37","nextAction":"freeze","reason":"已有版本化 PRD,交接前应先 freeze。","missingRequiredFields":0},"metadata":{"compatibilityProjection":".openprd/state/events.jsonl","ledgerPosition":1},"eventId":"evt_11631ea88d6fab75bc5c8cafe42f6053"}
2
+ {"schema":"openprd.event","version":1,"eventType":"workflow.next","projectId":"project_a63099e6-6438-424c-ac39-49337f485ede","streamId":"workflow:workspace","revision":2,"occurredAt":"2026-07-10T15:50:35.624Z","actor":{"type":"openprd-cli"},"causationId":null,"correlationId":null,"payload":{"type":"next","at":"2026-07-10 23:50:35","nextAction":"freeze","reason":"已有版本化 PRD,交接前应先 freeze。","missingRequiredFields":0},"metadata":{"compatibilityProjection":".openprd/state/events.jsonl","ledgerPosition":2},"eventId":"evt_8a85b3115c9b80b9fa515af4425266e3"}
3
+ {"schema":"openprd.event","version":1,"eventType":"workflow.next","projectId":"project_a63099e6-6438-424c-ac39-49337f485ede","streamId":"workflow:workspace","revision":3,"occurredAt":"2026-07-10T15:50:54.664Z","actor":{"type":"openprd-cli"},"causationId":null,"correlationId":null,"payload":{"type":"next","at":"2026-07-10 23:50:54","nextAction":"freeze","reason":"已有版本化 PRD,交接前应先 freeze。","missingRequiredFields":0},"metadata":{"compatibilityProjection":".openprd/state/events.jsonl","ledgerPosition":3},"eventId":"evt_ac6e2da11c56e11bb7d9ed5a28235548"}
4
+ {"schema":"openprd.event","version":1,"eventType":"workflow.next","projectId":"project_a63099e6-6438-424c-ac39-49337f485ede","streamId":"workflow:workspace","revision":4,"occurredAt":"2026-07-10T15:50:54.891Z","actor":{"type":"openprd-cli"},"causationId":null,"correlationId":null,"payload":{"type":"next","at":"2026-07-10 23:50:54","nextAction":"freeze","reason":"已有版本化 PRD,交接前应先 freeze。","missingRequiredFields":0},"metadata":{"compatibilityProjection":".openprd/state/events.jsonl","ledgerPosition":4},"eventId":"evt_297d1bb2d4f438b418122ed4784814ce"}
5
+ {"schema":"openprd.event","version":1,"eventType":"workflow.next","projectId":"project_a63099e6-6438-424c-ac39-49337f485ede","streamId":"workflow:workspace","revision":5,"occurredAt":"2026-07-10T15:51:01.843Z","actor":{"type":"openprd-cli"},"causationId":null,"correlationId":null,"payload":{"type":"next","at":"2026-07-10 23:51:01","nextAction":"freeze","reason":"已有版本化 PRD,交接前应先 freeze。","missingRequiredFields":0},"metadata":{"compatibilityProjection":".openprd/state/events.jsonl","ledgerPosition":5},"eventId":"evt_5bab375b038d07987fd886e782ab736b"}
6
+ {"schema":"openprd.event","version":1,"eventType":"workflow.work.units.backfilled","projectId":"project_a63099e6-6438-424c-ac39-49337f485ede","streamId":"workflow:workspace","revision":6,"occurredAt":"2026-07-11T11:23:43.123Z","actor":{"type":"openprd-cli"},"causationId":null,"correlationId":null,"payload":{"type":"work_units_backfilled","at":"2026-07-11 19:23:43","versions":18,"changedVersions":18},"metadata":{"compatibilityProjection":".openprd/state/events.jsonl","ledgerPosition":6},"eventId":"evt_19b2167661a74c24174705119098e339"}