@patronage/software-factory 0.30.0-alpha.1 → 0.30.0-beta.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.
package/dist/schemas.d.ts CHANGED
@@ -13,7 +13,7 @@ interface WaivedDemand {
13
13
  operator: string;
14
14
  rationale: string;
15
15
  recordedAt: string;
16
- session: string;
16
+ session?: string;
17
17
  /** The demand's refusals at evaluation time, preserved verbatim. */
18
18
  unmetReasons: string[];
19
19
  }
@@ -127,7 +127,6 @@ type ResolvedPrVerifyMode = "docs-only" | "trivial" | "full";
127
127
  declare const reviewPromptSectionSchema: z.ZodObject<{
128
128
  provenance: z.ZodEnum<{
129
129
  "prior-review-ledger": "prior-review-ledger";
130
- "profile-standing-checklist": "profile-standing-checklist";
131
130
  "issue-review-focus": "issue-review-focus";
132
131
  }>;
133
132
  source: z.ZodString;
@@ -254,7 +253,6 @@ declare const readinessRepairSchema: z.ZodObject<{
254
253
  action: z.ZodString;
255
254
  code: z.ZodEnum<{
256
255
  "undraft-pr": "undraft-pr";
257
- "render-pr-body-sections": "render-pr-body-sections";
258
256
  "await-post-undraft-checks": "await-post-undraft-checks";
259
257
  }>;
260
258
  command: z.ZodString;
@@ -289,9 +287,7 @@ declare const managedReadinessLedgerSchema: z.ZodObject<{
289
287
  "out-of-scope": "out-of-scope";
290
288
  }>;
291
289
  }, z.core.$strip>>>;
292
- finalReviewPoint: z.ZodBoolean;
293
290
  github: z.ZodObject<{
294
- currentWithBase: z.ZodBoolean;
295
291
  draft: z.ZodBoolean;
296
292
  mergeStateStatus: z.ZodString;
297
293
  mergeable: z.ZodString;
@@ -302,67 +298,17 @@ declare const managedReadinessLedgerSchema: z.ZodObject<{
302
298
  pending: "pending";
303
299
  none: "none";
304
300
  }>;
301
+ reviewDecision: z.ZodOptional<z.ZodNullable<z.ZodString>>;
305
302
  unresolvedReviewThreads: z.ZodNumber;
306
303
  }, z.core.$strip>;
307
- handledCommentsProducer: z.ZodOptional<z.ZodObject<{
308
- identity: z.ZodString;
309
- mode: z.ZodEnum<{
310
- app: "app";
311
- "commit-status": "commit-status";
312
- }>;
313
- }, z.core.$strip>>;
314
- handledHumanComments: z.ZodOptional<z.ZodArray<z.ZodObject<{
315
- clearedAt: z.ZodOptional<z.ZodString>;
316
- sessionId: z.ZodOptional<z.ZodString>;
317
- source: z.ZodEnum<{
318
- cli: "cli";
319
- "check-run": "check-run";
320
- }>;
321
- url: z.ZodString;
322
- }, z.core.$strip>>>;
323
304
  headSha: z.ZodString;
324
305
  mergeBaseSha: z.ZodOptional<z.ZodString>;
325
306
  patchId: z.ZodString;
326
- postReadinessHumanComments: z.ZodOptional<z.ZodArray<z.ZodObject<{
327
- author: z.ZodString;
328
- createdAt: z.ZodString;
329
- summary: z.ZodString;
330
- url: z.ZodString;
331
- }, z.core.$strip>>>;
332
- postReadinessHumanReviews: z.ZodOptional<z.ZodArray<z.ZodObject<{
333
- author: z.ZodString;
334
- createdAt: z.ZodString;
335
- summary: z.ZodString;
336
- url: z.ZodString;
337
- }, z.core.$strip>>>;
338
307
  pr: z.ZodNumber;
339
- previewDeploy: z.ZodOptional<z.ZodObject<{
340
- adminUrl: z.ZodOptional<z.ZodString>;
341
- apiHealthUrl: z.ZodOptional<z.ZodString>;
342
- headSha: z.ZodOptional<z.ZodString>;
343
- localPreviewProof: z.ZodOptional<z.ZodUnknown>;
344
- localProofPath: z.ZodOptional<z.ZodString>;
345
- proofSource: z.ZodOptional<z.ZodEnum<{
346
- "github-actions": "github-actions";
347
- "local-self-certified": "local-self-certified";
348
- }>>;
349
- publicUrl: z.ZodOptional<z.ZodString>;
350
- seedStatus: z.ZodEnum<{
351
- unknown: "unknown";
352
- passed: "passed";
353
- failed: "failed";
354
- skipped: "skipped";
355
- }>;
356
- stage: z.ZodOptional<z.ZodString>;
357
- timingsMs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodNumber>>>;
358
- workflowRunUrl: z.ZodOptional<z.ZodString>;
359
- }, z.core.$strip>>;
360
- previewDeployRequired: z.ZodBoolean;
361
308
  repairs: z.ZodDefault<z.ZodArray<z.ZodObject<{
362
309
  action: z.ZodString;
363
310
  code: z.ZodEnum<{
364
311
  "undraft-pr": "undraft-pr";
365
- "render-pr-body-sections": "render-pr-body-sections";
366
312
  "await-post-undraft-checks": "await-post-undraft-checks";
367
313
  }>;
368
314
  command: z.ZodString;
@@ -428,7 +374,6 @@ declare const managedReadinessLedgerSchema: z.ZodObject<{
428
374
  }>>;
429
375
  reviews: z.ZodObject<{
430
376
  correctness: z.ZodObject<{
431
- docsOnlyDeltaAccepted: z.ZodOptional<z.ZodBoolean>;
432
377
  required: z.ZodBoolean;
433
378
  reviewedHeadSha: z.ZodOptional<z.ZodString>;
434
379
  reviewedPatchId: z.ZodOptional<z.ZodString>;
@@ -441,7 +386,6 @@ declare const managedReadinessLedgerSchema: z.ZodObject<{
441
386
  }>;
442
387
  }, z.core.$strip>;
443
388
  security: z.ZodOptional<z.ZodObject<{
444
- docsOnlyDeltaAccepted: z.ZodOptional<z.ZodBoolean>;
445
389
  required: z.ZodBoolean;
446
390
  reviewedHeadSha: z.ZodOptional<z.ZodString>;
447
391
  reviewedPatchId: z.ZodOptional<z.ZodString>;
@@ -455,12 +399,6 @@ declare const managedReadinessLedgerSchema: z.ZodObject<{
455
399
  }, z.core.$strip>>;
456
400
  }, z.core.$strip>;
457
401
  schemaVersion: z.ZodLiteral<1>;
458
- stackRole: z.ZodEnum<{
459
- single: "single";
460
- slice: "slice";
461
- rollup: "rollup";
462
- "merge-gate prerequisite": "merge-gate prerequisite";
463
- }>;
464
402
  verification: z.ZodObject<{
465
403
  command: z.ZodLiteral<"patronage-factory pr:verify">;
466
404
  docsOnlyDeltaAccepted: z.ZodOptional<z.ZodBoolean>;
@@ -476,7 +414,7 @@ declare const managedReadinessLedgerSchema: z.ZodObject<{
476
414
  }, z.core.$strip>;
477
415
  }, z.core.$strip>;
478
416
  type ReadinessRepair = z.infer<typeof readinessRepairSchema>;
479
- type ReadinessStatus = "ready" | "blocked" | "slice-ready/not-final";
417
+ type ReadinessStatus = "ready" | "blocked";
480
418
  type ManagedReadinessLedger = z.infer<typeof managedReadinessLedgerSchema>;
481
419
  //#endregion
482
420
  //#region src/pr-ready.d.ts
@@ -484,8 +422,8 @@ interface PrReadyProof {
484
422
  schemaVersion: 3;
485
423
  /**
486
424
  * What GitHub actually did when this run armed native auto-merge (#477).
487
- * Present exactly when readiness passed and the arming ran; read back from
488
- * the PR rather than inferred from the invocation, because `gh pr merge
425
+ * Present exactly when a ready wave authorizes machine merge and arming ran;
426
+ * read back from the PR rather than inferred from the invocation, because `gh pr merge
489
427
  * --auto` arms, merges, or does nothing with the same exit code and the same
490
428
  * empty output. `not-armed` means the candidate is admitted but nothing will
491
429
  * merge it, and `followUp` carries the re-dispatch.
@@ -524,8 +462,9 @@ interface PrReadyProof {
524
462
  ledger: ManagedReadinessLedger;
525
463
  /**
526
464
  * Actionable facts that did not block (#477): a settling merge-freeze
527
- * generation that armed with a notice, and how each waived demand reads to a
528
- * human. Absent when there are none.
465
+ * generation that permitted readiness and any authorized arming with a
466
+ * notice, an admitted-but-unscheduled false boundary wave, and how each
467
+ * waived demand reads to a human. Absent when there are none.
529
468
  */
530
469
  notices?: string[];
531
470
  /** Committed profile blob evaluated by readiness. Required for merge. */
@@ -540,7 +479,7 @@ interface PrReadyProof {
540
479
  * Demands that were in force, were NOT met, and were waived by the operator
541
480
  * (#354, moved here from the merge-time proof by #477). Each entry carries
542
481
  * the demand's refusals verbatim, so a waived demand can never read as a met
543
- * one; the arming proceeds on the recorded operator act, not on evidence.
482
+ * one; readiness proceeds on the recorded operator act, not on evidence.
544
483
  */
545
484
  waivedDemands?: WaivedDemand[];
546
485
  }
@@ -822,11 +761,6 @@ declare const retroEnvelopeV1Schema: z.ZodObject<{
822
761
  }, z.core.$strict>;
823
762
  kind: z.ZodLiteral<"retro-envelope">;
824
763
  outcome: z.ZodOptional<z.ZodObject<{
825
- mergeCheck: z.ZodOptional<z.ZodEnum<{
826
- pass: "pass";
827
- fail: "fail";
828
- "not-run": "not-run";
829
- }>>;
830
764
  status: z.ZodEnum<{
831
765
  fail: "fail";
832
766
  success: "success";
@@ -1084,7 +1018,6 @@ declare const prReviewProofSchema: z.ZodObject<{
1084
1018
  promptSections: z.ZodOptional<z.ZodArray<z.ZodObject<{
1085
1019
  provenance: z.ZodEnum<{
1086
1020
  "prior-review-ledger": "prior-review-ledger";
1087
- "profile-standing-checklist": "profile-standing-checklist";
1088
1021
  "issue-review-focus": "issue-review-focus";
1089
1022
  }>;
1090
1023
  source: z.ZodString;
@@ -1286,9 +1219,8 @@ declare const prReadyProofSchema: z.ZodObject<{
1286
1219
  "out-of-scope": "out-of-scope";
1287
1220
  }>;
1288
1221
  }, z.core.$strip>>>;
1289
- finalReviewPoint: z.ZodBoolean;
1222
+ finalReviewPoint: z.ZodOptional<z.ZodBoolean>;
1290
1223
  github: z.ZodObject<{
1291
- currentWithBase: z.ZodBoolean;
1292
1224
  draft: z.ZodBoolean;
1293
1225
  mergeStateStatus: z.ZodString;
1294
1226
  mergeable: z.ZodString;
@@ -1299,6 +1231,7 @@ declare const prReadyProofSchema: z.ZodObject<{
1299
1231
  pending: "pending";
1300
1232
  none: "none";
1301
1233
  }>;
1234
+ reviewDecision: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1302
1235
  unresolvedReviewThreads: z.ZodNumber;
1303
1236
  }, z.core.$strip>;
1304
1237
  handledCommentsProducer: z.ZodOptional<z.ZodObject<{
@@ -1326,29 +1259,13 @@ declare const prReadyProofSchema: z.ZodObject<{
1326
1259
  summary: z.ZodString;
1327
1260
  url: z.ZodString;
1328
1261
  }, z.core.$strip>>>;
1262
+ postReadinessHumanReviews: z.ZodOptional<z.ZodArray<z.ZodObject<{
1263
+ author: z.ZodString;
1264
+ createdAt: z.ZodString;
1265
+ summary: z.ZodString;
1266
+ url: z.ZodString;
1267
+ }, z.core.$strip>>>;
1329
1268
  pr: z.ZodNumber;
1330
- previewDeploy: z.ZodOptional<z.ZodObject<{
1331
- adminUrl: z.ZodOptional<z.ZodString>;
1332
- apiHealthUrl: z.ZodOptional<z.ZodString>;
1333
- headSha: z.ZodOptional<z.ZodString>;
1334
- localPreviewProof: z.ZodOptional<z.ZodUnknown>;
1335
- localProofPath: z.ZodOptional<z.ZodString>;
1336
- proofSource: z.ZodOptional<z.ZodEnum<{
1337
- "github-actions": "github-actions";
1338
- "local-self-certified": "local-self-certified";
1339
- }>>;
1340
- publicUrl: z.ZodOptional<z.ZodString>;
1341
- seedStatus: z.ZodEnum<{
1342
- unknown: "unknown";
1343
- passed: "passed";
1344
- failed: "failed";
1345
- skipped: "skipped";
1346
- }>;
1347
- stage: z.ZodOptional<z.ZodString>;
1348
- timingsMs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodNumber>>>;
1349
- workflowRunUrl: z.ZodOptional<z.ZodString>;
1350
- }, z.core.$strip>>;
1351
- previewDeployRequired: z.ZodBoolean;
1352
1269
  repairs: z.ZodDefault<z.ZodArray<z.ZodObject<{
1353
1270
  action: z.ZodString;
1354
1271
  code: z.ZodEnum<{
@@ -1455,7 +1372,6 @@ declare const prReadyProofSchema: z.ZodObject<{
1455
1372
  promptSections: z.ZodOptional<z.ZodArray<z.ZodObject<{
1456
1373
  provenance: z.ZodEnum<{
1457
1374
  "prior-review-ledger": "prior-review-ledger";
1458
- "profile-standing-checklist": "profile-standing-checklist";
1459
1375
  "issue-review-focus": "issue-review-focus";
1460
1376
  }>;
1461
1377
  source: z.ZodString;
@@ -1531,12 +1447,12 @@ declare const prReadyProofSchema: z.ZodObject<{
1531
1447
  }, z.core.$strip>>;
1532
1448
  }, z.core.$strip>;
1533
1449
  schemaVersion: z.ZodLiteral<1>;
1534
- stackRole: z.ZodEnum<{
1450
+ stackRole: z.ZodOptional<z.ZodEnum<{
1535
1451
  single: "single";
1536
1452
  slice: "slice";
1537
1453
  rollup: "rollup";
1538
1454
  "merge-gate prerequisite": "merge-gate prerequisite";
1539
- }>;
1455
+ }>>;
1540
1456
  verification: z.ZodObject<{
1541
1457
  command: z.ZodLiteral<"patronage-factory pr:verify">;
1542
1458
  docsOnlyDeltaAccepted: z.ZodOptional<z.ZodBoolean>;
package/dist/schemas.js CHANGED
@@ -19,34 +19,28 @@ const DEMAND_KEYS = {
19
19
  boundaryWave: "boundary-wave",
20
20
  /** The PR is still a draft. */
21
21
  draft: "draft",
22
- /** The candidate is not the intended final human review point. */
23
- finalReviewPoint: "final-review-point",
24
22
  /** GitHub's own check rollup for the candidate head. */
25
23
  githubChecks: "github-checks",
26
24
  /** Local HEAD and the GitHub PR head must be the same commit. */
27
25
  headIdentity: "head-identity",
28
- /** An unhandled post-readiness human comment or review submission. */
26
+ /** GitHub's live aggregate review decision is CHANGES_REQUESTED. */
29
27
  humanBlocker: "human-blocker",
30
28
  /** The repository-wide merge freeze. */
31
29
  mergeFreeze: "merge-freeze",
32
30
  /** GitHub's mergeability / merge-state rollup. */
33
31
  mergeState: "merge-state",
34
32
  /**
35
- * A native GitHub approval, demanded when the boundary wave in force does
36
- * not authorize machine merge (#477). "Green = authorized to merge" is then
37
- * a property of the branded required check itself.
33
+ * Retired readiness demand, retained solely to parse historical v3 proofs
34
+ * and their HQ payloads. No current command emits it: GitHub approval is
35
+ * neither a review-rung authority nor a scheduling requirement.
38
36
  */
39
37
  nativeApproval: "native-approval",
40
- /** The PR body's required rendered sections. */
41
- prBodySections: "pr-body-sections",
42
38
  /** A current, head-bound, passing typed `pr:verify` proof. */
43
39
  prVerify: "pr-verify",
44
40
  /** The profile-resolved review ladder policy. */
45
41
  reviewLadder: "review-ladder",
46
42
  /** Unresolved GitHub review threads. */
47
- reviewThreads: "review-threads",
48
- /** An explicit trivial waiver that the diff does not support. */
49
- trivialWaiver: "trivial-waiver"
43
+ reviewThreads: "review-threads"
50
44
  };
51
45
  /** The families whose instances are named by a resolved value. */
52
46
  const QUALIFIED_DEMAND_FAMILIES = [
@@ -188,29 +182,18 @@ const blockedReasonIssue = (message) => [{
188
182
  * wire schema so it is one rule rather than two that can drift. It is the
189
183
  * producer's state machine, written down:
190
184
  *
191
- * - `ready` refused nothing, so it carries neither projection, and it is the
192
- * final review point;
193
- * - `slice-ready/not-final` was held back by exactly one demand — being a
194
- * slice — and names it;
195
- * - `blocked` refused something other than being a slice, and says so;
185
+ * - `ready` refused nothing, so it carries neither projection;
186
+ * - `blocked` refused something and says so;
196
187
  * - whichever it is, `blockedReasons` names every refusal listed in
197
188
  * `blockingReasons`, in the same order, as the bounded form of that sentence.
198
189
  *
199
- * Naming the slice demand and the ledger's `finalReviewPoint` are the same
200
- * fact, so a proof that says one and not the other is refused.
201
190
  */
202
191
  const blockedReasonIssues = (proof) => {
203
192
  const named = proof.blockedReasons ?? [];
204
193
  const reasons = proof.blockingReasons ?? [];
205
- const slice = DEMAND_KEYS.finalReviewPoint;
206
- const namesSlice = named.some((reason) => reason.code === slice);
207
194
  if (proof.status === "ready") {
208
195
  if (named.length > 0 || reasons.length > 0) return blockedReasonIssue("a ready pr:ready proof must carry no blocking reasons");
209
- } else if (proof.status === "slice-ready/not-final") {
210
- if (named.length !== 1 || !namesSlice) return blockedReasonIssue(`a slice-ready/not-final pr:ready proof is held back by exactly one demand, ${slice}`);
211
196
  } else if (reasons.length === 0) return blockedReasonIssue("a blocked pr:ready proof must record what blocked it");
212
- else if (named.length > 0 && !named.some((r) => r.code !== slice)) return blockedReasonIssue(`a blocked pr:ready proof must name a demand other than ${slice}`);
213
- if (proof.finalReviewPoint !== void 0 && namesSlice === proof.finalReviewPoint) return blockedReasonIssue(`naming ${slice} and the ledger's finalReviewPoint are the same fact; this proof says both`);
214
197
  if (named.length !== reasons.length) return blockedReasonIssue(`blockedReasons must name every blocking reason: ${reasons.length} reason(s), ${named.length} named`);
215
198
  const drifted = named.findIndex((reason, index) => reason.detail !== blockedReasonDetail(reasons[index]));
216
199
  return drifted === -1 ? [] : blockedReasonIssue(`blockedReasons[${drifted}] does not carry blocking reason ${drifted}; the two projections must tell one story`);
@@ -228,7 +211,7 @@ const demandWaiverSchema = z.object({
228
211
  operator: z.string().trim().min(1),
229
212
  rationale: z.string().trim().min(1),
230
213
  recordedAt: z.iso.datetime(),
231
- session: z.string().trim().min(1)
214
+ session: z.string().trim().min(1).optional()
232
215
  });
233
216
  z.object({
234
217
  command: z.literal("patronage-factory demand:waive"),
@@ -240,7 +223,7 @@ const waivedDemandSchema = z.object({
240
223
  operator: z.string().trim().min(1),
241
224
  rationale: z.string().trim().min(1),
242
225
  recordedAt: z.iso.datetime(),
243
- session: z.string().trim().min(1),
226
+ session: z.string().trim().min(1).optional(),
244
227
  unmetReasons: z.array(z.string().min(1)).min(1)
245
228
  });
246
229
  const MAX_CLOSEOUT_ROWS = 1e3;
@@ -523,11 +506,6 @@ const RetroCycleCountersSchema = z.object({
523
506
  thermoFixRounds: nonNegInt
524
507
  }).strict();
525
508
  const RetroOutcomeSchema = z.object({
526
- mergeCheck: z.enum([
527
- "pass",
528
- "fail",
529
- "not-run"
530
- ]).optional(),
531
509
  status: z.enum([
532
510
  "success",
533
511
  "blocked",
@@ -731,11 +709,7 @@ const PR_REVIEW_SCHEMA_VERSION = 2;
731
709
  const PR_REVIEW_FINDING_PROVENANCE_VERSION = 1;
732
710
  const nonBlankString = z.string().refine((value) => value.trim().length > 0, { message: "must not be blank" });
733
711
  const parseableDateString = z.string().refine((value) => Number.isFinite(Date.parse(value)), { message: "must be a parseable date string" });
734
- const reviewPromptSectionProvenances = [
735
- "prior-review-ledger",
736
- "profile-standing-checklist",
737
- "issue-review-focus"
738
- ];
712
+ const reviewPromptSectionProvenances = ["prior-review-ledger", "issue-review-focus"];
739
713
  const reviewPromptSectionSchema = z.object({
740
714
  provenance: z.enum(reviewPromptSectionProvenances),
741
715
  source: nonBlankString,
@@ -1009,6 +983,18 @@ const reviewStateSchema = z.object({
1009
983
  reviewedPatchId: z.string().optional(),
1010
984
  status: z.enum(REVIEW_STATUS_VALUES)
1011
985
  });
986
+ const historicalPostReadinessCommentSchema = z.object({
987
+ author: z.string().min(1),
988
+ createdAt: z.string().min(1),
989
+ summary: z.string().min(1),
990
+ url: z.string().min(1)
991
+ });
992
+ const historicalHandledHumanCommentSchema = z.object({
993
+ clearedAt: z.string().min(1).optional(),
994
+ sessionId: z.string().min(1).optional(),
995
+ source: z.enum(["check-run", "cli"]),
996
+ url: z.string().min(1)
997
+ });
1012
998
  const managedReadinessLedgerSchema = z.object({
1013
999
  baseSha: z.string().regex(/^[0-9a-f]{40}$/u),
1014
1000
  blockingReasons: z.array(z.string()),
@@ -1026,9 +1012,8 @@ const managedReadinessLedgerSchema = z.object({
1026
1012
  "out-of-scope"
1027
1013
  ])
1028
1014
  })).optional(),
1029
- finalReviewPoint: z.boolean(),
1015
+ finalReviewPoint: z.boolean().optional(),
1030
1016
  github: z.object({
1031
- currentWithBase: z.boolean(),
1032
1017
  draft: z.boolean(),
1033
1018
  mergeStateStatus: z.string(),
1034
1019
  mergeable: z.string(),
@@ -1039,47 +1024,20 @@ const managedReadinessLedgerSchema = z.object({
1039
1024
  "none",
1040
1025
  "unknown"
1041
1026
  ]),
1027
+ reviewDecision: z.string().nullable().optional(),
1042
1028
  unresolvedReviewThreads: z.number().int().nonnegative()
1043
1029
  }),
1044
1030
  handledCommentsProducer: z.object({
1045
1031
  identity: z.string().min(1),
1046
1032
  mode: z.enum(["app", "commit-status"])
1047
1033
  }).optional(),
1048
- handledHumanComments: z.array(z.object({
1049
- clearedAt: z.string().min(1).optional(),
1050
- sessionId: z.string().min(1).optional(),
1051
- source: z.enum(["check-run", "cli"]),
1052
- url: z.string().min(1)
1053
- })).optional(),
1034
+ handledHumanComments: z.array(historicalHandledHumanCommentSchema).optional(),
1054
1035
  headSha: z.string().regex(/^[0-9a-f]{40}$/u),
1055
1036
  mergeBaseSha: z.string().regex(/^[0-9a-f]{40}$/u).optional(),
1056
1037
  patchId: z.string().regex(/^[0-9a-f]{40,64}$/u),
1057
- postReadinessHumanComments: z.array(z.object({
1058
- author: z.string().min(1),
1059
- createdAt: z.string().min(1),
1060
- summary: z.string().min(1),
1061
- url: z.string().min(1)
1062
- })).optional(),
1038
+ postReadinessHumanComments: z.array(historicalPostReadinessCommentSchema).optional(),
1039
+ postReadinessHumanReviews: z.array(historicalPostReadinessCommentSchema).optional(),
1063
1040
  pr: z.number().int().positive(),
1064
- previewDeploy: z.object({
1065
- adminUrl: z.string().optional(),
1066
- apiHealthUrl: z.string().optional(),
1067
- headSha: z.string().optional(),
1068
- localPreviewProof: z.unknown().optional(),
1069
- localProofPath: z.string().optional(),
1070
- proofSource: z.enum(["github-actions", "local-self-certified"]).optional(),
1071
- publicUrl: z.string().optional(),
1072
- seedStatus: z.enum([
1073
- "passed",
1074
- "failed",
1075
- "skipped",
1076
- "unknown"
1077
- ]),
1078
- stage: z.string().optional(),
1079
- timingsMs: z.record(z.string(), z.number().optional()).optional(),
1080
- workflowRunUrl: z.string().optional()
1081
- }).optional(),
1082
- previewDeployRequired: z.boolean(),
1083
1041
  repairs: z.array(readinessRepairSchema).default([]),
1084
1042
  reviewCycleState: z.object({
1085
1043
  autoBlockingFindings: z.number().int().nonnegative(),
@@ -1152,7 +1110,7 @@ const managedReadinessLedgerSchema = z.object({
1152
1110
  "slice",
1153
1111
  "rollup",
1154
1112
  "merge-gate prerequisite"
1155
- ]),
1113
+ ]).optional(),
1156
1114
  verification: z.object({
1157
1115
  command: z.literal("patronage-factory pr:verify"),
1158
1116
  docsOnlyDeltaAccepted: z.boolean().optional(),
@@ -1217,10 +1175,7 @@ const prReadyProofSchema = z.object({
1217
1175
  });
1218
1176
  return;
1219
1177
  }
1220
- for (const issue of blockedReasonIssues({
1221
- ...proof,
1222
- finalReviewPoint: proof.ledger.finalReviewPoint
1223
- })) context.addIssue(issue);
1178
+ for (const issue of blockedReasonIssues({ ...proof })) context.addIssue(issue);
1224
1179
  });
1225
1180
  //#endregion
1226
1181
  export { BLOCKED_REASONS_MAX, BLOCKED_REASON_DETAIL_MAX, BOUNDARY_CHECK_SCHEMA_VERSION, BOUNDARY_REVIEW_PROOF_KIND, EVIDENCE_ENVELOPE_SCHEMA_VERSION, PR_READY_SCHEMA_VERSION, PR_REVIEW_SCHEMA_VERSION, RETRO_ENVELOPE_SCHEMA_VERSION, RETRO_ENVELOPE_VALIDATORS, RETRO_ENVELOPE_WIRE_BOUNDS, SUPPORTED_PR_READY_SCHEMA_VERSIONS, SUPPORTED_PR_VERIFY_SCHEMA_VERSIONS, SUPPORTED_RETRO_ENVELOPE_SCHEMA_VERSIONS, blockedReasonSchema, blockedReasonsSchema, boundaryCheckProofSchema, boundaryReviewProofSchema, closeoutArtifactSchema, evidenceEnvelopeSchema, prReadyProofSchema, prReviewProofSchema, prVerifyProofSchema, retroEnvelopeV1Schema, retroEpicReference, waivedDemandSchema };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patronage/software-factory",
3
- "version": "0.30.0-alpha.1",
3
+ "version": "0.30.0-beta.1",
4
4
  "description": "Shared Patronage software factory CLI and project-profile validation tools",
5
5
  "license": "MIT",
6
6
  "repository": {