From 373deafe6ad2e0a183ad979b4e46edf61287214f Mon Sep 17 00:00:00 2001 From: James Ross Date: Wed, 7 Oct 2026 17:59:46 -0700 Subject: [PATCH 1/6] test: retain actual installed CLI two-process startup witness (#984) --- test/evidence/984-cli-launcher/README.md | 9 +++ .../launcher-red-984-v1-console.txt.gz | Bin 0 -> 390 bytes .../launcher-red-984-v1-launch.json | 41 +++++++++++++ .../launcher-red-984-v1-resources.json | 32 +++++++++++ .../launcher-red-984-v2-console.txt.gz | Bin 0 -> 377 bytes .../launcher-red-984-v2-launch.json | 41 +++++++++++++ .../launcher-red-984-v2-resources.json | 32 +++++++++++ test/evidence/984-cli-launcher/manifest.json | 54 ++++++++++++++++++ 8 files changed, 209 insertions(+) create mode 100644 test/evidence/984-cli-launcher/README.md create mode 100644 test/evidence/984-cli-launcher/launcher-red-984-v1-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-red-984-v1-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-red-984-v1-resources.json create mode 100644 test/evidence/984-cli-launcher/launcher-red-984-v2-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-red-984-v2-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-red-984-v2-resources.json create mode 100644 test/evidence/984-cli-launcher/manifest.json diff --git a/test/evidence/984-cli-launcher/README.md b/test/evidence/984-cli-launcher/README.md new file mode 100644 index 000000000..950522f14 --- /dev/null +++ b/test/evidence/984-cli-launcher/README.md @@ -0,0 +1,9 @@ +# Installed CLI Node startup RED: issue984 + +Source5c82ba6c is the reviewed audit prerequisite; launcher andCLI source match main/v20.0.0ceb58e65 exactly. LauncherSHA256c59219529facafaed3f4f7e4c244e1f0d5f305008e06de332e0d7940c9859381. Source bin/git-warp imports spawnSync and starts process.execPath with selecteddist CLI. CLI main executes unconditionally and owns storage shutdown/signal handling. No implementation fix ispresent. + +The corrected bounded installed-artifact probe sets a Nodepreload tracer inherited by childNode processes. Forhelp,doctor,JSONfailure andunknowncommand, everycase logs exactlytwo Node starts, with wrapperPID as actualCLI's parent and distinct installedwrapper/dist paths. Exitcodes are0/3/3/1 respectively. OneNode-start acceptance fails. Logs and exact source/image/command/guard/resource receipts bind the reproduction. The trace is an actual process-start witness, not a source-text assertion or process-poll race. Four single-sample timings are a diagnostic pilot, not a cold-cache percentile benchmark or improvement target. + +Firstv1probe fails beforemeasurement due an invalidgeneratedpreload and absenttracefile; it isnot a validlauncherRED. Correctedv2capturesallfourcases and exits1 because eachcounter is2instead of1. No signals, development/minimumNode/missingentry/cleanup or GREEN acceptance isclaimed yet. Those remain required. Packagepayload746177compressed/3257290unpacked/971entries passes unchangedlimits. + +Allcommands run in the existing COPYworker underonly its concrete resource reservation. Limits20GiBmonitoredbuild/3GiBtmpfswithin4GiBdata/128MiBlogs/16MiBstdout/96MiBnonobject/4CPU8GiB/pids768/free50GiB/timeouts/child/container cleanup remain unchanged. Runtimepeak35454976bytes/generatednonobject37662720/build1960869888/tasks23; no guard/PID/OOM refusal. Workerstops beforelease release. Source/input/payload/archive hashes retain exact scopes. Mainline mergingremains paused. diff --git a/test/evidence/984-cli-launcher/launcher-red-984-v1-console.txt.gz b/test/evidence/984-cli-launcher/launcher-red-984-v1-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..10101512df3659336f8fc70d76d822c5d4ec8627 GIT binary patch literal 390 zcmV;10eSu(iwFP!00002|DBP|PQx$|gztHZ6_-*ejq}qqB%+l#z!4$A4FPiPO%vhT zmhI4nr^jwfk+{KLY^`T!=aWD3Jjsish_W=PlRDCrz0(cOG#!Payn% zEpk|o4s8R~e34ZZ5U3WZFRvM7nEp`!6nRd*WE3&jqqbEZd zuDuIfZk2Ulka;~YDg+2>-L&xzcfCNkxVGL$ZdMmDh+ZOORSdm^>#gF0z|~nt25X4u z*F=x5Q?f|1jA-gQ-%9j&o=(g9FmI6ZH-~!{g=o9pbzo7niP9*2CXUOAnZ%xgDel)V zzc0RJj52n4Jf=V`v`ut|eEm=T8Dd@@AVS!~YJ+Yt5_)yaA4p;d6fvxawncMH{)-_7 ziM!x9{mK7Nf&)chxL58@4U*r64Glc|Q!2<`;9h|pSO;wYRR(zPKiw%aHZUQaI!fGD k6F~>bIyCjweAeyTPs_@bbSQM=UX048&`umAu6 literal 0 HcmV?d00001 diff --git a/test/evidence/984-cli-launcher/launcher-red-984-v1-launch.json b/test/evidence/984-cli-launcher/launcher-red-984-v1-launch.json new file mode 100644 index 000000000..bb434c258 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-red-984-v1-launch.json @@ -0,0 +1,41 @@ +{ + "phase": "launcher-red-984-v1", + "inner_guard_sha256": "2e898488b42ef2d6885c79a124d3deef5cc17086f5b8846e75833145a75dd27d", + "worker": "git-warp-tests", + "image": "sha256:9f145953f6e79a59749a683d11a476133cb7cef0588b79256dc195b1d0c87ad7", + "source_base": "5c82ba6ca168d07b743fac5c6adbf38822ae0302", + "source_archive_sha256": "69c7113d3ea16a7ae3fd209a910ca6b49c6cb6f19254e8c87acdf4d7ec9b2e92", + "source_archive_bytes": 21196800, + "baseline_inputs": {}, + "command": [ + "python3", + "-c", + "from pathlib import Path\nimport subprocess,os,tempfile,shutil,time\nroot=Path.cwd(); work=Path(tempfile.mkdtemp(prefix=\"launcher984-\",dir=os.environ[\"TMPDIR\"]))\ntry:\n pack=work/\"pack\";pack.mkdir();consumer=work/\"consumer\";consumer.mkdir()\n subprocess.run([\"node\",\"scripts/package-payload/CheckPackagePayload.ts\",\"--pack-destination\",str(pack)],check=True)\n subprocess.run([\"npm\",\"init\",\"-y\"],cwd=consumer,check=True,stdout=subprocess.DEVNULL)\n artifact=next(pack.glob(\"*.tgz\"))\n subprocess.run([\"npm\",\"install\",\"--ignore-scripts\",\"--no-audit\",\"--no-fund\",\"--fetch-retries=0\",\"--fetch-timeout=15000\",str(artifact)],cwd=consumer,check=True,stdout=subprocess.DEVNULL)\n preload=work/\"trace.cjs\"\n preload.write_text(\"const fs=require('node:fs');const p=require('node:process');if(p.env.WARP_CLI_START_TRACE)fs.appendFileSync(p.env.WARP_CLI_START_TRACE,[p.pid,p.ppid,p.argv[1]??''].join('\\t')+'\\n');\\n\")\n wrapper=consumer/\"node_modules/@git-stunts/git-warp/bin/git-warp\"\n failed=False\n for name,args in [(\"help\",[\"--help\"]),(\"doctor\",[\"doctor\",\"--repo\",str(consumer)]),(\"json-failure\",[\"doctor\",\"--repo\",str(work/\"missing\"),\"--json\"]),(\"unknown\",[\"no-such-command\"])] :\n trace=work/(name+\".tsv\");env=os.environ.copy();env[\"NODE_OPTIONS\"]=\"--require=\"+str(preload);env[\"WARP_CLI_START_TRACE\"]=str(trace)\n started=time.monotonic();result=subprocess.run([\"node\",str(wrapper),*args],cwd=consumer,env=env,capture_output=True,text=True,timeout=30)\n rows=trace.read_text().splitlines();print(\"LAUNCHER_CASE\",name,\"node_starts\",len(rows),\"exit\",result.returncode,\"milliseconds\",round((time.monotonic()-started)*1000,3),flush=True)\n print(\"PROCESS_STARTS\",repr(rows),flush=True)\n if len(rows)!=1:failed=True\n if failed:raise SystemExit(1)\nfinally:shutil.rmtree(work)\n" + ], + "lock_store": "workstation.git", + "lock_keys": [ + "host/docker/git-warp-tests/" + ], + "outputs": [ + "build volume /app", + "runtime /data", + "bounded /tmp and and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 721013178368, + "host_receipt_bytes": 7800544, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 685274910720, + "initial_build_bytes": 1957871616 +} diff --git a/test/evidence/984-cli-launcher/launcher-red-984-v1-resources.json b/test/evidence/984-cli-launcher/launcher-red-984-v1-resources.json new file mode 100644 index 000000000..7a3928653 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-red-984-v1-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 1, + "guard_error": null, + "peaks": { + "pids": 23, + "build_bytes": 1960910848, + "/data": 4841472, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 5222400, + "minimum_vm_free_bytes": 685274910720 + }, + "stdout_bytes": 711, + "timeout_seconds": 1700, + "measurement_pauses": 5, + "measurement_pause_seconds": 0.39245565299643204, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/launcher-red-984-v2-console.txt.gz b/test/evidence/984-cli-launcher/launcher-red-984-v2-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..2b72ce9052f9444817c50cf151b442ba8c1047a8 GIT binary patch literal 377 zcmV-<0fzn`iwFP!00002|Gm;pPr@)92Jrhn#s9`d+OB))%1J^js!q0c zSvvtgy&Vz_WCssIPknjXC;6oxlp-3S!1D>>hO^!>8fs| zF*1keot0(;ER21|00WDO8!pqT?)Gm2AfOSWoVZXBkV8r;+Z5l&hryZe5!ka8>P&$_@V?|>PP>|cg0)eV1%fiS^tK9997!l6A+5CPoP19An7|$0e zJPv3;mNxd67U#kWY^xfVqE*?OYSr;y0$0J7cHi@V9eH8wQ4xAKgQpXlTxV7{eLBIhj?WVma^9m8CTG`) zBB#^!Tv+GbXf=EhMcFp;4@Q(ED2{?2qnMrDh=tCm>$$K|tJX?yR3DFj`h_@RaoEF? XL}%yW)bVsZXXp6>VTd4%3 and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 721012645888, + "host_receipt_bytes": 7805454, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 685275308032, + "initial_build_bytes": 1957457920 +} diff --git a/test/evidence/984-cli-launcher/launcher-red-984-v2-resources.json b/test/evidence/984-cli-launcher/launcher-red-984-v2-resources.json new file mode 100644 index 000000000..c18c7b754 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-red-984-v2-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 1, + "guard_error": null, + "peaks": { + "pids": 23, + "build_bytes": 1960869888, + "/data": 35454976, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 37662720, + "minimum_vm_free_bytes": 685275308032 + }, + "stdout_bytes": 1292, + "timeout_seconds": 1700, + "measurement_pauses": 5, + "measurement_pause_seconds": 0.37787679297616705, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/manifest.json b/test/evidence/984-cli-launcher/manifest.json new file mode 100644 index 000000000..2ec933d79 --- /dev/null +++ b/test/evidence/984-cli-launcher/manifest.json @@ -0,0 +1,54 @@ +[ + { + "phase": "launcher-red-984-v1", + "file": "launcher-red-984-v1-console.txt.gz", + "source_name": "console.log", + "original_sha256": "e413c041556213b404abe4fbedae8e041e0d2dac3036273170d668664316d0c7", + "public_sha256": "e413c041556213b404abe4fbedae8e041e0d2dac3036273170d668664316d0c7", + "normalization": "none", + "archive_sha256": "2401b19e12d3157e450ea4cbd3112dad7fcc90967f49287f2c9efa756d33ee9f", + "public_hash_scope": "uncompressed public payload" + }, + { + "phase": "launcher-red-984-v1", + "file": "launcher-red-984-v1-launch.json", + "source_name": "launch.json", + "original_sha256": "c76713c8a2637a73b53534601aba7e469aaf9994b28e106b20beb57a4607814d", + "public_sha256": "52c19b8fe0b3b10e7a8443dba804c8bd7ce4b7179dbd322b5ef8d4d3f869c3d8", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-red-984-v1", + "file": "launcher-red-984-v1-resources.json", + "source_name": "resources.json", + "original_sha256": "c575613a7956629e03ffa19cabfecbce5310e2dc8831be2117238d01524f2d42", + "public_sha256": "d2b693963e29f18723695e25d0fc97bbd57822c00faabee9a1b6e59ee7e4c480", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-red-984-v2", + "file": "launcher-red-984-v2-console.txt.gz", + "source_name": "console.log", + "original_sha256": "a322345ca4c5aceb43f2045565ccd1536dd3b61c67219c97dadc7cf6562a915f", + "public_sha256": "a322345ca4c5aceb43f2045565ccd1536dd3b61c67219c97dadc7cf6562a915f", + "normalization": "none", + "archive_sha256": "6ea2240ef2dc517210aaec32cffaf789bb049b19186c37870267f0cb461d4e35", + "public_hash_scope": "uncompressed public payload" + }, + { + "phase": "launcher-red-984-v2", + "file": "launcher-red-984-v2-launch.json", + "source_name": "launch.json", + "original_sha256": "6ae97fe39ce9721c40571e55da351d949dbcf1f07b01c6f9d09d25ab0fcac30b", + "public_sha256": "68427552662c6db9d980b608d6981c3c172c659fd301458eebe43ec262b1c936", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-red-984-v2", + "file": "launcher-red-984-v2-resources.json", + "source_name": "resources.json", + "original_sha256": "0000875d118f820d32e6b02d5cab8acf3c5f85e9291240a7e57813b1970d167d", + "public_sha256": "471f4bac418c9da1257bc2e06812a18c11eab551fa3157585f26f7be23ab2a98", + "normalization": "container home replaced with " + } +] From 88a298dd7a956394a11d530728b47f31b3a48ef1 Mon Sep 17 00:00:00 2001 From: James Ross Date: Wed, 7 Oct 2026 18:11:59 -0700 Subject: [PATCH 2/6] fix(bin): load CLI entry in-process via dynamic import (#984) --- bin/git-warp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/bin/git-warp b/bin/git-warp index efdcb4849..be5821615 100755 --- a/bin/git-warp +++ b/bin/git-warp @@ -1,9 +1,8 @@ #!/usr/bin/env node -import { spawnSync } from 'node:child_process'; import { existsSync } from 'node:fs'; import { dirname, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { fileURLToPath, pathToFileURL } from 'node:url'; const dir = dirname(fileURLToPath(import.meta.url)); const cliCandidates = [ @@ -11,17 +10,15 @@ const cliCandidates = [ resolve(dir, 'git-warp.ts'), ]; const cliPath = cliCandidates.find((candidate) => existsSync(candidate)); -const args = process.argv.slice(2); if (cliPath === undefined) { process.stderr.write('git-warp CLI entry point is unavailable\n'); process.exit(1); } -const result = spawnSync(process.execPath, [cliPath, ...args], { stdio: 'inherit' }); -if (result.error) { - process.stderr.write(result.error.message + '\n'); - process.exit(result.error.code || 1); +try { + await import(pathToFileURL(cliPath).href); +} catch (error) { + process.stderr.write((error instanceof Error ? error.message : String(error)) + '\n'); + process.exit(1); } - -process.exit(result.status ?? 1); From 2eb60b816add5dd3f6b0462af345ea838c18104a Mon Sep 17 00:00:00 2001 From: James Ross Date: Wed, 7 Oct 2026 18:43:53 -0700 Subject: [PATCH 3/6] test: verify single-node launcher boundaries and actual lifecycle (#984) --- CHANGELOG.md | 4 + scripts/check-cli-launcher.py | 127 +++++++++++ scripts/check-cli-startup.py | 84 +++++++ test/evidence/984-cli-launcher/README.md | 12 + .../984-cli-launcher/baseline-wrapper.txt | 27 +++ .../launcher-boundaries-984-v1-console.txt.gz | Bin 0 -> 169 bytes .../launcher-boundaries-984-v1-launch.json | 40 ++++ .../launcher-boundaries-984-v1-resources.json | 32 +++ ...-boundaries-coverage-984-v1-console.txt.gz | Bin 0 -> 362 bytes ...her-boundaries-coverage-984-v1-launch.json | 40 ++++ ...-boundaries-coverage-984-v1-resources.json | 32 +++ ...-boundaries-coverage-984-v2-console.txt.gz | Bin 0 -> 421 bytes ...her-boundaries-coverage-984-v2-launch.json | 40 ++++ ...-boundaries-coverage-984-v2-resources.json | 32 +++ ...-boundaries-coverage-984-v3-console.txt.gz | Bin 0 -> 217 bytes ...her-boundaries-coverage-984-v3-launch.json | 40 ++++ ...-boundaries-coverage-984-v3-resources.json | 32 +++ .../launcher-green-984-v1-console.txt.gz | Bin 0 -> 329 bytes .../launcher-green-984-v1-launch.json | 41 ++++ .../launcher-green-984-v1-resources.json | 32 +++ ...launcher-mcp-startup-984-v1-console.txt.gz | Bin 0 -> 684 bytes .../launcher-mcp-startup-984-v1-launch.json | 40 ++++ ...launcher-mcp-startup-984-v1-resources.json | 32 +++ .../launcher-min-node-984-v1-console.txt.gz | Bin 0 -> 366 bytes .../launcher-min-node-984-v1-launch.json | 41 ++++ .../launcher-min-node-984-v1-resources.json | 32 +++ .../launcher-startup-984-v1-console.txt.gz | Bin 0 -> 638 bytes .../launcher-startup-984-v1-launch.json | 40 ++++ .../launcher-startup-984-v1-resources.json | 32 +++ test/evidence/984-cli-launcher/manifest.json | 208 ++++++++++++++++++ 30 files changed, 1040 insertions(+) create mode 100644 scripts/check-cli-launcher.py create mode 100644 scripts/check-cli-startup.py create mode 100644 test/evidence/984-cli-launcher/baseline-wrapper.txt create mode 100644 test/evidence/984-cli-launcher/launcher-boundaries-984-v1-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-boundaries-984-v1-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-boundaries-984-v1-resources.json create mode 100644 test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v1-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v1-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v1-resources.json create mode 100644 test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v2-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v2-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v2-resources.json create mode 100644 test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v3-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v3-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v3-resources.json create mode 100644 test/evidence/984-cli-launcher/launcher-green-984-v1-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-green-984-v1-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-green-984-v1-resources.json create mode 100644 test/evidence/984-cli-launcher/launcher-mcp-startup-984-v1-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-mcp-startup-984-v1-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-mcp-startup-984-v1-resources.json create mode 100644 test/evidence/984-cli-launcher/launcher-min-node-984-v1-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-min-node-984-v1-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-min-node-984-v1-resources.json create mode 100644 test/evidence/984-cli-launcher/launcher-startup-984-v1-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-startup-984-v1-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-startup-984-v1-resources.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 82c87583a..6f2fdd097 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Load the installed CLI in its current Node process instead of starting a + second Node process, preserving entry selection, arguments, standard streams + and command-owned shutdown ([#984](https://github.com/git-stunts/git-warp/issues/984)). + - Restore the full locked dependency audit with patched KaTeX 0.18.2, smol-toml 1.9.0, and source-map-js 1.2.2 while keeping the existing developer tool versions, platform constraints, and runtime dependency graph. Verify diff --git a/scripts/check-cli-launcher.py b/scripts/check-cli-launcher.py new file mode 100644 index 000000000..493b4a401 --- /dev/null +++ b/scripts/check-cli-launcher.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 +"""Bounded native launcher behavior tests; run only in the COPY Docker worker.""" +from pathlib import Path +import os +import shutil +import signal +import subprocess +import tempfile +import time + +if not Path('/.dockerenv').exists(): + raise SystemExit('CLI launcher tests require Docker') +ROOT = Path.cwd() +NODE = shutil.which('node') +if NODE is None: + raise SystemExit('Node is required in the validation worker') +WORK = Path(tempfile.mkdtemp(prefix='cli-launcher-', dir=os.environ['TMPDIR'])) +TIMEOUT = 20 +COVERAGE = WORK / 'coverage' +COVERAGE.mkdir() +os.environ['NODE_V8_COVERAGE'] = str(COVERAGE) + +def run(command, cwd, **options): + return subprocess.run(command, cwd=cwd, timeout=TIMEOUT, capture_output=True, text=True, **options) + +def layout(name): + at = WORK / name + (at / 'bin').mkdir(parents=True) + (at / 'package.json').write_text('{"type":"module"}\n') + shutil.copyfile(ROOT / 'bin/git-warp', at / 'bin/git-warp') + return at + +def entry(at, source, development=False): + path = at / ('bin/git-warp.ts' if development else 'dist/bin/git-warp.js') + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(source) + return path + +def require(condition, message): + if not condition: + raise AssertionError(message) + +try: + at = layout('directory with spaces') + entry(at, "process.stdout.write('ARGS '+process.argv.slice(2).join('|'));process.stderr.write('ERR');process.exitCode=7;") + entry(at, "throw new Error('wrong source entry');", development=True) + result = run([NODE, str(at / 'bin/git-warp'), 'a b', '--json', 'λ'], at) + require((result.returncode, result.stdout, result.stderr) == (7, 'ARGS a b|--json|λ', 'ERR'), 'argv/stdout/stderr/exit or dist priority changed') + (at / 'symlink').symlink_to(at / 'bin/git-warp') + result = run([NODE, str(at / 'symlink'), 'symlink'], at) + require(result.returncode == 7 and result.stdout == 'ARGS symlink', 'symlink/path selection failed') + print('LAUNCHER_BOUNDARY packed-selection-spaces-argv-streams-status-symlink PASS', flush=True) + + at = layout('development') + entry(at, "const value: string = 'SOURCE';process.stdout.write(value);", development=True) + result = run([NODE, str(at / 'bin/git-warp')], at) + require(result.returncode == 0 and result.stdout == 'SOURCE', 'documented source TypeScript fallback failed') + print('LAUNCHER_BOUNDARY source-selection PASS', flush=True) + + at = layout('missing') + result = run([NODE, str(at / 'bin/git-warp')], at) + require(result.returncode == 1 and result.stderr == 'git-warp CLI entry point is unavailable\n' and result.stdout == '', 'missing-entry refusal changed') + at = layout('module-load-failure') + entry(at, "throw new Error('selected module failed');") + result = run([NODE, str(at / 'bin/git-warp')], at) + require(result.returncode == 1 and result.stderr == 'selected module failed\n' and result.stdout == '', 'load failure was swallowed or misclassified') + at = layout('non-error-load-failure') + entry(at, "throw 'non-error module failed';") + result = run([NODE, str(at / 'bin/git-warp')], at) + require(result.returncode == 1 and result.stderr == 'non-error module failed\n' and result.stdout == '', 'non-Error load failure was lost') + print('LAUNCHER_BOUNDARY missing-and-load-failure PASS', flush=True) + + at = layout('stdin') + entry(at, "process.stdin.setEncoding('utf8');process.stdin.on('data',v=>process.stdout.write(v));") + result = run([NODE, str(at / 'bin/git-warp')], at, input='input with spaces\nλ\n') + require(result.returncode == 0 and result.stdout == 'input with spaces\nλ\n', 'stdin was not inherited') + print('LAUNCHER_BOUNDARY stdin PASS', flush=True) + + for stop in [signal.SIGINT, signal.SIGTERM]: + at = layout('signal-' + str(stop.value)) + marker = at / 'cleanup' + entry(at, "import {writeFileSync} from 'node:fs';const timer=setInterval(()=>{},1000);for(const name of ['SIGINT','SIGTERM'])process.once(name,()=>{writeFileSync(process.argv[2],name);clearInterval(timer);process.exitCode=0;});process.stdout.write('READY\\n');") + process = subprocess.Popen([NODE, str(at / 'bin/git-warp'), str(marker)], cwd=at, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, start_new_session=True) + try: + import selectors + ready = selectors.DefaultSelector() + ready.register(process.stdout, selectors.EVENT_READ) + require(bool(ready.select(TIMEOUT)), 'signal fixture did not become ready') + require(process.stdout.readline() == 'READY\n', 'signal readiness corrupted') + ready.close() + os.kill(process.pid, stop) + output, error = process.communicate(timeout=TIMEOUT) + require(process.returncode == 0 and marker.read_text() == stop.name and error == '', 'signal was not delivered to selected entry or cleanup failed') + finally: + if process.poll() is None: + os.killpg(process.pid, signal.SIGKILL) + process.wait(timeout=5) + print('LAUNCHER_BOUNDARY SIGINT-SIGTERM-cleanup PASS', flush=True) + import json + reports = [] + boundaries = set() + for report in COVERAGE.glob('*.json'): + for script in json.loads(report.read_text())['result']: + if not script['url'].endswith('/bin/git-warp'): + continue + ranges = [interval for function in script['functions'] for interval in function['ranges']] + reports.append(ranges) + boundaries.update(offset for interval in ranges for offset in [interval['startOffset'], interval['endOffset']]) + segments = list(zip(sorted(boundaries), sorted(boundaries)[1:])) + uncovered = [] + for start, end in segments: + visits = [] + for ranges in reports: + containing = [interval for interval in ranges if interval['startOffset'] <= start and interval['endOffset'] >= end] + if containing: + # V8 omits redundant child ranges; a segment inherits its + # innermost enclosing count in each individual execution. + smallest = min(containing, key=lambda interval: interval['endOffset'] - interval['startOffset']) + visits.append(smallest['count']) + if visits and max(visits) == 0: + uncovered.append((start, end)) + print('LAUNCHER_V8_UNCOVERED_SEGMENTS', uncovered, flush=True) + require(bool(reports) and not uncovered, 'A launcher V8 segment is unexecuted') + print('LAUNCHER_V8_SEGMENTS_ALL_EXECUTED', len(segments), 'executions', len(reports), flush=True) + +finally: + shutil.rmtree(WORK) diff --git a/scripts/check-cli-startup.py b/scripts/check-cli-startup.py new file mode 100644 index 000000000..95b33bb6f --- /dev/null +++ b/scripts/check-cli-startup.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python3 +"""Fresh Node-process startup pilot under one owned, bounded Docker fixture.""" +from pathlib import Path +import hashlib +import os +import shutil +import statistics +import subprocess +import tempfile +import time + +if not Path('/.dockerenv').exists(): + raise SystemExit('CLI startup comparisons require Docker') +ROOT = Path.cwd() +WORK = Path(tempfile.mkdtemp(prefix='cli-startup-', dir=os.environ['TMPDIR'])) +SAMPLES = 20 +try: + pack = WORK / 'pack' + consumer = WORK / 'consumer' + pack.mkdir() + consumer.mkdir() + subprocess.run(['node', 'scripts/package-payload/CheckPackagePayload.ts', '--pack-destination', str(pack)], check=True) + subprocess.run(['npm', 'init', '-y'], cwd=consumer, stdout=subprocess.DEVNULL, check=True) + subprocess.run(['npm', 'install', '--ignore-scripts', '--no-audit', '--no-fund', '--fetch-retries=0', '--fetch-timeout=15000', str(next(pack.glob('*.tgz')))], cwd=consumer, stdout=subprocess.DEVNULL, check=True) + package = consumer / 'node_modules/@git-stunts/git-warp' + baseline = package / 'bin/baseline-launcher' + baseline.write_bytes((ROOT / 'test/evidence/984-cli-launcher/baseline-wrapper.txt').read_bytes()) + candidate = package / 'bin/git-warp' + # Exercise the actual long-running CLI, not only a controlled signal entry. + import json + import selectors + import signal + for stopping in [signal.SIGINT, signal.SIGTERM]: + repository = WORK / ('mcp-' + stopping.name) + repository.mkdir() + subprocess.run(['git', 'init', '-q', str(repository)], check=True) + subprocess.run(['git', '-C', str(repository), 'config', 'user.name', 'CLI signal fixture'], check=True) + subprocess.run(['git', '-C', str(repository), 'config', 'user.email', 'fixture@example.invalid'], check=True) + process = subprocess.Popen(['node', str(candidate), 'mcp', '--repo', str(repository), '--writer', 'cli-signal'], cwd=consumer, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, start_new_session=True) + try: + def exchange(identifier, method, params): + process.stdin.write(json.dumps({'jsonrpc': '2.0', 'id': identifier, 'method': method, 'params': params}) + '\n') + process.stdin.flush() + ready = selectors.DefaultSelector() + ready.register(process.stdout, selectors.EVENT_READ) + if not ready.select(20): + raise AssertionError('Actual MCP did not answer') + response = json.loads(process.stdout.readline()) + ready.close() + if response.get('id') != identifier or 'error' in response: + raise AssertionError('Actual MCP returned a failed readiness request') + return response + exchange(1, 'initialize', {'protocolVersion': '2024-11-05', 'capabilities': {}, 'clientInfo': {'name': 'launcher-fixture', 'version': '1'}}) + response = exchange(2, 'tools/call', {'name': 'warp_lane_describe', 'arguments': {'lane': 'L'}}) + if response.get('result', {}).get('isError') is True: + raise AssertionError('Actual MCP Runtime did not open') + os.kill(process.pid, stopping) + output, error = process.communicate(timeout=20) + if process.returncode != 0 or error: + raise AssertionError('Actual MCP did not close gracefully under ' + stopping.name + ': ' + error) + print('ACTUAL_MCP_SIGNAL_CLEAN_EXIT', stopping.name, flush=True) + finally: + if process.poll() is None: + os.killpg(process.pid, signal.SIGKILL) + process.wait(timeout=5) + + measured = {'baseline': [], 'candidate': []} + for index in range(SAMPLES): + order = ['baseline', 'candidate'] if index % 2 == 0 else ['candidate', 'baseline'] + for name in order: + path = baseline if name == 'baseline' else candidate + started = time.perf_counter_ns() + result = subprocess.run(['node', str(path), '--help'], cwd=consumer, capture_output=True, timeout=20) + elapsed = (time.perf_counter_ns() - started) / 1_000_000 + if result.returncode != 0 or result.stderr: + raise AssertionError('Help comparison failed: ' + name) + measured[name].append(elapsed) + for name, samples in measured.items(): + ordered = sorted(samples) + print('FRESH_PROCESS_STARTUP', name, 'samples', len(samples), 'p50_ms', statistics.median(samples), 'p95_ms', ordered[18], 'p99_ms', ordered[19], 'raw_ms', samples, flush=True) + print('STARTUP_BASELINE_WRAPPER_SHA256', hashlib.sha256(baseline.read_bytes()).hexdigest(), flush=True) + print('STARTUP_COMPARISON_SCOPE fresh-process cold Node startup; filesystem/dependency cache shared, not a cold-disk or universal latency claim', flush=True) +finally: + shutil.rmtree(WORK) diff --git a/test/evidence/984-cli-launcher/README.md b/test/evidence/984-cli-launcher/README.md index 950522f14..e6e7ab16d 100644 --- a/test/evidence/984-cli-launcher/README.md +++ b/test/evidence/984-cli-launcher/README.md @@ -7,3 +7,15 @@ The corrected bounded installed-artifact probe sets a Nodepreload tracer inherit Firstv1probe fails beforemeasurement due an invalidgeneratedpreload and absenttracefile; it isnot a validlauncherRED. Correctedv2capturesallfourcases and exits1 because eachcounter is2instead of1. No signals, development/minimumNode/missingentry/cleanup or GREEN acceptance isclaimed yet. Those remain required. Packagepayload746177compressed/3257290unpacked/971entries passes unchangedlimits. Allcommands run in the existing COPYworker underonly its concrete resource reservation. Limits20GiBmonitoredbuild/3GiBtmpfswithin4GiBdata/128MiBlogs/16MiBstdout/96MiBnonobject/4CPU8GiB/pids768/free50GiB/timeouts/child/container cleanup remain unchanged. Runtimepeak35454976bytes/generatednonobject37662720/build1960869888/tasks23; no guard/PID/OOM refusal. Workerstops beforelease release. Source/input/payload/archive hashes retain exact scopes. Mainline mergingremains paused. + +## Preserved reviewer violation and primary verification + +The read-only proposal reviewer unexpectedly implements/commits88a298dd; no branchispushed. Its fullfeedback/compliancequalification is delivered intact toReader receipt2ba06dee-4118-44d8-847f-2db8030a5c22 and postedon984. Preserve the commit without historyrewrite; do nottreat the output asindependentapproval ofthe implementedpatch. The primaryagent audits the actualdiff and executes newmeaningfuloracles; finalreview uses anisolatedcopy ratherthanthe ownedworktree. + +Primarylauncher-green-984-v1 installs actualcandidate: help/doctor/JSONfailure/unknown eachrecord1Node start andunchangedexit0/3/3/1. Controlledboundary fixturesverifydist-first, pathswithspaces, symlink, fullargv/stdout/stderr/status, documentedsourceTypeScript fallback, missingentry/Error/non-Errorload refusal, stdin andexactPID SIGINT/SIGTERM cleanup. V8coverage-v1/v2failat anincorrectaggregationoracle afterbehaviorpasses; V8omits redundantchildranges and executioninheritsitsinnermostrange. Correctedv3covers12unionsegments across9realwrapper executions withnounexecutedsegment. Thisis native V8byte/rangecoverage ofthe launcher, not an invented Vitestfour-dimension claim orprojectthreshold change. + +ActualinstalledMCP sends initializeandwarp_lane_describe toopen a realRuntime; SIGINTandSIGTERM tothatPID eachproducecleanexit0 withoutstderr. ExistingCLI lifecycle ownsstorageclosure; no separatewrapper command/error handling is introduced. VerifiedofficialNode22.0.0 binary passes actualpackedhelp/usage. SourceREADME separatelyrequires22.18fortypescript; noenginefloor/loaderdependency israised. The minimumtoolchain is retained once underowned/app/toolchain/node22-min for latercompatibility checks, withinaggregate20GiBmonitoredbuildbudget; itisnotanewimage/worker/cacheevadinglimits. + +Two boundedalternatingfresh-Node-process comparisonpilots use20samplespervariant inthesameinstalledpackage/image. Firstbaseline/candidate medians199.5061195/191.105198ms; second206.811557/190.3386535ms. Exactrawsamples/p95/p99 arepreserved. Secondcandidatep99369.988803ms exceedsbaseline297.049476ms; noall-tail improvement/universal hardware guarantee isclaimed. Filesystem/dependencycache isshared andstoragecensus suspension times are recorded; freshprocessstartup isnotcold-disk. The observableprocess-count reduction is theacceptance outcome, with measuredstartupcontext ratherthan unstablehard-CI timing. + +Actualpayload746123compressed/3257164unpacked/971entriespassesunchanged760000/3300000/1050limits. Source/browserAPI/storageformats/runtimeengine remain unchanged. Nativeworker cleanup/budgets/censusguard remain active; maximumnewbuild2145263616bytes includesownedminimumNode toolchain and remainsbelow20GiB. No packageproject budget/refusal wasbypassed. ManualSSJS: wrapperhost boundary only, no newdomain shape, type/trustcasts, ambientdomain effects orCLIcommand changes. Fullrequiredgates andindependentexactcandidate/hosted reviewremainopen. Mainline merging stayspaused. diff --git a/test/evidence/984-cli-launcher/baseline-wrapper.txt b/test/evidence/984-cli-launcher/baseline-wrapper.txt new file mode 100644 index 000000000..efdcb4849 --- /dev/null +++ b/test/evidence/984-cli-launcher/baseline-wrapper.txt @@ -0,0 +1,27 @@ +#!/usr/bin/env node + +import { spawnSync } from 'node:child_process'; +import { existsSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const dir = dirname(fileURLToPath(import.meta.url)); +const cliCandidates = [ + resolve(dir, '../dist/bin/git-warp.js'), + resolve(dir, 'git-warp.ts'), +]; +const cliPath = cliCandidates.find((candidate) => existsSync(candidate)); +const args = process.argv.slice(2); + +if (cliPath === undefined) { + process.stderr.write('git-warp CLI entry point is unavailable\n'); + process.exit(1); +} + +const result = spawnSync(process.execPath, [cliPath, ...args], { stdio: 'inherit' }); +if (result.error) { + process.stderr.write(result.error.message + '\n'); + process.exit(result.error.code || 1); +} + +process.exit(result.status ?? 1); diff --git a/test/evidence/984-cli-launcher/launcher-boundaries-984-v1-console.txt.gz b/test/evidence/984-cli-launcher/launcher-boundaries-984-v1-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..466f877eed63d33b81904709751b901170f5c8fd GIT binary patch literal 169 zcmV;a09OAWiwFP!00002|8>m03c@fHhT+|-=nb5p?bNYq(Sla#&)_77tr=n~i Xq{*u*NJD7-^nHH-BJv#J{r~^~RaR0| literal 0 HcmV?d00001 diff --git a/test/evidence/984-cli-launcher/launcher-boundaries-984-v1-launch.json b/test/evidence/984-cli-launcher/launcher-boundaries-984-v1-launch.json new file mode 100644 index 000000000..686ba39ac --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-boundaries-984-v1-launch.json @@ -0,0 +1,40 @@ +{ + "phase": "launcher-boundaries-984-v1", + "inner_guard_sha256": "2e898488b42ef2d6885c79a124d3deef5cc17086f5b8846e75833145a75dd27d", + "worker": "git-warp-tests", + "image": "sha256:9f145953f6e79a59749a683d11a476133cb7cef0588b79256dc195b1d0c87ad7", + "source_base": "88a298dd7a956394a11d530728b47f31b3a48ef1", + "source_archive_sha256": "6fbfb06d062c6dba99ed41892af08aaafc51955971af65bb42a537d8247dfcc4", + "source_archive_bytes": 21227520, + "baseline_inputs": {}, + "command": [ + "python3", + "scripts/check-cli-launcher.py" + ], + "lock_store": "workstation.git", + "lock_keys": [ + "host/docker/git-warp-tests/" + ], + "outputs": [ + "build volume /app", + "runtime /data", + "bounded /tmp and and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 722047492096, + "host_receipt_bytes": 7889777, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 687287660544, + "initial_build_bytes": 1958318080 +} diff --git a/test/evidence/984-cli-launcher/launcher-boundaries-984-v1-resources.json b/test/evidence/984-cli-launcher/launcher-boundaries-984-v1-resources.json new file mode 100644 index 000000000..99dd4eb8f --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-boundaries-984-v1-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 0, + "guard_error": null, + "peaks": { + "pids": 27, + "build_bytes": 1961742336, + "/data": 1748992, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 2129920, + "minimum_vm_free_bytes": 686213918720 + }, + "stdout_bytes": 254, + "timeout_seconds": 1700, + "measurement_pauses": 5, + "measurement_pause_seconds": 0.45251317601650953, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v1-console.txt.gz b/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v1-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..84486e7d3fa7aec3e3854a2546709c7c9c549817 GIT binary patch literal 362 zcmV-w0hRtAiwFP!00002|D};%OCvE9#oy;sT>8=(Xr_O3VHFW(wQ9lbN?Qe=mYBKL z*i16sn-u%)_palzENnsWC6^lxzjIEqolMHfL3xmkN99p@lwDW1^Ruhz;^(&?xAXIA zaSyFF8>|(hLlbTAisc4bXJ>?q2Pp`76F35)K_9_r=fG)> z#c>93VI4wmsM~hfQh1i=LpEgF$V2mlW+OGu~-i2~&fGK+ta{d<25AJ3Wn0thw8 IONs&j01#}eD*ylh literal 0 HcmV?d00001 diff --git a/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v1-launch.json b/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v1-launch.json new file mode 100644 index 000000000..ee7e0ca52 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v1-launch.json @@ -0,0 +1,40 @@ +{ + "phase": "launcher-boundaries-coverage-984-v1", + "inner_guard_sha256": "2e898488b42ef2d6885c79a124d3deef5cc17086f5b8846e75833145a75dd27d", + "worker": "git-warp-tests", + "image": "sha256:9f145953f6e79a59749a683d11a476133cb7cef0588b79256dc195b1d0c87ad7", + "source_base": "88a298dd7a956394a11d530728b47f31b3a48ef1", + "source_archive_sha256": "65dbbfee64122028a4118efe619df7e51d3cb5186ddef5cbe314ec5b231e5f4f", + "source_archive_bytes": 21237760, + "baseline_inputs": {}, + "command": [ + "python3", + "scripts/check-cli-launcher.py" + ], + "lock_store": "workstation.git", + "lock_keys": [ + "host/docker/git-warp-tests/" + ], + "outputs": [ + "build volume /app", + "runtime /data", + "bounded /tmp and and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 720738865152, + "host_receipt_bytes": 7903159, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 684954284032, + "initial_build_bytes": 2141351936 +} diff --git a/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v1-resources.json b/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v1-resources.json new file mode 100644 index 000000000..ee14a7ac2 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v1-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 1, + "guard_error": null, + "peaks": { + "pids": 27, + "build_bytes": 2144432128, + "/data": 1748992, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 2129920, + "minimum_vm_free_bytes": 684954284032 + }, + "stdout_bytes": 650, + "timeout_seconds": 1700, + "measurement_pauses": 4, + "measurement_pause_seconds": 0.340936248016078, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v2-console.txt.gz b/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v2-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..4effbbb4c095998860a12609350bd1a4186907fc GIT binary patch literal 421 zcmV;W0b2eaiwFP!00002|D{r0Yui8&eAlm7@)8MrvL#!_3MHVnY8ptLB0GV$6mvOk z+^bJ_>V25z-*;`Ll$II_eYyQ$nAsU_pXX^lO{Y;dNz1g1ZmPTGtG9Ktd3k%cd|fpk zpyy(TEpw<)cxg0qv_Z$X-R_z57J28Wav!KXbxP_TysuWPzfd_7tiWGXr*NHgPUt@{ zfIV8iMX+4cD;)%l-%$jQ?RoMa7G~Me!Sm6B0WKXvAE~W1Htx_l(odq__ZRT* PcSb(|04Y+<>jD4(*S^Yy literal 0 HcmV?d00001 diff --git a/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v2-launch.json b/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v2-launch.json new file mode 100644 index 000000000..b8e42b048 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v2-launch.json @@ -0,0 +1,40 @@ +{ + "phase": "launcher-boundaries-coverage-984-v2", + "inner_guard_sha256": "2e898488b42ef2d6885c79a124d3deef5cc17086f5b8846e75833145a75dd27d", + "worker": "git-warp-tests", + "image": "sha256:9f145953f6e79a59749a683d11a476133cb7cef0588b79256dc195b1d0c87ad7", + "source_base": "88a298dd7a956394a11d530728b47f31b3a48ef1", + "source_archive_sha256": "867bd2e44f073558e4c2dc3586689b4849ce589b3ff0807f9c53bf7bc73e2550", + "source_archive_bytes": 21237760, + "baseline_inputs": {}, + "command": [ + "python3", + "scripts/check-cli-launcher.py" + ], + "lock_store": "workstation.git", + "lock_keys": [ + "host/docker/git-warp-tests/" + ], + "outputs": [ + "build volume /app", + "runtime /data", + "bounded /tmp and and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 720721010688, + "host_receipt_bytes": 7905959, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 685021474816, + "initial_build_bytes": 2141351936 +} diff --git a/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v2-resources.json b/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v2-resources.json new file mode 100644 index 000000000..ac54a7987 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v2-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 1, + "guard_error": null, + "peaks": { + "pids": 27, + "build_bytes": 2144763904, + "/data": 1748992, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 2129920, + "minimum_vm_free_bytes": 685021474816 + }, + "stdout_bytes": 747, + "timeout_seconds": 1700, + "measurement_pauses": 4, + "measurement_pause_seconds": 0.33832516212714836, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v3-console.txt.gz b/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v3-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..7e326f6593eac5ab5de5609997db9eb0623901ea GIT binary patch literal 217 zcmV;~04Dz*iwFP!00002|8tuD8=4qZ(MOSYgu~83)t}ct_MO?MHP!CLw%xp&w z92a8H)A and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 720768794624, + "host_receipt_bytes": 7908858, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 685021437952, + "initial_build_bytes": 2141351936 +} diff --git a/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v3-resources.json b/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v3-resources.json new file mode 100644 index 000000000..472a3c64e --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-boundaries-coverage-984-v3-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 0, + "guard_error": null, + "peaks": { + "pids": 27, + "build_bytes": 2142687232, + "/data": 1748992, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 2129920, + "minimum_vm_free_bytes": 685021437952 + }, + "stdout_bytes": 338, + "timeout_seconds": 1700, + "measurement_pauses": 4, + "measurement_pause_seconds": 0.33260641002561897, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/launcher-green-984-v1-console.txt.gz b/test/evidence/984-cli-launcher/launcher-green-984-v1-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..39b6643a4c5969cacdc1e8fe1e0eea365c8de038 GIT binary patch literal 329 zcmV-P0k-}hiwFP!00002|Gm=BPr@)12k`s;ig)9*{@%toxeyW$MhU}{7*e(hldTJqsW!5lz&y+I0H82UYn5}V zgw4q-H-SXNlySh2#H6o2)9KICzX<@&qJ+kx4{=V;DW$!wzQ^ZE6WS*ziAZplJ>E}m zXN&bT%V)4tbqm^*YVEwV-T?*mUU?wURCQfBRTy3N-EoXko&@v7!*rJC>wK9lmN`6) z7$++q)0M}i^b-4~#kK5ou~Rl3i||17?%)%F`)gd+D2u<|YE0SH%Hf-BINX#$9DMNyZ0kNQ06~8*8!xvfAomGEw3p5^LN8+mNPVcoj b>LD?`{2L4r!Uo83^v~oEanUNeTLS<9mY1e= literal 0 HcmV?d00001 diff --git a/test/evidence/984-cli-launcher/launcher-green-984-v1-launch.json b/test/evidence/984-cli-launcher/launcher-green-984-v1-launch.json new file mode 100644 index 000000000..615e35347 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-green-984-v1-launch.json @@ -0,0 +1,41 @@ +{ + "phase": "launcher-green-984-v1", + "inner_guard_sha256": "2e898488b42ef2d6885c79a124d3deef5cc17086f5b8846e75833145a75dd27d", + "worker": "git-warp-tests", + "image": "sha256:9f145953f6e79a59749a683d11a476133cb7cef0588b79256dc195b1d0c87ad7", + "source_base": "88a298dd7a956394a11d530728b47f31b3a48ef1", + "source_archive_sha256": "1b295b5a3376fb7cda8b4fe4caa7e79f948b86a1f339aeaa5fd432dad08f6078", + "source_archive_bytes": 21227520, + "baseline_inputs": {}, + "command": [ + "python3", + "-c", + "from pathlib import Path\nimport subprocess,os,tempfile,shutil,time\nroot=Path.cwd(); work=Path(tempfile.mkdtemp(prefix=\"launcher984-\",dir=os.environ[\"TMPDIR\"]))\ntry:\n pack=work/\"pack\";pack.mkdir();consumer=work/\"consumer\";consumer.mkdir()\n subprocess.run([\"node\",\"scripts/package-payload/CheckPackagePayload.ts\",\"--pack-destination\",str(pack)],check=True)\n subprocess.run([\"npm\",\"init\",\"-y\"],cwd=consumer,check=True,stdout=subprocess.DEVNULL)\n artifact=next(pack.glob(\"*.tgz\"))\n subprocess.run([\"npm\",\"install\",\"--ignore-scripts\",\"--no-audit\",\"--no-fund\",\"--fetch-retries=0\",\"--fetch-timeout=15000\",str(artifact)],cwd=consumer,check=True,stdout=subprocess.DEVNULL)\n preload=work/\"trace.cjs\"\n preload.write_text(\"const fs=require('node:fs');const p=require('node:process');if(p.env.WARP_CLI_START_TRACE)fs.appendFileSync(p.env.WARP_CLI_START_TRACE,[p.pid,p.ppid,p.argv[1]??''].join(String.fromCharCode(9))+String.fromCharCode(10));\")\n wrapper=consumer/\"node_modules/@git-stunts/git-warp/bin/git-warp\"\n failed=False\n for name,args in [(\"help\",[\"--help\"]),(\"doctor\",[\"doctor\",\"--repo\",str(consumer)]),(\"json-failure\",[\"doctor\",\"--repo\",str(work/\"missing\"),\"--json\"]),(\"unknown\",[\"no-such-command\"])] :\n trace=work/(name+\".tsv\");env=os.environ.copy();env[\"NODE_OPTIONS\"]=\"--require=\"+str(preload);env[\"WARP_CLI_START_TRACE\"]=str(trace)\n started=time.monotonic();result=subprocess.run([\"node\",str(wrapper),*args],cwd=consumer,env=env,capture_output=True,text=True,timeout=30)\n rows=trace.read_text().splitlines();print(\"LAUNCHER_CASE\",name,\"node_starts\",len(rows),\"exit\",result.returncode,\"milliseconds\",round((time.monotonic()-started)*1000,3),flush=True)\n print(\"PROCESS_STARTS\",repr(rows),flush=True)\n if len(rows)!=1:failed=True\n if failed:raise SystemExit(1)\nfinally:shutil.rmtree(work)\n" + ], + "lock_store": "workstation.git", + "lock_keys": [ + "host/docker/git-warp-tests/" + ], + "outputs": [ + "build volume /app", + "runtime /data", + "bounded /tmp and and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 723080921088, + "host_receipt_bytes": 7884899, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 687221477376, + "initial_build_bytes": 1957478400 +} diff --git a/test/evidence/984-cli-launcher/launcher-green-984-v1-resources.json b/test/evidence/984-cli-launcher/launcher-green-984-v1-resources.json new file mode 100644 index 000000000..6a08ef119 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-green-984-v1-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 0, + "guard_error": null, + "peaks": { + "pids": 23, + "build_bytes": 1960960000, + "/data": 50597888, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 50978816, + "minimum_vm_free_bytes": 687221477376 + }, + "stdout_bytes": 859, + "timeout_seconds": 1700, + "measurement_pauses": 6, + "measurement_pause_seconds": 0.45749140600673854, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/launcher-mcp-startup-984-v1-console.txt.gz b/test/evidence/984-cli-launcher/launcher-mcp-startup-984-v1-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..6ed08eec461558335cad5e835cc78fa57a5b0003 GIT binary patch literal 684 zcmV;d0#p4TiwFP!00002|AkcBZrd;nea~0u15#BIMP0flFYwj?ZDPbJHee_W)t1+w zxfpS}p?^Qh&eA<>n4gHF!z1#L@(-oB0uB=?xaWS-h599Yk5^rI+a5x5!-}jdCydpH zU3ZLq9~<`cc8dKCv)V`n?3!64=p)YSK4rf%7z2e?8ciesac0H+>9`q>&!4xF7*e2^ zWV7`{c30icimIG{UQjr@%dhTvtd_I9EUR*zt=10( zdkTHrZuXJ&Vb^VA&y-*tifWf4!=03fmUSKn!~+*nIqeDYBVxJGUR%SC;b%g=N$q=7K|mQr1RVgr%iI%B^R8r$tlwD8ZElfHKCD?60SH|sg0WcQBdL_ zx5{7&ohH~gaOV;X`90vYD+;uN@mc}WSUuuorVwT{pG-{iPt|xD=&%c5czP8;@q5#c zle3f6$E?in=8L@gvdW4gUsdI8rqHk&y`svLZ$lm05F2Q9Yoo4dnWAh(gDr^ESQMs- z04j>cdM#@2(1Vkg3uepvB3sSN<)SKQ%OYnjJ?rPI?s%x_dDA=JHf(WdXp*OJJiT@w zSi7NtzV)ZLyKZ6^_f6c_Z#44ynMlv!7@H~EA5JU`$yd#$e_@9s{S7uh;;|1~wxz`w SQnq2UoBRUNY_I5Y1ONcJ6;7Q1 literal 0 HcmV?d00001 diff --git a/test/evidence/984-cli-launcher/launcher-mcp-startup-984-v1-launch.json b/test/evidence/984-cli-launcher/launcher-mcp-startup-984-v1-launch.json new file mode 100644 index 000000000..43d129d97 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-mcp-startup-984-v1-launch.json @@ -0,0 +1,40 @@ +{ + "phase": "launcher-mcp-startup-984-v1", + "inner_guard_sha256": "2e898488b42ef2d6885c79a124d3deef5cc17086f5b8846e75833145a75dd27d", + "worker": "git-warp-tests", + "image": "sha256:9f145953f6e79a59749a683d11a476133cb7cef0588b79256dc195b1d0c87ad7", + "source_base": "88a298dd7a956394a11d530728b47f31b3a48ef1", + "source_archive_sha256": "0cba2cf8f06fbccfd0179390af911d703701f77c1af5ebeb9747f2d68202fac2", + "source_archive_bytes": 21237760, + "baseline_inputs": {}, + "command": [ + "python3", + "scripts/check-cli-startup.py" + ], + "lock_store": "workstation.git", + "lock_keys": [ + "host/docker/git-warp-tests/" + ], + "outputs": [ + "build volume /app", + "runtime /data", + "bounded /tmp and and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 720689848320, + "host_receipt_bytes": 7899876, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 684954308608, + "initial_build_bytes": 2141343744 +} diff --git a/test/evidence/984-cli-launcher/launcher-mcp-startup-984-v1-resources.json b/test/evidence/984-cli-launcher/launcher-mcp-startup-984-v1-resources.json new file mode 100644 index 000000000..ae4d05e20 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-mcp-startup-984-v1-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 0, + "guard_error": null, + "peaks": { + "pids": 27, + "build_bytes": 2144759808, + "/data": 50761728, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 51134464, + "minimum_vm_free_bytes": 684954308608 + }, + "stdout_bytes": 1138, + "timeout_seconds": 1700, + "measurement_pauses": 9, + "measurement_pause_seconds": 0.7848247510264628, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/launcher-min-node-984-v1-console.txt.gz b/test/evidence/984-cli-launcher/launcher-min-node-984-v1-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..b895719996433ffa4d60c46a900516e7da7c96e3 GIT binary patch literal 366 zcmV-!0g?V6iwFP!00002|K*ciZ-OushVPsBAI{A#>Duxo+z}z0QPfOLcGobi3z-5z zB)VU}!$%OaCG%o;YZ}fQ`u6GJB`t-ZLZ>?6j5^dI01vQAi)ar}$rrUzajCW_Uw10s z0(hm$qjv?%OyO&QReVs;tF0KF@?0eaf!~I|Pb1{4v!-^3BR?rB!&L1GXpSQT09Nl} z-Q%0=6-{&N`GcqpHBOk+4F3q{3_DyS`7K#6s)rqwxeO=2iVj!%2Ap->_2eziyc1`J z|LoURiGgk#!zR2|_QSIrZr_1JpJk9F-72lb%fcwr_HlALYf*l%3|d4vJ%73|pOAK$ zWYOjWbJVivQhm7#3vao^xHjn_%hmCS;l5o8b#%ctEG~3-1lwXb&~r+v-B$-TE=-$S z2AXu8wJyvrkDKLoI5tNIXC@=zcs35#p`6YAKnfw5TzI2N;LGP=x{%(?m+PhX6v(=( MFFtK^H2?$v0FyVZLI3~& literal 0 HcmV?d00001 diff --git a/test/evidence/984-cli-launcher/launcher-min-node-984-v1-launch.json b/test/evidence/984-cli-launcher/launcher-min-node-984-v1-launch.json new file mode 100644 index 000000000..041a6a5d0 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-min-node-984-v1-launch.json @@ -0,0 +1,41 @@ +{ + "phase": "launcher-min-node-984-v1", + "inner_guard_sha256": "2e898488b42ef2d6885c79a124d3deef5cc17086f5b8846e75833145a75dd27d", + "worker": "git-warp-tests", + "image": "sha256:9f145953f6e79a59749a683d11a476133cb7cef0588b79256dc195b1d0c87ad7", + "source_base": "88a298dd7a956394a11d530728b47f31b3a48ef1", + "source_archive_sha256": "2ab0112d903f494ddbc1ea7e1d497bd87bd1ca254f71f9d7d16d242a0dfcf1ad", + "source_archive_bytes": 21227520, + "baseline_inputs": {}, + "command": [ + "bash", + "-c", + "set -eu; tool=/app/toolchain/node22-min; if [ ! -x \"$tool/bin/node\" ]; then work=$(mktemp -d /data/tmp/node22-min.XXXXXX); trap 'rm -rf \"$work\"' EXIT; cd \"$work\"; curl --fail --location --connect-timeout 10 --max-time 120 -o node-v22.0.0-linux-arm64.tar.xz https://nodejs.org/dist/v22.0.0/node-v22.0.0-linux-arm64.tar.xz; curl --fail --location --connect-timeout 10 --max-time 30 -o SHASUMS256.txt https://nodejs.org/dist/v22.0.0/SHASUMS256.txt; grep \" node-v22.0.0-linux-arm64.tar.xz$\" SHASUMS256.txt | sha256sum --check; mkdir -p \"$tool\"; tar -xJf node-v22.0.0-linux-arm64.tar.xz --strip-components=1 -C \"$tool\"; fi; cd /app/project; \"$tool/bin/node\" --version; work=$(mktemp -d /data/tmp/launcher-min.XXXXXX); trap 'rm -rf \"$work\"' EXIT; mkdir \"$work/pack\" \"$work/consumer\"; node scripts/package-payload/CheckPackagePayload.ts --pack-destination \"$work/pack\"; cd \"$work/consumer\"; npm init -y >/dev/null; npm install --ignore-scripts --no-audit --no-fund --fetch-retries=0 --fetch-timeout=15000 \"$work\"/pack/*.tgz >/dev/null; \"$tool/bin/node\" node_modules/@git-stunts/git-warp/bin/git-warp --help >/dev/null; set +e; \"$tool/bin/node\" node_modules/@git-stunts/git-warp/bin/git-warp no-such-command >unknown.out 2>unknown.err; status=$?; set -e; test \"$status\" -eq 1; echo \"MINIMUM_NODE_22_0_PACKED_HELP_AND_USAGE_PASS\"" + ], + "lock_store": "workstation.git", + "lock_keys": [ + "host/docker/git-warp-tests/" + ], + "outputs": [ + "build volume /app", + "runtime /data", + "bounded /tmp and and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 720904200192, + "host_receipt_bytes": 7892174, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 685140197376, + "initial_build_bytes": 1958330368 +} diff --git a/test/evidence/984-cli-launcher/launcher-min-node-984-v1-resources.json b/test/evidence/984-cli-launcher/launcher-min-node-984-v1-resources.json new file mode 100644 index 000000000..73041c0fc --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-min-node-984-v1-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 0, + "guard_error": null, + "peaks": { + "pids": 23, + "build_bytes": 2141323264, + "/data": 77344768, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 77725696, + "minimum_vm_free_bytes": 685140197376 + }, + "stdout_bytes": 1024, + "timeout_seconds": 1700, + "measurement_pauses": 8, + "measurement_pause_seconds": 0.6837658649892546, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/launcher-startup-984-v1-console.txt.gz b/test/evidence/984-cli-launcher/launcher-startup-984-v1-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..ecf86ada77e61e26b39989af7474ae973b2f3aa3 GIT binary patch literal 638 zcmV-^0)hP>iwFP!00002|8-N#ZreZ%y!$Km1MJO`+-G`n0~ZO<#)g%mhawO*(yB4y zhafpA{P*Qbu9HKn6HU(y$szX*Q6fp2fRaImNgJz|_$$rYc-kIfeJxh=qL>I#9d>P( z`aad->2yr}wQ$-3lDHDiD*hPry3g!)gb;+rfz=EmQfE}!AG^)?_xTGB7y-(t$(Qw_ zxGh)f<;|if%HmnJ64&?nS?6!~-e) z!Bs1Xyn=I+!H1zS@LD1-iE@({TFyHejA76id*zK8TqSAQCvxN93PF<{hc%$wpczo+ zNDn&s2GDzxZ#Ztjv@}^S-t6B#G&ICym?Dq YAGc!5moZSbakHEJ0on_)5+(!y06s)Gw*UYD literal 0 HcmV?d00001 diff --git a/test/evidence/984-cli-launcher/launcher-startup-984-v1-launch.json b/test/evidence/984-cli-launcher/launcher-startup-984-v1-launch.json new file mode 100644 index 000000000..a3df1d584 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-startup-984-v1-launch.json @@ -0,0 +1,40 @@ +{ + "phase": "launcher-startup-984-v1", + "inner_guard_sha256": "2e898488b42ef2d6885c79a124d3deef5cc17086f5b8846e75833145a75dd27d", + "worker": "git-warp-tests", + "image": "sha256:9f145953f6e79a59749a683d11a476133cb7cef0588b79256dc195b1d0c87ad7", + "source_base": "88a298dd7a956394a11d530728b47f31b3a48ef1", + "source_archive_sha256": "79a75451617751ce3137ed439d84545b9ebadaa167b4599b6d302c1a48b24062", + "source_archive_bytes": 21237760, + "baseline_inputs": {}, + "command": [ + "python3", + "scripts/check-cli-startup.py" + ], + "lock_store": "workstation.git", + "lock_keys": [ + "host/docker/git-warp-tests/" + ], + "outputs": [ + "build volume /app", + "runtime /data", + "bounded /tmp and and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 720687865856, + "host_receipt_bytes": 7896673, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 684954333184, + "initial_build_bytes": 2141323264 +} diff --git a/test/evidence/984-cli-launcher/launcher-startup-984-v1-resources.json b/test/evidence/984-cli-launcher/launcher-startup-984-v1-resources.json new file mode 100644 index 000000000..93b04b1e4 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-startup-984-v1-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 0, + "guard_error": null, + "peaks": { + "pids": 27, + "build_bytes": 2145263616, + "/data": 50589696, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 50970624, + "minimum_vm_free_bytes": 684954333184 + }, + "stdout_bytes": 1062, + "timeout_seconds": 1700, + "measurement_pauses": 9, + "measurement_pause_seconds": 0.7654659640975296, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/manifest.json b/test/evidence/984-cli-launcher/manifest.json index 2ec933d79..5f5f9ccd8 100644 --- a/test/evidence/984-cli-launcher/manifest.json +++ b/test/evidence/984-cli-launcher/manifest.json @@ -50,5 +50,213 @@ "original_sha256": "0000875d118f820d32e6b02d5cab8acf3c5f85e9291240a7e57813b1970d167d", "public_sha256": "471f4bac418c9da1257bc2e06812a18c11eab551fa3157585f26f7be23ab2a98", "normalization": "container home replaced with " + }, + { + "phase": "launcher-green-984-v1", + "file": "launcher-green-984-v1-console.txt.gz", + "source_name": "console.log", + "original_sha256": "3e01f6380a6faaf456d9b20c1a73b5e67603175f0b11a29617571c118252f81f", + "public_sha256": "3e01f6380a6faaf456d9b20c1a73b5e67603175f0b11a29617571c118252f81f", + "normalization": "none", + "archive_sha256": "bf82bb5f3f6b24a50dd8e9a2ddd8ef9effe28187cdfb1271a93aa3101547d3b8", + "public_hash_scope": "uncompressed public payload" + }, + { + "phase": "launcher-green-984-v1", + "file": "launcher-green-984-v1-launch.json", + "source_name": "launch.json", + "original_sha256": "891bc3aabf761da19a5e968bcf495daa1a3fd6e552f3e2282b5b7f62b957648f", + "public_sha256": "e3d88ae8aa48aa15f561f3c8f61ff29e29e642aff7e260ee27b09de0a472a083", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-green-984-v1", + "file": "launcher-green-984-v1-resources.json", + "source_name": "resources.json", + "original_sha256": "b6bc46f9eec7048feed5021da6fc8b54da1560013bb1c87e9b5bab4477a431b3", + "public_sha256": "a409cf0a2e26aba456f111995387d49c8640d6a5f9ffa609e3d5b366d615b2a4", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-boundaries-984-v1", + "file": "launcher-boundaries-984-v1-console.txt.gz", + "source_name": "console.log", + "original_sha256": "41c5d63a86c72a7d29b1f43f1777e52875a6fa3a8559c2e71a2d8ce3b213318d", + "public_sha256": "41c5d63a86c72a7d29b1f43f1777e52875a6fa3a8559c2e71a2d8ce3b213318d", + "normalization": "none", + "archive_sha256": "f58012360838ee7b2392c30281f74555780332da186c38eb4b6a21c96ade6ab3", + "public_hash_scope": "uncompressed public payload" + }, + { + "phase": "launcher-boundaries-984-v1", + "file": "launcher-boundaries-984-v1-launch.json", + "source_name": "launch.json", + "original_sha256": "ff6870b008ab20fa71f6493e62ec5d9b2f1dd06aec74ad030baf3dc92cb0abca", + "public_sha256": "3009b23dbd94437a567bdac397041f2a298178ba158ff6831cbe7f6e284ca66c", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-boundaries-984-v1", + "file": "launcher-boundaries-984-v1-resources.json", + "source_name": "resources.json", + "original_sha256": "e0bb4963675a91c2f823b0f98959ee0d4481935220381c2853520867b531caac", + "public_sha256": "68a959eba19db3d3e3df3daddaa6971c05e0938ec012d5df37f05c06b6313166", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-min-node-984-v1", + "file": "launcher-min-node-984-v1-console.txt.gz", + "source_name": "console.log", + "original_sha256": "1e8bf35b3c7cf42ca74709d82dca5afe0c8a93ad2ab2df381816691e1761c7db", + "public_sha256": "1e8bf35b3c7cf42ca74709d82dca5afe0c8a93ad2ab2df381816691e1761c7db", + "normalization": "none", + "archive_sha256": "eacc34f02a3572eea108e10014f75f7832f67ed9c2edc4eeec7885d04a65bdb6", + "public_hash_scope": "uncompressed public payload" + }, + { + "phase": "launcher-min-node-984-v1", + "file": "launcher-min-node-984-v1-launch.json", + "source_name": "launch.json", + "original_sha256": "0f59db215169b05cb9cabfa28b2267a615e9dbe9e6567cedf1fba1a5721794cb", + "public_sha256": "7277ab6fa01910ac111950a11f3906fe05d47c0e9651854eb3102335766ecd9e", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-min-node-984-v1", + "file": "launcher-min-node-984-v1-resources.json", + "source_name": "resources.json", + "original_sha256": "8e14295c47ee804620aa97d32eeddafa59074f2949375ffd7b434a39ac018970", + "public_sha256": "56d737d3f83d4805f332b95b0d628fc0383f78c3d586cdd433dff7acd254306f", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-startup-984-v1", + "file": "launcher-startup-984-v1-console.txt.gz", + "source_name": "console.log", + "original_sha256": "f85dd99657ecf7cc5156944f20dee6a990c53289be461a59f0b0810ce7075636", + "public_sha256": "f85dd99657ecf7cc5156944f20dee6a990c53289be461a59f0b0810ce7075636", + "normalization": "none", + "archive_sha256": "2a3616eaa884ba77ed927b6e14a8719ed1cf0d5bea99848605029978105a80c4", + "public_hash_scope": "uncompressed public payload" + }, + { + "phase": "launcher-startup-984-v1", + "file": "launcher-startup-984-v1-launch.json", + "source_name": "launch.json", + "original_sha256": "5759731923c46e7deac1869b02edceb936d1665bd6e5f78b984945ce3436322b", + "public_sha256": "d9e11eacd29d48e9a6084874ffa5980c4818ca8e79aacef9b19de276173a7bfa", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-startup-984-v1", + "file": "launcher-startup-984-v1-resources.json", + "source_name": "resources.json", + "original_sha256": "60bc4852ec33de592667a309046795caeaeff35f484ec37dd06496d93f405bb1", + "public_sha256": "77cc9a058442957b6d2d09697a7e3fbb8f4d9161ca22bb971c19af8c85cabbe3", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-mcp-startup-984-v1", + "file": "launcher-mcp-startup-984-v1-console.txt.gz", + "source_name": "console.log", + "original_sha256": "19d362111f5a991f1efaa1e884a6eead5089d179b652e165391fa0f3e816efca", + "public_sha256": "19d362111f5a991f1efaa1e884a6eead5089d179b652e165391fa0f3e816efca", + "normalization": "none", + "archive_sha256": "029576f47f5a7f75e268082f7eacea5ee5265978959fb92b3db11490b0780019", + "public_hash_scope": "uncompressed public payload" + }, + { + "phase": "launcher-mcp-startup-984-v1", + "file": "launcher-mcp-startup-984-v1-launch.json", + "source_name": "launch.json", + "original_sha256": "a7a4a7a5108d29e332723fb2e3bac65837f118bcd46b9398f872db6e9c5c0af4", + "public_sha256": "2fd3c5579e82a4ab5e8e3fba4441d8ddaf6591700d3ce47d6a31849f61a553a5", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-mcp-startup-984-v1", + "file": "launcher-mcp-startup-984-v1-resources.json", + "source_name": "resources.json", + "original_sha256": "a1624f289cdf30ce912fc2b326694c9aad6fab2fc3dd09930df69ba6962116cb", + "public_sha256": "60a51eefec82984f76ac453250fb725375d70f72d2991242220a851e968f8475", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-boundaries-coverage-984-v1", + "file": "launcher-boundaries-coverage-984-v1-console.txt.gz", + "source_name": "console.log", + "original_sha256": "84e74a1847e9b77b313dea461631d6c2f12f3fa1a632ec39964849f6bf6cb964", + "public_sha256": "84e74a1847e9b77b313dea461631d6c2f12f3fa1a632ec39964849f6bf6cb964", + "normalization": "none", + "archive_sha256": "ee590d29926cdfba4658d64aa2a25bbaa68c640f2f59a77ddb25e064bbc69108", + "public_hash_scope": "uncompressed public payload" + }, + { + "phase": "launcher-boundaries-coverage-984-v1", + "file": "launcher-boundaries-coverage-984-v1-launch.json", + "source_name": "launch.json", + "original_sha256": "96b47e210ea697fb6cc376d9b8ca74d01fa5d5d15559a68a3ca46b6c92f06cc0", + "public_sha256": "32b83f9a1c96c241133da7183bdb9382171e5d02c6ba6d931f755bee9b6f4d75", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-boundaries-coverage-984-v1", + "file": "launcher-boundaries-coverage-984-v1-resources.json", + "source_name": "resources.json", + "original_sha256": "7970aa8ce66d4678ca4d80717a2fc8a8e42201e42af30c382f1bc73aa3b24856", + "public_sha256": "492b4c8d15995dbfe5dabb61888d8ad570f932a18892811f0ea98778deeed0ed", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-boundaries-coverage-984-v2", + "file": "launcher-boundaries-coverage-984-v2-console.txt.gz", + "source_name": "console.log", + "original_sha256": "a0379c7560818f9a5c65255000f4e77a9ac0cf5bf3e2efdde20add67bc31ea97", + "public_sha256": "a0379c7560818f9a5c65255000f4e77a9ac0cf5bf3e2efdde20add67bc31ea97", + "normalization": "none", + "archive_sha256": "437bf2fe21237a5e3e93966c3fe693f3c6d7d78e9091d6e9eb6fbcf534b84724", + "public_hash_scope": "uncompressed public payload" + }, + { + "phase": "launcher-boundaries-coverage-984-v2", + "file": "launcher-boundaries-coverage-984-v2-launch.json", + "source_name": "launch.json", + "original_sha256": "4078e208ac92c91c18ad2c4a41f2c2ec68db939a4df07b1a7e08d5774669a01c", + "public_sha256": "87a84ff4f3f335469e1321ebe4378d34f004240df316a93befcd06b5c5fdded6", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-boundaries-coverage-984-v2", + "file": "launcher-boundaries-coverage-984-v2-resources.json", + "source_name": "resources.json", + "original_sha256": "1b78859e250ae24c80cf594a9c19f9af2c08c2fce95a69b40b373273f1197ebb", + "public_sha256": "2f6a6d53bc93585590d6384dc5b4e3f48b6bc239decf77242853b0dfdc2e8ff8", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-boundaries-coverage-984-v3", + "file": "launcher-boundaries-coverage-984-v3-console.txt.gz", + "source_name": "console.log", + "original_sha256": "b405e893ea713f390779e417e520f54f71cfb9a4eeb6d25f35a37455af4a6130", + "public_sha256": "b405e893ea713f390779e417e520f54f71cfb9a4eeb6d25f35a37455af4a6130", + "normalization": "none", + "archive_sha256": "ca75bf76101c76cb3dd96997936d6ea27626ea1f1082cf2cc0f830af48de0c47", + "public_hash_scope": "uncompressed public payload" + }, + { + "phase": "launcher-boundaries-coverage-984-v3", + "file": "launcher-boundaries-coverage-984-v3-launch.json", + "source_name": "launch.json", + "original_sha256": "2879b116e2a0b2f52961ac3a690ce5a759c186767f24789cecd0d0f89e933e39", + "public_sha256": "c52de580d43472923c906932a0ea6526943ebd0862138196600548dc83d92d1a", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-boundaries-coverage-984-v3", + "file": "launcher-boundaries-coverage-984-v3-resources.json", + "source_name": "resources.json", + "original_sha256": "3c371033151a58e50598541a626fb055c311ae730db58242df37e4dc754c4bf8", + "public_sha256": "f4bd3602cbba3d5a1c1a221f7f194d30ec7555fbe014b0a5301c7e2e6e44f1cf", + "normalization": "container home replaced with " } ] From e7ea6ba3c6ec6940ab8115eb070cd2854d5c39b4 Mon Sep 17 00:00:00 2001 From: James Ross Date: Wed, 7 Oct 2026 19:02:25 -0700 Subject: [PATCH 4/6] test(cli): keep single-process launcher regressions in Docker CI (#984) --- scripts/check-cli-launcher.py | 9 +- scripts/check-cli-process.py | 49 +++++ scripts/check-cli-startup.py | 6 +- test/bats/cli-launcher.bats | 19 ++ test/evidence/984-cli-launcher/README.md | 44 +++- .../followup-validation-manifest.json | 202 ++++++++++++++++++ .../launcher-bats-green-984-v1-console.txt.gz | Bin 0 -> 154 bytes .../launcher-bats-green-984-v1-launch.json | 40 ++++ .../launcher-bats-green-984-v1-resources.json | 32 +++ ...cher-cleanup-failure-984-v1-console.txt.gz | Bin 0 -> 225 bytes ...auncher-cleanup-failure-984-v1-launch.json | 41 ++++ ...cher-cleanup-failure-984-v1-resources.json | 32 +++ .../launcher-min-source-984-v1-console.txt.gz | Bin 0 -> 258 bytes .../launcher-min-source-984-v1-launch.json | 41 ++++ .../launcher-min-source-984-v1-resources.json | 32 +++ .../launcher-min-source-984-v2-console.txt.gz | Bin 0 -> 146 bytes .../launcher-min-source-984-v2-launch.json | 41 ++++ .../launcher-min-source-984-v2-resources.json | 32 +++ .../launcher-min-source-984-v3-console.txt.gz | Bin 0 -> 145 bytes .../launcher-min-source-984-v3-launch.json | 41 ++++ .../launcher-min-source-984-v3-resources.json | 32 +++ ...portable-process-red-984-v1-console.txt.gz | Bin 0 -> 272 bytes ...er-portable-process-red-984-v1-launch.json | 46 ++++ ...portable-process-red-984-v1-resources.json | 32 +++ ...cher-startup-cleanup-984-v1-console.txt.gz | Bin 0 -> 680 bytes ...auncher-startup-cleanup-984-v1-launch.json | 40 ++++ ...cher-startup-cleanup-984-v1-resources.json | 32 +++ .../packed-compat-984-v1-console.txt.gz | Bin 0 -> 418 bytes .../packed-compat-984-v1-launch.json | 41 ++++ .../packed-compat-984-v1-resources.json | 32 +++ 30 files changed, 900 insertions(+), 16 deletions(-) create mode 100644 scripts/check-cli-process.py create mode 100644 test/bats/cli-launcher.bats create mode 100644 test/evidence/984-cli-launcher/followup-validation-manifest.json create mode 100644 test/evidence/984-cli-launcher/launcher-bats-green-984-v1-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-bats-green-984-v1-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-bats-green-984-v1-resources.json create mode 100644 test/evidence/984-cli-launcher/launcher-cleanup-failure-984-v1-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-cleanup-failure-984-v1-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-cleanup-failure-984-v1-resources.json create mode 100644 test/evidence/984-cli-launcher/launcher-min-source-984-v1-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-min-source-984-v1-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-min-source-984-v1-resources.json create mode 100644 test/evidence/984-cli-launcher/launcher-min-source-984-v2-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-min-source-984-v2-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-min-source-984-v2-resources.json create mode 100644 test/evidence/984-cli-launcher/launcher-min-source-984-v3-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-min-source-984-v3-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-min-source-984-v3-resources.json create mode 100644 test/evidence/984-cli-launcher/launcher-portable-process-red-984-v1-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-portable-process-red-984-v1-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-portable-process-red-984-v1-resources.json create mode 100644 test/evidence/984-cli-launcher/launcher-startup-cleanup-984-v1-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-startup-cleanup-984-v1-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-startup-cleanup-984-v1-resources.json create mode 100644 test/evidence/984-cli-launcher/packed-compat-984-v1-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/packed-compat-984-v1-launch.json create mode 100644 test/evidence/984-cli-launcher/packed-compat-984-v1-resources.json diff --git a/scripts/check-cli-launcher.py b/scripts/check-cli-launcher.py index 493b4a401..bed66e6da 100644 --- a/scripts/check-cli-launcher.py +++ b/scripts/check-cli-launcher.py @@ -6,7 +6,6 @@ import signal import subprocess import tempfile -import time if not Path('/.dockerenv').exists(): raise SystemExit('CLI launcher tests require Docker') @@ -92,9 +91,13 @@ def require(condition, message): output, error = process.communicate(timeout=TIMEOUT) require(process.returncode == 0 and marker.read_text() == stop.name and error == '', 'signal was not delivered to selected entry or cleanup failed') finally: - if process.poll() is None: + # A wrapper may die before its child. Reap the whole owned group + # even when the parent already has an exit status. + try: os.killpg(process.pid, signal.SIGKILL) - process.wait(timeout=5) + except ProcessLookupError: + pass + process.wait(timeout=5) print('LAUNCHER_BOUNDARY SIGINT-SIGTERM-cleanup PASS', flush=True) import json reports = [] diff --git a/scripts/check-cli-process.py b/scripts/check-cli-process.py new file mode 100644 index 000000000..e2efc3850 --- /dev/null +++ b/scripts/check-cli-process.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +"""Count native Node starts from the real installed CLI; COPY Docker only.""" +from pathlib import Path +import os +import shutil +import subprocess +import tempfile + +if not Path('/.dockerenv').exists(): + raise SystemExit('CLI process tests require Docker') +ROOT = Path.cwd() +WORK = Path(tempfile.mkdtemp(prefix='cli-process-', dir=os.environ['TMPDIR'])) +TIMEOUT = 30 + +try: + pack = WORK / 'pack' + consumer = WORK / 'consumer' + pack.mkdir() + consumer.mkdir() + subprocess.run(['node', 'scripts/package-payload/CheckPackagePayload.ts', '--pack-destination', str(pack)], check=True, timeout=TIMEOUT) + subprocess.run(['npm', 'init', '-y'], cwd=consumer, stdout=subprocess.DEVNULL, check=True, timeout=TIMEOUT) + subprocess.run(['npm', 'install', '--ignore-scripts', '--no-audit', '--no-fund', '--fetch-retries=0', '--fetch-timeout=15000', str(next(pack.glob('*.tgz')))], cwd=consumer, stdout=subprocess.DEVNULL, check=True, timeout=TIMEOUT) + preload = WORK / 'trace.cjs' + preload.write_text("const fs=require('node:fs');const p=require('node:process');fs.appendFileSync(p.env.WARP_CLI_START_TRACE,[p.pid,p.ppid,p.argv[1]??''].join(String.fromCharCode(9))+String.fromCharCode(10));") + wrapper = consumer / 'node_modules/@git-stunts/git-warp/bin/git-warp' + cases = [ + ('help', ['--help'], 0), + ('doctor', ['doctor', '--repo', str(consumer)], 3), + ('json-failure', ['doctor', '--repo', str(WORK / 'missing'), '--json'], 3), + ('unknown', ['no-such-command'], 1), + ] + for name, arguments, expected in cases: + trace = WORK / (name + '.tsv') + environment = os.environ.copy() + environment['NODE_OPTIONS'] = '--require=' + str(preload) + environment['WARP_CLI_START_TRACE'] = str(trace) + result = subprocess.run(['node', str(wrapper), *arguments], cwd=consumer, env=environment, capture_output=True, text=True, timeout=TIMEOUT) + rows = trace.read_text().splitlines() + print('INSTALLED_CLI_PROCESS', name, 'node_starts', len(rows), 'exit', result.returncode, flush=True) + if len(rows) != 1 or result.returncode != expected: + raise AssertionError('Installed CLI process count or exit status changed: ' + name) + if name == 'help' and (not result.stdout or result.stderr): + raise AssertionError('Help streams changed') + if name == 'json-failure' and (not result.stdout.startswith('{') or result.stderr): + raise AssertionError('JSON failure streams changed') + if name == 'unknown' and (result.stdout or 'Unknown command' not in result.stderr): + raise AssertionError('Usage failure streams changed') +finally: + shutil.rmtree(WORK) diff --git a/scripts/check-cli-startup.py b/scripts/check-cli-startup.py index 95b33bb6f..5c1ae96e5 100644 --- a/scripts/check-cli-startup.py +++ b/scripts/check-cli-startup.py @@ -60,9 +60,11 @@ def exchange(identifier, method, params): raise AssertionError('Actual MCP did not close gracefully under ' + stopping.name + ': ' + error) print('ACTUAL_MCP_SIGNAL_CLEAN_EXIT', stopping.name, flush=True) finally: - if process.poll() is None: + try: os.killpg(process.pid, signal.SIGKILL) - process.wait(timeout=5) + except ProcessLookupError: + pass + process.wait(timeout=5) measured = {'baseline': [], 'candidate': []} for index in range(SAMPLES): diff --git a/test/bats/cli-launcher.bats b/test/bats/cli-launcher.bats new file mode 100644 index 000000000..b9078de08 --- /dev/null +++ b/test/bats/cli-launcher.bats @@ -0,0 +1,19 @@ +#!/usr/bin/env bats + +load helpers/docker.bash + +setup_file() { + require_docker_tests +} + +@test "installed CLI uses one Node process with stable command statuses" { + cd "${BATS_TEST_DIRNAME}/../.." + run python3 scripts/check-cli-process.py + [ "$status" -eq 0 ] +} + +@test "launcher preserves entry boundaries, streams, signals and full native coverage" { + cd "${BATS_TEST_DIRNAME}/../.." + run python3 scripts/check-cli-launcher.py + [ "$status" -eq 0 ] +} diff --git a/test/evidence/984-cli-launcher/README.md b/test/evidence/984-cli-launcher/README.md index e6e7ab16d..63fc24abf 100644 --- a/test/evidence/984-cli-launcher/README.md +++ b/test/evidence/984-cli-launcher/README.md @@ -1,21 +1,43 @@ -# Installed CLI Node startup RED: issue984 +# CLI launcher evidence for issue #984 -Source5c82ba6c is the reviewed audit prerequisite; launcher andCLI source match main/v20.0.0ceb58e65 exactly. LauncherSHA256c59219529facafaed3f4f7e4c244e1f0d5f305008e06de332e0d7940c9859381. Source bin/git-warp imports spawnSync and starts process.execPath with selecteddist CLI. CLI main executes unconditionally and owns storage shutdown/signal handling. No implementation fix ispresent. +## Baseline and process regression -The corrected bounded installed-artifact probe sets a Nodepreload tracer inherited by childNode processes. Forhelp,doctor,JSONfailure andunknowncommand, everycase logs exactlytwo Node starts, with wrapperPID as actualCLI's parent and distinct installedwrapper/dist paths. Exitcodes are0/3/3/1 respectively. OneNode-start acceptance fails. Logs and exact source/image/command/guard/resource receipts bind the reproduction. The trace is an actual process-start witness, not a source-text assertion or process-poll race. Four single-sample timings are a diagnostic pilot, not a cold-cache percentile benchmark or improvement target. +The RED baseline is audit prerequisite `5c82ba6ca168d07b743fac5c6adbf38822ae0302`. Its launcher and CLI sources match main/v20.0.0 `ceb58e656ec5bc85f0ae5991bf2a55599693bbb3`. The preserved baseline wrapper contains 817 bytes and has SHA-256 `c59219529facafaed3f4f7e4c244e1f0d5f305008e06de332e0d7940c9859381`. The wrapper calls `spawnSync` to start the selected CLI in another Node process. -Firstv1probe fails beforemeasurement due an invalidgeneratedpreload and absenttracefile; it isnot a validlauncherRED. Correctedv2capturesallfourcases and exits1 because eachcounter is2instead of1. No signals, development/minimumNode/missingentry/cleanup or GREEN acceptance isclaimed yet. Those remain required. Packagepayload746177compressed/3257290unpacked/971entries passes unchangedlimits. +`launcher-red-984-v2` installs the actual package and traces Node starts through an inherited preload. Help, doctor, JSON failure, and unknown command each start two Node processes. The wrapper PID is the CLI process parent. Exit codes are 0/3/3/1. The first probe fails before valid tracing and is retained as a failed diagnostic. It is not RED evidence. -Allcommands run in the existing COPYworker underonly its concrete resource reservation. Limits20GiBmonitoredbuild/3GiBtmpfswithin4GiBdata/128MiBlogs/16MiBstdout/96MiBnonobject/4CPU8GiB/pids768/free50GiB/timeouts/child/container cleanup remain unchanged. Runtimepeak35454976bytes/generatednonobject37662720/build1960869888/tasks23; no guard/PID/OOM refusal. Workerstops beforelease release. Source/input/payload/archive hashes retain exact scopes. Mainline mergingremains paused. +`launcher-green-984-v1` records one Node start for each of the same commands, with unchanged exit codes. The production candidate loads the selected entry as a file URL in the current process. `launcher-portable-process-red-984-v1` tests the portable regression driver against the baseline wrapper and fails on help because it observes two starts. The recorded baseline override binds the exact wrapper bytes; its package metadata is otherwise from the candidate. Its tarball compressed size need not equal an earlier pack run. -## Preserved reviewer violation and primary verification +## Entry boundaries and lifecycle -The read-only proposal reviewer unexpectedly implements/commits88a298dd; no branchispushed. Its fullfeedback/compliancequalification is delivered intact toReader receipt2ba06dee-4118-44d8-847f-2db8030a5c22 and postedon984. Preserve the commit without historyrewrite; do nottreat the output asindependentapproval ofthe implementedpatch. The primaryagent audits the actualdiff and executes newmeaningfuloracles; finalreview uses anisolatedcopy ratherthanthe ownedworktree. +Controlled entry fixtures verify dist-first selection, source fallback, spaced paths, symlinks, arguments, stdout/stderr, exit status 7, stdin, missing entry, Error and non-Error import failures, and exact-PID SIGINT/SIGTERM cleanup. Correct native V8 aggregation uses the innermost enclosing range count in each execution before union. `launcher-boundaries-coverage-984-v3` executes all 12 segments across nine wrapper executions. Earlier aggregation failures are retained. This is native V8 segment coverage of the launcher, not a Vitest four-dimension result or a coverage-ratchet change. -Primarylauncher-green-984-v1 installs actualcandidate: help/doctor/JSONfailure/unknown eachrecord1Node start andunchangedexit0/3/3/1. Controlledboundary fixturesverifydist-first, pathswithspaces, symlink, fullargv/stdout/stderr/status, documentedsourceTypeScript fallback, missingentry/Error/non-Errorload refusal, stdin andexactPID SIGINT/SIGTERM cleanup. V8coverage-v1/v2failat anincorrectaggregationoracle afterbehaviorpasses; V8omits redundantchildranges and executioninheritsitsinnermostrange. Correctedv3covers12unionsegments across9realwrapper executions withnounexecutedsegment. Thisis native V8byte/rangecoverage ofthe launcher, not an invented Vitestfour-dimension claim orprojectthreshold change. +`launcher-mcp-startup-984-v1` initializes the actual installed MCP and calls `warp_lane_describe` to open Runtime. Exact-PID SIGINT/SIGTERM each produce clean exit 0 and no stderr. `launcher-cleanup-failure-984-v1` injects a command into the actual installed registry. Its failing close method produces equal baseline/candidate normal-completion output and exit 3; both candidate signals execute that closure and exit 3. This controlled command failure does not claim a real storage fault or physical power-loss test. -ActualinstalledMCP sends initializeandwarp_lane_describe toopen a realRuntime; SIGINTandSIGTERM tothatPID eachproducecleanexit0 withoutstderr. ExistingCLI lifecycle ownsstorageclosure; no separatewrapper command/error handling is introduced. VerifiedofficialNode22.0.0 binary passes actualpackedhelp/usage. SourceREADME separatelyrequires22.18fortypescript; noenginefloor/loaderdependency israised. The minimumtoolchain is retained once underowned/app/toolchain/node22-min for latercompatibility checks, withinaggregate20GiBmonitoredbuildbudget; itisnotanewimage/worker/cacheevadinglimits. +`test/bats/cli-launcher.bats` invokes the portable process-count and boundary drivers through the existing Docker BATS route. `launcher-bats-green-984-v1` passes both tests. The boundary and startup drivers kill the entire owned signal-fixture process group even when its parent has already exited. -Two boundedalternatingfresh-Node-process comparisonpilots use20samplespervariant inthesameinstalledpackage/image. Firstbaseline/candidate medians199.5061195/191.105198ms; second206.811557/190.3386535ms. Exactrawsamples/p95/p99 arepreserved. Secondcandidatep99369.988803ms exceedsbaseline297.049476ms; noall-tail improvement/universal hardware guarantee isclaimed. Filesystem/dependencycache isshared andstoragecensus suspension times are recorded; freshprocessstartup isnotcold-disk. The observableprocess-count reduction is theacceptance outcome, with measuredstartupcontext ratherthan unstablehard-CI timing. +## Supported Node versions -Actualpayload746123compressed/3257164unpacked/971entriespassesunchanged760000/3300000/1050limits. Source/browserAPI/storageformats/runtimeengine remain unchanged. Nativeworker cleanup/budgets/censusguard remain active; maximumnewbuild2145263616bytes includesownedminimumNode toolchain and remainsbelow20GiB. No packageproject budget/refusal wasbypassed. ManualSSJS: wrapperhost boundary only, no newdomain shape, type/trustcasts, ambientdomain effects orCLIcommand changes. Fullrequiredgates andindependentexactcandidate/hosted reviewremainopen. Mainline merging stayspaused. +`launcher-min-node-984-v1` runs actual packed help and unknown-command usage on the official Node 22.0.0 binary. `launcher-min-source-984-v3` runs the actual wrapper and complete source CLI, without dist, on official Node 22.18.0. Both binaries were checked against their official SHASUMS. Earlier source-fixture attempts omitted root source entry files and failed; those attempts remain recorded. The corrected closure passes without a production change. Package engines remain unchanged; README defines a separate source-development minimum. + +The reusable packed-minimum toolchain occupies 182988800 bytes and source-minimum toolchain 194826240 bytes. Both remain under the existing accounted build volume, for subsequent compatibility checks. Remove them when minimum-version validation is no longer required. No worker, image, or build-volume copy was added. + +## Startup measurements and package boundary + +The first two bounded pilots alternate 20 fresh Node processes per variant in the same installed package and runtime. The first baseline/candidate medians are 199.5061195/191.105198 ms; the second are 206.811557/190.3386535 ms. The second candidate p99 is 369.988803 ms versus baseline 297.049476 ms. Raw samples and p95/p99 values are retained. Filesystem and dependency caches are shared, and the guard pauses work during storage census. These are fresh-process startup pilots, not cold-disk measurements or a universal/all-tail latency guarantee. A third run, `launcher-startup-cleanup-984-v1`, verifies the changed driver cleanup path and actual MCP signals; its baseline/candidate medians are 201.49615599999998/187.0664805 ms. Its raw samples remain separate from the first two pilots. + +The original candidate payload is 746123 compressed bytes, 3257164 unpacked bytes, and 971 entries. Unchanged limits are 760000/3300000/1050. The original baseline payload is 746177/3257290/971. `packed-compat-984-v1` passes the complete installed public API and attachment smoke suite, including a 64 MiB stream. + +## Review and validation boundaries + +The proposal reviewer violated the read-only assignment and committed `88a298dd`. That history is preserved. The primary agent inspected and tested the implementation. The complete proposal feedback and qualification were delivered intact to Reader receipt `2ba06dee-4118-44d8-847f-2db8030a5c22`. That proposal output does not count as independent implemented-code approval. A separate clone is used for the final review. + +The real pre-push chain on `2eb60b816add5dd3f6b0462af345ea838c18104a` passes nine static tasks and six unit shards: 304/974/910/3139/2100/1250, totaling 8677 passing assertions with two existing skips. A nested script probe is included in those totals. Final current-head validation and independent review must still pass after subsequent test/evidence commits. Draft PR #993 targets the audit prerequisite branch. Mainline merging remains paused. + +Manual SSJS scorecard: no new domain concept requires a runtime class; entry validation stays at the executable boundary; loading behavior remains in its launcher; no message parsing controls production behavior; no domain time or entropy is added; no casts or fake shape trust are added. All six checks are green on changed production code. + +## Resource and evidence custody + +All executions use the reused COPY worker under its concrete resource reservation. Limits remain 20 GiB monitored build storage, 3 GiB runtime tmpfs within the aggregate 4 GiB data budget, 128 MiB project logs, 16 MiB per-run stdout, 96 MiB generated nonobject output, four CPUs, 8 GiB memory/swap, 768 tasks, and 50 GiB host/VM free-space guards. Deadlines and worker teardown precede lease release. A named volume and memory limit are not disk quotas. The guard pauses owned processes during its filesystem census and fails closed on measurement failure. + +Manifests distinguish original raw hashes, public normalized payload hashes, and compressed archive hashes. Public normalization replaces the container home with `` only. Launch receipts bind exact input snapshots, image, commands, baseline overrides, guard hash, resource limits, and results. Failed phases remain evidence and are not counted as passes. diff --git a/test/evidence/984-cli-launcher/followup-validation-manifest.json b/test/evidence/984-cli-launcher/followup-validation-manifest.json new file mode 100644 index 000000000..2f0706d2a --- /dev/null +++ b/test/evidence/984-cli-launcher/followup-validation-manifest.json @@ -0,0 +1,202 @@ +[ + { + "phase": "packed-compat-984-v1", + "file": "packed-compat-984-v1-console.txt.gz", + "source_name": "console.log", + "original_sha256": "1724c8f06f8e9f34202362e1ff170cd63e8db4c420ea9ad259fb84b37ef202a7", + "public_sha256": "1724c8f06f8e9f34202362e1ff170cd63e8db4c420ea9ad259fb84b37ef202a7", + "normalization": "none", + "archive_sha256": "1e824fe0bc245a051eb6d2dd93219e5322df4062cdcdd3ba9b7683238411ab37" + }, + { + "phase": "packed-compat-984-v1", + "file": "packed-compat-984-v1-launch.json", + "source_name": "launch.json", + "original_sha256": "2748aa7a614200be6241a36459f06adc40d12147d656671deaa35129969b505f", + "public_sha256": "baafd278f54f9ca6461e3eb9e7afa68174a5f478d062dc5d7b3cc0d49a166e63", + "normalization": "container home replaced with " + }, + { + "phase": "packed-compat-984-v1", + "file": "packed-compat-984-v1-resources.json", + "source_name": "resources.json", + "original_sha256": "2c591bf47727186543294673d86e30fc9254033b06ed97d7ddfbd23af785addc", + "public_sha256": "e862b9255a632a5231d171566ec13eeb67525b92a9b18f77a4c91f12cbdc0816", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-min-source-984-v1", + "file": "launcher-min-source-984-v1-console.txt.gz", + "source_name": "console.log", + "original_sha256": "be11881ad6e6c44848c93b03747b629f65870516eeb00a1602fc9ab0207aee6d", + "public_sha256": "be11881ad6e6c44848c93b03747b629f65870516eeb00a1602fc9ab0207aee6d", + "normalization": "none", + "archive_sha256": "6aeff4727bb3e9e6dc1ff2986b9aeedbcb30f290aa5445325db707344b6024a1" + }, + { + "phase": "launcher-min-source-984-v1", + "file": "launcher-min-source-984-v1-launch.json", + "source_name": "launch.json", + "original_sha256": "8b728e172f4dab124c5b205791835b5455f211a7c5c80391cec0c6e9528abc98", + "public_sha256": "31970260f726349043def5c39faf9ab0ba73441be0feb18ea99f38248557606b", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-min-source-984-v1", + "file": "launcher-min-source-984-v1-resources.json", + "source_name": "resources.json", + "original_sha256": "88dc67624a1de919098079c38f84a04ad36ffc2325178864151832782f446094", + "public_sha256": "86569a6a891dcd2186ac34545e2a2119eee62e111637a819032e97b576623137", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-min-source-984-v2", + "file": "launcher-min-source-984-v2-console.txt.gz", + "source_name": "console.log", + "original_sha256": "22a4a834ad730dd49f3ff500a0aa9324dc12af747cfb42d7df713a87f0b547e8", + "public_sha256": "22a4a834ad730dd49f3ff500a0aa9324dc12af747cfb42d7df713a87f0b547e8", + "normalization": "none", + "archive_sha256": "f45ac7850c7b1b46d2986a98fb51fa05b117099ced40e46445aafd2dbcebc0ff" + }, + { + "phase": "launcher-min-source-984-v2", + "file": "launcher-min-source-984-v2-launch.json", + "source_name": "launch.json", + "original_sha256": "e9eef5fcda7c5389c39fa612ff33f67e1727976e0eeca913eba536e5fe4b7db9", + "public_sha256": "0c38c4d85c344bca562e61040b9071909fbabf750c0ea4a7f3769cffdf67a363", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-min-source-984-v2", + "file": "launcher-min-source-984-v2-resources.json", + "source_name": "resources.json", + "original_sha256": "71ceb8358b2b704cd8082f2294edc40b24304926571b4a0d3de87ce0203741f3", + "public_sha256": "feed2ec3bf5e1e86a15d51f3c0683362d1e9333b73c8cdd16685c32712d4d16f", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-min-source-984-v3", + "file": "launcher-min-source-984-v3-console.txt.gz", + "source_name": "console.log", + "original_sha256": "73462d572dc47add438d9032b908d8695e630522891b1d3172ff57121956f015", + "public_sha256": "73462d572dc47add438d9032b908d8695e630522891b1d3172ff57121956f015", + "normalization": "none", + "archive_sha256": "260028f5531f7d8b5e914429e2b14577a822f11f87a1be5c92fb1dbfb63a93d1" + }, + { + "phase": "launcher-min-source-984-v3", + "file": "launcher-min-source-984-v3-launch.json", + "source_name": "launch.json", + "original_sha256": "c6eb7bea80a53581ea2d010b3874a8733078167735fe987c40d7b444d5240a99", + "public_sha256": "f4f71f751486a5d0a9a1426a735f75fab1664d31dbf3cf4e8ce11dd552206d31", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-min-source-984-v3", + "file": "launcher-min-source-984-v3-resources.json", + "source_name": "resources.json", + "original_sha256": "b4cb2fd04a10a659f43f7d02593dd3054cf6b0797279664d669695a3ce67f0c0", + "public_sha256": "3746a55bd0402770f385bb0a68b3de4e0104956325ab06ae1c4c0c6b9e62e9d8", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-cleanup-failure-984-v1", + "file": "launcher-cleanup-failure-984-v1-console.txt.gz", + "source_name": "console.log", + "original_sha256": "5231ee3d23cb51b6950637a2aac903966af5c4375a094847cffd1c66c71029af", + "public_sha256": "5231ee3d23cb51b6950637a2aac903966af5c4375a094847cffd1c66c71029af", + "normalization": "none", + "archive_sha256": "8e8a497db23a6ab45150bc449725e82fcdf225c2b08c4d3e4754a26f1d1ff313" + }, + { + "phase": "launcher-cleanup-failure-984-v1", + "file": "launcher-cleanup-failure-984-v1-launch.json", + "source_name": "launch.json", + "original_sha256": "0825f34f88da8372b139d1a3ca261a3e4bb4b7bd0c01de46dbb0ad9acfbcd81a", + "public_sha256": "50e16332b2e1611d036fc08b1328fde6cbe2f86c3ac254c2dc767703fe0394ea", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-cleanup-failure-984-v1", + "file": "launcher-cleanup-failure-984-v1-resources.json", + "source_name": "resources.json", + "original_sha256": "d5f9ee1326801957ea0d861e47f5fe226588d08808ffeb6265b24657459deeb5", + "public_sha256": "c1a0c961ce29736b1c756700e756257c502143131a5b636455c28a21cf2c73f6", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-portable-process-red-984-v1", + "file": "launcher-portable-process-red-984-v1-console.txt.gz", + "source_name": "console.log", + "original_sha256": "523512b07ebbcc5f232bc71758ab8f32b4c089f068c43f6cc108fde8f32ed1e7", + "public_sha256": "523512b07ebbcc5f232bc71758ab8f32b4c089f068c43f6cc108fde8f32ed1e7", + "normalization": "none", + "archive_sha256": "adaa2c826de6f0b27eb5a1e264b1eee58f78db2f936932722a5ca97c083f599a" + }, + { + "phase": "launcher-portable-process-red-984-v1", + "file": "launcher-portable-process-red-984-v1-launch.json", + "source_name": "launch.json", + "original_sha256": "35913ae6b5c9c49440b25b7f8bfa4acb0b490b2df371c81ff381e14506193f99", + "public_sha256": "753ef9f362962682e65dc608c1b3a0654d6ed8c51ac892935542fa1004a28f13", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-portable-process-red-984-v1", + "file": "launcher-portable-process-red-984-v1-resources.json", + "source_name": "resources.json", + "original_sha256": "19ac57a4070f45c21da68cce299fddcef59bbb7d62cbc63f4f29a5c615f2022e", + "public_sha256": "745e52657d8ca9d27a99eac24dddf9779e09cea0eb625e08823932e58e68aaef", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-bats-green-984-v1", + "file": "launcher-bats-green-984-v1-console.txt.gz", + "source_name": "console.log", + "original_sha256": "0d46a7278860618ce9153c1c8ebfb6aa647112acf8628829a9b896d1d5b0539d", + "public_sha256": "0d46a7278860618ce9153c1c8ebfb6aa647112acf8628829a9b896d1d5b0539d", + "normalization": "none", + "archive_sha256": "fc4022e112a4897f56e3358401e250634c8fa104e842471ed1fd8e9657c7e4fa" + }, + { + "phase": "launcher-bats-green-984-v1", + "file": "launcher-bats-green-984-v1-launch.json", + "source_name": "launch.json", + "original_sha256": "535b7b7251cf8ddb47f7c57bd95e21f1bbab4f567c5390df83b819016b6362f5", + "public_sha256": "62821d8f436330868227611eac6271fec0887559a768a64d2c95402cfadf7073", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-bats-green-984-v1", + "file": "launcher-bats-green-984-v1-resources.json", + "source_name": "resources.json", + "original_sha256": "7a0d9cf3068b57cbdcaed3856181ad750b5c5caffd5c9ce85f374e4771cbb1e9", + "public_sha256": "4182f4ec0c337a4e2cb0204b3d8c138ba5bb95d408afc4e41f594b5e6305ed59", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-startup-cleanup-984-v1", + "file": "launcher-startup-cleanup-984-v1-console.txt.gz", + "source_name": "console.log", + "original_sha256": "1f6b93cef9941d6abb4698a7d03d00bc4b41fa94ff2d692bcc9ecc9fd18a6b75", + "public_sha256": "1f6b93cef9941d6abb4698a7d03d00bc4b41fa94ff2d692bcc9ecc9fd18a6b75", + "normalization": "none", + "archive_sha256": "7124a86900b9e8450cb4292a0384f69a1e60fd6be3cbccd47848df816ca5f6ad" + }, + { + "phase": "launcher-startup-cleanup-984-v1", + "file": "launcher-startup-cleanup-984-v1-launch.json", + "source_name": "launch.json", + "original_sha256": "d3d75b05834745538a44de5d071796b839ebb10c8634096de04c1019dfc9f209", + "public_sha256": "decf43f0a92b22ef20d029dd998573d0fd1a202bf0ae63e5e07f7253b180f982", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-startup-cleanup-984-v1", + "file": "launcher-startup-cleanup-984-v1-resources.json", + "source_name": "resources.json", + "original_sha256": "f9572c2bb4ea4dd74b359f0fc91edfb5a065da1005c9ed81dd3d6ee8eb8c8b96", + "public_sha256": "d806089b2a0be3b616f7022eff6e8b9830ad4d130f5fd7c03e81607afc95d3b9", + "normalization": "container home replaced with " + } +] diff --git a/test/evidence/984-cli-launcher/launcher-bats-green-984-v1-console.txt.gz b/test/evidence/984-cli-launcher/launcher-bats-green-984-v1-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..7ae347e4814a4fafbfd140e7d48eb716f0468b9d GIT binary patch literal 154 zcmV;L0A>FliwFP!00002{}qfu4#F@D1n+r;AAlm7o_gklg!qHom^Q+7kevkady?C( zG&3y(A7($h>FO81xXJtA@*5^dVg;Eg!tHT~YGjaw;F%-ANApHz@J;1_j;&0v| zN&v and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 720291057664, + "host_receipt_bytes": 69380934, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 684621234176, + "initial_build_bytes": 2337153024 +} diff --git a/test/evidence/984-cli-launcher/launcher-bats-green-984-v1-resources.json b/test/evidence/984-cli-launcher/launcher-bats-green-984-v1-resources.json new file mode 100644 index 000000000..4df34d50b --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-bats-green-984-v1-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 0, + "guard_error": null, + "peaks": { + "pids": 27, + "build_bytes": 2337951744, + "/data": 14045184, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 14458880, + "minimum_vm_free_bytes": 684554125312 + }, + "stdout_bytes": 175, + "timeout_seconds": 1700, + "measurement_pauses": 5, + "measurement_pause_seconds": 0.460152763989754, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/launcher-cleanup-failure-984-v1-console.txt.gz b/test/evidence/984-cli-launcher/launcher-cleanup-failure-984-v1-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..a24bdb0afa0b0226df7b7c62900e589cb5e59616 GIT binary patch literal 225 zcmV<703QDziwFP!00002|D}#iOT$1AhVS_m^9PLk(I%v~bvw$)W(~;(^fbhF5mDRF zRH6UgwHBn8UVJYD^FH%1UrOal=Q@)juktDzht=Eg60gSL@V*_^3usK&WdN(~$GD5r z6xZ;4*vDxB<*blO!!?wJNJ-4+=I8p40MKe)%3_uvt;LCooBi(fw?3sRWg?`Qi_F;2 z8^_iWlfOqBaLM+eu8mLAq49mgw}xEbBHx$}9eHG%T3VWb+?bZa6CZ!Rr0VF-AG{},1000);COMMANDS.set('cleanup-fixture',async()=>({human:'READY',close:async()=>{writeFileSync(process.env.FIXTURE_MARKER,'closed');clearInterval(timer);throw new Error('cleanup fixture failed');},completion:process.env.FIXTURE_SIGNAL==='yes'?undefined:Promise.resolve()}));\")\n env=os.environ.copy();env['NODE_OPTIONS']='--import='+str(preload);env['FIXTURE_MARKER']=str(marker)\n outputs=[]\n for wrapper in [baseline,package/\"bin/git-warp\"]:\n result=subprocess.run(['node',str(wrapper),'cleanup-fixture'],cwd=consumer,env=env,capture_output=True,text=True,timeout=20)\n assert result.returncode==3 and result.stdout=='READY\\n' and 'cleanup fixture failed' in result.stderr and marker.read_text()=='closed',(result.returncode,result.stdout,result.stderr)\n outputs.append((result.returncode,result.stdout,result.stderr))\n marker.unlink()\n assert outputs[0]==outputs[1],outputs\n print('ACTUAL_CLI_INJECTED_COMMAND_CLEANUP_FAILURE_BASELINE_CANDIDATE_PARITY_PASS',flush=True)\n env['FIXTURE_SIGNAL']='yes'\n for stop in [signal.SIGINT,signal.SIGTERM]:\n process=subprocess.Popen(['node',str(package/'bin/git-warp'),'cleanup-fixture'],cwd=consumer,env=env,stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True,start_new_session=True)\n try:\n ready=selectors.DefaultSelector();ready.register(process.stdout,selectors.EVENT_READ)\n assert ready.select(20),'signal fixture readiness timeout'\n assert process.stdout.readline()=='READY\\n'\n ready.close();os.kill(process.pid,stop)\n out,err=process.communicate(timeout=20)\n assert process.returncode==3 and marker.read_text()=='closed' and err=='',(process.returncode,out,err)\n marker.unlink()\n print('ACTUAL_CLI_INJECTED_COMMAND_SIGNAL_CLEANUP_FAILURE',stop.name,'EXIT_3_PASS',flush=True)\n finally:\n if process.poll() is None:\n os.killpg(process.pid,signal.SIGKILL);process.wait(timeout=5)\nfinally:\n shutil.rmtree(work)" + ], + "lock_store": "workstation.git", + "lock_keys": [ + "host/docker/git-warp-tests/" + ], + "outputs": [ + "build volume /app", + "runtime /data", + "bounded /tmp and and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 720302444544, + "host_receipt_bytes": 69332651, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 685695733760, + "initial_build_bytes": 2336366592 +} diff --git a/test/evidence/984-cli-launcher/launcher-cleanup-failure-984-v1-resources.json b/test/evidence/984-cli-launcher/launcher-cleanup-failure-984-v1-resources.json new file mode 100644 index 000000000..09270ec18 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-cleanup-failure-984-v1-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 0, + "guard_error": null, + "peaks": { + "pids": 27, + "build_bytes": 2340171776, + "/data": 4841472, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 5226496, + "minimum_vm_free_bytes": 685695733760 + }, + "stdout_bytes": 359, + "timeout_seconds": 1700, + "measurement_pauses": 5, + "measurement_pause_seconds": 0.4747515289927833, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/launcher-min-source-984-v1-console.txt.gz b/test/evidence/984-cli-launcher/launcher-min-source-984-v1-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..4ed395d5d15a5626f2b42c143fe9569872788b9f GIT binary patch literal 258 zcmV+d0sa0TiwFP!00002|K*XvYQr!LhVO>FgDyK-*l`lKxsCPKg~8Uru4Yk3AWe#K zL)p{Mahl+f!FHb!)^GXuXOM<8#Z;kUQs5T14B!q9y)!MqD4*$_nt^IB-;QK!fct^0 z`5<^XlP?1tniD~kZ{p!%Ep?8;Z)?}~#&cfJQ(ivz{LYPrM>;x~zGDf12(QGltz?uq zFGKtwf+2xChg74k{K-q1qpH5)WP!3;sG<};WJH-O!IwxOW?UpAoNsoq#;v)*_s?cA zb_|r(dTQQH#ruz9v5SM#>Ee-ZtIk%8fl089HO}`dPx$p3V2{3q?Iw Iss{rA0Ay!?A^-pY literal 0 HcmV?d00001 diff --git a/test/evidence/984-cli-launcher/launcher-min-source-984-v1-launch.json b/test/evidence/984-cli-launcher/launcher-min-source-984-v1-launch.json new file mode 100644 index 000000000..73c58b1db --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-min-source-984-v1-launch.json @@ -0,0 +1,41 @@ +{ + "phase": "launcher-min-source-984-v1", + "inner_guard_sha256": "2e898488b42ef2d6885c79a124d3deef5cc17086f5b8846e75833145a75dd27d", + "worker": "git-warp-tests", + "image": "sha256:9f145953f6e79a59749a683d11a476133cb7cef0588b79256dc195b1d0c87ad7", + "source_base": "2eb60b816add5dd3f6b0462af345ea838c18104a", + "source_archive_sha256": "2e14e601eecd53aac2a7ed392532ddf0d2cd01d586cd938d658dc1732506991a", + "source_archive_bytes": 21319680, + "baseline_inputs": {}, + "command": [ + "bash", + "-c", + "set -eu\ntool=/app/toolchain/node22-source-min\nif [ ! -x \"$tool/bin/node\" ]; then\n work=$(mktemp -d /data/tmp/node22-source-min.XXXXXX)\n trap 'rm -rf \"$work\"' EXIT\n cd \"$work\"\n curl --fail --location --connect-timeout 10 --max-time 120 -o node-v22.18.0-linux-arm64.tar.xz https://nodejs.org/dist/v22.18.0/node-v22.18.0-linux-arm64.tar.xz\n curl --fail --location --connect-timeout 10 --max-time 30 -o SHASUMS256.txt https://nodejs.org/dist/v22.18.0/SHASUMS256.txt\n grep ' node-v22.18.0-linux-arm64.tar.xz$' SHASUMS256.txt | sha256sum --check\n mkdir -p \"$tool\"\n tar -xJf node-v22.18.0-linux-arm64.tar.xz --strip-components=1 -C \"$tool\"\nfi\ncd /app/project\n\"$tool/bin/node\" --version\n# Build source fixture with the actual wrapper and source CLI; no dist exists.\nwork=$(mktemp -d /data/tmp/launcher-source-min.XXXXXX)\ntrap 'rm -rf \"$work\"' EXIT\ncp package.json \"$work/package.json\"\ncp -R bin src \"$work/\"\nln -s /app/cache/node_modules \"$work/node_modules\"\n\"$tool/bin/node\" \"$work/bin/git-warp\" --help > \"$work/help.out\" 2> \"$work/help.err\"\ntest -s \"$work/help.out\"\ntest ! -s \"$work/help.err\"\nset +e\n\"$tool/bin/node\" \"$work/bin/git-warp\" no-such-command > \"$work/unknown.out\" 2> \"$work/unknown.err\"\nstatus=$?\nset -e\ntest \"$status\" -eq 1\ntest ! -s \"$work/unknown.out\"\ngrep -q 'Unknown command' \"$work/unknown.err\"\necho MINIMUM_NODE_22_18_ACTUAL_SOURCE_HELP_AND_USAGE_PASS\ndu -s -B1 /app/toolchain/node22-source-min /app/toolchain/node22-min" + ], + "lock_store": "workstation.git", + "lock_keys": [ + "host/docker/git-warp-tests/" + ], + "outputs": [ + "build volume /app", + "runtime /data", + "bounded /tmp and and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 721677205504, + "host_receipt_bytes": 69283255, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 685893681152, + "initial_build_bytes": 2141540352 +} diff --git a/test/evidence/984-cli-launcher/launcher-min-source-984-v1-resources.json b/test/evidence/984-cli-launcher/launcher-min-source-984-v1-resources.json new file mode 100644 index 000000000..b7cde8a6a --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-min-source-984-v1-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 1, + "guard_error": null, + "peaks": { + "pids": 27, + "build_bytes": 2194595840, + "/data": 31002624, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 31387648, + "minimum_vm_free_bytes": 685893681152 + }, + "stdout_bytes": 775, + "timeout_seconds": 1700, + "measurement_pauses": 5, + "measurement_pause_seconds": 0.44850726111326367, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/launcher-min-source-984-v2-console.txt.gz b/test/evidence/984-cli-launcher/launcher-min-source-984-v2-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..6446faf20dd5edde07737717ea1a20235ef39e2f GIT binary patch literal 146 zcmV;D0B!#tiwFP!00002|BcKs5`!QRK+&F4&{?@FXc5XxY;u6uZvZFE$ig5nIet7s z%3r+SwFW)IEYt)BjObUZ8%*Ls%&E#fu#+*lc6d3Uqe@s~#)BH$k1ykyTCskNfnoc; zmivO_IN&^|b1Kz4xtA2>U;Z5!?GdmmgPSsIiWK \"$work/help.out\" 2> \"$work/help.err\"\nstatus=$?\nset -e\ncat \"$work/help.err\"\ntest \"$status\" -eq 0\ntest -s \"$work/help.out\"\ntest ! -s \"$work/help.err\"\nset +e\n\"$tool/bin/node\" \"$work/bin/git-warp\" no-such-command > \"$work/unknown.out\" 2> \"$work/unknown.err\"\nstatus=$?\nset -e\ntest \"$status\" -eq 1\ntest ! -s \"$work/unknown.out\"\ngrep -q 'Unknown command' \"$work/unknown.err\"\necho MINIMUM_NODE_22_18_ACTUAL_SOURCE_HELP_AND_USAGE_PASS\ndu -s -B1 /app/toolchain/node22-source-min /app/toolchain/node22-min" + ], + "lock_store": "workstation.git", + "lock_keys": [ + "host/docker/git-warp-tests/" + ], + "outputs": [ + "build volume /app", + "runtime /data", + "bounded /tmp and and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 721481510912, + "host_receipt_bytes": 69309875, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 685695803392, + "initial_build_bytes": 2336366592 +} diff --git a/test/evidence/984-cli-launcher/launcher-min-source-984-v2-resources.json b/test/evidence/984-cli-launcher/launcher-min-source-984-v2-resources.json new file mode 100644 index 000000000..5348b372c --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-min-source-984-v2-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 1, + "guard_error": null, + "peaks": { + "pids": 23, + "build_bytes": 2339778560, + "/data": 1748992, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 2134016, + "minimum_vm_free_bytes": 685695803392 + }, + "stdout_bytes": 176, + "timeout_seconds": 1700, + "measurement_pauses": 4, + "measurement_pause_seconds": 0.3599626590148546, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/launcher-min-source-984-v3-console.txt.gz b/test/evidence/984-cli-launcher/launcher-min-source-984-v3-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..30a23da11a0f2c36a65c3a8164a18d05596dda08 GIT binary patch literal 145 zcmV;C0B-*uiwFP!00002|8>gU3W6{c0O0HPF7D?jadtU$l;Ebcc6|^N5^9rveE#YI zy8PhV063JqWJ+?)HQT;c$R%^FZ(Vfc`^FLgDI`;$qv \"$work/help.out\" 2> \"$work/help.err\"\nstatus=$?\nset -e\ncat \"$work/help.err\"\ntest \"$status\" -eq 0\ntest -s \"$work/help.out\"\ntest ! -s \"$work/help.err\"\nset +e\n\"$tool/bin/node\" \"$work/bin/git-warp\" no-such-command > \"$work/unknown.out\" 2> \"$work/unknown.err\"\nstatus=$?\nset -e\ntest \"$status\" -eq 1\ntest ! -s \"$work/unknown.out\"\ngrep -q 'Unknown command' \"$work/unknown.err\"\necho MINIMUM_NODE_22_18_ACTUAL_SOURCE_HELP_AND_USAGE_PASS\ndu -s -B1 /app/toolchain/node22-source-min /app/toolchain/node22-min" + ], + "lock_store": "workstation.git", + "lock_keys": [ + "host/docker/git-warp-tests/" + ], + "outputs": [ + "build volume /app", + "runtime /data", + "bounded /tmp and and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 721482223616, + "host_receipt_bytes": 69323379, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 685695787008, + "initial_build_bytes": 2336366592 +} diff --git a/test/evidence/984-cli-launcher/launcher-min-source-984-v3-resources.json b/test/evidence/984-cli-launcher/launcher-min-source-984-v3-resources.json new file mode 100644 index 000000000..6273c74f4 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-min-source-984-v3-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 0, + "guard_error": null, + "peaks": { + "pids": 27, + "build_bytes": 2336710656, + "/data": 1748992, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 2134016, + "minimum_vm_free_bytes": 685695787008 + }, + "stdout_bytes": 157, + "timeout_seconds": 1700, + "measurement_pauses": 4, + "measurement_pause_seconds": 0.3654498719261028, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/launcher-portable-process-red-984-v1-console.txt.gz b/test/evidence/984-cli-launcher/launcher-portable-process-red-984-v1-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..40672d1bfbb6b1d42981eaa7075f79e1225e621c GIT binary patch literal 272 zcmV+r0q_1FiwFP!00002|3#2NYr;Sfh41?-9-dmT=_XM_f(XH;AV@2XcUhAmhHiGl z?xxg#-w}n*aps$O@6At=L`fQ@B9>7ekL7+}y`8rE z-Rbc4xvlCN7t$k)ZRzBLa={}3{q_M;9Gz and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 720291885056, + "host_receipt_bytes": 69373907, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 684622118912, + "initial_build_bytes": 2336387072 +} diff --git a/test/evidence/984-cli-launcher/launcher-portable-process-red-984-v1-resources.json b/test/evidence/984-cli-launcher/launcher-portable-process-red-984-v1-resources.json new file mode 100644 index 000000000..25aa4b978 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-portable-process-red-984-v1-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 1, + "guard_error": null, + "peaks": { + "pids": 27, + "build_bytes": 2339311616, + "/data": 10452992, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 10854400, + "minimum_vm_free_bytes": 684622118912 + }, + "stdout_bytes": 339, + "timeout_seconds": 1700, + "measurement_pauses": 6, + "measurement_pause_seconds": 0.5770323050674051, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/launcher-startup-cleanup-984-v1-console.txt.gz b/test/evidence/984-cli-launcher/launcher-startup-cleanup-984-v1-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..58c618701520d05a1d8b5c1f88633f128aee8acd GIT binary patch literal 680 zcmV;Z0$2SXiwFP!00002|AkcBYTG~%efL-F2RNJA`%e0#8nrPbwy+#pC_!wbRb%3d zu$-3seP<;nerf4~U^si`c4kMvq~ua@H4(s( zi4G0%sSb(O!Z{OtYK%xX*5UM0X(CAOwHpE^ic@Bwq{fvI*16HP8myw=!XsA>q!6R8 z(`djv{zKV1?3+y!PJfeDc*nt7?ZLcjDxKxhDlf#lrqX+klJr*>QN88Ll6a{CvW@X} zl!iJXJw$5uBT(WPt~9{Vt=HU1K}9D%b*M=+JIW+2cs+E5+$iJHaFQ<#5QQ6klYZdO zd1)?QCz~WDEm0+#2JVC$9Y3sOH$&O%n7 zvogP%FY@Z!Dl3Y7Rh74yG?vu{CA}(%ZKy*VVxwB!x~OZZbrdZ$rd6~-;3L>3DkUQ{ z4mH&1=_z{gkzlsGFS6CVTrR3|wk&ei(q2Dbb;m&CYczW$Vv35iA zeCtnfciqG;?wh!;-)Q3XGm)OdF*Z}SKb%+?oUfWq|H2MO`W and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 720308080640, + "host_receipt_bytes": 69427372, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 684554051584, + "initial_build_bytes": 2337193984 +} diff --git a/test/evidence/984-cli-launcher/launcher-startup-cleanup-984-v1-resources.json b/test/evidence/984-cli-launcher/launcher-startup-cleanup-984-v1-resources.json new file mode 100644 index 000000000..34607ccd5 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-startup-cleanup-984-v1-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 0, + "guard_error": null, + "peaks": { + "pids": 27, + "build_bytes": 2340605952, + "/data": 50761728, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 51138560, + "minimum_vm_free_bytes": 684554051584 + }, + "stdout_bytes": 1139, + "timeout_seconds": 1700, + "measurement_pauses": 9, + "measurement_pause_seconds": 0.816210592049174, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/packed-compat-984-v1-console.txt.gz b/test/evidence/984-cli-launcher/packed-compat-984-v1-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..b0f5dd585aa6c7b0926d4780dba18dc11e84238c GIT binary patch literal 418 zcmV;T0bTwdiwFP!00002|Fu*}a^o-zyz3QsfTL(htXOlJV{WO+3t$kAS>{$GrNqAv zWXo}u@x@coiKXrayGej!)09nHwnbf)t8!HYq#eHSO~AeJsCsz%`}|x0khdXnN~~bL z&zySb?v{1a!Yy>mNJPyjovWr$?%o<|5g9J z)W4hSAA5uIia!7(;*il1L%^wt3(Og5J9U<{woB4uaqcA`GIT and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 721685991424, + "host_receipt_bytes": 69243314, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 685893500928, + "initial_build_bytes": 2141593600 +} diff --git a/test/evidence/984-cli-launcher/packed-compat-984-v1-resources.json b/test/evidence/984-cli-launcher/packed-compat-984-v1-resources.json new file mode 100644 index 000000000..8cd212448 --- /dev/null +++ b/test/evidence/984-cli-launcher/packed-compat-984-v1-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 0, + "guard_error": null, + "peaks": { + "pids": 27, + "build_bytes": 2146926592, + "/data": 84578304, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 79646720, + "minimum_vm_free_bytes": 685893500928 + }, + "stdout_bytes": 1173, + "timeout_seconds": 1700, + "measurement_pauses": 16, + "measurement_pause_seconds": 1.388736814900767, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} From 559f4b24e821e57ccd89a7817a1145af02e107d8 Mon Sep 17 00:00:00 2001 From: James Ross Date: Wed, 7 Oct 2026 19:20:48 -0700 Subject: [PATCH 5/6] test(cli): provide BATS-owned temp directories in hosted Docker (#984) --- test/bats/cli-launcher.bats | 15 ++- test/evidence/984-cli-launcher/README.md | 8 ++ .../hosted-environment-manifest.json | 102 ++++++++++++++++++ ...her-hosted-env-green-984-v1-console.txt.gz | Bin 0 -> 100 bytes ...uncher-hosted-env-green-984-v1-launch.json | 43 ++++++++ ...her-hosted-env-green-984-v1-resources.json | 32 ++++++ ...her-hosted-env-green-984-v2-console.txt.gz | Bin 0 -> 2105 bytes ...uncher-hosted-env-green-984-v2-launch.json | 44 ++++++++ ...her-hosted-env-green-984-v2-resources.json | 32 ++++++ ...her-hosted-env-green-984-v3-console.txt.gz | Bin 0 -> 154 bytes ...uncher-hosted-env-green-984-v3-launch.json | 41 +++++++ ...her-hosted-env-green-984-v3-resources.json | 32 ++++++ ...ncher-hosted-env-red-984-v1-console.txt.gz | Bin 0 -> 246 bytes ...launcher-hosted-env-red-984-v1-launch.json | 43 ++++++++ ...ncher-hosted-env-red-984-v1-resources.json | 32 ++++++ 15 files changed, 422 insertions(+), 2 deletions(-) create mode 100644 test/evidence/984-cli-launcher/hosted-environment-manifest.json create mode 100644 test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v1-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v1-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v1-resources.json create mode 100644 test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v2-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v2-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v2-resources.json create mode 100644 test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v3-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v3-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v3-resources.json create mode 100644 test/evidence/984-cli-launcher/launcher-hosted-env-red-984-v1-console.txt.gz create mode 100644 test/evidence/984-cli-launcher/launcher-hosted-env-red-984-v1-launch.json create mode 100644 test/evidence/984-cli-launcher/launcher-hosted-env-red-984-v1-resources.json diff --git a/test/bats/cli-launcher.bats b/test/bats/cli-launcher.bats index b9078de08..4d5bc3632 100644 --- a/test/bats/cli-launcher.bats +++ b/test/bats/cli-launcher.bats @@ -6,14 +6,25 @@ setup_file() { require_docker_tests } +setup() { + export TMPDIR="${BATS_TEST_TMPDIR}" +} + +assert_driver_success() { + if [ "$status" -ne 0 ]; then + printf '%s\n' "$output" >&2 + fi + [ "$status" -eq 0 ] +} + @test "installed CLI uses one Node process with stable command statuses" { cd "${BATS_TEST_DIRNAME}/../.." run python3 scripts/check-cli-process.py - [ "$status" -eq 0 ] + assert_driver_success } @test "launcher preserves entry boundaries, streams, signals and full native coverage" { cd "${BATS_TEST_DIRNAME}/../.." run python3 scripts/check-cli-launcher.py - [ "$status" -eq 0 ] + assert_driver_success } diff --git a/test/evidence/984-cli-launcher/README.md b/test/evidence/984-cli-launcher/README.md index 63fc24abf..cf59d8b0f 100644 --- a/test/evidence/984-cli-launcher/README.md +++ b/test/evidence/984-cli-launcher/README.md @@ -41,3 +41,11 @@ Manual SSJS scorecard: no new domain concept requires a runtime class; entry val All executions use the reused COPY worker under its concrete resource reservation. Limits remain 20 GiB monitored build storage, 3 GiB runtime tmpfs within the aggregate 4 GiB data budget, 128 MiB project logs, 16 MiB per-run stdout, 96 MiB generated nonobject output, four CPUs, 8 GiB memory/swap, 768 tasks, and 50 GiB host/VM free-space guards. Deadlines and worker teardown precede lease release. A named volume and memory limit are not disk quotas. The guard pauses owned processes during its filesystem census and fails closed on measurement failure. Manifests distinguish original raw hashes, public normalized payload hashes, and compressed archive hashes. Public normalization replaces the container home with `` only. Launch receipts bind exact input snapshots, image, commands, baseline overrides, guard hash, resource limits, and results. Failed phases remain evidence and are not counted as passes. + +## Hosted BATS environment correction + +The e7ea6ba3 hosted Node job (`37716358053`, job `113113592926`) failed both new BATS tests. The regular hosted Docker image leaves `TMPDIR` unset; the guarded primary worker sets it. `launcher-hosted-env-red-984-v1` reproduces the resulting `KeyError` before the process driver can run. BATS setup now gives each driver its own `BATS_TEST_TMPDIR`, and failed driver output is printed. The production launcher is unchanged. + +The first missing-environment simulation placed BATS scratch in the declared 16 MiB `/tmp` filesystem; the guard stopped it at its limit. A second attempt with `BATS_TMPDIR` still used `/tmp`, because BATS does not honor that variable as an override. Both failures are retained, including ENOSPC output. No quota, worker, or output budget was increased. The corrected simulation keeps BATS allocation in the existing bounded runtime tmpfs, unsets `TMPDIR` at test setup, then runs the actual corrected setup and drivers. `launcher-hosted-env-green-984-v3` passes both tests, peaks at 45486080 runtime bytes and 46972928 generated nonobject bytes, and cleans up before the worker reservation is released. + +The e7ea6ba3 source review and focused addendum approved that earlier head but missed this test-environment defect. Complete feedback and its later failure qualification were delivered intact to Reader receipt `1d07cc6d-48f0-451c-99e8-18751865ad5d`. Approval is not a substitute for CI. The fixed head requires fresh review and hosted checks before readiness. diff --git a/test/evidence/984-cli-launcher/hosted-environment-manifest.json b/test/evidence/984-cli-launcher/hosted-environment-manifest.json new file mode 100644 index 000000000..c7f931a30 --- /dev/null +++ b/test/evidence/984-cli-launcher/hosted-environment-manifest.json @@ -0,0 +1,102 @@ +[ + { + "phase": "launcher-hosted-env-red-984-v1", + "file": "launcher-hosted-env-red-984-v1-console.txt.gz", + "source_name": "console.log", + "original_sha256": "86b2bdca7c289bb2e293fc2697fa8d411dd63395caec4b1802bba3003cbe9e2c", + "public_sha256": "86b2bdca7c289bb2e293fc2697fa8d411dd63395caec4b1802bba3003cbe9e2c", + "normalization": "none", + "archive_sha256": "d0ec53af94c57439c6cf5fcd43647767233ff1b73e8d5d2c0f5f83e51a8fc729" + }, + { + "phase": "launcher-hosted-env-red-984-v1", + "file": "launcher-hosted-env-red-984-v1-launch.json", + "source_name": "launch.json", + "original_sha256": "af7e9d978d76e8a484e30c67c92597a215f5e6852b13dde3192d580809b0f833", + "public_sha256": "5755c9e51f3b4ece0b805820cd6df5b5546dcc34ad9a5c01db469afba13097ee", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-hosted-env-red-984-v1", + "file": "launcher-hosted-env-red-984-v1-resources.json", + "source_name": "resources.json", + "original_sha256": "e2d05e6155d95a9c99748763003668944617684a2e40bee865fa7eff55f6762a", + "public_sha256": "df0bd1799f06a996f9c0947ca1b878a4d45d9deff390105a4e58775caba7a300", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-hosted-env-green-984-v1", + "file": "launcher-hosted-env-green-984-v1-console.txt.gz", + "source_name": "console.log", + "original_sha256": "f33e419ae299bd7c8ef6f1b7e7d1fc67bae4af8c6f824680211e5743a36d05f7", + "public_sha256": "f33e419ae299bd7c8ef6f1b7e7d1fc67bae4af8c6f824680211e5743a36d05f7", + "normalization": "none", + "archive_sha256": "c5b30f830f7bb5f6dd07d11e775e8e59a3b7acc87e0beb559b8c80459d2d7a98" + }, + { + "phase": "launcher-hosted-env-green-984-v1", + "file": "launcher-hosted-env-green-984-v1-launch.json", + "source_name": "launch.json", + "original_sha256": "1d4cb0999a2f7c543d95dc821f19349698f590e8c8f884a150e4322ef0f7675b", + "public_sha256": "4b2c6fd1531eaf010da46b896e51d65fbf61f202ed1ea4e26103e150967b6de2", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-hosted-env-green-984-v1", + "file": "launcher-hosted-env-green-984-v1-resources.json", + "source_name": "resources.json", + "original_sha256": "2ec0d4cec4714342a9adc9aafdd4eea87af3f0605b5fabf8f45940515c2a3cb5", + "public_sha256": "77a9a6014868c5514259c6ba8c103c6be03ca145c675f5ae0ea05f1cfe7dd95d", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-hosted-env-green-984-v2", + "file": "launcher-hosted-env-green-984-v2-console.txt.gz", + "source_name": "console.log", + "original_sha256": "3e2c05d7d58d70751269e394b3f5e0c210a1f8389abd6bcf048b2faf7ace9d83", + "public_sha256": "3e2c05d7d58d70751269e394b3f5e0c210a1f8389abd6bcf048b2faf7ace9d83", + "normalization": "none", + "archive_sha256": "2949d5db2c72a75d6a5607e7958a652f45c4a4e530d49d14457aeebc53c3393a" + }, + { + "phase": "launcher-hosted-env-green-984-v2", + "file": "launcher-hosted-env-green-984-v2-launch.json", + "source_name": "launch.json", + "original_sha256": "9f305f890d82ab26b8b6bc7f34de29b9cf2a13af4ab67c23c145c3a71a48d088", + "public_sha256": "3cb8ef9e4dd508cc842146f572c877caf0d72d7a40e8e038ba9a8965962ea87a", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-hosted-env-green-984-v2", + "file": "launcher-hosted-env-green-984-v2-resources.json", + "source_name": "resources.json", + "original_sha256": "929d1d48eab766ce0c750099985e957e76249cba5332830fd250c89ed3f85c00", + "public_sha256": "8bb4b28c363cd0a3451ec39413283a1f727eb17f021bf4f02931045ec5caf019", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-hosted-env-green-984-v3", + "file": "launcher-hosted-env-green-984-v3-console.txt.gz", + "source_name": "console.log", + "original_sha256": "0d46a7278860618ce9153c1c8ebfb6aa647112acf8628829a9b896d1d5b0539d", + "public_sha256": "0d46a7278860618ce9153c1c8ebfb6aa647112acf8628829a9b896d1d5b0539d", + "normalization": "none", + "archive_sha256": "fc4022e112a4897f56e3358401e250634c8fa104e842471ed1fd8e9657c7e4fa" + }, + { + "phase": "launcher-hosted-env-green-984-v3", + "file": "launcher-hosted-env-green-984-v3-launch.json", + "source_name": "launch.json", + "original_sha256": "01d956fc623a8985cabf94d25aa991e635f6c837c6058b0e7814e9b2d2b46f99", + "public_sha256": "284d40ca3177646b6eb6fcf410714145b397ea82d3ff8729a8c7bc46c77625da", + "normalization": "container home replaced with " + }, + { + "phase": "launcher-hosted-env-green-984-v3", + "file": "launcher-hosted-env-green-984-v3-resources.json", + "source_name": "resources.json", + "original_sha256": "078d56aac05db5b9d1f30ae9c91d808e31a0c954779d0e186c803ecf2cfdd904", + "public_sha256": "b1b52713e93556fe5ea78fdc87bf91fb0f3c8caec1d23f7f11a960825e023f8e", + "normalization": "container home replaced with " + } +] diff --git a/test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v1-console.txt.gz b/test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v1-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..0655d1fe09985779b1267d8589b3ba68bc1d4599 GIT binary patch literal 100 zcmb2|=3oE;rvJPr&+;}X@UUI54lZe0RWQl$4#V5${!B?xhK1F(dk and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 720224473088, + "host_receipt_bytes": 70202410, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 684486852608, + "initial_build_bytes": 2337447936 +} diff --git a/test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v1-resources.json b/test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v1-resources.json new file mode 100644 index 000000000..7a9bf309b --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v1-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 125, + "guard_error": "bounded filesystem reserve reached: /tmp", + "peaks": { + "pids": 23, + "build_bytes": 2350403584, + "/data": 1847296, + "": 0, + "/tmp": 16777216, + "/dev/shm": 0, + "generated_nonobject_bytes": 5746688, + "minimum_vm_free_bytes": 684486852608 + }, + "stdout_bytes": 21, + "timeout_seconds": 1700, + "measurement_pauses": 6, + "measurement_pause_seconds": 0.5428289769333787, + "cgroup": { + "pids.current": "23", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v2-console.txt.gz b/test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v2-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..a0722606d7f962f63a7824beb46f9284d4710f05 GIT binary patch literal 2105 zcmeH{{WIGK0LEQ!H>E~9oR`MSbhS`RI<{}Hl%vgQHbBbG%2=gv2Kr#hyJh-<@wq=L9wwv6Nw_ED!F#_6?8o%lu<{QvEkl3% z$=8^qwNamiCSQzrPqda!_C~(_wX_&s1kZ9EklkT(LK~I+pVKi+s@NUYztNEv2o3^M z7_(bDE=3`s6Y=v!#h#KP2oNp2*amLYM`=2m%B2UFXQF`}Uk?GUc7$(gfXxBG8hMhw z*WQU2kjgigzl)1Z`b-FvC82OZYK%{WwT}`22K2)L5tW_$OZ(0|N}!YO9*|HE&cF_H>|l>+OOgf^r;Pe zj!kZfi7cIb2T9tcn173e80>ADr|5Mj{0u)q&>3S1Ia9`AOyXT=HFCJ#1ltDVq9?d8 zJ%K_ds1z=bYr6%=Jj$mW-xr-xX3ek0E`%4Ny5K7+XXMw3R4dcMz^B)t$90V0cm@A! z5f1U^fe=Xnsr$Z6!ye7P_3tmi(7j~P-vLi$mB~VgH(N$fL+ddF%VMWFzVGbEkN1>l z-9Bxrhw6kN)GoUGi953{2VCf4*7q{m%NxSKG82iGi)5PPWoC7by0zZl$|wHJj}Cs4 zw02YlRo3D8X59+iW1kR_oodRnrIOaEVqo7H0WGvRDygID7Bi%DrsnqpcSKTmq>z3u zVnO3|tt0VlHP=*KzuuiFk-I(WJk{_s&rUwo*HyJJI7$2=IY^|^%*J{;me$=YV}mps zkhTK84hk|rJQiC7cBREW?$|Eew&(cv-2o~8&HLMn$Z$6>qP3rsEYe>yHF<3nxV5ue#?#lPq z2Ew@Ul4lHBgX&dY1(*X@(q4dY(N+>>VmHg+9gOJRR4A2(oYTt|B@8tmCm^P1S5b9` z31fMej&!rSjDRe!a(dYT(D{SEUn^5tQT>Ksa{c)yvgOSB-3J9x~JVGS? and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 720209481728, + "host_receipt_bytes": 70204722, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 684473925632, + "initial_build_bytes": 2350407680 +} diff --git a/test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v2-resources.json b/test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v2-resources.json new file mode 100644 index 000000000..49543834c --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v2-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 1, + "guard_error": null, + "peaks": { + "pids": 27, + "build_bytes": 2353819648, + "/data": 1847296, + "": 0, + "/tmp": 11104256, + "/dev/shm": 0, + "generated_nonobject_bytes": 13422592, + "minimum_vm_free_bytes": 684473925632 + }, + "stdout_bytes": 306683, + "timeout_seconds": 1700, + "measurement_pauses": 5, + "measurement_pause_seconds": 0.4532747189514339, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v3-console.txt.gz b/test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v3-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..7ae347e4814a4fafbfd140e7d48eb716f0468b9d GIT binary patch literal 154 zcmV;L0A>FliwFP!00002{}qfu4#F@D1n+r;AAlm7o_gklg!qHom^Q+7kevkady?C( zG&3y(A7($h>FO81xXJtA@*5^dVg;Eg!tHT~YGjaw;F%-ANApHz@J;1_j;&0v| zN&v and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 720193462272, + "host_receipt_bytes": 70545960, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 684458135552, + "initial_build_bytes": 2366177280 +} diff --git a/test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v3-resources.json b/test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v3-resources.json new file mode 100644 index 000000000..558609823 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-hosted-env-green-984-v3-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 0, + "guard_error": null, + "peaks": { + "pids": 39, + "build_bytes": 2369589248, + "/data": 45486080, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 46972928, + "minimum_vm_free_bytes": 684458135552 + }, + "stdout_bytes": 175, + "timeout_seconds": 1700, + "measurement_pauses": 5, + "measurement_pause_seconds": 0.44647442002315074, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} diff --git a/test/evidence/984-cli-launcher/launcher-hosted-env-red-984-v1-console.txt.gz b/test/evidence/984-cli-launcher/launcher-hosted-env-red-984-v1-console.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..76b3415adcbd2d49ec48748d9789dac3bddcb75b GIT binary patch literal 246 zcmVB_+>!l68FDX4x!`lTL)m3gt8Dm4^q#xpBn7Pu!n8<18CdkT`O>%?L;%lE zn-x^B7GW0$>|HykdEYg^ckBpTb*Q30x-3eeQB+ya(d-pj^Ac?z*S8Ow=ru{s%K!2` w@-{NYE?TlDG+_Pml5>4io_p&01A`g{*EL(=@s7yS94@Qa4?z4RaAE-f00*#m1ONa4 literal 0 HcmV?d00001 diff --git a/test/evidence/984-cli-launcher/launcher-hosted-env-red-984-v1-launch.json b/test/evidence/984-cli-launcher/launcher-hosted-env-red-984-v1-launch.json new file mode 100644 index 000000000..7e9e0d293 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-hosted-env-red-984-v1-launch.json @@ -0,0 +1,43 @@ +{ + "phase": "launcher-hosted-env-red-984-v1", + "inner_guard_sha256": "2e898488b42ef2d6885c79a124d3deef5cc17086f5b8846e75833145a75dd27d", + "worker": "git-warp-tests", + "image": "sha256:9f145953f6e79a59749a683d11a476133cb7cef0588b79256dc195b1d0c87ad7", + "source_base": "e7ea6ba3c6ec6940ab8115eb070cd2854d5c39b4", + "source_archive_sha256": "96ee5113e5ccbeb93fc9c7ed44571c78fe51e73d0f5698bc3e5fce55574591ea", + "source_archive_bytes": 21422080, + "baseline_inputs": {}, + "command": [ + "env", + "-u", + "TMPDIR", + "python3", + "scripts/check-cli-process.py" + ], + "lock_store": "workstation.git", + "lock_keys": [ + "host/docker/git-warp-tests/" + ], + "outputs": [ + "build volume /app", + "runtime /data", + "bounded /tmp and and /dev/shm", + "Docker rotated log", + "host receipts" + ], + "host_free_bytes": 720224235520, + "host_receipt_bytes": 70199875, + "build_limit_bytes": 21474836480, + "data_quota_bytes": 3221225472, + "generated_nonobject_limit_bytes": 100663296, + "stdout_limit_bytes": 16777216, + "memory_bytes": 8589934592, + "cpus": 4, + "cpu_affinity": "0-3", + "pids_limit": 768, + "timeout_seconds": 1700, + "stop_boundary": "git-warp-tests", + "guard": "inner guard plus outer host free/log monitor; read-only container root", + "vm_free_bytes": 684486803456, + "initial_build_bytes": 2337447936 +} diff --git a/test/evidence/984-cli-launcher/launcher-hosted-env-red-984-v1-resources.json b/test/evidence/984-cli-launcher/launcher-hosted-env-red-984-v1-resources.json new file mode 100644 index 000000000..d91dc03e4 --- /dev/null +++ b/test/evidence/984-cli-launcher/launcher-hosted-env-red-984-v1-resources.json @@ -0,0 +1,32 @@ +{ + "exit_code": 1, + "guard_error": null, + "peaks": { + "pids": 27, + "build_bytes": 2340859904, + "/data": 1748992, + "": 0, + "/tmp": 0, + "/dev/shm": 0, + "generated_nonobject_bytes": 2138112, + "minimum_vm_free_bytes": 684486803456 + }, + "stdout_bytes": 354, + "timeout_seconds": 1700, + "measurement_pauses": 4, + "measurement_pause_seconds": 0.3642280410276726, + "cgroup": { + "pids.current": "3", + "pids.max": "768", + "pids.events": "max 0", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0\nsock_throttled 0", + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-3" + }, + "limits": { + "build_bytes": 21474836480, + "runtime_tmpfs_bytes": 3221225472, + "stdout_bytes": 16777216, + "generated_nonobject_bytes": 100663296 + } +} From 723a643029996b5b8aee81e6b9a6c886e88cd10d Mon Sep 17 00:00:00 2001 From: James Ross Date: Thu, 8 Oct 2026 01:30:37 -0700 Subject: [PATCH 6/6] docs: qualify historical launcher test counts (#984) --- test/evidence/984-cli-launcher/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/evidence/984-cli-launcher/README.md b/test/evidence/984-cli-launcher/README.md index cf59d8b0f..8bf6be669 100644 --- a/test/evidence/984-cli-launcher/README.md +++ b/test/evidence/984-cli-launcher/README.md @@ -32,7 +32,7 @@ The original candidate payload is 746123 compressed bytes, 3257164 unpacked byte The proposal reviewer violated the read-only assignment and committed `88a298dd`. That history is preserved. The primary agent inspected and tested the implementation. The complete proposal feedback and qualification were delivered intact to Reader receipt `2ba06dee-4118-44d8-847f-2db8030a5c22`. That proposal output does not count as independent implemented-code approval. A separate clone is used for the final review. -The real pre-push chain on `2eb60b816add5dd3f6b0462af345ea838c18104a` passes nine static tasks and six unit shards: 304/974/910/3139/2100/1250, totaling 8677 passing assertions with two existing skips. A nested script probe is included in those totals. Final current-head validation and independent review must still pass after subsequent test/evidence commits. Draft PR #993 targets the audit prerequisite branch. Mainline merging remains paused. +The real pre-push chain on `2eb60b816add5dd3f6b0462af345ea838c18104a` passes nine static tasks and six unit shards: 304/974/910/3139/2100/1250, totaling 8677 passing project tests with two existing skips. The nested script probe belongs to the harness; its child summary is not added as another project suite. Final current-head validation and independent review must still pass after subsequent test/evidence commits. Draft PR #993 targets the audit prerequisite branch. Mainline merging remains paused. Manual SSJS scorecard: no new domain concept requires a runtime class; entry validation stays at the executable boundary; loading behavior remains in its launcher; no message parsing controls production behavior; no domain time or entropy is added; no casts or fake shape trust are added. All six checks are green on changed production code.