skill-family-engineering-kit 0.8.4 → 0.9.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ <!-- release-skill:changelog:start version=0.9.0 locale=en baseline=sha256:6419bbdc8d469e6dd7f9fda5995e5465cc6bf98724371f9f4aa9293a7e0d9f14 -->
4
+ ## [0.9.0] - 2026-08-24
5
+
6
+ Engineering Kit 0.9.0 projects the stable filesystem schemas, bound-read Harness closure, and candidate ordered batch validation into the existing Quickstart Bundle.
7
+
8
+ ### Added
9
+
10
+ - Projects the three stable filesystem schemas and two candidate batch schemas from Contracts authorities.
11
+ - Projects the stable bound-read entry and its exact native prebuild closure without adding a Kit command.
12
+
13
+ ### Changed
14
+
15
+ - Keeps the four top-level Kit commands and Profile SPI candidate boundary unchanged.
16
+
17
+ ### Upgrade Notes
18
+
19
+ Pin all three Foundation packages to exactly 0.9.0 and rebuild managed Bundles. Batch validation is available only through the existing candidate Bundle and mechanisms CLI.
20
+ <!-- release-skill:changelog:end version=0.9.0 locale=en -->
21
+
22
+
3
23
  <!-- release-skill:changelog:start version=0.8.4 locale=en baseline=sha256:0f6ad4e641ae6ef85ea323e458aa6263aa6d87280e704ac1324742f83016d779 -->
4
24
  ## [0.8.4] - 2026-08-24
5
25
 
@@ -1,5 +1,25 @@
1
1
  # 变更日志
2
2
 
3
+ <!-- release-skill:changelog:start version=0.9.0 locale=zh-CN baseline=sha256:c84db7b53f562cbdad947ccf8fcc23209f18137100270b2691bab7d9a7ad623c -->
4
+ ## [0.9.0] - 2026-08-24
5
+
6
+ Engineering Kit 0.9.0 将稳定文件系统 Schema、绑定读取 Harness 闭包与有序批量校验 candidate 投影到既有 Quickstart Bundle。
7
+
8
+ ### 新增
9
+
10
+ - 从 Contracts 权威源投影三个稳定文件系统 Schema 与两个批量校验 candidate Schema。
11
+ - 投影稳定绑定读取入口及其精确原生预构建闭包,不新增 Kit 命令。
12
+
13
+ ### 变更
14
+
15
+ - 四个顶层 Kit 命令与 Profile SPI 的 candidate 边界保持不变。
16
+
17
+ ### 升级说明
18
+
19
+ 三个 Foundation 包必须精确锁定 0.9.0 并重新构建 managed Bundle;批量校验只能通过既有 candidate Bundle 与 mechanisms CLI 使用。
20
+ <!-- release-skill:changelog:end version=0.9.0 locale=zh-CN -->
21
+
22
+
3
23
  <!-- release-skill:changelog:start version=0.8.4 locale=zh-CN baseline=sha256:38a973bb735c925e8453656ce24a11173b530c6376609d68dfb850d9029daa21 -->
4
24
  ## [0.8.4] - 2026-08-24
5
25
 
package/README.md CHANGED
@@ -4,24 +4,27 @@
4
4
 
5
5
  # skill-family-engineering-kit
6
6
 
7
- <!-- release-skill:release-version: 0.8.4 -->
7
+ <!-- release-skill:release-version: 0.9.0 -->
8
8
 
9
9
  An engineering toolkit used in development and CI. There are **exactly four** top-level commands, and no fifth:
10
10
 
11
11
  <!-- release-skill:managed:start id=latest-release -->
12
- **0.8.4** (2026-08-24)
12
+ **0.9.0** (2026-08-24)
13
13
 
14
- Lockstep Foundation 0.8.4 update documents validated external source authority without changing Kit commands or Profile SPI.
14
+ Engineering Kit 0.9.0 projects the stable filesystem schemas, bound-read Harness closure, and candidate ordered batch validation into the existing Quickstart Bundle.
15
+
16
+ **Added**
17
+
18
+ - Projects the three stable filesystem schemas and two candidate batch schemas from Contracts authorities.
19
+ - Projects the stable bound-read entry and its exact native prebuild closure without adding a Kit command.
15
20
 
16
21
  **Changed**
17
22
 
18
- - Moves the package version to 0.8.4 together with Contracts and Harness.
19
- - Documents that consumers validate a source-authority receipt through Contracts before passing the returned coordinates through the existing sourceRepository and sourceBaseCommit fields.
20
- - Keeps the four stable top-level Kit commands, builder, Profile SPI, and public exports unchanged.
23
+ - Keeps the four top-level Kit commands and Profile SPI candidate boundary unchanged.
21
24
 
22
25
  **Upgrade Notes**
23
26
 
24
- Pin all three Foundation packages to exactly 0.8.4. A provider Profile descriptor upgrading from 0.8.3 and Contracts 1.7.0 must mechanically update its base.contractsVersion field to 1.8.0. Existing functions and Schema shapes, Profile SPI v3, and the four Kit commands require no migration; source-authority consumers only add the Contracts validation step before invoking the existing builder surface.
27
+ Pin all three Foundation packages to exactly 0.9.0 and rebuild managed Bundles. Batch validation is available only through the existing candidate Bundle and mechanisms CLI.
25
28
  <!-- release-skill:managed:end id=latest-release -->
26
29
 
27
30
  | Command | Purpose | Side effects |
@@ -42,7 +45,7 @@ Kit is the "engineering stage" layer, depending on the Harness and Contracts. It
42
45
  ## Installation and Minimal Example
43
46
 
44
47
  ```sh
45
- npm install --save-dev skill-family-engineering-kit@0.8.4
48
+ npm install --save-dev skill-family-engineering-kit@0.9.0
46
49
  npm exec -- skill-family-kit --help
47
50
  npm exec -- skill-family-kit scaffold --root <empty-dir> --project-id my-project
48
51
  npm exec -- skill-family-kit adopt-plan --root <repo>
@@ -50,7 +53,7 @@ npm exec -- skill-family-kit projection --root <repo>
50
53
  npm exec -- skill-family-kit check --root <repo>
51
54
  ```
52
55
 
53
- The four commands above cover skeleton generation, read-only inventory, managed projection, and diagnostics respectively; a zero-install form is available via `npm exec --package=skill-family-engineering-kit@0.8.4 -- skill-family-kit --help`.
56
+ The four commands above cover skeleton generation, read-only inventory, managed projection, and diagnostics respectively; a zero-install form is available via `npm exec --package=skill-family-engineering-kit@0.9.0 -- skill-family-kit --help`.
54
57
 
55
58
  ### Public Profile SPI
56
59
 
@@ -60,7 +63,7 @@ The package carries three SPI JSON resources and the Contracts canonical `profil
60
63
 
61
64
  `verifyProfile({ profileRoot })` is read-only and data-only for Profile descriptors. `verifyProjectProfile({ projectRoot, profileRelPath? })` is the corresponding entry for a project root declaration. Both refuse invalid input with stable result codes, never execute Profile-provided files, and leave Profile domain meaning to the caller.
62
65
 
63
- When a provider Profile descriptor moves from Foundation 0.8.3 and Contracts 1.7.0 to Foundation 0.8.4, update its `base.contractsVersion` field mechanically to `1.8.0`. Functions and Schema shapes, Profile SPI v3, and all four Kit commands retain their existing shapes.
66
+ When a provider Profile descriptor moves from Foundation 0.8.4 and Contracts 1.8.0 to Foundation 0.9.0, update its `base.contractsVersion` field mechanically to `1.9.0`. The four Kit commands and Profile SPI retain their existing shapes.
64
67
 
65
68
  ### Report sub-action
66
69
 
package/README.zh-CN.md CHANGED
@@ -5,24 +5,27 @@
5
5
 
6
6
  # skill-family-engineering-kit
7
7
 
8
- <!-- release-skill:release-version: 0.8.4 -->
8
+ <!-- release-skill:release-version: 0.9.0 -->
9
9
 
10
10
  开发与 CI 阶段使用的工程工具包。**恰好四个**顶层命令,没有第五个:
11
11
 
12
12
  <!-- release-skill:managed:start id=latest-release -->
13
- **0.8.4** (2026-08-24)
13
+ **0.9.0** (2026-08-24)
14
14
 
15
- Foundation 0.8.4 锁步升版,补充外置 source authority 校验用法;Kit 命令与 Profile SPI 不变。
15
+ Engineering Kit 0.9.0 将稳定文件系统 Schema、绑定读取 Harness 闭包与有序批量校验 candidate 投影到既有 Quickstart Bundle。
16
+
17
+ **新增**
18
+
19
+ - 从 Contracts 权威源投影三个稳定文件系统 Schema 与两个批量校验 candidate Schema。
20
+ - 投影稳定绑定读取入口及其精确原生预构建闭包,不新增 Kit 命令。
16
21
 
17
22
  **变更**
18
23
 
19
- - 包版本与 Contracts、Harness 一同升至 0.8.4。
20
- - 说明消费者先经 Contracts 校验 source-authority receipt,再把返回坐标传入既有 sourceRepository 与 sourceBaseCommit 字段。
21
- - 四个稳定顶层命令、builder、Profile SPI 与公共导出保持不变。
24
+ - 四个顶层 Kit 命令与 Profile SPI 的 candidate 边界保持不变。
22
25
 
23
26
  **升级说明**
24
27
 
25
- 消费者必须把三个 Foundation 包精确锁定到 0.8.4。provider Profile descriptor 从 0.8.3 Contracts 1.7.0 升级时,必须把自身的 base.contractsVersion 字段机械更新为 1.8.0。既有函数与 Schema 形状、Profile SPI v3、Kit 四命令均不需要迁移;需要 source authority 的消费者只增加调用 builder 前的 Contracts 校验步骤。
28
+ 三个 Foundation 包必须精确锁定 0.9.0 并重新构建 managed Bundle;批量校验只能通过既有 candidate Bundle mechanisms CLI 使用。
26
29
  <!-- release-skill:managed:end id=latest-release -->
27
30
 
28
31
  | 命令 | 用途 | 副作用 |
@@ -43,7 +46,7 @@ Kit 是「工程阶段」层,依赖 Harness 与 Contracts。它只做四件事
43
46
  ## 安装和最小示例
44
47
 
45
48
  ```sh
46
- npm install --save-dev skill-family-engineering-kit@0.8.4
49
+ npm install --save-dev skill-family-engineering-kit@0.9.0
47
50
  npm exec -- skill-family-kit --help
48
51
  npm exec -- skill-family-kit scaffold --root <empty-dir> --project-id my-project
49
52
  npm exec -- skill-family-kit adopt-plan --root <repo>
@@ -51,7 +54,7 @@ npm exec -- skill-family-kit projection --root <repo>
51
54
  npm exec -- skill-family-kit check --root <repo>
52
55
  ```
53
56
 
54
- 以上四条命令分别覆盖生成骨架、只读盘点、受管投影与诊断;零安装形式可用 `npm exec --package=skill-family-engineering-kit@0.8.4 -- skill-family-kit --help`。
57
+ 以上四条命令分别覆盖生成骨架、只读盘点、受管投影与诊断;零安装形式可用 `npm exec --package=skill-family-engineering-kit@0.9.0 -- skill-family-kit --help`。
55
58
 
56
59
  ### 公共 Profile SPI
57
60
 
@@ -61,7 +64,7 @@ npm exec -- skill-family-kit check --root <repo>
61
64
 
62
65
  `verifyProfile({ profileRoot })` 只读处理 Profile descriptor;项目根声明使用对应的 `verifyProjectProfile({ projectRoot, profileRelPath? })`。两个入口遇到无效输入都以稳定结果码失败关闭,不会执行 Profile 提供的文件;Profile 的领域含义仍由调用方负责。
63
66
 
64
- provider Profile descriptor 从 Foundation 0.8.3 与 Contracts 1.7.0 升级到 Foundation 0.8.4 时,须把自身的 `base.contractsVersion` 字段机械更新为 `1.8.0`。既有函数与 Schema 形状、Profile SPI v3、Kit 四命令的形状均不变。
67
+ provider Profile descriptor 从 Foundation 0.8.4 与 Contracts 1.8.0 升级到 Foundation 0.9.0 时,须把自身的 `base.contractsVersion` 字段更新为 `1.9.0`。Kit 四个顶层命令与 Profile SPI 的形状保持不变。
65
68
 
66
69
  ### 报告子动作
67
70
 
@@ -69,6 +69,14 @@ const FOUNDATION_SCHEMA_FILES = Object.freeze([
69
69
  ["harness-surface-inventory.schema.json", "schemas/foundation/harness-surface-inventory.schema.json"],
70
70
  ]);
71
71
 
72
+ const ADDITIONAL_FOUNDATION_SCHEMA_FILES = Object.freeze([
73
+ ["filesystem-root-binding.schema.json", "src/schemas/filesystem-root-binding.schema.json", "schemas/foundation/filesystem-root-binding.schema.json"],
74
+ ["fixed-set-publication-manifest.schema.json", "src/schemas/fixed-set-publication-manifest.schema.json", "schemas/foundation/fixed-set-publication-manifest.schema.json"],
75
+ ["fixed-set-publication-receipt.schema.json", "src/schemas/fixed-set-publication-receipt.schema.json", "schemas/foundation/fixed-set-publication-receipt.schema.json"],
76
+ ["schema-validation-batch-request.schema.json", "candidate/foundation-mechanisms/schema-validation-batch-request.schema.json", "schemas/foundation/schema-validation-batch-request.schema.json"],
77
+ ["schema-validation-batch-result.schema.json", "candidate/foundation-mechanisms/schema-validation-batch-result.schema.json", "schemas/foundation/schema-validation-batch-result.schema.json"],
78
+ ]);
79
+
72
80
  const HARNESS_IMPORT_MAP = new Map([
73
81
  ["skill-family-contracts", "../contracts/index.mjs"],
74
82
  ["skill-family-contracts/candidate/quickstart-profile", "../contracts-candidate/index.mjs"],
@@ -76,6 +84,7 @@ const HARNESS_IMPORT_MAP = new Map([
76
84
  ["../src/errors.mjs", "./errors.mjs"],
77
85
  ["../src/paths.mjs", "./paths.mjs"],
78
86
  ["../src/strict-read.mjs", "./strict-read.mjs"],
87
+ ["../src/bound-read.mjs", "./bound-read.mjs"],
79
88
  ]);
80
89
 
81
90
  const HARNESS_STRICT_READ_IMPORT_MAP = new Map([
@@ -124,6 +133,18 @@ const FIXED_SET_CANDIDATE_FILES = Object.freeze([
124
133
  "prebuilds/linux-x64-gnu/rename_directory_no_replace.linux-x64-gnu.node",
125
134
  ]);
126
135
  const FIXED_SET_BINARY_PREFIX = "prebuilds/";
136
+ const STABLE_BOUND_READ_NATIVE_FILES = Object.freeze([
137
+ "prebuild-manifest.json",
138
+ "prebuilds/darwin-arm64/bound_read.darwin-arm64.node",
139
+ "prebuilds/darwin-x64/bound_read.darwin-x64.node",
140
+ "prebuilds/linux-arm64-gnu/bound_read.linux-arm64-gnu.node",
141
+ "prebuilds/linux-x64-gnu/bound_read.linux-x64-gnu.node",
142
+ ]);
143
+ const STABLE_BOUND_READ_METADATA_FILES = Object.freeze([
144
+ "NOTICE",
145
+ "prebuild-sbom.json",
146
+ "prebuild-release-receipt.json",
147
+ ]);
127
148
 
128
149
  // These fragments are the exact case-sensitive words rejected by the
129
150
  // bundle-wide byte scan. Caller-provided source identities enter provenance
@@ -958,6 +979,13 @@ function projectContractsCandidateIndex(sourceText) {
958
979
  `schema load path ${fileName}`,
959
980
  );
960
981
  }
982
+ for (const [fileName] of ADDITIONAL_FOUNDATION_SCHEMA_FILES.filter(([name]) => name.startsWith("schema-validation-batch-"))) {
983
+ applyOnce(
984
+ `load(new URL("../foundation-mechanisms/${fileName}", import.meta.url))`,
985
+ `load(new URL("../../schemas/foundation/${fileName}", import.meta.url))`,
986
+ `schema load path ${fileName}`,
987
+ );
988
+ }
961
989
 
962
990
  const getCollectionMarker = "function getCollection(";
963
991
  const getCollectionHits = projected.split(getCollectionMarker).length - 1;
@@ -1068,12 +1096,15 @@ function runnerSource() {
1068
1096
  'export * from "./runtime/harness/quickstart-profile.mjs";',
1069
1097
  'export { validateQuickstartProfileDocument } from "./runtime/contracts-candidate/index.mjs";',
1070
1098
  'export { validateBySchemaId } from "./validators.mjs";',
1099
+ 'export { createFilesystemRootBinding, readFileBound } from "./runtime/harness/bound-read.mjs";',
1100
+ 'export { createFixedSetPublicationManifest, publishFixedSet } from "./runtime/harness/fixed-set-publication.mjs";',
1071
1101
  'export { publishFileExclusive, publishFileOrReplace, replaceFileAtomic } from "./runtime/harness/atomic.mjs";',
1072
1102
  'export { acquireFilesystemLock, inspectFilesystemLock, releaseFilesystemLock, recoverFilesystemLock } from "./runtime/harness/token-lock.mjs";',
1073
1103
  'import { invokeFoundationMechanism as invokeHarnessMechanism } from "./runtime/harness/quickstart-profile.mjs";',
1074
1104
  'import { validateBySchemaId } from "./validators.mjs";',
1105
+ 'import { listValidatableSchemaIds } from "./validators.mjs";',
1075
1106
  'export function invokeFoundationMechanism(request) {',
1076
- ' return invokeHarnessMechanism(request, { validateBySchemaId });',
1107
+ ' return invokeHarnessMechanism(request, { validateBySchemaId, listValidatableSchemaIds });',
1077
1108
  '}',
1078
1109
  "",
1079
1110
  ].join("\n");
@@ -1176,6 +1207,10 @@ export async function buildQuickstartProfileProjection({
1176
1207
  `candidate/quickstart-profile/${fileName}`,
1177
1208
  );
1178
1209
  }
1210
+ const additionalSchemaTexts = {};
1211
+ for (const [fileName, sourcePath] of ADDITIONAL_FOUNDATION_SCHEMA_FILES) {
1212
+ additionalSchemaTexts[fileName] = await readSourceText(contractsRoot, sourcePath);
1213
+ }
1179
1214
  sources.harnessIndex = await readSourceText(harnessRoot, "src/index.mjs");
1180
1215
  sources.harnessCandidate = await readSourceText(harnessRoot, "candidate/quickstart-profile.mjs");
1181
1216
  sources.harnessMechanismsCli = await readSourceText(harnessRoot, "candidate/mechanisms-cli.mjs");
@@ -1185,6 +1220,22 @@ export async function buildQuickstartProfileProjection({
1185
1220
  sources.harnessStrictRead = await readSourceText(harnessRoot, "src/strict-read.mjs");
1186
1221
  sources.harnessAtomic = await readSourceText(harnessRoot, "src/atomic.mjs");
1187
1222
  sources.harnessTokenLock = await readSourceText(harnessRoot, "src/token-lock.mjs");
1223
+ sources.harnessBoundRead = await readSourceText(harnessRoot, "src/bound-read.mjs");
1224
+ sources.harnessFixedSetPublication = await readSourceText(harnessRoot, "src/fixed-set-publication.mjs");
1225
+ sources.harnessFixedSetPublicationLoader = await readSourceText(harnessRoot, "src/fixed-set-publication-loader.mjs");
1226
+ sources.harnessBoundReadLoader = await readSourceText(harnessRoot, "src/native/loader.mjs");
1227
+ sources.harnessBoundReadManifest = await readSourceText(harnessRoot, "src/native/prebuild-manifest.json");
1228
+ sources.harnessBoundReadMetadata = {};
1229
+ for (const relative of STABLE_BOUND_READ_METADATA_FILES) {
1230
+ sources.harnessBoundReadMetadata[relative] = await readSourceText(harnessRoot, `src/native/${relative}`);
1231
+ }
1232
+ const harnessBoundReadBinaries = {};
1233
+ for (const relative of STABLE_BOUND_READ_NATIVE_FILES.slice(1)) {
1234
+ harnessBoundReadBinaries[relative] = await readCanonicalRegularFile(
1235
+ path.join(harnessRoot, "src/native", relative),
1236
+ `stable bound-read prebuild ${relative}`,
1237
+ );
1238
+ }
1188
1239
  // The package manifests are recorded as complete original bytes below, so
1189
1240
  // every provenance path digest recomputes from the real file.
1190
1241
  const contractsPackageJsonText = await readSourceText(contractsRoot, "package.json");
@@ -1233,6 +1284,10 @@ export async function buildQuickstartProfileProjection({
1233
1284
  name: fileName,
1234
1285
  text: candidateSchemaTexts[fileName],
1235
1286
  })),
1287
+ ...ADDITIONAL_FOUNDATION_SCHEMA_FILES.map(([fileName]) => ({
1288
+ name: fileName,
1289
+ text: additionalSchemaTexts[fileName],
1290
+ })),
1236
1291
  ].map((entry) => ({ name: entry.name, document: JSON.parse(entry.text) }));
1237
1292
 
1238
1293
  const graph = buildSchemaGraph(consumerRecords, foundationSchemaDocuments);
@@ -1359,6 +1414,9 @@ export async function buildQuickstartProfileProjection({
1359
1414
  for (const [fileName, bundlePath] of FOUNDATION_SCHEMA_FILES) {
1360
1415
  setText(bundlePath, candidateSchemaTexts[fileName]);
1361
1416
  }
1417
+ for (const [fileName, , bundlePath] of ADDITIONAL_FOUNDATION_SCHEMA_FILES) {
1418
+ setText(bundlePath, additionalSchemaTexts[fileName]);
1419
+ }
1362
1420
  setText("schemas/foundation/operation-request.schema.json", sources.operationRequest);
1363
1421
  setText("schemas/foundation/operation-result.schema.json", sources.operationResult);
1364
1422
  setText("schemas/foundation/migration-manifest.schema.json", sources.migrationManifestSchema);
@@ -1387,6 +1445,31 @@ export async function buildQuickstartProfileProjection({
1387
1445
  "runtime/harness/token-lock.mjs",
1388
1446
  projectModuleWithImportMap(sources.harnessTokenLock, HARNESS_TOKEN_LOCK_IMPORT_MAP, "harness src/token-lock.mjs"),
1389
1447
  );
1448
+ setText(
1449
+ "runtime/harness/bound-read.mjs",
1450
+ projectModuleWithImportMap(
1451
+ sources.harnessBoundRead,
1452
+ new Map([["skill-family-contracts", "../contracts/index.mjs"]]),
1453
+ "harness src/bound-read.mjs",
1454
+ ),
1455
+ );
1456
+ setText(
1457
+ "runtime/harness/fixed-set-publication.mjs",
1458
+ projectModuleWithImportMap(
1459
+ sources.harnessFixedSetPublication,
1460
+ new Map([["skill-family-contracts", "../contracts/index.mjs"]]),
1461
+ "harness src/fixed-set-publication.mjs",
1462
+ ),
1463
+ );
1464
+ setText("runtime/harness/fixed-set-publication-loader.mjs", sources.harnessFixedSetPublicationLoader);
1465
+ setText("runtime/harness/native/loader.mjs", sources.harnessBoundReadLoader);
1466
+ setText("runtime/harness/native/prebuild-manifest.json", sources.harnessBoundReadManifest);
1467
+ for (const relative of STABLE_BOUND_READ_METADATA_FILES) {
1468
+ setText(`runtime/harness/native/${relative}`, sources.harnessBoundReadMetadata[relative]);
1469
+ }
1470
+ for (const relative of STABLE_BOUND_READ_NATIVE_FILES.slice(1)) {
1471
+ setBytes(`runtime/harness/native/${relative}`, harnessBoundReadBinaries[relative].bytes);
1472
+ }
1390
1473
  const migrationManifestSchemaId = JSON.parse(sources.migrationManifestSchema).$id;
1391
1474
  setText(
1392
1475
  "runtime/kit/migration.mjs",
@@ -1472,6 +1555,11 @@ export async function buildQuickstartProfileProjection({
1472
1555
  ["packages/skill-family-contracts/candidate/quickstart-profile/result.schema.json", candidateSchemaTexts["result.schema.json"], "projected"],
1473
1556
  ["packages/skill-family-contracts/candidate/quickstart-profile/consumer-schema-inventory.schema.json", candidateSchemaTexts["consumer-schema-inventory.schema.json"], "projected"],
1474
1557
  ["packages/skill-family-contracts/candidate/quickstart-profile/harness-surface-inventory.schema.json", candidateSchemaTexts["harness-surface-inventory.schema.json"], "projected"],
1558
+ ...ADDITIONAL_FOUNDATION_SCHEMA_FILES.map(([fileName, sourcePath]) => [
1559
+ `packages/skill-family-contracts/${sourcePath}`,
1560
+ additionalSchemaTexts[fileName],
1561
+ "projected",
1562
+ ]),
1475
1563
  ["packages/skill-family-contracts/candidate/quickstart-profile/index.mjs", sources.candidateIndex, "extraction-input"],
1476
1564
  ["packages/skill-family-harness-node/package.json", harnessPackageJsonText, "identity"],
1477
1565
  ["packages/skill-family-harness-node/src/index.mjs", sources.harnessIndex, "imported-surface"],
@@ -1483,6 +1571,21 @@ export async function buildQuickstartProfileProjection({
1483
1571
  ["packages/skill-family-harness-node/src/strict-read.mjs", sources.harnessStrictRead, "projected"],
1484
1572
  ["packages/skill-family-harness-node/src/atomic.mjs", sources.harnessAtomic, "projected"],
1485
1573
  ["packages/skill-family-harness-node/src/token-lock.mjs", sources.harnessTokenLock, "projected"],
1574
+ ["packages/skill-family-harness-node/src/bound-read.mjs", sources.harnessBoundRead, "projected"],
1575
+ ["packages/skill-family-harness-node/src/fixed-set-publication.mjs", sources.harnessFixedSetPublication, "projected"],
1576
+ ["packages/skill-family-harness-node/src/fixed-set-publication-loader.mjs", sources.harnessFixedSetPublicationLoader, "projected"],
1577
+ ["packages/skill-family-harness-node/src/native/loader.mjs", sources.harnessBoundReadLoader, "projected"],
1578
+ ["packages/skill-family-harness-node/src/native/prebuild-manifest.json", sources.harnessBoundReadManifest, "identity"],
1579
+ ...STABLE_BOUND_READ_METADATA_FILES.map((relative) => [
1580
+ `packages/skill-family-harness-node/src/native/${relative}`,
1581
+ sources.harnessBoundReadMetadata[relative],
1582
+ "identity",
1583
+ ]),
1584
+ ...STABLE_BOUND_READ_NATIVE_FILES.slice(1).map((relative) => [
1585
+ `packages/skill-family-harness-node/src/native/${relative}`,
1586
+ harnessBoundReadBinaries[relative].bytes,
1587
+ "binary",
1588
+ ]),
1486
1589
  ["packages/skill-family-engineering-kit/package.json", kitPackageJsonText, "identity"],
1487
1590
  ["packages/skill-family-engineering-kit/candidate/profile-bundle.mjs", kitBuilderSource, "builder"],
1488
1591
  ["packages/skill-family-engineering-kit/candidate/projection-bundle-cli.mjs", kitCliSource, "builder"],
@@ -1972,7 +1972,7 @@ Contracts(结构、协议、错误码、协议名登记)
1972
1972
  <tbody>
1973
1973
  <tr>
1974
1974
  <td>Contracts</td>
1975
- <td>结构、协议、错误码、协议名登记;32 类顶层对象;9 条 mandatory rule</td>
1975
+ <td>结构、协议、错误码、协议名登记;35 类顶层对象;9 条 mandatory rule</td>
1976
1976
  <td>业务字段语义、领域审计、远端写入、模型生成</td>
1977
1977
  </tr>
1978
1978
  <tr>
@@ -2077,12 +2077,12 @@ Contracts(结构、协议、错误码、协议名登记)
2077
2077
  <p>三包结构保持、不拆第四包(FND-ADR-007);制品治理采用 artifact-graph CLI 与版本锁(FND-ADR-006)。</p>
2078
2078
  <h2 id="首版预算">首版预算<a class="headerlink" href="#首版预算" title="Permanent link">&para;</a></h2>
2079
2079
  <ul>
2080
- <li>顶层 Contracts 对象:32 类(完整清单以 <code>packages/skill-family-contracts/src/registry.json</code> 为唯一真源):project-manifest、profile-descriptor、project-profile(FND-ADR-013,1.7.0 纳入)、managed-file-lock、operation-request、operation-result、migration-manifest、adapter-source、report-model、report-binding、host-descriptor、host-registry、host-capability-fact、host-probe-result、adapter-build-manifest、host-operation-plan、host-operation-receipt、state-event-envelope、state-snapshot-metadata、token-estimate-result、surface-scan-policy、declared-read-surface-result、structured-scan-policy(FND-ADR-010/011)、timeout-policy、watchdog-termination-envelope(FND-ADR-012,append-only 保持 1.5.0)、public-boundary-declaration、platform-difference-registry、observation-scope、profile-adoption-declaration、audit-baseline-pin、token-estimate-record(审计规则裁决与整改 1.6.0 纳入)、source-authority-receipt(1.8.0 纳入);</li>
2080
+ <li>顶层 Contracts 对象:35 类(完整清单以 <code>packages/skill-family-contracts/src/registry.json</code> 为唯一真源):project-manifest、profile-descriptor、project-profile(FND-ADR-013,1.7.0 纳入)、managed-file-lock、operation-request、operation-result、migration-manifest、adapter-source、report-model、report-binding、host-descriptor、host-registry、host-capability-fact、host-probe-result、adapter-build-manifest、host-operation-plan、host-operation-receipt、state-event-envelope、state-snapshot-metadata、token-estimate-result、surface-scan-policy、declared-read-surface-result、structured-scan-policy(FND-ADR-010/011)、timeout-policy、watchdog-termination-envelope(FND-ADR-012,append-only 保持 1.5.0)、public-boundary-declaration、platform-difference-registry、observation-scope、profile-adoption-declaration、audit-baseline-pin、token-estimate-record(审计规则裁决与整改 1.6.0 纳入)、source-authority-receipt(1.8.0 纳入)、filesystem-root-binding、fixed-set-publication-manifest、fixed-set-publication-receipt(1.9.0 纳入);</li>
2081
2081
  <li>Kit 顶层命令:4 个(scaffold、adopt-plan、projection、check);</li>
2082
2082
  <li>强制机械规则:当前 9 条,预算不超过 20 条,绝对上限 30 条;CR-001 对登记表内全部 Schema 做统一编译;</li>
2083
2083
  <li>叶子包:3 个(skill-family-contracts、skill-family-harness-node、skill-family-engineering-kit);</li>
2084
2084
  <li>Schema 校验器:Ajv 8.20.0(精确版本 pin),支持 draft-07 与 2020-12 双方言;</li>
2085
- <li>kernel 协议:skill-family.kernel.operation(stable),Contracts 版本 1.8.0;</li>
2085
+ <li>kernel 协议:skill-family.kernel.operation(stable),Contracts 版本 1.9.0;</li>
2086
2086
  <li>默认运行时语言:Node;第二语言实现首版为 0。</li>
2087
2087
  </ul>
2088
2088
  <p>任何新增组件必须说明删除它会导致的两个以上真实消费者重复实现,并通过独立 fixture 验证。</p>
@@ -1796,7 +1796,8 @@
1796
1796
  isolation-and-lockfile.md 隔离安装与包锁验证设计
1797
1797
  independence.md 独立性声明与机械证明
1798
1798
  schemas/audit-evidence.schema.json 证据文档的 JSON Schema(审计自有)
1799
- baseline/contracts-1.8.0.pin.json Contracts 1.8.0 当前候选基线 pin(摘要+事实)
1799
+ baseline/contracts-1.9.0.pin.json Contracts 1.9.0 当前候选基线 pin(摘要+事实)
1800
+ baseline/contracts-1.8.0.pin.json Contracts 1.8.0 只读兼容存档 pin
1800
1801
  baseline/contracts-1.6.0.pin.json Contracts 1.6.0 只读兼容存档 pin
1801
1802
  baseline/contracts-1.5.0.pin.json Contracts 1.5.0 只读兼容存档 pin
1802
1803
  baseline/contracts-1.1.1.pin.json Contracts 1.1.1 只读兼容存档 pin
@@ -1943,7 +1943,7 @@
1943
1943
  <h3 id="M4-遗漏omission">M4 遗漏(omission)<a class="headerlink" href="#M4-遗漏omission" title="Permanent link">&para;</a></h3>
1944
1944
  <p>变异从冻结文档中<strong>删除</strong>必备部件。三个覆盖检查(fixture 用 <code>expect.check</code> 声明):</p>
1945
1945
  <ul>
1946
- <li><code>registry-schema-coverage</code>:五个顶层对象的 schema 登记缺一不可;</li>
1946
+ <li><code>registry-schema-coverage</code>:当前基线 pin 中的全部顶层对象都必须登记;</li>
1947
1947
  <li><code>rules-checktype-coverage</code>:九个检查类型每个都必须被至少一条 mandatory 规则覆盖;</li>
1948
1948
  <li><code>error-code-coverage</code>:冻结错误码清单一个不能少。</li>
1949
1949
  </ul>
@@ -1791,7 +1791,7 @@
1791
1791
  <tbody>
1792
1792
  <tr>
1793
1793
  <td><code>contractsVersion</code></td>
1794
- <td>Contracts 冻结版本(当前 <code>1.8.0</code>)</td>
1794
+ <td>Contracts 冻结版本(当前 <code>1.9.0</code>)</td>
1795
1795
  <td>机器契约内容的版本</td>
1796
1796
  </tr>
1797
1797
  <tr>
@@ -1806,7 +1806,7 @@
1806
1806
  </tr>
1807
1807
  </tbody>
1808
1808
  </table>
1809
- <p>三者都由 <code>describeAuditSurface()</code> 一次性给出,审计侧把它们与基线 pin(当前为 <code>baseline/contracts-1.8.0.pin.json</code>)比对。</p>
1809
+ <p>三者都由 <code>describeAuditSurface()</code> 一次性给出,审计侧把它们与基线 pin(当前为 <code>baseline/contracts-1.9.0.pin.json</code>)比对。</p>
1810
1810
  <h2 id="兼容规则">兼容规则<a class="headerlink" href="#兼容规则" title="Permanent link">&para;</a></h2>
1811
1811
  <p>一个被消费的 Contracts 包与某个基线 pin <strong>兼容</strong>,当且仅当同时满足:</p>
1812
1812
  <ol>
@@ -1866,6 +1866,7 @@
1866
1866
  <li><strong>Contracts 1.6.0(2026-08-18)</strong>:审计整改 C5 能力线增量,不是描述补丁:新增 <code>public-boundary-declaration</code>、<code>platform-difference-registry</code>、<code>observation-scope</code>、<code>profile-adoption-declaration</code>、<code>audit-baseline-pin</code>、<code>token-estimate-record</code> 六个顶层契约(顶层对象集合 24 → 30),改变了公开机器合同与审计事实;未新增 SFC 错误码,规则与 kernel 协议仅随 <code>contractsVersion</code> 字段更新。pin 合同本身(<code>audit-baseline-pin</code>)与消费面校验函数 <code>verifyBaselinePin()</code>(AUD-BASE-001 / AUD-LOCK-001 编码)在本版本落地(GAP-5 / SG-28)。</li>
1867
1867
  <li><strong>Contracts 1.7.0(2026-08-22)</strong>:FND-ADR-013 的 Project Profile 能力线增量。新增 <code>project-profile</code> 顶层契约(顶层对象集合 30 → 31),统一 scaffold 项目根声明的机器结构;未新增 SFC 错误码。<code>contracts-1.7.0.pin.json</code> 由 <code>scripts/baseline-pin-gen.mjs --update</code> 从 <code>describeAuditSurface()/describeBaselinePin()</code> 机械生成,并经过合同校验和 <code>verifyBaselinePin()</code> 自校验;现作为历史只读兼容存档保留。</li>
1868
1868
  <li><strong>Contracts 1.8.0(2026-08-24)</strong>:新增业务中立的 <code>source-authority-receipt</code> 顶层契约(31 → 32),以及纯校验、解析 API;未新增 SFC 错误码。<code>contracts-1.8.0.pin.json</code> 由 <code>scripts/baseline-pin-gen.mjs --update</code> 从公开 Contracts 表面机械生成并自校验;1.7.0 及更早 pin 保留为只读兼容存档。</li>
1869
+ <li><strong>Contracts 1.9.0(2026-08-24)</strong>:新增业务中立的 <code>filesystem-root-binding</code>、<code>fixed-set-publication-manifest</code> 和 <code>fixed-set-publication-receipt</code> 三个顶层契约(32 → 35)。错误码、规则、检查类型、预算、Kernel 操作和校验策略均未变化。<code>contracts-1.9.0.pin.json</code> 由 <code>scripts/baseline-pin-gen.mjs --update</code> 从公开 Contracts 表面机械生成并自校验;1.8.0 及更早 pin 保留为只读兼容存档。</li>
1869
1870
  <li>审计运行时先做包锁验证(见 isolation-and-lockfile.md),再做变异重放;pin 不匹配时,变异重放结果不得被采信。</li>
1870
1871
  </ul>
1871
1872
  <h2 id="profile-行为变更纪律2026-08-19D6">profile 行为变更纪律(2026-08-19,D6)<a class="headerlink" href="#profile-行为变更纪律2026-08-19D6" title="Permanent link">&para;</a></h2>
@@ -1792,17 +1792,17 @@
1792
1792
  <tbody>
1793
1793
  <tr>
1794
1794
  <td><code>skill-family-contracts</code></td>
1795
- <td>0.8.4</td>
1795
+ <td>0.9.0</td>
1796
1796
  <td><a href="https://github.com/ifoohoo/skill-family-contracts">ifoohoo/skill-family-contracts</a></td>
1797
1797
  </tr>
1798
1798
  <tr>
1799
1799
  <td><code>skill-family-harness-node</code></td>
1800
- <td>0.8.4</td>
1800
+ <td>0.9.0</td>
1801
1801
  <td><a href="https://github.com/ifoohoo/skill-family-harness-node">ifoohoo/skill-family-harness-node</a></td>
1802
1802
  </tr>
1803
1803
  <tr>
1804
1804
  <td><code>skill-family-engineering-kit</code></td>
1805
- <td>0.8.4</td>
1805
+ <td>0.9.0</td>
1806
1806
  <td><a href="https://github.com/ifoohoo/skill-family-engineering-kit">ifoohoo/skill-family-engineering-kit</a></td>
1807
1807
  </tr>
1808
1808
  </tbody>
@@ -743,6 +743,17 @@
743
743
  </ul>
744
744
  </nav>
745
745
 
746
+ </li>
747
+
748
+ <li class="md-nav__item">
749
+ <a href="#文件系统契约-foundationcontractsfilesystem" class="md-nav__link">
750
+ <span class="md-ellipsis">
751
+
752
+ 文件系统契约 (foundation.contracts.filesystem)
753
+
754
+ </span>
755
+ </a>
756
+
746
757
  </li>
747
758
 
748
759
  <li class="md-nav__item">
@@ -2028,6 +2039,17 @@
2028
2039
  </ul>
2029
2040
  </nav>
2030
2041
 
2042
+ </li>
2043
+
2044
+ <li class="md-nav__item">
2045
+ <a href="#文件系统契约-foundationcontractsfilesystem" class="md-nav__link">
2046
+ <span class="md-ellipsis">
2047
+
2048
+ 文件系统契约 (foundation.contracts.filesystem)
2049
+
2050
+ </span>
2051
+ </a>
2052
+
2031
2053
  </li>
2032
2054
 
2033
2055
  <li class="md-nav__item">
@@ -2254,6 +2276,7 @@
2254
2276
  <ul>
2255
2277
  <li><a href="#对象校验-foundationcontractsobject-validation">对象校验</a> → <code>validateDocument</code> / <code>compileSchema</code> / <code>detectDialect</code></li>
2256
2278
  <li><a href="#来源权威收据-foundationcontractssource-authority">来源权威收据</a> → <code>validateSourceAuthorityReceipt</code> / <code>parseSourceAuthorityReceipt</code></li>
2279
+ <li><a href="#文件系统契约-foundationcontractsfilesystem">文件系统契约</a> → 根绑定与固定集合 manifest/receipt Schema</li>
2257
2280
  <li><a href="#登记与协议-foundationcontractsregistry-protocol">登记与协议</a> → <code>loadRegistry</code> / <code>findSchemaByObject</code> / <code>findProtocol</code> / <code>registerSchema</code> / <code>registerProtocol</code></li>
2258
2281
  <li><a href="#内核协议-foundationcontractskernel-protocol">内核协议</a> → <code>loadKernelProtocol</code> / <code>findOperation</code> / <code>checkOperation</code></li>
2259
2282
  <li><a href="#强制检查-foundationcontractsmandatory-checks">强制检查</a> → <code>runChecks</code> / <code>collectUnresolvedRefs</code></li>
@@ -2261,7 +2284,7 @@
2261
2284
  <li><a href="#错误码-foundationcontractserror-codes">错误码</a> → <code>ContractsError</code> / <code>isRegisteredErrorCode</code> / <code>stableError</code></li>
2262
2285
  <li><a href="#审计表面-foundationcontractsaudit-surface">审计表面</a> → <code>canonicalJson</code> / <code>digestDocument</code> / <code>digestAuditSurface</code></li>
2263
2286
  </ul>
2264
- <p>包级常量(冻结,仅作事实投影,不另立权威):<code>CONTRACT_OBJECTS</code>(32 类顶层对象,闭集)、<code>CONTRACT_BOUNDARY</code>、<code>CONTRACTS_VERSION = "1.8.0"</code>、<code>SUPPORTED_DIALECTS</code>、<code>VALIDATION_POLICIES</code>、<code>CHECK_TYPES</code>(9 类机械检查)、<code>MANDATORY_RULES</code>、<code>RULE_BUDGET</code>、<code>ERROR_CODES</code>。</p>
2287
+ <p>包级常量(冻结,仅作事实投影,不另立权威):<code>CONTRACT_OBJECTS</code>(35 类顶层对象,闭集)、<code>CONTRACT_BOUNDARY</code>、<code>CONTRACTS_VERSION = "1.9.0"</code>、<code>SUPPORTED_DIALECTS</code>、<code>VALIDATION_POLICIES</code>、<code>CHECK_TYPES</code>(9 类机械检查)、<code>MANDATORY_RULES</code>、<code>RULE_BUDGET</code>、<code>ERROR_CODES</code>。</p>
2265
2288
  <hr />
2266
2289
  <h2 id="对象校验-foundationcontractsobject-validation">对象校验 (foundation.contracts.object-validation)<a class="headerlink" href="#对象校验-foundationcontractsobject-validation" title="Permanent link">&para;</a></h2>
2267
2290
  <h3 id="validateDocument">validateDocument<a class="headerlink" href="#validateDocument" title="Permanent link">&para;</a></h3>
@@ -2324,6 +2347,13 @@
2324
2347
  <li>调用方仍拥有的业务语义:receipt 的签发、存储和传输;实际包发现;校验后是否采用该来源。Contracts 不执行目标,也不解释私有发布计划。</li>
2325
2348
  </ul>
2326
2349
  <hr />
2350
+ <h2 id="文件系统契约-foundationcontractsfilesystem">文件系统契约 (foundation.contracts.filesystem)<a class="headerlink" href="#文件系统契约-foundationcontractsfilesystem" title="Permanent link">&para;</a></h2>
2351
+ <p>0.9.0 新增三个稳定顶层 Schema:<code>filesystem-root-binding</code>、<code>fixed-set-publication-manifest</code> 与 <code>fixed-set-publication-receipt</code>。它们只描述结构与回执,不提供删除、替换或通用恢复状态机。</p>
2352
+ <ul>
2353
+ <li>根绑定 Schema:<code>https://contracts.skill-family.example/v1/filesystem-root-binding.json</code>。值固定为 <code>kind</code>、<code>digestAlgorithm</code>、<code>basis</code>、<code>digest</code> 四个字段;绑定值可序列化且不包含公开目录句柄。</li>
2354
+ <li>固定集合 manifest/receipt Schema:<code>https://contracts.skill-family.example/v1/fixed-set-publication-manifest.json</code> 与 <code>https://contracts.skill-family.example/v1/fixed-set-publication-receipt.json</code>。发布回执的终态只允许 <code>succeeded</code>、<code>refused</code>、<code>failed</code>、<code>indeterminate</code>。</li>
2355
+ <li>这三个 Schema 的真实登记与 fixture 由 <code>packages/skill-family-contracts/src/registry.json</code>、<code>src/schemas/</code> 和 <code>test/</code> 共同核验;批量校验 Schema 保持 candidate,不进入稳定 Registry。</li>
2356
+ </ul>
2327
2357
  <h2 id="登记与协议-foundationcontractsregistry-protocol">登记与协议 (foundation.contracts.registry-protocol)<a class="headerlink" href="#登记与协议-foundationcontractsregistry-protocol" title="Permanent link">&para;</a></h2>
2328
2358
  <h3 id="loadRegistry--listSchemas--listProtocols--findSchemaRegistration--findSchemaByObject--findProtocol">loadRegistry / listSchemas / listProtocols / findSchemaRegistration / findSchemaByObject / findProtocol<a class="headerlink" href="#loadRegistry--listSchemas--listProtocols--findSchemaRegistration--findSchemaByObject--findProtocol" title="Permanent link">&para;</a></h3>
2329
2359
  <ul>
@@ -2565,6 +2595,7 @@
2565
2595
  <hr />
2566
2596
  <h2 id="Quickstart-Profile-v2-candidate">Quickstart Profile v2 candidate<a class="headerlink" href="#Quickstart-Profile-v2-candidate" title="Permanent link">&para;</a></h2>
2567
2597
  <p><code>skill-family-contracts/candidate/quickstart-profile</code> 导出 v2 协议、按真实 <code>$id</code> 索引的 Resource/Task/Result Schema 集合,以及 <code>validateQuickstartProfileDocument</code>。唯一操作名是业务中立的 <code>execute-method</code>;Foundation 不登记 method 词表,也不解释 parameters、evidence 或 domainResult 的领域含义。</p>
2598
+ <p>0.9.0 另提供两个 candidate batch Schema:<code>schema-validation-batch-request.json</code> 与 <code>schema-validation-batch-result.json</code>。它们只供现有 Quickstart Bundle 的 <code>validate-many-by-schema-id</code> 机制使用;未知 <code>schemaId</code> 或任一结构畸形都使整批请求失败,不改变稳定 Registry。</p>
2568
2599
  <p>该入口从 <code>0.2.1</code> 起公开,但稳定性仍为 <code>candidate</code>。0.3.0 已用 v2 替换 v1,两者不兼容:新接入需精确锁定 <code>0.3.0</code>,仍需 v1 的接入继续精确锁定 <code>0.2.1</code>。candidate Schema 不进入稳定 <code>src/registry.json</code>。</p>
2569
2600
  <hr />
2570
2601
  <h2 id="与机器事实层的互链">与机器事实层的互链<a class="headerlink" href="#与机器事实层的互链" title="Permanent link">&para;</a></h2>
@@ -2376,7 +2376,7 @@
2376
2376
  <p>本页从真实导出(<code>src/index.mjs</code> 与各源模块、CLI 入口)核对,不手写无法证明新鲜度的全集。每个公共入口按 hand-off §4.3 说明:签名、输入与输出、是否纯函数、文件/进程/Git/网络副作用、稳定错误码与 <code>details.kind</code>、前置条件与信任锚、<code>since</code> 与 <code>stability</code>、源文件与正例/负例测试、调用方仍拥有的业务语义。</p>
2377
2377
  <p>Kit 消费 Contracts 与 Harness,只拥有四个顶层命令与它们的只读/受控写边界。包级常量:<code>TOP_LEVEL_COMMANDS</code>(冻结 4 个:<code>scaffold</code> / <code>adopt-plan</code> / <code>projection</code> / <code>check</code>)、<code>FORBIDDEN_SIDE_EFFECTS</code>、<code>COMMAND_SIDE_EFFECTS</code>、<code>KIT_EXIT_CODES</code>(<code>ok=0</code> / <code>findings=1</code> / <code>rejected=2</code>)。Kit 永不执行 Git 写、发布、删除用户内容或触网。</p>
2378
2378
  <p>外置 source authority 不增加 Kit API。调用方先用 Contracts <code>parseSourceAuthorityReceipt(receipt, actualSubjects)</code> 核对收据,再把成功结果中的 <code>sourceRepository</code> 与 <code>sourceBaseCommit</code> 传给既有 Quickstart builder。Kit 不读取私有发布 plan,不发现实际包,也不签发 receipt。</p>
2379
- <p>provider Profile descriptor 从 Foundation 0.8.3 与 Contracts 1.7.0 升级到 Foundation 0.8.4 时,须把自身的 <code>base.contractsVersion</code> 字段机械更新为 <code>1.8.0</code>。既有函数与 Schema 形状、Profile SPI v3、Kit 四命令的形状均不变。</p>
2379
+ <p>provider Profile descriptor 从 Foundation 0.8.4 与 Contracts 1.8.0 升级到 Foundation 0.9.0 时,须把自身的 <code>base.contractsVersion</code> 字段机械更新为 <code>1.9.0</code>。Kit 仍只有四个顶层命令;Quickstart Bundle 继续是 candidate 精确版本,并在同一 mechanisms CLI 中提供有序 <code>validate-many-by-schema-id</code>。</p>
2380
2380
  <p>能力分组(与 <code>docs/agents/capability-catalog.json</code> 对应):</p>
2381
2381
  <ul>
2382
2382
  <li><a href="#scaffold-foundationkitscaffold">scaffold</a> → <code>scaffoldTarget</code></li>