workspai 0.59.1 → 0.60.1

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 (99) hide show
  1. package/README.md +5 -0
  2. package/contracts/cli-runtime-command-inventory.v1.snapshot.json +4 -0
  3. package/contracts/extension-cli-compatibility.v1.json +1 -1
  4. package/contracts/workspace-intelligence/goal-agent-handoff.v1.json +89 -8
  5. package/contracts/workspace-intelligence/goal-index.v1.json +100 -7
  6. package/contracts/workspace-intelligence/goal-lifecycle-result.v1.json +74 -6
  7. package/contracts/workspace-intelligence/goal-pack.v1.json +182 -19
  8. package/contracts/workspace-intelligence/verified-goal.v1.json +44 -3
  9. package/dist/analyze-FYNMI5KT.js +1 -0
  10. package/dist/autopilot-release-IRXB2VOH.js +1 -0
  11. package/dist/{chunk-DGGTTRYE.js → chunk-7ITSLGPZ.js} +1 -1
  12. package/dist/{chunk-5NIZNXRS.js → chunk-A4BK7C7M.js} +1 -1
  13. package/dist/{chunk-FLTIFYTJ.js → chunk-AJ535F22.js} +1 -1
  14. package/dist/{chunk-KVSYBHUR.js → chunk-B6FJ6RG6.js} +1 -1
  15. package/dist/{chunk-5PSKBJKJ.js → chunk-DIJGQUEV.js} +1 -1
  16. package/dist/{chunk-QMPFNXI7.js → chunk-E4LJ3PQD.js} +1 -1
  17. package/dist/{chunk-6FBNSTUS.js → chunk-GPGEJVVO.js} +1 -1
  18. package/dist/{chunk-U3MGJN7A.js → chunk-HQWDW2BV.js} +1 -1
  19. package/dist/chunk-I2O6AC2Z.js +2 -0
  20. package/dist/chunk-ILIBOMYL.js +1 -0
  21. package/dist/chunk-J7G3YL4O.js +1 -0
  22. package/dist/{chunk-NOZ4JCH7.js → chunk-KCJ3VS6R.js} +1 -1
  23. package/dist/{chunk-SP5EHSWG.js → chunk-KG3TUTXU.js} +1 -1
  24. package/dist/chunk-KNTPDRZB.js +1 -0
  25. package/dist/{chunk-QPE6VCDW.js → chunk-KTW4EN47.js} +19 -19
  26. package/dist/{chunk-RVKMGKYL.js → chunk-MDF2FBLS.js} +1 -1
  27. package/dist/{chunk-WSRUPDZN.js → chunk-NA2NXX5P.js} +1 -1
  28. package/dist/{chunk-OFWSZYUX.js → chunk-NBJ6AP7K.js} +1 -1
  29. package/dist/{chunk-RTDEFUTL.js → chunk-NRVSDL4J.js} +1 -1
  30. package/dist/{chunk-7WUT5ZSO.js → chunk-NVQUBUTY.js} +1 -1
  31. package/dist/{chunk-YEEAWZWI.js → chunk-O6R7SE6Y.js} +1 -1
  32. package/dist/{chunk-7SFXADXO.js → chunk-OU7DF6MP.js} +1 -1
  33. package/dist/{chunk-WJVB6SSD.js → chunk-PTNLVI62.js} +5 -5
  34. package/dist/{chunk-WP3CXMVA.js → chunk-SCP5LJNO.js} +1 -1
  35. package/dist/{chunk-QFBVQUKV.js → chunk-TFOOSYGO.js} +6 -6
  36. package/dist/{chunk-3CGR6435.js → chunk-TYQMO36U.js} +1 -1
  37. package/dist/chunk-UJXE4UAX.js +1 -0
  38. package/dist/{chunk-ENKGGWRX.js → chunk-VDFHUYAQ.js} +8 -8
  39. package/dist/chunk-VR6XMUF3.js +2 -0
  40. package/dist/{chunk-Y4B55J5S.js → chunk-VV55EAWO.js} +1 -1
  41. package/dist/{chunk-ZJCM37KX.js → chunk-WLFJHRB3.js} +1 -1
  42. package/dist/{chunk-P2WH7W2H.js → chunk-WUB6QGC7.js} +6 -6
  43. package/dist/chunk-X6TNBARH.js +6 -0
  44. package/dist/{create-HUEDWYDM.js → create-ZLDOBXG4.js} +1 -1
  45. package/dist/demo-kit-QHIDCSBI.js +149 -0
  46. package/dist/{doctor-NAZEKMGU.js → doctor-MAPZ2ZCD.js} +1 -1
  47. package/dist/{dotnet-webapi-clean-VXEF4SHM.js → dotnet-webapi-clean-AVHPJG7Y.js} +5 -5
  48. package/dist/goal-command-contract-43E22XQD.js +1 -0
  49. package/dist/goal-interactive-selection-6YJOK4WC.js +1 -0
  50. package/dist/goal-lifecycle-OV6NZDD6.js +1 -0
  51. package/dist/goal-pack-Q3O2Z7R5.js +1 -0
  52. package/dist/{gofiber-standard-AQGSC7ON.js → gofiber-standard-47S2GYAO.js} +2 -2
  53. package/dist/{gogin-standard-7DU3OCBX.js → gogin-standard-EWB4XNOI.js} +3 -3
  54. package/dist/index.js +122 -122
  55. package/dist/{pipeline-62A2SDLC.js → pipeline-NICVJLZF.js} +1 -1
  56. package/dist/{project-agent-entry-7SYHRY7J.js → project-agent-entry-DVPKQST7.js} +1 -1
  57. package/dist/{project-intelligence-lens-BSG5LK6N.js → project-intelligence-lens-RLYSPJB2.js} +1 -1
  58. package/dist/{project-test-coverage-HP37HUV2.js → project-test-coverage-E2Q4QL44.js} +1 -1
  59. package/dist/{rust-axum-4HXDICIB.js → rust-axum-M5X4ZC4Z.js} +4 -4
  60. package/dist/{springboot-standard-EK6GYN5T.js → springboot-standard-Y5ADLZMQ.js} +7 -7
  61. package/dist/verified-goal-2BRQZQBL.js +1 -0
  62. package/dist/{workspace-BNRSBWSL.js → workspace-LQ77WAHC.js} +1 -1
  63. package/dist/{workspace-agent-sync-ANBHBZ2H.js → workspace-agent-sync-YLP75OWF.js} +1 -1
  64. package/dist/{workspace-context-RAO62QVU.js → workspace-context-YAK5XX27.js} +1 -1
  65. package/dist/{workspace-contract-ACSIHJIO.js → workspace-contract-3BWIRSVQ.js} +1 -1
  66. package/dist/{workspace-explain-RH27OQB4.js → workspace-explain-QH4FXQW5.js} +1 -1
  67. package/dist/{workspace-foundation-EWYJPPT6.js → workspace-foundation-G4KPT5CN.js} +1 -1
  68. package/dist/{workspace-graph-stream-ZZZEQQTE.js → workspace-graph-stream-XTSDKRLM.js} +1 -1
  69. package/dist/{workspace-intelligence-3YERTBA3.js → workspace-intelligence-625UN27X.js} +1 -1
  70. package/dist/{workspace-intelligence-runner-QLLBUD6G.js → workspace-intelligence-runner-T6CVJIQQ.js} +1 -1
  71. package/dist/{workspace-knowledge-graph-HZZP6ZRB.js → workspace-knowledge-graph-3ZBPSAS7.js} +1 -1
  72. package/dist/workspace-knowledge-graph-snapshot-ZI4W735H.js +1 -0
  73. package/dist/{workspace-mcp-serve-5TTAN243.js → workspace-mcp-serve-ALIZV72K.js} +1 -1
  74. package/dist/{workspace-model-EIQSKDX7.js → workspace-model-ETCLINRB.js} +1 -1
  75. package/dist/{workspace-onboarding-UW3CSURE.js → workspace-onboarding-46BE3EQD.js} +1 -1
  76. package/dist/{workspace-registry-summary-OV5KX3WC.js → workspace-registry-summary-VSOBKAJG.js} +1 -1
  77. package/dist/workspace-repair-engine-SZZKV3JF.js +3 -0
  78. package/dist/workspace-run-JTEFCQYQ.js +1 -0
  79. package/dist/{workspace-verify-W4P6LBIH.js → workspace-verify-7ENGIY4S.js} +1 -1
  80. package/dist/{workspace-watch-EZ4D4VCF.js → workspace-watch-2YFSB2WL.js} +1 -1
  81. package/docs/ci-workflows.md +1 -1
  82. package/docs/commands-reference.md +12 -2
  83. package/docs/goal-packs.md +51 -11
  84. package/package.json +1 -1
  85. package/dist/analyze-52TEGLDR.js +0 -1
  86. package/dist/autopilot-release-NFLAKBA3.js +0 -1
  87. package/dist/chunk-DQ6VXTDE.js +0 -1
  88. package/dist/chunk-MZKKRAAJ.js +0 -2
  89. package/dist/chunk-RO73VVHW.js +0 -2
  90. package/dist/chunk-T3GJ7YVG.js +0 -1
  91. package/dist/chunk-VRW6KXNK.js +0 -6
  92. package/dist/demo-kit-KHH63TNA.js +0 -149
  93. package/dist/goal-command-contract-CHE7U6YY.js +0 -1
  94. package/dist/goal-lifecycle-NUKWVUAL.js +0 -1
  95. package/dist/goal-pack-TWOXHXN6.js +0 -1
  96. package/dist/verified-goal-B6HQOZWA.js +0 -1
  97. package/dist/workspace-knowledge-graph-snapshot-7DWHMEM2.js +0 -1
  98. package/dist/workspace-repair-engine-DHH2UUJN.js +0 -3
  99. package/dist/workspace-run-BLHRXT2N.js +0 -1
package/README.md CHANGED
@@ -106,6 +106,8 @@ Describe the outcome in plain language from the adopted project:
106
106
 
107
107
  ```bash
108
108
  npx workspai goal "Raise test coverage to 85%" --for-agent generic
109
+ # In a polyglot scope, choose interactively or bind a canonical runtime:
110
+ npx workspai goal "Raise test coverage to 85%" --runtime cpp --for-agent generic
109
111
  # Or pursue feature, defect, refactor, performance, documentation, or
110
112
  # system-understanding outcomes in the same governed flow.
111
113
  npx workspai goal "Add retry with exponential backoff" --for-agent generic
@@ -123,6 +125,9 @@ control. The command prepares governed work; it does not edit source or claim
123
125
  that the outcome is complete. Exact coverage, dependency-security, and release
124
126
  Goals have deterministic CLI verifiers; other outcomes retain CLI safety and
125
127
  rollback while the consumer performs an evidence-backed outcome review.
128
+ Multi-project scope and polyglot runtime choices are explicit. Interactive
129
+ users get bounded choices from the canonical Workspace Model; automation gets
130
+ a machine-readable decision and can use `--scope` and `--runtime`.
126
131
 
127
132
  ![Workspai turns a plain-language objective into a governed Goal Pack](https://raw.githubusercontent.com/chistiq/workspai/main/packages/cli/docs/workspai-goal-readme-cli.gif)
128
133
 
@@ -504,6 +504,10 @@
504
504
  "flags": "--scope <scope>",
505
505
  "attributeName": "scope"
506
506
  },
507
+ {
508
+ "flags": "--runtime <runtime>",
509
+ "attributeName": "runtime"
510
+ },
507
511
  {
508
512
  "flags": "--for-agent <consumer>",
509
513
  "attributeName": "forAgent"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "rapidkit-extension-cli-compatibility.v1",
3
3
  "cli": "workspai",
4
- "minimumVerifiedCliVersion": "0.58.0",
4
+ "minimumVerifiedCliVersion": "0.60.1",
5
5
  "publishedContractSchemas": {
6
6
  "workspaceContract": 1,
7
7
  "runtimeCommandSurface": "rapidkit-runtime-command-surface-v1",
@@ -3,7 +3,22 @@
3
3
  "$id": "https://workspai.dev/schemas/workspace-intelligence/goal-agent-handoff.v1.json",
4
4
  "title": "Workspai Goal Agent Handoff",
5
5
  "type": "object",
6
- "required": ["schemaVersion", "goalId", "goalFingerprint", "generatedAt", "consumer", "state", "objective", "scope", "discovery", "retrieval", "evidence", "guardrails", "workflow", "renewal"],
6
+ "required": [
7
+ "schemaVersion",
8
+ "goalId",
9
+ "goalFingerprint",
10
+ "generatedAt",
11
+ "consumer",
12
+ "state",
13
+ "objective",
14
+ "scope",
15
+ "discovery",
16
+ "retrieval",
17
+ "evidence",
18
+ "guardrails",
19
+ "workflow",
20
+ "renewal"
21
+ ],
7
22
  "properties": {
8
23
  "schemaVersion": { "const": "workspai.goal-agent-handoff.v1" },
9
24
  "goalId": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{7,95}$" },
@@ -16,10 +31,46 @@
16
31
  "type": "object",
17
32
  "required": ["kind", "projects", "selectionSource"],
18
33
  "properties": {
19
- "kind": { "enum": ["workspace", "project"] },
20
- "projects": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 }, "uniqueItems": true },
21
- "selectionSource": { "enum": ["workspace", "invocation-project", "explicit"] }
34
+ "kind": { "enum": ["workspace", "project", "project-set"] },
35
+ "projects": {
36
+ "type": "array",
37
+ "minItems": 1,
38
+ "items": { "type": "string", "minLength": 1 },
39
+ "uniqueItems": true
40
+ },
41
+ "selectionSource": {
42
+ "enum": [
43
+ "workspace",
44
+ "single-project-workspace",
45
+ "invocation-project",
46
+ "explicit",
47
+ "interactive"
48
+ ]
49
+ },
50
+ "resolution": { "enum": ["selected", "selection-required"] }
22
51
  },
52
+ "allOf": [
53
+ {
54
+ "if": { "properties": { "kind": { "const": "project" } } },
55
+ "then": { "properties": { "projects": { "type": "array", "maxItems": 1 } } }
56
+ },
57
+ {
58
+ "if": { "properties": { "kind": { "const": "project-set" } } },
59
+ "then": { "properties": { "projects": { "type": "array", "minItems": 2 } } }
60
+ },
61
+ {
62
+ "if": {
63
+ "properties": { "resolution": { "const": "selection-required" } },
64
+ "required": ["resolution"]
65
+ },
66
+ "then": {
67
+ "properties": {
68
+ "kind": { "const": "workspace" },
69
+ "selectionSource": { "const": "workspace" }
70
+ }
71
+ }
72
+ }
73
+ ],
23
74
  "additionalProperties": false
24
75
  },
25
76
  "evidence": {
@@ -51,7 +102,12 @@
51
102
  "properties": {
52
103
  "index": { "const": ".workspai/goals/index.json" },
53
104
  "statusCommand": { "type": "string", "pattern": "^workspai goal --status " },
54
- "requiredReads": { "type": "array", "minItems": 3, "items": { "type": "string", "pattern": "^\\.workspai/" }, "uniqueItems": true }
105
+ "requiredReads": {
106
+ "type": "array",
107
+ "minItems": 3,
108
+ "items": { "type": "string", "pattern": "^\\.workspai/" },
109
+ "uniqueItems": true
110
+ }
55
111
  },
56
112
  "additionalProperties": false
57
113
  },
@@ -61,12 +117,37 @@
61
117
  "properties": {
62
118
  "status": { "enum": ["grounded", "partial", "empty"] },
63
119
  "strategy": { "const": "deterministic-category-v1" },
64
- "queries": { "type": "array", "minItems": 1, "maxItems": 3, "items": { "type": "string", "minLength": 1 }, "uniqueItems": true },
65
- "anchors": { "type": "array", "maxItems": 20, "items": { "type": "object", "required": ["entityId", "kind", "label", "proofIds"], "properties": { "entityId": { "type": "string" }, "kind": { "type": "string" }, "label": { "type": "string" }, "proofIds": { "type": "array", "items": { "type": "string" }, "uniqueItems": true } }, "additionalProperties": false } }
120
+ "queries": {
121
+ "type": "array",
122
+ "minItems": 1,
123
+ "maxItems": 3,
124
+ "items": { "type": "string", "minLength": 1 },
125
+ "uniqueItems": true
126
+ },
127
+ "anchors": {
128
+ "type": "array",
129
+ "maxItems": 20,
130
+ "items": {
131
+ "type": "object",
132
+ "required": ["entityId", "kind", "label", "proofIds"],
133
+ "properties": {
134
+ "entityId": { "type": "string" },
135
+ "kind": { "type": "string" },
136
+ "label": { "type": "string" },
137
+ "proofIds": { "type": "array", "items": { "type": "string" }, "uniqueItems": true }
138
+ },
139
+ "additionalProperties": false
140
+ }
141
+ }
66
142
  },
67
143
  "additionalProperties": false
68
144
  },
69
- "guardrails": { "type": "array", "minItems": 5, "items": { "type": "string", "minLength": 1 }, "uniqueItems": true },
145
+ "guardrails": {
146
+ "type": "array",
147
+ "minItems": 5,
148
+ "items": { "type": "string", "minLength": 1 },
149
+ "uniqueItems": true
150
+ },
70
151
  "workflow": {
71
152
  "type": "array",
72
153
  "minItems": 5,
@@ -12,28 +12,97 @@
12
12
  "type": "array",
13
13
  "items": {
14
14
  "type": "object",
15
- "required": ["id", "fingerprint", "objective", "category", "state", "lifecycle", "scope", "createdAt", "updatedAt", "goalPack", "agentHandoff"],
15
+ "required": [
16
+ "id",
17
+ "fingerprint",
18
+ "objective",
19
+ "category",
20
+ "state",
21
+ "lifecycle",
22
+ "scope",
23
+ "createdAt",
24
+ "updatedAt",
25
+ "goalPack",
26
+ "agentHandoff"
27
+ ],
16
28
  "properties": {
17
29
  "id": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{7,95}$" },
18
30
  "fingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
19
31
  "objective": { "type": "string", "minLength": 1, "maxLength": 2000 },
20
- "category": { "enum": ["release-readiness", "dependency-security", "test-coverage", "defect-repair", "feature-change", "refactor", "performance", "documentation", "system-understanding"] },
32
+ "category": {
33
+ "enum": [
34
+ "release-readiness",
35
+ "dependency-security",
36
+ "test-coverage",
37
+ "defect-repair",
38
+ "feature-change",
39
+ "refactor",
40
+ "performance",
41
+ "documentation",
42
+ "system-understanding"
43
+ ]
44
+ },
21
45
  "state": { "enum": ["ready-to-plan", "needs-confirmation", "needs-evidence", "blocked"] },
22
- "lifecycle": { "enum": ["planned", "active", "cancelled", "verification-ready", "verified", "failed"] },
46
+ "lifecycle": {
47
+ "enum": ["planned", "active", "cancelled", "verification-ready", "verified", "failed"]
48
+ },
23
49
  "scope": {
24
50
  "type": "object",
25
51
  "required": ["kind", "projects", "selectionSource"],
26
52
  "properties": {
27
- "kind": { "enum": ["workspace", "project"] },
28
- "projects": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 }, "uniqueItems": true },
29
- "selectionSource": { "enum": ["workspace", "invocation-project", "explicit"] }
53
+ "kind": { "enum": ["workspace", "project", "project-set"] },
54
+ "projects": {
55
+ "type": "array",
56
+ "minItems": 1,
57
+ "items": { "type": "string", "minLength": 1 },
58
+ "uniqueItems": true
59
+ },
60
+ "selectionSource": {
61
+ "enum": [
62
+ "workspace",
63
+ "single-project-workspace",
64
+ "invocation-project",
65
+ "explicit",
66
+ "interactive"
67
+ ]
68
+ },
69
+ "resolution": { "enum": ["selected", "selection-required"] }
30
70
  },
71
+ "allOf": [
72
+ {
73
+ "if": { "properties": { "kind": { "const": "project" } } },
74
+ "then": {
75
+ "properties": { "projects": { "type": "array", "maxItems": 1 } }
76
+ }
77
+ },
78
+ {
79
+ "if": { "properties": { "kind": { "const": "project-set" } } },
80
+ "then": {
81
+ "properties": { "projects": { "type": "array", "minItems": 2 } }
82
+ }
83
+ },
84
+ {
85
+ "if": {
86
+ "properties": { "resolution": { "const": "selection-required" } },
87
+ "required": ["resolution"]
88
+ },
89
+ "then": {
90
+ "properties": {
91
+ "kind": { "const": "workspace" },
92
+ "selectionSource": { "const": "workspace" }
93
+ }
94
+ }
95
+ }
96
+ ],
31
97
  "additionalProperties": false
32
98
  },
33
99
  "createdAt": { "type": "string", "format": "date-time" },
34
100
  "updatedAt": { "type": "string", "format": "date-time" },
35
101
  "goalPack": { "type": "string", "pattern": "^\\.workspai/goals/[^/]+/goal-pack\\.json$" },
36
- "agentHandoff": { "type": "string", "pattern": "^\\.workspai/goals/[^/]+/agent-handoff\\.json$" },
102
+ "agentHandoff": {
103
+ "type": "string",
104
+ "pattern": "^\\.workspai/goals/[^/]+/agent-handoff\\.json$"
105
+ },
37
106
  "verifiedGoalId": { "type": "string", "minLength": 1 },
38
107
  "repairTransactionId": { "type": "string", "minLength": 1 },
39
108
  "repairTransactionIds": {
@@ -41,6 +110,30 @@
41
110
  "maxItems": 25,
42
111
  "uniqueItems": true,
43
112
  "items": { "type": "string", "minLength": 1 }
113
+ },
114
+ "verificationReceipt": {
115
+ "type": "object",
116
+ "required": [
117
+ "verifiedGoalId",
118
+ "attempt",
119
+ "statusHash",
120
+ "modelHash",
121
+ "graphFingerprint",
122
+ "graphFingerprintSemantics",
123
+ "recordedAt"
124
+ ],
125
+ "properties": {
126
+ "verifiedGoalId": { "type": "string", "minLength": 1 },
127
+ "attempt": { "type": "integer", "minimum": 1 },
128
+ "statusHash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
129
+ "modelHash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
130
+ "graphFingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
131
+ "graphFingerprintSemantics": {
132
+ "enum": ["workspace-knowledge-graph-inputs-v1", "canonical-json-v1"]
133
+ },
134
+ "recordedAt": { "type": "string", "format": "date-time" }
135
+ },
136
+ "additionalProperties": false
44
137
  }
45
138
  },
46
139
  "additionalProperties": false
@@ -28,7 +28,9 @@
28
28
  "schemaVersion": { "const": "workspai.goal-pack.v1" },
29
29
  "id": { "type": "string" },
30
30
  "fingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
31
- "state": { "enum": ["ready-to-plan", "needs-confirmation", "needs-evidence", "blocked"] }
31
+ "state": {
32
+ "enum": ["ready-to-plan", "needs-confirmation", "needs-evidence", "blocked"]
33
+ }
32
34
  }
33
35
  },
34
36
  { "type": "null" }
@@ -71,15 +73,57 @@
71
73
  ]
72
74
  },
73
75
  "state": { "enum": ["ready-to-plan", "needs-confirmation", "needs-evidence", "blocked"] },
74
- "lifecycle": { "enum": ["planned", "active", "cancelled", "verification-ready", "verified", "failed"] },
76
+ "lifecycle": {
77
+ "enum": ["planned", "active", "cancelled", "verification-ready", "verified", "failed"]
78
+ },
75
79
  "scope": {
76
80
  "type": "object",
77
81
  "required": ["kind", "projects", "selectionSource"],
78
82
  "properties": {
79
- "kind": { "enum": ["workspace", "project"] },
80
- "projects": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 }, "uniqueItems": true },
81
- "selectionSource": { "enum": ["workspace", "invocation-project", "explicit"] }
83
+ "kind": { "enum": ["workspace", "project", "project-set"] },
84
+ "projects": {
85
+ "type": "array",
86
+ "minItems": 1,
87
+ "items": { "type": "string", "minLength": 1 },
88
+ "uniqueItems": true
89
+ },
90
+ "selectionSource": {
91
+ "enum": [
92
+ "workspace",
93
+ "single-project-workspace",
94
+ "invocation-project",
95
+ "explicit",
96
+ "interactive"
97
+ ]
98
+ },
99
+ "resolution": { "enum": ["selected", "selection-required"] }
82
100
  },
101
+ "allOf": [
102
+ {
103
+ "if": { "properties": { "kind": { "const": "project" } } },
104
+ "then": {
105
+ "properties": { "projects": { "type": "array", "maxItems": 1 } }
106
+ }
107
+ },
108
+ {
109
+ "if": { "properties": { "kind": { "const": "project-set" } } },
110
+ "then": {
111
+ "properties": { "projects": { "type": "array", "minItems": 2 } }
112
+ }
113
+ },
114
+ {
115
+ "if": {
116
+ "properties": { "resolution": { "const": "selection-required" } },
117
+ "required": ["resolution"]
118
+ },
119
+ "then": {
120
+ "properties": {
121
+ "kind": { "const": "workspace" },
122
+ "selectionSource": { "const": "workspace" }
123
+ }
124
+ }
125
+ }
126
+ ],
83
127
  "additionalProperties": false
84
128
  },
85
129
  "createdAt": { "type": "string", "format": "date-time" },
@@ -87,7 +131,31 @@
87
131
  "goalPack": { "type": "string" },
88
132
  "agentHandoff": { "type": "string" },
89
133
  "verifiedGoalId": { "type": "string" },
90
- "repairTransactionId": { "type": "string" }
134
+ "repairTransactionId": { "type": "string" },
135
+ "verificationReceipt": {
136
+ "type": "object",
137
+ "required": [
138
+ "verifiedGoalId",
139
+ "attempt",
140
+ "statusHash",
141
+ "modelHash",
142
+ "graphFingerprint",
143
+ "graphFingerprintSemantics",
144
+ "recordedAt"
145
+ ],
146
+ "properties": {
147
+ "verifiedGoalId": { "type": "string", "minLength": 1 },
148
+ "attempt": { "type": "integer", "minimum": 1 },
149
+ "statusHash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
150
+ "modelHash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
151
+ "graphFingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
152
+ "graphFingerprintSemantics": {
153
+ "enum": ["workspace-knowledge-graph-inputs-v1", "canonical-json-v1"]
154
+ },
155
+ "recordedAt": { "type": "string", "format": "date-time" }
156
+ },
157
+ "additionalProperties": false
158
+ }
91
159
  },
92
160
  "additionalProperties": false
93
161
  }