skill-family-contracts 0.2.1 → 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 (47) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/CHANGELOG.zh-CN.md +45 -0
  3. package/README.md +18 -13
  4. package/README.zh-CN.md +18 -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/fixtures/resource-negative-absolute-path.json +13 -0
  21. package/candidate/quickstart-profile/fixtures/resource-negative-bad-digest.json +2 -2
  22. package/candidate/quickstart-profile/fixtures/resource-positive-uri.json +13 -0
  23. package/candidate/quickstart-profile/fixtures/resource-positive.json +2 -2
  24. package/candidate/quickstart-profile/harness-surface-inventory.schema.json +137 -0
  25. package/candidate/quickstart-profile/index.mjs +317 -30
  26. package/candidate/quickstart-profile/protocol.json +64 -0
  27. package/candidate/quickstart-profile/resource.schema.json +6 -4
  28. package/candidate/quickstart-profile/result.schema.json +84 -8
  29. package/candidate/quickstart-profile/task.schema.json +7 -5
  30. package/package.json +3 -2
  31. package/release-notes/0.3.0.yaml +25 -0
  32. package/release-notes/0.4.0.yaml +29 -0
  33. package/src/fixtures/migration-manifest/negative-06-empty-reference-text.json +19 -0
  34. package/src/fixtures/migration-manifest/negative-07-empty-reference-replaced-by.json +19 -0
  35. package/src/fixtures/migration-manifest/negative-08-reference-unknown-field.json +19 -0
  36. package/src/fixtures/migration-manifest/positive-03-legacy-references.json +25 -0
  37. package/src/fixtures/surface-scan-policy/dialect-01-unsupported.json +19 -0
  38. package/src/fixtures/surface-scan-policy/negative-01-empty-patterns.json +19 -0
  39. package/src/fixtures/surface-scan-policy/positive-01-valid.json +19 -0
  40. package/src/fixtures/token-estimate-result/dialect-01-unsupported.json +23 -0
  41. package/src/fixtures/token-estimate-result/negative-01-extra-field.json +30 -0
  42. package/src/fixtures/token-estimate-result/positive-01-valid.json +29 -0
  43. package/src/index.mjs +7 -3
  44. package/src/registry.json +14 -0
  45. package/src/schemas/migration-manifest.schema.json +26 -0
  46. package/src/schemas/surface-scan-policy.schema.json +42 -0
  47. package/src/schemas/token-estimate-result.schema.json +43 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,50 @@
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
+
27
+ <!-- release-skill:changelog:start version=0.3.0 locale=en baseline=sha256:32a8df58662f9dbb64e142cb8a2b329556b4bd59872e48fcbc317cc971cbdd7c -->
28
+ ## [0.3.0] - 2026-08-12
29
+
30
+ This source candidate replaces the Quickstart Profile candidate with v2 while preserving the stable Contracts registry and kernel protocol.
31
+
32
+ ### Added
33
+
34
+ - Adds the v2 protocol definition with the business-neutral execute-method operation and a real $id-indexed Resource, Task, and Result schema collection.
35
+ - Enforces JSON-safe Task and Result boundaries, one path-backed observation, terminal output shapes, and exact evidence bindings.
36
+
37
+ ### Changed
38
+
39
+ - Replaces the incompatible 0.2.1 candidate surface; consumers that still require v1 must remain pinned to exactly 0.2.1.
40
+ - Keeps method identifiers, parameter schemas, and domain result semantics under consumer ownership.
41
+
42
+ ### Upgrade Notes
43
+
44
+ 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.
45
+ <!-- release-skill:changelog:end version=0.3.0 locale=en -->
46
+
47
+
3
48
  <!-- release-skill:changelog:start version=0.2.1 locale=en baseline=sha256:b759650e4d52969bd907bccea937c64622b00b0ff97851da9c6c4aee8adb4888 -->
4
49
  ## [0.2.1] - 2026-08-10
5
50
 
@@ -1,5 +1,50 @@
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
+
27
+ <!-- release-skill:changelog:start version=0.3.0 locale=zh-CN baseline=sha256:5f1c4cf56cc336279cbc6f11bc6cf8ce0a7524f454ff6589e067e828707a7cc7 -->
28
+ ## [0.3.0] - 2026-08-12
29
+
30
+ 本源码候选版以 Quickstart Profile v2 替换原 candidate,同时保持稳定 Contracts 登记表和内核协议不变。
31
+
32
+ ### 新增
33
+
34
+ - 新增 v2 协议定义,以业务中立的 execute-method 作为唯一操作,并按真实 $id 登记 Resource、Task、Result Schema 集合。
35
+ - 收紧 Task 与 Result 的 JSON-safe 边界、单一 path-backed observation、终态输出形状及 evidence 精确回指。
36
+
37
+ ### 变更
38
+
39
+ - 替换与 0.2.1 不兼容的 candidate 面;仍依赖 v1 的消费者必须继续精确锁定 0.2.1。
40
+ - 方法标识、参数 Schema 与领域结果语义继续归消费者所有。
41
+
42
+ ### 升级说明
43
+
44
+ 0.3.0 当前只是本地、未发布的源码候选。candidate 导入必须精确锁定包版本,v1 接入完成迁移后才能选用本版本。
45
+ <!-- release-skill:changelog:end version=0.3.0 locale=zh-CN -->
46
+
47
+
3
48
  <!-- release-skill:changelog:start version=0.2.1 locale=zh-CN baseline=sha256:1f9b53564843c024415fda87d41abf96bc22db2ec5b90d12d7a8cd7c897a24fc -->
4
49
  ## [0.2.1] - 2026-08-10
5
50
 
package/README.md CHANGED
@@ -4,28 +4,31 @@
4
4
 
5
5
  # skill-family-contracts
6
6
 
7
- <!-- release-skill:release-version: 0.2.1 -->
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.2.1** (2026-08-10)
12
+ **0.4.0** (2026-08-16)
13
13
 
14
- This release adds a candidate Quickstart Profile contract surface and makes the package release documentation available in English and Simplified Chinese.
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 candidate Resource, Task, and Result schemas with strict validation helpers. The candidate schemas remain outside the stable Contracts registry.
19
- - Adds complete English and Simplified Chinese package documentation, including an agent quick-reference section.
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
- - Manages the current README and CHANGELOG release sections from one bilingual, versioned notes source.
24
- - Distributes the project NOTICE separately from the Apache-2.0 LICENSE.
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.
27
+ - Keeps method identifiers, parameter schemas, and domain result semantics under consumer ownership.
25
28
 
26
29
  **Upgrade Notes**
27
30
 
28
- Stable registry consumers do not need to change. Import the Quickstart Profile only through its candidate subpath and do not treat it as a frozen Contracts object.
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.2.1
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.2.1
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,7 +84,9 @@ import {
81
84
  } from "skill-family-contracts/candidate/quickstart-profile";
82
85
  ```
83
86
 
84
- The subpath is public but **not stable**. Its schemas are deliberately absent from `src/registry.json`, do not expand the eighteen stable object classes, and may change or be removed in a later minor release. Consumers should pin the exact package version and keep candidate imports outside their stable public API. Use the root package export for production contracts that require frozen registry and compatibility guarantees.
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.
88
+
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`.
85
90
 
86
91
  ## Typical Use Cases
87
92
 
@@ -217,7 +222,7 @@ On validation failure `errorCode` is `SFC1001` (SCHEMA_VALIDATION_FAILED, docume
217
222
 
218
223
  ### Capability selection
219
224
 
220
- - `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.
221
226
  - `foundation.contracts.registry-protocol`: Schema `$id` and protocol-name registry query.
222
227
  - `foundation.contracts.kernel-protocol`: operation-request/result protocol.
223
228
  - `foundation.contracts.mandatory-checks`: nine mandatory rules and unresolved references.
@@ -247,7 +252,7 @@ On validation failure `errorCode` is `SFC1001` (SCHEMA_VALIDATION_FAILED, docume
247
252
 
248
253
  ### Architectural invariants
249
254
 
250
- - 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.
251
256
  - The validator is exclusively Ajv 8.20.0 (exact pin); no other implementation is accepted.
252
257
 
253
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.2.1 -->
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.2.1** (2026-08-10)
13
+ **0.4.0** (2026-08-16)
14
14
 
15
- 本版新增 Quickstart Profile 候选契约面,并为包发布文档提供完整英文版与简体中文版。
15
+ 本版在契约规格版本 1.4.0 不变的前提下把稳定 Contracts 登记表扩到 20 类顶层对象,补齐有限封闭语义(FND-ADR-009)的 fixtures 与 schema,并新增 fixed-set-publication 与 schema 清单候选。
16
16
 
17
17
  **新增**
18
18
 
19
- - 新增候选 Resource、Task、Result Schema 及其严格校验辅助函数。这组候选 Schema 不进入稳定 Contracts 登记表。
20
- - 新增完整的英文与简体中文包文档,并补充智能体快速参考章节。
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
- - 使用同一份双语版本化说明源管理当前 README 与 CHANGELOG 的发布区域。
25
- - 项目 NOTICE 与 Apache-2.0 LICENSE 分开分发。
27
+ - CONTRACTS_VERSION 保持 1.4.0:同一契约规格版本线现在覆盖 20 类对象集,而已发布的 0.3.0 字节携带的是该版本的 18 类对象集。
28
+ - 方法标识、参数 Schema 与领域结果语义继续归消费者所有。
26
29
 
27
30
  **升级说明**
28
31
 
29
- 稳定登记表的消费者无需修改。Quickstart Profile 只能通过 candidate 子路径导入,不得把它当作已冻结的 Contracts 对象。
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.2.1
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.2.1
55
+ // 从空目录运行:npm install skill-family-contracts@0.4.0
53
56
  import { validateDocument } from "skill-family-contracts";
54
57
 
55
58
  const document = {
@@ -82,7 +85,9 @@ import {
82
85
  } from "skill-family-contracts/candidate/quickstart-profile";
83
86
  ```
84
87
 
85
- 以上子路径公开但**不稳定**。这些 Schema 刻意不进入 `src/registry.json`,不扩张十八类稳定对象,后续小版本可以修改或移除。调用方需要锁定精确包版本,并避免把 candidate 导入转成自身稳定公共 API。生产合同若需要冻结登记与兼容性保证,继续使用包根导出。
88
+ 0.4.0 携带 Quickstart Profile v2。协议把业务中立的操作固定为 `execute-method`,Resource、Task、Result Schema 通过真实的 v2 `$id` 互相解析。Foundation 只校验 JSON-safe 交换结构;方法标识、参数 Schema 与领域结果继续归消费者所有。
89
+
90
+ 以上子路径公开但**不稳定**。这些 Schema 不进入 `src/registry.json`,也不扩张十八类稳定对象,后续小版本可以修改或移除。评估 v2 时应精确锁定 `0.4.0`;仍依赖 candidate v1 的接入必须继续精确锁定 `0.2.1`。
86
91
 
87
92
  ## 典型使用场景
88
93
 
@@ -218,7 +223,7 @@ import {
218
223
 
219
224
  ### Capability selection
220
225
 
221
- - `foundation.contracts.object-validation`:Ajv 双方言校验 18 类对象。
226
+ - `foundation.contracts.object-validation`:Ajv 双方言校验 20 类对象。
222
227
  - `foundation.contracts.registry-protocol`:Schema `$id` 与协议名登记查询。
223
228
  - `foundation.contracts.kernel-protocol`:operation-request/result 协议。
224
229
  - `foundation.contracts.mandatory-checks`:九类强制规则与未解析引用。
@@ -248,7 +253,7 @@ import {
248
253
 
249
254
  ### Architectural invariants
250
255
 
251
- - 18 类顶层对象集合固定,新增需 ADR;错误码冻结不漂移。
256
+ - 20 类顶层对象集合固定,新增需 ADR;错误码冻结不漂移。
252
257
  - 校验器仅 Ajv 8.20.0(精确 pin),不接受其他实现。
253
258
 
254
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
+ }