skill-family-engineering-kit 0.5.0 → 0.7.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 +43 -0
- package/CHANGELOG.zh-CN.md +43 -0
- package/README.md +19 -10
- package/README.zh-CN.md +19 -10
- package/docs/agents/capability-catalog.en.json +243 -17
- package/docs/agents/capability-catalog.json +179 -13
- package/docs/agents/capability-catalog.zh-CN.json +243 -17
- package/docs/architecture/index.html +3 -3
- package/docs/en/migration/index.html +32 -87
- package/docs/en/reference/failure-and-side-effect-matrix/index.html +1 -1
- package/docs/integration/audit/index.html +2 -1
- package/docs/integration/audit/version-compatibility/index.html +66 -3
- package/docs/migration/index.html +32 -87
- package/docs/public/status/index.html +3 -3
- package/docs/reference/api/engineering-kit/index.html +117 -12
- package/docs/reference/api/harness/index.html +83 -3
- package/docs/reference/failure-and-side-effect-matrix/index.html +1 -1
- package/docs/search/search_index.json +1 -1
- package/package.json +6 -4
- package/profile-spi/extension-spi.json +162 -0
- package/profile-spi/index.mjs +574 -0
- package/profile-spi/profile-adoption.schema.json +120 -0
- package/profile-spi/profile-descriptor.schema.json +99 -0
- package/profile-spi/rule-baseline-catalog.json +50 -0
- package/release-notes/0.6.0.yaml +25 -0
- package/release-notes/0.7.0.yaml +23 -0
- package/src/adopt-plan.mjs +81 -159
- package/src/check.mjs +443 -19
- package/src/cli.mjs +80 -1
- package/src/core-check.mjs +8 -4
- package/src/entry-check.mjs +384 -0
- package/src/errors.mjs +21 -0
- package/src/index.mjs +36 -6
- package/src/projection.mjs +298 -45
- package/src/relock.mjs +397 -0
- package/src/skeleton.mjs +162 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,48 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
<!-- release-skill:changelog:start version=0.7.0 locale=en baseline=sha256:ed1c59e7cee6e7280d2569e554b07d3b3513f4f3318bf30e374e2d480320f2b7 -->
|
|
4
|
+
## [0.7.0] - 2026-08-21
|
|
5
|
+
|
|
6
|
+
This release exports the public canonical projection closure builder buildProjectionClosure (FG-4), so callers construct compileProjectionPlan-ready plan closures through one public entry instead of re-implementing the Kit-private ordering, serialization, and digest algorithms.
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
|
|
10
|
+
- Adds the public skill-family-engineering-kit/profile-spi subpath. It projects the three Profile SPI JSON resources together with the Contracts canonical profile-descriptor.schema.json, and exports schema loaders, verifyProfile, adoption-pin verification, and tightening-only override checks. The data-only verifier fails closed on missing pins and symlink/path escapes and never executes Profile entrypoints.
|
|
11
|
+
- Adds buildProjectionClosure - a pure public builder accepting an array of {path, sha256, mode} members (an explicit type file is also accepted) and returning the canonical plan closure {digestAlgorithm sha256, digest, resourceCount, resources} that compileProjectionPlan accepts verbatim as previousOwnedClosure or externalCandidateClosure; an empty array yields the legal empty closure.
|
|
12
|
+
- The builder shares one normalization and digest source of truth with the compiler closure re-verification - deterministic path.localeCompare ordering, duplicate-path and portable-collision refusal, and the sha256(JSON.stringify(normalizedResources)) byte contract; every refusal fails closed in the existing projection plan input invalid domain (SFC2004 invalid-manifest).
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
|
|
16
|
+
- Keeps the compileProjectionPlan input contract unchanged and the four top-level commands (scaffold, adopt-plan, projection, check) unchanged; every 0.6.0 input still compiles to byte-identical plans. The package version moves in lockstep with the Foundation line while the contracts machine contract stays at 1.6.0.
|
|
17
|
+
|
|
18
|
+
### Upgrade Notes
|
|
19
|
+
|
|
20
|
+
Version 0.7.0 is the projection closure builder line. Callers that previously assembled plan closures locally must import buildProjectionClosure and pin exactly 0.7.0. A plan closure ({path, type, sha256, mode} members) is not the harness computeResourceClosure resource closure ({path, role, exists, sha256} members) - the two shapes and purposes differ and are not interchangeable.
|
|
21
|
+
<!-- release-skill:changelog:end version=0.7.0 locale=en -->
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
<!-- release-skill:changelog:start version=0.6.0 locale=en baseline=sha256:e84a44b51d513c123ce3c5e91c9e50374c6e899aa021adabe8e44c3ad86eb2b2 -->
|
|
25
|
+
## [0.6.0] - 2026-08-21
|
|
26
|
+
|
|
27
|
+
This release extends the check command with the entry contract gate and the controlled relock transaction sub-actions, adds external frozen authority projection bindings (FG-3), and carries the nine-class check diagnostics (audit remediation C2).
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
|
|
31
|
+
- Adds the check entries sub-action - runEntryContractCheck and checkEntriesAction run the shared entry contract gate (SFA-ENTRY-003/004/005/007 and SFA-CONTEXT-001/002) over skill-family.entry-contract.json and SKILL.md bytes; diagnosis only, zero writes.
|
|
32
|
+
- Adds the check relock sub-action - runRelock and relockAction are the one controlled exception to the no-write rule - a fail-closed transaction writing exactly the two contained state documents (.foundation/file-registry.json and skill-family.managed-file-lock.json), with drift validation before the first write and zero writes on any refusal.
|
|
33
|
+
- Adds external frozen authority projection bindings (FG-3) - PROJECTION_AUTHORITY_BINDING_KINDS freezes external-root and caller-bytes; external-root re-reads each authority source from a separate frozen directory through the strict no-follow reader, and caller-bytes binds caller-provided base64 authority bytes to declared sha256 digests with no authority filesystem access at all, keeping the target root free of forged local authority facts.
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
|
|
37
|
+
- Extends check diagnostics to nine classes (adds version single-source consistency, public boundary validation, and platform subset declaration validation); COMMAND_SIDE_EFFECTS now documents the entries and relock sub-action semantics.
|
|
38
|
+
- Keeps the four top-level commands (scaffold, adopt-plan, projection, check) unchanged; entries and relock are check sub-actions, not new commands.
|
|
39
|
+
|
|
40
|
+
### Upgrade Notes
|
|
41
|
+
|
|
42
|
+
Version 0.6.0 is the Kit gate completion line. Projections whose authority does not live in the target root must declare an authorityBinding of kind external-root or caller-bytes and pin exactly 0.6.0.
|
|
43
|
+
<!-- release-skill:changelog:end version=0.6.0 locale=en -->
|
|
44
|
+
|
|
45
|
+
|
|
3
46
|
<!-- release-skill:changelog:start version=0.5.0 locale=en baseline=sha256:f83b9c3442e5391149531b198be25131cf45728ff945d4ffc531342996e4e6f3 -->
|
|
4
47
|
## [0.5.0] - 2026-08-16
|
|
5
48
|
|
package/CHANGELOG.zh-CN.md
CHANGED
|
@@ -1,5 +1,48 @@
|
|
|
1
1
|
# 变更日志
|
|
2
2
|
|
|
3
|
+
<!-- release-skill:changelog:start version=0.7.0 locale=zh-CN baseline=sha256:e6070267ab3db289caf998c4539055c3d39dfa16fb5bc7db44689b305fde2e81 -->
|
|
4
|
+
## [0.7.0] - 2026-08-21
|
|
5
|
+
|
|
6
|
+
本版导出公共规范投影闭包 builder buildProjectionClosure(FG-4),调用方经一个公共入口即可构造 compileProjectionPlan 可直接接受的计划闭包,不再复刻 Kit 私有的排序、序列化与摘要算法。
|
|
7
|
+
|
|
8
|
+
### 新增
|
|
9
|
+
|
|
10
|
+
- 新增公共 skill-family-engineering-kit/profile-spi 子路径。它投影三个 Profile SPI JSON 资源与 Contracts canonical profile-descriptor.schema.json,导出 Schema 加载器、verifyProfile、采用 pin 校验和只收紧 overrides 检查。纯数据校验器遇到 pin 缺失、符号链接或路径越界时失败关闭,绝不执行 Profile entrypoint。
|
|
11
|
+
- 新增 buildProjectionClosure:纯函数公共 builder,接受 {path, sha256, mode} 成员数组(可接受显式 type file),返回规范计划闭包 {digestAlgorithm sha256, digest, resourceCount, resources},可原样作为 compileProjectionPlan 的 previousOwnedClosure 或 externalCandidateClosure;空数组返回合法的空闭包。
|
|
12
|
+
- builder 与编译器闭包复验共享同一规范化与摘要事实源:确定性 path.localeCompare 排序、重复路径与便携路径冲突拒绝、sha256(JSON.stringify(normalizedResources)) 字节合同;全部拒绝在既有 projection plan input invalid 领域内失败关闭(SFC2004 invalid-manifest)。
|
|
13
|
+
|
|
14
|
+
### 变更
|
|
15
|
+
|
|
16
|
+
- compileProjectionPlan 入参合同不变,四个顶层命令(scaffold、adopt-plan、projection、check)不变;全部 0.6.0 既有输入仍编译为字节不变的计划。包版本随 Foundation 线锁步,Contracts 机器合同保持 1.6.0。
|
|
17
|
+
|
|
18
|
+
### 升级说明
|
|
19
|
+
|
|
20
|
+
0.7.0 是投影闭包 builder 线。此前在本地组装计划闭包的调用方必须导入 buildProjectionClosure 并精确锁定 0.7.0。计划闭包(成员 {path, type, sha256, mode})不是 harness computeResourceClosure 的资源闭包(成员 {path, role, exists, sha256})——两者形状与用途不同,不能互换。
|
|
21
|
+
<!-- release-skill:changelog:end version=0.7.0 locale=zh-CN -->
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
<!-- release-skill:changelog:start version=0.6.0 locale=zh-CN baseline=sha256:e48a11bcbdffb317068cb751f914809360aa8f2e2b852b1e436696601f6a2a47 -->
|
|
25
|
+
## [0.6.0] - 2026-08-21
|
|
26
|
+
|
|
27
|
+
本版为 check 命令新增入口契约门禁与受控 relock 事务子动作,新增外部冻结权威投影绑定(FG-3),并承载九类 check 诊断(审计整改 C2)。
|
|
28
|
+
|
|
29
|
+
### 新增
|
|
30
|
+
|
|
31
|
+
- 新增 check entries 子动作:runEntryContractCheck 与 checkEntriesAction 运行共享入口契约门禁(SFA-ENTRY-003/004/005/007 与 SFA-CONTEXT-001/002),作用于 skill-family.entry-contract.json 与 SKILL.md 字节;只诊断、零写入。
|
|
32
|
+
- 新增 check relock 子动作:runRelock 与 relockAction 是零写入规则的唯一受控例外——一次失败关闭事务,精确写入两个受收容状态文档(.foundation/file-registry.json 与 skill-family.managed-file-lock.json),首次写入前做漂移校验,任何拒绝下零写入。
|
|
33
|
+
- 新增外部冻结权威投影绑定(FG-3):PROJECTION_AUTHORITY_BINDING_KINDS 冻结 external-root 与 caller-bytes;external-root 经严格不跟随读取器从独立的冻结目录重读每个权威源,caller-bytes 将调用方提供的 base64 权威字节绑定到声明的 sha256 摘要、完全不访问权威文件系统,使目标根内不存在伪造的本地权威事实。
|
|
34
|
+
|
|
35
|
+
### 变更
|
|
36
|
+
|
|
37
|
+
- check 诊断扩展为九类(新增版本单源一致性、公开边界校验、平台子集限制声明校验);COMMAND_SIDE_EFFECTS 现记录 entries 与 relock 子动作语义。
|
|
38
|
+
- 四个顶层命令(scaffold、adopt-plan、projection、check)保持不变;entries 与 relock 是 check 子动作,不是新命令。
|
|
39
|
+
|
|
40
|
+
### 升级说明
|
|
41
|
+
|
|
42
|
+
0.6.0 是 Kit 门禁补齐线。权威不在目标根内的投影必须声明 kind 为 external-root 或 caller-bytes 的 authorityBinding,并精确锁定 0.6.0。
|
|
43
|
+
<!-- release-skill:changelog:end version=0.6.0 locale=zh-CN -->
|
|
44
|
+
|
|
45
|
+
|
|
3
46
|
<!-- release-skill:changelog:start version=0.5.0 locale=zh-CN baseline=sha256:bdeefb2e456f6e9d1348152b464c701e96a739e514c5a08ca3576e9982e9b7e0 -->
|
|
4
47
|
## [0.5.0] - 2026-08-16
|
|
5
48
|
|
package/README.md
CHANGED
|
@@ -4,27 +4,28 @@
|
|
|
4
4
|
|
|
5
5
|
# skill-family-engineering-kit
|
|
6
6
|
|
|
7
|
-
<!-- release-skill:release-version: 0.
|
|
7
|
+
<!-- release-skill:release-version: 0.7.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.
|
|
12
|
+
**0.7.0** (2026-08-21)
|
|
13
13
|
|
|
14
|
-
This release
|
|
14
|
+
This release exports the public canonical projection closure builder buildProjectionClosure (FG-4), so callers construct compileProjectionPlan-ready plan closures through one public entry instead of re-implementing the Kit-private ordering, serialization, and digest algorithms.
|
|
15
15
|
|
|
16
16
|
**Added**
|
|
17
17
|
|
|
18
|
-
-
|
|
18
|
+
- Adds the public skill-family-engineering-kit/profile-spi subpath. It projects the three Profile SPI JSON resources together with the Contracts canonical profile-descriptor.schema.json, and exports schema loaders, verifyProfile, adoption-pin verification, and tightening-only override checks. The data-only verifier fails closed on missing pins and symlink/path escapes and never executes Profile entrypoints.
|
|
19
|
+
- Adds buildProjectionClosure - a pure public builder accepting an array of {path, sha256, mode} members (an explicit type file is also accepted) and returning the canonical plan closure {digestAlgorithm sha256, digest, resourceCount, resources} that compileProjectionPlan accepts verbatim as previousOwnedClosure or externalCandidateClosure; an empty array yields the legal empty closure.
|
|
20
|
+
- The builder shares one normalization and digest source of truth with the compiler closure re-verification - deterministic path.localeCompare ordering, duplicate-path and portable-collision refusal, and the sha256(JSON.stringify(normalizedResources)) byte contract; every refusal fails closed in the existing projection plan input invalid domain (SFC2004 invalid-manifest).
|
|
19
21
|
|
|
20
22
|
**Changed**
|
|
21
23
|
|
|
22
|
-
- Keeps the
|
|
23
|
-
- Carries forward the 0.4.0 adoption CLI candidate and the Quickstart Profile v2 offline bundle; no Kit surface or candidate entry point is added or removed in 0.5.0.
|
|
24
|
+
- Keeps the compileProjectionPlan input contract unchanged and the four top-level commands (scaffold, adopt-plan, projection, check) unchanged; every 0.6.0 input still compiles to byte-identical plans. The package version moves in lockstep with the Foundation line while the contracts machine contract stays at 1.6.0.
|
|
24
25
|
|
|
25
26
|
**Upgrade Notes**
|
|
26
27
|
|
|
27
|
-
Version 0.
|
|
28
|
+
Version 0.7.0 is the projection closure builder line. Callers that previously assembled plan closures locally must import buildProjectionClosure and pin exactly 0.7.0. A plan closure ({path, type, sha256, mode} members) is not the harness computeResourceClosure resource closure ({path, role, exists, sha256} members) - the two shapes and purposes differ and are not interchangeable.
|
|
28
29
|
<!-- release-skill:managed:end id=latest-release -->
|
|
29
30
|
|
|
30
31
|
| Command | Purpose | Side effects |
|
|
@@ -45,7 +46,7 @@ Kit is the "engineering stage" layer, depending on the Harness and Contracts. It
|
|
|
45
46
|
## Installation and Minimal Example
|
|
46
47
|
|
|
47
48
|
```sh
|
|
48
|
-
npm install --save-dev skill-family-engineering-kit@0.
|
|
49
|
+
npm install --save-dev skill-family-engineering-kit@0.7.0
|
|
49
50
|
npm exec -- skill-family-kit --help
|
|
50
51
|
npm exec -- skill-family-kit scaffold --root <empty-dir> --project-id my-project
|
|
51
52
|
npm exec -- skill-family-kit adopt-plan --root <repo>
|
|
@@ -53,7 +54,15 @@ npm exec -- skill-family-kit projection --root <repo>
|
|
|
53
54
|
npm exec -- skill-family-kit check --root <repo>
|
|
54
55
|
```
|
|
55
56
|
|
|
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.
|
|
57
|
+
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.7.0 -- skill-family-kit --help`.
|
|
58
|
+
|
|
59
|
+
### Public Profile SPI
|
|
60
|
+
|
|
61
|
+
The `skill-family-engineering-kit/profile-spi` subpath exposes the stable Profile SPI v2 data surface. It exports `verifyProfile`, `verifyAdoptionDigests`, `assessOverridesPolicy`, `loadSpiDefinition`, `loadExtendedDescriptorSchema`, and `loadRuleBaselineCatalog`.
|
|
62
|
+
|
|
63
|
+
The package carries three SPI JSON resources and the Contracts canonical `profile-descriptor.schema.json`. `profiles/spi` is the only handwritten source; projen mechanically projects those resources and the module into this subpath. The projection changes only the two public package imports and the local schema URL.
|
|
64
|
+
|
|
65
|
+
`verifyProfile({ profileRoot })` is read-only and data-only. It refuses descriptor errors, missing resources, executable entrypoints, symlink/path escapes, core reverse dependencies, unverified adoption pins, and non-tightening overrides with stable `SPE0000` / `SPE1001`–`SPE1007` result codes. It never executes Profile-provided files. The Profile's domain meaning remains owned by the caller.
|
|
57
66
|
|
|
58
67
|
### Report sub-action
|
|
59
68
|
|
|
@@ -158,7 +167,7 @@ This package must not perform git init, commit, push, tag, stash, branch switch,
|
|
|
158
167
|
- `foundation.kit.scaffold`: generate a precise skeleton in an empty directory, atomic + contained.
|
|
159
168
|
- `foundation.kit.adopt-plan`: strictly read-only inventory and completion determination of an existing repo.
|
|
160
169
|
- `foundation.kit.projection`: managed projection, write only after full validation, zero writes on failure.
|
|
161
|
-
- `foundation.kit.check`:
|
|
170
|
+
- `foundation.kit.check`: nine check classes, diagnosis only, no fix.
|
|
162
171
|
- `foundation.kit.report`: projection/check report sub-action orchestration.
|
|
163
172
|
- `foundation.kit.git-probe`: read-only whitelisted Git status probe.
|
|
164
173
|
- `foundation.kit.host`: describe/build/probe/plan, apply stably rejected.
|
package/README.zh-CN.md
CHANGED
|
@@ -5,27 +5,28 @@
|
|
|
5
5
|
|
|
6
6
|
# skill-family-engineering-kit
|
|
7
7
|
|
|
8
|
-
<!-- release-skill:release-version: 0.
|
|
8
|
+
<!-- release-skill:release-version: 0.7.0 -->
|
|
9
9
|
|
|
10
10
|
开发与 CI 阶段使用的工程工具包。**恰好四个**顶层命令,没有第五个:
|
|
11
11
|
|
|
12
12
|
<!-- release-skill:managed:start id=latest-release -->
|
|
13
|
-
**0.
|
|
13
|
+
**0.7.0** (2026-08-21)
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
本版导出公共规范投影闭包 builder buildProjectionClosure(FG-4),调用方经一个公共入口即可构造 compileProjectionPlan 可直接接受的计划闭包,不再复刻 Kit 私有的排序、序列化与摘要算法。
|
|
16
16
|
|
|
17
17
|
**新增**
|
|
18
18
|
|
|
19
|
-
-
|
|
19
|
+
- 新增公共 skill-family-engineering-kit/profile-spi 子路径。它投影三个 Profile SPI JSON 资源与 Contracts canonical profile-descriptor.schema.json,导出 Schema 加载器、verifyProfile、采用 pin 校验和只收紧 overrides 检查。纯数据校验器遇到 pin 缺失、符号链接或路径越界时失败关闭,绝不执行 Profile entrypoint。
|
|
20
|
+
- 新增 buildProjectionClosure:纯函数公共 builder,接受 {path, sha256, mode} 成员数组(可接受显式 type file),返回规范计划闭包 {digestAlgorithm sha256, digest, resourceCount, resources},可原样作为 compileProjectionPlan 的 previousOwnedClosure 或 externalCandidateClosure;空数组返回合法的空闭包。
|
|
21
|
+
- builder 与编译器闭包复验共享同一规范化与摘要事实源:确定性 path.localeCompare 排序、重复路径与便携路径冲突拒绝、sha256(JSON.stringify(normalizedResources)) 字节合同;全部拒绝在既有 projection plan input invalid 领域内失败关闭(SFC2004 invalid-manifest)。
|
|
20
22
|
|
|
21
23
|
**变更**
|
|
22
24
|
|
|
23
|
-
-
|
|
24
|
-
- 延续 0.4.0 的 adoption CLI 候选与 Quickstart Profile v2 离线 Bundle;0.5.0 未新增或移除任何 Kit 边界或候选入口。
|
|
25
|
+
- compileProjectionPlan 入参合同不变,四个顶层命令(scaffold、adopt-plan、projection、check)不变;全部 0.6.0 既有输入仍编译为字节不变的计划。包版本随 Foundation 线锁步,Contracts 机器合同保持 1.6.0。
|
|
25
26
|
|
|
26
27
|
**升级说明**
|
|
27
28
|
|
|
28
|
-
0.
|
|
29
|
+
0.7.0 是投影闭包 builder 线。此前在本地组装计划闭包的调用方必须导入 buildProjectionClosure 并精确锁定 0.7.0。计划闭包(成员 {path, type, sha256, mode})不是 harness computeResourceClosure 的资源闭包(成员 {path, role, exists, sha256})——两者形状与用途不同,不能互换。
|
|
29
30
|
<!-- release-skill:managed:end id=latest-release -->
|
|
30
31
|
|
|
31
32
|
| 命令 | 用途 | 副作用 |
|
|
@@ -46,7 +47,7 @@ Kit 是「工程阶段」层,依赖 Harness 与 Contracts。它只做四件事
|
|
|
46
47
|
## 安装和最小示例
|
|
47
48
|
|
|
48
49
|
```sh
|
|
49
|
-
npm install --save-dev skill-family-engineering-kit@0.
|
|
50
|
+
npm install --save-dev skill-family-engineering-kit@0.7.0
|
|
50
51
|
npm exec -- skill-family-kit --help
|
|
51
52
|
npm exec -- skill-family-kit scaffold --root <empty-dir> --project-id my-project
|
|
52
53
|
npm exec -- skill-family-kit adopt-plan --root <repo>
|
|
@@ -54,7 +55,15 @@ npm exec -- skill-family-kit projection --root <repo>
|
|
|
54
55
|
npm exec -- skill-family-kit check --root <repo>
|
|
55
56
|
```
|
|
56
57
|
|
|
57
|
-
以上四条命令分别覆盖生成骨架、只读盘点、受管投影与诊断;零安装形式可用 `npm exec --package=skill-family-engineering-kit@0.
|
|
58
|
+
以上四条命令分别覆盖生成骨架、只读盘点、受管投影与诊断;零安装形式可用 `npm exec --package=skill-family-engineering-kit@0.7.0 -- skill-family-kit --help`。
|
|
59
|
+
|
|
60
|
+
### 公共 Profile SPI
|
|
61
|
+
|
|
62
|
+
`skill-family-engineering-kit/profile-spi` 子路径提供稳定的 Profile SPI v2 数据表面,导出 `verifyProfile`、`verifyAdoptionDigests`、`assessOverridesPolicy`、`loadSpiDefinition`、`loadExtendedDescriptorSchema` 与 `loadRuleBaselineCatalog`。
|
|
63
|
+
|
|
64
|
+
包内携带三个 SPI JSON 资源与 Contracts canonical `profile-descriptor.schema.json`。`profiles/spi` 是唯一手写真源;projen 将这些资源和模块机械投影到该子路径。投影只修改两个公共包导入和一个本地 Schema URL。
|
|
65
|
+
|
|
66
|
+
`verifyProfile({ profileRoot })` 只读处理纯数据。遇到 descriptor 错误、资源缺失、可执行 entrypoint、符号链接或路径越界、反向依赖公共核心、未验证的采用 pin、未收紧的 overrides 时,以稳定 `SPE0000` / `SPE1001`–`SPE1007` 结果码失败关闭;它不会执行 Profile 提供的文件。Profile 的领域含义仍由调用方负责。
|
|
58
67
|
|
|
59
68
|
### 报告子动作
|
|
60
69
|
|
|
@@ -159,7 +168,7 @@ projection 只写同时满足两个条件的路径:manifest 列出,且目标
|
|
|
159
168
|
- `foundation.kit.scaffold`:空目录生成精确骨架,原子 + 收容。
|
|
160
169
|
- `foundation.kit.adopt-plan`:存量仓严格只读盘点与完成判定。
|
|
161
170
|
- `foundation.kit.projection`:受管投影,全校验后才写,失败零写。
|
|
162
|
-
- `foundation.kit.check
|
|
171
|
+
- `foundation.kit.check`:九类检查只诊断不修复。
|
|
163
172
|
- `foundation.kit.report`:projection/check report 子动作编排。
|
|
164
173
|
- `foundation.kit.git-probe`:只读白名单 Git 状态探测。
|
|
165
174
|
- `foundation.kit.host`:describe/build/probe/plan,apply 稳定拒绝。
|
|
@@ -282,6 +282,42 @@
|
|
|
282
282
|
"Domain audit semantics: route to an independent audit consumer"
|
|
283
283
|
]
|
|
284
284
|
},
|
|
285
|
+
{
|
|
286
|
+
"id": "foundation.contracts.token-estimate-consumption",
|
|
287
|
+
"intent": "Defines the minimal consumption contract of the token estimate record - which field carries the numeric estimate, the degraded bare-integer shape, and the fail-closed refusal semantics",
|
|
288
|
+
"useWhen": [
|
|
289
|
+
"You need to extract the numeric estimate from a token-estimate-record and validate the degraded shape",
|
|
290
|
+
"You need to refuse records whose estimator or target field does not match"
|
|
291
|
+
],
|
|
292
|
+
"doNotUseWhen": [
|
|
293
|
+
"You need to produce an estimate record (owned by the harness estimator)",
|
|
294
|
+
"You need to interpret the business meaning of an estimate"
|
|
295
|
+
],
|
|
296
|
+
"prerequisites": [],
|
|
297
|
+
"inputs": [
|
|
298
|
+
"A token-estimate-record document or its degraded bare-integer shape"
|
|
299
|
+
],
|
|
300
|
+
"outputs": [
|
|
301
|
+
"A consumption result carrying the numeric estimate and source identity, or a fail-closed refusal"
|
|
302
|
+
],
|
|
303
|
+
"sideEffects": [
|
|
304
|
+
"Pure functions; no filesystem, Git, network, or process side effects"
|
|
305
|
+
],
|
|
306
|
+
"failureSemantics": [
|
|
307
|
+
"Estimator mismatch or missing target field fails closed with a stable error kind",
|
|
308
|
+
"Refusals carry a closed-enum reason and never degrade silently"
|
|
309
|
+
],
|
|
310
|
+
"invariants": [
|
|
311
|
+
"Results of different estimators are never mixed silently",
|
|
312
|
+
"The consumption contract adds no top-level object class"
|
|
313
|
+
],
|
|
314
|
+
"ownedByCaller": [
|
|
315
|
+
"When to estimate and the business interpretation of results"
|
|
316
|
+
],
|
|
317
|
+
"routeElsewhere": [
|
|
318
|
+
"Estimate record generation: foundation.harness.token-estimation"
|
|
319
|
+
]
|
|
320
|
+
},
|
|
285
321
|
{
|
|
286
322
|
"id": "foundation.harness.contract-validation",
|
|
287
323
|
"intent": "Resolve the contract context in the Node runtime and reuse the Contracts validator to validate contract documents and cache validator instances.",
|
|
@@ -794,13 +830,14 @@
|
|
|
794
830
|
},
|
|
795
831
|
{
|
|
796
832
|
"id": "foundation.harness.token-estimation",
|
|
797
|
-
"intent": "Provide
|
|
833
|
+
"intent": "Provide deterministic estimates for text: a UTF-8 byte-count upper bound and a token count based on CJK code point / whitespace segmentation; both are pure functions with no model, network, or tokenizer dependency, and results carry estimator identity and version",
|
|
798
834
|
"useWhen": [
|
|
799
835
|
"Need an upper bound on text consumption without calling a model",
|
|
800
|
-
"Need a
|
|
836
|
+
"Need a deterministic, replayable token count for mixed CJK/ASCII, pure CJK, or pure ASCII input",
|
|
837
|
+
"Need a contractual, verifiable, timestamp-free estimation result object that records which estimator produced it"
|
|
801
838
|
],
|
|
802
839
|
"doNotUseWhen": [
|
|
803
|
-
"Need real token counts or semantic estimates (the primitive does not promise precision)"
|
|
840
|
+
"Need real token counts from a target model tokenizer or semantic estimates (the primitive does not promise precision)"
|
|
804
841
|
],
|
|
805
842
|
"prerequisites": [
|
|
806
843
|
"Input is a JavaScript string"
|
|
@@ -809,16 +846,20 @@
|
|
|
809
846
|
"A text string"
|
|
810
847
|
],
|
|
811
848
|
"outputs": [
|
|
812
|
-
"A token-estimate-result contract object (inputBytes equals upperBound)"
|
|
849
|
+
"A token-estimate-result contract object (inputBytes equals upperBound)",
|
|
850
|
+
"A token estimation record (estimator id, version, algorithm identifier, and segmentation statistics; tokens equals CJK characters plus OTHER runs)"
|
|
813
851
|
],
|
|
814
852
|
"sideEffects": [
|
|
815
|
-
"None: pure
|
|
853
|
+
"None: pure functions with zero dependencies; the CLI only reads command-line arguments, files, or stdin and only writes stdout"
|
|
816
854
|
],
|
|
817
855
|
"failureSemantics": [
|
|
818
|
-
"Non-string input throws TypeError"
|
|
856
|
+
"Non-string input throws TypeError",
|
|
857
|
+
"The CLI exits 2 on argument errors and 0 on success"
|
|
819
858
|
],
|
|
820
859
|
"invariants": [
|
|
821
|
-
"Identical input produces identical output; deterministic byte counting",
|
|
860
|
+
"Identical input produces identical output; deterministic byte counting and deterministic segmentation",
|
|
861
|
+
"Each CJK code point counts 1 token and terminates any open OTHER run before it; whitespace contributes no tokens",
|
|
862
|
+
"Every estimation record carries the estimator id and version (SFA-CONTEXT-028); results from different estimators are never mixed silently",
|
|
822
863
|
"guarantees is a closed enumeration and the result carries no timestamp"
|
|
823
864
|
],
|
|
824
865
|
"ownedByCaller": [
|
|
@@ -865,6 +906,117 @@
|
|
|
865
906
|
"Pricing and billing semantics: keep with the consumer"
|
|
866
907
|
]
|
|
867
908
|
},
|
|
909
|
+
{
|
|
910
|
+
"id": "foundation.harness.supervise-process",
|
|
911
|
+
"intent": "Supervise one bounded subprocess through a full lifecycle with consumer-supplied timeouts, SIGTERM-to-SIGKILL escalation, terminal-progress observation and closed-enum termination evidence.",
|
|
912
|
+
"useWhen": [
|
|
913
|
+
"Need to run a subprocess under a bounded lifecycle with a hard ceiling and deterministic termination evidence",
|
|
914
|
+
"Need closed-enum watchdog/termination reasons that consumers can map mechanically"
|
|
915
|
+
],
|
|
916
|
+
"doNotUseWhen": [
|
|
917
|
+
"Need the supervisor to retry or restart the process (workflow-orchestration exclusion)"
|
|
918
|
+
],
|
|
919
|
+
"prerequisites": [
|
|
920
|
+
"The consumer supplies the command, cwd, and a timeout policy with maxSeconds and killGraceSeconds"
|
|
921
|
+
],
|
|
922
|
+
"inputs": [
|
|
923
|
+
"Command/args/cwd, timeout policy, optional progress and terminal progress paths, optional budget and long-tool hooks, optional evidence path"
|
|
924
|
+
],
|
|
925
|
+
"outputs": [
|
|
926
|
+
"One frozen watchdog-termination-envelope per call (single writer)"
|
|
927
|
+
],
|
|
928
|
+
"sideEffects": [
|
|
929
|
+
"Spawns and terminates the supervised process and its process group",
|
|
930
|
+
"Optionally persists a supervision trace and the final envelope at evidencePath"
|
|
931
|
+
],
|
|
932
|
+
"failureSemantics": [
|
|
933
|
+
"Policy shape errors throw SFC2004 + timeout-policy-invalid; mechanism failures reject SFC2004 + supervise-process-failed with the termination evidence in details; external process disappearance fails closed as no_terminal_result"
|
|
934
|
+
],
|
|
935
|
+
"invariants": [
|
|
936
|
+
"The mechanism holds no timeout values, budget thresholds or restart policy",
|
|
937
|
+
"Liveness is confirmed only by explicit events and process-group probes; ps is never used for liveness guessing"
|
|
938
|
+
],
|
|
939
|
+
"ownedByCaller": [
|
|
940
|
+
"The command, the timeout numbers, budget thresholds, terminal-record semantics and any restart strategy"
|
|
941
|
+
],
|
|
942
|
+
"routeElsewhere": [
|
|
943
|
+
"Restart/retry orchestration: workflow-orchestration exclusion, stays with the upper orchestration layer"
|
|
944
|
+
]
|
|
945
|
+
},
|
|
946
|
+
{
|
|
947
|
+
"id": "foundation.harness.strict-read",
|
|
948
|
+
"intent": "Reads one existing authority file with containment, no-follow symlink refusal, regular-file identity re-assertion, and a sha256 digest receipt",
|
|
949
|
+
"useWhen": [
|
|
950
|
+
"You need to read a frozen authority file and bind its byte digest",
|
|
951
|
+
"You need to verify an authority file against a frozen digest before delivery"
|
|
952
|
+
],
|
|
953
|
+
"doNotUseWhen": [
|
|
954
|
+
"You need to read directories or symlink targets",
|
|
955
|
+
"You need to write or replace files (owned by the strict write path)"
|
|
956
|
+
],
|
|
957
|
+
"prerequisites": [],
|
|
958
|
+
"inputs": [
|
|
959
|
+
"A contained root and a relative path; optionally an expectedSha256 frozen digest"
|
|
960
|
+
],
|
|
961
|
+
"outputs": [
|
|
962
|
+
"The file content plus a sha256 digest receipt of the exact bytes read"
|
|
963
|
+
],
|
|
964
|
+
"sideEffects": [
|
|
965
|
+
"Read-only filesystem access (lstat/open/read)"
|
|
966
|
+
],
|
|
967
|
+
"failureSemantics": [
|
|
968
|
+
"Symlinks, non-regular files, or digest mismatches fail closed without delivering content",
|
|
969
|
+
"Path escape is refused by the containment layer before any read"
|
|
970
|
+
],
|
|
971
|
+
"invariants": [
|
|
972
|
+
"Opens with O_NOFOLLOW so a link swapped in after the identity check is never followed",
|
|
973
|
+
"The receipt digest covers exactly the bytes that were read"
|
|
974
|
+
],
|
|
975
|
+
"ownedByCaller": [
|
|
976
|
+
"The provenance and trust anchor of the frozen digest",
|
|
977
|
+
"The remediation policy after a refused read"
|
|
978
|
+
],
|
|
979
|
+
"routeElsewhere": [
|
|
980
|
+
"Writes and publication: foundation.harness.atomic-write"
|
|
981
|
+
]
|
|
982
|
+
},
|
|
983
|
+
{
|
|
984
|
+
"id": "foundation.harness.url-credential-redaction",
|
|
985
|
+
"intent": "Strips the userinfo credential component from any URL value before it reaches disk or logs",
|
|
986
|
+
"useWhen": [
|
|
987
|
+
"You need to persist or log a URL that may carry credentials",
|
|
988
|
+
"You need unparseable input to degrade safely to a placeholder"
|
|
989
|
+
],
|
|
990
|
+
"doNotUseWhen": [
|
|
991
|
+
"You need to keep or parse the credential itself (credentials never enter Foundation)",
|
|
992
|
+
"You need to handle non-URL secret material"
|
|
993
|
+
],
|
|
994
|
+
"prerequisites": [],
|
|
995
|
+
"inputs": [
|
|
996
|
+
"Any string input (URL or non-URL)"
|
|
997
|
+
],
|
|
998
|
+
"outputs": [
|
|
999
|
+
"The redacted URL string or the opaque REDACTED_URL_PLACEHOLDER"
|
|
1000
|
+
],
|
|
1001
|
+
"sideEffects": [
|
|
1002
|
+
"Pure function; no side effects"
|
|
1003
|
+
],
|
|
1004
|
+
"failureSemantics": [
|
|
1005
|
+
"Unparseable input degrades to the opaque placeholder and never leaks the original",
|
|
1006
|
+
"The output never carries userinfo bytes"
|
|
1007
|
+
],
|
|
1008
|
+
"invariants": [
|
|
1009
|
+
"Redaction happens before any persistence or logging",
|
|
1010
|
+
"The placeholder is a frozen constant carrying no input information"
|
|
1011
|
+
],
|
|
1012
|
+
"ownedByCaller": [
|
|
1013
|
+
"Which input values are treated as URLs",
|
|
1014
|
+
"The downstream use of redacted values"
|
|
1015
|
+
],
|
|
1016
|
+
"routeElsewhere": [
|
|
1017
|
+
"Credential management and rotation: caller security boundary"
|
|
1018
|
+
]
|
|
1019
|
+
},
|
|
868
1020
|
{
|
|
869
1021
|
"id": "foundation.harness.errors",
|
|
870
1022
|
"intent": "Define the Harness mechanism error types and stable error classes, unifying error classification.",
|
|
@@ -939,7 +1091,7 @@
|
|
|
939
1091
|
"intent": "Perform a strict read-only inventory of an existing repo (classification, nested-repo discovery, migration list, completion judgment), writing no files and migrating nothing automatically.",
|
|
940
1092
|
"useWhen": [
|
|
941
1093
|
"Need to classify an existing repo as direct-adoption / compatibility-layer / keep-business / foundation-gap",
|
|
942
|
-
"Need to generate a
|
|
1094
|
+
"Need to generate a profile draft (adoption declaration and overrides) or a completion judgment for migration"
|
|
943
1095
|
],
|
|
944
1096
|
"doNotUseWhen": [
|
|
945
1097
|
"Need to auto-rewrite the existing repo (writing files and auto-migration are forbidden)"
|
|
@@ -951,7 +1103,7 @@
|
|
|
951
1103
|
"Target root, migration-list path"
|
|
952
1104
|
],
|
|
953
1105
|
"outputs": [
|
|
954
|
-
"Adoption classification, completion judgment,
|
|
1106
|
+
"Adoption classification, completion judgment, profile draft (output only, not written to disk)"
|
|
955
1107
|
],
|
|
956
1108
|
"sideEffects": [
|
|
957
1109
|
"No file writes (strictly read-only)",
|
|
@@ -984,7 +1136,8 @@
|
|
|
984
1136
|
"The projection manifest is registered"
|
|
985
1137
|
],
|
|
986
1138
|
"inputs": [
|
|
987
|
-
"Projection manifest, target root"
|
|
1139
|
+
"Projection manifest, target root",
|
|
1140
|
+
"Plan closures (previousOwnedClosure / externalCandidateClosure) built through the public buildProjectionClosure entry instead of re-implementing the Kit-private ordering, serialization, and digest algorithms"
|
|
988
1141
|
],
|
|
989
1142
|
"outputs": [
|
|
990
1143
|
"Projected files (only when all checks pass)"
|
|
@@ -1009,7 +1162,7 @@
|
|
|
1009
1162
|
},
|
|
1010
1163
|
{
|
|
1011
1164
|
"id": "foundation.kit.check",
|
|
1012
|
-
"intent": "Diagnose only, do not fix: run the
|
|
1165
|
+
"intent": "Diagnose only, do not fix: run the nine check classes contracts/drift/closure/version/docs/git/identity/boundary/platform and output findings.",
|
|
1013
1166
|
"useWhen": [
|
|
1014
1167
|
"Need to surface engineering inconsistencies without auto-modifying",
|
|
1015
1168
|
"Need to narrow the check scope via --only"
|
|
@@ -1019,7 +1172,7 @@
|
|
|
1019
1172
|
],
|
|
1020
1173
|
"prerequisites": [],
|
|
1021
1174
|
"inputs": [
|
|
1022
|
-
"--only values: contracts|drift|closure|version|docs|git|identity"
|
|
1175
|
+
"--only values: contracts|drift|closure|version|docs|git|identity|boundary|platform"
|
|
1023
1176
|
],
|
|
1024
1177
|
"outputs": [
|
|
1025
1178
|
"Findings list; exit code findings=1, mechanism=2"
|
|
@@ -1031,7 +1184,7 @@
|
|
|
1031
1184
|
"findings exit code 1; mechanism rejection exit code 2"
|
|
1032
1185
|
],
|
|
1033
1186
|
"invariants": [
|
|
1034
|
-
"CHECK_CLASSES is a closed set of
|
|
1187
|
+
"CHECK_CLASSES is a closed set of nine classes, not expanded"
|
|
1035
1188
|
],
|
|
1036
1189
|
"ownedByCaller": [
|
|
1037
1190
|
"Business disposition of each finding"
|
|
@@ -1218,6 +1371,77 @@
|
|
|
1218
1371
|
"Auto-fix: the caller"
|
|
1219
1372
|
]
|
|
1220
1373
|
},
|
|
1374
|
+
{
|
|
1375
|
+
"id": "foundation.kit.entry-check",
|
|
1376
|
+
"intent": "Read the entry-contract declaration and run five checks per entry: physical existence, logical-name consistency, human-entry registration, side-effect class, and token budget.",
|
|
1377
|
+
"useWhen": [
|
|
1378
|
+
"Need to verify the entry-contract declaration against the physical SKILL.md",
|
|
1379
|
+
"Need to check entry logical names, side-effect classes, and token budgets"
|
|
1380
|
+
],
|
|
1381
|
+
"doNotUseWhen": [
|
|
1382
|
+
"Need to fix the declaration or entries (check only diagnoses, it does not fix)"
|
|
1383
|
+
],
|
|
1384
|
+
"prerequisites": [],
|
|
1385
|
+
"inputs": [
|
|
1386
|
+
"Project root (carrying skill-family.entry-contract.json and package.json)"
|
|
1387
|
+
],
|
|
1388
|
+
"outputs": [
|
|
1389
|
+
"Entry-check report (kind skill-family.entry-check-report) and findings"
|
|
1390
|
+
],
|
|
1391
|
+
"sideEffects": [
|
|
1392
|
+
"Read-only read of the declaration, package.json, and entry files"
|
|
1393
|
+
],
|
|
1394
|
+
"failureSemantics": [
|
|
1395
|
+
"A missing declaration is data, never a finding",
|
|
1396
|
+
"Each failed check produces a finding of a distinct kind"
|
|
1397
|
+
],
|
|
1398
|
+
"invariants": [
|
|
1399
|
+
"Does not modify any file",
|
|
1400
|
+
"Adds no fifth top-level command; it runs as the check entries sub-action"
|
|
1401
|
+
],
|
|
1402
|
+
"ownedByCaller": [
|
|
1403
|
+
"Remediation of the declaration and entries"
|
|
1404
|
+
],
|
|
1405
|
+
"routeElsewhere": [
|
|
1406
|
+
"Auto-remediation: the caller"
|
|
1407
|
+
]
|
|
1408
|
+
},
|
|
1409
|
+
{
|
|
1410
|
+
"id": "foundation.kit.relock",
|
|
1411
|
+
"intent": "Run the controlled relock transaction: register newly handwritten files into .foundation/file-registry.json and recompute skill-family.managed-file-lock.json from the current bytes in one fail-closed operation.",
|
|
1412
|
+
"useWhen": [
|
|
1413
|
+
"Need to admit a newly handwritten file into the closed world without hand-editing the registry",
|
|
1414
|
+
"Need to recompute the managed-file lock from current bytes after registration"
|
|
1415
|
+
],
|
|
1416
|
+
"doNotUseWhen": [
|
|
1417
|
+
"Need to legitimize drifted managed bytes (relock refuses drift)",
|
|
1418
|
+
"Need to register symlinks or non-regular files (refused)"
|
|
1419
|
+
],
|
|
1420
|
+
"prerequisites": [],
|
|
1421
|
+
"inputs": [
|
|
1422
|
+
"Project root carrying .foundation/file-registry.json and skill-family.managed-file-lock.json"
|
|
1423
|
+
],
|
|
1424
|
+
"outputs": [
|
|
1425
|
+
"Relock report (kind skill-family.relock-report)"
|
|
1426
|
+
],
|
|
1427
|
+
"sideEffects": [
|
|
1428
|
+
"Writes exactly two contained state documents: the registry and the managed-file lock"
|
|
1429
|
+
],
|
|
1430
|
+
"failureSemantics": [
|
|
1431
|
+
"Every refusal leaves the target untouched (zero writes)",
|
|
1432
|
+
"A half-updated state is never presented as success"
|
|
1433
|
+
],
|
|
1434
|
+
"invariants": [
|
|
1435
|
+
"Adds no fifth top-level command; it runs as the check relock sub-action",
|
|
1436
|
+
"The new lock binds the new registry bytes before either document is committed"
|
|
1437
|
+
],
|
|
1438
|
+
"ownedByCaller": [
|
|
1439
|
+
"Reconciliation of drifted managed bytes before relocking"
|
|
1440
|
+
],
|
|
1441
|
+
"routeElsewhere": [
|
|
1442
|
+
"Auto-remediation: the caller"
|
|
1443
|
+
]
|
|
1444
|
+
},
|
|
1221
1445
|
{
|
|
1222
1446
|
"id": "foundation.kit.cli",
|
|
1223
1447
|
"intent": "Provide the skill-family-kit CLI entry point, dispatching the four top-level commands and sub-actions, and rejecting mutation flags at the entry point.",
|
|
@@ -1256,10 +1480,11 @@
|
|
|
1256
1480
|
},
|
|
1257
1481
|
{
|
|
1258
1482
|
"id": "foundation.profile.extension-spi",
|
|
1259
|
-
"intent": "Declare the extension mechanism for host and project-shape differences: differences (adds/overrides/removes) and open extension points (host-projection/artifact-render/surface-scan)
|
|
1483
|
+
"intent": "Declare the extension mechanism for host and project-shape differences, and consume the public skill-family-engineering-kit/profile-spi projection: differences (adds/overrides/removes) and open extension points (host-projection/artifact-render/surface-scan) are validated as data-only Profile input.",
|
|
1260
1484
|
"useWhen": [
|
|
1261
1485
|
"Need to declare project-shape differences without changing the common core",
|
|
1262
|
-
"Need to inject extension-point data resources into the stable SPI"
|
|
1486
|
+
"Need to inject extension-point data resources into the stable SPI",
|
|
1487
|
+
"Need to load the public SPI schema and verifyProfile entry from skill-family-engineering-kit/profile-spi"
|
|
1263
1488
|
],
|
|
1264
1489
|
"doNotUseWhen": [
|
|
1265
1490
|
"Need to stuff business semantics into the common core (coreOwned targets are off-limits)",
|
|
@@ -1272,7 +1497,7 @@
|
|
|
1272
1497
|
"profileRoot、descriptorRelPath"
|
|
1273
1498
|
],
|
|
1274
1499
|
"outputs": [
|
|
1275
|
-
"SPI result code (SPE0000/1001..
|
|
1500
|
+
"SPI result code (SPE0000/1001..1007), plus the public base and extended schema loaders"
|
|
1276
1501
|
],
|
|
1277
1502
|
"sideEffects": [
|
|
1278
1503
|
"No side effects (read-only Profile validation)"
|
|
@@ -1283,7 +1508,8 @@
|
|
|
1283
1508
|
],
|
|
1284
1509
|
"invariants": [
|
|
1285
1510
|
"coreOwned = packages/commands/namespacePrefixes are off-limits targets",
|
|
1286
|
-
"The entrypoint must be a JSON data resource"
|
|
1511
|
+
"The entrypoint must be a JSON data resource",
|
|
1512
|
+
"The public projection keeps the three SPI JSON resources and Contracts base schema byte-identical"
|
|
1287
1513
|
],
|
|
1288
1514
|
"ownedByCaller": [
|
|
1289
1515
|
"Business semantics of the difference"
|