@harmonyos-arkts/d2h 0.1.2 → 0.1.5

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 (71) hide show
  1. package/README.md +78 -44
  2. package/agents/android-to-hmos-00-orchestrator.md +34 -28
  3. package/agents/d2h.md +266 -95
  4. package/dist/bin/install-opencode.js +137 -43
  5. package/dist/src/install-opencode.js +44 -0
  6. package/dist/src/install-vscode.js +226 -0
  7. package/dist/src/toolchain.js +83 -0
  8. package/docs/environment-check.md +86 -0
  9. package/opencode/agents.json +1 -1
  10. package/opencode/vscode-d2h-package.json +7 -0
  11. package/opencode/vscode-d2h-plugin.mjs +29 -0
  12. package/package.json +6 -4
  13. package/schemas/task-envelope.schema.json +58 -4
  14. package/schemas/task-plan.schema.json +281 -63
  15. package/scripts/check-environment.mjs +321 -0
  16. package/skills/android2hmos_resources_convert/SKILL.md +37 -19
  17. package/skills/appgraph-rule-audit/SKILL.md +24 -5
  18. package/skills/d2h-hypium-forge/SKILL.md +252 -0
  19. package/skills/d2h-hypium-forge/references/functional-spec-template.md +140 -0
  20. package/skills/d2h-hypium-forge/references/official-api.md +135 -0
  21. package/skills/d2h-hypium-forge/references/pitfalls.md +98 -0
  22. package/skills/d2h-hypium-forge/references/testability-template.md +71 -0
  23. package/skills/d2h-hypium-forge/scripts/_common_template.py +614 -0
  24. package/skills/d2h-hypium-forge/scripts/analyze_results.py +156 -0
  25. package/skills/d2h-hypium-forge/scripts/assert_audit.py +107 -0
  26. package/skills/d2h-hypium-forge/scripts/collect_runtime_pages.py +169 -0
  27. package/skills/d2h-hypium-forge/scripts/forge_report.py +325 -0
  28. package/skills/d2h-hypium-forge/scripts/inject_resource_ids.py +114 -0
  29. package/skills/d2h-hypium-forge/scripts/lint_asserts.py +80 -0
  30. package/skills/d2h-hypium-forge/scripts/lint_locate.py +60 -0
  31. package/skills/d2h-hypium-forge/scripts/merge_appgraph.py +249 -0
  32. package/skills/d2h-hypium-forge/scripts/precondition.py +140 -0
  33. package/skills/d2h-hypium-forge/scripts/preinject_ids.py +232 -0
  34. package/skills/d2h-hypium-forge/scripts/run_direct.py +392 -0
  35. package/skills/d2h-hypium-forge/scripts/run_parallel.py +121 -0
  36. package/skills/d2h-hypium-forge/scripts/scan_features.py +255 -0
  37. package/skills/d2h-hypium-forge/scripts/upgrade_asserts.py +66 -0
  38. package/skills/d2h-hypium-forge/scripts/validate_scenarios.py +84 -0
  39. package/skills/d2h-utg-ai-generate/SKILL.md +128 -0
  40. package/skills/d2h-utg-ai-generate/references/click-paths-schema.json +76 -0
  41. package/skills/d2h-utg-ai-generate/references/extraction-guide.md +34 -0
  42. package/skills/d2h-utg-ai-generate/references/facts-contract.md +96 -0
  43. package/skills/d2h-utg-ai-generate/references/page-schema.json +61 -0
  44. package/skills/d2h-utg-ai-generate/references/utg-schema.json +89 -0
  45. package/skills/d2h-utg-ai-generate/scripts/build_page_json.py +314 -0
  46. package/skills/d2h-utg-ai-generate/scripts/build_utg.py +123 -0
  47. package/skills/d2h-utg-ai-generate/scripts/capture_from_page_json.ts +280 -0
  48. package/skills/d2h-utg-ai-generate/scripts/utg_common.py +524 -0
  49. package/skills/d2h-utg-ai-generate/scripts/utg_html.py +489 -0
  50. package/skills/d2h-utg-ai-generate/scripts/validate_utg.py +69 -0
  51. package/skills/d2h-utg-ai-generate/scripts/vendor/D3-LICENSE +13 -0
  52. package/skills/d2h-utg-ai-generate/scripts/vendor/d3-7.9.0.min.js +2 -0
  53. package/skills/d2h-utg-ai-generate/tests/test_pipeline.py +369 -0
  54. package/skills/d2h-utg-static-generate/SKILL.md +73 -0
  55. package/skills/d2h-utg-static-generate/references/discoveries.md +38 -0
  56. package/skills/d2h-utg-static-generate/scripts/generate.py +499 -0
  57. package/skills/d2h-utg-static-generate/tests/test_static.py +335 -0
  58. package/skills/d2h-utg-static-generate/tests/verify-offline-html.py +60 -0
  59. package/skills/d2h-utg-static-generate/tests/verify-produced-fixture.py +131 -0
  60. package/skills/harmonyos-migration-playbook/SKILL.md +30 -3
  61. package/skills/harmonyos-migration-playbook/references/lesson-lifecycle.md +4 -4
  62. package/skills/harmonyos-migration-playbook/references/ui-automation.md +4 -3
  63. package/skills/harmonyos-migration-playbook/references/windows-environment.md +2 -2
  64. package/skills/maintaining-migration-report/SKILL.md +88 -99
  65. package/skills/maintaining-migration-report/references/final-acceptance.md +48 -0
  66. package/skills/maintaining-migration-report/references/source-provenance.md +66 -0
  67. package/skills/managing-d2h-toolchain/SKILL.md +23 -0
  68. package/skills/managing-d2h-toolchain/environment-requirements.json +16 -0
  69. package/skills/managing-d2h-toolchain/toolchain.json +16 -0
  70. package/skills/preparing-migration-workspace/SKILL.md +76 -69
  71. package/skills/preparing-migration-workspace/toolchain.json +0 -43
@@ -1,14 +1,108 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://harmonyos-ai.dev/schemas/task-plan.schema.json",
4
- "title": "Android to HarmonyOS Task Plan",
4
+ "title": "Android to HarmonyOS Execution Plan",
5
5
  "type": "object",
6
- "required": ["taskPlanVersion", "planningModelVersion", "factsAdapterVersion", "plannerPolicyVersion", "baseline", "entryResolution", "tasks", "ownership", "planningWarnings"],
6
+ "required": [
7
+ "taskPlanVersion",
8
+ "executionPlanVersion",
9
+ "planningModelVersion",
10
+ "factsAdapterVersion",
11
+ "plannerPolicyVersion",
12
+ "baseline",
13
+ "planningPhase",
14
+ "entryResolution",
15
+ "behaviorResponsibilities",
16
+ "pageWorkPackages",
17
+ "tasks",
18
+ "ownership",
19
+ "behaviorOwnership",
20
+ "fileConflictEdges",
21
+ "planningWarnings"
22
+ ],
7
23
  "properties": {
8
- "taskPlanVersion": { "const": "1.0.0" },
9
- "planningModelVersion": { "const": "1.0.0" },
24
+ "taskPlanVersion": { "const": "2.3.0" },
25
+ "executionPlanVersion": { "const": "1.3.0" },
26
+ "planningModelVersion": { "const": "2.0.0" },
10
27
  "factsAdapterVersion": { "const": "1.0.0" },
11
- "plannerPolicyVersion": { "const": "1.1.0" },
28
+ "plannerPolicyVersion": { "const": "2.3.0" },
29
+ "baseline": { "$ref": "#/$defs/baseline" },
30
+ "planningPhase": {
31
+ "description": "resolution projects each Resolution Behavior 1:1 into a transient Resolution Task; execution is entered only after Resolution is cleared and Coding Work Items are assembled once.",
32
+ "enum": ["resolution", "execution"]
33
+ },
34
+ "entryResolution": { "$ref": "#/$defs/entryResolution" },
35
+ "behaviorResponsibilities": {
36
+ "type": "array",
37
+ "items": { "$ref": "#/$defs/behavior" }
38
+ },
39
+ "pageWorkPackages": {
40
+ "type": "array",
41
+ "items": { "$ref": "#/$defs/workPackage" }
42
+ },
43
+ "tasks": {
44
+ "description": "Phase-exclusive tasks: 1:1 Resolution Behavior projections in resolution phase, or frozen Coding Work Items in execution phase.",
45
+ "type": "array",
46
+ "items": { "$ref": "#/$defs/plannedTask" }
47
+ },
48
+ "ownership": { "$ref": "#/$defs/taskOwnership" },
49
+ "behaviorOwnership": { "$ref": "#/$defs/behaviorOwnership" },
50
+ "fileConflictEdges": {
51
+ "type": "array",
52
+ "items": { "$ref": "#/$defs/fileConflict" }
53
+ },
54
+ "planningWarnings": {
55
+ "type": "array",
56
+ "items": { "$ref": "#/$defs/warning" }
57
+ }
58
+ },
59
+ "allOf": [
60
+ {
61
+ "if": { "properties": { "planningPhase": { "const": "resolution" } } },
62
+ "then": {
63
+ "properties": {
64
+ "tasks": {
65
+ "type": "array",
66
+ "items": {
67
+ "type": "object",
68
+ "properties": {
69
+ "type": { "const": "resolution" },
70
+ "behaviorIds": { "type": "array", "minItems": 1, "maxItems": 1 },
71
+ "workPackageId": { "const": null }
72
+ }
73
+ }
74
+ },
75
+ "pageWorkPackages": {
76
+ "type": "array",
77
+ "maxItems": 0
78
+ }
79
+ }
80
+ }
81
+ },
82
+ {
83
+ "if": { "properties": { "planningPhase": { "const": "execution" } } },
84
+ "then": {
85
+ "properties": {
86
+ "tasks": {
87
+ "type": "array",
88
+ "items": {
89
+ "type": "object",
90
+ "properties": {
91
+ "type": { "not": { "const": "resolution" } },
92
+ "workPackageId": { "type": "string", "pattern": "^package:[a-f0-9]{16}$" }
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+ }
99
+ ],
100
+ "$defs": {
101
+ "refs": {
102
+ "type": "array",
103
+ "uniqueItems": true,
104
+ "items": { "type": "string", "minLength": 1 }
105
+ },
12
106
  "baseline": {
13
107
  "type": "object",
14
108
  "required": ["factsSha256", "planningInputSha256", "androidFingerprint", "specVersion", "factsWireVersion"],
@@ -25,32 +119,19 @@
25
119
  "type": "object",
26
120
  "required": ["launcherSurfaceRefs", "launcherEntryRefs", "origin"],
27
121
  "properties": {
28
- "launcherSurfaceRefs": { "type": "array", "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
29
- "launcherEntryRefs": { "type": "array", "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
122
+ "launcherSurfaceRefs": { "$ref": "#/$defs/refs" },
123
+ "launcherEntryRefs": { "$ref": "#/$defs/refs" },
30
124
  "origin": { "enum": ["explicit-fact", "launch-entry-fact", "unresolved"] }
31
125
  },
32
126
  "additionalProperties": false
33
127
  },
34
- "tasks": { "type": "array", "items": { "$ref": "#/$defs/task" } },
35
- "ownership": {
36
- "type": "object",
37
- "required": ["primaryOwnerByFactRef", "supportingTaskIdsByFactRef"],
38
- "properties": {
39
- "primaryOwnerByFactRef": { "type": "object", "additionalProperties": { "type": "string", "minLength": 1 } },
40
- "supportingTaskIdsByFactRef": { "type": "object", "additionalProperties": { "type": "array", "uniqueItems": true, "items": { "type": "string", "minLength": 1 } } }
41
- },
42
- "additionalProperties": false
43
- },
44
- "planningWarnings": { "type": "array", "items": { "$ref": "#/$defs/warning" } }
45
- },
46
- "$defs": {
47
128
  "warning": {
48
129
  "type": "object",
49
130
  "required": ["code", "message", "relatedRefs"],
50
131
  "properties": {
51
132
  "code": { "type": "string", "minLength": 1 },
52
133
  "message": { "type": "string", "minLength": 1 },
53
- "relatedRefs": { "type": "array", "uniqueItems": true, "items": { "type": "string", "minLength": 1 } }
134
+ "relatedRefs": { "$ref": "#/$defs/refs" }
54
135
  },
55
136
  "additionalProperties": false
56
137
  },
@@ -65,59 +146,196 @@
65
146
  },
66
147
  "additionalProperties": false
67
148
  },
68
- "task": {
149
+ "closure": {
69
150
  "type": "object",
70
- "required": ["id", "type", "title", "primaryFactRefs", "supportingFactRefs", "dependsOnTaskIds", "closure", "acceptance", "estimate"],
151
+ "required": ["entryRefs", "surfaceRefs", "controlRefs", "interactionRefs", "sourceEvidence", "codeRefs", "unresolvedRefs", "warningRefs", "requiresSourceReview"],
152
+ "properties": {
153
+ "entryRefs": { "$ref": "#/$defs/refs" },
154
+ "surfaceRefs": { "$ref": "#/$defs/refs" },
155
+ "controlRefs": { "$ref": "#/$defs/refs" },
156
+ "interactionRefs": { "$ref": "#/$defs/refs" },
157
+ "sourceEvidence": { "type": "array", "items": { "$ref": "#/$defs/evidence" } },
158
+ "codeRefs": { "type": "array", "items": { "type": "object" } },
159
+ "unresolvedRefs": { "$ref": "#/$defs/refs" },
160
+ "warningRefs": { "$ref": "#/$defs/refs" },
161
+ "requiresSourceReview": { "type": "boolean" }
162
+ },
163
+ "additionalProperties": false
164
+ },
165
+ "acceptance": {
166
+ "type": "object",
167
+ "required": ["observableOutcome", "requiredFactRefs", "verificationRequirements", "reportRefs"],
168
+ "properties": {
169
+ "observableOutcome": { "type": "string", "minLength": 1 },
170
+ "observableOutcomes": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
171
+ "requiredFactRefs": { "$ref": "#/$defs/refs" },
172
+ "verificationRequirements": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
173
+ "reportRefs": { "$ref": "#/$defs/refs" }
174
+ },
175
+ "additionalProperties": false
176
+ },
177
+ "behaviorEstimate": {
178
+ "type": "object",
179
+ "required": ["factCount", "sourceFileCount", "traceNodeCount", "estimatedFactTokens", "downstreamUnlockCount"],
180
+ "properties": {
181
+ "factCount": { "type": "integer", "minimum": 0 },
182
+ "sourceFileCount": { "type": "integer", "minimum": 0 },
183
+ "traceNodeCount": { "type": "integer", "minimum": 0 },
184
+ "estimatedFactTokens": { "type": "integer", "minimum": 0 },
185
+ "downstreamUnlockCount": { "type": "integer", "minimum": 0 }
186
+ },
187
+ "additionalProperties": false
188
+ },
189
+ "behavior": {
190
+ "type": "object",
191
+ "required": ["id", "type", "title", "primaryFactRefs", "supportingFactRefs", "dependsOnBehaviorIds", "closure", "acceptance", "estimate"],
192
+ "properties": {
193
+ "id": { "type": "string", "pattern": "^behavior:[a-f0-9]{16}$" },
194
+ "type": { "$ref": "#/$defs/taskType" },
195
+ "title": { "type": "string", "minLength": 1 },
196
+ "primaryFactRefs": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
197
+ "supportingFactRefs": { "$ref": "#/$defs/refs" },
198
+ "dependsOnBehaviorIds": { "type": "array", "uniqueItems": true, "items": { "type": "string", "pattern": "^behavior:[a-f0-9]{16}$" } },
199
+ "closure": { "$ref": "#/$defs/closure" },
200
+ "acceptance": { "$ref": "#/$defs/acceptance" },
201
+ "estimate": { "$ref": "#/$defs/behaviorEstimate" }
202
+ },
203
+ "additionalProperties": false
204
+ },
205
+ "writeOwnership": {
206
+ "type": "object",
207
+ "required": ["ownedFiles", "readOnlyFiles", "exclusiveScopes", "forbiddenGlobalFiles"],
208
+ "properties": {
209
+ "ownedFiles": { "$ref": "#/$defs/refs" },
210
+ "readOnlyFiles": { "$ref": "#/$defs/refs" },
211
+ "exclusiveScopes": { "$ref": "#/$defs/refs" },
212
+ "forbiddenGlobalFiles": { "$ref": "#/$defs/refs" }
213
+ },
214
+ "additionalProperties": false
215
+ },
216
+ "dependencyInterface": {
217
+ "type": "object",
218
+ "required": ["kind", "ref", "providerTaskId", "files", "errorModes", "orderingConstraints"],
219
+ "properties": {
220
+ "kind": { "enum": ["module", "ordering"] },
221
+ "ref": { "type": "string", "minLength": 1 },
222
+ "providerTaskId": { "type": ["string", "null"], "pattern": "^task:[a-f0-9]{16}$" },
223
+ "files": { "$ref": "#/$defs/refs" },
224
+ "errorModes": { "$ref": "#/$defs/refs" },
225
+ "orderingConstraints": { "$ref": "#/$defs/refs" }
226
+ },
227
+ "additionalProperties": false
228
+ },
229
+ "readyGate": {
230
+ "type": "object",
231
+ "required": ["semanticsResolved", "dependencyInterfacesStable", "writeOwnershipResolved", "contextWithinBudget", "acceptanceExecutable"],
232
+ "properties": {
233
+ "semanticsResolved": { "type": "boolean" },
234
+ "dependencyInterfacesStable": { "type": "boolean" },
235
+ "writeOwnershipResolved": { "type": "boolean" },
236
+ "contextWithinBudget": { "type": "boolean" },
237
+ "acceptanceExecutable": { "type": "boolean" }
238
+ },
239
+ "additionalProperties": false
240
+ },
241
+ "taskEstimate": {
242
+ "type": "object",
243
+ "required": ["factCount", "sourceFileCount", "traceNodeCount", "estimatedFactTokens", "downstreamUnlockCount", "behaviorCount", "observableOutcomeCount", "productionFileCount", "testFileCount", "capabilityCount"],
244
+ "properties": {
245
+ "factCount": { "type": "integer", "minimum": 0 },
246
+ "sourceFileCount": { "type": "integer", "minimum": 0 },
247
+ "traceNodeCount": { "type": "integer", "minimum": 0 },
248
+ "estimatedFactTokens": { "type": "integer", "minimum": 0 },
249
+ "downstreamUnlockCount": { "type": "integer", "minimum": 0 },
250
+ "behaviorCount": { "type": "integer", "minimum": 1 },
251
+ "observableOutcomeCount": { "type": "integer", "minimum": 1 },
252
+ "productionFileCount": { "type": "integer", "minimum": 0 },
253
+ "testFileCount": { "type": "integer", "minimum": 0 },
254
+ "capabilityCount": { "type": "integer", "minimum": 0 }
255
+ },
256
+ "additionalProperties": false
257
+ },
258
+ "plannedTask": {
259
+ "type": "object",
260
+ "required": ["id", "type", "title", "workPackageId", "canonicalPageRef", "primaryModule", "behaviorIds", "primaryFactRefs", "supportingFactRefs", "dependsOnTaskIds", "conflictsWithTaskIds", "writeOwnership", "dependencyInterfaces", "readyGate", "closure", "acceptance", "estimate"],
71
261
  "properties": {
72
262
  "id": { "type": "string", "pattern": "^task:[a-f0-9]{16}$" },
73
- "type": { "enum": ["resolution", "bootstrap", "capability", "journey", "assembly", "regression"] },
263
+ "type": { "$ref": "#/$defs/taskType" },
74
264
  "title": { "type": "string", "minLength": 1 },
265
+ "workPackageId": { "type": ["string", "null"], "pattern": "^package:[a-f0-9]{16}$" },
266
+ "canonicalPageRef": { "type": ["string", "null"] },
267
+ "primaryModule": { "type": "string", "minLength": 1 },
268
+ "behaviorIds": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "pattern": "^behavior:[a-f0-9]{16}$" } },
75
269
  "primaryFactRefs": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
76
- "supportingFactRefs": { "type": "array", "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
270
+ "supportingFactRefs": { "$ref": "#/$defs/refs" },
77
271
  "dependsOnTaskIds": { "type": "array", "uniqueItems": true, "items": { "type": "string", "pattern": "^task:[a-f0-9]{16}$" } },
78
- "closure": {
79
- "type": "object",
80
- "required": ["entryRefs", "surfaceRefs", "controlRefs", "interactionRefs", "sourceEvidence", "codeRefs", "unresolvedRefs", "warningRefs", "requiresSourceReview"],
81
- "properties": {
82
- "entryRefs": { "$ref": "#/$defs/refs" },
83
- "surfaceRefs": { "$ref": "#/$defs/refs" },
84
- "controlRefs": { "$ref": "#/$defs/refs" },
85
- "interactionRefs": { "$ref": "#/$defs/refs" },
86
- "sourceEvidence": { "type": "array", "items": { "$ref": "#/$defs/evidence" } },
87
- "codeRefs": { "type": "array", "items": { "type": "object" } },
88
- "unresolvedRefs": { "$ref": "#/$defs/refs" },
89
- "warningRefs": { "$ref": "#/$defs/refs" },
90
- "requiresSourceReview": { "type": "boolean" }
91
- },
92
- "additionalProperties": false
93
- },
272
+ "conflictsWithTaskIds": { "type": "array", "uniqueItems": true, "items": { "type": "string", "pattern": "^task:[a-f0-9]{16}$" } },
273
+ "writeOwnership": { "$ref": "#/$defs/writeOwnership" },
274
+ "dependencyInterfaces": { "type": "array", "items": { "$ref": "#/$defs/dependencyInterface" } },
275
+ "readyGate": { "$ref": "#/$defs/readyGate" },
276
+ "closure": { "$ref": "#/$defs/closure" },
94
277
  "acceptance": {
95
- "type": "object",
96
- "required": ["observableOutcome", "requiredFactRefs", "verificationRequirements", "reportRefs"],
97
- "properties": {
98
- "observableOutcome": { "type": "string", "minLength": 1 },
99
- "requiredFactRefs": { "$ref": "#/$defs/refs" },
100
- "verificationRequirements": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
101
- "reportRefs": { "$ref": "#/$defs/refs" }
102
- },
103
- "additionalProperties": false
278
+ "allOf": [
279
+ { "$ref": "#/$defs/acceptance" },
280
+ {
281
+ "type": "object",
282
+ "required": ["observableOutcomes"],
283
+ "properties": {
284
+ "observableOutcomes": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } }
285
+ }
286
+ }
287
+ ]
104
288
  },
105
- "estimate": {
106
- "type": "object",
107
- "required": ["factCount", "sourceFileCount", "traceNodeCount", "estimatedFactTokens", "downstreamUnlockCount"],
108
- "properties": {
109
- "factCount": { "type": "integer", "minimum": 0 },
110
- "sourceFileCount": { "type": "integer", "minimum": 0 },
111
- "traceNodeCount": { "type": "integer", "minimum": 0 },
112
- "estimatedFactTokens": { "type": "integer", "minimum": 0 },
113
- "downstreamUnlockCount": { "type": "integer", "minimum": 0 }
114
- },
115
- "additionalProperties": false
116
- }
289
+ "estimate": { "$ref": "#/$defs/taskEstimate" }
290
+ },
291
+ "additionalProperties": false
292
+ },
293
+ "workPackage": {
294
+ "type": "object",
295
+ "required": ["id", "canonicalPageRef", "title", "surfaceRefs", "workItemIds", "dependsOnPackageIds", "serialLane", "exclusiveScopes"],
296
+ "properties": {
297
+ "id": { "type": "string", "pattern": "^package:[a-f0-9]{16}$" },
298
+ "canonicalPageRef": { "type": ["string", "null"] },
299
+ "title": { "type": "string", "minLength": 1 },
300
+ "surfaceRefs": { "$ref": "#/$defs/refs" },
301
+ "workItemIds": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "pattern": "^task:[a-f0-9]{16}$" } },
302
+ "dependsOnPackageIds": { "type": "array", "uniqueItems": true, "items": { "type": "string", "pattern": "^package:[a-f0-9]{16}$" } },
303
+ "serialLane": { "type": "boolean" },
304
+ "exclusiveScopes": { "$ref": "#/$defs/refs" }
305
+ },
306
+ "additionalProperties": false
307
+ },
308
+ "fileConflict": {
309
+ "type": "object",
310
+ "required": ["leftTaskId", "rightTaskId", "reasons"],
311
+ "properties": {
312
+ "leftTaskId": { "type": "string", "pattern": "^task:[a-f0-9]{16}$" },
313
+ "rightTaskId": { "type": "string", "pattern": "^task:[a-f0-9]{16}$" },
314
+ "reasons": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } }
315
+ },
316
+ "additionalProperties": false
317
+ },
318
+ "taskOwnership": {
319
+ "type": "object",
320
+ "required": ["primaryOwnerByFactRef", "supportingTaskIdsByFactRef"],
321
+ "properties": {
322
+ "primaryOwnerByFactRef": { "type": "object", "additionalProperties": { "type": "string", "pattern": "^task:[a-f0-9]{16}$" } },
323
+ "supportingTaskIdsByFactRef": { "type": "object", "additionalProperties": { "type": "array", "uniqueItems": true, "items": { "type": "string", "pattern": "^task:[a-f0-9]{16}$" } } }
324
+ },
325
+ "additionalProperties": false
326
+ },
327
+ "behaviorOwnership": {
328
+ "type": "object",
329
+ "required": ["primaryOwnerByFactRef", "supportingBehaviorIdsByFactRef"],
330
+ "properties": {
331
+ "primaryOwnerByFactRef": { "type": "object", "additionalProperties": { "type": "string", "pattern": "^behavior:[a-f0-9]{16}$" } },
332
+ "supportingBehaviorIdsByFactRef": { "type": "object", "additionalProperties": { "type": "array", "uniqueItems": true, "items": { "type": "string", "pattern": "^behavior:[a-f0-9]{16}$" } } }
117
333
  },
118
334
  "additionalProperties": false
119
335
  },
120
- "refs": { "type": "array", "uniqueItems": true, "items": { "type": "string", "minLength": 1 } }
336
+ "taskType": {
337
+ "enum": ["resolution", "bootstrap", "capability", "journey", "assembly", "regression"]
338
+ }
121
339
  },
122
340
  "additionalProperties": false
123
341
  }