conductor

sign in

test

statefailed
jobback to job
imagenode:24-bookworm-slim
arch-
attempt1 of 1
workerconductor-worker-x86-64
duration25s

task exited 1

log

[conductor] task test on conductor-worker-x86-64
[conductor] commit 9b1f7f0a6d8e attempt 1
[conductor] image node:24-bookworm-slim
$ npm install --no-audit --no-fund

added 78 packages in 4s
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.2 test
> node --test "test/**/*.test.js"

✔ every tracked text file is pure ASCII (203.774651ms)
✔ no file uses CRLF line endings or trailing whitespace (93.477028ms)
✔ a password round trips and a wrong one is refused (50.598036ms)
✔ the same password hashes differently each time (35.08174ms)
✔ parameters are read back from the stored hash (41.397511ms)
✔ a malformed stored hash is refused rather than throwing (0.709148ms)
✔ password length is bounded (0.794378ms)
✔ a session token round trips its claims (4.937002ms)
✔ a token signed with another secret is refused (0.63999ms)
✔ a tampered payload is refused (0.61286ms)
✔ an expired token is refused (0.721266ms)
✔ a malformed token is refused rather than throwing (0.698787ms)
✔ cookies are parsed and issued (5.780979ms)
✔ the oidc login state round trips with its return path (1.328931ms)
✔ a missing return path means the root (0.420278ms)
✔ the oidc login state is refused when forged, stale or off-site (0.60949ms)
✔ oidc roles are collected from the usual claim shapes (3.911939ms)
✔ mask replaces secrets, longest first (0.377199ms)
✔ mask ignores very short values and leaves clean output alone (0.257764ms)
✖ health reports the selected drivers (25.507755ms)
✖ a signed trigger creates a job and expands the pipeline (6.317484ms)
✖ an unsigned or wrongly signed trigger is refused (5.011658ms)
✖ github and gitlab push payloads are understood (4.741369ms)
✖ a branch deletion is ignored rather than failing (7.339069ms)
✖ a broken pipeline is reported as a client error with detail (6.230601ms)
✖ a missing pipeline file is reported clearly (10.427157ms)
✖ a pipeline may be spelled .conductor.yaml instead of .conductor.yml (11.975545ms)
✖ a project pointed at a specific file gets no fallback (7.06833ms)
✖ a repository carrying both spellings is refused rather than guessed at (10.85648ms)
✖ a pipeline still using the jobs key is told what it was renamed to (5.052854ms)
✖ a job can be created directly, without a push payload to imitate (5.318805ms)
✖ creating a job requires the same signature as a trigger (3.457403ms)
✖ creating a job insists on a real commit rather than inferring one (3.247816ms)
✖ a job can be read back, with the state of every task (3.753902ms)
✖ a public job is readable without any credential at all (3.356982ms)
✖ a private job needs the trigger secret, and is otherwise absent (4.170554ms)
✖ a job of another project cannot be read through this one (4.123087ms)
✖ a task can be read back on its own, and by its full name (6.593308ms)
✖ reading a task back carries its dependencies and matrix (4.032393ms)
✖ reading a task back never exposes its environment, services or script (4.565007ms)
✖ a task lists the artifacts it stored, with a usable download url (8.569004ms)
✖ reading a task back needs no worker token (5.906642ms)
✖ a private task is absent without a credential, and needs its project named (4.272769ms)
✖ a private task is readable by an administrator, by either path (4.668116ms)
✖ a task of another project cannot be read through this one (7.34621ms)
✖ an unknown task is 404 by either path (4.287285ms)
✖ the worker api rejects missing and invalid tokens (3.96822ms)
✖ independent tasks dispatch concurrently (3.514406ms)
✖ a task is only offered to a worker that satisfies its requires (3.851382ms)
✖ a worker is not offered work for an architecture it cannot build (3.937386ms)
✖ a claimed task carries everything the worker needs (3.729434ms)
✖ a task that requires a feature reports it to the worker (4.709528ms)
✖ the standard conductor variables are present in the task environment (3.739084ms)
✖ the source tarball is served from the mirror (4.098952ms)
✖ a worker cannot touch a task it does not hold (3.7629ms)
✖ log appends are resumable and deduplicated by offset (3.919443ms)
✖ an oversized log chunk is refused (3.758752ms)
✖ a finished log moves to storage and is still readable (3.994916ms)
✖ artifacts are stored, hashed, and stripped of traversal (4.338259ms)
✖ an artifact shorter than its content-length is rejected (7.317403ms)
✖ success releases dependents, matched on shared dimensions (3.48869ms)
✖ failure skips transitive dependents, not just direct ones (3.513091ms)
✖ a job settles as failed once every task is terminal (3.379506ms)
✖ a job settles as success when everything passes (2.989942ms)
✖ an allowed failure does not fail the job or block dependents (3.337576ms)
✖ a task with retries left is requeued instead of failing the job (4.010486ms)
✖ heartbeats keep a task alive and report cancellation (3.787599ms)
✖ the reaper fails a task whose worker stopped reporting (4.297014ms)
✖ a second push produces an independent, numbered job (4.690242ms)
﹣ jobs can be listed and filtered by project (0.859576ms) # the JSON API was removed
﹣ unknown jobs, tasks and artifacts return 404 (0.157405ms) # the JSON API was removed
✖ a disabled project refuses triggers (4.340282ms)
✖ a trigger for an unknown project is a 404 (3.673901ms)
✖ a commit that is not in the repository is refused (4.039882ms)
✖ a task is told to fetch an archive, and never the repository itself (3.259299ms)
✖ the source archive is the bare tree, with no wrapping directory (3.847601ms)
✖ the working directory is resolved from the pipeline, then the project (4.403459ms)
✖ an unusable working directory is refused rather than sanitised (3.971169ms)
✖ the trigger secret is not stored in the clear (3.896425ms)
✖ worker tokens are stored only as hashes (3.554877ms)
✔ defaults select sqlite, local storage and local auth (6.520932ms)
✔ configuring an s3 bucket switches the storage driver (1.747955ms)
✔ a partial s3 configuration is rejected rather than half applied (2.316899ms)
✔ configuring an oidc discovery url switches the auth mode (1.209855ms)
✔ an oidc discovery url without a client id is rejected (1.222213ms)
✔ a database url selects its dialect (2.086854ms)
✔ an unsupported database scheme is reported clearly (1.162684ms)
✔ a sqlite url collapses into database.path (1.374739ms)
✔ environment variables override the config file (54.881264ms)
✔ relative paths resolve against the config file directory (6.407204ms)
✔ a missing explicit config file is an error, a missing default is not (2.408278ms)
✔ a heartbeat timeout below the reap interval is rejected (9.060707ms)
✔ a non-integer port is rejected with the variable named (0.973284ms)
✔ parseKey accepts hex and base64, and rejects the wrong length (0.617233ms)
✔ stateDirs omits the storage directory when s3 is in use (1.879344ms)
✔ the loaded config is frozen (0.832713ms)
✔ topological order places dependencies first (3.838535ms)
✔ topological order is deterministic (4.884654ms)
✔ a cycle is detected and named (1.518337ms)
✔ depth reflects the longest path, not insertion order (0.736275ms)
✔ independent tasks are runnable at the same time (0.82319ms)
✔ a task becomes runnable only once every dependency succeeds (0.621283ms)
✔ a running dependency does not release its dependents (1.479211ms)
✔ failure skips transitive dependents, not just direct ones (1.142999ms)
✔ a skipped dependency never releases a dependent (1.565197ms)
✔ allowed failures can satisfy a dependency when asked to (1.387948ms)
✔ transitive dependents of a leaf is empty (0.668429ms)
✔ graph helpers tolerate dependencies outside the set (0.7105ms)
✔ dialect detection covers every supported scheme (3.454361ms)
✔ statement splitter respects literals and comments (1.235395ms)
✔ statement splitter keeps postgres dollar quoted bodies whole (0.555054ms)
✔ migrations apply once and are idempotent (98.368876ms)
✔ an edited migration is refused rather than silently diverging (39.906959ms)
✔ a migration removed from disk is reported (40.538922ms)
✔ rows come back as ordinary objects (44.520901ms)
✔ a conditional update claims exactly once (49.890591ms)
✔ deleting a job cascades to its tasks (44.973375ms)
✔ a failed transaction rolls back, and a failed savepoint keeps the outer work (34.479535ms)
﹣ migrations apply and retention sweeps on postgres (2.113919ms) # SKIP
﹣ migrations apply and retention sweeps on mysql (0.371085ms) # SKIP
✔ every example pipeline compiles (70.15419ms)
✔ the distribution example fans in per architecture (24.816756ms)
✔ the node example wires services and features (11.28225ms)
✔ git jobs with safe.directory set (2.672777ms)
✔ it appends to configuration already in the environment (0.479075ms)
✔ a count that is not a number does not corrupt the sequence (0.862575ms)
✖ git accepts the environment we build (42.75863ms)
✖ a file missing from a commit reads as missing, whatever sits in the working directory (10.593237ms)
﹣ the endpoints and key set come from the discovery document (2.527036ms) # docker is not available
✔ discovery reports a document that is missing an endpoint (45.389189ms)
✔ discovery reports an unreachable provider and a bad status (1.642007ms)
﹣ a token carrying the admin role authenticates as an administrator (0.554531ms) # the JSON API was removed
﹣ a token without the admin role is an ordinary user (0.308118ms) # the JSON API was removed
﹣ roles are recognised in the groups and resource_access shapes (0.322594ms) # the JSON API was removed
﹣ an OIDC user gets a local account and can own a project (1.574639ms) # the JSON API was removed
﹣ the same subject keeps one account even when the display name changes (0.938744ms) # the JSON API was removed
﹣ a display name colliding with a local account gets its own username (0.860409ms) # the JSON API was removed
﹣ a role revoked at the provider is lost on the next request (1.035467ms) # the JSON API was removed
﹣ an account disabled locally is refused despite a valid token (0.232145ms) # the JSON API was removed
﹣ a forged signature is refused (1.072511ms) # the JSON API was removed
﹣ an expired token is refused (0.166314ms) # the JSON API was removed
﹣ a token from a different issuer is refused (0.452506ms) # the JSON API was removed
﹣ an anonymous visitor asking for a protected page is sent to the provider (0.197144ms) # docker is not available
﹣ a browser signs in at the provider and comes back with a session (0.183256ms) # docker is not available
﹣ a callback with a forged state is refused (0.669037ms) # docker is not available
﹣ local passwords are refused while OIDC is in charge (5.110439ms) # the JSON API was removed
﹣ an OIDC administrator can drive the interface (0.140105ms) # docker is not available
﹣ worker ownership follows the OIDC identity (0.133499ms) # the JSON API was removed
✔ a pattern without a star matches exactly (3.128784ms)
✔ a star matches any job of characters (0.894137ms)
✔ the rest of a pattern is literal, not a regular expression (0.420059ms)
✔ a restricted task is left out of jobs for other refs (34.111037ms)
✔ it is left out rather than recorded as skipped (3.723527ms)
✔ tasks depending on an excluded task are excluded too (6.140921ms)
✔ depth and ordering describe the job that will happen (2.809159ms)
✔ without a ref nothing is filtered, so a pipeline can still be validated (4.627129ms)
✔ a restricted task cannot match a job that has no ref (5.148772ms)
✔ a malformed rule is reported rather than ignored (8.246227ms)
✔ the rule is not inherited from defaults (1.923864ms)
✔ a minimal pipeline compiles (25.882952ms)
✔ version is required and pinned (3.580066ms)
✔ empty and malformed documents are rejected clearly (3.8156ms)
✔ image and script are required (1.578745ms)
✔ image may come from defaults (2.40079ms)
✔ unknown keys are rejected, with a suggestion when close (4.422423ms)
✔ all problems are reported at once (1.231216ms)
✔ durations accept seconds, units and composites (3.715433ms)
✔ durations accept day and week units (2.466918ms)
✔ a malformed duration is rejected (2.290131ms)
✔ arch expands into one task per architecture (2.662332ms)
✔ a matrix expands to the cartesian product (2.804203ms)
✔ needs match on shared dimensions rather than fanning out (9.541985ms)
✔ a task without the shared dimension depends on every instance (1.774335ms)
✔ match all opts out of dimension matching (2.788491ms)
✔ needs may name one concrete instance (2.059971ms)
✔ an unsatisfiable dimension match is reported, not silently dropped (1.248459ms)
✔ needs on an unknown task lists what is defined (1.163735ms)
✔ self dependency is rejected (1.150198ms)
✔ a dependency cycle names the cycle (2.323986ms)
✔ interpolation substitutes arch and matrix values (1.967112ms)
✔ interpolating an undefined dimension is an error (1.517605ms)
✔ referring to arch without declaring one is an error (3.193528ms)
✔ matrix values must be safe for use in a task name (0.771839ms)
✔ arch may not also be a matrix dimension (0.699029ms)
✔ services get a derived alias and reject duplicates (4.465068ms)
✔ artifacts accept a bare list and reject absolute paths (1.603255ms)
✔ artifact when is constrained (1.0467ms)
✔ defaults are inherited and overridden per task (1.315839ms)
✔ env values must be scalars with valid names (1.137539ms)
✔ parsePipeline normalizes without expanding (0.918005ms)
✔ a realistic distribution pipeline produces the expected graph (2.335883ms)
✔ compiles markers to the placeholder each dialect expects (9.149655ms)
✔ numbers postgres placeholders per occurrence, including repeats (0.497324ms)
✔ ignores markers inside string literals and comments (0.656856ms)
✔ a json literal in default text survives untouched (0.445122ms)
✔ doubling a brace escapes it (0.475357ms)
✔ block comments are skipped, and nest only for postgres (0.828919ms)
✔ postgres dollar quoted bodies are skipped (0.520606ms)
✔ mysql backtick identifiers and hash comments are skipped (0.996049ms)
✔ a malformed marker is rejected with a useful message (1.678955ms)
✔ binds by name, resolving dotted paths (1.309322ms)
✔ an exact key beats path traversal (0.462097ms)
✔ reports every missing key at once (1.787508ms)
✔ rejects an array of parameters, which would silently bind by position (1.974585ms)
✔ normalizes booleans, dates and null (0.445497ms)
✔ rejects an object value, which is nearly always a forgotten stringify (0.430322ms)
✖ an artifact past its own deadline is deleted (16.734885ms)
✖ an explicit deadline overrides the policy in both directions (6.632735ms)
✖ an explicit deadline also beats the last good job (4.706712ms)
✖ the last few jobs keep their artifacts however old they are (7.281881ms)
✖ recent artifacts are kept however many jobs have followed (4.418517ms)
✖ an artifact outside both rules is deleted (3.98844ms)
✖ the most recent successful job is kept whatever the policy says (3.845996ms)
✖ only the latest success is protected, not every success (3.449377ms)
✖ a project may keep artifacts forever despite a server default (4.50887ms)
✖ a project setting overrides the server default (4.763665ms)
✖ an unfinished job is never swept (4.509773ms)
✖ logs older than the limit are removed but the task remains (5.149884ms)
✖ a swept log is distinguishable from one that never existed (5.236157ms)
✖ a log is swept only once (5.030594ms)
✖ zero keeps logs forever (4.71443ms)
✖ a storage failure leaves the row for the next pass (4.089286ms)
✖ a sweep deletes no more than its batch (5.071773ms)
✖ one project policy does not reach into another (4.974807ms)
✖ artifacts.expire in a pipeline reaches the stored artifact (4.667405ms)
﹣ the api reports and accepts project retention (0.836635ms) # the JSON API was removed
✔ seals and opens a value (5.121725ms)
✔ sealing twice produces different ciphertext (1.04152ms)
✔ without a key, values are stored as marked plaintext (0.523556ms)
✔ a keyed box can still read values written before a key existed (3.661914ms)
✔ an unkeyed box refuses encrypted values with an actionable message (1.852286ms)
✔ the wrong key fails to open (1.03377ms)
✔ tampering with the ciphertext is detected (1.386644ms)
✔ associated data binds a secret to its location (1.712121ms)
✔ a key of the wrong size is refused at construction (1.75246ms)
✔ task ids are opaque, and say nothing about their job (7.641901ms)
✔ time ordered ids sort by creation time (0.486394ms)
✔ random ids use the expected alphabet (0.40075ms)
✔ slugify produces readable project ids and falls back when empty (0.599693ms)
✔ token hashing and constant time comparison (1.872647ms)
✔ the pipeline this project jobs on itself compiles (49.643044ms)
✔ its tasks declare the features they actually need (13.757224ms)
✔ publishing is restricted to main and release tags (44.807747ms)
✔ get-vanilla matches the reference signature (5.427988ms)
✔ get-vanilla-query-order-key-case matches the reference signature (1.629868ms)
✔ uriEncode percent encodes the characters encodeURIComponent leaves alone (0.519002ms)
✔ amzDate produces both required formats (0.477649ms)
✔ s3 requests carry the content hash header (1.307164ms)
✔ presigned urls carry the signature in the query string (3.942949ms)
✔ an already encoded path is not encoded a second time (1.794064ms)
✔ key validation rejects traversal and absolute paths (2.975476ms)
✔ sanitizeRelativePath strips traversal from worker supplied paths (0.456013ms)
✔ key layout is stable (0.48619ms)
✔ local backend round trips a buffer and reports its digest (24.142987ms)
✔ local backend serves ranges (7.997018ms)
✔ local backend accepts a stream (11.365364ms)
✔ local backend reports a missing object and deletes idempotently (5.74189ms)
✔ local backend has no presigned urls (6.360663ms)
✔ a partial write leaves no object behind (7.334569ms)
✔ part size grows so that a huge object still fits in 10000 parts (1.165757ms)
✔ inParts regroups an awkwardly chunked stream into fixed parts (4.004505ms)
✔ inParts handles a chunk far larger than the part size (1.558384ms)
✔ inParts yields nothing for an empty stream (1.114626ms)
﹣ s3 backend round trips awkward keys against a real server (0.190997ms) # docker is not available
﹣ s3 serves byte ranges (0.13321ms) # docker is not available
﹣ s3 accepts a stream when the size is known (0.142422ms) # docker is not available
﹣ a presigned url is usable without credentials (0.948404ms) # docker is not available
﹣ a tampered presigned url is rejected by the server (0.152106ms) # docker is not available
﹣ s3 reports a missing object and deletes idempotently (0.122743ms) # docker is not available
﹣ a stream of unknown length is accepted (0.121159ms) # docker is not available
﹣ a body past the single request threshold is uploaded in parts (0.130045ms) # docker is not available
﹣ a large body really is sent as several parts, and a small one is not (0.128443ms) # docker is not available
﹣ a multipart object still serves ranges (0.126523ms) # docker is not available
﹣ a body that does not match its declared size is rejected (0.117334ms) # docker is not available
﹣ a failed multipart upload does not leave parts behind (0.116653ms) # docker is not available
﹣ bad credentials fail loudly rather than silently storing nothing (0.115857ms) # docker is not available
✔ every javascript file parses (764.812411ms)
✔ the shell scripts parse (2.811962ms)
✔ interpolated values are escaped by default (2.812831ms)
✔ quotes and ampersands are escaped inside attributes (0.581617ms)
✔ nested templates and arrays are kept, raw is passed through (0.43087ms)
✔ null, undefined and false render as nothing (0.270294ms)
✔ attrs omits absent values and renders bare booleans (0.428536ms)
✖ an anonymous visitor sees public jobs and an invitation to sign in (18.861323ms)
✖ an anonymous visitor cannot see a private job (5.801836ms)
✖ management pages redirect an anonymous visitor to sign in (4.256357ms)
✖ signing in through the form sets a session and reveals the nav (4.2278ms)
✖ a user creates a project through the form and is shown the secret once (4.963045ms)
✖ a project page shows variables and never their values (3.455968ms)
✖ setting and removing a variable returns the updated table (4.409906ms)
✖ a user cannot open or delete a project they do not own (4.178736ms)
✖ registering a worker shows the token once and lists it (4.458364ms)
✖ an ordinary user cannot create shared capacity from the form (4.157124ms)
✖ the users page is administrator only and warns about what deletion destroys (3.105305ms)
✖ a running job polls, and a finished one stops (3.226887ms)
✖ a task page streams the log and stops polling once it completes (3.201253ms)
✖ log output is escaped, so a task cannot inject markup into the page (3.19822ms)
✖ a mutation without the htmx header is refused (2.848663ms)
✖ the sign in form is centred rather than stranded at the left edge (3.648995ms)
✖ row actions stay ordinary table cells, so rows keep one height (4.534279ms)
✖ the stylesheet and htmx are served, and nothing else is (3.379804ms)
✖ the project page shows retention, with server defaults as placeholders (6.118193ms)
✖ saving retention through the form stores it, and empty means inherit (4.540179ms)
✖ a negative retention value is refused by the form (4.337949ms)
✖ the project page offers a working directory, defaulting to the server one (4.608488ms)
✖ saving a working directory stores it, and empty clears it (3.798595ms)
✖ an unusable working directory is refused by the form (3.794528ms)
✔ worker config loads from json and reports features (24.559086ms)
✔ worker config reads the token from a file (5.664546ms)
✔ environment overrides the worker config file (3.963801ms)
✔ worker config without a token is rejected (4.083616ms)
✔ a malformed feature is reported with its path (3.202125ms)
✔ shell quoting survives quotes and metacharacters (0.487225ms)
✔ a generated script echoes each command and stops on failure (0.559223ms)
✔ container names are valid for docker and stay unique (1.458128ms)
✔ job arguments carry mounts, env, network and privilege (0.831535ms)
✔ a task container is created without sharing anything with the worker (0.789992ms)
✔ a feature still contributes its bind mounts (0.359746ms)
✔ features resolve into mounts, env and privilege (0.514972ms)
✔ an unknown required feature is reported rather than ignored (0.19631ms)
✔ an artifact pattern reduces to the part that can be copied out (0.452425ms)
✔ overlapping artifact paths are copied out once (0.550446ms)
✔ artifact collection globs, and refuses to leave the workspace (23.828683ms)
✔ artifact when controls collection (0.301852ms)
✔ an idle worker keeps running instead of exiting (4011.580076ms)
✔ a worker stops promptly on a signal rather than after its poll interval (1520.080099ms)
✔ log output is batched and offsets advance (3.225393ms)
✔ a conflicting offset resynchronises instead of duplicating (1.220929ms)
✔ secrets are masked before anything leaves the host (1.597092ms)
✔ a secret split across two writes is still masked (0.825063ms)
✔ a failing conductor does not break the task (1.319575ms)
ℹ tests 331
ℹ suites 0
ℹ pass 191
ℹ fail 104
ℹ cancelled 0
ℹ skipped 36
ℹ todo 0
ℹ duration_ms 6110.503317

✖ failing tests:

test at test/conductor.test.js:80:1
✖ health reports the selected drivers (25.507755ms)
  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-r6ArO1/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-r6ArO1/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:90:1
✖ a signed trigger creates a job and expands the pipeline (6.317484ms)
  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-gdnUC6/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-gdnUC6/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:119:1
✖ an unsigned or wrongly signed trigger is refused (5.011658ms)
  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-hyp90G/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-hyp90G/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:134:1
✖ github and gitlab push payloads are understood (4.741369ms)
  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-8fUcmI/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-8fUcmI/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:157:1
✖ a branch deletion is ignored rather than failing (7.339069ms)
  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-T0JC8P/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-T0JC8P/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:165:1
✖ a broken pipeline is reported as a client error with detail (6.230601ms)
  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-Q6z1fZ/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-Q6z1fZ/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:175:1
✖ a missing pipeline file is reported clearly (10.427157ms)
  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-Pj9Rdp/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-Pj9Rdp/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:185:1
✖ a pipeline may be spelled .conductor.yaml instead of .conductor.yml (11.975545ms)
  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-mQ8pNe/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-mQ8pNe/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:194:1
✖ a project pointed at a specific file gets no fallback (7.06833ms)
  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-tai4xk/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-tai4xk/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:204:1
✖ a repository carrying both spellings is refused rather than guessed at (10.85648ms)
  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-jwErl6/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-jwErl6/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:215:1
✖ a pipeline still using the jobs key is told what it was renamed to (5.052854ms)
  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-UcE4LN/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-UcE4LN/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:227:1
✖ a job can be created directly, without a push payload to imitate (5.318805ms)
  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-WohLBR/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-WohLBR/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:242:1
✖ creating a job requires the same signature as a trigger (3.457403ms)
  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-t7FFet/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-t7FFet/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:257:1
✖ creating a job insists on a real commit rather than inferring one (3.247816ms)
  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-glxMrO/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-glxMrO/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:264:1
✖ a job can be read back, with the state of every task (3.753902ms)
  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-A9SMe2/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-A9SMe2/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:286:1
✖ a public job is readable without any credential at all (3.356982ms)
  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-9WwHwr/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-9WwHwr/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:297:1
✖ a private job needs the trigger secret, and is otherwise absent (4.170554ms)
  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-3QUOZl/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-3QUOZl/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:316:1
✖ a job of another project cannot be read through this one (4.123087ms)
  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-9rKUps/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-9rKUps/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:347:1
✖ a task can be read back on its own, and by its full name (6.593308ms)
  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-LWom86/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-LWom86/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:378:1
✖ reading a task back carries its dependencies and matrix (4.032393ms)
  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-zCe8EO/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-zCe8EO/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:396:1
✖ reading a task back never exposes its environment, services or script (4.565007ms)
  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-l3oomk/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-l3oomk/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:422:1
✖ a task lists the artifacts it stored, with a usable download url (8.569004ms)
  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-kMjMVO/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-kMjMVO/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:452:1
✖ reading a task back needs no worker token (5.906642ms)
  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-cpGWMF/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-cpGWMF/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:467:1
✖ a private task is absent without a credential, and needs its project named (4.272769ms)
  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-h5oDS5/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-h5oDS5/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:496:1
✖ a private task is readable by an administrator, by either path (4.668116ms)
  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-rmnSjW/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-rmnSjW/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:513:1
✖ a task of another project cannot be read through this one (7.34621ms)
  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-BtytfR/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-BtytfR/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:528:1
✖ an unknown task is 404 by either path (4.287285ms)
  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-CkflvM/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-CkflvM/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:538:1
✖ the worker api rejects missing and invalid tokens (3.96822ms)
  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-CVAQDb/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-CVAQDb/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:550:1
✖ independent tasks dispatch concurrently (3.514406ms)
  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-C00Em7/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-C00Em7/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:568:1
✖ a task is only offered to a worker that satisfies its requires (3.851382ms)
  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-m3NPu4/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-m3NPu4/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:588:1
✖ a worker is not offered work for an architecture it cannot build (3.937386ms)
  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-fV8Quv/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-fV8Quv/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:606:1
✖ a claimed task carries everything the worker needs (3.729434ms)
  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-hDLl41/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-hDLl41/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:635:1
✖ a task that requires a feature reports it to the worker (4.709528ms)
  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-B3PKUd/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-B3PKUd/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:648:1
✖ the standard conductor variables are present in the task environment (3.739084ms)
  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-zCiwXA/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-zCiwXA/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:668:1
✖ the source tarball is served from the mirror (4.098952ms)
  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-gvpi0R/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-gvpi0R/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:687:1
✖ a worker cannot touch a task it does not hold (3.7629ms)
  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-pTWDmL/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-pTWDmL/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:704:1
✖ log appends are resumable and deduplicated by offset (3.919443ms)
  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-FInDSx/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-FInDSx/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:739:1
✖ an oversized log chunk is refused (3.758752ms)
  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-QxFPrR/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-QxFPrR/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:759:1
✖ a finished log moves to storage and is still readable (3.994916ms)
  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-9pWK7b/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-9pWK7b/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:782:1
✖ artifacts are stored, hashed, and stripped of traversal (4.338259ms)
  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-I1iptp/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-I1iptp/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:819:1
✖ an artifact shorter than its content-length is rejected (7.317403ms)
  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-aeK1qV/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-aeK1qV/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:840:1
✖ success releases dependents, matched on shared dimensions (3.48869ms)
  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-ikFEdk/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-ikFEdk/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:859:1
✖ failure skips transitive dependents, not just direct ones (3.513091ms)
  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-Tt7QgN/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-Tt7QgN/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:879:1
✖ a job settles as failed once every task is terminal (3.379506ms)
  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-qYr2gq/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-qYr2gq/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:899:1
✖ a job settles as success when everything passes (2.989942ms)
  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-8SgB2f/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-8SgB2f/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:926:1
✖ an allowed failure does not fail the job or block dependents (3.337576ms)
  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-jbiaXv/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-jbiaXv/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:955:1
✖ a task with retries left is requeued instead of failing the job (4.010486ms)
  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-cB3EYu/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-cB3EYu/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:981:1
✖ heartbeats keep a task alive and report cancellation (3.787599ms)
  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-TJYIue/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-TJYIue/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1008:1
✖ the reaper fails a task whose worker stopped reporting (4.297014ms)
  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-nqtYVv/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-nqtYVv/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1034:1
✖ a second push produces an independent, numbered job (4.690242ms)
  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-p2XyeL/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-p2XyeL/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1074:1
✖ a disabled project refuses triggers (4.340282ms)
  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-nwl0Kn/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-nwl0Kn/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1082:1
✖ a trigger for an unknown project is a 404 (3.673901ms)
  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-qUwvoj/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-qUwvoj/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1094:1
✖ a commit that is not in the repository is refused (4.039882ms)
  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-DhXWu2/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-DhXWu2/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1104:1
✖ a task is told to fetch an archive, and never the repository itself (3.259299ms)
  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-k6UMD0/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-k6UMD0/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1120:1
✖ the source archive is the bare tree, with no wrapping directory (3.847601ms)
  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-arOJ25/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-arOJ25/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1154:1
✖ the working directory is resolved from the pipeline, then the project (4.403459ms)
  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-Mi4d39/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-Mi4d39/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1194:1
✖ an unusable working directory is refused rather than sanitised (3.971169ms)
  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-GI5d7T/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-GI5d7T/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1217:1
✖ the trigger secret is not stored in the clear (3.896425ms)
  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-Wr3KTw/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-Wr3KTw/repo',
    stdout: '',
    stderr: ''
  }

test at test/conductor.test.js:1226:1
✖ worker tokens are stored only as hashes (3.554877ms)
  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-btF5go/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-btF5go/repo',
    stdout: '',
    stderr: ''
  }

test at test/git-env.test.js:55:1
✖ git accepts the environment we build (42.75863ms)
  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-sVN09y' ],
    cmd: 'git init -q -b main /tmp/conductor-gitenv-sVN09y',
    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 (10.593237ms)
  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-wzAVby/work' ],
    cmd: 'git init -q -b main /tmp/conductor-cwd-wzAVby/work',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:111:1
✖ an artifact past its own deadline is deleted (16.734885ms)
  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-6sHgZk/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-6sHgZk/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:125:1
✖ an explicit deadline overrides the policy in both directions (6.632735ms)
  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-upmvC9/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-upmvC9/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:142:1
✖ an explicit deadline also beats the last good job (4.706712ms)
  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-HvknUX/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-HvknUX/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:153:1
✖ the last few jobs keep their artifacts however old they are (7.281881ms)
  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-unVWP8/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-unVWP8/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:166:1
✖ recent artifacts are kept however many jobs have followed (4.418517ms)
  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-9jMAGE/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-9jMAGE/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:180:1
✖ an artifact outside both rules is deleted (3.98844ms)
  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-3z4xZ0/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-3z4xZ0/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:194:1
✖ the most recent successful job is kept whatever the policy says (3.845996ms)
  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-QjyGcJ/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-QjyGcJ/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:208:1
✖ only the latest success is protected, not every success (3.449377ms)
  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-Vnjbic/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-Vnjbic/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:220:1
✖ a project may keep artifacts forever despite a server default (4.50887ms)
  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-Bp8Pyu/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-Bp8Pyu/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:239:1
✖ a project setting overrides the server default (4.763665ms)
  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-DKMlqw/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-DKMlqw/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:253:1
✖ an unfinished job is never swept (4.509773ms)
  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-yQFvPI/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-yQFvPI/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:266:1
✖ logs older than the limit are removed but the task remains (5.149884ms)
  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-XFNtMb/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-XFNtMb/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:290:1
✖ a swept log is distinguishable from one that never existed (5.236157ms)
  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-8lVcPm/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-8lVcPm/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:305:1
✖ a log is swept only once (5.030594ms)
  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-mphik5/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-mphik5/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:317:1
✖ zero keeps logs forever (4.71443ms)
  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-BQnJK2/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-BQnJK2/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:327:1
✖ a storage failure leaves the row for the next pass (4.089286ms)
  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-R0Q2xL/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-R0Q2xL/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:346:1
✖ a sweep deletes no more than its batch (5.071773ms)
  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-cdHmIw/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-cdHmIw/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:361:1
✖ one project policy does not reach into another (4.974807ms)
  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-SsRXSJ/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-SsRXSJ/repo',
    stdout: '',
    stderr: ''
  }

test at test/retention.test.js:405:1
✖ artifacts.expire in a pipeline reaches the stored artifact (4.667405ms)
  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-NX8kbt/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-NX8kbt/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:65:1
✖ an anonymous visitor sees public jobs and an invitation to sign in (18.861323ms)
  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-zir4Cd/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-zir4Cd/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:81:1
✖ an anonymous visitor cannot see a private job (5.801836ms)
  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-ysVKZw/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-ysVKZw/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:95:1
✖ management pages redirect an anonymous visitor to sign in (4.256357ms)
  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-XnGTc5/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-XnGTc5/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:107:1
✖ signing in through the form sets a session and reveals the nav (4.2278ms)
  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-DbGGzG/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-DbGGzG/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:142:1
✖ a user creates a project through the form and is shown the secret once (4.963045ms)
  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-YD8iJ2/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-YD8iJ2/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:164:1
✖ a project page shows variables and never their values (3.455968ms)
  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-EWousb/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-EWousb/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:176:1
✖ setting and removing a variable returns the updated table (4.409906ms)
  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-aeIOI0/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-aeIOI0/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:197:1
✖ a user cannot open or delete a project they do not own (4.178736ms)
  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-2sFwPH/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-2sFwPH/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:216:1
✖ registering a worker shows the token once and lists it (4.458364ms)
  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-QKzTtI/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-QKzTtI/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:236:1
✖ an ordinary user cannot create shared capacity from the form (4.157124ms)
  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-O7Pf8n/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-O7Pf8n/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:254:1
✖ the users page is administrator only and warns about what deletion destroys (3.105305ms)
  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-2U8S1V/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-2U8S1V/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:276:1
✖ a running job polls, and a finished one stops (3.226887ms)
  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-FCXS9C/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-FCXS9C/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:293:1
✖ a task page streams the log and stops polling once it completes (3.201253ms)
  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-KG4Kfc/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-KG4Kfc/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:323:1
✖ log output is escaped, so a task cannot inject markup into the page (3.19822ms)
  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-GtFPBQ/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-GtFPBQ/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:344:1
✖ a mutation without the htmx header is refused (2.848663ms)
  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-219yKs/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-219yKs/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:362:1
✖ the sign in form is centred rather than stranded at the left edge (3.648995ms)
  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-QUxEPR/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-QUxEPR/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:370:1
✖ row actions stay ordinary table cells, so rows keep one height (4.534279ms)
  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-Xu0d6j/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-Xu0d6j/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:387:1
✖ the stylesheet and htmx are served, and nothing else is (3.379804ms)
  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-foL4Dv/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-foL4Dv/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:403:1
✖ the project page shows retention, with server defaults as placeholders (6.118193ms)
  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-DAk6Zw/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-DAk6Zw/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:421:1
✖ saving retention through the form stores it, and empty means inherit (4.540179ms)
  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-PyTe2w/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-PyTe2w/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:447:1
✖ a negative retention value is refused by the form (4.337949ms)
  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-TtAciF/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-TtAciF/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:465:1
✖ the project page offers a working directory, defaulting to the server one (4.608488ms)
  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-vEIV7T/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-vEIV7T/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:476:1
✖ saving a working directory stores it, and empty clears it (3.798595ms)
  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-6T4XXY/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-6T4XXY/repo',
    stdout: '',
    stderr: ''
  }

test at test/ui.test.js:499:1
✖ an unusable working directory is refused by the form (3.794528ms)
  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-6h65ik/repo' ],
    cmd: 'git init -q -b main /tmp/conductor-it-6h65ik/repo',
    stdout: '',
    stderr: ''
  }
[conductor] task exited 1