owlrunkit 0.15.0 → 0.16.0

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 (76) hide show
  1. package/CHANGELOG.md +100 -0
  2. package/README.md +274 -66
  3. package/integrations/codex/skills/owlcoda-runkit/SKILL.md +223 -117
  4. package/integrations/codex/skills/owlcoda-runkit/assets/templates/config.json +3 -3
  5. package/integrations/codex/skills/owlcoda-runkit/assets/templates/ready-for-commit-request.json +2 -2
  6. package/package.json +2 -2
  7. package/packages/attest/distribution-manifest-v1.json +10 -0
  8. package/packages/attest/src/quick.mjs +10 -0
  9. package/registry-release-policy-v1.json +8 -2
  10. package/sbom.spdx.json +5 -5
  11. package/scripts/runkit-contract/assurance-router.mjs +119 -0
  12. package/scripts/runkit-contract/core-contract.mjs +250 -115
  13. package/scripts/runkit-contract/core-successor.mjs +2043 -0
  14. package/scripts/runkit-contract/deployment-workflow.mjs +2040 -0
  15. package/scripts/runkit-contract/finalize.mjs +242 -21
  16. package/scripts/runkit-contract/fleet-discovery.mjs +456 -0
  17. package/scripts/runkit-contract/formal-workflow.mjs +850 -0
  18. package/scripts/runkit-contract/human-status.mjs +553 -0
  19. package/scripts/runkit-contract/inspect-presentation.mjs +25 -8
  20. package/scripts/runkit-contract/install-codex-skill.mjs +73 -30
  21. package/scripts/runkit-contract/lease-lifecycle.mjs +8 -2
  22. package/scripts/runkit-contract/lifecycle-orchestration.mjs +135 -12
  23. package/scripts/runkit-contract/onboarding-doctor.mjs +43 -90
  24. package/scripts/runkit-contract/owner-authority-trust.mjs +230 -0
  25. package/scripts/runkit-contract/owner-deployment-decision.mjs +385 -0
  26. package/scripts/runkit-contract/profile-onboarding.mjs +841 -13
  27. package/scripts/runkit-contract/project-cli-resolver.mjs +701 -0
  28. package/scripts/runkit-contract/project-control-parser.mjs +830 -0
  29. package/scripts/runkit-contract/project-control-state.mjs +28 -0
  30. package/scripts/runkit-contract/provenance-common.mjs +19 -2
  31. package/scripts/runkit-contract/ready-for-commit.mjs +330 -18
  32. package/scripts/runkit-contract/remote-deployment.mjs +1596 -0
  33. package/scripts/runkit-contract/remote-process-adapter.mjs +177 -0
  34. package/scripts/runkit-contract/runkit-bootstrap.mjs +131 -0
  35. package/scripts/runkit-contract/runkit-cli.mjs +1097 -21
  36. package/scripts/runkit-contract/schemas/assurance-route-v1.schema.json +26 -0
  37. package/scripts/runkit-contract/schemas/core-successor-batch-receipt-v1.schema.json +126 -0
  38. package/scripts/runkit-contract/schemas/core-successor-plan-v1.schema.json +155 -0
  39. package/scripts/runkit-contract/schemas/core-successor-project-success-receipt-v1.schema.json +72 -0
  40. package/scripts/runkit-contract/schemas/deployment-execute-request-v1.schema.json +63 -0
  41. package/scripts/runkit-contract/schemas/deployment-lineage-v1.schema.json +292 -0
  42. package/scripts/runkit-contract/schemas/deployment-prepare-receipt-v1.schema.json +140 -0
  43. package/scripts/runkit-contract/schemas/fleet-discovery-v1.schema.json +31 -0
  44. package/scripts/runkit-contract/schemas/fleet-manifest-v1.schema.json +20 -0
  45. package/scripts/runkit-contract/schemas/fleet-root-registry-v1.schema.json +34 -0
  46. package/scripts/runkit-contract/schemas/human-status-v1.schema.json +102 -0
  47. package/scripts/runkit-contract/schemas/owner-authority-trust-v1.schema.json +66 -0
  48. package/scripts/runkit-contract/schemas/owner-deployment-authority-v1.schema.json +46 -0
  49. package/scripts/runkit-contract/schemas/owner-deployment-authority-v2.schema.json +94 -0
  50. package/scripts/runkit-contract/schemas/owner-deployment-decision-v1.schema.json +102 -0
  51. package/scripts/runkit-contract/schemas/owner-migration-authority-v1.schema.json +33 -0
  52. package/scripts/runkit-contract/schemas/owner-migration-authority-v2.schema.json +67 -0
  53. package/scripts/runkit-contract/schemas/profile-apply-receipt-v1.schema.json +32 -0
  54. package/scripts/runkit-contract/schemas/profile-detection-v2.schema.json +145 -0
  55. package/scripts/runkit-contract/schemas/ready-for-commit-v2.schema.json +37 -0
  56. package/scripts/runkit-contract/schemas/remote-deployment-manifest-v1.schema.json +379 -0
  57. package/scripts/runkit-contract/schemas/remote-deployment-result-v1.schema.json +153 -0
  58. package/scripts/runkit-contract/schemas/remote-deployment-stage-journal-v1.schema.json +183 -0
  59. package/scripts/runkit-contract/schemas/remote-target-v1.schema.json +32 -0
  60. package/scripts/runkit-contract/schemas/source-candidate-v2.schema.json +152 -0
  61. package/scripts/runkit-contract/schemas/verification-receipt-v2.schema.json +13 -0
  62. package/scripts/runkit-contract/snapshot.mjs +1 -1
  63. package/scripts/runkit-contract/source-candidate.mjs +1382 -0
  64. package/scripts/runkit-contract/ssh-remote-adapter.mjs +1184 -0
  65. package/scripts/runkit-contract/sync-core016-release-identity.mjs +161 -0
  66. package/scripts/runkit-contract/templates/assurance-request.json +13 -0
  67. package/scripts/runkit-contract/templates/core-successor-owner-authority.json +15 -0
  68. package/scripts/runkit-contract/templates/deployment-execute-request.json +39 -0
  69. package/scripts/runkit-contract/templates/deployment-owner-authority.json +23 -0
  70. package/scripts/runkit-contract/templates/deployment-owner-decision.json +26 -0
  71. package/scripts/runkit-contract/templates/fleet-manifest.json +8 -0
  72. package/scripts/runkit-contract/templates/fleet-root-registry.json +8 -0
  73. package/scripts/runkit-contract/templates/owner-authority-trust.json +16 -0
  74. package/scripts/runkit-contract/templates/ready-for-commit-request.json +2 -2
  75. package/scripts/runkit-contract/templates/remote-deployment-manifest.json +108 -0
  76. package/scripts/runkit-contract/verification-receipt-gate.mjs +28 -0
@@ -0,0 +1,183 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://owlcoda.dev/schemas/runkit/remote-deployment-stage-journal-v1.json",
4
+ "title": "OwlCoda RunKit Remote Deployment Stage Journal V1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schemaVersion"],
8
+ "properties": {
9
+ "schemaVersion": {
10
+ "enum": [
11
+ "OwlCodaRunKitRemoteDeploymentJournalBindingV1",
12
+ "OwlCodaRunKitRemoteStageInvocationBeforeV1",
13
+ "OwlCodaRunKitRemoteStageInvocationAfterV1",
14
+ "OwlCodaRunKitRemoteStageRecoveryV1"
15
+ ]
16
+ },
17
+ "deploymentId": { "type": "string", "minLength": 1 },
18
+ "deploymentLineageSha256": { "$ref": "#/$defs/hash" },
19
+ "remoteManifestSha256": { "$ref": "#/$defs/hash" },
20
+ "executeRequestSha256": { "$ref": "#/$defs/hash" },
21
+ "adapterIdentity": { "$ref": "#/$defs/adapter" },
22
+ "adapterIdentitySha256": { "$ref": "#/$defs/hash" },
23
+ "bindingSha256": { "$ref": "#/$defs/hash" },
24
+ "stage": { "$ref": "#/$defs/stage" },
25
+ "stageOrdinal": { "type": "integer", "minimum": 1, "maximum": 7 },
26
+ "operation": { "enum": ["execute", "reconcile"] },
27
+ "attempt": { "type": "integer", "minimum": 1 },
28
+ "status": {
29
+ "enum": [
30
+ "invocation_started",
31
+ "state_proven_consistent"
32
+ ]
33
+ },
34
+ "outcome": { "enum": ["completed", "indeterminate"] },
35
+ "beforeJournalSha256": { "$ref": "#/$defs/hash" },
36
+ "executeBeforeJournalSha256": { "$ref": "#/$defs/hash" },
37
+ "reconciliationAfterJournalSha256": { "$ref": "#/$defs/hash" },
38
+ "recoveredByJournalSha256": { "$ref": "#/$defs/hash" },
39
+ "stageReceipt": { "type": "object" },
40
+ "authorizationGranted": { "const": false },
41
+ "journalSha256": { "$ref": "#/$defs/hash" }
42
+ },
43
+ "allOf": [
44
+ {
45
+ "if": {
46
+ "properties": {
47
+ "schemaVersion": {
48
+ "const": "OwlCodaRunKitRemoteDeploymentJournalBindingV1"
49
+ }
50
+ }
51
+ },
52
+ "then": {
53
+ "required": [
54
+ "schemaVersion",
55
+ "deploymentId",
56
+ "deploymentLineageSha256",
57
+ "remoteManifestSha256",
58
+ "executeRequestSha256",
59
+ "adapterIdentity",
60
+ "adapterIdentitySha256",
61
+ "authorizationGranted",
62
+ "bindingSha256"
63
+ ]
64
+ }
65
+ },
66
+ {
67
+ "if": {
68
+ "properties": {
69
+ "schemaVersion": {
70
+ "const": "OwlCodaRunKitRemoteStageInvocationBeforeV1"
71
+ }
72
+ }
73
+ },
74
+ "then": {
75
+ "required": [
76
+ "schemaVersion",
77
+ "bindingSha256",
78
+ "deploymentId",
79
+ "deploymentLineageSha256",
80
+ "remoteManifestSha256",
81
+ "executeRequestSha256",
82
+ "adapterIdentitySha256",
83
+ "stage",
84
+ "stageOrdinal",
85
+ "operation",
86
+ "attempt",
87
+ "status",
88
+ "authorizationGranted",
89
+ "journalSha256"
90
+ ]
91
+ }
92
+ },
93
+ {
94
+ "if": {
95
+ "properties": {
96
+ "schemaVersion": {
97
+ "const": "OwlCodaRunKitRemoteStageInvocationAfterV1"
98
+ }
99
+ }
100
+ },
101
+ "then": {
102
+ "required": [
103
+ "schemaVersion",
104
+ "bindingSha256",
105
+ "beforeJournalSha256",
106
+ "stage",
107
+ "operation",
108
+ "attempt",
109
+ "outcome",
110
+ "stageReceipt",
111
+ "authorizationGranted",
112
+ "journalSha256"
113
+ ]
114
+ }
115
+ },
116
+ {
117
+ "if": {
118
+ "properties": {
119
+ "schemaVersion": {
120
+ "const": "OwlCodaRunKitRemoteStageRecoveryV1"
121
+ }
122
+ }
123
+ },
124
+ "then": {
125
+ "required": [
126
+ "schemaVersion",
127
+ "bindingSha256",
128
+ "stage",
129
+ "attempt",
130
+ "executeBeforeJournalSha256",
131
+ "reconciliationAfterJournalSha256",
132
+ "status",
133
+ "stageReceipt",
134
+ "authorizationGranted",
135
+ "journalSha256"
136
+ ]
137
+ }
138
+ }
139
+ ],
140
+ "$defs": {
141
+ "hash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
142
+ "stage": {
143
+ "enum": [
144
+ "identity_preflight",
145
+ "upload",
146
+ "verify_remote_hashes",
147
+ "install",
148
+ "service",
149
+ "proxy",
150
+ "smoke"
151
+ ]
152
+ },
153
+ "adapter": {
154
+ "type": "object",
155
+ "additionalProperties": false,
156
+ "required": ["adapterId", "version", "executable", "sha256"],
157
+ "properties": {
158
+ "adapterId": { "type": "string", "minLength": 1 },
159
+ "version": { "type": "string", "minLength": 1 },
160
+ "executable": { "type": "string", "pattern": "^/" },
161
+ "sha256": { "$ref": "#/$defs/hash" }
162
+ }
163
+ }
164
+ },
165
+ "examples": [
166
+ {
167
+ "schemaVersion": "OwlCodaRunKitRemoteDeploymentJournalBindingV1",
168
+ "deploymentId": "deployment-execute-001",
169
+ "deploymentLineageSha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
170
+ "remoteManifestSha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
171
+ "executeRequestSha256": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
172
+ "adapterIdentity": {
173
+ "adapterId": "builtin-ssh-v1",
174
+ "version": "1.0.0",
175
+ "executable": "/opt/owlcoda/ssh-remote-adapter.mjs",
176
+ "sha256": "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
177
+ },
178
+ "adapterIdentitySha256": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
179
+ "authorizationGranted": false,
180
+ "bindingSha256": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
181
+ }
182
+ ]
183
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://owlcoda.dev/schemas/runkit/remote-target-v1.json",
4
+ "title": "OwlCoda RunKit Remote Target V1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schemaVersion", "targetId", "environment", "host", "port", "user", "hostKeySha256", "machineIdentitySha256"],
8
+ "properties": {
9
+ "schemaVersion": { "const": "OwlCodaRunKitRemoteTargetV1" },
10
+ "targetId": { "$ref": "#/$defs/id" },
11
+ "environment": { "$ref": "#/$defs/id" },
12
+ "host": { "type": "string", "pattern": "^[^\\s/\\\\]+$" },
13
+ "port": { "type": "integer", "minimum": 1, "maximum": 65535 },
14
+ "user": { "type": "string", "pattern": "^[A-Za-z_][A-Za-z0-9._-]*$" },
15
+ "hostKeySha256": { "$ref": "#/$defs/hash" },
16
+ "machineIdentitySha256": { "$ref": "#/$defs/hash" }
17
+ },
18
+ "$defs": {
19
+ "id": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$" },
20
+ "hash": { "type": "string", "pattern": "^[a-f0-9]{64}$" }
21
+ },
22
+ "examples": [{
23
+ "schemaVersion": "OwlCodaRunKitRemoteTargetV1",
24
+ "targetId": "vm-production-01",
25
+ "environment": "production",
26
+ "host": "deploy.example.invalid",
27
+ "port": 22,
28
+ "user": "deploy",
29
+ "hostKeySha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
30
+ "machineIdentitySha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
31
+ }]
32
+ }
@@ -0,0 +1,152 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://owlcoda.dev/schemas/runkit/source-candidate-v2.json",
4
+ "title": "OwlCoda RunKit Source Candidate V2",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schemaVersion", "runId", "candidateId", "status", "sourceMode", "baseline", "sourceManifest", "sourceFingerprint", "payload", "discovery", "repositoryActions", "authorizationGranted", "candidateSha256"],
8
+ "properties": {
9
+ "schemaVersion": { "const": "OwlCodaRunKitSourceCandidateV2" },
10
+ "runId": { "$ref": "#/$defs/id" },
11
+ "candidateId": { "$ref": "#/$defs/id" },
12
+ "status": { "const": "frozen" },
13
+ "sourceMode": { "const": "dirty_worktree_exact_manifest_v2" },
14
+ "baseline": {
15
+ "type": "object",
16
+ "additionalProperties": false,
17
+ "required": ["branch", "head"],
18
+ "properties": {
19
+ "branch": { "type": "string", "minLength": 1 },
20
+ "head": { "type": "string", "pattern": "^[a-f0-9]{40}$" }
21
+ }
22
+ },
23
+ "sourceManifest": { "$ref": "#/$defs/manifest" },
24
+ "sourceFingerprint": {
25
+ "type": "object",
26
+ "additionalProperties": false,
27
+ "required": ["sha256"],
28
+ "properties": { "sha256": { "$ref": "#/$defs/hash" } }
29
+ },
30
+ "payload": { "$ref": "#/$defs/payload" },
31
+ "discovery": {
32
+ "type": "object",
33
+ "additionalProperties": false,
34
+ "required": ["fromLease", "leasePath"],
35
+ "properties": {
36
+ "fromLease": { "$ref": "#/$defs/id" },
37
+ "leasePath": { "type": "string", "minLength": 1 }
38
+ }
39
+ },
40
+ "repositoryActions": { "$ref": "#/$defs/actions" },
41
+ "authorizationGranted": { "const": false },
42
+ "candidateSha256": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" }
43
+ },
44
+ "$defs": {
45
+ "id": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$" },
46
+ "hash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
47
+ "actions": {
48
+ "type": "object",
49
+ "additionalProperties": false,
50
+ "required": ["worktreeCreated", "branchCreated", "staged", "committed", "pushed", "tagged", "published", "deployed"],
51
+ "properties": {
52
+ "worktreeCreated": { "const": false },
53
+ "branchCreated": { "const": false },
54
+ "staged": { "const": false },
55
+ "committed": { "const": false },
56
+ "pushed": { "const": false },
57
+ "tagged": { "const": false },
58
+ "published": { "const": false },
59
+ "deployed": { "const": false }
60
+ }
61
+ },
62
+ "entry": {
63
+ "type": "object",
64
+ "additionalProperties": false,
65
+ "required": ["operation", "status", "path"],
66
+ "properties": {
67
+ "operation": { "enum": ["added", "deleted", "modified", "renamed"] },
68
+ "status": { "type": "string", "minLength": 2 },
69
+ "path": { "type": "string", "minLength": 1 },
70
+ "previousPath": { "type": "string", "minLength": 1 },
71
+ "sha256": { "$ref": "#/$defs/hash" }
72
+ }
73
+ },
74
+ "manifest": {
75
+ "type": "object",
76
+ "additionalProperties": false,
77
+ "required": ["schemaVersion", "statusMode", "ownedPaths", "entries", "sha256"],
78
+ "properties": {
79
+ "schemaVersion": { "const": "OwlCodaRunKitDirtySourceManifestV2" },
80
+ "statusMode": { "const": "porcelain-v1-z-untracked-all-runkit-excluded" },
81
+ "ownedPaths": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } },
82
+ "entries": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/entry" } },
83
+ "sha256": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" }
84
+ }
85
+ },
86
+ "payloadEntry": {
87
+ "type": "object",
88
+ "additionalProperties": false,
89
+ "required": ["path", "payloadPath", "sha256", "sizeBytes", "mode"],
90
+ "properties": {
91
+ "path": { "type": "string", "minLength": 1 },
92
+ "payloadPath": { "type": "string", "minLength": 1 },
93
+ "sha256": { "$ref": "#/$defs/hash" },
94
+ "sizeBytes": { "type": "integer", "minimum": 0 },
95
+ "mode": { "type": "integer", "minimum": 0, "maximum": 511 }
96
+ }
97
+ },
98
+ "payload": {
99
+ "type": "object",
100
+ "additionalProperties": false,
101
+ "required": ["schemaVersion", "storage", "root", "blobCount", "totalBytes", "entries", "sha256"],
102
+ "properties": {
103
+ "schemaVersion": { "const": "OwlCodaRunKitSourcePayloadV1" },
104
+ "storage": { "const": "create_only_content_addressed_sha256" },
105
+ "root": { "type": "string", "minLength": 1 },
106
+ "blobCount": { "type": "integer", "minimum": 0 },
107
+ "totalBytes": { "type": "integer", "minimum": 0 },
108
+ "entries": {
109
+ "type": "array",
110
+ "minItems": 0,
111
+ "items": { "$ref": "#/$defs/payloadEntry" }
112
+ },
113
+ "sha256": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" }
114
+ }
115
+ }
116
+ },
117
+ "examples": [{
118
+ "schemaVersion": "OwlCodaRunKitSourceCandidateV2",
119
+ "runId": "formal-001",
120
+ "candidateId": "candidate-001",
121
+ "status": "frozen",
122
+ "sourceMode": "dirty_worktree_exact_manifest_v2",
123
+ "baseline": { "branch": "codex/release", "head": "1111111111111111111111111111111111111111" },
124
+ "sourceManifest": {
125
+ "schemaVersion": "OwlCodaRunKitDirtySourceManifestV2",
126
+ "statusMode": "porcelain-v1-z-untracked-all-runkit-excluded",
127
+ "ownedPaths": ["src/**"],
128
+ "entries": [{ "operation": "modified", "status": " M", "path": "src/index.mjs", "sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" }],
129
+ "sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
130
+ },
131
+ "sourceFingerprint": { "sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" },
132
+ "payload": {
133
+ "schemaVersion": "OwlCodaRunKitSourcePayloadV1",
134
+ "storage": "create_only_content_addressed_sha256",
135
+ "root": ".owlcoda/runkit/executions/formal-001/source-candidates/candidate-001.payload",
136
+ "blobCount": 1,
137
+ "totalBytes": 12,
138
+ "entries": [{
139
+ "path": "src/index.mjs",
140
+ "payloadPath": ".owlcoda/runkit/executions/formal-001/source-candidates/candidate-001.payload/sha256/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
141
+ "sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
142
+ "sizeBytes": 12,
143
+ "mode": 420
144
+ }],
145
+ "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
146
+ },
147
+ "discovery": { "fromLease": "implementation", "leasePath": ".owlcoda/runkit/executions/formal-001/leases/implementation.json" },
148
+ "repositoryActions": { "worktreeCreated": false, "branchCreated": false, "staged": false, "committed": false, "pushed": false, "tagged": false, "published": false, "deployed": false },
149
+ "authorizationGranted": false,
150
+ "candidateSha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
151
+ }]
152
+ }
@@ -13,6 +13,7 @@
13
13
  "sourceFingerprint": { "$ref": "#/$defs/sha256" },
14
14
  "verificationContextFingerprint": { "$ref": "#/$defs/sha256" },
15
15
  "goalContractSha256": { "$ref": "#/$defs/sha256" },
16
+ "sourceArtifact": { "$ref": "#/$defs/sourceArtifact" },
16
17
  "risk": { "$ref": "#/$defs/risk" },
17
18
  "selectedProfileIds": {
18
19
  "type": "array",
@@ -45,6 +46,18 @@
45
46
  ],
46
47
  "$defs": {
47
48
  "sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
49
+ "sourceArtifact": {
50
+ "type": "object",
51
+ "additionalProperties": false,
52
+ "required": ["kind", "runId", "path", "sha256", "sourceFingerprint"],
53
+ "properties": {
54
+ "kind": { "enum": ["delivery_packet_v1", "source_candidate_v2"] },
55
+ "runId": { "type": "string", "minLength": 1 },
56
+ "path": { "type": "string", "minLength": 1 },
57
+ "sha256": { "$ref": "#/$defs/sha256" },
58
+ "sourceFingerprint": { "$ref": "#/$defs/sha256" }
59
+ }
60
+ },
48
61
  "commandReceipt": {
49
62
  "type": "object",
50
63
  "additionalProperties": false,
@@ -175,7 +175,7 @@ function validateRequest(request) {
175
175
  || typeof entry.version !== "string")) {
176
176
  throw new Error("Snapshot toolVersions must contain name and version.");
177
177
  }
178
- if (!Array.isArray(request.selectedPaths) || request.selectedPaths.length === 0) {
178
+ if (!Array.isArray(request.selectedPaths)) {
179
179
  throw new Error("Snapshot requires selectedPaths.");
180
180
  }
181
181
  if (request.statusMode !== STATUS_MODE) {