skill-family-engineering-kit 0.1.1 → 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/README.md CHANGED
@@ -15,18 +15,18 @@
15
15
  ## 使用
16
16
 
17
17
  ```sh
18
- npx skill-family-kit --help
19
- npx skill-family-kit scaffold --root <empty-dir> --project-id my-project
20
- npx skill-family-kit adopt-plan --root <repo>
21
- npx skill-family-kit projection --root <repo>
22
- npx skill-family-kit 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>
23
24
  ```
24
25
 
25
- 或全局安装后直接使用:
26
+ 零安装形式(不修改 package.json):
26
27
 
27
28
  ```sh
28
- npm install -g skill-family-engineering-kit
29
- skill-family-kit --help
29
+ npm exec --package=skill-family-engineering-kit -- skill-family-kit --help
30
30
  ```
31
31
 
32
32
  ## 边界机制
@@ -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
@@ -8,8 +8,8 @@
8
8
  "url": "https://github.com/ifoohoo/skill-family-engineering-kit/issues"
9
9
  },
10
10
  "dependencies": {
11
- "skill-family-contracts": "0.1.1",
12
- "skill-family-harness-node": "0.1.1"
11
+ "skill-family-contracts": "0.1.2",
12
+ "skill-family-harness-node": "0.1.2"
13
13
  },
14
14
  "description": "Build-time scaffold, adoption planning, projection, and checks.",
15
15
  "engines": {
@@ -35,7 +35,7 @@
35
35
  "url": "https://github.com/ifoohoo/skill-family-engineering-kit.git"
36
36
  },
37
37
  "type": "module",
38
- "version": "0.1.1",
38
+ "version": "0.1.2",
39
39
  "scripts": {
40
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
41
  "test": "node --input-type=module -e \"import('./src/index.mjs').then(() => console.log('smoke ok')).catch(e => { console.error(e); process.exit(1) })\""
package/src/check.mjs CHANGED
@@ -139,7 +139,18 @@ async function loadManagedFileLock(rootAbs) {
139
139
 
140
140
  async function checkDrift(rootAbs, findings) {
141
141
  const lock = await loadManagedFileLock(rootAbs);
142
- if (!lock) return null; // no lock => nothing to drift against
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
+ }
143
154
  const entries = Array.isArray(lock?.entries) ? lock.entries : [];
144
155
  for (const entry of entries) {
145
156
  const rel = typeof entry?.path === "string" ? normalizeRelPath(entry.path) : null;
@@ -178,7 +189,18 @@ async function checkDrift(rootAbs, findings) {
178
189
  }
179
190
 
180
191
  async function checkClosure(rootAbs, lock, findings) {
181
- 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
+ }
182
204
  const resources = [
183
205
  { path: MANAGED_LOCK_PATH, role: "input" },
184
206
  ...(Array.isArray(lock.entries) ? lock.entries : [])
@@ -227,7 +249,18 @@ async function checkVersion(rootAbs, docs, findings) {
227
249
  if (loaded.ok) manifest = loaded.value;
228
250
  }
229
251
  const declared = manifest?.contracts?.version;
230
- 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
+ }
231
264
  if (declared !== CONTRACTS_VERSION) {
232
265
  findings.push(
233
266
  finding(
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
@@ -142,7 +142,7 @@ function renderRootPackageJson({ projectId, projectName, licensingProfile }) {
142
142
  // `node .projenrc.js` works for the first synth and every later one.
143
143
  synth: "node .projenrc.js",
144
144
  check:
145
- "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",
146
146
  test: "pnpm --recursive --if-present run test",
147
147
  "docs-build": "mkdocs build --strict",
148
148
  },
@@ -150,8 +150,9 @@ function renderRootPackageJson({ projectId, projectName, licensingProfile }) {
150
150
  projen: SKELETON_PROJEN_VERSION,
151
151
  },
152
152
  dependencies: {
153
- "skill-family-contracts": "^0.1.0",
154
- "skill-family-harness-node": "^0.1.0",
153
+ "skill-family-contracts": KIT_VERSION,
154
+ "skill-family-harness-node": KIT_VERSION,
155
+ "skill-family-engineering-kit": KIT_VERSION,
155
156
  },
156
157
  "//": PROJEN_MARKER,
157
158
  });
@@ -380,140 +381,86 @@ function renderDocsDeployWorkflow() {
380
381
  function renderCheckCoreScript() {
381
382
  return [
382
383
  "#!/usr/bin/env node",
383
- "// core check: verifies the managed lock binds the real bytes and the",
384
- "// file registry stays a closed world. Uses Foundation packages for",
385
- "// path containment, digest computation, and closure verification.",
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.",
386
388
  'import { lstat } from "node:fs/promises";',
387
389
  'import { readFileSync } from "node:fs";',
390
+ 'import { readdir } from "node:fs/promises";',
388
391
  'import path from "node:path";',
389
- 'import { findSchemaByObject } from "skill-family-contracts";',
390
- 'import {',
391
- ' classifyPathInput,',
392
- ' computeResourceClosure,',
393
- ' digestBytes,',
394
- ' readFileContained,',
395
- ' validateContractDocument,',
396
- '} from "skill-family-harness-node";',
392
+ 'import { runChecks, matchAnyGlob } from "skill-family-engineering-kit";',
397
393
  "",
398
394
  "const root = process.cwd();",
399
395
  "const failures = [];",
400
396
  "",
401
- "// Load and validate the managed file lock",
402
- 'let lockText;',
403
- 'try {',
404
- ' lockText = await readFileContained(root, "skill-family.managed-file-lock.json", { encoding: "utf8" });',
405
- '} catch (cause) {',
406
- ' console.error(`[check-core] cannot read managed-file-lock: ${cause.message}`);',
407
- ' process.exit(2);',
408
- '}',
409
- "const lock = JSON.parse(lockText);",
410
- "",
411
- "// Validate lock schema",
412
- "const lockSchema = findSchemaByObject(\"managed-file-lock\");",
413
- "const lockValidation = validateContractDocument(lock, { schemaId: lockSchema.$id });",
414
- "if (!lockValidation.valid) {",
415
- ' console.error(`[check-core] managed-file-lock schema invalid: ${JSON.stringify(lockValidation.errors)}`);',
416
- " process.exit(2);",
417
- "}",
418
- "",
419
- "// Verify each lock entry: lstat for type check, readFileContained for safe read, digestBytes for hash",
420
- "for (const entry of lock.entries) {",
421
- " const relPath = entry.path;",
422
- "",
423
- " // Classify the path input first",
424
- " const classification = classifyPathInput(relPath);",
425
- " if (!classification.ok) {",
426
- " failures.push(`lock entry has invalid path: ${relPath} (kind: ${classification.kind})`);",
427
- " continue;",
428
- " }",
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"));',
429
400
  "",
430
- " // lstat to detect symlinks and special files",
431
- " let stat;",
432
- " try {",
433
- " stat = await lstat(path.resolve(root, relPath));",
434
- " } catch {",
435
- " failures.push(`managed file missing: ${relPath}`);",
436
- " continue;",
437
- " }",
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
+ "]);",
438
406
  "",
439
- " // Reject symlinks",
440
- " if (stat.isSymbolicLink()) {",
441
- " failures.push(`managed file is a symlink: ${relPath}`);",
442
- " continue;",
443
- " }",
407
+ "// Build handwritten patterns from registry",
408
+ "const handwrittenPatterns = registry.classes.handwritten.entries.filter((e) => typeof e === \"string\");",
444
409
  "",
445
- " // Reject special files (FIFO, socket, device, etc.)",
446
- " if (!stat.isFile()) {",
447
- " failures.push(`managed file is not a regular file: ${relPath}`);",
448
- " continue;",
449
- " }",
410
+ "// Artifact patterns from registry",
411
+ "const artifactPatterns = registry.classes.artifacts.patterns.filter((e) => typeof e === \"string\");",
450
412
  "",
451
- " // Read through Foundation's contained read",
452
- " let content;",
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;",
453
417
  " try {",
454
- " content = await readFileContained(root, relPath);",
455
- " } catch (cause) {",
456
- " failures.push(`cannot read managed file: ${relPath} (${cause.message})`);",
418
+ " st = await lstat(path.resolve(root, relPath));",
419
+ " } catch {",
420
+ ' failures.push(`managed file missing: ${relPath}`);',
457
421
  " continue;",
458
422
  " }",
459
- "",
460
- " // Compare digest",
461
- " const actual = digestBytes(content);",
462
- " if (actual !== entry.hash.value) {",
463
- " failures.push(`managed file drifted: ${relPath}`);",
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}`);',
464
427
  " }",
465
428
  "}",
466
429
  "",
467
- "// Load and validate the file registry",
468
- 'let registryText;',
469
- 'try {',
470
- ' registryText = await readFileContained(root, ".foundation/file-registry.json", { encoding: "utf8" });',
471
- '} catch (cause) {',
472
- ' console.error(`[check-core] cannot read file-registry: ${cause.message}`);',
473
- ' process.exit(2);',
474
- '}',
475
- "const registry = JSON.parse(registryText);",
476
- "",
477
- "// Check for duplicate classifications",
478
- "const seen = new Map();",
479
- "for (const [className, files] of [",
480
- ' ["projenManaged", registry.classes.projenManaged.files],',
481
- ' ["kitManaged", registry.classes.kitManaged.files],',
482
- ' ["handwritten", registry.classes.handwritten.entries],',
483
- "]) {",
484
- " for (const file of files) {",
485
- " if (seen.has(file)) {",
486
- " failures.push(`file classified twice: ${file} (${seen.get(file)} and ${className})`);",
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}`);',
487
446
  " }",
488
- " seen.set(file, className);",
489
447
  " }",
490
448
  "}",
449
+ "await walk(root, \"\");",
491
450
  "",
492
- "// Use Foundation's closure computation to verify closed-world",
493
- "// Skip if there are already failures (to avoid hanging on special files like FIFOs)",
451
+ "// Run the shared production checks (schema, drift, closure, version, docs, git, identity)",
494
452
  "if (failures.length === 0) {",
495
- " const resources = [",
496
- ' { path: "skill-family.managed-file-lock.json", role: "input" },',
497
- " ...lock.entries.map((entry) => ({ path: entry.path, role: \"output\" })),",
498
- " ];",
499
- " try {",
500
- " const closure = await computeResourceClosure({ root, resources });",
501
- " const missingOutputs = closure.resources.filter(",
502
- " (r) => r.role === \"output\" && !r.exists,",
503
- " );",
504
- " for (const missing of missingOutputs) {",
505
- " failures.push(`closure output missing: ${missing.path}`);",
506
- " }",
507
- " } catch (cause) {",
508
- " failures.push(`closure computation failed: ${cause.message}`);",
453
+ " const report = await runChecks({ root, allowGitSpawn: true });",
454
+ " for (const f of report.findings) {",
455
+ ' failures.push(`${f.class}: ${f.message}`);',
509
456
  " }",
510
457
  "}",
511
458
  "",
512
459
  "if (failures.length > 0) {",
513
- ' for (const failure of failures) console.error(`[check-core] ${failure}`);',
514
- " 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);",
515
462
  "}",
516
- 'console.log(`[check-core] OK (${lock.entries.length} locked files, closed-world registry)`);',
463
+ 'console.log(`[check-core] OK`);',
517
464
  "",
518
465
  ].join("\n");
519
466
  }
@@ -542,59 +489,6 @@ function renderCheckDocsScript() {
542
489
  ].join("\n");
543
490
  }
544
491
 
545
- function renderSecurityNegativeScript() {
546
- return [
547
- "#!/usr/bin/env node",
548
- "// security negative cases: every hostile path MUST be rejected by the",
549
- "// Foundation path containment mechanisms; if any passes, this script exits 2.",
550
- "// Tests both lexical classification (classifyPathInput) and resolution-time",
551
- "// containment (resolveContained).",
552
- 'import { classifyPathInput, resolveContained } from "skill-family-harness-node";',
553
- "",
554
- "// Paths that should be rejected at the lexical classification level",
555
- "const lexicalNegatives = [",
556
- ' "/etc/passwd", // absolute path',
557
- ' "C:\\\\Windows\\\\system32", // Windows drive path',
558
- ' "\\\\\\\\server\\\\share", // UNC path',
559
- ' "", // empty path',
560
- "];",
561
- "",
562
- "// Paths that should be rejected at the resolution level (path traversal)",
563
- "const resolutionNegatives = [",
564
- ' "../outside.txt", // parent traversal',
565
- ' "a/../../b", // nested traversal',
566
- "];",
567
- "",
568
- "const failures = [];",
569
- "",
570
- "// Test lexical classification",
571
- "for (const candidate of lexicalNegatives) {",
572
- " const result = classifyPathInput(candidate);",
573
- " if (result.ok) {",
574
- " failures.push(`lexical: ${candidate}`);",
575
- " }",
576
- "}",
577
- "",
578
- "// Test resolution-time containment",
579
- 'const fakeRoot = "/nonexistent-root-for-testing";',
580
- "for (const candidate of resolutionNegatives) {",
581
- " try {",
582
- " await resolveContained(fakeRoot, candidate);",
583
- " failures.push(`resolution: ${candidate}`);",
584
- " } catch {",
585
- " // Expected: resolution should fail",
586
- " }",
587
- "}",
588
- "",
589
- "if (failures.length > 0) {",
590
- " console.error(`[security-negative] hostile path accepted: ${failures.join(\", \")}`);",
591
- " process.exit(2);",
592
- "}",
593
- 'console.log(`[security-negative] OK (${lexicalNegatives.length + resolutionNegatives.length} hostile paths rejected)`);',
594
- "",
595
- ].join("\n");
596
- }
597
-
598
492
  /* ------------------------------------------------------------------ */
599
493
  /* Handwritten seeds */
600
494
  /* ------------------------------------------------------------------ */
@@ -892,7 +786,6 @@ export async function describeSkeletonFiles(inputs) {
892
786
  ".github/workflows/docs-deploy.yml",
893
787
  "scripts/check-core.mjs",
894
788
  "scripts/check-docs.mjs",
895
- "scripts/security-negative.mjs",
896
789
  FILE_REGISTRY_PATH,
897
790
  PROJECT_MANIFEST_PATH,
898
791
  IDENTITY_RECORD_PATH,
@@ -971,7 +864,6 @@ export async function describeSkeletonFiles(inputs) {
971
864
  { path: ".github/workflows/docs-deploy.yml", fileClass: "managed", content: renderDocsDeployWorkflow() },
972
865
  { path: "scripts/check-core.mjs", fileClass: "managed", content: renderCheckCoreScript() },
973
866
  { path: "scripts/check-docs.mjs", fileClass: "managed", content: renderCheckDocsScript() },
974
- { path: "scripts/security-negative.mjs", fileClass: "managed", content: renderSecurityNegativeScript() },
975
867
  { path: `${leafDir}/package.json`, fileClass: "managed", content: renderLeafPackageJson({ projectId, licensingProfile: profileData }) },
976
868
  { path: `${leafDir}/src/index.mjs`, fileClass: "handwritten", content: renderIndexModule({ projectId }) },
977
869
  { path: `${leafDir}/test/index.test.mjs`, fileClass: "handwritten", content: renderLeafTest({ projectId }) },