diff --git a/lando/k8s/jobmanager.py b/lando/k8s/jobmanager.py
index 438eb1b..70c43e4 100644
--- a/lando/k8s/jobmanager.py
+++ b/lando/k8s/jobmanager.py
@@ -168,23 +168,21 @@ class JobManager(object):
                 mount_path=system_data_volume.mount_path,
                 volume_claim_name=system_data_volume.volume_claim_name,
                 read_only=True))
-        command_parts = run_workflow_config.command
-        command_parts.extend(["--tmp-outdir-prefix", Paths.TMPOUT_DATA + "/",
-                              "--outdir", Paths.OUTPUT_RESULTS_DIR + "/",
-                              "--max-ram", self.job.job_flavor_memory,
-                              "--max-cores", str(self.job.job_flavor_cpus),
-                              "--usage-report", str(self.names.usage_report_path),
-                              ])
-        command_parts.extend([
-            self.names.workflow_path,
-            self.names.job_order_path,
-            ">{}".format(self.names.run_workflow_stdout_path),
-            "2>{}".format(self.names.run_workflow_stderr_path),
-        ])
+        command = run_workflow_config.command
+        command.extend(["--tmp-outdir-prefix", Paths.TMPOUT_DATA + "/",
+                        "--outdir", Paths.OUTPUT_RESULTS_DIR + "/",
+                        "--max-ram", self.job.job_flavor_memory,
+                        "--max-cores", str(self.job.job_flavor_cpus),
+                        "--usage-report", self.names.usage_report_path,
+                        "--stdout", self.names.run_workflow_stdout_path,
+                        "--stderr", self.names.run_workflow_stderr_path,
+                        self.names.workflow_path,
+                        self.names.job_order_path,
+                        ])
         container = Container(
             name=self.names.run_workflow,
             image_name=run_workflow_config.image_name,
-            command=["bash", "-c", ' '.join(command_parts)],
+            command=command,
             env_dict={
                 "CALRISSIAN_POD_NAME": FieldRefEnvVar(field_path="metadata.name")
             },

k8s workflow runner logs are empty
We started redirecting stderr to a file so we can save this long term for successful jobs:
https://github.com/Duke-GCB/lando/blob/6f370eee825f78b694df3a640bc1cb75b4e61ec5/lando/k8s/jobmanager.py#L170-L175
This makes failed jobs have not logs to be saved. The error is recorded in a pvc, but it should also be `tee`d into the k8s output logs as well.
diff --git a/lando/k8s/tests/test_jobmanager.py b/lando/k8s/tests/test_jobmanager.py
index 7a145a5..dd8640b 100644
--- a/lando/k8s/tests/test_jobmanager.py
+++ b/lando/k8s/tests/test_jobmanager.py
@@ -198,11 +198,11 @@ class TestJobManager(TestCase):
                                 '--outdir /bespin/output-data/results/ ' \
                                 '--max-ram 1G --max-cores 2 ' \
                                 '--usage-report /bespin/output-data/job-51-jpb-resource-usage.json ' \
+                                '--stdout /bespin/output-data/bespin-workflow-output.json ' \
+                                '--stderr /bespin/output-data/bespin-workflow-output.log ' \
                                 '/bespin/job-data/workflow/someurl ' \
-                                '/bespin/job-data/job-order.json ' \
-                                '>/bespin/output-data/bespin-workflow-output.json ' \
-                                '2>/bespin/output-data/bespin-workflow-output.log'
-        self.assertEqual(job_container.command, ['bash', '-c', expected_bash_command],
+                                '/bespin/job-data/job-order.json'.split(' ')
+        self.assertEqual(job_container.command, expected_bash_command,
                          'run workflow command combines job settings and staged files')
         self.assertEqual(job_container.env_dict['CALRISSIAN_POD_NAME'].field_path, 'metadata.name',
                          'We should store the pod name in a CALRISSIAN_POD_NAME environment variable')

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
adal==1.2.7
appdirs==1.4.4
argcomplete==3.1.2
attrs==22.2.0
CacheControl==0.12.14
cachetools==4.2.4
certifi==2021.5.30
cffi==1.15.1
chardet==3.0.4
coloredlogs==6.4
cryptography==40.0.2
cwl-upgrader==1.2.8
cwl-utils==0.28
cwlref-runner==1.0
cwltool==3.1.20230719185429
decorator==4.4.2
dogpile.cache==1.2.2
DukeDSClient==1.0.3
future==1.0.0
google-auth==2.22.0
humanfriendly==2.4
idna==2.7
importlib-metadata==4.8.3
importlib-resources==5.4.0
iniconfig==1.1.1
iso8601==1.1.0
isodate==0.6.1
Jinja2==2.9.5
jmespath==0.10.0
jsonpatch==1.32
jsonpointer==2.3
keystoneauth1==5.1.3
kubernetes==8.0.1
-e git+https://github.com/Duke-GCB/lando.git@10eb77896e2e4ff0810b6249fb92a303aa966d18#egg=lando
lando-messaging==0.7.7
lockfile==0.12.2
lxml==5.3.1
Markdown==2.6.9
MarkupSafe==2.0.1
mistune==2.0.5
msgpack==1.0.5
munch==4.0.0
mypy-extensions==1.0.0
netifaces==0.11.0
networkx==2.5.1
oauthlib==3.2.2
openstacksdk==0.49.0
os-client-config==2.1.0
os-service-types==1.7.0
packaging==21.3
pbr==6.1.1
pika==0.10.0
pluggy==1.0.0
prov==1.5.1
psutil==7.0.0
py==1.11.0
pyasn1==0.4.8
pyasn1-modules==0.3.0
pycparser==2.21
pydot==1.4.2
PyJWT==2.4.0
pyparsing==2.4.7
pytest==7.0.1
python-dateutil==2.6.0
pytz==2025.2
PyYAML==3.12
rdflib==5.0.0
rdflib-jsonld==0.6.1
requests==2.20.1
requests-oauthlib==2.0.0
requestsexceptions==1.4.0
rsa==4.9
ruamel.yaml==0.17.40
ruamel.yaml.clib==0.2.8
schema-salad==8.4.20230808163024
shade==1.29.0
shellescape==3.8.1
six==1.17.0
stevedore==3.5.2
tomli==1.2.3
typing_extensions==4.1.1
urllib3==1.24.3
websocket-client==1.3.1
zipp==3.6.0

name: lando
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - adal==1.2.7
      - appdirs==1.4.4
      - argcomplete==3.1.2
      - attrs==22.2.0
      - cachecontrol==0.12.14
      - cachetools==4.2.4
      - cffi==1.15.1
      - chardet==3.0.4
      - coloredlogs==6.4
      - cryptography==40.0.2
      - cwl-upgrader==1.2.8
      - cwl-utils==0.28
      - cwlref-runner==1.0
      - cwltool==3.1.20230719185429
      - decorator==4.4.2
      - dogpile-cache==1.2.2
      - dukedsclient==1.0.3
      - future==1.0.0
      - google-auth==2.22.0
      - humanfriendly==2.4
      - idna==2.7
      - importlib-metadata==4.8.3
      - importlib-resources==5.4.0
      - iniconfig==1.1.1
      - iso8601==1.1.0
      - isodate==0.6.1
      - jinja2==2.9.5
      - jmespath==0.10.0
      - jsonpatch==1.32
      - jsonpointer==2.3
      - keystoneauth1==5.1.3
      - kubernetes==8.0.1
      - lando-messaging==0.7.7
      - lockfile==0.12.2
      - lxml==5.3.1
      - markdown==2.6.9
      - markupsafe==2.0.1
      - mistune==2.0.5
      - msgpack==1.0.5
      - munch==4.0.0
      - mypy-extensions==1.0.0
      - netifaces==0.11.0
      - networkx==2.5.1
      - oauthlib==3.2.2
      - openstacksdk==0.49.0
      - os-client-config==2.1.0
      - os-service-types==1.7.0
      - packaging==21.3
      - pbr==6.1.1
      - pika==0.10.0
      - pluggy==1.0.0
      - prov==1.5.1
      - psutil==7.0.0
      - py==1.11.0
      - pyasn1==0.4.8
      - pyasn1-modules==0.3.0
      - pycparser==2.21
      - pydot==1.4.2
      - pyjwt==2.4.0
      - pyparsing==2.4.7
      - pytest==7.0.1
      - python-dateutil==2.6.0
      - pytz==2025.2
      - pyyaml==3.12
      - rdflib==5.0.0
      - rdflib-jsonld==0.6.1
      - requests==2.20.1
      - requests-oauthlib==2.0.0
      - requestsexceptions==1.4.0
      - rsa==4.9
      - ruamel-yaml==0.17.40
      - ruamel-yaml-clib==0.2.8
      - schema-salad==8.4.20230808163024
      - shade==1.29.0
      - shellescape==3.8.1
      - six==1.17.0
      - stevedore==3.5.2
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - urllib3==1.24.3
      - websocket-client==1.3.1
      - zipp==3.6.0
prefix: /opt/conda/envs/lando

lando/k8s/tests/test_jobmanager.py::TestJobManager::test_create_run_workflow_job
lando/k8s/tests/test_jobmanager.py::TestJobManager::test_cleanup_all lando/k8s/tests/test_jobmanager.py::TestJobManager::test_cleanup_organize_output_project_job lando/k8s/tests/test_jobmanager.py::TestJobManager::test_cleanup_record_output_project_job lando/k8s/tests/test_jobmanager.py::TestJobManager::test_cleanup_run_workflow_job lando/k8s/tests/test_jobmanager.py::TestJobManager::test_cleanup_save_output_job lando/k8s/tests/test_jobmanager.py::TestJobManager::test_cleanup_stage_data_job lando/k8s/tests/test_jobmanager.py::TestJobManager::test_create_organize_output_project_job lando/k8s/tests/test_jobmanager.py::TestJobManager::test_create_record_output_project_job lando/k8s/tests/test_jobmanager.py::TestJobManager::test_create_run_workflow_persistent_volumes lando/k8s/tests/test_jobmanager.py::TestJobManager::test_create_save_output_job lando/k8s/tests/test_jobmanager.py::TestJobManager::test_create_stage_data_job lando/k8s/tests/test_jobmanager.py::TestJobManager::test_create_stage_data_persistent_volumes lando/k8s/tests/test_jobmanager.py::TestJobManager::test_make_job_labels lando/k8s/tests/test_jobmanager.py::TestJobManager::test_read_record_output_project_details lando/k8s/tests/test_jobmanager.py::TestJobManager::test_read_record_output_project_details_missing_fields lando/k8s/tests/test_jobmanager.py::TestJobManager::test_read_record_output_project_details_pod_not_found lando/k8s/tests/test_jobmanager.py::TestNames::test_constructor lando/k8s/tests/test_jobmanager.py::TestNames::test_strips_username_after_at_sign lando/k8s/tests/test_jobmanager.py::TestStageDataConfig::test_constructor lando/k8s/tests/test_jobmanager.py::TestRunWorkflowConfig::test_constructor lando/k8s/tests/test_jobmanager.py::TestOrganizeOutputConfig::test_constructor lando/k8s/tests/test_jobmanager.py::TestSaveOutputConfig::test_constructor lando/k8s/tests/test_jobmanager.py::TestRecordOutputProjectConfig::test_constructor
lando/k8s/jobmanager.py
lando/k8s/jobmanager.py