diff --git a/lando/server/jobapi.py b/lando/server/jobapi.py
index a049cd0..fe87b69 100644
--- a/lando/server/jobapi.py
+++ b/lando/server/jobapi.py
@@ -481,9 +481,9 @@ class CWLCommand(object):
         Loads JSON-encoded CWL commands from dictionary
         :param data:
         """
-        self.base_command = json.loads(data.get('cwl_base_command'))
-        self.pre_process_command = json.loads(data.get('cwl_pre_process_command','[]'))
-        self.post_process_command = json.loads(data.get('cwl_post_process_command','[]'))
+        self.base_command = data['cwl_base_command']
+        self.pre_process_command = data.get('cwl_pre_process_command', [])
+        self.post_process_command = data.get('cwl_post_process_command', [])
 
     def __str__(self):
         return self.base_command

TypeError when parsing v2 CWLCommand
Error:
```
  File "/usr/local/lib/python3.6/site-packages/lando-0.9.3-py3.6.egg/lando/server/jobapi.py", line 482, in __init__
    self.base_command = json.loads(data.get('cwl_base_command'))
  File "/usr/local/lib/python3.6/json/__init__.py", line 348, in loads
    'not {!r}'.format(s.__class__.__name__))
TypeError: the JSON object must be str, bytes or bytearray, not 'list'
```
The problem is we are attempting to decode json and this is no longer necessary for bespin-api `v2`.
https://github.com/Duke-GCB/lando/blob/ee4148bc7934c94be4e0bcbd129ce9ee1ba8afa5/lando/server/jobapi.py#L484-L486
diff --git a/lando/server/tests/test_jobapi.py b/lando/server/tests/test_jobapi.py
index 4ef4c84..8fce10b 100644
--- a/lando/server/tests/test_jobapi.py
+++ b/lando/server/tests/test_jobapi.py
@@ -547,17 +547,17 @@ class CWLCommandTests(TestCase):
 
     def setUp(self):
         self.only_base_command_data = {
-            "cwl_base_command": "[\"base\", \"command\"]",
+            "cwl_base_command": ["base", "command"],
         }
         self.pre_and_post_data = {
-            "cwl_base_command": "[\"base\", \"command\"]",
-            "cwl_post_process_command": "[\"post\",\"process\",\"command\"]",
-            "cwl_pre_process_command": "[\"pre\",\"process\",\"command\"]"
+            "cwl_base_command": ["base", "command"],
+            "cwl_post_process_command": ["post", "process", "command"],
+            "cwl_pre_process_command": ["pre", "process", "command"]
         }
 
     def test_loads_base_command(self):
         command = CWLCommand(self.only_base_command_data)
-        self.assertEqual(command.base_command, ['base','command'])
+        self.assertEqual(command.base_command, ['base', 'command'])
 
     def test_requires_base_command(self):
         with self.assertRaises(Exception):
@@ -570,9 +570,9 @@ class CWLCommandTests(TestCase):
 
     def test_loads_pre_and_post(self):
         command = CWLCommand(self.pre_and_post_data)
-        self.assertEqual(command.base_command, ['base','command'])
-        self.assertEqual(command.pre_process_command, ['pre','process','command'])
-        self.assertEqual(command.post_process_command, ['post','process','command'])
+        self.assertEqual(command.base_command, ['base', 'command'])
+        self.assertEqual(command.pre_process_command, ['pre', 'process', 'command'])
+        self.assertEqual(command.post_process_command, ['post', 'process', 'command'])
 
 
 class VMSettingsTests(TestCase):

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov pytest-xdist pytest-mock pytest-asyncio
apt-get update apt-get install -y gcc
3.6
devRequirements.txt
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
coverage==6.2
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
execnet==1.9.0
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@ee4148bc7934c94be4e0bcbd129ce9ee1ba8afa5#egg=lando
lando-messaging==0.7.6
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
nose==1.3.7
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.5.1
pyasn1-modules==0.3.0
pycparser==2.21
pydot==1.4.2
PyJWT==2.4.0
pyparsing==2.4.7
pytest==7.0.1
pytest-asyncio==0.16.0
pytest-cov==4.0.0
pytest-mock==3.6.1
pytest-xdist==3.0.2
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
      - coverage==6.2
      - 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
      - execnet==1.9.0
      - 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.6
      - 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
      - nose==1.3.7
      - 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.5.1
      - pyasn1-modules==0.3.0
      - pycparser==2.21
      - pydot==1.4.2
      - pyjwt==2.4.0
      - pyparsing==2.4.7
      - pytest==7.0.1
      - pytest-asyncio==0.16.0
      - pytest-cov==4.0.0
      - pytest-mock==3.6.1
      - pytest-xdist==3.0.2
      - 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/server/tests/test_jobapi.py::CWLCommandTests::test_defaults_pre_and_post lando/server/tests/test_jobapi.py::CWLCommandTests::test_loads_base_command lando/server/tests/test_jobapi.py::CWLCommandTests::test_loads_pre_and_post
lando/server/tests/test_jobapi.py::TestJobApi::test_get_credentials lando/server/tests/test_jobapi.py::TestJobApi::test_get_input_files lando/server/tests/test_jobapi.py::TestJobApi::test_get_job_api lando/server/tests/test_jobapi.py::TestJobApi::test_get_jobs_for_vm_instance_name lando/server/tests/test_jobapi.py::TestJobApi::test_get_run_job_data lando/server/tests/test_jobapi.py::TestJobApi::test_get_store_output_job_data lando/server/tests/test_jobapi.py::TestJobApi::test_get_workflow_methods_document lando/server/tests/test_jobapi.py::TestJobApi::test_job_constructor_volume_size lando/server/tests/test_jobapi.py::TestJobApi::test_post_error lando/server/tests/test_jobapi.py::TestJobApi::test_save_project_details lando/server/tests/test_jobapi.py::TestJobApi::test_set_job_state lando/server/tests/test_jobapi.py::TestJobApi::test_set_job_step lando/server/tests/test_jobapi.py::TestJobApi::test_set_vm_instance_name lando/server/tests/test_jobapi.py::TestJobApi::test_set_vm_volume_name lando/server/tests/test_jobapi.py::TestJob::test_cleanup_vm_default lando/server/tests/test_jobapi.py::TestJob::test_cleanup_vm_false lando/server/tests/test_jobapi.py::TestJob::test_cleanup_vm_true lando/server/tests/test_jobapi.py::CWLCommandTests::test_requires_base_command lando/server/tests/test_jobapi.py::VMSettingsTests::test_loads_vmsettings
lando/server/jobapi.py
lando/server/jobapi.py