@namewta/speculo 2.0.4 → 2.0.6

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 (89) hide show
  1. package/package.json +1 -1
  2. package/template/canonical/canonical-specdev-goal-plan.md +2272 -1069
  3. package/template/canonical/canonical-specdev-grill-with-docs.md +2164 -661
  4. package/template/canonical/canonical-specdev-spec.md +2163 -660
  5. package/template/canonical/canonical-specdev-tickets.md +2095 -574
  6. package/template/canonical/canonical-specdev-wayfinder.md +2339 -836
  7. package/template/references/coordination/coordination-contract.md +8 -6
  8. package/template/references/coordination/modes/cli.md +1 -1
  9. package/template/references/coordination/modes/herdr.md +2 -2
  10. package/template/references/coordination/modes/orca.md +3 -3
  11. package/template/references/coordination/report-template.md +18 -0
  12. package/template/references/coordination/result-and-recovery.md +4 -4
  13. package/template/references/coordination/session-files.md +49 -56
  14. package/template/references/coordination/task-brief.md +7 -7
  15. package/template/references/coordination/task-template.md +25 -0
  16. package/template/references/retrospective/references/friction-taxonomy.md +1 -1
  17. package/template/references/writing-for-agents/references/project-skill-maintenance.md +29 -0
  18. package/template/references/writing-for-agents/writing-contract.md +2 -0
  19. package/template/workflows/specdev/SKILL.md +1 -1
  20. package/template/workflows/specdev/common/README.md +1 -1
  21. package/template/workflows/specdev/common/rules/artifact-contract.md +1 -1
  22. package/template/workflows/specdev/common/rules/change-completion.md +6 -6
  23. package/template/workflows/specdev/common/rules/domain-runtime.md +2 -2
  24. package/template/workflows/specdev/common/rules/evidence-and-verification.md +17 -34
  25. package/template/workflows/specdev/common/rules/execution-policy.md +24 -16
  26. package/template/workflows/specdev/common/rules/operating-governance.md +1 -1
  27. package/template/workflows/specdev/common/rules/parent-implementation-orchestration.md +4 -2
  28. package/template/workflows/specdev/common/rules/path-ownership.md +9 -7
  29. package/template/workflows/specdev/common/rules/path-reference-contract.md +1 -1
  30. package/template/workflows/specdev/common/rules/workflow-routing.md +1 -1
  31. package/template/workflows/specdev/common/rules/workflow-state-and-lifecycle.md +7 -3
  32. package/template/workflows/specdev/common/schemas/execution-context.schema.json +67 -0
  33. package/template/workflows/specdev/common/schemas/execution-record.schema.json +154 -0
  34. package/template/workflows/specdev/common/schemas/goal-plan.schema.json +15 -55
  35. package/template/workflows/specdev/common/schemas/implementation-plan.schema.json +15 -55
  36. package/template/workflows/specdev/common/schemas/retro-approval.schema.json +44 -0
  37. package/template/workflows/specdev/common/schemas/retro-archive.schema.json +99 -0
  38. package/template/workflows/specdev/common/schemas/retro-execution.schema.json +112 -0
  39. package/template/workflows/specdev/common/schemas/retro-upgrade.schema.json +163 -0
  40. package/template/workflows/specdev/common/schemas/retrospective.schema.json +119 -14
  41. package/template/workflows/specdev/common/schemas/session-locator.schema.json +15 -0
  42. package/template/workflows/specdev/common/skills/code-review/references/review-evidence.md +3 -3
  43. package/template/workflows/specdev/common/skills/code-review/references/source-discovery.md +2 -0
  44. package/template/workflows/specdev/common/skills/code-review/references/working-tree-review.md +1 -1
  45. package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +15 -34
  46. package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +27 -56
  47. package/template/workflows/specdev/common/skills/dev-worktree/references/finalize.md +10 -54
  48. package/template/workflows/specdev/common/tools/README.md +16 -0
  49. package/template/workflows/specdev/common/tools/delivery-artifacts.mjs +5 -5
  50. package/template/workflows/specdev/common/tools/execution-context.mjs +104 -0
  51. package/template/workflows/specdev/common/tools/plan-contract.mjs +3 -1
  52. package/template/workflows/specdev/common/tools/review-evidence.mjs +2 -2
  53. package/template/workflows/specdev/common/tools/tests/engineering.test.mjs +2 -2
  54. package/template/workflows/specdev/common/tools/tests/review-fixture.mjs +4 -4
  55. package/template/workflows/specdev/common/tools/ticket-control.mjs +17 -12
  56. package/template/workflows/specdev/common/tools/validate-handoff.mjs +108 -0
  57. package/template/workflows/specdev/common/tools/validate-retro.mjs +331 -0
  58. package/template/workflows/specdev/common/tools/validate-specdev.mjs +135 -105
  59. package/template/workflows/specdev/specdev-a-archive-and-consolidate/SKILL.md +2 -1
  60. package/template/workflows/specdev/specdev-a-archive-and-consolidate/references/operation-contract.md +2 -0
  61. package/template/workflows/specdev/specdev-a-archive-and-consolidate/references/retro-archive.md +27 -0
  62. package/template/workflows/specdev/specdev-c-code-review/SKILL.md +1 -1
  63. package/template/workflows/specdev/specdev-i-implement/SKILL.md +3 -3
  64. package/template/workflows/specdev/specdev-i-implement/assets/evidence-template.md +39 -31
  65. package/template/workflows/specdev/specdev-i-implement/references/execution-preflight.md +16 -16
  66. package/template/workflows/specdev/specdev-i-implement/references/implementation-procedure.md +21 -37
  67. package/template/workflows/specdev/specdev-i-implement/references/merge-conflict-protocol.md +8 -18
  68. package/template/workflows/specdev/specdev-p-goal-plan/SKILL.md +3 -3
  69. package/template/workflows/specdev/specdev-p-goal-plan/assets/goal-plan-template.md +23 -26
  70. package/template/workflows/specdev/specdev-p-goal-plan/references/completion-control.md +11 -14
  71. package/template/workflows/specdev/specdev-p-goal-plan/references/lead-orchestration.md +12 -33
  72. package/template/workflows/specdev/specdev-p-goal-plan/references/map-control.md +1 -1
  73. package/template/workflows/specdev/specdev-p-goal-plan/references/multi-change-plan.md +11 -16
  74. package/template/workflows/specdev/specdev-p-goal-plan/references/multi-conflict-and-drift.md +2 -2
  75. package/template/workflows/specdev/specdev-p-goal-plan/references/multi-execution-loop.md +6 -6
  76. package/template/workflows/specdev/specdev-p-goal-plan/references/orchestration-protocol.md +13 -44
  77. package/template/workflows/specdev/specdev-p-goal-plan/references/planning-modes.md +18 -25
  78. package/template/workflows/specdev/specdev-p-goal-plan/references/single-change-plan.md +16 -16
  79. package/template/workflows/specdev/specdev-r-retro/SKILL.md +15 -11
  80. package/template/workflows/specdev/specdev-r-retro/assets/retro-template.md +26 -14
  81. package/template/workflows/specdev/specdev-r-retro/assets/upgrade-plan-template.md +41 -0
  82. package/template/workflows/specdev/specdev-r-retro/references/development-retrospective.md +42 -0
  83. package/template/workflows/specdev/specdev-r-retro/references/records.md +47 -0
  84. package/template/workflows/specdev/specdev-r-retro/references/skill-upgrade.md +13 -0
  85. package/template/workflows/specdev/specdev-t-tickets/SKILL.md +2 -0
  86. package/template/workflows/specdev/specdev-t-tickets/assets/ticket-template.md +1 -1
  87. package/template/workflows/specdev/specdev-t-tickets/assets/tickets-map-template.md +6 -6
  88. package/template/workflows/specdev/specdev-t-tickets/references/planning-procedure.md +2 -2
  89. package/template/workflows/specdev/specdev-t-tickets/references/ticket-readiness.md +3 -3
@@ -1,34 +1,21 @@
1
- # 证据与验证规范
1
+ # Evidence 与验证
2
2
 
3
- 验证回答“怎样证明”,Evidence 记录“实际运行了什么、在哪个状态运行、结果和残余风险是什么”。
3
+ I、C、P 验收时读取。环境由 change README 的执行上下文定位,不从票据串并行或 Agent 数量推导。
4
4
 
5
- ## 1. 验证矩阵
5
+ | 检查 | 执行位置 | owner | 证据 |
6
+ |---|---|---|---|
7
+ | 单元、组件、类型、lint/build、正常/失败路径 | change-workspace | 实际实现者 | 原 Ticket/Direct Spec Evidence |
8
+ | 独立双轴审查 | 选定工作区的固定 commit 或工作副本快照 | 未参与本范围实现的 reviewer | 原 Independent Review 与工具核验 |
9
+ | 集成/回归及适用 E2E | change-workspace 的稳定交付输入 | Lead | 命令、退出码、观察、E2E disposition |
10
+ | 整体 AC/Gate | 同一 change 工作区;跨 change 按明确 aggregate 合同 | Lead | 原整体 Evidence |
6
11
 
7
- 每行绑定行为、合同或风险,并标记环境:
12
+ 有提交授权可用实际 commit 固定输入;没有授权时使用 <Path>{roots.workflows}/specdev/common/skills/code-review/references/working-tree-review.md</Path>。快照必须包含本票真实实现范围,保留其他票及用户改动的排除理由。单票通过不代表整个工作区全部通过;最终审查覆盖全部实际交付。
8
13
 
9
- | 行为或风险 | 接缝 | 命令/方法 | 环境 | 预期 | Evidence |
10
- |---|---|---|---|---|---|
11
- | 正常/失败路径 | 公共接口或稳定接缝 | 定向测试 | current-workspace 或 source-worktree | 合同成立 | Ticket Evidence |
12
- | 跨模块回归 | 集成接缝 | 回归命令 | current-workspace 或 parent-candidate | 组合状态成立 | Ticket Evidence |
13
- | E2E required | 真实端到端边界 | 场景步骤 | current-workspace 或 parent-candidate | 外部行为成立 | Ticket Evidence |
14
+ 共享工作区验收前协调相关 writer 停写,测试资源/生成输出独占或明确隔离。Git index 操作串行;当前交付与固定输入、规范或标准不一致时重验受影响项。必需 E2E 未运行/失败不能写 passed,not-required 必须给理由。E2E Gate 仍由 Lead 拥有,不接受执行者自报代替。
14
15
 
15
- ## 2. 两层验证
16
+ Ticket 的 verified 执行记录和 done 状态基于真实改动、AC、检查与独立审查;不要求每票提交、父分支推进或 candidate worktree。Direct Spec 同样逐 AC 验收,不制造票据。明确承诺的 Git/发布交付按原授权单列,失败不伪造成功。
16
17
 
17
- ### Current workspace
18
-
19
- current 模式的 implementation owner 在当前父分支和当前 workspace 工作。Ticket 必须严格串行,workspace clean 后形成非空 implementation commit;Lead 在同一 workspace 执行适用集成/回归和 E2E,并在父 HEAD 未漂移时将 Ticket commit 记录为 result SHA。
20
-
21
- ### Source-worktree
22
-
23
- implementation owner 运行最接近目标行为的单元/组件测试、静态分析、类型、lint/build 等适用非 E2E 检查。来源实现必须在 clean worktree 形成 commit。任何 source-worktree E2E pass 声明无效。
24
-
25
- ### Parent-candidate
26
-
27
- required 模式下,Lead 在最新父分支与 source commit 的 candidate 状态运行受影响集成/回归、项目父状态检查和适用 E2E。E2E 由实际跨边界风险决定,不限于 UI;not-required 必须写理由。required E2E 未运行或失败时不得推进父分支。
28
-
29
- ### Direct Spec
30
-
31
- Direct Spec 按 <Path>{roots.workflows}/specdev/common/rules/execution-policy.md</Path> 独立选择工作区。current 记录实施前基线、最终 checkpoint、dirty 状态和实际检查;required 以整个 change 为单元复用上方 source-worktree/parent-candidate 两层验证,记录真实 source/candidate/result。E2E 仍只由 Lead 执行;两种模式均按完整规格覆盖全部 AC,不伪造 Ticket 或未发生的集成。
18
+ 重复失败按 <Path>{roots.workflows}/specdev/common/rules/execution-policy.md</Path> 保留历史并复盘。恢复读原 Evidence、Git 和工具事实,不从 REPORT completed 或进程退出推断验收通过。
32
19
 
33
20
  低层证据不能替代明确要求的外部行为证据。高风险迁移还需要 dry-run、调用点扫描、数据核对、监控或恢复演练。
34
21
 
@@ -38,21 +25,17 @@ Direct Spec 按 <Path>{roots.workflows}/specdev/common/rules/execution-policy.md
38
25
 
39
26
  ## 4. 失败分类与完整性
40
27
 
41
- 失败分类为本 Ticket 新失败、基线既有失败、环境/权限/基础设施失败、无效验证或 candidate stale。不得通过跳过、放宽断言、吞错、删除用例或迁移验证位置制造绿色。
28
+ 失败分类为本 Ticket 新失败、基线既有失败、环境/权限/基础设施失败、无效验证或 固定输入漂移。不得通过跳过、放宽断言、吞错、删除用例或迁移验证位置制造绿色。
42
29
 
43
30
  受控反向验证只用于可能静默通过的关键门禁:证明检查能在目标风险出现时失败,再恢复并重跑。普通测试不为形式执行破坏性操作。
44
31
 
45
- ## 5. Evidence 最低内容
46
-
47
- 每个 Ticket Evidence 至少包含:Lead、Dispatch/返回(若有)、workspace 策略、base/source/result SHA、candidate 字段(required 模式适用,current 模式明确不适用)、实际路径、每条命令/环境/退出状态、合同映射、双轴审查、E2E disposition、未运行项、失败分类、偏差、残余风险和父分支重读结果。
48
-
49
- required Ticket Done 必须有 source commit、通过 candidate、父分支 result 与 Lead Evidence;current Ticket Done 必须有 implementation commit、通过 direct-parent 验证、父分支 result 与 Lead Evidence。无法运行 required 验证、存在未批准偏差、父分支未包含 Ticket commit 或 Evidence 不完整时不得 Done。
32
+ ## Evidence 最低内容
50
33
 
51
- Direct Spec Evidence 至少包含:用户实际授权与唯一获批规格、执行方式/workspace 选择、Lead、实施前/最终 checkpoint、实际路径、定向/回归/E2E 命令及环境、验收映射、未运行项、偏差、残余风险和提交授权状态;required 还包括原 Workspace Execution Record、候选集成与父分支回读。
34
+ 记录 Lead、实际派遣/返回、唯一 change 工作区引用、基线与实际 checkpoint/快照、真实修改路径、逐命令环境/退出结果、AC 映射、独立双轴审查、E2E disposition、未运行项、失败分类、偏差和残余风险。Direct Spec 同时保留实际授权和唯一获批规格,不制造 Ticket。
52
35
 
53
- 父实现 change 的 Implementation Orchestration Evidence 不能替代子 Evidence。它至少记录最终 Map revision、全部成员最终状态和子证据指针、dependency/serialization 实际顺序、跨 change 合同检查、aggregate 命令/环境/结果、stale candidate 处理、偏差和残余风险。任何成员未 completed 或整体验证未通过时不得形成父完成证据。
36
+ 父 Implementation Orchestration Evidence 不能替代子 Evidence;至少记录最终 Map revision、成员状态/证据引用、dependency/serialization 实际顺序、跨 change 合同检查、aggregate 命令/环境/结果、漂移处置与残余风险。成员未 completed 或整体验证未通过不能完成父 change。
54
37
 
55
- Evidence 原文不出仓库。对 GitHub 的公共投影由 T-triage publish 按公共投影规则生成,不替代本文件的完整记录。
38
+ Evidence 原文不出仓库。对 GitHub 的公共投影由 T-triage publish 按公共投影规则生成,不替代完整记录。
56
39
 
57
40
  ## 6. 按改动选择检查与复用证据
58
41
 
@@ -1,28 +1,36 @@
1
- # 执行方式与工作区
1
+ # 票据调度、Agent 编排与 change 工作区
2
2
 
3
- I 开始实现、P 安排执行和 dev-worktree 创建/恢复时读取。规格、执行方式、工作区独立选择;共同的工具选择与交接协议见 <Path>{roots.references}/coordination/coordination-contract.md</Path>。
3
+ I 开始实现、P 安排执行和 dev-worktree 创建/恢复时读取。三项决定分别记录,互不推导。工具选择和任务交接读取 <Path>{roots.references}/coordination/coordination-contract.md</Path>。
4
4
 
5
5
  ## 输入和选择
6
6
 
7
- - 获批完整 Spec 可直接进入 I;`ready_for_tickets: true` 继续表示规格已就绪,不要求真的拆票。多个行为、公共接口、迁移或高风险不单独构成强制拆票理由,相应设计、批准、验证和恢复门必须完整。
8
- - README 替代独立 Spec 仍限原轻量边界。用户要求独立 Spec/Ticket/Goal 时按要求交付;缺产品决定不能用执行策略补造。
9
- - 独立调度、依赖 DAG 或逐票追踪确有需要才使用 T;跨任务 Gate、跨 change 或用户要求总控时使用 P。已有 Ticket/父实现不能通过转称 Direct Spec 绕过未完成责任;先由原 owner 处置活动执行和证据,再改路由。
10
- - 没有明确执行方式时,按当前宿主正常执行,App、CLI 等均可;工作区默认 `current`。明确指定 CLI 交互、Herdr 等方式时按选择执行;复用已有明确选择,不逐层重问。只读 C 冻结原候选,不创建实现工作区。
11
- - 已有父 Implementation Plan 的 workspace/Gate/上限优先约束子任务;子 Goal 不得放宽。无父计划使用已有 Goal;无 Goal 时由当前 I owner 在原 Evidence 的执行上下文记录方式、workspace 策略、Lead、路径、验证、原授权来源和恢复依据,不创建 Goal。
12
- - 无 Goal 的实现单元默认串行,集成尝试上限为 3;有明确项目约定时记录其来源并复用更严格上限。有效计划、实际存在的执行限制和平台能力取共同上限。不为这些默认值创建 config。
7
+ - 获批完整 Spec 可直接进入 I;`ready_for_tickets: true` 表示规格就绪,不强制拆票。README 替代独立 Spec 仍限原轻量边界;明确要求的 Spec/Ticket/Goal 必须交付。
8
+ - 需要独立调度、DAG 或逐票追踪时使用 T;跨任务 Gate、跨 change 或明确总控请求进入 P。已有活动责任不能通过改称 Direct Spec 绕过,先由原 owner 处置原记录。
9
+ - 票据调度 `ticket_execution: auto | serial | parallel`:默认 auto,由 Agent 按 DAG、写集、语义资源、用户/项目要求和实际能力决定。serial 完成当前票的实现、独立审查和验证后再开始下一票;parallel 允许同时推进独立票,但不强制派遣或绕过前置门。
10
+ - `max_parallel_tickets` 仅在实际要求上限时记录,计量 in_progress/review 票据,不计 Agent。父计划、子计划及 change 约束取共同上限,serial 为一票。没有显式上限时不填固定数字,不创建 config。
11
+ - Agent 编排按用户、项目初始化选择和当前 Work/Skill 的要求决定。一张票可以由 Lead、subagent 或团队完成。`concurrent_implementation_limit` 和现有 config 的 `max_concurrent_implementations` 仅约束实际实现者人数,显式存在才生效;不能用票据数量代替人数或反向推导。宿主限制仍须遵守。Lead 从真实工具状态核对活动人数,历史 implementation_owners 名单不代表当前全部在写,静态校验不能认证运行期人数。
12
+ - 未指定工作区时复用 current,不询问默认选择。用户已选的 workspace/branch 持续有效。父计划引用成员选择,不重新安排其工作区。
13
13
 
14
- ## 工作区
14
+ ## 工作区与写入
15
15
 
16
- `current` 在当前工作副本执行;同一时刻只有一个代码 writer,包括 Lead、原生 subagent/team 和 Herdr 执行者。派出实现任务后 Lead 等待写入结束再接收,测试、审查不读正在漂移的候选。只读任务可以并行。Ticket 继续 direct-parent 验收;Direct Spec 保留实施前/最终 checkpoint、dirty 状态与提交授权,未授权不提交,不伪造已集成。
16
+ 一个 change 使用一个选定工作区,所有 Ticket、Direct Spec、协作者、修复和验证都在这里完成。`workspace_policy: current` 可为 main、普通分支或已在使用的 worktree;`worktree` 表示本 change 明确选择的独立 checkout。需要新建时调用 <Path>{roots.workflows}/specdev/common/skills/dev-worktree/SKILL.md</Path>,默认 locator 为 `specdev-worktree/<change>`,branch 为 `speculo/<change>`。按实际用户选择复用已有工作区。
17
17
 
18
- `required` 对每个独立实现单元创建 source worktree;无票时整个 Direct Spec change 就是一个单元。使用 <Path>{roots.workflows}/specdev/common/skills/dev-worktree/SKILL.md</Path> 的 source → parent-candidate → parent 流程,Lead 拥有集成、适用 E2E 与正式证据。创建前核对实现 commit 和本地集成授权;来源清理仍单独授权。worktree 不构成沙箱或执行锁。
18
+ 串并行、Agent 数量、重试、review 均不新增工作区。额外 worktree 或扩大分支范围必须另有具体授权,不从创建一个 change worktree 的要求继承。
19
19
 
20
- ## 记录与恢复
20
+ 同一工作区可由多个实现者写互不冲突的授权路径。共享路径、API、迁移序列、端口、数据库、生成输出须明确唯一 owner 或串行阶段;worktree 不提供锁或沙箱。Git index、commit、checkout、merge 和改变公共依赖的操作由 Lead 协调串行,任何执行者都不能暂存他人改动。审查和整体测试使用固定输入,冻结前协调相关 writer 停止写入;未知运行状态先查询,不以无报告/超时推断结束。
21
21
 
22
- Ticket 沿用原 Evidence;无票使用 <Path>{roots.state}/specdev/changes/{change}/evidence/direct-spec.md</Path>,其中 `Workspace Execution Record` 的 Direct Spec 记录用 `purpose: direct-spec`、`change` 与 `integration_attempt_limit` 代替 `ticket_id`,其余 workspace/integration 字段沿用现有合同。不允许两种执行记录并存。
22
+ ## 唯一记录与完成
23
23
 
24
- 新建 Direct Spec required 必须记录真实执行对象;current 可以保留原 checkpoint 证据而不制造集成记录,历史无记录 current Evidence 仍可读取。使用结构化 current 记录时必须满足同一 commit/direct-parent 完成门。无论模式,完整 Spec 的完成需要逐 AC 的 Acceptance Verification 与实际双轴审查;未完成或未验证不能标 completed。
24
+ 实际执行开始时,Lead 在 change README 的 `Execution Context` 锚点保存一次工作区事实、基线、owner 和无计划时的调度选择。完整计划拥有票据策略,README 只保留该 change 的实际上下文;工作区只有 README 一个事实源。格式和恢复检查见 <Path>{roots.workflows}/specdev/common/skills/dev-worktree/references/create.md</Path>,current 同样使用该记录而不调用创建操作。纯只读不造执行记录;既有无票 current 证据可按原快照合同读取。
25
25
 
26
- 恢复先核对原 Evidence、实际 writer、Git、候选和权限;未知结果先查询,失败候选不推进父分支。重复同一 blocker 无新证据或达到尝试上限时暂停,Lead 记录下一轮实质变化后才能重试。取消、归档不能抹掉活动 worktree 或未决 candidate。
26
+ 每票原 Evidence 保存自己的 `Workspace Execution Record`,引用 `<Path>{roots.state}/specdev/changes/{change}/README.md</Path>` 的 execution-context 锚点,只记录实际实现者、checkpoint、验证与失败次数;Direct Spec 使用原 evidence/direct-spec.md,不造 Ticket/Map/Goal。使用 <Path>{roots.workflows}/specdev/specdev-i-implement/assets/evidence-template.md</Path>。Lead 是正式状态/Evidence owner,implementation_owners 可有多人。
27
27
 
28
- Direct Spec 整体取消时,原 owner 先按 change-completion 记录真实取消决定、已停止 writer、依赖及 checkpoint/candidate 的保留或交接;这些条件满足后才把本单元记录 status 改为 cancelled。此状态仅适用于 Direct Spec,不表示集成通过或授予清理权限;不能用于 completed。Ticket 状态格式不变。
28
+ 完成以真实改动、AC、独立双轴审查和适用验证为准。未授权提交时使用固定工作副本快照;不要求 empty commit、每票 commit、父分支 result 或额外 candidate checkout。明确承诺的提交、合并、发布等仍按原目标与授权执行;完成声明不得冒充这些动作已发生。整体完成仍按 <Path>{roots.workflows}/specdev/common/rules/change-completion.md</Path>。
29
+
30
+ 验证尝试上限来自有效计划、change 上下文或项目约定,缺省 3,已有 config 的更严格上限继续生效。重复同一 blocker 无新证据或达到上限时,Lead 保留历史并形成实质变化后才能重试;仅换 Agent 不构成恢复。
31
+
32
+ ## 恢复和旧记录
33
+
34
+ 恢复重读 README、原计划、Ticket/Evidence、实际 writer、Git branch/base 和工作区;冲突只暂停受影响分支。取消和归档不删除工作区或未决事实,writer 停止仍需真实证据。
35
+
36
+ 旧 per-Ticket/source/candidate 执行记录仅作历史只读依据。活动旧记录必须由原 owner 显式整理:停止或交接旧 writer,盘点全部 branch/worktree/checkpoint/未决动作,确认本 change 的唯一工作区;没有合并授权不能收拢代码。将旧记录原字节移存原 Evidence 的历史段并保留引用,经核对后才写新上下文和新记录,重新核验失效的审查/验证。不自动删除旧工作区、不批量改 done,不由安装刷新转换。未处置完毕保持 blocked。
@@ -16,7 +16,7 @@
16
16
  11. **本地执行权威**:远程 Issue/PR/URL 只作为来源或完成投影;Spec、Ticket、Map、Goal Plan、Evidence 和状态始终以本地工件为准。
17
17
  12. **完成与归档分离**:本地完成按 change completion 合同决定;远程 close 失败不回滚完成,但必须 reconcile 或 waive 后才归档。
18
18
  13. **Lead 与隔离正交**:Lead 固定拥有原计划、Evidence 与父分支;是否派遣 任务执行者 由 Lead 动态决定。执行方式与工作区按 <Path>{roots.workflows}/specdev/common/rules/execution-policy.md</Path> 独立选择,执行方式默认当前宿主正常执行,工作区默认 current;无 Goal 时由 I 在原 Evidence 承接,已有选择不重复询问。
19
- 14. **策略化验收**:current 模式使用当前 workspace 严格串行、direct-parent 验证;required 模式使用 source worktree 与 parent-candidate。只有 required 模式创建独立实现 worktree,单元可以是 Ticket 或整个 Direct Spec change。
19
+ 14. **策略化验收**:按 <Path>{roots.workflows}/specdev/common/rules/execution-policy.md</Path> 在选定 change 工作区冻结真实输入、完成独立审查和验证。票据串并行不决定工作区或 Agent 拓扑,不强制每票提交/合并。
20
20
  15. **父子权威隔离**:父实现 change 只拥有 Ready 子 change 的组合 Ticket DAG、serialization、全局 workspace/资源和实现进度投影;子 change 继续拥有全部行为与实现合同。一个未完成子 change 只能属于一个未完成父实现 change。
21
21
 
22
22
  共享规则:
@@ -9,7 +9,7 @@
9
9
  ## 权威边界
10
10
 
11
11
  - 父 Implementation Map:成员、组合 Ticket inventory、跨 change dependency/serialization 与 revision 的唯一权威投影。
12
- - 父 Implementation Plan:Lead、全局 workspace 策略、implementation agent/integration attempt 上限、frontier、Wave、locks 和 integration queue 的唯一权威。
12
+ - 父 Implementation Plan:Lead、跨 change ticket_execution、可选票据上限、明确实现者限制、Gate/Wave、serialization 和已授权 Git 交付队列;工作区只引用成员上下文。
13
13
  - 子 change:自己的 Spec、Ticket、内部 Goal Gate、workspace、Git、Evidence 和完成状态的唯一权威。
14
14
 
15
15
  父工件不得复制完整子合同。子权威变化时停止旧派单、递增父 Map revision 并重算父 Plan;不能从旧父投影覆盖子工件。
@@ -20,12 +20,14 @@
20
20
 
21
21
  ## I-implement 调用
22
22
 
23
- 父 Plan 可以替代缺失的子 Goal Plan 提供 workspace/integration 策略和全局执行边界。子 Goal Plan 存在时继续拥有子 change 内 Gate,但不得与父策略冲突。I-implement 完成或阻塞一个组合 Ticket 后返回父 P Goal,不要求用户重新激活 change。
23
+ 父 Plan 可替代缺失的子 Goal 提供跨 change 调度/Gate 和执行边界;子计划的约束同时遵守。成员实际工作区由各自 README 唯一记录,父计划不得覆盖已有选择;完成或阻塞组合票后返回父 P。
24
24
 
25
25
  ## 归档与完成
26
26
 
27
27
  未完成父实现 change 的成员不得归档。成员满足普通 change completion 时可以先 completed,但不自动归档。父 change 只有全部成员 completed、Map/Plan completed、aggregate Evidence 完整且无 active dispatch/candidate/lock 后才能 completed;完成或归档均不自动级联。
28
28
 
29
+ 父完成门逐一重验成员选定工作区的实际交付和最终固定审查输入,不要求先合并成员分支。父聚合双轴审查同时绑定当前 Map、Plan、成员 Spec 与各成员最终 Evidence 的 review-input 锚点;可对这些编排工件使用 source-files 固定快照,但不能替代成员的实现变更审查。成员代码、规格或审查输入变化后,重新核验受影响成员与聚合证据;Git 交付仍只执行具体已授权动作。
30
+
29
31
  ## 局部阻塞不升级为全局停机
30
32
 
31
33
  父创建前仍全部成员预检且 all-or-nothing。父开始运行后,单票 blocked/deviated、他人资源冲突或必需 Skill 失效只阻塞该票及其依赖闭包,父 Map/Plan 可保持 in_progress 与有效的全局执行门,继续独立已授权 frontier。只有共享的全局门禁失败、计划整体失效或没有合法 frontier 时,才将父运行暂停;不得为继续运行接管其他任务。
@@ -20,16 +20,18 @@
20
20
  5. 越界前停止并按 deviation control 提出 ownership change;不得先改后报。
21
21
  6. 上游 Ticket 改变目录/合同后,下游基于已集成父分支重新解析路径和 preflight。
22
22
 
23
- ## 3. Ticket workspace strategy
23
+ ## 3. change 工作区与协作
24
24
 
25
- 按 <Path>{roots.workflows}/specdev/common/rules/execution-policy.md</Path> 选择工作区,与当前宿主执行、显式 CLI 交互或 Herdr 等方式正交。默认 current,已有选择直接复用;无 Goal 时 I 在原 Evidence 负责选择与记录。current 严格单代码 writer,前一 Ticket 完成 commit、Lead 验收和 direct-parent 验证后才进入下一票。required 的 Ticket locator 为 `specdev-worktree/<change>/<ticket-id>`,Direct Spec 为 `specdev-worktree/<change>/direct-spec`,两者都走 candidate 集成;只读调查/审查不创建实现 worktree。
25
+ 按 <Path>{roots.workflows}/specdev/common/rules/execution-policy.md</Path> 独立确定票据调度、Agent 编排与工作区。每个 change 的工作区事实只在 README 执行上下文保存,所有票据和执行者复用;不以同一工作区推导单 writer,也不以并行推导独立 worktree。
26
26
 
27
- workspace/implementation owner 可以是 Lead 或动态 实现执行者;integration owner 固定为 Lead。current 模式 Lead 在父分支直接验收和推进,required 模式 Lead 建立 parent-candidate、运行适用 E2E 并推进父分支。required 生命周期由 `<Path>{roots.workflows}/specdev/common/skills/dev-worktree/SKILL.md</Path>` 管理,current 生命周期由 I-implement 的 direct-parent 规则管理。
27
+ Ticket owner 负责本票交付,可以安排多个执行者并细分授权写集;Lead 参与实现也遵守相同路径边界。SpecDev 状态、Evidence 和最终验收仍由 Lead 写入。只读任务可以并行,不占票据并发数;当前 Work 的独立 reviewer 要求仍生效。
28
28
 
29
- ## 4. 并发
29
+ ## 4. 并发与验收时序
30
30
 
31
- required 模式 实现执行者 上限取实际存在的 Goal/父计划、项目约定和平台能力共同约束,无计划默认串行,Lead 参与实现时计入。current 模式保持单 writer 串行安全不变量,Ticket 严格串行。review/research/test-observation agent 不设置 SpecDev 数字上限,但 Lead 必须避免重复工作与可变环境争用。
31
+ 并行候选必须满足依赖、可写路径、shared owner、语义资源和明确并发限制。冲突操作由 owner 排序,不创建额外 worktree 规避共享语义冲突。单票 serial 不限制该票内部 Agent 合作;同一票多个 Agent 的写集仍不得相撞。
32
32
 
33
- 子 change 属于父 Implementation Map 时,再取父 Implementation Plan 的全局 实现执行者 上限与 workspace 策略;该上限跨全部成员合计。无 dependency 的组合 Ready Tickets 若 writable/shared paths 重叠,也必须在父 Map 建立 serialization。相同 repository/ref 的 parent integration 严格串行;一次父 HEAD 推进会使其他成员旧 candidate 失效。
33
+ Git index/提交/切换分支/合并串行协调;不得提交其他票或用户改动。固定审查输入与整体测试前停止相关 writer,记录真实 checkpoint 或工作副本快照,回读发现漂移后使受影响证据失效。Lead 的 E2E Gate 在选定 change 工作区执行。
34
34
 
35
- **完成标准**:每个项目写入映射到唯一 change、已有 Ticket 或 Direct Spec、owner 和来源 worktree;shared 与父分支写入 owner 唯一。
35
+ 父实现存在时,按组合 ID 协调跨 change 依赖和 serialization;保留每个成员工作区,父票据上限计量 Ticket,已有实现者限制单独执行。跨分支交付若要求合并,按具体授权和 Git 事实串行执行,不由单票 Done 自动触发。
36
+
37
+ **完成标准**:每个写集有唯一票据/实现者归属,所有票据可追溯至该 change 的唯一工作区,审查与验证覆盖真实交付。
@@ -73,7 +73,7 @@ SpecDev 不假定运行时一定提供项目根变量。Ticket、Evidence、诊
73
73
 
74
74
  外部 URL 不能伪装成 SpecDev 内部路径;内部文件也不能用 URL 代替完整 Path 标签。
75
75
 
76
- 历史会话的只读外部 locator 是限定例外:可记录工具返回的“所属主机+原生绝对路径/会话标识”,按 <Path>{roots.references}/coordination/session-files.md</Path> 检索。它不使用内部 Path 标签,不是可移植项目路径、静态能力依赖或写入授权;项目内保存的快照仍使用正常工件路径。
76
+ 历史会话的只读外部 locator 是限定例外:可记录准确确认的原始会话日志绝对路径,按 <Path>{roots.references}/coordination/session-files.md</Path> 检索。它不使用内部 Path 标签,不是可移植项目路径、静态能力依赖或写入授权;新派遣在任务目录的 session-locator.json 中仅记录 path 字段,不复制原日志;既有项目内历史副本保留正常工件路径。
77
77
 
78
78
  ## 5. 工件名称与工件引用
79
79
 
@@ -27,7 +27,7 @@
27
27
 
28
28
  ## 复盘与交付路由
29
29
 
30
- 开发环境/流程复盘 → <Path>{roots.workflows}/specdev/specdev-r-retro/SKILL.md</Path>。代码与参考资料学习 → <Path>{roots.workflows}/specdev/specdev-l-learn/SKILL.md</Path>;可在实现前直接进入,用户未指定 change 时由 L 新建学习载体。Speculo 产品反馈仍为 retro command。CI/安全/PR/包发布 → <Path>{roots.workflows}/specdev/specdev-t-triage/SKILL.md</Path> 的对应模式;确定性修复回到 D/I,不由 T 接管代码。
30
+ 开发环境/流程复盘、积累独立 RETRO,以及明确要求汇总升级项目 Skills → <Path>{roots.workflows}/specdev/specdev-r-retro/SKILL.md</Path>。代码与参考资料学习 → <Path>{roots.workflows}/specdev/specdev-l-learn/SKILL.md</Path>;可在实现前直接进入,用户未指定 change 时由 L 新建学习载体。Speculo 产品反馈仍为 retro command。CI/安全/PR/包发布 → <Path>{roots.workflows}/specdev/specdev-t-triage/SKILL.md</Path> 的对应模式;确定性修复回到 D/I,不由 T 接管代码。
31
31
 
32
32
  长任务在阶段边界按产物与待决问题选择继续、压缩上下文或 handoff;交接只携带准确 owner、SHA、输入和未闭合动作,不硬编码特定模型的上下文阈值,不自动启动其他会话。
33
33
 
@@ -14,7 +14,11 @@ change 的稳定身份是同一项目、领域内的 `YYYY-MM-DD-topic[-NN]` 目
14
14
 
15
15
  归档实际位置和原回执表示封存;不在 README 增加 archived、archive_path 或全局 active/archived 列表。新 archive 不嵌套月份。旧历史移动须另有明确计划,验证所有 locator 和 DESIGN 摘要;不可变正文不做路径替换。
16
16
 
17
- 实际外部派遣的输入、报告和按需历史快照按 <Path>{roots.references}/coordination/session-files.md</Path> 保存在 <Path>{roots.state}/specdev/changes/{change}/sessions/</Path>,随 change 整体归档并进入原完整性清单;归档前仍核对 writer 已停止,不因 REPORT 显示 completed 就移动活动工作区。session 只是交接材料分组,不成为整体 Outcome 或执行状态的第二权威。引用按稳定 change 与对象内 locator 解析,历史原件不回填或清理。
17
+ 实际外部派遣的冻结输入、正式报告与可选会话定位文件按 <Path>{roots.references}/coordination/session-files.md</Path> 保存在 <Path>{roots.state}/specdev/changes/{change}/sessions/</Path>,随 change 整体归档并进入原完整性清单;既有历史副本保持原字节,不再创建新的日志副本;归档前仍核对 writer 已停止,不因 REPORT 显示 completed 就移动活动工作区。session 只是交接材料分组,不成为整体 Outcome 或执行状态的第二权威。引用按稳定 change 与对象内 locator 解析,历史原件不回填或清理。
18
+
19
+ ## 独立开发复盘
20
+
21
+ RETRO 与升级方案使用 <Path>{roots.state}/specdev/retro/</Path>,与 changes、adr、context 平级;具体日期对象、原文来源、确认和执行回执归 <Path>{roots.workflows}/specdev/specdev-r-retro/references/records.md</Path>。R 不创建复盘专用 change,A 通过 RETRO 窄网关移至该目录的 archive。报告不成为 change 的完成依据或永久知识,不预造目录、不维护全局状态镜像。
18
22
 
19
23
  ## 唯一整体结论
20
24
 
@@ -32,9 +36,9 @@ Outcome: active
32
36
 
33
37
  不默认创建 leadership epoch、空批准槽或每 Work 记录。实际交接、并行、worktree/集成发生时,在原计划、Ticket Evidence 或操作回执记录唯一负责者、获批写集、输入、真实交接与下一步。复杂任务 owner 从原 implementation-plan/goal-plan 的 `lead` 读取。无 Goal 且动作确需 owner 时,README 的 `## Ownership` 内保存 `Owner: <session locator>` 与 `Evidence: <对象内相对路径>[#anchor]`,证据指向实际会话/交接;设计 bootstrap 还保存 `Work: specdev/prototype` 且依据正文绑定该 Work。普通只读不预建所有权记录,字段不创造授权。
34
38
 
35
- 每个实现 Ticket 的 Evidence 在 `## Workspace Execution Record` 下以唯一 JSON object 保留实际执行记录(原 worktree 字段),不创建全局 array 镜像;其中保留 base SHA、父分支、workspace/implementation/integration owner、workspace locator、implementation/source checkpoint、candidate/result SHA、验证与 E2E disposition。current 使用 current/direct-parent;required 使用 source/parent-candidate,清理后也保留集成证据。父计划只导航,不另复制一套结果。
39
+ change README 的 Execution Context 是工作区、branch、base 与 Lead 的唯一事实源;实际执行才创建。每票原 Evidence 的 Workspace Execution Record 引用该上下文,保存实际实现者、固定输入、验证与失败历史;无票沿原 Direct Spec Evidence。格式和兼容边界见 <Path>{roots.workflows}/specdev/common/rules/execution-policy.md</Path>。父计划只导航,不复制 workspace 结果。
36
40
 
37
- 语言、用户工具和数量来自当前请求/既有项目说明;实际并发、worktree 与尝试上限由原 Goal/项目约定负责,原 Goal/Implementation Plan 的 `## Execution Policy Source` 说明实际策略来源;已有 config 仍校验相应上限,Lead 自己实现计入并发。旧 config 的真实远程/验证用途可选保留;未知独有字段不能以简化为由丢弃。默认 UI 3 个、配置 2–4、明确用户数量覆盖,均不变。
41
+ 语言、用户工具和数量来自当前请求/既有项目说明。原 Goal/Implementation Plan 的 Execution Policy Source 说明调度来源;票据并发上限与已配置实现者人数限制分别检查。未知 config 独有字段保留;默认 UI 3 个、配置 2–4、明确用户数量覆盖,均不变。
38
42
 
39
43
  ## 创建、恢复和历史边界
40
44
 
@@ -0,0 +1,67 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "urn:speculo:specdev:execution-context:v1",
4
+ "title": "SpecDev change Execution Context",
5
+ "type": "object",
6
+ "required": [
7
+ "schema_version",
8
+ "change",
9
+ "workspace_policy",
10
+ "workspace_ref",
11
+ "branch",
12
+ "base_sha",
13
+ "owner",
14
+ "ticket_execution"
15
+ ],
16
+ "properties": {
17
+ "schema_version": {
18
+ "const": 1
19
+ },
20
+ "change": {
21
+ "type": "string",
22
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"
23
+ },
24
+ "workspace_policy": {
25
+ "enum": [
26
+ "current",
27
+ "worktree"
28
+ ]
29
+ },
30
+ "workspace_ref": {
31
+ "type": "string",
32
+ "minLength": 1
33
+ },
34
+ "branch": {
35
+ "type": "string",
36
+ "minLength": 1
37
+ },
38
+ "base_sha": {
39
+ "type": "string",
40
+ "pattern": "^[a-f0-9]{40}(?:[a-f0-9]{24})?$"
41
+ },
42
+ "owner": {
43
+ "type": "string",
44
+ "minLength": 1
45
+ },
46
+ "ticket_execution": {
47
+ "enum": [
48
+ "auto",
49
+ "serial",
50
+ "parallel"
51
+ ]
52
+ },
53
+ "max_parallel_tickets": {
54
+ "type": "integer",
55
+ "minimum": 1
56
+ },
57
+ "concurrent_implementation_limit": {
58
+ "type": "integer",
59
+ "minimum": 1
60
+ },
61
+ "integration_attempt_limit": {
62
+ "type": "integer",
63
+ "minimum": 1
64
+ }
65
+ },
66
+ "additionalProperties": false
67
+ }
@@ -0,0 +1,154 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "urn:speculo:specdev:execution-record:v1",
4
+ "title": "SpecDev execution evidence",
5
+ "type": "object",
6
+ "required": [
7
+ "schema_version",
8
+ "workspace_context",
9
+ "implementation_owners",
10
+ "status",
11
+ "checkpoint",
12
+ "verification",
13
+ "attempts"
14
+ ],
15
+ "additionalProperties": false,
16
+ "properties": {
17
+ "schema_version": {
18
+ "const": 1
19
+ },
20
+ "ticket_id": {
21
+ "type": "string",
22
+ "pattern": "^T-\\d{2,}$"
23
+ },
24
+ "purpose": {
25
+ "const": "direct-spec"
26
+ },
27
+ "change": {
28
+ "type": "string",
29
+ "minLength": 1
30
+ },
31
+ "workspace_context": {
32
+ "const": "README.md#execution-context"
33
+ },
34
+ "implementation_owners": {
35
+ "type": "array",
36
+ "minItems": 1,
37
+ "uniqueItems": true,
38
+ "items": {
39
+ "type": "string",
40
+ "minLength": 1
41
+ }
42
+ },
43
+ "status": {
44
+ "enum": [
45
+ "active",
46
+ "review",
47
+ "verified",
48
+ "blocked",
49
+ "cancelled"
50
+ ]
51
+ },
52
+ "checkpoint": {
53
+ "type": [
54
+ "string",
55
+ "null"
56
+ ]
57
+ },
58
+ "attempts": {
59
+ "type": "integer",
60
+ "minimum": 0
61
+ },
62
+ "verification": {
63
+ "type": "object",
64
+ "required": [
65
+ "status",
66
+ "evidence",
67
+ "e2e"
68
+ ],
69
+ "properties": {
70
+ "status": {
71
+ "enum": [
72
+ "pending",
73
+ "passed",
74
+ "failed"
75
+ ]
76
+ },
77
+ "evidence": {
78
+ "type": [
79
+ "string",
80
+ "null"
81
+ ]
82
+ },
83
+ "e2e": {
84
+ "type": "object",
85
+ "required": [
86
+ "required",
87
+ "status",
88
+ "reason",
89
+ "evidence"
90
+ ],
91
+ "properties": {
92
+ "required": {
93
+ "type": "boolean"
94
+ },
95
+ "status": {
96
+ "enum": [
97
+ "pending",
98
+ "passed",
99
+ "failed",
100
+ "not-required"
101
+ ]
102
+ },
103
+ "reason": {
104
+ "type": [
105
+ "string",
106
+ "null"
107
+ ]
108
+ },
109
+ "evidence": {
110
+ "type": [
111
+ "string",
112
+ "null"
113
+ ]
114
+ }
115
+ },
116
+ "additionalProperties": false
117
+ }
118
+ },
119
+ "additionalProperties": false
120
+ }
121
+ },
122
+ "oneOf": [
123
+ {
124
+ "required": [
125
+ "ticket_id"
126
+ ],
127
+ "not": {
128
+ "anyOf": [
129
+ {
130
+ "required": [
131
+ "purpose"
132
+ ]
133
+ },
134
+ {
135
+ "required": [
136
+ "change"
137
+ ]
138
+ }
139
+ ]
140
+ }
141
+ },
142
+ {
143
+ "required": [
144
+ "purpose",
145
+ "change"
146
+ ],
147
+ "not": {
148
+ "required": [
149
+ "ticket_id"
150
+ ]
151
+ }
152
+ }
153
+ ]
154
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "urn:speculo:specdev:goal-plan:v7",
3
+ "$id": "urn:speculo:specdev:goal-plan:v8",
4
4
  "title": "SpecDev Goal Plan Frontmatter",
5
5
  "type": "object",
6
6
  "required": [
@@ -11,15 +11,13 @@
11
11
  "modes",
12
12
  "orchestration",
13
13
  "lead",
14
- "concurrent_implementation_limit",
15
14
  "integration_attempt_limit",
16
- "ticket_workspace_policy",
17
- "integration_gate",
18
- "ready_for_execution"
15
+ "ready_for_execution",
16
+ "ticket_execution"
19
17
  ],
20
18
  "properties": {
21
19
  "schema_version": {
22
- "const": 7
20
+ "const": 8
23
21
  },
24
22
  "artifact": {
25
23
  "const": "goal-plan"
@@ -64,61 +62,23 @@
64
62
  "type": "integer",
65
63
  "minimum": 1
66
64
  },
67
- "ticket_workspace_policy": {
68
- "enum": [
69
- "current",
70
- "required"
71
- ]
65
+ "ready_for_execution": {
66
+ "type": "boolean"
72
67
  },
73
- "integration_gate": {
68
+ "ticket_execution": {
74
69
  "enum": [
75
- "direct-parent",
76
- "candidate-merge"
77
- ]
70
+ "auto",
71
+ "serial",
72
+ "parallel"
73
+ ],
74
+ "default": "auto"
78
75
  },
79
- "ready_for_execution": {
80
- "type": "boolean"
76
+ "max_parallel_tickets": {
77
+ "type": "integer",
78
+ "minimum": 1
81
79
  }
82
80
  },
83
81
  "allOf": [
84
- {
85
- "if": {
86
- "properties": {
87
- "ticket_workspace_policy": {
88
- "const": "current"
89
- }
90
- },
91
- "required": [
92
- "ticket_workspace_policy"
93
- ]
94
- },
95
- "then": {
96
- "properties": {
97
- "integration_gate": {
98
- "const": "direct-parent"
99
- }
100
- }
101
- }
102
- },
103
- {
104
- "if": {
105
- "properties": {
106
- "ticket_workspace_policy": {
107
- "const": "required"
108
- }
109
- },
110
- "required": [
111
- "ticket_workspace_policy"
112
- ]
113
- },
114
- "then": {
115
- "properties": {
116
- "integration_gate": {
117
- "const": "candidate-merge"
118
- }
119
- }
120
- }
121
- },
122
82
  {
123
83
  "if": {
124
84
  "properties": {