@kungfu-tech/buildchain 2.10.2 → 2.10.3

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.
@@ -2061,9 +2061,9 @@
2061
2061
  "cliRegistryPath": "dist/site/cli-registry.json",
2062
2062
  "workflowRegistryPath": "dist/site/workflow-registry.json",
2063
2063
  "pageRegistryPath": "dist/site/page-registry.json",
2064
- "cliRegistryDigest": "d86d5cc6f0ef0e711a81edc8dec6178cd3f16f0c46ec4fdadbe8133bdc69789d",
2065
- "workflowRegistryDigest": "a53dd3b746f8d697eaa79fb23efcbbeaa6018efb2c3af0d875526ab6bef939ad",
2066
- "pageRegistryDigest": "31d865289f7b62a44db869d1d323c11d5c4b2ebd248912e0545580f070d0a5d5"
2064
+ "cliRegistryDigest": "281c186e9dbdf45e55e8afcd59cfee66518f42c146d1b79dfd8837048c00bec8",
2065
+ "workflowRegistryDigest": "b24b2a68ae83941cbb6a719a62b4eafbd0f5e859e5810ae766ce9a5db69ddfae",
2066
+ "pageRegistryDigest": "c3be81db06f3a183ce53cd0e9199b88be9c8b1d615c395f7fdbfac139796c455"
2067
2067
  },
2068
2068
  "comparison": {
2069
2069
  "missingCliRegistry": [],
@@ -31,6 +31,7 @@
31
31
  "./site/buildchain-site.json": "./dist/site/buildchain-site.json",
32
32
  "./site/site-manifest.json": "./dist/site/site-manifest.json",
33
33
  "./site/page-registry.json": "./dist/site/page-registry.json",
34
+ "./site/capability-registry.json": "./dist/site/capability-registry.json",
34
35
  "./site/cli-registry.json": "./dist/site/cli-registry.json",
35
36
  "./site/manual-registry.json": "./dist/site/manual-registry.json",
36
37
  "./site/node-api-registry.json": "./dist/site/node-api-registry.json",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "contract": "kungfu-buildchain-site-manifest",
4
- "generatedAt": "2026-07-08T08:27:16.923Z",
5
- "publishedAt": "2026-07-08T08:27:16.923Z",
4
+ "generatedAt": "2026-07-08T10:30:54.924Z",
5
+ "publishedAt": "2026-07-08T10:30:54.924Z",
6
6
  "reproducible": true,
7
7
  "timestampPolicy": "ci-injected",
8
8
  "deterministicInputs": [
@@ -19,7 +19,7 @@
19
19
  "declared Buildchain surface manifest contract"
20
20
  ],
21
21
  "sourceDateEpoch": "0",
22
- "sourceRevision": "04fc1e0ec35cfd1d47dbfa67eeabae6cf1f042bd",
22
+ "sourceRevision": "c01d56a7410ded5f631a83950227873cef32c37b",
23
23
  "timestampPolicyDetails": {
24
24
  "contract": "kungfu-buildchain-surface-timestamp-policy",
25
25
  "timestampFields": [
@@ -37,7 +37,7 @@
37
37
  },
38
38
  "package": {
39
39
  "name": "@kungfu-tech/buildchain",
40
- "version": "2.10.2",
40
+ "version": "2.10.3",
41
41
  "versionSource": "package.json#version"
42
42
  },
43
43
  "entrypoint": "buildchain-site.json",
@@ -53,7 +53,7 @@
53
53
  "path": "docs/MAP.md",
54
54
  "plane": "use",
55
55
  "exists": true,
56
- "digest": "sha256:3712026dcfcf44c16bc4def2acf246caee1ec036543c0fea265fa17b19d4de31"
56
+ "digest": "sha256:67a0e6b63a943904eacbf7d26227e3c9ad650d17e8aa937c40b3fdad8f389fdd"
57
57
  },
58
58
  {
59
59
  "id": "install",
@@ -71,6 +71,14 @@
71
71
  "exists": true,
72
72
  "digest": "sha256:75d8bade4b0b96b26941b11835c2debcdada8f1723412935fb8ae6884f08f9f3"
73
73
  },
74
+ {
75
+ "id": "release-candidate",
76
+ "title": "Release Candidate Passport",
77
+ "path": "docs/release-candidate.md",
78
+ "plane": "verify",
79
+ "exists": true,
80
+ "digest": "sha256:6b5107cded122925e8560a9b117ff1c96f5cf05d934caf83d7e4b2a4d777175e"
81
+ },
74
82
  {
75
83
  "id": "release-propagation",
76
84
  "title": "Release propagation",
@@ -133,7 +141,7 @@
133
141
  "path": "docs/site-bundle-contract.md",
134
142
  "plane": "use",
135
143
  "exists": true,
136
- "digest": "sha256:595ad74e82f179844da7bb3545b1fa7a0cd99c083160b7ed08861dfb5b2603ab"
144
+ "digest": "sha256:6b5bc2ee0f785b16d762f140f14a9163c07caf0d424200c2ececc74f7bb2271c"
137
145
  },
138
146
  {
139
147
  "id": "migration-inventory",
@@ -165,7 +173,7 @@
165
173
  "path": "docs/cli.md",
166
174
  "plane": "use",
167
175
  "exists": true,
168
- "digest": "sha256:85e014b7e053b74b620e5b438d54453e20b22f758a33dfd5ae970403fa41d9d7"
176
+ "digest": "sha256:2f55874feb9acecce1c471b96e07bb9a198a8da93efd0f859d69f353bf9c36a8"
169
177
  },
170
178
  {
171
179
  "id": "build-facts",
@@ -245,11 +253,12 @@
245
253
  "path": "docs/web-surface-deployments.md",
246
254
  "plane": "use",
247
255
  "exists": true,
248
- "digest": "sha256:3a11e4c38c058181ab6d36242a8898e13a3a452304838e806c2d1b86d1348a83"
256
+ "digest": "sha256:58673b84879a219572fe39aa8b4d01cfc34fabf664b3318753d61043821edaff"
249
257
  }
250
258
  ],
251
259
  "facts": [
252
260
  "page-registry.json",
261
+ "capability-registry.json",
253
262
  "cli-registry.json",
254
263
  "manual-registry.json",
255
264
  "node-api-registry.json",
@@ -58,6 +58,7 @@
58
58
  ],
59
59
  "inputCount": 48,
60
60
  "surface": "reusable-workflow",
61
+ "capabilityGroup": "api-cli-reference",
61
62
  "status": "active"
62
63
  },
63
64
  {
@@ -66,6 +67,7 @@
66
67
  "inputs": [],
67
68
  "inputCount": 0,
68
69
  "surface": "reusable-workflow",
70
+ "capabilityGroup": "api-cli-reference",
69
71
  "status": "active"
70
72
  },
71
73
  {
@@ -76,6 +78,7 @@
76
78
  ],
77
79
  "inputCount": 1,
78
80
  "surface": "reusable-workflow",
81
+ "capabilityGroup": "api-cli-reference",
79
82
  "status": "active"
80
83
  },
81
84
  {
@@ -88,6 +91,7 @@
88
91
  ],
89
92
  "inputCount": 3,
90
93
  "surface": "reusable-workflow",
94
+ "capabilityGroup": "api-cli-reference",
91
95
  "status": "active"
92
96
  },
93
97
  {
@@ -124,6 +128,7 @@
124
128
  ],
125
129
  "inputCount": 27,
126
130
  "surface": "reusable-workflow",
131
+ "capabilityGroup": "api-cli-reference",
127
132
  "status": "active"
128
133
  },
129
134
  {
@@ -174,6 +179,7 @@
174
179
  ],
175
180
  "inputCount": 41,
176
181
  "surface": "reusable-workflow",
182
+ "capabilityGroup": "api-cli-reference",
177
183
  "status": "active"
178
184
  },
179
185
  {
@@ -187,6 +193,7 @@
187
193
  ],
188
194
  "inputCount": 4,
189
195
  "surface": "reusable-workflow",
196
+ "capabilityGroup": "api-cli-reference",
190
197
  "status": "active"
191
198
  },
192
199
  {
@@ -200,6 +207,7 @@
200
207
  ],
201
208
  "inputCount": 4,
202
209
  "surface": "reusable-workflow",
210
+ "capabilityGroup": "api-cli-reference",
203
211
  "status": "active"
204
212
  },
205
213
  {
@@ -222,6 +230,7 @@
222
230
  ],
223
231
  "inputCount": 13,
224
232
  "surface": "reusable-workflow",
233
+ "capabilityGroup": "api-cli-reference",
225
234
  "status": "active"
226
235
  },
227
236
  {
@@ -235,6 +244,7 @@
235
244
  ],
236
245
  "inputCount": 4,
237
246
  "surface": "reusable-workflow",
247
+ "capabilityGroup": "api-cli-reference",
238
248
  "status": "active"
239
249
  },
240
250
  {
@@ -272,6 +282,7 @@
272
282
  ],
273
283
  "inputCount": 28,
274
284
  "surface": "reusable-workflow",
285
+ "capabilityGroup": "api-cli-reference",
275
286
  "status": "active"
276
287
  },
277
288
  {
@@ -284,6 +295,7 @@
284
295
  ],
285
296
  "inputCount": 3,
286
297
  "surface": "reusable-workflow",
298
+ "capabilityGroup": "api-cli-reference",
287
299
  "status": "active"
288
300
  },
289
301
  {
@@ -298,6 +310,7 @@
298
310
  ],
299
311
  "inputCount": 5,
300
312
  "surface": "reusable-workflow",
313
+ "capabilityGroup": "api-cli-reference",
301
314
  "status": "active"
302
315
  },
303
316
  {
@@ -309,6 +322,7 @@
309
322
  ],
310
323
  "inputCount": 2,
311
324
  "surface": "release-passport",
325
+ "capabilityGroup": "api-cli-reference",
312
326
  "status": "active"
313
327
  },
314
328
  {
@@ -319,6 +333,7 @@
319
333
  ],
320
334
  "inputCount": 1,
321
335
  "surface": "repository-workflow",
336
+ "capabilityGroup": "api-cli-reference",
322
337
  "status": "repository-internal"
323
338
  },
324
339
  {
@@ -330,6 +345,7 @@
330
345
  ],
331
346
  "inputCount": 2,
332
347
  "surface": "repository-patrol",
348
+ "capabilityGroup": "governance-versioning",
333
349
  "status": "active"
334
350
  },
335
351
  {
@@ -341,6 +357,7 @@
341
357
  ],
342
358
  "inputCount": 2,
343
359
  "surface": "repository-patrol",
360
+ "capabilityGroup": "governance-versioning",
344
361
  "status": "active"
345
362
  },
346
363
  {
@@ -352,6 +369,7 @@
352
369
  ],
353
370
  "inputCount": 2,
354
371
  "surface": "repository-patrol",
372
+ "capabilityGroup": "governance-versioning",
355
373
  "status": "active"
356
374
  },
357
375
  {
@@ -376,6 +394,7 @@
376
394
  ],
377
395
  "inputCount": 15,
378
396
  "surface": "repository-patrol",
397
+ "capabilityGroup": "governance-versioning",
379
398
  "status": "active"
380
399
  },
381
400
  {
@@ -388,6 +407,7 @@
388
407
  ],
389
408
  "inputCount": 3,
390
409
  "surface": "release-governance",
410
+ "capabilityGroup": "release-passport-trust",
391
411
  "status": "active"
392
412
  },
393
413
  {
@@ -401,6 +421,7 @@
401
421
  ],
402
422
  "inputCount": 4,
403
423
  "surface": "repository-workflow",
424
+ "capabilityGroup": "api-cli-reference",
404
425
  "status": "repository-internal"
405
426
  },
406
427
  {
@@ -416,6 +437,7 @@
416
437
  ],
417
438
  "inputCount": 6,
418
439
  "surface": "repository-workflow",
440
+ "capabilityGroup": "api-cli-reference",
419
441
  "status": "active"
420
442
  },
421
443
  {
@@ -437,6 +459,7 @@
437
459
  ],
438
460
  "inputCount": 12,
439
461
  "surface": "dev-governance",
462
+ "capabilityGroup": "governance-versioning",
440
463
  "status": "active"
441
464
  },
442
465
  {
@@ -448,6 +471,7 @@
448
471
  ],
449
472
  "inputCount": 2,
450
473
  "surface": "repository-workflow",
474
+ "capabilityGroup": "api-cli-reference",
451
475
  "status": "active"
452
476
  },
453
477
  {
@@ -469,6 +493,7 @@
469
493
  ],
470
494
  "inputCount": 12,
471
495
  "surface": "repository-patrol",
496
+ "capabilityGroup": "governance-versioning",
472
497
  "status": "active"
473
498
  },
474
499
  {
@@ -482,6 +507,7 @@
482
507
  ],
483
508
  "inputCount": 4,
484
509
  "surface": "repository-patrol",
510
+ "capabilityGroup": "governance-versioning",
485
511
  "status": "active"
486
512
  },
487
513
  {
@@ -495,6 +521,7 @@
495
521
  ],
496
522
  "inputCount": 4,
497
523
  "surface": "repository-patrol",
524
+ "capabilityGroup": "governance-versioning",
498
525
  "status": "active"
499
526
  },
500
527
  {
@@ -548,6 +575,7 @@
548
575
  ],
549
576
  "inputCount": 44,
550
577
  "surface": "release-governance",
578
+ "capabilityGroup": "reusable-build",
551
579
  "status": "active"
552
580
  },
553
581
  {
@@ -565,6 +593,7 @@
565
593
  ],
566
594
  "inputCount": 8,
567
595
  "surface": "release-governance",
596
+ "capabilityGroup": "release-passport-trust",
568
597
  "status": "active"
569
598
  },
570
599
  {
@@ -573,6 +602,7 @@
573
602
  "inputs": [],
574
603
  "inputCount": 0,
575
604
  "surface": "repository-workflow",
605
+ "capabilityGroup": "api-cli-reference",
576
606
  "status": "active"
577
607
  },
578
608
  {
@@ -595,6 +625,7 @@
595
625
  ],
596
626
  "inputCount": 13,
597
627
  "surface": "release-propagation",
628
+ "capabilityGroup": "site-and-propagation",
598
629
  "status": "preview"
599
630
  },
600
631
  {
@@ -603,6 +634,7 @@
603
634
  "inputs": [],
604
635
  "inputCount": 0,
605
636
  "surface": "repository-workflow",
637
+ "capabilityGroup": "api-cli-reference",
606
638
  "status": "active"
607
639
  },
608
640
  {
@@ -613,6 +645,7 @@
613
645
  ],
614
646
  "inputCount": 1,
615
647
  "surface": "repository-workflow",
648
+ "capabilityGroup": "api-cli-reference",
616
649
  "status": "active"
617
650
  },
618
651
  {
@@ -621,6 +654,7 @@
621
654
  "inputs": [],
622
655
  "inputCount": 0,
623
656
  "surface": "repository-workflow",
657
+ "capabilityGroup": "api-cli-reference",
624
658
  "status": "compatibility-fixture"
625
659
  },
626
660
  {
@@ -629,6 +663,7 @@
629
663
  "inputs": [],
630
664
  "inputCount": 0,
631
665
  "surface": "repository-workflow",
666
+ "capabilityGroup": "api-cli-reference",
632
667
  "status": "active"
633
668
  }
634
669
  ],
@@ -691,6 +726,7 @@
691
726
  "verification-command"
692
727
  ],
693
728
  "inputCount": 51,
729
+ "capabilityGroup": "release-passport-trust",
694
730
  "status": "active"
695
731
  },
696
732
  {
@@ -742,6 +778,7 @@
742
778
  "workflow"
743
779
  ],
744
780
  "inputCount": 43,
781
+ "capabilityGroup": "observability-diagnostics",
745
782
  "status": "active"
746
783
  },
747
784
  {
@@ -770,6 +807,7 @@
770
807
  "summary-path"
771
808
  ],
772
809
  "inputCount": 20,
810
+ "capabilityGroup": "reusable-build",
773
811
  "status": "active"
774
812
  },
775
813
  {
@@ -781,6 +819,7 @@
781
819
  "require-version-state"
782
820
  ],
783
821
  "inputCount": 3,
822
+ "capabilityGroup": "reusable-build",
784
823
  "status": "active"
785
824
  }
786
825
  ]
package/docs/MAP.md CHANGED
@@ -18,8 +18,27 @@ This package should be usable by an agent from the npm artifact alone. The
18
18
  machine-readable `dist/site/` bundle is the first fact source; the Markdown
19
19
  manuals explain those facts and give operator examples.
20
20
 
21
+ `dist/site/capability-registry.json` is the capability navigation entrypoint.
22
+ It groups the public surface into stable product areas so sites and agents do
23
+ not have to infer structure from file names. Each page, manual, CLI command,
24
+ workflow, action, and Node API export also carries a `capabilityGroup`,
25
+ `audience`, and `maturity` field in its own registry.
26
+
27
+ | Capability group | Primary facts | Primary manuals |
28
+ | --- | --- | --- |
29
+ | Getting Started | `capability-registry.json`, `product-mechanism.json` | [`install.md`](install.md), [`product-mechanism.md`](product-mechanism.md), [`cli.md`](cli.md) |
30
+ | Release Passport and Trust | `release-model.json`, `artifact-schemas.json`, `kfd-claims.json` | [`release-passport.md`](release-passport.md), [`release-candidate.md`](release-candidate.md), [`publish-transaction.md`](publish-transaction.md), [`binary-distribution.md`](binary-distribution.md) |
31
+ | Reusable Build and Lifecycle | `workflow-registry.json`, `release-model.json` | [`reusable-build-surface.md`](reusable-build-surface.md), [`lifecycle-protocol.md`](lifecycle-protocol.md) |
32
+ | KFD Trust and Surface Closure | `kfd-claims.json`, `public-surface-audit.json`, `cli-registry.json`, `node-api-registry.json` | [`kfd-support.md`](kfd-support.md), [`release-passport.md`](release-passport.md) |
33
+ | Site Bundle, Web Surfaces, and Propagation | `buildchain-site.json`, `site-manifest.json`, `page-registry.json`, `release-model.json` | [`site-bundle-contract.md`](site-bundle-contract.md), [`web-surface-deployments.md`](web-surface-deployments.md), [`release-propagation.md`](release-propagation.md) |
34
+ | Distribution Indexes and Badges | `badge-endpoint-registry.json`, `node-api-registry.json`, `manual-registry.json` | [`readme-badges.md`](readme-badges.md), [`homebrew.md`](homebrew.md) |
35
+ | Build Facts, Observability, and Diagnostics | `cli-registry.json`, `node-api-registry.json`, lifecycle artifacts | [`build-facts.md`](build-facts.md), [`toolkit-observability.md`](toolkit-observability.md), [`consumer-issue-reporting.md`](consumer-issue-reporting.md) |
36
+ | Governance, Versioning, and Runtime Drift | `buildchain-contract.json`, `workflow-registry.json`, `release-model.json` | [`release-governance.md`](release-governance.md), [`release-flow.md`](release-flow.md), [`versioning.md`](versioning.md), [`runtime-train-validation.md`](runtime-train-validation.md) |
37
+ | CLI and Node API Reference | `cli-registry.json`, `node-api-registry.json`, `workflow-registry.json`, `manual-registry.json` | [`cli.md`](cli.md), [`../packages/core/README.md`](../packages/core/README.md) |
38
+
21
39
  | Capability | Machine-readable entry | Manual entry |
22
40
  | --- | --- | --- |
41
+ | Capability-grouped KFD-3 navigation | `dist/site/capability-registry.json`, `dist/site/page-registry.json`, `dist/site/manual-registry.json`, `dist/site/cli-registry.json`, `dist/site/node-api-registry.json` | this map, [`site-bundle-contract.md`](site-bundle-contract.md), [`kfd-support.md`](kfd-support.md) |
23
42
  | KFD-1 / KFD-2 / KFD-3 release-passport gates | `dist/site/kfd-claims.json`, `dist/site/buildchain-contract.json`, `dist/site/artifact-schemas.json` | [`release-passport.md`](release-passport.md) |
24
43
  | KFD-3 public surface reverse audit | `dist/site/public-surface-audit.json`, `dist/site/cli-registry.json`, `dist/site/workflow-registry.json`, `dist/site/page-registry.json` | [`cli.md`](cli.md), [`site-bundle-contract.md`](site-bundle-contract.md) |
25
44
  | KFD-3 surface registration and capability query | `buildchain.kfd3.json`, `dist/site/kfd-claims.json`, `buildchain.release.json` | [`kfd-support.md`](kfd-support.md) |
package/docs/cli.md CHANGED
@@ -58,6 +58,10 @@ internal file paths. The npm package also ships
58
58
  `dist/site/node-api-registry.json` and exports it as
59
59
  `@kungfu-tech/buildchain/site/node-api-registry.json` so agents can enumerate
60
60
  the supported imports from the installed package.
61
+ For navigation, start with `dist/site/capability-registry.json`: it groups
62
+ manuals, CLI commands, workflow/action inputs, Node exports, site pages, and KFD
63
+ claim facts by product capability before an agent chooses a concrete command or
64
+ manual.
61
65
 
62
66
  Current public import families include:
63
67
 
@@ -74,6 +78,7 @@ import { createReleasePropagationPlan } from "@kungfu-tech/buildchain/release-pr
74
78
  import { planReleaseLineBootstrap } from "@kungfu-tech/buildchain/release-line-bootstrap";
75
79
  import { collectPublicSurfaceReverseAudit } from "@kungfu-tech/buildchain/public-surface-audit";
76
80
  import contractWorld from "@kungfu-tech/buildchain/site/buildchain-contract.json" with { type: "json" };
81
+ import capabilityRegistry from "@kungfu-tech/buildchain/site/capability-registry.json" with { type: "json" };
77
82
  import manualRegistry from "@kungfu-tech/buildchain/site/manual-registry.json" with { type: "json" };
78
83
  import nodeApiRegistry from "@kungfu-tech/buildchain/site/node-api-registry.json" with { type: "json" };
79
84
  import publicSurfaceAudit from "@kungfu-tech/buildchain/site/public-surface-audit.json" with { type: "json" };
@@ -13,6 +13,7 @@ release mechanics, command registry, workflow registry, or artifact schema.
13
13
  dist/site/
14
14
  buildchain-site.json
15
15
  site-manifest.json
16
+ capability-registry.json
16
17
  cli-registry.json
17
18
  manual-registry.json
18
19
  node-api-registry.json
@@ -36,6 +37,12 @@ of parsing `README.md` themselves.
36
37
  It also includes a `pages` collection that mirrors `page-registry.json`, so a
37
38
  site repository can build the full Buildchain public documentation surface from
38
39
  the npm package without scanning the source checkout.
40
+ `capability-registry.json` is the navigation spine for that page surface. It
41
+ groups manuals, pages, CLI commands, workflows, actions, Node API exports, and
42
+ KFD claim facts into stable product capability groups. Site repositories should
43
+ render navigation from this registry first, then use `page-registry.json`,
44
+ `manual-registry.json`, `cli-registry.json`, `node-api-registry.json`, and
45
+ `workflow-registry.json` for the concrete entries inside each group.
39
46
  `page-registry.json` is the complete page fact source: README homepage content,
40
47
  all packaged `docs/*.md` manuals, action README files, the Node API package
41
48
  overview, and fixture guides.
@@ -126,6 +133,8 @@ this gate, so release candidates cannot publish an out-of-date site bundle.
126
133
  The P0 bundle includes:
127
134
 
128
135
  - README-derived homepage fields and display plan;
136
+ - capability-grouped navigation facts for docs, CLI, Node API, workflows,
137
+ actions, and KFD claims;
129
138
  - complete markdown page registry for public Buildchain docs, action manuals,
130
139
  Node API overview, and fixtures;
131
140
  - site manifest;
@@ -513,6 +513,24 @@ preflight, and health check so a reviewer or agent can audit why the production
513
513
  site changed and whether every declared host and every existing nested route was
514
514
  actually covered.
515
515
 
516
+ Channels declared with `access_control = "managed-network"` use a different
517
+ health strategy by default. Buildchain does not require a GitHub-hosted runner
518
+ to fetch a URL that is intentionally reachable only from an approved network.
519
+ Instead, after a live apply the health check uses the deploy role to run S3
520
+ `head-object` checks for each surface manifest and the smoke target object, such
521
+ as the surface `index.html` or a nested `docs/index.html`. The check records
522
+ `healthStrategy = "s3-object"` and skips the public HTTP fetch. Dry-run and
523
+ plan-only checks fall back to deployment evidence: each surface must have a
524
+ manifest key, bucket, object prefix, `sync-static-artifact`, and
525
+ `write-deployment-manifest` evidence, recorded as
526
+ `healthStrategy = "deployment-evidence"`. If the workflow is running on a runner
527
+ that is allowed to reach the managed network, set
528
+ `BUILDCHAIN_WEB_SURFACE_HEALTH_ALLOWED_RUNNER=true` or pass
529
+ `--allowed-managed-network-runner true` to keep the normal HTTP smoke checks.
530
+ Set `BUILDCHAIN_WEB_SURFACE_HEALTH_S3_OBJECTS=false` or pass
531
+ `--managed-network-s3-object-verification false` only when an external channel
532
+ policy owns managed-network object verification.
533
+
516
534
  ## Cleanup Plans
517
535
 
518
536
  Preview cleanup is an auditable cleanup contract. It can run as a dry-run plan,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kungfu-tech/buildchain",
3
- "version": "2.10.2",
3
+ "version": "2.10.3",
4
4
  "private": false,
5
5
  "description": "Buildchain Release Passport, release governance, CLI toolkit, and site facts.",
6
6
  "repository": "https://github.com/kungfu-systems/buildchain",
@@ -34,6 +34,7 @@
34
34
  "./site/buildchain-site.json": "./dist/site/buildchain-site.json",
35
35
  "./site/site-manifest.json": "./dist/site/site-manifest.json",
36
36
  "./site/page-registry.json": "./dist/site/page-registry.json",
37
+ "./site/capability-registry.json": "./dist/site/capability-registry.json",
37
38
  "./site/cli-registry.json": "./dist/site/cli-registry.json",
38
39
  "./site/manual-registry.json": "./dist/site/manual-registry.json",
39
40
  "./site/node-api-registry.json": "./dist/site/node-api-registry.json",
@@ -14,6 +14,7 @@ export const BUILDCHAIN_AGENT_MANUALS = Object.freeze([
14
14
  { id: "map", title: "Buildchain documentation map", path: "docs/MAP.md", plane: "use" },
15
15
  { id: "install", title: "Install and verify Buildchain", path: "docs/install.md", plane: "use" },
16
16
  { id: "release-passport", title: "Release Passport protocol", path: "docs/release-passport.md", plane: "verify" },
17
+ { id: "release-candidate", title: "Release Candidate Passport", path: "docs/release-candidate.md", plane: "verify" },
17
18
  { id: "release-propagation", title: "Release propagation", path: "docs/release-propagation.md", plane: "use" },
18
19
  { id: "readme-badges", title: "README badge blocks", path: "docs/readme-badges.md", plane: "use" },
19
20
  { id: "homebrew", title: "Homebrew distribution indexes", path: "docs/homebrew.md", plane: "use" },
@@ -42,6 +43,7 @@ const SITE_CONTRACT_FILES = Object.freeze([
42
43
  "dist/site/buildchain-site.json",
43
44
  "dist/site/site-manifest.json",
44
45
  "dist/site/page-registry.json",
46
+ "dist/site/capability-registry.json",
45
47
  "dist/site/cli-registry.json",
46
48
  "dist/site/manual-registry.json",
47
49
  "dist/site/node-api-registry.json",
@@ -264,6 +266,7 @@ export function createBuildchainPublicClaimDefinitions() {
264
266
  "dist/site/manual-registry.json",
265
267
  "dist/site/node-api-registry.json",
266
268
  "dist/site/page-registry.json",
269
+ "dist/site/capability-registry.json",
267
270
  "dist/site/buildchain-site.json",
268
271
  "dist/site/site-manifest.json",
269
272
  ],
@@ -171,6 +171,9 @@ if (rootPackage.exports?.["./site/site-manifest.json"] !== "./dist/site/site-man
171
171
  if (rootPackage.exports?.["./site/page-registry.json"] !== "./dist/site/page-registry.json") {
172
172
  throw new Error("root package must export @kungfu-tech/buildchain/site/page-registry.json");
173
173
  }
174
+ if (rootPackage.exports?.["./site/capability-registry.json"] !== "./dist/site/capability-registry.json") {
175
+ throw new Error("root package must export @kungfu-tech/buildchain/site/capability-registry.json");
176
+ }
174
177
  if (rootPackage.exports?.["./site/manual-registry.json"] !== "./dist/site/manual-registry.json") {
175
178
  throw new Error("root package must export @kungfu-tech/buildchain/site/manual-registry.json");
176
179
  }
@@ -208,6 +211,7 @@ const installDoc = fs.readFileSync(path.join(root, "docs/install.md"), "utf8");
208
211
  const siteBundle = JSON.parse(fs.readFileSync(path.join(root, "dist/site/buildchain-site.json"), "utf8"));
209
212
  const siteManifest = JSON.parse(fs.readFileSync(path.join(root, "dist/site/site-manifest.json"), "utf8"));
210
213
  const pageRegistry = JSON.parse(fs.readFileSync(path.join(root, "dist/site/page-registry.json"), "utf8"));
214
+ const capabilityRegistry = JSON.parse(fs.readFileSync(path.join(root, "dist/site/capability-registry.json"), "utf8"));
211
215
  const badgeEndpointRegistry = JSON.parse(fs.readFileSync(path.join(root, "dist/site/badge-endpoint-registry.json"), "utf8"));
212
216
  const publicSurfaceAudit = JSON.parse(fs.readFileSync(path.join(root, "dist/site/public-surface-audit.json"), "utf8"));
213
217
  if (!cliSource.startsWith("#!/usr/bin/env node")) {
@@ -334,6 +338,15 @@ if (pageRegistry.contract !== "kungfu-buildchain-site-page-registry") {
334
338
  if (siteBundle.pageRegistry?.path !== "page-registry.json" || siteBundle.pageRegistry?.pageCount !== pageRegistry.pageCount) {
335
339
  throw new Error("buildchain-site.json must link to page-registry.json with matching page count");
336
340
  }
341
+ if (capabilityRegistry.contract !== "kungfu-buildchain-capability-registry") {
342
+ throw new Error("capability-registry.json must expose the Buildchain capability registry contract");
343
+ }
344
+ if (siteBundle.capabilityRegistry?.path !== "capability-registry.json" || siteBundle.capabilityRegistry?.groupCount !== capabilityRegistry.groups?.length) {
345
+ throw new Error("buildchain-site.json must link to capability-registry.json with matching group count");
346
+ }
347
+ if (!siteManifest.facts?.includes("capability-registry.json") || !siteBundle.entrypoints?.includes("capability-registry.json")) {
348
+ throw new Error("site bundle entrypoints must include capability-registry.json");
349
+ }
337
350
  if (!siteManifest.facts?.includes("page-registry.json") || !siteBundle.entrypoints?.includes("page-registry.json")) {
338
351
  throw new Error("site bundle entrypoints must include page-registry.json");
339
352
  }
@@ -388,10 +401,37 @@ if (JSON.stringify(bundlePageSources) !== JSON.stringify(expectedPageSources)) {
388
401
  throw new Error(`buildchain-site.json pages must include every public markdown page: expected ${expectedPageSources.length}, got ${bundlePageSources.length}`);
389
402
  }
390
403
  for (const page of pageRegistry.pages || []) {
391
- if (!page.id || !page.route || !page.title || !page.category || !page.sourcePath || !page.digest || !page.markdown) {
404
+ if (!page.id || !page.route || !page.title || !page.category || !page.capabilityGroup || !Array.isArray(page.audience) || !page.maturity || !page.sourcePath || !page.digest || !page.markdown) {
392
405
  throw new Error(`page-registry.json page is incomplete: ${page.sourcePath || page.id || "<unknown>"}`);
393
406
  }
394
407
  }
408
+ const capabilityGroupIds = new Set((capabilityRegistry.groups || []).map((group) => group.id));
409
+ if (capabilityGroupIds.size < 6) {
410
+ throw new Error("capability-registry.json must expose grouped Buildchain capabilities");
411
+ }
412
+ for (const page of pageRegistry.pages || []) {
413
+ if (!capabilityGroupIds.has(page.capabilityGroup)) {
414
+ throw new Error(`page-registry.json page references unknown capability group: ${page.sourcePath || page.id}`);
415
+ }
416
+ }
417
+ const manualRegistry = JSON.parse(fs.readFileSync(path.join(root, "dist/site/manual-registry.json"), "utf8"));
418
+ for (const manual of manualRegistry.manuals || []) {
419
+ if (!manual.capabilityGroup || !capabilityGroupIds.has(manual.capabilityGroup) || !Array.isArray(manual.audience) || !manual.maturity || typeof manual.order !== "number") {
420
+ throw new Error(`manual-registry.json manual missing capability metadata: ${manual.path || manual.id}`);
421
+ }
422
+ }
423
+ const cliRegistry = JSON.parse(fs.readFileSync(path.join(root, "dist/site/cli-registry.json"), "utf8"));
424
+ for (const command of cliRegistry.commands || []) {
425
+ if (!command.capabilityGroup || !capabilityGroupIds.has(command.capabilityGroup) || !Array.isArray(command.audience) || !command.maturity || !command.purpose || command.purpose.includes("Add a specific purpose")) {
426
+ throw new Error(`cli-registry.json command missing capability metadata: ${command.id || command.usage}`);
427
+ }
428
+ }
429
+ const nodeApiRegistry = JSON.parse(fs.readFileSync(path.join(root, "dist/site/node-api-registry.json"), "utf8"));
430
+ for (const exported of nodeApiRegistry.exports || []) {
431
+ if (!exported.capabilityGroup || !capabilityGroupIds.has(exported.capabilityGroup) || !Array.isArray(exported.audience) || !exported.maturity || !exported.summary) {
432
+ throw new Error(`node-api-registry.json export missing capability metadata: ${exported.export || exported.specifier}`);
433
+ }
434
+ }
395
435
  if (!pageRegistry.pages?.some((page) => page.sourcePath === "actions/promote-buildchain-ref/README.md")) {
396
436
  throw new Error("page-registry.json must include action manuals");
397
437
  }
@@ -476,6 +516,7 @@ for (const requiredSnippet of [
476
516
  "GitHub Release",
477
517
  "release propagation",
478
518
  "Homebrew tap distribution indexes",
519
+ "capability-registry.json",
479
520
  "manual-registry.json",
480
521
  "node-api-registry.json",
481
522
  "README badge",
@@ -865,7 +906,7 @@ if (!badgeEndpointRegistry.badges?.some((entry) => entry.id === "buildchain-rele
865
906
  throw new Error("badge endpoint registry must include Buildchain Release Passport badge");
866
907
  }
867
908
 
868
- for (const siteFile of ["buildchain-site.json", "site-manifest.json", "badge-endpoint-registry.json", "cli-registry.json", "manual-registry.json", "node-api-registry.json", "workflow-registry.json", "public-surface-audit.json", "release-model.json", "buildchain-contract.json"]) {
909
+ for (const siteFile of ["buildchain-site.json", "site-manifest.json", "badge-endpoint-registry.json", "page-registry.json", "capability-registry.json", "cli-registry.json", "manual-registry.json", "node-api-registry.json", "workflow-registry.json", "public-surface-audit.json", "release-model.json", "buildchain-contract.json"]) {
869
910
  if (!fs.existsSync(path.join(root, "dist", "site", siteFile))) {
870
911
  throw new Error(`site bundle missing ${siteFile}`);
871
912
  }