| 1 | { |
| 2 | "approved_by": "Paul", |
| 3 | "approved_on": "2026-10-11", |
| 4 | "entries": [ |
| 5 | {"id": "zdd.settings.heading", "file": "internal/console/swapcopy.go", "text": "Deploys"}, |
| 6 | {"id": "zdd.settings.intro", "file": "internal/console/swapcopy.go", "text": "When a new build reaches a running instance, the old instance keeps running until the new one is ready."}, |
| 7 | {"id": "zdd.settings.swap-label", "file": "internal/console/swapcopy.go", "text": "Swap mode:"}, |
| 8 | {"id": "zdd.settings.overlap-option", "file": "internal/console/swapcopy.go", "text": "overlap (default)"}, |
| 9 | {"id": "zdd.settings.hold-option", "file": "internal/console/swapcopy.go", "text": "hold"}, |
| 10 | {"id": "zdd.settings.concurrency-label", "file": "internal/console/swapcopy.go", "text": "Instances that swap at once on each box:"}, |
| 11 | {"id": "zdd.settings.migrations-note", "file": "internal/console/swapcopy.go", "text": "With overlap, the old and new builds share the instance's database for a few seconds. Migrations need to be backward compatible to ensure the old version keeps working. Use hold when a release cannot do that."}, |
| 12 | {"id": "zdd.settings.save", "file": "internal/console/templates/app_settings.html", "text": "Save"}, |
| 13 | {"id": "zdd.settings.saved", "file": "internal/console/swapcopy.go", "text": "Swap policy saved: %s, %d at a time on each box."}, |
| 14 | {"id": "zdd.settings.invalid", "file": "internal/console/swapcopy.go", "text": "Choose overlap or hold, and a whole number of 1 or more."}, |
| 15 | {"id": "zdd.settings.store-failed", "file": "internal/console/swapcopy.go", "text": "Could not save the swap policy. Try again."}, |
| 16 | {"id": "zdd.settings.rate-limited", "file": "internal/console/swapcopy.go", "text": "Too many changes. Try again in a minute."}, |
| 17 | {"id": "zdd.settings.unread", "file": "internal/console/swapcopy.go", "text": "This app's swap policy could not be read just now, so it cannot be changed here. Reload before concluding anything."}, |
| 18 | {"id": "zdd.settings.no-bucket", "file": "internal/console/swapcopy.go", "text": "No deployment bucket on this host, so the swap policy cannot be changed here."}, |
| 19 | {"id": "zdd.instance.installed", "file": "internal/console/swapcopy.go", "text": "Installed build"}, |
| 20 | {"id": "zdd.instance.serving", "file": "internal/console/swapcopy.go", "text": "Serving build"}, |
| 21 | {"id": "zdd.instance.hold", "file": "internal/console/swapcopy.go", "text": "Failure hold"}, |
| 22 | {"id": "zdd.instance.hold-text", "file": "internal/console/swapcopy.go", "text": "Build %s failed on this box because %s. This instance stays on %s until you retry it or ship a newer build."}, |
| 23 | {"id": "zdd.instance.hold-down-text", "file": "internal/console/swapcopy.go", "text": "Build %s failed in hold mode on this box, and nothing is serving this instance. Roll back with carlos rollback, or retry it."}, |
| 24 | {"id": "zdd.instance.promote-retry", "file": "internal/console/swapcopy.go", "text": "To try it again on every box: carlos promote --app %s --retry %s %s"}, |
| 25 | {"id": "zdd.instance.retry-button", "file": "internal/console/swapcopy.go", "text": "Retry"}, |
| 26 | {"id": "zdd.instance.rolling", "file": "internal/console/swapcopy.go", "text": "Build %s is installed and rolling out. Build %s serves until the new one passes its health check."}, |
| 27 | {"id": "zdd.instance.asleep", "file": "internal/console/swapcopy.go", "text": "Build %s is installed and starts on the next request."}, |
| 28 | {"id": "zdd.instance.retry-title", "file": "internal/console/swapcopy.go", "text": "Retry build {build} on {host}?"}, |
| 29 | {"id": "zdd.instance.retry-line", "file": "internal/console/swapcopy.go", "text": "This clears the failure hold on {host}. Its next attempt at {build} runs as a canary. If that fails too, {host} is held again."}, |
| 30 | {"id": "zdd.instance.retry-done", "file": "internal/console/swapcopy.go", "text": "Retry requested for {host}."}, |
| 31 | {"id": "zdd.instance.retry-failed", "file": "internal/console/swapcopy.go", "text": "The retry request failed. Try again."}, |
| 32 | {"id": "zdd.instance.retry-limited", "file": "internal/console/swapcopy.go", "text": "Too many retry requests. Try again later."}, |
| 33 | {"id": "zdd.instance.not-held", "file": "internal/console/swapcopy.go", "text": "{host} is no longer held back by a failed build, so there is nothing to retry."}, |
| 34 | {"id": "zdd.instance.audit", "file": "internal/console/swapcopy.go", "text": "Retry of build {build} requested for {host}."}, |
| 35 | {"id": "zdd.api.swap-nothing", "file": "internal/console/apiswap.go", "text": "nothing to set: send swap, swap_concurrency, or both"}, |
| 36 | {"id": "zdd.api.swap-bad", "file": "internal/console/apiswap.go", "text": "swap must be \"overlap\" or \"hold\""}, |
| 37 | {"id": "zdd.api.concurrency-bad", "file": "internal/console/apiswap.go", "text": "swap_concurrency must be a whole number, 1 or more"}, |
| 38 | {"id": "zdd.api.swap-limited", "file": "internal/console/apiswap.go", "text": "too many requests. wait a minute and try again"}, |
| 39 | {"id": "zdd.api.swap-audit", "file": "internal/console/apiswap.go", "text": "set the swap policy for %s to %s, %d at a time (%s)"}, |
| 40 | {"id": "zdd.api.ship-swap-bad", "file": "internal/console/apiship_swap.go", "text": "swap must be \"hold\" or left out"}, |
| 41 | {"id": "zdd.api.ship-swap-conflict", "file": "internal/console/apiship_swap.go", "text": "version %s was already shipped with a different swap demand. Versions are immutable: ship under a new version"}, |
| 42 | {"id": "zdd.api.retry-store", "file": "internal/console/apiretry.go", "text": "could not write the retry request. Try again"}, |
| 43 | {"id": "zdd.api.retry-host-audit", "file": "internal/console/apiretry.go", "text": "requested a retry of %s on %s (%s)"}, |
| 44 | {"id": "zdd.api.retry-not-held", "file": "internal/console/apiretry.go", "text": "%s is not held back by a failed build, as far as its box last reported, so there is nothing to retry"}, |
| 45 | {"id": "zdd.api.retry-no-bucket", "file": "internal/console/apiretry.go", "text": "no deployment bucket on this host. this console cannot request a retry"}, |
| 46 | {"id": "zdd.api.retry-limited", "file": "internal/console/apiretry.go", "text": "too many requests. wait a minute and try again"}, |
| 47 | {"id": "zdd.apps.usage-line", "file": "apps.go", "text": "usage: carlos apps <create|place|build-probe|set|delete|restore|ttl|keep|list> [flags] <app>"}, |
| 48 | {"id": "zdd.apps.usage-set", "file": "apps.go", "text": " set <app> [--swap overlap|hold] [--swap-concurrency <n>] how the app's\n running instances take a new build: see carlos apps set -h."}, |
| 49 | {"id": "zdd.apps-set.usage", "file": "apps_swap.go", "text": "usage: carlos apps set <app> [--swap overlap|hold] [--swap-concurrency <n>] [--account <sqid|name>] [--account-id <sqid>] [--console <origin>]\n\n --swap overlap|hold how a running instance takes a new build. overlap\n starts the new build beside the old one and switches\n once it answers its health check, so no request\n waits. hold stops the old one first, and requests\n wait until the new one is up. Use hold when two\n builds cannot share the database.\n --swap-concurrency <n> how many instances of the app may swap at once on\n one box, after the first has stayed up for ten\n seconds. 1 or more; it starts at 1.\n\nAny member of the app may change these. They reach the app's boxes with its\nconfig, within seconds."}, |
| 50 | {"id": "zdd.apps-set.flag-swap", "file": "apps_swap.go", "text": "overlap or hold: how a running instance takes a new build"}, |
| 51 | {"id": "zdd.apps-set.flag-concurrency", "file": "apps_swap.go", "text": "how many instances of the app may swap at once on one box (1 or more)"}, |
| 52 | {"id": "zdd.apps-set.flag-app", "file": "apps_swap.go", "text": "app whose swap policy to set"}, |
| 53 | {"id": "zdd.apps-set.nothing", "file": "apps_swap.go", "text": "apps set: nothing to set. Pass --swap, --swap-concurrency, or both"}, |
| 54 | {"id": "zdd.apps-set.bad-swap", "file": "apps_swap.go", "text": "apps set: --swap is overlap or hold, not %q"}, |
| 55 | {"id": "zdd.apps-set.bad-concurrency", "file": "apps_swap.go", "text": "apps set: --swap-concurrency must be 1 or more"}, |
| 56 | {"id": "zdd.apps-set.two-apps", "file": "apps_swap.go", "text": "apps set: name the app once, either first or with --app"}, |
| 57 | {"id": "zdd.apps-set.direct-mode", "file": "apps_swap.go", "text": "apps set works through a console, and this shell is in direct bucket mode (CARLOS_DEPLOYMENT_BUCKET or CARLOS_DEPLOYMENT_DIR is set). Log in instead: carlos auth login --console <url>"}, |
| 58 | {"id": "zdd.apps-set.done", "file": "apps_swap.go", "text": "%s swaps in %s mode, %d at a time on each box"}, |
| 59 | {"id": "zdd.apps-set.overlap-note", "file": "apps_swap.go", "text": " the old and new builds run side by side for a few seconds and share the database, so keep migrations backward-compatible"}, |
| 60 | {"id": "zdd.apps-set.hold-note", "file": "apps_swap.go", "text": " each instance stops before its new build starts, and requests wait until it is up"}, |
| 61 | {"id": "zdd.apps-set.mismatch", "file": "apps_swap.go", "text": "apps set: the change did not stick (the console stored %s, %d at a time). Run it again"}, |
| 62 | {"id": "zdd.apps-set.old-console", "file": "apps_swap.go", "text": "not found: either %s is not an app in this account, or this console predates carlos apps set (deploy a console built from current main)"}, |
| 63 | {"id": "zdd.apps-set.error", "file": "apps_swap.go", "text": "apps set: %v"}, |
| 64 | {"id": "zdd.apps-set.unreadable", "file": "apps_swap.go", "text": "apps set: unreadable response: %w"}, |
| 65 | {"id": "zdd.ship.flag-swap", "file": "cli.go", "text": "hold: this release stops each instance before starting it, for a migration the previous build cannot share the database with"}, |
| 66 | {"id": "zdd.ship.usage-flag", "file": "cli.go", "text": "[--swap hold]"}, |
| 67 | {"id": "zdd.ship.bad-swap", "file": "cli.go", "text": "--swap takes hold, or leave it off (%q is not a swap demand)"}, |
| 68 | {"id": "zdd.ship.hold-note", "file": "cli.go", "text": " this release swaps in hold mode: each instance stops before the new build starts"}, |
| 69 | {"id": "zdd.ship.no-echo", "file": "apimode.go", "text": "ship: this console predates --swap and stored the release without it, so it would swap in overlap mode. Nothing was promoted. Upgrade the console, then ship under a new version"}, |
| 70 | {"id": "zdd.deploy.usage-flag", "file": "deploy.go", "text": "[--swap hold]"}, |
| 71 | {"id": "zdd.deploy.held-until", "file": "deploy.go", "text": "%s is held by the %s bake window until about %s, then the fleet installs it. Fast-track it in the console if this is an emergency"}, |
| 72 | {"id": "zdd.instances-retry.usage-line", "file": "instances_cli.go", "text": " carlos instances retry --app <a> <host>"}, |
| 73 | {"id": "zdd.instances-retry.usage-para", "file": "instances_cli.go", "text": "retry clears the failure hold on one instance: the build that failed on its\nbox is tried again there, as a canary. \"carlos promote --retry <version>\n<channel>\" does the same on every box."}, |
| 74 | {"id": "zdd.instances-retry.done", "file": "instances_cli.go", "text": "retry requested for %s: its next attempt at %s runs as a canary"}, |
| 75 | {"id": "zdd.instances-retry.old-console", "file": "instances_cli.go", "text": "not found: either %s has no instance %s, or this console predates carlos instances retry (deploy a console built from current main)"}, |
| 76 | {"id": "zdd.list.header", "file": "instances_cli.go", "text": "HOST\\tREGION\\tCHANNEL\\tPOOL\\tINSTALLED\\tSERVING\\tHEALTH\\tUPSTREAMS\\tDB\\tCREATED\\tBY\\tREASON"}, |
| 77 | {"id": "zdd.list.retry-hint", "file": "instances_cli.go", "text": "a build that failed is tried again on every box with carlos promote --app %s --retry <version> <channel>, or on one instance with carlos instances retry --app %s <host>"}, |
| 78 | {"id": "zdd.state.held", "file": "internal/rolloutwords/words.go", "text": "held: build %s failed on this box"}, |
| 79 | {"id": "zdd.state.rolling-out", "file": "internal/rolloutwords/words.go", "text": "rolling out"}, |
| 80 | {"id": "zdd.state.asleep", "file": "internal/rolloutwords/words.go", "text": "starts %s on its next request"}, |
| 81 | {"id": "zdd.state.config-pending", "file": "internal/rolloutwords/words.go", "text": "config delivered, not active"}, |
| 82 | {"id": "zdd.cause.release", "file": "internal/rolloutwords/words.go", "text": "new release"}, |
| 83 | {"id": "zdd.cause.install", "file": "internal/rolloutwords/words.go", "text": "installed by hand"}, |
| 84 | {"id": "zdd.cause.retry", "file": "internal/rolloutwords/words.go", "text": "retry"}, |
| 85 | {"id": "zdd.cause.restart", "file": "internal/rolloutwords/words.go", "text": "carlos restart"}, |
| 86 | {"id": "zdd.cause.config", "file": "internal/rolloutwords/words.go", "text": "config change"}, |
| 87 | {"id": "zdd.reason.health", "file": "internal/rolloutwords/words.go", "text": "it did not answer its health check within 30 seconds"}, |
| 88 | {"id": "zdd.reason.settle", "file": "internal/rolloutwords/words.go", "text": "it stopped within 10 seconds of answering its health check"}, |
| 89 | {"id": "zdd.reason.exit", "file": "internal/rolloutwords/words.go", "text": "it exited before it was ready"}, |
| 90 | {"id": "zdd.reason.staging", "file": "internal/rolloutwords/words.go", "text": "the copy on the box did not match the release"}, |
| 91 | {"id": "zdd.reason.reused", "file": "internal/rolloutwords/words.go", "text": "this version name was shipped twice with different content, so ship it under a new name"}, |
| 92 | {"id": "zdd.reason.unknown", "file": "internal/rolloutwords/words.go", "text": "it failed (%s)"}, |
| 93 | {"id": "zdd.unavailable.declined", "file": "internal/rolloutwords/words.go", "text": "its box cannot run two builds side by side, so it restarts instances the old way"}, |
| 94 | {"id": "zdd.unavailable.store", "file": "internal/rolloutwords/words.go", "text": "its box cannot start instances: the deploy store is unavailable"}, |
| 95 | {"id": "zdd.unavailable.release-key", "file": "internal/rolloutwords/words.go", "text": "its box cannot start instances: the release key is unavailable"}, |
| 96 | {"id": "zdd.unavailable.failure-book", "file": "internal/rolloutwords/words.go", "text": "its box cannot start instances: its record of failed builds cannot be read"}, |
| 97 | {"id": "zdd.unavailable.unknown", "file": "internal/rolloutwords/words.go", "text": "its box reports a rollout problem (%s)"}, |
| 98 | {"id": "zdd.event.swapping", "file": "internal/rolloutwords/words.go", "text": "starting build %s (%s)"}, |
| 99 | {"id": "zdd.event.swapped", "file": "internal/rolloutwords/words.go", "text": "now serving build %s. The previous build finished its requests and stopped in %s"}, |
| 100 | {"id": "zdd.event.swap-failed", "file": "internal/rolloutwords/words.go", "text": "build %s did not take over, because %s. Still serving build %s"}, |
| 101 | {"id": "zdd.event.hold-down", "file": "internal/rolloutwords/words.go", "text": "build %s failed and nothing is serving. This app swaps in hold mode, so nothing falls back by itself. Roll back with carlos rollback"}, |
| 102 | {"id": "zdd.event.cohort-halted", "file": "internal/rolloutwords/words.go", "text": "rollout of build %s stopped on box %s, because %s. Instances on that box that have not served it stay on their last good build"}, |
| 103 | {"id": "zdd.event.fallback-served", "file": "internal/rolloutwords/words.go", "text": "build %s failed to start, so the last good build, %s, is serving instead"}, |
| 104 | {"id": "zdd.event.config-pending", "file": "internal/rolloutwords/words.go", "text": "new config reached this box but is not in use yet, because %s. Trying again in %s"}, |
| 105 | {"id": "zdd.event.staging-refused", "file": "internal/rolloutwords/words.go", "text": "build %s is not staged correctly on this box, so the box asked for it to be staged again"}, |
| 106 | {"id": "zdd.event.bounce-instance", "file": "internal/rolloutwords/words.go", "text": "instance restarting (%s)"}, |
| 107 | {"id": "zdd.event.bounce-sidecar", "file": "internal/rolloutwords/words.go", "text": "sidecar restarting (%s)"}, |
| 108 | {"id": "zdd.refuse.not-installed", "file": "internal/rollout/wakeplan.go", "text": "no build is installed for this instance yet"}, |
| 109 | {"id": "zdd.refuse.held-down", "file": "internal/rollout/wakeplan.go", "text": "build %s failed in hold mode on this instance, so it stays down until you roll back or retry the build"}, |
| 110 | {"id": "zdd.refuse.not-staged", "file": "internal/rollout/wakeplan.go", "text": "build %s is not staged correctly on this box"}, |
| 111 | {"id": "zdd.refuse.attempt-running", "file": "internal/rollout/wakeplan.go", "text": "this instance is still moving to another build"}, |
| 112 | {"id": "zdd.refuse.not-installable", "file": "internal/rollout/wakeplan.go", "text": "its build could not be installed"}, |
| 113 | {"id": "zdd.refuse.held-since-plan", "file": "internal/rollout/wakeplan.go", "text": "build %s failed on this box while this instance was starting, so it was not started"}, |
| 114 | {"id": "zdd.refuse.no-store", "file": "internal/host/rollout.go", "text": "this box cannot start instances right now: the deploy store is unavailable"}, |
| 115 | {"id": "zdd.refuse.no-release-key", "file": "internal/host/rollout.go", "text": "this box cannot start instances right now: the release key is unavailable"}, |
| 116 | {"id": "zdd.refuse.book-unreadable", "file": "internal/rollout/wakeplan.go", "text": "this box cannot start instances right now: its record of failed builds cannot be read"}, |
| 117 | {"id": "zdd.refuse.no-swaps", "file": "internal/host/rolloutdeclined.go", "text": "this box cannot run two builds side by side, which this instance's build needs"}, |
| 118 | {"id": "zdd.refuse.restart", "file": "internal/host/rollout.go", "text": "restart refused: this box cannot restart instances right now"}, |
| 119 | {"id": "zdd.wake.not-published", "file": "internal/activator/logsink.go", "text": "wake failed: the box could not record which build this instance runs, so it did not start it. the next request tries again"}, |
| 120 | {"id": "zdd.sidecar.restart-retrying", "file": "internal/activator/activator.go", "text": "sidecar could not be restarted. retrying"}, |
| 121 | {"id": "zdd.watch.intro", "file": "deploywatch.go", "text": "watching %s roll out box by box: an awake instance counts once the new build has taken over, an asleep one once its box has installed it"}, |
| 122 | {"id": "zdd.watch.word-swapped", "file": "deploywatch.go", "text": "swapped"}, |
| 123 | {"id": "zdd.watch.word-installed", "file": "deploywatch.go", "text": "installed"}, |
| 124 | {"id": "zdd.watch.asleep-tail", "file": "deploywatch.go", "text": "starts on its next request"}, |
| 125 | {"id": "zdd.watch.word-failed", "file": "deploywatch.go", "text": "failed"}, |
| 126 | {"id": "zdd.watch.word-held", "file": "deploywatch.go", "text": "held"}, |
| 127 | {"id": "zdd.watch.held-tail", "file": "deploywatch.go", "text": "stayed on %s because %s failed on this box"}, |
| 128 | {"id": "zdd.watch.box", "file": "deploywatch.go", "text": "box %s: %s"}, |
| 129 | {"id": "zdd.watch.count-swapped", "file": "deploywatch.go", "text": "%d swapped"}, |
| 130 | {"id": "zdd.watch.count-asleep", "file": "deploywatch.go", "text": "%d asleep with it installed"}, |
| 131 | {"id": "zdd.watch.count-failed", "file": "deploywatch.go", "text": "%d failed"}, |
| 132 | {"id": "zdd.watch.count-held", "file": "deploywatch.go", "text": "%d stayed on their last good build"}, |
| 133 | {"id": "zdd.watch.failed-summary", "file": "deploywatch.go", "text": "build %s did not reach every instance: %d failed and %d stayed on their last good build. Fix it and deploy a new build, or try this one again: carlos promote --app %s --retry %s %s"}, |
| 134 | {"id": "zdd.watch.hold-down-summary", "file": "deploywatch.go", "text": "an instance that swaps in hold mode is down, with nothing to fall back to: carlos rollback --app %s"}, |
| 135 | {"id": "zdd.watch.timeout", "file": "deploywatch.go", "text": "timed out waiting for build %s:"}, |
| 136 | {"id": "zdd.watch.pending-not-installed", "file": "deploywatch.go", "text": "its box has not installed this build yet"}, |
| 137 | {"id": "zdd.watch.pending-other", "file": "deploywatch.go", "text": "its box has %s installed, not this build"}, |
| 138 | {"id": "zdd.watch.pending-queued", "file": "deploywatch.go", "text": "queued"}, |
| 139 | {"id": "zdd.watch.pending-running", "file": "deploywatch.go", "text": "starting beside the running build"}, |
| 140 | {"id": "zdd.watch.pending-settling", "file": "deploywatch.go", "text": "settling: making sure it stays up for 10 seconds"}, |
| 141 | {"id": "zdd.watch.pending-waiting", "file": "deploywatch.go", "text": "waiting for its box to start it"}, |
| 142 | {"id": "zdd.watch.pending-dark", "file": "deploywatch.go", "text": "its box stopped reporting"}, |
| 143 | {"id": "zdd.watch.box-busy", "file": "deploywatch.go", "text": "box %s is still working through this app's instances"}, |
| 144 | {"id": "zdd.watch.pending-unlisted", "file": "deploywatch.go", "text": "the console's instance list was cut short before it, so its state is unknown"}, |
| 145 | {"id": "zdd.watch.pending-unread", "file": "deploywatch.go", "text": "the console could not read every box's report, so its state is unknown"}, |
| 146 | {"id": "zdd.watch.list-failed", "file": "deploywatch.go", "text": "the console's instance list could not be read, so the rollout could not be followed"}, |
| 147 | {"id": "zdd.docs.apps-set", "file": "docs/site/cli.md", "text": "`carlos apps set` changes how the app's running instances take a new build:\n\n```sh\ncarlos apps set hello --swap hold\ncarlos apps set hello --swap-concurrency 3\n```\n\nWith `--swap overlap`, the default, the new build starts beside the old one\nand takes over once it answers its health check, so no request waits. With\n`--swap hold`, the old one stops first, and requests wait until the new one\nis up. `--swap-concurrency` is how many instances may swap at once on one\nbox, after the first one has stayed up for ten seconds; it starts at 1. Any\nmember of the app can change both, here or on the app's settings page in the\nconsole."}, |
| 148 | {"id": "zdd.docs.deploy-watch", "file": "docs/site/cli.md", "text": "Deploy then watches each box roll the build out. An awake instance counts\nonce the new build has passed its health check and taken over; on each box\nthe first one must also stay up for ten seconds before the rest follow. An\nasleep instance counts once its box has installed the build, and starts it on\nits next request. If the build fails on a box, that box stops rolling it out,\nits other instances stay on the build they were serving, and deploy names the\nfailure and exits with an error."}, |
| 149 | {"id": "zdd.docs.deploy-watch-lead", "file": "docs/site/cli.md", "text": "Where a box does not report its rollout yet, deploy watches the app's URL\ninstead, and what it watches there is worth knowing, because the two answers\ndiffer."}, |
| 150 | {"id": "zdd.docs.deploy-swap-and-retry", "file": "docs/site/cli.md", "text": "`--swap hold` ships a release that stops each instance before starting the\nnew build, for a migration the previous build cannot share the database\nwith. It applies to that release only; `carlos apps set --swap hold` makes it\nthe rule for the app.\n\nTo try a build that failed again, once you have fixed what it depended on,\npromote it again with `--retry`. Every box where it failed tries it again:\n\n```sh\ncarlos promote --app hello --retry a1b2c3d edge\n```\n\nWithout `--retry`, promoting a build that is already on the channel does\nnothing."}, |
| 151 | {"id": "zdd.docs.migrations", "file": "docs/site/cli.md", "text": "#### Two builds at once\n\nWhen a new build reaches an awake instance, it starts beside the old one,\nand for a few seconds both run. They share the instance's database and its\nscheduled work. The new build's migrations run while the old build is still\nserving, so both builds must work with the database in between:\n\n- Add in one release and remove in a later one. A new column, table or index\n goes in one release; dropping the old one waits for the next.\n- Keep the names of scheduled work (`carlos schedule`) the same across the\n two builds.\n\nWhen a release cannot follow these rules, ship it with `--swap hold`, or set\nthe app to `hold` with `carlos apps set`. Each instance then stops before the\nnew build starts, and requests wait until it is up."}, |
| 152 | {"id": "zdd.docs.instances", "file": "docs/site/cli.md", "text": "`carlos instances list` shows two builds for each instance: the one installed\non its box, and the one serving its requests. They differ while a new build\nrolls out, while an asleep instance waits for its next request, and after a\nbuild has failed on that box. The REASON column says which.\n\n`carlos instances retry` clears the failure hold on one instance, so the\nbuild that failed there is tried again, as a canary:\n\n```sh\ncarlos instances retry --app hello shop-1.hello.example.com\n```"}, |
| 153 | {"id": "zdd.docs.sidecars", "file": "docs/site/cli.md", "text": "Because a sidecar has no URL, there is no `X-Carlos-Version` header to read\nit back from, so `carlos sidecars ls` shows the build its box last started\nfor each sidecar, beside the version its channel points at. One that has not\nstarted on any box reads as unknown rather than as current."} |
| 154 | ] |
| 155 | } |
| 156 | |