@kungfu-tech/buildchain 4.0.1-alpha.9 → 4.0.2-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/README.md +9 -6
  2. package/actions/v4-release-candidate-promote/README.md +3 -0
  3. package/architecture/agent-change-map.md +1017 -0
  4. package/architecture/ci-lane-change-budget.json +70 -1
  5. package/architecture/decisions/0004-v4-declarative-release-tail.md +47 -0
  6. package/architecture/internal-capabilities.json +159 -11
  7. package/architecture/maintainability-debt.json +3229 -0
  8. package/architecture/maintainability-policy.json +480 -129
  9. package/architecture/v3-core-mechanism-inventory.json +6 -3
  10. package/architecture/v3-v4-capability-closure.md +59 -0
  11. package/architecture/v3-v4-live-capability-inventory.json +102404 -0
  12. package/architecture/v4-cross-platform-adopter-qualification.json +52 -0
  13. package/architecture/v4-delivery-warrant-shadow-fixtures.json +3 -3
  14. package/architecture/v4-runtime-semantic-closure.json +710 -0
  15. package/bin/internal/trust-release-release-handlers.mjs +5 -0
  16. package/contracts/fixtures/v4-tail-reseal-v1/valid.json +1 -1
  17. package/contracts/v4-publication-qualification-v1.schema.json +51 -0
  18. package/dist/site/agent-index.json +1 -0
  19. package/dist/site/artifact-schemas.json +2 -0
  20. package/dist/site/buildchain-contract.json +123 -32
  21. package/dist/site/buildchain-site.json +96 -28
  22. package/dist/site/capability-registry.json +6 -6
  23. package/dist/site/cli-registry.json +5 -2
  24. package/dist/site/controller-registry.json +41 -5
  25. package/dist/site/kfd-claims.json +172 -23
  26. package/dist/site/kfd-upstream-aggregate.json +1 -1
  27. package/dist/site/manual-registry.json +6 -6
  28. package/dist/site/node-api-registry.json +1474 -215
  29. package/dist/site/page-registry.json +85 -17
  30. package/dist/site/public-surface-audit.json +91 -21
  31. package/dist/site/publication-authority-registry.json +28 -1
  32. package/dist/site/publication-registry.json +4 -4
  33. package/dist/site/release-provenance.json +5 -0
  34. package/dist/site/schemas/v4-publication-qualification-v1.schema.json +51 -0
  35. package/dist/site/site-manifest.json +10 -10
  36. package/dist/site/workflow-registry.json +94 -18
  37. package/docs/MAP.md +1 -1
  38. package/docs/cli-reference.md +4 -4
  39. package/docs/dev-delivery-warrant.md +33 -9
  40. package/docs/node-api-reference.md +291 -206
  41. package/docs/publish-transaction.md +11 -4
  42. package/docs/release-candidate.md +7 -0
  43. package/docs/v4-adopter-delivery.md +23 -4
  44. package/docs/v4-declarative-release-tail-migration.md +43 -0
  45. package/package.json +8 -3
  46. package/packages/core/adopter-delivery-passport.js +36 -0
  47. package/packages/core/buildchain-contract.js +31 -1
  48. package/packages/core/buildchain-publication-authority.js +1 -0
  49. package/packages/core/dev-delivery-warrant-legacy-recovery.js +246 -0
  50. package/packages/core/dev-delivery-warrant-settlement.js +239 -3
  51. package/packages/core/dev-delivery-warrant-state.js +15 -2
  52. package/packages/core/dev-delivery-warrant.js +21 -4
  53. package/packages/core/github-governance-authority.js +4 -4
  54. package/packages/core/index.js +1 -0
  55. package/packages/core/paper-scaffold-content.js +401 -0
  56. package/packages/core/paper.js +12 -378
  57. package/packages/core/publication-control-plane-audit.js +135 -111
  58. package/packages/core/publication-rehearsal-projection.js +104 -0
  59. package/packages/core/publication-rehearsal-runtime.js +190 -0
  60. package/packages/core/release-candidate-recovery.js +6 -5
  61. package/packages/core/release-passport.js +82 -184
  62. package/packages/core/v4-cross-platform-adopter-qualification.js +343 -0
  63. package/packages/core/v4-floating-consumer-policy.js +3 -2
  64. package/packages/core/v4-floating-consumer-release-passport.js +134 -15
  65. package/packages/core/v4-publication-qualification.js +222 -0
  66. package/scripts/artifact-signing-controller-core.mjs +1 -1
  67. package/scripts/audit-publication-control-plane.mjs +17 -17
  68. package/scripts/buildchain-cli-help.mjs +3 -0
  69. package/scripts/check-internal-architecture.mjs +23 -3
  70. package/scripts/check-inventory.mjs +23 -5
  71. package/scripts/check-maintainability.mjs +145 -4
  72. package/scripts/check-project-cut-merge-queue-admission.mjs +87 -0
  73. package/scripts/check-v3-v4-capability-inventory.mjs +574 -0
  74. package/scripts/check-v4-floating-consumer-policy-contract.mjs +10 -3
  75. package/scripts/check-v4-runtime-semantic-closure.mjs +266 -0
  76. package/scripts/dev-delivery-warrant-options.mjs +42 -15
  77. package/scripts/dev-delivery-warrant.mjs +59 -6
  78. package/scripts/dev-pr-auto-merge.mjs +25 -11
  79. package/scripts/dev-pr-delivery-warrant.mjs +44 -0
  80. package/scripts/dev-pr-prequeue-guard.mjs +0 -18
  81. package/scripts/dispatch-artifact-signing-authority.mjs +1 -1
  82. package/scripts/generate-agent-change-map.mjs +118 -0
  83. package/scripts/generate-release-candidate-passport.mjs +26 -1
  84. package/scripts/generate-site-bundle.mjs +6 -0
  85. package/scripts/maintainability-domain-metrics.mjs +237 -0
  86. package/scripts/maintainability-governance.mjs +473 -0
  87. package/scripts/maintainability-metrics.mjs +28 -6
  88. package/scripts/project-cut-merge-queue-admission.mjs +394 -0
  89. package/scripts/promotion-routing-evidence.mjs +35 -6
  90. package/scripts/release-candidate-resolver.mjs +44 -0
  91. package/scripts/release-line-policy.mjs +25 -15
  92. package/scripts/release-tail.mjs +19 -2
  93. package/scripts/resume-from-candidate-run.mjs +106 -103
  94. package/scripts/run-lifecycle-core.mjs +341 -376
  95. package/scripts/site-capability-metadata.mjs +4 -0
  96. package/scripts/stable-candidate-qualification.mjs +9 -10
  97. package/scripts/v3-v4-capability-catalog.mjs +439 -0
  98. package/scripts/v4-cross-platform-adopter-qualification.mjs +228 -0
  99. package/scripts/v4-declarative-promotion-admission.mjs +42 -0
@@ -1,13 +1,18 @@
1
1
  import {
2
+ devDeliveryClone as clone,
2
3
  devDeliveryContentRoot,
3
4
  devDeliveryExactRoot as exactRoot,
4
5
  devDeliveryExactSha as exactSha,
5
6
  devDeliveryPositiveInteger as positiveInteger,
6
7
  devDeliveryText as text,
8
+ devDeliveryTimestamp as timestamp,
7
9
  } from "./dev-delivery-common.js";
10
+ import { verifyIntegrationDeliveryProof } from "./dev-delivery-proof.js";
8
11
 
9
12
  export const DEV_DELIVERY_SETTLEMENT_RECEIPT_SCHEMA =
10
13
  "kungfu.buildchain.dev-delivery-settlement-receipt/v1";
14
+ export const DEV_DELIVERY_TERMINAL_EVIDENCE_CORRECTION_SCHEMA =
15
+ "kungfu.buildchain.dev-delivery-terminal-evidence-correction/v1";
11
16
 
12
17
  const PROVIDER_FAILURE_FIELDS = [
13
18
  "transferRoot",
@@ -16,6 +21,233 @@ const PROVIDER_FAILURE_FIELDS = [
16
21
  "sealJobId",
17
22
  ];
18
23
 
24
+ function correctionBody(input) {
25
+ const body = clone(input || {});
26
+ delete body.correctionRoot;
27
+ return body;
28
+ }
29
+
30
+ export function normalizeTerminalEvidenceCorrection(
31
+ input,
32
+ { candidate, repository, protectedBase } = {},
33
+ ) {
34
+ const correction = correctionBody(input);
35
+ if (correction.schema !== DEV_DELIVERY_TERMINAL_EVIDENCE_CORRECTION_SCHEMA) {
36
+ throw new Error("unsupported terminal evidence correction schema");
37
+ }
38
+ correction.candidateId = exactRoot(
39
+ correction.candidateId,
40
+ "terminal evidence correction candidateId",
41
+ );
42
+ correction.pullRequestNumber = positiveInteger(
43
+ correction.pullRequestNumber,
44
+ "terminal evidence correction pullRequestNumber",
45
+ );
46
+ correction.sourceHead = exactSha(
47
+ correction.sourceHead,
48
+ "terminal evidence correction sourceHead",
49
+ );
50
+ correction.outcome = text(correction.outcome);
51
+ correction.priorEvidenceRoot = exactRoot(
52
+ correction.priorEvidenceRoot,
53
+ "terminal evidence correction priorEvidenceRoot",
54
+ );
55
+ correction.correctedAt = timestamp(
56
+ correction.correctedAt,
57
+ "terminal evidence correction correctedAt",
58
+ );
59
+ correction.reason = text(correction.reason);
60
+ if (!correction.reason) {
61
+ throw new Error("terminal evidence correction reason is required");
62
+ }
63
+ const verification = verifyIntegrationDeliveryProof(
64
+ correction.integrationProof,
65
+ );
66
+ if (!verification.ok) {
67
+ throw new Error(
68
+ `terminal evidence correction requires an exact integration proof: ${verification.reason}`,
69
+ );
70
+ }
71
+ if (
72
+ correction.integrationProof.currentBase !==
73
+ correction.integrationProof.mergeGroupHead ||
74
+ correction.integrationProof.replayTree !==
75
+ correction.integrationProof.mergeGroupTree
76
+ ) {
77
+ throw new Error(
78
+ "terminal evidence correction requires exact merge-group commit and tree continuity",
79
+ );
80
+ }
81
+ if (candidate) {
82
+ const checks = {
83
+ candidateId: correction.candidateId === candidate.candidateId,
84
+ pullRequestNumber:
85
+ correction.pullRequestNumber === candidate.pullRequestNumber,
86
+ sourceHead: correction.sourceHead === candidate.sourceHead,
87
+ outcome:
88
+ correction.outcome === candidate.status &&
89
+ correction.outcome === candidate.terminal?.outcome,
90
+ priorEvidenceRoot:
91
+ correction.priorEvidenceRoot === candidate.terminal?.evidenceRoot,
92
+ repository: correction.integrationProof.repository === repository,
93
+ protectedBase:
94
+ correction.integrationProof.protectedBase === protectedBase,
95
+ sourceProofRoot:
96
+ correction.integrationProof.sourceProofRoot ===
97
+ candidate.sourceProofRoot,
98
+ warrantCandidateId:
99
+ correction.integrationProof.warrantCandidateId ===
100
+ candidate.candidateId,
101
+ warrantFencingToken:
102
+ correction.integrationProof.warrantFencingToken ===
103
+ candidate.terminal?.fencingToken,
104
+ warrantGeneration:
105
+ correction.integrationProof.warrantGeneration ===
106
+ candidate.terminal?.leaseGeneration,
107
+ };
108
+ const failed = Object.entries(checks)
109
+ .filter(([, matches]) => !matches)
110
+ .map(([field]) => field);
111
+ if (failed.length > 0) {
112
+ throw new Error(
113
+ `terminal evidence correction identity drift: ${failed.join(", ")}`,
114
+ );
115
+ }
116
+ }
117
+ const correctionRoot = devDeliveryContentRoot(correction);
118
+ if (input?.correctionRoot && input.correctionRoot !== correctionRoot) {
119
+ throw new Error("terminal evidence correction root drift");
120
+ }
121
+ return { ...correction, correctionRoot };
122
+ }
123
+
124
+ export function effectiveTerminalEvidenceRoot(candidate) {
125
+ return (
126
+ candidate?.terminal?.integrationEvidenceCorrection?.integrationProof
127
+ ?.proofRoot ||
128
+ candidate?.terminal?.evidenceRoot ||
129
+ ""
130
+ );
131
+ }
132
+
133
+ export function createTerminalEvidenceCorrection(
134
+ candidate,
135
+ input,
136
+ { repository, protectedBase, now } = {},
137
+ ) {
138
+ return normalizeTerminalEvidenceCorrection(
139
+ {
140
+ schema: DEV_DELIVERY_TERMINAL_EVIDENCE_CORRECTION_SCHEMA,
141
+ candidateId: candidate?.candidateId,
142
+ pullRequestNumber: candidate?.pullRequestNumber,
143
+ sourceHead: candidate?.sourceHead,
144
+ outcome: candidate?.status,
145
+ priorEvidenceRoot: input?.expectedPriorEvidenceRoot,
146
+ integrationProof: input?.integrationProof,
147
+ correctedAt: now,
148
+ reason: input?.reason,
149
+ },
150
+ { candidate, repository, protectedBase },
151
+ );
152
+ }
153
+
154
+ export function createDevDeliveryTerminalEvidenceReconciler({
155
+ normalizeQueue,
156
+ transition,
157
+ }) {
158
+ return function reconcileDevDeliveryTerminalEvidence(
159
+ queueInput,
160
+ input,
161
+ { now = new Date().toISOString() } = {},
162
+ ) {
163
+ const before = normalizeQueue(queueInput);
164
+ const candidate = before.candidates.find(
165
+ (entry) =>
166
+ entry.candidateId === exactRoot(input?.candidateId, "candidateId"),
167
+ );
168
+ if (!candidate)
169
+ throw new Error("terminal evidence candidate does not exist");
170
+ if (candidate.status !== "merged") {
171
+ throw new Error(
172
+ "integration evidence correction requires a merged candidate",
173
+ );
174
+ }
175
+ const existing = candidate.terminal?.integrationEvidenceCorrection;
176
+ const correction = createTerminalEvidenceCorrection(candidate, input, {
177
+ repository: before.repository,
178
+ protectedBase: before.protectedBase,
179
+ now: existing?.correctedAt || timestamp(now, "now"),
180
+ });
181
+ if (existing) {
182
+ if (existing.correctionRoot !== correction.correctionRoot) {
183
+ throw new Error(
184
+ "terminal evidence correction already exists with different evidence",
185
+ );
186
+ }
187
+ const receipt = {
188
+ schema: DEV_DELIVERY_SETTLEMENT_RECEIPT_SCHEMA,
189
+ action: "duplicate-terminal-evidence-correction-noop",
190
+ applicable: true,
191
+ repository: before.repository,
192
+ protectedBase: before.protectedBase,
193
+ candidateId: candidate.candidateId,
194
+ pullRequestNumber: candidate.pullRequestNumber,
195
+ sourceHead: candidate.sourceHead,
196
+ outcome: candidate.status,
197
+ priorEvidenceRoot: candidate.terminal.evidenceRoot,
198
+ evidenceRoot: correction.integrationProof.proofRoot,
199
+ correctionRoot: correction.correctionRoot,
200
+ expectedOldStateRoot: before.stateRoot,
201
+ nextStateRoot: before.stateRoot,
202
+ nextAction:
203
+ "Retain the exact verified integration evidence correction.",
204
+ };
205
+ return {
206
+ queue: before,
207
+ receipt,
208
+ receiptRoot: devDeliveryContentRoot(receipt),
209
+ };
210
+ }
211
+ const transaction = transition(
212
+ before,
213
+ (queue) => {
214
+ const mutable = queue.candidates.find(
215
+ (entry) => entry.candidateId === candidate.candidateId,
216
+ );
217
+ mutable.terminal = {
218
+ ...mutable.terminal,
219
+ integrationEvidenceCorrection: correction,
220
+ };
221
+ return { candidate: mutable };
222
+ },
223
+ correction.correctedAt,
224
+ );
225
+ const receipt = {
226
+ schema: DEV_DELIVERY_SETTLEMENT_RECEIPT_SCHEMA,
227
+ action: "terminal-evidence-corrected",
228
+ applicable: true,
229
+ repository: transaction.after.repository,
230
+ protectedBase: transaction.after.protectedBase,
231
+ candidateId: candidate.candidateId,
232
+ pullRequestNumber: candidate.pullRequestNumber,
233
+ sourceHead: candidate.sourceHead,
234
+ outcome: candidate.status,
235
+ priorEvidenceRoot: candidate.terminal.evidenceRoot,
236
+ evidenceRoot: correction.integrationProof.proofRoot,
237
+ correctionRoot: correction.correctionRoot,
238
+ expectedOldStateRoot: transaction.expectedOldStateRoot,
239
+ nextStateRoot: transaction.after.stateRoot,
240
+ nextAction:
241
+ "Read back the corrected terminal candidate and repeat settlement idempotently.",
242
+ };
243
+ return {
244
+ queue: transaction.after,
245
+ receipt,
246
+ receiptRoot: devDeliveryContentRoot(receipt),
247
+ };
248
+ };
249
+ }
250
+
19
251
  export function normalizeProviderFailureAuthorityBinding(
20
252
  input = {},
21
253
  { required = false } = {},
@@ -56,7 +288,7 @@ function noopReceipt(queue, identity, candidate, action, details = {}) {
56
288
  outcome: identity.outcome,
57
289
  candidateId: candidate?.candidateId || null,
58
290
  evidenceRoot:
59
- candidate?.terminal?.evidenceRoot || identity.evidenceRoot || null,
291
+ effectiveTerminalEvidenceRoot(candidate) || identity.evidenceRoot || null,
60
292
  expectedOldStateRoot: queue.stateRoot,
61
293
  nextStateRoot: queue.stateRoot,
62
294
  nextAction: "No fenced delivery state remains for this terminal event.",
@@ -95,7 +327,7 @@ function settleTerminalCandidate(queue, identity, candidate) {
95
327
  "duplicate terminal event provider failure authority drift",
96
328
  );
97
329
  }
98
- if (candidate.terminal?.evidenceRoot !== identity.evidenceRoot) {
330
+ if (effectiveTerminalEvidenceRoot(candidate) !== identity.evidenceRoot) {
99
331
  throw new Error("duplicate terminal event evidenceRoot drift");
100
332
  }
101
333
  const receipt = noopReceipt(
@@ -103,6 +335,7 @@ function settleTerminalCandidate(queue, identity, candidate) {
103
335
  identity,
104
336
  candidate,
105
337
  "duplicate-terminal-event-noop",
338
+ { successorWake: candidate.terminal?.successorWake || null },
106
339
  );
107
340
  return { queue, receipt, receiptRoot: devDeliveryContentRoot(receipt) };
108
341
  }
@@ -207,7 +440,10 @@ export function createDevDeliveryTerminalSettler({
207
440
  throw new Error("stale fencing token");
208
441
  if (leaseGeneration !== queue.activeWarrant.generation)
209
442
  throw new Error("stale lease generation");
210
- if (identity.outcome === "dequeued") {
443
+ if (
444
+ identity.outcome === "dequeued" &&
445
+ queue.activeWarrant.phase === "provisional"
446
+ ) {
211
447
  return retainDequeuedWarrant(
212
448
  queue,
213
449
  identity,
@@ -19,7 +19,10 @@ import {
19
19
  normalizeNativeCommandContract,
20
20
  validateActiveDevDeliveryWarrant,
21
21
  } from "./dev-delivery-native-proof.js";
22
- import { normalizeProviderFailureAuthorityBinding } from "./dev-delivery-warrant-settlement.js";
22
+ import {
23
+ normalizeProviderFailureAuthorityBinding,
24
+ normalizeTerminalEvidenceCorrection,
25
+ } from "./dev-delivery-warrant-settlement.js";
23
26
  import {
24
27
  compareReleaseBlockerPriority,
25
28
  normalizeReleaseBlockerPriorityClaim,
@@ -244,8 +247,18 @@ function normalizeCandidate(input, expected) {
244
247
  "provider failure authority can exist only on terminal-failure state",
245
248
  );
246
249
  }
247
- if (failureAuthority) {
250
+ if (failureAuthority)
248
251
  candidate.terminal = { ...candidate.terminal, ...failureAuthority };
252
+ if (candidate.terminal.integrationEvidenceCorrection) {
253
+ candidate.terminal.integrationEvidenceCorrection =
254
+ normalizeTerminalEvidenceCorrection(
255
+ candidate.terminal.integrationEvidenceCorrection,
256
+ {
257
+ candidate,
258
+ repository: expected.repository,
259
+ protectedBase: expected.protectedBase,
260
+ },
261
+ );
249
262
  }
250
263
  }
251
264
  if (Object.hasOwn(input, "affectedPaths")) {
@@ -11,7 +11,9 @@ import {
11
11
  createCancelQueuedDevDeliveryCandidate,
12
12
  } from "./dev-delivery-warrant-cancellation.js";
13
13
  import {
14
+ createDevDeliveryTerminalEvidenceReconciler,
14
15
  DEV_DELIVERY_SETTLEMENT_RECEIPT_SCHEMA,
16
+ DEV_DELIVERY_TERMINAL_EVIDENCE_CORRECTION_SCHEMA,
15
17
  createDevDeliveryTerminalSettler,
16
18
  normalizeProviderFailureAuthorityBinding,
17
19
  } from "./dev-delivery-warrant-settlement.js";
@@ -91,6 +93,7 @@ export {
91
93
  };
92
94
  export { DEV_DELIVERY_CANCELLATION_RECEIPT_SCHEMA };
93
95
  export { DEV_DELIVERY_SETTLEMENT_RECEIPT_SCHEMA };
96
+ export { DEV_DELIVERY_TERMINAL_EVIDENCE_CORRECTION_SCHEMA };
94
97
 
95
98
  export function selectDevDeliveryWarrant(
96
99
  queueInput,
@@ -437,6 +440,10 @@ export function closeDevDeliveryWarrant(
437
440
  ...(failureAuthority || {}),
438
441
  };
439
442
  queue.activeWarrant = null;
443
+ candidate.terminal.successorWake = createDevDeliverySuccessorWake(
444
+ queue,
445
+ currentTime,
446
+ );
440
447
  return { candidate, active };
441
448
  },
442
449
  currentTime,
@@ -453,10 +460,7 @@ export function closeDevDeliveryWarrant(
453
460
  ...(failureAuthority || {}),
454
461
  expectedOldStateRoot: transaction.expectedOldStateRoot,
455
462
  nextStateRoot: transaction.after.stateRoot,
456
- successorWake: createDevDeliverySuccessorWake(
457
- transaction.after,
458
- currentTime,
459
- ),
463
+ successorWake: transaction.result.candidate.terminal.successorWake,
460
464
  nextAction: "Select the next queued candidate, if any.",
461
465
  };
462
466
  return {
@@ -514,6 +518,11 @@ export const settleDevDeliveryTerminalEvent = createDevDeliveryTerminalSettler({
514
518
  cancelQueued: cancelQueuedDevDeliveryCandidate,
515
519
  terminalStates: TERMINAL_STATES,
516
520
  });
521
+ export const reconcileDevDeliveryTerminalEvidence =
522
+ createDevDeliveryTerminalEvidenceReconciler({
523
+ normalizeQueue: normalizeDevDeliveryQueue,
524
+ transition,
525
+ });
517
526
  export function observeDevDeliveryQueue(
518
527
  queueInput,
519
528
  { now = new Date().toISOString(), allowLegacyV3Readback = false } = {},
@@ -543,6 +552,14 @@ export function observeDevDeliveryQueue(
543
552
  ) || null
544
553
  : null,
545
554
  states,
555
+ pendingSuccessorWakes: queue.candidates
556
+ .filter((candidate) => candidate.terminal?.successorWake)
557
+ .map((candidate) => ({
558
+ pullRequestNumber: candidate.pullRequestNumber,
559
+ sourceHead: candidate.sourceHead,
560
+ outcome: candidate.status,
561
+ successorWake: candidate.terminal.successorWake,
562
+ })),
546
563
  queued: queued.map((entry, index) => ({
547
564
  position: index + 1,
548
565
  candidateId: entry.candidate.candidateId,
@@ -110,6 +110,8 @@ const PUBLIC_REPOSITORY_TARGETS = Object.freeze({
110
110
  "site-libkungfu-dev": [
111
111
  target("main", [check("web-surface / Record web-surface controller receipt")], false),
112
112
  ],
113
+ taolu: ["dev", "alpha", "release"].map((family) => target(`${family}/v1/v1.0`,
114
+ [check("build / Summarize build contract"), check("stage-capsule / Reconcile exact three-platform evidence")], false)),
113
115
  });
114
116
  const PUBLIC_REPOSITORIES = Object.freeze(Object.keys(PUBLIC_REPOSITORY_TARGETS).sort());
115
117
  const PROTECTED_AUTHORITY_PATHS = Object.freeze([
@@ -497,10 +499,8 @@ export function createBuildchainGithubGovernanceAuthority() {
497
499
  privateRepositoryPolicy: "excluded-from-managed-zone",
498
500
  unknownRepositoryPolicy: "non-authoritative-until-explicit-admission",
499
501
  baseline: {
500
- observedOn: "2026-07-30",
501
- repositoryCount: 16,
502
- publicCount: 16,
503
- privateCount: 0,
502
+ observedOn: "2026-08-28", repositoryCount: 17,
503
+ publicCount: 17, privateCount: 0,
504
504
  authoritativePublicTargetCount: Object.values(PUBLIC_REPOSITORY_TARGETS)
505
505
  .reduce((count, targets) => count + targets.length, 0),
506
506
  },
@@ -646,6 +646,7 @@ export {
646
646
  export * from "./release-propagation.js";
647
647
  export * from "./v4-floating-consumer-policy.js";
648
648
  export * from "./v4-runtime-ref-resume-authority.js";
649
+ export * from "./v4-publication-qualification.js";
649
650
 
650
651
  export {
651
652
  RELEASE_ACTIVATION_CONTRACT,