@kungfu-tech/buildchain 2.8.7-alpha.1 → 2.8.7

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.
@@ -22,6 +22,7 @@
22
22
  "./buildchain-kfd-claims": "./packages/core/buildchain-kfd-claims.js",
23
23
  "./site/buildchain-site.json": "./dist/site/buildchain-site.json",
24
24
  "./site/site-manifest.json": "./dist/site/site-manifest.json",
25
+ "./site/page-registry.json": "./dist/site/page-registry.json",
25
26
  "./site/cli-registry.json": "./dist/site/cli-registry.json",
26
27
  "./site/manual-registry.json": "./dist/site/manual-registry.json",
27
28
  "./site/node-api-registry.json": "./dist/site/node-api-registry.json",
@@ -11,7 +11,20 @@
11
11
  "versionSource": "package.json#version"
12
12
  },
13
13
  "entrypoint": "buildchain-site.json",
14
+ "source": {
15
+ "homepageTextSource": "README.md",
16
+ "docsMap": "docs/MAP.md",
17
+ "siteFactsDir": "dist/site"
18
+ },
14
19
  "docs": [
20
+ {
21
+ "id": "map",
22
+ "title": "Buildchain documentation map",
23
+ "path": "docs/MAP.md",
24
+ "plane": "use",
25
+ "exists": true,
26
+ "digest": "sha256:b5cfef531ba8ca655d8d66ffe0e530a0ca2c971daad5880943d2b824216ed043"
27
+ },
15
28
  {
16
29
  "id": "install",
17
30
  "title": "Install and verify Buildchain",
@@ -44,6 +57,22 @@
44
57
  "exists": true,
45
58
  "digest": "sha256:36899140a9b2e9ce1565ed41f3d64f73a8829fad3d59a04b9498d9479c85c4be"
46
59
  },
60
+ {
61
+ "id": "consumer-issue-reporting",
62
+ "title": "Consumer issue reporting",
63
+ "path": "docs/consumer-issue-reporting.md",
64
+ "plane": "use",
65
+ "exists": true,
66
+ "digest": "sha256:8e2159312e47b42ab0bb644cb195362150acc8872e6ac0e7380ece0c5cf36955"
67
+ },
68
+ {
69
+ "id": "infra-contract",
70
+ "title": "Infra Contract",
71
+ "path": "docs/infra-contract.md",
72
+ "plane": "use",
73
+ "exists": true,
74
+ "digest": "sha256:7826e8c70ac2d90ddd8d4e38bcdd1bcfa36eef5106431d7ad94b2fe9c8d3d5dc"
75
+ },
47
76
  {
48
77
  "id": "toolkit-observability",
49
78
  "title": "Toolkit observability",
@@ -58,7 +87,23 @@
58
87
  "path": "docs/site-bundle-contract.md",
59
88
  "plane": "use",
60
89
  "exists": true,
61
- "digest": "sha256:e6b4f2e76c713063ff750b0a8d6d96595addae2fd48f913744dc86559add0641"
90
+ "digest": "sha256:1977091fc18b816208e7af50a177fd15e114498bfa49041573812405b46585aa"
91
+ },
92
+ {
93
+ "id": "migration-inventory",
94
+ "title": "Migration inventory",
95
+ "path": "docs/migration-inventory.md",
96
+ "plane": "verify",
97
+ "exists": true,
98
+ "digest": "sha256:80018cf78785431e67bbc5278d82dda80d0baa320cdb5e4abda26a0b05e5c0bc"
99
+ },
100
+ {
101
+ "id": "ownership",
102
+ "title": "Ownership",
103
+ "path": "docs/ownership.md",
104
+ "plane": "why",
105
+ "exists": true,
106
+ "digest": "sha256:49074fb520c404d3c9f5b49b33562d4bdc4e3ed407cf22543fa8e19e312a6b8e"
62
107
  },
63
108
  {
64
109
  "id": "product-mechanism",
@@ -116,6 +161,14 @@
116
161
  "exists": true,
117
162
  "digest": "sha256:0a2f46501a64905067cc5872b45ac4824f9e632d59bfdfb2f6a794dfc5f959ea"
118
163
  },
164
+ {
165
+ "id": "runtime-train-validation",
166
+ "title": "Runtime train validation",
167
+ "path": "docs/runtime-train-validation.md",
168
+ "plane": "verify",
169
+ "exists": true,
170
+ "digest": "sha256:bb053594407bd0f78aa43352a249a2ffa19825374147cc712cd56ca6ad50dfa3"
171
+ },
119
172
  {
120
173
  "id": "versioning",
121
174
  "title": "Versioning",
@@ -130,18 +183,11 @@
130
183
  "path": "docs/web-surface-deployments.md",
131
184
  "plane": "use",
132
185
  "exists": true,
133
- "digest": "sha256:796e891819f03f0a7ac91f56f1bb74d9e3443d8bb0bee33a3cd053d70bde6a62"
134
- },
135
- {
136
- "id": "infra-contract",
137
- "title": "Infra Contract",
138
- "path": "docs/infra-contract.md",
139
- "plane": "use",
140
- "exists": true,
141
- "digest": "sha256:7826e8c70ac2d90ddd8d4e38bcdd1bcfa36eef5106431d7ad94b2fe9c8d3d5dc"
186
+ "digest": "sha256:61891635707e9ed27b8754b83713db61cf9a7a6bdf65beb6a9ac8aa39356e168"
142
187
  }
143
188
  ],
144
189
  "facts": [
190
+ "page-registry.json",
145
191
  "cli-registry.json",
146
192
  "manual-registry.json",
147
193
  "node-api-registry.json",
@@ -54,6 +54,11 @@
54
54
  "id": "promote-buildchain-ref",
55
55
  "path": "actions/promote-buildchain-ref",
56
56
  "status": "active"
57
+ },
58
+ {
59
+ "id": "report-buildchain-issue",
60
+ "path": "actions/report-buildchain-issue",
61
+ "status": "active"
57
62
  }
58
63
  ]
59
64
  }
@@ -0,0 +1,123 @@
1
+ # Runtime Train Validation
2
+
3
+ Buildchain consumers should keep stable workflow refs such as `@v2` in
4
+ committed workflow YAML. Runtime trains provide a temporary validation pointer
5
+ for Buildchain changes that are ready for downstream testing but not yet
6
+ promoted through the normal `dev -> alpha -> release` chain.
7
+
8
+ ## Train refs
9
+
10
+ A train ref is a branch in the Buildchain repository:
11
+
12
+ ```text
13
+ train/v2/v2.3/<capability>
14
+ ```
15
+
16
+ It is a validation pointer, not a release channel:
17
+
18
+ - it does not move `v2`, `vX.Y`, `vX.Y-alpha`, exact tags, npm dist-tags, or
19
+ production refs;
20
+ - it must not be pinned as a long-term production dependency;
21
+ - it should point at the Buildchain commit that downstream maintainers are
22
+ expected to validate;
23
+ - it is not a pending merge target or a delivery state;
24
+ - the final durable path is still a pull request into the active `dev/*`
25
+ channel, followed by the requested alpha or release promotion.
26
+ - it may remain for a retention window after release so initiating repositories
27
+ have a stable fast-use and rollback channel while stable refs, caches, or
28
+ rollout windows settle.
29
+
30
+ ## Buildchain contributor requirement
31
+
32
+ When a Buildchain change needs downstream validation before stable refs move,
33
+ publish a train ref before asking consumers to test it:
34
+
35
+ ```sh
36
+ git push origin HEAD:refs/heads/train/v2/v2.3/<capability>
37
+ ```
38
+
39
+ Use a capability slug that names the behavior being validated, for example:
40
+
41
+ ```text
42
+ train/v2/v2.3/runtime-loader
43
+ train/v2/v2.3/toolkit-diagnostics
44
+ train/v2/v2.3/site-source-of-truth
45
+ ```
46
+
47
+ The pull request or validation request should include the train ref, the exact
48
+ commit SHA it points to, and the downstream evidence expected from consumers.
49
+ If the train is refreshed, state the new SHA in the validation thread.
50
+
51
+ After downstream validation succeeds, close out through the normal release
52
+ path. Merge the Buildchain pull request into the active `dev/*` mainline, run
53
+ the requested alpha or release promotion, and record the final mainline commit
54
+ plus release ref or tag in the delivery thread. Do not leave the train as the
55
+ item that still needs to be merged; it is only a temporary fast-use,
56
+ diagnostic, and rollback channel for initiating repositories. Retained trains
57
+ are cleaned up by a separate periodic Buildchain cleanup task.
58
+
59
+ ## Consumer workflow requirement
60
+
61
+ Consumers keep their reusable workflow pinned to the stable shell:
62
+
63
+ ```yaml
64
+ jobs:
65
+ build:
66
+ uses: kungfu-systems/buildchain/.github/workflows/.build.yml@v2
67
+ ```
68
+
69
+ To validate a train without committing temporary workflow refs, expose a
70
+ trusted manual pass-through once:
71
+
72
+ ```yaml
73
+ on:
74
+ workflow_dispatch:
75
+ inputs:
76
+ buildchain-ref:
77
+ description: "Temporary Buildchain runtime ref for trusted manual validation"
78
+ required: false
79
+ default: ""
80
+
81
+ jobs:
82
+ build:
83
+ uses: kungfu-systems/buildchain/.github/workflows/.build.yml@v2
84
+ with:
85
+ buildchain-ref: ${{ inputs.buildchain-ref || '' }}
86
+ ```
87
+
88
+ Buildchain initializes new package workflows with this pass-through. Existing
89
+ consumers that do not have it should add it once before validating a train.
90
+
91
+ ## Validation request
92
+
93
+ Use this short request when a train is ready:
94
+
95
+ ```text
96
+ Buildchain train ready: buildchain-ref=train/v2/v2.3/<capability>.
97
+ Keep uses: ...@v2; run workflow_dispatch with that buildchain-ref and report the runtime evidence summary.
98
+ ```
99
+
100
+ The consumer should run a trusted `workflow_dispatch`, paste the train ref into
101
+ `buildchain-ref`, and report the workflow summary or aggregate Buildchain
102
+ summary. The evidence should include:
103
+
104
+ - workflow shell ref;
105
+ - requested runtime ref;
106
+ - resolved runtime ref;
107
+ - resolved runtime SHA;
108
+ - stability class;
109
+ - trust decision;
110
+ - rollback ref.
111
+
112
+ ## Trust and limitation
113
+
114
+ Runtime overrides fail closed unless the event is `workflow_dispatch` and the
115
+ actor has write, maintain, or admin permission on the caller repository.
116
+ Pull requests, including fork-originated pull requests, cannot use a non-empty
117
+ `buildchain-ref`.
118
+
119
+ Runtime train validation covers Buildchain runtime scripts, CLI code, local
120
+ actions, configuration parsing, and lifecycle behavior. It cannot validate
121
+ changes that require the outer reusable workflow YAML itself to change, such as
122
+ new jobs, permissions, workflow outputs, or matrix topology. Those changes need
123
+ a canary workflow path or a temporary explicit workflow ref.
@@ -27,6 +27,17 @@ dist/site/
27
27
  ```
28
28
 
29
29
  `buildchain-site.json` is the top-level bundle entrypoint.
30
+ It includes a `homepage` object generated from `README.md`, including
31
+ `homepage.sections`, `homepage.displayPlan`, and a
32
+ `homepage.rendererContract` that is implementation metadata rather than
33
+ ordinary homepage copy. Site repositories should consume those fields instead
34
+ of parsing `README.md` themselves.
35
+ It also includes a `pages` collection that mirrors `page-registry.json`, so a
36
+ site repository can build the full Buildchain public documentation surface from
37
+ the npm package without scanning the source checkout.
38
+ `page-registry.json` is the complete page fact source: README homepage content,
39
+ all packaged `docs/*.md` manuals, action README files, the Node API package
40
+ overview, and fixture guides.
30
41
  `buildchain-contract.json` is the machine-readable Buildchain runtime contract
31
42
  world used by floating-ref contract locks. It records public workflow/action/CLI
32
43
  surfaces, compatibility digests, and audit digests for the files that implement
@@ -73,6 +84,9 @@ this gate, so release candidates cannot publish an out-of-date site bundle.
73
84
 
74
85
  The P0 bundle includes:
75
86
 
87
+ - README-derived homepage fields and display plan;
88
+ - complete markdown page registry for public Buildchain docs, action manuals,
89
+ Node API overview, and fixtures;
76
90
  - site manifest;
77
91
  - CLI command registry;
78
92
  - manual registry for packaged agent-facing documentation;
@@ -96,3 +110,19 @@ schema metadata without breaking existing consumers.
96
110
  release chain model. The site bundle exposes that document and the
97
111
  `release-propagation` CLI entry so downstream sites can render the current
98
112
  Buildchain-owned propagation contract instead of hand-writing it.
113
+
114
+ ## Rendering Boundary
115
+
116
+ Buildchain owns the homepage wording, section ordering intent, complete
117
+ markdown page registry, release model facts, workflow/action registry, CLI
118
+ registry, manual registry, Node API registry, KFD claim registry, and
119
+ release-passport evidence vocabulary. The site owns HTML, CSS, responsive
120
+ layout, navigation, visual assets, decorative media, markdown-to-HTML rendering,
121
+ and progressive disclosure within the Buildchain-provided
122
+ `homepage.displayPlan` and page metadata.
123
+
124
+ The page registry is also part of Buildchain's KFD-3 collaboration-interface
125
+ surface. Releases declare it as a site-consumption contract, and Buildchain's
126
+ KFD-3 witness generation includes the underlying markdown sources as public
127
+ documentation surfaces. If a page is public enough for the site to render, it
128
+ must be declared and hash-bound in the package-owned site bundle.
@@ -416,7 +416,7 @@ The reusable workflow maps GitHub events to Buildchain web-surface semantics:
416
416
  | --- | --- |
417
417
  | `pull_request` opened / synchronized / reopened | validate, build, verify, and plan `preview` for `pr-N` |
418
418
  | `pull_request` closed | plan apply-mode cleanup for the `pr-N` preview alias and manifest |
419
- | `push` to `main` | validate, build, verify, and plan `staging` from the merged `main` SHA |
419
+ | `push` to `main` | validate, build, verify, plan and apply `staging` from the merged `main` SHA, then optionally open a production release PR |
420
420
  | `push` to `main` from a matching release PR merge | validate the associated release PR, plan `production`, and enter the configured GitHub Environment gate |
421
421
  | `workflow_dispatch` with `production-approved = true` | plan `production` and enter the configured GitHub Environment gate |
422
422
 
@@ -493,10 +493,18 @@ When enabled, Buildchain owns the full release apply state machine:
493
493
  role, then write a staging release feedback passport artifact and comment the
494
494
  associated merged PR with the staging URL, source SHA, artifact identity, run
495
495
  URL, and failure context when apply did not complete.
496
+ - When `production-release-on-main=true`, successful staging applies open or
497
+ update a Buildchain-owned release PR from
498
+ `release/<channel>-<short-sha>` to `main`, unless the current push already
499
+ came from a matching release PR merge. The release PR contains one empty
500
+ release-intent commit, carries `production-release-label`, and includes the
501
+ staging URLs, source SHA, artifact hash, and staging release-passport artifact
502
+ link in the PR body.
496
503
  - Release pull requests that match the configured production gate get a
497
504
  Buildchain review comment with the staging URL and production target, so the
498
505
  operator can verify staging from the PR page and use merge as the approval
499
- action.
506
+ action. Consumers do not need to hand-write `gh pr create` or production
507
+ release-intent glue.
500
508
  - Production runs when `production-apply` is true and either:
501
509
  - a trusted `workflow_dispatch` passes `production-approved=true`; or
502
510
  - `production-release-on-main=true` and the `main` push commit is associated
@@ -535,15 +543,17 @@ jobs:
535
543
  production-apply: ${{ github.event_name == 'push' && github.ref_name == 'main' }}
536
544
  production-release-on-main: true
537
545
  production-release-label: buildchain-release
538
- production-release-head-prefix: feature/release-
546
+ production-release-head-prefix: release/
547
+ production-release-branch-channel: production
539
548
  production-aws-role-arn: arn:aws:iam::123456789012:role/site-production-github-actions
540
549
  production-environment: production
541
550
  ```
542
551
 
543
552
  The merge button becomes the production approval only for a PR that carries the
544
- release label and comes from the configured source-branch prefix. Ordinary
545
- pull requests merged into `main` keep the staging plan behavior and do not
546
- publish production.
553
+ release label and comes from the configured source-branch prefix. Ordinary pull
554
+ requests merged into `main` deploy staging and open a release-intent PR; merging
555
+ that release PR triggers production. A release PR merge push does not open
556
+ another release PR.
547
557
 
548
558
  Apply-only inputs are validated before the caller build or verification command
549
559
  runs. If the current event would run preview, staging, or production apply,
@@ -552,9 +562,12 @@ on manual dispatch fail immediately instead of spending the build and plan jobs
552
562
  first.
553
563
 
554
564
  Callers must grant `id-token: write` for OIDC role assumption. Preview comments
555
- also need `pull-requests: write`. The AWS roles remain caller-owned and should
556
- be scoped by channel: preview can mutate only preview resources, staging can
557
- mutate only staging resources, and production can mutate only production
565
+ need `pull-requests: write`. Automatic release PR creation also needs
566
+ `contents: write`, `pull-requests: write`, and `issues: write` so Buildchain can
567
+ create the release branch, write the empty release-intent commit, open or update
568
+ the PR, and apply the release label. The AWS roles remain caller-owned and
569
+ should be scoped by channel: preview can mutate only preview resources, staging
570
+ can mutate only staging resources, and production can mutate only production
558
571
  resources.
559
572
 
560
573
  Apply mode fails closed when the deploy config still contains placeholder AWS
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kungfu-tech/buildchain",
3
- "version": "2.8.7-alpha.1",
3
+ "version": "2.8.7",
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",
@@ -25,6 +25,7 @@
25
25
  "./buildchain-kfd-claims": "./packages/core/buildchain-kfd-claims.js",
26
26
  "./site/buildchain-site.json": "./dist/site/buildchain-site.json",
27
27
  "./site/site-manifest.json": "./dist/site/site-manifest.json",
28
+ "./site/page-registry.json": "./dist/site/page-registry.json",
28
29
  "./site/cli-registry.json": "./dist/site/cli-registry.json",
29
30
  "./site/manual-registry.json": "./dist/site/manual-registry.json",
30
31
  "./site/node-api-registry.json": "./dist/site/node-api-registry.json",
@@ -48,27 +49,7 @@
48
49
  "dist/site/",
49
50
  "README.md",
50
51
  "SECURITY.md",
51
- "docs/MAP.md",
52
- "docs/binary-distribution.md",
53
- "docs/cli.md",
54
- "docs/install.md",
55
- "docs/infra-contract.md",
56
- "docs/consumer-issue-reporting.md",
57
- "docs/lifecycle-protocol.md",
58
- "docs/migration-inventory.md",
59
- "docs/ownership.md",
60
- "docs/product-mechanism.md",
61
- "docs/publish-transaction.md",
62
- "docs/release-passport.md",
63
- "docs/release-propagation.md",
64
- "docs/release-candidate.md",
65
- "docs/release-flow.md",
66
- "docs/release-governance.md",
67
- "docs/reusable-build-surface.md",
68
- "docs/site-bundle-contract.md",
69
- "docs/toolkit-observability.md",
70
- "docs/versioning.md",
71
- "docs/web-surface-deployments.md",
52
+ "docs/*.md",
72
53
  "actions/*/README.md",
73
54
  "fixtures/*/README.md"
74
55
  ],
@@ -98,7 +79,7 @@
98
79
  "vitest": "^4.1.9"
99
80
  },
100
81
  "dependencies": {
101
- "@kungfu-tech/kfd": "github:kungfu-systems/kfd#1731900b81150ae29095329892b8d7d5670f2314",
82
+ "@kungfu-tech/kfd": "1.0.0-alpha.16",
102
83
  "smol-toml": "1.7.0"
103
84
  }
104
85
  }
@@ -7,12 +7,17 @@ export const BUILDCHAIN_KFD_CLAIM_REGISTRY_CONTRACT = "kungfu-buildchain-kfd-cla
7
7
  export const BUILDCHAIN_KFD_COLLABORATION_INTERFACE_CONTRACT = "kungfu-buildchain-kfd-collaboration-interface";
8
8
 
9
9
  export const BUILDCHAIN_AGENT_MANUALS = Object.freeze([
10
+ { id: "map", title: "Buildchain documentation map", path: "docs/MAP.md", plane: "use" },
10
11
  { id: "install", title: "Install and verify Buildchain", path: "docs/install.md", plane: "use" },
11
12
  { id: "release-passport", title: "Release Passport protocol", path: "docs/release-passport.md", plane: "verify" },
12
13
  { id: "release-propagation", title: "Release propagation", path: "docs/release-propagation.md", plane: "use" },
13
14
  { id: "binary-distribution", title: "Binary distribution contract", path: "docs/binary-distribution.md", plane: "verify" },
15
+ { id: "consumer-issue-reporting", title: "Consumer issue reporting", path: "docs/consumer-issue-reporting.md", plane: "use" },
16
+ { id: "infra-contract", title: "Infra Contract", path: "docs/infra-contract.md", plane: "use" },
14
17
  { id: "toolkit-observability", title: "Toolkit observability", path: "docs/toolkit-observability.md", plane: "use" },
15
18
  { id: "site-bundle-contract", title: "Site bundle contract", path: "docs/site-bundle-contract.md", plane: "use" },
19
+ { id: "migration-inventory", title: "Migration inventory", path: "docs/migration-inventory.md", plane: "verify" },
20
+ { id: "ownership", title: "Ownership", path: "docs/ownership.md", plane: "why" },
16
21
  { id: "product-mechanism", title: "Product mechanism", path: "docs/product-mechanism.md", plane: "why" },
17
22
  { id: "cli", title: "CLI and npm package", path: "docs/cli.md", plane: "use" },
18
23
  { id: "lifecycle-protocol", title: "Lifecycle protocol", path: "docs/lifecycle-protocol.md", plane: "use" },
@@ -20,14 +25,15 @@ export const BUILDCHAIN_AGENT_MANUALS = Object.freeze([
20
25
  { id: "publish-transaction", title: "Publish transaction", path: "docs/publish-transaction.md", plane: "verify" },
21
26
  { id: "release-governance", title: "Release governance", path: "docs/release-governance.md", plane: "why" },
22
27
  { id: "release-flow", title: "Release flow", path: "docs/release-flow.md", plane: "verify" },
28
+ { id: "runtime-train-validation", title: "Runtime train validation", path: "docs/runtime-train-validation.md", plane: "verify" },
23
29
  { id: "versioning", title: "Versioning", path: "docs/versioning.md", plane: "why" },
24
30
  { id: "web-surface-deployments", title: "Web surface deployments", path: "docs/web-surface-deployments.md", plane: "use" },
25
- { id: "infra-contract", title: "Infra Contract", path: "docs/infra-contract.md", plane: "use" },
26
31
  ]);
27
32
 
28
33
  const SITE_CONTRACT_FILES = Object.freeze([
29
34
  "dist/site/buildchain-site.json",
30
35
  "dist/site/site-manifest.json",
36
+ "dist/site/page-registry.json",
31
37
  "dist/site/cli-registry.json",
32
38
  "dist/site/manual-registry.json",
33
39
  "dist/site/node-api-registry.json",
@@ -68,6 +74,26 @@ const EXTRA_KFD1_FILES = Object.freeze([
68
74
  "scripts/ensure-github-release.mjs",
69
75
  ]);
70
76
 
77
+ function immediateReadmes(root, dir) {
78
+ const absoluteDir = path.join(root, dir);
79
+ if (!fs.existsSync(absoluteDir)) return [];
80
+ return fs.readdirSync(absoluteDir, { withFileTypes: true })
81
+ .filter((entry) => entry.isDirectory())
82
+ .map((entry) => `${dir}/${entry.name}/README.md`)
83
+ .filter((relPath) => fileExists(root, relPath))
84
+ .sort();
85
+ }
86
+
87
+ function publicDocumentationFiles(root) {
88
+ return uniquePaths([
89
+ ...BUILDCHAIN_AGENT_MANUALS.map((entry) => entry.path),
90
+ "README.md",
91
+ "packages/core/README.md",
92
+ ...immediateReadmes(root, "actions"),
93
+ ...immediateReadmes(root, "fixtures"),
94
+ ]);
95
+ }
96
+
71
97
  function readJson(root, relPath, fallback = {}) {
72
98
  const filePath = path.join(root, relPath);
73
99
  if (!fs.existsSync(filePath)) {
@@ -176,6 +202,7 @@ export function createBuildchainPublicClaimDefinitions() {
176
202
  artifactPaths: [
177
203
  "dist/site/manual-registry.json",
178
204
  "dist/site/node-api-registry.json",
205
+ "dist/site/page-registry.json",
179
206
  "dist/site/buildchain-site.json",
180
207
  "dist/site/site-manifest.json",
181
208
  ],
@@ -254,10 +281,14 @@ export function createBuildchainKfdSurfaceRegistry({ root = process.cwd() } = {}
254
281
  name: specifier === "." ? pkg.name : `${pkg.name}/${specifier.replace(/^\.\//, "")}`,
255
282
  },
256
283
  ));
257
- const docs = BUILDCHAIN_AGENT_MANUALS.map((manual) => surface(`doc:${manual.id}`, "documentation", manual.path, {
258
- name: manual.title,
259
- plane: manual.plane,
260
- }));
284
+ const manualTitles = new Map(BUILDCHAIN_AGENT_MANUALS.map((manual) => [manual.path, manual]));
285
+ const docs = publicDocumentationFiles(root).map((relPath) => {
286
+ const manual = manualTitles.get(relPath);
287
+ return surface(`doc:${relPath}`, "documentation", relPath, {
288
+ name: manual?.title || relPath,
289
+ plane: manual?.plane || (relPath.startsWith("actions/") ? "action" : relPath.startsWith("fixtures/") ? "fixture" : "use"),
290
+ });
291
+ });
261
292
  const schemas = SCHEMA_AND_STANDARD_FILES.map((relPath) => surface(`schema:${relPath}`, "schema", relPath));
262
293
  const standardsMetadata = [
263
294
  surface("metadata:package-json", "standards-metadata", "package.json"),
@@ -305,7 +336,7 @@ export function createBuildchainKfd1Witness({ root = process.cwd(), sourceSha =
305
336
  const registry = createBuildchainKfdClaimRegistry({ root, sourceSha });
306
337
  const registrySha256 = sha256Json(registry);
307
338
  const paths = uniquePaths([
308
- ...BUILDCHAIN_AGENT_MANUALS.map((entry) => entry.path),
339
+ ...publicDocumentationFiles(root),
309
340
  ...SCHEMA_AND_STANDARD_FILES,
310
341
  ...SITE_CONTRACT_FILES,
311
342
  ...WORKFLOW_AND_ACTION_FILES,