Skip to content

v0.x: an unattended run starts without a person

A GTB tool run with nobody at the terminal is no longer stopped by a question nobody can answer (spec 0208). A run is unattended when it is under CI (--ci, the ci key or CI=true), or when its stdin is not a terminal: a service under systemd, a pod without tty: true, a cron job, a script, or piped input. Nothing in a tool's code changes.

What changes

  • No pre-run update check. An unattended run makes no release probe, shows no spinner, asks nothing and never self-updates. It used to probe whenever the check was due, and skip only the prompt.
  • The enabled policy no longer blocks it. A service restarted after a release used to refuse to start with "an update to … is required before continuing", which in a pod is a crash loop. It now starts and logs one warning that the policy is not enforced without a terminal. A person at a terminal who declines the prompt is still blocked.
  • No out-of-date reminder. The cached "a newer … is available" warning is suppressed, as it already was under CI.
  • No config file needed. With init enabled and no config file, an unattended run starts on the embedded defaults, the environment and the flags, and logs that it did, where it used to fail with "no config file found" and a hint to run init. This includes --ci and CI=true runs. A required config source still fails the start, and a tool with Bootstrap.AutoInitialise still auto-initialises.
  • The telemetry consent prompt is unchanged: it already deferred without a terminal and under CI. Its debug line now reads telemetry consent deferred: no terminal or telemetry consent deferred: CI environment.
  • version is unchanged. It still makes its live check without a terminal, and skips it only under CI.

What to check

  • A pipeline or script that relied on the "no config file found" failure to catch a missing init now runs on the defaults. Check for the config it needs explicitly, or run with a terminal.
  • A deployment that relied on the enabled policy to stop an out-of-date service now has to update it another way: redeploy it, or run update as part of the deployment.
  • A service whose manifest sets tty: true (Compose, Kubernetes) or that is started with docker run -t has a terminal for stdin, so it is still treated as attended. Drop the tty, or pass --ci.
  • A test that drives the root with no props.IO reads the process's stdin, which under go test is not a terminal, so it now runs unattended. Give it an interactive IO to exercise the attended path.