@patronage/factory-ci 1.0.0-alpha.21 → 1.0.0-alpha.22

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/README.md CHANGED
@@ -256,6 +256,42 @@ const jobs = [
256
256
 
257
257
  The audit job is `always()` so a failed destroy still runs the stage-wide check. It does not receive a stack name or path filter — per-stack audit filters are rejected because they trade away the whole-stage guarantee (paitronage#1143). `previewCleanupDestroyJobId(stack)` is the same id mapping callers can use when they assemble destroy jobs by hand.
258
258
 
259
+ ### Merge-freeze writer job
260
+
261
+ ```ts
262
+ import { factoryMergeFreezeJob } from "@patronage/factory-ci";
263
+
264
+ const freeze = factoryMergeFreezeJob({
265
+ createGithubAppToken: workflowArtifact.actions.createGithubAppToken,
266
+ needs: [changes, core, docs],
267
+ });
268
+
269
+ const jobs = [
270
+ changes,
271
+ core,
272
+ docs,
273
+ job(freeze.jobId, {
274
+ name: freeze.jobName,
275
+ needs: freeze.needs,
276
+ if: freeze.if,
277
+ runsOn: "ubuntu-latest",
278
+ permissions: freeze.permissions,
279
+ timeoutMinutes: 10,
280
+ steps: freeze.steps,
281
+ }),
282
+ ];
283
+ ```
284
+
285
+ A consumer's generated merge-target-push Verify workflow is the only producer of `patronage-factory/merge-freeze` generations (#356, ADR 0016 as amended; #429, #872). A red merge-target Verify completes a generation active, a green one completes it inactive, and `pr:ready` reads the generation on the candidate's own base tip. No command, scheduled job, or second workflow writes that check run; the operator override (`demand:waive --demand merge-freeze`) waives the demand for one candidate and never writes here.
286
+
287
+ `factoryMergeFreezeJob` owns everything a reader trusts: the check name (`FACTORY_MERGE_FREEZE_CHECK_NAME`), the pinned Patronage Factory App identity, the `actions/create-github-app-token` inputs, the `needs.*.result` fold (`FACTORY_MERGE_FREEZE_VERIFY_RESULT_EXPRESSION`), the merge-target condition (`FACTORY_MERGE_FREEZE_IF`, built from `FACTORY_MERGE_TARGET_REF_CONDITION`), and the job's least-privilege `permissions` (an empty block: the App installation token carries the check-run write, the job uses no `GITHUB_TOKEN` scope, and it never checks out the repository). The caller owns the runner, the timeout, and the `needs` list.
288
+
289
+ That `needs` list is the whole trust input: it must name **every authoritative verification leaf**, because the fold is what decides active or inactive. An empty list is refused — a fold over no needed job always reports success, which would report a merge target nothing verified as green.
290
+
291
+ `if` is `always() && github.event_name == 'push' && (main or epic/**)`. Each clause is load-bearing. `always()` keeps the red path running when a needed job failed. `push` keeps a `pull_request` run from writing a generation at its synthetic merge SHA. The namespace is literal by decision — `main` plus repository-owned `epic/**` integration branches — so a consumer's `push` trigger branch list names the same two things.
292
+
293
+ The job needs no checkout and no install: it mints an App installation token, then makes two Checks API calls. The write is deliberately fail-closed, the opposite of the proof-reuse gate's fail-open shell. The step runs under the runner's default `bash -e {0}`, so any API refusal aborts it, the generation stays absent or `in_progress`, and every arming-time read of that tip refuses until a later push writes a green generation. `factoryMergeFreezeScript()` is that script alone, for a consumer test that executes it against a stubbed `gh` and parses the emitted payload with the factory package's `validateMergeFreezeState` — the round trip that keeps writer and reader from drifting.
294
+
259
295
  ### Generated shell
260
296
 
261
297
  ```ts
@@ -315,6 +351,8 @@ The **proof-reuse gate** decides whether a hosted job may reuse the local verifi
315
351
 
316
352
  The gate runs on pull requests and on pushes to the default branch (#611). A push run first reads proof at the pushed head. A squash merge mints a new commit, so when that direct read finds no generation at all, a **merge fallback** looks up the single merged pull request whose merge commit is the pushed head and reuses that PR head's proven check run — only when the merge commit's tree id equals the proven head's tree id, which makes the pushed content byte-identical to what was verified (a clean squash of an unchanged tip). Patch identity was considered and rejected as the comparator: `git patch-id` normalizes whitespace and ignores base motion, so an identical patch can still integrate into a tree nothing verified. No unique producing PR, an unreadable commit, a proof that is anything but proven, or tree drift from a dirty or stale merge all leave the direct refusal standing and run the full suite. The fallback needs `pull-requests: read` and `contents: read` on the job in addition to `checks: read`; a job that grants less loses only the fallback.
317
353
 
354
+ `reuse` chooses which events may reuse proof (#873). It takes two values and nothing else, because the emitted condition is a trust predicate: a free-text override lets a consumer reuse proof on a ref nothing proved. `"pull-request-and-default-branch"` is the default and the behaviour above. `"pull-request"` emits `github.event_name == 'pull_request'` alone and omits the merge fallback, so every default-branch push executes the full hosted suite and the job needs only `checks: read`. Choose it when the merged commit must be verified in its own right; the consumer then owns that unconditional default-branch cost.
355
+
318
356
  A proof is reusable only when the complete Checks API result (`filter=all`, every page) establishes one unambiguous newest generation by greatest `started_at`, produced by the pinned App for the exact repository and head, completed successfully with `outcome: passed`, and covering every command identity the guarded surface requires. Coverage is the union of `executedCommands` and commands released by `notRequiredCommands` only after the gate validates each release against that same proof binding's command-to-target map and identity-bound impact stamp. Missing, malformed, duplicated, affected, unknown, or differently bound release data refuses reuse and runs the hosted surface. `mode` is reported as diagnostic metadata, never authorized on: a reduced-mode proof whose executed and stamp-authorized released commands cover a surface is reusable.
319
357
 
320
358
  The only thing a consumer chooses is **what its surface requires**, expressed as the plain profile command objects that surface selects — a repository with distinct core and docs jobs selects distinct sets and gets distinct required coverage. `proofReuseRequiredCommands()` is the single derivation both the gate and the assertion go through. Identities are baked into the emitted script, so they are held to a plain `[A-Za-z0-9_][\w.:@/-]*` allow-list and shell-quoted at the interpolation site; a selection carrying anything else is unusable and degrades to a gate that always refuses.
@@ -391,7 +429,7 @@ Registration is a consumer-readable read model. Cleanup outcomes are recorded by
391
429
 
392
430
  Persistence is an injectable GitHub transport in the same style as `mintInstallationToken`: the caller passes `fetch` and a token. This package does not read operator config or hold secrets. Records bind to the Patronage Factory GitHub App (`FACTORY_PROOF_GATE_APP_ID`) and the disposable-stage grammar. Check-runs named `patronage-factory/preview-proof` (`PREVIEW_PROOF_INVENTORY_CHECK_NAME`) carry the registration JSON. This API does not POST or PATCH issue comments.
393
431
 
394
- `list({ owner, repo, pr }, { token })` works with a workflow `GITHUB_TOKEN` (read). `persist` and `recordCleanup` write App-owned check-runs, which GitHub only allows the producing App to update. Pass an installation token the caller minted (`mintInstallationToken`); a job `GITHUB_TOKEN` cannot write those records. There is no `psf` command for this surface.
432
+ `list({ owner, repo, pr }, { token })` works with a workflow `GITHUB_TOKEN` (read). Give that job `permissions: PREVIEW_PROOF_INVENTORY_LIST_PERMISSIONS` (also `previewProofInventory.listPermissions`): `checks: read`, `contents: read`, `pull-requests: read`. A job that omits `pull-requests: read` gets 403 on the PR commit listing for a same-repository PR and discovers nothing (#859). `persist` and `recordCleanup` write App-owned check-runs, which GitHub only allows the producing App to update. Pass an installation token the caller minted (`mintInstallationToken`); a job `GITHUB_TOKEN` cannot write those records. There is no `psf` command for this surface.
395
433
 
396
434
  `recordCleanup` loads the PR's registrations, applies `previewProofLifecycle.transition(..., { type: "cleanup" })`, then persists. Failed then passed uses that same event; in-memory re-entry from a failed outcome is `previewProofLifecycle.recover`, which calls that transition. Unknown stack or stage, and an identity mismatch on the disposable stage or head SHA, fail closed. Check-runs from another App, including `github-actions`, are ignored.
397
435
 
package/dist/index.d.ts CHANGED
@@ -298,6 +298,20 @@ declare const previewProofLifecycle: {
298
298
  */
299
299
  /** Check-run name that carries one registration JSON payload. Not a gate. */
300
300
  declare const PREVIEW_PROOF_INVENTORY_CHECK_NAME = "patronage-factory/preview-proof";
301
+ /**
302
+ * Least privilege for a job whose `GITHUB_TOKEN` calls `list`. A
303
+ * `permissions` block zeroes every unlisted scope, and `list` reads five
304
+ * endpoints: `pulls/{pr}`, `pulls/{pr}/commits`, and the GraphQL force-push
305
+ * timeline (`pull-requests`), `compare` (`contents`), and
306
+ * `commits/{sha}/check-runs` (`checks`). A job
307
+ * that omits `pull-requests: read` fails with 403 on a same-repository PR
308
+ * and skips every destroy matrix (#859). Give the discovery job this object.
309
+ */
310
+ declare const PREVIEW_PROOF_INVENTORY_LIST_PERMISSIONS: Readonly<{
311
+ readonly checks: "read";
312
+ readonly contents: "read";
313
+ readonly "pull-requests": "read";
314
+ }>;
301
315
  interface PreviewProofInventoryStore {
302
316
  list: (input: {
303
317
  owner: string;
@@ -371,6 +385,11 @@ declare class PreviewProofTransportError extends Error {
371
385
  declare const previewProofInventory: {
372
386
  readonly githubStore: (transport: PreviewProofInventoryTransport) => PreviewProofInventoryStore;
373
387
  readonly list: (input: PreviewProofInventoryListInput, access: PreviewProofInventoryAccess) => Promise<readonly PreviewProofRegistration[]>;
388
+ readonly listPermissions: Readonly<{
389
+ readonly checks: "read";
390
+ readonly contents: "read";
391
+ readonly "pull-requests": "read";
392
+ }>;
374
393
  readonly memoryStore: () => PreviewProofInventoryStore;
375
394
  readonly persist: (input: PreviewProofInventoryPersistInput, access: PreviewProofInventoryAccess) => Promise<void>;
376
395
  readonly recordCleanup: (input: PreviewProofInventoryCleanupInput, access: PreviewProofInventoryAccess) => Promise<PreviewProofRegistration>;
@@ -663,6 +682,36 @@ declare const FACTORY_PROOF_GATE_GUARD = "steps.factory-proof.outputs.reuse-proo
663
682
  * the default branch.
664
683
  */
665
684
  declare const FACTORY_PROOF_GATE_IF = "github.event_name == 'pull_request' || (github.event_name == 'push' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch))";
685
+ /**
686
+ * Pull requests only — the condition a consumer gets with
687
+ * `reuse: "pull-request"` (#873).
688
+ *
689
+ * A repository may want its default-branch pushes to always execute the full
690
+ * hosted suite, whatever proof exists: the merged commit is what the fleet
691
+ * deploys, so a periodic unconditional run of every command is a deliberate
692
+ * cost some consumers choose to pay. This condition is that choice, expressed
693
+ * once here rather than as a consumer-written override string. The mode also
694
+ * skips the push-event merge fallback, so no push path can reuse proof even if
695
+ * the workflow reaches the step through some other trigger.
696
+ *
697
+ * Which branches trigger the workflow at all stays repository-owned. This
698
+ * condition only keeps the gate from consulting proof outside a pull request.
699
+ */
700
+ declare const FACTORY_PROOF_GATE_PULL_REQUEST_IF = "github.event_name == 'pull_request'";
701
+ /**
702
+ * Which events may reuse proof.
703
+ *
704
+ * A two-value enum, not a free-text condition: a string lets a consumer write
705
+ * a condition this package cannot reason about — one that reuses proof on an
706
+ * unproven ref — and the emitted condition is a trust predicate. The consumer
707
+ * chooses the mode; `factory-ci` owns what each mode emits.
708
+ *
709
+ * - `pull-request-and-default-branch` (default) pull requests plus pushes to
710
+ * the merge target, with the merge fallback. Today's behaviour.
711
+ * - `pull-request` pull requests only. Default-branch pushes execute the full
712
+ * hosted suite, and the merge fallback is not emitted.
713
+ */
714
+ type FactoryProofGateReuse = "pull-request" | "pull-request-and-default-branch";
666
715
  /**
667
716
  * The complete refusal vocabulary. Deliberately few, because these are the
668
717
  * only distinctions the gate can honestly make from its Checks API reads.
@@ -746,6 +795,13 @@ interface FactoryProofGateOptions {
746
795
  * therefore requires a different coverage.
747
796
  */
748
797
  readonly commands: readonly ProofReuseCommand[];
798
+ /**
799
+ * Which events may reuse proof. Defaults to
800
+ * `"pull-request-and-default-branch"`, the behaviour every consumer has
801
+ * today. `"pull-request"` makes default-branch pushes execute the full
802
+ * hosted suite (#873).
803
+ */
804
+ readonly reuse?: FactoryProofGateReuse;
749
805
  /** Names the suite in the job summary. Changes no trust decision. */
750
806
  readonly surface: string;
751
807
  }
@@ -763,6 +819,7 @@ interface FactoryProofGateOptions {
763
819
  */
764
820
  declare const factoryProofGateScript: ({
765
821
  commands,
822
+ reuse,
766
823
  surface
767
824
  }: FactoryProofGateOptions) => string;
768
825
  interface FactoryProofGateStep {
@@ -772,7 +829,7 @@ interface FactoryProofGateStep {
772
829
  HEAD_SHA: string;
773
830
  }>;
774
831
  readonly id: typeof FACTORY_PROOF_GATE_STEP_ID;
775
- readonly if: typeof FACTORY_PROOF_GATE_IF;
832
+ readonly if: typeof FACTORY_PROOF_GATE_IF | typeof FACTORY_PROOF_GATE_PULL_REQUEST_IF;
776
833
  readonly name: string;
777
834
  readonly run: string;
778
835
  readonly shell: typeof FACTORY_PROOF_GATE_SHELL;
@@ -785,7 +842,9 @@ interface FactoryProofGateStep {
785
842
  * `checks: read`; the push-event merge fallback additionally reads the
786
843
  * producing pull request (`pull-requests: read`) and the two commit objects
787
844
  * whose tree ids it compares (`contents: read`). A job that grants less
788
- * loses only the fallback — the failed read degrades to the full suite.
845
+ * loses only the fallback — the failed read degrades to the full suite. A
846
+ * consumer that passes `reuse: "pull-request"` emits neither the push clause
847
+ * nor the fallback, and needs only `checks: read` (#873).
789
848
  *
790
849
  * A **step, not a job**, and that is not a style preference. A separate gate
791
850
  * job that errored would leave the guarded job `skipped`, and a summary job
@@ -930,6 +989,137 @@ interface FactoryLifecycleContractLane {
930
989
  */
931
990
  declare const factoryLifecycleContractLane: (declaration?: FactoryLifecycleContractLaneOptions) => FactoryLifecycleContractLane | undefined;
932
991
  //#endregion
992
+ //#region src/merge-freeze-job.d.ts
993
+ /**
994
+ * The merge-freeze writer job (#356, ADR 0016 as amended; #429 for the
995
+ * merge-target namespace; #872 for this package).
996
+ *
997
+ * A consumer's generated merge-target-push Verify workflow is the ONLY
998
+ * producer of `patronage-factory/merge-freeze` generations: a red
999
+ * push-triggered Verify completes a generation active, a green one completes
1000
+ * it inactive, and no command, scheduled job, or second workflow writes this
1001
+ * check run. The operator override (`demand:waive --demand merge-freeze`)
1002
+ * waives the demand for one candidate during a fix-forward; it never writes
1003
+ * here.
1004
+ *
1005
+ * The write mirrors what the factory package's merge-freeze reader parses:
1006
+ * create the run `in_progress` with no `started_at` (GitHub stamps the
1007
+ * generation clock — the ordering rule itself is owned by the reader), then
1008
+ * PATCH it completed with the reader-shaped state payload in `output.text`.
1009
+ * The consumer's workflow test executes this exact script against a stubbed
1010
+ * `gh` and parses the emitted payload with `validateMergeFreezeState`, so
1011
+ * writer and reader cannot drift silently.
1012
+ *
1013
+ * Failure posture is deliberately fail-closed and the opposite of the
1014
+ * proof-reuse gate's fail-open shell: this step runs under the runner's
1015
+ * default `bash -e {0}`, so any API refusal aborts the step, the generation
1016
+ * stays absent or `in_progress`, and every `pr:ready` arming-time read of
1017
+ * that tip (#477) refuses until a later push writes a green generation.
1018
+ *
1019
+ * **Ownership line.** This package owns the check name, the App identity, the
1020
+ * `create-github-app-token` inputs, the result fold, the merge-target `if`,
1021
+ * and the job's `permissions`. The caller owns the runner, the `needs` list
1022
+ * of every authoritative verification leaf, the timeout, and any extra env.
1023
+ */
1024
+ /** The one check-run name every merge-freeze reader pins. */
1025
+ declare const FACTORY_MERGE_FREEZE_CHECK_NAME = "patronage-factory/merge-freeze";
1026
+ declare const FACTORY_MERGE_FREEZE_JOB_ID = "freeze";
1027
+ declare const FACTORY_MERGE_FREEZE_JOB_NAME = "Report the merge freeze";
1028
+ /** Step id the token step exposes its installation token under. */
1029
+ declare const FACTORY_MERGE_FREEZE_APP_TOKEN_STEP_ID = "factory-app-token";
1030
+ /**
1031
+ * The GitHub Actions expression that folds the needed jobs' results into the
1032
+ * one word the script branches on. It mirrors the `verify` summary job's
1033
+ * failure condition exactly: any failed or cancelled needed job is a red
1034
+ * merge target.
1035
+ */
1036
+ declare const FACTORY_MERGE_FREEZE_VERIFY_RESULT_EXPRESSION = "${{ (contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')) && 'failure' || 'success' }}";
1037
+ /**
1038
+ * The literal factory merge-target namespace, as a `github.ref` predicate
1039
+ * (#429).
1040
+ *
1041
+ * `main` plus the repository-owned `epic/**` integration branches, and
1042
+ * nothing else. Deliberately literal rather than profile-declared: one
1043
+ * implementation per contract, no configuration machinery for a two-element
1044
+ * namespace whose second element is a namespace prefix the repository itself
1045
+ * owns. `epic/` needs the trailing slash — `startsWith` would otherwise admit
1046
+ * `epicness/…`, which is not a merge target.
1047
+ *
1048
+ * A caller's `push` trigger branch list names the same namespace. That list
1049
+ * decides which events produce a run at all; this predicate decides which of
1050
+ * those runs may write a generation.
1051
+ */
1052
+ declare const FACTORY_MERGE_TARGET_REF_CONDITION: string;
1053
+ /**
1054
+ * `always()` is load-bearing: the red path is the whole point, so the job must
1055
+ * run when a needed verification job failed. `github.event_name == 'push'` is
1056
+ * load-bearing twice over: a `pull_request` run must never write a generation
1057
+ * (its `github.sha` is a synthetic merge commit that no base tip is ever read
1058
+ * at), and a `pull_request` trigger with an `epic/**` base list would
1059
+ * otherwise reach this job.
1060
+ */
1061
+ declare const FACTORY_MERGE_FREEZE_IF: string;
1062
+ /**
1063
+ * Least privilege for the writer job: no `GITHUB_TOKEN` scope at all.
1064
+ *
1065
+ * Both Checks API calls run under the App installation token minted in the
1066
+ * first step (`GH_TOKEN: steps.factory-app-token.outputs.token`), and the job
1067
+ * never checks out the repository. So the job uses no `GITHUB_TOKEN` scope,
1068
+ * and an empty block is the honest declaration. A `checks: write` here would
1069
+ * hand every adopter an unused write scope (#884).
1070
+ */
1071
+ declare const FACTORY_MERGE_FREEZE_PERMISSIONS: Readonly<{}>;
1072
+ /**
1073
+ * The script the freeze step runs. Environment contract:
1074
+ * - `GH_TOKEN`: an installation token for the pinned Patronage Factory App —
1075
+ * the check run must carry that App's identity or every reader rejects it.
1076
+ * - `VERIFY_RESULT`: `success` or `failure` (see the fold expression above).
1077
+ * - `GITHUB_SHA` / `GITHUB_REPOSITORY` / `GITHUB_SERVER_URL` /
1078
+ * `GITHUB_RUN_ID` / `GITHUB_REF_NAME`: runner-provided.
1079
+ *
1080
+ * `GITHUB_REF_NAME` is the merge target this run pushed to — `main` or an
1081
+ * `epic/**` integration branch (#429). The job is gated to `push` events on
1082
+ * exactly those refs, so the branch name is always the short name of a
1083
+ * repository-owned merge target and never a pull-request merge ref. It
1084
+ * appears in both recovery sentences because a reader of an epic-targeting
1085
+ * candidate must be told which branch to fix forward on: the generation lives
1086
+ * on that branch's tip, and only a later green push to THAT branch clears it.
1087
+ */
1088
+ declare const factoryMergeFreezeScript: () => string;
1089
+ interface FactoryMergeFreezeJobOptions<TNeed> {
1090
+ /** The pinned `actions/create-github-app-token` the caller declared. */
1091
+ readonly createGithubAppToken: PinnedAction;
1092
+ /**
1093
+ * Every authoritative verification leaf this generation folds. The elements
1094
+ * are whatever the caller's workflow generator uses for `needs:`; they are
1095
+ * returned unchanged.
1096
+ */
1097
+ readonly needs: readonly TNeed[];
1098
+ /**
1099
+ * Override the result fold. Defaults to
1100
+ * `FACTORY_MERGE_FREEZE_VERIFY_RESULT_EXPRESSION`, which is what a caller
1101
+ * whose summary job folds `needs.*.result` wants. Supply one only when the
1102
+ * caller's red condition is genuinely different.
1103
+ */
1104
+ readonly verifyResultExpression?: string;
1105
+ }
1106
+ interface FactoryMergeFreezeJob<TNeed> {
1107
+ readonly if: typeof FACTORY_MERGE_FREEZE_IF;
1108
+ readonly jobId: typeof FACTORY_MERGE_FREEZE_JOB_ID;
1109
+ readonly jobName: typeof FACTORY_MERGE_FREEZE_JOB_NAME;
1110
+ readonly needs: readonly TNeed[];
1111
+ readonly permissions: typeof FACTORY_MERGE_FREEZE_PERMISSIONS;
1112
+ readonly steps: readonly WorkflowStep[];
1113
+ }
1114
+ /**
1115
+ * Build the merge-freeze writer job.
1116
+ *
1117
+ * An empty `needs` list is refused: a fold over no verification leaf is
1118
+ * always `success`, so such a job would write a green generation for a merge
1119
+ * target nothing verified — the exact failure the freeze exists to prevent.
1120
+ */
1121
+ declare const factoryMergeFreezeJob: <TNeed>(options: FactoryMergeFreezeJobOptions<TNeed>) => FactoryMergeFreezeJob<TNeed>;
1122
+ //#endregion
933
1123
  //#region src/pr-status-hud-workflow.d.ts
934
1124
  declare const FACTORY_PR_STATUS_HUD_JOB_ID = "status-hud";
935
1125
  declare const FACTORY_PR_STATUS_HUD_JOB_NAME = "Present PR status HUD";
@@ -946,9 +1136,9 @@ interface FactoryPrStatusHudWorkflowOptions {
946
1136
  readonly createGithubAppToken: PinnedAction;
947
1137
  }
948
1138
  /**
949
- * Least privilege for the job that runs the present step. A `permissions`
950
- * block zeroes every unlisted GITHUB_TOKEN scope, and the inventory list
951
- * reads pull requests, commits, and check-runs with that token (#825).
1139
+ * Least privilege for the job that runs the present step. The present step
1140
+ * is an inventory `list`, so the job needs exactly the inventory's read
1141
+ * permissions (#825, #859).
952
1142
  */
953
1143
  declare const FACTORY_PR_STATUS_HUD_PERMISSIONS: Readonly<{
954
1144
  readonly checks: "read";
@@ -1366,4 +1556,4 @@ declare const assertWorkflowShellParses: (yaml: string, options: {
1366
1556
  readonly source: string;
1367
1557
  }) => void;
1368
1558
  //#endregion
1369
- export { type BundleAlchemyEntryOptions, type CheckoutStepOptions, EXECUTE_ALCHEMY_ENTRY_MAX_BUFFER, type ExecuteAlchemyEntryOptions, type ExecuteAlchemyEntryResult, FACTORY_CANDIDATE_IMPACT_BASIS_OUTPUT, FACTORY_CANDIDATE_IMPACT_DECISION_OUTPUT, FACTORY_CANDIDATE_IMPACT_INERT_OUTPUT, FACTORY_CANDIDATE_IMPACT_STEP_ID, FACTORY_CANDIDATE_IMPACT_UNSUBSCRIBED_OUTPUT, FACTORY_CANDIDATE_PULL_REQUEST_TYPES, FACTORY_LIFECYCLE_CONTRACT_JOB_ID, FACTORY_LIFECYCLE_CONTRACT_JOB_NAME, FACTORY_PREVIEW_CLEANUP_AUDIT_JOB_ID, FACTORY_PREVIEW_CLEANUP_AUDIT_JOB_NAME, FACTORY_PRODUCTION_IMPACT_BASIS_OUTPUT, FACTORY_PRODUCTION_IMPACT_DECISION_OUTPUT, FACTORY_PRODUCTION_IMPACT_STEP_ID, FACTORY_PRODUCTION_IMPACT_UNSUBSCRIBED_OUTPUT, FACTORY_PROOF_GATE_APP_ID, FACTORY_PROOF_GATE_CHECK_NAME, FACTORY_PROOF_GATE_GUARD, FACTORY_PROOF_GATE_IF, FACTORY_PROOF_GATE_MODE_OUTPUT, FACTORY_PROOF_GATE_OUTPUT, FACTORY_PROOF_GATE_REASONS, FACTORY_PROOF_GATE_REASON_OUTPUT, FACTORY_PROOF_GATE_SHELL, FACTORY_PROOF_GATE_SOURCE_URL_OUTPUT, FACTORY_PROOF_GATE_STEP_ID, FACTORY_PROOF_GATE_STEP_NAME, FACTORY_PR_STATUS_HUD_APP_TOKEN_STEP_ID, FACTORY_PR_STATUS_HUD_CONCURRENCY, FACTORY_PR_STATUS_HUD_IF, FACTORY_PR_STATUS_HUD_JOB_ID, FACTORY_PR_STATUS_HUD_JOB_NAME, FACTORY_PR_STATUS_HUD_PERMISSIONS, FACTORY_PR_STATUS_HUD_PLAN_PATH, FACTORY_PUSH_IDENTITY_SCHEMA_VERSION, type FactoryCandidateImpactWorkflow, type FactoryCandidateImpactWorkflowOptions, type FactoryLifecycleContractLane, type FactoryLifecycleContractLaneOptions, type FactoryPrStatusHudWorkflow, type FactoryPrStatusHudWorkflowOptions, type FactoryPreviewCleanupAuditJob, type FactoryPreviewCleanupDestroyJob, type FactoryPreviewCleanupTopology, type FactoryPreviewCleanupTopologyOptions, type FactoryProductionImpactWorkflow, type FactoryProductionImpactWorkflowOptions, type FactoryProofGateOptions, type FactoryProofGateReason, type FactoryProofGateStep, type FactoryProofReusePresentationOptions, type FactoryProofReuseSummaryStep, type FactoryProofTimingStartStep, type FactoryPushIdentityConsumer, type FactoryPushIdentityConsumerOptions, type FactoryPushIdentityDisposition, type FactoryPushIdentityEnvelope, type FactoryPushIdentityProducer, type FactoryPushIdentityProducerOptions, type FactoryWorkflowArtifact, type FactoryWorkflowOptions, type FactoryWorkflowSetupOptions, GitHubApiError, type GithubAppCredentials, type GithubAppTokenOptions, type InstallStepOptions, type LocalPreviewStage, type LocalPreviewStageOptions, NODE_PNPM_ACTION_FAMILY_NODE24, type NodePnpmActionFamily, PREVIEW_PROOF_INVENTORY_CHECK_NAME, type ParseLocalPreviewStageExpected, type ParsedLocalPreviewStage, type PinnedAction, type PreviewProofCandidate, type PreviewProofCleanupOutcome, type PreviewProofCleanupStatus, type PreviewProofEnvelopeEvidence, type PreviewProofInventoryAccess, type PreviewProofInventoryCleanupInput, type PreviewProofInventoryListInput, type PreviewProofInventoryPersistInput, type PreviewProofInventoryStore, type PreviewProofInventoryTransport, type PreviewProofLifecycleEvent, type PreviewProofLifecycleState, type PreviewProofRegistration, type PreviewProofResolveQuery, PreviewProofTransportError, type ProofReuseCommand, type ProofReuseCoverageInput, type ProofReuseCoverageReport, type SetupNodeStepOptions, VITEST_PROFILE_SCHEMA_VERSION, VITEST_PROFILE_TOOL, type VitestJsonReport, type VitestProfile, type VitestProfileDependencies, type VitestProfileDurationSummary, type VitestProfileEnvironment, VitestProfileError, type VitestProfileOptions, type VitestProfileReadResult, type VitestProfileSample, type VitestProfileSampleExecution, type VitestTestStatus, type WorkflowShellParseFailure, type WorkflowStep, assertProofReuseCoverage, assertWorkflowShellParses, bundleAlchemyEntry, captureVitestProfileEnvironment, executeAlchemyEntry, factoryCandidateImpactWorkflow, factoryCandidateOrPushCondition, factoryLifecycleContractLane, factoryPrStatusHudWorkflow, factoryPreviewCleanupTopology, factoryProductionImpactWorkflow, factoryProofGateScript, factoryProofGateStep, factoryProofReuseSummaryStep, factoryProofTimingStartStep, factoryPushIdentityConsumer, factoryPushIdentityProducer, factoryWorkflow, githubAppJwt, isLocalPreviewStage, localPreviewStage, mintInstallationToken, normalizeVitestProfileSample, parseLocalPreviewStage, previewCleanupDestroyJobId, previewProofInventory, previewProofLifecycle, productionImpactTargetOutput, proofReuseCoverage, proofReuseRequiredCommands, readVitestProfileDocument, resolveProofReuseCommands, runVitestProfile, workflowRunBlocks, workflowShellParseFailures, writeVitestProfile };
1559
+ export { type BundleAlchemyEntryOptions, type CheckoutStepOptions, EXECUTE_ALCHEMY_ENTRY_MAX_BUFFER, type ExecuteAlchemyEntryOptions, type ExecuteAlchemyEntryResult, FACTORY_CANDIDATE_IMPACT_BASIS_OUTPUT, FACTORY_CANDIDATE_IMPACT_DECISION_OUTPUT, FACTORY_CANDIDATE_IMPACT_INERT_OUTPUT, FACTORY_CANDIDATE_IMPACT_STEP_ID, FACTORY_CANDIDATE_IMPACT_UNSUBSCRIBED_OUTPUT, FACTORY_CANDIDATE_PULL_REQUEST_TYPES, FACTORY_LIFECYCLE_CONTRACT_JOB_ID, FACTORY_LIFECYCLE_CONTRACT_JOB_NAME, FACTORY_MERGE_FREEZE_APP_TOKEN_STEP_ID, FACTORY_MERGE_FREEZE_CHECK_NAME, FACTORY_MERGE_FREEZE_IF, FACTORY_MERGE_FREEZE_JOB_ID, FACTORY_MERGE_FREEZE_JOB_NAME, FACTORY_MERGE_FREEZE_PERMISSIONS, FACTORY_MERGE_FREEZE_VERIFY_RESULT_EXPRESSION, FACTORY_MERGE_TARGET_REF_CONDITION, FACTORY_PREVIEW_CLEANUP_AUDIT_JOB_ID, FACTORY_PREVIEW_CLEANUP_AUDIT_JOB_NAME, FACTORY_PRODUCTION_IMPACT_BASIS_OUTPUT, FACTORY_PRODUCTION_IMPACT_DECISION_OUTPUT, FACTORY_PRODUCTION_IMPACT_STEP_ID, FACTORY_PRODUCTION_IMPACT_UNSUBSCRIBED_OUTPUT, FACTORY_PROOF_GATE_APP_ID, FACTORY_PROOF_GATE_CHECK_NAME, FACTORY_PROOF_GATE_GUARD, FACTORY_PROOF_GATE_IF, FACTORY_PROOF_GATE_MODE_OUTPUT, FACTORY_PROOF_GATE_OUTPUT, FACTORY_PROOF_GATE_PULL_REQUEST_IF, FACTORY_PROOF_GATE_REASONS, FACTORY_PROOF_GATE_REASON_OUTPUT, FACTORY_PROOF_GATE_SHELL, FACTORY_PROOF_GATE_SOURCE_URL_OUTPUT, FACTORY_PROOF_GATE_STEP_ID, FACTORY_PROOF_GATE_STEP_NAME, FACTORY_PR_STATUS_HUD_APP_TOKEN_STEP_ID, FACTORY_PR_STATUS_HUD_CONCURRENCY, FACTORY_PR_STATUS_HUD_IF, FACTORY_PR_STATUS_HUD_JOB_ID, FACTORY_PR_STATUS_HUD_JOB_NAME, FACTORY_PR_STATUS_HUD_PERMISSIONS, FACTORY_PR_STATUS_HUD_PLAN_PATH, FACTORY_PUSH_IDENTITY_SCHEMA_VERSION, type FactoryCandidateImpactWorkflow, type FactoryCandidateImpactWorkflowOptions, type FactoryLifecycleContractLane, type FactoryLifecycleContractLaneOptions, type FactoryMergeFreezeJob, type FactoryMergeFreezeJobOptions, type FactoryPrStatusHudWorkflow, type FactoryPrStatusHudWorkflowOptions, type FactoryPreviewCleanupAuditJob, type FactoryPreviewCleanupDestroyJob, type FactoryPreviewCleanupTopology, type FactoryPreviewCleanupTopologyOptions, type FactoryProductionImpactWorkflow, type FactoryProductionImpactWorkflowOptions, type FactoryProofGateOptions, type FactoryProofGateReason, type FactoryProofGateReuse, type FactoryProofGateStep, type FactoryProofReusePresentationOptions, type FactoryProofReuseSummaryStep, type FactoryProofTimingStartStep, type FactoryPushIdentityConsumer, type FactoryPushIdentityConsumerOptions, type FactoryPushIdentityDisposition, type FactoryPushIdentityEnvelope, type FactoryPushIdentityProducer, type FactoryPushIdentityProducerOptions, type FactoryWorkflowArtifact, type FactoryWorkflowOptions, type FactoryWorkflowSetupOptions, GitHubApiError, type GithubAppCredentials, type GithubAppTokenOptions, type InstallStepOptions, type LocalPreviewStage, type LocalPreviewStageOptions, NODE_PNPM_ACTION_FAMILY_NODE24, type NodePnpmActionFamily, PREVIEW_PROOF_INVENTORY_CHECK_NAME, PREVIEW_PROOF_INVENTORY_LIST_PERMISSIONS, type ParseLocalPreviewStageExpected, type ParsedLocalPreviewStage, type PinnedAction, type PreviewProofCandidate, type PreviewProofCleanupOutcome, type PreviewProofCleanupStatus, type PreviewProofEnvelopeEvidence, type PreviewProofInventoryAccess, type PreviewProofInventoryCleanupInput, type PreviewProofInventoryListInput, type PreviewProofInventoryPersistInput, type PreviewProofInventoryStore, type PreviewProofInventoryTransport, type PreviewProofLifecycleEvent, type PreviewProofLifecycleState, type PreviewProofRegistration, type PreviewProofResolveQuery, PreviewProofTransportError, type ProofReuseCommand, type ProofReuseCoverageInput, type ProofReuseCoverageReport, type SetupNodeStepOptions, VITEST_PROFILE_SCHEMA_VERSION, VITEST_PROFILE_TOOL, type VitestJsonReport, type VitestProfile, type VitestProfileDependencies, type VitestProfileDurationSummary, type VitestProfileEnvironment, VitestProfileError, type VitestProfileOptions, type VitestProfileReadResult, type VitestProfileSample, type VitestProfileSampleExecution, type VitestTestStatus, type WorkflowShellParseFailure, type WorkflowStep, assertProofReuseCoverage, assertWorkflowShellParses, bundleAlchemyEntry, captureVitestProfileEnvironment, executeAlchemyEntry, factoryCandidateImpactWorkflow, factoryCandidateOrPushCondition, factoryLifecycleContractLane, factoryMergeFreezeJob, factoryMergeFreezeScript, factoryPrStatusHudWorkflow, factoryPreviewCleanupTopology, factoryProductionImpactWorkflow, factoryProofGateScript, factoryProofGateStep, factoryProofReuseSummaryStep, factoryProofTimingStartStep, factoryPushIdentityConsumer, factoryPushIdentityProducer, factoryWorkflow, githubAppJwt, isLocalPreviewStage, localPreviewStage, mintInstallationToken, normalizeVitestProfileSample, parseLocalPreviewStage, previewCleanupDestroyJobId, previewProofInventory, previewProofLifecycle, productionImpactTargetOutput, proofReuseCoverage, proofReuseRequiredCommands, readVitestProfileDocument, resolveProofReuseCommands, runVitestProfile, workflowRunBlocks, workflowShellParseFailures, writeVitestProfile };