rampway 0.5.19 → 0.5.21

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.
@@ -500,7 +500,7 @@ Rollbridge runtime adapter. Handles `deploy`, `validate`, `status`, `logs`, and
500
500
  | `socketPath` | string | no | Path to the Rollbridge Unix socket. |
501
501
  | `versionPath` | string | no | Path to a version file used for stale-daemon detection. |
502
502
  | `env` | object | no | String environment values passed to Rollbridge. Secret-like values are transported and redacted separately. |
503
- | `externalOwner` | object | no | Opt in to a persistent external foreground owner with `{type: "foreground"}`. Requires `config` and Rollbridge 0.1.20 or newer. |
503
+ | `externalOwner` | object | no | Opt in to a persistent external foreground owner with `{type: "foreground"}`. Requires `config`, `socketPath`, and Rollbridge 0.1.21 or newer; upgrading a retained owner running an older Rollbridge fails closed (see below). |
504
504
 
505
505
  ```js
506
506
  runtime: {
@@ -521,17 +521,51 @@ runtime: {
521
521
  ```
522
522
 
523
523
  `externalOwner.handoffTimeoutMs` and `pollIntervalMs` are optional positive
524
- integer millisecond bounds (defaults: 30000 and 250). Every accepted deploy or
524
+ integer millisecond bounds (defaults: 30000 and 250). `handoffTimeoutMs` is
525
+ one deadline that bounds the authenticated `retire-owner` socket round trip
526
+ and the subsequent replacement polling after initial owner identity
527
+ verification; a stalled, truncated, malformed, or non-success
528
+ retirement response fails the handoff deterministically without retrying
529
+ retirement or taking over the owner. Every accepted deploy or
525
530
  rollback must establish the new boot digest, including first adoption and a
526
531
  same-contract release change. Rampway waits for health, `current` publication,
527
532
  and atomic boot-state persistence, then writes a request bound to the exact
528
533
  deploy lock and accepted boot digest. An owner already reporting the exact
529
534
  accepted release, runtime, and bootstrap attestation remains untouched.
530
- Otherwise Rampway stops only a daemon whose status first proves the accepted
531
- release and runtime identity, then waits for the external foreground owner with
532
- the exact boot attestation. Success removes the request; timeout preserves the
535
+ Otherwise Rampway sends one authenticated `retire-owner` request only to a daemon
536
+ whose status first proves the accepted release and runtime identity, then waits
537
+ for the replacement foreground owner with the exact boot attestation. Retirement
538
+ must release ownership and return without waiting for retained generations or
539
+ connections to drain. Success removes the request; timeout preserves the
533
540
  accepted boot state and request for recovery.
534
541
 
542
+ Deploy success and deploy-lock release follow healthy activation and replacement
543
+ owner readiness. They must not wait for retired jobs generations, workers, jobs,
544
+ HTTP/WebSocket connections, or other retained services to finish. Rollbridge
545
+ durably supervises those drains after the command returns and reports every
546
+ release directory still referenced by a retained process. Rampway owns the
547
+ corresponding retention metadata and must exclude those pinned releases from
548
+ cleanup until all references have ended. HTTP/WebSocket drain completion or
549
+ timeout does not release a jobs-generation pin.
550
+ Rampway atomically records the verified owner's referenced-release set before
551
+ asynchronous retirement and replaces it from later owner status, so cleanup pins
552
+ survive separate deploy invocations and end when Rollbridge drops the reference.
553
+
554
+ Deploying over a retained external owner running Rollbridge older than 0.1.21
555
+ fails closed before any shutdown or deploy: those versions have no
556
+ authenticated `retire-owner` contract, so replacing them requires a full
557
+ shutdown that interrupts service while long-running workers drain. Stage the
558
+ migration through an intermediate 0.1.21+ release with `runtime.externalOwner`
559
+ disabled in an explicitly planned maintenance restart, scheduled only after
560
+ accepted long-running workers have drained, then re-enable it.
561
+
562
+ Rolling back to a retained release whose runtime snapshot predates the
563
+ `runtime.socketPath` requirement also fails closed, before any runtime
564
+ activation: redeploy that release once with the current Rampway so its
565
+ snapshot records the control socket path, then roll back. `runtime.socketPath`
566
+ itself must be a non-empty string without NUL bytes and is validated at config
567
+ load.
568
+
535
569
  Configure the service manager to run `rampway <stage> runtime-boot --config
536
570
  <absolute-path>` with `Restart=always` and a bounded restart delay. Early
537
571
  attempts may collide with the temporary daemon and exit; retries converge after
@@ -643,11 +677,16 @@ migration, publication, cleanup, or fallback selection. Rollbridge support
643
677
  requires an explicit `runtime.config` and Rollbridge 0.1.17 or newer; a
644
678
  successful deploy without stable config remains supported but cannot seed
645
679
  runtime boot state. The optional external-owner handoff requires Rollbridge
646
- 0.1.20 or newer and passes the accepted boot-state digest as
680
+ 0.1.21 or newer and passes the accepted boot-state digest as
647
681
  `--boot-attestation` on an ordinary foreground daemon boot. A matching owner is
648
- a no-op; a stale or absent bootstrap on the exact accepted release/runtime is
649
- gracefully shut down once so a serial outer supervisor can start the
650
- replacement. Status/read identity mismatches fail closed without shutdown.
682
+ a no-op; a stale or absent bootstrap on the exact accepted release/runtime
683
+ receives one authenticated `retire-owner` control command through the
684
+ configured `runtime.socketPath`, which quiesces the old owner and releases its
685
+ proxy/control listeners promptly — without waiting for long-draining workers —
686
+ so a serial outer supervisor can start the replacement. The retirement socket
687
+ round trip and the replacement wait share one `handoffTimeoutMs` deadline; a
688
+ stalled, truncated, malformed, or non-success response fails closed. Status/read identity
689
+ mismatches fail closed without shutdown.
651
690
 
652
691
  ## Health checks
653
692
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rampway",
3
- "version": "0.5.19",
3
+ "version": "0.5.21",
4
4
  "description": "JS-native Capistrano-style release-directory deployments with Rollbridge integration.",
5
5
  "type": "module",
6
6
  "private": false,