rampway 0.5.28 → 0.5.29

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 (40) hide show
  1. package/README.md +15 -1
  2. package/build/src/cli.d.ts.map +1 -1
  3. package/build/src/cli.js +10 -0
  4. package/build/src/cli.js.map +1 -1
  5. package/build/src/commands/recover-generation-transition.d.ts +6 -0
  6. package/build/src/commands/recover-generation-transition.d.ts.map +1 -0
  7. package/build/src/commands/recover-generation-transition.js +18 -0
  8. package/build/src/commands/recover-generation-transition.js.map +1 -0
  9. package/build/src/core/deploy-runner.d.ts.map +1 -1
  10. package/build/src/core/deploy-runner.js +190 -39
  11. package/build/src/core/deploy-runner.js.map +1 -1
  12. package/build/src/core/recover-generation-transition.d.ts +17 -0
  13. package/build/src/core/recover-generation-transition.d.ts.map +1 -0
  14. package/build/src/core/recover-generation-transition.js +91 -0
  15. package/build/src/core/recover-generation-transition.js.map +1 -0
  16. package/build/src/core/release-manager.d.ts +43 -0
  17. package/build/src/core/release-manager.d.ts.map +1 -1
  18. package/build/src/core/release-manager.js +162 -1
  19. package/build/src/core/release-manager.js.map +1 -1
  20. package/build/src/core/runtime-errors.d.ts +4 -4
  21. package/build/src/core/runtime-errors.d.ts.map +1 -1
  22. package/build/src/core/runtime-errors.js +2 -2
  23. package/build/src/core/runtime-errors.js.map +1 -1
  24. package/build/src/runtimes/none-runtime.d.ts +2 -0
  25. package/build/src/runtimes/none-runtime.d.ts.map +1 -1
  26. package/build/src/runtimes/none-runtime.js +4 -0
  27. package/build/src/runtimes/none-runtime.js.map +1 -1
  28. package/build/src/runtimes/rollbridge-runtime.d.ts +36 -3
  29. package/build/src/runtimes/rollbridge-runtime.d.ts.map +1 -1
  30. package/build/src/runtimes/rollbridge-runtime.js +123 -24
  31. package/build/src/runtimes/rollbridge-runtime.js.map +1 -1
  32. package/build/src/test-helpers.d.ts +4 -2
  33. package/build/src/test-helpers.d.ts.map +1 -1
  34. package/build/src/test-helpers.js +5 -5
  35. package/build/src/test-helpers.js.map +1 -1
  36. package/build/src/types.d.ts +34 -1
  37. package/build/src/types.d.ts.map +1 -1
  38. package/docs/config-reference.md +12 -0
  39. package/docs/failed-generation-recovery.md +44 -0
  40. package/package.json +4 -3
package/README.md CHANGED
@@ -107,6 +107,7 @@ rampway production runtime-validate
107
107
  rampway production runtime-status
108
108
  rampway production runtime-logs
109
109
  rampway production runtime-recover --yes
110
+ rampway production runtime-recover-generation-transition <failed-release-id> --yes
110
111
 
111
112
  # Local foreground host-restart entrypoint for the last accepted release
112
113
  rampway production runtime-boot --config /absolute/path/rampway.config.mjs
@@ -115,6 +116,12 @@ rampway production runtime-boot --config /absolute/path/rampway.config.mjs
115
116
  The older `rollbridge-validate`, `rollbridge-status`, `rollbridge-logs`, and
116
117
  `rollbridge-recover` names remain aliases for Rollbridge stages.
117
118
 
119
+ Use [exact failed-generation recovery](docs/failed-generation-recovery.md) when
120
+ a Rollbridge deploy timed out or failed before publication and retained its
121
+ candidate transition fence. Recovery supports stages without an explicit
122
+ `runtime.config`, and later successful Rollbridge deploys refresh live retained
123
+ release pins before cleanup.
124
+
118
125
  ### Deploy transports
119
126
 
120
127
  Deploys run over one of three transports selected with `--transport`:
@@ -409,11 +416,18 @@ Every successful deploy, rollback, or resumed publication appends one JSON objec
409
416
  - `healthChecks: "passed"`
410
417
  - sanitized runtime status
411
418
  - `cleanupRemoved` release IDs
419
+ - optional `warnings` for non-fatal maintenance failures after runtime acceptance
412
420
 
413
421
  Rollback events include `event: "rollback"`, target `releaseId` and `revision`,
414
422
  `rolledBackAt`, `durationMs`, `previousRelease`, `healthChecks: "passed"`, and a
415
423
  sanitized runtime result. Reports intentionally record runtime result summaries,
416
- not runtime configuration or secrets.
424
+ not runtime configuration or secrets. A provisional cleanup-pin removal failure
425
+ is reported as a warning and retained for later reconciliation; it does not turn
426
+ an already-accepted runtime activation into a failed deploy or rollback. Rampway
427
+ stores provisional pins outside accepted runtime state and clears only the pins
428
+ owned by the exact runtime configuration that positively reports its live
429
+ release references. Runtime changes preserve the previous owner's pins, and
430
+ runtimes without reference reporting retain their unresolved pins.
417
431
 
418
432
  Resumed-publication events use `event: "resume-publication"`, `resumedAt`, the
419
433
  exact target and previous release identities, `healthChecks: "passed"`, the
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.js"],"names":[],"mappings":";0CAkBwC,iCAAiC;AAyCzE;;;GAGG;AACH,2BAHW,MAAM,EAAE,GACN,OAAO,CAAC,IAAI,CAAC,CAmCzB;AAED;;;;;;;GAOG;AACH,wCAHW,MAAM,EAAE,GACN;IAAC,OAAO,EAAE,MAAM,GAAC,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,GAAC,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,QAAQ,EAAE,cAAc,CAAA;CAAC,CA0C9G"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.js"],"names":[],"mappings":";0CAmBwC,iCAAiC;AA0CzE;;;GAGG;AACH,2BAHW,MAAM,EAAE,GACN,OAAO,CAAC,IAAI,CAAC,CAmCzB;AAED;;;;;;;GAOG;AACH,wCAHW,MAAM,EAAE,GACN;IAAC,OAAO,EAAE,MAAM,GAAC,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,GAAC,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,QAAQ,EAAE,cAAc,CAAA;CAAC,CA+C9G"}
package/build/src/cli.js CHANGED
@@ -8,6 +8,7 @@ import { deployCommand } from "./commands/deploy.js";
8
8
  import { releasesCommand, statusCommand } from "./commands/releases.js";
9
9
  import { rollbackCommand } from "./commands/rollback.js";
10
10
  import { resumePublicationCommand } from "./commands/resume-publication.js";
11
+ import { runtimeRecoverGenerationTransitionCommand } from "./commands/recover-generation-transition.js";
11
12
  import { rollbridgeValidateCommand, rollbridgeStatusCommand, rollbridgeLogsCommand, rollbridgeRecoverCommand, runtimeValidateCommand, runtimeStatusCommand, runtimeLogsCommand, runtimeRecoverCommand } from "./commands/rollbridge.js";
12
13
  import { tasksCommand } from "./commands/tasks.js";
13
14
  import { taskCommand } from "./commands/task.js";
@@ -38,6 +39,7 @@ const COMMANDS = {
38
39
  "runtime-status": runtimeStatusCommand,
39
40
  "runtime-logs": runtimeLogsCommand,
40
41
  "runtime-recover": runtimeRecoverCommand,
42
+ "runtime-recover-generation-transition": runtimeRecoverGenerationTransitionCommand,
41
43
  "runtime-boot": runtimeBootCommand,
42
44
  doctor: doctorCommand
43
45
  };
@@ -134,6 +136,14 @@ function resolveInvocation(argv) {
134
136
  throw new Error(`Command 'resume-publication' does not support option --${toKebab(unsupported[0])}.`);
135
137
  options.releaseId = operands[0];
136
138
  }
139
+ else if (command === "runtime-recover-generation-transition") {
140
+ if (operands.length !== 1)
141
+ throw new Error("Command 'runtime-recover-generation-transition' requires exactly one failed release ID.");
142
+ const unsupported = Object.keys(options).filter(option => !["config", "json", "sshForwardAgent", "yes"].includes(option));
143
+ if (unsupported.length > 0)
144
+ throw new Error(`Command 'runtime-recover-generation-transition' does not support option --${toKebab(unsupported[0])}.`);
145
+ options.releaseId = operands[0];
146
+ }
137
147
  else if (command === "task") {
138
148
  if (operands.length !== 1)
139
149
  throw new Error("Command 'task' requires exactly one task name.");
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @param {import('#types').CommandArgs} args
3
+ * @returns {Promise<void>}
4
+ */
5
+ export function runtimeRecoverGenerationTransitionCommand({ stageName, options, commandContext }: import("#types").CommandArgs): Promise<void>;
6
+ //# sourceMappingURL=recover-generation-transition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recover-generation-transition.d.ts","sourceRoot":"","sources":["../../../src/commands/recover-generation-transition.js"],"names":[],"mappings":"AAGA;;;GAGG;AACH,kGAHW,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,IAAI,CAAC,CAWzB"}
@@ -0,0 +1,18 @@
1
+ import { commandContext as defaultCommandContext } from "./context.js";
2
+ import { recoverGenerationTransition } from "../core/recover-generation-transition.js";
3
+ /**
4
+ * @param {import('#types').CommandArgs} args
5
+ * @returns {Promise<void>}
6
+ */
7
+ export async function runtimeRecoverGenerationTransitionCommand({ stageName, options, commandContext = defaultCommandContext }) {
8
+ if (!options.yes && stageName === "production")
9
+ throw new Error("Refusing production failed-generation recovery without --yes in non-interactive mode.");
10
+ const { stage, transport } = await commandContext(options, stageName);
11
+ const result = await recoverGenerationTransition({
12
+ releaseId: /** @type {string} */ (options.releaseId),
13
+ stage,
14
+ transport
15
+ });
16
+ console.log(JSON.stringify(result, null, 2));
17
+ }
18
+ //# sourceMappingURL=recover-generation-transition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recover-generation-transition.js","sourceRoot":"","sources":["../../../src/commands/recover-generation-transition.js"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,IAAI,qBAAqB,EAAC,MAAM,cAAc,CAAA;AACpE,OAAO,EAAC,2BAA2B,EAAC,MAAM,0CAA0C,CAAA;AAEpF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,yCAAyC,CAAC,EAAC,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,qBAAqB,EAAC;IAC1H,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,SAAS,KAAK,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,uFAAuF,CAAC,CAAA;IACxJ,MAAM,EAAC,KAAK,EAAE,SAAS,EAAC,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACnE,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC;QAC/C,SAAS,EAAE,qBAAqB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QACpD,KAAK;QACL,SAAS;KACV,CAAC,CAAA;IACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC9C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"deploy-runner.d.ts","sourceRoot":"","sources":["../../../src/core/deploy-runner.js"],"names":[],"mappings":"AAmCA;;;;GAIG;AACH,wCAJW,OAAO,QAAQ,EAAE,WAAW,oDAC5B;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAAC,GACtE,MAAM,EAAE,CAIpB;AAED;;;;GAIG;AACH,+CAJW,OAAO,QAAQ,EAAE,WAAW,oDAC5B;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAAC,GACtE,OAAO,QAAQ,EAAE,cAAc,EAAE,CAqB7C;AAaD;;;GAGG;AACH,uIAHW,OAAO,QAAQ,EAAE,aAAa,GAC5B,OAAO,CAAC,OAAO,QAAQ,EAAE,YAAY,GAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAC,CAAC,CA0PnE;AAED;;;GAGG;AACH,6DAHW;IAAC,SAAS,EAAE,OAAO,QAAQ,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,OAAO,QAAQ,EAAE,WAAW,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAC,GAC5G,OAAO,CAAC,OAAO,QAAQ,EAAE,cAAc,CAAC,CAyHpD;AAED;;;;;;;GAOG;AACH,6EAHW;IAAC,SAAS,EAAE,OAAO,QAAQ,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,OAAO,QAAQ,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAC,GAClH,OAAO,CAAC,OAAO,QAAQ,EAAE,uBAAuB,CAAC,CA4G7D;AA0OD;;;GAGG;AACH,6FAHW;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,QAAQ,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAC,GAClH,MAAM,CAqBlB;yBA3zBsB,eAAe"}
1
+ {"version":3,"file":"deploy-runner.d.ts","sourceRoot":"","sources":["../../../src/core/deploy-runner.js"],"names":[],"mappings":"AAmCA;;;;GAIG;AACH,wCAJW,OAAO,QAAQ,EAAE,WAAW,oDAC5B;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAAC,GACtE,MAAM,EAAE,CAIpB;AAED;;;;GAIG;AACH,+CAJW,OAAO,QAAQ,EAAE,WAAW,oDAC5B;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAAC,GACtE,OAAO,QAAQ,EAAE,cAAc,EAAE,CAqB7C;AAaD;;;GAGG;AACH,uIAHW,OAAO,QAAQ,EAAE,aAAa,GAC5B,OAAO,CAAC,OAAO,QAAQ,EAAE,YAAY,GAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAC,CAAC,CA+RnE;AAED;;;GAGG;AACH,6DAHW;IAAC,SAAS,EAAE,OAAO,QAAQ,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,OAAO,QAAQ,EAAE,WAAW,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAC,GAC5G,OAAO,CAAC,OAAO,QAAQ,EAAE,cAAc,CAAC,CAoJpD;AAED;;;;;;;GAOG;AACH,6EAHW;IAAC,SAAS,EAAE,OAAO,QAAQ,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,OAAO,QAAQ,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAC,GAClH,OAAO,CAAC,OAAO,QAAQ,EAAE,uBAAuB,CAAC,CA4G7D;AA0VD;;;GAGG;AACH,6FAHW;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,QAAQ,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAC,GAClH,MAAM,CAqBlB;yBA3+BsB,eAAe"}
@@ -6,7 +6,7 @@ import { Reporter } from "./reporter.js";
6
6
  import { releaseIdFromDate } from "./release-id.js";
7
7
  import { deployPaths } from "./paths.js";
8
8
  import { acquireLock, releaseLock } from "./locks.js";
9
- import { ensureBaseDirs, prepareSharedLinks, publishCurrent, cleanupReleases, currentReleaseId, previousRelease, readReleaseRevision, requireCurrentRelease, resolveRetainedRelease } from "./release-manager.js";
9
+ import { ensureBaseDirs, prepareSharedLinks, publishCurrent, cleanupReleases, currentReleaseId, previousRelease, readReleaseRevision, requireCurrentRelease, requireReleaseMetadata, resolveRetainedRelease, pinRuntimeReleaseForCleanup, clearRuntimeReleasePinsForCleanup } from "./release-manager.js";
10
10
  import { runTasks } from "./task-runner.js";
11
11
  import { runHealthChecks } from "./health-checks.js";
12
12
  import { runHooks } from "./hooks.js";
@@ -111,6 +111,8 @@ export async function deploy({ transport, stage, sourcePath = process.cwd(), rev
111
111
  /** @type {object|undefined} */
112
112
  let runtimeResult;
113
113
  let deployedRevision = releaseRevision;
114
+ /** @type {string[]} */
115
+ const warnings = [];
114
116
  const runtime = runtimeFor(stage);
115
117
  reporter.line(`Deploying ${stage.application}/${stage.stageName} revision ${releaseRevision} as release ${releaseId}`);
116
118
  await runHooks(transport, stage, null, "before_deploy");
@@ -132,6 +134,7 @@ export async function deploy({ transport, stage, sourcePath = process.cwd(), rev
132
134
  const current = await requireCurrentRelease(transport, stage);
133
135
  const currentRevision = await readReleaseRevision(transport, current.releasePath);
134
136
  if (currentRevision.toLowerCase() === deployedRevision.toLowerCase()) {
137
+ warnings.push(...await reconcileRuntimeReleasePinsForIdempotentDeploy(runtime, transport, stage, current, currentRevision, reporter));
135
138
  reporter.line(` * Revision ${currentRevision} is already active as release ${current.releaseId}; skipping release and runtime lifecycle`);
136
139
  const report = {
137
140
  application: stage.application,
@@ -144,7 +147,8 @@ export async function deploy({ transport, stage, sourcePath = process.cwd(), rev
144
147
  durationMs: Date.now() - startedAt.getTime(),
145
148
  healthChecks: "unchanged",
146
149
  cleanupRemoved: [],
147
- idempotent: true
150
+ idempotent: true,
151
+ ...(warnings.length > 0 ? { warnings } : {})
148
152
  };
149
153
  await appendReport(transport, stage, report);
150
154
  return report;
@@ -203,6 +207,10 @@ export async function deploy({ transport, stage, sourcePath = process.cwd(), rev
203
207
  previousRuntimeRelease = { releaseId: activeReleaseId, revision: previousRevision, runtime: previousSnapshot };
204
208
  }
205
209
  }
210
+ await preserveSupersededRuntimeReferences(transport, stage, currentRuntimeState, activeReleaseId);
211
+ // Keep accepted state immutable while the candidate may become live before
212
+ // Rampway can read the runtime owner's references.
213
+ await pinRuntimeReleaseForCleanup(transport, stage, runtimeSnapshot, releaseId);
206
214
  runtimeAttempted = true;
207
215
  runtimeResult = await runtime.deploy(transport, {
208
216
  releasePath,
@@ -229,11 +237,15 @@ export async function deploy({ transport, stage, sourcePath = process.cwd(), rev
229
237
  await runHooks(transport, stage, releasePath, "after_health", { previousReleasePath });
230
238
  const previous = await currentReleaseId(transport, stage);
231
239
  await runHooks(transport, stage, releasePath, "before_publish", { previousReleasePath });
240
+ const referencedReleaseIds = await readRuntimeReferencesBeforePublication(runtime, transport, stage, { releaseId, revision: deployedRevision, runtime: runtimeSnapshot }, runtimeResult);
232
241
  let publicationAttempted = false;
233
242
  /** @type {import('#types').RuntimeBootState|undefined} */
234
243
  let acceptedBoot;
235
244
  try {
236
- await writeRuntimeState(transport, stage, { releaseId, revision: deployedRevision, runtime: runtimeSnapshot }, { retain: previousRuntimeRelease ? [previousRuntimeRelease] : [] });
245
+ await writeRuntimeState(transport, stage, { releaseId, revision: deployedRevision, runtime: runtimeSnapshot }, {
246
+ retain: previousRuntimeRelease ? [previousRuntimeRelease] : [],
247
+ referencedReleaseIds
248
+ });
237
249
  if (runtime.commit)
238
250
  await runtime.commit(transport, { snapshot: runtimeSnapshot });
239
251
  reporter.line(" * Publishing current symlink");
@@ -273,23 +285,31 @@ export async function deploy({ transport, stage, sourcePath = process.cwd(), rev
273
285
  await runHealthChecks(transport, stage.healthChecks, previousReleasePath);
274
286
  if (publicationAttempted)
275
287
  await publishCurrent(transport, stage, previousReleasePath);
276
- await writeRuntimeState(transport, stage, { releaseId: activeReleaseId, revision: previousRevision, runtime: restorationSnapshot });
288
+ await writeRuntimeStateWithLiveReferences(runtime, transport, stage, { releaseId: activeReleaseId, revision: previousRevision, runtime: restorationSnapshot });
277
289
  if (runtime.commit)
278
290
  await runtime.commit(transport, { snapshot: restorationSnapshot });
279
291
  runtimeRestored = true;
280
292
  }
281
293
  catch (error) {
282
- throw new Error(`${transitionError.message}\nRestoration of previous release '${activeReleaseId}' also failed: ${ /** @type {Error} */(error).message}`, { cause: transitionError });
294
+ const restorationError = /** @type {Error} */ (error);
295
+ if (isRuntimeIncumbentPreservedError(restorationError) && restorationError.recovery) {
296
+ await persistRuntimeRecoveryPins(transport, stage, previousRuntimeRelease?.runtime ?? currentRuntimeSnapshot ?? runtimeSnapshot, restorationError.recovery);
297
+ }
298
+ throw new Error(`${transitionError.message}\nRestoration of previous release '${activeReleaseId}' also failed: ${restorationError.message}`, { cause: transitionError });
283
299
  }
284
300
  throw new Error(`${transitionError.message}\nPrevious release '${activeReleaseId}' was reactivated and health-checked; current ${publicationAttempted ? "was republished" : "was not changed"}.`, { cause: transitionError });
285
301
  }
286
- await completeRuntimeOwnerHandoff(runtime, transport, stage, lock, acceptedBoot, { releaseId, revision: deployedRevision, runtime: runtimeSnapshot }, runtimeResult);
302
+ const handoffReferencesPersisted = await completeRuntimeOwnerHandoff(runtime, transport, stage, lock, acceptedBoot, { releaseId, revision: deployedRevision, runtime: runtimeSnapshot }, runtimeResult);
303
+ warnings.push(...await reconcileRuntimeReleasePinsAfterAcceptance(transport, stage, reporter, {
304
+ referencesAuthoritative: referencedReleaseIds !== undefined || handoffReferencesPersisted,
305
+ runtimeSnapshot
306
+ }));
287
307
  await runHooks(transport, stage, releasePath, "after_publish", { previousReleasePath });
288
308
  await runHooks(transport, stage, releasePath, "before_cleanup", { previousReleasePath });
289
309
  reporter.line(` * Cleaning up old releases keeping ${stage.keepReleases}`);
290
310
  const removed = await cleanupReleases(transport, stage);
291
311
  await runHooks(transport, stage, releasePath, "after_cleanup", { previousReleasePath });
292
- const report = { application: stage.application, stage: stage.stageName, releaseId, revision: deployedRevision, branch, deployedAt: new Date().toISOString(), event: "deploy", durationMs: Date.now() - startedAt.getTime(), previousRelease: previous ?? undefined, healthChecks: "passed", runtime: sanitizeRuntimeResult(runtimeResult, stage), cleanupRemoved: removed };
312
+ const report = { application: stage.application, stage: stage.stageName, releaseId, revision: deployedRevision, branch, deployedAt: new Date().toISOString(), event: "deploy", durationMs: Date.now() - startedAt.getTime(), previousRelease: previous ?? undefined, healthChecks: "passed", runtime: sanitizeRuntimeResult(runtimeResult, stage), cleanupRemoved: removed, ...(warnings.length > 0 ? { warnings } : {}) };
293
313
  await appendReport(transport, stage, report);
294
314
  return report;
295
315
  }
@@ -306,6 +326,9 @@ export async function deploy({ transport, stage, sourcePath = process.cwd(), rev
306
326
  failureHookError = /** @type {Error} */ (hookError);
307
327
  }
308
328
  if (isRuntimeIncumbentPreservedError(err)) {
329
+ if (err.recovery) {
330
+ await persistRuntimeRecoveryPins(transport, stage, runtimeSnapshot, err.recovery);
331
+ }
309
332
  restorationMessage = "The incumbent runtime remains authoritative; automatic runtime restoration was not attempted.";
310
333
  }
311
334
  else if (isRuntimeRecoveryFailedError(err)) {
@@ -328,7 +351,7 @@ export async function deploy({ transport, stage, sourcePath = process.cwd(), rev
328
351
  deferCommit: true
329
352
  });
330
353
  await runHealthChecks(transport, stage.healthChecks, previousReleasePath);
331
- await writeRuntimeState(transport, stage, previousRuntimeRelease);
354
+ await writeRuntimeStateWithLiveReferences(runtime, transport, stage, previousRuntimeRelease);
332
355
  if (runtime.commit)
333
356
  await runtime.commit(transport, { snapshot: previousRuntimeRelease.runtime });
334
357
  runtimeRestored = true;
@@ -336,6 +359,9 @@ export async function deploy({ transport, stage, sourcePath = process.cwd(), rev
336
359
  }
337
360
  catch (restoreError) {
338
361
  restorationError = /** @type {Error} */ (restoreError);
362
+ if (isRuntimeIncumbentPreservedError(restorationError) && restorationError.recovery) {
363
+ await persistRuntimeRecoveryPins(transport, stage, previousRuntimeRelease.runtime, restorationError.recovery);
364
+ }
339
365
  }
340
366
  }
341
367
  }
@@ -361,6 +387,8 @@ export async function rollback({ transport, stage, to, reporter = new Reporter({
361
387
  const lock = await acquireLock(transport, stage);
362
388
  try {
363
389
  const startedAt = new Date();
390
+ /** @type {string[]} */
391
+ const warnings = [];
364
392
  const current = await requireCurrentRelease(transport, stage);
365
393
  const targetId = to ?? await previousRelease(transport, stage, current.releaseId);
366
394
  if (!targetId)
@@ -369,6 +397,7 @@ export async function rollback({ transport, stage, to, reporter = new Reporter({
369
397
  throw new Error(`Rollback target '${targetId}' is already current.`);
370
398
  const target = await resolveRetainedRelease(transport, stage, targetId);
371
399
  const revision = await readReleaseRevision(transport, target.releasePath);
400
+ const currentRevision = await readReleaseRevision(transport, current.releasePath);
372
401
  const runtime = runtimeFor(stage);
373
402
  const state = await readRuntimeState(transport, stage);
374
403
  const currentSnapshot = runtimeSnapshotForRollback(runtime, stage, state, current.releaseId);
@@ -386,9 +415,14 @@ export async function rollback({ transport, stage, to, reporter = new Reporter({
386
415
  let publicationAttempted = false;
387
416
  /** @type {import('#types').RuntimeBootState|undefined} */
388
417
  let acceptedBoot;
418
+ /** @type {string[]|undefined} */
419
+ let referencedReleaseIds;
389
420
  try {
390
421
  reporter.line(`Rolling back ${stage.application}/${stage.stageName} from ${current.releaseId} to ${target.releaseId}`);
391
422
  reporter.line(` * Handing off to ${runtime.type ?? stage.runtime.type} runtime`);
423
+ await preserveSupersededRuntimeReferences(transport, stage, state, current.releaseId);
424
+ // A rollback target needs the same pre-activation cleanup pin as a newly deployed candidate.
425
+ await pinRuntimeReleaseForCleanup(transport, stage, targetSnapshot, target.releaseId);
392
426
  runtimeResult = await runtime.deploy(transport, {
393
427
  releasePath: target.releasePath,
394
428
  currentPath: current.releasePath,
@@ -409,10 +443,11 @@ export async function rollback({ transport, stage, to, reporter = new Reporter({
409
443
  if (stage.healthChecks.length > 0)
410
444
  reporter.line(" * Running health checks");
411
445
  await runHealthChecks(transport, stage.healthChecks, target.releasePath);
446
+ referencedReleaseIds = await readRuntimeReferencesBeforePublication(runtime, transport, stage, { releaseId: target.releaseId, revision, runtime: acceptedTargetSnapshot }, runtimeResult);
412
447
  reporter.line(" * Publishing current symlink");
413
448
  publicationAttempted = true;
414
449
  await publishCurrent(transport, stage, target.releasePath);
415
- await writeRuntimeState(transport, stage, { releaseId: target.releaseId, revision, runtime: acceptedTargetSnapshot });
450
+ await writeRuntimeState(transport, stage, { releaseId: target.releaseId, revision, runtime: acceptedTargetSnapshot }, { referencedReleaseIds });
416
451
  if (runtime.commit)
417
452
  await runtime.commit(transport, { snapshot: acceptedTargetSnapshot });
418
453
  acceptedBoot = await persistRuntimeBootState(runtime, transport, stage, acceptedTargetSnapshot, { releasePath: target.releasePath, releaseId: target.releaseId, revision });
@@ -420,6 +455,9 @@ export async function rollback({ transport, stage, to, reporter = new Reporter({
420
455
  catch (error) {
421
456
  const targetError = /** @type {Error} */ (error);
422
457
  if (isRuntimeIncumbentPreservedError(targetError)) {
458
+ if (targetError.recovery) {
459
+ await persistRuntimeRecoveryPins(transport, stage, targetSnapshot, targetError.recovery);
460
+ }
423
461
  targetError.message = `Rollback to '${target.releaseId}' failed: ${targetError.message}\nThe incumbent release '${current.releaseId}' remains authoritative; automatic runtime restoration was not attempted. Current was not changed.`;
424
462
  throw targetError;
425
463
  }
@@ -437,7 +475,7 @@ export async function rollback({ transport, stage, to, reporter = new Reporter({
437
475
  currentPath: target.releasePath,
438
476
  releaseId: current.releaseId,
439
477
  previousReleaseId: target.releaseId,
440
- revision: await readReleaseRevision(transport, current.releasePath),
478
+ revision: currentRevision,
441
479
  targetSnapshot: currentSnapshot,
442
480
  currentSnapshot: targetSnapshot,
443
481
  deferCommit: true
@@ -445,25 +483,27 @@ export async function rollback({ transport, stage, to, reporter = new Reporter({
445
483
  await runHealthChecks(transport, stage.healthChecks, current.releasePath);
446
484
  if (publicationAttempted) {
447
485
  await publishCurrent(transport, stage, current.releasePath);
448
- if (state) {
449
- await writeRuntimeState(transport, stage, state.active);
450
- }
451
- else if (await transport.exists(deployPaths(stage).statePath)) {
452
- await transport.rm(deployPaths(stage).statePath);
453
- }
454
486
  }
487
+ await writeRuntimeStateWithLiveReferences(runtime, transport, stage, { releaseId: current.releaseId, revision: currentRevision, runtime: currentSnapshot });
455
488
  if (runtime.commit)
456
489
  await runtime.commit(transport, { snapshot: currentSnapshot });
457
490
  }
458
491
  catch (error) {
459
492
  const restorationError = /** @type {Error} */ (error);
493
+ if (isRuntimeIncumbentPreservedError(restorationError) && restorationError.recovery) {
494
+ await persistRuntimeRecoveryPins(transport, stage, currentSnapshot, restorationError.recovery);
495
+ }
460
496
  const combined = /** @type {Error & {restorationError?: Error}} */ (new Error(`Rollback to '${target.releaseId}' failed: ${targetError.message}\nRestoration of previous release '${current.releaseId}' also failed: ${restorationError.message}`, { cause: targetError }));
461
497
  combined.restorationError = restorationError;
462
498
  throw combined;
463
499
  }
464
500
  throw new Error(`Rollback to '${target.releaseId}' failed: ${targetError.message}\nPrevious release '${current.releaseId}' was reactivated and passed health checks. Current was ${publicationAttempted ? "restored" : "not changed"}.`, { cause: targetError });
465
501
  }
466
- await completeRuntimeOwnerHandoff(runtime, transport, stage, lock, acceptedBoot, { releaseId: target.releaseId, revision, runtime: acceptedTargetSnapshot }, runtimeResult);
502
+ const handoffReferencesPersisted = await completeRuntimeOwnerHandoff(runtime, transport, stage, lock, acceptedBoot, { releaseId: target.releaseId, revision, runtime: acceptedTargetSnapshot }, runtimeResult);
503
+ warnings.push(...await reconcileRuntimeReleasePinsAfterAcceptance(transport, stage, reporter, {
504
+ referencesAuthoritative: referencedReleaseIds !== undefined || handoffReferencesPersisted,
505
+ runtimeSnapshot: acceptedTargetSnapshot
506
+ }));
467
507
  const report = {
468
508
  application: stage.application,
469
509
  stage: stage.stageName,
@@ -474,7 +514,8 @@ export async function rollback({ transport, stage, to, reporter = new Reporter({
474
514
  previousRelease: current.releaseId,
475
515
  healthChecks: "passed",
476
516
  runtime: sanitizeRuntimeResult(runtimeResult, stage),
477
- event: "rollback"
517
+ event: "rollback",
518
+ ...(warnings.length > 0 ? { warnings } : {})
478
519
  };
479
520
  await appendReport(transport, stage, report);
480
521
  return report;
@@ -716,25 +757,37 @@ function validateRecoveredPublication(stage, recovered, releaseId) {
716
757
  /**
717
758
  * @param {import('#types').Transport} transport
718
759
  * @param {import('#types').StageConfig} stage
719
- * @param {{releaseId: string, releasePath: string}} release
720
- * @param {string} revision
721
- * @returns {Promise<Record<string, unknown>>}
760
+ * @param {import('#types').RuntimeSnapshot|undefined} runtimeSnapshot
761
+ * @param {import('#types').GenerationTransitionRecovery} recovery
762
+ * @returns {Promise<void>}
722
763
  */
723
- async function requireReleaseMetadata(transport, stage, release, revision) {
724
- const metadataPath = path.join(release.releasePath, "TRESTLE_RELEASE.json");
725
- if (!await transport.exists(metadataPath) || await transport.isDirectory(metadataPath))
726
- throw new Error(`Retained release is missing Rampway metadata: ${metadataPath}`);
727
- let metadata;
728
- try {
729
- metadata = JSON.parse(await transport.readFile(metadataPath));
730
- }
731
- catch (error) {
732
- throw new Error(`Retained release metadata is malformed at ${metadataPath}: ${ /** @type {Error} */(error).message}`);
764
+ async function persistRuntimeRecoveryPins(transport, stage, runtimeSnapshot, recovery) {
765
+ if (!runtimeSnapshot)
766
+ throw new Error("Cannot persist runtime recovery pins without the attempted runtime snapshot.");
767
+ for (const releaseId of recovery.referencedReleaseIds) {
768
+ if (releaseId === recovery.activeReleaseId)
769
+ continue;
770
+ await pinRuntimeReleaseForCleanup(transport, stage, runtimeSnapshot, releaseId);
733
771
  }
734
- if (!metadata || typeof metadata !== "object" || Array.isArray(metadata) || metadata.application !== stage.application || metadata.stage !== stage.stageName || metadata.releaseId !== release.releaseId || metadata.revision !== revision || typeof metadata.rampwayVersion !== "string") {
735
- throw new Error(`Retained release metadata does not match application, stage, release, and revision identity at ${metadataPath}.`);
772
+ }
773
+ /**
774
+ * Move accepted references to owner-scoped pins before a runtime can replace
775
+ * stable state. An unchanged owner clears them after its authoritative report;
776
+ * a changed owner cannot clear another owner's pins.
777
+ *
778
+ * @param {import('#types').Transport} transport
779
+ * @param {import('#types').StageConfig} stage
780
+ * @param {import('#types').RuntimeState|null} state
781
+ * @param {string|null} activeReleaseId
782
+ * @returns {Promise<void>}
783
+ */
784
+ async function preserveSupersededRuntimeReferences(transport, stage, state, activeReleaseId) {
785
+ if (!state)
786
+ return;
787
+ const releaseIds = new Set([...state.referencedReleaseIds, ...(activeReleaseId ? [activeReleaseId] : [])]);
788
+ for (const releaseId of releaseIds) {
789
+ await pinRuntimeReleaseForCleanup(transport, stage, state.active.runtime, releaseId);
736
790
  }
737
- return metadata;
738
791
  }
739
792
  /**
740
793
  * @param {import('#types').RuntimeAdapter} runtime
@@ -766,6 +819,43 @@ async function persistRuntimeBootState(runtime, transport, stage, snapshot, targ
766
819
  return undefined;
767
820
  return await writeRuntimeBootState(transport, stage, identity);
768
821
  }
822
+ /**
823
+ * @param {import('#types').RuntimeAdapter} runtime
824
+ * @param {import('#types').Transport} transport
825
+ * @param {import('#types').StageConfig} stage
826
+ * @param {import('#types').RuntimeRelease} active
827
+ * @param {any} runtimeResult
828
+ * @returns {Promise<string[]|undefined>}
829
+ */
830
+ async function readRuntimeReferencesBeforePublication(runtime, transport, stage, active, runtimeResult) {
831
+ if (runtime.handoffExternalOwner && runtimeResult?.externalOwnerVerificationRequired)
832
+ return undefined;
833
+ return await readRuntimeReferences(runtime, transport, stage, active);
834
+ }
835
+ /**
836
+ * @param {import('#types').RuntimeAdapter} runtime
837
+ * @param {import('#types').Transport} transport
838
+ * @param {import('#types').StageConfig} stage
839
+ * @param {import('#types').RuntimeRelease} active
840
+ * @returns {Promise<string[]|undefined>}
841
+ */
842
+ async function readRuntimeReferences(runtime, transport, stage, active) {
843
+ if (!runtime.readReferencedReleaseIds)
844
+ return undefined;
845
+ const releasePath = path.join(deployPaths(stage).releasesPath, active.releaseId);
846
+ return await runtime.readReferencedReleaseIds(transport, { releasePath, snapshot: active.runtime });
847
+ }
848
+ /**
849
+ * @param {import('#types').RuntimeAdapter} runtime
850
+ * @param {import('#types').Transport} transport
851
+ * @param {import('#types').StageConfig} stage
852
+ * @param {import('#types').RuntimeRelease} active
853
+ * @returns {Promise<void>}
854
+ */
855
+ async function writeRuntimeStateWithLiveReferences(runtime, transport, stage, active) {
856
+ const referencedReleaseIds = await readRuntimeReferences(runtime, transport, stage, active);
857
+ await writeRuntimeState(transport, stage, active, { referencedReleaseIds });
858
+ }
769
859
  /**
770
860
  * @param {import('#types').RuntimeAdapter} runtime
771
861
  * @param {import('#types').Transport} transport
@@ -774,13 +864,11 @@ async function persistRuntimeBootState(runtime, transport, stage, snapshot, targ
774
864
  * @param {import('#types').RuntimeBootState|undefined} boot
775
865
  * @param {import('#types').RuntimeRelease} active
776
866
  * @param {any} runtimeResult
777
- * @returns {Promise<void>}
867
+ * @returns {Promise<boolean>} Whether an external owner persisted an authoritative release-reference set.
778
868
  */
779
869
  async function completeRuntimeOwnerHandoff(runtime, transport, stage, lock, boot, active, runtimeResult) {
780
- if (!runtime.handoffExternalOwner || !runtimeResult?.externalOwnerVerificationRequired) {
781
- await writeRuntimeState(transport, stage, active, { referencedReleaseIds: [] });
782
- return;
783
- }
870
+ if (!runtime.handoffExternalOwner || !runtimeResult?.externalOwnerVerificationRequired)
871
+ return false;
784
872
  if (!boot)
785
873
  throw new Error("External runtime ownership handoff requires accepted runtime boot state.");
786
874
  const request = await writeRuntimeOwnerHandoff(transport, stage, boot, lock);
@@ -793,6 +881,69 @@ async function completeRuntimeOwnerHandoff(runtime, transport, stage, lock, boot
793
881
  if (!referencesPersisted)
794
882
  throw new Error("External runtime owner did not report its referenced releases; cleanup pins and handoff request were preserved.");
795
883
  await removeRuntimeOwnerHandoff(transport, stage, request);
884
+ return true;
885
+ }
886
+ /**
887
+ * Provisional cleanup pins are conservative recovery metadata rather than part
888
+ * of runtime acceptance. Once activation is accepted, a pin-removal failure is
889
+ * reported but cannot turn the healthy activation into a failed deployment.
890
+ * Pins are cleared only when the runtime owner supplied an authoritative live
891
+ * reference set.
892
+ *
893
+ * @param {import('#types').Transport} transport
894
+ * @param {import('#types').StageConfig} stage
895
+ * @param {Reporter} reporter
896
+ * @param {{referencesAuthoritative: boolean, runtimeSnapshot: import('#types').RuntimeSnapshot}} opts
897
+ * @returns {Promise<string[]>}
898
+ */
899
+ async function reconcileRuntimeReleasePinsAfterAcceptance(transport, stage, reporter, { referencesAuthoritative, runtimeSnapshot }) {
900
+ if (!referencesAuthoritative)
901
+ return [];
902
+ try {
903
+ await clearRuntimeReleasePinsForCleanup(transport, stage, runtimeSnapshot);
904
+ return [];
905
+ }
906
+ catch (error) {
907
+ return runtimeReleasePinReconciliationWarning(reporter, /** @type {Error} */ (error));
908
+ }
909
+ }
910
+ /**
911
+ * An idempotent deploy may repair a stale standalone pin only after the runtime
912
+ * positively refreshes the accepted release's live reference set.
913
+ *
914
+ * @param {import('#types').RuntimeAdapter} runtime
915
+ * @param {import('#types').Transport} transport
916
+ * @param {import('#types').StageConfig} stage
917
+ * @param {{releaseId: string, releasePath: string}} current
918
+ * @param {string} currentRevision
919
+ * @param {Reporter} reporter
920
+ * @returns {Promise<string[]>}
921
+ */
922
+ async function reconcileRuntimeReleasePinsForIdempotentDeploy(runtime, transport, stage, current, currentRevision, reporter) {
923
+ if (!runtime.readReferencedReleaseIds)
924
+ return [];
925
+ try {
926
+ const state = await readRuntimeState(transport, stage);
927
+ if (state?.active.releaseId !== current.releaseId || state.active.revision.toLowerCase() !== currentRevision.toLowerCase() || state.active.runtime.type !== stage.runtime.type)
928
+ return [];
929
+ const referencedReleaseIds = await runtime.readReferencedReleaseIds(transport, { releasePath: current.releasePath, snapshot: state.active.runtime });
930
+ await writeRuntimeState(transport, stage, state.active, { referencedReleaseIds });
931
+ await clearRuntimeReleasePinsForCleanup(transport, stage, state.active.runtime);
932
+ return [];
933
+ }
934
+ catch (error) {
935
+ return runtimeReleasePinReconciliationWarning(reporter, /** @type {Error} */ (error));
936
+ }
937
+ }
938
+ /**
939
+ * @param {Reporter} reporter
940
+ * @param {Error} error
941
+ * @returns {string[]}
942
+ */
943
+ function runtimeReleasePinReconciliationWarning(reporter, error) {
944
+ const warning = `Runtime activation was accepted, but provisional cleanup pins could not be cleared: ${error.message}`;
945
+ reporter.line(` ! Warning: ${warning}`);
946
+ return [warning];
796
947
  }
797
948
  /**
798
949
  * @param {import('#types').RuntimeAdapter} runtime