conductor

sign in

test

statefailed
jobback to job
imagenode:24-bookworm-slim
arch-
attempt1 of 1
workerconductor-worker-aarch64
duration13s

task exited 1

log

[conductor] task test on conductor-worker-aarch64
[conductor] commit cd45170b118b attempt 1
[conductor] image node:24-bookworm-slim
$ npm install --no-audit --no-fund

added 78 packages in 3s
npm notice
npm notice New major version of npm available! 11.19.0 -> 12.0.2
npm notice Changelog: https://github.com/npm/cli/releases/tag/v12.0.2
npm notice To update run: npm install -g npm@12.0.2
npm notice
$ npm test

> conductor@0.4.1 test
> node --test "test/**/*.test.js"

✔ every tracked text file is pure ASCII (172.39047ms)
✔ no file uses CRLF line endings or trailing whitespace (107.96521ms)
✔ a password round trips and a wrong one is refused (24.56208ms)
✔ the same password hashes differently each time (11.52344ms)
✔ parameters are read back from the stored hash (11.72271ms)
✔ a malformed stored hash is refused rather than throwing (0.5834ms)
✔ password length is bounded (0.51326ms)
✔ a session token round trips its claims (2.22289ms)
✔ a token signed with another secret is refused (0.35563ms)
✔ a tampered payload is refused (0.30439ms)
✔ an expired token is refused (0.35495ms)
✔ a malformed token is refused rather than throwing (0.31002ms)
✔ cookies are parsed and issued (1.45167ms)
✔ the oidc login state round trips with its return path (0.65317ms)
✔ a missing return path means the root (0.22783ms)
✔ the oidc login state is refused when forged, stale or off-site (0.32752ms)
✔ oidc roles are collected from the usual claim shapes (0.48823ms)
✔ mask replaces secrets, longest first (0.25734ms)
✔ mask ignores very short values and leaves clean output alone (0.19018ms)
✖ health reports the selected drivers (31.01832ms)
✖ a signed trigger creates a job and expands the pipeline (7.58501ms)
✖ an unsigned or wrongly signed trigger is refused (7.5284ms)
✖ github and gitlab push payloads are understood (7.6391ms)
✖ a branch deletion is ignored rather than failing (8.65468ms)
✖ a broken pipeline is reported as a client error with detail (3.01608ms)
✖ a missing pipeline file is reported clearly (3.42202ms)
✖ a pipeline may be spelled .conductor.yaml instead of .conductor.yml (3.48337ms)
✖ a project pointed at a specific file gets no fallback (4.23028ms)
✖ a repository carrying both spellings is refused rather than guessed at (3.23964ms)
✖ a pipeline still using the jobs key is told what it was renamed to (3.09518ms)
✖ a job can be created directly, without a push payload to imitate (2.98678ms)
✖ creating a job requires the same signature as a trigger (2.85942ms)
✖ creating a job insists on a real commit rather than inferring one (3.15217ms)
✖ a job can be read back, with the state of every task (6.20802ms)
✖ a public job is readable without any credential at all (12.98848ms)
✖ a private job needs the trigger secret, and is otherwise absent (16.85433ms)
✖ a job of another project cannot be read through this one (11.73923ms)
✖ a task can be read back on its own, and by its full name (15.50671ms)
✖ reading a task back carries its dependencies and matrix (5.20764ms)
✖ reading a task back never exposes its environment, services or script (4.28865ms)
✖ a task lists the artifacts it stored, with a usable download url (5.43848ms)
✖ reading a task back needs no worker token (3.56548ms)
✖ a private task is absent without a credential, and needs its project named (2.91768ms)
✖ a private task is readable by an administrator, by either path (2.96507ms)
✖ a task of another project cannot be read through this one (2.87089ms)
✖ an unknown task is 404 by either path (3.16012ms)
✖ the worker api rejects missing and invalid tokens (3.27377ms)
✖ independent tasks dispatch concurrently (6.50212ms)
✖ a task is only offered to a worker that satisfies its requires (2.9262ms)
✖ a worker is not offered work for an architecture it cannot build (3.50589ms)
✖ a claimed task carries everything the worker needs (5.36685ms)
✖ a task that requires a feature reports it to the worker (5.87227ms)
✖ the standard conductor variables are present in the task environment (3.20187ms)
✖ the source tarball is served from the mirror (3.34612ms)
✖ a worker cannot touch a task it does not hold (6.28037ms)
✖ log appends are resumable and deduplicated by offset (4.68923ms)
✖ an oversized log chunk is refused (9.06381ms)
✖ a finished log moves to storage and is still readable (11.48873ms)
✖ artifacts are stored, hashed, and stripped of traversal (11.10953ms)
✖ an artifact shorter than its content-length is rejected (6.8047ms)
✖ success releases dependents, matched on shared dimensions (3.11703ms)
✖ failure skips transitive dependents, not just direct ones (4.25134ms)
✖ a job settles as failed once every task is terminal (5.66108ms)
✖ a job settles as success when everything passes (6.07988ms)
✖ an allowed failure does not fail the job or block dependents (6.93016ms)
✖ a task with retries left is requeued instead of failing the job (11.04704ms)
✖ heartbeats keep a task alive and report cancellation (7.09902ms)
✖ the reaper fails a task whose worker stopped reporting (4.48514ms)
✖ a second push produces an independent, numbered job (3.76357ms)
﹣ jobs can be listed and filtered by project (0.53176ms) # the JSON API was removed
﹣ unknown jobs, tasks and artifacts return 404 (0.09478ms) # the JSON API was removed
✖ a disabled project refuses triggers (3.04781ms)
✖ a trigger for an unknown project is a 404 (3.06423ms)
✖ a commit that is not in the repository is refused (2.78133ms)
✖ a task is told to fetch an archive, and never the repository itself (3.09051ms)
✖ the source archive is the bare tree, with no wrapping directory (3.7095ms)
✖ the working directory is resolved from the pipeline, then the project (8.13931ms)
✖ an unusable working directory is refused rather than sanitised (12.58216ms)
✖ the trigger secret is not stored in the clear (4.40272ms)
✖ worker tokens are stored only as hashes (3.27625ms)
✔ defaults select sqlite, local storage and local auth (3.04102ms)
✔ configuring an s3 bucket switches the storage driver (1.26833ms)
✔ a partial s3 configuration is rejected rather than half applied (0.8806ms)
✔ configuring an oidc discovery url switches the auth mode (0.57989ms)
✔ an oidc discovery url without a client id is rejected (0.54069ms)
✔ a database url selects its dialect (0.95881ms)
✔ an unsupported database scheme is reported clearly (0.71328ms)
✔ a sqlite url collapses into database.path (0.58608ms)
✔ environment variables override the config file (18.73516ms)
✔ relative paths resolve against the config file directory (4.47766ms)
✔ a missing explicit config file is an error, a missing default is not (1.44984ms)
✔ a heartbeat timeout below the reap interval is rejected (5.88831ms)
✔ a non-integer port is rejected with the variable named (0.87354ms)
✔ parseKey accepts hex and base64, and rejects the wrong length (0.42618ms)
✔ stateDirs omits the storage directory when s3 is in use (1.34441ms)
✔ the loaded config is frozen (0.55116ms)
✔ topological order places dependencies first (1.65949ms)
✔ topological order is deterministic (2.34279ms)
✔ a cycle is detected and named (0.7186ms)
✔ depth reflects the longest path, not insertion order (0.33721ms)
✔ independent tasks are runnable at the same time (0.78546ms)
✔ a task becomes runnable only once every dependency succeeds (0.63255ms)
✔ a running dependency does not release its dependents (0.29131ms)
✔ failure skips transitive dependents, not just direct ones (0.30709ms)
✔ a skipped dependency never releases a dependent (0.32599ms)
✔ allowed failures can satisfy a dependency when asked to (0.34703ms)
✔ transitive dependents of a leaf is empty (0.20943ms)
✔ graph helpers tolerate dependencies outside the set (0.24755ms)
✔ dialect detection covers every supported scheme (1.61951ms)
✔ statement splitter respects literals and comments (1.10525ms)
✔ statement splitter keeps postgres dollar quoted bodies whole (0.28416ms)
✔ migrations apply once and are idempotent (61.49024ms)
✔ an edited migration is refused rather than silently diverging (20.60122ms)
✔ a migration removed from disk is reported (21.45747ms)
✔ rows come back as ordinary objects (19.51387ms)
✔ a conditional update claims exactly once (15.54272ms)
✔ deleting a job cascades to its tasks (12.7593ms)
✔ a failed transaction rolls back, and a failed savepoint keeps the outer work (19.12797ms)
﹣ migrations apply and retention sweeps on postgres (0.96731ms) # SKIP
﹣ migrations apply and retention sweeps on mysql (0.16435ms) # SKIP
✔ every example pipeline compiles (94.69217ms)
✔ the distribution example fans in per architecture (25.36718ms)
✔ the node example wires services and features (13.3194ms)
✔ git jobs with safe.directory set (1.19696ms)
✔ it appends to configuration already in the environment (0.23744ms)
✔ a count that is not a number does not corrupt the sequence (0.72603ms)
✖ git accepts the environment we build (21.47163ms)
✖ a file missing from a commit reads as missing, whatever sits in the working directory (6.35797ms)
﹣ the endpoints and key set come from the discovery document (1.71342ms) # docker is not available
✔ discovery reports a document that is missing an endpoint (29.9638ms)
✔ discovery reports an unreachable provider and a bad status (1.26864ms)
﹣ a token carrying the admin role authenticates as an administrator (0.29048ms) # the JSON API was removed
﹣ a token without the admin role is an ordinary user (0.32133ms) # the JSON API was removed
﹣ roles are recognised in the groups and resource_access shapes (0.1794ms) # the JSON API was removed
﹣ an OIDC user gets a local account and can own a project (0.2084ms) # the JSON API was removed
﹣ the same subject keeps one account even when the display name changes (0.22594ms) # the JSON API was removed
﹣ a display name colliding with a local account gets its own username (0.34222ms) # the JSON API was removed
﹣ a role revoked at the provider is lost on the next request (1.61076ms) # the JSON API was removed
﹣ an account disabled locally is refused despite a valid token (0.20844ms) # the JSON API was removed
﹣ a forged signature is refused (3.93199ms) # the JSON API was removed
﹣ an expired token is refused (0.20203ms) # the JSON API was removed
﹣ a token from a different issuer is refused (0.1478ms) # the JSON API was removed
﹣ an anonymous visitor asking for a protected page is sent to the provider (0.16505ms) # docker is not available
﹣ a browser signs in at the provider and comes back with a session (0.20279ms) # docker is not available
﹣ a callback with a forged state is refused (0.12126ms) # docker is not available
﹣ local passwords are refused while OIDC is in charge (0.13251ms) # the JSON API was removed
﹣ an OIDC administrator can drive the interface (0.12282ms) # docker is not available
﹣ worker ownership follows the OIDC identity (0.15764ms) # the JSON API was removed
✔ a pattern without a star matches exactly (8.19274ms)
✔ a star matches any job of characters (2.37712ms)
✔ the rest of a pattern is literal, not a regular expression (2.28794ms)
✔ a restricted task is left out of jobs for other refs (102.51177ms)
✔ it is left out rather than recorded as skipped (11.30702ms)
✔ tasks depending on an excluded task are excluded too (25.20532ms)
✔ depth and ordering describe the job that will happen (11.44557ms)
✔ without a ref nothing is filtered, so a pipeline can still be validated (11.00666ms)
✔ a restricted task cannot match a job that has no ref (21.65257ms)
✔ a malformed rule is reported rather than ignored (25.43439ms)
✔ the rule is not inherited from defaults (7.40099ms)
✔ a minimal pipeline compiles (15.03846ms)
✔ version is required and pinned (2.95659ms)
✔ empty and malformed documents are rejected clearly (2.69179ms)
✔ image and script are required (0.81026ms)
✔ image may come from defaults (1.25657ms)
✔ unknown keys are rejected, with a suggestion when close (2.55846ms)
✔ all problems are reported at once (0.92172ms)
✔ durations accept seconds, units and composites (2.12405ms)
✔ durations accept day and week units (1.3633ms)
✔ a malformed duration is rejected (0.88917ms)
✔ arch expands into one task per architecture (1.10378ms)
✔ a matrix expands to the cartesian product (1.59012ms)
✔ needs match on shared dimensions rather than fanning out (6.07588ms)
✔ a task without the shared dimension depends on every instance (1.85962ms)
✔ match all opts out of dimension matching (2.3551ms)
✔ needs may name one concrete instance (1.03153ms)
✔ an unsatisfiable dimension match is reported, not silently dropped (0.79232ms)
✔ needs on an unknown task lists what is defined (0.65494ms)
✔ self dependency is rejected (0.5196ms)
✔ a dependency cycle names the cycle (1.04802ms)
✔ interpolation substitutes arch and matrix values (0.93809ms)
✔ interpolating an undefined dimension is an error (0.71765ms)
✔ referring to arch without declaring one is an error (1.38468ms)
✔ matrix values must be safe for use in a task name (0.77739ms)
✔ arch may not also be a matrix dimension (0.65725ms)
✔ services get a derived alias and reject duplicates (1.50921ms)
✔ artifacts accept a bare list and reject absolute paths (0.88335ms)
✔ artifact when is constrained (0.51569ms)
✔ defaults are inherited and overridden per task (0.83053ms)
✔ env values must be scalars with valid names (4.29883ms)
✔ parsePipeline normalizes without expanding (0.54389ms)
✔ a realistic distribution pipeline produces the expected graph (1.57514ms)
✔ compiles markers to the placeholder each dialect expects (4.24747ms)
✔ numbers postgres placeholders per occurrence, including repeats (0.25438ms)
✔ ignores markers inside string literals and comments (0.2915ms)
✔ a json literal in default text survives untouched (0.19901ms)
✔ doubling a brace escapes it (0.22217ms)
✔ block comments are skipped, and nest only for postgres (0.2011ms)
✔ postgres dollar quoted bodies are skipped (3.62886ms)
✔ mysql backtick identifiers and hash comments are skipped (0.26529ms)
✔ a malformed marker is rejected with a useful message (1.29077ms)
✔ binds by name, resolving dotted paths (1.24297ms)
✔ an exact key beats path traversal (0.49181ms)
✔ reports every missing key at once (0.31444ms)
✔ rejects an array of parameters, which would silently bind by position (0.25474ms)
✔ normalizes booleans, dates and null (0.25281ms)
✔ rejects an object value, which is nearly always a forgotten stringify (0.22926ms)
✖ an artifact past its own deadline is deleted (27.78458ms)
✖ an explicit deadline overrides the policy in both directions (26.56527ms)
✖ an explicit deadline also beats the last good job (13.24646ms)
✖ the last few jobs keep their artifacts however old they are (5.21556ms)
✖ recent artifacts are kept however many jobs have followed (8.02974ms)
✖ an artifact outside both rules is deleted (40.66925ms)
✖ the most recent successful job is kept whatever the policy says (32.55348ms)
✖ only the latest success is protected, not every success (25.10492ms)
✖ a project may keep artifacts forever despite a server default (8.06432ms)
✖ a project setting overrides the server default (11.70019ms)
✖ an unfinished job is never swept (4.15686ms)
✖ logs older than the limit are removed but the task remains (3.51763ms)
✖ a swept log is distinguishable from one that never existed (4.07599ms)
✖ a log is swept only once (3.96587ms)
✖ zero keeps logs forever (4.56214ms)
✖ a storage failure leaves the row for the next pass (9.12099ms)
✖ a sweep deletes no more than its batch (11.20897ms)
✖ one project policy does not reach into another (4.29086ms)
✖ artifacts.expire in a pipeline reaches the stored artifact (3.25773ms)
﹣ the api reports and accepts project retention (0.58155ms) # the JSON API was removed
✔ seals and opens a value (3.27936ms)
✔ sealing twice produces different ciphertext (0.91716ms)
✔ without a key, values are stored as marked plaintext (0.31912ms)
✔ a keyed box can still read values written before a key existed (0.27163ms)
✔ an unkeyed box refuses encrypted values with an actionable message (2.16894ms)
✔ the wrong key fails to open (0.58624ms)
✔ tampering with the ciphertext is detected (0.55028ms)
✔ associated data binds a secret to its location (0.96192ms)
✔ a key of the wrong size is refused at construction (0.6519ms)
✔ task ids are opaque, and say nothing about their job (3.25484ms)
✔ time ordered ids sort by creation time (0.28865ms)
✔ random ids use the expected alphabet (0.23543ms)
✔ slugify produces readable project ids and falls back when empty (0.38329ms)
✔ token hashing and constant time comparison (0.82343ms)
✔ the pipeline this project jobs on itself compiles (23.79669ms)
✔ its tasks declare the features they actually need (10.09546ms)
✔ publishing is restricted to main and release tags (30.32249ms)
✔ get-vanilla matches the reference signature (3.48794ms)
✔ get-vanilla-query-order-key-case matches the reference signature (1.99189ms)
✔ uriEncode percent encodes the characters encodeURIComponent leaves alone (0.37839ms)
✔ amzDate produces both required formats (0.31197ms)
✔ s3 requests carry the content hash header (0.79243ms)
✔ presigned urls carry the signature in the query string (2.30109ms)
✔ an already encoded path is not encoded a second time (1.04585ms)
✔ key validation rejects traversal and absolute paths (10.93166ms)
✔ sanitizeRelativePath strips traversal from worker supplied paths (1.88755ms)
✔ key layout is stable (2.59085ms)
✔ local backend round trips a buffer and reports its digest (37.06116ms)
✔ local backend serves ranges (19.40431ms)
✔ local backend accepts a stream (36.81602ms)
✔ local backend reports a missing object and deletes idempotently (3.00358ms)
✔ local backend has no presigned urls (8.22992ms)
✔ a partial write leaves no object behind (18.05795ms)
✔ part size grows so that a huge object still fits in 10000 parts (1.91655ms)
✔ inParts regroups an awkwardly chunked stream into fixed parts (9.07492ms)
✔ inParts handles a chunk far larger than the part size (3.68478ms)
✔ inParts yields nothing for an empty stream (2.68494ms)
﹣ s3 backend round trips awkward keys against a real server (0.53631ms) # docker is not available
﹣ s3 serves byte ranges (0.44015ms) # docker is not available
﹣ s3 accepts a stream when the size is known (0.44508ms) # docker is not available
﹣ a presigned url is usable without credentials (0.57812ms) # docker is not available
﹣ a tampered presigned url is rejected by the server (0.42398ms) # docker is not available
﹣ s3 reports a missing object and deletes idempotently (0.39269ms) # docker is not available
﹣ a stream of unknown length is accepted (0.40515ms) # docker is not available
﹣ a body past the single request threshold is uploaded in parts (0.41052ms) # docker is not available
﹣ a large body really is sent as several parts, and a small one is not (0.41204ms) # docker is not available
﹣ a multipart object still serves ranges (0.42189ms) # docker is not available
﹣ a body that does not match its declared size is rejected (0.40545ms) # docker is not available
﹣ a failed multipart upload does not leave parts behind (0.40358ms) # docker is not available
﹣ bad credentials fail loudly rather than silently storing nothing (0.40275ms) # docker is not available
✔ every javascript file parses (810.68818ms)
✔ the shell scripts parse (6.37773ms)
✔ interpolated values are escaped by default (1.88723ms)
✔ quotes and ampersands are escaped inside attributes (0.30932ms)
✔ nested templates and arrays are kept, raw is passed through (0.30029ms)
✔ null, undefined and false render as nothing (0.1915ms)
✔ attrs omits absent values and renders bare booleans (0.34551ms)
✖ an anonymous visitor sees public jobs and an invitation to sign in (21.47959ms)
✖ an anonymous visitor cannot see a private job (4.79786ms)
✖ management pages redirect an anonymous visitor to sign in (3.48242ms)
✖ signing in through the form sets a session and reveals the nav (3.38777ms)
✖ a user creates a project through the form and is shown the secret once (3.67184ms)
✖ a project page shows variables and never their values (3.17757ms)
✖ setting and removing a variable returns the updated table (3.31353ms)
✖ a user cannot open or delete a project they do not own (3.12265ms)
✖ registering a worker shows the token once and lists it (3.51003ms)
✖ an ordinary user cannot create shared capacity from the form (3.70191ms)
✖ the users page is administrator only and warns about what deletion destroys (5.17272ms)
✖ a running job polls, and a finished one stops (4.44067ms)
✖ a task page streams the log and stops polling once it completes (4.5357ms)
✖ log output is escaped, so a task cannot inject markup into the page (8.36812ms)
✖ a mutation without the htmx header is refused (6.15228ms)
✖ the sign in form is centred rather than stranded at the left edge (7.03832ms)
✖ row actions stay ordinary table cells, so rows keep one height (10.36081ms)
✖ the stylesheet and htmx are served, and nothing else is (3.6238ms)
✖ the project page shows retention, with server defaults as placeholders (3.50822ms)
✖ saving retention through the form stores it, and empty means inherit (9.54479ms)
✖ a negative retention value is refused by the form (4.36535ms)
✖ the project page offers a working directory, defaulting to the server one (6.26216ms)
✖ saving a working directory stores it, and empty clears it (3.40665ms)
✖ an unusable working directory is refused by the form (2.90939ms)
✔ worker config loads from json and reports features (13.71138ms)
✔ worker config reads the token from a file (3.98366ms)
✔ environment overrides the worker config file (10.30613ms)
✔ worker config without a token is rejected (12.98722ms)
✔ a malformed feature is reported with its path (11.29317ms)
✔ shell quoting survives quotes and metacharacters (1.70799ms)
✔ a generated script echoes each command and stops on failure (1.56734ms)
✔ container names are valid for docker and stay unique (4.58119ms)
✔ job arguments carry mounts, env, network and privilege (2.75321ms)
✔ a task container is created without sharing anything with the worker (2.61943ms)
✔ a feature still contributes its bind mounts (1.14065ms)
✔ features resolve into mounts, env and privilege (1.63232ms)
✔ an unknown required feature is reported rather than ignored (0.78622ms)
✔ an artifact pattern reduces to the part that can be copied out (1.64974ms)
✔ overlapping artifact paths are copied out once (1.63499ms)
✔ artifact collection globs, and refuses to leave the workspace (44.37796ms)
✔ artifact when controls collection (0.30852ms)
✔ an idle worker keeps running instead of exiting (4011.01027ms)
✔ a worker stops promptly on a signal rather than after its poll interval (1524.96185ms)
✔ log output is batched and offsets advance (1.62219ms)
✔ a conflicting offset resynchronises instead of duplicating (0.56492ms)
✔ secrets are masked before anything leaves the host (0.77619ms)
✔ a secret split across two writes is still masked (0.43807ms)
✔ a failing conductor does not break the task (0.6931ms)
ℹ tests 331
ℹ suites 0
ℹ pass 191
ℹ fail 104
ℹ cancelled 0
ℹ skipped 36
ℹ todo 0
ℹ duration_ms 6119.00053

✖ failing tests:

test at test/conductor.test.js:80:1
✖ health reports the selected drivers (31.01832ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-zyI5Y7/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-zyI5Y7/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:90:1
✖ a signed trigger creates a job and expands the pipeline (7.58501ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-XRnjyk/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-XRnjyk/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:117:1
✖ an unsigned or wrongly signed trigger is refused (7.5284ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-v39jIq/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-v39jIq/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:132:1
✖ github and gitlab push payloads are understood (7.6391ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-RawqDR/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-RawqDR/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:152:1
✖ a branch deletion is ignored rather than failing (8.65468ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-hlbCWj/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-hlbCWj/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:160:1
✖ a broken pipeline is reported as a client error with detail (3.01608ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-TrPy9n/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-TrPy9n/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:170:1
✖ a missing pipeline file is reported clearly (3.42202ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-jgdl66/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-jgdl66/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:178:1
✖ a pipeline may be spelled .conductor.yaml instead of .conductor.yml (3.48337ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-vRAnaj/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-vRAnaj/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:188:1
✖ a project pointed at a specific file gets no fallback (4.23028ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-PPXAun/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-PPXAun/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:198:1
✖ a repository carrying both spellings is refused rather than guessed at (3.23964ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-Lb32Ed/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-Lb32Ed/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:207:1
✖ a pipeline still using the jobs key is told what it was renamed to (3.09518ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-jIQz6t/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-jIQz6t/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:217:1
✖ a job can be created directly, without a push payload to imitate (2.98678ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-hE6J8Z/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-hE6J8Z/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:235:1
✖ creating a job requires the same signature as a trigger (2.85942ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-prn11A/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-prn11A/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:250:1
✖ creating a job insists on a real commit rather than inferring one (3.15217ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-LR9kaM/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-LR9kaM/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:257:1
✖ a job can be read back, with the state of every task (6.20802ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-ewRo8n/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-ewRo8n/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:278:1
✖ a public job is readable without any credential at all (12.98848ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-dvKFtV/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-dvKFtV/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:288:1
✖ a private job needs the trigger secret, and is otherwise absent (16.85433ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-xwADAn/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-xwADAn/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:308:1
✖ a job of another project cannot be read through this one (11.73923ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-55Zpyo/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-55Zpyo/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:338:1
✖ a task can be read back on its own, and by its full name (15.50671ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-NeNrFI/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-NeNrFI/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:368:1
✖ reading a task back carries its dependencies and matrix (5.20764ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-tXZMJ3/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-tXZMJ3/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:385:1
✖ reading a task back never exposes its environment, services or script (4.28865ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-jwAhoJ/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-jwAhoJ/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:410:1
✖ a task lists the artifacts it stored, with a usable download url (5.43848ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-zhBxab/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-zhBxab/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:439:1
✖ reading a task back needs no worker token (3.56548ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-Fdveg5/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-Fdveg5/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:453:1
✖ a private task is absent without a credential, and needs its project named (2.91768ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-FWkaIp/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-FWkaIp/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:481:1
✖ a private task is readable by an administrator, by either path (2.96507ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-j3fKwn/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-j3fKwn/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:497:1
✖ a task of another project cannot be read through this one (2.87089ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-FYpKAr/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-FYpKAr/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:511:1
✖ an unknown task is 404 by either path (3.16012ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-vigUu6/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-vigUu6/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:521:1
✖ the worker api rejects missing and invalid tokens (3.27377ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-LY8aTQ/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-LY8aTQ/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:533:1
✖ independent tasks dispatch concurrently (6.50212ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-Npu54N/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-Npu54N/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:550:1
✖ a task is only offered to a worker that satisfies its requires (2.9262ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-zmr97a/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-zmr97a/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:569:1
✖ a worker is not offered work for an architecture it cannot build (3.50589ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-12xIJI/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-12xIJI/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:586:1
✖ a claimed task carries everything the worker needs (5.36685ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-h0vYwl/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-h0vYwl/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:614:1
✖ a task that requires a feature reports it to the worker (5.87227ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-hQ6cID/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-hQ6cID/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:626:1
✖ the standard conductor variables are present in the task environment (3.20187ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-pSOAXH/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-pSOAXH/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:645:1
✖ the source tarball is served from the mirror (3.34612ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-vR5YmF/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-vR5YmF/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:663:1
✖ a worker cannot touch a task it does not hold (6.28037ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-fg1p4l/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-fg1p4l/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:679:1
✖ log appends are resumable and deduplicated by offset (4.68923ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-TNqCMn/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-TNqCMn/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:713:1
✖ an oversized log chunk is refused (9.06381ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-fVrA3k/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-fVrA3k/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:732:1
✖ a finished log moves to storage and is still readable (11.48873ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-7TWBlw/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-7TWBlw/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:754:1
✖ artifacts are stored, hashed, and stripped of traversal (11.10953ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-l8uacS/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-l8uacS/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:790:1
✖ an artifact shorter than its content-length is rejected (6.8047ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-hG7IAi/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-hG7IAi/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:810:1
✖ success releases dependents, matched on shared dimensions (3.11703ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-fM2jxf/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-fM2jxf/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:828:1
✖ failure skips transitive dependents, not just direct ones (4.25134ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-lXopud/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-lXopud/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:847:1
✖ a job settles as failed once every task is terminal (5.66108ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-JYWR3d/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-JYWR3d/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:866:1
✖ a job settles as success when everything passes (6.07988ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-n43VBh/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-n43VBh/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:892:1
✖ an allowed failure does not fail the job or block dependents (6.93016ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-py864P/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-py864P/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:920:1
✖ a task with retries left is requeued instead of failing the job (11.04704ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-zvP1ck/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-zvP1ck/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:945:1
✖ heartbeats keep a task alive and report cancellation (7.09902ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-PdIIKn/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-PdIIKn/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:971:1
✖ the reaper fails a task whose worker stopped reporting (4.48514ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-PtyiZW/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-PtyiZW/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:996:1
✖ a second push produces an independent, numbered job (3.76357ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-9v6CLR/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-9v6CLR/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1034:1
✖ a disabled project refuses triggers (3.04781ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-xyhlb8/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-xyhlb8/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1042:1
✖ a trigger for an unknown project is a 404 (3.06423ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-lQTP13/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-lQTP13/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1054:1
✖ a commit that is not in the repository is refused (2.78133ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-lx9PCa/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-lx9PCa/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1062:1
✖ a task is told to fetch an archive, and never the repository itself (3.09051ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-fBJpr5/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-fBJpr5/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1077:1
✖ the source archive is the bare tree, with no wrapping directory (3.7095ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-tRXXKK/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-tRXXKK/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1110:1
✖ the working directory is resolved from the pipeline, then the project (8.13931ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-VhUB8h/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-VhUB8h/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1147:1
✖ an unusable working directory is refused rather than sanitised (12.58216ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-fklOCK/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-fklOCK/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1168:1
✖ the trigger secret is not stored in the clear (4.40272ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-J95WRM/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-J95WRM/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1177:1
✖ worker tokens are stored only as hashes (3.27625ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-D1CKsL/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-D1CKsL/repo',
    stdout: '',
    stderr: ''
  }

test at test/git-env.test.js:55:1
✖ git accepts the environment we build (21.47163ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-gitenv-BYY5lH' ],
    cmd: 'git init -q -b main /tmp/conductor-gitenv-BYY5lH',
    stdout: '',
    stderr: ''
  }

test at test/git-env.test.js:71:1
✖ a file missing from a commit reads as missing, whatever sits in the working directory (6.35797ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-cwd-DBSMPA/work' ],
    cmd: 'git init -q -b main /tmp/conductor-cwd-DBSMPA/work',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:111:1
✖ an artifact past its own deadline is deleted (27.78458ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-Z1Ydzm/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-Z1Ydzm/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:125:1
✖ an explicit deadline overrides the policy in both directions (26.56527ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-TU68Ck/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-TU68Ck/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:142:1
✖ an explicit deadline also beats the last good job (13.24646ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-rbcedy/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-rbcedy/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:153:1
✖ the last few jobs keep their artifacts however old they are (5.21556ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-bASlYn/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-bASlYn/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:166:1
✖ recent artifacts are kept however many jobs have followed (8.02974ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-LPBtVy/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-LPBtVy/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:180:1
✖ an artifact outside both rules is deleted (40.66925ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-pCMnur/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-pCMnur/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:194:1
✖ the most recent successful job is kept whatever the policy says (32.55348ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-nLZJBU/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-nLZJBU/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:208:1
✖ only the latest success is protected, not every success (25.10492ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-Xj4gix/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-Xj4gix/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:220:1
✖ a project may keep artifacts forever despite a server default (8.06432ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-fo0YrO/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-fo0YrO/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:239:1
✖ a project setting overrides the server default (11.70019ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-zlekVC/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-zlekVC/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:253:1
✖ an unfinished job is never swept (4.15686ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-HqyXAA/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-HqyXAA/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:266:1
✖ logs older than the limit are removed but the task remains (3.51763ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-ThFbSY/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-ThFbSY/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:290:1
✖ a swept log is distinguishable from one that never existed (4.07599ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-c0xFSI/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-c0xFSI/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:305:1
✖ a log is swept only once (3.96587ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-TBxEOP/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-TBxEOP/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:317:1
✖ zero keeps logs forever (4.56214ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-90zJtq/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-90zJtq/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:327:1
✖ a storage failure leaves the row for the next pass (9.12099ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-V1aQjT/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-V1aQjT/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:346:1
✖ a sweep deletes no more than its batch (11.20897ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-lyJluv/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-lyJluv/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:361:1
✖ one project policy does not reach into another (4.29086ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-H69HvT/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-H69HvT/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:405:1
✖ artifacts.expire in a pipeline reaches the stored artifact (3.25773ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-HSTDHJ/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-HSTDHJ/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:65:1
✖ an anonymous visitor sees public jobs and an invitation to sign in (21.47959ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-t0MLat/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-t0MLat/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:80:1
✖ an anonymous visitor cannot see a private job (4.79786ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-3UrXpL/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-3UrXpL/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:92:1
✖ management pages redirect an anonymous visitor to sign in (3.48242ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-b7sMhI/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-b7sMhI/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:104:1
✖ signing in through the form sets a session and reveals the nav (3.38777ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-TSjnLn/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-TSjnLn/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:139:1
✖ a user creates a project through the form and is shown the secret once (3.67184ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-baPNbj/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-baPNbj/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:161:1
✖ a project page shows variables and never their values (3.17757ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-xOEm3W/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-xOEm3W/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:173:1
✖ setting and removing a variable returns the updated table (3.31353ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-TzcrPp/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-TzcrPp/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:194:1
✖ a user cannot open or delete a project they do not own (3.12265ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-VNwGVj/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-VNwGVj/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:213:1
✖ registering a worker shows the token once and lists it (3.51003ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-NAQ3s5/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-NAQ3s5/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:233:1
✖ an ordinary user cannot create shared capacity from the form (3.70191ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-rE1erZ/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-rE1erZ/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:251:1
✖ the users page is administrator only and warns about what deletion destroys (5.17272ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-drQD7P/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-drQD7P/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:273:1
✖ a running job polls, and a finished one stops (4.44067ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-LwMF5U/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-LwMF5U/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:288:1
✖ a task page streams the log and stops polling once it completes (4.5357ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-hGvZak/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-hGvZak/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:317:1
✖ log output is escaped, so a task cannot inject markup into the page (8.36812ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-tTX66r/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-tTX66r/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:337:1
✖ a mutation without the htmx header is refused (6.15228ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-R2KTms/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-R2KTms/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:355:1
✖ the sign in form is centred rather than stranded at the left edge (7.03832ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-dvlC2H/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-dvlC2H/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:363:1
✖ row actions stay ordinary table cells, so rows keep one height (10.36081ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-rtr6g6/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-rtr6g6/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:380:1
✖ the stylesheet and htmx are served, and nothing else is (3.6238ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-XaKNZ2/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-XaKNZ2/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:396:1
✖ the project page shows retention, with server defaults as placeholders (3.50822ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-VTB5rV/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-VTB5rV/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:414:1
✖ saving retention through the form stores it, and empty means inherit (9.54479ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-z6p60X/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-z6p60X/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:440:1
✖ a negative retention value is refused by the form (4.36535ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-F5y085/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-F5y085/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:458:1
✖ the project page offers a working directory, defaulting to the server one (6.26216ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-jFXbP1/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-jFXbP1/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:469:1
✖ saving a working directory stores it, and empty clears it (3.40665ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-nqx8a9/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-nqx8a9/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:492:1
✖ an unusable working directory is refused by the form (2.90939ms)
  Error: spawn git ENOENT
      at ChildProcess._handle.onexit (node:internal/child_process:287:19)
      at onErrorNT (node:internal/child_process:525:16)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    errno: -2,
    code: 'ENOENT',
    syscall: 'spawn git',
    path: 'git',
    spawnargs: [ 'init', '-q', '-b', 'main', '/tmp/conductor-it-VJBmET/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-VJBmET/repo',
    stdout: '',
    stderr: ''
  }
[conductor] task exited 1