skill-family-engineering-kit 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/CHANGELOG.zh-CN.md +43 -0
  3. package/README.md +14 -12
  4. package/README.zh-CN.md +14 -12
  5. package/candidate/adoption-cli.mjs +67 -0
  6. package/candidate/adoption-mechanisms.mjs +69 -0
  7. package/candidate/index.mjs +3 -0
  8. package/candidate/profile-bundle.mjs +1503 -172
  9. package/candidate/projection-bundle-cli.mjs +74 -14
  10. package/candidate/skill-naming-cli.mjs +59 -0
  11. package/candidate/skill-naming-policy.json +46 -0
  12. package/candidate/skill-naming.mjs +280 -0
  13. package/docs/agents/capability-catalog.en.json +1746 -1559
  14. package/docs/agents/capability-catalog.json +1029 -929
  15. package/docs/agents/capability-catalog.zh-CN.json +1746 -1559
  16. package/docs/architecture/index.html +10 -3
  17. package/docs/en/architecture/index.html +12 -3
  18. package/docs/en/migration/index.html +4 -3
  19. package/docs/en/recipes/adopt-existing-repository/index.html +2 -1
  20. package/docs/en/recipes/domain-schema-validation/index.html +3 -1
  21. package/docs/en/recipes/index.html +2 -1
  22. package/docs/en/reference/api/index.html +24 -0
  23. package/docs/en/reference/compatibility/index.html +51 -5
  24. package/docs/migration/index.html +4 -3
  25. package/docs/public/status/index.html +3 -3
  26. package/docs/recipes/adopt-existing-repository/index.html +2 -1
  27. package/docs/recipes/domain-schema-validation/index.html +3 -1
  28. package/docs/recipes/index.html +2 -1
  29. package/docs/reference/api/contracts/index.html +26 -0
  30. package/docs/reference/api/engineering-kit/index.html +26 -0
  31. package/docs/reference/api/harness/index.html +423 -2
  32. package/docs/reference/api/index.html +25 -1
  33. package/docs/reference/compatibility/index.html +51 -5
  34. package/docs/search/search_index.json +1 -1
  35. package/package.json +5 -4
  36. package/release-notes/0.3.0.yaml +25 -0
  37. package/release-notes/0.4.0.yaml +23 -0
  38. package/src/adopt-plan.mjs +26 -1
  39. package/src/index.mjs +5 -2
  40. package/src/migration.mjs +121 -1
  41. package/src/projection.mjs +1152 -266
@@ -972,6 +972,157 @@
972
972
  </ul>
973
973
  </nav>
974
974
 
975
+ </li>
976
+
977
+ <li class="md-nav__item">
978
+ <a href="#基线物化-foundationharnessbaseline-materialization" class="md-nav__link">
979
+ <span class="md-ellipsis">
980
+
981
+ 基线物化 (foundation.harness.baseline-materialization)
982
+
983
+ </span>
984
+ </a>
985
+
986
+ <nav class="md-nav" aria-label="基线物化 (foundation.harness.baseline-materialization)">
987
+ <ul class="md-nav__list">
988
+
989
+ <li class="md-nav__item">
990
+ <a href="#computeDirectoryDigest--materializeBaseline" class="md-nav__link">
991
+ <span class="md-ellipsis">
992
+
993
+ computeDirectoryDigest / materializeBaseline
994
+
995
+ </span>
996
+ </a>
997
+
998
+ </li>
999
+
1000
+ </ul>
1001
+ </nav>
1002
+
1003
+ </li>
1004
+
1005
+ <li class="md-nav__item">
1006
+ <a href="#只读-chokepoint-foundationharnessread-chokepoint" class="md-nav__link">
1007
+ <span class="md-ellipsis">
1008
+
1009
+ 只读 chokepoint (foundation.harness.read-chokepoint)
1010
+
1011
+ </span>
1012
+ </a>
1013
+
1014
+ <nav class="md-nav" aria-label="只读 chokepoint (foundation.harness.read-chokepoint)">
1015
+ <ul class="md-nav__list">
1016
+
1017
+ <li class="md-nav__item">
1018
+ <a href="#createReadChokepoint" class="md-nav__link">
1019
+ <span class="md-ellipsis">
1020
+
1021
+ createReadChokepoint
1022
+
1023
+ </span>
1024
+ </a>
1025
+
1026
+ </li>
1027
+
1028
+ </ul>
1029
+ </nav>
1030
+
1031
+ </li>
1032
+
1033
+ <li class="md-nav__item">
1034
+ <a href="#策略化表面扫描-foundationharnesssurface-scan" class="md-nav__link">
1035
+ <span class="md-ellipsis">
1036
+
1037
+ 策略化表面扫描 (foundation.harness.surface-scan)
1038
+
1039
+ </span>
1040
+ </a>
1041
+
1042
+ <nav class="md-nav" aria-label="策略化表面扫描 (foundation.harness.surface-scan)">
1043
+ <ul class="md-nav__list">
1044
+
1045
+ <li class="md-nav__item">
1046
+ <a href="#scanSurface" class="md-nav__link">
1047
+ <span class="md-ellipsis">
1048
+
1049
+ scanSurface
1050
+
1051
+ </span>
1052
+ </a>
1053
+
1054
+ </li>
1055
+
1056
+ </ul>
1057
+ </nav>
1058
+
1059
+ </li>
1060
+
1061
+ <li class="md-nav__item">
1062
+ <a href="#token-上界估算-foundationharnesstoken-estimation" class="md-nav__link">
1063
+ <span class="md-ellipsis">
1064
+
1065
+ token 上界估算 (foundation.harness.token-estimation)
1066
+
1067
+ </span>
1068
+ </a>
1069
+
1070
+ <nav class="md-nav" aria-label="token 上界估算 (foundation.harness.token-estimation)">
1071
+ <ul class="md-nav__list">
1072
+
1073
+ <li class="md-nav__item">
1074
+ <a href="#estimateTokenUpperBound" class="md-nav__link">
1075
+ <span class="md-ellipsis">
1076
+
1077
+ estimateTokenUpperBound
1078
+
1079
+ </span>
1080
+ </a>
1081
+
1082
+ </li>
1083
+
1084
+ </ul>
1085
+ </nav>
1086
+
1087
+ </li>
1088
+
1089
+ <li class="md-nav__item">
1090
+ <a href="#通用上限守卫-foundationharnessupper-bound-guard" class="md-nav__link">
1091
+ <span class="md-ellipsis">
1092
+
1093
+ 通用上限守卫 (foundation.harness.upper-bound-guard)
1094
+
1095
+ </span>
1096
+ </a>
1097
+
1098
+ <nav class="md-nav" aria-label="通用上限守卫 (foundation.harness.upper-bound-guard)">
1099
+ <ul class="md-nav__list">
1100
+
1101
+ <li class="md-nav__item">
1102
+ <a href="#openUsageGuard--appendUsageEvent--readUsage--closeUsageGuard" class="md-nav__link">
1103
+ <span class="md-ellipsis">
1104
+
1105
+ openUsageGuard / appendUsageEvent / readUsage / closeUsageGuard
1106
+
1107
+ </span>
1108
+ </a>
1109
+
1110
+ </li>
1111
+
1112
+ </ul>
1113
+ </nav>
1114
+
1115
+ </li>
1116
+
1117
+ <li class="md-nav__item">
1118
+ <a href="#Quickstart-Profile-v2-candidate" class="md-nav__link">
1119
+ <span class="md-ellipsis">
1120
+
1121
+ Quickstart Profile v2 candidate
1122
+
1123
+ </span>
1124
+ </a>
1125
+
975
1126
  </li>
976
1127
 
977
1128
  <li class="md-nav__item">
@@ -2242,6 +2393,157 @@
2242
2393
  </ul>
2243
2394
  </nav>
2244
2395
 
2396
+ </li>
2397
+
2398
+ <li class="md-nav__item">
2399
+ <a href="#基线物化-foundationharnessbaseline-materialization" class="md-nav__link">
2400
+ <span class="md-ellipsis">
2401
+
2402
+ 基线物化 (foundation.harness.baseline-materialization)
2403
+
2404
+ </span>
2405
+ </a>
2406
+
2407
+ <nav class="md-nav" aria-label="基线物化 (foundation.harness.baseline-materialization)">
2408
+ <ul class="md-nav__list">
2409
+
2410
+ <li class="md-nav__item">
2411
+ <a href="#computeDirectoryDigest--materializeBaseline" class="md-nav__link">
2412
+ <span class="md-ellipsis">
2413
+
2414
+ computeDirectoryDigest / materializeBaseline
2415
+
2416
+ </span>
2417
+ </a>
2418
+
2419
+ </li>
2420
+
2421
+ </ul>
2422
+ </nav>
2423
+
2424
+ </li>
2425
+
2426
+ <li class="md-nav__item">
2427
+ <a href="#只读-chokepoint-foundationharnessread-chokepoint" class="md-nav__link">
2428
+ <span class="md-ellipsis">
2429
+
2430
+ 只读 chokepoint (foundation.harness.read-chokepoint)
2431
+
2432
+ </span>
2433
+ </a>
2434
+
2435
+ <nav class="md-nav" aria-label="只读 chokepoint (foundation.harness.read-chokepoint)">
2436
+ <ul class="md-nav__list">
2437
+
2438
+ <li class="md-nav__item">
2439
+ <a href="#createReadChokepoint" class="md-nav__link">
2440
+ <span class="md-ellipsis">
2441
+
2442
+ createReadChokepoint
2443
+
2444
+ </span>
2445
+ </a>
2446
+
2447
+ </li>
2448
+
2449
+ </ul>
2450
+ </nav>
2451
+
2452
+ </li>
2453
+
2454
+ <li class="md-nav__item">
2455
+ <a href="#策略化表面扫描-foundationharnesssurface-scan" class="md-nav__link">
2456
+ <span class="md-ellipsis">
2457
+
2458
+ 策略化表面扫描 (foundation.harness.surface-scan)
2459
+
2460
+ </span>
2461
+ </a>
2462
+
2463
+ <nav class="md-nav" aria-label="策略化表面扫描 (foundation.harness.surface-scan)">
2464
+ <ul class="md-nav__list">
2465
+
2466
+ <li class="md-nav__item">
2467
+ <a href="#scanSurface" class="md-nav__link">
2468
+ <span class="md-ellipsis">
2469
+
2470
+ scanSurface
2471
+
2472
+ </span>
2473
+ </a>
2474
+
2475
+ </li>
2476
+
2477
+ </ul>
2478
+ </nav>
2479
+
2480
+ </li>
2481
+
2482
+ <li class="md-nav__item">
2483
+ <a href="#token-上界估算-foundationharnesstoken-estimation" class="md-nav__link">
2484
+ <span class="md-ellipsis">
2485
+
2486
+ token 上界估算 (foundation.harness.token-estimation)
2487
+
2488
+ </span>
2489
+ </a>
2490
+
2491
+ <nav class="md-nav" aria-label="token 上界估算 (foundation.harness.token-estimation)">
2492
+ <ul class="md-nav__list">
2493
+
2494
+ <li class="md-nav__item">
2495
+ <a href="#estimateTokenUpperBound" class="md-nav__link">
2496
+ <span class="md-ellipsis">
2497
+
2498
+ estimateTokenUpperBound
2499
+
2500
+ </span>
2501
+ </a>
2502
+
2503
+ </li>
2504
+
2505
+ </ul>
2506
+ </nav>
2507
+
2508
+ </li>
2509
+
2510
+ <li class="md-nav__item">
2511
+ <a href="#通用上限守卫-foundationharnessupper-bound-guard" class="md-nav__link">
2512
+ <span class="md-ellipsis">
2513
+
2514
+ 通用上限守卫 (foundation.harness.upper-bound-guard)
2515
+
2516
+ </span>
2517
+ </a>
2518
+
2519
+ <nav class="md-nav" aria-label="通用上限守卫 (foundation.harness.upper-bound-guard)">
2520
+ <ul class="md-nav__list">
2521
+
2522
+ <li class="md-nav__item">
2523
+ <a href="#openUsageGuard--appendUsageEvent--readUsage--closeUsageGuard" class="md-nav__link">
2524
+ <span class="md-ellipsis">
2525
+
2526
+ openUsageGuard / appendUsageEvent / readUsage / closeUsageGuard
2527
+
2528
+ </span>
2529
+ </a>
2530
+
2531
+ </li>
2532
+
2533
+ </ul>
2534
+ </nav>
2535
+
2536
+ </li>
2537
+
2538
+ <li class="md-nav__item">
2539
+ <a href="#Quickstart-Profile-v2-candidate" class="md-nav__link">
2540
+ <span class="md-ellipsis">
2541
+
2542
+ Quickstart Profile v2 candidate
2543
+
2544
+ </span>
2545
+ </a>
2546
+
2245
2547
  </li>
2246
2548
 
2247
2549
  <li class="md-nav__item">
@@ -2274,7 +2576,7 @@
2274
2576
 
2275
2577
  <h1 id="skill-family-harness-node-公共-API-参考">skill-family-harness-node 公共 API 参考<a class="headerlink" href="#skill-family-harness-node-公共-API-参考" title="Permanent link">&para;</a></h1>
2276
2578
  <p>本页从真实导出(<code>src/index.mjs</code> 与各源模块)核对,不手写无法证明新鲜度的全集。每个公共入口按 hand-off §4.3 说明:签名、输入与输出、是否纯函数、文件/进程/Git/网络副作用、稳定错误码与 <code>details.kind</code>、前置条件与信任锚、<code>since</code> 与 <code>stability</code>、源文件与正例/负例测试、调用方仍拥有的业务语义。</p>
2277
- <p>Harness 是薄运行时:消费 Contracts,只实现业务中立机制;不拥有业务语义、编排、Git、网络与第二语言。包级常量:<code>HARNESS_CAPABILITIES</code>(9 项能力,闭集)、<code>HARNESS_EXCLUSIONS</code>(明确排除 <code>business-semantics</code> / <code>workflow-orchestration</code> / <code>git-writes</code> / <code>model-calls</code> / <code>release-state</code> / <code>remote-network-access</code>)。</p>
2579
+ <p>Harness 是薄运行时:消费 Contracts,只实现业务中立机制;不拥有业务语义、编排、Git、网络与第二语言。包级常量:<code>HARNESS_CAPABILITIES</code>(16 项能力,闭集)、<code>HARNESS_EXCLUSIONS</code>(明确排除 <code>business-semantics</code> / <code>workflow-orchestration</code> / <code>git-writes</code> / <code>model-calls</code> / <code>release-state</code> / <code>remote-network-access</code>)。</p>
2278
2580
  <p>能力分组(与 <code>docs/agents/capability-catalog.json</code> 对应):</p>
2279
2581
  <ul>
2280
2582
  <li><a href="#契约校验-foundationharnesscontract-validation">契约校验</a> → <code>validateContractDocument</code> / <code>getValidator</code></li>
@@ -2286,6 +2588,11 @@
2286
2588
  <li><a href="#报告-foundationharnessreport">报告</a> → <code>validateReportModel</code> / <code>renderReportMarkdown</code> / <code>buildBinding</code> / <code>verifyBinding</code> / <code>checkReport</code></li>
2287
2589
  <li><a href="#宿主适配机制-foundationharnesshost-adapter">宿主适配机制</a> → <code>normalizeAdapterSource</code> / <code>buildAdapterClosure</code> / <code>materializeAdapterBuild</code> / <code>probeVersionVector</code></li>
2288
2590
  <li><a href="#持久状态底座-foundationharnessstate-store">持久状态底座</a> → <code>openStateStore</code> / <code>appendEvent</code> / <code>readSnapshot</code> / <code>verifyStateStore</code> …</li>
2591
+ <li><a href="#基线物化-foundationharnessbaseline-materialization">基线物化</a> → <code>computeDirectoryDigest</code> / <code>materializeBaseline</code>(FND-ADR-009)</li>
2592
+ <li><a href="#只读-chokepoint-foundationharnessread-chokepoint">只读 chokepoint</a> → <code>createReadChokepoint</code>(FND-ADR-009)</li>
2593
+ <li><a href="#策略化表面扫描-foundationharnesssurface-scan">策略化表面扫描</a> → <code>scanSurface</code>(FND-ADR-009)</li>
2594
+ <li><a href="#token-上界估算-foundationharnesstoken-estimation">token 上界估算</a> → <code>estimateTokenUpperBound</code>(FND-ADR-009)</li>
2595
+ <li><a href="#通用上限守卫-foundationharnessupper-bound-guard">通用上限守卫</a> → <code>openUsageGuard</code> / <code>appendUsageEvent</code> / <code>readUsage</code> / <code>closeUsageGuard</code>(FND-ADR-009)</li>
2289
2596
  <li><a href="#机制错误-foundationharnesserrors">机制错误</a> → <code>HarnessError</code> / <code>mechanismError</code> / <code>HARNESS_ERROR_KINDS</code></li>
2290
2597
  </ul>
2291
2598
  <hr />
@@ -2416,7 +2723,7 @@
2416
2723
  <li>纯函数:是(无时钟、无环境、无网络、无模型调用)。</li>
2417
2724
  <li>副作用:无文件/Git/网络。</li>
2418
2725
  <li>稳定错误码与 <code>details.kind</code>:<code>SFC3001</code>(<code>REPORT_DIGEST_MISMATCH</code>,绑定摘要不符或报告非模型规范渲染)、<code>SFC3002</code>(<code>REPORT_ELEMENT_MISSING</code>,强制元素缺失)、<code>SFC3003</code>(<code>REPORT_FACT_DRIFT</code>,报告改写绑定结果事实或字节与确定性再渲染不一致)。风格告警由 <code>collectStyleWarnings</code> 产出,仅建议、不编码、不阻断。</li>
2419
- <li>前置条件与信任锚:<code>REPORT_RENDERER_NAME</code> / <code>VERSION</code> 取自各自 package(当前 <code>0.2.1</code>);双输出成组写入并拒绝路径别名与输入覆盖。</li>
2726
+ <li>前置条件与信任锚:<code>REPORT_RENDERER_NAME</code> / <code>VERSION</code> 取自各自 package(当前 <code>0.3.0</code>);双输出成组写入并拒绝路径别名与输入覆盖。</li>
2420
2727
  <li><code>since</code> / <code>stability</code>:<code>0.2.0</code> / <code>stable</code>。</li>
2421
2728
  <li>源文件:<code>packages/skill-family-harness-node/src/report.mjs</code>。</li>
2422
2729
  <li>正例/负例测试:<code>packages/skill-family-harness-node/test/report.test.mjs</code>。</li>
@@ -2541,9 +2848,123 @@
2541
2848
  <td><code>host-contract-invalid</code> / <code>host-build-failed</code> / <code>host-probe-failed</code> / <code>untrusted-executable</code> / <code>portable-path-collision</code> / <code>manifest-mismatch</code></td>
2542
2849
  <td>宿主适配异常</td>
2543
2850
  </tr>
2851
+ <tr>
2852
+ <td><code>baseline-mismatch</code> / <code>content-guard-rejected</code></td>
2853
+ <td>基线物化失败关闭</td>
2854
+ </tr>
2855
+ <tr>
2856
+ <td><code>read-chokepoint-rejected</code></td>
2857
+ <td>只读准入拒绝</td>
2858
+ </tr>
2859
+ <tr>
2860
+ <td><code>surface-scan-violation</code> / <code>scan-policy-invalid</code></td>
2861
+ <td>表面扫描失败关闭</td>
2862
+ </tr>
2863
+ <tr>
2864
+ <td><code>upper-bound-exceeded</code></td>
2865
+ <td>上限守卫越限</td>
2866
+ </tr>
2544
2867
  </tbody>
2545
2868
  </table>
2546
2869
  <hr />
2870
+ <h2 id="基线物化-foundationharnessbaseline-materialization">基线物化 (foundation.harness.baseline-materialization)<a class="headerlink" href="#基线物化-foundationharnessbaseline-materialization" title="Permanent link">&para;</a></h2>
2871
+ <p>FND-ADR-009。把冻结基线物化为字节保真的临时副本:物化前校验源摘要、物化后同时校验副本摘要与源摘要(捕获物化中途的任一侧变化);副本内符号链接一律拒绝。</p>
2872
+ <h3 id="computeDirectoryDigest--materializeBaseline">computeDirectoryDigest / materializeBaseline<a class="headerlink" href="#computeDirectoryDigest--materializeBaseline" title="Permanent link">&para;</a></h3>
2873
+ <ul>
2874
+ <li>签名:</li>
2875
+ <li><code>computeDirectoryDigest(rootDir)</code>(async,返回 64 位小写 sha256 十六进制摘要)</li>
2876
+ <li><code>materializeBaseline({ baselineDir, baselineDigest, prefix = "sf-baseline-" } = {})</code>(async,返回物化根路径)</li>
2877
+ <li>输入:基线目录与冻结摘要。</li>
2878
+ <li>输出:确定性目录摘要;物化后的临时目录根路径。</li>
2879
+ <li>纯函数:否(读源树、在系统临时目录创建副本)。</li>
2880
+ <li>副作用:只读源基线;写系统临时目录并在失败时清理。</li>
2881
+ <li>稳定错误码与 <code>details.kind</code>:摘要不符(物化前或物化后)抛 <code>SFC2004</code> + <code>baseline-mismatch</code>(details 含 <code>phase</code>:<code>pre-materialization</code> / <code>post-materialization</code>);目录不可用抛 <code>invalid-root</code>;建目录失败抛 <code>workspace-create-failed</code>。</li>
2882
+ <li>前置条件与信任锚:调用方持有冻结摘要;同一权限级进程可在物化窗口内改动源,机制以双端摘要捕获并失败关闭,不承诺抵御同权限恶意进程。</li>
2883
+ <li><code>since</code> / <code>stability</code>:<code>0.3.0</code> / <code>stable</code>。</li>
2884
+ <li>源文件:<code>packages/skill-family-harness-node/src/baseline.mjs</code>。</li>
2885
+ <li>正例/负例测试:<code>packages/skill-family-harness-node/test/baseline.test.mjs</code>。</li>
2886
+ <li>调用方仍拥有的业务语义:残留内容判定(<code>contentGuard</code> 谓词)与副本最终去处。</li>
2887
+ </ul>
2888
+ <p><code>TemporaryWorkspace.fromBaseline({ baselineDir, baselineDigest, prefix, contentGuard })</code> 与 <code>createTemporaryWorkspace({ baseline: { ... } })</code> 把物化接入工作区生命周期:<code>contentGuard</code> 缺省为允许(字节保真是机制契约,残留判定归消费者);守卫抛错包装为 <code>content-guard-rejected</code> 并 dispose 副本。</p>
2889
+ <hr />
2890
+ <h2 id="只读-chokepoint-foundationharnessread-chokepoint">只读 chokepoint (foundation.harness.read-chokepoint)<a class="headerlink" href="#只读-chokepoint-foundationharnessread-chokepoint" title="Permanent link">&para;</a></h2>
2891
+ <p>FND-ADR-009。把受保护区域的读取集中到一个准入入口:允许根集合 + 可选身份谓词;越界、链接逃逸与非授权身份一律 <code>read-chokepoint-rejected</code>。</p>
2892
+ <h3 id="createReadChokepoint">createReadChokepoint<a class="headerlink" href="#createReadChokepoint" title="Permanent link">&para;</a></h3>
2893
+ <ul>
2894
+ <li>签名:<code>createReadChokepoint({ allowRoots, allowIdentity } = {})</code> → <code>{ assertReadAllowed, read }</code></li>
2895
+ <li>输入:非空允许根集合;可选身份谓词 <code>(identity) =&gt; boolean</code>。</li>
2896
+ <li>输出:准入后的 <code>{ root, relPath, absolute }</code> 或受收容读取结果。</li>
2897
+ <li>纯函数:否(<code>async</code>,含只读文件系统访问)。</li>
2898
+ <li>副作用:只读 realpath / 收容读取;不写。</li>
2899
+ <li>稳定错误码与 <code>details.kind</code>:越界/逃逸/非授权抛 <code>SFC2004</code> + <code>read-chokepoint-rejected</code>;资源缺失抛 <code>missing-resource</code>;参数非法抛 <code>TypeError</code>。</li>
2900
+ <li>前置条件与信任锚:调用方声明允许根集合与身份规则;机制不解释任何私有身份或路径语义。</li>
2901
+ <li><code>since</code> / <code>stability</code>:<code>0.3.0</code> / <code>stable</code>。</li>
2902
+ <li>源文件:<code>packages/skill-family-harness-node/src/chokepoint.mjs</code>。</li>
2903
+ <li>正例/负例测试:<code>packages/skill-family-harness-node/test/chokepoint.test.mjs</code>。</li>
2904
+ <li>调用方仍拥有的业务语义:允许根集合、身份谓词、准入后读取语义。</li>
2905
+ </ul>
2906
+ <p>字符串输入与 <code>{ root, relPath }</code> 输入走同一 <code>resolveContained</code> 收容分类(含 macOS <code>/var → /private/var</code> 等符号链接前缀根的统一规范化)。</p>
2907
+ <hr />
2908
+ <h2 id="策略化表面扫描-foundationharnesssurface-scan">策略化表面扫描 (foundation.harness.surface-scan)<a class="headerlink" href="#策略化表面扫描-foundationharnesssurface-scan" title="Permanent link">&para;</a></h2>
2909
+ <p>FND-ADR-009。按 <code>surface-scan-policy</code> 契约文档对声明表面做路径与内容模式扫描:首个命中即失败关闭;策略非法或模式不可编译同样失败关闭;缺失扫描文件不静默跳过。</p>
2910
+ <h3 id="scanSurface">scanSurface<a class="headerlink" href="#scanSurface" title="Permanent link">&para;</a></h3>
2911
+ <ul>
2912
+ <li>签名:<code>scanSurface({ root, relPaths, policy, encoding = "utf8" } = {})</code>(async)</li>
2913
+ <li>输入:扫描根、相对路径清单、策略契约文档。</li>
2914
+ <li>输出:<code>{ scanned, bytes, policy }</code>(冻结对象)。</li>
2915
+ <li>纯函数:否(只读文件系统访问;进程内正则编译,无持久状态)。</li>
2916
+ <li>副作用:只读;不写。</li>
2917
+ <li>稳定错误码与 <code>details.kind</code>:命中抛 <code>SFC2004</code> + <code>surface-scan-violation</code>(details 含 <code>kindOfHit</code>:<code>path</code> / <code>content</code>);策略非法或模式不可编译抛 <code>scan-policy-invalid</code>;缺失文件抛 <code>missing-resource</code>;参数非法抛 <code>TypeError</code>。</li>
2918
+ <li>前置条件与信任锚:策略文档通过契约校验;<code>allowedUses</code> 只携带不解释,命中不被豁免(豁免由消费者层实现)。</li>
2919
+ <li><code>since</code> / <code>stability</code>:<code>0.3.0</code> / <code>stable</code>。</li>
2920
+ <li>源文件:<code>packages/skill-family-harness-node/src/surface-scan.mjs</code>。</li>
2921
+ <li>正例/负例测试:<code>packages/skill-family-harness-node/test/surface-scan.test.mjs</code>。</li>
2922
+ <li>调用方仍拥有的业务语义:策略内容、允许用途语义与命中后的处置。</li>
2923
+ </ul>
2924
+ <p>注入式自测约定:扫描器无状态——注入模式并扫描后移除注入,再次扫描结果字节一致(自测见测试文件,不冒充独立复核)。</p>
2925
+ <hr />
2926
+ <h2 id="token-上界估算-foundationharnesstoken-estimation">token 上界估算 (foundation.harness.token-estimation)<a class="headerlink" href="#token-上界估算-foundationharnesstoken-estimation" title="Permanent link">&para;</a></h2>
2927
+ <p>FND-ADR-009。确定性领域估算原语:UTF-8 字节数纯函数,无模型、无网络、无 tokenizer 依赖、无持久状态导入;结果符合 <code>token-estimate-result</code> 契约(无时间戳,<code>guarantees</code> 为封闭枚举)。</p>
2928
+ <h3 id="estimateTokenUpperBound">estimateTokenUpperBound<a class="headerlink" href="#estimateTokenUpperBound" title="Permanent link">&para;</a></h3>
2929
+ <ul>
2930
+ <li>签名:<code>estimateTokenUpperBound(text)</code>(纯函数)</li>
2931
+ <li>输入:文本字符串。</li>
2932
+ <li>输出:<code>token-estimate-result</code> 对象(<code>upperBound === inputBytes</code>)。</li>
2933
+ <li>纯函数:是;零依赖。</li>
2934
+ <li>副作用:无。</li>
2935
+ <li>稳定错误码与 <code>details.kind</code>:非字符串输入抛 <code>TypeError</code>(无 SFC 码)。</li>
2936
+ <li>前置条件与信任锚:输入为 JavaScript 字符串;估算只承诺上界(字节数即上界),不承诺真实 token 计数。</li>
2937
+ <li><code>since</code> / <code>stability</code>:<code>0.3.0</code> / <code>stable</code>。</li>
2938
+ <li>源文件:<code>packages/skill-family-harness-node/src/token-estimate.mjs</code>。</li>
2939
+ <li>正例/负例测试:<code>packages/skill-family-harness-node/test/token-estimate.test.mjs</code>。</li>
2940
+ <li>调用方仍拥有的业务语义:估算结果的解释与消费侧换算(模型调用与真实 token 计数不在 Foundation)。</li>
2941
+ </ul>
2942
+ <hr />
2943
+ <h2 id="通用上限守卫-foundationharnessupper-bound-guard">通用上限守卫 (foundation.harness.upper-bound-guard)<a class="headerlink" href="#通用上限守卫-foundationharnessupper-bound-guard" title="Permanent link">&para;</a></h2>
2944
+ <p>FND-ADR-009。复用 state-store 事件账与 token-lock 显式占用实现通用上限守卫:越限事件失败关闭且不写入;上限值、单位类别与超限策略全部由消费者配置,模块不携带任何固定数额或定价词汇。</p>
2945
+ <h3 id="openUsageGuard--appendUsageEvent--readUsage--closeUsageGuard">openUsageGuard / appendUsageEvent / readUsage / closeUsageGuard<a class="headerlink" href="#openUsageGuard--appendUsageEvent--readUsage--closeUsageGuard" title="Permanent link">&para;</a></h3>
2946
+ <ul>
2947
+ <li>签名:</li>
2948
+ <li><code>openUsageGuard({ stateRoot, owner, payloadSchemas, reducer, initial = 0, upperBound, lockRoot, lockPath, clock } = {})</code>(async)</li>
2949
+ <li><code>appendUsageEvent(guard, event, { beforeCommit } = {})</code>(async)</li>
2950
+ <li><code>readUsage(guard)</code>(async)</li>
2951
+ <li><code>closeUsageGuard(guard)</code>(async)</li>
2952
+ <li>输入:事件负载、纯归约函数、非负上限、状态根与锁根/锁路径。</li>
2953
+ <li>输出:追加结果、当前用量读数、守卫句柄。</li>
2954
+ <li>纯函数:否(写事件账与锁文件)。</li>
2955
+ <li>副作用:在受收容路径写事件账与锁文件;打开时显式占用锁、关闭时释放。</li>
2956
+ <li>稳定错误码与 <code>details.kind</code>:越限抛 <code>SFC2004</code> + <code>upper-bound-exceeded</code>(details 含 <code>upperBound</code> / <code>projected</code>,事件不写入);锁被占用抛 <code>store-locked</code>;事件账断链抛 <code>chain-broken</code>;事件 schema 违规抛 <code>event-schema-invalid</code>。</li>
2957
+ <li>前置条件与信任锚:<code>lockRoot</code>/<code>lockPath</code> 由消费者指定在 state store 根之外;事件账是唯一权威;fencing 不承诺抵御同权限恶意进程。</li>
2958
+ <li><code>since</code> / <code>stability</code>:<code>0.3.0</code> / <code>stable</code>。</li>
2959
+ <li>源文件:<code>packages/skill-family-harness-node/src/budget-guard.mjs</code>。</li>
2960
+ <li>正例/负例测试:<code>packages/skill-family-harness-node/test/budget-guard.test.mjs</code>。</li>
2961
+ <li>调用方仍拥有的业务语义:事件含义、归约函数、上限数值与超限后的业务处置(定价与计费语义留在消费者)。</li>
2962
+ </ul>
2963
+ <hr />
2964
+ <h2 id="Quickstart-Profile-v2-candidate">Quickstart Profile v2 candidate<a class="headerlink" href="#Quickstart-Profile-v2-candidate" title="Permanent link">&para;</a></h2>
2965
+ <p><code>skill-family-harness-node/candidate/quickstart-profile</code> 负责创建 observation Resource、Task 与终态 Result,并复验真实文件字节、Resource id 全局唯一性、Task digest、operation 身份、逐字段 <code>run/stage/attempt</code> 以及 evidence 精确回指。<code>verifyQuickstartExchange</code> 把机制拒绝转换成结构化结果,抛出式入口继续使用已登记的 <code>SFC2004</code> 与稳定 <code>details.kind</code>。</p>
2966
+ <p>该入口不选择 method,不解释 domainResult,也不拥有重试、调度或生命周期。0.3.0 的 v2 与 0.2.1 的 v1 不兼容;接入必须精确锁定所选版本。</p>
2967
+ <hr />
2547
2968
  <h2 id="与机器事实层的互链">与机器事实层的互链<a class="headerlink" href="#与机器事实层的互链" title="Permanent link">&para;</a></h2>
2548
2969
  <ul>
2549
2970
  <li>能力稳定 ID 见 <code>docs/agents/capability-catalog.json</code>(<code>foundation.harness.*</code>)。</li>
@@ -671,6 +671,17 @@
671
671
  </span>
672
672
  </a>
673
673
 
674
+ </li>
675
+
676
+ <li class="md-nav__item">
677
+ <a href="#Quickstart-Profile-v2-candidate" class="md-nav__link">
678
+ <span class="md-ellipsis">
679
+
680
+ Quickstart Profile v2 candidate
681
+
682
+ </span>
683
+ </a>
684
+
674
685
  </li>
675
686
 
676
687
  </ul>
@@ -1737,6 +1748,17 @@
1737
1748
  </span>
1738
1749
  </a>
1739
1750
 
1751
+ </li>
1752
+
1753
+ <li class="md-nav__item">
1754
+ <a href="#Quickstart-Profile-v2-candidate" class="md-nav__link">
1755
+ <span class="md-ellipsis">
1756
+
1757
+ Quickstart Profile v2 candidate
1758
+
1759
+ </span>
1760
+ </a>
1761
+
1740
1762
  </li>
1741
1763
 
1742
1764
  </ul>
@@ -1796,8 +1818,10 @@
1796
1818
  <ul>
1797
1819
  <li>机制失败统一 <code>SFC2004</code>(<code>EXECUTION_FAILED</code>),由 <code>details.kind</code> 区分(<code>HARNESS_ERROR_KINDS</code> 冻结枚举);Contracts 校验失败(<code>SFC1001</code> / <code>SFC1002</code>)经 <code>validateDocument</code> 返回值表达、不抛异常。</li>
1798
1820
  <li>Kit 顶层命令集合固定为 4 个(<code>scaffold</code> / <code>adopt-plan</code> / <code>projection</code> / <code>check</code>),不扩张;<code>host apply</code> / <code>install</code> / <code>update</code> / <code>uninstall</code>、Qoder 完整 driver、二进制 adapter source、远端发布、业务状态机、模型编排、领域审计语义均明确 unsupported。</li>
1799
- <li>所有版本字段从 <code>package.json</code> 与 Contracts 真源生成或由 fact-check 校验;<code>CONTRACTS_VERSION=1.4.0</code> 与 npm 包版本 <code>0.2.1</code> 并行。</li>
1821
+ <li>所有版本字段从 <code>package.json</code> 与 Contracts 真源生成或由 fact-check 校验;<code>CONTRACTS_VERSION=1.4.0</code> 与 npm 包版本 <code>0.3.0</code> 并行。</li>
1800
1822
  </ul>
1823
+ <h2 id="Quickstart-Profile-v2-candidate">Quickstart Profile v2 candidate<a class="headerlink" href="#Quickstart-Profile-v2-candidate" title="Permanent link">&para;</a></h2>
1824
+ <p>三个包都通过既有 candidate 子路径公开 Quickstart Profile v2。Contracts 定义 <code>execute-method</code> 交换结构,Harness 复验字节和绑定,Kit 从显式消费者 Schema 生成离线 Bundle。该能力仍标记为 <code>candidate</code>,0.3.0 的 v2 与 0.2.1 的 v1 不兼容;消费者必须精确锁定所选包版本。</p>
1801
1825
 
1802
1826
 
1803
1827
 
@@ -595,6 +595,17 @@
595
595
  </span>
596
596
  </a>
597
597
 
598
+ </li>
599
+
600
+ <li class="md-nav__item">
601
+ <a href="#Quickstart-Profile-candidate-兼容性" class="md-nav__link">
602
+ <span class="md-ellipsis">
603
+
604
+ Quickstart Profile candidate 兼容性
605
+
606
+ </span>
607
+ </a>
608
+
598
609
  </li>
599
610
 
600
611
  <li class="md-nav__item">
@@ -1748,6 +1759,17 @@
1748
1759
  </span>
1749
1760
  </a>
1750
1761
 
1762
+ </li>
1763
+
1764
+ <li class="md-nav__item">
1765
+ <a href="#Quickstart-Profile-candidate-兼容性" class="md-nav__link">
1766
+ <span class="md-ellipsis">
1767
+
1768
+ Quickstart Profile candidate 兼容性
1769
+
1770
+ </span>
1771
+ </a>
1772
+
1751
1773
  </li>
1752
1774
 
1753
1775
  <li class="md-nav__item">
@@ -1840,33 +1862,56 @@
1840
1862
  <tbody>
1841
1863
  <tr>
1842
1864
  <td><code>skill-family-contracts</code></td>
1843
- <td>0.2.1</td>
1865
+ <td>0.3.0</td>
1844
1866
  <td>Contracts 1.4.0 机器契约</td>
1845
1867
  <td>公开发布目标(private: false)</td>
1846
1868
  </tr>
1847
1869
  <tr>
1848
1870
  <td><code>skill-family-harness-node</code></td>
1849
- <td>0.2.1</td>
1871
+ <td>0.3.0</td>
1850
1872
  <td>Contracts 的 Node 薄机制运行时</td>
1851
1873
  <td>公开发布目标</td>
1852
1874
  </tr>
1853
1875
  <tr>
1854
1876
  <td><code>skill-family-engineering-kit</code></td>
1855
- <td>0.2.1</td>
1877
+ <td>0.3.0</td>
1856
1878
  <td>四个工程命令(CLI <code>skill-family-kit</code>)</td>
1857
1879
  <td>公开发布目标</td>
1858
1880
  </tr>
1859
1881
  <tr>
1860
1882
  <td>工作区仓</td>
1861
- <td>0.2.1</td>
1883
+ <td>0.3.0</td>
1862
1884
  <td>私有父工作区(private: true)</td>
1863
1885
  <td>仅开发真源</td>
1864
1886
  </tr>
1865
1887
  </tbody>
1866
1888
  </table>
1867
1889
  <blockquote>
1868
- <p>契约权威版本(<code>CONTRACTS_VERSION</code>)为 <code>1.4.0</code>,npm 包版本为 <code>0.2.1</code>,两套版本并行,不混用。</p>
1890
+ <p>契约权威版本(<code>CONTRACTS_VERSION</code>)为 <code>1.4.0</code>,npm 包版本为 <code>0.3.0</code>,两套版本并行,不混用。</p>
1869
1891
  </blockquote>
1892
+ <h2 id="Quickstart-Profile-candidate-兼容性">Quickstart Profile candidate 兼容性<a class="headerlink" href="#Quickstart-Profile-candidate-兼容性" title="Permanent link">&para;</a></h2>
1893
+ <table>
1894
+ <thead>
1895
+ <tr>
1896
+ <th>包版本</th>
1897
+ <th>candidate profile</th>
1898
+ <th>兼容规则</th>
1899
+ </tr>
1900
+ </thead>
1901
+ <tbody>
1902
+ <tr>
1903
+ <td>0.2.1</td>
1904
+ <td>v1</td>
1905
+ <td>已有接入可继续精确锁定 0.2.1</td>
1906
+ </tr>
1907
+ <tr>
1908
+ <td>0.3.0</td>
1909
+ <td>v2</td>
1910
+ <td>使用 <code>execute-method</code>、真实 <code>$id</code> Schema 集合与离线 Bundle;必须精确锁定 0.3.0</td>
1911
+ </tr>
1912
+ </tbody>
1913
+ </table>
1914
+ <p>v2 替换 v1,不提供双轨兼容层。稳定 Contracts 1.4.0、18 类对象、内核协议与错误码登记不随 candidate 切换而变化。</p>
1870
1915
  <h2 id="Node-支持矩阵">Node 支持矩阵<a class="headerlink" href="#Node-支持矩阵" title="Permanent link">&para;</a></h2>
1871
1916
  <ul>
1872
1917
  <li>引擎要求:<code>&gt;=22.22.2 &lt;23</code>(锁定 major 22)。</li>
@@ -1922,6 +1967,7 @@
1922
1967
  <li><strong>Kit 命令</strong>:顶层命令固定 4 个(scaffold/adopt-plan/projection/check),不扩张;<code>REFUSED_MUTATION_FLAGS</code> 在 CLI 入口即拒。</li>
1923
1968
  <li><strong>Node/pnpm/projen</strong>:跟随 <code>.foundation/version-lock.json</code> 与 <code>package.json</code> 的精确锁定,升级须经 <code>pnpm synth</code> 重新生成受管投影。</li>
1924
1969
  <li><strong>宿主</strong>:新增受支持宿主须登记 descriptor 并绑定受信 driver;unsupported 宿主(如 qoder)只参考结构,不声称已在其上运行。</li>
1970
+ <li><strong>Candidate</strong>:candidate 子路径允许在后续 minor 版本修改或移除;0.2.1 v1 与 0.3.0 v2 不混装,消费者按所需 profile 精确锁定三个包版本。</li>
1925
1971
  </ul>
1926
1972
  <h2 id="反兼容边界明确不支持">反兼容边界(明确不支持)<a class="headerlink" href="#反兼容边界明确不支持" title="Permanent link">&para;</a></h2>
1927
1973
  <ul>