Skip to content

Lines hushrun prints

Updated

Every line hushrun prints as it runs, skips, checks a push or sets up a repository, grouped by when you see it, with what it means and what to do.

  • hushrun run's lines and the pre-push hook's go to stderr, and their first line starts with hushrun: . The tables leave that prefix out.
  • hushrun ready prints its report on stdout, and hushrun init its plan.
  • Errors start with error: and warnings with warning: , and the tables keep those.
  • Everything else is your command's own output.
  • A line about sharing or recording never changes a check's exit code. hushrun runs the command whenever it can't skip, and exits as the command did, or 0 when it skips.
  • -q silences hushrun's lines. -v adds more of its reasoning.
  • In the examples, test is the check's name, acme your organization and a0b1c2d the commit.

When a check runs or skips

The first and last line of each hushrun run.

LineWhat it meansWhat to do
test running: no pass yet for this exact codeNo pass is recorded for what hushrun compares, so the command runsNothing. Once it passes, the same code skips
test passed in 41s; it won't run again on this codeIt passed, and the pass was recordedNothing
test skipped: this exact code passed 3 min ago (saves 41s)A pass for this exact code was found. The command didn't run, and hushrun exited 0Nothing. To see its output, run it again
test skipped: this exact code passed in CI 3 min ago (saves 41s)The same, for a pass CI recordedNothing
test running: it failed on this exact code last timeThe newest result for this code is a failure, so it runs againFix the code. If it passes now, it may be flaky
test failed in 2s (exit 1)It failed. The failure was recorded, and the command's exit code keptFix the code, not the check
test running (--force)--force runs it even after a pass, and records the new resultNothing
test stopped by a signal; nothing recordedIt was interrupted, for example with Ctrl-CRun it again
test passed in 12s, but files changed while it ran, so it wasn't recorded. If test writes files, list them in .gitignoreThe files changed during the run, so the result belongs to neither versionList what the check writes in .gitignore: see Generated files
test running: can't read earlier results (…)The backend didn't answer within 10 seconds, or answered something unexpected. The check runs, and hushrun still tries to recordNothing. If it keeps happening, see Troubleshooting
test running without skipping: can't tell which code this is (this policy has several scopes (api, web); pass --scope NAME or --all-scopes)hushrun.yaml has several scopes, and the command names noneAdd --scope NAME to the check's command: see Scopes
test running without skipping: can't tell which code this is (no git repository at or above …)It runs outside a git repository, and records nothingRun it inside the repository
test running without skipping: results are off (package.json's hushrun.backend: … use https://)The backend's URL isn't https://, or http:// on this machineFix the URL: see Configuration
can't start vitest: No such file or directory (os error 2)The command wasn't found, and hushrun exits 127. A command found but not runnable exits 126Run the script through your package manager, such as npm test, or give the command's path

In CI

LineWhat it meansWhat to do
test running: this exact code passed in another CI job, and a CI pass counts in its own jobThe pass came from a job with another name, or on another systemNothing. See Jobs and variants
test running: job test of .github/workflows/ci.yml has several variants, which a run's key doesn't tell apart, so no pass skips it: to skip, name each, such as npx hushrun run test-${{ strategy.job-index }} --The job has a matrix, so one pass can't speak for every variant. The check runs every timeGive each variant its own name
test running: this job has several instances, which a run's key doesn't tell apart, so no pass skips itOn GitLab, the job uses parallel or a matrixGive each variant its own name
test running: …, so hushrun can't tell its variants, and no pass skips ithushrun can't read the job, as in a reusable workflow, so it runs every timeSee Jobs and variants
test passed in 41sIn a job that no pass skips, it passed and was recordedNothing
test skipped: this exact code passed in CI 3 min ago (saves 41s); skipped only on CI's passesThe repository has CI reuses only CI's results turned onNothing. See CI reuses only CI's results
test running: no CI pass yet for this exact code; skipped only on CI's passesThe same setting, with no pass from CI on this codeNothing

Where a check counts

These come from a counts_from rule in hushrun.yaml.

LineWhat it meansWhat to do
test running: this run won't count: needs go 1.25, this is go1.24.3This machine doesn't meet the check's rule. hushrun says so before the command startsLet it run. The line after it decides
test passed in 6s; it won't count: needs go 1.25, this is go1.24.3It ran and kept its exit code, but recorded nothing. hushrun ready lists it as ciLeave it to CI or a machine that meets the rule. Don't edit counts_from to get past it. See Where a check counts
test passed in 6s on linux, go1.25.14; it countsThe machine met the rule, and the pass was recordedNothing

Variables

LineWhat it meansWhat to do
HUSHRUN_NO_CI_OUTPUT is "maybe", not true or false, so it's ignoredhushrun can't read the variable, and goes on as if it weren't setFix the value or remove the variable: see Environment variables
HUSHRUN_INVOKED_BY is "ci", not agent:<id> or human:<id>, so runs aren't labeledThe label isn't in the form hushrun takesSet it to agent:<id> or human:<id>

Signing in and sharing results

These say why a result wasn't shared with your organization. The check still ran, and its exit code is kept.

LineWhat it meansWhat to do
sign in to share results with acme: npx hushrun loginNobody signed in on this machine. hushrun says this at a terminal onlyRun npx hushrun login once
results aren't shared with acme: …No credential reached the backend: no sign-in, no HUSHRUN_AGENT, no HUSHRUN_TOKEN, and in GitHub Actions no id-token: write. The rest is the backend's reasonIn a sandbox, set HUSHRUN_AGENT. In GitHub Actions, add id-token: write. In other CI, set HUSHRUN_TOKEN and HUSHRUN_MACHINE_KEY. See Which credential goes where
results aren't shared with acme: no token: …, with HUSHRUN_AGENT setThis hushrun is older than 0.6.0, and ignores HUSHRUN_AGENTMove the repository to hushrun 0.6.0 or later: see Agents in sandboxes
test running: acme refused your login: …Your sign-in no longer works there, for example because you left the organizationRun hushrun login again
test running: acme refused HUSHRUN_AGENT: agent token hra_AbC123 (agent:fleet-a) expired on 2026-10-20…The sandbox's token expired. … was revoked on … means someone revoked itCreate a token under the same agent name, and update the variable: see Agents in sandboxes
test running: acme refused HUSHRUN_TOKEN: …The agent token in HUSHRUN_TOKEN expired or was revokedCreate a new token, and update the secret
test running: acme refused this job's ID token: …The backend doesn't accept this repository's CICheck that the repository is connected to the organization, and wasn't deleted and created again under the same name: see Set up CI
HUSHRUN_TOKEN isn't sent to https://…: it goes only to the backend HUSHRUN_BACKEND names, and an agent token (hra_…) to hushrun's host, https://api.hushrun.comThe repository names a backend this token may not go toIn a sandbox, use HUSHRUN_AGENT. Elsewhere, set HUSHRUN_BACKEND to the backend's URL: see Which credential goes where
HUSHRUN_AGENT is damaged: part of it is missing, or something was added, such as a line break, so it's ignoredThe string was cut short or wrapped. hushrun shows none of it, since it holds a keyCopy it again, on one line
HUSHRUN_AGENT comes from a newer hushrun than this one: update hushrun, so it's ignoredA newer hushrun made the stringUpdate hushrun in the repository
HUSHRUN_AGENT holds an agent token alone, not the whole string: …, so it's ignoredIt holds hushrun token create's stdout, which is the token aloneSet the whole string, from a terminal or --format json
HUSHRUN_TOKEN holds a HUSHRUN_AGENT string, which is never sent: set it as HUSHRUN_AGENT, so it's ignoredThe string is in the wrong variableSet it as HUSHRUN_AGENT, and unset the variable the line names
HUSHRUN_AGENT wins over HUSHRUN_TOKEN and HUSHRUN_MACHINE_KEY: it holds the backend, the token and the key togetherOther credentials are set beside the string, and hushrun ignores themRemove the variables it names
error: not signed in: …, with a link to your machines pageYou have 20 machines in that organization, the most it takesRevoke one at https://app.hushrun.com/account/machines, then run hushrun login again
error: not signed in: … To make this machine a new key, remove …, then run `hushrun login` againYou or an admin revoked this machine, and a revoked machine doesn't come backRemove the key file it names, then run hushrun login. Sign in again in your other organizations too

Results that aren't recorded

These end a run that passed or failed as usual, with its exit code kept. Nothing was recorded, so the next run on this code runs again.

LineWhat it meansWhat to do
test passed in 41s; not recorded: …; upgrade: https://app.hushrun.com/acme/-/billingYour organization reached its plan's limit this period: on Free and Pro, the checks it includes; on Team and Growth, the spend cap. The … is the server's reason, belowAn owner or admin upgrades at that page, or wait for the next period: see At the limit
test failed in 2s (exit 1); not recorded: …; upgrade: https://app.hushrun.com/acme/-/billingThe same, for a check that failed. Its exit code is keptThe same
acme used the 2,000 recorded checks its Free plan includes this month, so checks run instead of skipping until 2026-11-01The server's reason on Free and ProThe same
acme reached its spend cap for this period (10,000 recorded checks, $50 of overage), so checks run instead of skipping until 2026-11-01The server's reason on Team and Growth, past the spend capRaise the cap on the Usage page, or wait for the next period: see Overage and the spend cap
warning: check results aren't recorded: …; upgrade: https://app.hushrun.com/acme/-/billingA pipeline command, hushrun run --stage or hushrun attest --check, says this once per command, with the server's reason. On GitHub Actions it's a warning annotation titled hushrun: check results not recorded insteadThe same as above
pass unit (exit 0; not recorded), from hushrun run --stageThat check's result wasn't recorded for the plan. run --stage still exits 0 when its checks passed and 8 when one failedThe same
not recorded check: unit, from hushrun attestThe check event wasn't recorded for the plan. attest still exits 0The same
test passed in 41s; not recorded: this machine isn't registered: run `hushrun login` A result from your sign-in needs this machine's signature. The machine has no key yet, was revoked, or went 90 days unusedRun hushrun login on this machine
test passed in 41s; not recorded: set `HUSHRUN_MACHINE_KEY` to the key `hushrun token create --agent` printedAn agent token is in HUSHRUN_TOKEN, without the key it came withIn a sandbox, use HUSHRUN_AGENT. In CI, set the key: see Which credential goes where
test passed in 41s; not recorded: HUSHRUN_AGENT's key can't sign for its token: make a new string with `hushrun token create --agent` The key inside the string doesn't belong to its token. No variable replaces itMake a new string with hushrun token create --agent
test passed in 41s; not recorded: agent token hra_AbC123 records results for github.com/acme/shop only, and this result is for github.com/acme/web…The token belongs to another repositoryUse that repository's token, or one made with --org-wide
test passed in 41s; not recorded: agent token hra_AbC123 (agent:fleet-a) recorded 300 results in the last minute, its limit…The fleet records faster than its token allowsSlow it down, or create the token with a higher --rate
test passed in 41s; not recordedThe backend refused the credential. A line about sharing says whySee Signing in and sharing results
test passed in 41s, but it couldn't be recorded (…)The backend couldn't be reached when hushrun recordedNothing
test passed in 12s, but it wasn't recorded: can't read the files again (…)hushrun couldn't read the files after the run, to check they hadn't changedRun it again
the skip wasn't recorded: this machine isn't registered: run `hushrun login` The skip worked, and the next run skips too. Only the time it saved wasn't countedRun hushrun login on this machine

hushrun ready

hushrun ready prints a summary, one line per check, and the commands to run:

$ npx hushrun ready
a0b1c2d isn't ready: CI would run 2 checks again.
  missing test   no pass yet for this exact code
  missing lint   it failed on this exact code last time
  passed  types
Run these here, then push:
  npm run test
  npm run lint

It exits 0 when no check is missing, and 10 otherwise. hushrun ready has its flags, --strict included.

The summary

LineWhat it meansWhat to do
a0b1c2d is ready to push.No check is missingPush
a0b1c2d isn't ready: CI would run 2 checks again.Some checks haven't passed on this code, and a command here can pass themRun the commands under Run these here, then push:, each on its own
a0b1c2d isn't ready: 1 check left, and nothing here changes that.With --strict: only ci checks are leftLeave them to CI, or run them on a machine that can
hushrun knows no checks for a0b1c2d: hushrun.yaml's stages, package.json's `hushrun run` scripts and CI's files name them.Nothing in this repository goes through hushrunRun npx hushrun init
These run on the files as they are now, and those aren't a0b1c2d: commit or stash what's different first.The commands would run on your edits, not on the commitCommit or stash, then run them
CI runs bun test itself in .github/workflows/ci.yml (job test), so it won't skip there: run npx hushrun init to put it through hushrun.CI runs the command outside hushrun, so a pass here can't skip itDo what the line says
hushrun.yaml has a rule for go-tset, and nothing runs itA counts_from rule names a check that nothing runs, probably a typoFix the name in hushrun.yaml

Each check

LineWhat it meansWhat to do
passed test recorded by …It passed on this codeNothing
missing test no pass yet for this exact codeNothing is recorded for this codeRun the command ready prints
missing test it failed on this exact code last timeIts newest result is a failureFix the code, then run it
missing test it failed on this exact code last time, and a run here wouldn't count (…): change the code, or pass it on a machine that meets the ruleIt failed, and this machine doesn't meet its counts_from ruleChange the code, or pass it on a machine that meets the rule: see In hushrun ready
ci test it passed in another CI job, and a CI pass counts in its own jobThe pass came from another CI job, so CI runs it again. A run here would only skip, so it can't helpNothing
ci test this repository's CI reuses only CI's results, so a pass here wouldn't change what it runsCI reuses only CI's results is onNothing
ci test a run here didn't count: needs go 1.25, this is go1.24.3A run here under its rule records nothingLeave it to CI: see In hushrun ready
ci test needs linux, this is macosThis machine doesn't meet the rule's os, arch or envLeave it to CI
ci test CI runs it every time: job test of .github/workflows/ci.yml has several variants, which a run's key doesn't tell apart. To skip there too, name each, such as …No pass skips it in that jobGive each variant its own name
ci test it passed here, but the result couldn't be recordedA run here wouldn't change what CI runsRead the run's last line: see Results that aren't recorded
ci test go isn't installed hereThe command can't start hereInstall it, or leave it to CI
ci test results stay on this machine, so CI can't see a pass hereYou aren't signed in, and nothing names a backendRun npx hushrun login
ci test not recorded: this machine isn't registered: run `hushrun login` A pass here wouldn't be recordedRun hushrun login
ci test acme didn't answer for this sign-in; `hushrun whoami` says whyThe backend refused the credentialRun hushrun whoami
ci test can't read earlier results (…)The backend couldn't be reachedNothing
ci test it names no --scope, and hushrun.yaml has severalIts command can't tell which files it coversAdd --scope NAME: see Scopes
ci unit it needs NPM_TOKEN, which stays in CIA stage's check names a secret this machine doesn't haveNothing
ci unit it runs in its pinned image, and there is no Docker or Podman hereA stage's check runs in a containerInstall Docker or Podman, or leave it to CI
ci unit staging takes CI's evidence onlyThe stage is CI-onlyNothing

A ci check doesn't count against the code, so it never refuses a push. hushrun ready --strict counts it.

When a push is refused

The pre-push hook prints these. It runs no checks itself.

LineWhat it meansWhat to do
push refused: CI would run test again on a0b1c2dA check it knows hasn't passed on the code being pushed: one a command here can pass, or one that failed and needs a code change. The lines after it say why, and what to runRun the commands it prints, then push again: see Before you push
To push anyway, git push --no-verify: CI runs them.The hook was installed with --refuse, so it refuses people's pushes tooRun the commands, or push with --no-verify
CI will run test on a0b1c2d. To skip that, run these before you push:A person's push: it goes on, and CI runs the checkRun the commands to save CI the run, or let CI run it
a0b1c2d is ready: CI skips test, lintEvery check that can run here passedNothing
pushing without an answer about the checks: CI runs what has no passNo answer came within 15 seconds, so the push went onNothing
installed the pre-push hook in .git/hooks/pre-push; hushrun hook uninstall takes it outhushrun ready or hushrun run found no hook in this clone, and installed itNothing. hushrun hook uninstall takes it out for good

When the hook refuses what it shouldn't, or misses an agent, see A push was refused.

hushrun init

LineWhat it meansWhat to do
error: hushrun init sets up a git repository: run it inside oneIt ran outside a git repositoryRun it at the repository's root
error: init can't ask without a terminal: run hushrun init --yes to applyA script or an agent ran it, with nobody to answerAdd --yes
error: init can't ask without a terminal: add --yes to move the repositoryThe same, for --org moving the repositoryAdd --yes
error: github.com/acme/shop is for which of your organizations? init can't ask here: add --org <slug>, with one of …You belong to several organizations, and none is named like the repository's ownerAdd --org <slug> with the one it's for
Using acme, the organization named like the repository's owner: --org <slug> picks another of …init picked the organization named like the repository's ownerNothing, or run it again with --org <slug>
error: ana@acme.dev isn't a member of acme: yours are …--org names an organization you aren't inCheck the slug, or ask an admin of it to invite you
error: signed in as ana@acme.dev, but the sign-in wasn't approved for an organization, …You approved the sign-in without picking an organizationCreate or join one in the dashboard, then run init again
Signed in as ana@acme.dev, but this repository records to acme, and ana@acme.dev isn't a member of acme.The repository already records to an organization you aren't inLet init ask its admins to let you in. Once one approves, run init again
ana@acme.dev is invited to acme: accept the invitation …, then run npx hushrun init again.You have an invitation you haven't acceptedAccept it in the dashboard, then run init again
This repository already uses hushrun: its checks share results at https://api.hushrun.com/o/acme.Nothing to set upNothing. init still makes sure the organization has the repository
HUSHRUN_AGENT is set, so init uses no loginAn agent runs here, so init plans as if nobody were signed inRun init where a person can sign in
warning: github.com/acme/shop isn't connected: …The backend refused to connect the repository, or couldn't be reached, so its GitHub Actions can't record yetRead the reason, then run init again
warning: the pre-push hook isn't installed: …init made its other changesRun hushrun hook install
test failed: once it passes, it skips on the same code.The check init ran to show a skip failedFix the code, then run it again
Not running test: vitest isn't installed here.init didn't run that check to show a skip, since its tool is missingNothing. Install the tool when you want the check to run here

init changes files only after you agree, or with --yes, and only the lines it listed. git diff shows them before you commit. hushrun init lists everything it changes.

Markdown