ws-spec-kit 0.1.0-beta.0 → 0.1.0-beta.2

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 (75) hide show
  1. package/README.md +2 -2
  2. package/dist/adapters/cli/workflow.js +11 -1
  3. package/dist/adapters/cli/workflow.js.map +1 -1
  4. package/dist/application/acquire.js +40 -25
  5. package/dist/application/acquire.js.map +1 -1
  6. package/dist/application/artifact.js +8 -4
  7. package/dist/application/artifact.js.map +1 -1
  8. package/dist/application/snapshot.d.ts +2 -1
  9. package/dist/application/snapshot.js +5 -1
  10. package/dist/application/snapshot.js.map +1 -1
  11. package/dist/application/start.js +26 -42
  12. package/dist/application/start.js.map +1 -1
  13. package/dist/application/state.d.ts +1 -0
  14. package/dist/application/state.js +7 -46
  15. package/dist/application/state.js.map +1 -1
  16. package/dist/application/submit.js +17 -4
  17. package/dist/application/submit.js.map +1 -1
  18. package/dist/cli/main.js +1 -1
  19. package/dist/domain/digests.d.ts +1 -1
  20. package/dist/domain/digests.js +27 -3
  21. package/dist/domain/digests.js.map +1 -1
  22. package/dist/domain/workflow.d.ts +2 -1
  23. package/dist/engine/approvals.js +29 -19
  24. package/dist/engine/approvals.js.map +1 -1
  25. package/dist/engine/archive.d.ts +1 -0
  26. package/dist/engine/archive.js +9 -4
  27. package/dist/engine/archive.js.map +1 -1
  28. package/dist/engine/compiler.js +2 -1
  29. package/dist/engine/compiler.js.map +1 -1
  30. package/dist/engine/scheduler.js +3 -9
  31. package/dist/engine/scheduler.js.map +1 -1
  32. package/dist/engine/verification.d.ts +6 -0
  33. package/dist/engine/verification.js +12 -3
  34. package/dist/engine/verification.js.map +1 -1
  35. package/dist/protocol/public-contract.d.ts +6 -6
  36. package/dist/protocol/public-contract.js +5 -5
  37. package/dist/protocol/public-contract.js.map +1 -1
  38. package/dist/protocol/work-package.d.ts +5 -0
  39. package/dist/registry/connectors/requirement-source.d.ts +3 -1
  40. package/dist/registry/connectors/requirement-source.js +9 -4
  41. package/dist/registry/connectors/requirement-source.js.map +1 -1
  42. package/dist/registry/skills/resolver.d.ts +3 -1
  43. package/dist/registry/skills/resolver.js +3 -2
  44. package/dist/registry/skills/resolver.js.map +1 -1
  45. package/dist/schemas/definitions.js +7 -2
  46. package/dist/schemas/definitions.js.map +1 -1
  47. package/dist/storage/control-plane.d.ts +12 -0
  48. package/dist/storage/control-plane.js +49 -8
  49. package/dist/storage/control-plane.js.map +1 -1
  50. package/dist/storage/repository.d.ts +1 -0
  51. package/dist/storage/repository.js +21 -4
  52. package/dist/storage/repository.js.map +1 -1
  53. package/dist/storage/work-items.d.ts +8 -1
  54. package/dist/storage/work-items.js +150 -35
  55. package/dist/storage/work-items.js.map +1 -1
  56. package/dist/workflow-package/types.d.ts +2 -0
  57. package/dist/workflow-package/types.js.map +1 -1
  58. package/dist/workflow-package/workflow-v1.js +4 -2
  59. package/dist/workflow-package/workflow-v1.js.map +1 -1
  60. package/package.json +1 -1
  61. package/resources/catalog.yaml +9 -9
  62. package/resources/skills/bug-fixing/SKILL.md +18 -6
  63. package/resources/skills/code-review/SKILL.md +18 -6
  64. package/resources/skills/documentation-editing/SKILL.md +14 -6
  65. package/resources/skills/documentation-exploration/SKILL.md +14 -6
  66. package/resources/skills/documentation-review/SKILL.md +17 -6
  67. package/resources/skills/requirement-exploration/SKILL.md +20 -6
  68. package/resources/skills/solution-design/SKILL.md +18 -6
  69. package/resources/skills/task-planning/SKILL.md +18 -6
  70. package/resources/skills/tdd-implementation/SKILL.md +27 -7
  71. package/resources/workflows/documentation-delivery/workflow.yaml +15 -0
  72. package/resources/workflows/feature-delivery/workflow.yaml +18 -0
  73. package/schemas/builtin-agent-action-v1.schema.json +20 -0
  74. package/schemas/builtin-work-item-v1.schema.json +4 -2
  75. package/schemas/builtin-work-package-v1.schema.json +20 -0
@@ -1,16 +1,24 @@
1
1
  ---
2
2
  name: documentation-editing
3
- description: 编辑中文文档
3
+ description: 按事实编辑中文文档。用于 edit-document:只改允许路径,句子能指回事实。
4
4
  ---
5
5
 
6
6
  # 编辑中文文档
7
7
 
8
- 目标:编辑中文文档。
8
+ 改文档是在更新缓存。每个陈述句都要指回已确认事实。
9
9
 
10
- 输入:事实清单和文档目标。
10
+ ## 步骤
11
11
 
12
- 输出:准确、完整的文档变更。
12
+ 1. **读事实清单**
13
+ 完成:知道增、删、改哪几句。
13
14
 
14
- 停止条件:缺少必要事实、授权或前置产物时停止并报告阻塞。
15
+ 2. **只改允许路径**
16
+ 在 `allowedPaths` 内编辑中文正文。完成:diff 不含代码、配置或范围外文件。
15
17
 
16
- 禁止副作用:不得自行提交、推送、写入外部系统或扩大允许修改路径。
18
+ 3. **交文档变更**
19
+ 完成:新增句都能指证;过时句已删或已改。
20
+
21
+ ## 规则
22
+
23
+ - 先写清完成标准,再堆解释。
24
+ - 范围外或事实不足:停止并报告阻塞。
@@ -1,16 +1,24 @@
1
1
  ---
2
2
  name: documentation-exploration
3
- description: 探索文档事实
3
+ description: 探索文档事实。用于文档 explore:只收录仓库与原文里能指证的事实。
4
4
  ---
5
5
 
6
6
  # 探索文档事实
7
7
 
8
- 目标:探索文档事实。
8
+ 文档只陈述能指证的事实。代码、配置、帮助输出是真源;旧文档是待核缓存。
9
9
 
10
- 输入:文档目标和仓库事实。
10
+ ## 步骤
11
11
 
12
- 输出:事实清单与文档范围。
12
+ 1. **钉范围**
13
+ 读允许的文档路径与目标。完成:知道哪些文件能改。
13
14
 
14
- 停止条件:缺少必要事实、授权或前置产物时停止并报告阻塞。
15
+ 2. **对事实**
16
+ 每条将写入的句子都能指到源文件、命令或已确认原文。完成:过时文档被标成缓存,不当新事实。
15
17
 
16
- 禁止副作用:不得自行提交、推送、写入外部系统或扩大允许修改路径。
18
+ 3. **交事实清单**
19
+ 写出现状、缺口、过时句。完成:编辑者不用再猜 API 或行为。
20
+
21
+ ## 规则
22
+
23
+ - 查得到的不抄进清单当永久正文,只记「到哪查」。
24
+ - 事实对不上:停止并报告阻塞。
@@ -1,16 +1,27 @@
1
1
  ---
2
2
  name: documentation-review
3
- description: 审查文档质量
3
+ description: 审查文档。用于文档 review:核对准确性与完整性,不改文件。
4
4
  ---
5
5
 
6
6
  # 审查文档质量
7
7
 
8
- 目标:审查文档质量。
8
+ 对照事实清单审 diff。准确且完整才能批准。
9
9
 
10
- 输入:文档变更和事实来源。
10
+ ## 步骤
11
11
 
12
- 输出:准确性、完整性审查结果。
12
+ 1. **钉变更**
13
+ 读允许路径内的 diff 与事实清单。完成:每处改动都已看见。
13
14
 
14
- 停止条件:缺少必要事实、授权或前置产物时停止并报告阻塞。
15
+ 2. **审准确**
16
+ 句子不得与代码、配置或原文冲突。完成:过时或臆造句都是 finding。
15
17
 
16
- 禁止副作用:不得自行提交、推送、写入外部系统或扩大允许修改路径。
18
+ 3. **审完整**
19
+ 事实清单里要公开的点都有落点。完成:缺口都列出来。
20
+
21
+ 4. **交审查结果**
22
+ 完成:`approved` 仅在准确且完整时为真。
23
+
24
+ ## 规则
25
+
26
+ - 不改文档。修复走 documentation-editing。
27
+ - 事实对不上:停止并报告阻塞。
@@ -1,16 +1,30 @@
1
1
  ---
2
2
  name: requirement-exploration
3
- description: 探索代码与需求
3
+ description: 探索代码与需求。用于 explore/clarify:grill 未决决策、从仓库取事实、写出规格。
4
4
  ---
5
5
 
6
6
  # 探索代码与需求
7
7
 
8
- 目标:探索代码与需求。
8
+ 事实从仓库取;决策问用户。未证实的业务当缺口,不当规格。
9
9
 
10
- 输入:需求描述和仓库状态。
10
+ ## 步骤
11
11
 
12
- 输出:澄清问题与需求规格。
12
+ 1. **读 Work Package**
13
+ 记下 `requiredOutputs`、允许路径、已有 Artifact。完成:能复述本步要交的 `outputId`。
13
14
 
14
- 停止条件:缺少必要事实、授权或前置产物时停止并报告阻塞。
15
+ 2. **取事实**
16
+ 顺着调用链读现有模块、配置、测试和 Issue/规格原文。完成:每条约束都能指到文件或原文,没有猜的 API。
15
17
 
16
- 禁止副作用:不得自行提交、推送、写入外部系统或扩大允许修改路径。
18
+ 3. **摊 frontier**
19
+ 一次列出所有已解锁、必须人答的决策。完成:没有「先假设再继续」的开放问题。
20
+
21
+ 4. **交产物**
22
+ - explore:写 `exploration-report`(现状、约束、缺口、风险信号)。
23
+ - clarify:只把已确认事实写成 `specification`。
24
+ 完成:产物覆盖 `requiredOutputs`,缺口标成阻塞而不是默认值。
25
+
26
+ ## 规则
27
+
28
+ - 一轮问完当前 frontier,等答复再写规格。
29
+ - 风险信号(外部写入、密钥、跨仓、破坏兼容)写进报告,供 Profile 升级,不在这里改档。
30
+ - 缺授权、缺原文或路径越界:停止并报告阻塞。
@@ -1,16 +1,28 @@
1
1
  ---
2
2
  name: solution-design
3
- description: 设计技术方案
3
+ description: 设计可实施的技术方案。用于 design:在已确认规格上选 seam、写取舍。
4
4
  ---
5
5
 
6
6
  # 设计技术方案
7
7
 
8
- 目标:设计技术方案。
8
+ 设计对着已确认规格,不发明需求。优先加深现有模块,不平行再造一套。
9
9
 
10
- 输入:已确认需求和代码事实。
10
+ ## 步骤
11
11
 
12
- 输出:方案文档与取舍。
12
+ 1. **钉规格**
13
+ 读 `specification` 与探索报告。完成:每个要动的行为都能指回规格句子。
13
14
 
14
- 停止条件:缺少必要事实、授权或前置产物时停止并报告阻塞。
15
+ 2. **找 seam**
16
+ 标出将要切开的公共边界(入口、配置、Gate、适配器)。完成:能一句话说清「外面看见什么,里面藏什么」。
15
17
 
16
- 禁止副作用:不得自行提交、推送、写入外部系统或扩大允许修改路径。
18
+ 3. **写取舍**
19
+ 每个关键缝至少两个真方案,写清为何选这个。完成:落选方案有具体代价,不是空对比。
20
+
21
+ 4. **交 `design`**
22
+ 写模块形状、数据流、失败方式和验证点。完成:实现者不用再猜接口;测试能钉在这些 seam 上。
23
+
24
+ ## 规则
25
+
26
+ - 非法状态用类型消掉,不在调用点反复校验。
27
+ - 不扩允许路径,不引入未声明的外部写入。
28
+ - 规格未决:停止并报告阻塞,不把设计当拍板。
@@ -1,16 +1,28 @@
1
1
  ---
2
2
  name: task-planning
3
- description: 拆分实施任务
3
+ description: 把设计拆成可验证任务。用于 plan:tracer-bullet、声明阻塞边。
4
4
  ---
5
5
 
6
6
  # 拆分实施任务
7
7
 
8
- 目标:拆分实施任务。
8
+ 一张任务做一件可观察行为。先做挡住别人的,再做被挡住的。
9
9
 
10
- 输入:批准方案。
10
+ ## 步骤
11
11
 
12
- 输出:按依赖排序的可验证任务。
12
+ 1. **读设计**
13
+ 对照 `specification` 与 `design`。完成:每个任务能指回一个设计缝或规格条款。
13
14
 
14
- 停止条件:缺少必要事实、授权或前置产物时停止并报告阻塞。
15
+ 2. **切 tracer**
16
+ 按可独立验证的行为切开,写下阻塞边。完成:没有「做完功能 X」这种大篮子;环被拆开。
15
17
 
16
- 禁止副作用:不得自行提交、推送、写入外部系统或扩大允许修改路径。
18
+ 3. **标验证**
19
+ 每个任务写清红测会看见什么。完成:验收是命令或断言,不是「看起来对」。
20
+
21
+ 4. **交 `tasks`**
22
+ 按阻塞序排列。完成:实现者可以一次只拿一张任务,不必回头猜依赖。
23
+
24
+ ## 规则
25
+
26
+ - 实现与其测试是同一张任务。
27
+ - 目录不同且可独立回滚的,拆开。
28
+ - 设计缺口:停止并报告阻塞。
@@ -1,16 +1,36 @@
1
1
  ---
2
2
  name: tdd-implementation
3
- description: 执行测试驱动实现
3
+ description: 测试驱动实现。用于 write-tests/implement:先 red,再最小 green。钉在公开 seam。
4
4
  ---
5
5
 
6
- # 执行测试驱动实现
6
+ # 测试驱动实现
7
7
 
8
- 目标:执行测试驱动实现。
8
+ 先 red,再 green。测公开 seam,不测私有结构。
9
9
 
10
- 输入:当前任务和验收条件。
10
+ ## write-tests
11
11
 
12
- 输出:Red、Green 与实现结果。
12
+ 1. **钉一张任务**
13
+ 只取当前 `tasks` 中未完成的第一张。完成:知道这条红测失败时证明什么。
13
14
 
14
- 停止条件:缺少必要事实、授权或前置产物时停止并报告阻塞。
15
+ 2. **写红测**
16
+ Given / When / Then;期望值来自规格或字面量,不从实现反推。完成:跑项目 Test Gate 时因**断言**失败,不是缺模块或语法错。
15
17
 
16
- 禁止副作用:不得自行提交、推送、写入外部系统或扩大允许修改路径。
18
+ 3. **交 `red-test-result`**
19
+ 完成:写明测了哪条行为、失败种类是 assertion。
20
+
21
+ ## implement
22
+
23
+ 1. **保住红测**
24
+ 不删、不放宽、不改断言含义。完成:红测文件身份仍是 verify-red 绑过的那批。
25
+
26
+ 2. **最小 green**
27
+ 只写让这条红测通过的代码。完成:同一 Test Gate 退出码为 0,且红测仍在。
28
+
29
+ 3. **交 `implementation-result`**
30
+ 完成:列出改动的 seam,没有顺手做下一张任务。
31
+
32
+ ## 规则
33
+
34
+ - 一次一条。下一条是下一轮 red。
35
+ - Mock 是最后手段。能用真实对象、内存 fake 或 Test Gate 就不要 mock。
36
+ - 缺完整 Test Gate、红测不是 assertion、或路径越界:停止并报告阻塞。
@@ -8,11 +8,13 @@ inputs:
8
8
  steps:
9
9
  - id: intake
10
10
  uses: connector.execute
11
+ workspace: read-only
11
12
  action: requirement.capture
12
13
  inputs: [requirement-source]
13
14
  outputs: [requirement-source]
14
15
  - id: explore
15
16
  uses: agent.execute
17
+ workspace: read-only
16
18
  needs: [intake]
17
19
  inputs: [requirement-source]
18
20
  skills:
@@ -21,6 +23,7 @@ steps:
21
23
  outputs: [documentation-context]
22
24
  - id: clarify
23
25
  uses: agent.execute
26
+ workspace: read-only
24
27
  needs: [explore]
25
28
  inputs: [documentation-context]
26
29
  skills:
@@ -29,6 +32,7 @@ steps:
29
32
  outputs: [specification]
30
33
  - id: plan
31
34
  uses: agent.execute
35
+ workspace: read-only
32
36
  needs: [clarify]
33
37
  inputs: [specification]
34
38
  skills:
@@ -37,6 +41,7 @@ steps:
37
41
  outputs: [tasks]
38
42
  - id: edit-document
39
43
  uses: agent.execute
44
+ workspace: isolated-worktree
40
45
  actorRole: implementation
41
46
  needs: [plan]
42
47
  inputs: [tasks]
@@ -46,12 +51,14 @@ steps:
46
51
  outputs: [documentation-result]
47
52
  - id: verify-document
48
53
  uses: command.execute
54
+ workspace: isolated-worktree
49
55
  action: quality.docs.integrity
50
56
  needs: [edit-document]
51
57
  inputs: [documentation-result]
52
58
  outputs: [documentation-evidence]
53
59
  - id: review-fix
54
60
  uses: control.loop
61
+ workspace: isolated-worktree
55
62
  needs: [verify-document]
56
63
  inputs: [documentation-evidence]
57
64
  until: ${artifacts.review-result.approved}
@@ -59,6 +66,7 @@ steps:
59
66
  steps:
60
67
  - id: review
61
68
  uses: agent.execute
69
+ workspace: isolated-worktree
62
70
  actorRole: review
63
71
  skills:
64
72
  - ref: builtin://skills/documentation-review
@@ -66,6 +74,7 @@ steps:
66
74
  outputs: [review-result]
67
75
  - id: fix
68
76
  uses: agent.execute
77
+ workspace: isolated-worktree
69
78
  actorRole: fix
70
79
  when: ${artifacts.review-result.approved == false}
71
80
  skills:
@@ -73,32 +82,38 @@ steps:
73
82
  required: true
74
83
  - id: verify
75
84
  uses: command.execute
85
+ workspace: isolated-worktree
76
86
  action: quality.docs.integrity
77
87
  - id: commit
78
88
  uses: connector.execute
89
+ workspace: isolated-worktree
79
90
  action: git.commit
80
91
  needs: [review-fix]
81
92
  approval: required
82
93
  - id: update-issue
83
94
  uses: connector.execute
95
+ workspace: read-only
84
96
  action: issue.update
85
97
  needs: [commit]
86
98
  inputs: [documentation-result]
87
99
  when: ${bindings.issue.exists}
88
100
  - id: update-wiki
89
101
  uses: connector.execute
102
+ workspace: read-only
90
103
  action: knowledge.publish
91
104
  needs: [update-issue]
92
105
  inputs: [documentation-result]
93
106
  when: ${bindings.knowledge.exists}
94
107
  - id: close-issue
95
108
  uses: connector.execute
109
+ workspace: read-only
96
110
  action: issue.close
97
111
  needs: [update-wiki]
98
112
  when: ${bindings.issue.exists}
99
113
  approval: required
100
114
  - id: close
101
115
  uses: control.close
116
+ workspace: read-only
102
117
  needs: [close-issue]
103
118
  gates:
104
119
  - id: docs.integrity
@@ -8,11 +8,13 @@ inputs:
8
8
  steps:
9
9
  - id: intake
10
10
  uses: connector.execute
11
+ workspace: read-only
11
12
  action: requirement.capture
12
13
  inputs: [requirement-source]
13
14
  outputs: [requirement-source]
14
15
  - id: explore
15
16
  uses: agent.execute
17
+ workspace: read-only
16
18
  needs: [intake]
17
19
  inputs: [requirement-source]
18
20
  objective: 探索代码并提取需求相关约束
@@ -22,6 +24,7 @@ steps:
22
24
  outputs: [exploration-report]
23
25
  - id: clarify
24
26
  uses: agent.execute
27
+ workspace: read-only
25
28
  needs: [explore]
26
29
  inputs: [exploration-report]
27
30
  objective: 澄清需求并生成可验收规格
@@ -32,6 +35,7 @@ steps:
32
35
  approval: required
33
36
  - id: design
34
37
  uses: agent.execute
38
+ workspace: read-only
35
39
  needs: [clarify]
36
40
  inputs: [specification]
37
41
  objective: 形成可实施的技术方案
@@ -42,6 +46,7 @@ steps:
42
46
  approval: required
43
47
  - id: plan
44
48
  uses: agent.execute
49
+ workspace: read-only
45
50
  needs: [clarify, design]
46
51
  objective: 将设计拆分为可验证任务
47
52
  skills:
@@ -55,6 +60,7 @@ steps:
55
60
  required: false
56
61
  - id: write-tests
57
62
  uses: agent.execute
63
+ workspace: isolated-worktree
58
64
  needs: [plan]
59
65
  inputs: [tasks]
60
66
  objective: 根据当前任务先编写能够因缺少功能而失败的测试
@@ -64,6 +70,7 @@ steps:
64
70
  outputs: [red-test-result]
65
71
  - id: verify-red
66
72
  uses: command.execute
73
+ workspace: isolated-worktree
67
74
  action: quality.test
68
75
  expectedOutcome: test-failure
69
76
  needs: [write-tests]
@@ -71,6 +78,7 @@ steps:
71
78
  outputs: [red-evidence]
72
79
  - id: implement
73
80
  uses: agent.execute
81
+ workspace: isolated-worktree
74
82
  actorRole: implementation
75
83
  needs: [verify-red]
76
84
  inputs: [tasks]
@@ -81,6 +89,7 @@ steps:
81
89
  outputs: [implementation-result]
82
90
  - id: verify-green
83
91
  uses: command.execute
92
+ workspace: isolated-worktree
84
93
  action: quality.test
85
94
  expectedOutcome: success
86
95
  needs: [implement]
@@ -88,12 +97,14 @@ steps:
88
97
  outputs: [tdd-evidence]
89
98
  - id: review-fix
90
99
  uses: control.loop
100
+ workspace: isolated-worktree
91
101
  needs: [verify-green]
92
102
  until: ${artifacts.review-result.approved}
93
103
  maxIterations: 5
94
104
  steps:
95
105
  - id: review
96
106
  uses: agent.execute
107
+ workspace: isolated-worktree
97
108
  actorRole: review
98
109
  skills:
99
110
  - ref: builtin://skills/code-review
@@ -101,6 +112,7 @@ steps:
101
112
  outputs: [review-result]
102
113
  - id: fix
103
114
  uses: agent.execute
115
+ workspace: isolated-worktree
104
116
  actorRole: fix
105
117
  when: ${artifacts.review-result.approved == false}
106
118
  skills:
@@ -108,32 +120,38 @@ steps:
108
120
  required: true
109
121
  - id: verify
110
122
  uses: command.execute
123
+ workspace: isolated-worktree
111
124
  action: quality.verify
112
125
  - id: commit
113
126
  uses: connector.execute
127
+ workspace: isolated-worktree
114
128
  action: git.commit
115
129
  needs: [review-fix]
116
130
  approval: required
117
131
  - id: update-issue
118
132
  uses: connector.execute
133
+ workspace: read-only
119
134
  action: issue.update
120
135
  needs: [commit]
121
136
  inputs: [implementation-result]
122
137
  when: ${bindings.issue.exists}
123
138
  - id: update-wiki
124
139
  uses: connector.execute
140
+ workspace: read-only
125
141
  action: knowledge.publish
126
142
  needs: [update-issue]
127
143
  inputs: [implementation-result]
128
144
  when: ${bindings.knowledge.exists}
129
145
  - id: close-issue
130
146
  uses: connector.execute
147
+ workspace: read-only
131
148
  action: issue.close
132
149
  needs: [update-wiki]
133
150
  when: ${bindings.issue.exists}
134
151
  approval: required
135
152
  - id: close
136
153
  uses: control.close
154
+ workspace: read-only
137
155
  needs: [close-issue]
138
156
  gates:
139
157
  - id: test
@@ -21,6 +21,7 @@
21
21
  "workItemId",
22
22
  "stepId",
23
23
  "attemptId",
24
+ "workspace",
24
25
  "lease",
25
26
  "objective",
26
27
  "skills",
@@ -46,6 +47,25 @@
46
47
  "type": "string",
47
48
  "pattern": "^attempt-.+$"
48
49
  },
50
+ "workspace": {
51
+ "type": "object",
52
+ "additionalProperties": false,
53
+ "required": [
54
+ "mode",
55
+ "materialized"
56
+ ],
57
+ "properties": {
58
+ "mode": {
59
+ "enum": [
60
+ "read-only",
61
+ "isolated-worktree"
62
+ ]
63
+ },
64
+ "materialized": {
65
+ "type": "boolean"
66
+ }
67
+ }
68
+ },
49
69
  "lease": {
50
70
  "type": "object",
51
71
  "additionalProperties": false,
@@ -58,8 +58,7 @@
58
58
  "baselineRevision",
59
59
  "baselineTreeDigest",
60
60
  "workflowDigest",
61
- "configDigest",
62
- "schemaDigest"
61
+ "configDigest"
63
62
  ],
64
63
  "properties": {
65
64
  "worktree": {
@@ -70,6 +69,9 @@
70
69
  "type": "string",
71
70
  "minLength": 1
72
71
  },
72
+ "materialized": {
73
+ "type": "boolean"
74
+ },
73
75
  "baselineRevision": {
74
76
  "type": "string",
75
77
  "minLength": 1
@@ -8,6 +8,7 @@
8
8
  "workItemId",
9
9
  "stepId",
10
10
  "attemptId",
11
+ "workspace",
11
12
  "lease",
12
13
  "objective",
13
14
  "skills",
@@ -33,6 +34,25 @@
33
34
  "type": "string",
34
35
  "pattern": "^attempt-.+$"
35
36
  },
37
+ "workspace": {
38
+ "type": "object",
39
+ "additionalProperties": false,
40
+ "required": [
41
+ "mode",
42
+ "materialized"
43
+ ],
44
+ "properties": {
45
+ "mode": {
46
+ "enum": [
47
+ "read-only",
48
+ "isolated-worktree"
49
+ ]
50
+ },
51
+ "materialized": {
52
+ "type": "boolean"
53
+ }
54
+ }
55
+ },
36
56
  "lease": {
37
57
  "type": "object",
38
58
  "additionalProperties": false,