release-skill 0.9.17 → 0.9.19
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.
- package/.claude-plugin/plugin.json +1 -1
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +2 -2
- package/.cursor-plugin/plugin.json +10 -0
- package/.kimi-plugin/plugin.json +1 -1
- package/.qoder-plugin/plugin.json +1 -1
- package/CHANGELOG.md +70 -2
- package/INSTALL.md +66 -9
- package/INSTALL.zh-CN.md +49 -8
- package/README.md +41 -20
- package/README.zh-CN.md +31 -19
- package/adapters/claude/.claude-plugin/plugin.json +1 -1
- package/adapters/claude/bin/consumer-contract-vectors.json +7 -7
- package/adapters/claude/bin/error-codes.json +1 -1
- package/adapters/claude/bin/foundation-resource-binding.json +1 -1
- package/adapters/claude/bin/prebuild-manifest.json +8 -4
- package/adapters/claude/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
- package/adapters/claude/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
- package/adapters/claude/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
- package/adapters/claude/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
- package/adapters/claude/bin/registry.json +1 -1
- package/adapters/claude/bin/release-skill.bundle.mjs +4425 -1519
- package/adapters/claude/bin/rules.json +1 -1
- package/adapters/claude/data/hosts/cursor/host-descriptor.json +34 -0
- package/adapters/claude/data/hosts/registry.json +1 -0
- package/adapters/claude/schemas/release-plan.schema.json +255 -25
- package/adapters/claude/schemas/release-project.schema.json +228 -26
- package/adapters/claude/skills/release-finish/SKILL.md +46 -7
- package/adapters/claude/skills/release-help/SKILL.md +47 -103
- package/adapters/claude/skills/release-verify/SKILL.md +2 -2
- package/adapters/claude/src/schemas/host-descriptor.schema.json +9 -2
- package/adapters/codex/.codex-plugin/plugin.json +2 -2
- package/adapters/codex/bin/consumer-contract-vectors.json +7 -7
- package/adapters/codex/bin/error-codes.json +1 -1
- package/adapters/codex/bin/foundation-resource-binding.json +1 -1
- package/adapters/codex/bin/prebuild-manifest.json +8 -4
- package/adapters/codex/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
- package/adapters/codex/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
- package/adapters/codex/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
- package/adapters/codex/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
- package/adapters/codex/bin/registry.json +1 -1
- package/adapters/codex/bin/release-skill.bundle.mjs +4425 -1519
- package/adapters/codex/bin/rules.json +1 -1
- package/adapters/codex/data/hosts/cursor/host-descriptor.json +34 -0
- package/adapters/codex/data/hosts/registry.json +1 -0
- package/adapters/codex/schemas/release-plan.schema.json +255 -25
- package/adapters/codex/schemas/release-project.schema.json +228 -26
- package/adapters/codex/skills/release-finish/SKILL.md +46 -7
- package/adapters/codex/skills/release-help/SKILL.md +49 -105
- package/adapters/codex/skills/release-verify/SKILL.md +2 -2
- package/adapters/codex/src/schemas/host-descriptor.schema.json +9 -2
- package/adapters/cursor/.cursor-plugin/plugin.json +10 -0
- package/adapters/cursor/bin/consumer-contract-vectors.json +110 -0
- package/adapters/cursor/bin/error-codes.json +161 -0
- package/adapters/cursor/bin/foundation-legal/skill-family-contracts/LICENSE +202 -0
- package/adapters/cursor/bin/foundation-legal/skill-family-contracts/NOTICE +10 -0
- package/adapters/cursor/bin/foundation-legal/skill-family-engineering-kit/LICENSE +202 -0
- package/adapters/cursor/bin/foundation-legal/skill-family-engineering-kit/NOTICE +10 -0
- package/adapters/cursor/bin/foundation-legal/skill-family-engineering-kit/THIRD_PARTY_NOTICES +142 -0
- package/adapters/cursor/bin/foundation-legal/skill-family-harness-node/LICENSE +202 -0
- package/adapters/cursor/bin/foundation-legal/skill-family-harness-node/NOTICE +10 -0
- package/adapters/cursor/bin/foundation-legal/skill-family-harness-node/native-NOTICE +2 -0
- package/adapters/cursor/bin/foundation-resource-binding.json +1 -0
- package/adapters/cursor/bin/kernel-protocol.json +60 -0
- package/adapters/cursor/bin/license-texts/Apache-2.0.txt +201 -0
- package/adapters/cursor/bin/license-texts/MIT.txt +21 -0
- package/adapters/cursor/bin/prebuild-manifest.json +83 -0
- package/adapters/cursor/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
- package/adapters/cursor/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
- package/adapters/cursor/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
- package/adapters/cursor/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
- package/adapters/cursor/bin/registry.json +347 -0
- package/adapters/cursor/bin/release-skill-local-finish.mjs +4 -0
- package/adapters/cursor/bin/release-skill.bundle.mjs +152352 -0
- package/adapters/cursor/bin/release-skill.mjs +54 -0
- package/adapters/cursor/bin/rules.json +104 -0
- package/adapters/cursor/bin/schemas/consumer-contract-vector.schema.json +149 -0
- package/adapters/cursor/data/hosts/claude/host-descriptor.json +45 -0
- package/adapters/cursor/data/hosts/codebuddy/host-descriptor.json +26 -0
- package/adapters/cursor/data/hosts/codex/host-descriptor.json +45 -0
- package/adapters/cursor/data/hosts/cursor/host-descriptor.json +34 -0
- package/adapters/cursor/data/hosts/deepseek-harness/host-descriptor.json +23 -0
- package/adapters/cursor/data/hosts/kimi-code/host-descriptor.json +36 -0
- package/adapters/cursor/data/hosts/qoder/host-descriptor.json +26 -0
- package/adapters/cursor/data/hosts/registry.json +14 -0
- package/adapters/cursor/data/hosts/workbuddy/host-descriptor.json +34 -0
- package/adapters/cursor/data/licensing/registry.json +211 -0
- package/adapters/cursor/data/licensing/schema.json +207 -0
- package/adapters/cursor/native/safe-write/binding.gyp +41 -0
- package/adapters/cursor/native/safe-write/prebuilds/darwin-arm64/safe_write.node +0 -0
- package/adapters/cursor/native/safe-write/prebuilds.json +24 -0
- package/adapters/cursor/native/safe-write/src/safe_write.cc +2032 -0
- package/adapters/cursor/schemas/.render-manifest.json +41 -0
- package/adapters/cursor/schemas/approval-record.schema.json +115 -0
- package/adapters/cursor/schemas/artifact-lock.schema.json +111 -0
- package/adapters/cursor/schemas/artifact-plan.schema.json +52 -0
- package/adapters/cursor/schemas/artifact-policy.schema.json +76 -0
- package/adapters/cursor/schemas/evidence-event-v2.schema.json +164 -0
- package/adapters/cursor/schemas/evidence-event.schema.json +89 -0
- package/adapters/cursor/schemas/postpublish-approval-record.schema.json +47 -0
- package/adapters/cursor/schemas/release-plan.schema.json +2226 -0
- package/adapters/cursor/schemas/release-project.schema.json +1815 -0
- package/adapters/cursor/schemas/release-run.schema.json +777 -0
- package/adapters/cursor/skills/release-assess/SKILL.md +61 -0
- package/adapters/cursor/skills/release-config/SKILL.md +151 -0
- package/adapters/cursor/skills/release-docs/SKILL.md +120 -0
- package/adapters/cursor/skills/release-finish/SKILL.md +181 -0
- package/adapters/cursor/skills/release-help/SKILL.md +98 -0
- package/adapters/cursor/skills/release-marketplace/SKILL.md +157 -0
- package/adapters/cursor/skills/release-prepare/SKILL.md +136 -0
- package/adapters/cursor/skills/release-publish/SKILL.md +92 -0
- package/adapters/cursor/skills/release-reconcile/SKILL.md +81 -0
- package/adapters/cursor/skills/release-setup/SKILL.md +132 -0
- package/adapters/cursor/skills/release-verify/SKILL.md +110 -0
- package/adapters/cursor/src/schemas/adapter-build-manifest.schema.json +41 -0
- package/adapters/cursor/src/schemas/adapter-peer-verification-request.schema.json +54 -0
- package/adapters/cursor/src/schemas/adapter-peer-verification-result.schema.json +54 -0
- package/adapters/cursor/src/schemas/adapter-source.schema.json +47 -0
- package/adapters/cursor/src/schemas/audit-baseline-pin.schema.json +163 -0
- package/adapters/cursor/src/schemas/declared-read-surface-result.schema.json +61 -0
- package/adapters/cursor/src/schemas/engineering-baseline.schema.json +77 -0
- package/adapters/cursor/src/schemas/executable-identity-observation.schema.json +162 -0
- package/adapters/cursor/src/schemas/filesystem-root-binding.schema.json +14 -0
- package/adapters/cursor/src/schemas/filesystem-tree-observation.schema.json +71 -0
- package/adapters/cursor/src/schemas/fixed-set-publication-manifest.schema.json +108 -0
- package/adapters/cursor/src/schemas/fixed-set-publication-receipt.schema.json +148 -0
- package/adapters/cursor/src/schemas/host-capability-fact.schema.json +31 -0
- package/adapters/cursor/src/schemas/host-descriptor.schema.json +144 -0
- package/adapters/cursor/src/schemas/host-operation-plan.schema.json +57 -0
- package/adapters/cursor/src/schemas/host-operation-receipt.schema.json +81 -0
- package/adapters/cursor/src/schemas/host-probe-result.schema.json +30 -0
- package/adapters/cursor/src/schemas/host-registry.schema.json +18 -0
- package/adapters/cursor/src/schemas/host-verification-request.schema.json +67 -0
- package/adapters/cursor/src/schemas/host-verification-result.schema.json +149 -0
- package/adapters/cursor/src/schemas/managed-file-lock.schema.json +77 -0
- package/adapters/cursor/src/schemas/migration-manifest.schema.json +412 -0
- package/adapters/cursor/src/schemas/observation-scope.schema.json +91 -0
- package/adapters/cursor/src/schemas/operation-request.schema.json +58 -0
- package/adapters/cursor/src/schemas/operation-result.schema.json +130 -0
- package/adapters/cursor/src/schemas/platform-difference-registry.schema.json +110 -0
- package/adapters/cursor/src/schemas/plugin-verification-request.schema.json +499 -0
- package/adapters/cursor/src/schemas/plugin-verification-result.schema.json +1217 -0
- package/adapters/cursor/src/schemas/profile-adoption-declaration.schema.json +111 -0
- package/adapters/cursor/src/schemas/profile-descriptor.schema.json +99 -0
- package/adapters/cursor/src/schemas/project-manifest.schema.json +67 -0
- package/adapters/cursor/src/schemas/project-profile.schema.json +25 -0
- package/adapters/cursor/src/schemas/public-boundary-declaration.schema.json +73 -0
- package/adapters/cursor/src/schemas/report-binding.schema.json +42 -0
- package/adapters/cursor/src/schemas/report-model.schema.json +308 -0
- package/adapters/cursor/src/schemas/skill-family-directory-verification-request.schema.json +100 -0
- package/adapters/cursor/src/schemas/skill-family-directory-verification-result.schema.json +193 -0
- package/adapters/cursor/src/schemas/source-authority-receipt.schema.json +31 -0
- package/adapters/cursor/src/schemas/state-event-envelope.schema.json +38 -0
- package/adapters/cursor/src/schemas/state-snapshot-metadata.schema.json +25 -0
- package/adapters/cursor/src/schemas/structured-scan-policy.schema.json +97 -0
- package/adapters/cursor/src/schemas/surface-scan-policy.schema.json +42 -0
- package/adapters/cursor/src/schemas/timeout-policy.schema.json +24 -0
- package/adapters/cursor/src/schemas/token-estimate-record.schema.json +75 -0
- package/adapters/cursor/src/schemas/token-estimate-result.schema.json +43 -0
- package/adapters/cursor/src/schemas/watchdog-termination-envelope.schema.json +156 -0
- package/adapters/kimi/.kimi-plugin/plugin.json +1 -1
- package/adapters/kimi/bin/consumer-contract-vectors.json +7 -7
- package/adapters/kimi/bin/error-codes.json +1 -1
- package/adapters/kimi/bin/foundation-resource-binding.json +1 -1
- package/adapters/kimi/bin/prebuild-manifest.json +8 -4
- package/adapters/kimi/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
- package/adapters/kimi/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
- package/adapters/kimi/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
- package/adapters/kimi/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
- package/adapters/kimi/bin/registry.json +1 -1
- package/adapters/kimi/bin/release-skill.bundle.mjs +4425 -1519
- package/adapters/kimi/bin/rules.json +1 -1
- package/adapters/kimi/data/hosts/cursor/host-descriptor.json +34 -0
- package/adapters/kimi/data/hosts/registry.json +1 -0
- package/adapters/kimi/schemas/release-plan.schema.json +255 -25
- package/adapters/kimi/schemas/release-project.schema.json +228 -26
- package/adapters/kimi/skills/release-finish/SKILL.md +46 -7
- package/adapters/kimi/skills/release-help/SKILL.md +49 -105
- package/adapters/kimi/skills/release-verify/SKILL.md +2 -2
- package/adapters/kimi/src/schemas/host-descriptor.schema.json +9 -2
- package/adapters/qoder/.qoder-plugin/plugin.json +1 -1
- package/adapters/qoder/bin/consumer-contract-vectors.json +7 -7
- package/adapters/qoder/bin/error-codes.json +1 -1
- package/adapters/qoder/bin/foundation-resource-binding.json +1 -1
- package/adapters/qoder/bin/prebuild-manifest.json +8 -4
- package/adapters/qoder/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
- package/adapters/qoder/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
- package/adapters/qoder/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
- package/adapters/qoder/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
- package/adapters/qoder/bin/registry.json +1 -1
- package/adapters/qoder/bin/release-skill.bundle.mjs +4425 -1519
- package/adapters/qoder/bin/rules.json +1 -1
- package/adapters/qoder/data/hosts/cursor/host-descriptor.json +34 -0
- package/adapters/qoder/data/hosts/registry.json +1 -0
- package/adapters/qoder/schemas/release-plan.schema.json +255 -25
- package/adapters/qoder/schemas/release-project.schema.json +228 -26
- package/adapters/qoder/skills/release-finish/SKILL.md +46 -7
- package/adapters/qoder/skills/release-help/SKILL.md +49 -105
- package/adapters/qoder/skills/release-verify/SKILL.md +2 -2
- package/adapters/qoder/src/schemas/host-descriptor.schema.json +9 -2
- package/adapters/workbuddy/.codebuddy-plugin/plugin.json +1 -1
- package/adapters/workbuddy/bin/consumer-contract-vectors.json +7 -7
- package/adapters/workbuddy/bin/error-codes.json +1 -1
- package/adapters/workbuddy/bin/foundation-resource-binding.json +1 -1
- package/adapters/workbuddy/bin/prebuild-manifest.json +8 -4
- package/adapters/workbuddy/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
- package/adapters/workbuddy/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
- package/adapters/workbuddy/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
- package/adapters/workbuddy/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
- package/adapters/workbuddy/bin/registry.json +1 -1
- package/adapters/workbuddy/bin/release-skill.bundle.mjs +4425 -1519
- package/adapters/workbuddy/bin/rules.json +1 -1
- package/adapters/workbuddy/data/hosts/cursor/host-descriptor.json +34 -0
- package/adapters/workbuddy/data/hosts/registry.json +1 -0
- package/adapters/workbuddy/schemas/release-plan.schema.json +255 -25
- package/adapters/workbuddy/schemas/release-project.schema.json +228 -26
- package/adapters/workbuddy/skills/release-finish/SKILL.md +46 -7
- package/adapters/workbuddy/skills/release-help/SKILL.md +47 -103
- package/adapters/workbuddy/skills/release-verify/SKILL.md +2 -2
- package/adapters/workbuddy/src/schemas/host-descriptor.schema.json +9 -2
- package/bin/consumer-contract-vectors.json +7 -7
- package/bin/error-codes.json +1 -1
- package/bin/foundation-resource-binding.json +1 -1
- package/bin/prebuild-manifest.json +8 -4
- package/bin/prebuilds/darwin-arm64/bound_read.darwin-arm64.node +0 -0
- package/bin/prebuilds/darwin-x64/bound_read.darwin-x64.node +0 -0
- package/bin/prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node +0 -0
- package/bin/prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node +0 -0
- package/bin/registry.json +1 -1
- package/bin/release-skill-cli.mjs +115 -15
- package/bin/release-skill.bundle.mjs +4425 -1519
- package/bin/rules.json +1 -1
- package/data/hosts/cursor/host-descriptor.json +34 -0
- package/data/hosts/registry.json +1 -0
- package/package.json +7 -5
- package/platform-manifest.json +75 -9
- package/references/02-project-config.md +4 -0
- package/schemas/release-plan.schema.json +255 -25
- package/schemas/release-project.schema.json +228 -26
- package/scripts/sync-public-files.mjs +3 -22
- package/skills/release-finish/SKILL.md +46 -7
- package/skills/release-help/SKILL.md +47 -103
- package/skills/release-verify/SKILL.md +2 -2
- package/skills-src/release-finish/SKILL.md +46 -7
- package/skills-src/release-help/SKILL.md +47 -103
- package/skills-src/release-verify/SKILL.md +2 -2
- package/src/adapters/contract.mjs +1 -0
- package/src/adapters/plugin-marketplace.mjs +201 -9
- package/src/commands/post-release-finish.mjs +448 -0
- package/src/commands/post-release-local.mjs +312 -36
- package/src/commands/prepare.mjs +74 -9
- package/src/commands/publish.mjs +4 -1
- package/src/commands/ship.mjs +3 -0
- package/src/commands/verify.mjs +73 -0
- package/src/core/checkpoints.mjs +5 -2
- package/src/core/config.mjs +1 -1
- package/src/core/foundation-host-verification.mjs +168 -0
- package/src/core/plan.mjs +19 -1
- package/src/core/postpublish.mjs +9 -1
- package/src/core/run-retention.mjs +1 -1
- package/src/core/surface-host-bindings.mjs +1 -0
- package/src/core/verification-gates.mjs +1 -1
- package/src/platforms/registry.mjs +225 -16
- package/src/producers/build-adapters.mjs +21 -26
- package/src/producers/foundation-resource-projection.mjs +3 -3
- package/src/schemas/host-descriptor.schema.json +9 -2
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://contracts.skill-family.example/v1/migration-manifest.json",
|
|
4
|
+
"title": "MigrationManifest",
|
|
5
|
+
"description": "Declares the migration state of one adoption target: the legacy infrastructure entries that must exit, each bound to its replacement, and any temporary exceptions. Every temporary exception carries exactly four mandatory fields (owner, reason, deadline, migrationTarget); an incomplete exception is never accepted. Path containment beyond shape is a mechanism concern owned by the harness: user-provided paths are only ever read inside the target root.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["schemaVersion", "kind"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"schemaVersion": {
|
|
11
|
+
"const": 1
|
|
12
|
+
},
|
|
13
|
+
"kind": {
|
|
14
|
+
"const": "skill-family.migration-manifest"
|
|
15
|
+
},
|
|
16
|
+
"capabilityUseContext": {
|
|
17
|
+
"type": "object",
|
|
18
|
+
"additionalProperties": false,
|
|
19
|
+
"required": ["scope", "locale"],
|
|
20
|
+
"properties": {
|
|
21
|
+
"scope": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"enum": ["contracts", "harness", "engineering-kit", "profile", "all"]
|
|
24
|
+
},
|
|
25
|
+
"locale": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"enum": ["en", "zh-CN"]
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"capabilityUses": {
|
|
32
|
+
"type": "array",
|
|
33
|
+
"minItems": 1,
|
|
34
|
+
"maxItems": 200,
|
|
35
|
+
"items": {
|
|
36
|
+
"type": "object",
|
|
37
|
+
"additionalProperties": false,
|
|
38
|
+
"required": ["useId", "problemStatement", "constraints", "retainedGuarantees"],
|
|
39
|
+
"properties": {
|
|
40
|
+
"useId": {
|
|
41
|
+
"type": "string",
|
|
42
|
+
"pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$",
|
|
43
|
+
"maxLength": 80
|
|
44
|
+
},
|
|
45
|
+
"problemStatement": {
|
|
46
|
+
"allOf": [
|
|
47
|
+
{ "$ref": "#/$defs/trimmedCapabilityUseText" },
|
|
48
|
+
{ "type": "string", "maxLength": 1000 }
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
"constraints": {
|
|
52
|
+
"type": "array",
|
|
53
|
+
"maxItems": 20,
|
|
54
|
+
"uniqueItems": true,
|
|
55
|
+
"items": {
|
|
56
|
+
"allOf": [
|
|
57
|
+
{ "$ref": "#/$defs/trimmedCapabilityUseText" },
|
|
58
|
+
{ "type": "string", "maxLength": 500 }
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"retainedGuarantees": {
|
|
63
|
+
"type": "array",
|
|
64
|
+
"minItems": 1,
|
|
65
|
+
"maxItems": 20,
|
|
66
|
+
"uniqueItems": true,
|
|
67
|
+
"items": {
|
|
68
|
+
"allOf": [
|
|
69
|
+
{ "$ref": "#/$defs/trimmedCapabilityUseText" },
|
|
70
|
+
{ "type": "string", "maxLength": 500 }
|
|
71
|
+
]
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
"catalogFilters": {
|
|
75
|
+
"type": "array",
|
|
76
|
+
"maxItems": 20,
|
|
77
|
+
"uniqueItems": true,
|
|
78
|
+
"items": {
|
|
79
|
+
"allOf": [
|
|
80
|
+
{ "$ref": "#/$defs/trimmedCapabilityUseText" },
|
|
81
|
+
{ "type": "string", "maxLength": 200 }
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"capabilityDecisions": {
|
|
89
|
+
"type": "array",
|
|
90
|
+
"items": {
|
|
91
|
+
"type": "object",
|
|
92
|
+
"additionalProperties": false,
|
|
93
|
+
"required": ["useId", "disposition", "reason"],
|
|
94
|
+
"properties": {
|
|
95
|
+
"useId": {
|
|
96
|
+
"type": "string",
|
|
97
|
+
"pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$",
|
|
98
|
+
"maxLength": 80
|
|
99
|
+
},
|
|
100
|
+
"disposition": {
|
|
101
|
+
"type": "string",
|
|
102
|
+
"enum": ["direct-adoption", "compatibility-layer", "keep-business", "foundation-gap"]
|
|
103
|
+
},
|
|
104
|
+
"targetCapability": {
|
|
105
|
+
"type": "string",
|
|
106
|
+
"pattern": "^foundation\\.[a-z0-9\\-]+(\\.[a-z0-9\\-]+)+$"
|
|
107
|
+
},
|
|
108
|
+
"reason": {
|
|
109
|
+
"type": "string",
|
|
110
|
+
"minLength": 1,
|
|
111
|
+
"maxLength": 1000
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
"allOf": [
|
|
115
|
+
{
|
|
116
|
+
"if": {
|
|
117
|
+
"required": ["disposition"],
|
|
118
|
+
"properties": {
|
|
119
|
+
"disposition": {
|
|
120
|
+
"enum": ["direct-adoption", "compatibility-layer"]
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
"then": {
|
|
125
|
+
"required": ["targetCapability"],
|
|
126
|
+
"properties": { "targetCapability": { "type": "string" } }
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"if": {
|
|
131
|
+
"required": ["disposition"],
|
|
132
|
+
"properties": {
|
|
133
|
+
"disposition": {
|
|
134
|
+
"enum": ["keep-business", "foundation-gap"]
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
"then": {
|
|
139
|
+
"not": {
|
|
140
|
+
"required": ["targetCapability"],
|
|
141
|
+
"properties": { "targetCapability": { "type": "string" } }
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
]
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
"manifestVersion": {
|
|
149
|
+
"type": "integer",
|
|
150
|
+
"minimum": 1,
|
|
151
|
+
"description": "Monotonic manifest generation; bumped whenever the declared legacy/exception set changes."
|
|
152
|
+
},
|
|
153
|
+
"legacyInfra": {
|
|
154
|
+
"type": "array",
|
|
155
|
+
"items": {
|
|
156
|
+
"type": "object",
|
|
157
|
+
"additionalProperties": false,
|
|
158
|
+
"required": ["path", "replacedBy"],
|
|
159
|
+
"properties": {
|
|
160
|
+
"path": {
|
|
161
|
+
"type": "string",
|
|
162
|
+
"pattern": "^[A-Za-z0-9._-]+(/[A-Za-z0-9._-]+)*$",
|
|
163
|
+
"description": "Relative POSIX path of one legacy implementation. Shape only: absolute paths, traversal, UNC/drive forms and symlink escapes are rejected by harness containment at assessment time, fail-closed."
|
|
164
|
+
},
|
|
165
|
+
"replacedBy": {
|
|
166
|
+
"oneOf": [
|
|
167
|
+
{ "type": "string", "minLength": 1 },
|
|
168
|
+
{ "type": "null" }
|
|
169
|
+
],
|
|
170
|
+
"description": "The replacement facility (tool/command/module) that supersedes this legacy entry. An empty replacement is never a valid exit claim."
|
|
171
|
+
},
|
|
172
|
+
"useId": {
|
|
173
|
+
"type": "string",
|
|
174
|
+
"pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$",
|
|
175
|
+
"maxLength": 80
|
|
176
|
+
},
|
|
177
|
+
"recoveryRef": {
|
|
178
|
+
"type": "string",
|
|
179
|
+
"minLength": 1
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
"allOf": [
|
|
183
|
+
{
|
|
184
|
+
"if": {
|
|
185
|
+
"required": ["replacedBy"],
|
|
186
|
+
"properties": { "replacedBy": { "type": "null" } }
|
|
187
|
+
},
|
|
188
|
+
"then": {
|
|
189
|
+
"required": ["useId"],
|
|
190
|
+
"properties": { "useId": { "type": "string" } }
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
]
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
"legacyReferences": {
|
|
197
|
+
"type": "array",
|
|
198
|
+
"description": "Legacy text references that must exit from retained files: each entry declares a file that is kept for other purposes, a literal text that must no longer appear in it, and the facility that replaces the old usage. The file itself is never deleted by this mechanism — only the old text must be absent.",
|
|
199
|
+
"items": {
|
|
200
|
+
"type": "object",
|
|
201
|
+
"additionalProperties": false,
|
|
202
|
+
"required": ["path", "text", "replacedBy"],
|
|
203
|
+
"properties": {
|
|
204
|
+
"path": {
|
|
205
|
+
"type": "string",
|
|
206
|
+
"pattern": "^[A-Za-z0-9._-]+(/[A-Za-z0-9._-]+)*$",
|
|
207
|
+
"description": "Relative POSIX path of a retained file. Shape only: containment is enforced at assessment time."
|
|
208
|
+
},
|
|
209
|
+
"text": {
|
|
210
|
+
"type": "string",
|
|
211
|
+
"minLength": 1,
|
|
212
|
+
"description": "Exact literal text that must be absent from the file. No regex; byte-exact UTF-8 match."
|
|
213
|
+
},
|
|
214
|
+
"replacedBy": {
|
|
215
|
+
"oneOf": [
|
|
216
|
+
{ "type": "string", "minLength": 1 },
|
|
217
|
+
{ "type": "null" }
|
|
218
|
+
],
|
|
219
|
+
"description": "The replacement facility that supersedes this old reference. Empty is never valid."
|
|
220
|
+
},
|
|
221
|
+
"useId": {
|
|
222
|
+
"type": "string",
|
|
223
|
+
"pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$",
|
|
224
|
+
"maxLength": 80
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
"allOf": [
|
|
228
|
+
{
|
|
229
|
+
"if": {
|
|
230
|
+
"required": ["replacedBy"],
|
|
231
|
+
"properties": { "replacedBy": { "type": "null" } }
|
|
232
|
+
},
|
|
233
|
+
"then": {
|
|
234
|
+
"required": ["useId"],
|
|
235
|
+
"properties": { "useId": { "type": "string" } }
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
]
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
"exceptions": {
|
|
242
|
+
"type": "array",
|
|
243
|
+
"items": {
|
|
244
|
+
"type": "object",
|
|
245
|
+
"additionalProperties": false,
|
|
246
|
+
"required": ["owner", "reason", "deadline", "migrationTarget"],
|
|
247
|
+
"properties": {
|
|
248
|
+
"owner": {
|
|
249
|
+
"type": "string",
|
|
250
|
+
"minLength": 1
|
|
251
|
+
},
|
|
252
|
+
"reason": {
|
|
253
|
+
"type": "string",
|
|
254
|
+
"minLength": 1
|
|
255
|
+
},
|
|
256
|
+
"deadline": {
|
|
257
|
+
"type": "string",
|
|
258
|
+
"minLength": 1,
|
|
259
|
+
"description": "Parseable deadline; expiry is judged by the planning clock and never auto-renewed. Structural shape only — semantic parseability is a runtime finding."
|
|
260
|
+
},
|
|
261
|
+
"migrationTarget": {
|
|
262
|
+
"type": "string",
|
|
263
|
+
"minLength": 1
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
},
|
|
268
|
+
"targetProfile": {
|
|
269
|
+
"type": "string",
|
|
270
|
+
"minLength": 1,
|
|
271
|
+
"description": "The profile id this target adopts. Completion requires it to equal the profile id of the adoption plan; a missing or mismatched binding is never completion."
|
|
272
|
+
},
|
|
273
|
+
"foundationPackages": {
|
|
274
|
+
"type": "array",
|
|
275
|
+
"description": "Exact Foundation package bindings: every entry pins a published name to an exact version and a sha256 tarball/content digest. Ranges, tags and floating aliases are not bindings.",
|
|
276
|
+
"items": {
|
|
277
|
+
"type": "object",
|
|
278
|
+
"additionalProperties": false,
|
|
279
|
+
"required": ["name", "version", "digest"],
|
|
280
|
+
"properties": {
|
|
281
|
+
"name": {
|
|
282
|
+
"type": "string",
|
|
283
|
+
"minLength": 1
|
|
284
|
+
},
|
|
285
|
+
"version": {
|
|
286
|
+
"type": "string",
|
|
287
|
+
"pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
|
|
288
|
+
"description": "Exact semver; no range operators."
|
|
289
|
+
},
|
|
290
|
+
"digest": {
|
|
291
|
+
"type": "string",
|
|
292
|
+
"pattern": "^sha256:[a-f0-9]{64}$",
|
|
293
|
+
"description": "Content digest as sha256:<64 lowercase hex>."
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
},
|
|
298
|
+
"verification": {
|
|
299
|
+
"type": "object",
|
|
300
|
+
"additionalProperties": false,
|
|
301
|
+
"description": "Evidence documents proving the adoption is verified: unit, integration, consumer and independent-audit evidence. Every value is a relative POSIX path inside the target root; existence and identity matching are judged by the completion gate, fail-closed.",
|
|
302
|
+
"properties": {
|
|
303
|
+
"unit": {
|
|
304
|
+
"type": "string",
|
|
305
|
+
"pattern": "^[A-Za-z0-9._-]+(/[A-Za-z0-9._-]+)*$"
|
|
306
|
+
},
|
|
307
|
+
"integration": {
|
|
308
|
+
"type": "string",
|
|
309
|
+
"pattern": "^[A-Za-z0-9._-]+(/[A-Za-z0-9._-]+)*$"
|
|
310
|
+
},
|
|
311
|
+
"consumer": {
|
|
312
|
+
"type": "string",
|
|
313
|
+
"pattern": "^[A-Za-z0-9._-]+(/[A-Za-z0-9._-]+)*$"
|
|
314
|
+
},
|
|
315
|
+
"independentAudit": {
|
|
316
|
+
"type": "string",
|
|
317
|
+
"pattern": "^[A-Za-z0-9._-]+(/[A-Za-z0-9._-]+)*$"
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
},
|
|
322
|
+
"$defs": {
|
|
323
|
+
"trimmedCapabilityUseText": {
|
|
324
|
+
"type": "string",
|
|
325
|
+
"minLength": 1,
|
|
326
|
+
"pattern": "^(?!\\s)(?![\\s\\S]*\\s$)(?![\\s\\S]*\\u0000)[\\s\\S]+$"
|
|
327
|
+
}
|
|
328
|
+
},
|
|
329
|
+
"allOf": [
|
|
330
|
+
{
|
|
331
|
+
"if": {
|
|
332
|
+
"required": ["capabilityUses"],
|
|
333
|
+
"properties": { "capabilityUses": { "type": "array" } }
|
|
334
|
+
},
|
|
335
|
+
"then": {
|
|
336
|
+
"required": ["capabilityUseContext"],
|
|
337
|
+
"properties": { "capabilityUseContext": { "type": "object" } }
|
|
338
|
+
},
|
|
339
|
+
"else": {
|
|
340
|
+
"not": {
|
|
341
|
+
"anyOf": [
|
|
342
|
+
{
|
|
343
|
+
"required": ["capabilityUseContext"],
|
|
344
|
+
"properties": { "capabilityUseContext": { "type": "object" } }
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
"required": ["capabilityDecisions"],
|
|
348
|
+
"properties": { "capabilityDecisions": { "type": "array" } }
|
|
349
|
+
}
|
|
350
|
+
]
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
"if": {
|
|
356
|
+
"required": ["capabilityDecisions"],
|
|
357
|
+
"properties": { "capabilityDecisions": { "type": "array" } }
|
|
358
|
+
},
|
|
359
|
+
"then": {
|
|
360
|
+
"required": ["capabilityUses", "capabilityUseContext"],
|
|
361
|
+
"properties": {
|
|
362
|
+
"capabilityUses": { "type": "array" },
|
|
363
|
+
"capabilityUseContext": { "type": "object" }
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
"if": {
|
|
369
|
+
"required": ["legacyInfra"],
|
|
370
|
+
"properties": {
|
|
371
|
+
"legacyInfra": {
|
|
372
|
+
"type": "array",
|
|
373
|
+
"contains": {
|
|
374
|
+
"type": "object",
|
|
375
|
+
"required": ["useId"],
|
|
376
|
+
"properties": { "useId": { "type": "string" } }
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
},
|
|
381
|
+
"then": {
|
|
382
|
+
"required": ["capabilityUses", "capabilityUseContext"],
|
|
383
|
+
"properties": {
|
|
384
|
+
"capabilityUses": { "type": "array" },
|
|
385
|
+
"capabilityUseContext": { "type": "object" }
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
"if": {
|
|
391
|
+
"required": ["legacyReferences"],
|
|
392
|
+
"properties": {
|
|
393
|
+
"legacyReferences": {
|
|
394
|
+
"type": "array",
|
|
395
|
+
"contains": {
|
|
396
|
+
"type": "object",
|
|
397
|
+
"required": ["useId"],
|
|
398
|
+
"properties": { "useId": { "type": "string" } }
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
},
|
|
403
|
+
"then": {
|
|
404
|
+
"required": ["capabilityUses", "capabilityUseContext"],
|
|
405
|
+
"properties": {
|
|
406
|
+
"capabilityUses": { "type": "array" },
|
|
407
|
+
"capabilityUseContext": { "type": "object" }
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
]
|
|
412
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://contracts.skill-family.example/v1/observation-scope.json",
|
|
4
|
+
"title": "ObservationScope",
|
|
5
|
+
"description": "Observation scope extension (aligned with the audit-side plugin-project observation schema v2). Freezes the controlled vocabularies an observation record may use: observation scopes, the standard platform set (including the qoder/dsh extensions), severity levels, foundation adoption statuses, the path basis, token measurement subjects, missing-platform intents, and consumption forms. An observation record is conformant only when every vocabulary value it uses is contained in the frozen sets declared here; this object is the single mechanical reference so the two repositories never restate the vocabularies independently.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": [
|
|
9
|
+
"schemaVersion",
|
|
10
|
+
"kind",
|
|
11
|
+
"scopeVocabulary",
|
|
12
|
+
"standardPlatforms",
|
|
13
|
+
"severityLevels",
|
|
14
|
+
"adoptionStatuses",
|
|
15
|
+
"pathBasisVocabulary",
|
|
16
|
+
"measurementSubjects",
|
|
17
|
+
"missingPlatformIntents",
|
|
18
|
+
"consumptionForms"
|
|
19
|
+
],
|
|
20
|
+
"properties": {
|
|
21
|
+
"schemaVersion": { "const": 1 },
|
|
22
|
+
"kind": { "const": "skill-family.observation-scope" },
|
|
23
|
+
"alignedObservationSchemaVersions": {
|
|
24
|
+
"type": "array",
|
|
25
|
+
"minItems": 1,
|
|
26
|
+
"uniqueItems": true,
|
|
27
|
+
"items": { "type": "string", "minLength": 1 },
|
|
28
|
+
"description": "Observation contract document versions these vocabularies align with (e.g. 1.0.0-candidate, 2.0.0-candidate)."
|
|
29
|
+
},
|
|
30
|
+
"scopeVocabulary": {
|
|
31
|
+
"type": "array",
|
|
32
|
+
"minItems": 1,
|
|
33
|
+
"uniqueItems": true,
|
|
34
|
+
"items": { "enum": ["skill", "plugin", "release"] }
|
|
35
|
+
},
|
|
36
|
+
"standardPlatforms": {
|
|
37
|
+
"type": "array",
|
|
38
|
+
"minItems": 1,
|
|
39
|
+
"uniqueItems": true,
|
|
40
|
+
"items": {
|
|
41
|
+
"enum": ["claude-code", "codex", "kimi-code", "workbuddy", "qoder", "dsh"]
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"severityLevels": {
|
|
45
|
+
"type": "array",
|
|
46
|
+
"minItems": 1,
|
|
47
|
+
"uniqueItems": true,
|
|
48
|
+
"items": { "enum": ["block", "error", "warning", "observe"] }
|
|
49
|
+
},
|
|
50
|
+
"adoptionStatuses": {
|
|
51
|
+
"type": "array",
|
|
52
|
+
"minItems": 1,
|
|
53
|
+
"uniqueItems": true,
|
|
54
|
+
"items": {
|
|
55
|
+
"enum": ["foundation-adopted", "self-built", "exempted", "not-adopted", "unknown"]
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"pathBasisVocabulary": {
|
|
59
|
+
"type": "array",
|
|
60
|
+
"minItems": 1,
|
|
61
|
+
"uniqueItems": true,
|
|
62
|
+
"items": { "enum": ["project-root-relative"] }
|
|
63
|
+
},
|
|
64
|
+
"measurementSubjects": {
|
|
65
|
+
"type": "array",
|
|
66
|
+
"minItems": 1,
|
|
67
|
+
"uniqueItems": true,
|
|
68
|
+
"items": { "enum": ["logical-source", "worst-projection"] }
|
|
69
|
+
},
|
|
70
|
+
"missingPlatformIntents": {
|
|
71
|
+
"type": "array",
|
|
72
|
+
"minItems": 1,
|
|
73
|
+
"uniqueItems": true,
|
|
74
|
+
"items": {
|
|
75
|
+
"enum": ["unsupported", "planned", "experimental", "deprecated-host"]
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"consumptionForms": {
|
|
79
|
+
"type": "array",
|
|
80
|
+
"minItems": 1,
|
|
81
|
+
"uniqueItems": true,
|
|
82
|
+
"items": {
|
|
83
|
+
"enum": ["dependencies", "vendored-bundle", "tarball-pin", "none", "other"]
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
"note": {
|
|
87
|
+
"type": "string",
|
|
88
|
+
"description": "Optional human rationale; not consumed mechanically."
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://contracts.skill-family.example/v1/operation-request.json",
|
|
4
|
+
"title": "OperationRequest",
|
|
5
|
+
"description": "One kernel protocol request: a named operation with params, addressed to a registered protocol name/version. Envelope shape is frozen; the operation vocabulary is registered in the kernel protocol definition.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["schemaVersion", "kind", "protocol", "operationId", "operation", "params"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"schemaVersion": {
|
|
11
|
+
"const": 1
|
|
12
|
+
},
|
|
13
|
+
"kind": {
|
|
14
|
+
"const": "skill-family.operation-request"
|
|
15
|
+
},
|
|
16
|
+
"protocol": {
|
|
17
|
+
"$ref": "#/$defs/protocolRef"
|
|
18
|
+
},
|
|
19
|
+
"operationId": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$",
|
|
22
|
+
"description": "Caller-chosen identifier; unique per caller, echoed by the result."
|
|
23
|
+
},
|
|
24
|
+
"operation": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$",
|
|
27
|
+
"description": "Operation name; must be in the frozen vocabulary of the referenced protocol version."
|
|
28
|
+
},
|
|
29
|
+
"params": {
|
|
30
|
+
"type": "object",
|
|
31
|
+
"description": "Operation-specific params. The frozen params contract of each operation lives in the kernel protocol definition, not here."
|
|
32
|
+
},
|
|
33
|
+
"requestedAt": {
|
|
34
|
+
"type": "string",
|
|
35
|
+
"format": "date-time",
|
|
36
|
+
"description": "Optional RFC 3339 date-time when the request was created."
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"$defs": {
|
|
40
|
+
"protocolRef": {
|
|
41
|
+
"type": "object",
|
|
42
|
+
"additionalProperties": false,
|
|
43
|
+
"required": ["name", "version"],
|
|
44
|
+
"properties": {
|
|
45
|
+
"name": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*(\\.[a-z][a-z0-9]*(-[a-z0-9]+)*)*$",
|
|
48
|
+
"description": "Registered protocol name (dot-separated kebab-case segments)."
|
|
49
|
+
},
|
|
50
|
+
"version": {
|
|
51
|
+
"type": "integer",
|
|
52
|
+
"minimum": 1,
|
|
53
|
+
"description": "Registered protocol version."
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://contracts.skill-family.example/v1/operation-result.json",
|
|
4
|
+
"title": "OperationResult",
|
|
5
|
+
"description": "Terminal result of one kernel protocol operation: terminal state, optional outputs, and stable-coded errors. A result never carries non-terminal states.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["schemaVersion", "kind", "protocol", "operationId", "operation", "state", "errors"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"schemaVersion": {
|
|
11
|
+
"const": 1
|
|
12
|
+
},
|
|
13
|
+
"kind": {
|
|
14
|
+
"const": "skill-family.operation-result"
|
|
15
|
+
},
|
|
16
|
+
"protocol": {
|
|
17
|
+
"$ref": "#/$defs/protocolRef"
|
|
18
|
+
},
|
|
19
|
+
"operationId": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$",
|
|
22
|
+
"description": "Echoes the request operationId."
|
|
23
|
+
},
|
|
24
|
+
"operation": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$",
|
|
27
|
+
"description": "Echoes the request operation."
|
|
28
|
+
},
|
|
29
|
+
"state": {
|
|
30
|
+
"enum": ["succeeded", "failed", "rejected"],
|
|
31
|
+
"description": "Terminal states only; equals the kernel protocol terminalStates set."
|
|
32
|
+
},
|
|
33
|
+
"outputs": {
|
|
34
|
+
"type": ["object", "null"],
|
|
35
|
+
"description": "Operation-specific outputs; meaningful when state is succeeded."
|
|
36
|
+
},
|
|
37
|
+
"errors": {
|
|
38
|
+
"type": "array",
|
|
39
|
+
"description": "Empty when state is succeeded; at least one stable-coded error otherwise.",
|
|
40
|
+
"items": {
|
|
41
|
+
"$ref": "#/$defs/error"
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"completedAt": {
|
|
45
|
+
"type": "string",
|
|
46
|
+
"format": "date-time",
|
|
47
|
+
"description": "Optional RFC 3339 date-time when the operation reached a terminal state."
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"allOf": [
|
|
51
|
+
{
|
|
52
|
+
"if": {
|
|
53
|
+
"properties": {
|
|
54
|
+
"state": {
|
|
55
|
+
"const": "succeeded"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"required": ["state"]
|
|
59
|
+
},
|
|
60
|
+
"then": {
|
|
61
|
+
"properties": {
|
|
62
|
+
"errors": {
|
|
63
|
+
"type": "array",
|
|
64
|
+
"maxItems": 0
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"if": {
|
|
71
|
+
"properties": {
|
|
72
|
+
"state": {
|
|
73
|
+
"enum": ["failed", "rejected"]
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
"required": ["state"]
|
|
77
|
+
},
|
|
78
|
+
"then": {
|
|
79
|
+
"properties": {
|
|
80
|
+
"errors": {
|
|
81
|
+
"type": "array",
|
|
82
|
+
"minItems": 1
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
],
|
|
88
|
+
"$defs": {
|
|
89
|
+
"protocolRef": {
|
|
90
|
+
"type": "object",
|
|
91
|
+
"additionalProperties": false,
|
|
92
|
+
"required": ["name", "version"],
|
|
93
|
+
"properties": {
|
|
94
|
+
"name": {
|
|
95
|
+
"type": "string",
|
|
96
|
+
"pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*(\\.[a-z][a-z0-9]*(-[a-z0-9]+)*)*$",
|
|
97
|
+
"description": "Registered protocol name (dot-separated kebab-case segments)."
|
|
98
|
+
},
|
|
99
|
+
"version": {
|
|
100
|
+
"type": "integer",
|
|
101
|
+
"minimum": 1,
|
|
102
|
+
"description": "Registered protocol version."
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
"error": {
|
|
107
|
+
"type": "object",
|
|
108
|
+
"additionalProperties": false,
|
|
109
|
+
"required": ["code", "message"],
|
|
110
|
+
"properties": {
|
|
111
|
+
"code": {
|
|
112
|
+
"type": "string",
|
|
113
|
+
"pattern": "^SFC[0-9]{4}$",
|
|
114
|
+
"description": "Stable error code from the frozen contracts error registry."
|
|
115
|
+
},
|
|
116
|
+
"message": {
|
|
117
|
+
"type": "string",
|
|
118
|
+
"minLength": 1
|
|
119
|
+
},
|
|
120
|
+
"path": {
|
|
121
|
+
"type": "string",
|
|
122
|
+
"description": "Optional JSON pointer into the offending document."
|
|
123
|
+
},
|
|
124
|
+
"details": {
|
|
125
|
+
"type": "object"
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|