skill-family-engineering-kit 0.2.0 → 0.2.1

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 (70) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/CHANGELOG.zh-CN.md +21 -0
  3. package/NOTICE +10 -0
  4. package/README.md +157 -55
  5. package/README.zh-CN.md +207 -0
  6. package/candidate/index.mjs +4 -0
  7. package/candidate/profile-bundle.mjs +268 -0
  8. package/candidate/projection-bundle-cli.mjs +22 -0
  9. package/docs/404.html +1434 -408
  10. package/docs/agents/architecture-routing/index.html +1944 -0
  11. package/docs/agents/capability-catalog.en.json +1561 -0
  12. package/docs/agents/capability-catalog.json +934 -0
  13. package/docs/agents/capability-catalog.schema.json +179 -0
  14. package/docs/agents/capability-catalog.zh-CN.json +1561 -0
  15. package/docs/agents/index.html +1914 -0
  16. package/docs/architecture/index.html +1706 -497
  17. package/docs/assets/javascripts/lunr/tinyseg.js +2 -2
  18. package/docs/assets/javascripts/lunr/wordcut.js +37 -37
  19. package/docs/en/agents/architecture-routing/index.html +1944 -0
  20. package/docs/en/agents/index.html +1925 -0
  21. package/docs/en/architecture/index.html +2187 -0
  22. package/docs/en/examples-and-fixtures/index.html +1888 -0
  23. package/docs/en/help/index.html +2035 -0
  24. package/docs/en/index.html +1895 -0
  25. package/docs/en/licensing/index.html +1917 -0
  26. package/docs/en/migration/index.html +2334 -0
  27. package/docs/en/quickstart/index.html +1919 -0
  28. package/docs/en/recipes/adapter-text-closure/index.html +2000 -0
  29. package/docs/en/recipes/adopt-existing-repository/index.html +1986 -0
  30. package/docs/en/recipes/deterministic-human-report/index.html +1998 -0
  31. package/docs/en/recipes/domain-schema-validation/index.html +2007 -0
  32. package/docs/en/recipes/durable-local-state/index.html +2009 -0
  33. package/docs/en/recipes/host-profile-integration/index.html +2001 -0
  34. package/docs/en/recipes/index.html +1876 -0
  35. package/docs/en/recipes/safe-filesystem-and-atomic-write/index.html +1994 -0
  36. package/docs/en/reference/api/index.html +1917 -0
  37. package/docs/en/reference/compatibility/index.html +1990 -0
  38. package/docs/en/reference/failure-and-side-effect-matrix/index.html +2216 -0
  39. package/docs/examples-and-fixtures/index.html +1871 -0
  40. package/docs/git-lifecycle/index.html +1508 -482
  41. package/docs/help/index.html +1655 -554
  42. package/docs/index.html +1479 -450
  43. package/docs/integration/audit/failure-evidence/index.html +1488 -462
  44. package/docs/integration/audit/independence/index.html +1513 -487
  45. package/docs/integration/audit/index.html +1514 -488
  46. package/docs/integration/audit/mutation-taxonomy/index.html +1548 -522
  47. package/docs/integration/audit/version-compatibility/index.html +1489 -463
  48. package/docs/licensing/index.html +1917 -0
  49. package/docs/migration/index.html +1678 -586
  50. package/docs/public/status/index.html +1542 -516
  51. package/docs/quickstart/index.html +1589 -539
  52. package/docs/recipes/adapter-text-closure/index.html +2000 -0
  53. package/docs/recipes/adopt-existing-repository/index.html +1986 -0
  54. package/docs/recipes/deterministic-human-report/index.html +1998 -0
  55. package/docs/recipes/domain-schema-validation/index.html +2007 -0
  56. package/docs/recipes/durable-local-state/index.html +2009 -0
  57. package/docs/recipes/host-profile-integration/index.html +2001 -0
  58. package/docs/recipes/index.html +1876 -0
  59. package/docs/recipes/safe-filesystem-and-atomic-write/index.html +1994 -0
  60. package/docs/reference/api/contracts/index.html +2532 -0
  61. package/docs/reference/api/engineering-kit/index.html +2551 -0
  62. package/docs/reference/api/harness/index.html +2608 -0
  63. package/docs/reference/api/index.html +1857 -0
  64. package/docs/reference/compatibility/index.html +1990 -0
  65. package/docs/reference/failure-and-side-effect-matrix/index.html +2216 -0
  66. package/docs/search/search_index.json +1 -1
  67. package/docs/setup/index.html +1494 -468
  68. package/docs/sitemap.xml +152 -0
  69. package/package.json +14 -4
  70. package/release-notes/0.2.1.yaml +23 -0
@@ -0,0 +1,2608 @@
1
+
2
+ <!doctype html>
3
+ <html lang="zh" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Skill Family 生命周期公共工程基础设施父工作区">
10
+
11
+
12
+
13
+ <link rel="canonical" href="https://ifoohoo.github.io/skill-family-engineering-kit/reference/api/harness/">
14
+
15
+
16
+ <link rel="prev" href="../contracts/">
17
+
18
+
19
+ <link rel="next" href="../engineering-kit/">
20
+
21
+
22
+
23
+
24
+
25
+ <link rel="icon" href="../../../assets/images/favicon.png">
26
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.7">
27
+
28
+
29
+
30
+ <title>中文 · Harness API - Skill Family Foundation</title>
31
+
32
+
33
+
34
+ <link rel="stylesheet" href="../../../assets/stylesheets/main.ec1eaa64.min.css">
35
+
36
+
37
+ <link rel="stylesheet" href="../../../assets/stylesheets/palette.ab4e12ef.min.css">
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+ <script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
51
+
52
+
53
+
54
+
55
+
56
+ </head>
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+ <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo">
67
+
68
+
69
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
70
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
71
+ <label class="md-overlay" for="__drawer"></label>
72
+ <div data-md-component="skip">
73
+
74
+
75
+ <a href="#skill-family-harness-node-公共-API-参考" class="md-skip">
76
+ 跳转至
77
+ </a>
78
+
79
+ </div>
80
+ <div data-md-component="announce">
81
+
82
+ </div>
83
+
84
+
85
+
86
+
87
+
88
+
89
+ <header class="md-header md-header--shadow" data-md-component="header">
90
+ <nav class="md-header__inner md-grid" aria-label="页眉">
91
+ <a href="../../.." title="Skill Family Foundation" class="md-header__button md-logo" aria-label="Skill Family Foundation" data-md-component="logo">
92
+
93
+
94
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
95
+
96
+ </a>
97
+ <label class="md-header__button md-icon" for="__drawer">
98
+
99
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
100
+ </label>
101
+ <div class="md-header__title" data-md-component="header-title">
102
+ <div class="md-header__ellipsis">
103
+ <div class="md-header__topic">
104
+ <span class="md-ellipsis">
105
+ Skill Family Foundation
106
+ </span>
107
+ </div>
108
+ <div class="md-header__topic" data-md-component="header-topic">
109
+ <span class="md-ellipsis">
110
+
111
+ 中文 · Harness API
112
+
113
+ </span>
114
+ </div>
115
+ </div>
116
+ </div>
117
+
118
+
119
+ <form class="md-header__option" data-md-component="palette">
120
+
121
+
122
+
123
+
124
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="切换到深色模式" type="radio" name="__palette" id="__palette_0">
125
+
126
+ <label class="md-header__button md-icon" title="切换到深色模式" for="__palette_1" hidden>
127
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
128
+ </label>
129
+
130
+
131
+
132
+
133
+
134
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="切换到浅色模式" type="radio" name="__palette" id="__palette_1">
135
+
136
+ <label class="md-header__button md-icon" title="切换到浅色模式" for="__palette_0" hidden>
137
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
138
+ </label>
139
+
140
+
141
+ </form>
142
+
143
+
144
+
145
+ <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
146
+
147
+
148
+
149
+
150
+
151
+ <label class="md-header__button md-icon" for="__search">
152
+
153
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
154
+ </label>
155
+ <div class="md-search" data-md-component="search" role="dialog">
156
+ <label class="md-search__overlay" for="__search"></label>
157
+ <div class="md-search__inner" role="search">
158
+ <form class="md-search__form" name="search">
159
+ <input type="text" class="md-search__input" name="query" aria-label="搜索" placeholder="搜索" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
160
+ <label class="md-search__icon md-icon" for="__search">
161
+
162
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
163
+
164
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
165
+ </label>
166
+ <nav class="md-search__options" aria-label="查找">
167
+
168
+ <button type="reset" class="md-search__icon md-icon" title="清空当前内容" aria-label="清空当前内容" tabindex="-1">
169
+
170
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
171
+ </button>
172
+ </nav>
173
+
174
+ </form>
175
+ <div class="md-search__output">
176
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
177
+ <div class="md-search-result" data-md-component="search-result">
178
+ <div class="md-search-result__meta">
179
+ 正在初始化搜索引擎
180
+ </div>
181
+ <ol class="md-search-result__list" role="presentation"></ol>
182
+ </div>
183
+ </div>
184
+ </div>
185
+ </div>
186
+ </div>
187
+
188
+
189
+
190
+ </nav>
191
+
192
+ </header>
193
+
194
+ <div class="md-container" data-md-component="container">
195
+
196
+
197
+
198
+
199
+
200
+
201
+ <main class="md-main" data-md-component="main">
202
+ <div class="md-main__inner md-grid">
203
+
204
+
205
+
206
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
207
+ <div class="md-sidebar__scrollwrap">
208
+ <div class="md-sidebar__inner">
209
+
210
+
211
+
212
+
213
+ <nav class="md-nav md-nav--primary" aria-label="导航栏" data-md-level="0">
214
+ <label class="md-nav__title" for="__drawer">
215
+ <a href="../../.." title="Skill Family Foundation" class="md-nav__button md-logo" aria-label="Skill Family Foundation" data-md-component="logo">
216
+
217
+
218
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
219
+
220
+ </a>
221
+ Skill Family Foundation
222
+ </label>
223
+
224
+ <ul class="md-nav__list" data-md-scrollfix>
225
+
226
+
227
+
228
+
229
+
230
+
231
+
232
+ <li class="md-nav__item">
233
+ <a href="../../.." class="md-nav__link">
234
+
235
+
236
+
237
+ <span class="md-ellipsis">
238
+
239
+
240
+ 中文 · 首页
241
+
242
+
243
+
244
+ </span>
245
+
246
+
247
+
248
+ </a>
249
+ </li>
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+ <li class="md-nav__item">
260
+ <a href="../../../setup/" class="md-nav__link">
261
+
262
+
263
+
264
+ <span class="md-ellipsis">
265
+
266
+
267
+ 中文 · 安装与环境
268
+
269
+
270
+
271
+ </span>
272
+
273
+
274
+
275
+ </a>
276
+ </li>
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+ <li class="md-nav__item">
287
+ <a href="../../../quickstart/" class="md-nav__link">
288
+
289
+
290
+
291
+ <span class="md-ellipsis">
292
+
293
+
294
+ 中文 · 快速开始
295
+
296
+
297
+
298
+ </span>
299
+
300
+
301
+
302
+ </a>
303
+ </li>
304
+
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+ <li class="md-nav__item">
314
+ <a href="../../../git-lifecycle/" class="md-nav__link">
315
+
316
+
317
+
318
+ <span class="md-ellipsis">
319
+
320
+
321
+ 中文 · Git 生命周期指南
322
+
323
+
324
+
325
+ </span>
326
+
327
+
328
+
329
+ </a>
330
+ </li>
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+
339
+
340
+ <li class="md-nav__item">
341
+ <a href="../../../help/" class="md-nav__link">
342
+
343
+
344
+
345
+ <span class="md-ellipsis">
346
+
347
+
348
+ 中文 · 能力与诊断
349
+
350
+
351
+
352
+ </span>
353
+
354
+
355
+
356
+ </a>
357
+ </li>
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+
366
+
367
+ <li class="md-nav__item">
368
+ <a href="../../../architecture/" class="md-nav__link">
369
+
370
+
371
+
372
+ <span class="md-ellipsis">
373
+
374
+
375
+ 中文 · 架构边界
376
+
377
+
378
+
379
+ </span>
380
+
381
+
382
+
383
+ </a>
384
+ </li>
385
+
386
+
387
+
388
+
389
+
390
+
391
+
392
+
393
+
394
+ <li class="md-nav__item">
395
+ <a href="../../../public/status/" class="md-nav__link">
396
+
397
+
398
+
399
+ <span class="md-ellipsis">
400
+
401
+
402
+ 中文 · 公开状态
403
+
404
+
405
+
406
+ </span>
407
+
408
+
409
+
410
+ </a>
411
+ </li>
412
+
413
+
414
+
415
+
416
+
417
+
418
+
419
+
420
+
421
+ <li class="md-nav__item">
422
+ <a href="../../../migration/" class="md-nav__link">
423
+
424
+
425
+
426
+ <span class="md-ellipsis">
427
+
428
+
429
+ 中文 · 存量采用与迁移
430
+
431
+
432
+
433
+ </span>
434
+
435
+
436
+
437
+ </a>
438
+ </li>
439
+
440
+
441
+
442
+
443
+
444
+
445
+
446
+
447
+
448
+ <li class="md-nav__item">
449
+ <a href="../../../licensing/" class="md-nav__link">
450
+
451
+
452
+
453
+ <span class="md-ellipsis">
454
+
455
+
456
+ 中文 · 许可与署名
457
+
458
+
459
+
460
+ </span>
461
+
462
+
463
+
464
+ </a>
465
+ </li>
466
+
467
+
468
+
469
+
470
+
471
+
472
+
473
+
474
+
475
+ <li class="md-nav__item">
476
+ <a href="../../../agents/" class="md-nav__link">
477
+
478
+
479
+
480
+ <span class="md-ellipsis">
481
+
482
+
483
+ 中文 · 智能体入口
484
+
485
+
486
+
487
+ </span>
488
+
489
+
490
+
491
+ </a>
492
+ </li>
493
+
494
+
495
+
496
+
497
+
498
+
499
+
500
+
501
+
502
+ <li class="md-nav__item">
503
+ <a href="../../../agents/architecture-routing/" class="md-nav__link">
504
+
505
+
506
+
507
+ <span class="md-ellipsis">
508
+
509
+
510
+ 中文 · 架构路由
511
+
512
+
513
+
514
+ </span>
515
+
516
+
517
+
518
+ </a>
519
+ </li>
520
+
521
+
522
+
523
+
524
+
525
+
526
+
527
+
528
+
529
+ <li class="md-nav__item">
530
+ <a href="../../compatibility/" class="md-nav__link">
531
+
532
+
533
+
534
+ <span class="md-ellipsis">
535
+
536
+
537
+ 中文 · 兼容性
538
+
539
+
540
+
541
+ </span>
542
+
543
+
544
+
545
+ </a>
546
+ </li>
547
+
548
+
549
+
550
+
551
+
552
+
553
+
554
+
555
+
556
+ <li class="md-nav__item">
557
+ <a href="../../failure-and-side-effect-matrix/" class="md-nav__link">
558
+
559
+
560
+
561
+ <span class="md-ellipsis">
562
+
563
+
564
+ 中文 · 失败与副作用
565
+
566
+
567
+
568
+ </span>
569
+
570
+
571
+
572
+ </a>
573
+ </li>
574
+
575
+
576
+
577
+
578
+
579
+
580
+
581
+
582
+
583
+ <li class="md-nav__item">
584
+ <a href="../" class="md-nav__link">
585
+
586
+
587
+
588
+ <span class="md-ellipsis">
589
+
590
+
591
+ 中文 · API 参考
592
+
593
+
594
+
595
+ </span>
596
+
597
+
598
+
599
+ </a>
600
+ </li>
601
+
602
+
603
+
604
+
605
+
606
+
607
+
608
+
609
+
610
+ <li class="md-nav__item">
611
+ <a href="../contracts/" class="md-nav__link">
612
+
613
+
614
+
615
+ <span class="md-ellipsis">
616
+
617
+
618
+ 中文 · Contracts API
619
+
620
+
621
+
622
+ </span>
623
+
624
+
625
+
626
+ </a>
627
+ </li>
628
+
629
+
630
+
631
+
632
+
633
+
634
+
635
+
636
+
637
+
638
+
639
+ <li class="md-nav__item md-nav__item--active">
640
+
641
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
642
+
643
+
644
+
645
+
646
+
647
+ <label class="md-nav__link md-nav__link--active" for="__toc">
648
+
649
+
650
+
651
+ <span class="md-ellipsis">
652
+
653
+
654
+ 中文 · Harness API
655
+
656
+
657
+
658
+ </span>
659
+
660
+
661
+
662
+ <span class="md-nav__icon md-icon"></span>
663
+ </label>
664
+
665
+ <a href="./" class="md-nav__link md-nav__link--active">
666
+
667
+
668
+
669
+ <span class="md-ellipsis">
670
+
671
+
672
+ 中文 · Harness API
673
+
674
+
675
+
676
+ </span>
677
+
678
+
679
+
680
+ </a>
681
+
682
+
683
+
684
+ <nav class="md-nav md-nav--secondary" aria-label="目录">
685
+
686
+
687
+
688
+
689
+
690
+
691
+ <label class="md-nav__title" for="__toc">
692
+ <span class="md-nav__icon md-icon"></span>
693
+ 目录
694
+ </label>
695
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
696
+
697
+ <li class="md-nav__item">
698
+ <a href="#契约校验-foundationharnesscontract-validation" class="md-nav__link">
699
+ <span class="md-ellipsis">
700
+
701
+ 契约校验 (foundation.harness.contract-validation)
702
+
703
+ </span>
704
+ </a>
705
+
706
+ <nav class="md-nav" aria-label="契约校验 (foundation.harness.contract-validation)">
707
+ <ul class="md-nav__list">
708
+
709
+ <li class="md-nav__item">
710
+ <a href="#validateContractDocument--getValidator--resolveSchemaContext--validatorCacheSize" class="md-nav__link">
711
+ <span class="md-ellipsis">
712
+
713
+ validateContractDocument / getValidator / resolveSchemaContext / validatorCacheSize
714
+
715
+ </span>
716
+ </a>
717
+
718
+ </li>
719
+
720
+ </ul>
721
+ </nav>
722
+
723
+ </li>
724
+
725
+ <li class="md-nav__item">
726
+ <a href="#路径收容-foundationharnesspath-containment" class="md-nav__link">
727
+ <span class="md-ellipsis">
728
+
729
+ 路径收容 (foundation.harness.path-containment)
730
+
731
+ </span>
732
+ </a>
733
+
734
+ <nav class="md-nav" aria-label="路径收容 (foundation.harness.path-containment)">
735
+ <ul class="md-nav__list">
736
+
737
+ <li class="md-nav__item">
738
+ <a href="#classifyPathInput--resolveContained--readFileContained" class="md-nav__link">
739
+ <span class="md-ellipsis">
740
+
741
+ classifyPathInput / resolveContained / readFileContained
742
+
743
+ </span>
744
+ </a>
745
+
746
+ </li>
747
+
748
+ </ul>
749
+ </nav>
750
+
751
+ </li>
752
+
753
+ <li class="md-nav__item">
754
+ <a href="#原子写-foundationharnessatomic-write" class="md-nav__link">
755
+ <span class="md-ellipsis">
756
+
757
+ 原子写 (foundation.harness.atomic-write)
758
+
759
+ </span>
760
+ </a>
761
+
762
+ <nav class="md-nav" aria-label="原子写 (foundation.harness.atomic-write)">
763
+ <ul class="md-nav__list">
764
+
765
+ <li class="md-nav__item">
766
+ <a href="#writeFileAtomic" class="md-nav__link">
767
+ <span class="md-ellipsis">
768
+
769
+ writeFileAtomic
770
+
771
+ </span>
772
+ </a>
773
+
774
+ </li>
775
+
776
+ </ul>
777
+ </nav>
778
+
779
+ </li>
780
+
781
+ <li class="md-nav__item">
782
+ <a href="#临时工作区-foundationharnesstemporary-workspace" class="md-nav__link">
783
+ <span class="md-ellipsis">
784
+
785
+ 临时工作区 (foundation.harness.temporary-workspace)
786
+
787
+ </span>
788
+ </a>
789
+
790
+ <nav class="md-nav" aria-label="临时工作区 (foundation.harness.temporary-workspace)">
791
+ <ul class="md-nav__list">
792
+
793
+ <li class="md-nav__item">
794
+ <a href="#TemporaryWorkspace--createTemporaryWorkspace--withTemporaryWorkspace" class="md-nav__link">
795
+ <span class="md-ellipsis">
796
+
797
+ TemporaryWorkspace / createTemporaryWorkspace / withTemporaryWorkspace
798
+
799
+ </span>
800
+ </a>
801
+
802
+ </li>
803
+
804
+ </ul>
805
+ </nav>
806
+
807
+ </li>
808
+
809
+ <li class="md-nav__item">
810
+ <a href="#资源闭包-foundationharnessresource-closure" class="md-nav__link">
811
+ <span class="md-ellipsis">
812
+
813
+ 资源闭包 (foundation.harness.resource-closure)
814
+
815
+ </span>
816
+ </a>
817
+
818
+ <nav class="md-nav" aria-label="资源闭包 (foundation.harness.resource-closure)">
819
+ <ul class="md-nav__list">
820
+
821
+ <li class="md-nav__item">
822
+ <a href="#computeResourceClosure--digestBytes--closureContains" class="md-nav__link">
823
+ <span class="md-ellipsis">
824
+
825
+ computeResourceClosure / digestBytes / closureContains
826
+
827
+ </span>
828
+ </a>
829
+
830
+ </li>
831
+
832
+ </ul>
833
+ </nav>
834
+
835
+ </li>
836
+
837
+ <li class="md-nav__item">
838
+ <a href="#请求管线-foundationharnessrequest-processing" class="md-nav__link">
839
+ <span class="md-ellipsis">
840
+
841
+ 请求管线 (foundation.harness.request-processing)
842
+
843
+ </span>
844
+ </a>
845
+
846
+ <nav class="md-nav" aria-label="请求管线 (foundation.harness.request-processing)">
847
+ <ul class="md-nav__list">
848
+
849
+ <li class="md-nav__item">
850
+ <a href="#parseRequest--processRequest" class="md-nav__link">
851
+ <span class="md-ellipsis">
852
+
853
+ parseRequest / processRequest
854
+
855
+ </span>
856
+ </a>
857
+
858
+ </li>
859
+
860
+ </ul>
861
+ </nav>
862
+
863
+ </li>
864
+
865
+ <li class="md-nav__item">
866
+ <a href="#报告-foundationharnessreport" class="md-nav__link">
867
+ <span class="md-ellipsis">
868
+
869
+ 报告 (foundation.harness.report)
870
+
871
+ </span>
872
+ </a>
873
+
874
+ <nav class="md-nav" aria-label="报告 (foundation.harness.report)">
875
+ <ul class="md-nav__list">
876
+
877
+ <li class="md-nav__item">
878
+ <a href="#validateReportModel--renderReportMarkdown--computeResultDigest--computeModelDigest--digestReport--buildBinding--verifyBinding--checkReport--collectStyleWarnings" class="md-nav__link">
879
+ <span class="md-ellipsis">
880
+
881
+ validateReportModel / renderReportMarkdown / computeResultDigest / computeModelDigest / digestReport / buildBinding / verifyBinding / checkReport / collectStyleWarnings
882
+
883
+ </span>
884
+ </a>
885
+
886
+ </li>
887
+
888
+ </ul>
889
+ </nav>
890
+
891
+ </li>
892
+
893
+ <li class="md-nav__item">
894
+ <a href="#宿主适配机制-foundationharnesshost-adapter" class="md-nav__link">
895
+ <span class="md-ellipsis">
896
+
897
+ 宿主适配机制 (foundation.harness.host-adapter)
898
+
899
+ </span>
900
+ </a>
901
+
902
+ <nav class="md-nav" aria-label="宿主适配机制 (foundation.harness.host-adapter)">
903
+ <ul class="md-nav__list">
904
+
905
+ <li class="md-nav__item">
906
+ <a href="#normalizeAdapterSource--buildAdapterClosure--verifyAdapterBuildManifest--materializeAdapterBuild--probeVersionVector" class="md-nav__link">
907
+ <span class="md-ellipsis">
908
+
909
+ normalizeAdapterSource / buildAdapterClosure / verifyAdapterBuildManifest / materializeAdapterBuild / probeVersionVector
910
+
911
+ </span>
912
+ </a>
913
+
914
+ </li>
915
+
916
+ </ul>
917
+ </nav>
918
+
919
+ </li>
920
+
921
+ <li class="md-nav__item">
922
+ <a href="#持久状态底座-foundationharnessstate-store" class="md-nav__link">
923
+ <span class="md-ellipsis">
924
+
925
+ 持久状态底座 (foundation.harness.state-store)
926
+
927
+ </span>
928
+ </a>
929
+
930
+ <nav class="md-nav" aria-label="持久状态底座 (foundation.harness.state-store)">
931
+ <ul class="md-nav__list">
932
+
933
+ <li class="md-nav__item">
934
+ <a href="#openStateStore--appendEvent--readEvents--readSnapshot--writeSnapshot--verifyStateStore--rebuildSnapshot--inspectStateStoreLock--recoverStateStoreLock--closeStateStore--close" class="md-nav__link">
935
+ <span class="md-ellipsis">
936
+
937
+ openStateStore / appendEvent / readEvents / readSnapshot / writeSnapshot / verifyStateStore / rebuildSnapshot / inspectStateStoreLock / recoverStateStoreLock / closeStateStore / close
938
+
939
+ </span>
940
+ </a>
941
+
942
+ </li>
943
+
944
+ </ul>
945
+ </nav>
946
+
947
+ </li>
948
+
949
+ <li class="md-nav__item">
950
+ <a href="#机制错误-foundationharnesserrors" class="md-nav__link">
951
+ <span class="md-ellipsis">
952
+
953
+ 机制错误 (foundation.harness.errors)
954
+
955
+ </span>
956
+ </a>
957
+
958
+ <nav class="md-nav" aria-label="机制错误 (foundation.harness.errors)">
959
+ <ul class="md-nav__list">
960
+
961
+ <li class="md-nav__item">
962
+ <a href="#HarnessError--mechanismError--HARNESS_ERROR_KINDS" class="md-nav__link">
963
+ <span class="md-ellipsis">
964
+
965
+ HarnessError / mechanismError / HARNESS_ERROR_KINDS
966
+
967
+ </span>
968
+ </a>
969
+
970
+ </li>
971
+
972
+ </ul>
973
+ </nav>
974
+
975
+ </li>
976
+
977
+ <li class="md-nav__item">
978
+ <a href="#与机器事实层的互链" class="md-nav__link">
979
+ <span class="md-ellipsis">
980
+
981
+ 与机器事实层的互链
982
+
983
+ </span>
984
+ </a>
985
+
986
+ </li>
987
+
988
+ </ul>
989
+
990
+ </nav>
991
+
992
+ </li>
993
+
994
+
995
+
996
+
997
+
998
+
999
+
1000
+
1001
+
1002
+ <li class="md-nav__item">
1003
+ <a href="../engineering-kit/" class="md-nav__link">
1004
+
1005
+
1006
+
1007
+ <span class="md-ellipsis">
1008
+
1009
+
1010
+ 中文 · Engineering Kit API
1011
+
1012
+
1013
+
1014
+ </span>
1015
+
1016
+
1017
+
1018
+ </a>
1019
+ </li>
1020
+
1021
+
1022
+
1023
+
1024
+
1025
+
1026
+
1027
+
1028
+
1029
+ <li class="md-nav__item">
1030
+ <a href="../../../examples-and-fixtures/" class="md-nav__link">
1031
+
1032
+
1033
+
1034
+ <span class="md-ellipsis">
1035
+
1036
+
1037
+ 中文 · 样例与 Fixture
1038
+
1039
+
1040
+
1041
+ </span>
1042
+
1043
+
1044
+
1045
+ </a>
1046
+ </li>
1047
+
1048
+
1049
+
1050
+
1051
+
1052
+
1053
+
1054
+
1055
+
1056
+ <li class="md-nav__item">
1057
+ <a href="../../../recipes/" class="md-nav__link">
1058
+
1059
+
1060
+
1061
+ <span class="md-ellipsis">
1062
+
1063
+
1064
+ 中文 · Recipes
1065
+
1066
+
1067
+
1068
+ </span>
1069
+
1070
+
1071
+
1072
+ </a>
1073
+ </li>
1074
+
1075
+
1076
+
1077
+
1078
+
1079
+
1080
+
1081
+
1082
+
1083
+ <li class="md-nav__item">
1084
+ <a href="../../../recipes/adopt-existing-repository/" class="md-nav__link">
1085
+
1086
+
1087
+
1088
+ <span class="md-ellipsis">
1089
+
1090
+
1091
+ 中文 · 采用存量仓库
1092
+
1093
+
1094
+
1095
+ </span>
1096
+
1097
+
1098
+
1099
+ </a>
1100
+ </li>
1101
+
1102
+
1103
+
1104
+
1105
+
1106
+
1107
+
1108
+
1109
+
1110
+ <li class="md-nav__item">
1111
+ <a href="../../../recipes/safe-filesystem-and-atomic-write/" class="md-nav__link">
1112
+
1113
+
1114
+
1115
+ <span class="md-ellipsis">
1116
+
1117
+
1118
+ 中文 · 安全文件系统与原子写
1119
+
1120
+
1121
+
1122
+ </span>
1123
+
1124
+
1125
+
1126
+ </a>
1127
+ </li>
1128
+
1129
+
1130
+
1131
+
1132
+
1133
+
1134
+
1135
+
1136
+
1137
+ <li class="md-nav__item">
1138
+ <a href="../../../recipes/adapter-text-closure/" class="md-nav__link">
1139
+
1140
+
1141
+
1142
+ <span class="md-ellipsis">
1143
+
1144
+
1145
+ 中文 · Adapter 文本闭包
1146
+
1147
+
1148
+
1149
+ </span>
1150
+
1151
+
1152
+
1153
+ </a>
1154
+ </li>
1155
+
1156
+
1157
+
1158
+
1159
+
1160
+
1161
+
1162
+
1163
+
1164
+ <li class="md-nav__item">
1165
+ <a href="../../../recipes/deterministic-human-report/" class="md-nav__link">
1166
+
1167
+
1168
+
1169
+ <span class="md-ellipsis">
1170
+
1171
+
1172
+ 中文 · 确定性人类报告
1173
+
1174
+
1175
+
1176
+ </span>
1177
+
1178
+
1179
+
1180
+ </a>
1181
+ </li>
1182
+
1183
+
1184
+
1185
+
1186
+
1187
+
1188
+
1189
+
1190
+
1191
+ <li class="md-nav__item">
1192
+ <a href="../../../recipes/durable-local-state/" class="md-nav__link">
1193
+
1194
+
1195
+
1196
+ <span class="md-ellipsis">
1197
+
1198
+
1199
+ 中文 · 持久本地状态
1200
+
1201
+
1202
+
1203
+ </span>
1204
+
1205
+
1206
+
1207
+ </a>
1208
+ </li>
1209
+
1210
+
1211
+
1212
+
1213
+
1214
+
1215
+
1216
+
1217
+
1218
+ <li class="md-nav__item">
1219
+ <a href="../../../recipes/host-profile-integration/" class="md-nav__link">
1220
+
1221
+
1222
+
1223
+ <span class="md-ellipsis">
1224
+
1225
+
1226
+ 中文 · 宿主 Profile 集成
1227
+
1228
+
1229
+
1230
+ </span>
1231
+
1232
+
1233
+
1234
+ </a>
1235
+ </li>
1236
+
1237
+
1238
+
1239
+
1240
+
1241
+
1242
+
1243
+
1244
+
1245
+ <li class="md-nav__item">
1246
+ <a href="../../../recipes/domain-schema-validation/" class="md-nav__link">
1247
+
1248
+
1249
+
1250
+ <span class="md-ellipsis">
1251
+
1252
+
1253
+ 中文 · 领域 Schema 校验
1254
+
1255
+
1256
+
1257
+ </span>
1258
+
1259
+
1260
+
1261
+ </a>
1262
+ </li>
1263
+
1264
+
1265
+
1266
+
1267
+
1268
+
1269
+
1270
+
1271
+
1272
+ <li class="md-nav__item">
1273
+ <a href="../../../en/" class="md-nav__link">
1274
+
1275
+
1276
+
1277
+ <span class="md-ellipsis">
1278
+
1279
+
1280
+ English · Home
1281
+
1282
+
1283
+
1284
+ </span>
1285
+
1286
+
1287
+
1288
+ </a>
1289
+ </li>
1290
+
1291
+
1292
+
1293
+
1294
+
1295
+
1296
+
1297
+
1298
+
1299
+ <li class="md-nav__item">
1300
+ <a href="../../../en/quickstart/" class="md-nav__link">
1301
+
1302
+
1303
+
1304
+ <span class="md-ellipsis">
1305
+
1306
+
1307
+ English · Quickstart
1308
+
1309
+
1310
+
1311
+ </span>
1312
+
1313
+
1314
+
1315
+ </a>
1316
+ </li>
1317
+
1318
+
1319
+
1320
+
1321
+
1322
+
1323
+
1324
+
1325
+
1326
+ <li class="md-nav__item">
1327
+ <a href="../../../en/help/" class="md-nav__link">
1328
+
1329
+
1330
+
1331
+ <span class="md-ellipsis">
1332
+
1333
+
1334
+ English · Capabilities and diagnostics
1335
+
1336
+
1337
+
1338
+ </span>
1339
+
1340
+
1341
+
1342
+ </a>
1343
+ </li>
1344
+
1345
+
1346
+
1347
+
1348
+
1349
+
1350
+
1351
+
1352
+
1353
+ <li class="md-nav__item">
1354
+ <a href="../../../en/architecture/" class="md-nav__link">
1355
+
1356
+
1357
+
1358
+ <span class="md-ellipsis">
1359
+
1360
+
1361
+ English · Architecture
1362
+
1363
+
1364
+
1365
+ </span>
1366
+
1367
+
1368
+
1369
+ </a>
1370
+ </li>
1371
+
1372
+
1373
+
1374
+
1375
+
1376
+
1377
+
1378
+
1379
+
1380
+ <li class="md-nav__item">
1381
+ <a href="../../../en/migration/" class="md-nav__link">
1382
+
1383
+
1384
+
1385
+ <span class="md-ellipsis">
1386
+
1387
+
1388
+ English · Migration
1389
+
1390
+
1391
+
1392
+ </span>
1393
+
1394
+
1395
+
1396
+ </a>
1397
+ </li>
1398
+
1399
+
1400
+
1401
+
1402
+
1403
+
1404
+
1405
+
1406
+
1407
+ <li class="md-nav__item">
1408
+ <a href="../../../en/licensing/" class="md-nav__link">
1409
+
1410
+
1411
+
1412
+ <span class="md-ellipsis">
1413
+
1414
+
1415
+ English · Licensing
1416
+
1417
+
1418
+
1419
+ </span>
1420
+
1421
+
1422
+
1423
+ </a>
1424
+ </li>
1425
+
1426
+
1427
+
1428
+
1429
+
1430
+
1431
+
1432
+
1433
+
1434
+ <li class="md-nav__item">
1435
+ <a href="../../../en/agents/" class="md-nav__link">
1436
+
1437
+
1438
+
1439
+ <span class="md-ellipsis">
1440
+
1441
+
1442
+ English · Agent entry
1443
+
1444
+
1445
+
1446
+ </span>
1447
+
1448
+
1449
+
1450
+ </a>
1451
+ </li>
1452
+
1453
+
1454
+
1455
+
1456
+
1457
+
1458
+
1459
+
1460
+
1461
+ <li class="md-nav__item">
1462
+ <a href="../../../en/agents/architecture-routing/" class="md-nav__link">
1463
+
1464
+
1465
+
1466
+ <span class="md-ellipsis">
1467
+
1468
+
1469
+ English · Architecture routing
1470
+
1471
+
1472
+
1473
+ </span>
1474
+
1475
+
1476
+
1477
+ </a>
1478
+ </li>
1479
+
1480
+
1481
+
1482
+
1483
+
1484
+
1485
+
1486
+
1487
+
1488
+ <li class="md-nav__item">
1489
+ <a href="../../../en/reference/compatibility/" class="md-nav__link">
1490
+
1491
+
1492
+
1493
+ <span class="md-ellipsis">
1494
+
1495
+
1496
+ English · Compatibility
1497
+
1498
+
1499
+
1500
+ </span>
1501
+
1502
+
1503
+
1504
+ </a>
1505
+ </li>
1506
+
1507
+
1508
+
1509
+
1510
+
1511
+
1512
+
1513
+
1514
+
1515
+ <li class="md-nav__item">
1516
+ <a href="../../../en/reference/failure-and-side-effect-matrix/" class="md-nav__link">
1517
+
1518
+
1519
+
1520
+ <span class="md-ellipsis">
1521
+
1522
+
1523
+ English · Failures and side effects
1524
+
1525
+
1526
+
1527
+ </span>
1528
+
1529
+
1530
+
1531
+ </a>
1532
+ </li>
1533
+
1534
+
1535
+
1536
+
1537
+
1538
+
1539
+
1540
+
1541
+
1542
+ <li class="md-nav__item">
1543
+ <a href="../../../en/reference/api/" class="md-nav__link">
1544
+
1545
+
1546
+
1547
+ <span class="md-ellipsis">
1548
+
1549
+
1550
+ English · API reference
1551
+
1552
+
1553
+
1554
+ </span>
1555
+
1556
+
1557
+
1558
+ </a>
1559
+ </li>
1560
+
1561
+
1562
+
1563
+
1564
+
1565
+
1566
+
1567
+
1568
+
1569
+ <li class="md-nav__item">
1570
+ <a href="../../../en/examples-and-fixtures/" class="md-nav__link">
1571
+
1572
+
1573
+
1574
+ <span class="md-ellipsis">
1575
+
1576
+
1577
+ English · Examples and fixtures
1578
+
1579
+
1580
+
1581
+ </span>
1582
+
1583
+
1584
+
1585
+ </a>
1586
+ </li>
1587
+
1588
+
1589
+
1590
+
1591
+
1592
+
1593
+
1594
+
1595
+
1596
+ <li class="md-nav__item">
1597
+ <a href="../../../en/recipes/" class="md-nav__link">
1598
+
1599
+
1600
+
1601
+ <span class="md-ellipsis">
1602
+
1603
+
1604
+ English · Recipes
1605
+
1606
+
1607
+
1608
+ </span>
1609
+
1610
+
1611
+
1612
+ </a>
1613
+ </li>
1614
+
1615
+
1616
+
1617
+
1618
+
1619
+
1620
+
1621
+
1622
+
1623
+ <li class="md-nav__item">
1624
+ <a href="../../../en/recipes/adopt-existing-repository/" class="md-nav__link">
1625
+
1626
+
1627
+
1628
+ <span class="md-ellipsis">
1629
+
1630
+
1631
+ English · Adopt an existing repository
1632
+
1633
+
1634
+
1635
+ </span>
1636
+
1637
+
1638
+
1639
+ </a>
1640
+ </li>
1641
+
1642
+
1643
+
1644
+
1645
+
1646
+
1647
+
1648
+
1649
+
1650
+ <li class="md-nav__item">
1651
+ <a href="../../../en/recipes/safe-filesystem-and-atomic-write/" class="md-nav__link">
1652
+
1653
+
1654
+
1655
+ <span class="md-ellipsis">
1656
+
1657
+
1658
+ English · Safe filesystem and atomic write
1659
+
1660
+
1661
+
1662
+ </span>
1663
+
1664
+
1665
+
1666
+ </a>
1667
+ </li>
1668
+
1669
+
1670
+
1671
+
1672
+
1673
+
1674
+
1675
+
1676
+
1677
+ <li class="md-nav__item">
1678
+ <a href="../../../en/recipes/adapter-text-closure/" class="md-nav__link">
1679
+
1680
+
1681
+
1682
+ <span class="md-ellipsis">
1683
+
1684
+
1685
+ English · Adapter text closure
1686
+
1687
+
1688
+
1689
+ </span>
1690
+
1691
+
1692
+
1693
+ </a>
1694
+ </li>
1695
+
1696
+
1697
+
1698
+
1699
+
1700
+
1701
+
1702
+
1703
+
1704
+ <li class="md-nav__item">
1705
+ <a href="../../../en/recipes/deterministic-human-report/" class="md-nav__link">
1706
+
1707
+
1708
+
1709
+ <span class="md-ellipsis">
1710
+
1711
+
1712
+ English · Deterministic human report
1713
+
1714
+
1715
+
1716
+ </span>
1717
+
1718
+
1719
+
1720
+ </a>
1721
+ </li>
1722
+
1723
+
1724
+
1725
+
1726
+
1727
+
1728
+
1729
+
1730
+
1731
+ <li class="md-nav__item">
1732
+ <a href="../../../en/recipes/durable-local-state/" class="md-nav__link">
1733
+
1734
+
1735
+
1736
+ <span class="md-ellipsis">
1737
+
1738
+
1739
+ English · Durable local state
1740
+
1741
+
1742
+
1743
+ </span>
1744
+
1745
+
1746
+
1747
+ </a>
1748
+ </li>
1749
+
1750
+
1751
+
1752
+
1753
+
1754
+
1755
+
1756
+
1757
+
1758
+ <li class="md-nav__item">
1759
+ <a href="../../../en/recipes/host-profile-integration/" class="md-nav__link">
1760
+
1761
+
1762
+
1763
+ <span class="md-ellipsis">
1764
+
1765
+
1766
+ English · Host Profile integration
1767
+
1768
+
1769
+
1770
+ </span>
1771
+
1772
+
1773
+
1774
+ </a>
1775
+ </li>
1776
+
1777
+
1778
+
1779
+
1780
+
1781
+
1782
+
1783
+
1784
+
1785
+ <li class="md-nav__item">
1786
+ <a href="../../../en/recipes/domain-schema-validation/" class="md-nav__link">
1787
+
1788
+
1789
+
1790
+ <span class="md-ellipsis">
1791
+
1792
+
1793
+ English · Domain Schema validation
1794
+
1795
+
1796
+
1797
+ </span>
1798
+
1799
+
1800
+
1801
+ </a>
1802
+ </li>
1803
+
1804
+
1805
+
1806
+
1807
+
1808
+
1809
+
1810
+
1811
+
1812
+ <li class="md-nav__item">
1813
+ <a href="../../../integration/audit/" class="md-nav__link">
1814
+
1815
+
1816
+
1817
+ <span class="md-ellipsis">
1818
+
1819
+
1820
+ 审计集成 · 入口
1821
+
1822
+
1823
+
1824
+ </span>
1825
+
1826
+
1827
+
1828
+ </a>
1829
+ </li>
1830
+
1831
+
1832
+
1833
+
1834
+
1835
+
1836
+
1837
+
1838
+
1839
+ <li class="md-nav__item">
1840
+ <a href="../../../integration/audit/mutation-taxonomy/" class="md-nav__link">
1841
+
1842
+
1843
+
1844
+ <span class="md-ellipsis">
1845
+
1846
+
1847
+ 审计集成 · 变异分类学
1848
+
1849
+
1850
+
1851
+ </span>
1852
+
1853
+
1854
+
1855
+ </a>
1856
+ </li>
1857
+
1858
+
1859
+
1860
+
1861
+
1862
+
1863
+
1864
+
1865
+
1866
+ <li class="md-nav__item">
1867
+ <a href="../../../integration/audit/independence/" class="md-nav__link">
1868
+
1869
+
1870
+
1871
+ <span class="md-ellipsis">
1872
+
1873
+
1874
+ 审计集成 · 独立性证明
1875
+
1876
+
1877
+
1878
+ </span>
1879
+
1880
+
1881
+
1882
+ </a>
1883
+ </li>
1884
+
1885
+
1886
+
1887
+
1888
+
1889
+
1890
+
1891
+
1892
+
1893
+ <li class="md-nav__item">
1894
+ <a href="../../../integration/audit/version-compatibility/" class="md-nav__link">
1895
+
1896
+
1897
+
1898
+ <span class="md-ellipsis">
1899
+
1900
+
1901
+ 审计集成 · 版本兼容
1902
+
1903
+
1904
+
1905
+ </span>
1906
+
1907
+
1908
+
1909
+ </a>
1910
+ </li>
1911
+
1912
+
1913
+
1914
+
1915
+
1916
+
1917
+
1918
+
1919
+
1920
+ <li class="md-nav__item">
1921
+ <a href="../../../integration/audit/failure-evidence/" class="md-nav__link">
1922
+
1923
+
1924
+
1925
+ <span class="md-ellipsis">
1926
+
1927
+
1928
+ 审计集成 · 失败证据与 AUD 码
1929
+
1930
+
1931
+
1932
+ </span>
1933
+
1934
+
1935
+
1936
+ </a>
1937
+ </li>
1938
+
1939
+
1940
+
1941
+ </ul>
1942
+ </nav>
1943
+ </div>
1944
+ </div>
1945
+ </div>
1946
+
1947
+
1948
+
1949
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
1950
+ <div class="md-sidebar__scrollwrap">
1951
+ <div class="md-sidebar__inner">
1952
+
1953
+
1954
+ <nav class="md-nav md-nav--secondary" aria-label="目录">
1955
+
1956
+
1957
+
1958
+
1959
+
1960
+
1961
+ <label class="md-nav__title" for="__toc">
1962
+ <span class="md-nav__icon md-icon"></span>
1963
+ 目录
1964
+ </label>
1965
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
1966
+
1967
+ <li class="md-nav__item">
1968
+ <a href="#契约校验-foundationharnesscontract-validation" class="md-nav__link">
1969
+ <span class="md-ellipsis">
1970
+
1971
+ 契约校验 (foundation.harness.contract-validation)
1972
+
1973
+ </span>
1974
+ </a>
1975
+
1976
+ <nav class="md-nav" aria-label="契约校验 (foundation.harness.contract-validation)">
1977
+ <ul class="md-nav__list">
1978
+
1979
+ <li class="md-nav__item">
1980
+ <a href="#validateContractDocument--getValidator--resolveSchemaContext--validatorCacheSize" class="md-nav__link">
1981
+ <span class="md-ellipsis">
1982
+
1983
+ validateContractDocument / getValidator / resolveSchemaContext / validatorCacheSize
1984
+
1985
+ </span>
1986
+ </a>
1987
+
1988
+ </li>
1989
+
1990
+ </ul>
1991
+ </nav>
1992
+
1993
+ </li>
1994
+
1995
+ <li class="md-nav__item">
1996
+ <a href="#路径收容-foundationharnesspath-containment" class="md-nav__link">
1997
+ <span class="md-ellipsis">
1998
+
1999
+ 路径收容 (foundation.harness.path-containment)
2000
+
2001
+ </span>
2002
+ </a>
2003
+
2004
+ <nav class="md-nav" aria-label="路径收容 (foundation.harness.path-containment)">
2005
+ <ul class="md-nav__list">
2006
+
2007
+ <li class="md-nav__item">
2008
+ <a href="#classifyPathInput--resolveContained--readFileContained" class="md-nav__link">
2009
+ <span class="md-ellipsis">
2010
+
2011
+ classifyPathInput / resolveContained / readFileContained
2012
+
2013
+ </span>
2014
+ </a>
2015
+
2016
+ </li>
2017
+
2018
+ </ul>
2019
+ </nav>
2020
+
2021
+ </li>
2022
+
2023
+ <li class="md-nav__item">
2024
+ <a href="#原子写-foundationharnessatomic-write" class="md-nav__link">
2025
+ <span class="md-ellipsis">
2026
+
2027
+ 原子写 (foundation.harness.atomic-write)
2028
+
2029
+ </span>
2030
+ </a>
2031
+
2032
+ <nav class="md-nav" aria-label="原子写 (foundation.harness.atomic-write)">
2033
+ <ul class="md-nav__list">
2034
+
2035
+ <li class="md-nav__item">
2036
+ <a href="#writeFileAtomic" class="md-nav__link">
2037
+ <span class="md-ellipsis">
2038
+
2039
+ writeFileAtomic
2040
+
2041
+ </span>
2042
+ </a>
2043
+
2044
+ </li>
2045
+
2046
+ </ul>
2047
+ </nav>
2048
+
2049
+ </li>
2050
+
2051
+ <li class="md-nav__item">
2052
+ <a href="#临时工作区-foundationharnesstemporary-workspace" class="md-nav__link">
2053
+ <span class="md-ellipsis">
2054
+
2055
+ 临时工作区 (foundation.harness.temporary-workspace)
2056
+
2057
+ </span>
2058
+ </a>
2059
+
2060
+ <nav class="md-nav" aria-label="临时工作区 (foundation.harness.temporary-workspace)">
2061
+ <ul class="md-nav__list">
2062
+
2063
+ <li class="md-nav__item">
2064
+ <a href="#TemporaryWorkspace--createTemporaryWorkspace--withTemporaryWorkspace" class="md-nav__link">
2065
+ <span class="md-ellipsis">
2066
+
2067
+ TemporaryWorkspace / createTemporaryWorkspace / withTemporaryWorkspace
2068
+
2069
+ </span>
2070
+ </a>
2071
+
2072
+ </li>
2073
+
2074
+ </ul>
2075
+ </nav>
2076
+
2077
+ </li>
2078
+
2079
+ <li class="md-nav__item">
2080
+ <a href="#资源闭包-foundationharnessresource-closure" class="md-nav__link">
2081
+ <span class="md-ellipsis">
2082
+
2083
+ 资源闭包 (foundation.harness.resource-closure)
2084
+
2085
+ </span>
2086
+ </a>
2087
+
2088
+ <nav class="md-nav" aria-label="资源闭包 (foundation.harness.resource-closure)">
2089
+ <ul class="md-nav__list">
2090
+
2091
+ <li class="md-nav__item">
2092
+ <a href="#computeResourceClosure--digestBytes--closureContains" class="md-nav__link">
2093
+ <span class="md-ellipsis">
2094
+
2095
+ computeResourceClosure / digestBytes / closureContains
2096
+
2097
+ </span>
2098
+ </a>
2099
+
2100
+ </li>
2101
+
2102
+ </ul>
2103
+ </nav>
2104
+
2105
+ </li>
2106
+
2107
+ <li class="md-nav__item">
2108
+ <a href="#请求管线-foundationharnessrequest-processing" class="md-nav__link">
2109
+ <span class="md-ellipsis">
2110
+
2111
+ 请求管线 (foundation.harness.request-processing)
2112
+
2113
+ </span>
2114
+ </a>
2115
+
2116
+ <nav class="md-nav" aria-label="请求管线 (foundation.harness.request-processing)">
2117
+ <ul class="md-nav__list">
2118
+
2119
+ <li class="md-nav__item">
2120
+ <a href="#parseRequest--processRequest" class="md-nav__link">
2121
+ <span class="md-ellipsis">
2122
+
2123
+ parseRequest / processRequest
2124
+
2125
+ </span>
2126
+ </a>
2127
+
2128
+ </li>
2129
+
2130
+ </ul>
2131
+ </nav>
2132
+
2133
+ </li>
2134
+
2135
+ <li class="md-nav__item">
2136
+ <a href="#报告-foundationharnessreport" class="md-nav__link">
2137
+ <span class="md-ellipsis">
2138
+
2139
+ 报告 (foundation.harness.report)
2140
+
2141
+ </span>
2142
+ </a>
2143
+
2144
+ <nav class="md-nav" aria-label="报告 (foundation.harness.report)">
2145
+ <ul class="md-nav__list">
2146
+
2147
+ <li class="md-nav__item">
2148
+ <a href="#validateReportModel--renderReportMarkdown--computeResultDigest--computeModelDigest--digestReport--buildBinding--verifyBinding--checkReport--collectStyleWarnings" class="md-nav__link">
2149
+ <span class="md-ellipsis">
2150
+
2151
+ validateReportModel / renderReportMarkdown / computeResultDigest / computeModelDigest / digestReport / buildBinding / verifyBinding / checkReport / collectStyleWarnings
2152
+
2153
+ </span>
2154
+ </a>
2155
+
2156
+ </li>
2157
+
2158
+ </ul>
2159
+ </nav>
2160
+
2161
+ </li>
2162
+
2163
+ <li class="md-nav__item">
2164
+ <a href="#宿主适配机制-foundationharnesshost-adapter" class="md-nav__link">
2165
+ <span class="md-ellipsis">
2166
+
2167
+ 宿主适配机制 (foundation.harness.host-adapter)
2168
+
2169
+ </span>
2170
+ </a>
2171
+
2172
+ <nav class="md-nav" aria-label="宿主适配机制 (foundation.harness.host-adapter)">
2173
+ <ul class="md-nav__list">
2174
+
2175
+ <li class="md-nav__item">
2176
+ <a href="#normalizeAdapterSource--buildAdapterClosure--verifyAdapterBuildManifest--materializeAdapterBuild--probeVersionVector" class="md-nav__link">
2177
+ <span class="md-ellipsis">
2178
+
2179
+ normalizeAdapterSource / buildAdapterClosure / verifyAdapterBuildManifest / materializeAdapterBuild / probeVersionVector
2180
+
2181
+ </span>
2182
+ </a>
2183
+
2184
+ </li>
2185
+
2186
+ </ul>
2187
+ </nav>
2188
+
2189
+ </li>
2190
+
2191
+ <li class="md-nav__item">
2192
+ <a href="#持久状态底座-foundationharnessstate-store" class="md-nav__link">
2193
+ <span class="md-ellipsis">
2194
+
2195
+ 持久状态底座 (foundation.harness.state-store)
2196
+
2197
+ </span>
2198
+ </a>
2199
+
2200
+ <nav class="md-nav" aria-label="持久状态底座 (foundation.harness.state-store)">
2201
+ <ul class="md-nav__list">
2202
+
2203
+ <li class="md-nav__item">
2204
+ <a href="#openStateStore--appendEvent--readEvents--readSnapshot--writeSnapshot--verifyStateStore--rebuildSnapshot--inspectStateStoreLock--recoverStateStoreLock--closeStateStore--close" class="md-nav__link">
2205
+ <span class="md-ellipsis">
2206
+
2207
+ openStateStore / appendEvent / readEvents / readSnapshot / writeSnapshot / verifyStateStore / rebuildSnapshot / inspectStateStoreLock / recoverStateStoreLock / closeStateStore / close
2208
+
2209
+ </span>
2210
+ </a>
2211
+
2212
+ </li>
2213
+
2214
+ </ul>
2215
+ </nav>
2216
+
2217
+ </li>
2218
+
2219
+ <li class="md-nav__item">
2220
+ <a href="#机制错误-foundationharnesserrors" class="md-nav__link">
2221
+ <span class="md-ellipsis">
2222
+
2223
+ 机制错误 (foundation.harness.errors)
2224
+
2225
+ </span>
2226
+ </a>
2227
+
2228
+ <nav class="md-nav" aria-label="机制错误 (foundation.harness.errors)">
2229
+ <ul class="md-nav__list">
2230
+
2231
+ <li class="md-nav__item">
2232
+ <a href="#HarnessError--mechanismError--HARNESS_ERROR_KINDS" class="md-nav__link">
2233
+ <span class="md-ellipsis">
2234
+
2235
+ HarnessError / mechanismError / HARNESS_ERROR_KINDS
2236
+
2237
+ </span>
2238
+ </a>
2239
+
2240
+ </li>
2241
+
2242
+ </ul>
2243
+ </nav>
2244
+
2245
+ </li>
2246
+
2247
+ <li class="md-nav__item">
2248
+ <a href="#与机器事实层的互链" class="md-nav__link">
2249
+ <span class="md-ellipsis">
2250
+
2251
+ 与机器事实层的互链
2252
+
2253
+ </span>
2254
+ </a>
2255
+
2256
+ </li>
2257
+
2258
+ </ul>
2259
+
2260
+ </nav>
2261
+ </div>
2262
+ </div>
2263
+ </div>
2264
+
2265
+
2266
+
2267
+ <div class="md-content" data-md-component="content">
2268
+
2269
+ <article class="md-content__inner md-typeset">
2270
+
2271
+
2272
+
2273
+
2274
+
2275
+ <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
+ <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>
2278
+ <p>能力分组(与 <code>docs/agents/capability-catalog.json</code> 对应):</p>
2279
+ <ul>
2280
+ <li><a href="#契约校验-foundationharnesscontract-validation">契约校验</a> → <code>validateContractDocument</code> / <code>getValidator</code></li>
2281
+ <li><a href="#路径收容-foundationharnesspath-containment">路径收容</a> → <code>classifyPathInput</code> / <code>resolveContained</code> / <code>readFileContained</code></li>
2282
+ <li><a href="#原子写-foundationharnessatomic-write">原子写</a> → <code>writeFileAtomic</code></li>
2283
+ <li><a href="#临时工作区-foundationharnesstemporary-workspace">临时工作区</a> → <code>TemporaryWorkspace</code> / <code>withTemporaryWorkspace</code></li>
2284
+ <li><a href="#资源闭包-foundationharnessresource-closure">资源闭包</a> → <code>computeResourceClosure</code> / <code>digestBytes</code> / <code>closureContains</code></li>
2285
+ <li><a href="#请求管线-foundationharnessrequest-processing">请求管线</a> → <code>parseRequest</code> / <code>processRequest</code></li>
2286
+ <li><a href="#报告-foundationharnessreport">报告</a> → <code>validateReportModel</code> / <code>renderReportMarkdown</code> / <code>buildBinding</code> / <code>verifyBinding</code> / <code>checkReport</code></li>
2287
+ <li><a href="#宿主适配机制-foundationharnesshost-adapter">宿主适配机制</a> → <code>normalizeAdapterSource</code> / <code>buildAdapterClosure</code> / <code>materializeAdapterBuild</code> / <code>probeVersionVector</code></li>
2288
+ <li><a href="#持久状态底座-foundationharnessstate-store">持久状态底座</a> → <code>openStateStore</code> / <code>appendEvent</code> / <code>readSnapshot</code> / <code>verifyStateStore</code> …</li>
2289
+ <li><a href="#机制错误-foundationharnesserrors">机制错误</a> → <code>HarnessError</code> / <code>mechanismError</code> / <code>HARNESS_ERROR_KINDS</code></li>
2290
+ </ul>
2291
+ <hr />
2292
+ <h2 id="契约校验-foundationharnesscontract-validation">契约校验 (foundation.harness.contract-validation)<a class="headerlink" href="#契约校验-foundationharnesscontract-validation" title="Permanent link">&para;</a></h2>
2293
+ <h3 id="validateContractDocument--getValidator--resolveSchemaContext--validatorCacheSize">validateContractDocument / getValidator / resolveSchemaContext / validatorCacheSize<a class="headerlink" href="#validateContractDocument--getValidator--resolveSchemaContext--validatorCacheSize" title="Permanent link">&para;</a></h3>
2294
+ <ul>
2295
+ <li>签名:</li>
2296
+ <li><code>validateContractDocument(document, { schemaId, dialect, policy = "strict" } = {})</code></li>
2297
+ <li><code>getValidator({ schemaId, dialect, policy = "strict" } = {})</code></li>
2298
+ <li><code>resolveSchemaContext({ schemaId, dialect, policy = "strict" } = {})</code></li>
2299
+ <li><code>validatorCacheSize()</code></li>
2300
+ <li>输入:schema 上下文或契约文档。</li>
2301
+ <li>输出:校验结果(语义同 Contracts <code>validateDocument</code>,但经 Node 运行时复用缓存);缓存大小查询。</li>
2302
+ <li>纯函数:否(<code>getValidator</code> / <code>validateContractDocument</code> 写入进程内以 schema 为键的校验器缓存)。</li>
2303
+ <li>副作用:进程内内存缓存校验器实例;无文件/Git/网络。</li>
2304
+ <li>稳定错误码与 <code>details.kind</code>:沿用 Contracts <code>SFC1001</code> / <code>SFC1002</code> / <code>SFC1006</code>;底层机制失败统一 <code>SFC2004</code> + <code>HARNESS_ERROR_KINDS</code> 的 <code>kind</code>(如 <code>INVALID_PATH</code>)。</li>
2305
+ <li>前置条件与信任锚:已安装 <code>skill-family-contracts</code>;Ajv 8.20.0。</li>
2306
+ <li><code>since</code> / <code>stability</code>:<code>0.2.0</code> / <code>stable</code>。</li>
2307
+ <li>源文件:<code>packages/skill-family-harness-node/src/validation.mjs</code>。</li>
2308
+ <li>正例/负例测试:<code>packages/skill-family-harness-node/test/validation.test.mjs</code>。</li>
2309
+ <li>调用方仍拥有的业务语义:契约业务字段语义(语义定义仍在 Contracts)。</li>
2310
+ </ul>
2311
+ <hr />
2312
+ <h2 id="路径收容-foundationharnesspath-containment">路径收容 (foundation.harness.path-containment)<a class="headerlink" href="#路径收容-foundationharnesspath-containment" title="Permanent link">&para;</a></h2>
2313
+ <h3 id="classifyPathInput--resolveContained--readFileContained">classifyPathInput / resolveContained / readFileContained<a class="headerlink" href="#classifyPathInput--resolveContained--readFileContained" title="Permanent link">&para;</a></h3>
2314
+ <ul>
2315
+ <li>签名:</li>
2316
+ <li><code>classifyPathInput(input, platform = process.platform)</code></li>
2317
+ <li><code>resolveContained(root, relPath)</code></li>
2318
+ <li><code>readFileContained(root, relPath, { encoding } = {})</code></li>
2319
+ <li>输入:根目录(收容边界)与待解析的相对/绝对路径。</li>
2320
+ <li>输出:受收容绝对路径或读到的文件内容。</li>
2321
+ <li>纯函数:<code>classifyPathInput</code> 是;<code>resolveContained</code> / <code>readFileContained</code> 为 <code>async</code>,含只读文件系统访问。</li>
2322
+ <li>副作用:只读文件系统访问(读取/解析);不写。</li>
2323
+ <li>稳定错误码与 <code>details.kind</code>:机制失败抛 <code>HarnessError</code>(<code>SFC2004</code>)+ <code>details.kind</code> ∈ <code>{PATH_TRAVERSAL, SYMLINK_ESCAPE, REALPATH_ESCAPE, INVALID_ROOT, ABSOLUTE_PATH, WINDOWS_DRIVE_PATH, WINDOWS_PATH, UNC_PATH, INVALID_PATH, READ_FAILED}</code>。</li>
2324
+ <li>前置条件与信任锚:调用方提供明确根目录;所有解析结果必须落在根目录内;Windows 盘符/UNC 逃逸同样拒绝。</li>
2325
+ <li><code>since</code> / <code>stability</code>:<code>0.2.0</code> / <code>stable</code>。</li>
2326
+ <li>源文件:<code>packages/skill-family-harness-node/src/paths.mjs</code>。</li>
2327
+ <li>正例/负例测试:<code>packages/skill-family-harness-node/test/containment.test.mjs</code>、<code>boundaries.test.mjs</code>。</li>
2328
+ <li>调用方仍拥有的业务语义:哪些路径是业务允许的选择规则(业务选择语义留在调用方)。</li>
2329
+ </ul>
2330
+ <hr />
2331
+ <h2 id="原子写-foundationharnessatomic-write">原子写 (foundation.harness.atomic-write)<a class="headerlink" href="#原子写-foundationharnessatomic-write" title="Permanent link">&para;</a></h2>
2332
+ <h3 id="writeFileAtomic">writeFileAtomic<a class="headerlink" href="#writeFileAtomic" title="Permanent link">&para;</a></h3>
2333
+ <ul>
2334
+ <li>签名:<code>writeFileAtomic(root, relPath, data, { mode = 0o644 } = {})</code>(async)</li>
2335
+ <li>输入:已收容目标路径、文件内容(<code>string</code> 或 <code>Buffer</code>)。</li>
2336
+ <li>输出:写入完成的文件,字节与输入一致。</li>
2337
+ <li>纯函数:否(落盘)。</li>
2338
+ <li>副作用:在根目录内创建临时文件,先 <code>fsync</code> 再 <code>rename</code> 覆盖目标;失败时回滚临时文件、不留残影。</li>
2339
+ <li>稳定错误码与 <code>details.kind</code>:越界路径抛 <code>SFC2004</code> + <code>PATH_TRAVERSAL</code>/越界类 <code>kind</code>;非法数据类型 / 写失败 <code>+ ATOMIC_WRITE_FAILED</code>。</li>
2340
+ <li>前置条件与信任锚:目标路径经 <code>path-containment</code> 验证在根目录内。</li>
2341
+ <li><code>since</code> / <code>stability</code>:<code>0.2.0</code> / <code>stable</code>。</li>
2342
+ <li>源文件:<code>packages/skill-family-harness-node/src/atomic.mjs</code>。</li>
2343
+ <li>正例/负例测试:<code>packages/skill-family-harness-node/test/atomic.test.mjs</code>。</li>
2344
+ <li>调用方仍拥有的业务语义:写入内容的业务正确性。</li>
2345
+ </ul>
2346
+ <hr />
2347
+ <h2 id="临时工作区-foundationharnesstemporary-workspace">临时工作区 (foundation.harness.temporary-workspace)<a class="headerlink" href="#临时工作区-foundationharnesstemporary-workspace" title="Permanent link">&para;</a></h2>
2348
+ <h3 id="TemporaryWorkspace--createTemporaryWorkspace--withTemporaryWorkspace">TemporaryWorkspace / createTemporaryWorkspace / withTemporaryWorkspace<a class="headerlink" href="#TemporaryWorkspace--createTemporaryWorkspace--withTemporaryWorkspace" title="Permanent link">&para;</a></h3>
2349
+ <ul>
2350
+ <li>签名:</li>
2351
+ <li><code>class TemporaryWorkspace</code>(构造 <code>(options)</code>)</li>
2352
+ <li><code>createTemporaryWorkspace(options)</code>(async)</li>
2353
+ <li><code>withTemporaryWorkspace(fn, options)</code>(async,回调式生命周期)</li>
2354
+ <li>输入:可选前缀/标签。</li>
2355
+ <li>输出:临时工作目录句柄;<code>with</code> 在回调结束后清理。</li>
2356
+ <li>纯函数:否(创建并删除系统临时目录子目录)。</li>
2357
+ <li>副作用:在宿主临时目录创建子目录,退出/异常时删除;不持久化。</li>
2358
+ <li>稳定错误码与 <code>details.kind</code>:创建失败 <code>+ WORKSPACE_CREATE_FAILED</code>;清理失败 <code>+ WORKSPACE_DISPOSE_FAILED</code>;已释放后使用 <code>+ WORKSPACE_DISPOSED</code>。</li>
2359
+ <li>前置条件与信任锚:宿主提供可写临时目录(如 <code>os.tmpdir</code>);路径不逃逸出宿主临时根。</li>
2360
+ <li><code>since</code> / <code>stability</code>:<code>0.2.0</code> / <code>stable</code>。</li>
2361
+ <li>源文件:<code>packages/skill-family-harness-node/src/workspace.mjs</code>。</li>
2362
+ <li>正例/负例测试:<code>packages/skill-family-harness-node/test/workspace.test.mjs</code>。</li>
2363
+ <li>调用方仍拥有的业务语义:临时产物的最终去处(持久态转 <code>state-store</code>)。</li>
2364
+ </ul>
2365
+ <hr />
2366
+ <h2 id="资源闭包-foundationharnessresource-closure">资源闭包 (foundation.harness.resource-closure)<a class="headerlink" href="#资源闭包-foundationharnessresource-closure" title="Permanent link">&para;</a></h2>
2367
+ <h3 id="computeResourceClosure--digestBytes--closureContains">computeResourceClosure / digestBytes / closureContains<a class="headerlink" href="#computeResourceClosure--digestBytes--closureContains" title="Permanent link">&para;</a></h3>
2368
+ <ul>
2369
+ <li>签名:</li>
2370
+ <li><code>computeResourceClosure({ root, resources } = {})</code>(async)</li>
2371
+ <li><code>digestBytes(bytes)</code></li>
2372
+ <li><code>closureContains(closure, relPath)</code></li>
2373
+ <li>输入:资源列表(路径 + 内容)。</li>
2374
+ <li>输出:确定性闭包对象与 sha256 摘要;<code>closureContains</code> 判定某相对路径是否在闭包内。</li>
2375
+ <li>纯函数:<code>digestBytes</code> / <code>closureContains</code> 是;<code>computeResourceClosure</code> 含按 <code>root</code> 读取资源,属受控只读。</li>
2376
+ <li>副作用:按 <code>root</code> 只读读取资源;不写。</li>
2377
+ <li>稳定错误码与 <code>details.kind</code>:非法/重复资源声明抛 <code>SFC2004</code> + <code>CLOSURE_CONFLICT</code> / <code>MISSING_RESOURCE</code>。</li>
2378
+ <li>前置条件与信任锚:资源为可序列化文本条目(二进制投影明确 unsupported);去重与排序固定。</li>
2379
+ <li><code>since</code> / <code>stability</code>:<code>0.2.0</code> / <code>stable</code>。</li>
2380
+ <li>源文件:<code>packages/skill-family-harness-node/src/closure.mjs</code>。</li>
2381
+ <li>正例/负例测试:<code>packages/skill-family-harness-node/test/closure.test.mjs</code>。</li>
2382
+ <li>调用方仍拥有的业务语义:资源业务含义。</li>
2383
+ </ul>
2384
+ <hr />
2385
+ <h2 id="请求管线-foundationharnessrequest-processing">请求管线 (foundation.harness.request-processing)<a class="headerlink" href="#请求管线-foundationharnessrequest-processing" title="Permanent link">&para;</a></h2>
2386
+ <h3 id="parseRequest--processRequest">parseRequest / processRequest<a class="headerlink" href="#parseRequest--processRequest" title="Permanent link">&para;</a></h3>
2387
+ <ul>
2388
+ <li>签名:</li>
2389
+ <li><code>parseRequest(raw)</code></li>
2390
+ <li><code>processRequest(raw, { now = () =&gt; new Date() } = {})</code>(async)</li>
2391
+ <li>输入:原始请求负载(应符合 kernel 协议结构)。</li>
2392
+ <li>输出:规范化 <code>operation-request</code> 与终态 <code>operation-result</code>(终态集合固定为 <code>REJECTED</code> / <code>FAILED</code> / <code>SUCCESS</code>)。</li>
2393
+ <li>纯函数:<code>parseRequest</code> 是;<code>processRequest</code> 为纯函数管线(无外部副作用,默认 <code>now</code> 可注入以保证确定性测试)。</li>
2394
+ <li>副作用:无文件/Git/网络。</li>
2395
+ <li>稳定错误码与 <code>details.kind</code>:解析失败进入 <code>REJECTED</code>/<code>FAILED</code> 终态并带 <code>SFC2002</code> / <code>SFC2003</code> / <code>SFC2004</code>;机制失败 <code>+ EXECUTION_FAILED</code> <code>kind</code>。</li>
2396
+ <li>前置条件与信任锚:请求符合 kernel 协议结构;业务语义由消费者拥有。</li>
2397
+ <li><code>since</code> / <code>stability</code>:<code>0.2.0</code> / <code>stable</code>。</li>
2398
+ <li>源文件:<code>packages/skill-family-harness-node/src/request.mjs</code>。</li>
2399
+ <li>正例/负例测试:<code>packages/skill-family-harness-node/test/request.test.mjs</code>。</li>
2400
+ <li>调用方仍拥有的业务语义:操作的具体业务语义(状态机/重试转 <code>loop-agent</code>)。</li>
2401
+ </ul>
2402
+ <hr />
2403
+ <h2 id="报告-foundationharnessreport">报告 (foundation.harness.report)<a class="headerlink" href="#报告-foundationharnessreport" title="Permanent link">&para;</a></h2>
2404
+ <h3 id="validateReportModel--renderReportMarkdown--computeResultDigest--computeModelDigest--digestReport--buildBinding--verifyBinding--checkReport--collectStyleWarnings">validateReportModel / renderReportMarkdown / computeResultDigest / computeModelDigest / digestReport / buildBinding / verifyBinding / checkReport / collectStyleWarnings<a class="headerlink" href="#validateReportModel--renderReportMarkdown--computeResultDigest--computeModelDigest--digestReport--buildBinding--verifyBinding--checkReport--collectStyleWarnings" title="Permanent link">&para;</a></h3>
2405
+ <ul>
2406
+ <li>签名(节选):</li>
2407
+ <li><code>validateReportModel(reportModel, { resultDocument } = {})</code></li>
2408
+ <li><code>renderReportMarkdown(model)</code></li>
2409
+ <li><code>computeResultDigest(resultDocument)</code> / <code>computeModelDigest(reportModel)</code> / <code>digestReport(reportMarkdown)</code></li>
2410
+ <li><code>buildBinding(reportModel, resultDocument, reportMarkdown)</code></li>
2411
+ <li><code>verifyBinding(binding, { reportModel, resultDocument, reportMarkdown } = {})</code></li>
2412
+ <li><code>checkReport({ reportMarkdown, reportModel, resultDocument, binding } = {})</code></li>
2413
+ <li><code>collectStyleWarnings(reportMarkdown)</code></li>
2414
+ <li>输入:<code>report-model</code>、渲染选项(<code>locale</code> / <code>audience</code> / <code>style</code>);<code>SUPPORTED_REPORT_LOCALES = [zh-CN, en-US]</code>。</li>
2415
+ <li>输出:Markdown 文本、绑定对象、分级检查发现;人类报告由机器结果派生,禁止自由撰写。</li>
2416
+ <li>纯函数:是(无时钟、无环境、无网络、无模型调用)。</li>
2417
+ <li>副作用:无文件/Git/网络。</li>
2418
+ <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>
2420
+ <li><code>since</code> / <code>stability</code>:<code>0.2.0</code> / <code>stable</code>。</li>
2421
+ <li>源文件:<code>packages/skill-family-harness-node/src/report.mjs</code>。</li>
2422
+ <li>正例/负例测试:<code>packages/skill-family-harness-node/test/report.test.mjs</code>。</li>
2423
+ <li>调用方仍拥有的业务语义:报告业务结论的解读(编排由 Kit <code>report</code> 子动作负责)。</li>
2424
+ </ul>
2425
+ <hr />
2426
+ <h2 id="宿主适配机制-foundationharnesshost-adapter">宿主适配机制 (foundation.harness.host-adapter)<a class="headerlink" href="#宿主适配机制-foundationharnesshost-adapter" title="Permanent link">&para;</a></h2>
2427
+ <h3 id="normalizeAdapterSource--buildAdapterClosure--verifyAdapterBuildManifest--materializeAdapterBuild--probeVersionVector">normalizeAdapterSource / buildAdapterClosure / verifyAdapterBuildManifest / materializeAdapterBuild / probeVersionVector<a class="headerlink" href="#normalizeAdapterSource--buildAdapterClosure--verifyAdapterBuildManifest--materializeAdapterBuild--probeVersionVector" title="Permanent link">&para;</a></h3>
2428
+ <ul>
2429
+ <li>签名:</li>
2430
+ <li><code>normalizeAdapterSource(input)</code></li>
2431
+ <li><code>buildAdapterClosure({ hostId, pathCategory, input } = {})</code></li>
2432
+ <li><code>verifyAdapterBuildManifest(manifestInput, { hostId, pathCategory } = {})</code></li>
2433
+ <li><code>materializeAdapterBuild({ targetRoot, build, writer = writeFileAtomic } = {})</code>(async)</li>
2434
+ <li><code>probeVersionVector({ hostId, capabilities, executable, argv, allowSpawn = false, timeoutMs = 5000, runner = spawnSync } = {})</code>(async)</li>
2435
+ <li>输入:adapter source、目标路径、probe 选项。</li>
2436
+ <li>输出:构建闭包、校验后的清单、materialize 产物、版本向量。</li>
2437
+ <li>纯函数:<code>normalizeAdapterSource</code> / <code>buildAdapterClosure</code> / <code>verifyAdapterBuildManifest</code> 是;<code>materializeAdapterBuild</code> / <code>probeVersionVector</code> 含落盘或进程调用。</li>
2438
+ <li>副作用:<code>materializeAdapterBuild</code> 在受收容目标创建 sibling staging 并单次 rename;<code>probeVersionVector</code> 默认 <code>allowSpawn=false</code>,不取 PATH、不自动执行宿主二进制。</li>
2439
+ <li>稳定错误码与 <code>details.kind</code>:清单摘要不符 <code>+ MANIFEST_MISMATCH</code>;目标已存在 <code>+ PORTABLE_PATH_COLLISION</code>;非受信可执行文件 <code>+ UNTRUSTED_EXECUTABLE</code>;构建/探测失败 <code>+ HOST_BUILD_FAILED</code> / <code>HOST_PROBE_FAILED</code>;契约不符 <code>+ HOST_CONTRACT_INVALID</code>;以上均包于 <code>SFC2004</code>。</li>
2440
+ <li>前置条件与信任锚:adapter source 为已声明文本闭包(<code>content</code> 类型固定 <code>string</code>,仅 utf8;二进制投影 unsupported);受信可执行文件方可 materialize。</li>
2441
+ <li><code>since</code> / <code>stability</code>:<code>0.2.0</code> / <code>stable</code>。</li>
2442
+ <li>源文件:<code>packages/skill-family-harness-node/src/host.mjs</code>。</li>
2443
+ <li>正例/负例测试:<code>packages/skill-family-harness-node/test/host.test.mjs</code>。</li>
2444
+ <li>调用方仍拥有的业务语义:宿主具体业务语义(<code>host apply</code> 明确 unsupported,转 Profile + Kit <code>host</code> 子动作)。</li>
2445
+ </ul>
2446
+ <hr />
2447
+ <h2 id="持久状态底座-foundationharnessstate-store">持久状态底座 (foundation.harness.state-store)<a class="headerlink" href="#持久状态底座-foundationharnessstate-store" title="Permanent link">&para;</a></h2>
2448
+ <h3 id="openStateStore--appendEvent--readEvents--readSnapshot--writeSnapshot--verifyStateStore--rebuildSnapshot--inspectStateStoreLock--recoverStateStoreLock--closeStateStore--close">openStateStore / appendEvent / readEvents / readSnapshot / writeSnapshot / verifyStateStore / rebuildSnapshot / inspectStateStoreLock / recoverStateStoreLock / closeStateStore / close<a class="headerlink" href="#openStateStore--appendEvent--readEvents--readSnapshot--writeSnapshot--verifyStateStore--rebuildSnapshot--inspectStateStoreLock--recoverStateStoreLock--closeStateStore--close" title="Permanent link">&para;</a></h3>
2449
+ <ul>
2450
+ <li>签名(节选):</li>
2451
+ <li><code>openStateStore(root, { owner, payloadSchemas, clock } = {})</code>(async)</li>
2452
+ <li><code>appendEvent(store, event)</code>(async)</li>
2453
+ <li><code>readEvents(store, { afterSequence = 0 } = {})</code>(async)</li>
2454
+ <li><code>readSnapshot(store, { reducer, initial = null } = {})</code>(async)</li>
2455
+ <li><code>writeSnapshot(store, state, { hostSessionRef, reducer, initial = null } = {})</code>(async)</li>
2456
+ <li><code>verifyStateStore(store, { reducer, initial = null } = {})</code>(async)</li>
2457
+ <li><code>rebuildSnapshot(store, reducer, { initial = null } = {})</code>(async)</li>
2458
+ <li><code>inspectStateStoreLock(root, { clock } = {})</code>(async)</li>
2459
+ <li><code>recoverStateStoreLock(root, { ... } = {})</code>(async)</li>
2460
+ <li><code>closeStateStore(store)</code> / <code>close(store)</code>(async)</li>
2461
+ <li>输入:事件负载、快照、锁令牌。</li>
2462
+ <li>输出:事件、hash chain 校验结果、快照;<code>STATE_GENESIS_DIGEST</code> 作为链起点。</li>
2463
+ <li>纯函数:否(读写事件日志与快照文件,写协作式单写者锁)。</li>
2464
+ <li>副作用:在受收容路径读写事件日志与快照;写锁文件用于本地协作式单写者。</li>
2465
+ <li>稳定错误码与 <code>details.kind</code>:hash chain 断裂 <code>+ CHAIN_BROKEN</code>;锁 fencing 冲突 <code>+ STORE_LOCKED</code>;锁损坏 <code>+ LOCK_CORRUPT</code>;恢复拒绝 <code>+ LOCK_RECOVERY_REFUSED</code>;非法事件 <code>+ UNSAFE_STATE_ENTRY</code> / <code>EVENT_SCHEMA_INVALID</code>;重复序号 <code>+ DUPLICATE_SEQUENCE</code>;幂等冲突 <code>+ IDEMPOTENCY_CONFLICT</code>;快照不一致 <code>+ SNAPSHOT_MISMATCH</code>;已关闭 <code>+ STORE_CLOSED</code>;以上均包于 <code>SFC2004</code>。</li>
2466
+ <li>前置条件与信任锚:事件日志为唯一权威,snapshot 为派生缓存;fencing 不承诺抵御同权限恶意进程;<code>confirmOwnerTerminated</code> 信任锚由调用方提供。</li>
2467
+ <li><code>since</code> / <code>stability</code>:<code>0.2.0</code> / <code>stable</code>。</li>
2468
+ <li>源文件:<code>packages/skill-family-harness-node/src/state-store.mjs</code>。</li>
2469
+ <li>正例/负例测试:<code>packages/skill-family-harness-node/test/state-store.test.mjs</code>。</li>
2470
+ <li>调用方仍拥有的业务语义:事件业务含义、reducer 转移、owner-terminated 信任锚(业务状态机/终态转 <code>loop-agent</code>)。</li>
2471
+ </ul>
2472
+ <hr />
2473
+ <h2 id="机制错误-foundationharnesserrors">机制错误 (foundation.harness.errors)<a class="headerlink" href="#机制错误-foundationharnesserrors" title="Permanent link">&para;</a></h2>
2474
+ <h3 id="HarnessError--mechanismError--HARNESS_ERROR_KINDS">HarnessError / mechanismError / HARNESS_ERROR_KINDS<a class="headerlink" href="#HarnessError--mechanismError--HARNESS_ERROR_KINDS" title="Permanent link">&para;</a></h3>
2475
+ <ul>
2476
+ <li>签名:</li>
2477
+ <li><code>class HarnessError extends ContractsError</code>(构造 <code>(code, message, details)</code>,未登记码立即抛 <code>TypeError</code>)</li>
2478
+ <li><code>mechanismError(kind, message, extraDetails)</code>(返回 <code>SFC2004</code> + 稳定 <code>details.kind</code>)</li>
2479
+ <li><code>HARNESS_ERROR_KINDS</code>(冻结对象)</li>
2480
+ <li>输入:错误 <code>kind</code>、上下文。</li>
2481
+ <li>输出:带稳定 <code>kind</code> 的错误对象;非法 <code>kind</code> 抛 <code>TypeError</code>。</li>
2482
+ <li>纯函数:是。</li>
2483
+ <li>副作用:无。</li>
2484
+ <li>稳定错误码与 <code>details.kind</code>:本模块不发明新码——机制失败统一 <code>SFC2004</code>(<code>EXECUTION_FAILED</code>),其注册含义为「机制运行时执行合规操作时失败;details 携带机制证据」;<code>details.kind</code> 取下列冻结枚举之一。</li>
2485
+ <li>前置条件与信任锚:<code>HARNESS_ERROR_KINDS</code> 冻结,新增 SFC 码属 Contracts 变更(不在本包写集)。</li>
2486
+ <li><code>since</code> / <code>stability</code>:<code>0.2.0</code> / <code>stable</code>。</li>
2487
+ <li>源文件:<code>packages/skill-family-harness-node/src/errors.mjs</code>。</li>
2488
+ <li>正例/负例测试:<code>packages/skill-family-harness-node/test/boundary.test.mjs</code>、<code>boundaries.test.mjs</code>。</li>
2489
+ <li>调用方仍拥有的业务语义:错误业务归因。</li>
2490
+ </ul>
2491
+ <p><code>HARNESS_ERROR_KINDS</code> 冻结枚举(v1):</p>
2492
+ <table>
2493
+ <thead>
2494
+ <tr>
2495
+ <th>kind</th>
2496
+ <th>含义</th>
2497
+ </tr>
2498
+ </thead>
2499
+ <tbody>
2500
+ <tr>
2501
+ <td><code>invalid-path</code> / <code>absolute-path</code> / <code>windows-drive-path</code> / <code>windows-path</code> / <code>unc-path</code></td>
2502
+ <td>路径形态非法</td>
2503
+ </tr>
2504
+ <tr>
2505
+ <td><code>path-traversal</code> / <code>symlink-escape</code> / <code>realpath-escape</code></td>
2506
+ <td>收容逃逸</td>
2507
+ </tr>
2508
+ <tr>
2509
+ <td><code>invalid-root</code></td>
2510
+ <td>根目录非法</td>
2511
+ </tr>
2512
+ <tr>
2513
+ <td><code>atomic-write-failed</code> / <code>read-failed</code></td>
2514
+ <td>文件读写失败</td>
2515
+ </tr>
2516
+ <tr>
2517
+ <td><code>missing-resource</code></td>
2518
+ <td>资源缺失</td>
2519
+ </tr>
2520
+ <tr>
2521
+ <td><code>workspace-create-failed</code> / <code>workspace-dispose-failed</code> / <code>workspace-disposed</code></td>
2522
+ <td>临时工作区异常</td>
2523
+ </tr>
2524
+ <tr>
2525
+ <td><code>closure-conflict</code> / <code>unsupported-policy</code></td>
2526
+ <td>闭包/策略冲突</td>
2527
+ </tr>
2528
+ <tr>
2529
+ <td><code>execution-failed</code> / <code>invalid-result</code></td>
2530
+ <td>执行/结果异常</td>
2531
+ </tr>
2532
+ <tr>
2533
+ <td><code>store-closed</code> / <code>store-locked</code> / <code>lock-corrupt</code> / <code>lock-recovery-refused</code></td>
2534
+ <td>状态锁异常</td>
2535
+ </tr>
2536
+ <tr>
2537
+ <td><code>unsafe-state-entry</code> / <code>event-schema-invalid</code> / <code>duplicate-sequence</code> / <code>idempotency-conflict</code> / <code>chain-broken</code> / <code>snapshot-mismatch</code></td>
2538
+ <td>状态事件异常</td>
2539
+ </tr>
2540
+ <tr>
2541
+ <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
+ <td>宿主适配异常</td>
2543
+ </tr>
2544
+ </tbody>
2545
+ </table>
2546
+ <hr />
2547
+ <h2 id="与机器事实层的互链">与机器事实层的互链<a class="headerlink" href="#与机器事实层的互链" title="Permanent link">&para;</a></h2>
2548
+ <ul>
2549
+ <li>能力稳定 ID 见 <code>docs/agents/capability-catalog.json</code>(<code>foundation.harness.*</code>)。</li>
2550
+ <li>机械校验:<code>scripts/docs/capability-catalog-check.mjs</code> 解析 <code>src/index.mjs</code>,拒绝引用不存在的入口。</li>
2551
+ </ul>
2552
+
2553
+
2554
+
2555
+
2556
+
2557
+
2558
+
2559
+
2560
+
2561
+
2562
+
2563
+
2564
+
2565
+ </article>
2566
+ </div>
2567
+
2568
+
2569
+ <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
2570
+ </div>
2571
+
2572
+ </main>
2573
+
2574
+ <footer class="md-footer">
2575
+
2576
+ <div class="md-footer-meta md-typeset">
2577
+ <div class="md-footer-meta__inner md-grid">
2578
+ <div class="md-copyright">
2579
+
2580
+
2581
+ Made with
2582
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
2583
+ Material for MkDocs
2584
+ </a>
2585
+
2586
+ </div>
2587
+
2588
+ </div>
2589
+ </div>
2590
+ </footer>
2591
+
2592
+ </div>
2593
+ <div class="md-dialog" data-md-component="dialog">
2594
+ <div class="md-dialog__inner md-typeset"></div>
2595
+ </div>
2596
+
2597
+
2598
+
2599
+
2600
+
2601
+ <script id="__config" type="application/json">{"annotate": null, "base": "../../..", "features": [], "search": "../../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "\u5df2\u590d\u5236", "clipboard.copy": "\u590d\u5236", "search.result.more.one": "\u5728\u8be5\u9875\u4e0a\u8fd8\u6709 1 \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.more.other": "\u5728\u8be5\u9875\u4e0a\u8fd8\u6709 # \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.none": "\u6ca1\u6709\u627e\u5230\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.one": "\u627e\u5230 1 \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.other": "# \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.placeholder": "\u952e\u5165\u4ee5\u5f00\u59cb\u641c\u7d22", "search.result.term.missing": "\u7f3a\u5c11", "select.version": "\u9009\u62e9\u5f53\u524d\u7248\u672c"}, "version": null}</script>
2602
+
2603
+
2604
+ <script src="../../../assets/javascripts/bundle.d7400e89.min.js"></script>
2605
+
2606
+
2607
+ </body>
2608
+ </html>