skill-family-engineering-kit 0.1.0 → 0.1.2
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/CONTRIBUTING.md +12 -2
- package/LICENSE +2 -1
- package/README.md +12 -5
- package/SECURITY.md +9 -5
- package/THIRD_PARTY_NOTICES +129 -0
- package/docs/migration/index.html +3 -1
- package/docs/search/search_index.json +1 -1
- package/docs/setup/index.html +2 -2
- package/package.json +21 -20
- package/src/check.mjs +64 -10
- package/src/cli.mjs +1 -1
- package/src/index.mjs +2 -0
- package/src/skeleton.mjs +85 -61
package/CONTRIBUTING.md
CHANGED
|
@@ -7,8 +7,18 @@ Git 写操作的授权边界见仓库内文档站的生命周期指南(`docs/g
|
|
|
7
7
|
拓扑说明:本工作区仓永久 private,是唯一开发真源;三个 public 仓
|
|
8
8
|
(`skill-family-contracts`、`skill-family-harness-node`、
|
|
9
9
|
`skill-family-engineering-kit`)是版本化发布镜像,不承载完整开发历史与
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
测试。本指南描述的是私有工作区内经授权的开发流程;消费坐标与发布状态
|
|
11
|
+
唯一见 `docs/status/current.md`。
|
|
12
|
+
|
|
13
|
+
## Bug 报告与 Issue
|
|
14
|
+
|
|
15
|
+
普通 bug 报告欢迎通过各 public 发布镜像仓的 GitHub Issues 提交(例如
|
|
16
|
+
`https://github.com/ifoohoo/skill-family-engineering-kit/issues`)。提交
|
|
17
|
+
bug 报告时请尽量提供:受影响包与版本、最小复现步骤、预期与实际行为。
|
|
18
|
+
|
|
19
|
+
**未经事先讨论的 Pull Request 不予接受。** 如果你希望贡献代码,请先
|
|
20
|
+
通过 Issue 讨论变更的动机与范围,获得维护者确认后再提交 PR。这是为了
|
|
21
|
+
避免重复劳动、确保变更与本项目的架构裁决和发布合同一致。
|
|
12
22
|
|
|
13
23
|
## 本地安装
|
|
14
24
|
|
package/LICENSE
CHANGED
|
@@ -186,7 +186,8 @@
|
|
|
186
186
|
same "printed page" as the copyright notice for easier
|
|
187
187
|
identification within third-party archives.
|
|
188
188
|
|
|
189
|
-
Copyright
|
|
189
|
+
Copyright (c) 2026 skill-family-foundation-workspace contributors
|
|
190
|
+
Copyright (c) 2026 广州市风荷科技有限公司
|
|
190
191
|
|
|
191
192
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
193
|
you may not use this file except in compliance with the License.
|
package/README.md
CHANGED
|
@@ -15,11 +15,18 @@
|
|
|
15
15
|
## 使用
|
|
16
16
|
|
|
17
17
|
```sh
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
npm install --save-dev skill-family-engineering-kit
|
|
19
|
+
npm exec -- skill-family-kit --help
|
|
20
|
+
npm exec -- skill-family-kit scaffold --root <empty-dir> --project-id my-project
|
|
21
|
+
npm exec -- skill-family-kit adopt-plan --root <repo>
|
|
22
|
+
npm exec -- skill-family-kit projection --root <repo>
|
|
23
|
+
npm exec -- skill-family-kit check --root <repo>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
零安装形式(不修改 package.json):
|
|
27
|
+
|
|
28
|
+
```sh
|
|
29
|
+
npm exec --package=skill-family-engineering-kit -- skill-family-kit --help
|
|
23
30
|
```
|
|
24
31
|
|
|
25
32
|
## 边界机制
|
package/SECURITY.md
CHANGED
|
@@ -12,11 +12,15 @@
|
|
|
12
12
|
## 报告漏洞
|
|
13
13
|
|
|
14
14
|
请勿通过公开 issue 直接披露未修复的安全漏洞。private workspace 仓永久
|
|
15
|
-
private
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
private,不是公开报告渠道;请通过以下渠道私下报告:
|
|
16
|
+
|
|
17
|
+
1. **首选**:通过任一 public 发布镜像仓(例如
|
|
18
|
+
`https://github.com/ifoohoo/skill-family-engineering-kit`)在 GitHub 上使用
|
|
19
|
+
**Private vulnerability reporting**(仓库 Security 页签的
|
|
20
|
+
"Report a vulnerability");
|
|
21
|
+
2. **备选**:如上述通道不可用,请通过邮件联系仓库维护者
|
|
22
|
+
(`ifoohoo` GitHub 组织的 `security` 团队,或仓库 `README.md` 中列出的
|
|
23
|
+
维护者邮箱)。
|
|
20
24
|
|
|
21
25
|
报告时请尽量提供:
|
|
22
26
|
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
THIRD-PARTY SOFTWARE NOTICES AND ATTRIBUTION
|
|
2
|
+
=============================================
|
|
3
|
+
|
|
4
|
+
The public documentation site for skill-family-engineering-kit bundles the
|
|
5
|
+
following third-party assets in docs/assets/ (delivered as docs/ in the
|
|
6
|
+
published Pages site). This file provides the required attribution for
|
|
7
|
+
those assets.
|
|
8
|
+
|
|
9
|
+
The project's own source code is licensed under Apache-2.0; see LICENSE.
|
|
10
|
+
The notices below cover only the frontend assets distributed with the
|
|
11
|
+
public documentation site.
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
1. MkDocs Material (CSS, JavaScript, favicon)
|
|
15
|
+
----------------------------------------------
|
|
16
|
+
|
|
17
|
+
Version: 9.7.7
|
|
18
|
+
License: MIT
|
|
19
|
+
Copyright: Copyright (c) 2016-2025 Martin Donath (squidfunk)
|
|
20
|
+
Files:
|
|
21
|
+
- docs/assets/stylesheets/main.*.min.css
|
|
22
|
+
- docs/assets/stylesheets/palette.*.min.css
|
|
23
|
+
- docs/assets/javascripts/bundle.*.min.js
|
|
24
|
+
- docs/assets/javascripts/workers/search.*.min.js
|
|
25
|
+
- docs/assets/images/favicon.png
|
|
26
|
+
|
|
27
|
+
MIT License
|
|
28
|
+
|
|
29
|
+
Copyright (c) 2016-2025 Martin Donath
|
|
30
|
+
|
|
31
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
32
|
+
of this software and associated documentation files (the "Software"), to
|
|
33
|
+
deal in the Software without restriction, including without limitation the
|
|
34
|
+
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
35
|
+
sell copies of the Software, and to permit persons to whom the Software is
|
|
36
|
+
furnished to do so, subject to the following conditions:
|
|
37
|
+
|
|
38
|
+
The above copyright notice and this permission notice shall be included in
|
|
39
|
+
all copies or substantial portions of the Software.
|
|
40
|
+
|
|
41
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
42
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
43
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
|
|
44
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
45
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
46
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
47
|
+
IN THE SOFTWARE.
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
2. lunr (search library)
|
|
51
|
+
-------------------------
|
|
52
|
+
|
|
53
|
+
Version: 2.3.9
|
|
54
|
+
License: MIT
|
|
55
|
+
Copyright: Copyright (C) 2013 by Oliver Nightingale
|
|
56
|
+
Files:
|
|
57
|
+
- docs/assets/javascripts/lunr/min/lunr.stemmer.support.min.js
|
|
58
|
+
- docs/assets/javascripts/lunr/min/lunr.multi.min.js
|
|
59
|
+
|
|
60
|
+
MIT License
|
|
61
|
+
|
|
62
|
+
Copyright (C) 2013 by Oliver Nightingale
|
|
63
|
+
|
|
64
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
65
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
66
|
+
in the Software without restriction, including without limitation the rights
|
|
67
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
68
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
69
|
+
furnished to do so, subject to the following conditions:
|
|
70
|
+
|
|
71
|
+
The above copyright notice and this permission notice shall be included in
|
|
72
|
+
all copies or substantial portions of the Software.
|
|
73
|
+
|
|
74
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
75
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
76
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
77
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
78
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
79
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
80
|
+
IN THE SOFTWARE.
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
3. lunr-languages (language stemmers and word cutters)
|
|
84
|
+
-------------------------------------------------------
|
|
85
|
+
|
|
86
|
+
License: MPL-1.1
|
|
87
|
+
Copyright: Mihai Valentin (and individual language stemmer authors)
|
|
88
|
+
Files:
|
|
89
|
+
- docs/assets/javascripts/lunr/min/lunr.ar.min.js
|
|
90
|
+
- docs/assets/javascripts/lunr/min/lunr.da.min.js
|
|
91
|
+
- docs/assets/javascripts/lunr/min/lunr.de.min.js
|
|
92
|
+
- docs/assets/javascripts/lunr/min/lunr.du.min.js
|
|
93
|
+
- docs/assets/javascripts/lunr/min/lunr.el.min.js
|
|
94
|
+
- docs/assets/javascripts/lunr/min/lunr.es.min.js
|
|
95
|
+
- docs/assets/javascripts/lunr/min/lunr.fi.min.js
|
|
96
|
+
- docs/assets/javascripts/lunr/min/lunr.fr.min.js
|
|
97
|
+
- docs/assets/javascripts/lunr/min/lunr.he.min.js
|
|
98
|
+
- docs/assets/javascripts/lunr/min/lunr.hi.min.js
|
|
99
|
+
- docs/assets/javascripts/lunr/min/lunr.hu.min.js
|
|
100
|
+
- docs/assets/javascripts/lunr/min/lunr.hy.min.js
|
|
101
|
+
- docs/assets/javascripts/lunr/min/lunr.it.min.js
|
|
102
|
+
- docs/assets/javascripts/lunr/min/lunr.ja.min.js
|
|
103
|
+
- docs/assets/javascripts/lunr/min/lunr.jp.min.js
|
|
104
|
+
- docs/assets/javascripts/lunr/min/lunr.kn.min.js
|
|
105
|
+
- docs/assets/javascripts/lunr/min/lunr.ko.min.js
|
|
106
|
+
- docs/assets/javascripts/lunr/min/lunr.nl.min.js
|
|
107
|
+
- docs/assets/javascripts/lunr/min/lunr.no.min.js
|
|
108
|
+
- docs/assets/javascripts/lunr/min/lunr.pt.min.js
|
|
109
|
+
- docs/assets/javascripts/lunr/min/lunr.ro.min.js
|
|
110
|
+
- docs/assets/javascripts/lunr/min/lunr.ru.min.js
|
|
111
|
+
- docs/assets/javascripts/lunr/min/lunr.sa.min.js
|
|
112
|
+
- docs/assets/javascripts/lunr/min/lunr.sv.min.js
|
|
113
|
+
- docs/assets/javascripts/lunr/min/lunr.ta.min.js
|
|
114
|
+
- docs/assets/javascripts/lunr/min/lunr.te.min.js
|
|
115
|
+
- docs/assets/javascripts/lunr/min/lunr.th.min.js
|
|
116
|
+
- docs/assets/javascripts/lunr/min/lunr.tr.min.js
|
|
117
|
+
- docs/assets/javascripts/lunr/min/lunr.vi.min.js
|
|
118
|
+
- docs/assets/javascripts/lunr/min/lunr.zh.min.js
|
|
119
|
+
- docs/assets/javascripts/lunr/tinyseg.js
|
|
120
|
+
- docs/assets/javascripts/lunr/wordcut.js
|
|
121
|
+
|
|
122
|
+
These files are licensed under the Mozilla Public License Version 1.1
|
|
123
|
+
(MPL-1.1). The full text of MPL-1.1 is available from the Mozilla project
|
|
124
|
+
at mozilla.org (path: /en-US/MPL/1.1/).
|
|
125
|
+
|
|
126
|
+
MPL-1.1 requires that recipients of a larger work containing MPL-covered
|
|
127
|
+
files be informed of the location of the MPL source. The source for these
|
|
128
|
+
files is the lunr-languages project on GitHub (user: MihaiValentin,
|
|
129
|
+
repo: lunr-languages).
|
|
@@ -976,7 +976,9 @@
|
|
|
976
976
|
],
|
|
977
977
|
"targetProfile": "generic",
|
|
978
978
|
"foundationPackages": [
|
|
979
|
-
{ "name": "skill-family-contracts", "version": "1.1
|
|
979
|
+
{ "name": "skill-family-contracts", "version": "0.1.1", "digest": "sha256:<64 位十六进制>" },
|
|
980
|
+
{ "name": "skill-family-harness-node", "version": "0.1.1", "digest": "sha256:<64 位十六进制>" },
|
|
981
|
+
{ "name": "skill-family-engineering-kit", "version": "0.1.1", "digest": "sha256:<64 位十六进制>" }
|
|
980
982
|
],
|
|
981
983
|
"verification": {
|
|
982
984
|
"unit": "docs/evidence/unit.json",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"Skill Family Foundation Workspace","text":"<p>Skill Family \u751f\u547d\u5468\u671f\u7684\u516c\u5171\u5de5\u7a0b\u57fa\u7840\u8bbe\u65bd\u7236\u5de5\u4f5c\u533a\u3002\u672c\u4ed3\u63d0\u4f9b\u673a\u5668\u5951\u7ea6\uff08Contracts\uff09\u3001Node \u8584\u8fd0\u884c\u65f6\uff08Harness\uff09\u3001\u5de5\u7a0b\u5de5\u5177\u5305\uff08Engineering Kit\uff09\u3001Profile SPI\u3001\u5b8c\u5168\u865a\u6784\u7684\u901a\u7528\u6837\u4f8b\uff08fixture\uff09\u548c\u5de5\u7a0b\u6587\u6863\u9aa8\u67b6\u3002</p>"},{"location":"#\u5f53\u524d\u72b6\u6001","title":"\u5f53\u524d\u72b6\u6001","text":"<p>\u672c\u4ed3\u662f\u4e00\u5957\u5f00\u53d1\u4e2d\u7684\u9996\u7248\u9aa8\u67b6\u3002\u7248\u672c\u3001\u53d1\u5e03\u3001Pages \u4e0e Git \u7b49\u52a8\u6001\u72b6\u6001\u552f\u4e00\u89c1 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\uff1b\u8bb8\u53ef\u8bc1\u5df2\u6279\u51c6\u4e3a Apache License 2.0\uff0c\u7248\u6743\u4e3b\u4f53\u4e3a\u5e7f\u5dde\u5e02\u98ce\u8377\u79d1\u6280\u6709\u9650\u516c\u53f8\uff0c\u89c4\u8303\u5168\u6587\u89c1\u6839\u7ea7 <code>LICENSE</code>\u3002</p> <p>\u672c\u5de5\u4f5c\u533a\u6c38\u4e45 private\uff0c\u662f\u552f\u4e00\u5f00\u53d1\u771f\u6e90\uff1b\u516c\u5f00\u8fb9\u754c\u53ea\u6709\u4e09\u4e2a\u7248\u672c\u5316\u53d1\u5e03\u955c\u50cf\u4e0e npm tarball\uff0c\u9489\u4f4f\u7684\u6d88\u8d39\u5750\u6807\u4e0e\u53d1\u5e03\u72b6\u6001\u552f\u4e00\u89c1 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\u3002</p> <p>\u4ea7\u54c1\u7ea7\u7684\u552f\u4e00\u72b6\u6001\u9875\u662f \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\uff0c\u7531 <code>node scripts/docs/fact-check.mjs</code> \u5bf9\u7167\u673a\u5668\u771f\u6e90\u673a\u68b0\u6821\u9a8c\uff1b\u5176\u4ed6\u9875\u9762\u4e0d\u627f\u8f7d\u7b2c\u4e8c\u5957\u72b6\u6001\u53e3\u5f84\u3002</p>"},{"location":"#\u9996\u7248\u7ec4\u6210","title":"\u9996\u7248\u7ec4\u6210","text":"\u7ec4\u6210 \u8def\u5f84 \u804c\u8d23 Contracts <code>packages/skill-family-contracts</code> \u673a\u5668\u53ef\u6267\u884c\u5de5\u7a0b\u7ed3\u6784\u548c\u673a\u5236\u534f\u8bae\u7684\u552f\u4e00\u6743\u5a01 Harness <code>packages/skill-family-harness-node</code> \u53ea\u5b9e\u73b0 Contracts \u5b9a\u4e49\u7684\u673a\u5236\u534f\u8bae\uff0c\u4e0d\u62e5\u6709\u4e1a\u52a1\u8bed\u4e49 Engineering Kit <code>packages/skill-family-engineering-kit</code> \u53ea\u63d0\u4f9b <code>scaffold</code>\u3001<code>adopt-plan</code>\u3001<code>projection</code>\u3001<code>check</code> \u56db\u4e2a\u9876\u5c42\u547d\u4ee4 Profile \u79cd\u5b50 <code>profiles/public-plugin</code> \u516c\u5f00\u63d2\u4ef6\u5f62\u6001\u7684 Profile \u79cd\u5b50 \u865a\u6784\u6837\u4f8b <code>fixtures/generic-profile-extension-conformance</code> \u5b8c\u5168\u865a\u6784\u7684\u6269\u5c55\u4e00\u81f4\u6027\u6837\u4f8b <p>\u5305\u6e05\u5355\u3001Profile\u3001fixture \u4e0e\u9876\u5c42\u547d\u4ee4\u4ee5 <code>.foundation/skeleton-manifest.json</code> \u4e3a\u673a\u5668\u771f\u6e90\uff1b\u5de5\u5177\u7248\u672c\u9501\u5b9a\u89c1 <code>.foundation/version-lock.json</code>\u3002</p>"},{"location":"#\u6587\u6863\u5730\u56fe","title":"\u6587\u6863\u5730\u56fe","text":"<ul> <li>\u5b89\u88c5\u4e0e\u73af\u5883\u2014\u2014\u5de5\u5177\u7248\u672c pin\u3001\u5b89\u88c5\u4e0e\u6587\u6863\u7ad9\u70b9\u6784\u5efa</li> <li>\u5feb\u901f\u5f00\u59cb\u2014\u2014\u4ece\u672c\u5730\u9a8c\u8bc1\u5230\u8bd5\u8fd0\u884c\u7684\u6700\u77ed\u8def\u5f84</li> <li>\u80fd\u529b\u4e0e\u8bca\u65ad\u2014\u2014Kit \u56db\u547d\u4ee4\u3001\u9000\u51fa\u7801\u4e0e\u6545\u969c\u6392\u67e5</li> <li>\u67b6\u6784\u8fb9\u754c\u2014\u2014\u5206\u5c42\u3001\u552f\u4e00\u6743\u5a01\u3001\u9884\u7b97\u4e0e\u6587\u6863\u4e8b\u5b9e\u68c0\u67e5</li> <li>\u5f53\u524d\u4ea7\u54c1\u72b6\u6001\u2014\u2014\u552f\u4e00\u4ea7\u54c1\u72b6\u6001\u9875</li> <li>Git \u751f\u547d\u5468\u671f\u6307\u5357\u2014\u2014\u5206\u652f\u3001\u63d0\u4ea4\u3001\u63a8\u9001\u4e0e\u53d1\u5e03\u7684\u6388\u6743\u8fb9\u754c</li> </ul>"},{"location":"#\u5199\u4f5c\u8fb9\u754c","title":"\u5199\u4f5c\u8fb9\u754c","text":"<p>\u6587\u6863\u53ea\u6d88\u8d39\u673a\u5668\u771f\u6e90\u6784\u6210\u7684\u51bb\u7ed3\u4e8b\u5b9e\u5305\uff08manifest\u3001package.json\u3001Contracts \u767b\u8bb0\u7b49\uff09\uff0c\u7531 <code>node scripts/docs/fact-check.mjs</code> \u673a\u68b0\u6821\u9a8c\u3002\u6a21\u578b\u540d\u3001\u51ed\u636e\u548c\u8c03\u5ea6\u4fe1\u606f\u4e0d\u8fdb\u5165\u6587\u6863\uff0c\u4e5f\u4e0d\u8fdb\u5165 Contracts\uff1b\u8be6\u89c1 \u67b6\u6784\u8fb9\u754c\u3002</p>"},{"location":"architecture/","title":"\u67b6\u6784\u8fb9\u754c","text":""},{"location":"architecture/#\u5206\u5c42","title":"\u5206\u5c42","text":"<pre><code>Contracts <- Harness Node <- Engineering Kit <- Profile <- Skill Family Project\n ^\n \u2514---------------- independent Audit consumer\n</code></pre> <p>\u7bad\u5934\u8868\u793a\u5de6\u4fa7\u662f\u53f3\u4fa7\u7684\u4f9d\u8d56\u3002\u516c\u5171\u6838\u5fc3\u4e0d\u5f97\u53cd\u5411\u4f9d\u8d56\u5177\u4f53 Profile \u6216\u5177\u4f53\u6280\u80fd\u65cf\u3002</p>"},{"location":"architecture/#\u552f\u4e00\u6743\u5a01","title":"\u552f\u4e00\u6743\u5a01","text":"<ul> <li>Contracts\uff1a\u7ed3\u6784\u3001\u534f\u8bae\u3001\u9519\u8bef\u7801\u548c\u534f\u8bae\u540d\u767b\u8bb0\uff1b</li> <li>Harness\uff1aContracts \u7684 Node \u673a\u5236\u5b9e\u73b0\uff1b</li> <li>Kit\uff1a\u56db\u4e2a\u5de5\u7a0b\u547d\u4ee4\u53ca\u5176\u53ea\u8bfb/\u53d7\u9650\u5199\u5165\u8fb9\u754c\uff1b</li> <li>Profile\uff1a\u9879\u76ee\u5f62\u6001\u5dee\u5f02\uff1b</li> <li>Audit\uff1a\u72ec\u7acb fixture\u3001\u9884\u671f\u503c\u548c\u88c1\u51b3\uff1b</li> <li>Release\uff1a\u53d1\u5e03\u72b6\u6001\u548c\u5168\u90e8\u8fdc\u7aef\u5199\u5165\u3002</li> </ul>"},{"location":"architecture/#\u9996\u7248\u9884\u7b97","title":"\u9996\u7248\u9884\u7b97","text":"<ul> <li>\u9876\u5c42 Contracts \u5bf9\u8c61\uff1a6 \u7c7b\uff08project-manifest\u3001profile-descriptor\u3001managed-file-lock\u3001operation-request\u3001operation-result\u3001migration-manifest\uff09\uff1b</li> <li>Kit \u9876\u5c42\u547d\u4ee4\uff1a4 \u4e2a\uff08scaffold\u3001adopt-plan\u3001projection\u3001check\uff09\uff1b</li> <li>\u5f3a\u5236\u673a\u68b0\u89c4\u5219\uff1a\u5f53\u524d 13 \u6761\uff0c\u9884\u7b97\u4e0d\u8d85\u8fc7 20 \u6761\uff0c\u7edd\u5bf9\u4e0a\u9650 30 \u6761\uff1b</li> <li>\u53f6\u5b50\u5305\uff1a3 \u4e2a\uff08skill-family-contracts\u3001skill-family-harness-node\u3001skill-family-engineering-kit\uff09\uff1b</li> <li>Schema \u6821\u9a8c\u5668\uff1aAjv 8.20.0\uff08\u7cbe\u786e\u7248\u672c pin\uff09\uff0c\u652f\u6301 draft-07 \u4e0e 2020-12 \u53cc\u65b9\u8a00\uff1b</li> <li>kernel \u534f\u8bae\uff1askill-family.kernel.operation\uff08stable\uff09\uff0cContracts \u7248\u672c 1.1.1\uff1b</li> <li>\u9ed8\u8ba4\u8fd0\u884c\u65f6\u8bed\u8a00\uff1aNode\uff1b\u7b2c\u4e8c\u8bed\u8a00\u5b9e\u73b0\u9996\u7248\u4e3a 0\u3002</li> </ul> <p>\u4efb\u4f55\u65b0\u589e\u7ec4\u4ef6\u5fc5\u987b\u8bf4\u660e\u5220\u9664\u5b83\u4f1a\u5bfc\u81f4\u7684\u4e24\u4e2a\u4ee5\u4e0a\u771f\u5b9e\u6d88\u8d39\u8005\u91cd\u590d\u5b9e\u73b0\uff0c\u5e76\u901a\u8fc7\u72ec\u7acb fixture \u9a8c\u8bc1\u3002</p>"},{"location":"architecture/#\u673a\u5668\u771f\u6e90\u4e0e\u6587\u4ef6\u5206\u7c7b","title":"\u673a\u5668\u771f\u6e90\u4e0e\u6587\u4ef6\u5206\u7c7b","text":"\u771f\u6e90 \u5185\u5bb9 <code>.foundation/skeleton-manifest.json</code> \u5305\u6e05\u5355\u3001Profile\u3001fixture\u3001\u9876\u5c42\u547d\u4ee4 <code>.foundation/version-lock.json</code> projen\u3001pnpm\u3001Node \u7684\u7cbe\u786e\u7248\u672c\u4e0e\u9501\u5b9a\u70b9 <code>.foundation/file-registry.json</code> managed / handwritten / artifact \u4e09\u7c7b\u6587\u4ef6\u767b\u8bb0 <code>package.json</code> \u4e0e <code>packages/*/package.json</code> \u7248\u672c\u3001\u547d\u4ee4\u3001\u4f9d\u8d56\uff08\u5168\u90e8 projen \u53d7\u7ba1\uff09 <code>packages/skill-family-contracts/src/registry.json</code> \u534f\u8bae\u540d\u4e0e Schema $id \u767b\u8bb0 <code>scripts/release-artifact-contract.json</code> \u56fa\u5b9a\u4e09\u5305\u53d1\u5e03\u5b57\u8282\u5408\u540c\uff08\u6210\u5458\u3001\u5fc5\u9700\u9879\u4e0e\u5185\u5bb9\u6458\u8981\u89c4\u5219\uff09 <p>\u53d7\u7ba1\u6587\u4ef6\u53ea\u80fd\u901a\u8fc7 <code>.projenrc.js</code> \u4fee\u6539\u5e76\u8fd0\u884c <code>pnpm synth</code> \u518d\u751f\u6210\uff1b\u624b\u5199\u6587\u4ef6\uff08\u542b\u5168\u90e8\u6587\u6863\uff09\u4e0d\u4f1a\u88ab synth \u8986\u76d6\u3002\u5206\u7c7b\u6743\u5a01\u89c1 <code>.foundation/file-registry.json</code>\u3002</p>"},{"location":"architecture/#\u6587\u6863\u7cfb\u7edf\u4e0e\u4e8b\u5b9e\u68c0\u67e5","title":"\u6587\u6863\u7cfb\u7edf\u4e0e\u4e8b\u5b9e\u68c0\u67e5","text":"<p>\u6587\u6863\u4f53\u7cfb\u7684\u76ee\u6807\u662f\u7528\u786e\u5b9a\u6027\u68c0\u67e5\u6d88\u9664\u624b\u5de5\u6f02\u79fb\uff1a</p> <ol> <li>\u51bb\u7ed3\u4e8b\u5b9e\u5305\uff1a\u6587\u6863\u5199\u4f5c\u53ea\u6d88\u8d39\u4e0a\u8868\u6240\u5217\u673a\u5668\u771f\u6e90\u3002\u6a21\u578b\u6216\u4f5c\u8005\u4e0d\u5f97\u51ed\u8bb0\u5fc6\u5199\u5165\u7248\u672c\u3001\u547d\u4ee4\u3001\u5305\u6570\uff1b\u6a21\u578b\u540d\u3001\u51ed\u636e\u548c\u8c03\u5ea6\u4fe1\u606f\u4e0d\u8fdb\u5165\u6587\u6863\uff0c\u4e5f\u4e0d\u8fdb\u5165 Contracts\u3002</li> <li>\u4e8b\u5b9e\u68c0\u67e5\uff1a<code>node scripts/docs/fact-check.mjs</code> \u5bf9\u7167\u771f\u6e90\u6821\u9a8c\u6587\u6863\u4e2d\u7684\u5305\u540d\u3001\u547d\u4ee4\u3001\u95e8\u7981\u4e8b\u5b9e\u3001\u7248\u672c pin \u4e0e\u5173\u952e\u6570\u5b57\uff0c\u5e76\u4ea4\u53c9\u6821\u9a8c\u771f\u6e90\u4e4b\u95f4\u7684\u4e00\u81f4\u6027\uff08manifest \u4e0e package.json\u3001version-lock \u4e0e packageManager\u3001\u89c4\u5219\u6570\u4e0e\u9884\u7b97\u7b49\uff09\u3002</li> <li>\u94fe\u63a5\u68c0\u67e5\uff1a<code>node scripts/docs/link-check.mjs</code> \u89e3\u6790 README \u4e0e\u5168\u90e8 <code>docs/**/*.md</code> \u7684\u7ad9\u5185\u76f8\u5bf9\u94fe\u63a5\u548c\u6807\u9898\u951a\u70b9\uff0c\u5e76\u6821\u9a8c <code>mkdocs.yml</code> nav \u6536\u5f55\u5b8c\u6574\u3002</li> <li>\u65e0\u5de5\u4f5c\u6d41\u8fb9\u754c\u4e0e\u516c\u5f00\u8fb9\u754c\u9a8c\u8bc1\uff1a\u672c\u4ed3\u6ca1\u6709\u4efb\u4f55 CI/CD workflow\uff08\u65e7\u62d3\u6251\u7684 ci/docs/docs-deploy \u4e09\u4e2a Actions \u5df2\u6574\u4f53\u5220\u9664\uff09\uff0c\u5168\u90e8\u95e8\u7981\u5728\u79c1\u6709\u5de5\u4f5c\u533a\u5185\u8fd0\u884c\uff08<code>pnpm check</code>\uff09\uff1b\u516c\u5f00\u8fb9\u754c\u7531 <code>check:public-snapshots</code> \u4e0e\u53d1\u5e03\u5b57\u8282\u5408\u540c\u673a\u68b0\u9a8c\u8bc1\uff08public \u955c\u50cf\u6295\u5f71\u4e0e tarball \u9010\u5b57\u8282\u4e00\u81f4\u3001\u516c\u5f00\u8f7d\u8377 allowlist \u7cbe\u786e\u76f8\u7b49\u3001\u79c1\u6709\u4e0e\u516c\u5f00\u8f7d\u8377\u5747\u65e0 workflow\uff09\uff0c\u89c1 <code>scripts/public-snapshot-gate.mjs</code> \u4e0e <code>scripts/render-public-package-json.mjs</code>\u3002\u516c\u5f00\u9759\u6001\u7ad9\u7531 <code>scripts/render-public-site.mjs</code> \u6e32\u67d3\uff08\u552f\u4e00\u8f93\u51fa <code>docs/public/site/**</code> \u4e0e\u786e\u5b9a\u6027\u57fa\u7ebf <code>docs/public/site-baseline.json</code>\uff09\uff0c\u7ad9\u70b9\u6587\u4ef6\u4e0e engineering-kit public \u955c\u50cf\u4ed3\u7684 <code>docs/**</code> \u9010\u6587\u4ef6\u5bf9\u5e94\u3002</li> <li>\u7248\u672c\u9501\u5b9a\uff1a\u7ad9\u70b9\u5de5\u5177\u94fe\u9501\u5b9a\u5728 <code>scripts/docs/toolchain.json</code> \u4e0e <code>scripts/docs/requirements.txt</code>\uff0c\u6784\u5efa\u53ea\u4f7f\u7528\u4ed3\u5e93\u5916\u90e8\u7684 Python \u865a\u62df\u73af\u5883\uff0c\u4e0d\u505a\u7cfb\u7edf\u7ea7 pip install\u3002</li> </ol> <p>\u4e24\u4e2a\u68c0\u67e5\u811a\u672c\u90fd\u53ef\u76f4\u63a5 <code>node scripts/docs/<name>.mjs</code> \u8fd0\u884c\uff1a<code>fact-check.mjs</code> \u662f Node \u811a\u672c\uff0c\u7ecf\u4ed3\u5185\u6a21\u5757\uff08<code>scripts/engine-floor-check.mjs</code>\uff09\u6d88\u8d39\u6839\u76ee\u5f55\u7cbe\u786e\u9501\u5b9a\u7684 <code>semver@7.8.5</code>\uff0c\u8fd0\u884c\u524d\u5fc5\u987b\u5148\u5b8c\u6210 <code>pnpm install --frozen-lockfile</code>\uff1b<code>link-check.mjs</code> \u4e3a\u7eaf Node \u5b9e\u73b0\uff08\u65e0\u7b2c\u4e09\u65b9\u4f9d\u8d56\uff09\u3002\u804c\u8d23\u8bf4\u660e\u89c1 <code>scripts/docs/README.md</code>\u3002</p>"},{"location":"architecture/#\u7a33\u5b9a\u4ea7\u54c1\u95e8\u7981","title":"\u7a33\u5b9a\u4ea7\u54c1\u95e8\u7981","text":"<p>\u6839 <code>pnpm check</code> \u53ea\u7f16\u6392 10 \u4e2a\u7a33\u5b9a\u4ea7\u54c1 gate ID\uff08<code>check:structure</code>\uff5e<code>check:integration</code>\uff0c\u9010 ID \u89c1 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\uff09\uff0c\u4e0d\u518d\u9501\u6b7b\u539f\u59cb\u547d\u4ee4\u6e05\u5355\uff1b\u6bcf\u4e2a\u7a33\u5b9a ID \u5728\u81ea\u5df1\u7684 package script \u5185\u7ec4\u5408\u5c11\u91cf\u4ea7\u54c1\u68c0\u67e5\u3002\u95e8\u7981\u4e8b\u5b9e\u7531 <code>node scripts/docs/fact-check.mjs</code> \u4ece\u6839 <code>package.json</code> \u7684 <code>scripts.check</code> \u673a\u68b0\u63a8\u5bfc\u5e76\u9010\u5b57\u6838\u5bf9\uff08setup \u6295\u5f71\u533a\u5757\u4e0e <code>scripts.check</code> \u9010\u5b57\u4e00\u81f4\uff09\u3002\u6587\u6863\u4e0e setup \u53ea\u8c03\u7528\u6216\u5217\u51fa 10 \u4e2a\u7a33\u5b9a ID \u6216\u6839 <code>pnpm check</code>\uff0c\u4e0d\u590d\u5236\u5e95\u5c42\u547d\u4ee4\u5217\u8868\u3002</p> <p>\u4ed3\u5185\u68c0\u67e5\u7684\u8bda\u5b9e\u8fb9\u754c\uff1a\u7ed3\u6784\u68c0\u67e5\u53ea\u8bc1\u660e\u201c\u5b57\u8282/\u7ed3\u6784\u4e00\u81f4\u6027\uff08\u4ed3\u5185\u53ef\u8bc1\uff09\u201d\uff1b\u4e00\u6b21\u6027\u8fc1\u79fb\u5b8c\u6574\u6027\u3001\u666e\u901a\u6b63\u6587\u8bed\u4e49\u4e0e\u6700\u7ec8\u63a5\u53d7/\u62d2\u7edd\u7ed3\u8bba\u5c5e\u4e8e\u5916\u90e8\u5ba1\u9605\u804c\u8d23\uff0c\u4e0d\u5728\u76ee\u6807\u4ed3\u5185\u7ef4\u62a4\u7b2c\u4e8c\u4efd\u95e8\u7981 registry\u3001baseline \u6216\u547d\u4ee4\u6bd4\u8f83\u5668\u3002</p>"},{"location":"git-lifecycle/","title":"Git \u751f\u547d\u5468\u671f\u6307\u5357","text":"<p>\u672c\u6587\u662f Skill Family \u5404\u5de5\u4f5c\u533a Git \u751f\u547d\u5468\u671f\u89c4\u5219\u7684\u552f\u4e00\u6743\u5a01\u6587\u6863\u3002\u65b0\u5efa\u9879\u76ee\u9aa8\u67b6 \uff08<code>npx skill-family-engineering-kit scaffold</code>\uff09\u4e2d\u7684 AGENTS.md\u300cMinimal Git lifecycle\u300d\u533a\u5757\u4e0e <code>docs/git-lifecycle.md</code> \u9875\u9762\u90fd\u662f\u5bf9\u672c\u6307\u5357\u540c\u53e3\u5f84\u7684\u6295\u5f71\u4e0e\u6307\u9488\u2014\u2014 \u4efb\u4f55\u5de5\u4f5c\u533a\u90fd\u4e0d\u5f97\u518d\u7ef4\u62a4\u7b2c\u4e8c\u5957 Git \u89c4\u5219\u3002\u6240\u6709\u5de5\u5177\u94fe\uff08projen\u3001engineering kit\u3001 CI \u811a\u672c\uff09\u90fd\u4e0d\u6267\u884c Git \u5199\u64cd\u4f5c\uff1b\u4e0b\u8ff0\u6bcf\u4e00\u7c7b\u5199\u64cd\u4f5c\u90fd\u53ea\u6765\u81ea\u4eba\u7684\u663e\u5f0f\u51b3\u5b9a\u3002</p>"},{"location":"git-lifecycle/#\u5206\u652f\u547d\u540d\u4e0e\u5bff\u547d","title":"\u5206\u652f\u547d\u540d\u4e0e\u5bff\u547d","text":"<ul> <li>\u5206\u652f\u6a21\u578b\uff1a\u4e00\u6761\u957f\u671f\u5206\u652f <code>main</code>\uff0c\u52a0\u77ed\u5bff\u547d\u4efb\u52a1\u5206\u652f <code>task/<\u4efb\u52a1\u53f7>-<\u77ed\u6a2a\u7ebf\u6458\u8981></code> \uff08\u4f8b\u5982 <code>task/0050-git-lifecycle</code>\uff09\u3002</li> <li>\u4efb\u52a1\u5206\u652f\u53ea\u627f\u8f7d\u4e00\u4e2a\u4efb\u52a1\u7684\u4e00\u7ec4\u76f8\u5173\u53d8\u66f4\uff1b\u4efb\u52a1\u9a8c\u6536\u901a\u8fc7\u540e\u5408\u5e76\uff1b\u786e\u8ba4\u6ca1\u6709\u672a\u5408\u5e76 \u63d0\u4ea4\u540e\u53ef\u5220\u9664\u672c\u5730\u5206\u652f\u3002\u8fdc\u7aef\u5206\u652f\u5220\u9664\u5c5e\u4e8e push \u7c7b\u5916\u90e8\u5199\u5165\uff0c\u5fc5\u987b\u53e6\u884c\u53d6\u5f97\u663e\u5f0f \u6388\u6743\uff08\u89c1\u4e0b\u6587\u9010\u9879\u6388\u6743\u8282\uff09\uff0c\u5408\u5e76\u672c\u8eab\u4e0d\u81ea\u52a8\u6388\u6743\u8fdc\u7aef\u5220\u9664\u3002\u4e0d\u5b58\u5728\u957f\u671f\u5b58\u6d3b\u7684 \u7279\u6027\u5206\u652f\uff0c\u4e5f\u4e0d\u5141\u8bb8\u5728\u4efb\u52a1\u5206\u652f\u4e0a\u5806\u79ef\u4e0e\u4efb\u52a1\u65e0\u5173\u7684\u53d8\u66f4\u3002</li> <li><code>main</code> \u6c38\u8fdc\u53ea\u63a5\u6536\u5df2\u901a\u8fc7\u95e8\u7981\u7684\u5408\u5e76\uff1b\u4efb\u4f55\u60c5\u51b5\u4e0b\u90fd\u4e0d\u5f97\u5bf9 <code>main</code> \u76f4\u63a5\u63d0\u4ea4\u6216 force-push\u3002</li> </ul>"},{"location":"git-lifecycle/#\u4fee\u6539\u524d\u72b6\u6001\u68c0\u67e5","title":"\u4fee\u6539\u524d\u72b6\u6001\u68c0\u67e5","text":"<ul> <li>\u63d0\u4ea4\u3001\u8fdc\u7aef\u7b49\u5b9e\u65f6 Git \u72b6\u6001\u4e0d\u5199\u8fdb\u4efb\u4f55\u7248\u672c\u5316\u6587\u6863\uff08\u5305\u62ec\u4ea7\u54c1\u72b6\u6001\u9875\uff09\uff1b\u6267\u884c\u4efb\u4f55 Git \u52a8\u4f5c\u524d\uff0c\u5148\u73b0\u573a\u8fd0\u884c\u4e0b\u5217\u53ea\u8bfb\u547d\u4ee4\u53d1\u73b0\u5f53\u524d\u72b6\u6001\uff1a</li> </ul> <p><code>bash git status --short --branch git rev-parse --verify HEAD git remote -v</code></p> <p>\u8fd9\u4e09\u6761\u547d\u4ee4\u53ea\u662f\u53ea\u8bfb\u63a2\u6d4b\uff1a\u8f93\u51fa\u53ea\u53cd\u6620\u672c\u673a\u5de5\u4f5c\u533a\u5f53\u4e0b\u7684\u72b6\u6001\uff0c\u4e0d\u6388\u4e88\u4efb\u4f55\u5199\u6743\u9650\uff1b \u6267\u884c stage/commit/push/tag/release \u4ecd\u5fc5\u987b\u6309\u4e0b\u6587\u9010\u9879\u6388\u6743\u8282\u5355\u72ec\u53d6\u5f97\u6388\u6743\u3002 - \u5f00\u59cb\u4efb\u4f55\u4fee\u6539\u4e4b\u524d\uff0c\u5148\u8fd0\u884c <code>git status --short --branch</code>\uff0c\u786e\u8ba4\u5f53\u524d\u5206\u652f\u3001\u672a\u63d0\u4ea4 \u53d8\u66f4\u4e0e\u8fdc\u7aef\u8ddf\u8e2a\u72b6\u6001\uff1b\u5de5\u4f5c\u533a\u91cc\u51fa\u73b0\u4e0d\u8ba4\u8bc6\u7684\u5206\u652f\u3001\u672a\u6682\u5b58\u53d8\u66f4\u6216\u964c\u751f\u6587\u4ef6\u65f6\uff0c\u5148 \u8c03\u67e5\u6765\u6e90\u518d\u52a8\u624b\uff0c\u90a3\u662f\u522b\u4eba\u6b63\u5728\u8fdb\u884c\u7684\u5de5\u4f5c\uff0c\u4e0d\u662f\u53ef\u4ee5\u968f\u624b\u6e05\u7406\u7684\u566a\u58f0\u3002 - \u7981\u6b62\u7528 <code>git checkout .</code>\u3001<code>git restore .</code>\u3001<code>git clean -f</code>\u3001<code>git reset --hard</code> \u4e4b\u7c7b\u7684\u7834\u574f\u6027\u547d\u4ee4\u201c\u987a\u624b\u201d\u6e05\u7a7a\u5de5\u4f5c\u533a\u6765\u7ed5\u8fc7\u969c\u788d\uff1b\u786e\u9700\u4e22\u5f03\u672a\u63d0\u4ea4\u53d8\u66f4\u65f6\uff0c\u5fc5\u987b \u9010\u6761\u5217\u51fa\u5c06\u88ab\u4e22\u5f03\u7684\u5185\u5bb9\u5e76\u83b7\u5f97\u663e\u5f0f\u786e\u8ba4\u3002</p>"},{"location":"git-lifecycle/#\u539f\u5b50-commit-\u6761\u4ef6","title":"\u539f\u5b50 commit \u6761\u4ef6","text":"<p>\u4e00\u4e2a commit \u5fc5\u987b\u540c\u65f6\u6ee1\u8db3\uff1a</p> <ol> <li>\u53ea\u5305\u542b\u4e00\u4e2a\u903b\u8f91\u53d8\u66f4\uff08\u4e00\u4e2a\u4efb\u52a1\u7684\u63a8\u8fdb\uff0c\u6216\u4e00\u6b21\u660e\u786e\u62c6\u5206\u7684\u4fee\u6b63\uff09\uff1b</li> <li>\u53d7\u7ba1\u751f\u6210\u7269\u4e0e\u5176\u6e90\uff08<code>.projenrc.js</code>\u3001\u6295\u5f71\u811a\u672c\uff09\u5728\u540c\u4e00\u6b21\u63d0\u4ea4\u5185\u6210\u5bf9\u51fa\u73b0\uff1b</li> <li>\u63d0\u4ea4\u524d <code>pnpm check</code>\uff08\u6216\u4efb\u52a1\u6307\u5b9a\u7684\u6700\u5c0f\u9a8c\u8bc1\u5165\u53e3\uff09\u9000\u51fa\u7801\u4e3a 0\u2014\u2014\u4e0d\u5f97\u628a\u7ea2\u7684 \u72b6\u6001\u63d0\u4ea4\u8fdb\u4efb\u4f55\u5206\u652f\u540e\u518d\u201c\u56de\u5934\u4fee\u201d\uff1b</li> <li>\u63d0\u4ea4\u4fe1\u606f\u8bf4\u660e\u201c\u4e3a\u4ec0\u4e48\u201d\uff0c\u5f15\u7528\u4efb\u52a1\u53f7\uff1b\u4e0d\u5f97\u5305\u542b\u51ed\u636e\u3001\u79c1\u6709\u6570\u636e\u6216\u4e0d\u53ef\u516c\u5f00\u7684 \u5185\u90e8\u6807\u8bc6\u3002</li> </ol> <p>\u4e0d\u6ee1\u8db3\u4ee5\u4e0a\u4efb\u4e00\u6761\u4ef6\u7684\u53d8\u66f4\u4e0d\u5f97\u63d0\u4ea4\uff1b\u5b81\u53ef\u62c6\u6210\u591a\u4e2a commit\uff0c\u4e5f\u4e0d\u5408\u5e76\u6210\u4e00\u4e2a\u6df7\u5408 \u53d8\u66f4\u3002</p>"},{"location":"git-lifecycle/#stagecommitpushtagrelease-\u7684\u9010\u9879\u6388\u6743","title":"stage\u3001commit\u3001push\u3001tag\u3001release \u7684\u9010\u9879\u6388\u6743","text":"<ul> <li>\u4fee\u6539\u6388\u6743\u4e0d\u5305\u542b stage \u4e0e commit\uff1a\u83b7\u5f97\u67d0\u4efb\u52a1\u7684\u4fee\u6539\u6388\u6743\uff0c\u53ea\u8868\u793a\u53ef\u4ee5\u5728\u5de5\u4f5c\u533a \u91cc\u6539\u52a8\u6587\u4ef6\uff1bstage\uff08<code>git add</code>\uff09\u4e0e commit \u4ecd\u662f\u4e24\u4e2a\u72ec\u7acb\u7684\u5199\u64cd\u4f5c\uff0c\u5fc5\u987b\u5206\u522b \u6309\u98ce\u9669\u9010\u9879\u53d6\u5f97\u660e\u786e\u6388\u6743\uff0c\u4e0d\u5b58\u5728\u201c\u6388\u6743\u4fee\u6539\u5373\u9ed8\u8ba4\u6388\u6743\u63d0\u4ea4\u201d\u3002</li> <li>stage \u4e0e commit\uff1a\u9ed8\u8ba4\u53ea\u5728\u672c\u5730\u3001\u6309\u539f\u5b50\u6761\u4ef6\u6267\u884c\uff1b\u4e00\u6b21 commit \u6388\u6743\u53ea\u8986\u76d6\u88ab \u660e\u786e\u58f0\u660e\u7684\u90a3\u4e00\u6b21\u672c\u5730\u63d0\u4ea4\uff0c\u4e0d\u8986\u76d6\u4efb\u52a1\u4e4b\u5916\u7684\u6e05\u7406\u3001\u6539\u5199\uff08\u542b amend/rebase \u6539\u5199\u5df2\u63d0\u4ea4\u5185\u5bb9\uff09\u6216\u540e\u7eed\u63d0\u4ea4\u3002</li> <li>push\uff1a\u628a\u4efb\u52a1\u5206\u652f\u63a8\u9001\u5230\u8fdc\u7aef\u3001\u5f00 PR\uff0c\u4ee5\u53ca\u5220\u9664\u8fdc\u7aef\u5206\u652f \uff08<code>git push --delete</code> / <code>git push origin :<branch></code>\uff09\u540c\u5c5e push \u7c7b\u5916\u90e8 \u5199\u5165\uff0c\u90fd\u9700\u8981\u5728\u5f53\u524d\u4efb\u52a1\u91cc\u5355\u72ec\u6388\u6743\uff1b\u7981\u6b62\u76f4\u63a5 push <code>main</code>\u3002\u5408\u5e76\u540e\u7684\u6e05\u7406\u8bf4\u660e \u4e0d\u6784\u6210\u5bf9\u8fdc\u7aef\u5220\u9664\u7684\u81ea\u52a8\u6388\u6743\u3002</li> <li>tag \u4e0e release\uff1a\u6bcf\u4e00\u6b21\u6253 tag\u3001\u53d1\u5e03 release\uff08\u5305\u62ec npm publish\u3001Pages \u90e8\u7f72\u3001 \u5efa\u8fdc\u7aef\u4ed3\u5e93\uff09\u90fd\u662f\u72ec\u7acb\u7684\u9ad8\u98ce\u9669\u52a8\u4f5c\uff0c\u5fc5\u987b\u9010\u9879\u5355\u72ec\u6388\u6743\uff1b\u4e00\u6b21 push \u6388\u6743\u4e0d\u6784\u6210 \u4efb\u4f55 tag/release \u6388\u6743\u3002</li> <li>\u81ea\u52a8\u5316\u5de5\u5177\uff08\u542b AI \u52a9\u624b\u4e0e CI\uff09\u5728\u672a\u83b7\u5f97\u9488\u5bf9\u5f53\u524d\u4efb\u52a1\u7684\u663e\u5f0f\u4eba\u5de5\u6388\u6743\u524d\uff0c\u4e0d\u5f97 \u6267\u884c <code>git add</code>\uff08stage\uff09\u3001<code>git commit</code>\u3001<code>git push</code>\u3001<code>git tag</code> \u6216\u4efb\u4f55\u5efa \u8fdc\u7aef/\u53d1\u5e03/\u5220\u9664\u8fdc\u7aef\u5f15\u7528\u7684\u547d\u4ee4\u3002</li> <li>\u6388\u6743\u53ea\u5bf9\u58f0\u660e\u8005\u7684\u90a3\u4e00\u6b21\u64cd\u4f5c\u6709\u6548\uff0c\u4e0d\u6784\u6210\u5bf9\u540c\u7c7b\u540e\u7eed\u64cd\u4f5c\u7684\u957f\u671f\u653e\u884c\u3002</li> </ul>"},{"location":"git-lifecycle/#\u53d7\u7ba1\u6295\u5f71\u4e0e\u6e90\u540c\u63d0\u4ea4","title":"\u53d7\u7ba1\u6295\u5f71\u4e0e\u6e90\u540c\u63d0\u4ea4","text":"<ul> <li>projen \u53d7\u7ba1\u6587\u4ef6\u53ea\u80fd\u901a\u8fc7\u4fee\u6539 <code>.projenrc.js</code> \u540e\u8fd0\u884c <code>pnpm synth</code> \u4ea7\u751f\uff1b\u751f\u6210\u7269 \u5fc5\u987b\u4e0e\u5176\u6e90\u53d8\u66f4\u5728\u540c\u4e00\u4e2a commit \u5185\u63d0\u4ea4\uff0c\u4e0d\u5f97\u5148\u63d0\u4ea4\u6e90\u3001\u540e\u8865\u751f\u6210\u7269\uff0c\u66f4\u4e0d\u5f97\u53ea \u63d0\u4ea4\u5176\u4e2d\u4e00\u4fa7\u3002</li> <li>\u6587\u6863\u53d7\u7ba1\u6295\u5f71\uff08\u5982 setup.md \u7684\u7a33\u5b9a\u95e8\u7981\u9636\u6bb5\u533a\u5757\uff09\u540c\u7406\uff1a\u6295\u5f71\u811a\u672c\u91cd\u8dd1 \u7684\u8f93\u51fa\u4e0e\u89e6\u53d1\u5b83\u7684\u771f\u6e90\u53d8\u66f4\u540c\u63d0\u4ea4\uff1bCI \u7684\u6f02\u79fb\u68c0\u67e5\uff08synth-drift / synth-idempotency\uff09 \u4f1a\u673a\u68b0\u62e6\u622a\u53ea\u63d0\u4ea4\u4e00\u4fa7\u7684\u53d8\u66f4\u3002</li> </ul>"},{"location":"git-lifecycle/#gitignore-\u5206\u7c7b","title":".gitignore \u5206\u7c7b","text":"<ul> <li>\u6bcf\u4e2a\u88ab\u5ffd\u7565\u7684\u8def\u5f84\u90fd\u5fc5\u987b\u5f52\u5165 <code>.foundation/file-registry.json</code> \u7684\u4e00\u4e2a\u7c7b\u522b\uff1a \u5de5\u5177\u751f\u6210\u7269\uff08artifacts\uff0c\u5982 <code>node_modules/</code>\u3001<code>site/</code>\u3001<code>.cache/</code>\u3001\u65e5\u5fd7\uff09\u8d70 <code>.gitignore</code>\uff1b\u4f9d\u8d56\u9501\u6587\u4ef6\uff08trackedToolLocks\uff0c\u5982 <code>pnpm-lock.yaml</code>\uff09\u88ab\u663e\u5f0f\u8ddf\u8e2a\u3001 \u4e0d\u5f97\u5ffd\u7565\uff1b\u624b\u5199\u6e90\u4e8b\u5b9e\u4e0e\u53d7\u7ba1\u6587\u4ef6\u4e00\u5f8b\u8ddf\u8e2a\u3002</li> <li><code>.gitignore</code> \u7684\u5ffd\u7565\u6a21\u5f0f\u96c6\u5408\u4e0e file-registry \u7684 artifacts \u6a21\u5f0f\u96c6\u5408\u5fc5\u987b\u9010\u5b57 \u4e00\u81f4\uff08<code>scripts/check-structure.mjs</code> \u673a\u68b0\u6838\u5bf9\uff09\uff1b\u65b0\u589e\u5ffd\u7565\u9879\u5fc5\u987b\u5148\u767b\u8bb0\u7c7b\u522b\uff0c \u4e0d\u5141\u8bb8\u51fa\u73b0\u201c\u8ddf\u8e2a\u4f46\u88ab\u5ffd\u7565\u201d\u6216\u201c\u5ffd\u7565\u4f46\u672a\u767b\u8bb0\u201d\u7684\u4e2d\u95f4\u6001\u3002</li> </ul>"},{"location":"git-lifecycle/#\u5220\u9664\u524d\u6838\u5bf9\u4e0e\u53ef\u6062\u590d\u5904\u7f6e","title":"\u5220\u9664\u524d\u6838\u5bf9\u4e0e\u53ef\u6062\u590d\u5904\u7f6e","text":"<ul> <li>\u5220\u9664\u4efb\u4f55\u6587\u4ef6\u3001\u5206\u652f\u6216\u5386\u53f2\u5185\u5bb9\u4e4b\u524d\uff0c\u5148\u6838\u5bf9\u5176\u662f\u5426\u4ecd\u88ab\u5f15\u7528\uff08\u95e8\u7981\u3001\u6587\u6863\u94fe\u63a5\u3001 \u51bb\u7ed3\u8bc1\u636e\u5f15\u7528\uff09\uff1b\u88ab\u51bb\u7ed3\u9a8c\u6536\u8f93\u5165\u5f15\u7528\u7684\u8bc1\u636e\u4e00\u5f8b\u4e0d\u5f97\u5220\u9664\u3002</li> <li>\u4f18\u5148\u53ef\u6062\u590d\u5904\u7f6e\uff1a\u80fd\u6539\u5c31\u4e0d\u5220\uff0c\u80fd\u505c\u7528\uff08\u5982 <code>if: false</code> \u786c\u95e8\u7981\uff09\u5c31\u4e0d\u79fb\u9664\uff1b\u786e\u9700 \u5220\u9664\u65f6\u4fdd\u7559\u53ef\u8ffd\u6eaf\u7684\u66ff\u4ee3\u7269\uff08\u7eed\u63a5\u8bb0\u5f55\u3001\u51b3\u5b9a\u8bb0\u5f55\u3001\u5f52\u6863\u9875\uff09\u3002</li> <li>\u5206\u652f\u9000\u51fa\uff1a\u4efb\u52a1\u5206\u652f\u5408\u5e76\u540e\uff0c\u5148\u786e\u8ba4\u6ca1\u6709\u672a\u5408\u5e76\u7684\u63d0\u4ea4\uff0c\u518d\u5220\u9664\u672c\u5730\u5206\u652f\uff1b\u8fdc\u7aef \u5206\u652f\u5220\u9664\u5c5e\u4e8e push \u7c7b\u5916\u90e8\u5199\u5165\uff0c\u5408\u5e76\u540e\u7684\u6e05\u7406\u8bf4\u660e\u4e0d\u5f97\u81ea\u52a8\u6388\u6743\u8fdc\u7aef\u5220\u9664\uff0c\u987b\u6309 \u9010\u9879\u6388\u6743\u8282\u53e6\u884c\u53d6\u5f97\u663e\u5f0f\u6388\u6743\u3002</li> <li>\u4efb\u4f55\u201c\u5220\u9664\u540e\u91cd\u653e\u201d\u90fd\u5fc5\u987b\u6709\u5148\u7ea2\u540e\u7eff\u7684\u673a\u5668\u8bc1\u636e\uff0c\u8bc1\u660e\u5220\u9664\u4e0d\u662f\u9759\u9ed8\u4e22\u5931\u3002</li> </ul>"},{"location":"git-lifecycle/#\u751f\u6210\u7269\u7981\u6b62\u624b\u6539","title":"\u751f\u6210\u7269\u7981\u6b62\u624b\u6539","text":"<ul> <li>\u5e26 projen \u751f\u6210\u6807\u8bb0\u7684\u6587\u4ef6\u3001\u6295\u5f71\u811a\u672c\u5199\u5165\u7684\u53d7\u7ba1\u533a\u5757\u3001<code>.foundation/</code> \u4e0b\u7684\u673a\u5668 \u771f\u6e90\u4e00\u5f8b\u7981\u6b62\u624b\u6539\uff1b\u624b\u6539\u4f1a\u88ab synth \u6f02\u79fb\u68c0\u67e5\u68c0\u51fa\u5e76\u62e6\u622a\u3002</li> <li>\u9700\u8981\u53d8\u66f4\u53d7\u7ba1\u5185\u5bb9\u65f6\uff0c\u552f\u4e00\u5408\u6cd5\u8def\u5f84\u662f\u4fee\u6539\u5bf9\u5e94\u7684\u6e90\uff08<code>.projenrc.js</code> \u6216\u6295\u5f71\u811a\u672c \u7684\u771f\u6e90\u8f93\u5165\uff09\u518d\u91cd\u65b0\u751f\u6210\uff1b\u201c\u624b\u6539\u540e\u518d\u91cd\u65b0\u751f\u6210\u628a\u5dee\u5f02\u6d17\u767d\u201d\u5c5e\u4e8e\u88ab\u95e8\u7981\u660e\u786e\u62d2\u7edd \u7684\u7be1\u6539\u6a21\u5f0f\u3002</li> </ul>"},{"location":"help/","title":"\u80fd\u529b\u4e0e\u8bca\u65ad","text":"<p>\u4ea7\u54c1\u7ea7\u7684\u5f53\u524d\u72b6\u6001\u53ea\u5728\u552f\u4e00\u72b6\u6001\u9875 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001 \u58f0\u660e\uff08\u7531 <code>node scripts/docs/fact-check.mjs</code> \u5bf9\u7167\u673a\u5668\u771f\u6e90\u673a\u68b0\u6821\u9a8c\uff09\uff1b\u672c\u9875\u6b63\u6587\u4e0d\u590d\u5236\u4efb\u4f55\u52a8\u6001\u72b6\u6001\u53e3\u5f84\u3002\u4ed3\u5185\u68c0\u67e5\u7684\u8bda\u5b9e\u8fb9\u754c\uff1amanifest\u3001package.json\u3001\u95e8\u7981\u811a\u672c\u4e0e\u5de5\u4f5c\u6d41\u7b49\u7ed3\u6784\u68c0\u67e5\u53ea\u8bc1\u660e\u201c\u5b57\u8282/\u7ed3\u6784\u4e00\u81f4\u6027\uff08\u4ed3\u5185\u53ef\u8bc1\uff09\u201d\uff1b\u81ea\u7136\u8bed\u8a00\u8bed\u4e49\u7684\u6b63\u786e\u6027\u4e0d\u5c5e\u4e8e\u4ed3\u5185\u6b63\u5219\u6216\u6458\u8981\u53ef\u8bc1\u660e\u7684\u8303\u56f4\uff0c\u9700\u5916\u90e8\u72ec\u7acb\u5ba1\u9605\u3002</p>"},{"location":"help/#\u5f53\u524d\u80fd\u505a\u4ec0\u4e48","title":"\u5f53\u524d\u80fd\u505a\u4ec0\u4e48","text":"<ul> <li>projen \u53d7\u7ba1\u6587\u4ef6\u7684\u5408\u6210\uff08<code>pnpm synth</code>\uff09\u3001\u53ea\u8bfb\u6f02\u79fb\u68c0\u67e5\uff08<code>pnpm drift</code>\uff09\u4e0e\u5e42\u7b49\u6027\u9a8c\u8bc1\uff08<code>pnpm synth-idempotency</code>\uff09\uff1b</li> <li>Contracts v1 \u6821\u9a8c\uff1a\u516d\u7c7b\u9876\u5c42\u5bf9\u8c61\u3001\u534f\u8bae\u540d\u767b\u8bb0\u3001SFC \u9519\u8bef\u7801\u4f53\u7cfb\u300113 \u6761\u5f3a\u5236\u673a\u68b0\u89c4\u5219\uff08\u9884\u7b97\u4e0d\u8d85\u8fc7 20 \u6761\uff0c\u7edd\u5bf9\u4e0a\u9650 30 \u6761\uff09\uff1b</li> <li>Harness \u673a\u5236\uff1a\u539f\u5b50\u5199\u3001\u8def\u5f84\u4e0e\u7b26\u53f7\u94fe\u63a5\u6536\u5bb9\u3001\u8d44\u6e90\u95ed\u5305\u3001\u4e34\u65f6\u5de5\u4f5c\u533a\u3001kernel \u8bf7\u6c42\u5904\u7406\uff1b</li> <li>Engineering Kit \u56db\u547d\u4ee4\uff08\u89c1\u4e0b\u8282\uff09\uff0c\u5168\u90e8\u4e0d\u6267\u884c Git \u5199\u64cd\u4f5c\u3001\u53d1\u5e03\u6216\u5220\u9664\uff1b</li> <li>\u7a33\u5b9a\u4ea7\u54c1\u95e8\u7981\uff08<code>pnpm check</code> \u4e32\u8054\uff0c\u9010 ID \u89c1 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\uff09\uff1b</li> <li>\u53d1\u5e03\u5b57\u8282\u5408\u540c\uff1a<code>pnpm run release-artifacts:build</code> \u4e0e <code>pnpm run release-artifacts:verify</code>\uff08\u89c1 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\uff09\uff1b</li> <li>\u516c\u5f00\u9759\u6001\u7ad9\u6e32\u67d3\uff1a<code>node scripts/render-public-site.mjs</code>\uff08\u51bb\u7ed3 MkDocs \u73af\u5883 strict \u6784\u5efa\u3001\u5185\u5bb9\u6cc4\u6f0f\u626b\u63cf\u4e0e\u786e\u5b9a\u6027\u57fa\u7ebf\uff1b<code>--write</code> / <code>--check</code> / <code>--self-test</code>\uff09\uff1b</li> <li>\u6587\u6863\u4e8b\u5b9e/\u94fe\u63a5\u68c0\u67e5\uff08<code>node scripts/docs/fact-check.mjs</code>\u3001<code>node scripts/docs/link-check.mjs</code>\uff09\u3002</li> </ul>"},{"location":"help/#\u5f53\u524d\u4e0d\u80fd\u505a\u4ec0\u4e48","title":"\u5f53\u524d\u4e0d\u80fd\u505a\u4ec0\u4e48","text":"<ul> <li>\u4e0d\u63d0\u4f9b\u53d1\u5e03\u3001\u90e8\u7f72\u6216\u8fdc\u7aef\u5199\u5165\u7684\u547d\u4ee4\u80fd\u529b\uff1b\u53d1\u5e03\u4e0e\u90e8\u7f72\u7684\u5f53\u524d\u72b6\u6001\u89c1 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\uff1b</li> <li>\u6ca1\u6709\u7b2c\u4e94\u4e2a Kit \u9876\u5c42\u547d\u4ee4\uff1b<code>check</code> \u53ea\u8bca\u65ad\u3001\u7edd\u4e0d\u81ea\u52a8\u4fee\u590d\uff1b</li> <li>\u4e0d\u505a\u591a\u5bbf\u4e3b\u6295\u5f71\u3001Python \u5bf9\u79f0\u8fd0\u884c\u65f6\u6216\u7b2c\u4e8c\u5957\u6a21\u677f\u5f15\u64ce\uff08\u9996\u7248\u7981\u6b62\u6269\u5f20\u9879\uff09\u3002</li> </ul>"},{"location":"help/#Kit-\u56db\u547d\u4ee4\u4e0e\u526f\u4f5c\u7528","title":"Kit \u56db\u547d\u4ee4\u4e0e\u526f\u4f5c\u7528","text":"<p>CLI \u5165\u53e3\uff1a<code>packages/skill-family-engineering-kit/src/cli.mjs</code>\u3002\u6070\u597d\u56db\u4e2a\u9876\u5c42\u547d\u4ee4\uff1a</p> \u547d\u4ee4 \u4f5c\u7528 \u526f\u4f5c\u7528\u8fb9\u754c <code>scaffold</code> \u5728\u7a7a\u76ee\u5f55\u751f\u6210 Skill Family \u9879\u76ee\u9aa8\u67b6 \u53ea\u5411\u7a7a\u76ee\u6807\u76ee\u5f55\u5199\u5165\u9aa8\u67b6\u6587\u4ef6\uff08\u539f\u5b50\u5199\u3001\u8def\u5f84\u6536\u5bb9\uff09\uff1b\u975e\u7a7a\u6216\u51b2\u7a81\u76ee\u6807\u88ab\u62d2\u7edd\u4e14\u4e0d\u88ab\u89e6\u78b0 <code>adopt-plan</code> \u4e25\u683c\u53ea\u8bfb\u5730\u89c4\u5212\u5b58\u91cf\u4ed3\u91c7\u7528 \u65e0\u2014\u2014\u4e0d\u5199\u4efb\u4f55\u6587\u4ef6\uff08\u542b\u4e34\u65f6\u6587\u4ef6\uff09\uff0c\u4e0d\u8fd0\u884c Git \u5199\u547d\u4ee4\uff1b\u8ba1\u5212\u8f93\u51fa\u5230 stdout <code>projection</code> \u6295\u5f71\u53d7\u7ba1\u751f\u6210\u7269 \u53ea\u5199 manifest \u6388\u6743\u4e14\u88ab\u76ee\u6807\u58f0\u660e\u4e3a\u53d7\u7ba1\u7684\u8def\u5f84\uff1b\u672a\u6388\u6743\u3001\u624b\u5199\u6216\u8d8a\u754c\u8def\u5f84\u4e00\u5f8b\u62d2\u7edd\uff08\u62d2\u7edd\u65f6\u96f6\u5199\u5165\uff09 <code>check</code> \u5951\u7ea6/\u6f02\u79fb/\u95ed\u5305/\u7248\u672c/\u6587\u6863\u4e8b\u5b9e/Git \u524d\u7f6e\u72b6\u6001/\u8bb8\u53ef\u8bc1\u8eab\u4efd\u8bca\u65ad \u65e0\u2014\u2014\u53ea\u8bca\u65ad\u3001\u7edd\u4e0d\u81ea\u52a8\u4fee\u590d\uff1bGit \u4ec5\u53ea\u8bfb\u63a2\u6d4b <p>\u9000\u51fa\u7801\uff1a0 \u6210\u529f\u6216\u65e0\u53d1\u73b0\uff1b1 <code>check</code> \u6709\u53d1\u73b0\uff1b2 \u62d2\u7edd\u3001\u7528\u6cd5\u6216\u673a\u5236\u9519\u8bef\u3002\u6bcf\u6b21\u62d2\u7edd\u90fd\u6253\u5370\u5df2\u6ce8\u518c\u7684 SFC \u9519\u8bef\u7801\u548c\u7a33\u5b9a kind\u3002<code>--fix</code>\u3001<code>--apply</code> \u7b49\u53d8\u66f4\u6a21\u5f0f\u6807\u5fd7\u5728\u5165\u53e3\u5904\u88ab\u62d2\u7edd\uff08\u9000\u51fa\u7801 2\uff09\u3002</p>"},{"location":"help/#check-\u7684\u4e03\u4e2a\u8bca\u65ad\u7c7b","title":"check \u7684\u4e03\u4e2a\u8bca\u65ad\u7c7b","text":"<p><code>check</code> \u547d\u4ee4\u6309\u7c7b\u62a5\u544a\u53d1\u73b0\uff0c\u53ef\u7528 <code>--only <class></code> \u5355\u72ec\u8fd0\u884c\u4e00\u7c7b\uff1a</p> \u7c7b \u68c0\u67e5\u5185\u5bb9 <code>contracts</code> \u53d1\u73b0\u7684\u5951\u7ea6\u6587\u6863\u662f\u5426\u901a\u8fc7\u5df2\u767b\u8bb0 Schema \u6821\u9a8c <code>drift</code> managed-file-lock \u6761\u76ee\u4e0e\u78c1\u76d8\u5b9e\u9645\u5b57\u8282\u662f\u5426\u4e00\u81f4 <code>closure</code> \u58f0\u660e\u8f93\u5165/\u8f93\u51fa\u7684\u8d44\u6e90\u95ed\u5305\u662f\u5426\u5b8c\u6574 <code>version</code> \u58f0\u660e\u7684 Contracts \u7248\u672c\u4e0e\u51bb\u7ed3\u7248\u672c\u662f\u5426\u4e00\u81f4 <code>docs</code> \u6587\u6863\u4e8b\u5b9e\uff08README \u5b58\u5728\u6027\u3001\u8eab\u4efd\u4e00\u81f4\u6027\uff09 <code>git</code> \u53ea\u8bfb Git \u524d\u7f6e\u72b6\u6001\uff08\u7edd\u4e0d\u6267\u884c Git \u5199\uff09 <code>identity</code> \u8bb8\u53ef\u8bc1 Profile \u4e0e\u8eab\u4efd\u9632\u6f02\u79fb\uff08\u673a\u5668\u8eab\u4efd\u8bb0\u5f55\u4e3a\u6743\u5a01\uff09"},{"location":"help/#\u6545\u969c\u6392\u67e5","title":"\u6545\u969c\u6392\u67e5","text":"<ul> <li>\u547d\u4ee4\u5931\u8d25\u65f6\u5148\u786e\u8ba4 Node\u3001pnpm \u4e0e\u9501\u6587\u4ef6\u4e00\u81f4\uff08\u89c1 \u5b89\u88c5\u4e0e\u73af\u5883\uff09\uff0c\u518d\u8fd0\u884c <code>pnpm synth</code>\uff1b\u4e0d\u8981\u624b\u6539 projen \u751f\u6210\u6587\u4ef6\u6765\u7ed5\u8fc7\u5931\u8d25\uff1b</li> <li>Git \u5199\u64cd\u4f5c\u7684\u6388\u6743\u8fb9\u754c\u552f\u4e00\u89c1 Git \u751f\u547d\u5468\u671f\u6307\u5357\uff1b\u672a\u83b7\u9488\u5bf9\u5f53\u524d\u4efb\u52a1\u7684\u663e\u5f0f\u6388\u6743\u65f6\u4e0d\u5f97\u6267\u884c\u4efb\u4f55 Git \u5199\u64cd\u4f5c\uff1b</li> <li><code>pnpm check</code> \u5931\u8d25\u4f1a\u6253\u5370\u5177\u4f53\u95e8\u7981\u4e0e\u8def\u5f84\uff1b\u6309\u63d0\u793a\u4fee\u590d\u6839\u56e0\uff0c\u4e0d\u5f97\u4e3a\u8f6c\u7eff\u653e\u5bbd\u68c0\u67e5\u6216\u4fee\u6539\u72ec\u7acb\u9884\u671f\u503c\uff1b</li> <li>\u5e76\u884c\u5f00\u53d1\u65f6\u82e5\u7591\u4f3c\u8d44\u6e90\u62a2\u5360\u5bfc\u81f4\u5076\u53d1\u5931\u8d25\uff0c\u7a0d\u5019\u91cd\u8bd5\u4e00\u6b21\u518d\u4e0b\u7ed3\u8bba\uff1b</li> <li>\u6587\u6863\u7ad9\u70b9\u6784\u5efa\u5931\u8d25\u65f6\u4f18\u5148\u6838\u5bf9 <code>scripts/docs/requirements.txt</code> \u662f\u5426\u4e0e <code>scripts/docs/toolchain.json</code> \u4e00\u81f4\uff08<code>node scripts/docs/fact-check.mjs</code> \u4f1a\u6821\u9a8c\uff09\u3002</li> </ul>"},{"location":"quickstart/","title":"\u5feb\u901f\u5f00\u59cb","text":""},{"location":"quickstart/#\u7b2c\u4e00\u6b21\u672c\u5730\u9a8c\u8bc1","title":"\u7b2c\u4e00\u6b21\u672c\u5730\u9a8c\u8bc1","text":"<pre><code>pnpm install\npnpm synth\npnpm check\n</code></pre> <p><code>pnpm check</code> \u9000\u51fa\u7801 0 \u5373\u7edf\u4e00\u6839\u95e8\u7981\u5168\u90e8\u901a\u8fc7\uff1a\u7a33\u5b9a\u95e8\u7981 ID \u6309\u56fa\u5b9a\u987a\u5e8f\u4e32\u8054\u6267\u884c\u3002\u9010 ID \u6e05\u5355\u4e0e\u4ea7\u54c1\u7ea7\u5f53\u524d\u72b6\u6001\u89c1 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\u3002</p>"},{"location":"quickstart/#\u63a5\u624b\u5f00\u53d1","title":"\u63a5\u624b\u5f00\u53d1","text":"<ol> <li>\u5b8c\u6574\u8bfb\u53d6\u6839\u7ea7 <code>AGENTS.md</code>\uff08\u5de5\u7a0b\u7ea6\u5b9a\uff09\u4e0e Git \u751f\u547d\u5468\u671f\u6307\u5357\uff08Git \u5199\u64cd\u4f5c\u7684\u6388\u6743\u8fb9\u754c\uff09\uff1b</li> <li>\u53ea\u4fee\u6539\u5f53\u524d\u4efb\u52a1\u6388\u6743\u7684\u5199\u96c6\uff0c\u4e0d\u987a\u624b\u4fee\u6539\u65e0\u5173\u6587\u4ef6\uff1b</li> <li>\u8fd0\u884c\u4efb\u52a1\u6307\u5b9a\u7684\u9a8c\u6536\u547d\u4ee4\u548c\u6839 <code>pnpm check</code>\uff0c\u8bb0\u5f55\u9000\u51fa\u7801\uff1b</li> <li>\u6c47\u62a5\u8bc1\u636e\u3001\u5269\u4f59\u98ce\u9669\u548c\u672a\u6267\u884c\u7684\u5916\u90e8\u52a8\u4f5c\uff08commit\u3001push\u3001\u53d1\u5e03\u7b49\u9ed8\u8ba4\u5168\u90e8\u4e0d\u6267\u884c\uff09\u3002</li> </ol> <p>\u4e0d\u8981\u628a\u5f53\u524d\u7684\u79cd\u5b50 JSON \u5f53\u4f5c\u6b63\u5f0f Contracts\uff0c\u4e5f\u4e0d\u8981\u5728\u4e00\u4e2a\u4efb\u52a1\u91cc\u540c\u65f6\u5b9e\u73b0 Contracts\u3001Harness\u3001Kit\u3001\u5ba1\u8ba1\u548c\u8fc1\u79fb\u3002</p>"},{"location":"quickstart/#\u8bd5\u8fd0\u884c-Kit-\u56db\u547d\u4ee4","title":"\u8bd5\u8fd0\u884c Kit \u56db\u547d\u4ee4","text":"<p>\u5b89\u88c5 Kit \u5305\uff08<code>skill-family-engineering-kit</code> \u7684\u53d1\u5e03\u5305\u6216\u672c\u5730\u6253\u5305\u4ea7\u51fa\u7684 tarball\uff09\u540e\uff0c\u7a33\u5b9a\u5165\u53e3\u662f\u8be5\u5305\u767b\u8bb0\u7684 bin\uff08\u6307\u5411 <code>src/cli.mjs</code>\uff09\uff1b\u9ed8\u8ba4\u8bb8\u53ef\u8bc1 Profile \u968f\u5305\u95ed\u5305\u89e3\u6790\uff0c\u65e0\u9700 <code>--profiles-root</code>\uff1a</p> <pre><code># \u5728\u7a7a\u76ee\u5f55\u751f\u6210\u5b8c\u6574\u9879\u76ee\u9aa8\u67b6\uff08\u76ee\u6807\u5fc5\u987b\u4e3a\u7a7a\uff0c\u5199\u5165\u5168\u90e8\u539f\u5b50\u4e14\u53d7\u8def\u5f84\u6536\u5bb9\uff09\nnpx skill-family-engineering-kit scaffold --root ./demo-project --project-id demo-project\n\n# \u5bf9\u9aa8\u67b6\u76ee\u6807\u505a\u8bca\u65ad\uff08\u9000\u51fa\u7801 0 = \u65e0\u53d1\u73b0\uff09\nnpx skill-family-engineering-kit check --root ./demo-project\n\n# \u5bf9\u5b58\u91cf\u4ed3\u505a\u4e25\u683c\u53ea\u8bfb\u7684\u91c7\u7528\u89c4\u5212\uff08\u4e0d\u5199\u4efb\u4f55\u6587\u4ef6\uff0c\u8ba1\u5212\u8f93\u51fa\u5230 stdout\uff09\nnpx skill-family-engineering-kit adopt-plan --root .\n</code></pre> <p>\u672c monorepo \u5185\u4e5f\u53ef\u7b49\u4ef7\u4f7f\u7528 <code>node packages/skill-family-engineering-kit/src/cli.mjs <command></code>\uff1b\u603b\u5e2e\u52a9\uff08\u6070\u597d\u56db\u4e2a\u9876\u5c42\u547d\u4ee4\u53ca\u5404\u81ea\u7684\u526f\u4f5c\u7528\u58f0\u660e\uff09\u7528 <code>--help</code> \u67e5\u770b\u3002</p> <p>\u9000\u51fa\u7801\u7ea6\u5b9a\uff1a0 \u6210\u529f\u6216\u65e0\u53d1\u73b0\uff1b1 <code>check</code> \u6709\u53d1\u73b0\uff1b2 \u62d2\u7edd\u3001\u7528\u6cd5\u6216\u673a\u5236\u9519\u8bef\u3002\u9519\u8bef\u6d88\u606f\u643a\u5e26\u5df2\u6ce8\u518c\u7684 SFC \u9519\u8bef\u7801\u3002\u547d\u4ee4\u526f\u4f5c\u7528\u4e0e\u8bca\u65ad\u5206\u7c7b\u8be6\u89c1 \u80fd\u529b\u4e0e\u8bca\u65ad\u3002</p>"},{"location":"quickstart/#\u6d88\u8d39\u5750\u6807","title":"\u6d88\u8d39\u5750\u6807","text":"<p>\u4e09\u4e2a\u53f6\u5b50\u5305\uff08<code>skill-family-contracts</code>\u3001<code>skill-family-harness-node</code>\u3001<code>skill-family-engineering-kit</code>\uff09\u7ecf npm \u4e0e\u5bf9\u5e94\u7684 public \u53d1\u5e03\u955c\u50cf\u5206\u53d1\u3002\u53d1\u5e03\u955c\u50cf\u4e0d\u627f\u8f7d\u5b8c\u6574\u5f00\u53d1\u5386\u53f2\u4e0e\u6d4b\u8bd5\uff0c\u4e5f\u4e0d\u63a5\u53d7\u76f4\u63a5 PR\uff1b\u9489\u4f4f\u7684\u6d88\u8d39\u5750\u6807\u4e0e\u5f53\u524d\u53d1\u5e03\u72b6\u6001\u552f\u4e00\u8bb0\u5f55\u5728 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\u3002</p>"},{"location":"quickstart/#\u6587\u6863\u81ea\u68c0","title":"\u6587\u6863\u81ea\u68c0","text":"<p>\u4fee\u6539\u6587\u6863\u540e\u8fd0\u884c\uff1a</p> <pre><code>node scripts/docs/fact-check.mjs\nnode scripts/docs/link-check.mjs\n</code></pre> <p>\u4e8b\u5b9e\u68c0\u67e5\u5bf9\u7167\u673a\u5668\u771f\u6e90\uff08manifest\u3001package.json\u3001Contracts \u767b\u8bb0\u3001\u7248\u672c\u9501\u4e0e\u5de5\u4f5c\u6d41\uff09\uff0c\u94fe\u63a5\u68c0\u67e5\u89e3\u6790\u5168\u90e8\u7ad9\u5185\u76f8\u5bf9\u94fe\u63a5\u4e0e\u951a\u70b9\u3002</p>"},{"location":"setup/","title":"\u5b89\u88c5\u4e0e\u73af\u5883","text":""},{"location":"setup/#\u5fc5\u9700\u73af\u5883","title":"\u5fc5\u9700\u73af\u5883","text":"\u5de5\u5177 \u7248\u672c \u9501\u5b9a\u70b9 Node.js 22.22.2\uff08\u9501\u5b9a major 22 \u5e76\u7cbe\u786e\u63d0\u9ad8 floor\uff1a<code>>=22.22.2 <23</code>\uff09 <code>.node-version</code>\uff08\u53d6\u7cbe\u786e floor\uff09\u3001\u6839\u4e0e\u5404\u53f6\u5b50\u5305 <code>package.json</code> \u7684 <code>engines.node</code>\uff1bfloor \u7531 <code>scripts/engine-floor-check.mjs</code> \u4ece\u56fa\u5b9a\u6839 devDependencies \u7684 engines \u5b9e\u65f6\u91cd\u7b97\uff0cfact-check J \u8282\u7ed1\u5b9a\u6587\u6863\u8868\u9762 pnpm 10.30.0 <code>package.json</code> \u7684 <code>packageManager</code> projen 0.101.23 <code>package.json</code> \u7684 <code>devDependencies.projen</code>\uff08\u7cbe\u786e\u7248\u672c\uff0c\u65e0\u8303\u56f4\u7b26\u53f7\uff09 Git \u8fd1\u5e74\u7248\u672c\u5373\u53ef \u4ec5\u5f00\u53d1\u8005\u81ea\u884c\u7ba1\u7406\u7248\u672c\uff1b\u672c\u4ed3\u811a\u672c\u4e0d\u6267\u884c Git \u5199\u64cd\u4f5c <p>\u5de5\u5177\u7248\u672c\u4e0e\u9501\u5b9a\u70b9\u767b\u8bb0\u5728 <code>.foundation/version-lock.json</code>\uff08projen \u751f\u6210\u7684\u673a\u5668\u771f\u6e90\uff0c\u7981\u6b62\u624b\u6539\uff09\u3002\u5347\u7ea7\u6d41\u7a0b\u89c1 <code>scripts/README.md</code>\u3002</p>"},{"location":"setup/#\u5b89\u88c5\u4f9d\u8d56","title":"\u5b89\u88c5\u4f9d\u8d56","text":"<pre><code>pnpm install\n</code></pre> <p><code>.npmrc</code> \u542f\u7528 <code>save-exact=true</code>\uff0c\u65b0\u589e\u4f9d\u8d56\u4e5f\u4f1a\u4ee5\u7cbe\u786e\u7248\u672c\u5199\u5165\u3002</p>"},{"location":"setup/#\u5408\u6210\u4e0e\u68c0\u67e5","title":"\u5408\u6210\u4e0e\u68c0\u67e5","text":"<pre><code>pnpm synth\npnpm check\n</code></pre> <ul> <li><code>pnpm synth</code> \u518d\u751f\u6210 projen \u53d7\u7ba1\u6587\u4ef6\u3002\u53d7\u7ba1\u6587\u4ef6\u53ea\u80fd\u901a\u8fc7\u4fee\u6539 <code>.projenrc.js</code> \u95f4\u63a5\u53d8\u66f4\uff1b\u624b\u5199\u6e90\u7801\u3001\u6587\u6863\u548c fixture \u4e0d\u4f1a\u88ab synth \u8986\u76d6\u3002</li> <li><code>pnpm check</code> \u662f\u5f53\u524d\u7edf\u4e00\u6839\u95e8\u7981\uff1a10 \u4e2a\u7a33\u5b9a\u95e8\u7981 ID \u6309\u56fa\u5b9a\u987a\u5e8f\u4e32\u8054\u6267\u884c\uff0c\u4efb\u4e00\u6b65\u9aa4\u975e 0 \u5373\u6574\u4f53\u5931\u8d25\uff1b\u672c\u4ed3\u6ca1\u6709\u4efb\u4f55 CI/CD workflow\uff0c\u5168\u90e8\u95e8\u7981\u90fd\u5728\u79c1\u6709\u5de5\u4f5c\u533a\u5185\u8fd0\u884c\u3002\u4e0b\u65b9\u533a\u5757\u7531\u6839 <code>package.json</code> \u7684 <code>scripts.check</code> \u673a\u68b0\u6295\u5f71\uff08<code>node scripts/docs/fact-check.mjs</code> \u9010\u5b57\u6838\u5bf9\uff0c\u7981\u6b62\u624b\u5199\u6e05\u5355\u518d\u6b21\u6ede\u540e\uff09\uff1a</li> </ul> <ol> <li>pnpm run check:structure</li> <li>pnpm run check:packages</li> <li>pnpm run check:profiles</li> <li>pnpm run check:public-boundary</li> <li>pnpm run check:scaffold</li> <li>pnpm run check:docs</li> <li>pnpm run check:public-snapshots</li> <li>pnpm run check:release-artifacts</li> <li>pnpm run check:projen</li> <li>pnpm run check:integration</li> </ol> <ul> <li>\u53d1\u5e03\u5b57\u8282\u5408\u540c\u7531\u4e24\u4e2a\u56fa\u5b9a\u5165\u53e3\u627f\u8f7d\uff1a<code>pnpm run release-artifacts:build</code>\uff08\u6784\u5efa\u5019\u9009\u4ea7\u7269\uff09\u4e0e <code>pnpm run release-artifacts:verify</code>\uff08\u6309\u5408\u540c\u6821\u9a8c\uff09\uff0c\u63a5\u53e3\u4e0e\u62d2\u7edd\u77e9\u9635\u8be6\u89c1 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\u3002</li> <li>\u8017\u65f6\u7684 Python \u6587\u6863\u77e9\u9635\u4e0d\u5c5e\u4e8e <code>pnpm check</code>\uff1a\u5b83\u6709\u72ec\u7acb\u5165\u53e3 <code>node scripts/docs/verify-matrix.mjs</code>\uff08\u77e9\u9635\u7248\u672c\u8986\u76d6\u7531\u8be5\u811a\u672c\u5bf9\u7167 <code>scripts/docs/toolchain.json</code> \u673a\u68b0\u6838\u5bf9\uff1b\u672c\u4ed3\u65e0 CI\uff0c\u77e9\u9635\u4e0d\u58f0\u660e\u5728\u4efb\u4f55\u5de5\u4f5c\u6d41\u91cc\uff09\u3002</li> </ul> <p>\u5176\u4f59\u547d\u4ee4\uff1a<code>pnpm test</code>\uff08\u4ec5\u6d4b\u8bd5\uff09\u3001<code>pnpm drift</code>\uff08\u53ea\u8bfb synth \u6f02\u79fb\u68c0\u67e5\uff09\u3001<code>pnpm synth-idempotency</code>(\u5e42\u7b49\u6027\u9a8c\u8bc1)\u3001<code>pnpm fixtures-projen</code>\uff08projen \u53cd\u4f8b fixture\uff09\u3002</p>"},{"location":"setup/#\u6587\u6863\u7ad9\u70b9Material-for-MkDocs","title":"\u6587\u6863\u7ad9\u70b9\uff08Material for MkDocs\uff09","text":"<p>\u6587\u6863\u7ad9\u70b9\u9501\u5b9a mkdocs 1.6.1 \u4e0e Material for MkDocs 9.7.7\u3002\u4f9d\u8d56\u9501\u662f <code>pip-compile --generate-hashes</code> \u751f\u6210\u7684\u5b8c\u6574\u5185\u5bb9\u9501\uff08\u5168\u90e8\u9876\u5c42\u4e0e\u4f20\u9012\u4f9d\u8d56\u90fd\u5e26 SHA-256 hash\uff09\uff0c\u89c1 <code>scripts/docs/requirements.txt</code>\uff08\u4eba\u5de5\u8f93\u5165\u53ea\u6709\u540c\u76ee\u5f55\u7684 <code>requirements.in</code>\uff09\uff1b\u5de5\u5177\u94fe\u771f\u6e90\u89c1 <code>scripts/docs/toolchain.json</code>\u3002Python 3.10 \u6216\u66f4\u9ad8\u5373\u53ef\uff08<code>node scripts/docs/verify-matrix.mjs</code> \u5728\u6700\u4f4e\u7248 3.10 \u4e0e tested 3.14 \u4e0a\u90fd\u4f1a\u7528\u5168\u65b0\u865a\u62df\u73af\u5883\u590d\u73b0\u5b89\u88c5\u4e0e\u4e25\u683c\u6784\u5efa\uff09\u3002</p> <p>\u7ea6\u5b9a\uff1a\u4e0d\u505a\u7cfb\u7edf\u7ea7 pip install\uff0c\u865a\u62df\u73af\u5883\u5fc5\u987b\u5efa\u5728\u4ed3\u5e93\u5916\u90e8\u3002\u539f\u56e0\u662f\u6839 <code>pnpm check</code> \u4f1a\u5bf9\u5168\u4ed3\u505a\u672c\u5730\u7edd\u5bf9\u8def\u5f84\u5b57\u8282\u626b\u63cf\uff08\u89c1 <code>node scripts/check-structure.mjs</code>\uff09\uff0c\u800c macOS/Windows \u4e0a\u7684\u865a\u62df\u73af\u5883\u5185\u90e8\u5d4c\u6709\u672c\u673a\u7edd\u5bf9\u8def\u5f84\uff0c\u653e\u8fdb\u4ed3\u5e93\u4f1a\u9020\u6210\u8bef\u62a5\u3002</p> <p>\u5b89\u88c5\u547d\u4ee4\u7edf\u4e00\u4f7f\u7528 <code>--require-hashes</code>\uff08\u5185\u5bb9\u9501\u8981\u6c42\u9010\u6761\u6821\u9a8c hash\uff09\uff1a</p> <pre><code># \u5728\u4ed3\u5e93\u5916\u90e8\u521b\u5efa\u865a\u62df\u73af\u5883\uff08\u8def\u5f84\u53ef\u6309\u9700\u66ff\u6362\uff0c\u793a\u4f8b\u7528\u7236\u76ee\u5f55\uff09\npython3 -m venv ../docs-site-venv\n\n# \u7528\u54c8\u5e0c\u9501\u5b89\u88c5\u9501\u5b9a\u7248\u672c\uff08\u5b57\u8282\u4e0d\u7b26\u4f1a\u76f4\u63a5\u5931\u8d25\uff09\n../docs-site-venv/bin/pip install --require-hashes -r scripts/docs/requirements.txt\n\n# \u4e25\u683c\u6a21\u5f0f\u6784\u5efa\uff08\u4efb\u4f55\u8b66\u544a\u90fd\u4f1a\u5931\u8d25\uff09\uff0c\u8f93\u51fa\u5230 site/\uff08\u5df2\u88ab .gitignore \u5ffd\u7565\uff09\n../docs-site-venv/bin/mkdocs build --strict\n\n# \u672c\u5730\u9884\u89c8\uff08\u53ef\u9009\uff09\n../docs-site-venv/bin/mkdocs serve\n</code></pre> <p>\u79bb\u7ebf\u73af\u5883\u5b89\u88c5\uff08\u56fa\u5b9a\u6d41\u7a0b\uff09\uff1a\u5728\u7ebf\u673a\u5668\u53ea\u4e0b\u8f7d wheelhouse\uff0c\u79bb\u7ebf\u5b89\u88c5\u5fc5\u987b\u8fdb\u5165\u4e00\u4e2a\u4ece\u672a\u5728\u7ebf\u5b89\u88c5\u8fc7\u7684\u65b0 offline venv\u2014\u2014\u590d\u7528\u5728\u7ebf venv \u65e0\u6cd5\u8bc1\u660e\u79bb\u7ebf\u94fe\u8def\u53ef\u7528\uff1a</p> <pre><code># 1. \u5728\u7ebf\u673a\u5668\uff1a\u4e0b\u8f7d wheelhouse\uff08\u4e0b\u8f7d\u540c\u6837\u9010\u6761\u6821\u9a8c hash\uff1b\u672c\u6b65\u4e0d\u5b89\u88c5\u5230\u4efb\u4f55 venv\uff09\npython3 -m pip download --require-hashes -r scripts/docs/requirements.txt -d ./docs-wheels\n\n# 2. \u79bb\u7ebf\u673a\u5668\uff1a\u65b0\u5efa\u4e00\u4e2a\u4ece\u672a\u5728\u7ebf\u5b89\u88c5\u8fc7\u7684 offline venv\uff08\u8def\u5f84\u53ef\u6309\u9700\u66ff\u6362\uff0c\u4e0d\u5f97\u590d\u7528 ../docs-site-venv\uff09\npython3 -m venv ../docs-site-offline-venv\n\n# 3. \u5b8c\u5168\u79bb\u7ebf\u5b89\u88c5\uff1a\u4e0d\u8bbf\u95ee\u4efb\u4f55\u7d22\u5f15\uff0c\u53ea\u4ece wheelhouse \u89e3\u6790\uff0c\u7ee7\u7eed\u9010\u6761\u6821\u9a8c hash\uff08\u5b57\u8282\u4e0d\u7b26\u76f4\u63a5\u5931\u8d25\uff09\n../docs-site-offline-venv/bin/pip install --no-index --find-links ./docs-wheels --require-hashes -r scripts/docs/requirements.txt\n\n# 4. \u4e25\u683c\u6a21\u5f0f\u6784\u5efa\uff08\u4efb\u4f55\u8b66\u544a\u90fd\u4f1a\u5931\u8d25\uff09\n../docs-site-offline-venv/bin/mkdocs build --strict\n</code></pre>"},{"location":"setup/#\u516c\u5f00\u9759\u6001\u7ad9render-public-sitemjs","title":"\u516c\u5f00\u9759\u6001\u7ad9\uff08render-public-site.mjs\uff09","text":"<p>\u516c\u5f00\u9759\u6001\u7ad9\u662f\u672c\u4ed3\u6587\u6863\u7ad9\u7684\u516c\u5f00\u5b50\u96c6\uff0c\u552f\u4e00\u7531 <code>scripts/render-public-site.mjs</code> \u7528\u4e0a\u8ff0\u51bb\u7ed3 MkDocs \u73af\u5883\u6e32\u67d3\uff1a</p> <ul> <li>\u811a\u672c\u53ea\u53d1\u73b0\u5e76\u6821\u9a8c\u51bb\u7ed3\u865a\u62df\u73af\u5883\uff08<code>SKILL_FAMILY_DOCS_VENV</code>\uff0c\u6216\u6309\u672c\u8282\u6b65\u9aa4\u5efa\u7684 <code>../docs-site-venv</code> / <code>../docs-site-offline-venv</code>\uff09\uff0c\u81ea\u8eab\u4e0d\u505a\u4efb\u4f55\u5b89\u88c5\uff1b</li> <li>\u6267\u884c\u4e24\u6b21 strict \u6784\u5efa\u5e76\u8981\u6c42\u6811\u54c8\u5e0c\u4e00\u81f4\uff08\u786e\u5b9a\u6027\uff09\uff0c\u968f\u540e\u590d\u7528 <code>scripts/leak-scan.mjs</code> \u6838\u5fc3\u4e0e <code>scripts/leak-policy.json</code> \u505a\u5185\u5bb9\u6cc4\u6f0f\u626b\u63cf\uff1b</li> <li><code>--write</code> \u53ea\u5199 <code>docs/public/site/**</code> \u4e0e <code>docs/public/site-baseline.json</code>\uff1b<code>--check</code> \u96f6\u5199\u5165\u91cd\u7b97\u5e76\u6bd4\u5bf9\u57fa\u7ebf\uff1b<code>--self-test</code> \u8fd0\u884c\u4e3b\u52a8\u53cd\u4f8b\u81ea\u6d4b\uff1b</li> <li>symlink\u3001\u7279\u6b8a\u6587\u4ef6\u3001\u8d8a\u754c realpath\u3001\u5355\u6587\u4ef6\u8d85\u9650\u4e0e\u4e0d\u786e\u5b9a\u8f93\u51fa\u4e00\u5f8b\u62d2\u7edd\uff1b\u57fa\u7ebf\u7981\u6b62\u624b\u6539\uff08\u6e32\u67d3\u5668\u662f\u552f\u4e00\u5199\u5165\u9762\uff09\u3002</li> </ul> <pre><code>node scripts/render-public-site.mjs --write\nnode scripts/render-public-site.mjs --check\n</code></pre> <p>\u7ad9\u70b9\u6587\u4ef6\u4e0e engineering-kit public \u53d1\u5e03\u955c\u50cf\u4ed3\u7684 <code>docs/**</code> \u9010\u6587\u4ef6\u5bf9\u5e94\uff08\u6620\u5c04\u7531\u53d1\u5e03\u914d\u7f6e\u6267\u884c\uff0c\u672c\u4ed3\u4e0d\u76f4\u63a5\u5199\u955c\u50cf\uff09\uff1bPages \u5b9e\u4f8b\u662f\u5426\u5728\u7ebf\u662f\u53d1\u5e03\u540e\u9a8c\u8bc1\u4e8b\u5b9e\uff0c\u53e3\u5f84\u552f\u4e00\u89c1 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\u3002</p>"},{"location":"setup/#\u6587\u6863\u4e8b\u5b9e\u4e0e\u94fe\u63a5\u68c0\u67e5","title":"\u6587\u6863\u4e8b\u5b9e\u4e0e\u94fe\u63a5\u68c0\u67e5","text":"<p>\u6587\u6863\u4e2d\u7684\u7248\u672c\u3001\u547d\u4ee4\u3001\u5305\u6570\u4e0e\u95e8\u7981\u4e8b\u5b9e\u7531\u786e\u5b9a\u6027\u811a\u672c\u5bf9\u7167\u673a\u5668\u771f\u6e90\u6821\u9a8c\uff0c\u94fe\u63a5\u7531\u72ec\u7acb\u811a\u672c\u89e3\u6790\uff1a</p> <pre><code>node scripts/docs/fact-check.mjs\nnode scripts/docs/link-check.mjs\n</code></pre> <p><code>fact-check.mjs</code> \u662f Node \u811a\u672c\uff0c\u7ecf\u4ed3\u5185\u6a21\u5757\uff08<code>scripts/engine-floor-check.mjs</code>\uff09\u6d88\u8d39\u6839\u76ee\u5f55\u7cbe\u786e\u9501\u5b9a\u7684 <code>semver@7.8.5</code>\uff0c\u8fd0\u884c\u524d\u5fc5\u987b\u5148\u5b8c\u6210 <code>pnpm install --frozen-lockfile</code>\uff1b<code>link-check.mjs</code> \u4e3a\u7eaf Node \u5b9e\u73b0\uff08\u65e0\u7b2c\u4e09\u65b9\u4f9d\u8d56\uff09\u3002\u4e24\u8005\u9000\u51fa\u7801 0 \u8868\u793a\u901a\u8fc7\u3002\u811a\u672c\u804c\u8d23\u89c1 <code>scripts/docs/README.md</code>\u3002</p>"},{"location":"integration/audit/","title":"\u72ec\u7acb\u5ba1\u8ba1\u96c6\u6210\uff08FND-060\uff09","text":"<p>\u672c\u76ee\u5f55\u662f\u72ec\u7acb\u5ba1\u8ba1\uff08Audit\uff09\u6d88\u8d39\u5df2\u53d1\u5e03 Contracts \u7684\u6700\u5c0f\u96c6\u6210\u9762\u3002\u5ba1\u8ba1\u7684\u804c\u8d23\u662f\uff1a\u4ee5\u72ec\u7acb\u4e8e\u751f\u6210\u5668\u4e0e oracle \u7684 fixture\u3001\u9884\u671f\u503c\u548c\u88c1\u51b3\uff0c\u9a8c\u8bc1\u88ab\u6d88\u8d39\u7684 <code>skill-family-contracts</code> \u5305\u6ca1\u6709\u88ab\u7be1\u6539\u3001\u524a\u5f31\u6216\u6f0f\u68c0\u3002</p>"},{"location":"integration/audit/#\u6743\u5a01\u8fb9\u754c","title":"\u6743\u5a01\u8fb9\u754c","text":"<ul> <li>\u5ba1\u8ba1\u53ea\u6d88\u8d39 Contracts \u7684\u516c\u5f00\u63a5\u53e3\uff08<code>describeAuditSurface</code>\u3001<code>validateDocument</code>\u3001<code>checkOperation</code>\u3001<code>findProtocol</code>\u3001<code>isRegisteredErrorCode</code>\u3001<code>digestDocument</code> \u7b49\uff09\uff0c\u4f9d\u8d56\u65b9\u5411\u6052\u4e3a Audit \u2192 Contracts\uff1b</li> <li>\u5ba1\u8ba1\u4e0d\u4f9d\u8d56 engineering-kit\uff0c\u4e5f\u4e0d\u4f9d\u8d56 harness\uff08\u89c1 independence.md \u7684\u673a\u68b0\u8bc1\u660e\uff09\uff1b</li> <li>Contracts \u4e0d\u53cd\u5411\u4f9d\u8d56\u5ba1\u8ba1\uff1aContracts \u4fa7\u53ea\u65b0\u589e\u4e86\u53ea\u8bfb\u6295\u5f71\u6a21\u5757 <code>src/audit-surface.mjs</code>\uff0c\u4e0d\u63a5\u53d7\u4efb\u4f55\u56de\u8c03\u3001\u6ce8\u518c\u6216\u5ba1\u8ba1\u4fa7\u8f93\u5165\uff1b</li> <li>\u5ba1\u8ba1 fixture\u3001\u9884\u671f\u4e0e\u88c1\u51b3\u5168\u90e8\u7531\u4ea7\u54c1\u4fa7\u7ef4\u62a4\uff08\u5939\u5177 provenance <code>product-fixture</code>\uff0cpin provenance <code>product-compatibility-fixture</code>\uff09\uff0c\u4e0d\u590d\u7528\u751f\u6210\u5668\u81ea\u6d4b\u9884\u671f\u8868\uff0c\u4e5f\u4e0d\u8bfb\u53d6 oracle \u5224\u636e\uff08\u8be5\u9694\u79bb\u7531 independence.md \u7684\u673a\u68b0\u8bc1\u660e\u5f3a\u5236\uff09\u3002</li> </ul>"},{"location":"integration/audit/#\u76ee\u5f55\u7ed3\u6784","title":"\u76ee\u5f55\u7ed3\u6784","text":"<pre><code>docs/integration/audit/\n README.md \u672c\u6587\u4ef6\n mutation-taxonomy.md \u4e94\u7c7b\u53d8\u5f02\u5206\u7c7b\u5b66\uff08\u51bb\u7ed3\uff09\n failure-evidence.md \u5931\u8d25\u8bc1\u636e\u683c\u5f0f\u4e0e AUD \u7801\u767b\u8bb0\u8868\n version-compatibility.md \u7248\u672c\u517c\u5bb9\u5b9a\u4e49\n isolation-and-lockfile.md \u9694\u79bb\u5b89\u88c5\u4e0e\u5305\u9501\u9a8c\u8bc1\u8bbe\u8ba1\n independence.md \u72ec\u7acb\u6027\u58f0\u660e\u4e0e\u673a\u68b0\u8bc1\u660e\n schemas/audit-evidence.schema.json \u8bc1\u636e\u6587\u6863\u7684 JSON Schema\uff08\u5ba1\u8ba1\u81ea\u6709\uff09\n baseline/contracts-1.1.1.pin.json Contracts 1.1.1 \u73b0\u884c\u57fa\u7ebf pin\uff08\u6458\u8981+\u4e8b\u5b9e\uff09\n baseline/contracts-1.1.0.pin.json Contracts 1.1.0 \u53ea\u8bfb\u517c\u5bb9\u5b58\u6863 pin\n baseline/contracts-1.0.0.pin.json Contracts 1.0.0 \u53ea\u8bfb\u517c\u5bb9\u5b58\u6863 pin\n baseline/audit-codes.json AUD \u7801\u767b\u8bb0\u8868\uff08append-only\uff09\n fixtures/{structure,semantics,digest,omission,engine}/ 18 \u4e2a\u53d8\u5f02 fixture\n runner/ \u5ba1\u8ba1\u8fd0\u884c\u5668\uff08\u53ea\u8bfb\uff0c\u8bc1\u636e\u8f93\u51fa\u5230 stdout\uff09\n</code></pre>"},{"location":"integration/audit/#\u8fd0\u884c","title":"\u8fd0\u884c","text":"<pre><code># \u5b8c\u6574\u7ba1\u7ebf\uff1a\u72ec\u7acb\u6027\u8bc1\u660e \u2192 \u5305\u9501\u9a8c\u8bc1 \u2192 \u53d8\u5f02\u91cd\u653e \u2192 \u6f0f\u62a5\u8d1f\u4f8b\u81ea\u68c0\nnode docs/integration/audit/runner/run-all.mjs\n\n# \u5206\u6b65\u8fd0\u884c\nnode docs/integration/audit/runner/proof-independence.mjs # \u72ec\u7acb\u6027\u673a\u68b0\u8bc1\u660e\nnode docs/integration/audit/runner/verify-lock.mjs # \u6d88\u8d39\u5305 pin/\u9501\u9a8c\u8bc1\nnode docs/integration/audit/runner/run-audit.mjs # \u53d8\u5f02\u91cd\u653e + \u8bc1\u636e\nnode docs/integration/audit/runner/selftest-negative.mjs # \u6f0f\u62a5\u8d1f\u4f8b\u63a7\u5236\n</code></pre> <p>\u9000\u51fa\u7801\u7ea6\u5b9a\uff1a<code>0</code> \u901a\u8fc7\uff1b<code>1</code> \u6709\u53d1\u73b0\uff08verdict fail\uff09\uff1b<code>2</code> \u7528\u6cd5\u6216\u673a\u5236\u9519\u8bef\u3002\u6240\u6709\u62a5\u544a\u4ee5 JSON \u8f93\u51fa\u5230 stdout\uff0c\u8fd0\u884c\u5668\u5bf9\u4ed3\u5e93\u96f6\u5199\u5165\u3002</p>"},{"location":"integration/audit/#\u88c1\u51b3\u89c4\u5219","title":"\u88c1\u51b3\u89c4\u5219","text":"<ul> <li>\u4e94\u7c7b\u53d8\u5f02\uff08\u7ed3\u6784\u3001\u8bed\u4e49\u3001\u6458\u8981\u3001\u9057\u6f0f\u3001\u68c0\u67e5\u5f15\u64ce\u88ab\u524a\u5f31\uff09\u6bcf\u7c7b\u81f3\u5c11 3 \u4e2a fixture\uff0c\u4e14\u81f3\u5c11\u68c0\u51fa 1 \u4e2a\uff1b</li> <li>\u4efb\u4e00\u7c7b\u6f0f\u62a5\u5373\u5931\u8d25\uff1a\u8986\u76d6\u95e8\uff08AUD-MISS-001\uff09\u673a\u68b0\u5f3a\u5236\uff0c\u6f0f\u62a5\u7c7b\u7684\u5b58\u5728\u4f7f\u6574\u4f53 verdict \u5fc5\u4e3a fail\uff1b</li> <li>\u4efb\u4e00 fixture \u672a\u88ab\u5982\u9884\u671f\u68c0\u51fa\u3001\u57fa\u7ebf pin \u6f02\u79fb\u3001fixture \u4fe1\u5c01\u4e0d\u5408\u6cd5\uff0c\u90fd\u4ea7\u751f mandatory \u7ea7\u53d1\u73b0\u5e76\u4f7f verdict fail\u3002</li> </ul>"},{"location":"integration/audit/failure-evidence/","title":"\u5931\u8d25\u8bc1\u636e\u683c\u5f0f\u4e0e AUD \u7801\u767b\u8bb0\u8868","text":"<p>\u5ba1\u8ba1\u53d1\u73b0\u5fc5\u987b\u4ee5\u673a\u5668\u53ef\u8bfb\u7684\u8bc1\u636e\u6587\u6863\u8bb0\u5f55\u3002\u8bc1\u636e\u6587\u6863\u7531 <code>runner/run-audit.mjs</code> \u8f93\u51fa\u5230 stdout\uff0c\u683c\u5f0f\u7531 schemas/audit-evidence.schema.json \u51bb\u7ed3\uff0c\u5e76\u901a\u8fc7\u88ab\u6d88\u8d39 Contracts \u7684 <code>validateDocument</code>\uff082020-12 \u65b9\u8a00\u3001strict \u7b56\u7565\uff09\u81ea\u6821\u9a8c\u2014\u2014\u8bc1\u636e\u6587\u6863\u672c\u8eab\u4e0d\u5408\u683c\u662f\u673a\u5236\u9519\u8bef\uff08\u9000\u51fa\u7801 2\uff09\u3002</p>"},{"location":"integration/audit/failure-evidence/#\u8bc1\u636e\u6587\u6863\u5f62\u72b6","title":"\u8bc1\u636e\u6587\u6863\u5f62\u72b6","text":"<pre><code>{\n \"schemaVersion\": 1,\n \"kind\": \"skill-family.audit.evidence\",\n \"auditId\": \"fnd-060-independent-audit\",\n \"generatedAt\": \"RFC 3339 date-time\",\n \"consumer\": {\n \"contractsVersion\": \"1.0.0\",\n \"auditSurfaceVersion\": 1,\n \"surfaceDigest\": { \"algorithm\": \"sha256\", \"value\": \"64 \u4f4d\u5341\u516d\u8fdb\u5236\" }\n },\n \"verdict\": \"pass | fail\",\n \"classCoverage\": {\n \"<class>\": { \"fixtures\": 0, \"detected\": 0, \"required\": 3, \"satisfied\": false }\n },\n \"fixtureResults\": [\n { \"fixtureId\": \"AUD-M1-01\", \"mutationClass\": \"structure\", \"expectedAuditCode\": \"AUD-M1-STRUCT\", \"detected\": true, \"observed\": {} }\n ],\n \"findings\": [\n {\n \"findingId\": \"F-0001\",\n \"auditCode\": \"AUD-BASE-001\",\n \"severity\": \"mandatory\",\n \"mutationClass\": null,\n \"fixtureId\": null,\n \"detected\": true,\n \"summary\": \"\u4eba\u7c7b\u53ef\u8bfb\u6458\u8981\",\n \"details\": {}\n }\n ]\n}\n</code></pre> <p>\u8981\u70b9\uff1a</p> <ul> <li><code>consumer</code> \u7528\u7248\u672c\u5750\u6807 + surface \u6458\u8981\u9489\u6b7b\u88ab\u6d88\u8d39\u7684 Contracts \u5305\uff0c\u8bc1\u636e\u56e0\u6b64\u53ef\u56de\u6eaf\u5230\u7cbe\u786e\u5b57\u8282\uff1b</li> <li><code>fixtureResults</code> \u662f\u5168\u90e8 fixture \u7684\u91cd\u653e\u8bb0\u5f55\uff08\u542b\u901a\u8fc7\u9879\uff09\uff0c<code>findings</code> \u53ea\u6536\u8fdd\u89c4\u9879\uff1b</li> <li>v1 \u51bb\u7ed3\u5355\u4e00\u4e25\u91cd\u7ea7 <code>mandatory</code>\uff1a\u4efb\u4f55\u53d1\u73b0\u90fd\u4f7f <code>verdict</code> \u4e3a <code>fail</code>\uff1b</li> <li><code>classCoverage</code> \u4e94\u7c7b\u9f50\u5168\uff1b<code>satisfied = fixtures \u2265 3 \u4e14 detected \u2265 1</code>\u3002</li> </ul>"},{"location":"integration/audit/failure-evidence/#\u88c1\u51b3\u89c4\u5219","title":"\u88c1\u51b3\u89c4\u5219","text":"<ol> <li><code>findings</code> \u4e3a\u7a7a \u2192 <code>verdict = pass</code>\uff0c\u9000\u51fa\u7801 0\uff1b</li> <li>\u4efb\u4e00\u53d1\u73b0\u5b58\u5728 \u2192 <code>verdict = fail</code>\uff0c\u9000\u51fa\u7801 1\uff1b</li> <li>\u7528\u6cd5\u6216\u673a\u5236\u9519\u8bef\uff08\u542b\u8bc1\u636e\u81ea\u6821\u9a8c\u5931\u8d25\uff09\u2192 \u9000\u51fa\u7801 2\uff0c\u4e0d\u4ea7\u751f\u8bc1\u636e\u6216\u4ea7\u751f\u4f5c\u5e9f\u8bc1\u636e\uff1b</li> <li>\u6f0f\u62a5\u5f8b\uff1a\u4efb\u4e00\u7c7b <code>satisfied = false</code> \u5fc5\u987b\u4ea7\u751f AUD-MISS-001 \u53d1\u73b0\uff0c\u6574\u4f53 verdict \u5fc5\u4e3a fail\u3002</li> </ol>"},{"location":"integration/audit/failure-evidence/#AUD-\u7801\u767b\u8bb0\u8868append-only","title":"AUD \u7801\u767b\u8bb0\u8868\uff08append-only\uff09","text":"<p>\u5ba1\u8ba1\u7801\u5c5e\u4e8e\u5ba1\u8ba1\u81ea\u6709\u547d\u540d\u7a7a\u95f4 <code>AUD-</code>\uff0c\u4e0d\u8fdb\u5165 Contracts \u7684 SFC \u767b\u8bb0\uff1b\u5ba1\u8ba1\u5bf9 SFC \u7801\u53ea\u8bfb\u6d88\u8d39\u3002\u673a\u5668\u53ef\u8bfb\u526f\u672c\u89c1 baseline/audit-codes.json\u3002</p> \u7801 \u540d\u79f0 \u542b\u4e49 AUD-M1-STRUCT STRUCTURE_MUTATION_DETECTED \u7ed3\u6784\u7c7b\u53d8\u5f02\u88ab\u68c0\u51fa\uff08\u89c2\u5bdf\u7801\u7b49\u4e8e\u9884\u671f\u7a33\u5b9a\u7801\uff09 AUD-M2-SEM SEMANTIC_MUTATION_DETECTED \u8bed\u4e49\u7c7b\u53d8\u5f02\u88ab\u68c0\u51fa AUD-M3-DIGEST DIGEST_MISMATCH_DETECTED \u6458\u8981\u7c7b\u53d8\u5f02\u88ab\u68c0\u51fa\uff08\u89c4\u8303\u5316\u6458\u8981\u4e0e pin \u4e0d\u4e00\u81f4\uff09 AUD-M4-OMIT OMISSION_DETECTED \u9057\u6f0f\u7c7b\u53d8\u5f02\u88ab\u68c0\u51fa\uff08\u7f3a\u5931\u6e05\u5355\u4e0e\u9884\u671f\u4e00\u81f4\uff09 AUD-M5-ENGINE ENGINE_WEAKENING_DETECTED \u5f15\u64ce\u524a\u5f31\u7c7b\u53d8\u5f02\u88ab\u68c0\u51fa\uff08\u88ab\u524a\u5f31\u5b57\u6bb5\u4e0e\u9884\u671f\u4e00\u81f4\uff09 AUD-MISS-001 MUTATION_CLASS_MISSED \u67d0\u7c7b fixture \u6570\u4f4e\u4e8e\u51bb\u7ed3\u4e0b\u9650\u6216\u96f6\u68c0\u51fa\uff1b\u6f0f\u62a5\u5373\u6574\u4f53\u5931\u8d25 AUD-BASE-001 BASELINE_DRIFT \u6d88\u8d39\u7684 Contracts \u6d3b\u8dc3 surface \u4e0e\u51bb\u7ed3\u57fa\u7ebf pin \u4e0d\u4e00\u81f4 AUD-FMT-001 EVIDENCE_OR_FIXTURE_FORMAT_INVALID fixture \u4fe1\u5c01\u6216\u8bc1\u636e\u6587\u6863\u683c\u5f0f\u975e\u6cd5 AUD-LOCK-001 LOCK_VERIFICATION_FAILED \u6d88\u8d39\u5305\u7684\u8eab\u4efd\u3001\u4f9d\u8d56\u95ed\u5305\u6216 pin \u5bf9\u6bd4\u5931\u8d25 AUD-IND-001 INDEPENDENCE_VIOLATION \u5ba1\u8ba1\u8bfb\u53d6\u6216\u5bfc\u5165\u8d8a\u51fa\u5141\u8bb8\u96c6\u5408 <p>\u767b\u8bb0\u7eaa\u5f8b\uff1a\u7801\u53ea\u589e\u4e0d\u6539\u4e0d\u590d\u7528\uff1b\u65b0\u589e\u7801\u5fc5\u987b\u540c\u6b65\u66f4\u65b0\u672c\u8868\u4e0e <code>baseline/audit-codes.json</code>\uff0c\u4e14\u4e0d\u5f97\u4e0e SFC \u547d\u540d\u7a7a\u95f4\u4ea7\u751f\u4efb\u4f55\u4ea4\u53c9\u62e5\u6709\u3002</p>"},{"location":"integration/audit/independence/","title":"\u72ec\u7acb\u6027\u58f0\u660e\u4e0e\u673a\u68b0\u8bc1\u660e","text":"<p>FND-060 \u7684\u9a8c\u6536\u8981\u6c42\uff1a\u5ba1\u8ba1 fixture\u3001\u9884\u671f\u503c\u548c\u88c1\u51b3\u4e0d\u6765\u81ea\u751f\u6210\u5668\uff1bAudit \u4e0d\u4f9d\u8d56 Kit\u3002\u672c\u9875\u7684\u73b0\u884c\u4e8b\u5b9e\u662f\uff1a\u672c\u4ed3\u5e93\u4e0d\u5b58\u5728\u72ec\u7acb\u7684\u7b2c\u4e8c\u5ba1\u9605\u4f1a\u8bdd\uff0c\u5ba1\u8ba1\u6811\u662f\u4ea7\u54c1\u4fa7\u7684\u673a\u68b0\u9a8c\u8bc1\u8bbe\u65bd\u3002\u673a\u68b0\u8bc1\u660e\u80fd\u591f\u8bc1\u660e\u7684\u662f\u4ea7\u54c1\u4fa7\u8f93\u5165\u9694\u79bb\u4e0e\u517c\u5bb9\u6027\uff0c\u4e0d\u8bc1\u660e\u4f5c\u8005\u3001\u6a21\u578b\u6216\u8ba4\u77e5\u72ec\u7acb\uff1b\u5916\u90e8\u6700\u7ec8\u63a5\u53d7\u7531\u4ed3\u5916\u72ec\u7acb\u590d\u5ba1\u627f\u62c5\u3002</p>"},{"location":"integration/audit/independence/#provenance-\u73b0\u884c\u4e8b\u5b9e","title":"provenance \u73b0\u884c\u4e8b\u5b9e","text":"<ul> <li>\u5168\u90e8 18 \u4e2a\u53d8\u5f02 fixture \u7684 provenance \u4e3a <code>product-fixture</code>\uff1a\u4ea7\u54c1\u4fa7\u7ef4\u62a4\u7684\u6d4b\u8bd5\u8bed\u6599\u3002\u9884\u671f\u7531\u4ea7\u54c1\u4fa7\u5bf9\u7167\u5408\u540c\u6587\u6863\u63a8\u5bfc\uff08schema \u7ea6\u675f required/pattern/additionalProperties\u3001\u767b\u8bb0\u8868\u6210\u5458\u8d44\u683c\u3001kernel \u8bcd\u8868\u4e0e params \u5951\u7ea6\u3001\u9519\u8bef\u7801 append-only \u8bed\u4e49\uff09\uff0c\u4e0d\u590d\u7528\u751f\u6210\u5668\u81ea\u6d4b\u9884\u671f\u8868\uff0c\u4e0d\u8bfb\u53d6 oracle \u5224\u636e\uff1b\u8fd9\u4e00\u8f93\u5165\u9694\u79bb\u7531\u4e0b\u65b9 P4/P5/P6 \u673a\u68b0\u5f3a\u5236\u3002</li> <li>\u57fa\u7ebf pin \u7684 provenance \u4e3a <code>product-compatibility-fixture</code>\uff1a\u4ea7\u54c1\u4fa7\u7ef4\u62a4\u7684\u517c\u5bb9\u57fa\u7ebf\u3002\u6458\u8981\u6765\u81ea\u5bf9\u5df2\u51bb\u7ed3\u4ea7\u7269\u7684 <code>digestAuditSurface()</code> \u673a\u68b0\u8ba1\u7b97\uff0c\u4e8b\u5b9e\u6e05\u5355\u76f4\u63a5\u5bf9\u7167\u5408\u540c\u6587\u6863\u63a8\u5bfc\u3002</li> <li>\u5b83\u4eec\u8bc1\u660e\u4ea7\u54c1\u4fa7\u8f93\u5165\u9694\u79bb\u548c\u517c\u5bb9\u6027\uff0c\u4e0d\u8bc1\u660e\u4f5c\u8005\u3001\u6a21\u578b\u6216\u8ba4\u77e5\u72ec\u7acb\u3002fixture \u4e0e pin \u80cc\u540e\u7684\u4f5c\u8005\u3001\u6a21\u578b\u6216\u8ba4\u77e5\u8fc7\u7a0b\u662f\u5426\u72ec\u7acb\u4e8e\u5176\u4ed6\u9879\u76ee\u53c2\u4e0e\u8005\uff0c\u4e0d\u662f\u4ed3\u5185\u673a\u68b0\u68c0\u67e5\u53ef\u4ee5\u8bc1\u660e\u7684\u5bf9\u8c61\u3002</li> <li>\u5916\u90e8\u6700\u7ec8\u63a5\u53d7\uff1a\u5b9e\u73b0\u8005\u81ea\u6d4b\u4e0e\u672c\u9875\u673a\u68b0\u8bc1\u660e\u90fd\u53ea\u5f62\u6210\u5f85\u5ba1\u8bc1\u636e\uff0c\u6700\u7ec8\u63a5\u53d7\u7531\u4ed3\u5916\u72ec\u7acb\u590d\u5ba1\u627f\u62c5\u3002</li> <li>\u8bda\u5b9e\u6027\u7ea0\u9519\uff1a\u65e7 fixture \u4e0e pin \u66fe\u643a\u5e26 <code>independent-r2</code> provenance \u548c\u72ec\u7acb\u4f5c\u8005\u53d9\u4e8b\uff08\u542b\u4f5c\u8005\u9605\u8bfb\u53f2\u58f0\u660e\uff09\uff0c\u4e0e\u672c\u4ed3\u4e8b\u5b9e\u4e0d\u7b26\uff1bprovenance \u5df2\u4fee\u6b63\u4e3a\u4e0a\u8ff0\u5982\u5b9e\u8bcd\u6c47\uff0c\u672c\u9875\u968f\u4e4b\u91cd\u5199\u3002\u7ea0\u9519\u53ea\u89e6\u53ca provenance\u3001note \u4e0e\u6587\u6848\u7b49\u8bda\u5b9e\u6027\u5b57\u6bb5\uff0c\u4e0d\u6539\u53d8\u4efb\u4f55 digest\u3001facts\u3001fixture \u5185\u5bb9\u6216\u673a\u68b0\u8bc1\u660e\u884c\u4e3a\u3002</li> </ul>"},{"location":"integration/audit/independence/#\u673a\u68b0\u8bc1\u660e\u5165\u53e3","title":"\u673a\u68b0\u8bc1\u660e\u5165\u53e3","text":"<pre><code>node docs/integration/audit/runner/proof-independence.mjs\n</code></pre> <p>\u8bc1\u660e\u68c0\u67e5\u4e0e\u7ed3\u8bba\uff1a</p> \u68c0\u67e5 \u7ed3\u8bba P0-modules \u6536\u96c6\u5230\u5168\u90e8\u5ba1\u8ba1\u6a21\u5757\uff08\u8bc1\u660e\u8303\u56f4\u5b8c\u5907\uff09 P1-imports \u5168\u90e8 import \u53ea\u5141\u8bb8 <code>node:</code> \u5185\u5efa\u4e0e\u76f8\u5bf9\u8def\u5f84\uff0c\u4e14\u76f8\u5bf9\u8bf4\u660e\u7b26\u7684\u89e3\u6790\u57df\u88ab\u9650\u5236\u5728\u5ba1\u8ba1\u6811\u6216 contracts \u5305\u5185\uff08\u675c\u7edd\u76f8\u5bf9\u8def\u5f84\u7ed5\u5230\u751f\u6210\u5668/oracle \u6a21\u5757\uff09\uff1b\u7981\u6b62 engineering-kit / harness / \u7b2c\u4e09\u65b9\u5305 \u2192 Audit \u4e0d\u4f9d\u8d56 Kit P2-contracts-site Contracts \u53ea\u5728\u552f\u4e00\u58f0\u660e\u70b9\uff08<code>lib/contracts-client.mjs</code>\uff09\u88ab\u5bfc\u5165 P3-chokepoint \u6587\u4ef6\u8bfb\u53d6\u53ea\u7ecf\u8fc7\u4e24\u4e2a\u58f0\u660e\u8bfb\u53d6\u70b9\uff1a<code>lib/guard.mjs</code>\uff08\u5ba1\u8ba1\u6811\u5185\uff0c\u88c1\u51b3\u8f93\u5165\uff09\u4e0e <code>lib/consumed-package.mjs</code>\uff08\u88ab\u6d88\u8d39\u5305\u6839\u5185\uff0c\u9501\u9a8c\u8bc1\uff09\uff1b\u53ea\u8bfb API\uff1b\u5168\u6811\u65e0\u4efb\u4f55\u5199 API P4-refusal \u73b0\u573a\u62d2\u8bfb\u6f14\u793a\uff1a\u5bf9\u751f\u6210\u5668\u81ea\u6d4b\u8fd0\u884c\u5668\u3001oracle \u5224\u636e\u3001oracle \u8fd0\u884c\u5668\u3001fixture README\u3001profiles\u3001kit \u5165\u53e3\u3001harness \u5165\u53e3\u9010\u4e00\u5c1d\u8bd5\u8bfb\u53d6\uff0c\u5168\u90e8\u88ab guard \u4ee5 AUD-IND-001 \u62d2\u7edd P5-provenance \u5168\u90e8\u53d8\u5f02 fixture \u7684 provenance \u4e3a <code>product-fixture</code>\uff0c\u57fa\u7ebf pin \u7684 provenance \u5728\u58f0\u660e\u8bcd\u6c47\u8868\u5185\uff08\u5f53\u524d\u552f\u4e00\u6210\u5458 <code>product-compatibility-fixture</code>\uff09\uff1b\u4efb\u4f55\u6cbf\u7528\u65e7\u72ec\u7acb\u89d2\u8272 provenance \u8bcd\u6c47\u7684\u5de5\u4ef6\u90fd\u4f1a\u88ab\u5224\u8fdd\u89c4 P6-literals \u9664\u8bc1\u660e\u811a\u672c\u81ea\u8eab\uff08\u62d2\u8bfb\u6f14\u793a\u8005\uff0c\u53d7 P4 \u7ea6\u675f\uff09\u5916\uff0c\u4efb\u4f55\u5ba1\u8ba1\u6a21\u5757\u7684\u5b57\u7b26\u4e32\u5b57\u9762\u91cf\u90fd\u4e0d\u5f97\u70b9\u540d\u751f\u6210\u5668\u81ea\u6d4b\u8868\u6216 oracle \u5224\u636e\u6587\u4ef6 <p>\u63a8\u7406\u94fe\u4e0e\u80fd\u529b\u8fb9\u754c\uff1aP3 \u4fdd\u8bc1\u88c1\u51b3\u8f93\u5165\u53ea\u80fd\u6765\u81ea\u5ba1\u8ba1\u6811\uff1bP4 \u8bc1\u660e\u751f\u6210\u5668/oracle \u5de5\u4ef6\u5728\u8fd0\u884c\u65f6\u4e0d\u53ef\u8bfb\uff1bP6 \u8bc1\u660e\u5176\u6587\u4ef6\u540d\u5728\u4ee3\u7801\u4e2d\u4e0d\u53ef\u5f15\u7528\uff1bP5 \u673a\u68b0\u7981\u6b62\u65e7\u72ec\u7acb\u89d2\u8272 provenance \u8bcd\u6c47\u56de\u6f6e\u3002\u56e0\u6b64\u8fd0\u884c\u65f6\u4e0d\u5b58\u5728\u4efb\u4f55\u628a\u751f\u6210\u5668\u9884\u671f\u53d8\u6210\u5ba1\u8ba1\u5224\u636e\u7684\u8def\u5f84\u2014\u2014\u8fd9\u8bc1\u660e\u7684\u662f\u4ea7\u54c1\u4fa7\u8f93\u5165\u9694\u79bb\u3002\u4f5c\u8005\u3001\u6a21\u578b\u6216\u8ba4\u77e5\u662f\u5426\u72ec\u7acb\u4e0d\u5728\u673a\u68b0\u8bc1\u660e\u80fd\u529b\u4e4b\u5185\uff0c\u7531\u4ed3\u5916\u72ec\u7acb\u590d\u5ba1\u627f\u62c5\u6700\u7ec8\u63a5\u53d7\u3002</p>"},{"location":"integration/audit/independence/#\u53cd\u5411\u62e5\u6709\u7981\u4ee4","title":"\u53cd\u5411\u62e5\u6709\u7981\u4ee4","text":"<p>Contracts \u4fa7\u65b0\u589e\u7684 <code>src/audit-surface.mjs</code> \u662f\u7eaf\u53ea\u8bfb\u6295\u5f71\uff1a\u4e0d\u63a5\u6536\u56de\u8c03\u3001\u4e0d\u6ce8\u518c\u4efb\u4f55\u4e1c\u897f\u3001\u4e0d import \u4efb\u4f55\u5ba1\u8ba1\u5de5\u4ef6\uff1b<code>packages/skill-family-contracts/test/audit-surface.test.mjs</code> \u542b\u4e00\u6761\u673a\u68b0\u6d4b\u8bd5\uff0c\u65ad\u8a00\u8be5\u6a21\u5757\u7684 import \u5168\u90e8\u4e3a <code>node:</code> \u6216\u672c\u5730\u76f8\u5bf9\u6a21\u5757\uff0c\u4e14\u6e90\u7801\u4e0d\u51fa\u73b0 integration/audit\u3001engineering-kit\u3001harness \u5b57\u6837\u3002\u4f9d\u8d56\u65b9\u5411\u6052\u4e3a Audit \u2192 Contracts\u3002</p>"},{"location":"integration/audit/independence/#\u517c\u5bb9\u6027\u8bc1\u660e\u5165\u53e3","title":"\u517c\u5bb9\u6027\u8bc1\u660e\u5165\u53e3","text":"<p>\u53d8\u5f02\u91cd\u653e\u4e0e\u57fa\u7ebf pin \u7684\u6bd4\u5bf9\uff08\u6458\u8981\u3001\u4e8b\u5b9e\u6e05\u5355\u3001\u5f15\u64ce\u53c2\u6570\u5b8c\u6574\u6027\uff09\u89c1 version-compatibility.md \u4e0e isolation-and-lockfile.md\uff1b\u5206\u7c7b\u5b66\u89c1 mutation-taxonomy.md\u3002pin \u662f\u4ea7\u54c1\u4fa7\u517c\u5bb9\u57fa\u7ebf\uff08<code>product-compatibility-fixture</code>\uff09\uff0c\u8bc1\u660e\u88ab\u6d88\u8d39\u7684 Contracts \u5305\u4e0e\u51bb\u7ed3\u57fa\u7ebf\u5b57\u8282\u4e00\u81f4\u3001\u6821\u9a8c\u8bed\u4e49\u4e00\u81f4\uff0c\u540c\u6837\u4e0d\u4f5c\u4efb\u4f55\u72ec\u7acb\u89d2\u8272\u58f0\u79f0\u3002</p>"},{"location":"integration/audit/mutation-taxonomy/","title":"\u53d8\u5f02\u5206\u7c7b\u5b66\uff08\u51bb\u7ed3\uff09","text":"<p>FND-060 \u51bb\u7ed3\u4e94\u7c7b\u53d8\u5f02\u3002\u6bcf\u4e00\u7c7b\u90fd\u6709\u72ec\u7acb\u7684\u68c0\u6d4b\u673a\u5236\u4e0e\u6bcf\u7c7b \u22653 \u4f8b\u7684\u53d8\u5f02 fixture\uff1bfixture \u4e0e\u9884\u671f\u662f\u4ea7\u54c1\u4fa7\u7ef4\u62a4\u7684\u6d4b\u8bd5\u8bed\u6599\uff08provenance <code>product-fixture</code>\uff0c\u89c1\u4e0b\u65b9 fixture \u4fe1\u5c01\uff09\uff0c\u4e0d\u590d\u7528\u751f\u6210\u5668\u81ea\u6d4b\u9884\u671f\u8868\uff0c\u4e0d\u8bfb\u53d6 oracle \u5224\u636e\uff08\u8be5\u8f93\u5165\u9694\u79bb\u7531 independence.md \u7684\u673a\u68b0\u8bc1\u660e\u5f3a\u5236\uff09\u3002\u5b83\u4eec\u8bc1\u660e\u4ea7\u54c1\u4fa7\u8f93\u5165\u9694\u79bb\u548c\u517c\u5bb9\u6027\uff0c\u4e0d\u8bc1\u660e\u4f5c\u8005\u3001\u6a21\u578b\u6216\u8ba4\u77e5\u72ec\u7acb\uff1b\u5916\u90e8\u6700\u7ec8\u63a5\u53d7\u7531\u4ed3\u5916\u72ec\u7acb\u590d\u5ba1\u627f\u62c5\u3002\u5206\u7c7b\u96c6\u5408\u662f\u95ed\u5408\u7684\uff1a\u65b0\u589e\u7c7b\u522b\u5c5e\u4e8e\u5ba1\u8ba1\u5206\u7c7b\u5b66\u53d8\u66f4\uff0c\u5fc5\u987b\u8d70\u65b0\u7684\u88c1\u51b3\u5e76\u66f4\u65b0\u672c\u6587\u4ef6\u4e0e <code>runner/lib/paths.mjs</code> \u7684 <code>MUTATION_CLASSES</code>\u3002</p> \u7c7b\u522b \u679a\u4e3e\u503c \u68c0\u6d4b\u673a\u5236 \u6d88\u8d39\u63a5\u53e3 \u5ba1\u8ba1\u7801 \u7ed3\u6784 <code>structure</code> \u4e25\u683c\u65b9\u8a00\u4e0b\u7684 schema \u6821\u9a8c\u62d2\u7edd <code>validateDocument</code>\uff08strict, 2020-12\uff09 AUD-M1-STRUCT \u8bed\u4e49 <code>semantics</code> \u7ed3\u6784\u5408\u6cd5\u4f46\u8fdd\u53cd\u51bb\u7ed3\u8bed\u4e49\uff08\u534f\u8bae\u767b\u8bb0\u3001\u64cd\u4f5c\u8bcd\u8868\u3001params \u5951\u7ea6\u3001\u9519\u8bef\u7801\u6210\u5458\u8d44\u683c\uff09 <code>findProtocol</code>\u3001<code>checkOperation</code>\u3001<code>isRegisteredErrorCode</code> AUD-M2-SEM \u6458\u8981 <code>digest</code> \u89c4\u8303\u5316 JSON \u7684 SHA-256 \u4e0e\u51bb\u7ed3 pin \u4e0d\u4e00\u81f4 <code>digestDocument</code> AUD-M3-DIGEST \u9057\u6f0f <code>omission</code> \u51bb\u7ed3\u5fc5\u5907\u90e8\u4ef6\u7f3a\u5931\uff08\u767b\u8bb0\u3001\u89c4\u5219\u8986\u76d6\u3001\u9519\u8bef\u7801\u6210\u5458\uff09 \u57fa\u7ebf pin \u4e8b\u5b9e\u6e05\u5355\u5bf9\u6bd4 AUD-M4-OMIT \u68c0\u67e5\u5f15\u64ce\u88ab\u524a\u5f31 <code>engine</code> \u5f15\u64ce\u53c2\u6570\u5b8c\u6574\u6027\u5bf9\u6bd4\uff08\u9884\u7b97\u3001\u6821\u9a8c\u7b56\u7565\u3001\u68c0\u67e5\u7c7b\u578b\u95ed\u96c6\u3001\u7a33\u5b9a\u6027\u653f\u7b56\uff09 <code>describeAuditSurface</code> + \u57fa\u7ebf pin AUD-M5-ENGINE"},{"location":"integration/audit/mutation-taxonomy/#\u5404\u7c7b\u522b\u5b9a\u4e49\u4e0e\u5224\u636e","title":"\u5404\u7c7b\u522b\u5b9a\u4e49\u4e0e\u5224\u636e","text":""},{"location":"integration/audit/mutation-taxonomy/#M1-\u7ed3\u6784structure","title":"M1 \u7ed3\u6784\uff08structure\uff09","text":"<p>\u53d8\u5f02\u6539\u53d8\u6587\u6863\u7684\u5f62\u72b6\uff1a\u7f3a\u5fc5\u586b\u6210\u5458\u3001\u7c7b\u578b\u6f02\u79fb\u3001\u672a\u58f0\u660e\u6210\u5458\u3001\u6a21\u5f0f\u8fdd\u89c4\u3002\u5224\u636e\uff1a\u5728 <code>2020-12</code> \u65b9\u8a00\u3001<code>strict</code> \u7b56\u7565\u4e0b\uff0c\u6587\u6863\u5fc5\u987b\u88ab\u62d2\u7edd\uff0c\u4e14\u7a33\u5b9a\u7801\u7b49\u4e8e fixture \u58f0\u660e\u7684 <code>expect.observedErrorCode</code>\uff08\u672c\u7c7b\u5168\u90e8\u4e3a SFC1001\uff09\u3002\u9884\u671f\u7531\u4ea7\u54c1\u4fa7\u5bf9\u7167\u76f8\u5e94 schema \u7684 required/pattern/additionalProperties \u63a8\u5bfc\uff0c\u4e0d\u53d6\u81ea\u751f\u6210\u5668\u81ea\u6d4b\u9884\u671f\u8868\u6216 oracle \u5224\u636e\u3002</p>"},{"location":"integration/audit/mutation-taxonomy/#M2-\u8bed\u4e49semantics","title":"M2 \u8bed\u4e49\uff08semantics\uff09","text":"<p>\u53d8\u5f02\u4fdd\u6301 schema \u5408\u6cd5\u6027\uff0c\u4f46\u8fdd\u53cd\u51bb\u7ed3\u7684\u767b\u8bb0\u8bed\u4e49\u3002\u4e09\u4e2a\u8bed\u4e49\u68c0\u67e5\u70b9\uff08fixture \u7528 <code>expect.semanticCheck</code> \u58f0\u660e\uff09\uff1a</p> <ul> <li><code>protocol-registered</code>\uff1a\u534f\u8bae\u540d/\u7248\u672c\u5fc5\u987b\u5728\u767b\u8bb0\u8868\u4e2d\uff0c\u5426\u5219 SFC1011\uff1b</li> <li><code>operation-vocabulary</code>\uff1a\u64cd\u4f5c\u540d\u5fc5\u987b\u5728\u534f\u8bae\u7248\u672c\u7684\u51bb\u7ed3\u8bcd\u8868\u5185\uff08\u5426\u5219 SFC2002\uff09\uff0cparams \u5fc5\u987b\u6ee1\u8db3\u8be5\u64cd\u4f5c\u7684\u51bb\u7ed3 params \u5951\u7ea6\uff08\u5426\u5219 SFC2003\uff09\uff1b</li> <li><code>error-code-registered</code>\uff1aoperation-result \u4e2d\u7684\u9519\u8bef\u7801\u5fc5\u987b\u662f\u51bb\u7ed3\u767b\u8bb0\u8868\u6210\u5458\uff08\u5f62\u72b6\u5408\u6cd5\u4f46\u672a\u767b\u8bb0 \u2192 SFC1009\uff09\u3002</li> </ul>"},{"location":"integration/audit/mutation-taxonomy/#M3-\u6458\u8981digest","title":"M3 \u6458\u8981\uff08digest\uff09","text":"<p>\u53d8\u5f02\u4fdd\u6301\u7ed3\u6784\u4e0e\u8bed\u4e49\uff0c\u4ec5\u6539\u53d8\u89c4\u8303\u5316\u5b57\u8282\uff08\u63aa\u8f9e\u6539\u5199\u3001\u540c\u4e49\u66ff\u6362\uff09\u3002\u5224\u636e\uff1a<code>digestDocument(input)</code> \u5fc5\u987b\u4e0d\u7b49\u4e8e\u57fa\u7ebf pin \u4e2d <code>documentDigests[expect.pinField]</code>\u3002\u8fd9\u662f\u552f\u4e00\u80fd\u6355\u83b7\"\u542b\u4e49\u4e0d\u53d8\u3001\u5b57\u8282\u6539\u53d8\"\u7684\u7c7b\u522b\u3002\u89c4\u8303\u5316\u89c4\u5219\u7531 Contracts \u7684 <code>canonicalJson</code> \u51bb\u7ed3\uff1a\u5bf9\u8c61\u952e\u9010\u7ea7\u5b57\u5178\u5e8f\u6392\u5e8f\u3001\u6570\u7ec4\u4fdd\u5e8f\u3001\u53ea\u63a5\u53d7 JSON \u6570\u636e\u7c7b\u578b\u3002</p>"},{"location":"integration/audit/mutation-taxonomy/#M4-\u9057\u6f0fomission","title":"M4 \u9057\u6f0f\uff08omission\uff09","text":"<p>\u53d8\u5f02\u4ece\u51bb\u7ed3\u6587\u6863\u4e2d\u5220\u9664\u5fc5\u5907\u90e8\u4ef6\u3002\u4e09\u4e2a\u8986\u76d6\u68c0\u67e5\uff08fixture \u7528 <code>expect.check</code> \u58f0\u660e\uff09\uff1a</p> <ul> <li><code>registry-schema-coverage</code>\uff1a\u4e94\u4e2a\u9876\u5c42\u5bf9\u8c61\u7684 schema \u767b\u8bb0\u7f3a\u4e00\u4e0d\u53ef\uff1b</li> <li><code>rules-checktype-coverage</code>\uff1a\u4e5d\u4e2a\u68c0\u67e5\u7c7b\u578b\u6bcf\u4e2a\u90fd\u5fc5\u987b\u88ab\u81f3\u5c11\u4e00\u6761 mandatory \u89c4\u5219\u8986\u76d6\uff1b</li> <li><code>error-code-coverage</code>\uff1a\u51bb\u7ed3\u9519\u8bef\u7801\u6e05\u5355\u4e00\u4e2a\u4e0d\u80fd\u5c11\u3002</li> </ul> <p>\u5224\u636e\uff1a\u89c2\u5bdf\u5230\u7684\u7f3a\u5931\u6e05\u5355\u5fc5\u987b\u4e0e <code>expect.missing</code> \u5b8c\u5168\u4e00\u81f4\uff08\u591a\u62a5\u3001\u6f0f\u62a5\u90fd\u7b97 fixture \u5931\u8d25\uff09\u3002</p>"},{"location":"integration/audit/mutation-taxonomy/#M5-\u68c0\u67e5\u5f15\u64ce\u88ab\u524a\u5f31engine","title":"M5 \u68c0\u67e5\u5f15\u64ce\u88ab\u524a\u5f31\uff08engine\uff09","text":"<p>\u53d8\u5f02\u4e0d\u5220\u9664\u90e8\u4ef6\uff0c\u800c\u662f\u653e\u5bbd\u5f15\u64ce\u53c2\u6570\u3002\u56db\u4e2a\u5b8c\u6574\u6027\u68c0\u67e5\uff08fixture \u7528 <code>expect.check</code> \u58f0\u660e\uff09\uff1a</p> <ul> <li><code>rules-budget</code>\uff1a\u9884\u7b97\u6570\u503c\uff08firstVersionMax=20\u3001absoluteMax=30\uff09\u4e0d\u5f97\u53d8\u5316\uff1b</li> <li><code>validation-policies</code>\uff1astrict \u7b56\u7565\u5fc5\u987b\u4fdd\u6301 coerceTypes=false\u3001useDefaults=false\u3001allErrors=true\u3001validateFormats=true\uff1btolerant \u7b56\u7565\u9010\u952e\u5bf9\u6bd4\uff1b</li> <li><code>check-type-set</code>\uff1a\u4e5d\u4e2a\u68c0\u67e5\u7c7b\u578b\u662f\u95ed\u96c6\uff0c\u7f3a\u4e00\u4e0d\u53ef\uff1b</li> <li><code>error-code-stability</code>\uff1a\u9519\u8bef\u7801 append-only \u7a33\u5b9a\u6027\u653f\u7b56\u539f\u6587\u4e0d\u5f97\u6539\u5199\u3002</li> </ul> <p>\u5224\u636e\uff1a\u89c2\u5bdf\u5230\u7684\u88ab\u524a\u5f31\u5b57\u6bb5\u6e05\u5355\u5fc5\u987b\u4e0e <code>expect.weakened</code> \u5b8c\u5168\u4e00\u81f4\u3002</p>"},{"location":"integration/audit/mutation-taxonomy/#fixture-\u4fe1\u5c01\u51bb\u7ed3","title":"fixture \u4fe1\u5c01\uff08\u51bb\u7ed3\uff09","text":"<p>\u6bcf\u4e2a fixture \u662f\u4e00\u4e2a JSON \u6587\u4ef6\uff1a</p> \u5b57\u6bb5 \u8981\u6c42 <code>schemaVersion</code> \u5e38\u91cf <code>1</code> <code>kind</code> \u5e38\u91cf <code>skill-family.audit.mutation-fixture</code> <code>fixtureId</code> <code>^AUD-M[1-5]-[0-9]{2}$</code>\uff0c\u7b2c 6 \u4f4d\u6570\u5b57\u5fc5\u987b\u4e0e\u7c7b\u522b\u4e00\u81f4 <code>mutationClass</code> \u4e94\u7c7b\u4e4b\u4e00\uff0c\u4e14\u5fc5\u987b\u4e0e\u6240\u5728\u76ee\u5f55\u4e00\u81f4 <code>provenance</code> \u5fc5\u987b\u4e3a <code>product-fixture</code>\uff08\u673a\u68b0\u68c0\u67e5 P5\uff09 <code>description</code> \u53d8\u5f02\u610f\u56fe\u8bf4\u660e <code>target</code> \u88ab\u6d4b\u5bf9\u8c61\uff08schema/\u6587\u4ef6/\u6295\u5f71\uff09 <code>input</code> \u53d8\u5f02\u540e\u7684\u5b8c\u6574\u6587\u6863\u6216\u6295\u5f71 <code>expect.detected</code> \u5fc5\u987b\u4e3a <code>true</code>\uff08\u53d8\u5f02\u5fc5\u987b\u88ab\u68c0\u51fa\uff09 <code>expect.auditCode</code> \u5fc5\u987b\u7b49\u4e8e\u8be5\u7c7b\u522b\u7684\u5ba1\u8ba1\u7801 <p>provenance \u73b0\u884c\u4e8b\u5b9e\uff1a\u53d8\u5f02 fixture \u662f\u4ea7\u54c1\u4fa7\u6d4b\u8bd5\u8bed\u6599\uff08<code>product-fixture</code>\uff09\uff0c\u57fa\u7ebf pin \u662f\u4ea7\u54c1\u4fa7\u517c\u5bb9\u57fa\u7ebf\uff08<code>product-compatibility-fixture</code>\uff0c\u89c1 version-compatibility.md\uff09\uff1b\u5b83\u4eec\u8bc1\u660e\u4ea7\u54c1\u4fa7\u8f93\u5165\u9694\u79bb\u548c\u517c\u5bb9\u6027\uff0c\u4e0d\u8bc1\u660e\u4f5c\u8005\u3001\u6a21\u578b\u6216\u8ba4\u77e5\u72ec\u7acb\u3002\u5916\u90e8\u6700\u7ec8\u63a5\u53d7\u7531\u4ed3\u5916\u72ec\u7acb\u590d\u5ba1\u627f\u62c5\u3002\u5386\u53f2\u7ea0\u9519\uff1afixture \u4e0e pin \u66fe\u643a\u5e26\u65e7\u503c <code>independent-r2</code> \u4e0e\u72ec\u7acb\u4f5c\u8005\u53d9\u4e8b\uff0c\u8be5\u58f0\u79f0\u4e0e\u672c\u4ed3\u4e8b\u5b9e\u4e0d\u7b26\uff0c\u5df2\u4fee\u6b63\u4e3a\u4e0a\u8ff0\u5982\u5b9e\u8bcd\u6c47\uff1b\u7ea0\u9519\u4e0d\u6539\u53d8\u4efb\u4f55 fixture \u7684 <code>input</code>/<code>expect</code>\u3001digest \u6216 facts \u5b57\u6bb5\u3002</p>"},{"location":"integration/audit/mutation-taxonomy/#\u6570\u91cf\u51bb\u7ed3\u4e0e\u6f0f\u62a5\u5f8b","title":"\u6570\u91cf\u51bb\u7ed3\u4e0e\u6f0f\u62a5\u5f8b","text":"<ul> <li>\u6bcf\u7c7b fixture \u2265 3\uff08\u5f53\u524d\u5b9e\u9645\uff1a\u7ed3\u6784 4\u3001\u8bed\u4e49 4\u3001\u6458\u8981 3\u3001\u9057\u6f0f 3\u3001\u5f15\u64ce 4\uff0c\u5171 18\uff09\uff1b</li> <li>\u8986\u76d6\u95e8\u8981\u6c42\u6bcf\u7c7b <code>fixtures \u2265 3 \u4e14 detected \u2265 1</code>\uff0c\u4e0d\u6ee1\u8db3\u4ea7\u751f AUD-MISS-001 \u5e76\u5f3a\u5236 verdict fail\uff1b</li> <li>\u6f0f\u62a5\u5f8b\u7684\u8d1f\u4f8b\u9a8c\u8bc1\u7531 <code>runner/selftest-negative.mjs</code> \u6267\u884c\uff1a\u9010\u7c7b\u7981\u7528\u68c0\u6d4b\u5668\uff0c\u65ad\u8a00\u6bcf\u6b21\u7834\u574f\u90fd\u4f7f\u8fd0\u884c\u5931\u8d25\u3002</li> </ul>"},{"location":"integration/audit/version-compatibility/","title":"\u7248\u672c\u517c\u5bb9\u5b9a\u4e49","text":"<p>\u5ba1\u8ba1\u6d88\u8d39 Contracts \u4ee5\u4e24\u4e2a\u7248\u672c\u5750\u6807 + \u4e00\u4e2a\u6458\u8981\u4e3a\u51c6\uff1a</p> \u5750\u6807 \u6765\u6e90 \u542b\u4e49 <code>contractsVersion</code> Contracts \u51bb\u7ed3\u7248\u672c\uff08\u5f53\u524d <code>1.1.1</code>\uff09 \u673a\u5668\u5951\u7ea6\u5185\u5bb9\u7684\u7248\u672c <code>auditSurfaceVersion</code> \u5ba1\u8ba1\u6d88\u8d39\u63a5\u53e3\u81ea\u8eab\u7684\u7248\u672c\uff08\u5f53\u524d <code>1</code>\uff09 \u6d88\u8d39\u9762\u5f62\u72b6\u7684\u7248\u672c <code>surfaceDigest</code> <code>digestAuditSurface()</code>\uff08SHA-256\uff09 \u6d88\u8d39\u9762\u7684\u7cbe\u786e\u5b57\u8282\u6307\u7eb9 <p>\u4e09\u8005\u90fd\u7531 <code>describeAuditSurface()</code> \u4e00\u6b21\u6027\u7ed9\u51fa\uff0c\u5ba1\u8ba1\u4fa7\u628a\u5b83\u4eec\u4e0e\u57fa\u7ebf pin\uff08\u5f53\u524d\u4e3a <code>baseline/contracts-1.1.1.pin.json</code>\uff09\u6bd4\u5bf9\u3002</p>"},{"location":"integration/audit/version-compatibility/#\u517c\u5bb9\u89c4\u5219","title":"\u517c\u5bb9\u89c4\u5219","text":"<p>\u4e00\u4e2a\u88ab\u6d88\u8d39\u7684 Contracts \u5305\u4e0e\u67d0\u4e2a\u57fa\u7ebf pin \u517c\u5bb9\uff0c\u5f53\u4e14\u4ec5\u5f53\u540c\u65f6\u6ee1\u8db3\uff1a</p> <ol> <li><code>contractsVersion</code> \u4e0e pin \u76f8\u540c\uff1b</li> <li><code>auditSurfaceVersion</code> \u4e0e pin \u76f8\u540c\uff1b</li> <li><code>digestAuditSurface()</code> \u4e0e pin \u7684 <code>surfaceDigest</code> \u76f8\u540c\u3002</li> </ol> <p>\u7531\u4e8e surface \u6458\u8981\u8986\u76d6\u4e86\u767b\u8bb0\u8868\u3001\u9519\u8bef\u7801\u3001\u89c4\u5219\u3001kernel \u534f\u8bae\u3001\u5168\u90e8 schema \u6587\u6863\u4e0e\u5f15\u64ce\u53c2\u6570\uff0c\u6458\u8981\u76f8\u540c\u8574\u542b\u5185\u5bb9\u9010\u5b57\u8282\u7b49\u4ef7\uff08\u89c4\u8303\u5316\u610f\u4e49\u4e0b\uff09\u3002\u4e09\u4e2a\u6761\u4ef6\u4efb\u4e00\u4e0d\u6ee1\u8db3\u5373\u4e0d\u517c\u5bb9\uff1a\u5ba1\u8ba1\u5fc5\u987b\u62a5\u544a AUD-BASE-001\uff08\u8fd0\u884c\u671f\u57fa\u7ebf\u68c0\u67e5\uff09\u6216 AUD-LOCK-001\uff08\u5305\u9501\u9a8c\u8bc1\uff09\uff0c\u5e76\u62d2\u7edd\u7ed9\u51fa\u901a\u8fc7\u88c1\u51b3\u3002</p>"},{"location":"integration/audit/version-compatibility/#\u53d8\u66f4\u5206\u7ea7","title":"\u53d8\u66f4\u5206\u7ea7","text":"\u53d8\u66f4 \u5206\u7ea7 \u9700\u8981\u7684\u52a8\u4f5c \u4e0d\u6539\u53d8 surface \u5b57\u8282\u7684\u53d8\u66f4\uff08\u5982\u6ce8\u91ca\u3001\u6d4b\u8bd5\uff09 \u65e0\u5f71\u54cd \u65e0\u9700\u65b0 pin \u6539\u53d8 surface \u5b57\u8282\u4f46\u4e0d\u6539\u53d8\u542b\u4e49\u7684\u53d8\u66f4 \u4e0d\u517c\u5bb9 \u7981\u6b62\u4ee5\"\u540c\u4e49\"\u4e3a\u7531\u514d\u68c0\uff1b\u5fc5\u987b\u8d70\u5408\u540c\u53d8\u66f4\u5e76\u91cd\u65b0\u6279\u51c6 pin \u65b0\u589e\u5ba1\u8ba1\u6d88\u8d39\u63a5\u53e3\uff08\u53ea\u8bfb\u3001\u589e\u91cf\uff09 auditSurfaceVersion \u9012\u589e \u65b0 pin + \u672c\u6587\u4ef6\u66f4\u65b0 \u6539\u53d8\u65e2\u6709\u6d88\u8d39\u63a5\u53e3\u542b\u4e49 auditSurfaceVersion \u9012\u589e + \u5408\u540c\u53d8\u66f4 \u65b0 pin\uff1b\u65e7 pin \u5b58\u6863\u4e0d\u5220 Contracts \u7248\u672c\u6f14\u8fdb\uff081.0.0 \u2192 \u4e0b\u4e00\u7248\u672c\uff09 contractsVersion \u53d8\u5316 \u65b0\u7684\u57fa\u7ebf pin \u6587\u4ef6\uff1b\u65e7 pin \u6587\u4ef6\u53ea\u8bfb\u5b58\u6863"},{"location":"integration/audit/version-compatibility/#pin-\u751f\u547d\u5468\u671f","title":"pin \u751f\u547d\u5468\u671f","text":"<ul> <li>\u6bcf\u4e2a\u7ecf\u7248\u672c\u5316\u6279\u51c6\u7684 Contracts \u53d1\u5e03\u5bf9\u5e94\u4e00\u4e2a pin \u6587\u4ef6\uff1a<code>baseline/contracts-<version>.pin.json</code>\uff1b</li> <li>pin \u662f append-only\uff1a\u6279\u51c6\u540e\u4e0d\u518d\u539f\u5730\u7f16\u8f91\uff0c\u4f5c\u5e9f\u4ee5\u65b0 pin \u53d6\u4ee3\u5e76\u5728 <code>note</code> \u4e2d\u8bf4\u660e\uff1b</li> <li>pin \u7531\u4ea7\u54c1\u4fa7\u5728\u51bb\u7ed3\u65f6\u523b\u6784\u9020\uff08provenance <code>product-compatibility-fixture</code>\uff09\uff1a\u6458\u8981\u6765\u81ea\u5bf9\u5df2\u51bb\u7ed3\u4ea7\u7269\u7684 <code>digestAuditSurface()</code> \u673a\u68b0\u8ba1\u7b97\uff0c\u4e8b\u5b9e\u6e05\u5355\u76f4\u63a5\u5bf9\u7167\u5408\u540c\u6587\u6863\u63a8\u5bfc\uff0c\u4e0d\u53d6\u81ea\u751f\u6210\u5668\u6216 oracle\uff1b\u672c\u4ed3\u5e93\u4e0d\u5b58\u5728\u72ec\u7acb\u7684\u7b2c\u4e8c\u5ba1\u9605\u4f1a\u8bdd\uff0cpin \u4e0d\u4f5c\u4efb\u4f55\u72ec\u7acb\u89d2\u8272\u58f0\u79f0\uff1b</li> <li>\u8bda\u5b9e\u6027\u4fee\u6b63\uff082026-08-05\uff09\uff1a\u65e7 pin\uff081.0.0\u30011.1.0\uff09\u66fe\u643a\u5e26 <code>independent-r2</code> provenance \u4e0e\u72ec\u7acb\u91cd\u7b7e\u53d9\u4e8b\uff0c\u8be5\u58f0\u79f0\u4e0e\u672c\u4ed3\u4e8b\u5b9e\u4e0d\u7b26\uff0c\u5df2\u5c31\u5730\u4fee\u6b63 provenance \u4e0e note\uff1b\u4fee\u6b63\u53ea\u89e6\u53ca provenance/note \u4e24\u5904\u8bda\u5b9e\u6027\u5b57\u6bb5\uff0c\u4e0d\u6539\u53d8\u4efb\u4f55 digest \u6216 facts \u5b57\u6bb5\uff0c\u65e7 pin \u7ee7\u7eed\u4f5c\u4e3a\u53ea\u8bfb\u517c\u5bb9\u5b58\u6863\uff1b</li> <li>Contracts 1.1.1\uff082026-08-05\uff09\uff1a\u4ec5\u63cf\u8ff0\u8865\u4e01\uff08migration-manifest schema \u4e09\u5904 description \u6539\u5199\u4e3a\u7a33\u5b9a\u4ea7\u54c1\u8bed\u4e49\uff1b\u65e0\u4efb\u4f55\u6821\u9a8c\u5173\u952e\u5b57\u3001\u516c\u5f00 API\u3001\u9519\u8bef\u7801\u3001\u89c4\u5219\u6216\u5f15\u64ce\u53c2\u6570\u53d8\u5316\uff09\u3002\u6309\u672c\u751f\u547d\u5468\u671f\u65b0\u589e <code>contracts-1.1.1.pin.json</code> \u4e3a\u73b0\u884c\u57fa\u7ebf\uff0c<code>contracts-1.1.0.pin.json</code> \u8f6c\u4e3a\u53ea\u8bfb\u517c\u5bb9\u5b58\u6863\u30021.1.1 pin \u76f8\u5bf9 1.1.0 pin \u7684\u51c6\u786e\u4e8b\u5b9e\uff1a\u6821\u9a8c\u8bed\u4e49\u548c\u4e8b\u5b9e\u6e05\u5355\u4e0d\u53d8\uff08<code>facts</code> \u9010\u9879\u4e00\u81f4\uff09\uff1b\u56db\u4e2a Contracts \u6587\u6863\uff08registry\u3001error-codes\u3001rules\u3001kernel-protocol\uff09\u56e0\u5185\u5d4c <code>contractsVersion</code> \u4ece <code>1.1.0</code> \u66f4\u65b0\u5230 <code>1.1.1</code> \u800c\u6539\u53d8\u6458\u8981\uff1bmigration-manifest Schema \u56e0\u4e0a\u8ff0\u4e09\u5904 description \u66f4\u65b0\u800c\u6539\u53d8\u6458\u8981\uff1b\u5176\u4f59\u4e94\u4e2a Schema\uff08project-manifest\u3001profile-descriptor\u3001managed-file-lock\u3001operation-request\u3001operation-result\uff09\u6458\u8981\u4e0d\u53d8\u3002<code>proof-independence.mjs</code> \u7684 P5 \u5f3a\u5236\u8fd9\u5957\u5982\u5b9e\u58f0\u660e\u7684 provenance \u8bcd\u6c47\uff08pin\uff1a<code>product-compatibility-fixture</code>\uff1b\u53d8\u5f02\u5939\u5177\uff1a<code>product-fixture</code>\uff09\uff1b</li> <li>\u5ba1\u8ba1\u8fd0\u884c\u65f6\u5148\u505a\u5305\u9501\u9a8c\u8bc1\uff08\u89c1 isolation-and-lockfile.md\uff09\uff0c\u518d\u505a\u53d8\u5f02\u91cd\u653e\uff1bpin \u4e0d\u5339\u914d\u65f6\uff0c\u53d8\u5f02\u91cd\u653e\u7ed3\u679c\u4e0d\u5f97\u88ab\u91c7\u4fe1\u3002</li> </ul>"},{"location":"migration/","title":"\u5b58\u91cf\u91c7\u7528\u4e0e\u8fc1\u79fb\uff08FND-070\uff09","text":"<p>\u672c\u9875\u63cf\u8ff0\u5b58\u91cf\u9879\u76ee\u5982\u4f55\u91c7\u7528 Skill Family \u57fa\u7840\u8bbe\u65bd\uff0c\u4ee5\u53ca\u8fc1\u79fb\u5b8c\u6210\u5224\u5b9a\u7684\u95e8\u7981\u3002</p>"},{"location":"migration/#\u539f\u5219","title":"\u539f\u5219","text":"<ol> <li>\u8ba1\u5212\u5148\u884c\uff1a\u4efb\u4f55\u5b58\u91cf\u4ed3\u5148\u8fd0\u884c\u53ea\u8bfb <code>adopt-plan</code>\uff0c\u62ff\u5230\u73b0\u72b6\u3001\u76ee\u6807 Profile\u3001 \u7cbe\u786e\u5199\u96c6\u3001\u51b2\u7a81\u3001\u65e7\u5b9e\u73b0\u9000\u51fa\u6e05\u5355\u4e0e\u9a8c\u6536\u547d\u4ee4\uff0c\u518d\u51b3\u5b9a\u662f\u5426\u6267\u884c\u5199\u5165\u3002</li> <li>\u53ea\u8bfb\u8ba1\u5212\u96f6\u53d8\u5316\uff1a<code>adopt-plan</code> \u4e0d\u5199\u4efb\u4f55\u6587\u4ef6\uff08\u542b\u4e34\u65f6\u6587\u4ef6\uff09\u3001\u4e0d\u8fd0\u884c git \u5199\u547d\u4ee4\u3001\u4e0d\u6539\u540d\u3001\u4e0d\u89e6\u78b0\u8fdc\u7aef\uff1b\u5bf9\u8f93\u5165\u4ed3\u5b57\u8282\u96f6\u53d8\u5316\uff08\u524d\u540e\u54c8\u5e0c\u8d70\u67e5\u53ef\u8bc1\uff09\u3002</li> <li>\u91c7\u7528\u4e0e\u6539\u540d\u5206\u79bb\uff1a\u57fa\u7840\u8bbe\u65bd\u91c7\u7528\u7edd\u4e0d\u8fde\u5e26\u4ed3\u5e93\u6539\u540d\u6216\u8fdc\u7aef\u5750\u6807\u53d8\u66f4\uff1b \u4e24\u8005\u662f\u72ec\u7acb\u51b3\u7b56\uff0c\u5de5\u5177\u4e0d\u63d0\u4f9b\u4efb\u4f55\u6539\u540d\u80fd\u529b\u3002</li> <li>\u53cc\u8f68\u4e0d\u7b97\u5b8c\u6210\uff1a\u8fc1\u79fb\u5b8c\u6210\u5224\u5b9a\u8981\u6c42\u65e7\u91cd\u590d\u5b9e\u73b0\u5df2\u5220\u9664\uff1b\u53ea\u63a5\u5165\u65b0\u57fa\u7840\u8bbe\u65bd \u800c\u65e7\u5b9e\u73b0\u4ecd\u5728\uff0c\u5224\u5b9a\u6052\u4e3a false\u3002</li> </ol>"},{"location":"migration/#adopt-plan-\u8f93\u51fa\u7ed3\u6784","title":"adopt-plan \u8f93\u51fa\u7ed3\u6784","text":"\u6bb5\u843d \u5185\u5bb9 <code>target</code> \u73b0\u72b6\uff1a\u5165\u53e3\u6570\u3001\u76ee\u6807\u81ea\u6709\u53d7\u7ba1\u58f0\u660e <code>project</code> / <code>traceability</code> \u76ee\u6807 Profile \u4e0e\u6bcf\u9879\u5199\u5165\u7684\u771f\u6e90\uff08Contracts \u7248\u672c\u3001skeleton \u751f\u6210\u51fd\u6570\u3001\u8bb8\u53ef\u8bc1 Profile \u4e0e\u53d8\u4f53\uff09 <code>git</code> \u53ea\u8bfb Git \u524d\u7f6e\u72b6\u6001\uff08\u4ed3\u5e93\u3001HEAD\u3001clean\uff09 <code>writeSet</code> \u7cbe\u786e\u5199\u96c6\uff1a\u6bcf\u8def\u5f84\u7684 action\uff08\u4ec5 <code>create</code>/<code>unchanged</code>\uff09\u3001fileClass\u3001sha256 <code>conflicts</code> \u624b\u5199\u51b2\u7a81\u3001\u53d7\u7ba1\u6f02\u79fb\u3001\u7b26\u53f7\u94fe\u63a5\u5360\u4f4d\u3001\u7f3a\u5b57\u6bb5\u4e34\u65f6\u4f8b\u5916 <code>risks</code> dirty\u3001\u5d4c\u5957\u4ed3\u3001tracked-but-ignored\u3001\u5230\u671f\u4f8b\u5916\u7b49 <code>migration</code> \u8fc1\u79fb\u72b6\u6001\u673a\uff1a\u7ed1\u5b9a\uff08binding\uff09\u3001\u5728\u76d8\u8bc1\u660e\uff08adoptionProof\uff09\u3001\u5f85\u5199\u5165\u6570\u3001check \u95e8\u7981\u3001\u56db\u7c7b\u9a8c\u8bc1\u8bc1\u636e\u3001\u72b6\u6001\u4e0e\u5b8c\u6210\u5224\u5b9a <code>verificationPlan</code> \u9a8c\u6536\u547d\u4ee4\u5e8f\u5217\uff08check \u2192 projection \u2192 \u590d\u67e5\uff09"},{"location":"migration/#\u8fc1\u79fb\u6e05\u5355skill-familymigrationjson","title":"\u8fc1\u79fb\u6e05\u5355\uff08skill-family.migration.json\uff09","text":"<p>\u76ee\u6807\u4ed3\u5728\u6839\u76ee\u5f55\u58f0\u660e\u81ea\u5df1\u7684\u8fc1\u79fb\u72b6\u6001\uff1a</p> <pre><code>{\n \"kind\": \"skill-family.migration-manifest\",\n \"legacyInfra\": [\n { \"path\": \"scripts/old-validator.mjs\", \"replacedBy\": \"sf-kit check\" }\n ],\n \"exceptions\": [\n {\n \"owner\": \"\u8d1f\u8d23\u4eba\",\n \"reason\": \"\u5177\u4f53\u539f\u56e0\",\n \"deadline\": \"2026-12-31\",\n \"migrationTarget\": \"wave-m1\"\n }\n ],\n \"targetProfile\": \"generic\",\n \"foundationPackages\": [\n { \"name\": \"skill-family-contracts\", \"version\": \"1.1.0\", \"digest\": \"sha256:<64 \u4f4d\u5341\u516d\u8fdb\u5236>\" }\n ],\n \"verification\": {\n \"unit\": \"docs/evidence/unit.json\",\n \"integration\": \"docs/evidence/integration.json\",\n \"consumer\": \"docs/evidence/consumer.json\",\n \"independentAudit\": \"docs/evidence/independent-audit.json\"\n }\n}\n</code></pre> <ul> <li><code>legacyInfra</code> \u6bcf\u9879\u7ed9\u51fa\u65e7\u5b9e\u73b0\u8def\u5f84\u4e0e\u66ff\u4ee3\u7269\uff1b\u5de5\u5177\u53ea\u8bfb\u8bc4\u4f30\u5b58\u5728\u6027\uff0c\u7edd\u4e0d\u4ee3\u4e3a\u5220\u9664\u3002</li> <li><code>exceptions</code> \u662f\u4e34\u65f6\u4f8b\u5916\uff1a\u5fc5\u987b\u540c\u65f6\u542b\u8d1f\u8d23\u4eba\uff08owner\uff09\u3001\u539f\u56e0\uff08reason\uff09\u3001 \u622a\u6b62\u65f6\u95f4\uff08deadline\uff09\u3001\u8fc1\u79fb\u76ee\u6807\uff08migrationTarget\uff09\u56db\u9879\uff0c\u7f3a\u4efb\u4e00\u5b57\u6bb5\u5373\u8ba1\u4e3a \u51b2\u7a81\uff08\u8ba1\u5212\u5931\u8d25\uff09\uff1b\u5230\u671f\u4f8b\u5916\u4e0d\u81ea\u52a8\u7eed\u671f\uff0c\u6301\u7eed\u963b\u65ad\u5b8c\u6210\u5224\u5b9a\u3002</li> <li><code>targetProfile</code> / <code>foundationPackages</code>\uff1a\u91c7\u7528\u7ed1\u5b9a\u3002\u76ee\u6807 Profile \u5fc5\u987b\u4e0e\u8ba1\u5212 Profile \u4e00\u81f4\uff1b\u4e09\u4e2a Foundation \u5305\uff08contracts\u3001harness-node\u3001 engineering-kit\uff09\u5fc5\u987b\u5404\u81ea\u7ed1\u5b9a\u7cbe\u786e\u7248\u672c\u53f7\uff08\u4e0d\u63a5\u53d7\u6d6e\u52a8\u8303\u56f4\uff09\u4e0e <code>sha256:</code> \u6458\u8981\u3002</li> <li><code>verification</code>\uff1a\u56db\u7c7b\u9a8c\u8bc1\u8bc1\u636e\u6587\u6863\u8def\u5f84\uff08unit\u3001integration\u3001 consumer\u3001independentAudit\uff09\u3002\u6bcf\u4efd\u8bc1\u636e\u5fc5\u987b\u662f\u53ef\u89e3\u6790 JSON \u4e14\u5176 <code>projectId</code> \u4e0e\u76ee\u6807\u9879\u76ee\u8eab\u4efd\u4e00\u81f4\uff0c\u624d\u8ba1\u4e3a proven\uff1b\u8def\u5f84\u8d8a\u754c\u3001\u7f3a\u5931\u3001 \u4e0d\u53ef\u89e3\u6790\u3001\u8eab\u4efd\u4e0d\u7b26\u5747\u4e3a\u672a\u8bc1\u660e\uff0cfail-closed\u3002</li> </ul>"},{"location":"migration/#\u8fc1\u79fb\u72b6\u6001\u673a","title":"\u8fc1\u79fb\u72b6\u6001\u673a","text":"<p>\u72b6\u6001\u5355\u8c03\u9012\u8fdb\uff0c\u53ea\u7531\u53ea\u8bfb\u8bc1\u636e\u63a8\u5bfc\uff0c\u4efb\u4f55\u5de5\u5177\u90fd\u4e0d\u901a\u8fc7\u5199\u5165\u63a8\u8fdb\u72b6\u6001\uff1a</p> <pre><code>not-declared \u2192 declared \u2192 adopted \u2192 verified \u2192 complete\n</code></pre> \u72b6\u6001 \u542b\u4e49 <code>not-declared</code> \u4e0d\u5b58\u5728\u5951\u7ea6\u6709\u6548\u7684\u8fc1\u79fb\u6e05\u5355 <code>declared</code> \u6e05\u5355\u5951\u7ea6\u6709\u6548\uff0c\u4f46\u91c7\u7528\u4e8b\u5b9e\u8bc1\u660e\u4e0d\u5168 <code>adopted</code> Foundation \u5b57\u8282\u5df2\u5728\u76d8\u4e14\u65e7\u5b9e\u73b0\u5df2\u9000\u51fa\uff0ccheck \u95e8\u7981\u672a\u7eff <code>verified</code> check \u95e8\u7981\u7eff\uff0c\u9a8c\u8bc1\u8bc1\u636e\u672a\u5168\u90e8 proven <code>complete</code> \u516b\u9879\u5b8c\u6210\u6761\u4ef6\u5168\u90e8\u6ee1\u8db3\uff1b<code>complete</code> \u4e3a\u771f\u5f53\u4e14\u4ec5\u5f53\u72b6\u6001\u4e3a <code>complete</code>"},{"location":"migration/#\u5b8c\u6210\u5224\u5b9a\u95e8\u7981","title":"\u5b8c\u6210\u5224\u5b9a\u95e8\u7981","text":"<p><code>migration.completion.complete</code> \u4e3a true \u5f53\u4e14\u4ec5\u5f53\u5168\u90e8\u516b\u9879\u6210\u7acb\uff1a</p> <ol> <li>\u5df2\u58f0\u660e\u5951\u7ea6\u6709\u6548\u7684\u8fc1\u79fb\u6e05\u5355\uff08kind/\u5b57\u6bb5\u7ecf Contracts schema \u6821\u9a8c\uff09\uff1b</li> <li>\u91c7\u7528\u7ed1\u5b9a\u5df2\u8bc1\u660e\uff1a\u76ee\u6807 Profile \u4e0e\u8ba1\u5212\u4e00\u81f4\uff0c\u4e09\u4e2a Foundation \u5305\u5747\u7ed1\u5b9a \u7cbe\u786e\u7248\u672c\u4e0e sha256 \u6458\u8981\uff1b</li> <li>Project Manifest\u3001managed lock\u3001identity \u4e0e\u5168\u90e8\u53d7\u7ba1\u9aa8\u67b6\u6587\u4ef6\u5728\u76d8\u4e14 \u6458\u8981\u4e0e\u8ba1\u5212\u4e00\u81f4\uff08<code>adoptionProof.missing</code>/<code>mismatched</code> \u4e3a\u7a7a\uff09\uff1b</li> <li>\u5199\u96c6\u4e2d\u65e0\u5f85\u6267\u884c\u7684 create/replace/project \u52a8\u4f5c\uff08<code>pendingWrites</code> \u4e3a 0\uff09\uff1b</li> <li>Foundation check \u95e8\u7981\u7eff\uff1b</li> <li>\u6bcf\u9879\u65e7\u5b9e\u73b0\u5747\u5df2\u9000\u51fa\uff08absent\uff09\u2014\u2014containment \u62d2\u7edd\u6216\u7578\u5f62\u6761\u76ee\u4e0e present \u540c\u7b49 fail-closed\uff1b</li> <li>\u65e0\u7f3a\u5b57\u6bb5\u3001\u65e0\u4e0d\u53ef\u89e3\u6790\u622a\u6b62\u65f6\u95f4\u3001\u65e0\u5df2\u5230\u671f\u7684\u4e34\u65f6\u4f8b\u5916\uff1b\u65e0\u672a\u89e3\u51b3\u7684\u91c7\u7528\u51b2\u7a81\uff1b</li> <li>\u56db\u7c7b\u9a8c\u8bc1\u8bc1\u636e\uff08unit/integration/consumer/independentAudit\uff09\u5168\u90e8 proven \u4e14\u8eab\u4efd\uff08projectId\uff09\u5339\u914d\u3002</li> </ol> <p>\u672a\u8bc4\u4f30\u7684\u8f93\u5165\u4e0e\u672a\u8bc1\u660e\u7b49\u4ef7\uff1a\u95e8\u7981\u53ea\u4f9d\u636e\u51fa\u793a\u7684\u8bc1\u636e\u524d\u8fdb\u3002 \u963b\u65ad\u7406\u7531\uff08<code>blockers</code>\uff09\u4e3a\u7a33\u5b9a\u53ef\u8bfb\u5b57\u7b26\u4e32\uff0c\u53ef\u76f4\u63a5\u8fdb\u5165\u8fc1\u79fb\u8bc4\u5ba1\u8bb0\u5f55\u3002</p>"},{"location":"migration/#\u5f3a\u5236\u8d1f\u4f8b\u4efb\u4e00\u573a\u666f-completion-\u5fc5\u987b\u4e3a-false","title":"\u5f3a\u5236\u8d1f\u4f8b\uff08\u4efb\u4e00\u573a\u666f completion \u5fc5\u987b\u4e3a false\uff09","text":"<ul> <li>\u7a7a\u4ed3 + \u7a7a\u6e05\u5355\uff08\u65e0\u5951\u7ea6\u6709\u6548\u6e05\u5355 \u2192 <code>not-declared</code>\uff09\uff1b</li> <li>\u6e05\u5355 kind \u9519\u8bef\uff08schema-invalid \u2192 \u89c6\u540c\u672a\u58f0\u660e\uff09\uff1b</li> <li>9 \u4e2a\u9aa8\u67b6\u6587\u4ef6\u4ecd\u5f85 create\uff08<code>declared</code>\uff0c\u5217\u51fa\u5168\u90e8\u7f3a\u5931\u8def\u5f84\uff09\uff1b</li> <li>managed lock \u6f02\u79fb\uff08<code>mismatched</code> \u975e\u7a7a\uff09\uff1b</li> <li>\u53ea\u63a5\u5165\u65b0\u5b9e\u73b0\u3001\u65e7\u5b9e\u73b0\u4ecd\u5728\uff08\u53cc\u8f68 \u2192 <code>declared</code>\uff09\uff1b</li> <li>\u6d88\u8d39\u8005\u9a8c\u8bc1\u8bc1\u636e\u7f3a\u5931\u6216\u8eab\u4efd\u4e0d\u7b26\uff08<code>verified</code>\uff0c\u4e0d\u5f97 complete\uff09\uff1b</li> <li>\u4e34\u65f6\u4f8b\u5916\u8fc7\u671f\uff08\u5de5\u5177\u7edd\u4e0d\u7eed\u671f\uff09\u3002</li> </ul>"},{"location":"migration/#\u5341\u5b57\u6bb5-hand-off-\u8349\u6848","title":"\u5341\u5b57\u6bb5 hand-off \u8349\u6848","text":"<p><code>adopt-plan</code> \u8f93\u51fa\u643a\u5e26 <code>handoffDraft</code> \u5b50\u5757\uff08kind=<code>skill-family.handoff-draft</code>\uff0c schemaVersion=1\uff09\uff0c\u4e3a planner \u4fa7\u7684\u5341\u5b57\u6bb5 hand-off \u63d0\u4f9b\u7ed3\u6784\u5316\u6570\u636e\u8349\u6848\u3002 \u5b57\u6bb5\u6765\u6e90\u53ea\u6709\u4e24\u79cd\uff1a<code>derived</code>\uff08\u53ef\u7531\u53ea\u8bfb\u8bc1\u636e\u673a\u68b0\u63a8\u5bfc\uff09\u4e0e <code>INCOMPLETE</code> \uff08\u4e0d\u53ef\u673a\u68b0\u63a8\u5bfc\uff0c\u7edd\u4e0d\u731c\u6d4b\uff09\u3002\u5341\u5b57\u6bb5\u4e0e\u6e90\u7801\u5e38\u91cf <code>HANDOFF_FIELDS</code> \u9010\u4e00\u5bf9\u5e94\uff1a</p> id \u5b57\u6bb5\u540d \u6765\u6e90 1 <code>project-identity</code> derived 2 <code>repository-state</code> derived 3 <code>foundation-binding</code> derived\uff08\u6e05\u5355\u5df2\u58f0\u660e\u7ed1\u5b9a\uff09\uff0fINCOMPLETE\uff08\u65e0\u6e05\u5355\u58f0\u660e\uff09 4 <code>write-set-policy</code> derived 5 <code>legacy-exits</code> derived 6 <code>business-logic-to-keep</code> \u6052 INCOMPLETE 7 <code>plan-summary</code> derived 8 <code>verification-entries</code> derived\uff08\u56db\u7c7b\u8bc1\u636e\u5168\u90e8 proven\uff09\uff0fINCOMPLETE\uff08\u4efb\u4e00\u672a\u8bc1\u660e\uff09 9 <code>legacy-removal-recovery</code> \u6052 INCOMPLETE 10 <code>authorization-status</code> derived\uff08commit/push/tag/publish \u6052\u4e3a false\uff09"},{"location":"migration/#INCOMPLETE-\u963b\u65ad\u89c4\u5219","title":"INCOMPLETE \u963b\u65ad\u89c4\u5219","text":"<ul> <li>\u4efb\u4f55 INCOMPLETE \u5b57\u6bb5\u90fd\u4f7f <code>ready=false</code>\uff1a\u8349\u6848\u5e26\u7f3a\u53e3\u5c31\u4e0d\u5f97\u8fdb\u5165 hand-off\u3002</li> <li>\u5de5\u5177\u7edd\u4e0d\u731c\u6d4b\u4e0d\u53ef\u673a\u68b0\u63a8\u5bfc\u7684\u5b57\u6bb5\uff1a</li> <li><code>business-logic-to-keep</code> \u4e0e <code>legacy-removal-recovery</code> \u6052 INCOMPLETE\uff0c \u5fc5\u987b\u7531\u4eba\u7c7b\u8d1f\u8d23\u4eba\u7ed9\u51fa\uff0c\u5de5\u5177\u65e0\u63a8\u5bfc\u4f9d\u636e\uff1b</li> <li><code>foundation-binding</code> \u5728\u65e0\u8fc1\u79fb\u6e05\u5355\u58f0\u660e\uff08<code>foundationPackages</code>\uff09\u65f6 INCOMPLETE\uff0c\u53ea\u8ba1\u6e05\u5355\u58f0\u660e\u7684\u7ed1\u5b9a\uff1b</li> <li><code>verification-entries</code> \u5728\u56db\u7c7b\u8bc1\u636e\uff08unit/integration/consumer/ independentAudit\uff09\u4efb\u4e00\u672a\u8fbe proven \u65f6 INCOMPLETE\u3002</li> </ul>"},{"location":"migration/#\u7ed1\u5b9a","title":"\u7ed1\u5b9a","text":"<p>\u8349\u6848\u643a\u5e26\u53cc sha256 \u6458\u8981\uff08<code>binding</code> \u5757\uff09\uff1a<code>targetSetDigest</code> \u6c47\u603b\u76ee\u6807\u4ed3 \u6587\u4ef6\u96c6\u5408\uff0c<code>foundationPlanDigest</code> \u6c47\u603b Foundation \u8ba1\u5212\u5199\u96c6\u3002\u540c\u4e00\u76ee\u6807\u4e24\u6b21 \u8ba1\u5212\u5f97\u5230\u76f8\u540c\u6458\u8981\uff0c\u8349\u6848\u4e0e\u8ba1\u5212\u65f6\u523b\u7684\u76ee\u6807\u72b6\u6001\u7cbe\u786e\u7ed1\u5b9a\u3002</p>"},{"location":"migration/#\u6e32\u67d3\u8fb9\u754c","title":"\u6e32\u67d3\u8fb9\u754c","text":"<ul> <li>\u6e32\u67d3\u5668\u53ea\u5199 planner \u4fa7\u7684 hand-off \u8349\u6848\uff0c\u7edd\u4e0d\u5199\u6d88\u8d39\u8005\u4ed3\uff1b</li> <li>\u4e0d\u65b0\u589e\u7b2c\u4e94\u4e2a Kit \u9876\u5c42\u547d\u4ee4\uff1aKit \u9876\u5c42\u547d\u4ee4\u6052\u4e3a scaffold\u3001adopt-plan\u3001 projection\u3001check \u56db\u4e2a\uff0c<code>handoffDraft</code> \u53ea\u662f <code>adopt-plan</code> \u8f93\u51fa\u7684\u5b50\u5757\u3002</li> </ul>"},{"location":"migration/#\u5371\u5bb3\u7c7b-fixture","title":"\u5371\u5bb3\u7c7b fixture","text":"<p><code>fixtures/adoption/cases/</code> \u8986\u76d6\u4e03\u4e2a\u5371\u5bb3\u7c7b\uff1adirty \u4ed3\u3001\u5d4c\u5957\u4ed3\u3001 tracked-but-ignored\u3001\u7b26\u53f7\u94fe\u63a5\u5360\u4f4d\u3001\u751f\u6210\u7269\u6f02\u79fb\u3001\u65e7\u5b9e\u73b0\u9000\u51fa\u95e8\u7981\u3001 \u4e34\u65f6\u4f8b\u5916\u5b57\u6bb5\u3002\u6bcf\u4e2a\u6848\u4f8b\u4ee5\u5b57\u8282\u7ea7\u524d\u540e\u5feb\u7167\u8bc1\u660e\u8ba1\u5212\u53ea\u8bfb\uff1b\u6848\u4f8b\u8bf4\u660e\u89c1\u4ed3\u5185 <code>fixtures/adoption/README.md</code>\u3002</p>"}]}
|
|
1
|
+
{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"Skill Family Foundation Workspace","text":"<p>Skill Family \u751f\u547d\u5468\u671f\u7684\u516c\u5171\u5de5\u7a0b\u57fa\u7840\u8bbe\u65bd\u7236\u5de5\u4f5c\u533a\u3002\u672c\u4ed3\u63d0\u4f9b\u673a\u5668\u5951\u7ea6\uff08Contracts\uff09\u3001Node \u8584\u8fd0\u884c\u65f6\uff08Harness\uff09\u3001\u5de5\u7a0b\u5de5\u5177\u5305\uff08Engineering Kit\uff09\u3001Profile SPI\u3001\u5b8c\u5168\u865a\u6784\u7684\u901a\u7528\u6837\u4f8b\uff08fixture\uff09\u548c\u5de5\u7a0b\u6587\u6863\u9aa8\u67b6\u3002</p>"},{"location":"#\u5f53\u524d\u72b6\u6001","title":"\u5f53\u524d\u72b6\u6001","text":"<p>\u672c\u4ed3\u662f\u4e00\u5957\u5f00\u53d1\u4e2d\u7684\u9996\u7248\u9aa8\u67b6\u3002\u7248\u672c\u3001\u53d1\u5e03\u3001Pages \u4e0e Git \u7b49\u52a8\u6001\u72b6\u6001\u552f\u4e00\u89c1 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\uff1b\u8bb8\u53ef\u8bc1\u5df2\u6279\u51c6\u4e3a Apache License 2.0\uff0c\u7248\u6743\u4e3b\u4f53\u4e3a\u5e7f\u5dde\u5e02\u98ce\u8377\u79d1\u6280\u6709\u9650\u516c\u53f8\uff0c\u89c4\u8303\u5168\u6587\u89c1\u6839\u7ea7 <code>LICENSE</code>\u3002</p> <p>\u672c\u5de5\u4f5c\u533a\u6c38\u4e45 private\uff0c\u662f\u552f\u4e00\u5f00\u53d1\u771f\u6e90\uff1b\u516c\u5f00\u8fb9\u754c\u53ea\u6709\u4e09\u4e2a\u7248\u672c\u5316\u53d1\u5e03\u955c\u50cf\u4e0e npm tarball\uff0c\u9489\u4f4f\u7684\u6d88\u8d39\u5750\u6807\u4e0e\u53d1\u5e03\u72b6\u6001\u552f\u4e00\u89c1 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\u3002</p> <p>\u4ea7\u54c1\u7ea7\u7684\u552f\u4e00\u72b6\u6001\u9875\u662f \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\uff0c\u7531 <code>node scripts/docs/fact-check.mjs</code> \u5bf9\u7167\u673a\u5668\u771f\u6e90\u673a\u68b0\u6821\u9a8c\uff1b\u5176\u4ed6\u9875\u9762\u4e0d\u627f\u8f7d\u7b2c\u4e8c\u5957\u72b6\u6001\u53e3\u5f84\u3002</p>"},{"location":"#\u9996\u7248\u7ec4\u6210","title":"\u9996\u7248\u7ec4\u6210","text":"\u7ec4\u6210 \u8def\u5f84 \u804c\u8d23 Contracts <code>packages/skill-family-contracts</code> \u673a\u5668\u53ef\u6267\u884c\u5de5\u7a0b\u7ed3\u6784\u548c\u673a\u5236\u534f\u8bae\u7684\u552f\u4e00\u6743\u5a01 Harness <code>packages/skill-family-harness-node</code> \u53ea\u5b9e\u73b0 Contracts \u5b9a\u4e49\u7684\u673a\u5236\u534f\u8bae\uff0c\u4e0d\u62e5\u6709\u4e1a\u52a1\u8bed\u4e49 Engineering Kit <code>packages/skill-family-engineering-kit</code> \u53ea\u63d0\u4f9b <code>scaffold</code>\u3001<code>adopt-plan</code>\u3001<code>projection</code>\u3001<code>check</code> \u56db\u4e2a\u9876\u5c42\u547d\u4ee4 Profile \u79cd\u5b50 <code>profiles/public-plugin</code> \u516c\u5f00\u63d2\u4ef6\u5f62\u6001\u7684 Profile \u79cd\u5b50 \u865a\u6784\u6837\u4f8b <code>fixtures/generic-profile-extension-conformance</code> \u5b8c\u5168\u865a\u6784\u7684\u6269\u5c55\u4e00\u81f4\u6027\u6837\u4f8b <p>\u5305\u6e05\u5355\u3001Profile\u3001fixture \u4e0e\u9876\u5c42\u547d\u4ee4\u4ee5 <code>.foundation/skeleton-manifest.json</code> \u4e3a\u673a\u5668\u771f\u6e90\uff1b\u5de5\u5177\u7248\u672c\u9501\u5b9a\u89c1 <code>.foundation/version-lock.json</code>\u3002</p>"},{"location":"#\u6587\u6863\u5730\u56fe","title":"\u6587\u6863\u5730\u56fe","text":"<ul> <li>\u5b89\u88c5\u4e0e\u73af\u5883\u2014\u2014\u5de5\u5177\u7248\u672c pin\u3001\u5b89\u88c5\u4e0e\u6587\u6863\u7ad9\u70b9\u6784\u5efa</li> <li>\u5feb\u901f\u5f00\u59cb\u2014\u2014\u4ece\u672c\u5730\u9a8c\u8bc1\u5230\u8bd5\u8fd0\u884c\u7684\u6700\u77ed\u8def\u5f84</li> <li>\u80fd\u529b\u4e0e\u8bca\u65ad\u2014\u2014Kit \u56db\u547d\u4ee4\u3001\u9000\u51fa\u7801\u4e0e\u6545\u969c\u6392\u67e5</li> <li>\u67b6\u6784\u8fb9\u754c\u2014\u2014\u5206\u5c42\u3001\u552f\u4e00\u6743\u5a01\u3001\u9884\u7b97\u4e0e\u6587\u6863\u4e8b\u5b9e\u68c0\u67e5</li> <li>\u5f53\u524d\u4ea7\u54c1\u72b6\u6001\u2014\u2014\u552f\u4e00\u4ea7\u54c1\u72b6\u6001\u9875</li> <li>Git \u751f\u547d\u5468\u671f\u6307\u5357\u2014\u2014\u5206\u652f\u3001\u63d0\u4ea4\u3001\u63a8\u9001\u4e0e\u53d1\u5e03\u7684\u6388\u6743\u8fb9\u754c</li> </ul>"},{"location":"#\u5199\u4f5c\u8fb9\u754c","title":"\u5199\u4f5c\u8fb9\u754c","text":"<p>\u6587\u6863\u53ea\u6d88\u8d39\u673a\u5668\u771f\u6e90\u6784\u6210\u7684\u51bb\u7ed3\u4e8b\u5b9e\u5305\uff08manifest\u3001package.json\u3001Contracts \u767b\u8bb0\u7b49\uff09\uff0c\u7531 <code>node scripts/docs/fact-check.mjs</code> \u673a\u68b0\u6821\u9a8c\u3002\u6a21\u578b\u540d\u3001\u51ed\u636e\u548c\u8c03\u5ea6\u4fe1\u606f\u4e0d\u8fdb\u5165\u6587\u6863\uff0c\u4e5f\u4e0d\u8fdb\u5165 Contracts\uff1b\u8be6\u89c1 \u67b6\u6784\u8fb9\u754c\u3002</p>"},{"location":"architecture/","title":"\u67b6\u6784\u8fb9\u754c","text":""},{"location":"architecture/#\u5206\u5c42","title":"\u5206\u5c42","text":"<pre><code>Contracts <- Harness Node <- Engineering Kit <- Profile <- Skill Family Project\n ^\n \u2514---------------- independent Audit consumer\n</code></pre> <p>\u7bad\u5934\u8868\u793a\u5de6\u4fa7\u662f\u53f3\u4fa7\u7684\u4f9d\u8d56\u3002\u516c\u5171\u6838\u5fc3\u4e0d\u5f97\u53cd\u5411\u4f9d\u8d56\u5177\u4f53 Profile \u6216\u5177\u4f53\u6280\u80fd\u65cf\u3002</p>"},{"location":"architecture/#\u552f\u4e00\u6743\u5a01","title":"\u552f\u4e00\u6743\u5a01","text":"<ul> <li>Contracts\uff1a\u7ed3\u6784\u3001\u534f\u8bae\u3001\u9519\u8bef\u7801\u548c\u534f\u8bae\u540d\u767b\u8bb0\uff1b</li> <li>Harness\uff1aContracts \u7684 Node \u673a\u5236\u5b9e\u73b0\uff1b</li> <li>Kit\uff1a\u56db\u4e2a\u5de5\u7a0b\u547d\u4ee4\u53ca\u5176\u53ea\u8bfb/\u53d7\u9650\u5199\u5165\u8fb9\u754c\uff1b</li> <li>Profile\uff1a\u9879\u76ee\u5f62\u6001\u5dee\u5f02\uff1b</li> <li>Audit\uff1a\u72ec\u7acb fixture\u3001\u9884\u671f\u503c\u548c\u88c1\u51b3\uff1b</li> <li>Release\uff1a\u53d1\u5e03\u72b6\u6001\u548c\u5168\u90e8\u8fdc\u7aef\u5199\u5165\u3002</li> </ul>"},{"location":"architecture/#\u9996\u7248\u9884\u7b97","title":"\u9996\u7248\u9884\u7b97","text":"<ul> <li>\u9876\u5c42 Contracts \u5bf9\u8c61\uff1a6 \u7c7b\uff08project-manifest\u3001profile-descriptor\u3001managed-file-lock\u3001operation-request\u3001operation-result\u3001migration-manifest\uff09\uff1b</li> <li>Kit \u9876\u5c42\u547d\u4ee4\uff1a4 \u4e2a\uff08scaffold\u3001adopt-plan\u3001projection\u3001check\uff09\uff1b</li> <li>\u5f3a\u5236\u673a\u68b0\u89c4\u5219\uff1a\u5f53\u524d 13 \u6761\uff0c\u9884\u7b97\u4e0d\u8d85\u8fc7 20 \u6761\uff0c\u7edd\u5bf9\u4e0a\u9650 30 \u6761\uff1b</li> <li>\u53f6\u5b50\u5305\uff1a3 \u4e2a\uff08skill-family-contracts\u3001skill-family-harness-node\u3001skill-family-engineering-kit\uff09\uff1b</li> <li>Schema \u6821\u9a8c\u5668\uff1aAjv 8.20.0\uff08\u7cbe\u786e\u7248\u672c pin\uff09\uff0c\u652f\u6301 draft-07 \u4e0e 2020-12 \u53cc\u65b9\u8a00\uff1b</li> <li>kernel \u534f\u8bae\uff1askill-family.kernel.operation\uff08stable\uff09\uff0cContracts \u7248\u672c 1.1.1\uff1b</li> <li>\u9ed8\u8ba4\u8fd0\u884c\u65f6\u8bed\u8a00\uff1aNode\uff1b\u7b2c\u4e8c\u8bed\u8a00\u5b9e\u73b0\u9996\u7248\u4e3a 0\u3002</li> </ul> <p>\u4efb\u4f55\u65b0\u589e\u7ec4\u4ef6\u5fc5\u987b\u8bf4\u660e\u5220\u9664\u5b83\u4f1a\u5bfc\u81f4\u7684\u4e24\u4e2a\u4ee5\u4e0a\u771f\u5b9e\u6d88\u8d39\u8005\u91cd\u590d\u5b9e\u73b0\uff0c\u5e76\u901a\u8fc7\u72ec\u7acb fixture \u9a8c\u8bc1\u3002</p>"},{"location":"architecture/#\u673a\u5668\u771f\u6e90\u4e0e\u6587\u4ef6\u5206\u7c7b","title":"\u673a\u5668\u771f\u6e90\u4e0e\u6587\u4ef6\u5206\u7c7b","text":"\u771f\u6e90 \u5185\u5bb9 <code>.foundation/skeleton-manifest.json</code> \u5305\u6e05\u5355\u3001Profile\u3001fixture\u3001\u9876\u5c42\u547d\u4ee4 <code>.foundation/version-lock.json</code> projen\u3001pnpm\u3001Node \u7684\u7cbe\u786e\u7248\u672c\u4e0e\u9501\u5b9a\u70b9 <code>.foundation/file-registry.json</code> managed / handwritten / artifact \u4e09\u7c7b\u6587\u4ef6\u767b\u8bb0 <code>package.json</code> \u4e0e <code>packages/*/package.json</code> \u7248\u672c\u3001\u547d\u4ee4\u3001\u4f9d\u8d56\uff08\u5168\u90e8 projen \u53d7\u7ba1\uff09 <code>packages/skill-family-contracts/src/registry.json</code> \u534f\u8bae\u540d\u4e0e Schema $id \u767b\u8bb0 <code>scripts/release-artifact-contract.json</code> \u56fa\u5b9a\u4e09\u5305\u53d1\u5e03\u5b57\u8282\u5408\u540c\uff08\u6210\u5458\u3001\u5fc5\u9700\u9879\u4e0e\u5185\u5bb9\u6458\u8981\u89c4\u5219\uff09 <p>\u53d7\u7ba1\u6587\u4ef6\u53ea\u80fd\u901a\u8fc7 <code>.projenrc.js</code> \u4fee\u6539\u5e76\u8fd0\u884c <code>pnpm synth</code> \u518d\u751f\u6210\uff1b\u624b\u5199\u6587\u4ef6\uff08\u542b\u5168\u90e8\u6587\u6863\uff09\u4e0d\u4f1a\u88ab synth \u8986\u76d6\u3002\u5206\u7c7b\u6743\u5a01\u89c1 <code>.foundation/file-registry.json</code>\u3002</p>"},{"location":"architecture/#\u6587\u6863\u7cfb\u7edf\u4e0e\u4e8b\u5b9e\u68c0\u67e5","title":"\u6587\u6863\u7cfb\u7edf\u4e0e\u4e8b\u5b9e\u68c0\u67e5","text":"<p>\u6587\u6863\u4f53\u7cfb\u7684\u76ee\u6807\u662f\u7528\u786e\u5b9a\u6027\u68c0\u67e5\u6d88\u9664\u624b\u5de5\u6f02\u79fb\uff1a</p> <ol> <li>\u51bb\u7ed3\u4e8b\u5b9e\u5305\uff1a\u6587\u6863\u5199\u4f5c\u53ea\u6d88\u8d39\u4e0a\u8868\u6240\u5217\u673a\u5668\u771f\u6e90\u3002\u6a21\u578b\u6216\u4f5c\u8005\u4e0d\u5f97\u51ed\u8bb0\u5fc6\u5199\u5165\u7248\u672c\u3001\u547d\u4ee4\u3001\u5305\u6570\uff1b\u6a21\u578b\u540d\u3001\u51ed\u636e\u548c\u8c03\u5ea6\u4fe1\u606f\u4e0d\u8fdb\u5165\u6587\u6863\uff0c\u4e5f\u4e0d\u8fdb\u5165 Contracts\u3002</li> <li>\u4e8b\u5b9e\u68c0\u67e5\uff1a<code>node scripts/docs/fact-check.mjs</code> \u5bf9\u7167\u771f\u6e90\u6821\u9a8c\u6587\u6863\u4e2d\u7684\u5305\u540d\u3001\u547d\u4ee4\u3001\u95e8\u7981\u4e8b\u5b9e\u3001\u7248\u672c pin \u4e0e\u5173\u952e\u6570\u5b57\uff0c\u5e76\u4ea4\u53c9\u6821\u9a8c\u771f\u6e90\u4e4b\u95f4\u7684\u4e00\u81f4\u6027\uff08manifest \u4e0e package.json\u3001version-lock \u4e0e packageManager\u3001\u89c4\u5219\u6570\u4e0e\u9884\u7b97\u7b49\uff09\u3002</li> <li>\u94fe\u63a5\u68c0\u67e5\uff1a<code>node scripts/docs/link-check.mjs</code> \u89e3\u6790 README \u4e0e\u5168\u90e8 <code>docs/**/*.md</code> \u7684\u7ad9\u5185\u76f8\u5bf9\u94fe\u63a5\u548c\u6807\u9898\u951a\u70b9\uff0c\u5e76\u6821\u9a8c <code>mkdocs.yml</code> nav \u6536\u5f55\u5b8c\u6574\u3002</li> <li>\u65e0\u5de5\u4f5c\u6d41\u8fb9\u754c\u4e0e\u516c\u5f00\u8fb9\u754c\u9a8c\u8bc1\uff1a\u672c\u4ed3\u6ca1\u6709\u4efb\u4f55 CI/CD workflow\uff08\u65e7\u62d3\u6251\u7684 ci/docs/docs-deploy \u4e09\u4e2a Actions \u5df2\u6574\u4f53\u5220\u9664\uff09\uff0c\u5168\u90e8\u95e8\u7981\u5728\u79c1\u6709\u5de5\u4f5c\u533a\u5185\u8fd0\u884c\uff08<code>pnpm check</code>\uff09\uff1b\u516c\u5f00\u8fb9\u754c\u7531 <code>check:public-snapshots</code> \u4e0e\u53d1\u5e03\u5b57\u8282\u5408\u540c\u673a\u68b0\u9a8c\u8bc1\uff08public \u955c\u50cf\u6295\u5f71\u4e0e tarball \u9010\u5b57\u8282\u4e00\u81f4\u3001\u516c\u5f00\u8f7d\u8377 allowlist \u7cbe\u786e\u76f8\u7b49\u3001\u79c1\u6709\u4e0e\u516c\u5f00\u8f7d\u8377\u5747\u65e0 workflow\uff09\uff0c\u89c1 <code>scripts/public-snapshot-gate.mjs</code> \u4e0e <code>scripts/render-public-package-json.mjs</code>\u3002\u516c\u5f00\u9759\u6001\u7ad9\u7531 <code>scripts/render-public-site.mjs</code> \u6e32\u67d3\uff08\u552f\u4e00\u8f93\u51fa <code>docs/public/site/**</code> \u4e0e\u786e\u5b9a\u6027\u57fa\u7ebf <code>docs/public/site-baseline.json</code>\uff09\uff0c\u7ad9\u70b9\u6587\u4ef6\u4e0e engineering-kit public \u955c\u50cf\u4ed3\u7684 <code>docs/**</code> \u9010\u6587\u4ef6\u5bf9\u5e94\u3002</li> <li>\u7248\u672c\u9501\u5b9a\uff1a\u7ad9\u70b9\u5de5\u5177\u94fe\u9501\u5b9a\u5728 <code>scripts/docs/toolchain.json</code> \u4e0e <code>scripts/docs/requirements.txt</code>\uff0c\u6784\u5efa\u53ea\u4f7f\u7528\u4ed3\u5e93\u5916\u90e8\u7684 Python \u865a\u62df\u73af\u5883\uff0c\u4e0d\u505a\u7cfb\u7edf\u7ea7 pip install\u3002</li> </ol> <p>\u4e24\u4e2a\u68c0\u67e5\u811a\u672c\u90fd\u53ef\u76f4\u63a5 <code>node scripts/docs/<name>.mjs</code> \u8fd0\u884c\uff1a<code>fact-check.mjs</code> \u662f Node \u811a\u672c\uff0c\u7ecf\u4ed3\u5185\u6a21\u5757\uff08<code>scripts/engine-floor-check.mjs</code>\uff09\u6d88\u8d39\u6839\u76ee\u5f55\u7cbe\u786e\u9501\u5b9a\u7684 <code>semver@7.8.5</code>\uff0c\u8fd0\u884c\u524d\u5fc5\u987b\u5148\u5b8c\u6210 <code>pnpm install --frozen-lockfile</code>\uff1b<code>link-check.mjs</code> \u4e3a\u7eaf Node \u5b9e\u73b0\uff08\u65e0\u7b2c\u4e09\u65b9\u4f9d\u8d56\uff09\u3002\u804c\u8d23\u8bf4\u660e\u89c1 <code>scripts/docs/README.md</code>\u3002</p>"},{"location":"architecture/#\u7a33\u5b9a\u4ea7\u54c1\u95e8\u7981","title":"\u7a33\u5b9a\u4ea7\u54c1\u95e8\u7981","text":"<p>\u6839 <code>pnpm check</code> \u53ea\u7f16\u6392 10 \u4e2a\u7a33\u5b9a\u4ea7\u54c1 gate ID\uff08<code>check:structure</code>\uff5e<code>check:integration</code>\uff0c\u9010 ID \u89c1 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\uff09\uff0c\u4e0d\u518d\u9501\u6b7b\u539f\u59cb\u547d\u4ee4\u6e05\u5355\uff1b\u6bcf\u4e2a\u7a33\u5b9a ID \u5728\u81ea\u5df1\u7684 package script \u5185\u7ec4\u5408\u5c11\u91cf\u4ea7\u54c1\u68c0\u67e5\u3002\u95e8\u7981\u4e8b\u5b9e\u7531 <code>node scripts/docs/fact-check.mjs</code> \u4ece\u6839 <code>package.json</code> \u7684 <code>scripts.check</code> \u673a\u68b0\u63a8\u5bfc\u5e76\u9010\u5b57\u6838\u5bf9\uff08setup \u6295\u5f71\u533a\u5757\u4e0e <code>scripts.check</code> \u9010\u5b57\u4e00\u81f4\uff09\u3002\u6587\u6863\u4e0e setup \u53ea\u8c03\u7528\u6216\u5217\u51fa 10 \u4e2a\u7a33\u5b9a ID \u6216\u6839 <code>pnpm check</code>\uff0c\u4e0d\u590d\u5236\u5e95\u5c42\u547d\u4ee4\u5217\u8868\u3002</p> <p>\u4ed3\u5185\u68c0\u67e5\u7684\u8bda\u5b9e\u8fb9\u754c\uff1a\u7ed3\u6784\u68c0\u67e5\u53ea\u8bc1\u660e\u201c\u5b57\u8282/\u7ed3\u6784\u4e00\u81f4\u6027\uff08\u4ed3\u5185\u53ef\u8bc1\uff09\u201d\uff1b\u4e00\u6b21\u6027\u8fc1\u79fb\u5b8c\u6574\u6027\u3001\u666e\u901a\u6b63\u6587\u8bed\u4e49\u4e0e\u6700\u7ec8\u63a5\u53d7/\u62d2\u7edd\u7ed3\u8bba\u5c5e\u4e8e\u5916\u90e8\u5ba1\u9605\u804c\u8d23\uff0c\u4e0d\u5728\u76ee\u6807\u4ed3\u5185\u7ef4\u62a4\u7b2c\u4e8c\u4efd\u95e8\u7981 registry\u3001baseline \u6216\u547d\u4ee4\u6bd4\u8f83\u5668\u3002</p>"},{"location":"git-lifecycle/","title":"Git \u751f\u547d\u5468\u671f\u6307\u5357","text":"<p>\u672c\u6587\u662f Skill Family \u5404\u5de5\u4f5c\u533a Git \u751f\u547d\u5468\u671f\u89c4\u5219\u7684\u552f\u4e00\u6743\u5a01\u6587\u6863\u3002\u65b0\u5efa\u9879\u76ee\u9aa8\u67b6 \uff08<code>npx skill-family-engineering-kit scaffold</code>\uff09\u4e2d\u7684 AGENTS.md\u300cMinimal Git lifecycle\u300d\u533a\u5757\u4e0e <code>docs/git-lifecycle.md</code> \u9875\u9762\u90fd\u662f\u5bf9\u672c\u6307\u5357\u540c\u53e3\u5f84\u7684\u6295\u5f71\u4e0e\u6307\u9488\u2014\u2014 \u4efb\u4f55\u5de5\u4f5c\u533a\u90fd\u4e0d\u5f97\u518d\u7ef4\u62a4\u7b2c\u4e8c\u5957 Git \u89c4\u5219\u3002\u6240\u6709\u5de5\u5177\u94fe\uff08projen\u3001engineering kit\u3001 CI \u811a\u672c\uff09\u90fd\u4e0d\u6267\u884c Git \u5199\u64cd\u4f5c\uff1b\u4e0b\u8ff0\u6bcf\u4e00\u7c7b\u5199\u64cd\u4f5c\u90fd\u53ea\u6765\u81ea\u4eba\u7684\u663e\u5f0f\u51b3\u5b9a\u3002</p>"},{"location":"git-lifecycle/#\u5206\u652f\u547d\u540d\u4e0e\u5bff\u547d","title":"\u5206\u652f\u547d\u540d\u4e0e\u5bff\u547d","text":"<ul> <li>\u5206\u652f\u6a21\u578b\uff1a\u4e00\u6761\u957f\u671f\u5206\u652f <code>main</code>\uff0c\u52a0\u77ed\u5bff\u547d\u4efb\u52a1\u5206\u652f <code>task/<\u4efb\u52a1\u53f7>-<\u77ed\u6a2a\u7ebf\u6458\u8981></code> \uff08\u4f8b\u5982 <code>task/0050-git-lifecycle</code>\uff09\u3002</li> <li>\u4efb\u52a1\u5206\u652f\u53ea\u627f\u8f7d\u4e00\u4e2a\u4efb\u52a1\u7684\u4e00\u7ec4\u76f8\u5173\u53d8\u66f4\uff1b\u4efb\u52a1\u9a8c\u6536\u901a\u8fc7\u540e\u5408\u5e76\uff1b\u786e\u8ba4\u6ca1\u6709\u672a\u5408\u5e76 \u63d0\u4ea4\u540e\u53ef\u5220\u9664\u672c\u5730\u5206\u652f\u3002\u8fdc\u7aef\u5206\u652f\u5220\u9664\u5c5e\u4e8e push \u7c7b\u5916\u90e8\u5199\u5165\uff0c\u5fc5\u987b\u53e6\u884c\u53d6\u5f97\u663e\u5f0f \u6388\u6743\uff08\u89c1\u4e0b\u6587\u9010\u9879\u6388\u6743\u8282\uff09\uff0c\u5408\u5e76\u672c\u8eab\u4e0d\u81ea\u52a8\u6388\u6743\u8fdc\u7aef\u5220\u9664\u3002\u4e0d\u5b58\u5728\u957f\u671f\u5b58\u6d3b\u7684 \u7279\u6027\u5206\u652f\uff0c\u4e5f\u4e0d\u5141\u8bb8\u5728\u4efb\u52a1\u5206\u652f\u4e0a\u5806\u79ef\u4e0e\u4efb\u52a1\u65e0\u5173\u7684\u53d8\u66f4\u3002</li> <li><code>main</code> \u6c38\u8fdc\u53ea\u63a5\u6536\u5df2\u901a\u8fc7\u95e8\u7981\u7684\u5408\u5e76\uff1b\u4efb\u4f55\u60c5\u51b5\u4e0b\u90fd\u4e0d\u5f97\u5bf9 <code>main</code> \u76f4\u63a5\u63d0\u4ea4\u6216 force-push\u3002</li> </ul>"},{"location":"git-lifecycle/#\u4fee\u6539\u524d\u72b6\u6001\u68c0\u67e5","title":"\u4fee\u6539\u524d\u72b6\u6001\u68c0\u67e5","text":"<ul> <li>\u63d0\u4ea4\u3001\u8fdc\u7aef\u7b49\u5b9e\u65f6 Git \u72b6\u6001\u4e0d\u5199\u8fdb\u4efb\u4f55\u7248\u672c\u5316\u6587\u6863\uff08\u5305\u62ec\u4ea7\u54c1\u72b6\u6001\u9875\uff09\uff1b\u6267\u884c\u4efb\u4f55 Git \u52a8\u4f5c\u524d\uff0c\u5148\u73b0\u573a\u8fd0\u884c\u4e0b\u5217\u53ea\u8bfb\u547d\u4ee4\u53d1\u73b0\u5f53\u524d\u72b6\u6001\uff1a</li> </ul> <p><code>bash git status --short --branch git rev-parse --verify HEAD git remote -v</code></p> <p>\u8fd9\u4e09\u6761\u547d\u4ee4\u53ea\u662f\u53ea\u8bfb\u63a2\u6d4b\uff1a\u8f93\u51fa\u53ea\u53cd\u6620\u672c\u673a\u5de5\u4f5c\u533a\u5f53\u4e0b\u7684\u72b6\u6001\uff0c\u4e0d\u6388\u4e88\u4efb\u4f55\u5199\u6743\u9650\uff1b \u6267\u884c stage/commit/push/tag/release \u4ecd\u5fc5\u987b\u6309\u4e0b\u6587\u9010\u9879\u6388\u6743\u8282\u5355\u72ec\u53d6\u5f97\u6388\u6743\u3002 - \u5f00\u59cb\u4efb\u4f55\u4fee\u6539\u4e4b\u524d\uff0c\u5148\u8fd0\u884c <code>git status --short --branch</code>\uff0c\u786e\u8ba4\u5f53\u524d\u5206\u652f\u3001\u672a\u63d0\u4ea4 \u53d8\u66f4\u4e0e\u8fdc\u7aef\u8ddf\u8e2a\u72b6\u6001\uff1b\u5de5\u4f5c\u533a\u91cc\u51fa\u73b0\u4e0d\u8ba4\u8bc6\u7684\u5206\u652f\u3001\u672a\u6682\u5b58\u53d8\u66f4\u6216\u964c\u751f\u6587\u4ef6\u65f6\uff0c\u5148 \u8c03\u67e5\u6765\u6e90\u518d\u52a8\u624b\uff0c\u90a3\u662f\u522b\u4eba\u6b63\u5728\u8fdb\u884c\u7684\u5de5\u4f5c\uff0c\u4e0d\u662f\u53ef\u4ee5\u968f\u624b\u6e05\u7406\u7684\u566a\u58f0\u3002 - \u7981\u6b62\u7528 <code>git checkout .</code>\u3001<code>git restore .</code>\u3001<code>git clean -f</code>\u3001<code>git reset --hard</code> \u4e4b\u7c7b\u7684\u7834\u574f\u6027\u547d\u4ee4\u201c\u987a\u624b\u201d\u6e05\u7a7a\u5de5\u4f5c\u533a\u6765\u7ed5\u8fc7\u969c\u788d\uff1b\u786e\u9700\u4e22\u5f03\u672a\u63d0\u4ea4\u53d8\u66f4\u65f6\uff0c\u5fc5\u987b \u9010\u6761\u5217\u51fa\u5c06\u88ab\u4e22\u5f03\u7684\u5185\u5bb9\u5e76\u83b7\u5f97\u663e\u5f0f\u786e\u8ba4\u3002</p>"},{"location":"git-lifecycle/#\u539f\u5b50-commit-\u6761\u4ef6","title":"\u539f\u5b50 commit \u6761\u4ef6","text":"<p>\u4e00\u4e2a commit \u5fc5\u987b\u540c\u65f6\u6ee1\u8db3\uff1a</p> <ol> <li>\u53ea\u5305\u542b\u4e00\u4e2a\u903b\u8f91\u53d8\u66f4\uff08\u4e00\u4e2a\u4efb\u52a1\u7684\u63a8\u8fdb\uff0c\u6216\u4e00\u6b21\u660e\u786e\u62c6\u5206\u7684\u4fee\u6b63\uff09\uff1b</li> <li>\u53d7\u7ba1\u751f\u6210\u7269\u4e0e\u5176\u6e90\uff08<code>.projenrc.js</code>\u3001\u6295\u5f71\u811a\u672c\uff09\u5728\u540c\u4e00\u6b21\u63d0\u4ea4\u5185\u6210\u5bf9\u51fa\u73b0\uff1b</li> <li>\u63d0\u4ea4\u524d <code>pnpm check</code>\uff08\u6216\u4efb\u52a1\u6307\u5b9a\u7684\u6700\u5c0f\u9a8c\u8bc1\u5165\u53e3\uff09\u9000\u51fa\u7801\u4e3a 0\u2014\u2014\u4e0d\u5f97\u628a\u7ea2\u7684 \u72b6\u6001\u63d0\u4ea4\u8fdb\u4efb\u4f55\u5206\u652f\u540e\u518d\u201c\u56de\u5934\u4fee\u201d\uff1b</li> <li>\u63d0\u4ea4\u4fe1\u606f\u8bf4\u660e\u201c\u4e3a\u4ec0\u4e48\u201d\uff0c\u5f15\u7528\u4efb\u52a1\u53f7\uff1b\u4e0d\u5f97\u5305\u542b\u51ed\u636e\u3001\u79c1\u6709\u6570\u636e\u6216\u4e0d\u53ef\u516c\u5f00\u7684 \u5185\u90e8\u6807\u8bc6\u3002</li> </ol> <p>\u4e0d\u6ee1\u8db3\u4ee5\u4e0a\u4efb\u4e00\u6761\u4ef6\u7684\u53d8\u66f4\u4e0d\u5f97\u63d0\u4ea4\uff1b\u5b81\u53ef\u62c6\u6210\u591a\u4e2a commit\uff0c\u4e5f\u4e0d\u5408\u5e76\u6210\u4e00\u4e2a\u6df7\u5408 \u53d8\u66f4\u3002</p>"},{"location":"git-lifecycle/#stagecommitpushtagrelease-\u7684\u9010\u9879\u6388\u6743","title":"stage\u3001commit\u3001push\u3001tag\u3001release \u7684\u9010\u9879\u6388\u6743","text":"<ul> <li>\u4fee\u6539\u6388\u6743\u4e0d\u5305\u542b stage \u4e0e commit\uff1a\u83b7\u5f97\u67d0\u4efb\u52a1\u7684\u4fee\u6539\u6388\u6743\uff0c\u53ea\u8868\u793a\u53ef\u4ee5\u5728\u5de5\u4f5c\u533a \u91cc\u6539\u52a8\u6587\u4ef6\uff1bstage\uff08<code>git add</code>\uff09\u4e0e commit \u4ecd\u662f\u4e24\u4e2a\u72ec\u7acb\u7684\u5199\u64cd\u4f5c\uff0c\u5fc5\u987b\u5206\u522b \u6309\u98ce\u9669\u9010\u9879\u53d6\u5f97\u660e\u786e\u6388\u6743\uff0c\u4e0d\u5b58\u5728\u201c\u6388\u6743\u4fee\u6539\u5373\u9ed8\u8ba4\u6388\u6743\u63d0\u4ea4\u201d\u3002</li> <li>stage \u4e0e commit\uff1a\u9ed8\u8ba4\u53ea\u5728\u672c\u5730\u3001\u6309\u539f\u5b50\u6761\u4ef6\u6267\u884c\uff1b\u4e00\u6b21 commit \u6388\u6743\u53ea\u8986\u76d6\u88ab \u660e\u786e\u58f0\u660e\u7684\u90a3\u4e00\u6b21\u672c\u5730\u63d0\u4ea4\uff0c\u4e0d\u8986\u76d6\u4efb\u52a1\u4e4b\u5916\u7684\u6e05\u7406\u3001\u6539\u5199\uff08\u542b amend/rebase \u6539\u5199\u5df2\u63d0\u4ea4\u5185\u5bb9\uff09\u6216\u540e\u7eed\u63d0\u4ea4\u3002</li> <li>push\uff1a\u628a\u4efb\u52a1\u5206\u652f\u63a8\u9001\u5230\u8fdc\u7aef\u3001\u5f00 PR\uff0c\u4ee5\u53ca\u5220\u9664\u8fdc\u7aef\u5206\u652f \uff08<code>git push --delete</code> / <code>git push origin :<branch></code>\uff09\u540c\u5c5e push \u7c7b\u5916\u90e8 \u5199\u5165\uff0c\u90fd\u9700\u8981\u5728\u5f53\u524d\u4efb\u52a1\u91cc\u5355\u72ec\u6388\u6743\uff1b\u7981\u6b62\u76f4\u63a5 push <code>main</code>\u3002\u5408\u5e76\u540e\u7684\u6e05\u7406\u8bf4\u660e \u4e0d\u6784\u6210\u5bf9\u8fdc\u7aef\u5220\u9664\u7684\u81ea\u52a8\u6388\u6743\u3002</li> <li>tag \u4e0e release\uff1a\u6bcf\u4e00\u6b21\u6253 tag\u3001\u53d1\u5e03 release\uff08\u5305\u62ec npm publish\u3001Pages \u90e8\u7f72\u3001 \u5efa\u8fdc\u7aef\u4ed3\u5e93\uff09\u90fd\u662f\u72ec\u7acb\u7684\u9ad8\u98ce\u9669\u52a8\u4f5c\uff0c\u5fc5\u987b\u9010\u9879\u5355\u72ec\u6388\u6743\uff1b\u4e00\u6b21 push \u6388\u6743\u4e0d\u6784\u6210 \u4efb\u4f55 tag/release \u6388\u6743\u3002</li> <li>\u81ea\u52a8\u5316\u5de5\u5177\uff08\u542b AI \u52a9\u624b\u4e0e CI\uff09\u5728\u672a\u83b7\u5f97\u9488\u5bf9\u5f53\u524d\u4efb\u52a1\u7684\u663e\u5f0f\u4eba\u5de5\u6388\u6743\u524d\uff0c\u4e0d\u5f97 \u6267\u884c <code>git add</code>\uff08stage\uff09\u3001<code>git commit</code>\u3001<code>git push</code>\u3001<code>git tag</code> \u6216\u4efb\u4f55\u5efa \u8fdc\u7aef/\u53d1\u5e03/\u5220\u9664\u8fdc\u7aef\u5f15\u7528\u7684\u547d\u4ee4\u3002</li> <li>\u6388\u6743\u53ea\u5bf9\u58f0\u660e\u8005\u7684\u90a3\u4e00\u6b21\u64cd\u4f5c\u6709\u6548\uff0c\u4e0d\u6784\u6210\u5bf9\u540c\u7c7b\u540e\u7eed\u64cd\u4f5c\u7684\u957f\u671f\u653e\u884c\u3002</li> </ul>"},{"location":"git-lifecycle/#\u53d7\u7ba1\u6295\u5f71\u4e0e\u6e90\u540c\u63d0\u4ea4","title":"\u53d7\u7ba1\u6295\u5f71\u4e0e\u6e90\u540c\u63d0\u4ea4","text":"<ul> <li>projen \u53d7\u7ba1\u6587\u4ef6\u53ea\u80fd\u901a\u8fc7\u4fee\u6539 <code>.projenrc.js</code> \u540e\u8fd0\u884c <code>pnpm synth</code> \u4ea7\u751f\uff1b\u751f\u6210\u7269 \u5fc5\u987b\u4e0e\u5176\u6e90\u53d8\u66f4\u5728\u540c\u4e00\u4e2a commit \u5185\u63d0\u4ea4\uff0c\u4e0d\u5f97\u5148\u63d0\u4ea4\u6e90\u3001\u540e\u8865\u751f\u6210\u7269\uff0c\u66f4\u4e0d\u5f97\u53ea \u63d0\u4ea4\u5176\u4e2d\u4e00\u4fa7\u3002</li> <li>\u6587\u6863\u53d7\u7ba1\u6295\u5f71\uff08\u5982 setup.md \u7684\u7a33\u5b9a\u95e8\u7981\u9636\u6bb5\u533a\u5757\uff09\u540c\u7406\uff1a\u6295\u5f71\u811a\u672c\u91cd\u8dd1 \u7684\u8f93\u51fa\u4e0e\u89e6\u53d1\u5b83\u7684\u771f\u6e90\u53d8\u66f4\u540c\u63d0\u4ea4\uff1bCI \u7684\u6f02\u79fb\u68c0\u67e5\uff08synth-drift / synth-idempotency\uff09 \u4f1a\u673a\u68b0\u62e6\u622a\u53ea\u63d0\u4ea4\u4e00\u4fa7\u7684\u53d8\u66f4\u3002</li> </ul>"},{"location":"git-lifecycle/#gitignore-\u5206\u7c7b","title":".gitignore \u5206\u7c7b","text":"<ul> <li>\u6bcf\u4e2a\u88ab\u5ffd\u7565\u7684\u8def\u5f84\u90fd\u5fc5\u987b\u5f52\u5165 <code>.foundation/file-registry.json</code> \u7684\u4e00\u4e2a\u7c7b\u522b\uff1a \u5de5\u5177\u751f\u6210\u7269\uff08artifacts\uff0c\u5982 <code>node_modules/</code>\u3001<code>site/</code>\u3001<code>.cache/</code>\u3001\u65e5\u5fd7\uff09\u8d70 <code>.gitignore</code>\uff1b\u4f9d\u8d56\u9501\u6587\u4ef6\uff08trackedToolLocks\uff0c\u5982 <code>pnpm-lock.yaml</code>\uff09\u88ab\u663e\u5f0f\u8ddf\u8e2a\u3001 \u4e0d\u5f97\u5ffd\u7565\uff1b\u624b\u5199\u6e90\u4e8b\u5b9e\u4e0e\u53d7\u7ba1\u6587\u4ef6\u4e00\u5f8b\u8ddf\u8e2a\u3002</li> <li><code>.gitignore</code> \u7684\u5ffd\u7565\u6a21\u5f0f\u96c6\u5408\u4e0e file-registry \u7684 artifacts \u6a21\u5f0f\u96c6\u5408\u5fc5\u987b\u9010\u5b57 \u4e00\u81f4\uff08<code>scripts/check-structure.mjs</code> \u673a\u68b0\u6838\u5bf9\uff09\uff1b\u65b0\u589e\u5ffd\u7565\u9879\u5fc5\u987b\u5148\u767b\u8bb0\u7c7b\u522b\uff0c \u4e0d\u5141\u8bb8\u51fa\u73b0\u201c\u8ddf\u8e2a\u4f46\u88ab\u5ffd\u7565\u201d\u6216\u201c\u5ffd\u7565\u4f46\u672a\u767b\u8bb0\u201d\u7684\u4e2d\u95f4\u6001\u3002</li> </ul>"},{"location":"git-lifecycle/#\u5220\u9664\u524d\u6838\u5bf9\u4e0e\u53ef\u6062\u590d\u5904\u7f6e","title":"\u5220\u9664\u524d\u6838\u5bf9\u4e0e\u53ef\u6062\u590d\u5904\u7f6e","text":"<ul> <li>\u5220\u9664\u4efb\u4f55\u6587\u4ef6\u3001\u5206\u652f\u6216\u5386\u53f2\u5185\u5bb9\u4e4b\u524d\uff0c\u5148\u6838\u5bf9\u5176\u662f\u5426\u4ecd\u88ab\u5f15\u7528\uff08\u95e8\u7981\u3001\u6587\u6863\u94fe\u63a5\u3001 \u51bb\u7ed3\u8bc1\u636e\u5f15\u7528\uff09\uff1b\u88ab\u51bb\u7ed3\u9a8c\u6536\u8f93\u5165\u5f15\u7528\u7684\u8bc1\u636e\u4e00\u5f8b\u4e0d\u5f97\u5220\u9664\u3002</li> <li>\u4f18\u5148\u53ef\u6062\u590d\u5904\u7f6e\uff1a\u80fd\u6539\u5c31\u4e0d\u5220\uff0c\u80fd\u505c\u7528\uff08\u5982 <code>if: false</code> \u786c\u95e8\u7981\uff09\u5c31\u4e0d\u79fb\u9664\uff1b\u786e\u9700 \u5220\u9664\u65f6\u4fdd\u7559\u53ef\u8ffd\u6eaf\u7684\u66ff\u4ee3\u7269\uff08\u7eed\u63a5\u8bb0\u5f55\u3001\u51b3\u5b9a\u8bb0\u5f55\u3001\u5f52\u6863\u9875\uff09\u3002</li> <li>\u5206\u652f\u9000\u51fa\uff1a\u4efb\u52a1\u5206\u652f\u5408\u5e76\u540e\uff0c\u5148\u786e\u8ba4\u6ca1\u6709\u672a\u5408\u5e76\u7684\u63d0\u4ea4\uff0c\u518d\u5220\u9664\u672c\u5730\u5206\u652f\uff1b\u8fdc\u7aef \u5206\u652f\u5220\u9664\u5c5e\u4e8e push \u7c7b\u5916\u90e8\u5199\u5165\uff0c\u5408\u5e76\u540e\u7684\u6e05\u7406\u8bf4\u660e\u4e0d\u5f97\u81ea\u52a8\u6388\u6743\u8fdc\u7aef\u5220\u9664\uff0c\u987b\u6309 \u9010\u9879\u6388\u6743\u8282\u53e6\u884c\u53d6\u5f97\u663e\u5f0f\u6388\u6743\u3002</li> <li>\u4efb\u4f55\u201c\u5220\u9664\u540e\u91cd\u653e\u201d\u90fd\u5fc5\u987b\u6709\u5148\u7ea2\u540e\u7eff\u7684\u673a\u5668\u8bc1\u636e\uff0c\u8bc1\u660e\u5220\u9664\u4e0d\u662f\u9759\u9ed8\u4e22\u5931\u3002</li> </ul>"},{"location":"git-lifecycle/#\u751f\u6210\u7269\u7981\u6b62\u624b\u6539","title":"\u751f\u6210\u7269\u7981\u6b62\u624b\u6539","text":"<ul> <li>\u5e26 projen \u751f\u6210\u6807\u8bb0\u7684\u6587\u4ef6\u3001\u6295\u5f71\u811a\u672c\u5199\u5165\u7684\u53d7\u7ba1\u533a\u5757\u3001<code>.foundation/</code> \u4e0b\u7684\u673a\u5668 \u771f\u6e90\u4e00\u5f8b\u7981\u6b62\u624b\u6539\uff1b\u624b\u6539\u4f1a\u88ab synth \u6f02\u79fb\u68c0\u67e5\u68c0\u51fa\u5e76\u62e6\u622a\u3002</li> <li>\u9700\u8981\u53d8\u66f4\u53d7\u7ba1\u5185\u5bb9\u65f6\uff0c\u552f\u4e00\u5408\u6cd5\u8def\u5f84\u662f\u4fee\u6539\u5bf9\u5e94\u7684\u6e90\uff08<code>.projenrc.js</code> \u6216\u6295\u5f71\u811a\u672c \u7684\u771f\u6e90\u8f93\u5165\uff09\u518d\u91cd\u65b0\u751f\u6210\uff1b\u201c\u624b\u6539\u540e\u518d\u91cd\u65b0\u751f\u6210\u628a\u5dee\u5f02\u6d17\u767d\u201d\u5c5e\u4e8e\u88ab\u95e8\u7981\u660e\u786e\u62d2\u7edd \u7684\u7be1\u6539\u6a21\u5f0f\u3002</li> </ul>"},{"location":"help/","title":"\u80fd\u529b\u4e0e\u8bca\u65ad","text":"<p>\u4ea7\u54c1\u7ea7\u7684\u5f53\u524d\u72b6\u6001\u53ea\u5728\u552f\u4e00\u72b6\u6001\u9875 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001 \u58f0\u660e\uff08\u7531 <code>node scripts/docs/fact-check.mjs</code> \u5bf9\u7167\u673a\u5668\u771f\u6e90\u673a\u68b0\u6821\u9a8c\uff09\uff1b\u672c\u9875\u6b63\u6587\u4e0d\u590d\u5236\u4efb\u4f55\u52a8\u6001\u72b6\u6001\u53e3\u5f84\u3002\u4ed3\u5185\u68c0\u67e5\u7684\u8bda\u5b9e\u8fb9\u754c\uff1amanifest\u3001package.json\u3001\u95e8\u7981\u811a\u672c\u4e0e\u5de5\u4f5c\u6d41\u7b49\u7ed3\u6784\u68c0\u67e5\u53ea\u8bc1\u660e\u201c\u5b57\u8282/\u7ed3\u6784\u4e00\u81f4\u6027\uff08\u4ed3\u5185\u53ef\u8bc1\uff09\u201d\uff1b\u81ea\u7136\u8bed\u8a00\u8bed\u4e49\u7684\u6b63\u786e\u6027\u4e0d\u5c5e\u4e8e\u4ed3\u5185\u6b63\u5219\u6216\u6458\u8981\u53ef\u8bc1\u660e\u7684\u8303\u56f4\uff0c\u9700\u5916\u90e8\u72ec\u7acb\u5ba1\u9605\u3002</p>"},{"location":"help/#\u5f53\u524d\u80fd\u505a\u4ec0\u4e48","title":"\u5f53\u524d\u80fd\u505a\u4ec0\u4e48","text":"<ul> <li>projen \u53d7\u7ba1\u6587\u4ef6\u7684\u5408\u6210\uff08<code>pnpm synth</code>\uff09\u3001\u53ea\u8bfb\u6f02\u79fb\u68c0\u67e5\uff08<code>pnpm drift</code>\uff09\u4e0e\u5e42\u7b49\u6027\u9a8c\u8bc1\uff08<code>pnpm synth-idempotency</code>\uff09\uff1b</li> <li>Contracts v1 \u6821\u9a8c\uff1a\u516d\u7c7b\u9876\u5c42\u5bf9\u8c61\u3001\u534f\u8bae\u540d\u767b\u8bb0\u3001SFC \u9519\u8bef\u7801\u4f53\u7cfb\u300113 \u6761\u5f3a\u5236\u673a\u68b0\u89c4\u5219\uff08\u9884\u7b97\u4e0d\u8d85\u8fc7 20 \u6761\uff0c\u7edd\u5bf9\u4e0a\u9650 30 \u6761\uff09\uff1b</li> <li>Harness \u673a\u5236\uff1a\u539f\u5b50\u5199\u3001\u8def\u5f84\u4e0e\u7b26\u53f7\u94fe\u63a5\u6536\u5bb9\u3001\u8d44\u6e90\u95ed\u5305\u3001\u4e34\u65f6\u5de5\u4f5c\u533a\u3001kernel \u8bf7\u6c42\u5904\u7406\uff1b</li> <li>Engineering Kit \u56db\u547d\u4ee4\uff08\u89c1\u4e0b\u8282\uff09\uff0c\u5168\u90e8\u4e0d\u6267\u884c Git \u5199\u64cd\u4f5c\u3001\u53d1\u5e03\u6216\u5220\u9664\uff1b</li> <li>\u7a33\u5b9a\u4ea7\u54c1\u95e8\u7981\uff08<code>pnpm check</code> \u4e32\u8054\uff0c\u9010 ID \u89c1 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\uff09\uff1b</li> <li>\u53d1\u5e03\u5b57\u8282\u5408\u540c\uff1a<code>pnpm run release-artifacts:build</code> \u4e0e <code>pnpm run release-artifacts:verify</code>\uff08\u89c1 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\uff09\uff1b</li> <li>\u516c\u5f00\u9759\u6001\u7ad9\u6e32\u67d3\uff1a<code>node scripts/render-public-site.mjs</code>\uff08\u51bb\u7ed3 MkDocs \u73af\u5883 strict \u6784\u5efa\u3001\u5185\u5bb9\u6cc4\u6f0f\u626b\u63cf\u4e0e\u786e\u5b9a\u6027\u57fa\u7ebf\uff1b<code>--write</code> / <code>--check</code> / <code>--self-test</code>\uff09\uff1b</li> <li>\u6587\u6863\u4e8b\u5b9e/\u94fe\u63a5\u68c0\u67e5\uff08<code>node scripts/docs/fact-check.mjs</code>\u3001<code>node scripts/docs/link-check.mjs</code>\uff09\u3002</li> </ul>"},{"location":"help/#\u5f53\u524d\u4e0d\u80fd\u505a\u4ec0\u4e48","title":"\u5f53\u524d\u4e0d\u80fd\u505a\u4ec0\u4e48","text":"<ul> <li>\u4e0d\u63d0\u4f9b\u53d1\u5e03\u3001\u90e8\u7f72\u6216\u8fdc\u7aef\u5199\u5165\u7684\u547d\u4ee4\u80fd\u529b\uff1b\u53d1\u5e03\u4e0e\u90e8\u7f72\u7684\u5f53\u524d\u72b6\u6001\u89c1 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\uff1b</li> <li>\u6ca1\u6709\u7b2c\u4e94\u4e2a Kit \u9876\u5c42\u547d\u4ee4\uff1b<code>check</code> \u53ea\u8bca\u65ad\u3001\u7edd\u4e0d\u81ea\u52a8\u4fee\u590d\uff1b</li> <li>\u4e0d\u505a\u591a\u5bbf\u4e3b\u6295\u5f71\u3001Python \u5bf9\u79f0\u8fd0\u884c\u65f6\u6216\u7b2c\u4e8c\u5957\u6a21\u677f\u5f15\u64ce\uff08\u9996\u7248\u7981\u6b62\u6269\u5f20\u9879\uff09\u3002</li> </ul>"},{"location":"help/#Kit-\u56db\u547d\u4ee4\u4e0e\u526f\u4f5c\u7528","title":"Kit \u56db\u547d\u4ee4\u4e0e\u526f\u4f5c\u7528","text":"<p>CLI \u5165\u53e3\uff1a<code>packages/skill-family-engineering-kit/src/cli.mjs</code>\u3002\u6070\u597d\u56db\u4e2a\u9876\u5c42\u547d\u4ee4\uff1a</p> \u547d\u4ee4 \u4f5c\u7528 \u526f\u4f5c\u7528\u8fb9\u754c <code>scaffold</code> \u5728\u7a7a\u76ee\u5f55\u751f\u6210 Skill Family \u9879\u76ee\u9aa8\u67b6 \u53ea\u5411\u7a7a\u76ee\u6807\u76ee\u5f55\u5199\u5165\u9aa8\u67b6\u6587\u4ef6\uff08\u539f\u5b50\u5199\u3001\u8def\u5f84\u6536\u5bb9\uff09\uff1b\u975e\u7a7a\u6216\u51b2\u7a81\u76ee\u6807\u88ab\u62d2\u7edd\u4e14\u4e0d\u88ab\u89e6\u78b0 <code>adopt-plan</code> \u4e25\u683c\u53ea\u8bfb\u5730\u89c4\u5212\u5b58\u91cf\u4ed3\u91c7\u7528 \u65e0\u2014\u2014\u4e0d\u5199\u4efb\u4f55\u6587\u4ef6\uff08\u542b\u4e34\u65f6\u6587\u4ef6\uff09\uff0c\u4e0d\u8fd0\u884c Git \u5199\u547d\u4ee4\uff1b\u8ba1\u5212\u8f93\u51fa\u5230 stdout <code>projection</code> \u6295\u5f71\u53d7\u7ba1\u751f\u6210\u7269 \u53ea\u5199 manifest \u6388\u6743\u4e14\u88ab\u76ee\u6807\u58f0\u660e\u4e3a\u53d7\u7ba1\u7684\u8def\u5f84\uff1b\u672a\u6388\u6743\u3001\u624b\u5199\u6216\u8d8a\u754c\u8def\u5f84\u4e00\u5f8b\u62d2\u7edd\uff08\u62d2\u7edd\u65f6\u96f6\u5199\u5165\uff09 <code>check</code> \u5951\u7ea6/\u6f02\u79fb/\u95ed\u5305/\u7248\u672c/\u6587\u6863\u4e8b\u5b9e/Git \u524d\u7f6e\u72b6\u6001/\u8bb8\u53ef\u8bc1\u8eab\u4efd\u8bca\u65ad \u65e0\u2014\u2014\u53ea\u8bca\u65ad\u3001\u7edd\u4e0d\u81ea\u52a8\u4fee\u590d\uff1bGit \u4ec5\u53ea\u8bfb\u63a2\u6d4b <p>\u9000\u51fa\u7801\uff1a0 \u6210\u529f\u6216\u65e0\u53d1\u73b0\uff1b1 <code>check</code> \u6709\u53d1\u73b0\uff1b2 \u62d2\u7edd\u3001\u7528\u6cd5\u6216\u673a\u5236\u9519\u8bef\u3002\u6bcf\u6b21\u62d2\u7edd\u90fd\u6253\u5370\u5df2\u6ce8\u518c\u7684 SFC \u9519\u8bef\u7801\u548c\u7a33\u5b9a kind\u3002<code>--fix</code>\u3001<code>--apply</code> \u7b49\u53d8\u66f4\u6a21\u5f0f\u6807\u5fd7\u5728\u5165\u53e3\u5904\u88ab\u62d2\u7edd\uff08\u9000\u51fa\u7801 2\uff09\u3002</p>"},{"location":"help/#check-\u7684\u4e03\u4e2a\u8bca\u65ad\u7c7b","title":"check \u7684\u4e03\u4e2a\u8bca\u65ad\u7c7b","text":"<p><code>check</code> \u547d\u4ee4\u6309\u7c7b\u62a5\u544a\u53d1\u73b0\uff0c\u53ef\u7528 <code>--only <class></code> \u5355\u72ec\u8fd0\u884c\u4e00\u7c7b\uff1a</p> \u7c7b \u68c0\u67e5\u5185\u5bb9 <code>contracts</code> \u53d1\u73b0\u7684\u5951\u7ea6\u6587\u6863\u662f\u5426\u901a\u8fc7\u5df2\u767b\u8bb0 Schema \u6821\u9a8c <code>drift</code> managed-file-lock \u6761\u76ee\u4e0e\u78c1\u76d8\u5b9e\u9645\u5b57\u8282\u662f\u5426\u4e00\u81f4 <code>closure</code> \u58f0\u660e\u8f93\u5165/\u8f93\u51fa\u7684\u8d44\u6e90\u95ed\u5305\u662f\u5426\u5b8c\u6574 <code>version</code> \u58f0\u660e\u7684 Contracts \u7248\u672c\u4e0e\u51bb\u7ed3\u7248\u672c\u662f\u5426\u4e00\u81f4 <code>docs</code> \u6587\u6863\u4e8b\u5b9e\uff08README \u5b58\u5728\u6027\u3001\u8eab\u4efd\u4e00\u81f4\u6027\uff09 <code>git</code> \u53ea\u8bfb Git \u524d\u7f6e\u72b6\u6001\uff08\u7edd\u4e0d\u6267\u884c Git \u5199\uff09 <code>identity</code> \u8bb8\u53ef\u8bc1 Profile \u4e0e\u8eab\u4efd\u9632\u6f02\u79fb\uff08\u673a\u5668\u8eab\u4efd\u8bb0\u5f55\u4e3a\u6743\u5a01\uff09"},{"location":"help/#\u6545\u969c\u6392\u67e5","title":"\u6545\u969c\u6392\u67e5","text":"<ul> <li>\u547d\u4ee4\u5931\u8d25\u65f6\u5148\u786e\u8ba4 Node\u3001pnpm \u4e0e\u9501\u6587\u4ef6\u4e00\u81f4\uff08\u89c1 \u5b89\u88c5\u4e0e\u73af\u5883\uff09\uff0c\u518d\u8fd0\u884c <code>pnpm synth</code>\uff1b\u4e0d\u8981\u624b\u6539 projen \u751f\u6210\u6587\u4ef6\u6765\u7ed5\u8fc7\u5931\u8d25\uff1b</li> <li>Git \u5199\u64cd\u4f5c\u7684\u6388\u6743\u8fb9\u754c\u552f\u4e00\u89c1 Git \u751f\u547d\u5468\u671f\u6307\u5357\uff1b\u672a\u83b7\u9488\u5bf9\u5f53\u524d\u4efb\u52a1\u7684\u663e\u5f0f\u6388\u6743\u65f6\u4e0d\u5f97\u6267\u884c\u4efb\u4f55 Git \u5199\u64cd\u4f5c\uff1b</li> <li><code>pnpm check</code> \u5931\u8d25\u4f1a\u6253\u5370\u5177\u4f53\u95e8\u7981\u4e0e\u8def\u5f84\uff1b\u6309\u63d0\u793a\u4fee\u590d\u6839\u56e0\uff0c\u4e0d\u5f97\u4e3a\u8f6c\u7eff\u653e\u5bbd\u68c0\u67e5\u6216\u4fee\u6539\u72ec\u7acb\u9884\u671f\u503c\uff1b</li> <li>\u5e76\u884c\u5f00\u53d1\u65f6\u82e5\u7591\u4f3c\u8d44\u6e90\u62a2\u5360\u5bfc\u81f4\u5076\u53d1\u5931\u8d25\uff0c\u7a0d\u5019\u91cd\u8bd5\u4e00\u6b21\u518d\u4e0b\u7ed3\u8bba\uff1b</li> <li>\u6587\u6863\u7ad9\u70b9\u6784\u5efa\u5931\u8d25\u65f6\u4f18\u5148\u6838\u5bf9 <code>scripts/docs/requirements.txt</code> \u662f\u5426\u4e0e <code>scripts/docs/toolchain.json</code> \u4e00\u81f4\uff08<code>node scripts/docs/fact-check.mjs</code> \u4f1a\u6821\u9a8c\uff09\u3002</li> </ul>"},{"location":"quickstart/","title":"\u5feb\u901f\u5f00\u59cb","text":""},{"location":"quickstart/#\u7b2c\u4e00\u6b21\u672c\u5730\u9a8c\u8bc1","title":"\u7b2c\u4e00\u6b21\u672c\u5730\u9a8c\u8bc1","text":"<pre><code>pnpm install\npnpm synth\npnpm check\n</code></pre> <p><code>pnpm check</code> \u9000\u51fa\u7801 0 \u5373\u7edf\u4e00\u6839\u95e8\u7981\u5168\u90e8\u901a\u8fc7\uff1a\u7a33\u5b9a\u95e8\u7981 ID \u6309\u56fa\u5b9a\u987a\u5e8f\u4e32\u8054\u6267\u884c\u3002\u9010 ID \u6e05\u5355\u4e0e\u4ea7\u54c1\u7ea7\u5f53\u524d\u72b6\u6001\u89c1 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\u3002</p>"},{"location":"quickstart/#\u63a5\u624b\u5f00\u53d1","title":"\u63a5\u624b\u5f00\u53d1","text":"<ol> <li>\u5b8c\u6574\u8bfb\u53d6\u6839\u7ea7 <code>AGENTS.md</code>\uff08\u5de5\u7a0b\u7ea6\u5b9a\uff09\u4e0e Git \u751f\u547d\u5468\u671f\u6307\u5357\uff08Git \u5199\u64cd\u4f5c\u7684\u6388\u6743\u8fb9\u754c\uff09\uff1b</li> <li>\u53ea\u4fee\u6539\u5f53\u524d\u4efb\u52a1\u6388\u6743\u7684\u5199\u96c6\uff0c\u4e0d\u987a\u624b\u4fee\u6539\u65e0\u5173\u6587\u4ef6\uff1b</li> <li>\u8fd0\u884c\u4efb\u52a1\u6307\u5b9a\u7684\u9a8c\u6536\u547d\u4ee4\u548c\u6839 <code>pnpm check</code>\uff0c\u8bb0\u5f55\u9000\u51fa\u7801\uff1b</li> <li>\u6c47\u62a5\u8bc1\u636e\u3001\u5269\u4f59\u98ce\u9669\u548c\u672a\u6267\u884c\u7684\u5916\u90e8\u52a8\u4f5c\uff08commit\u3001push\u3001\u53d1\u5e03\u7b49\u9ed8\u8ba4\u5168\u90e8\u4e0d\u6267\u884c\uff09\u3002</li> </ol> <p>\u4e0d\u8981\u628a\u5f53\u524d\u7684\u79cd\u5b50 JSON \u5f53\u4f5c\u6b63\u5f0f Contracts\uff0c\u4e5f\u4e0d\u8981\u5728\u4e00\u4e2a\u4efb\u52a1\u91cc\u540c\u65f6\u5b9e\u73b0 Contracts\u3001Harness\u3001Kit\u3001\u5ba1\u8ba1\u548c\u8fc1\u79fb\u3002</p>"},{"location":"quickstart/#\u8bd5\u8fd0\u884c-Kit-\u56db\u547d\u4ee4","title":"\u8bd5\u8fd0\u884c Kit \u56db\u547d\u4ee4","text":"<p>\u5b89\u88c5 Kit \u5305\uff08<code>skill-family-engineering-kit</code> \u7684\u53d1\u5e03\u5305\u6216\u672c\u5730\u6253\u5305\u4ea7\u51fa\u7684 tarball\uff09\u540e\uff0c\u7a33\u5b9a\u5165\u53e3\u662f\u8be5\u5305\u767b\u8bb0\u7684 bin\uff08\u6307\u5411 <code>src/cli.mjs</code>\uff09\uff1b\u9ed8\u8ba4\u8bb8\u53ef\u8bc1 Profile \u968f\u5305\u95ed\u5305\u89e3\u6790\uff0c\u65e0\u9700 <code>--profiles-root</code>\uff1a</p> <pre><code># \u5728\u7a7a\u76ee\u5f55\u751f\u6210\u5b8c\u6574\u9879\u76ee\u9aa8\u67b6\uff08\u76ee\u6807\u5fc5\u987b\u4e3a\u7a7a\uff0c\u5199\u5165\u5168\u90e8\u539f\u5b50\u4e14\u53d7\u8def\u5f84\u6536\u5bb9\uff09\nnpx skill-family-engineering-kit scaffold --root ./demo-project --project-id demo-project\n\n# \u5bf9\u9aa8\u67b6\u76ee\u6807\u505a\u8bca\u65ad\uff08\u9000\u51fa\u7801 0 = \u65e0\u53d1\u73b0\uff09\nnpx skill-family-engineering-kit check --root ./demo-project\n\n# \u5bf9\u5b58\u91cf\u4ed3\u505a\u4e25\u683c\u53ea\u8bfb\u7684\u91c7\u7528\u89c4\u5212\uff08\u4e0d\u5199\u4efb\u4f55\u6587\u4ef6\uff0c\u8ba1\u5212\u8f93\u51fa\u5230 stdout\uff09\nnpx skill-family-engineering-kit adopt-plan --root .\n</code></pre> <p>\u672c monorepo \u5185\u4e5f\u53ef\u7b49\u4ef7\u4f7f\u7528 <code>node packages/skill-family-engineering-kit/src/cli.mjs <command></code>\uff1b\u603b\u5e2e\u52a9\uff08\u6070\u597d\u56db\u4e2a\u9876\u5c42\u547d\u4ee4\u53ca\u5404\u81ea\u7684\u526f\u4f5c\u7528\u58f0\u660e\uff09\u7528 <code>--help</code> \u67e5\u770b\u3002</p> <p>\u9000\u51fa\u7801\u7ea6\u5b9a\uff1a0 \u6210\u529f\u6216\u65e0\u53d1\u73b0\uff1b1 <code>check</code> \u6709\u53d1\u73b0\uff1b2 \u62d2\u7edd\u3001\u7528\u6cd5\u6216\u673a\u5236\u9519\u8bef\u3002\u9519\u8bef\u6d88\u606f\u643a\u5e26\u5df2\u6ce8\u518c\u7684 SFC \u9519\u8bef\u7801\u3002\u547d\u4ee4\u526f\u4f5c\u7528\u4e0e\u8bca\u65ad\u5206\u7c7b\u8be6\u89c1 \u80fd\u529b\u4e0e\u8bca\u65ad\u3002</p>"},{"location":"quickstart/#\u6d88\u8d39\u5750\u6807","title":"\u6d88\u8d39\u5750\u6807","text":"<p>\u4e09\u4e2a\u53f6\u5b50\u5305\uff08<code>skill-family-contracts</code>\u3001<code>skill-family-harness-node</code>\u3001<code>skill-family-engineering-kit</code>\uff09\u7ecf npm \u4e0e\u5bf9\u5e94\u7684 public \u53d1\u5e03\u955c\u50cf\u5206\u53d1\u3002\u53d1\u5e03\u955c\u50cf\u4e0d\u627f\u8f7d\u5b8c\u6574\u5f00\u53d1\u5386\u53f2\u4e0e\u6d4b\u8bd5\uff0c\u4e5f\u4e0d\u63a5\u53d7\u76f4\u63a5 PR\uff1b\u9489\u4f4f\u7684\u6d88\u8d39\u5750\u6807\u4e0e\u5f53\u524d\u53d1\u5e03\u72b6\u6001\u552f\u4e00\u8bb0\u5f55\u5728 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\u3002</p>"},{"location":"quickstart/#\u6587\u6863\u81ea\u68c0","title":"\u6587\u6863\u81ea\u68c0","text":"<p>\u4fee\u6539\u6587\u6863\u540e\u8fd0\u884c\uff1a</p> <pre><code>node scripts/docs/fact-check.mjs\nnode scripts/docs/link-check.mjs\n</code></pre> <p>\u4e8b\u5b9e\u68c0\u67e5\u5bf9\u7167\u673a\u5668\u771f\u6e90\uff08manifest\u3001package.json\u3001Contracts \u767b\u8bb0\u3001\u7248\u672c\u9501\u4e0e\u5de5\u4f5c\u6d41\uff09\uff0c\u94fe\u63a5\u68c0\u67e5\u89e3\u6790\u5168\u90e8\u7ad9\u5185\u76f8\u5bf9\u94fe\u63a5\u4e0e\u951a\u70b9\u3002</p>"},{"location":"setup/","title":"\u5b89\u88c5\u4e0e\u73af\u5883","text":""},{"location":"setup/#\u5fc5\u9700\u73af\u5883","title":"\u5fc5\u9700\u73af\u5883","text":"\u5de5\u5177 \u7248\u672c \u9501\u5b9a\u70b9 Node.js 22.22.2\uff08\u9501\u5b9a major 22 \u5e76\u7cbe\u786e\u63d0\u9ad8 floor\uff1a<code>>=22.22.2 <23</code>\uff09 <code>.node-version</code>\uff08\u53d6\u7cbe\u786e floor\uff09\u3001\u6839\u4e0e\u5404\u53f6\u5b50\u5305 <code>package.json</code> \u7684 <code>engines.node</code>\uff1bfloor \u7531 <code>scripts/engine-floor-check.mjs</code> \u4ece\u56fa\u5b9a\u6839 devDependencies \u7684 engines \u5b9e\u65f6\u91cd\u7b97\uff0cfact-check J \u8282\u7ed1\u5b9a\u6587\u6863\u8868\u9762 pnpm 10.30.0 <code>package.json</code> \u7684 <code>packageManager</code> projen 0.101.23 <code>package.json</code> \u7684 <code>devDependencies.projen</code>\uff08\u7cbe\u786e\u7248\u672c\uff0c\u65e0\u8303\u56f4\u7b26\u53f7\uff09 Git \u8fd1\u5e74\u7248\u672c\u5373\u53ef \u4ec5\u5f00\u53d1\u8005\u81ea\u884c\u7ba1\u7406\u7248\u672c\uff1b\u672c\u4ed3\u811a\u672c\u4e0d\u6267\u884c Git \u5199\u64cd\u4f5c <p>\u5de5\u5177\u7248\u672c\u4e0e\u9501\u5b9a\u70b9\u767b\u8bb0\u5728 <code>.foundation/version-lock.json</code>\uff08projen \u751f\u6210\u7684\u673a\u5668\u771f\u6e90\uff0c\u7981\u6b62\u624b\u6539\uff09\u3002\u5347\u7ea7\u6d41\u7a0b\u89c1 <code>scripts/README.md</code>\u3002</p>"},{"location":"setup/#\u5b89\u88c5\u4f9d\u8d56","title":"\u5b89\u88c5\u4f9d\u8d56","text":"<pre><code>pnpm install\n</code></pre> <p><code>.npmrc</code> \u542f\u7528 <code>save-exact=true</code>\uff0c\u65b0\u589e\u4f9d\u8d56\u4e5f\u4f1a\u4ee5\u7cbe\u786e\u7248\u672c\u5199\u5165\u3002</p>"},{"location":"setup/#\u5408\u6210\u4e0e\u68c0\u67e5","title":"\u5408\u6210\u4e0e\u68c0\u67e5","text":"<pre><code>pnpm synth\npnpm check\n</code></pre> <ul> <li><code>pnpm synth</code> \u518d\u751f\u6210 projen \u53d7\u7ba1\u6587\u4ef6\u3002\u53d7\u7ba1\u6587\u4ef6\u53ea\u80fd\u901a\u8fc7\u4fee\u6539 <code>.projenrc.js</code> \u95f4\u63a5\u53d8\u66f4\uff1b\u624b\u5199\u6e90\u7801\u3001\u6587\u6863\u548c fixture \u4e0d\u4f1a\u88ab synth \u8986\u76d6\u3002</li> <li><code>pnpm check</code> \u662f\u5f53\u524d\u7edf\u4e00\u6839\u95e8\u7981\uff1a10 \u4e2a\u7a33\u5b9a\u95e8\u7981 ID \u6309\u56fa\u5b9a\u987a\u5e8f\u4e32\u8054\u6267\u884c\uff0c\u4efb\u4e00\u6b65\u9aa4\u975e 0 \u5373\u6574\u4f53\u5931\u8d25\uff1b\u672c\u4ed3\u6ca1\u6709\u4efb\u4f55 CI/CD workflow\uff0c\u5168\u90e8\u95e8\u7981\u90fd\u5728\u79c1\u6709\u5de5\u4f5c\u533a\u5185\u8fd0\u884c\u3002\u4e0b\u65b9\u533a\u5757\u7531\u6839 <code>package.json</code> \u7684 <code>scripts.check</code> \u673a\u68b0\u6295\u5f71\uff08<code>node scripts/docs/fact-check.mjs</code> \u9010\u5b57\u6838\u5bf9\uff0c\u7981\u6b62\u624b\u5199\u6e05\u5355\u518d\u6b21\u6ede\u540e\uff09\uff1a</li> </ul> <ol> <li>pnpm run check:structure</li> <li>pnpm run check:packages</li> <li>pnpm run check:profiles</li> <li>pnpm run check:public-boundary</li> <li>pnpm run check:scaffold</li> <li>pnpm run check:docs</li> <li>pnpm run check:public-snapshots</li> <li>pnpm run check:release-artifacts</li> <li>pnpm run check:projen</li> <li>pnpm run check:integration</li> </ol> <ul> <li>\u53d1\u5e03\u5b57\u8282\u5408\u540c\u7531\u4e24\u4e2a\u56fa\u5b9a\u5165\u53e3\u627f\u8f7d\uff1a<code>pnpm run release-artifacts:build</code>\uff08\u6784\u5efa\u5019\u9009\u4ea7\u7269\uff09\u4e0e <code>pnpm run release-artifacts:verify</code>\uff08\u6309\u5408\u540c\u6821\u9a8c\uff09\uff0c\u63a5\u53e3\u4e0e\u62d2\u7edd\u77e9\u9635\u8be6\u89c1 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\u3002</li> <li>\u8017\u65f6\u7684 Python \u6587\u6863\u77e9\u9635\u4e0d\u5c5e\u4e8e <code>pnpm check</code>\uff1a\u5b83\u6709\u72ec\u7acb\u5165\u53e3 <code>node scripts/docs/verify-matrix.mjs</code>\uff08\u77e9\u9635\u7248\u672c\u8986\u76d6\u7531\u8be5\u811a\u672c\u5bf9\u7167 <code>scripts/docs/toolchain.json</code> \u673a\u68b0\u6838\u5bf9\uff1b\u672c\u4ed3\u65e0 CI\uff0c\u77e9\u9635\u4e0d\u58f0\u660e\u5728\u4efb\u4f55\u5de5\u4f5c\u6d41\u91cc\uff09\u3002</li> </ul> <p>\u5176\u4f59\u547d\u4ee4\uff1a<code>pnpm test</code>\uff08\u4ec5\u6d4b\u8bd5\uff09\u3001<code>pnpm drift</code>\uff08\u53ea\u8bfb synth \u6f02\u79fb\u68c0\u67e5\uff09\u3001<code>pnpm synth-idempotency</code>(\u5e42\u7b49\u6027\u9a8c\u8bc1)\u3001<code>pnpm fixtures-projen</code>\uff08projen \u53cd\u4f8b fixture\uff09\u3002</p>"},{"location":"setup/#\u6587\u6863\u7ad9\u70b9Material-for-MkDocs","title":"\u6587\u6863\u7ad9\u70b9\uff08Material for MkDocs\uff09","text":"<p>\u6587\u6863\u7ad9\u70b9\u9501\u5b9a mkdocs 1.6.1 \u4e0e Material for MkDocs 9.7.7\u3002\u4f9d\u8d56\u9501\u662f <code>pip-compile --generate-hashes</code> \u751f\u6210\u7684\u5b8c\u6574\u5185\u5bb9\u9501\uff08\u5168\u90e8\u9876\u5c42\u4e0e\u4f20\u9012\u4f9d\u8d56\u90fd\u5e26 SHA-256 hash\uff09\uff0c\u89c1 <code>scripts/docs/requirements.txt</code>\uff08\u4eba\u5de5\u8f93\u5165\u53ea\u6709\u540c\u76ee\u5f55\u7684 <code>requirements.in</code>\uff09\uff1b\u5de5\u5177\u94fe\u771f\u6e90\u89c1 <code>scripts/docs/toolchain.json</code>\u3002Python 3.10 \u6216\u66f4\u9ad8\u5373\u53ef\uff08<code>node scripts/docs/verify-matrix.mjs</code> \u5728\u6700\u4f4e\u7248 3.10 \u4e0e tested 3.14 \u4e0a\u90fd\u4f1a\u7528\u5168\u65b0\u865a\u62df\u73af\u5883\u590d\u73b0\u5b89\u88c5\u4e0e\u4e25\u683c\u6784\u5efa\uff09\u3002</p> <p>\u7ea6\u5b9a\uff1a\u4e0d\u505a\u7cfb\u7edf\u7ea7 pip install\uff0c\u865a\u62df\u73af\u5883\u5fc5\u987b\u5efa\u5728\u4ed3\u5e93\u5916\u90e8\u3002\u539f\u56e0\u662f\u6839 <code>pnpm check</code> \u4f1a\u5bf9\u5168\u4ed3\u505a\u672c\u5730\u7edd\u5bf9\u8def\u5f84\u5b57\u8282\u626b\u63cf\uff08\u89c1 <code>node scripts/check-structure.mjs</code>\uff09\uff0c\u800c macOS/Windows \u4e0a\u7684\u865a\u62df\u73af\u5883\u5185\u90e8\u5d4c\u6709\u672c\u673a\u7edd\u5bf9\u8def\u5f84\uff0c\u653e\u8fdb\u4ed3\u5e93\u4f1a\u9020\u6210\u8bef\u62a5\u3002</p> <p>\u5b89\u88c5\u547d\u4ee4\u7edf\u4e00\u4f7f\u7528 <code>--require-hashes</code>\uff08\u5185\u5bb9\u9501\u8981\u6c42\u9010\u6761\u6821\u9a8c hash\uff09\uff1a</p> <pre><code># \u5728\u4ed3\u5e93\u5916\u90e8\u521b\u5efa\u865a\u62df\u73af\u5883\uff08\u8def\u5f84\u53ef\u6309\u9700\u66ff\u6362\uff0c\u793a\u4f8b\u7528\u7236\u76ee\u5f55\uff09\npython3 -m venv ../docs-site-venv\n\n# \u7528\u54c8\u5e0c\u9501\u5b89\u88c5\u9501\u5b9a\u7248\u672c\uff08\u5b57\u8282\u4e0d\u7b26\u4f1a\u76f4\u63a5\u5931\u8d25\uff09\n../docs-site-venv/bin/pip install --require-hashes -r scripts/docs/requirements.txt\n\n# \u4e25\u683c\u6a21\u5f0f\u6784\u5efa\uff08\u4efb\u4f55\u8b66\u544a\u90fd\u4f1a\u5931\u8d25\uff09\uff0c\u8f93\u51fa\u5230 site/\uff08\u5df2\u88ab .gitignore \u5ffd\u7565\uff09\n../docs-site-venv/bin/mkdocs build --strict\n\n# \u672c\u5730\u9884\u89c8\uff08\u53ef\u9009\uff09\n../docs-site-venv/bin/mkdocs serve\n</code></pre> <p>\u79bb\u7ebf\u73af\u5883\u5b89\u88c5\uff08\u56fa\u5b9a\u6d41\u7a0b\uff09\uff1a\u5728\u7ebf\u673a\u5668\u53ea\u4e0b\u8f7d wheelhouse\uff0c\u79bb\u7ebf\u5b89\u88c5\u5fc5\u987b\u8fdb\u5165\u4e00\u4e2a\u4ece\u672a\u5728\u7ebf\u5b89\u88c5\u8fc7\u7684\u65b0 offline venv\u2014\u2014\u590d\u7528\u5728\u7ebf venv \u65e0\u6cd5\u8bc1\u660e\u79bb\u7ebf\u94fe\u8def\u53ef\u7528\uff1a</p> <pre><code># 1. \u5728\u7ebf\u673a\u5668\uff1a\u4e0b\u8f7d wheelhouse\uff08\u4e0b\u8f7d\u540c\u6837\u9010\u6761\u6821\u9a8c hash\uff1b\u672c\u6b65\u4e0d\u5b89\u88c5\u5230\u4efb\u4f55 venv\uff09\npython3 -m pip download --require-hashes -r scripts/docs/requirements.txt -d ../docs-wheels\n\n# 2. \u79bb\u7ebf\u673a\u5668\uff1a\u65b0\u5efa\u4e00\u4e2a\u4ece\u672a\u5728\u7ebf\u5b89\u88c5\u8fc7\u7684 offline venv\uff08\u8def\u5f84\u53ef\u6309\u9700\u66ff\u6362\uff0c\u4e0d\u5f97\u590d\u7528 ../docs-site-venv\uff09\npython3 -m venv ../docs-site-offline-venv\n\n# 3. \u5b8c\u5168\u79bb\u7ebf\u5b89\u88c5\uff1a\u4e0d\u8bbf\u95ee\u4efb\u4f55\u7d22\u5f15\uff0c\u53ea\u4ece wheelhouse \u89e3\u6790\uff0c\u7ee7\u7eed\u9010\u6761\u6821\u9a8c hash\uff08\u5b57\u8282\u4e0d\u7b26\u76f4\u63a5\u5931\u8d25\uff09\n../docs-site-offline-venv/bin/pip install --no-index --find-links ../docs-wheels --require-hashes -r scripts/docs/requirements.txt\n\n# 4. \u4e25\u683c\u6a21\u5f0f\u6784\u5efa\uff08\u4efb\u4f55\u8b66\u544a\u90fd\u4f1a\u5931\u8d25\uff09\n../docs-site-offline-venv/bin/mkdocs build --strict\n</code></pre>"},{"location":"setup/#\u516c\u5f00\u9759\u6001\u7ad9render-public-sitemjs","title":"\u516c\u5f00\u9759\u6001\u7ad9\uff08render-public-site.mjs\uff09","text":"<p>\u516c\u5f00\u9759\u6001\u7ad9\u662f\u672c\u4ed3\u6587\u6863\u7ad9\u7684\u516c\u5f00\u5b50\u96c6\uff0c\u552f\u4e00\u7531 <code>scripts/render-public-site.mjs</code> \u7528\u4e0a\u8ff0\u51bb\u7ed3 MkDocs \u73af\u5883\u6e32\u67d3\uff1a</p> <ul> <li>\u811a\u672c\u53ea\u53d1\u73b0\u5e76\u6821\u9a8c\u51bb\u7ed3\u865a\u62df\u73af\u5883\uff08<code>SKILL_FAMILY_DOCS_VENV</code>\uff0c\u6216\u6309\u672c\u8282\u6b65\u9aa4\u5efa\u7684 <code>../docs-site-venv</code> / <code>../docs-site-offline-venv</code>\uff09\uff0c\u81ea\u8eab\u4e0d\u505a\u4efb\u4f55\u5b89\u88c5\uff1b</li> <li>\u6267\u884c\u4e24\u6b21 strict \u6784\u5efa\u5e76\u8981\u6c42\u6811\u54c8\u5e0c\u4e00\u81f4\uff08\u786e\u5b9a\u6027\uff09\uff0c\u968f\u540e\u590d\u7528 <code>scripts/leak-scan.mjs</code> \u6838\u5fc3\u4e0e <code>scripts/leak-policy.json</code> \u505a\u5185\u5bb9\u6cc4\u6f0f\u626b\u63cf\uff1b</li> <li><code>--write</code> \u53ea\u5199 <code>docs/public/site/**</code> \u4e0e <code>docs/public/site-baseline.json</code>\uff1b<code>--check</code> \u96f6\u5199\u5165\u91cd\u7b97\u5e76\u6bd4\u5bf9\u57fa\u7ebf\uff1b<code>--self-test</code> \u8fd0\u884c\u4e3b\u52a8\u53cd\u4f8b\u81ea\u6d4b\uff1b</li> <li>symlink\u3001\u7279\u6b8a\u6587\u4ef6\u3001\u8d8a\u754c realpath\u3001\u5355\u6587\u4ef6\u8d85\u9650\u4e0e\u4e0d\u786e\u5b9a\u8f93\u51fa\u4e00\u5f8b\u62d2\u7edd\uff1b\u57fa\u7ebf\u7981\u6b62\u624b\u6539\uff08\u6e32\u67d3\u5668\u662f\u552f\u4e00\u5199\u5165\u9762\uff09\u3002</li> </ul> <pre><code>node scripts/render-public-site.mjs --write\nnode scripts/render-public-site.mjs --check\n</code></pre> <p>\u7ad9\u70b9\u6587\u4ef6\u4e0e engineering-kit public \u53d1\u5e03\u955c\u50cf\u4ed3\u7684 <code>docs/**</code> \u9010\u6587\u4ef6\u5bf9\u5e94\uff08\u6620\u5c04\u7531\u53d1\u5e03\u914d\u7f6e\u6267\u884c\uff0c\u672c\u4ed3\u4e0d\u76f4\u63a5\u5199\u955c\u50cf\uff09\uff1bPages \u5b9e\u4f8b\u662f\u5426\u5728\u7ebf\u662f\u53d1\u5e03\u540e\u9a8c\u8bc1\u4e8b\u5b9e\uff0c\u53e3\u5f84\u552f\u4e00\u89c1 \u5f53\u524d\u4ea7\u54c1\u72b6\u6001\u3002</p>"},{"location":"setup/#\u6587\u6863\u4e8b\u5b9e\u4e0e\u94fe\u63a5\u68c0\u67e5","title":"\u6587\u6863\u4e8b\u5b9e\u4e0e\u94fe\u63a5\u68c0\u67e5","text":"<p>\u6587\u6863\u4e2d\u7684\u7248\u672c\u3001\u547d\u4ee4\u3001\u5305\u6570\u4e0e\u95e8\u7981\u4e8b\u5b9e\u7531\u786e\u5b9a\u6027\u811a\u672c\u5bf9\u7167\u673a\u5668\u771f\u6e90\u6821\u9a8c\uff0c\u94fe\u63a5\u7531\u72ec\u7acb\u811a\u672c\u89e3\u6790\uff1a</p> <pre><code>node scripts/docs/fact-check.mjs\nnode scripts/docs/link-check.mjs\n</code></pre> <p><code>fact-check.mjs</code> \u662f Node \u811a\u672c\uff0c\u7ecf\u4ed3\u5185\u6a21\u5757\uff08<code>scripts/engine-floor-check.mjs</code>\uff09\u6d88\u8d39\u6839\u76ee\u5f55\u7cbe\u786e\u9501\u5b9a\u7684 <code>semver@7.8.5</code>\uff0c\u8fd0\u884c\u524d\u5fc5\u987b\u5148\u5b8c\u6210 <code>pnpm install --frozen-lockfile</code>\uff1b<code>link-check.mjs</code> \u4e3a\u7eaf Node \u5b9e\u73b0\uff08\u65e0\u7b2c\u4e09\u65b9\u4f9d\u8d56\uff09\u3002\u4e24\u8005\u9000\u51fa\u7801 0 \u8868\u793a\u901a\u8fc7\u3002\u811a\u672c\u804c\u8d23\u89c1 <code>scripts/docs/README.md</code>\u3002</p>"},{"location":"integration/audit/","title":"\u72ec\u7acb\u5ba1\u8ba1\u96c6\u6210\uff08FND-060\uff09","text":"<p>\u672c\u76ee\u5f55\u662f\u72ec\u7acb\u5ba1\u8ba1\uff08Audit\uff09\u6d88\u8d39\u5df2\u53d1\u5e03 Contracts \u7684\u6700\u5c0f\u96c6\u6210\u9762\u3002\u5ba1\u8ba1\u7684\u804c\u8d23\u662f\uff1a\u4ee5\u72ec\u7acb\u4e8e\u751f\u6210\u5668\u4e0e oracle \u7684 fixture\u3001\u9884\u671f\u503c\u548c\u88c1\u51b3\uff0c\u9a8c\u8bc1\u88ab\u6d88\u8d39\u7684 <code>skill-family-contracts</code> \u5305\u6ca1\u6709\u88ab\u7be1\u6539\u3001\u524a\u5f31\u6216\u6f0f\u68c0\u3002</p>"},{"location":"integration/audit/#\u6743\u5a01\u8fb9\u754c","title":"\u6743\u5a01\u8fb9\u754c","text":"<ul> <li>\u5ba1\u8ba1\u53ea\u6d88\u8d39 Contracts \u7684\u516c\u5f00\u63a5\u53e3\uff08<code>describeAuditSurface</code>\u3001<code>validateDocument</code>\u3001<code>checkOperation</code>\u3001<code>findProtocol</code>\u3001<code>isRegisteredErrorCode</code>\u3001<code>digestDocument</code> \u7b49\uff09\uff0c\u4f9d\u8d56\u65b9\u5411\u6052\u4e3a Audit \u2192 Contracts\uff1b</li> <li>\u5ba1\u8ba1\u4e0d\u4f9d\u8d56 engineering-kit\uff0c\u4e5f\u4e0d\u4f9d\u8d56 harness\uff08\u89c1 independence.md \u7684\u673a\u68b0\u8bc1\u660e\uff09\uff1b</li> <li>Contracts \u4e0d\u53cd\u5411\u4f9d\u8d56\u5ba1\u8ba1\uff1aContracts \u4fa7\u53ea\u65b0\u589e\u4e86\u53ea\u8bfb\u6295\u5f71\u6a21\u5757 <code>src/audit-surface.mjs</code>\uff0c\u4e0d\u63a5\u53d7\u4efb\u4f55\u56de\u8c03\u3001\u6ce8\u518c\u6216\u5ba1\u8ba1\u4fa7\u8f93\u5165\uff1b</li> <li>\u5ba1\u8ba1 fixture\u3001\u9884\u671f\u4e0e\u88c1\u51b3\u5168\u90e8\u7531\u4ea7\u54c1\u4fa7\u7ef4\u62a4\uff08\u5939\u5177 provenance <code>product-fixture</code>\uff0cpin provenance <code>product-compatibility-fixture</code>\uff09\uff0c\u4e0d\u590d\u7528\u751f\u6210\u5668\u81ea\u6d4b\u9884\u671f\u8868\uff0c\u4e5f\u4e0d\u8bfb\u53d6 oracle \u5224\u636e\uff08\u8be5\u9694\u79bb\u7531 independence.md \u7684\u673a\u68b0\u8bc1\u660e\u5f3a\u5236\uff09\u3002</li> </ul>"},{"location":"integration/audit/#\u76ee\u5f55\u7ed3\u6784","title":"\u76ee\u5f55\u7ed3\u6784","text":"<pre><code>docs/integration/audit/\n README.md \u672c\u6587\u4ef6\n mutation-taxonomy.md \u4e94\u7c7b\u53d8\u5f02\u5206\u7c7b\u5b66\uff08\u51bb\u7ed3\uff09\n failure-evidence.md \u5931\u8d25\u8bc1\u636e\u683c\u5f0f\u4e0e AUD \u7801\u767b\u8bb0\u8868\n version-compatibility.md \u7248\u672c\u517c\u5bb9\u5b9a\u4e49\n isolation-and-lockfile.md \u9694\u79bb\u5b89\u88c5\u4e0e\u5305\u9501\u9a8c\u8bc1\u8bbe\u8ba1\n independence.md \u72ec\u7acb\u6027\u58f0\u660e\u4e0e\u673a\u68b0\u8bc1\u660e\n schemas/audit-evidence.schema.json \u8bc1\u636e\u6587\u6863\u7684 JSON Schema\uff08\u5ba1\u8ba1\u81ea\u6709\uff09\n baseline/contracts-1.1.1.pin.json Contracts 1.1.1 \u73b0\u884c\u57fa\u7ebf pin\uff08\u6458\u8981+\u4e8b\u5b9e\uff09\n baseline/contracts-1.1.0.pin.json Contracts 1.1.0 \u53ea\u8bfb\u517c\u5bb9\u5b58\u6863 pin\n baseline/contracts-1.0.0.pin.json Contracts 1.0.0 \u53ea\u8bfb\u517c\u5bb9\u5b58\u6863 pin\n baseline/audit-codes.json AUD \u7801\u767b\u8bb0\u8868\uff08append-only\uff09\n fixtures/{structure,semantics,digest,omission,engine}/ 18 \u4e2a\u53d8\u5f02 fixture\n runner/ \u5ba1\u8ba1\u8fd0\u884c\u5668\uff08\u53ea\u8bfb\uff0c\u8bc1\u636e\u8f93\u51fa\u5230 stdout\uff09\n</code></pre>"},{"location":"integration/audit/#\u8fd0\u884c","title":"\u8fd0\u884c","text":"<pre><code># \u5b8c\u6574\u7ba1\u7ebf\uff1a\u72ec\u7acb\u6027\u8bc1\u660e \u2192 \u5305\u9501\u9a8c\u8bc1 \u2192 \u53d8\u5f02\u91cd\u653e \u2192 \u6f0f\u62a5\u8d1f\u4f8b\u81ea\u68c0\nnode docs/integration/audit/runner/run-all.mjs\n\n# \u5206\u6b65\u8fd0\u884c\nnode docs/integration/audit/runner/proof-independence.mjs # \u72ec\u7acb\u6027\u673a\u68b0\u8bc1\u660e\nnode docs/integration/audit/runner/verify-lock.mjs # \u6d88\u8d39\u5305 pin/\u9501\u9a8c\u8bc1\nnode docs/integration/audit/runner/run-audit.mjs # \u53d8\u5f02\u91cd\u653e + \u8bc1\u636e\nnode docs/integration/audit/runner/selftest-negative.mjs # \u6f0f\u62a5\u8d1f\u4f8b\u63a7\u5236\n</code></pre> <p>\u9000\u51fa\u7801\u7ea6\u5b9a\uff1a<code>0</code> \u901a\u8fc7\uff1b<code>1</code> \u6709\u53d1\u73b0\uff08verdict fail\uff09\uff1b<code>2</code> \u7528\u6cd5\u6216\u673a\u5236\u9519\u8bef\u3002\u6240\u6709\u62a5\u544a\u4ee5 JSON \u8f93\u51fa\u5230 stdout\uff0c\u8fd0\u884c\u5668\u5bf9\u4ed3\u5e93\u96f6\u5199\u5165\u3002</p>"},{"location":"integration/audit/#\u88c1\u51b3\u89c4\u5219","title":"\u88c1\u51b3\u89c4\u5219","text":"<ul> <li>\u4e94\u7c7b\u53d8\u5f02\uff08\u7ed3\u6784\u3001\u8bed\u4e49\u3001\u6458\u8981\u3001\u9057\u6f0f\u3001\u68c0\u67e5\u5f15\u64ce\u88ab\u524a\u5f31\uff09\u6bcf\u7c7b\u81f3\u5c11 3 \u4e2a fixture\uff0c\u4e14\u81f3\u5c11\u68c0\u51fa 1 \u4e2a\uff1b</li> <li>\u4efb\u4e00\u7c7b\u6f0f\u62a5\u5373\u5931\u8d25\uff1a\u8986\u76d6\u95e8\uff08AUD-MISS-001\uff09\u673a\u68b0\u5f3a\u5236\uff0c\u6f0f\u62a5\u7c7b\u7684\u5b58\u5728\u4f7f\u6574\u4f53 verdict \u5fc5\u4e3a fail\uff1b</li> <li>\u4efb\u4e00 fixture \u672a\u88ab\u5982\u9884\u671f\u68c0\u51fa\u3001\u57fa\u7ebf pin \u6f02\u79fb\u3001fixture \u4fe1\u5c01\u4e0d\u5408\u6cd5\uff0c\u90fd\u4ea7\u751f mandatory \u7ea7\u53d1\u73b0\u5e76\u4f7f verdict fail\u3002</li> </ul>"},{"location":"integration/audit/failure-evidence/","title":"\u5931\u8d25\u8bc1\u636e\u683c\u5f0f\u4e0e AUD \u7801\u767b\u8bb0\u8868","text":"<p>\u5ba1\u8ba1\u53d1\u73b0\u5fc5\u987b\u4ee5\u673a\u5668\u53ef\u8bfb\u7684\u8bc1\u636e\u6587\u6863\u8bb0\u5f55\u3002\u8bc1\u636e\u6587\u6863\u7531 <code>runner/run-audit.mjs</code> \u8f93\u51fa\u5230 stdout\uff0c\u683c\u5f0f\u7531 schemas/audit-evidence.schema.json \u51bb\u7ed3\uff0c\u5e76\u901a\u8fc7\u88ab\u6d88\u8d39 Contracts \u7684 <code>validateDocument</code>\uff082020-12 \u65b9\u8a00\u3001strict \u7b56\u7565\uff09\u81ea\u6821\u9a8c\u2014\u2014\u8bc1\u636e\u6587\u6863\u672c\u8eab\u4e0d\u5408\u683c\u662f\u673a\u5236\u9519\u8bef\uff08\u9000\u51fa\u7801 2\uff09\u3002</p>"},{"location":"integration/audit/failure-evidence/#\u8bc1\u636e\u6587\u6863\u5f62\u72b6","title":"\u8bc1\u636e\u6587\u6863\u5f62\u72b6","text":"<pre><code>{\n \"schemaVersion\": 1,\n \"kind\": \"skill-family.audit.evidence\",\n \"auditId\": \"fnd-060-independent-audit\",\n \"generatedAt\": \"RFC 3339 date-time\",\n \"consumer\": {\n \"contractsVersion\": \"1.0.0\",\n \"auditSurfaceVersion\": 1,\n \"surfaceDigest\": { \"algorithm\": \"sha256\", \"value\": \"64 \u4f4d\u5341\u516d\u8fdb\u5236\" }\n },\n \"verdict\": \"pass | fail\",\n \"classCoverage\": {\n \"<class>\": { \"fixtures\": 0, \"detected\": 0, \"required\": 3, \"satisfied\": false }\n },\n \"fixtureResults\": [\n { \"fixtureId\": \"AUD-M1-01\", \"mutationClass\": \"structure\", \"expectedAuditCode\": \"AUD-M1-STRUCT\", \"detected\": true, \"observed\": {} }\n ],\n \"findings\": [\n {\n \"findingId\": \"F-0001\",\n \"auditCode\": \"AUD-BASE-001\",\n \"severity\": \"mandatory\",\n \"mutationClass\": null,\n \"fixtureId\": null,\n \"detected\": true,\n \"summary\": \"\u4eba\u7c7b\u53ef\u8bfb\u6458\u8981\",\n \"details\": {}\n }\n ]\n}\n</code></pre> <p>\u8981\u70b9\uff1a</p> <ul> <li><code>consumer</code> \u7528\u7248\u672c\u5750\u6807 + surface \u6458\u8981\u9489\u6b7b\u88ab\u6d88\u8d39\u7684 Contracts \u5305\uff0c\u8bc1\u636e\u56e0\u6b64\u53ef\u56de\u6eaf\u5230\u7cbe\u786e\u5b57\u8282\uff1b</li> <li><code>fixtureResults</code> \u662f\u5168\u90e8 fixture \u7684\u91cd\u653e\u8bb0\u5f55\uff08\u542b\u901a\u8fc7\u9879\uff09\uff0c<code>findings</code> \u53ea\u6536\u8fdd\u89c4\u9879\uff1b</li> <li>v1 \u51bb\u7ed3\u5355\u4e00\u4e25\u91cd\u7ea7 <code>mandatory</code>\uff1a\u4efb\u4f55\u53d1\u73b0\u90fd\u4f7f <code>verdict</code> \u4e3a <code>fail</code>\uff1b</li> <li><code>classCoverage</code> \u4e94\u7c7b\u9f50\u5168\uff1b<code>satisfied = fixtures \u2265 3 \u4e14 detected \u2265 1</code>\u3002</li> </ul>"},{"location":"integration/audit/failure-evidence/#\u88c1\u51b3\u89c4\u5219","title":"\u88c1\u51b3\u89c4\u5219","text":"<ol> <li><code>findings</code> \u4e3a\u7a7a \u2192 <code>verdict = pass</code>\uff0c\u9000\u51fa\u7801 0\uff1b</li> <li>\u4efb\u4e00\u53d1\u73b0\u5b58\u5728 \u2192 <code>verdict = fail</code>\uff0c\u9000\u51fa\u7801 1\uff1b</li> <li>\u7528\u6cd5\u6216\u673a\u5236\u9519\u8bef\uff08\u542b\u8bc1\u636e\u81ea\u6821\u9a8c\u5931\u8d25\uff09\u2192 \u9000\u51fa\u7801 2\uff0c\u4e0d\u4ea7\u751f\u8bc1\u636e\u6216\u4ea7\u751f\u4f5c\u5e9f\u8bc1\u636e\uff1b</li> <li>\u6f0f\u62a5\u5f8b\uff1a\u4efb\u4e00\u7c7b <code>satisfied = false</code> \u5fc5\u987b\u4ea7\u751f AUD-MISS-001 \u53d1\u73b0\uff0c\u6574\u4f53 verdict \u5fc5\u4e3a fail\u3002</li> </ol>"},{"location":"integration/audit/failure-evidence/#AUD-\u7801\u767b\u8bb0\u8868append-only","title":"AUD \u7801\u767b\u8bb0\u8868\uff08append-only\uff09","text":"<p>\u5ba1\u8ba1\u7801\u5c5e\u4e8e\u5ba1\u8ba1\u81ea\u6709\u547d\u540d\u7a7a\u95f4 <code>AUD-</code>\uff0c\u4e0d\u8fdb\u5165 Contracts \u7684 SFC \u767b\u8bb0\uff1b\u5ba1\u8ba1\u5bf9 SFC \u7801\u53ea\u8bfb\u6d88\u8d39\u3002\u673a\u5668\u53ef\u8bfb\u526f\u672c\u89c1 baseline/audit-codes.json\u3002</p> \u7801 \u540d\u79f0 \u542b\u4e49 AUD-M1-STRUCT STRUCTURE_MUTATION_DETECTED \u7ed3\u6784\u7c7b\u53d8\u5f02\u88ab\u68c0\u51fa\uff08\u89c2\u5bdf\u7801\u7b49\u4e8e\u9884\u671f\u7a33\u5b9a\u7801\uff09 AUD-M2-SEM SEMANTIC_MUTATION_DETECTED \u8bed\u4e49\u7c7b\u53d8\u5f02\u88ab\u68c0\u51fa AUD-M3-DIGEST DIGEST_MISMATCH_DETECTED \u6458\u8981\u7c7b\u53d8\u5f02\u88ab\u68c0\u51fa\uff08\u89c4\u8303\u5316\u6458\u8981\u4e0e pin \u4e0d\u4e00\u81f4\uff09 AUD-M4-OMIT OMISSION_DETECTED \u9057\u6f0f\u7c7b\u53d8\u5f02\u88ab\u68c0\u51fa\uff08\u7f3a\u5931\u6e05\u5355\u4e0e\u9884\u671f\u4e00\u81f4\uff09 AUD-M5-ENGINE ENGINE_WEAKENING_DETECTED \u5f15\u64ce\u524a\u5f31\u7c7b\u53d8\u5f02\u88ab\u68c0\u51fa\uff08\u88ab\u524a\u5f31\u5b57\u6bb5\u4e0e\u9884\u671f\u4e00\u81f4\uff09 AUD-MISS-001 MUTATION_CLASS_MISSED \u67d0\u7c7b fixture \u6570\u4f4e\u4e8e\u51bb\u7ed3\u4e0b\u9650\u6216\u96f6\u68c0\u51fa\uff1b\u6f0f\u62a5\u5373\u6574\u4f53\u5931\u8d25 AUD-BASE-001 BASELINE_DRIFT \u6d88\u8d39\u7684 Contracts \u6d3b\u8dc3 surface \u4e0e\u51bb\u7ed3\u57fa\u7ebf pin \u4e0d\u4e00\u81f4 AUD-FMT-001 EVIDENCE_OR_FIXTURE_FORMAT_INVALID fixture \u4fe1\u5c01\u6216\u8bc1\u636e\u6587\u6863\u683c\u5f0f\u975e\u6cd5 AUD-LOCK-001 LOCK_VERIFICATION_FAILED \u6d88\u8d39\u5305\u7684\u8eab\u4efd\u3001\u4f9d\u8d56\u95ed\u5305\u6216 pin \u5bf9\u6bd4\u5931\u8d25 AUD-IND-001 INDEPENDENCE_VIOLATION \u5ba1\u8ba1\u8bfb\u53d6\u6216\u5bfc\u5165\u8d8a\u51fa\u5141\u8bb8\u96c6\u5408 <p>\u767b\u8bb0\u7eaa\u5f8b\uff1a\u7801\u53ea\u589e\u4e0d\u6539\u4e0d\u590d\u7528\uff1b\u65b0\u589e\u7801\u5fc5\u987b\u540c\u6b65\u66f4\u65b0\u672c\u8868\u4e0e <code>baseline/audit-codes.json</code>\uff0c\u4e14\u4e0d\u5f97\u4e0e SFC \u547d\u540d\u7a7a\u95f4\u4ea7\u751f\u4efb\u4f55\u4ea4\u53c9\u62e5\u6709\u3002</p>"},{"location":"integration/audit/independence/","title":"\u72ec\u7acb\u6027\u58f0\u660e\u4e0e\u673a\u68b0\u8bc1\u660e","text":"<p>FND-060 \u7684\u9a8c\u6536\u8981\u6c42\uff1a\u5ba1\u8ba1 fixture\u3001\u9884\u671f\u503c\u548c\u88c1\u51b3\u4e0d\u6765\u81ea\u751f\u6210\u5668\uff1bAudit \u4e0d\u4f9d\u8d56 Kit\u3002\u672c\u9875\u7684\u73b0\u884c\u4e8b\u5b9e\u662f\uff1a\u672c\u4ed3\u5e93\u4e0d\u5b58\u5728\u72ec\u7acb\u7684\u7b2c\u4e8c\u5ba1\u9605\u4f1a\u8bdd\uff0c\u5ba1\u8ba1\u6811\u662f\u4ea7\u54c1\u4fa7\u7684\u673a\u68b0\u9a8c\u8bc1\u8bbe\u65bd\u3002\u673a\u68b0\u8bc1\u660e\u80fd\u591f\u8bc1\u660e\u7684\u662f\u4ea7\u54c1\u4fa7\u8f93\u5165\u9694\u79bb\u4e0e\u517c\u5bb9\u6027\uff0c\u4e0d\u8bc1\u660e\u4f5c\u8005\u3001\u6a21\u578b\u6216\u8ba4\u77e5\u72ec\u7acb\uff1b\u5916\u90e8\u6700\u7ec8\u63a5\u53d7\u7531\u4ed3\u5916\u72ec\u7acb\u590d\u5ba1\u627f\u62c5\u3002</p>"},{"location":"integration/audit/independence/#provenance-\u73b0\u884c\u4e8b\u5b9e","title":"provenance \u73b0\u884c\u4e8b\u5b9e","text":"<ul> <li>\u5168\u90e8 18 \u4e2a\u53d8\u5f02 fixture \u7684 provenance \u4e3a <code>product-fixture</code>\uff1a\u4ea7\u54c1\u4fa7\u7ef4\u62a4\u7684\u6d4b\u8bd5\u8bed\u6599\u3002\u9884\u671f\u7531\u4ea7\u54c1\u4fa7\u5bf9\u7167\u5408\u540c\u6587\u6863\u63a8\u5bfc\uff08schema \u7ea6\u675f required/pattern/additionalProperties\u3001\u767b\u8bb0\u8868\u6210\u5458\u8d44\u683c\u3001kernel \u8bcd\u8868\u4e0e params \u5951\u7ea6\u3001\u9519\u8bef\u7801 append-only \u8bed\u4e49\uff09\uff0c\u4e0d\u590d\u7528\u751f\u6210\u5668\u81ea\u6d4b\u9884\u671f\u8868\uff0c\u4e0d\u8bfb\u53d6 oracle \u5224\u636e\uff1b\u8fd9\u4e00\u8f93\u5165\u9694\u79bb\u7531\u4e0b\u65b9 P4/P5/P6 \u673a\u68b0\u5f3a\u5236\u3002</li> <li>\u57fa\u7ebf pin \u7684 provenance \u4e3a <code>product-compatibility-fixture</code>\uff1a\u4ea7\u54c1\u4fa7\u7ef4\u62a4\u7684\u517c\u5bb9\u57fa\u7ebf\u3002\u6458\u8981\u6765\u81ea\u5bf9\u5df2\u51bb\u7ed3\u4ea7\u7269\u7684 <code>digestAuditSurface()</code> \u673a\u68b0\u8ba1\u7b97\uff0c\u4e8b\u5b9e\u6e05\u5355\u76f4\u63a5\u5bf9\u7167\u5408\u540c\u6587\u6863\u63a8\u5bfc\u3002</li> <li>\u5b83\u4eec\u8bc1\u660e\u4ea7\u54c1\u4fa7\u8f93\u5165\u9694\u79bb\u548c\u517c\u5bb9\u6027\uff0c\u4e0d\u8bc1\u660e\u4f5c\u8005\u3001\u6a21\u578b\u6216\u8ba4\u77e5\u72ec\u7acb\u3002fixture \u4e0e pin \u80cc\u540e\u7684\u4f5c\u8005\u3001\u6a21\u578b\u6216\u8ba4\u77e5\u8fc7\u7a0b\u662f\u5426\u72ec\u7acb\u4e8e\u5176\u4ed6\u9879\u76ee\u53c2\u4e0e\u8005\uff0c\u4e0d\u662f\u4ed3\u5185\u673a\u68b0\u68c0\u67e5\u53ef\u4ee5\u8bc1\u660e\u7684\u5bf9\u8c61\u3002</li> <li>\u5916\u90e8\u6700\u7ec8\u63a5\u53d7\uff1a\u5b9e\u73b0\u8005\u81ea\u6d4b\u4e0e\u672c\u9875\u673a\u68b0\u8bc1\u660e\u90fd\u53ea\u5f62\u6210\u5f85\u5ba1\u8bc1\u636e\uff0c\u6700\u7ec8\u63a5\u53d7\u7531\u4ed3\u5916\u72ec\u7acb\u590d\u5ba1\u627f\u62c5\u3002</li> <li>\u8bda\u5b9e\u6027\u7ea0\u9519\uff1a\u65e7 fixture \u4e0e pin \u66fe\u643a\u5e26 <code>independent-r2</code> provenance \u548c\u72ec\u7acb\u4f5c\u8005\u53d9\u4e8b\uff08\u542b\u4f5c\u8005\u9605\u8bfb\u53f2\u58f0\u660e\uff09\uff0c\u4e0e\u672c\u4ed3\u4e8b\u5b9e\u4e0d\u7b26\uff1bprovenance \u5df2\u4fee\u6b63\u4e3a\u4e0a\u8ff0\u5982\u5b9e\u8bcd\u6c47\uff0c\u672c\u9875\u968f\u4e4b\u91cd\u5199\u3002\u7ea0\u9519\u53ea\u89e6\u53ca provenance\u3001note \u4e0e\u6587\u6848\u7b49\u8bda\u5b9e\u6027\u5b57\u6bb5\uff0c\u4e0d\u6539\u53d8\u4efb\u4f55 digest\u3001facts\u3001fixture \u5185\u5bb9\u6216\u673a\u68b0\u8bc1\u660e\u884c\u4e3a\u3002</li> </ul>"},{"location":"integration/audit/independence/#\u673a\u68b0\u8bc1\u660e\u5165\u53e3","title":"\u673a\u68b0\u8bc1\u660e\u5165\u53e3","text":"<pre><code>node docs/integration/audit/runner/proof-independence.mjs\n</code></pre> <p>\u8bc1\u660e\u68c0\u67e5\u4e0e\u7ed3\u8bba\uff1a</p> \u68c0\u67e5 \u7ed3\u8bba P0-modules \u6536\u96c6\u5230\u5168\u90e8\u5ba1\u8ba1\u6a21\u5757\uff08\u8bc1\u660e\u8303\u56f4\u5b8c\u5907\uff09 P1-imports \u5168\u90e8 import \u53ea\u5141\u8bb8 <code>node:</code> \u5185\u5efa\u4e0e\u76f8\u5bf9\u8def\u5f84\uff0c\u4e14\u76f8\u5bf9\u8bf4\u660e\u7b26\u7684\u89e3\u6790\u57df\u88ab\u9650\u5236\u5728\u5ba1\u8ba1\u6811\u6216 contracts \u5305\u5185\uff08\u675c\u7edd\u76f8\u5bf9\u8def\u5f84\u7ed5\u5230\u751f\u6210\u5668/oracle \u6a21\u5757\uff09\uff1b\u7981\u6b62 engineering-kit / harness / \u7b2c\u4e09\u65b9\u5305 \u2192 Audit \u4e0d\u4f9d\u8d56 Kit P2-contracts-site Contracts \u53ea\u5728\u552f\u4e00\u58f0\u660e\u70b9\uff08<code>lib/contracts-client.mjs</code>\uff09\u88ab\u5bfc\u5165 P3-chokepoint \u6587\u4ef6\u8bfb\u53d6\u53ea\u7ecf\u8fc7\u4e24\u4e2a\u58f0\u660e\u8bfb\u53d6\u70b9\uff1a<code>lib/guard.mjs</code>\uff08\u5ba1\u8ba1\u6811\u5185\uff0c\u88c1\u51b3\u8f93\u5165\uff09\u4e0e <code>lib/consumed-package.mjs</code>\uff08\u88ab\u6d88\u8d39\u5305\u6839\u5185\uff0c\u9501\u9a8c\u8bc1\uff09\uff1b\u53ea\u8bfb API\uff1b\u5168\u6811\u65e0\u4efb\u4f55\u5199 API P4-refusal \u73b0\u573a\u62d2\u8bfb\u6f14\u793a\uff1a\u5bf9\u751f\u6210\u5668\u81ea\u6d4b\u8fd0\u884c\u5668\u3001oracle \u5224\u636e\u3001oracle \u8fd0\u884c\u5668\u3001fixture README\u3001profiles\u3001kit \u5165\u53e3\u3001harness \u5165\u53e3\u9010\u4e00\u5c1d\u8bd5\u8bfb\u53d6\uff0c\u5168\u90e8\u88ab guard \u4ee5 AUD-IND-001 \u62d2\u7edd P5-provenance \u5168\u90e8\u53d8\u5f02 fixture \u7684 provenance \u4e3a <code>product-fixture</code>\uff0c\u57fa\u7ebf pin \u7684 provenance \u5728\u58f0\u660e\u8bcd\u6c47\u8868\u5185\uff08\u5f53\u524d\u552f\u4e00\u6210\u5458 <code>product-compatibility-fixture</code>\uff09\uff1b\u4efb\u4f55\u6cbf\u7528\u65e7\u72ec\u7acb\u89d2\u8272 provenance \u8bcd\u6c47\u7684\u5de5\u4ef6\u90fd\u4f1a\u88ab\u5224\u8fdd\u89c4 P6-literals \u9664\u8bc1\u660e\u811a\u672c\u81ea\u8eab\uff08\u62d2\u8bfb\u6f14\u793a\u8005\uff0c\u53d7 P4 \u7ea6\u675f\uff09\u5916\uff0c\u4efb\u4f55\u5ba1\u8ba1\u6a21\u5757\u7684\u5b57\u7b26\u4e32\u5b57\u9762\u91cf\u90fd\u4e0d\u5f97\u70b9\u540d\u751f\u6210\u5668\u81ea\u6d4b\u8868\u6216 oracle \u5224\u636e\u6587\u4ef6 <p>\u63a8\u7406\u94fe\u4e0e\u80fd\u529b\u8fb9\u754c\uff1aP3 \u4fdd\u8bc1\u88c1\u51b3\u8f93\u5165\u53ea\u80fd\u6765\u81ea\u5ba1\u8ba1\u6811\uff1bP4 \u8bc1\u660e\u751f\u6210\u5668/oracle \u5de5\u4ef6\u5728\u8fd0\u884c\u65f6\u4e0d\u53ef\u8bfb\uff1bP6 \u8bc1\u660e\u5176\u6587\u4ef6\u540d\u5728\u4ee3\u7801\u4e2d\u4e0d\u53ef\u5f15\u7528\uff1bP5 \u673a\u68b0\u7981\u6b62\u65e7\u72ec\u7acb\u89d2\u8272 provenance \u8bcd\u6c47\u56de\u6f6e\u3002\u56e0\u6b64\u8fd0\u884c\u65f6\u4e0d\u5b58\u5728\u4efb\u4f55\u628a\u751f\u6210\u5668\u9884\u671f\u53d8\u6210\u5ba1\u8ba1\u5224\u636e\u7684\u8def\u5f84\u2014\u2014\u8fd9\u8bc1\u660e\u7684\u662f\u4ea7\u54c1\u4fa7\u8f93\u5165\u9694\u79bb\u3002\u4f5c\u8005\u3001\u6a21\u578b\u6216\u8ba4\u77e5\u662f\u5426\u72ec\u7acb\u4e0d\u5728\u673a\u68b0\u8bc1\u660e\u80fd\u529b\u4e4b\u5185\uff0c\u7531\u4ed3\u5916\u72ec\u7acb\u590d\u5ba1\u627f\u62c5\u6700\u7ec8\u63a5\u53d7\u3002</p>"},{"location":"integration/audit/independence/#\u53cd\u5411\u62e5\u6709\u7981\u4ee4","title":"\u53cd\u5411\u62e5\u6709\u7981\u4ee4","text":"<p>Contracts \u4fa7\u65b0\u589e\u7684 <code>src/audit-surface.mjs</code> \u662f\u7eaf\u53ea\u8bfb\u6295\u5f71\uff1a\u4e0d\u63a5\u6536\u56de\u8c03\u3001\u4e0d\u6ce8\u518c\u4efb\u4f55\u4e1c\u897f\u3001\u4e0d import \u4efb\u4f55\u5ba1\u8ba1\u5de5\u4ef6\uff1b<code>packages/skill-family-contracts/test/audit-surface.test.mjs</code> \u542b\u4e00\u6761\u673a\u68b0\u6d4b\u8bd5\uff0c\u65ad\u8a00\u8be5\u6a21\u5757\u7684 import \u5168\u90e8\u4e3a <code>node:</code> \u6216\u672c\u5730\u76f8\u5bf9\u6a21\u5757\uff0c\u4e14\u6e90\u7801\u4e0d\u51fa\u73b0 integration/audit\u3001engineering-kit\u3001harness \u5b57\u6837\u3002\u4f9d\u8d56\u65b9\u5411\u6052\u4e3a Audit \u2192 Contracts\u3002</p>"},{"location":"integration/audit/independence/#\u517c\u5bb9\u6027\u8bc1\u660e\u5165\u53e3","title":"\u517c\u5bb9\u6027\u8bc1\u660e\u5165\u53e3","text":"<p>\u53d8\u5f02\u91cd\u653e\u4e0e\u57fa\u7ebf pin \u7684\u6bd4\u5bf9\uff08\u6458\u8981\u3001\u4e8b\u5b9e\u6e05\u5355\u3001\u5f15\u64ce\u53c2\u6570\u5b8c\u6574\u6027\uff09\u89c1 version-compatibility.md \u4e0e isolation-and-lockfile.md\uff1b\u5206\u7c7b\u5b66\u89c1 mutation-taxonomy.md\u3002pin \u662f\u4ea7\u54c1\u4fa7\u517c\u5bb9\u57fa\u7ebf\uff08<code>product-compatibility-fixture</code>\uff09\uff0c\u8bc1\u660e\u88ab\u6d88\u8d39\u7684 Contracts \u5305\u4e0e\u51bb\u7ed3\u57fa\u7ebf\u5b57\u8282\u4e00\u81f4\u3001\u6821\u9a8c\u8bed\u4e49\u4e00\u81f4\uff0c\u540c\u6837\u4e0d\u4f5c\u4efb\u4f55\u72ec\u7acb\u89d2\u8272\u58f0\u79f0\u3002</p>"},{"location":"integration/audit/mutation-taxonomy/","title":"\u53d8\u5f02\u5206\u7c7b\u5b66\uff08\u51bb\u7ed3\uff09","text":"<p>FND-060 \u51bb\u7ed3\u4e94\u7c7b\u53d8\u5f02\u3002\u6bcf\u4e00\u7c7b\u90fd\u6709\u72ec\u7acb\u7684\u68c0\u6d4b\u673a\u5236\u4e0e\u6bcf\u7c7b \u22653 \u4f8b\u7684\u53d8\u5f02 fixture\uff1bfixture \u4e0e\u9884\u671f\u662f\u4ea7\u54c1\u4fa7\u7ef4\u62a4\u7684\u6d4b\u8bd5\u8bed\u6599\uff08provenance <code>product-fixture</code>\uff0c\u89c1\u4e0b\u65b9 fixture \u4fe1\u5c01\uff09\uff0c\u4e0d\u590d\u7528\u751f\u6210\u5668\u81ea\u6d4b\u9884\u671f\u8868\uff0c\u4e0d\u8bfb\u53d6 oracle \u5224\u636e\uff08\u8be5\u8f93\u5165\u9694\u79bb\u7531 independence.md \u7684\u673a\u68b0\u8bc1\u660e\u5f3a\u5236\uff09\u3002\u5b83\u4eec\u8bc1\u660e\u4ea7\u54c1\u4fa7\u8f93\u5165\u9694\u79bb\u548c\u517c\u5bb9\u6027\uff0c\u4e0d\u8bc1\u660e\u4f5c\u8005\u3001\u6a21\u578b\u6216\u8ba4\u77e5\u72ec\u7acb\uff1b\u5916\u90e8\u6700\u7ec8\u63a5\u53d7\u7531\u4ed3\u5916\u72ec\u7acb\u590d\u5ba1\u627f\u62c5\u3002\u5206\u7c7b\u96c6\u5408\u662f\u95ed\u5408\u7684\uff1a\u65b0\u589e\u7c7b\u522b\u5c5e\u4e8e\u5ba1\u8ba1\u5206\u7c7b\u5b66\u53d8\u66f4\uff0c\u5fc5\u987b\u8d70\u65b0\u7684\u88c1\u51b3\u5e76\u66f4\u65b0\u672c\u6587\u4ef6\u4e0e <code>runner/lib/paths.mjs</code> \u7684 <code>MUTATION_CLASSES</code>\u3002</p> \u7c7b\u522b \u679a\u4e3e\u503c \u68c0\u6d4b\u673a\u5236 \u6d88\u8d39\u63a5\u53e3 \u5ba1\u8ba1\u7801 \u7ed3\u6784 <code>structure</code> \u4e25\u683c\u65b9\u8a00\u4e0b\u7684 schema \u6821\u9a8c\u62d2\u7edd <code>validateDocument</code>\uff08strict, 2020-12\uff09 AUD-M1-STRUCT \u8bed\u4e49 <code>semantics</code> \u7ed3\u6784\u5408\u6cd5\u4f46\u8fdd\u53cd\u51bb\u7ed3\u8bed\u4e49\uff08\u534f\u8bae\u767b\u8bb0\u3001\u64cd\u4f5c\u8bcd\u8868\u3001params \u5951\u7ea6\u3001\u9519\u8bef\u7801\u6210\u5458\u8d44\u683c\uff09 <code>findProtocol</code>\u3001<code>checkOperation</code>\u3001<code>isRegisteredErrorCode</code> AUD-M2-SEM \u6458\u8981 <code>digest</code> \u89c4\u8303\u5316 JSON \u7684 SHA-256 \u4e0e\u51bb\u7ed3 pin \u4e0d\u4e00\u81f4 <code>digestDocument</code> AUD-M3-DIGEST \u9057\u6f0f <code>omission</code> \u51bb\u7ed3\u5fc5\u5907\u90e8\u4ef6\u7f3a\u5931\uff08\u767b\u8bb0\u3001\u89c4\u5219\u8986\u76d6\u3001\u9519\u8bef\u7801\u6210\u5458\uff09 \u57fa\u7ebf pin \u4e8b\u5b9e\u6e05\u5355\u5bf9\u6bd4 AUD-M4-OMIT \u68c0\u67e5\u5f15\u64ce\u88ab\u524a\u5f31 <code>engine</code> \u5f15\u64ce\u53c2\u6570\u5b8c\u6574\u6027\u5bf9\u6bd4\uff08\u9884\u7b97\u3001\u6821\u9a8c\u7b56\u7565\u3001\u68c0\u67e5\u7c7b\u578b\u95ed\u96c6\u3001\u7a33\u5b9a\u6027\u653f\u7b56\uff09 <code>describeAuditSurface</code> + \u57fa\u7ebf pin AUD-M5-ENGINE"},{"location":"integration/audit/mutation-taxonomy/#\u5404\u7c7b\u522b\u5b9a\u4e49\u4e0e\u5224\u636e","title":"\u5404\u7c7b\u522b\u5b9a\u4e49\u4e0e\u5224\u636e","text":""},{"location":"integration/audit/mutation-taxonomy/#M1-\u7ed3\u6784structure","title":"M1 \u7ed3\u6784\uff08structure\uff09","text":"<p>\u53d8\u5f02\u6539\u53d8\u6587\u6863\u7684\u5f62\u72b6\uff1a\u7f3a\u5fc5\u586b\u6210\u5458\u3001\u7c7b\u578b\u6f02\u79fb\u3001\u672a\u58f0\u660e\u6210\u5458\u3001\u6a21\u5f0f\u8fdd\u89c4\u3002\u5224\u636e\uff1a\u5728 <code>2020-12</code> \u65b9\u8a00\u3001<code>strict</code> \u7b56\u7565\u4e0b\uff0c\u6587\u6863\u5fc5\u987b\u88ab\u62d2\u7edd\uff0c\u4e14\u7a33\u5b9a\u7801\u7b49\u4e8e fixture \u58f0\u660e\u7684 <code>expect.observedErrorCode</code>\uff08\u672c\u7c7b\u5168\u90e8\u4e3a SFC1001\uff09\u3002\u9884\u671f\u7531\u4ea7\u54c1\u4fa7\u5bf9\u7167\u76f8\u5e94 schema \u7684 required/pattern/additionalProperties \u63a8\u5bfc\uff0c\u4e0d\u53d6\u81ea\u751f\u6210\u5668\u81ea\u6d4b\u9884\u671f\u8868\u6216 oracle \u5224\u636e\u3002</p>"},{"location":"integration/audit/mutation-taxonomy/#M2-\u8bed\u4e49semantics","title":"M2 \u8bed\u4e49\uff08semantics\uff09","text":"<p>\u53d8\u5f02\u4fdd\u6301 schema \u5408\u6cd5\u6027\uff0c\u4f46\u8fdd\u53cd\u51bb\u7ed3\u7684\u767b\u8bb0\u8bed\u4e49\u3002\u4e09\u4e2a\u8bed\u4e49\u68c0\u67e5\u70b9\uff08fixture \u7528 <code>expect.semanticCheck</code> \u58f0\u660e\uff09\uff1a</p> <ul> <li><code>protocol-registered</code>\uff1a\u534f\u8bae\u540d/\u7248\u672c\u5fc5\u987b\u5728\u767b\u8bb0\u8868\u4e2d\uff0c\u5426\u5219 SFC1011\uff1b</li> <li><code>operation-vocabulary</code>\uff1a\u64cd\u4f5c\u540d\u5fc5\u987b\u5728\u534f\u8bae\u7248\u672c\u7684\u51bb\u7ed3\u8bcd\u8868\u5185\uff08\u5426\u5219 SFC2002\uff09\uff0cparams \u5fc5\u987b\u6ee1\u8db3\u8be5\u64cd\u4f5c\u7684\u51bb\u7ed3 params \u5951\u7ea6\uff08\u5426\u5219 SFC2003\uff09\uff1b</li> <li><code>error-code-registered</code>\uff1aoperation-result \u4e2d\u7684\u9519\u8bef\u7801\u5fc5\u987b\u662f\u51bb\u7ed3\u767b\u8bb0\u8868\u6210\u5458\uff08\u5f62\u72b6\u5408\u6cd5\u4f46\u672a\u767b\u8bb0 \u2192 SFC1009\uff09\u3002</li> </ul>"},{"location":"integration/audit/mutation-taxonomy/#M3-\u6458\u8981digest","title":"M3 \u6458\u8981\uff08digest\uff09","text":"<p>\u53d8\u5f02\u4fdd\u6301\u7ed3\u6784\u4e0e\u8bed\u4e49\uff0c\u4ec5\u6539\u53d8\u89c4\u8303\u5316\u5b57\u8282\uff08\u63aa\u8f9e\u6539\u5199\u3001\u540c\u4e49\u66ff\u6362\uff09\u3002\u5224\u636e\uff1a<code>digestDocument(input)</code> \u5fc5\u987b\u4e0d\u7b49\u4e8e\u57fa\u7ebf pin \u4e2d <code>documentDigests[expect.pinField]</code>\u3002\u8fd9\u662f\u552f\u4e00\u80fd\u6355\u83b7\"\u542b\u4e49\u4e0d\u53d8\u3001\u5b57\u8282\u6539\u53d8\"\u7684\u7c7b\u522b\u3002\u89c4\u8303\u5316\u89c4\u5219\u7531 Contracts \u7684 <code>canonicalJson</code> \u51bb\u7ed3\uff1a\u5bf9\u8c61\u952e\u9010\u7ea7\u5b57\u5178\u5e8f\u6392\u5e8f\u3001\u6570\u7ec4\u4fdd\u5e8f\u3001\u53ea\u63a5\u53d7 JSON \u6570\u636e\u7c7b\u578b\u3002</p>"},{"location":"integration/audit/mutation-taxonomy/#M4-\u9057\u6f0fomission","title":"M4 \u9057\u6f0f\uff08omission\uff09","text":"<p>\u53d8\u5f02\u4ece\u51bb\u7ed3\u6587\u6863\u4e2d\u5220\u9664\u5fc5\u5907\u90e8\u4ef6\u3002\u4e09\u4e2a\u8986\u76d6\u68c0\u67e5\uff08fixture \u7528 <code>expect.check</code> \u58f0\u660e\uff09\uff1a</p> <ul> <li><code>registry-schema-coverage</code>\uff1a\u4e94\u4e2a\u9876\u5c42\u5bf9\u8c61\u7684 schema \u767b\u8bb0\u7f3a\u4e00\u4e0d\u53ef\uff1b</li> <li><code>rules-checktype-coverage</code>\uff1a\u4e5d\u4e2a\u68c0\u67e5\u7c7b\u578b\u6bcf\u4e2a\u90fd\u5fc5\u987b\u88ab\u81f3\u5c11\u4e00\u6761 mandatory \u89c4\u5219\u8986\u76d6\uff1b</li> <li><code>error-code-coverage</code>\uff1a\u51bb\u7ed3\u9519\u8bef\u7801\u6e05\u5355\u4e00\u4e2a\u4e0d\u80fd\u5c11\u3002</li> </ul> <p>\u5224\u636e\uff1a\u89c2\u5bdf\u5230\u7684\u7f3a\u5931\u6e05\u5355\u5fc5\u987b\u4e0e <code>expect.missing</code> \u5b8c\u5168\u4e00\u81f4\uff08\u591a\u62a5\u3001\u6f0f\u62a5\u90fd\u7b97 fixture \u5931\u8d25\uff09\u3002</p>"},{"location":"integration/audit/mutation-taxonomy/#M5-\u68c0\u67e5\u5f15\u64ce\u88ab\u524a\u5f31engine","title":"M5 \u68c0\u67e5\u5f15\u64ce\u88ab\u524a\u5f31\uff08engine\uff09","text":"<p>\u53d8\u5f02\u4e0d\u5220\u9664\u90e8\u4ef6\uff0c\u800c\u662f\u653e\u5bbd\u5f15\u64ce\u53c2\u6570\u3002\u56db\u4e2a\u5b8c\u6574\u6027\u68c0\u67e5\uff08fixture \u7528 <code>expect.check</code> \u58f0\u660e\uff09\uff1a</p> <ul> <li><code>rules-budget</code>\uff1a\u9884\u7b97\u6570\u503c\uff08firstVersionMax=20\u3001absoluteMax=30\uff09\u4e0d\u5f97\u53d8\u5316\uff1b</li> <li><code>validation-policies</code>\uff1astrict \u7b56\u7565\u5fc5\u987b\u4fdd\u6301 coerceTypes=false\u3001useDefaults=false\u3001allErrors=true\u3001validateFormats=true\uff1btolerant \u7b56\u7565\u9010\u952e\u5bf9\u6bd4\uff1b</li> <li><code>check-type-set</code>\uff1a\u4e5d\u4e2a\u68c0\u67e5\u7c7b\u578b\u662f\u95ed\u96c6\uff0c\u7f3a\u4e00\u4e0d\u53ef\uff1b</li> <li><code>error-code-stability</code>\uff1a\u9519\u8bef\u7801 append-only \u7a33\u5b9a\u6027\u653f\u7b56\u539f\u6587\u4e0d\u5f97\u6539\u5199\u3002</li> </ul> <p>\u5224\u636e\uff1a\u89c2\u5bdf\u5230\u7684\u88ab\u524a\u5f31\u5b57\u6bb5\u6e05\u5355\u5fc5\u987b\u4e0e <code>expect.weakened</code> \u5b8c\u5168\u4e00\u81f4\u3002</p>"},{"location":"integration/audit/mutation-taxonomy/#fixture-\u4fe1\u5c01\u51bb\u7ed3","title":"fixture \u4fe1\u5c01\uff08\u51bb\u7ed3\uff09","text":"<p>\u6bcf\u4e2a fixture \u662f\u4e00\u4e2a JSON \u6587\u4ef6\uff1a</p> \u5b57\u6bb5 \u8981\u6c42 <code>schemaVersion</code> \u5e38\u91cf <code>1</code> <code>kind</code> \u5e38\u91cf <code>skill-family.audit.mutation-fixture</code> <code>fixtureId</code> <code>^AUD-M[1-5]-[0-9]{2}$</code>\uff0c\u7b2c 6 \u4f4d\u6570\u5b57\u5fc5\u987b\u4e0e\u7c7b\u522b\u4e00\u81f4 <code>mutationClass</code> \u4e94\u7c7b\u4e4b\u4e00\uff0c\u4e14\u5fc5\u987b\u4e0e\u6240\u5728\u76ee\u5f55\u4e00\u81f4 <code>provenance</code> \u5fc5\u987b\u4e3a <code>product-fixture</code>\uff08\u673a\u68b0\u68c0\u67e5 P5\uff09 <code>description</code> \u53d8\u5f02\u610f\u56fe\u8bf4\u660e <code>target</code> \u88ab\u6d4b\u5bf9\u8c61\uff08schema/\u6587\u4ef6/\u6295\u5f71\uff09 <code>input</code> \u53d8\u5f02\u540e\u7684\u5b8c\u6574\u6587\u6863\u6216\u6295\u5f71 <code>expect.detected</code> \u5fc5\u987b\u4e3a <code>true</code>\uff08\u53d8\u5f02\u5fc5\u987b\u88ab\u68c0\u51fa\uff09 <code>expect.auditCode</code> \u5fc5\u987b\u7b49\u4e8e\u8be5\u7c7b\u522b\u7684\u5ba1\u8ba1\u7801 <p>provenance \u73b0\u884c\u4e8b\u5b9e\uff1a\u53d8\u5f02 fixture \u662f\u4ea7\u54c1\u4fa7\u6d4b\u8bd5\u8bed\u6599\uff08<code>product-fixture</code>\uff09\uff0c\u57fa\u7ebf pin \u662f\u4ea7\u54c1\u4fa7\u517c\u5bb9\u57fa\u7ebf\uff08<code>product-compatibility-fixture</code>\uff0c\u89c1 version-compatibility.md\uff09\uff1b\u5b83\u4eec\u8bc1\u660e\u4ea7\u54c1\u4fa7\u8f93\u5165\u9694\u79bb\u548c\u517c\u5bb9\u6027\uff0c\u4e0d\u8bc1\u660e\u4f5c\u8005\u3001\u6a21\u578b\u6216\u8ba4\u77e5\u72ec\u7acb\u3002\u5916\u90e8\u6700\u7ec8\u63a5\u53d7\u7531\u4ed3\u5916\u72ec\u7acb\u590d\u5ba1\u627f\u62c5\u3002\u5386\u53f2\u7ea0\u9519\uff1afixture \u4e0e pin \u66fe\u643a\u5e26\u65e7\u503c <code>independent-r2</code> \u4e0e\u72ec\u7acb\u4f5c\u8005\u53d9\u4e8b\uff0c\u8be5\u58f0\u79f0\u4e0e\u672c\u4ed3\u4e8b\u5b9e\u4e0d\u7b26\uff0c\u5df2\u4fee\u6b63\u4e3a\u4e0a\u8ff0\u5982\u5b9e\u8bcd\u6c47\uff1b\u7ea0\u9519\u4e0d\u6539\u53d8\u4efb\u4f55 fixture \u7684 <code>input</code>/<code>expect</code>\u3001digest \u6216 facts \u5b57\u6bb5\u3002</p>"},{"location":"integration/audit/mutation-taxonomy/#\u6570\u91cf\u51bb\u7ed3\u4e0e\u6f0f\u62a5\u5f8b","title":"\u6570\u91cf\u51bb\u7ed3\u4e0e\u6f0f\u62a5\u5f8b","text":"<ul> <li>\u6bcf\u7c7b fixture \u2265 3\uff08\u5f53\u524d\u5b9e\u9645\uff1a\u7ed3\u6784 4\u3001\u8bed\u4e49 4\u3001\u6458\u8981 3\u3001\u9057\u6f0f 3\u3001\u5f15\u64ce 4\uff0c\u5171 18\uff09\uff1b</li> <li>\u8986\u76d6\u95e8\u8981\u6c42\u6bcf\u7c7b <code>fixtures \u2265 3 \u4e14 detected \u2265 1</code>\uff0c\u4e0d\u6ee1\u8db3\u4ea7\u751f AUD-MISS-001 \u5e76\u5f3a\u5236 verdict fail\uff1b</li> <li>\u6f0f\u62a5\u5f8b\u7684\u8d1f\u4f8b\u9a8c\u8bc1\u7531 <code>runner/selftest-negative.mjs</code> \u6267\u884c\uff1a\u9010\u7c7b\u7981\u7528\u68c0\u6d4b\u5668\uff0c\u65ad\u8a00\u6bcf\u6b21\u7834\u574f\u90fd\u4f7f\u8fd0\u884c\u5931\u8d25\u3002</li> </ul>"},{"location":"integration/audit/version-compatibility/","title":"\u7248\u672c\u517c\u5bb9\u5b9a\u4e49","text":"<p>\u5ba1\u8ba1\u6d88\u8d39 Contracts \u4ee5\u4e24\u4e2a\u7248\u672c\u5750\u6807 + \u4e00\u4e2a\u6458\u8981\u4e3a\u51c6\uff1a</p> \u5750\u6807 \u6765\u6e90 \u542b\u4e49 <code>contractsVersion</code> Contracts \u51bb\u7ed3\u7248\u672c\uff08\u5f53\u524d <code>1.1.1</code>\uff09 \u673a\u5668\u5951\u7ea6\u5185\u5bb9\u7684\u7248\u672c <code>auditSurfaceVersion</code> \u5ba1\u8ba1\u6d88\u8d39\u63a5\u53e3\u81ea\u8eab\u7684\u7248\u672c\uff08\u5f53\u524d <code>1</code>\uff09 \u6d88\u8d39\u9762\u5f62\u72b6\u7684\u7248\u672c <code>surfaceDigest</code> <code>digestAuditSurface()</code>\uff08SHA-256\uff09 \u6d88\u8d39\u9762\u7684\u7cbe\u786e\u5b57\u8282\u6307\u7eb9 <p>\u4e09\u8005\u90fd\u7531 <code>describeAuditSurface()</code> \u4e00\u6b21\u6027\u7ed9\u51fa\uff0c\u5ba1\u8ba1\u4fa7\u628a\u5b83\u4eec\u4e0e\u57fa\u7ebf pin\uff08\u5f53\u524d\u4e3a <code>baseline/contracts-1.1.1.pin.json</code>\uff09\u6bd4\u5bf9\u3002</p>"},{"location":"integration/audit/version-compatibility/#\u517c\u5bb9\u89c4\u5219","title":"\u517c\u5bb9\u89c4\u5219","text":"<p>\u4e00\u4e2a\u88ab\u6d88\u8d39\u7684 Contracts \u5305\u4e0e\u67d0\u4e2a\u57fa\u7ebf pin \u517c\u5bb9\uff0c\u5f53\u4e14\u4ec5\u5f53\u540c\u65f6\u6ee1\u8db3\uff1a</p> <ol> <li><code>contractsVersion</code> \u4e0e pin \u76f8\u540c\uff1b</li> <li><code>auditSurfaceVersion</code> \u4e0e pin \u76f8\u540c\uff1b</li> <li><code>digestAuditSurface()</code> \u4e0e pin \u7684 <code>surfaceDigest</code> \u76f8\u540c\u3002</li> </ol> <p>\u7531\u4e8e surface \u6458\u8981\u8986\u76d6\u4e86\u767b\u8bb0\u8868\u3001\u9519\u8bef\u7801\u3001\u89c4\u5219\u3001kernel \u534f\u8bae\u3001\u5168\u90e8 schema \u6587\u6863\u4e0e\u5f15\u64ce\u53c2\u6570\uff0c\u6458\u8981\u76f8\u540c\u8574\u542b\u5185\u5bb9\u9010\u5b57\u8282\u7b49\u4ef7\uff08\u89c4\u8303\u5316\u610f\u4e49\u4e0b\uff09\u3002\u4e09\u4e2a\u6761\u4ef6\u4efb\u4e00\u4e0d\u6ee1\u8db3\u5373\u4e0d\u517c\u5bb9\uff1a\u5ba1\u8ba1\u5fc5\u987b\u62a5\u544a AUD-BASE-001\uff08\u8fd0\u884c\u671f\u57fa\u7ebf\u68c0\u67e5\uff09\u6216 AUD-LOCK-001\uff08\u5305\u9501\u9a8c\u8bc1\uff09\uff0c\u5e76\u62d2\u7edd\u7ed9\u51fa\u901a\u8fc7\u88c1\u51b3\u3002</p>"},{"location":"integration/audit/version-compatibility/#\u53d8\u66f4\u5206\u7ea7","title":"\u53d8\u66f4\u5206\u7ea7","text":"\u53d8\u66f4 \u5206\u7ea7 \u9700\u8981\u7684\u52a8\u4f5c \u4e0d\u6539\u53d8 surface \u5b57\u8282\u7684\u53d8\u66f4\uff08\u5982\u6ce8\u91ca\u3001\u6d4b\u8bd5\uff09 \u65e0\u5f71\u54cd \u65e0\u9700\u65b0 pin \u6539\u53d8 surface \u5b57\u8282\u4f46\u4e0d\u6539\u53d8\u542b\u4e49\u7684\u53d8\u66f4 \u4e0d\u517c\u5bb9 \u7981\u6b62\u4ee5\"\u540c\u4e49\"\u4e3a\u7531\u514d\u68c0\uff1b\u5fc5\u987b\u8d70\u5408\u540c\u53d8\u66f4\u5e76\u91cd\u65b0\u6279\u51c6 pin \u65b0\u589e\u5ba1\u8ba1\u6d88\u8d39\u63a5\u53e3\uff08\u53ea\u8bfb\u3001\u589e\u91cf\uff09 auditSurfaceVersion \u9012\u589e \u65b0 pin + \u672c\u6587\u4ef6\u66f4\u65b0 \u6539\u53d8\u65e2\u6709\u6d88\u8d39\u63a5\u53e3\u542b\u4e49 auditSurfaceVersion \u9012\u589e + \u5408\u540c\u53d8\u66f4 \u65b0 pin\uff1b\u65e7 pin \u5b58\u6863\u4e0d\u5220 Contracts \u7248\u672c\u6f14\u8fdb\uff081.0.0 \u2192 \u4e0b\u4e00\u7248\u672c\uff09 contractsVersion \u53d8\u5316 \u65b0\u7684\u57fa\u7ebf pin \u6587\u4ef6\uff1b\u65e7 pin \u6587\u4ef6\u53ea\u8bfb\u5b58\u6863"},{"location":"integration/audit/version-compatibility/#pin-\u751f\u547d\u5468\u671f","title":"pin \u751f\u547d\u5468\u671f","text":"<ul> <li>\u6bcf\u4e2a\u7ecf\u7248\u672c\u5316\u6279\u51c6\u7684 Contracts \u53d1\u5e03\u5bf9\u5e94\u4e00\u4e2a pin \u6587\u4ef6\uff1a<code>baseline/contracts-<version>.pin.json</code>\uff1b</li> <li>pin \u662f append-only\uff1a\u6279\u51c6\u540e\u4e0d\u518d\u539f\u5730\u7f16\u8f91\uff0c\u4f5c\u5e9f\u4ee5\u65b0 pin \u53d6\u4ee3\u5e76\u5728 <code>note</code> \u4e2d\u8bf4\u660e\uff1b</li> <li>pin \u7531\u4ea7\u54c1\u4fa7\u5728\u51bb\u7ed3\u65f6\u523b\u6784\u9020\uff08provenance <code>product-compatibility-fixture</code>\uff09\uff1a\u6458\u8981\u6765\u81ea\u5bf9\u5df2\u51bb\u7ed3\u4ea7\u7269\u7684 <code>digestAuditSurface()</code> \u673a\u68b0\u8ba1\u7b97\uff0c\u4e8b\u5b9e\u6e05\u5355\u76f4\u63a5\u5bf9\u7167\u5408\u540c\u6587\u6863\u63a8\u5bfc\uff0c\u4e0d\u53d6\u81ea\u751f\u6210\u5668\u6216 oracle\uff1b\u672c\u4ed3\u5e93\u4e0d\u5b58\u5728\u72ec\u7acb\u7684\u7b2c\u4e8c\u5ba1\u9605\u4f1a\u8bdd\uff0cpin \u4e0d\u4f5c\u4efb\u4f55\u72ec\u7acb\u89d2\u8272\u58f0\u79f0\uff1b</li> <li>\u8bda\u5b9e\u6027\u4fee\u6b63\uff082026-08-05\uff09\uff1a\u65e7 pin\uff081.0.0\u30011.1.0\uff09\u66fe\u643a\u5e26 <code>independent-r2</code> provenance \u4e0e\u72ec\u7acb\u91cd\u7b7e\u53d9\u4e8b\uff0c\u8be5\u58f0\u79f0\u4e0e\u672c\u4ed3\u4e8b\u5b9e\u4e0d\u7b26\uff0c\u5df2\u5c31\u5730\u4fee\u6b63 provenance \u4e0e note\uff1b\u4fee\u6b63\u53ea\u89e6\u53ca provenance/note \u4e24\u5904\u8bda\u5b9e\u6027\u5b57\u6bb5\uff0c\u4e0d\u6539\u53d8\u4efb\u4f55 digest \u6216 facts \u5b57\u6bb5\uff0c\u65e7 pin \u7ee7\u7eed\u4f5c\u4e3a\u53ea\u8bfb\u517c\u5bb9\u5b58\u6863\uff1b</li> <li>Contracts 1.1.1\uff082026-08-05\uff09\uff1a\u4ec5\u63cf\u8ff0\u8865\u4e01\uff08migration-manifest schema \u4e09\u5904 description \u6539\u5199\u4e3a\u7a33\u5b9a\u4ea7\u54c1\u8bed\u4e49\uff1b\u65e0\u4efb\u4f55\u6821\u9a8c\u5173\u952e\u5b57\u3001\u516c\u5f00 API\u3001\u9519\u8bef\u7801\u3001\u89c4\u5219\u6216\u5f15\u64ce\u53c2\u6570\u53d8\u5316\uff09\u3002\u6309\u672c\u751f\u547d\u5468\u671f\u65b0\u589e <code>contracts-1.1.1.pin.json</code> \u4e3a\u73b0\u884c\u57fa\u7ebf\uff0c<code>contracts-1.1.0.pin.json</code> \u8f6c\u4e3a\u53ea\u8bfb\u517c\u5bb9\u5b58\u6863\u30021.1.1 pin \u76f8\u5bf9 1.1.0 pin \u7684\u51c6\u786e\u4e8b\u5b9e\uff1a\u6821\u9a8c\u8bed\u4e49\u548c\u4e8b\u5b9e\u6e05\u5355\u4e0d\u53d8\uff08<code>facts</code> \u9010\u9879\u4e00\u81f4\uff09\uff1b\u56db\u4e2a Contracts \u6587\u6863\uff08registry\u3001error-codes\u3001rules\u3001kernel-protocol\uff09\u56e0\u5185\u5d4c <code>contractsVersion</code> \u4ece <code>1.1.0</code> \u66f4\u65b0\u5230 <code>1.1.1</code> \u800c\u6539\u53d8\u6458\u8981\uff1bmigration-manifest Schema \u56e0\u4e0a\u8ff0\u4e09\u5904 description \u66f4\u65b0\u800c\u6539\u53d8\u6458\u8981\uff1b\u5176\u4f59\u4e94\u4e2a Schema\uff08project-manifest\u3001profile-descriptor\u3001managed-file-lock\u3001operation-request\u3001operation-result\uff09\u6458\u8981\u4e0d\u53d8\u3002<code>proof-independence.mjs</code> \u7684 P5 \u5f3a\u5236\u8fd9\u5957\u5982\u5b9e\u58f0\u660e\u7684 provenance \u8bcd\u6c47\uff08pin\uff1a<code>product-compatibility-fixture</code>\uff1b\u53d8\u5f02\u5939\u5177\uff1a<code>product-fixture</code>\uff09\uff1b</li> <li>\u5ba1\u8ba1\u8fd0\u884c\u65f6\u5148\u505a\u5305\u9501\u9a8c\u8bc1\uff08\u89c1 isolation-and-lockfile.md\uff09\uff0c\u518d\u505a\u53d8\u5f02\u91cd\u653e\uff1bpin \u4e0d\u5339\u914d\u65f6\uff0c\u53d8\u5f02\u91cd\u653e\u7ed3\u679c\u4e0d\u5f97\u88ab\u91c7\u4fe1\u3002</li> </ul>"},{"location":"migration/","title":"\u5b58\u91cf\u91c7\u7528\u4e0e\u8fc1\u79fb\uff08FND-070\uff09","text":"<p>\u672c\u9875\u63cf\u8ff0\u5b58\u91cf\u9879\u76ee\u5982\u4f55\u91c7\u7528 Skill Family \u57fa\u7840\u8bbe\u65bd\uff0c\u4ee5\u53ca\u8fc1\u79fb\u5b8c\u6210\u5224\u5b9a\u7684\u95e8\u7981\u3002</p>"},{"location":"migration/#\u539f\u5219","title":"\u539f\u5219","text":"<ol> <li>\u8ba1\u5212\u5148\u884c\uff1a\u4efb\u4f55\u5b58\u91cf\u4ed3\u5148\u8fd0\u884c\u53ea\u8bfb <code>adopt-plan</code>\uff0c\u62ff\u5230\u73b0\u72b6\u3001\u76ee\u6807 Profile\u3001 \u7cbe\u786e\u5199\u96c6\u3001\u51b2\u7a81\u3001\u65e7\u5b9e\u73b0\u9000\u51fa\u6e05\u5355\u4e0e\u9a8c\u6536\u547d\u4ee4\uff0c\u518d\u51b3\u5b9a\u662f\u5426\u6267\u884c\u5199\u5165\u3002</li> <li>\u53ea\u8bfb\u8ba1\u5212\u96f6\u53d8\u5316\uff1a<code>adopt-plan</code> \u4e0d\u5199\u4efb\u4f55\u6587\u4ef6\uff08\u542b\u4e34\u65f6\u6587\u4ef6\uff09\u3001\u4e0d\u8fd0\u884c git \u5199\u547d\u4ee4\u3001\u4e0d\u6539\u540d\u3001\u4e0d\u89e6\u78b0\u8fdc\u7aef\uff1b\u5bf9\u8f93\u5165\u4ed3\u5b57\u8282\u96f6\u53d8\u5316\uff08\u524d\u540e\u54c8\u5e0c\u8d70\u67e5\u53ef\u8bc1\uff09\u3002</li> <li>\u91c7\u7528\u4e0e\u6539\u540d\u5206\u79bb\uff1a\u57fa\u7840\u8bbe\u65bd\u91c7\u7528\u7edd\u4e0d\u8fde\u5e26\u4ed3\u5e93\u6539\u540d\u6216\u8fdc\u7aef\u5750\u6807\u53d8\u66f4\uff1b \u4e24\u8005\u662f\u72ec\u7acb\u51b3\u7b56\uff0c\u5de5\u5177\u4e0d\u63d0\u4f9b\u4efb\u4f55\u6539\u540d\u80fd\u529b\u3002</li> <li>\u53cc\u8f68\u4e0d\u7b97\u5b8c\u6210\uff1a\u8fc1\u79fb\u5b8c\u6210\u5224\u5b9a\u8981\u6c42\u65e7\u91cd\u590d\u5b9e\u73b0\u5df2\u5220\u9664\uff1b\u53ea\u63a5\u5165\u65b0\u57fa\u7840\u8bbe\u65bd \u800c\u65e7\u5b9e\u73b0\u4ecd\u5728\uff0c\u5224\u5b9a\u6052\u4e3a false\u3002</li> </ol>"},{"location":"migration/#adopt-plan-\u8f93\u51fa\u7ed3\u6784","title":"adopt-plan \u8f93\u51fa\u7ed3\u6784","text":"\u6bb5\u843d \u5185\u5bb9 <code>target</code> \u73b0\u72b6\uff1a\u5165\u53e3\u6570\u3001\u76ee\u6807\u81ea\u6709\u53d7\u7ba1\u58f0\u660e <code>project</code> / <code>traceability</code> \u76ee\u6807 Profile \u4e0e\u6bcf\u9879\u5199\u5165\u7684\u771f\u6e90\uff08Contracts \u7248\u672c\u3001skeleton \u751f\u6210\u51fd\u6570\u3001\u8bb8\u53ef\u8bc1 Profile \u4e0e\u53d8\u4f53\uff09 <code>git</code> \u53ea\u8bfb Git \u524d\u7f6e\u72b6\u6001\uff08\u4ed3\u5e93\u3001HEAD\u3001clean\uff09 <code>writeSet</code> \u7cbe\u786e\u5199\u96c6\uff1a\u6bcf\u8def\u5f84\u7684 action\uff08\u4ec5 <code>create</code>/<code>unchanged</code>\uff09\u3001fileClass\u3001sha256 <code>conflicts</code> \u624b\u5199\u51b2\u7a81\u3001\u53d7\u7ba1\u6f02\u79fb\u3001\u7b26\u53f7\u94fe\u63a5\u5360\u4f4d\u3001\u7f3a\u5b57\u6bb5\u4e34\u65f6\u4f8b\u5916 <code>risks</code> dirty\u3001\u5d4c\u5957\u4ed3\u3001tracked-but-ignored\u3001\u5230\u671f\u4f8b\u5916\u7b49 <code>migration</code> \u8fc1\u79fb\u72b6\u6001\u673a\uff1a\u7ed1\u5b9a\uff08binding\uff09\u3001\u5728\u76d8\u8bc1\u660e\uff08adoptionProof\uff09\u3001\u5f85\u5199\u5165\u6570\u3001check \u95e8\u7981\u3001\u56db\u7c7b\u9a8c\u8bc1\u8bc1\u636e\u3001\u72b6\u6001\u4e0e\u5b8c\u6210\u5224\u5b9a <code>verificationPlan</code> \u9a8c\u6536\u547d\u4ee4\u5e8f\u5217\uff08check \u2192 projection \u2192 \u590d\u67e5\uff09"},{"location":"migration/#\u8fc1\u79fb\u6e05\u5355skill-familymigrationjson","title":"\u8fc1\u79fb\u6e05\u5355\uff08skill-family.migration.json\uff09","text":"<p>\u76ee\u6807\u4ed3\u5728\u6839\u76ee\u5f55\u58f0\u660e\u81ea\u5df1\u7684\u8fc1\u79fb\u72b6\u6001\uff1a</p> <pre><code>{\n \"kind\": \"skill-family.migration-manifest\",\n \"legacyInfra\": [\n { \"path\": \"scripts/old-validator.mjs\", \"replacedBy\": \"sf-kit check\" }\n ],\n \"exceptions\": [\n {\n \"owner\": \"\u8d1f\u8d23\u4eba\",\n \"reason\": \"\u5177\u4f53\u539f\u56e0\",\n \"deadline\": \"2026-12-31\",\n \"migrationTarget\": \"wave-m1\"\n }\n ],\n \"targetProfile\": \"generic\",\n \"foundationPackages\": [\n { \"name\": \"skill-family-contracts\", \"version\": \"0.1.1\", \"digest\": \"sha256:<64 \u4f4d\u5341\u516d\u8fdb\u5236>\" },\n { \"name\": \"skill-family-harness-node\", \"version\": \"0.1.1\", \"digest\": \"sha256:<64 \u4f4d\u5341\u516d\u8fdb\u5236>\" },\n { \"name\": \"skill-family-engineering-kit\", \"version\": \"0.1.1\", \"digest\": \"sha256:<64 \u4f4d\u5341\u516d\u8fdb\u5236>\" }\n ],\n \"verification\": {\n \"unit\": \"docs/evidence/unit.json\",\n \"integration\": \"docs/evidence/integration.json\",\n \"consumer\": \"docs/evidence/consumer.json\",\n \"independentAudit\": \"docs/evidence/independent-audit.json\"\n }\n}\n</code></pre> <ul> <li><code>legacyInfra</code> \u6bcf\u9879\u7ed9\u51fa\u65e7\u5b9e\u73b0\u8def\u5f84\u4e0e\u66ff\u4ee3\u7269\uff1b\u5de5\u5177\u53ea\u8bfb\u8bc4\u4f30\u5b58\u5728\u6027\uff0c\u7edd\u4e0d\u4ee3\u4e3a\u5220\u9664\u3002</li> <li><code>exceptions</code> \u662f\u4e34\u65f6\u4f8b\u5916\uff1a\u5fc5\u987b\u540c\u65f6\u542b\u8d1f\u8d23\u4eba\uff08owner\uff09\u3001\u539f\u56e0\uff08reason\uff09\u3001 \u622a\u6b62\u65f6\u95f4\uff08deadline\uff09\u3001\u8fc1\u79fb\u76ee\u6807\uff08migrationTarget\uff09\u56db\u9879\uff0c\u7f3a\u4efb\u4e00\u5b57\u6bb5\u5373\u8ba1\u4e3a \u51b2\u7a81\uff08\u8ba1\u5212\u5931\u8d25\uff09\uff1b\u5230\u671f\u4f8b\u5916\u4e0d\u81ea\u52a8\u7eed\u671f\uff0c\u6301\u7eed\u963b\u65ad\u5b8c\u6210\u5224\u5b9a\u3002</li> <li><code>targetProfile</code> / <code>foundationPackages</code>\uff1a\u91c7\u7528\u7ed1\u5b9a\u3002\u76ee\u6807 Profile \u5fc5\u987b\u4e0e\u8ba1\u5212 Profile \u4e00\u81f4\uff1b\u4e09\u4e2a Foundation \u5305\uff08contracts\u3001harness-node\u3001 engineering-kit\uff09\u5fc5\u987b\u5404\u81ea\u7ed1\u5b9a\u7cbe\u786e\u7248\u672c\u53f7\uff08\u4e0d\u63a5\u53d7\u6d6e\u52a8\u8303\u56f4\uff09\u4e0e <code>sha256:</code> \u6458\u8981\u3002</li> <li><code>verification</code>\uff1a\u56db\u7c7b\u9a8c\u8bc1\u8bc1\u636e\u6587\u6863\u8def\u5f84\uff08unit\u3001integration\u3001 consumer\u3001independentAudit\uff09\u3002\u6bcf\u4efd\u8bc1\u636e\u5fc5\u987b\u662f\u53ef\u89e3\u6790 JSON \u4e14\u5176 <code>projectId</code> \u4e0e\u76ee\u6807\u9879\u76ee\u8eab\u4efd\u4e00\u81f4\uff0c\u624d\u8ba1\u4e3a proven\uff1b\u8def\u5f84\u8d8a\u754c\u3001\u7f3a\u5931\u3001 \u4e0d\u53ef\u89e3\u6790\u3001\u8eab\u4efd\u4e0d\u7b26\u5747\u4e3a\u672a\u8bc1\u660e\uff0cfail-closed\u3002</li> </ul>"},{"location":"migration/#\u8fc1\u79fb\u72b6\u6001\u673a","title":"\u8fc1\u79fb\u72b6\u6001\u673a","text":"<p>\u72b6\u6001\u5355\u8c03\u9012\u8fdb\uff0c\u53ea\u7531\u53ea\u8bfb\u8bc1\u636e\u63a8\u5bfc\uff0c\u4efb\u4f55\u5de5\u5177\u90fd\u4e0d\u901a\u8fc7\u5199\u5165\u63a8\u8fdb\u72b6\u6001\uff1a</p> <pre><code>not-declared \u2192 declared \u2192 adopted \u2192 verified \u2192 complete\n</code></pre> \u72b6\u6001 \u542b\u4e49 <code>not-declared</code> \u4e0d\u5b58\u5728\u5951\u7ea6\u6709\u6548\u7684\u8fc1\u79fb\u6e05\u5355 <code>declared</code> \u6e05\u5355\u5951\u7ea6\u6709\u6548\uff0c\u4f46\u91c7\u7528\u4e8b\u5b9e\u8bc1\u660e\u4e0d\u5168 <code>adopted</code> Foundation \u5b57\u8282\u5df2\u5728\u76d8\u4e14\u65e7\u5b9e\u73b0\u5df2\u9000\u51fa\uff0ccheck \u95e8\u7981\u672a\u7eff <code>verified</code> check \u95e8\u7981\u7eff\uff0c\u9a8c\u8bc1\u8bc1\u636e\u672a\u5168\u90e8 proven <code>complete</code> \u516b\u9879\u5b8c\u6210\u6761\u4ef6\u5168\u90e8\u6ee1\u8db3\uff1b<code>complete</code> \u4e3a\u771f\u5f53\u4e14\u4ec5\u5f53\u72b6\u6001\u4e3a <code>complete</code>"},{"location":"migration/#\u5b8c\u6210\u5224\u5b9a\u95e8\u7981","title":"\u5b8c\u6210\u5224\u5b9a\u95e8\u7981","text":"<p><code>migration.completion.complete</code> \u4e3a true \u5f53\u4e14\u4ec5\u5f53\u5168\u90e8\u516b\u9879\u6210\u7acb\uff1a</p> <ol> <li>\u5df2\u58f0\u660e\u5951\u7ea6\u6709\u6548\u7684\u8fc1\u79fb\u6e05\u5355\uff08kind/\u5b57\u6bb5\u7ecf Contracts schema \u6821\u9a8c\uff09\uff1b</li> <li>\u91c7\u7528\u7ed1\u5b9a\u5df2\u8bc1\u660e\uff1a\u76ee\u6807 Profile \u4e0e\u8ba1\u5212\u4e00\u81f4\uff0c\u4e09\u4e2a Foundation \u5305\u5747\u7ed1\u5b9a \u7cbe\u786e\u7248\u672c\u4e0e sha256 \u6458\u8981\uff1b</li> <li>Project Manifest\u3001managed lock\u3001identity \u4e0e\u5168\u90e8\u53d7\u7ba1\u9aa8\u67b6\u6587\u4ef6\u5728\u76d8\u4e14 \u6458\u8981\u4e0e\u8ba1\u5212\u4e00\u81f4\uff08<code>adoptionProof.missing</code>/<code>mismatched</code> \u4e3a\u7a7a\uff09\uff1b</li> <li>\u5199\u96c6\u4e2d\u65e0\u5f85\u6267\u884c\u7684 create/replace/project \u52a8\u4f5c\uff08<code>pendingWrites</code> \u4e3a 0\uff09\uff1b</li> <li>Foundation check \u95e8\u7981\u7eff\uff1b</li> <li>\u6bcf\u9879\u65e7\u5b9e\u73b0\u5747\u5df2\u9000\u51fa\uff08absent\uff09\u2014\u2014containment \u62d2\u7edd\u6216\u7578\u5f62\u6761\u76ee\u4e0e present \u540c\u7b49 fail-closed\uff1b</li> <li>\u65e0\u7f3a\u5b57\u6bb5\u3001\u65e0\u4e0d\u53ef\u89e3\u6790\u622a\u6b62\u65f6\u95f4\u3001\u65e0\u5df2\u5230\u671f\u7684\u4e34\u65f6\u4f8b\u5916\uff1b\u65e0\u672a\u89e3\u51b3\u7684\u91c7\u7528\u51b2\u7a81\uff1b</li> <li>\u56db\u7c7b\u9a8c\u8bc1\u8bc1\u636e\uff08unit/integration/consumer/independentAudit\uff09\u5168\u90e8 proven \u4e14\u8eab\u4efd\uff08projectId\uff09\u5339\u914d\u3002</li> </ol> <p>\u672a\u8bc4\u4f30\u7684\u8f93\u5165\u4e0e\u672a\u8bc1\u660e\u7b49\u4ef7\uff1a\u95e8\u7981\u53ea\u4f9d\u636e\u51fa\u793a\u7684\u8bc1\u636e\u524d\u8fdb\u3002 \u963b\u65ad\u7406\u7531\uff08<code>blockers</code>\uff09\u4e3a\u7a33\u5b9a\u53ef\u8bfb\u5b57\u7b26\u4e32\uff0c\u53ef\u76f4\u63a5\u8fdb\u5165\u8fc1\u79fb\u8bc4\u5ba1\u8bb0\u5f55\u3002</p>"},{"location":"migration/#\u5f3a\u5236\u8d1f\u4f8b\u4efb\u4e00\u573a\u666f-completion-\u5fc5\u987b\u4e3a-false","title":"\u5f3a\u5236\u8d1f\u4f8b\uff08\u4efb\u4e00\u573a\u666f completion \u5fc5\u987b\u4e3a false\uff09","text":"<ul> <li>\u7a7a\u4ed3 + \u7a7a\u6e05\u5355\uff08\u65e0\u5951\u7ea6\u6709\u6548\u6e05\u5355 \u2192 <code>not-declared</code>\uff09\uff1b</li> <li>\u6e05\u5355 kind \u9519\u8bef\uff08schema-invalid \u2192 \u89c6\u540c\u672a\u58f0\u660e\uff09\uff1b</li> <li>9 \u4e2a\u9aa8\u67b6\u6587\u4ef6\u4ecd\u5f85 create\uff08<code>declared</code>\uff0c\u5217\u51fa\u5168\u90e8\u7f3a\u5931\u8def\u5f84\uff09\uff1b</li> <li>managed lock \u6f02\u79fb\uff08<code>mismatched</code> \u975e\u7a7a\uff09\uff1b</li> <li>\u53ea\u63a5\u5165\u65b0\u5b9e\u73b0\u3001\u65e7\u5b9e\u73b0\u4ecd\u5728\uff08\u53cc\u8f68 \u2192 <code>declared</code>\uff09\uff1b</li> <li>\u6d88\u8d39\u8005\u9a8c\u8bc1\u8bc1\u636e\u7f3a\u5931\u6216\u8eab\u4efd\u4e0d\u7b26\uff08<code>verified</code>\uff0c\u4e0d\u5f97 complete\uff09\uff1b</li> <li>\u4e34\u65f6\u4f8b\u5916\u8fc7\u671f\uff08\u5de5\u5177\u7edd\u4e0d\u7eed\u671f\uff09\u3002</li> </ul>"},{"location":"migration/#\u5341\u5b57\u6bb5-hand-off-\u8349\u6848","title":"\u5341\u5b57\u6bb5 hand-off \u8349\u6848","text":"<p><code>adopt-plan</code> \u8f93\u51fa\u643a\u5e26 <code>handoffDraft</code> \u5b50\u5757\uff08kind=<code>skill-family.handoff-draft</code>\uff0c schemaVersion=1\uff09\uff0c\u4e3a planner \u4fa7\u7684\u5341\u5b57\u6bb5 hand-off \u63d0\u4f9b\u7ed3\u6784\u5316\u6570\u636e\u8349\u6848\u3002 \u5b57\u6bb5\u6765\u6e90\u53ea\u6709\u4e24\u79cd\uff1a<code>derived</code>\uff08\u53ef\u7531\u53ea\u8bfb\u8bc1\u636e\u673a\u68b0\u63a8\u5bfc\uff09\u4e0e <code>INCOMPLETE</code> \uff08\u4e0d\u53ef\u673a\u68b0\u63a8\u5bfc\uff0c\u7edd\u4e0d\u731c\u6d4b\uff09\u3002\u5341\u5b57\u6bb5\u4e0e\u6e90\u7801\u5e38\u91cf <code>HANDOFF_FIELDS</code> \u9010\u4e00\u5bf9\u5e94\uff1a</p> id \u5b57\u6bb5\u540d \u6765\u6e90 1 <code>project-identity</code> derived 2 <code>repository-state</code> derived 3 <code>foundation-binding</code> derived\uff08\u6e05\u5355\u5df2\u58f0\u660e\u7ed1\u5b9a\uff09\uff0fINCOMPLETE\uff08\u65e0\u6e05\u5355\u58f0\u660e\uff09 4 <code>write-set-policy</code> derived 5 <code>legacy-exits</code> derived 6 <code>business-logic-to-keep</code> \u6052 INCOMPLETE 7 <code>plan-summary</code> derived 8 <code>verification-entries</code> derived\uff08\u56db\u7c7b\u8bc1\u636e\u5168\u90e8 proven\uff09\uff0fINCOMPLETE\uff08\u4efb\u4e00\u672a\u8bc1\u660e\uff09 9 <code>legacy-removal-recovery</code> \u6052 INCOMPLETE 10 <code>authorization-status</code> derived\uff08commit/push/tag/publish \u6052\u4e3a false\uff09"},{"location":"migration/#INCOMPLETE-\u963b\u65ad\u89c4\u5219","title":"INCOMPLETE \u963b\u65ad\u89c4\u5219","text":"<ul> <li>\u4efb\u4f55 INCOMPLETE \u5b57\u6bb5\u90fd\u4f7f <code>ready=false</code>\uff1a\u8349\u6848\u5e26\u7f3a\u53e3\u5c31\u4e0d\u5f97\u8fdb\u5165 hand-off\u3002</li> <li>\u5de5\u5177\u7edd\u4e0d\u731c\u6d4b\u4e0d\u53ef\u673a\u68b0\u63a8\u5bfc\u7684\u5b57\u6bb5\uff1a</li> <li><code>business-logic-to-keep</code> \u4e0e <code>legacy-removal-recovery</code> \u6052 INCOMPLETE\uff0c \u5fc5\u987b\u7531\u4eba\u7c7b\u8d1f\u8d23\u4eba\u7ed9\u51fa\uff0c\u5de5\u5177\u65e0\u63a8\u5bfc\u4f9d\u636e\uff1b</li> <li><code>foundation-binding</code> \u5728\u65e0\u8fc1\u79fb\u6e05\u5355\u58f0\u660e\uff08<code>foundationPackages</code>\uff09\u65f6 INCOMPLETE\uff0c\u53ea\u8ba1\u6e05\u5355\u58f0\u660e\u7684\u7ed1\u5b9a\uff1b</li> <li><code>verification-entries</code> \u5728\u56db\u7c7b\u8bc1\u636e\uff08unit/integration/consumer/ independentAudit\uff09\u4efb\u4e00\u672a\u8fbe proven \u65f6 INCOMPLETE\u3002</li> </ul>"},{"location":"migration/#\u7ed1\u5b9a","title":"\u7ed1\u5b9a","text":"<p>\u8349\u6848\u643a\u5e26\u53cc sha256 \u6458\u8981\uff08<code>binding</code> \u5757\uff09\uff1a<code>targetSetDigest</code> \u6c47\u603b\u76ee\u6807\u4ed3 \u6587\u4ef6\u96c6\u5408\uff0c<code>foundationPlanDigest</code> \u6c47\u603b Foundation \u8ba1\u5212\u5199\u96c6\u3002\u540c\u4e00\u76ee\u6807\u4e24\u6b21 \u8ba1\u5212\u5f97\u5230\u76f8\u540c\u6458\u8981\uff0c\u8349\u6848\u4e0e\u8ba1\u5212\u65f6\u523b\u7684\u76ee\u6807\u72b6\u6001\u7cbe\u786e\u7ed1\u5b9a\u3002</p>"},{"location":"migration/#\u6e32\u67d3\u8fb9\u754c","title":"\u6e32\u67d3\u8fb9\u754c","text":"<ul> <li>\u6e32\u67d3\u5668\u53ea\u5199 planner \u4fa7\u7684 hand-off \u8349\u6848\uff0c\u7edd\u4e0d\u5199\u6d88\u8d39\u8005\u4ed3\uff1b</li> <li>\u4e0d\u65b0\u589e\u7b2c\u4e94\u4e2a Kit \u9876\u5c42\u547d\u4ee4\uff1aKit \u9876\u5c42\u547d\u4ee4\u6052\u4e3a scaffold\u3001adopt-plan\u3001 projection\u3001check \u56db\u4e2a\uff0c<code>handoffDraft</code> \u53ea\u662f <code>adopt-plan</code> \u8f93\u51fa\u7684\u5b50\u5757\u3002</li> </ul>"},{"location":"migration/#\u5371\u5bb3\u7c7b-fixture","title":"\u5371\u5bb3\u7c7b fixture","text":"<p><code>fixtures/adoption/cases/</code> \u8986\u76d6\u4e03\u4e2a\u5371\u5bb3\u7c7b\uff1adirty \u4ed3\u3001\u5d4c\u5957\u4ed3\u3001 tracked-but-ignored\u3001\u7b26\u53f7\u94fe\u63a5\u5360\u4f4d\u3001\u751f\u6210\u7269\u6f02\u79fb\u3001\u65e7\u5b9e\u73b0\u9000\u51fa\u95e8\u7981\u3001 \u4e34\u65f6\u4f8b\u5916\u5b57\u6bb5\u3002\u6bcf\u4e2a\u6848\u4f8b\u4ee5\u5b57\u8282\u7ea7\u524d\u540e\u5feb\u7167\u8bc1\u660e\u8ba1\u5212\u53ea\u8bfb\uff1b\u6848\u4f8b\u8bf4\u660e\u89c1\u4ed3\u5185 <code>fixtures/adoption/README.md</code>\u3002</p>"}]}
|
package/docs/setup/index.html
CHANGED
|
@@ -853,13 +853,13 @@ python3 -m venv ../docs-site-venv
|
|
|
853
853
|
</code></pre>
|
|
854
854
|
<p>离线环境安装(固定流程):在线机器只下载 wheelhouse,离线安装必须进入一个<strong>从未在线安装过的新 offline venv</strong>——复用在线 venv 无法证明离线链路可用:</p>
|
|
855
855
|
<pre><code class="language-bash"># 1. 在线机器:下载 wheelhouse(下载同样逐条校验 hash;本步不安装到任何 venv)
|
|
856
|
-
python3 -m pip download --require-hashes -r scripts/docs/requirements.txt -d
|
|
856
|
+
python3 -m pip download --require-hashes -r scripts/docs/requirements.txt -d ../docs-wheels
|
|
857
857
|
|
|
858
858
|
# 2. 离线机器:新建一个从未在线安装过的 offline venv(路径可按需替换,不得复用 ../docs-site-venv)
|
|
859
859
|
python3 -m venv ../docs-site-offline-venv
|
|
860
860
|
|
|
861
861
|
# 3. 完全离线安装:不访问任何索引,只从 wheelhouse 解析,继续逐条校验 hash(字节不符直接失败)
|
|
862
|
-
../docs-site-offline-venv/bin/pip install --no-index --find-links
|
|
862
|
+
../docs-site-offline-venv/bin/pip install --no-index --find-links ../docs-wheels --require-hashes -r scripts/docs/requirements.txt
|
|
863
863
|
|
|
864
864
|
# 4. 严格模式构建(任何警告都会失败)
|
|
865
865
|
../docs-site-offline-venv/bin/mkdocs build --strict
|
package/package.json
CHANGED
|
@@ -1,42 +1,43 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"version": "0.1.0",
|
|
4
|
-
"private": false,
|
|
5
|
-
"description": "Build-time scaffold, adoption planning, projection, and checks.",
|
|
2
|
+
"//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".",
|
|
6
3
|
"author": "广州市风荷科技有限公司",
|
|
7
|
-
"
|
|
8
|
-
|
|
9
|
-
"type": "git",
|
|
10
|
-
"url": "https://github.com/ifoohoo/skill-family-engineering-kit.git"
|
|
4
|
+
"bin": {
|
|
5
|
+
"skill-family-kit": "./src/cli.mjs"
|
|
11
6
|
},
|
|
12
|
-
"homepage": "https://github.com/ifoohoo/skill-family-engineering-kit",
|
|
13
7
|
"bugs": {
|
|
14
8
|
"url": "https://github.com/ifoohoo/skill-family-engineering-kit/issues"
|
|
15
9
|
},
|
|
16
|
-
"
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"skill-family-contracts": "0.1.2",
|
|
12
|
+
"skill-family-harness-node": "0.1.2"
|
|
13
|
+
},
|
|
14
|
+
"description": "Build-time scaffold, adoption planning, projection, and checks.",
|
|
17
15
|
"engines": {
|
|
18
16
|
"node": ">=22.22.2 <23"
|
|
19
17
|
},
|
|
20
18
|
"exports": "./src/index.mjs",
|
|
21
|
-
"dependencies": {
|
|
22
|
-
"skill-family-contracts": "0.1.0",
|
|
23
|
-
"skill-family-harness-node": "0.1.0"
|
|
24
|
-
},
|
|
25
|
-
"bin": {
|
|
26
|
-
"skill-family-kit": "./src/cli.mjs"
|
|
27
|
-
},
|
|
28
19
|
"files": [
|
|
29
20
|
"src",
|
|
30
21
|
"data",
|
|
31
22
|
"LICENSE",
|
|
23
|
+
"THIRD_PARTY_NOTICES",
|
|
32
24
|
"SECURITY.md",
|
|
33
25
|
"CONTRIBUTING.md",
|
|
34
26
|
"CODE_OF_CONDUCT.md",
|
|
35
27
|
"docs"
|
|
36
28
|
],
|
|
37
|
-
"
|
|
29
|
+
"homepage": "https://github.com/ifoohoo/skill-family-engineering-kit",
|
|
30
|
+
"license": "Apache-2.0",
|
|
31
|
+
"name": "skill-family-engineering-kit",
|
|
32
|
+
"private": false,
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "https://github.com/ifoohoo/skill-family-engineering-kit.git"
|
|
36
|
+
},
|
|
37
|
+
"type": "module",
|
|
38
|
+
"version": "0.1.2",
|
|
38
39
|
"scripts": {
|
|
39
|
-
"check": "node --
|
|
40
|
-
"test": "node --
|
|
40
|
+
"check": "node --input-type=module -e \"import('./src/index.mjs').then(() => console.log('smoke ok')).catch(e => { console.error(e); process.exit(1) })\"",
|
|
41
|
+
"test": "node --input-type=module -e \"import('./src/index.mjs').then(() => console.log('smoke ok')).catch(e => { console.error(e); process.exit(1) })\""
|
|
41
42
|
}
|
|
42
43
|
}
|
package/src/check.mjs
CHANGED
|
@@ -127,10 +127,30 @@ async function readManagedCandidate(rootAbs, rel, findings) {
|
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
-
|
|
130
|
+
/**
|
|
131
|
+
* Loads and parses the managed-file-lock JSON independently of any check class.
|
|
132
|
+
* Returns the parsed lock object, or null when the lock is absent or unreadable.
|
|
133
|
+
*/
|
|
134
|
+
async function loadManagedFileLock(rootAbs) {
|
|
131
135
|
const loaded = await readOptionalJson(rootAbs, MANAGED_LOCK_PATH);
|
|
132
|
-
if (!loaded.ok) return null;
|
|
133
|
-
|
|
136
|
+
if (!loaded.ok) return null;
|
|
137
|
+
return loaded.value;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
async function checkDrift(rootAbs, findings) {
|
|
141
|
+
const lock = await loadManagedFileLock(rootAbs);
|
|
142
|
+
if (!lock) {
|
|
143
|
+
findings.push(
|
|
144
|
+
finding(
|
|
145
|
+
"drift",
|
|
146
|
+
KIT_ERROR_KINDS.MANAGED_FILE_MISSING,
|
|
147
|
+
"SFC2004",
|
|
148
|
+
"managed-file-lock is absent; drift check cannot run without it",
|
|
149
|
+
{ path: MANAGED_LOCK_PATH },
|
|
150
|
+
),
|
|
151
|
+
);
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
134
154
|
const entries = Array.isArray(lock?.entries) ? lock.entries : [];
|
|
135
155
|
for (const entry of entries) {
|
|
136
156
|
const rel = typeof entry?.path === "string" ? normalizeRelPath(entry.path) : null;
|
|
@@ -169,7 +189,18 @@ async function checkDrift(rootAbs, findings) {
|
|
|
169
189
|
}
|
|
170
190
|
|
|
171
191
|
async function checkClosure(rootAbs, lock, findings) {
|
|
172
|
-
if (!lock)
|
|
192
|
+
if (!lock) {
|
|
193
|
+
findings.push(
|
|
194
|
+
finding(
|
|
195
|
+
"closure",
|
|
196
|
+
KIT_ERROR_KINDS.CLOSURE_INPUT_MISSING,
|
|
197
|
+
"SFC2004",
|
|
198
|
+
"managed-file-lock is absent; resource closure cannot be computed without it",
|
|
199
|
+
{ path: MANAGED_LOCK_PATH },
|
|
200
|
+
),
|
|
201
|
+
);
|
|
202
|
+
return { digest: null };
|
|
203
|
+
}
|
|
173
204
|
const resources = [
|
|
174
205
|
{ path: MANAGED_LOCK_PATH, role: "input" },
|
|
175
206
|
...(Array.isArray(lock.entries) ? lock.entries : [])
|
|
@@ -210,10 +241,26 @@ async function checkClosure(rootAbs, lock, findings) {
|
|
|
210
241
|
}
|
|
211
242
|
}
|
|
212
243
|
|
|
213
|
-
async function checkVersion(docs, findings) {
|
|
214
|
-
|
|
244
|
+
async function checkVersion(rootAbs, docs, findings) {
|
|
245
|
+
let manifest = docs[PROJECT_MANIFEST_PATH];
|
|
246
|
+
if (!manifest) {
|
|
247
|
+
// Load independently when the contracts check didn't run first
|
|
248
|
+
const loaded = await readOptionalJson(rootAbs, PROJECT_MANIFEST_PATH);
|
|
249
|
+
if (loaded.ok) manifest = loaded.value;
|
|
250
|
+
}
|
|
215
251
|
const declared = manifest?.contracts?.version;
|
|
216
|
-
if (typeof declared !== "string")
|
|
252
|
+
if (typeof declared !== "string") {
|
|
253
|
+
findings.push(
|
|
254
|
+
finding(
|
|
255
|
+
"version",
|
|
256
|
+
KIT_ERROR_KINDS.CONTRACTS_MISSING,
|
|
257
|
+
"SFC2004",
|
|
258
|
+
"project manifest is absent or lacks contracts.version; version check cannot run",
|
|
259
|
+
{ path: PROJECT_MANIFEST_PATH },
|
|
260
|
+
),
|
|
261
|
+
);
|
|
262
|
+
return { contractsVersion: null };
|
|
263
|
+
}
|
|
217
264
|
if (declared !== CONTRACTS_VERSION) {
|
|
218
265
|
findings.push(
|
|
219
266
|
finding(
|
|
@@ -360,11 +407,18 @@ export async function runChecks({ root, allowGitSpawn = true, only, profilesRoot
|
|
|
360
407
|
let identityRecord = null;
|
|
361
408
|
|
|
362
409
|
if (classes.includes("contracts")) await checkContracts(rootAbs, docs, findings);
|
|
410
|
+
|
|
411
|
+
let driftLock = null;
|
|
363
412
|
if (classes.includes("drift")) {
|
|
364
|
-
|
|
365
|
-
|
|
413
|
+
driftLock = await checkDrift(rootAbs, findings);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
if (classes.includes("closure")) {
|
|
417
|
+
const lock = driftLock ?? (classes.includes("drift") ? null : await loadManagedFileLock(rootAbs));
|
|
418
|
+
closureInfo = await checkClosure(rootAbs, lock, findings);
|
|
366
419
|
}
|
|
367
|
-
|
|
420
|
+
|
|
421
|
+
if (classes.includes("version")) versionInfo = await checkVersion(rootAbs, docs, findings);
|
|
368
422
|
if (classes.includes("docs")) await checkDocs(rootAbs, docs, findings);
|
|
369
423
|
if (classes.includes("git")) git = await checkGit(rootAbs, findings, allowGitSpawn);
|
|
370
424
|
if (classes.includes("identity")) identityRecord = await checkIdentity(rootAbs, docs, findings, profilesRoot);
|
package/src/cli.mjs
CHANGED
package/src/index.mjs
CHANGED
|
@@ -61,6 +61,7 @@ import {
|
|
|
61
61
|
PROJECT_MANIFEST_PATH,
|
|
62
62
|
PROJECTION_MANIFEST_PATH,
|
|
63
63
|
} from "./skeleton.mjs";
|
|
64
|
+
import { matchAnyGlob } from "./workspace.mjs";
|
|
64
65
|
|
|
65
66
|
/**
|
|
66
67
|
* skill-family-engineering-kit: the four build-time engineering commands.
|
|
@@ -194,6 +195,7 @@ export {
|
|
|
194
195
|
MANAGED_LOCK_PATH,
|
|
195
196
|
PROJECTION_MANIFEST_PATH,
|
|
196
197
|
IDENTITY_RECORD_PATH,
|
|
198
|
+
matchAnyGlob,
|
|
197
199
|
};
|
|
198
200
|
export { ContractsError };
|
|
199
201
|
|
package/src/skeleton.mjs
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
1
4
|
import { CONTRACTS_VERSION } from "skill-family-contracts";
|
|
2
5
|
import { digestBytes } from "skill-family-harness-node";
|
|
3
6
|
import { invalidParamsError, kitError, KIT_ERROR_KINDS } from "./errors.mjs";
|
|
@@ -31,7 +34,10 @@ import { MIGRATION_MANIFEST_PATH } from "./migration.mjs";
|
|
|
31
34
|
*/
|
|
32
35
|
|
|
33
36
|
export const KIT_TOOL_NAME = "skill-family-engineering-kit";
|
|
34
|
-
|
|
37
|
+
|
|
38
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
39
|
+
const _kitPkg = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf8"));
|
|
40
|
+
export const KIT_VERSION = _kitPkg.version;
|
|
35
41
|
|
|
36
42
|
/** Kit-owned document paths inside a target workspace. */
|
|
37
43
|
export const PROJECT_MANIFEST_PATH = "skill-family.project-manifest.json";
|
|
@@ -136,13 +142,18 @@ function renderRootPackageJson({ projectId, projectName, licensingProfile }) {
|
|
|
136
142
|
// `node .projenrc.js` works for the first synth and every later one.
|
|
137
143
|
synth: "node .projenrc.js",
|
|
138
144
|
check:
|
|
139
|
-
"node scripts/check-core.mjs && node scripts/check-docs.mjs &&
|
|
145
|
+
"node scripts/check-core.mjs && node scripts/check-docs.mjs && pnpm --recursive --if-present run check",
|
|
140
146
|
test: "pnpm --recursive --if-present run test",
|
|
141
147
|
"docs-build": "mkdocs build --strict",
|
|
142
148
|
},
|
|
143
149
|
devDependencies: {
|
|
144
150
|
projen: SKELETON_PROJEN_VERSION,
|
|
145
151
|
},
|
|
152
|
+
dependencies: {
|
|
153
|
+
"skill-family-contracts": KIT_VERSION,
|
|
154
|
+
"skill-family-harness-node": KIT_VERSION,
|
|
155
|
+
"skill-family-engineering-kit": KIT_VERSION,
|
|
156
|
+
},
|
|
146
157
|
"//": PROJEN_MARKER,
|
|
147
158
|
});
|
|
148
159
|
}
|
|
@@ -370,38 +381,86 @@ function renderDocsDeployWorkflow() {
|
|
|
370
381
|
function renderCheckCoreScript() {
|
|
371
382
|
return [
|
|
372
383
|
"#!/usr/bin/env node",
|
|
373
|
-
"// core check:
|
|
374
|
-
"// file registry
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
"",
|
|
378
|
-
|
|
384
|
+
"// core check: delegates to the Foundation's production check entry and",
|
|
385
|
+
"// verifies the file registry closed-world classification.",
|
|
386
|
+
"// No local algorithm duplication — the generated project consumes the",
|
|
387
|
+
"// shared check closure from skill-family-engineering-kit.",
|
|
388
|
+
'import { lstat } from "node:fs/promises";',
|
|
389
|
+
'import { readFileSync } from "node:fs";',
|
|
390
|
+
'import { readdir } from "node:fs/promises";',
|
|
391
|
+
'import path from "node:path";',
|
|
392
|
+
'import { runChecks, matchAnyGlob } from "skill-family-engineering-kit";',
|
|
393
|
+
"",
|
|
394
|
+
"const root = process.cwd();",
|
|
379
395
|
"const failures = [];",
|
|
380
|
-
"
|
|
381
|
-
"
|
|
382
|
-
|
|
396
|
+
"",
|
|
397
|
+
"// Load file registry for closed-world classification",
|
|
398
|
+
'const registry = JSON.parse(readFileSync(path.join(root, ".foundation/file-registry.json"), "utf8"));',
|
|
399
|
+
'const lock = JSON.parse(readFileSync(path.join(root, "skill-family.managed-file-lock.json"), "utf8"));',
|
|
400
|
+
"",
|
|
401
|
+
"// Build managed file set from file registry (projenManaged + kitManaged)",
|
|
402
|
+
"const managedSet = new Set([",
|
|
403
|
+
" ...registry.classes.projenManaged.files,",
|
|
404
|
+
" ...registry.classes.kitManaged.files,",
|
|
405
|
+
"]);",
|
|
406
|
+
"",
|
|
407
|
+
"// Build handwritten patterns from registry",
|
|
408
|
+
"const handwrittenPatterns = registry.classes.handwritten.entries.filter((e) => typeof e === \"string\");",
|
|
409
|
+
"",
|
|
410
|
+
"// Artifact patterns from registry",
|
|
411
|
+
"const artifactPatterns = registry.classes.artifacts.patterns.filter((e) => typeof e === \"string\");",
|
|
412
|
+
"",
|
|
413
|
+
"// Pre-flight: verify managed files are regular files (catches symlinks, FIFOs, etc.)",
|
|
414
|
+
"// This prevents runChecks from hanging on FIFOs and provides clear error messages.",
|
|
415
|
+
"for (const relPath of managedSet) {",
|
|
416
|
+
" let st;",
|
|
417
|
+
" try {",
|
|
418
|
+
" st = await lstat(path.resolve(root, relPath));",
|
|
419
|
+
" } catch {",
|
|
420
|
+
' failures.push(`managed file missing: ${relPath}`);',
|
|
383
421
|
" continue;",
|
|
384
422
|
" }",
|
|
385
|
-
"
|
|
386
|
-
|
|
423
|
+
" if (st.isSymbolicLink()) {",
|
|
424
|
+
' failures.push(`managed file is a symlink: ${relPath}`);',
|
|
425
|
+
" } else if (!st.isFile()) {",
|
|
426
|
+
' failures.push(`managed file is not a regular file: ${relPath}`);',
|
|
427
|
+
" }",
|
|
387
428
|
"}",
|
|
388
|
-
"
|
|
389
|
-
"
|
|
390
|
-
"
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
"
|
|
395
|
-
"
|
|
396
|
-
|
|
397
|
-
"
|
|
429
|
+
"",
|
|
430
|
+
"// Closed-world file classification: every tracked file must be classified",
|
|
431
|
+
"const OPAQUE = new Set([\".git\", \"node_modules\"]);",
|
|
432
|
+
"async function walk(dir, base) {",
|
|
433
|
+
" const dirents = await readdir(dir, { withFileTypes: true });",
|
|
434
|
+
" for (const dirent of dirents) {",
|
|
435
|
+
" const rel = base ? `${base}/${dirent.name}` : dirent.name;",
|
|
436
|
+
" if (dirent.isDirectory() && !dirent.isSymbolicLink()) {",
|
|
437
|
+
" if (!OPAQUE.has(dirent.name)) await walk(path.join(dir, dirent.name), rel);",
|
|
438
|
+
" continue;",
|
|
439
|
+
" }",
|
|
440
|
+
" if (!dirent.isFile()) continue;",
|
|
441
|
+
" const isManaged = managedSet.has(rel);",
|
|
442
|
+
" const isHandwritten = matchAnyGlob(handwrittenPatterns, rel);",
|
|
443
|
+
" const isArtifact = matchAnyGlob(artifactPatterns, rel);",
|
|
444
|
+
" if (!isManaged && !isHandwritten && !isArtifact) {",
|
|
445
|
+
' failures.push(`unregistered file: ${rel}`);',
|
|
446
|
+
" }",
|
|
447
|
+
" }",
|
|
448
|
+
"}",
|
|
449
|
+
"await walk(root, \"\");",
|
|
450
|
+
"",
|
|
451
|
+
"// Run the shared production checks (schema, drift, closure, version, docs, git, identity)",
|
|
452
|
+
"if (failures.length === 0) {",
|
|
453
|
+
" const report = await runChecks({ root, allowGitSpawn: true });",
|
|
454
|
+
" for (const f of report.findings) {",
|
|
455
|
+
' failures.push(`${f.class}: ${f.message}`);',
|
|
398
456
|
" }",
|
|
399
457
|
"}",
|
|
458
|
+
"",
|
|
400
459
|
"if (failures.length > 0) {",
|
|
401
|
-
' for (const
|
|
402
|
-
" process.exit(2);",
|
|
460
|
+
' for (const f of failures) console.error(`[check-core] ${f}`);',
|
|
461
|
+
" process.exit(failures.some((f) => f.includes(\"symlink\") || f.includes(\"not a regular\") || f.includes(\"traversal\") || f.includes(\"escape\")) ? 2 : 1);",
|
|
403
462
|
"}",
|
|
404
|
-
'console.log(`[check-core] OK
|
|
463
|
+
'console.log(`[check-core] OK`);',
|
|
405
464
|
"",
|
|
406
465
|
].join("\n");
|
|
407
466
|
}
|
|
@@ -430,39 +489,6 @@ function renderCheckDocsScript() {
|
|
|
430
489
|
].join("\n");
|
|
431
490
|
}
|
|
432
491
|
|
|
433
|
-
function renderSecurityNegativeScript() {
|
|
434
|
-
return [
|
|
435
|
-
"#!/usr/bin/env node",
|
|
436
|
-
"// security negative cases: every hostile path MUST be rejected by the",
|
|
437
|
-
"// containment classifier below; if any passes, this script exits 2.",
|
|
438
|
-
"",
|
|
439
|
-
"function classify(relPath) {",
|
|
440
|
-
' if (typeof relPath !== "string" || relPath.length === 0) return "reject";',
|
|
441
|
-
' if (relPath.includes("\\\\") || relPath.includes("..")) return "reject";',
|
|
442
|
-
' if (relPath.startsWith("/") || /^[A-Za-z]:/.test(relPath)) return "reject";',
|
|
443
|
-
' if (relPath.startsWith("file:") || relPath.startsWith("http")) return "reject";',
|
|
444
|
-
' return "accept";',
|
|
445
|
-
"}",
|
|
446
|
-
"",
|
|
447
|
-
"const negatives = [",
|
|
448
|
-
' "../outside.txt",',
|
|
449
|
-
' "/etc/passwd",',
|
|
450
|
-
' "C:\\\\Windows\\\\system32",',
|
|
451
|
-
' "\\\\\\\\server\\\\share",',
|
|
452
|
-
' "a/../../b",',
|
|
453
|
-
' "file:///etc/passwd",',
|
|
454
|
-
' "",',
|
|
455
|
-
"];",
|
|
456
|
-
"const failures = negatives.filter((candidate) => classify(candidate) !== \"reject\");",
|
|
457
|
-
"if (failures.length > 0) {",
|
|
458
|
-
" console.error(`[security-negative] hostile path accepted: ${failures.join(\", \")}`);",
|
|
459
|
-
" process.exit(2);",
|
|
460
|
-
"}",
|
|
461
|
-
'console.log(`[security-negative] OK (${negatives.length} hostile paths rejected)`);',
|
|
462
|
-
"",
|
|
463
|
-
].join("\n");
|
|
464
|
-
}
|
|
465
|
-
|
|
466
492
|
/* ------------------------------------------------------------------ */
|
|
467
493
|
/* Handwritten seeds */
|
|
468
494
|
/* ------------------------------------------------------------------ */
|
|
@@ -760,7 +786,6 @@ export async function describeSkeletonFiles(inputs) {
|
|
|
760
786
|
".github/workflows/docs-deploy.yml",
|
|
761
787
|
"scripts/check-core.mjs",
|
|
762
788
|
"scripts/check-docs.mjs",
|
|
763
|
-
"scripts/security-negative.mjs",
|
|
764
789
|
FILE_REGISTRY_PATH,
|
|
765
790
|
PROJECT_MANIFEST_PATH,
|
|
766
791
|
IDENTITY_RECORD_PATH,
|
|
@@ -839,7 +864,6 @@ export async function describeSkeletonFiles(inputs) {
|
|
|
839
864
|
{ path: ".github/workflows/docs-deploy.yml", fileClass: "managed", content: renderDocsDeployWorkflow() },
|
|
840
865
|
{ path: "scripts/check-core.mjs", fileClass: "managed", content: renderCheckCoreScript() },
|
|
841
866
|
{ path: "scripts/check-docs.mjs", fileClass: "managed", content: renderCheckDocsScript() },
|
|
842
|
-
{ path: "scripts/security-negative.mjs", fileClass: "managed", content: renderSecurityNegativeScript() },
|
|
843
867
|
{ path: `${leafDir}/package.json`, fileClass: "managed", content: renderLeafPackageJson({ projectId, licensingProfile: profileData }) },
|
|
844
868
|
{ path: `${leafDir}/src/index.mjs`, fileClass: "handwritten", content: renderIndexModule({ projectId }) },
|
|
845
869
|
{ path: `${leafDir}/test/index.test.mjs`, fileClass: "handwritten", content: renderLeafTest({ projectId }) },
|