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 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
- 测试,也不接受直接 PR 或 issue。本指南描述的是私有工作区内经授权的开发
11
- 流程;消费坐标与发布状态唯一见 `docs/status/current.md`。
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 [yyyy] [name of copyright owner]
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
- node packages/skill-family-engineering-kit/src/cli.mjs --help
19
- node packages/skill-family-engineering-kit/src/cli.mjs scaffold --root <empty-dir> --project-id my-project
20
- node packages/skill-family-engineering-kit/src/cli.mjs adopt-plan --root <repo>
21
- node packages/skill-family-engineering-kit/src/cli.mjs projection --root <repo>
22
- node packages/skill-family-engineering-kit/src/cli.mjs check --root <repo>
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,不是公开报告渠道;请通过任一 public 发布镜像仓(例如
16
- `https://github.com/ifoohoo/skill-family-engineering-kit`)在 GitHub 上使用
17
- **Private vulnerability reporting**(仓库 Security 页签的
18
- "Report a vulnerability")私下报告;如该通道不可用,再通过仓库维护者
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
  &quot;targetProfile&quot;: &quot;generic&quot;,
978
978
  &quot;foundationPackages&quot;: [
979
- { &quot;name&quot;: &quot;skill-family-contracts&quot;, &quot;version&quot;: &quot;1.1.0&quot;, &quot;digest&quot;: &quot;sha256:&lt;64 位十六进制&gt;&quot; }
979
+ { &quot;name&quot;: &quot;skill-family-contracts&quot;, &quot;version&quot;: &quot;0.1.1&quot;, &quot;digest&quot;: &quot;sha256:&lt;64 位十六进制&gt;&quot; },
980
+ { &quot;name&quot;: &quot;skill-family-harness-node&quot;, &quot;version&quot;: &quot;0.1.1&quot;, &quot;digest&quot;: &quot;sha256:&lt;64 位十六进制&gt;&quot; },
981
+ { &quot;name&quot;: &quot;skill-family-engineering-kit&quot;, &quot;version&quot;: &quot;0.1.1&quot;, &quot;digest&quot;: &quot;sha256:&lt;64 位十六进制&gt;&quot; }
980
982
  ],
981
983
  &quot;verification&quot;: {
982
984
  &quot;unit&quot;: &quot;docs/evidence/unit.json&quot;,
@@ -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 &lt;- Harness Node &lt;- Engineering Kit &lt;- Profile &lt;- 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/&lt;name&gt;.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/&lt;\u4efb\u52a1\u53f7&gt;-&lt;\u77ed\u6a2a\u7ebf\u6458\u8981&gt;</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 :&lt;branch&gt;</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 &lt;class&gt;</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 &lt;command&gt;</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>&gt;=22.22.2 &lt;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 \"&lt;class&gt;\": { \"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-&lt;version&gt;.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:&lt;64 \u4f4d\u5341\u516d\u8fdb\u5236&gt;\" }\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 &lt;- Harness Node &lt;- Engineering Kit &lt;- Profile &lt;- 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/&lt;name&gt;.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/&lt;\u4efb\u52a1\u53f7&gt;-&lt;\u77ed\u6a2a\u7ebf\u6458\u8981&gt;</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 :&lt;branch&gt;</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 &lt;class&gt;</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 &lt;command&gt;</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>&gt;=22.22.2 &lt;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 \"&lt;class&gt;\": { \"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-&lt;version&gt;.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:&lt;64 \u4f4d\u5341\u516d\u8fdb\u5236&gt;\" },\n { \"name\": \"skill-family-harness-node\", \"version\": \"0.1.1\", \"digest\": \"sha256:&lt;64 \u4f4d\u5341\u516d\u8fdb\u5236&gt;\" },\n { \"name\": \"skill-family-engineering-kit\", \"version\": \"0.1.1\", \"digest\": \"sha256:&lt;64 \u4f4d\u5341\u516d\u8fdb\u5236&gt;\" }\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>"}]}
@@ -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 ./docs-wheels
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 ./docs-wheels --require-hashes -r scripts/docs/requirements.txt
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
- "name": "skill-family-engineering-kit",
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
- "license": "Apache-2.0",
8
- "repository": {
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
- "type": "module",
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
- "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\".",
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 --test",
40
- "test": "node --test"
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
- async function checkDrift(rootAbs, findings) {
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; // no lock => nothing to drift against
133
- const lock = loaded.value;
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) return { digest: null, note: "no managed-file-lock present; closure check skipped" };
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
- const manifest = docs[PROJECT_MANIFEST_PATH];
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") return { contractsVersion: null };
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
- const lock = await checkDrift(rootAbs, findings);
365
- if (classes.includes("closure")) closureInfo = await checkClosure(rootAbs, lock, findings);
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
- if (classes.includes("version")) versionInfo = await checkVersion(docs, findings);
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
@@ -24,7 +24,7 @@ import {
24
24
 
25
25
  const HELP_TEXT = `skill-family-engineering-kit —— 构建期工程工具包(恰好四个顶层命令)
26
26
 
27
- 用法: node src/cli.mjs <command> [options]
27
+ 用法: skill-family-kit <command> [options]
28
28
 
29
29
  命令(四且仅四):
30
30
  scaffold 在空目录生成 Skill Family 项目骨架。
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
- export const KIT_VERSION = "0.0.0";
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 && node scripts/security-negative.mjs && pnpm --recursive --if-present run check",
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: verifies the managed lock binds the real bytes and the",
374
- "// file registry stays a closed world. Dependency-free by design.",
375
- 'import { createHash } from "node:crypto";',
376
- 'import { readFileSync, existsSync } from "node:fs";',
377
- "",
378
- "const lock = JSON.parse(readFileSync(\"skill-family.managed-file-lock.json\", \"utf8\"));",
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
- "for (const entry of lock.entries) {",
381
- " if (!existsSync(entry.path)) {",
382
- " failures.push(`managed file missing: ${entry.path}`);",
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
- " const actual = createHash(\"sha256\").update(readFileSync(entry.path)).digest(\"hex\");",
386
- " if (actual !== entry.hash.value) failures.push(`managed file drifted: ${entry.path}`);",
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
- "const registry = JSON.parse(readFileSync(\".foundation/file-registry.json\", \"utf8\"));",
389
- "const seen = new Map();",
390
- "for (const [className, files] of [",
391
- ' ["projenManaged", registry.classes.projenManaged.files],',
392
- ' ["kitManaged", registry.classes.kitManaged.files],',
393
- ' ["handwritten", registry.classes.handwritten.entries],',
394
- "]) {",
395
- " for (const file of files) {",
396
- ' if (seen.has(file)) failures.push(`file classified twice: ${file} (${seen.get(file)} and ${className})`);',
397
- " seen.set(file, className);",
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 failure of failures) console.error(`[check-core] ${failure}`);',
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 (${lock.entries.length} locked files, closed-world registry)`);',
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 }) },