skill-family-contracts 0.3.0 → 0.4.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 (39) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/CHANGELOG.zh-CN.md +24 -0
  3. package/README.md +16 -13
  4. package/README.zh-CN.md +16 -13
  5. package/candidate/fixed-set-publication/capability.json +19 -0
  6. package/candidate/fixed-set-publication/fixtures/manifest-negative-directory-mode.json +38 -0
  7. package/candidate/fixed-set-publication/fixtures/manifest-negative-path-escape.json +42 -0
  8. package/candidate/fixed-set-publication/fixtures/manifest-positive-platform-bundle.json +55 -0
  9. package/candidate/fixed-set-publication/fixtures/manifest-positive-versioned-candidate.json +53 -0
  10. package/candidate/fixed-set-publication/fixtures/receipt-negative-partial.json +25 -0
  11. package/candidate/fixed-set-publication/fixtures/receipt-positive-fsync-indeterminate.json +29 -0
  12. package/candidate/fixed-set-publication/fixtures/receipt-positive-success.json +25 -0
  13. package/candidate/fixed-set-publication/fixtures/receipt-positive-unsupported.json +27 -0
  14. package/candidate/fixed-set-publication/fixtures/receipt-positive-verify-indeterminate.json +27 -0
  15. package/candidate/fixed-set-publication/manifest.schema.json +108 -0
  16. package/candidate/fixed-set-publication/receipt.schema.json +148 -0
  17. package/candidate/quickstart-profile/consumer-schema-inventory.schema.json +66 -0
  18. package/candidate/quickstart-profile/fixtures/inventory-negative-missing-retention.json +13 -0
  19. package/candidate/quickstart-profile/fixtures/inventory-positive.json +23 -0
  20. package/candidate/quickstart-profile/harness-surface-inventory.schema.json +137 -0
  21. package/candidate/quickstart-profile/index.mjs +91 -3
  22. package/package.json +1 -1
  23. package/release-notes/0.3.0.yaml +2 -0
  24. package/release-notes/0.4.0.yaml +29 -0
  25. package/src/fixtures/migration-manifest/negative-06-empty-reference-text.json +19 -0
  26. package/src/fixtures/migration-manifest/negative-07-empty-reference-replaced-by.json +19 -0
  27. package/src/fixtures/migration-manifest/negative-08-reference-unknown-field.json +19 -0
  28. package/src/fixtures/migration-manifest/positive-03-legacy-references.json +25 -0
  29. package/src/fixtures/surface-scan-policy/dialect-01-unsupported.json +19 -0
  30. package/src/fixtures/surface-scan-policy/negative-01-empty-patterns.json +19 -0
  31. package/src/fixtures/surface-scan-policy/positive-01-valid.json +19 -0
  32. package/src/fixtures/token-estimate-result/dialect-01-unsupported.json +23 -0
  33. package/src/fixtures/token-estimate-result/negative-01-extra-field.json +30 -0
  34. package/src/fixtures/token-estimate-result/positive-01-valid.json +29 -0
  35. package/src/index.mjs +7 -3
  36. package/src/registry.json +14 -0
  37. package/src/schemas/migration-manifest.schema.json +26 -0
  38. package/src/schemas/surface-scan-policy.schema.json +42 -0
  39. package/src/schemas/token-estimate-result.schema.json +43 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ <!-- release-skill:changelog:start version=0.4.0 locale=en baseline=sha256:813375a1145b9de729fa5d128a34b1f9a12b5942ab6f06da92486aa72df7a297 -->
4
+ ## [0.4.0] - 2026-08-16
5
+
6
+ This release extends the stable Contracts registry to 20 top-level object classes under the unchanged contract-spec version 1.4.0, adds finite-closed-semantics fixtures and schemas (FND-ADR-009), and ships new fixed-set-publication and schema-inventory candidates.
7
+
8
+ ### Added
9
+
10
+ - Registers two new stable top-level objects, token-estimate-result (deterministic UTF-8 byte-count estimation result with a closed guarantee enumeration) and surface-scan-policy (path/content patterns plus carried-only allowedUses), raising the object registry from 18 to 20 classes under contract-spec version 1.4.0 (FND-ADR-009).
11
+ - Extends the migration-manifest schema with legacy reference support and adds the matching fixtures (negative-06, negative-07, negative-08, positive-03).
12
+ - Adds the fixed-set-publication candidate (manifest and receipt schemas, fixtures, and a capability-fit declaration covering native-prebuild runtimes) outside the stable registry.
13
+ - Extends the Quickstart Profile candidate with consumer-schema-inventory and harness-surface-inventory schemas plus inventory fixtures.
14
+ - Applies the FND-ADR-001 gate-1 relaxation (one existing plus one structurally identical foreseeable consumer) and introduces gate 8 for finite closed semantics (FND-ADR-009).
15
+
16
+ ### Changed
17
+
18
+ - Keeps CONTRACTS_VERSION at 1.4.0; the same contract-spec line now covers the 20-object set, while the published 0.3.0 bytes carry the 18-object set of that version.
19
+ - Keeps method identifiers, parameter schemas, and domain result semantics under consumer ownership.
20
+
21
+ ### Upgrade Notes
22
+
23
+ Version 0.4.0 is released on npm and the public mirror. Candidate subpaths are public but not stable; pin candidate imports to exactly 0.4.0 and validate stable objects against the 20-class registry contract.
24
+ <!-- release-skill:changelog:end version=0.4.0 locale=en -->
25
+
26
+
3
27
  <!-- release-skill:changelog:start version=0.3.0 locale=en baseline=sha256:32a8df58662f9dbb64e142cb8a2b329556b4bd59872e48fcbc317cc971cbdd7c -->
4
28
  ## [0.3.0] - 2026-08-12
5
29
 
@@ -1,5 +1,29 @@
1
1
  # 变更日志
2
2
 
3
+ <!-- release-skill:changelog:start version=0.4.0 locale=zh-CN baseline=sha256:99c7f1d548dff69c87156f903efe5b05fa214299c01c9db4d79b0a322fe8ee5d -->
4
+ ## [0.4.0] - 2026-08-16
5
+
6
+ 本版在契约规格版本 1.4.0 不变的前提下把稳定 Contracts 登记表扩到 20 类顶层对象,补齐有限封闭语义(FND-ADR-009)的 fixtures 与 schema,并新增 fixed-set-publication 与 schema 清单候选。
7
+
8
+ ### 新增
9
+
10
+ - 新增两个 stable 顶层对象:token-estimate-result(确定性 UTF-8 字节计数估算结果,封闭 guarantees 枚举)与 surface-scan-policy(路径/内容模式 + 只携带不解释的 allowedUses),对象登记从 18 类增至 20 类,契约规格版本保持 1.4.0(FND-ADR-009)。
11
+ - migration-manifest schema 增加遗留引用支持,并补齐对应 fixtures(negative-06、negative-07、negative-08、positive-03)。
12
+ - 新增 fixed-set-publication 候选(manifest/receipt schema、fixtures 与覆盖 native-prebuild 运行时的能力适配声明),不进入稳定登记表。
13
+ - Quickstart Profile 候选扩展 consumer-schema-inventory 与 harness-surface-inventory schema 及 inventory fixtures。
14
+ - 落地 FND-ADR-001 门 1 放宽(一个现有 + 一个结构同型可预见消费者)与门 8「有限封闭语义」(FND-ADR-009)。
15
+
16
+ ### 变更
17
+
18
+ - CONTRACTS_VERSION 保持 1.4.0:同一契约规格版本线现在覆盖 20 类对象集,而已发布的 0.3.0 字节携带的是该版本的 18 类对象集。
19
+ - 方法标识、参数 Schema 与领域结果语义继续归消费者所有。
20
+
21
+ ### 升级说明
22
+
23
+ 0.4.0 已发布到 npm 与 public 镜像仓。candidate 子路径公开但不稳定;candidate 导入必须精确锁定 0.4.0,稳定对象按 20 类登记表契约校验。
24
+ <!-- release-skill:changelog:end version=0.4.0 locale=zh-CN -->
25
+
26
+
3
27
  <!-- release-skill:changelog:start version=0.3.0 locale=zh-CN baseline=sha256:5f1c4cf56cc336279cbc6f11bc6cf8ce0a7524f454ff6589e067e828707a7cc7 -->
4
28
  ## [0.3.0] - 2026-08-12
5
29
 
package/README.md CHANGED
@@ -4,28 +4,31 @@
4
4
 
5
5
  # skill-family-contracts
6
6
 
7
- <!-- release-skill:release-version: 0.3.0 -->
7
+ <!-- release-skill:release-version: 0.4.0 -->
8
8
 
9
9
  The single authoritative package of machine-executable engineering structure and mechanism protocols (Contracts 1.4.0, frozen).
10
10
 
11
11
  <!-- release-skill:managed:start id=latest-release -->
12
- **0.3.0** (2026-08-12)
12
+ **0.4.0** (2026-08-16)
13
13
 
14
- This source candidate replaces the Quickstart Profile candidate with v2 while preserving the stable Contracts registry and kernel protocol.
14
+ This release extends the stable Contracts registry to 20 top-level object classes under the unchanged contract-spec version 1.4.0, adds finite-closed-semantics fixtures and schemas (FND-ADR-009), and ships new fixed-set-publication and schema-inventory candidates.
15
15
 
16
16
  **Added**
17
17
 
18
- - Adds the v2 protocol definition with the business-neutral execute-method operation and a real $id-indexed Resource, Task, and Result schema collection.
19
- - Enforces JSON-safe Task and Result boundaries, one path-backed observation, terminal output shapes, and exact evidence bindings.
18
+ - Registers two new stable top-level objects, token-estimate-result (deterministic UTF-8 byte-count estimation result with a closed guarantee enumeration) and surface-scan-policy (path/content patterns plus carried-only allowedUses), raising the object registry from 18 to 20 classes under contract-spec version 1.4.0 (FND-ADR-009).
19
+ - Extends the migration-manifest schema with legacy reference support and adds the matching fixtures (negative-06, negative-07, negative-08, positive-03).
20
+ - Adds the fixed-set-publication candidate (manifest and receipt schemas, fixtures, and a capability-fit declaration covering native-prebuild runtimes) outside the stable registry.
21
+ - Extends the Quickstart Profile candidate with consumer-schema-inventory and harness-surface-inventory schemas plus inventory fixtures.
22
+ - Applies the FND-ADR-001 gate-1 relaxation (one existing plus one structurally identical foreseeable consumer) and introduces gate 8 for finite closed semantics (FND-ADR-009).
20
23
 
21
24
  **Changed**
22
25
 
23
- - Replaces the incompatible 0.2.1 candidate surface; consumers that still require v1 must remain pinned to exactly 0.2.1.
26
+ - Keeps CONTRACTS_VERSION at 1.4.0; the same contract-spec line now covers the 20-object set, while the published 0.3.0 bytes carry the 18-object set of that version.
24
27
  - Keeps method identifiers, parameter schemas, and domain result semantics under consumer ownership.
25
28
 
26
29
  **Upgrade Notes**
27
30
 
28
- Version 0.3.0 is a local, unpublished source candidate. Pin all candidate imports to an exact package version and migrate v1 integrations before selecting this version.
31
+ Version 0.4.0 is released on npm and the public mirror. Candidate subpaths are public but not stable; pin candidate imports to exactly 0.4.0 and validate stable objects against the 20-class registry contract.
29
32
  <!-- release-skill:managed:end id=latest-release -->
30
33
 
31
34
  ## Problem It Solves
@@ -41,14 +44,14 @@ Schema validation is based entirely on [Ajv](https://ajv.js.org/) (exact version
41
44
  ## Installation and Minimal Example
42
45
 
43
46
  ```sh
44
- npm install skill-family-contracts@0.3.0
47
+ npm install skill-family-contracts@0.4.0
45
48
  npm info skill-family-contracts --help
46
49
  ```
47
50
 
48
51
  The minimal example starts from an empty directory and demonstrates how to validate a registered contract object:
49
52
 
50
53
  ```js
51
- // Run from an empty directory: npm install skill-family-contracts@0.3.0
54
+ // Run from an empty directory: npm install skill-family-contracts@0.4.0
52
55
  import { validateDocument } from "skill-family-contracts";
53
56
 
54
57
  const document = {
@@ -81,9 +84,9 @@ import {
81
84
  } from "skill-family-contracts/candidate/quickstart-profile";
82
85
  ```
83
86
 
84
- Version 0.3.0 carries Quickstart Profile v2. Its protocol fixes the business-neutral operation to `execute-method`; Resource, Task, and Result schemas resolve one another through their real v2 `$id` values. Foundation validates the JSON-safe exchange shape, while the consumer owns method identifiers, parameter schemas, and domain results.
87
+ Version 0.4.0 carries Quickstart Profile v2. Its protocol fixes the business-neutral operation to `execute-method`; Resource, Task, and Result schemas resolve one another through their real v2 `$id` values. Foundation validates the JSON-safe exchange shape, while the consumer owns method identifiers, parameter schemas, and domain results.
85
88
 
86
- The subpath is public but **not stable**. Its schemas remain absent from `src/registry.json`, do not expand the eighteen stable object classes, and may change or be removed in a later minor release. Pin exactly `0.3.0` when evaluating v2. Integrations that still require candidate v1 must stay pinned to exactly `0.2.1`.
89
+ The subpath is public but **not stable**. Its schemas remain absent from `src/registry.json`, do not expand the eighteen stable object classes, and may change or be removed in a later minor release. Pin exactly `0.4.0` when evaluating v2. Integrations that still require candidate v1 must stay pinned to exactly `0.2.1`.
87
90
 
88
91
  ## Typical Use Cases
89
92
 
@@ -219,7 +222,7 @@ On validation failure `errorCode` is `SFC1001` (SCHEMA_VALIDATION_FAILED, docume
219
222
 
220
223
  ### Capability selection
221
224
 
222
- - `foundation.contracts.object-validation`: Ajv dual-dialect validation of the 18 object classes.
225
+ - `foundation.contracts.object-validation`: Ajv dual-dialect validation of the 20 object classes.
223
226
  - `foundation.contracts.registry-protocol`: Schema `$id` and protocol-name registry query.
224
227
  - `foundation.contracts.kernel-protocol`: operation-request/result protocol.
225
228
  - `foundation.contracts.mandatory-checks`: nine mandatory rules and unresolved references.
@@ -249,7 +252,7 @@ On validation failure `errorCode` is `SFC1001` (SCHEMA_VALIDATION_FAILED, docume
249
252
 
250
253
  ### Architectural invariants
251
254
 
252
- - The set of 18 top-level object classes is fixed; additions require an ADR; the error-code freeze does not drift.
255
+ - The set of 20 top-level object classes is fixed; additions require an ADR; the error-code freeze does not drift.
253
256
  - The validator is exclusively Ajv 8.20.0 (exact pin); no other implementation is accepted.
254
257
 
255
258
  ### Route elsewhere when
package/README.zh-CN.md CHANGED
@@ -5,28 +5,31 @@
5
5
 
6
6
  # skill-family-contracts
7
7
 
8
- <!-- release-skill:release-version: 0.3.0 -->
8
+ <!-- release-skill:release-version: 0.4.0 -->
9
9
 
10
10
  机器可执行工程结构和机制协议的唯一权威包(Contracts 1.4.0,冻结)。
11
11
 
12
12
  <!-- release-skill:managed:start id=latest-release -->
13
- **0.3.0** (2026-08-12)
13
+ **0.4.0** (2026-08-16)
14
14
 
15
- 本源码候选版以 Quickstart Profile v2 替换原 candidate,同时保持稳定 Contracts 登记表和内核协议不变。
15
+ 本版在契约规格版本 1.4.0 不变的前提下把稳定 Contracts 登记表扩到 20 类顶层对象,补齐有限封闭语义(FND-ADR-009)的 fixtures 与 schema,并新增 fixed-set-publication 与 schema 清单候选。
16
16
 
17
17
  **新增**
18
18
 
19
- - 新增 v2 协议定义,以业务中立的 execute-method 作为唯一操作,并按真实 $id 登记 Resource、Task、Result Schema 集合。
20
- - 收紧 Task 与 Result 的 JSON-safe 边界、单一 path-backed observation、终态输出形状及 evidence 精确回指。
19
+ - 新增两个 stable 顶层对象:token-estimate-result(确定性 UTF-8 字节计数估算结果,封闭 guarantees 枚举)与 surface-scan-policy(路径/内容模式 + 只携带不解释的 allowedUses),对象登记从 18 类增至 20 类,契约规格版本保持 1.4.0(FND-ADR-009)。
20
+ - migration-manifest schema 增加遗留引用支持,并补齐对应 fixtures(negative-06、negative-07、negative-08、positive-03)。
21
+ - 新增 fixed-set-publication 候选(manifest/receipt schema、fixtures 与覆盖 native-prebuild 运行时的能力适配声明),不进入稳定登记表。
22
+ - Quickstart Profile 候选扩展 consumer-schema-inventory 与 harness-surface-inventory schema 及 inventory fixtures。
23
+ - 落地 FND-ADR-001 门 1 放宽(一个现有 + 一个结构同型可预见消费者)与门 8「有限封闭语义」(FND-ADR-009)。
21
24
 
22
25
  **变更**
23
26
 
24
- - 替换与 0.2.1 不兼容的 candidate 面;仍依赖 v1 的消费者必须继续精确锁定 0.2.1。
27
+ - CONTRACTS_VERSION 保持 1.4.0:同一契约规格版本线现在覆盖 20 类对象集,而已发布的 0.3.0 字节携带的是该版本的 18 类对象集。
25
28
  - 方法标识、参数 Schema 与领域结果语义继续归消费者所有。
26
29
 
27
30
  **升级说明**
28
31
 
29
- 0.3.0 当前只是本地、未发布的源码候选。candidate 导入必须精确锁定包版本,v1 接入完成迁移后才能选用本版本。
32
+ 0.4.0 已发布到 npm 与 public 镜像仓。candidate 子路径公开但不稳定;candidate 导入必须精确锁定 0.4.0,稳定对象按 20 类登记表契约校验。
30
33
  <!-- release-skill:managed:end id=latest-release -->
31
34
 
32
35
  ## 解决的问题
@@ -42,14 +45,14 @@ Schema 验证完全基于 [Ajv](https://ajv.js.org/)(精确版本见 `package.
42
45
  ## 安装和最小示例
43
46
 
44
47
  ```sh
45
- npm install skill-family-contracts@0.3.0
48
+ npm install skill-family-contracts@0.4.0
46
49
  npm info skill-family-contracts --help
47
50
  ```
48
51
 
49
52
  最小示例从空目录开始,演示如何校验一份已登记契约对象:
50
53
 
51
54
  ```js
52
- // 从空目录运行:npm install skill-family-contracts@0.3.0
55
+ // 从空目录运行:npm install skill-family-contracts@0.4.0
53
56
  import { validateDocument } from "skill-family-contracts";
54
57
 
55
58
  const document = {
@@ -82,9 +85,9 @@ import {
82
85
  } from "skill-family-contracts/candidate/quickstart-profile";
83
86
  ```
84
87
 
85
- 0.3.0 携带 Quickstart Profile v2。协议把业务中立的操作固定为 `execute-method`,Resource、Task、Result Schema 通过真实的 v2 `$id` 互相解析。Foundation 只校验 JSON-safe 交换结构;方法标识、参数 Schema 与领域结果继续归消费者所有。
88
+ 0.4.0 携带 Quickstart Profile v2。协议把业务中立的操作固定为 `execute-method`,Resource、Task、Result Schema 通过真实的 v2 `$id` 互相解析。Foundation 只校验 JSON-safe 交换结构;方法标识、参数 Schema 与领域结果继续归消费者所有。
86
89
 
87
- 以上子路径公开但**不稳定**。这些 Schema 不进入 `src/registry.json`,也不扩张十八类稳定对象,后续小版本可以修改或移除。评估 v2 时应精确锁定 `0.3.0`;仍依赖 candidate v1 的接入必须继续精确锁定 `0.2.1`。
90
+ 以上子路径公开但**不稳定**。这些 Schema 不进入 `src/registry.json`,也不扩张十八类稳定对象,后续小版本可以修改或移除。评估 v2 时应精确锁定 `0.4.0`;仍依赖 candidate v1 的接入必须继续精确锁定 `0.2.1`。
88
91
 
89
92
  ## 典型使用场景
90
93
 
@@ -220,7 +223,7 @@ import {
220
223
 
221
224
  ### Capability selection
222
225
 
223
- - `foundation.contracts.object-validation`:Ajv 双方言校验 18 类对象。
226
+ - `foundation.contracts.object-validation`:Ajv 双方言校验 20 类对象。
224
227
  - `foundation.contracts.registry-protocol`:Schema `$id` 与协议名登记查询。
225
228
  - `foundation.contracts.kernel-protocol`:operation-request/result 协议。
226
229
  - `foundation.contracts.mandatory-checks`:九类强制规则与未解析引用。
@@ -250,7 +253,7 @@ import {
250
253
 
251
254
  ### Architectural invariants
252
255
 
253
- - 18 类顶层对象集合固定,新增需 ADR;错误码冻结不漂移。
256
+ - 20 类顶层对象集合固定,新增需 ADR;错误码冻结不漂移。
254
257
  - 校验器仅 Ajv 8.20.0(精确 pin),不接受其他实现。
255
258
 
256
259
  ### Route elsewhere when
@@ -0,0 +1,19 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "skill-family.fixed-set-publication-capability-fit",
4
+ "status": "stable",
5
+ "runtimeSupport": "native-prebuild",
6
+ "stableRegistry": true,
7
+ "implementationExported": true,
8
+ "supportedPlatforms": [
9
+ "darwin-arm64",
10
+ "darwin-x64",
11
+ "linux-arm64-gnu",
12
+ "linux-x64-gnu"
13
+ ],
14
+ "requiredPrimitives": [
15
+ "darwin.renameatx_np(RENAME_EXCL)",
16
+ "linux.renameat2(RENAME_NOREPLACE)"
17
+ ],
18
+ "blockingReason": "Stable for the four supported platform keys (darwin-arm64, darwin-x64, linux-arm64-gnu, linux-x64-gnu). Windows, Linux musl, and unknown OS/architecture/libc combinations remain unsupported and fail closed."
19
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "fixtureId": "fixed-set.manifest.negative.directory-mode",
3
+ "schema": "manifest",
4
+ "expectValid": false,
5
+ "data": {
6
+ "schemaVersion": 1,
7
+ "kind": "skill-family.fixed-set-publication-manifest",
8
+ "source": {
9
+ "rootBinding": {
10
+ "kind": "trusted-filesystem-root-binding",
11
+ "digestAlgorithm": "sha256",
12
+ "basis": "canonical-realpath-device-inode-type-mode-v1",
13
+ "digest": "1111111111111111111111111111111111111111111111111111111111111111"
14
+ },
15
+ "root": { "type": "directory", "mode": 493, "device": "1", "inode": "1" },
16
+ "directories": [
17
+ { "path": "nested", "type": "directory", "mode": 512, "device": "1", "inode": "2" }
18
+ ],
19
+ "closureDigest": "2222222222222222222222222222222222222222222222222222222222222222"
20
+ },
21
+ "target": {
22
+ "rootBinding": {
23
+ "kind": "trusted-filesystem-root-binding",
24
+ "digestAlgorithm": "sha256",
25
+ "basis": "canonical-realpath-device-inode-type-mode-v1",
26
+ "digest": "3333333333333333333333333333333333333333333333333333333333333333"
27
+ },
28
+ "root": { "type": "directory", "mode": 493, "device": "3", "inode": "3" },
29
+ "directories": [],
30
+ "closureDigest": "4444444444444444444444444444444444444444444444444444444444444444",
31
+ "expectation": "absent"
32
+ },
33
+ "members": [
34
+ { "path": "nested/file", "type": "regular", "mode": 420, "bytes": 1, "sha256": "5555555555555555555555555555555555555555555555555555555555555555" }
35
+ ],
36
+ "digest": "6666666666666666666666666666666666666666666666666666666666666666"
37
+ }
38
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "fixtureId": "fixed-set.manifest.negative.path-escape",
3
+ "schema": "manifest",
4
+ "expectValid": false,
5
+ "data": {
6
+ "schemaVersion": 1,
7
+ "kind": "skill-family.fixed-set-publication-manifest",
8
+ "source": {
9
+ "rootBinding": {
10
+ "kind": "trusted-filesystem-root-binding",
11
+ "digestAlgorithm": "sha256",
12
+ "basis": "canonical-realpath-device-inode-type-mode-v1",
13
+ "digest": "1111111111111111111111111111111111111111111111111111111111111111"
14
+ },
15
+ "root": { "type": "directory", "mode": 493, "device": "1", "inode": "101" },
16
+ "directories": [],
17
+ "closureDigest": "2222222222222222222222222222222222222222222222222222222222222222"
18
+ },
19
+ "target": {
20
+ "rootBinding": {
21
+ "kind": "trusted-filesystem-root-binding",
22
+ "digestAlgorithm": "sha256",
23
+ "basis": "canonical-realpath-device-inode-type-mode-v1",
24
+ "digest": "3333333333333333333333333333333333333333333333333333333333333333"
25
+ },
26
+ "root": { "type": "directory", "mode": 493, "device": "3", "inode": "301" },
27
+ "directories": [],
28
+ "closureDigest": "6666666666666666666666666666666666666666666666666666666666666666",
29
+ "expectation": "absent"
30
+ },
31
+ "members": [
32
+ {
33
+ "path": "../outside.txt",
34
+ "type": "regular",
35
+ "mode": 420,
36
+ "bytes": 1,
37
+ "sha256": "4444444444444444444444444444444444444444444444444444444444444444"
38
+ }
39
+ ],
40
+ "digest": "5555555555555555555555555555555555555555555555555555555555555555"
41
+ }
42
+ }
@@ -0,0 +1,55 @@
1
+ {
2
+ "fixtureId": "fixed-set.manifest.positive.platform-bundle",
3
+ "schema": "manifest",
4
+ "expectValid": true,
5
+ "data": {
6
+ "schemaVersion": 1,
7
+ "kind": "skill-family.fixed-set-publication-manifest",
8
+ "source": {
9
+ "rootBinding": {
10
+ "kind": "trusted-filesystem-root-binding",
11
+ "digestAlgorithm": "sha256",
12
+ "basis": "canonical-realpath-device-inode-type-mode-v1",
13
+ "digest": "1111111111111111111111111111111111111111111111111111111111111111"
14
+ },
15
+ "root": { "type": "directory", "mode": 493, "device": "1", "inode": "101" },
16
+ "directories": [
17
+ { "path": "generated", "type": "directory", "mode": 493, "device": "1", "inode": "102" },
18
+ { "path": "generated/platforms", "type": "directory", "mode": 493, "device": "1", "inode": "103" },
19
+ { "path": "generated/platforms/fixture", "type": "directory", "mode": 493, "device": "1", "inode": "104" },
20
+ { "path": "generated/platforms/fixture/skills", "type": "directory", "mode": 493, "device": "1", "inode": "105" },
21
+ { "path": "generated/platforms/fixture/skills/demo", "type": "directory", "mode": 493, "device": "1", "inode": "106" }
22
+ ],
23
+ "closureDigest": "2222222222222222222222222222222222222222222222222222222222222222"
24
+ },
25
+ "target": {
26
+ "rootBinding": {
27
+ "kind": "trusted-filesystem-root-binding",
28
+ "digestAlgorithm": "sha256",
29
+ "basis": "canonical-realpath-device-inode-type-mode-v1",
30
+ "digest": "3333333333333333333333333333333333333333333333333333333333333333"
31
+ },
32
+ "root": { "type": "directory", "mode": 493, "device": "2", "inode": "201" },
33
+ "directories": [],
34
+ "closureDigest": "7777777777777777777777777777777777777777777777777777777777777777",
35
+ "expectation": "absent"
36
+ },
37
+ "members": [
38
+ {
39
+ "path": "generated/platforms/fixture/plugin.json",
40
+ "type": "regular",
41
+ "mode": 420,
42
+ "bytes": 18,
43
+ "sha256": "4444444444444444444444444444444444444444444444444444444444444444"
44
+ },
45
+ {
46
+ "path": "generated/platforms/fixture/skills/demo/SKILL.md",
47
+ "type": "regular",
48
+ "mode": 420,
49
+ "bytes": 24,
50
+ "sha256": "5555555555555555555555555555555555555555555555555555555555555555"
51
+ }
52
+ ],
53
+ "digest": "6666666666666666666666666666666666666666666666666666666666666666"
54
+ }
55
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "fixtureId": "fixed-set.manifest.positive.versioned-candidate",
3
+ "schema": "manifest",
4
+ "expectValid": true,
5
+ "data": {
6
+ "schemaVersion": 1,
7
+ "kind": "skill-family.fixed-set-publication-manifest",
8
+ "source": {
9
+ "rootBinding": {
10
+ "kind": "trusted-filesystem-root-binding",
11
+ "digestAlgorithm": "sha256",
12
+ "basis": "canonical-realpath-device-inode-type-mode-v1",
13
+ "digest": "7777777777777777777777777777777777777777777777777777777777777777"
14
+ },
15
+ "root": { "type": "directory", "mode": 448, "device": "7", "inode": "701" },
16
+ "directories": [
17
+ { "path": "versions", "type": "directory", "mode": 448, "device": "7", "inode": "702" },
18
+ { "path": "versions/v1", "type": "directory", "mode": 448, "device": "7", "inode": "703" },
19
+ { "path": "versions/v1/scripts", "type": "directory", "mode": 448, "device": "7", "inode": "704" }
20
+ ],
21
+ "closureDigest": "8888888888888888888888888888888888888888888888888888888888888888"
22
+ },
23
+ "target": {
24
+ "rootBinding": {
25
+ "kind": "trusted-filesystem-root-binding",
26
+ "digestAlgorithm": "sha256",
27
+ "basis": "canonical-realpath-device-inode-type-mode-v1",
28
+ "digest": "9999999999999999999999999999999999999999999999999999999999999999"
29
+ },
30
+ "root": { "type": "directory", "mode": 448, "device": "9", "inode": "901" },
31
+ "directories": [],
32
+ "closureDigest": "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
33
+ "expectation": "absent"
34
+ },
35
+ "members": [
36
+ {
37
+ "path": "versions/v1/SKILL.md",
38
+ "type": "regular",
39
+ "mode": 420,
40
+ "bytes": 31,
41
+ "sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
42
+ },
43
+ {
44
+ "path": "versions/v1/scripts/runner.py",
45
+ "type": "regular",
46
+ "mode": 493,
47
+ "bytes": 42,
48
+ "sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
49
+ }
50
+ ],
51
+ "digest": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
52
+ }
53
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "fixtureId": "fixed-set.receipt.negative.partial",
3
+ "schema": "receipt",
4
+ "expectValid": false,
5
+ "data": {
6
+ "schemaVersion": 1,
7
+ "kind": "skill-family.fixed-set-publication-receipt",
8
+ "manifestDigest": "6666666666666666666666666666666666666666666666666666666666666666",
9
+ "targetRootBinding": {
10
+ "kind": "trusted-filesystem-root-binding",
11
+ "digestAlgorithm": "sha256",
12
+ "basis": "canonical-realpath-device-inode-type-mode-v1",
13
+ "digest": "7777777777777777777777777777777777777777777777777777777777777777"
14
+ },
15
+ "platform": "darwin",
16
+ "primitive": "darwin-renameatx-noreplace-v1",
17
+ "status": "partially_applied",
18
+ "targetState": "published",
19
+ "commitState": "rename-committed",
20
+ "verification": "verified",
21
+ "durability": "indeterminate",
22
+ "publishedClosureDigest": "8888888888888888888888888888888888888888888888888888888888888888",
23
+ "memberCount": 1
24
+ }
25
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "fixtureId": "fixed-set.receipt.positive.fsync-indeterminate",
3
+ "schema": "receipt",
4
+ "expectValid": true,
5
+ "data": {
6
+ "schemaVersion": 1,
7
+ "kind": "skill-family.fixed-set-publication-receipt",
8
+ "manifestDigest": "1111111111111111111111111111111111111111111111111111111111111111",
9
+ "targetRootBinding": {
10
+ "kind": "trusted-filesystem-root-binding",
11
+ "digestAlgorithm": "sha256",
12
+ "basis": "canonical-realpath-device-inode-type-mode-v1",
13
+ "digest": "2222222222222222222222222222222222222222222222222222222222222222"
14
+ },
15
+ "platform": "linux",
16
+ "primitive": "linux-renameat2-noreplace-v1",
17
+ "status": "indeterminate",
18
+ "targetState": "published",
19
+ "commitState": "rename-committed",
20
+ "verification": "verified",
21
+ "durability": "indeterminate",
22
+ "publishedClosureDigest": "3333333333333333333333333333333333333333333333333333333333333333",
23
+ "memberCount": 2,
24
+ "error": {
25
+ "code": "DIRECTORY_FSYNC_FAILED",
26
+ "message": "The fixed set verified after rename, but directory fsync failed."
27
+ }
28
+ }
29
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "fixtureId": "fixed-set.receipt.positive.success",
3
+ "schema": "receipt",
4
+ "expectValid": true,
5
+ "data": {
6
+ "schemaVersion": 1,
7
+ "kind": "skill-family.fixed-set-publication-receipt",
8
+ "manifestDigest": "1111111111111111111111111111111111111111111111111111111111111111",
9
+ "targetRootBinding": {
10
+ "kind": "trusted-filesystem-root-binding",
11
+ "digestAlgorithm": "sha256",
12
+ "basis": "canonical-realpath-device-inode-type-mode-v1",
13
+ "digest": "2222222222222222222222222222222222222222222222222222222222222222"
14
+ },
15
+ "platform": "linux",
16
+ "primitive": "linux-renameat2-noreplace-v1",
17
+ "status": "succeeded",
18
+ "targetState": "published",
19
+ "commitState": "rename-committed",
20
+ "verification": "verified",
21
+ "durability": "synced",
22
+ "publishedClosureDigest": "3333333333333333333333333333333333333333333333333333333333333333",
23
+ "memberCount": 2
24
+ }
25
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "fixtureId": "fixed-set.receipt.positive.unsupported",
3
+ "schema": "receipt",
4
+ "expectValid": true,
5
+ "data": {
6
+ "schemaVersion": 1,
7
+ "kind": "skill-family.fixed-set-publication-receipt",
8
+ "manifestDigest": "4444444444444444444444444444444444444444444444444444444444444444",
9
+ "targetRootBinding": {
10
+ "kind": "trusted-filesystem-root-binding",
11
+ "digestAlgorithm": "sha256",
12
+ "basis": "canonical-realpath-device-inode-type-mode-v1",
13
+ "digest": "5555555555555555555555555555555555555555555555555555555555555555"
14
+ },
15
+ "platform": "other",
16
+ "primitive": "none",
17
+ "status": "refused",
18
+ "targetState": "absent",
19
+ "commitState": "not-committed",
20
+ "verification": "not-run",
21
+ "durability": "not-attempted",
22
+ "error": {
23
+ "code": "UNSUPPORTED_PLATFORM",
24
+ "message": "No verified no-replace primitive is available."
25
+ }
26
+ }
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "fixtureId": "fixed-set.receipt.positive.verify-indeterminate",
3
+ "schema": "receipt",
4
+ "expectValid": true,
5
+ "data": {
6
+ "schemaVersion": 1,
7
+ "kind": "skill-family.fixed-set-publication-receipt",
8
+ "manifestDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
9
+ "targetRootBinding": {
10
+ "kind": "trusted-filesystem-root-binding",
11
+ "digestAlgorithm": "sha256",
12
+ "basis": "canonical-realpath-device-inode-type-mode-v1",
13
+ "digest": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
14
+ },
15
+ "platform": "darwin",
16
+ "primitive": "darwin-renameatx-noreplace-v1",
17
+ "status": "indeterminate",
18
+ "targetState": "indeterminate",
19
+ "commitState": "rename-committed",
20
+ "verification": "failed",
21
+ "durability": "indeterminate",
22
+ "error": {
23
+ "code": "POST_VERIFY_FAILED",
24
+ "message": "Rename committed, but the target identity could not be verified."
25
+ }
26
+ }
27
+ }