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 withhushrun:. The tables leave that prefix out.hushrun readyprints its report on stdout, andhushrun initits plan.- Errors start with
error:and warnings withwarning:, 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.
-qsilences hushrun's lines.-vadds more of its reasoning.- In the examples,
testis the check's name,acmeyour organization anda0b1c2dthe commit.
When a check runs or skips
The first and last line of each hushrun run.
| Line | What it means | What to do |
|---|---|---|
test running: no pass yet for this exact code | No pass is recorded for what hushrun compares, so the command runs | Nothing. Once it passes, the same code skips |
test passed in 41s; it won't run again on this code | It passed, and the pass was recorded | Nothing |
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 0 | Nothing. 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 recorded | Nothing |
test running: it failed on this exact code last time | The newest result for this code is a failure, so it runs again | Fix 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 kept | Fix the code, not the check |
test running (- | - runs it even after a pass, and records the new result | Nothing |
test stopped by a signal; nothing recorded | It was interrupted, for example with Ctrl-C | Run it again |
test passed in 12s, but files changed while it ran, so it wasn't recorded. | The files changed during the run, so the result belongs to neither version | List what the check writes in .: 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 record | Nothing. 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 - | hushrun. has several scopes, and the command names none | Add - 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 nothing | Run it inside the repository |
test running without skipping: results are off (package. | The backend's URL isn't https://, or http:// on this machine | Fix 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 126 | Run the script through your package manager, such as npm test, or give the command's path |
In CI
| Line | What it means | What to do |
|---|---|---|
test running: this exact code passed in another CI job, and a CI pass counts in its own job | The pass came from a job with another name, or on another system | Nothing. See Jobs and variants |
test running: job test of . | The job has a matrix, so one pass can't speak for every variant. The check runs every time | Give 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 it | On GitLab, the job uses parallel or a matrix | Give each variant its own name |
test running: …, so hushrun can't tell its variants, and no pass skips it | hushrun can't read the job, as in a reusable workflow, so it runs every time | See Jobs and variants |
test passed in 41s | In a job that no pass skips, it passed and was recorded | Nothing |
test skipped: this exact code passed in CI 3 min ago (saves 41s); skipped only on CI's passes | The repository has CI reuses only CI's results turned on | Nothing. See CI reuses only CI's results |
test running: no CI pass yet for this exact code; skipped only on CI's passes | The same setting, with no pass from CI on this code | Nothing |
Where a check counts
These come from a counts_from rule in hushrun.yaml.
| Line | What it means | What to do |
|---|---|---|
test running: this run won't count: needs go 1. | This machine doesn't meet the check's rule. hushrun says so before the command starts | Let it run. The line after it decides |
test passed in 6s; it won't count: needs go 1. | It ran and kept its exit code, but recorded nothing. hushrun ready lists it as ci | Leave it to CI or a machine that meets the rule. Don't edit counts_ to get past it. See Where a check counts |
test passed in 6s on linux, go1. | The machine met the rule, and the pass was recorded | Nothing |
Variables
| Line | What it means | What to do |
|---|---|---|
HUSHRUN_ | hushrun can't read the variable, and goes on as if it weren't set | Fix the value or remove the variable: see Environment variables |
HUSHRUN_ | The label isn't in the form hushrun takes | Set 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.
| Line | What it means | What to do |
|---|---|---|
sign in to share results with acme: npx hushrun login | Nobody signed in on this machine. hushrun says this at a terminal only | Run npx hushrun login once |
results aren't shared with acme: … | No credential reached the backend: no sign-in, no HUSHRUN_, no HUSHRUN_, and in GitHub Actions no id-. The rest is the backend's reason | In a sandbox, set HUSHRUN_. In GitHub Actions, add id-. In other CI, set HUSHRUN_ and HUSHRUN_. See Which credential goes where |
results aren't shared with acme: no token: …, with HUSHRUN_ set | This hushrun is older than 0.6.0, and ignores HUSHRUN_ | Move 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 organization | Run hushrun login again |
test running: acme refused HUSHRUN_ | The sandbox's token expired. … was revoked on … means someone revoked it | Create a token under the same agent name, and update the variable: see Agents in sandboxes |
test running: acme refused HUSHRUN_ | The agent token in HUSHRUN_ expired or was revoked | Create a new token, and update the secret |
test running: acme refused this job's ID token: … | The backend doesn't accept this repository's CI | Check that the repository is connected to the organization, and wasn't deleted and created again under the same name: see Set up CI |
HUSHRUN_ | The repository names a backend this token may not go to | In a sandbox, use HUSHRUN_. Elsewhere, set HUSHRUN_ to the backend's URL: see Which credential goes where |
HUSHRUN_ | The string was cut short or wrapped. hushrun shows none of it, since it holds a key | Copy it again, on one line |
HUSHRUN_ | A newer hushrun made the string | Update hushrun in the repository |
HUSHRUN_ | It holds hushrun token create's stdout, which is the token alone | Set the whole string, from a terminal or - |
HUSHRUN_ | The string is in the wrong variable | Set it as HUSHRUN_, and unset the variable the line names |
HUSHRUN_ | Other credentials are set beside the string, and hushrun ignores them | Remove the variables it names |
error: not signed in: …, with a link to your machines page | You have 20 machines in that organization, the most it takes | Revoke one at https://, then run hushrun login again |
error: not signed in: … To make this machine a new key, remove …, then run `hushrun login` again | You or an admin revoked this machine, and a revoked machine doesn't come back | Remove 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.
| Line | What it means | What to do |
|---|---|---|
test passed in 41s; not recorded: …; upgrade: https:// | Your 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, below | An 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:// | The same, for a check that failed. Its exit code is kept | The same |
acme used the 2,000 recorded checks its Free plan includes this month, so checks run instead of skipping until 2026- | The server's reason on Free and Pro | The same |
acme reached its spend cap for this period (10,000 recorded checks, $50 of overage), so checks run instead of skipping until 2026- | The server's reason on Team and Growth, past the spend cap | Raise 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:// | A pipeline command, hushrun run - or hushrun attest -, says this once per command, with the server's reason. On GitHub Actions it's a warning annotation titled hushrun: check results not recorded instead | The same as above |
pass unit (exit 0; not recorded), from hushrun run - | That check's result wasn't recorded for the plan. run - still exits 0 when its checks passed and 8 when one failed | The same |
not recorded check: unit, from hushrun attest | The check event wasn't recorded for the plan. attest still exits 0 | The 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 unused | Run hushrun login on this machine |
test passed in 41s; not recorded: set `HUSHRUN_ | An agent token is in HUSHRUN_, without the key it came with | In a sandbox, use HUSHRUN_. In CI, set the key: see Which credential goes where |
test passed in 41s; not recorded: HUSHRUN_ | The key inside the string doesn't belong to its token. No variable replaces it | Make a new string with hushrun token create - |
test passed in 41s; not recorded: agent token hra_ | The token belongs to another repository | Use that repository's token, or one made with - |
test passed in 41s; not recorded: agent token hra_ | The fleet records faster than its token allows | Slow it down, or create the token with a higher - |
test passed in 41s; not recorded | The backend refused the credential. A line about sharing says why | See Signing in and sharing results |
test passed in 41s, but it couldn't be recorded (…) | The backend couldn't be reached when hushrun recorded | Nothing |
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 changed | Run 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 counted | Run 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
| Line | What it means | What to do |
|---|---|---|
a0b1c2d is ready to push. | No check is missing | Push |
a0b1c2d isn't ready: CI would run 2 checks again. | Some checks haven't passed on this code, and a command here can pass them | Run 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 -: only ci checks are left | Leave them to CI, or run them on a machine that can |
hushrun knows no checks for a0b1c2d: hushrun. | Nothing in this repository goes through hushrun | Run 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 commit | Commit or stash, then run them |
CI runs bun test itself in . | CI runs the command outside hushrun, so a pass here can't skip it | Do what the line says |
hushrun. | A counts_ rule names a check that nothing runs, probably a typo | Fix the name in hushrun. |
Each check
| Line | What it means | What to do |
|---|---|---|
passed test recorded by … | It passed on this code | Nothing |
missing test no pass yet for this exact code | Nothing is recorded for this code | Run the command ready prints |
missing test it failed on this exact code last time | Its newest result is a failure | Fix 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 rule | It failed, and this machine doesn't meet its counts_ rule | Change 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 job | The pass came from another CI job, so CI runs it again. A run here would only skip, so it can't help | Nothing |
ci test this repository's CI reuses only CI's results, so a pass here wouldn't change what it runs | CI reuses only CI's results is on | Nothing |
ci test a run here didn't count: needs go 1. | A run here under its rule records nothing | Leave it to CI: see In hushrun ready |
ci test needs linux, this is macos | This machine doesn't meet the rule's os, arch or env | Leave it to CI |
ci test CI runs it every time: job test of . | No pass skips it in that job | Give each variant its own name |
ci test it passed here, but the result couldn't be recorded | A run here wouldn't change what CI runs | Read the run's last line: see Results that aren't recorded |
ci test go isn't installed here | The command can't start here | Install it, or leave it to CI |
ci test results stay on this machine, so CI can't see a pass here | You aren't signed in, and nothing names a backend | Run npx hushrun login |
ci test not recorded: this machine isn't registered: run `hushrun login` | A pass here wouldn't be recorded | Run hushrun login |
ci test acme didn't answer for this sign- | The backend refused the credential | Run hushrun whoami |
ci test can't read earlier results (…) | The backend couldn't be reached | Nothing |
ci test it names no - | Its command can't tell which files it covers | Add -: see Scopes |
ci unit it needs NPM_ | A stage's check names a secret this machine doesn't have | Nothing |
ci unit it runs in its pinned image, and there is no Docker or Podman here | A stage's check runs in a container | Install Docker or Podman, or leave it to CI |
ci unit staging takes CI's evidence only | The stage is CI-only | Nothing |
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.
| Line | What it means | What to do |
|---|---|---|
push refused: CI would run test again on a0b1c2d | A 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 run | Run the commands it prints, then push again: see Before you push |
To push anyway, git push - | The hook was installed with -, so it refuses people's pushes too | Run the commands, or push with - |
CI will run test on a0b1c2d. | A person's push: it goes on, and CI runs the check | Run the commands to save CI the run, or let CI run it |
a0b1c2d is ready: CI skips test, lint | Every check that can run here passed | Nothing |
pushing without an answer about the checks: CI runs what has no pass | No answer came within 15 seconds, so the push went on | Nothing |
installed the pre- | hushrun ready or hushrun run found no hook in this clone, and installed it | Nothing. 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
| Line | What it means | What to do |
|---|---|---|
error: hushrun init sets up a git repository: run it inside one | It ran outside a git repository | Run it at the repository's root |
error: init can't ask without a terminal: run hushrun init - | A script or an agent ran it, with nobody to answer | Add - |
error: init can't ask without a terminal: add - | The same, for - moving the repository | Add - |
error: github. | You belong to several organizations, and none is named like the repository's owner | Add - with the one it's for |
Using acme, the organization named like the repository's owner: - | init picked the organization named like the repository's owner | Nothing, or run it again with - |
error: ana@acme. | - names an organization you aren't in | Check the slug, or ask an admin of it to invite you |
error: signed in as ana@acme. | You approved the sign-in without picking an organization | Create or join one in the dashboard, then run init again |
Signed in as ana@acme. | The repository already records to an organization you aren't in | Let init ask its admins to let you in. Once one approves, run init again |
ana@acme. | You have an invitation you haven't accepted | Accept it in the dashboard, then run init again |
This repository already uses hushrun: its checks share results at https:// | Nothing to set up | Nothing. init still makes sure the organization has the repository |
HUSHRUN_ | An agent runs here, so init plans as if nobody were signed in | Run init where a person can sign in |
warning: github. | The backend refused to connect the repository, or couldn't be reached, so its GitHub Actions can't record yet | Read the reason, then run init again |
warning: the pre- | init made its other changes | Run hushrun hook install |
test failed: once it passes, it skips on the same code. | The check init ran to show a skip failed | Fix 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 missing | Nothing. 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.