Move testing task request creation into separate module

This makes the testing module a more readable size, and removes
dependencies from fuchsia/build recipe onto the testing module, which
is conceptually cleaner.

Also remove several tests from the testing recipe module example, since
they're not needed for coverage.

Bug: 41486
Change-Id: I7e3a93c5d0cf20a391869d1c3114f2b65e27678b
diff --git a/recipe_modules/build/examples/full.py b/recipe_modules/build/examples/full.py
index 6f6fc84..28807fe 100644
--- a/recipe_modules/build/examples/full.py
+++ b/recipe_modules/build/examples/full.py
@@ -24,7 +24,7 @@
     'fuchsia/experimental',
     'fuchsia/fuchsia',
     'fuchsia/jiri',
-    'fuchsia/testing',
+    'fuchsia/testing_requests',
     'fuchsia/testsharder',
     'recipe_engine/buildbucket',
     'recipe_engine/cipd',
@@ -245,7 +245,7 @@
     # artifacts has to be configured before calling shard_requests().
     api.artifacts.gcs_bucket = gcs_bucket
     api.artifacts.uuid = 'uuid'
-    shard_requests = api.testing.shard_requests(
+    shard_requests = api.testing_requests.shard_requests(
         build_artifacts,
         api.buildbucket.build,
         0,
@@ -490,16 +490,16 @@
       properties=dict(build_generated_sources=True),
   )
 
-  download_orchestration_inputs = api.testing.shards_step_data(
+  download_orchestration_inputs = api.testing_requests.shards_step_data(
       step_name='download test orchestration inputs.load test shards',
       shards=[
           api.testsharder.shard(
               name='QEMU',
-              tests=api.testing.default_tests(),
+              tests=api.testing_requests.default_tests(),
               dimensions=dict(device_type='QEMU'),
           ),
-      ]) + api.testing.task_requests_step_data(
-          [api.testing.task_request_jsonish(legacy_qemu=True)],
+      ]) + api.testing_requests.task_requests_step_data(
+          [api.testing_requests.task_request_jsonish(legacy_qemu=True)],
           'download test orchestration inputs.load task requests',
       )
 
diff --git a/recipe_modules/testing/__init__.py b/recipe_modules/testing/__init__.py
index c64ac94..dbbe755 100644
--- a/recipe_modules/testing/__init__.py
+++ b/recipe_modules/testing/__init__.py
@@ -1,9 +1,9 @@
+# Copyright 2019 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
 DEPS = [
-    'fuchsia/artifacts',
-    'fuchsia/build',
     'fuchsia/buildbucket_util',
-    'fuchsia/cloudkms',
-    'fuchsia/experimental',
     'fuchsia/gsutil',
     'fuchsia/minfs',
     'fuchsia/emu',
@@ -11,13 +11,11 @@
     'fuchsia/swarming_retry',
     'fuchsia/symbolize',
     'fuchsia/tar',
+    'fuchsia/testing_requests',
     'fuchsia/testsharder',
     'fuchsia/upload',
-    'fuchsia/zbi',
     'recipe_engine/buildbucket',
-    'recipe_engine/cipd',
     'recipe_engine/context',
-    'recipe_engine/isolated',
     'recipe_engine/json',
     'recipe_engine/file',
     'recipe_engine/path',
diff --git a/recipe_modules/testing/api.py b/recipe_modules/testing/api.py
index 2e7f7c3..2d2a506 100644
--- a/recipe_modules/testing/api.py
+++ b/recipe_modules/testing/api.py
@@ -3,7 +3,6 @@
 # found in the LICENSE file.
 
 import collections
-import copy
 
 import attr
 
@@ -15,42 +14,14 @@
 # List of available targets.
 TARGETS = ['x64', 'arm64']
 
-# The PCI address to use for the block device to contain test results.
-TEST_FS_PCI_ADDR = '06.0'
-
-# The path in the BootFS manifest that we want runcmds to show up at.
-RUNCMDS_BOOTFS_PATH = 'infra/runcmds'
-
-SECRETSHIM_CIPD_VERSION = 'git_revision:63ab3ac613fceb52ac49b63b43fce841a2585645'
-
 # Name of BigQuery project and table for uploading artifacts.
 BIGQUERY_PROJECT = 'fuchsia-infra'
 BIGQUERY_ARTIFACTS_DATASET = 'artifacts'
-
-# Image and manifest names produced by the build.
-IMAGES_JSON = 'images.json'
-STORAGE_FULL = 'storage-full'
-
-TEST_RESULTS_ARCHIVE_NAME = 'out.tar'
-TEST_RESULTS_MINFS_NAME = 'output.fs'
-SERIAL_LOG_NAME = 'serial.txt'
-SYSLOG_NAME = 'syslog.txt'
 TEST_SUMMARY_JSON = 'summary.json'
 KERNEL_LOG = 'kernel_log.txt'
 COVARGS_LOG_LEVEL = 'debug'
 COVARGS_OUTPUT_JSON = 'covargs-output.json'
 
-# The log level to use for botanist invocations in test tasks. Can be one of
-# "fatal", "error", "warning", "info", "debug", or "trace", where "trace" is
-# the most verbose, and fatal is the least.
-BOTANIST_LOG_LEVEL = 'debug'
-
-# The path to the botanist config for devices preprovisioned into containers.
-BOTANIST_DEVICE_CONFIG = '/etc/botanist/config.json'
-
-# System path at which authorized SSH keys are stored.
-AUTHORIZED_KEY_PATH = 'data/ssh/authorized_keys'
-
 
 @attr.s
 class FuchsiaTestResults(object):
@@ -234,7 +205,7 @@
     # Check serial log for failure messages
     # TODO(9936): Replace with running binary tool once created.
     fail_strings = ['DEVICE SUSPEND TIMED OUT', 'ASSERT FAILED']
-    log_path = self.output_dir.join(SERIAL_LOG_NAME)
+    log_path = self.output_dir.join(self._api.testing_requests.SERIAL_LOG_NAME)
     self._api.path.mock_add_paths(log_path)
     if self._api.path.exists(log_path):
       self._check_log_for_failures(log_path, fail_strings)
@@ -343,7 +314,8 @@
       attempt.test_results_archive = None
       for relative_path, absolute_path in sorted(result.outputs.iteritems()):
         if relative_path in [
-            TEST_RESULTS_ARCHIVE_NAME, TEST_RESULTS_MINFS_NAME
+            self._api.testing_requests.TEST_RESULTS_ARCHIVE_NAME,
+            self._api.testing_requests.TEST_RESULTS_MINFS_NAME
         ]:
           attempt.test_results_archive = absolute_path
 
@@ -403,7 +375,8 @@
       # Check serial log for failure messages
       # TODO(9936): Replace with running binary tool once created.
       fail_strings = ['DEVICE SUSPEND TIMED OUT', 'ASSERT FAILED']
-      log_path = attempt.result.output_dir.join(SERIAL_LOG_NAME)
+      log_path = attempt.result.output_dir.join(
+          self._api.testing_requests.SERIAL_LOG_NAME)
       self._api.path.mock_add_paths(log_path)
       if self._api.path.exists(log_path):
         log_name = self._api.path.basename(log_path)
@@ -515,7 +488,10 @@
             passed_tests_step.presentation.step_text = ''.join(
                 '\n' + test_name for test_name in passed_tests)
 
-      for log_name in [SYSLOG_NAME, SERIAL_LOG_NAME]:
+      for log_name in [
+          self._api.testing_requests.SYSLOG_NAME,
+          self._api.testing_requests.SERIAL_LOG_NAME
+      ]:
         if log_name in attempt.result.outputs:
           self._present_output_file(
               name=log_name, path=attempt.result.outputs[log_name], step=step)
@@ -545,233 +521,6 @@
   return Task(*args, api=api, **kwargs)
 
 
-class _TaskRequester(object):
-  """Creates requests for swarming tasks that run tests."""
-
-  def __init__(self, api, buildbucket_build, per_test_timeout_secs, pool,
-               swarming_expiration_timeout_secs, swarming_io_timeout_secs,
-               timeout_secs, use_runtests):
-    self._api = api
-    self._buildbucket_build = buildbucket_build
-    self._per_test_timeout_secs = per_test_timeout_secs
-    self._pool = pool
-    self._swarming_expiration_timeout_secs = swarming_expiration_timeout_secs
-    self._swarming_io_timeout_secs = swarming_io_timeout_secs
-    self._timeout_secs = timeout_secs
-    self._use_runtests = use_runtests
-
-  def request(self, shard, build_artifacts):
-    # Copy the build_artifacts object to be modified for each shard.
-    build_artifacts = copy.deepcopy(build_artifacts)
-
-    if self._api.testing._uses_legacy_qemu(shard):
-      task_request = self._api.testing._construct_legacy_qemu_task_request(
-          task_name=shard.name,
-          pool=self._pool,
-          build_artifacts=build_artifacts,
-          timeout_secs=self._timeout_secs,
-          swarming_io_timeout_secs=self._swarming_io_timeout_secs,
-          swarming_expiration_timeout_secs=(
-              self._swarming_expiration_timeout_secs),
-          # TODO(IN-654): Add support for secret_bytes.
-          secret_bytes='',
-          qemu_type=shard.device_type,
-          shard=shard,
-      )
-    else:
-      task_request = self._construct_test_task_request(
-          build_artifacts=build_artifacts, shard=shard)
-
-    return self._api.build.ShardTaskRequest(shard, task_request)
-
-  def _construct_test_task_request(self, build_artifacts, shard):
-    """Constructs a Swarming task request to run a shard of Fuchsia tests.
-
-    Args:
-      build_artifacts (BuildArtifacts): The Fuchsia build artifacts to test.
-      shard (api.testsharder.Shard): A shard of tests.
-      timeout_secs (int): The amount of seconds to wait for the tests to execute
-        before giving up.
-
-    Returns:
-      An api.swarming.TaskRequest representing the swarming task request.
-    """
-    # To freely archive files from the build directory, the source, and those we
-    # dynamically create, we create a tree of symlinks in a fresh directory and
-    # isolate that. This solves the problems of (a) finding a root directory
-    # that works for all artifacts, (b) being able to create files in that
-    # directory without fear of collision, and (c) not having to isolate
-    # extraneous files.
-    isolate_tree = self._api.file.symlink_tree(
-        root=self._api.path.mkdtemp('isolate'))
-
-    test_manifest = 'tests.json'
-    self._api.file.write_json(
-        'write test manifest',
-        isolate_tree.root.join(test_manifest),
-        [test.render_to_jsonish() for test in shard.tests],
-        indent=2)
-
-    cmd = []
-    outputs = []
-    ensure_file = self._api.cipd.EnsureFile()
-    dimensions = {'pool': self._pool}
-    test_bot_cpu = 'x64'
-    is_emu_type = self._api.emu.is_emulator_type(shard.device_type)
-
-    # This command spins up a metadata server that allows its subcommands to
-    # automagically authenticate with LUCI auth, provided the sub-exec'ed tool
-    # was written in go or dart and respectively makes use of the standard
-    # cloud.google.com/go/compute/metadata or
-    # github.com/dart-lang/googleapis_auth authentication libraries. Such
-    # libraries look for a metadata server under environment variables
-    # like $GCE_METADATA_HOST, which LUCI emulates.
-    if shard.service_account:
-      # TODO(fxbug.dev/37142): Find a way to use the version that LUCI is
-      # currently using, instead of 'latest'.
-      ensure_file.add_package('infra/tools/luci-auth/${platform}', 'latest')
-      cmd.extend(['./luci-auth', 'context', '--'])
-
-    if is_emu_type:
-      dimensions.update(os='Debian', cpu=build_artifacts.target, kvm='1')
-      # To take advantage of KVM, we execute QEMU-arm tasks on arm hardware.
-      test_bot_cpu = build_artifacts.target
-    else:
-      dimensions.update(shard.dimensions)
-
-    if shard.targets_fuchsia:
-      botanist_cmd = [
-          './botanist',
-          '-level', BOTANIST_LOG_LEVEL,
-          'run',
-          '-images', IMAGES_JSON,
-          '-timeout', '%ds' % self._timeout_secs,
-          '-syslog', SYSLOG_NAME,
-          '-serial-log', SERIAL_LOG_NAME,
-      ] # yapf: disable
-      outputs.append(SYSLOG_NAME)
-      outputs.append(SERIAL_LOG_NAME)
-
-      # TODO(fxbug.dev/40840): Once we can scope the proxy server to a
-      # an individual task, we can make free use of it in the emulator case.
-      if not is_emu_type:
-        botanist_cmd.extend([
-          # For container networking and authentication reasons, we access GCS
-          # via a proxy server running on the controller.
-          '-repo', self._api.artifacts.package_repo_url(host='$GCS_PROXY_HOST'),
-          '-blobs', self._api.artifacts.package_blob_url(host='$GCS_PROXY_HOST'),
-        ]) # yapf: disable
-
-      config = BOTANIST_DEVICE_CONFIG
-      if self._api.emu.is_emulator_type(shard.device_type):
-        config = './qemu.json'
-        botanist_cmd.extend(
-            ['-ssh', build_artifacts.DEFAULT_ISOLATED_LAYOUT.private_key])
-        qemu_config = [{
-            'type': shard.device_type.lower(),
-            'path': './%s/bin' % shard.device_type.lower(),
-            'target': build_artifacts.target,
-            'cpu': 8,
-            'memory': 8192,
-            'kvm': True,
-        }]
-
-        if shard.device_type == 'AEMU':
-          self._api.emu.add_aemu_to_ensure_file(ensure_file, subdir='aemu/bin')
-        elif shard.device_type == 'QEMU':
-          self._api.emu.add_qemu_to_ensure_file(ensure_file, subdir='qemu')
-
-        self._api.file.write_json(
-            'write qemu config',
-            isolate_tree.root.join('qemu.json'),
-            qemu_config,
-            indent=2)
-      elif shard.netboot:
-        botanist_cmd.append('-netboot')
-
-      botanist_cmd.extend(['-config', config])
-
-      cmd.extend(botanist_cmd)
-
-    cmd.extend([
-        './testrunner',
-        '-archive',
-        TEST_RESULTS_ARCHIVE_NAME,
-    ])
-    if self._use_runtests:
-      cmd.append('-use-runtests')
-    if self._per_test_timeout_secs:
-      cmd.extend(['-per-test-timeout', '%ds' % self._per_test_timeout_secs])
-    cmd.append(test_manifest)
-
-    outputs.append(TEST_RESULTS_ARCHIVE_NAME)
-
-    isolated_hash = self._api.testing._isolate_build_artifacts(
-        isolate_tree, build_artifacts, shard=shard, test_bot_cpu=test_bot_cpu)
-
-    env_name = '%s-%s' % (shard.device_type or shard.os, build_artifacts.target)
-    tags = {'test_environment_name': [env_name]}
-
-    request = (self._api.swarming.task_request().
-        with_name(shard.name).
-        with_service_account(shard.service_account).
-        with_tags(tags)
-    ) #yapf: disable
-    return request.with_slice(0, request[0].
-      with_command(cmd).
-      with_isolated(isolated_hash).
-      with_dimensions(**dimensions).
-      with_expiration_secs(self._swarming_expiration_timeout_secs).
-      with_io_timeout_secs(self._swarming_io_timeout_secs).
-      with_execution_timeout_secs(self._timeout_secs).
-      with_outputs(outputs).
-      with_cipd_ensure_file(ensure_file).
-      with_env_vars(**self._test_task_env_vars(shard, build_artifacts))
-    ) #yapf: disable
-
-  def _test_task_env_vars(self, shard, build_artifacts):
-    """Returns the environment variables to be set for the test task.
-
-    Returns:
-      A dict mapping string env var names to string values.
-    """
-    build = self._buildbucket_build
-    commit = build.input.gitiles_commit
-    llvm_symbolizer = self._api.path.basename(build_artifacts.llvm_symbolizer)
-    env_vars = dict(
-        # `${ISOLATED_OUTDIR}` is a magic string that Swarming will replace
-        # with a temporary directory into which files will be automatically
-        # collected upon exit of a task.
-        FUCHSIA_TEST_OUTDIR='${ISOLATED_OUTDIR}',
-        BUILDBUCKET_ID=str(build.id),
-        BUILD_BOARD=build_artifacts.board,
-        BUILD_TYPE=build_artifacts.build_type,
-        BUILD_PRODUCT=build_artifacts.product,
-        BUILD_TARGET=build_artifacts.target,
-        BUILDBUCKET_BUCKET=build.builder.bucket,
-
-        # Used for symbolization:
-        ASAN_SYMBOLIZER_PATH=llvm_symbolizer,
-        UBSAN_SYMBOLIZER_PATH=llvm_symbolizer,
-        LSAN_SYMBOLIZER_PATH=llvm_symbolizer,
-
-        # Used by the catapult converter
-        BUILD_CREATE_TIME=str(build.create_time.seconds),
-        BUILDER_NAME=build.builder.builder,
-        FUCHSIA_DEVICE_TYPE=shard.device_type,
-        INPUT_COMMIT_HOST=commit.host,
-        INPUT_COMMIT_PROJECT=commit.project,
-        INPUT_COMMIT_REF=commit.ref,
-    )
-    # For some reason, empty string environment variables sent to the swarming
-    # API get interpreted as null and rejected. So don't bother sending them to
-    # avoid breaking the task request.
-    # TODO(olivernewman): Figure out whether this logic should be moved into
-    # the upstream swarming module (or obviated by fixing the "" -> null
-    # behavior).
-    return {k: v for k, v in env_vars.iteritems() if v}
-
-
 class _ShardedTestRunner(object):
   """Handles running and analyzing tests that have been split into shards."""
 
@@ -833,88 +582,6 @@
     super(FuchsiaTestApi, self).__init__(*args, **kwargs)
     self._test_runner = None
 
-  def deprecated_shard_requests(self,
-                                build_artifacts,
-                                test_cmds,
-                                device_type,
-                                pool,
-                                timeout_secs,
-                                pave,
-                                requires_secrets=False,
-                                swarming_expiration_timeout_secs=18000,
-                                swarming_io_timeout_secs=5 * 60):
-    """Returns a swarming task request for testing in the deprecated way.
-
-    Args:
-      build_artifacts (BuildArtifacts): The Fuchsia build artifacts to test.
-      test_cmds (list[str]): Command to have Fuchsia run on boot.
-      pool (str): Swarming pool from which the test task will be drawn.
-      timeout_secs (int): The amount of seconds to wait for the tests to execute
-        before giving up.
-      pave (bool): Whether to pave the image to disk. Ignored if device_type ==
-        'QEMU'.
-      requires_secrets (bool): Whether tests require plaintext secrets; ignored
-        if device_type != 'QEMU'.
-      swarming_expiration_timeout_secs (int): Maximum run time for the swarming
-        task, once scheduled (enforced by swarming).
-      swarming_io_timeout_secs (int): The swarming task will be killed if it does
-        not produce any output for this long.
-
-    Returns:
-      A list of a single ShardTaskRequest.
-    """
-    assert test_cmds
-    assert device_type
-
-    self.m.minfs.minfs_path = build_artifacts.minfs
-    self.m.zbi.zbi_path = build_artifacts.zbi
-
-    # Copy build_artifacts because we modify its contents below.
-    build_artifacts = copy.deepcopy(build_artifacts)
-    self._install_runcmds_files(
-        build_artifacts,
-        device_type=device_type,
-        pave=pave,
-        test_cmds=test_cmds,
-    )
-
-    if self.m.emu.is_emulator_type(device_type):
-      secret_bytes = ''
-      if requires_secrets:
-        secret_bytes = self.m.json.dumps(self._decrypt_secrets(build_artifacts))
-      task = self._construct_legacy_qemu_task_request(
-          task_name='all tests',
-          build_artifacts=build_artifacts,
-          pool=pool,
-          timeout_secs=timeout_secs,
-          swarming_expiration_timeout_secs=swarming_expiration_timeout_secs,
-          swarming_io_timeout_secs=swarming_io_timeout_secs,
-          secret_bytes=secret_bytes,
-          qemu_type=device_type,
-      )
-    else:
-      task = self._construct_device_task_request(
-          task_name='all tests',
-          device_type=device_type,
-          build_artifacts=build_artifacts,
-          pool=pool,
-          pave=pave,
-          timeout_secs=timeout_secs,
-          swarming_expiration_timeout_secs=swarming_expiration_timeout_secs,
-          swarming_io_timeout_secs=swarming_io_timeout_secs,
-      )
-    # In the deprecated testing code paths, shards are not used, but it makes
-    # other code simpler to have a valid shard here.
-    dummy_shard = self.m.testsharder.Shard('dummy', (), {})
-    return [self.m.build.ShardTaskRequest(dummy_shard, task)]
-
-  def deprecated_test_cmds(self, spec):
-    runtests_cmd_parts = ['runtests', '-o', self.results_dir_on_target]
-    if spec.test.per_test_timeout_secs:
-      runtests_cmd_parts.extend(['-i', '%d' % spec.test.per_test_timeout_secs])
-    runtests_cmd_parts.append(spec.test.runtests_args)
-    return [' '.join(runtests_cmd_parts)]
-
   def _analyze_test_results(self, test_results, presentation=None):
     """Analyzes test results represented by FuchsiaTestResults objects
 
@@ -982,7 +649,7 @@
     self.m.step('covargs', cmd)
 
     # TODO: move this into gsutil module/deduplicate this with other GCS logic
-    dst = 'builds/%s/coverage' % self.m.buildbucket.build_id
+    dst = 'builds/%s/coverage' % self.m.buildbucket_util.id
     step_result = self.m.gsutil.rsync(
         name='upload coverage',
         src=output_dir,
@@ -998,99 +665,6 @@
     step_result.presentation.links['index.html'] = self.m.gsutil._http_url(
         gcs_bucket, self.m.gsutil.join(dst, 'index.html'), True)
 
-  def _isolate_build_artifacts(self,
-                               isolate_tree,
-                               build_artifacts,
-                               shard=None,
-                               test_bot_cpu='x64',
-                               legacy_qemu=False):
-    """Populates a tree with build artifacts and isolates it.
-
-    Specifically, the following is linked into or created within the tree:
-      - The images in the build are linked in and manifest of them is created
-        in the root, if targeting a fuchsia device;
-      - The Linux/Mac tests in the shard and their runtime dependencies.
-
-    Args:
-      isolate_tree (api.file.SymlinkTree): A tree into which artifacts may be
-        linked.
-      build (FuchsiaBuildResults): The result of a fuchsia build.
-      shard (api.testsharder.Shard|None): A test shard.
-      test_bot_cpu (str|None): The host cpu of the bot running the test task.
-      legacy_qemu (bool): Whether to only isolate the images needed to run QEMU
-        alone.
-
-    Returns:
-      The isolated hash that may be used to reference and download the
-      artifacts.
-    """
-
-    def register_link(relpath):
-      """Prepares a symlink of a relative path within the build directory to the tree."""
-      isolate_tree.register_link(
-          target=build_artifacts.fuchsia_build_dir.join(relpath),
-          linkname=isolate_tree.root.join(relpath),
-      )
-
-    # TODO(IN-931): Remove `shard is None` condition once device and QEMU
-    # codepaths are passing shard and using _construct_test_task_request().
-    no_shard = shard is None
-    if no_shard or shard.targets_fuchsia:
-      image_list = build_artifacts.images.values()
-      # In the case of an emulated target, we restrict what we isolate to the
-      # bare essentials to avoid the needless downloading of several gigabytes
-      # of images on the other end.
-      is_emulated_target = (
-            (no_shard and legacy_qemu) or
-            (shard and self.m.emu.is_emulator_type(shard.device_type))
-      ) # yapf: disable
-      if is_emulated_target:
-        image_list = [
-          img for img in image_list
-          if img['name'] in ['qemu-kernel', 'zircon-a', 'storage-full']
-        ] # yapf: disable
-      image_manifest_path = isolate_tree.root.join(IMAGES_JSON)
-      self.m.file.write_json(
-          'write image manifest', image_manifest_path, image_list, indent=2)
-      for image in image_list:
-        register_link(image['path'])
-
-    if shard:
-      for test in shard.tests:
-        if test.os in ['linux', 'mac']:
-          register_link(test.path)
-      for dep in shard.deps:
-        register_link(dep)
-
-    # If targeting QEMU we include a private key corresponding to an authorized
-    # key already in the boot image; this is needed as we do not pave QEMU.
-    if shard and self.m.emu.is_emulator_type(shard.device_type):
-      isolate_tree.register_link(
-          target=build_artifacts.private_key,
-          linkname=isolate_tree.root.join(
-              build_artifacts.DEFAULT_ISOLATED_LAYOUT.private_key,),
-      )
-
-    for tool in [
-        build_artifacts.botanist(test_bot_cpu),
-        build_artifacts.testrunner(test_bot_cpu),
-        build_artifacts.llvm_symbolizer,
-        build_artifacts.bootserver,
-    ]:
-      tool_name = self.m.path.basename(tool)
-      isolate_tree.register_link(
-          target=tool, linkname=isolate_tree.root.join(tool_name))
-
-    isolate_tree.create_links('create tree of build artifacts')
-    isolated = self.m.isolated.isolated(isolate_tree.root)
-    isolated.add_dir(isolate_tree.root)
-    return isolated.archive('isolate build artifacts')
-
-  @property
-  def results_dir_on_target(self):
-    """The directory on target to which target test results will be written."""
-    return '/tmp/infra-test-output'
-
   @property
   def results_dir_on_host(self):
     """The directory on host to which host and target test results will be written.
@@ -1101,229 +675,6 @@
     """
     return self.m.path['cleanup'].join('test_results')
 
-  def _create_runcmds_script(self, device_type, test_cmds, output_path):
-    """Creates a script for running tests on boot."""
-    # The device topological path is the toplogical path to the block device
-    # which will contain test output.
-    device_topological_path = '/dev/sys/pci/00:%s/virtio-block/block' % (
-        TEST_FS_PCI_ADDR)
-
-    # Script that mounts the block device to contain test output and runs tests,
-    # dropping test output into the block device.
-    results_dir = self.results_dir_on_target
-    runcmds = [
-        'mkdir %s' % results_dir,
-    ]
-    if self.m.emu.is_emulator_type(device_type):
-      runcmds.extend([
-          # Wait until the MinFS test image shows up (max <timeout> ms).
-          'waitfor class=block topo=%s timeout=60000' % device_topological_path,
-          'mount %s %s' % (device_topological_path, results_dir),
-      ] + test_cmds + [
-          'umount %s' % results_dir,
-          'dm poweroff',
-      ])
-    else:
-      runcmds.extend(test_cmds)
-    runcmds_bytes = []
-    for line in runcmds:
-      if isinstance(line, unicode):
-        runcmds_bytes.append(line.encode('utf-8'))
-      elif isinstance(line, str):
-        runcmds_bytes.append(line)
-      else:  # pragma: no cover
-        assert False, 'line is not unicode or a str: %s, %s' % (line,
-                                                                type(line))
-    self.m.file.write_text('write runcmds', output_path,
-                           '\n'.join(runcmds_bytes))
-
-  def _construct_legacy_qemu_task_request(self,
-                                          task_name,
-                                          build_artifacts,
-                                          pool,
-                                          timeout_secs,
-                                          swarming_expiration_timeout_secs,
-                                          swarming_io_timeout_secs,
-                                          secret_bytes,
-                                          qemu_type,
-                                          shard=None):
-    """Constructs a Swarming task request which runs Fuchsia tests inside QEMU.
-
-    Expects the build and artifacts to be at the same place they were at
-    the end of the build.
-
-    Args:
-      build_artifacts (BuildArtifacts): The Fuchsia build artifacts to test.
-      pool (str): Swarming pool from which the test task will be drawn.
-      timeout_secs (int): The amount of seconds to wait for the tests to execute
-        before giving up.
-      secret_bytes (str): secret bytes to pass to the QEMU task.
-      qemu_type (str): type of qemu, either QEMU or AEMU.
-      shard (api.testsharder.Shard|None): The shard associated with the task or
-        None if it's not a shard.
-
-    Returns:
-      An api.swarming.TaskRequest representing the swarming task request.
-    """
-    # To freely archive files from the build directory, the source, and those we
-    # dynamically create, we create a tree of symlinks in a fresh directory and
-    # isolate that. This solves the problems of (a) finding a root directory
-    # that works for all artifacts, (b) being able to create files in that
-    # directory without fear of collision, and (c) not having to isolate
-    # extraneous files.
-    isolate_tree = self.m.file.symlink_tree(root=self.m.path.mkdtemp('isolate'))
-
-    # As part of running tests, we'll send a MinFS image over to another machine
-    # which will be declared as a block device in QEMU, at which point
-    # Fuchsia will mount it and write test output to. We choose 3.5G for the
-    # MinFS image arbitrarily, as it appears it can hold our test output
-    # comfortably without going overboard on size.
-    #
-    minfs_image_path = isolate_tree.root.join(TEST_RESULTS_MINFS_NAME)
-    self.m.minfs.create(minfs_image_path, '3584M', name='create test image')
-
-    ensure_file = self.m.cipd.EnsureFile()
-
-    botanist_cmd = [
-      './botanist',
-      '-level', BOTANIST_LOG_LEVEL,
-      'qemu',
-      '-type', '%s' % qemu_type.lower(),
-      '-qemu-dir', './%s/bin' % qemu_type.lower(),
-      '-images', IMAGES_JSON,
-      '-arch', build_artifacts.target,
-      '-minfs', TEST_RESULTS_MINFS_NAME,
-      '-pci-addr', TEST_FS_PCI_ADDR,
-      '-use-kvm'
-    ] # yapf: disable
-
-    if secret_bytes:
-      # Wrap botanist command with secretshim which starts the secrets server
-      # before running the following command.
-      botanist_cmd = ['./secretshim'] + botanist_cmd
-      ensure_file.add_package('fuchsia/infra/secretshim/${platform}',
-                              SECRETSHIM_CIPD_VERSION)
-
-    if [v for v in ['asan', 'profile'] if v in build_artifacts.variants]:
-      botanist_cmd.extend([
-          '-cpu',
-          str(8),
-          '-memory',
-          str(8192),
-      ])
-
-    # storage-full not being present signifies the exclusion of the system
-    # partition, which means `boot` (i.e. running on boot) must be used instead
-    # of `system` (i.e., running after the system partition is mounted).
-    storage_free_build = STORAGE_FULL not in build_artifacts.images
-    arg_key = 'zircon.autorun.%s' % ('boot' if storage_free_build else 'system')
-    botanist_cmd.append('%s=/boot/bin/sh+/boot/%s' %
-                        (arg_key, self._get_runcmds_path_per_shard(shard)))
-
-    isolated_hash = self._isolate_build_artifacts(
-        isolate_tree,
-        build_artifacts,
-        # To take advantage of KVM, we execute QEMU-arm tasks on arm hardware.
-        test_bot_cpu=build_artifacts.target,
-        legacy_qemu=True,
-    )
-
-    if qemu_type == 'AEMU':
-      self.m.emu.add_aemu_to_ensure_file(ensure_file, subdir='aemu/bin')
-    elif qemu_type == 'QEMU':
-      self.m.emu.add_qemu_to_ensure_file(ensure_file, subdir='qemu')
-
-    env_name = '%s-%s' % (qemu_type, build_artifacts.target)
-    tags = {
-        # consumed by google3 results uploader
-        'test_environment_name': [env_name],
-        # consumed by this recipe module
-        'uses_legacy_qemu': ['true']
-    }
-    request = self.m.swarming.task_request().with_name(task_name).with_tags(
-        tags)
-    return (request.with_slice(0, request[0].
-      with_command(botanist_cmd).
-      with_isolated(isolated_hash).
-      with_dimensions(pool=pool, os='Debian', cpu=build_artifacts.target, kvm='1').
-      with_io_timeout_secs(swarming_io_timeout_secs).
-      with_execution_timeout_secs(timeout_secs).
-      with_expiration_secs(swarming_expiration_timeout_secs).
-      with_secret_bytes(secret_bytes).
-      with_outputs([TEST_RESULTS_MINFS_NAME]).
-      with_cipd_ensure_file(ensure_file)
-    )) #yapf: disable
-
-  def _construct_device_task_request(self, task_name, device_type,
-                                     build_artifacts, pool, pave, timeout_secs,
-                                     swarming_expiration_timeout_secs,
-                                     swarming_io_timeout_secs):
-    """Constructs a Swarming task request to run Fuchsia tests on a device.
-
-    Expects the build and artifacts to be at the same place they were at
-    the end of the build.
-
-    Args:
-      build_artifacts (BuildArtifacts): The Fuchsia build artifacts to test.
-      pool (str): Swarming pool from which the test task will be drawn.
-      pave (bool): Whether or not the build artifacts should be paved.
-      timeout_secs (int): The amount of seconds to wait for the tests to execute
-        before giving up.
-
-    Returns:
-      An api.swarming.TaskRequest representing the swarming task request.
-    """
-    # Construct the botanist command.
-    botanist_cmd = [
-      './botanist',
-      '-level', BOTANIST_LOG_LEVEL,
-      'zedboot',
-      '-config', BOTANIST_DEVICE_CONFIG,
-      '-images', IMAGES_JSON,
-      '-results-dir', self.results_dir_on_target,
-      '-out', TEST_RESULTS_ARCHIVE_NAME,
-      '-serial-log', SERIAL_LOG_NAME,
-    ] # yapf: disable
-
-    if not pave:
-      botanist_cmd.append('-netboot')
-
-    # storage-full not being present signifies the exclusion of the system
-    # partition, which means `boot` (i.e. running on boot) must be used instead
-    # of `system` (i.e., running after the system partition is mounted).
-    storage_free_build = STORAGE_FULL not in build_artifacts.images
-    arg_key = 'zircon.autorun.%s' % ('boot' if storage_free_build else 'system')
-    botanist_cmd.append('%s=/boot/bin/sh+/boot/%s' %
-                        (arg_key, RUNCMDS_BOOTFS_PATH))
-
-    # To freely archive files from the build directory, the source, and those we
-    # dynamically create, we create a tree of symlinks in a fresh directory and
-    # isolate that. This solves the problems of (a) finding a root directory
-    # that works for all artifacts, (b) being able to create files in that
-    # directory without fear of collision, and (c) not having to isolate
-    # extraneous files.
-    isolate_tree = self.m.file.symlink_tree(root=self.m.path.mkdtemp('isolate'))
-    isolated_hash = self._isolate_build_artifacts(isolate_tree, build_artifacts)
-
-    dimensions = {
-        'pool': pool,
-        'device_type': device_type,
-    }
-
-    env_name = '%s-%s' % (device_type, build_artifacts.target)
-    tags = {'test_environment_name': [env_name]}
-    request = self.m.swarming.task_request().with_name(task_name).with_tags(
-        tags)
-    return (request.with_slice(0, request[0].
-      with_command(botanist_cmd).
-      with_isolated(isolated_hash).
-      with_dimensions(**dimensions).
-      with_expiration_secs(swarming_expiration_timeout_secs).
-      with_io_timeout_secs(swarming_io_timeout_secs).
-      with_execution_timeout_secs(timeout_secs).
-      with_outputs([TEST_RESULTS_ARCHIVE_NAME, SERIAL_LOG_NAME])
-    )) #yapf: disable
-
   def _extract_test_results_archive(self,
                                     step_name,
                                     archive_path,
@@ -1357,43 +708,6 @@
         directory=self.m.raw_io.output_dir(leak_to=leak_to),
     ).raw_io.output_dir
 
-  def _decrypt_secrets(self, build_artifacts):
-    """Decrypts the secrets included in the build.
-
-    Args:
-      build (FuchsiaBuildResults): The build for which secret specs were
-        generated.
-
-    Returns:
-      The dictionary that maps secret spec name to the corresponding plaintext.
-    """
-    self.m.cloudkms.ensure()
-
-    secret_spec_dir = build_artifacts.secret_specs
-    secrets_map = {}
-    with self.m.step.nest('process secret specs'):
-      secret_spec_files = self.m.file.listdir('list', secret_spec_dir)
-      for secret_spec_file in secret_spec_files:
-        basename = self.m.path.basename(secret_spec_file)
-        # Skip the 'ciphertext' subdirectory.
-        if basename == 'ciphertext':
-          continue
-
-        secret_name, _ = basename.split('.json', 1)
-        secret_spec = self.m.json.read('read spec for %s' % secret_name,
-                                       secret_spec_file).json.output
-
-        # For each test spec file <name>.json in this directory, there is an
-        # associated ciphertext file at ciphertext/<name>.ciphertext.
-        ciphertext_file = secret_spec_dir.join('ciphertext',
-                                               '%s.ciphertext' % secret_name)
-
-        key_path = secret_spec['cloudkms_key_path']
-        secrets_map[secret_name] = self.m.cloudkms.decrypt(
-            'decrypt secret for %s' % secret_name, key_path, ciphertext_file,
-            self.m.raw_io.output()).raw_io.output
-    return secrets_map
-
   def deprecated_test(self, *args, **kwargs):
     """Tests a Fuchsia build on the specified device with retries.
 
@@ -1534,14 +848,15 @@
         # was returned in, to a Path object pointing to its location on the
         # local disk. For each of the above tasks, there should be exactly
         # one output.
-        if SERIAL_LOG_NAME in task_result.outputs:
-          serial_log = task_result.outputs.pop(SERIAL_LOG_NAME)
+        serial_log_name = self.m.testing_requests.SERIAL_LOG_NAME
+        if serial_log_name in task_result.outputs:
+          serial_log = task_result.outputs.pop(serial_log_name)
 
           serial_log_contents = self.m.file.read_text(
               'read serial.txt', serial_log, test_data=[])
           serial_presentation = (
               presentation or self.m.step.active_result.presentation)
-          serial_presentation.logs[SERIAL_LOG_NAME] = (
+          serial_presentation.logs[serial_log_name] = (
               serial_log_contents.splitlines())
         assert len(task_result.outputs) == 1, 'len(%s) != 1' % repr(
             task_result.outputs)
@@ -1588,58 +903,6 @@
 
     return launch, collect, process
 
-  def shard_requests(
-      self,
-      build_artifacts,
-      buildbucket_build,
-      per_test_timeout_secs,
-      pool,
-      swarming_expiration_timeout_secs,
-      swarming_io_timeout_secs,
-      use_runtests,
-      # TODO(garymm): Remove default value.
-      # We should always get this from a spec.
-      timeout_secs=40 * 60):
-    """Returns a _ShardTaskRequest for each shard in build_artifact.shards.
-
-    Args:
-      build_artifacts (BuildArtifacts): The Fuchsia build artifacts to test.
-      buildbucket_build (build_pb2.Build): The buildbucket build that is going
-        to orchestrate testing.
-      per_test_timeout_secs (int): Any test that executes for longer than this
-        will be considered failed.
-      pool (str): The Swarming pool to schedule test tasks in.
-      use_runtests (bool): Whether to use runtests (or else run_test_component)
-        when executing tests on target.
-      timeout_secs (int): The amount of seconds to wait for the tests to execute
-        before giving up.
-    """
-
-    self.m.minfs.minfs_path = build_artifacts.minfs
-    self.m.zbi.zbi_path = build_artifacts.zbi
-    # This modifies the build artifacts so must be done before calling
-    # task_requester.request().
-    self._install_runcmds_files(
-        build_artifacts,
-        test_in_shards=True,
-        per_test_timeout_secs=per_test_timeout_secs,
-        in_place=True)
-    task_requester = _TaskRequester(
-        self.m,
-        buildbucket_build=buildbucket_build,
-        per_test_timeout_secs=per_test_timeout_secs,
-        pool=pool,
-        swarming_expiration_timeout_secs=swarming_expiration_timeout_secs,
-        swarming_io_timeout_secs=swarming_io_timeout_secs,
-        timeout_secs=timeout_secs,
-        use_runtests=use_runtests,
-    )
-    shard_requests = []
-    for s in build_artifacts.shards:
-      with self.m.step.nest('shard %s' % s.name):
-        shard_requests.append(task_requester.request(s, build_artifacts))
-    return shard_requests
-
   def test_in_shards(self, collect_timeout_secs, debug_symbol_gcs_bucket,
                      max_attempts, orchestration_inputs):
     """Tests a Fuchsia build by sharding.
@@ -1755,108 +1018,3 @@
     else:
       status = self.m.step.EXCEPTION
     presentation.status = status
-
-  def _create_test_list(self, shard):
-    test_locations = []
-    for test in shard.tests:
-      test_locations.append(test.path)
-    test_list_path = self.m.path['cleanup'].join('tests-%s' %
-                                                 self._normalize(shard.name))
-    self.m.file.write_text(
-        name='write test list',
-        dest=test_list_path,
-        text_data='\n'.join(test_locations) + '\n',
-    )
-    return test_list_path
-
-  def _normalize(self, name):
-    return name.replace(' ', '_').replace('(', '').replace(')', '')
-
-  def _get_runcmds_path_per_shard(self, shard=None):
-    if not shard:
-      return RUNCMDS_BOOTFS_PATH
-    return '%s-%s' % (RUNCMDS_BOOTFS_PATH, self._normalize(shard.name))
-
-  def _uses_legacy_qemu(self, shard):
-    return (not self.m.experimental.ssh_into_qemu and
-            self.m.emu.is_emulator_type(shard.device_type))
-
-  def _install_runcmds_files(self,
-                             build_artifacts,
-                             test_in_shards=False,
-                             per_test_timeout_secs=None,
-                             device_type=None,
-                             pave=False,
-                             test_cmds=None,
-                             in_place=False):
-    """Creates the files used to invoke runtests on boot.
-
-    This is only necessary for QEMU shards, which are the only shards that
-    use runcmds, and the non-sharding codepath.
-    """
-    self.m.zbi.zbi_path = build_artifacts.zbi
-
-    manifest = {}
-    zbi_name = 'zircon-a'
-    new_zbi_filename = None
-    new_zbi_path = None
-    if test_in_shards:
-      # if testing in shards, zbi file should be modified once for all shards in
-      # place before uploading through artifactory.
-      assert in_place
-      needs_key = False
-      for shard in build_artifacts.shards:
-        if self.m.emu.is_emulator_type(shard.device_type):
-          if self._uses_legacy_qemu(shard):
-            test_list_path = self._create_test_list(shard)
-            runtests_file_bootfs_path = 'infra/shard-%s.run' % self._normalize(
-                shard.name)
-            runcmds_path = self.m.path['cleanup'].join(
-                'runcmds-%s' % self._normalize(shard.name))
-            runtests_cmd_parts = [
-                'runtests', '-o', self.results_dir_on_target, '-f',
-                '/boot/%s' % runtests_file_bootfs_path
-            ]
-            if per_test_timeout_secs:
-              runtests_cmd_parts.extend(['-i', '%d' % per_test_timeout_secs])
-            self._create_runcmds_script(
-                device_type=shard.device_type,
-                test_cmds=[' '.join(runtests_cmd_parts)],
-                output_path=runcmds_path,
-            )
-            manifest[self._get_runcmds_path_per_shard(shard)] = runcmds_path
-            manifest[runtests_file_bootfs_path] = test_list_path
-          else:
-            needs_key = True
-      if needs_key:
-        manifest[AUTHORIZED_KEY_PATH] = build_artifacts.authorized_key
-
-    else:
-      assert device_type and test_cmds
-      if not in_place:
-        new_zbi_filename = 'test-infra.zbi'
-        new_zbi_path = build_artifacts.fuchsia_build_dir.join(new_zbi_filename)
-      if not self.m.emu.is_emulator_type(device_type):
-        zbi_name = next(
-            (image['name']
-             for image in build_artifacts.images.values()
-             if '--boot' in image.get(
-                 'bootserver_%s' % ('netboot' if not pave else 'pave'), [])),
-            None)
-        assert zbi_name, 'Could not find kernel image to boot.'
-      runcmds_path = self.m.path['cleanup'].join('runcmds')
-      self._create_runcmds_script(device_type, test_cmds, runcmds_path)
-      manifest[RUNCMDS_BOOTFS_PATH] = runcmds_path
-
-    # Inject the runcmds script and/or authorized key into the bootfs image.
-    if manifest and zbi_name in build_artifacts.images:
-      self.m.zbi.copy_and_extend(
-          step_name='create zbi',
-          input_image=build_artifacts.fuchsia_build_dir.join(
-              build_artifacts.images[zbi_name]['path']),
-          output_image=new_zbi_path or build_artifacts.fuchsia_build_dir.join(
-              build_artifacts.images[zbi_name]['path']),
-          manifest=manifest,
-      )
-      if new_zbi_filename:
-        build_artifacts.images[zbi_name]['path'] = new_zbi_filename
diff --git a/recipe_modules/testing/examples/full.expected/aemu.json b/recipe_modules/testing/examples/full.expected/aemu.json
deleted file mode 100644
index fb4bac1..0000000
--- a/recipe_modules/testing/examples/full.expected/aemu.json
+++ /dev/null
@@ -1,1040 +0,0 @@
-[
-  {
-    "cmd": [],
-    "name": "download build artifacts"
-  },
-  {
-    "cmd": [],
-    "name": "download build artifacts.ensure isolated",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/isolated_client",
-      "-ensure-file",
-      "infra/tools/luci/isolated/${platform} git_revision:305e79001db1846906c7136d90a863bee5bd3bfc",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.ensure isolated.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:305\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolated/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "download",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-isolated",
-      "abc",
-      "-output-dir",
-      "[CLEANUP]/build-artifacts_tmp_1"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.download build_artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/args.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"build_type\": \"release\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"target\": \"x64\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"variants\": []@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/images.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"netboot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/shards.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.load test shards",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@[@@@",
-      "@@@STEP_LOG_LINE@json.output@  {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"deps\": [], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"environment\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"dimensions\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"device_type\": \"AEMU\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    }, @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"AEMU\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"install_path\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"label\": \"//a/b/c:hello_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"hello\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"os\": \"fuchsia\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"path\": \"/path/to/hello\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"install_path\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"label\": \"//a/b/c:goodbye_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"goodbye\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"os\": \"fuchsia\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"path\": \"/path/to/goodbye\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@]@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "isolate build artifacts"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"variants\": [], \n  \"product\": \"products/core.gni\", \n  \"target\": \"x64\", \n  \"board\": \"boards/x64.gni\", \n  \"build_type\": \"release\"\n}",
-      "[START_DIR]/args.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@args.json@{@@@",
-      "@@@STEP_LOG_LINE@args.json@  \"variants\": [], @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"target\": \"x64\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"build_type\": \"release\"@@@",
-      "@@@STEP_LOG_LINE@args.json@}@@@",
-      "@@@STEP_LOG_END@args.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"netboot\": {\n    \"path\": \"netboot.zbi\", \n    \"bootserver_netboot\": [\n      \"--boot\"\n    ], \n    \"type\": \"zbi\", \n    \"name\": \"netboot\"\n  }, \n  \"zircon-a\": {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n}",
-      "[START_DIR]/images.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@images.json@{@@@",
-      "@@@STEP_LOG_LINE@images.json@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ], @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"netboot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@  }, @@@",
-      "@@@STEP_LOG_LINE@images.json@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@}@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"environment\": {\n      \"dimensions\": {\n        \"device_type\": \"AEMU\"\n      }\n    }, \n    \"tests\": [\n      {\n        \"name\": \"hello\", \n        \"install_path\": \"/path/to/hello\", \n        \"label\": \"//a/b/c:hello_test(//toolchain)\", \n        \"path\": \"/path/to/hello\", \n        \"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", \n        \"os\": \"fuchsia\"\n      }, \n      {\n        \"name\": \"goodbye\", \n        \"install_path\": \"/path/to/goodbye\", \n        \"label\": \"//a/b/c:goodbye_test(//toolchain)\", \n        \"path\": \"/path/to/goodbye\", \n        \"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", \n        \"os\": \"fuchsia\"\n      }\n    ], \n    \"name\": \"AEMU\", \n    \"deps\": []\n  }\n]",
-      "[START_DIR]/shards.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write shards.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@shards.json@[@@@",
-      "@@@STEP_LOG_LINE@shards.json@  {@@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"environment\": {@@@",
-      "@@@STEP_LOG_LINE@shards.json@      \"dimensions\": {@@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"device_type\": \"AEMU\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@      }@@@",
-      "@@@STEP_LOG_LINE@shards.json@    }, @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@shards.json@      {@@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"name\": \"hello\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"install_path\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"label\": \"//a/b/c:hello_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"path\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"os\": \"fuchsia\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@      }, @@@",
-      "@@@STEP_LOG_LINE@shards.json@      {@@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"name\": \"goodbye\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"install_path\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"label\": \"//a/b/c:goodbye_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"path\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"os\": \"fuchsia\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@      }@@@",
-      "@@@STEP_LOG_LINE@shards.json@    ], @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"name\": \"AEMU\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"deps\": []@@@",
-      "@@@STEP_LOG_LINE@shards.json@  }@@@",
-      "@@@STEP_LOG_LINE@shards.json@]@@@",
-      "@@@STEP_LOG_END@shards.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"[CLEANUP]/build-artifacts_tmp_1/arm64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/arm64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/authorized_key\": [\"[CLEANUP]/build_artifacts_tmp_2/authorized_key\"], \"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/build_artifacts_tmp_2/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/covargs\": [\"[CLEANUP]/build_artifacts_tmp_2/covargs\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/ids.txt\": [\"[CLEANUP]/build_artifacts_tmp_2/ids.txt\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_cov\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_cov\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_profdata\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_profdata\"], \"[CLEANUP]/build-artifacts_tmp_1/minfs\": [\"[CLEANUP]/build_artifacts_tmp_2/minfs\"], \"[CLEANUP]/build-artifacts_tmp_1/netboot.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/netboot.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/private_key\": [\"[CLEANUP]/build_artifacts_tmp_2/private_key\"], \"[CLEANUP]/build-artifacts_tmp_1/symbolize_tool\": [\"[CLEANUP]/build_artifacts_tmp_2/symbolize_tool\"], \"[CLEANUP]/build-artifacts_tmp_1/tests.json\": [\"[CLEANUP]/build_artifacts_tmp_2/tests.json\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/zbi\"], \"[START_DIR]/args.json\": [\"[CLEANUP]/build_artifacts_tmp_2/args.json\"], \"[START_DIR]/images.json\": [\"[CLEANUP]/build_artifacts_tmp_2/images.json\"], \"[START_DIR]/shards.json\": [\"[CLEANUP]/build_artifacts_tmp_2/shards.json\"]}"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.create_links",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/build_artifacts_tmp_2:."
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.isolate",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/zbi",
-      "--output",
-      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
-      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
-      "--entry",
-      "data/ssh/authorized_keys=[CLEANUP]/build-artifacts_tmp_1/authorized_key"
-    ],
-    "name": "create zbi"
-  },
-  {
-    "cmd": [],
-    "name": "shard AEMU"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"name\": \"hello\", \n    \"install_path\": \"/path/to/hello\", \n    \"label\": \"//a/b/c:hello_test(//toolchain)\", \n    \"path\": \"/path/to/hello\", \n    \"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", \n    \"os\": \"fuchsia\"\n  }, \n  {\n    \"name\": \"goodbye\", \n    \"install_path\": \"/path/to/goodbye\", \n    \"label\": \"//a/b/c:goodbye_test(//toolchain)\", \n    \"path\": \"/path/to/goodbye\", \n    \"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", \n    \"os\": \"fuchsia\"\n  }\n]",
-      "[CLEANUP]/isolate_tmp_3/tests.json"
-    ],
-    "infra_step": true,
-    "name": "shard AEMU.write test manifest",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@tests.json@[@@@",
-      "@@@STEP_LOG_LINE@tests.json@  {@@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"name\": \"hello\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"install_path\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"label\": \"//a/b/c:hello_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"path\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"os\": \"fuchsia\"@@@",
-      "@@@STEP_LOG_LINE@tests.json@  }, @@@",
-      "@@@STEP_LOG_LINE@tests.json@  {@@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"name\": \"goodbye\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"install_path\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"label\": \"//a/b/c:goodbye_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"path\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"os\": \"fuchsia\"@@@",
-      "@@@STEP_LOG_LINE@tests.json@  }@@@",
-      "@@@STEP_LOG_LINE@tests.json@]@@@",
-      "@@@STEP_LOG_END@tests.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"target\": \"x64\", \n    \"kvm\": true, \n    \"memory\": 8192, \n    \"path\": \"./aemu/bin\", \n    \"type\": \"aemu\", \n    \"cpu\": 8\n  }\n]",
-      "[CLEANUP]/isolate_tmp_3/qemu.json"
-    ],
-    "infra_step": true,
-    "name": "shard AEMU.write qemu config",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@qemu.json@[@@@",
-      "@@@STEP_LOG_LINE@qemu.json@  {@@@",
-      "@@@STEP_LOG_LINE@qemu.json@    \"target\": \"x64\", @@@",
-      "@@@STEP_LOG_LINE@qemu.json@    \"kvm\": true, @@@",
-      "@@@STEP_LOG_LINE@qemu.json@    \"memory\": 8192, @@@",
-      "@@@STEP_LOG_LINE@qemu.json@    \"path\": \"./aemu/bin\", @@@",
-      "@@@STEP_LOG_LINE@qemu.json@    \"type\": \"aemu\", @@@",
-      "@@@STEP_LOG_LINE@qemu.json@    \"cpu\": 8@@@",
-      "@@@STEP_LOG_LINE@qemu.json@  }@@@",
-      "@@@STEP_LOG_LINE@qemu.json@]@@@",
-      "@@@STEP_LOG_END@qemu.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n]",
-      "[CLEANUP]/isolate_tmp_3/images.json"
-    ],
-    "infra_step": true,
-    "name": "shard AEMU.write image manifest",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@images.json@[@@@",
-      "@@@STEP_LOG_LINE@images.json@  {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@]@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/isolate_tmp_3/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/isolate_tmp_3/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/isolate_tmp_3/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/private_key\": [\"[CLEANUP]/isolate_tmp_3/private_key\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/isolate_tmp_3/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/isolate_tmp_3/testrunner\"]}"
-    ],
-    "infra_step": true,
-    "name": "shard AEMU.create tree of build artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/isolate_tmp_3:."
-    ],
-    "infra_step": true,
-    "name": "shard AEMU.isolate build artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect"
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_SUMMARY_TEXT@1 launched, 1 passed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch.AEMU (attempt 0)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LINK@Swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch.AEMU (attempt 0).ensure swarming",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/swarming_client",
-      "-ensure-file",
-      "infra/tools/luci/swarming/${platform} git_revision:67b11ada44a625008a2db5cb49ad453494b16ba1",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.launch.AEMU (attempt 0).ensure swarming.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@5@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:67b\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/swarming/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "spawn-tasks",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-json-input",
-      "{\"requests\": [{\"name\": \"AEMU\", \"priority\": \"200\", \"service_account\": \"\", \"tags\": [\"test_environment_name:AEMU-x64\"], \"task_slices\": [{\"expiration_secs\": \"0\", \"properties\": {\"cipd_input\": {\"packages\": [{\"package_name\": \"fuchsia/third_party/aemu/${platform}\", \"path\": \"aemu/bin\", \"version\": \"git_revision:058240c99e7a1b0782798a2e536f2be75b5f08cf\"}]}, \"command\": [\"./botanist\", \"-level\", \"debug\", \"run\", \"-images\", \"images.json\", \"-timeout\", \"0s\", \"-syslog\", \"syslog.txt\", \"-serial-log\", \"serial.txt\", \"-ssh\", \"private_key\", \"-config\", \"./qemu.json\", \"./testrunner\", \"-archive\", \"out.tar\", \"tests.json\"], \"containment\": {\"containment_type\": \"NONE\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"kvm\", \"value\": \"1\"}, {\"key\": \"os\", \"value\": \"Debian\"}, {\"key\": \"cpu\", \"value\": \"x64\"}, {\"key\": \"pool\", \"value\": \"fuchsia.tests\"}], \"env\": [{\"key\": \"BUILD_PRODUCT\", \"value\": \"products/core.gni\"}, {\"key\": \"FUCHSIA_TEST_OUTDIR\", \"value\": \"${ISOLATED_OUTDIR}\"}, {\"key\": \"INPUT_COMMIT_HOST\", \"value\": \"fuchsia.googlesource.com\"}, {\"key\": \"LSAN_SYMBOLIZER_PATH\", \"value\": \"llvm-symbolizer\"}, {\"key\": \"BUILDBUCKET_BUCKET\", \"value\": \"ci\"}, {\"key\": \"BUILD_TARGET\", \"value\": \"x64\"}, {\"key\": \"ASAN_SYMBOLIZER_PATH\", \"value\": \"llvm-symbolizer\"}, {\"key\": \"UBSAN_SYMBOLIZER_PATH\", \"value\": \"llvm-symbolizer\"}, {\"key\": \"INPUT_COMMIT_PROJECT\", \"value\": \"fuchsia\"}, {\"key\": \"BUILDER_NAME\", \"value\": \"builder\"}, {\"key\": \"INPUT_COMMIT_REF\", \"value\": \"refs/heads/master\"}, {\"key\": \"FUCHSIA_DEVICE_TYPE\", \"value\": \"AEMU\"}, {\"key\": \"BUILDBUCKET_ID\", \"value\": \"8945511751514863184\"}, {\"key\": \"BUILD_BOARD\", \"value\": \"boards/x64.gni\"}, {\"key\": \"BUILD_CREATE_TIME\", \"value\": \"1527292217\"}, {\"key\": \"BUILD_TYPE\", \"value\": \"release\"}], \"env_prefixes\": [], \"execution_timeout_secs\": \"0\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"inputs_ref\": {\"isolated\": \"[dummy hash]\", \"isolatedserver\": \"https://example.isolateserver.appspot.com\", \"namespace\": \"default-gzip\"}, \"io_timeout_secs\": \"0\", \"outputs\": [\"syslog.txt\", \"serial.txt\", \"out.tar\"]}}]}]}",
-      "-json-output",
-      "/path/to/tmp/json",
-      "-cancel-extra-tasks"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.launch.AEMU (attempt 0).trigger",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"tasks\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@    {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"request\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"AEMU\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  ]@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LINK@task UI: AEMU@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "collect",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-task-summary-json",
-      "/path/to/tmp/json",
-      "-task-output-stdout",
-      "json",
-      "-output-dir",
-      "[CLEANUP]/swarming_tmp_4",
-      "0"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.collect",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"0\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"output\": \"hello world!\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"outputs\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"syslog.txt\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"serial.txt\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"out.tar\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"benchmark.catapult_json\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"results\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"duration\": 62.35, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"exit_code\": 0, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"name\": \"AEMU\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"outputs_ref\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolated\": \"abc123\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"namespace\": \"default-gzip\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"state\": \"COMPLETED\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@task stdout+stderr: AEMU@hello world!@@@",
-      "@@@STEP_LOG_END@task stdout+stderr: AEMU@@@",
-      "@@@STEP_LINK@task isolated outputs: AEMU@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.AEMU",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/symbolize_tool",
-      "-llvm-symbolizer-restart-interval",
-      "2",
-      "-level",
-      "debug",
-      "-symbol-server",
-      "debug-symbols",
-      "-symbol-cache",
-      "[CACHE]/symbol",
-      "-llvm-symbolizer",
-      "[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.AEMU.symbolize logs",
-    "stdin": "hello world!",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@json.output[symbolizer-output.json]@{}@@@",
-      "@@@STEP_LOG_END@json.output[symbolizer-output.json]@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.AEMU.check log serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.AEMU.check log serial.txt.read",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@5@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.AEMU.ensure bsdtar",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/bsdtar",
-      "-ensure-file",
-      "fuchsia/tools/bsdtar/${platform} latest",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.AEMU.ensure bsdtar.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@5@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"fuchsia/tools/bsdtar/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cipd/bsdtar/bsdtar",
-      "--extract",
-      "--verbose",
-      "-f",
-      "[CLEANUP]/swarming_tmp_4/0/out.tar",
-      "-C",
-      "[CLEANUP]/test_results/0"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.AEMU.extract",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "remove",
-      "[CLEANUP]/swarming_tmp_4/0/out.tar"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.AEMU.remove out.tar",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.always pass",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks.AEMU (attempt 0)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@",
-      "@@@STEP_LINK@swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@",
-      "@@@STEP_LINK@task outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks.AEMU (attempt 0).all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_SUMMARY_TEXT@2 passed tests@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/syslog.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.passed tasks.AEMU (attempt 0).read syslog.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.passed tasks.AEMU (attempt 0).read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@1 passed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.AEMU",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.AEMU.attempt 0 (pass)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@",
-      "@@@STEP_LINK@swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@",
-      "@@@STEP_LINK@task outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.AEMU.attempt 0 (pass).all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_TEXT@<br/>/path/to/hello<br/>/path/to/goodbye@@@",
-      "@@@STEP_SUMMARY_TEXT@2 passed tests@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/syslog.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "passes.AEMU.attempt 0 (pass).read syslog.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "passes.AEMU.attempt 0 (pass).read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "flakes",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@0 flaked@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "failures",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@0 failed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "all tasks passed"
-  },
-  {
-    "cmd": [],
-    "name": "upload AEMU test results",
-    "~followup_annotations": [
-      "@@@STEP_LINK@go/fuchsia-result-store/bid:8945511751514863184@https://goto.google.com/fuchsia-result-store/bid:8945511751514863184@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"output_file\": \"hello.out\", \"name\": \"/path/to/hello\", \"result\": \"PASS\"}, {\"output_file\": \"goodbye.out\", \"name\": \"/path/to/goodbye\", \"result\": \"PASS\"}]}",
-      "[CLEANUP]/swarming_tmp_4/0/summary.json"
-    ],
-    "infra_step": true,
-    "name": "upload AEMU test results.write summary.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@summary.json@{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"output_file\": \"hello.out\", \"name\": \"/path/to/hello\", \"result\": \"PASS\"}, {\"output_file\": \"goodbye.out\", \"name\": \"/path/to/goodbye\", \"result\": \"PASS\"}]}@@@",
-      "@@@STEP_LOG_END@summary.json@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "upload AEMU test results.ensure gsutil",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/gsutil",
-      "-ensure-file",
-      "infra/gsutil version:4.41",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "upload AEMU test results.ensure gsutil.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-version:4.41----\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/gsutil\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-vpython-spec",
-      "RECIPE_MODULE[fuchsia::gsutil]/resources/gsutil.vpython",
-      "-u",
-      "[START_DIR]/cipd/gsutil/gsutil",
-      "-o",
-      "GSUtil:software_update_check_period=0",
-      "-m",
-      "rsync",
-      "-r",
-      "[CLEANUP]/swarming_tmp_4/0",
-      "gs://fuchsia_infra/builds/8945511751514863184/AEMU"
-    ],
-    "infra_step": true,
-    "name": "upload AEMU test results.upload AEMU to fuchsia_infra",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@AEMU@https://console.cloud.google.com/storage/browser/fuchsia_infra/builds/8945511751514863184/AEMU@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "check log AEMU:serial.txt"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "check log AEMU:serial.txt.read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "name": "$result"
-  }
-]
\ No newline at end of file
diff --git a/recipe_modules/testing/examples/full.expected/isolated_tests_device.json b/recipe_modules/testing/examples/full.expected/isolated_tests_device.json
deleted file mode 100644
index e0b78773..0000000
--- a/recipe_modules/testing/examples/full.expected/isolated_tests_device.json
+++ /dev/null
@@ -1,771 +0,0 @@
-[
-  {
-    "cmd": [],
-    "name": "download build artifacts"
-  },
-  {
-    "cmd": [],
-    "name": "download build artifacts.ensure isolated",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/isolated_client",
-      "-ensure-file",
-      "infra/tools/luci/isolated/${platform} git_revision:305e79001db1846906c7136d90a863bee5bd3bfc",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.ensure isolated.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:305\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolated/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "download",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-isolated",
-      "abc",
-      "-output-dir",
-      "[CLEANUP]/build-artifacts_tmp_1"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.download build_artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/args.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"build_type\": \"release\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"target\": \"x64\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"variants\": []@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/images.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"netboot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/shards.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.load test shards",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_END@json.output (invalid)@@@",
-      "@@@STEP_LOG_LINE@json.output (exception)@No JSON object could be decoded@@@",
-      "@@@STEP_LOG_END@json.output (exception)@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "isolate build artifacts"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"variants\": [], \n  \"product\": \"products/core.gni\", \n  \"target\": \"x64\", \n  \"board\": \"boards/x64.gni\", \n  \"build_type\": \"release\"\n}",
-      "[START_DIR]/args.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@args.json@{@@@",
-      "@@@STEP_LOG_LINE@args.json@  \"variants\": [], @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"target\": \"x64\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"build_type\": \"release\"@@@",
-      "@@@STEP_LOG_LINE@args.json@}@@@",
-      "@@@STEP_LOG_END@args.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"netboot\": {\n    \"path\": \"netboot.zbi\", \n    \"bootserver_netboot\": [\n      \"--boot\"\n    ], \n    \"type\": \"zbi\", \n    \"name\": \"netboot\"\n  }, \n  \"zircon-a\": {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n}",
-      "[START_DIR]/images.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@images.json@{@@@",
-      "@@@STEP_LOG_LINE@images.json@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ], @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"netboot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@  }, @@@",
-      "@@@STEP_LOG_LINE@images.json@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@}@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[]",
-      "[START_DIR]/shards.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write shards.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@shards.json@[]@@@",
-      "@@@STEP_LOG_END@shards.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"[CLEANUP]/build-artifacts_tmp_1/arm64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/arm64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/authorized_key\": [\"[CLEANUP]/build_artifacts_tmp_2/authorized_key\"], \"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/build_artifacts_tmp_2/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/covargs\": [\"[CLEANUP]/build_artifacts_tmp_2/covargs\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/ids.txt\": [\"[CLEANUP]/build_artifacts_tmp_2/ids.txt\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_cov\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_cov\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_profdata\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_profdata\"], \"[CLEANUP]/build-artifacts_tmp_1/minfs\": [\"[CLEANUP]/build_artifacts_tmp_2/minfs\"], \"[CLEANUP]/build-artifacts_tmp_1/netboot.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/netboot.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/private_key\": [\"[CLEANUP]/build_artifacts_tmp_2/private_key\"], \"[CLEANUP]/build-artifacts_tmp_1/symbolize_tool\": [\"[CLEANUP]/build_artifacts_tmp_2/symbolize_tool\"], \"[CLEANUP]/build-artifacts_tmp_1/tests.json\": [\"[CLEANUP]/build_artifacts_tmp_2/tests.json\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/zbi\"], \"[START_DIR]/args.json\": [\"[CLEANUP]/build_artifacts_tmp_2/args.json\"], \"[START_DIR]/images.json\": [\"[CLEANUP]/build_artifacts_tmp_2/images.json\"], \"[START_DIR]/shards.json\": [\"[CLEANUP]/build_artifacts_tmp_2/shards.json\"]}"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.create_links",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/build_artifacts_tmp_2:."
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.isolate",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "mkdir /tmp/infra-test-output\nruntests -o /tmp/infra-test-output ",
-      "[CLEANUP]/runcmds"
-    ],
-    "infra_step": true,
-    "name": "write runcmds",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@runcmds@mkdir /tmp/infra-test-output@@@",
-      "@@@STEP_LOG_LINE@runcmds@runtests -o /tmp/infra-test-output @@@",
-      "@@@STEP_LOG_END@runcmds@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/zbi",
-      "--output",
-      "[CLEANUP]/build-artifacts_tmp_1/test-infra.zbi",
-      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
-      "--entry",
-      "infra/runcmds=[CLEANUP]/runcmds"
-    ],
-    "name": "create zbi"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"path\": \"netboot.zbi\", \n    \"bootserver_netboot\": [\n      \"--boot\"\n    ], \n    \"type\": \"zbi\", \n    \"name\": \"netboot\"\n  }, \n  {\n    \"path\": \"test-infra.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n]",
-      "[CLEANUP]/isolate_tmp_3/images.json"
-    ],
-    "infra_step": true,
-    "name": "write image manifest",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@images.json@[@@@",
-      "@@@STEP_LOG_LINE@images.json@  {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ], @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"netboot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@  }, @@@",
-      "@@@STEP_LOG_LINE@images.json@  {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"test-infra.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@]@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/isolate_tmp_3/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/isolate_tmp_3/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/netboot.zbi\": [\"[CLEANUP]/isolate_tmp_3/netboot.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/test-infra.zbi\": [\"[CLEANUP]/isolate_tmp_3/test-infra.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/isolate_tmp_3/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/isolate_tmp_3/testrunner\"]}"
-    ],
-    "infra_step": true,
-    "name": "create tree of build artifacts"
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/isolate_tmp_3:."
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts (2)",
-    "~followup_annotations": [
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests"
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_TEXT@passed@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_END@serial.txt@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LINK@test outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.ensure swarming",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/swarming_client",
-      "-ensure-file",
-      "infra/tools/luci/swarming/${platform} git_revision:67b11ada44a625008a2db5cb49ad453494b16ba1",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.ensure swarming.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:67b\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/swarming/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "spawn-tasks",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-json-input",
-      "{\"requests\": [{\"name\": \"all tests\", \"priority\": \"200\", \"service_account\": \"\", \"tags\": [\"test_environment_name:Intel NUC Kit NUC6i3SYK-x64\"], \"task_slices\": [{\"expiration_secs\": \"0\", \"properties\": {\"command\": [\"./botanist\", \"-level\", \"debug\", \"zedboot\", \"-config\", \"/etc/botanist/config.json\", \"-images\", \"images.json\", \"-results-dir\", \"/tmp/infra-test-output\", \"-out\", \"out.tar\", \"-serial-log\", \"serial.txt\", \"zircon.autorun.boot=/boot/bin/sh+/boot/infra/runcmds\"], \"containment\": {\"containment_type\": \"NONE\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"pool\", \"value\": \"fuchsia.tests\"}, {\"key\": \"device_type\", \"value\": \"Intel NUC Kit NUC6i3SYK\"}], \"env\": [], \"env_prefixes\": [], \"execution_timeout_secs\": \"0\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"inputs_ref\": {\"isolated\": \"[dummy hash]\", \"isolatedserver\": \"https://example.isolateserver.appspot.com\", \"namespace\": \"default-gzip\"}, \"io_timeout_secs\": \"0\", \"outputs\": [\"out.tar\", \"serial.txt\"]}}]}]}",
-      "-json-output",
-      "/path/to/tmp/json",
-      "-cancel-extra-tasks"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.trigger 1 task",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"tasks\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@    {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"request\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"all tests\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  ]@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LINK@task UI: all tests@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "collect",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-task-summary-json",
-      "/path/to/tmp/json",
-      "-task-output-stdout",
-      "json",
-      "-output-dir",
-      "[CLEANUP]/swarming_tmp_4",
-      "0"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.collect",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"1\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"output\": \"hello world!\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"output_dir\": \"output_dir\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"outputs\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"out.tar\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"serial.txt\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"results\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"duration\": 62.35, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"exit_code\": 0, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"name\": \"test\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"outputs_ref\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolated\": \"abc123\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"namespace\": \"default-gzip\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"state\": \"COMPLETED\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"1\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@task stdout+stderr: test@hello world!@@@",
-      "@@@STEP_LOG_END@task stdout+stderr: test@@@",
-      "@@@STEP_LINK@task isolated outputs: test@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.task results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/symbolize_tool",
-      "-llvm-symbolizer-restart-interval",
-      "2",
-      "-level",
-      "debug",
-      "-symbol-server",
-      "debug-symbols",
-      "-symbol-cache",
-      "[CACHE]/symbol",
-      "-llvm-symbolizer",
-      "[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.task results.symbolize logs",
-    "stdin": "hello world!",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@json.output[symbolizer-output.json]@{}@@@",
-      "@@@STEP_LOG_END@json.output[symbolizer-output.json]@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/1/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.ensure bsdtar",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/bsdtar",
-      "-ensure-file",
-      "fuchsia/tools/bsdtar/${platform} latest",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.ensure bsdtar.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"fuchsia/tools/bsdtar/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cipd/bsdtar/bsdtar",
-      "--extract",
-      "--verbose",
-      "-f",
-      "[CLEANUP]/swarming_tmp_4/1/out.tar",
-      "-C",
-      "[CLEANUP]/test_results/target/1"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.extract results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "remove",
-      "[CLEANUP]/swarming_tmp_4/1/out.tar"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.remove out.tar",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/build-artifacts_tmp_1/tests.json",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.read tests.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@tests.json@[{\"test\": {\"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", \"path\": \"/path/to/hello\", \"os\": \"fuchsia\", \"name\": \"hello\", \"label\": \"//a/b/c:hello_test(//toolchain)\"}}, {\"test\": {\"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", \"path\": \"/path/to/goodbye\", \"os\": \"fuchsia\", \"name\": \"goodbye\", \"label\": \"//a/b/c:goodbye_test(//toolchain)\"}}]@@@",
-      "@@@STEP_LOG_END@tests.json@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.all test results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.all test results.all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.all test results.all passed tests./path/to/hello",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@stdio@hello@@@",
-      "@@@STEP_LOG_END@stdio@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.all test results.all passed tests./path/to/goodbye",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@stdio@goodbye@@@",
-      "@@@STEP_LOG_END@stdio@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "upload test test results",
-    "~followup_annotations": [
-      "@@@STEP_LINK@go/fuchsia-result-store/bid:8945511751514863184@https://goto.google.com/fuchsia-result-store/bid:8945511751514863184@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"output_file\": \"hello.out\", \"name\": \"/path/to/hello\", \"result\": \"PASS\"}, {\"output_file\": \"goodbye.out\", \"name\": \"/path/to/goodbye\", \"result\": \"PASS\"}]}",
-      "[CLEANUP]/swarming_tmp_4/summary.json"
-    ],
-    "infra_step": true,
-    "name": "upload test test results.write summary.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@summary.json@{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"output_file\": \"hello.out\", \"name\": \"/path/to/hello\", \"result\": \"PASS\"}, {\"output_file\": \"goodbye.out\", \"name\": \"/path/to/goodbye\", \"result\": \"PASS\"}]}@@@",
-      "@@@STEP_LOG_END@summary.json@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "upload test test results.ensure gsutil",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/gsutil",
-      "-ensure-file",
-      "infra/gsutil version:4.41",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "upload test test results.ensure gsutil.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-version:4.41----\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/gsutil\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-vpython-spec",
-      "RECIPE_MODULE[fuchsia::gsutil]/resources/gsutil.vpython",
-      "-u",
-      "[START_DIR]/cipd/gsutil/gsutil",
-      "-o",
-      "GSUtil:software_update_check_period=0",
-      "-m",
-      "rsync",
-      "-r",
-      "[CLEANUP]/swarming_tmp_4",
-      "gs://fuchsia_infra/builds/8945511751514863184/test"
-    ],
-    "infra_step": true,
-    "name": "upload test test results.upload test to fuchsia_infra",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@test@https://console.cloud.google.com/storage/browser/fuchsia_infra/builds/8945511751514863184/test@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "check log test:serial.txt"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "check log test:serial.txt.read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "name": "$result"
-  }
-]
\ No newline at end of file
diff --git a/recipe_modules/testing/examples/full.expected/isolated_tests_device_arm64.json b/recipe_modules/testing/examples/full.expected/isolated_tests_device_arm64.json
deleted file mode 100644
index 290d7f2..0000000
--- a/recipe_modules/testing/examples/full.expected/isolated_tests_device_arm64.json
+++ /dev/null
@@ -1,771 +0,0 @@
-[
-  {
-    "cmd": [],
-    "name": "download build artifacts"
-  },
-  {
-    "cmd": [],
-    "name": "download build artifacts.ensure isolated",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/isolated_client",
-      "-ensure-file",
-      "infra/tools/luci/isolated/${platform} git_revision:305e79001db1846906c7136d90a863bee5bd3bfc",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.ensure isolated.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:305\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolated/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "download",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-isolated",
-      "abc",
-      "-output-dir",
-      "[CLEANUP]/build-artifacts_tmp_1"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.download build_artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/args.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"build_type\": \"release\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"target\": \"arm64\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"variants\": []@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/images.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"netboot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/shards.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.load test shards",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_END@json.output (invalid)@@@",
-      "@@@STEP_LOG_LINE@json.output (exception)@No JSON object could be decoded@@@",
-      "@@@STEP_LOG_END@json.output (exception)@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "isolate build artifacts"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"variants\": [], \n  \"product\": \"products/core.gni\", \n  \"target\": \"arm64\", \n  \"board\": \"boards/x64.gni\", \n  \"build_type\": \"release\"\n}",
-      "[START_DIR]/args.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@args.json@{@@@",
-      "@@@STEP_LOG_LINE@args.json@  \"variants\": [], @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"target\": \"arm64\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"build_type\": \"release\"@@@",
-      "@@@STEP_LOG_LINE@args.json@}@@@",
-      "@@@STEP_LOG_END@args.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"netboot\": {\n    \"path\": \"netboot.zbi\", \n    \"bootserver_netboot\": [\n      \"--boot\"\n    ], \n    \"type\": \"zbi\", \n    \"name\": \"netboot\"\n  }, \n  \"zircon-a\": {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n}",
-      "[START_DIR]/images.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@images.json@{@@@",
-      "@@@STEP_LOG_LINE@images.json@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ], @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"netboot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@  }, @@@",
-      "@@@STEP_LOG_LINE@images.json@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@}@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[]",
-      "[START_DIR]/shards.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write shards.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@shards.json@[]@@@",
-      "@@@STEP_LOG_END@shards.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"[CLEANUP]/build-artifacts_tmp_1/arm64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/arm64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/authorized_key\": [\"[CLEANUP]/build_artifacts_tmp_2/authorized_key\"], \"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/build_artifacts_tmp_2/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/covargs\": [\"[CLEANUP]/build_artifacts_tmp_2/covargs\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/ids.txt\": [\"[CLEANUP]/build_artifacts_tmp_2/ids.txt\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_cov\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_cov\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_profdata\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_profdata\"], \"[CLEANUP]/build-artifacts_tmp_1/minfs\": [\"[CLEANUP]/build_artifacts_tmp_2/minfs\"], \"[CLEANUP]/build-artifacts_tmp_1/netboot.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/netboot.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/private_key\": [\"[CLEANUP]/build_artifacts_tmp_2/private_key\"], \"[CLEANUP]/build-artifacts_tmp_1/symbolize_tool\": [\"[CLEANUP]/build_artifacts_tmp_2/symbolize_tool\"], \"[CLEANUP]/build-artifacts_tmp_1/tests.json\": [\"[CLEANUP]/build_artifacts_tmp_2/tests.json\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/zbi\"], \"[START_DIR]/args.json\": [\"[CLEANUP]/build_artifacts_tmp_2/args.json\"], \"[START_DIR]/images.json\": [\"[CLEANUP]/build_artifacts_tmp_2/images.json\"], \"[START_DIR]/shards.json\": [\"[CLEANUP]/build_artifacts_tmp_2/shards.json\"]}"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.create_links",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/build_artifacts_tmp_2:."
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.isolate",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "mkdir /tmp/infra-test-output\nruntests -o /tmp/infra-test-output ",
-      "[CLEANUP]/runcmds"
-    ],
-    "infra_step": true,
-    "name": "write runcmds",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@runcmds@mkdir /tmp/infra-test-output@@@",
-      "@@@STEP_LOG_LINE@runcmds@runtests -o /tmp/infra-test-output @@@",
-      "@@@STEP_LOG_END@runcmds@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/zbi",
-      "--output",
-      "[CLEANUP]/build-artifacts_tmp_1/test-infra.zbi",
-      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
-      "--entry",
-      "infra/runcmds=[CLEANUP]/runcmds"
-    ],
-    "name": "create zbi"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"path\": \"netboot.zbi\", \n    \"bootserver_netboot\": [\n      \"--boot\"\n    ], \n    \"type\": \"zbi\", \n    \"name\": \"netboot\"\n  }, \n  {\n    \"path\": \"test-infra.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n]",
-      "[CLEANUP]/isolate_tmp_3/images.json"
-    ],
-    "infra_step": true,
-    "name": "write image manifest",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@images.json@[@@@",
-      "@@@STEP_LOG_LINE@images.json@  {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ], @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"netboot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@  }, @@@",
-      "@@@STEP_LOG_LINE@images.json@  {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"test-infra.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@]@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/isolate_tmp_3/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/isolate_tmp_3/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/netboot.zbi\": [\"[CLEANUP]/isolate_tmp_3/netboot.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/test-infra.zbi\": [\"[CLEANUP]/isolate_tmp_3/test-infra.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/isolate_tmp_3/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/isolate_tmp_3/testrunner\"]}"
-    ],
-    "infra_step": true,
-    "name": "create tree of build artifacts"
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/isolate_tmp_3:."
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts (2)",
-    "~followup_annotations": [
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests"
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_TEXT@passed@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_END@serial.txt@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LINK@test outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.ensure swarming",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/swarming_client",
-      "-ensure-file",
-      "infra/tools/luci/swarming/${platform} git_revision:67b11ada44a625008a2db5cb49ad453494b16ba1",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.ensure swarming.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:67b\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/swarming/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "spawn-tasks",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-json-input",
-      "{\"requests\": [{\"name\": \"all tests\", \"priority\": \"200\", \"service_account\": \"\", \"tags\": [\"test_environment_name:Khadas Vim2 Max-arm64\"], \"task_slices\": [{\"expiration_secs\": \"0\", \"properties\": {\"command\": [\"./botanist\", \"-level\", \"debug\", \"zedboot\", \"-config\", \"/etc/botanist/config.json\", \"-images\", \"images.json\", \"-results-dir\", \"/tmp/infra-test-output\", \"-out\", \"out.tar\", \"-serial-log\", \"serial.txt\", \"zircon.autorun.boot=/boot/bin/sh+/boot/infra/runcmds\"], \"containment\": {\"containment_type\": \"NONE\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"pool\", \"value\": \"fuchsia.tests\"}, {\"key\": \"device_type\", \"value\": \"Khadas Vim2 Max\"}], \"env\": [], \"env_prefixes\": [], \"execution_timeout_secs\": \"0\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"inputs_ref\": {\"isolated\": \"[dummy hash]\", \"isolatedserver\": \"https://example.isolateserver.appspot.com\", \"namespace\": \"default-gzip\"}, \"io_timeout_secs\": \"0\", \"outputs\": [\"out.tar\", \"serial.txt\"]}}]}]}",
-      "-json-output",
-      "/path/to/tmp/json",
-      "-cancel-extra-tasks"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.trigger 1 task",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"tasks\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@    {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"request\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"all tests\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  ]@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LINK@task UI: all tests@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "collect",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-task-summary-json",
-      "/path/to/tmp/json",
-      "-task-output-stdout",
-      "json",
-      "-output-dir",
-      "[CLEANUP]/swarming_tmp_4",
-      "0"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.collect",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"1\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"output\": \"hello world!\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"output_dir\": \"output_dir\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"outputs\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"out.tar\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"serial.txt\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"results\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"duration\": 62.35, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"exit_code\": 0, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"name\": \"test\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"outputs_ref\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolated\": \"abc123\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"namespace\": \"default-gzip\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"state\": \"COMPLETED\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"1\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@task stdout+stderr: test@hello world!@@@",
-      "@@@STEP_LOG_END@task stdout+stderr: test@@@",
-      "@@@STEP_LINK@task isolated outputs: test@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.task results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/symbolize_tool",
-      "-llvm-symbolizer-restart-interval",
-      "2",
-      "-level",
-      "debug",
-      "-symbol-server",
-      "debug-symbols",
-      "-symbol-cache",
-      "[CACHE]/symbol",
-      "-llvm-symbolizer",
-      "[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.task results.symbolize logs",
-    "stdin": "hello world!",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@json.output[symbolizer-output.json]@{}@@@",
-      "@@@STEP_LOG_END@json.output[symbolizer-output.json]@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/1/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.ensure bsdtar",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/bsdtar",
-      "-ensure-file",
-      "fuchsia/tools/bsdtar/${platform} latest",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.ensure bsdtar.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"fuchsia/tools/bsdtar/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cipd/bsdtar/bsdtar",
-      "--extract",
-      "--verbose",
-      "-f",
-      "[CLEANUP]/swarming_tmp_4/1/out.tar",
-      "-C",
-      "[CLEANUP]/test_results/target/1"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.extract results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "remove",
-      "[CLEANUP]/swarming_tmp_4/1/out.tar"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.remove out.tar",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/build-artifacts_tmp_1/tests.json",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.read tests.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@tests.json@[{\"test\": {\"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", \"path\": \"/path/to/hello\", \"os\": \"fuchsia\", \"name\": \"hello\", \"label\": \"//a/b/c:hello_test(//toolchain)\"}}, {\"test\": {\"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", \"path\": \"/path/to/goodbye\", \"os\": \"fuchsia\", \"name\": \"goodbye\", \"label\": \"//a/b/c:goodbye_test(//toolchain)\"}}]@@@",
-      "@@@STEP_LOG_END@tests.json@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.all test results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.all test results.all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.all test results.all passed tests./path/to/hello",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@stdio@hello@@@",
-      "@@@STEP_LOG_END@stdio@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.all test results.all passed tests./path/to/goodbye",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@stdio@goodbye@@@",
-      "@@@STEP_LOG_END@stdio@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "upload test test results",
-    "~followup_annotations": [
-      "@@@STEP_LINK@go/fuchsia-result-store/bid:8945511751514863184@https://goto.google.com/fuchsia-result-store/bid:8945511751514863184@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"output_file\": \"hello.out\", \"name\": \"/path/to/hello\", \"result\": \"PASS\"}, {\"output_file\": \"goodbye.out\", \"name\": \"/path/to/goodbye\", \"result\": \"PASS\"}]}",
-      "[CLEANUP]/swarming_tmp_4/summary.json"
-    ],
-    "infra_step": true,
-    "name": "upload test test results.write summary.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@summary.json@{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"output_file\": \"hello.out\", \"name\": \"/path/to/hello\", \"result\": \"PASS\"}, {\"output_file\": \"goodbye.out\", \"name\": \"/path/to/goodbye\", \"result\": \"PASS\"}]}@@@",
-      "@@@STEP_LOG_END@summary.json@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "upload test test results.ensure gsutil",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/gsutil",
-      "-ensure-file",
-      "infra/gsutil version:4.41",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "upload test test results.ensure gsutil.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-version:4.41----\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/gsutil\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-vpython-spec",
-      "RECIPE_MODULE[fuchsia::gsutil]/resources/gsutil.vpython",
-      "-u",
-      "[START_DIR]/cipd/gsutil/gsutil",
-      "-o",
-      "GSUtil:software_update_check_period=0",
-      "-m",
-      "rsync",
-      "-r",
-      "[CLEANUP]/swarming_tmp_4",
-      "gs://fuchsia_infra/builds/8945511751514863184/test"
-    ],
-    "infra_step": true,
-    "name": "upload test test results.upload test to fuchsia_infra",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@test@https://console.cloud.google.com/storage/browser/fuchsia_infra/builds/8945511751514863184/test@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "check log test:serial.txt"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "check log test:serial.txt.read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "name": "$result"
-  }
-]
\ No newline at end of file
diff --git a/recipe_modules/testing/examples/full.expected/isolated_tests_x64_with_secrets.json b/recipe_modules/testing/examples/full.expected/isolated_tests_x64_with_secrets.json
deleted file mode 100644
index ee86fa6..0000000
--- a/recipe_modules/testing/examples/full.expected/isolated_tests_x64_with_secrets.json
+++ /dev/null
@@ -1,807 +0,0 @@
-[
-  {
-    "cmd": [],
-    "name": "download build artifacts"
-  },
-  {
-    "cmd": [],
-    "name": "download build artifacts.ensure isolated",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/isolated_client",
-      "-ensure-file",
-      "infra/tools/luci/isolated/${platform} git_revision:305e79001db1846906c7136d90a863bee5bd3bfc",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.ensure isolated.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:305\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolated/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "download",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-isolated",
-      "abc",
-      "-output-dir",
-      "[CLEANUP]/build-artifacts_tmp_1"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.download build_artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/args.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"build_type\": \"release\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"target\": \"x64\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"variants\": []@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/images.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"netboot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/shards.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.load test shards",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_END@json.output (invalid)@@@",
-      "@@@STEP_LOG_LINE@json.output (exception)@No JSON object could be decoded@@@",
-      "@@@STEP_LOG_END@json.output (exception)@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "isolate build artifacts"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"variants\": [], \n  \"product\": \"products/core.gni\", \n  \"target\": \"x64\", \n  \"board\": \"boards/x64.gni\", \n  \"build_type\": \"release\"\n}",
-      "[START_DIR]/args.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@args.json@{@@@",
-      "@@@STEP_LOG_LINE@args.json@  \"variants\": [], @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"target\": \"x64\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"build_type\": \"release\"@@@",
-      "@@@STEP_LOG_LINE@args.json@}@@@",
-      "@@@STEP_LOG_END@args.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"netboot\": {\n    \"path\": \"netboot.zbi\", \n    \"bootserver_netboot\": [\n      \"--boot\"\n    ], \n    \"type\": \"zbi\", \n    \"name\": \"netboot\"\n  }, \n  \"zircon-a\": {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n}",
-      "[START_DIR]/images.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@images.json@{@@@",
-      "@@@STEP_LOG_LINE@images.json@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ], @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"netboot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@  }, @@@",
-      "@@@STEP_LOG_LINE@images.json@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@}@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[]",
-      "[START_DIR]/shards.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write shards.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@shards.json@[]@@@",
-      "@@@STEP_LOG_END@shards.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"[CLEANUP]/build-artifacts_tmp_1/arm64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/arm64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/authorized_key\": [\"[CLEANUP]/build_artifacts_tmp_2/authorized_key\"], \"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/build_artifacts_tmp_2/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/covargs\": [\"[CLEANUP]/build_artifacts_tmp_2/covargs\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/ids.txt\": [\"[CLEANUP]/build_artifacts_tmp_2/ids.txt\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_cov\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_cov\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_profdata\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_profdata\"], \"[CLEANUP]/build-artifacts_tmp_1/minfs\": [\"[CLEANUP]/build_artifacts_tmp_2/minfs\"], \"[CLEANUP]/build-artifacts_tmp_1/netboot.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/netboot.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/private_key\": [\"[CLEANUP]/build_artifacts_tmp_2/private_key\"], \"[CLEANUP]/build-artifacts_tmp_1/symbolize_tool\": [\"[CLEANUP]/build_artifacts_tmp_2/symbolize_tool\"], \"[CLEANUP]/build-artifacts_tmp_1/tests.json\": [\"[CLEANUP]/build_artifacts_tmp_2/tests.json\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/zbi\"], \"[START_DIR]/args.json\": [\"[CLEANUP]/build_artifacts_tmp_2/args.json\"], \"[START_DIR]/images.json\": [\"[CLEANUP]/build_artifacts_tmp_2/images.json\"], \"[START_DIR]/shards.json\": [\"[CLEANUP]/build_artifacts_tmp_2/shards.json\"]}"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.create_links",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/build_artifacts_tmp_2:."
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.isolate",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "mkdir /tmp/infra-test-output\nwaitfor class=block topo=/dev/sys/pci/00:06.0/virtio-block/block timeout=60000\nmount /dev/sys/pci/00:06.0/virtio-block/block /tmp/infra-test-output\nruntests -o /tmp/infra-test-output -i 1 \numount /tmp/infra-test-output\ndm poweroff",
-      "[CLEANUP]/runcmds"
-    ],
-    "infra_step": true,
-    "name": "write runcmds",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@runcmds@mkdir /tmp/infra-test-output@@@",
-      "@@@STEP_LOG_LINE@runcmds@waitfor class=block topo=/dev/sys/pci/00:06.0/virtio-block/block timeout=60000@@@",
-      "@@@STEP_LOG_LINE@runcmds@mount /dev/sys/pci/00:06.0/virtio-block/block /tmp/infra-test-output@@@",
-      "@@@STEP_LOG_LINE@runcmds@runtests -o /tmp/infra-test-output -i 1 @@@",
-      "@@@STEP_LOG_LINE@runcmds@umount /tmp/infra-test-output@@@",
-      "@@@STEP_LOG_LINE@runcmds@dm poweroff@@@",
-      "@@@STEP_LOG_END@runcmds@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/zbi",
-      "--output",
-      "[CLEANUP]/build-artifacts_tmp_1/test-infra.zbi",
-      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
-      "--entry",
-      "infra/runcmds=[CLEANUP]/runcmds"
-    ],
-    "name": "create zbi"
-  },
-  {
-    "cmd": [],
-    "name": "ensure cloudkms"
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/cloudkms",
-      "-ensure-file",
-      "infra/tools/luci/cloudkms/${platform} latest",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "ensure cloudkms.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/cloudkms/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "process secret specs"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "listdir",
-      "[CLEANUP]/build-artifacts_tmp_1/secret_specs"
-    ],
-    "infra_step": true,
-    "name": "process secret specs.list",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@listdir@[CLEANUP]/build-artifacts_tmp_1/secret_specs/auth-token.json@@@",
-      "@@@STEP_LOG_LINE@listdir@[CLEANUP]/build-artifacts_tmp_1/secret_specs/ciphertext@@@",
-      "@@@STEP_LOG_END@listdir@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/secret_specs/auth-token.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "process secret specs.read spec for auth-token",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"cloudkms_key_path\": \"key-path\"@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cipd/cloudkms/cloudkms",
-      "decrypt",
-      "-input",
-      "[CLEANUP]/build-artifacts_tmp_1/secret_specs/ciphertext/auth-token.ciphertext",
-      "-output",
-      "/path/to/tmp/",
-      "key-path"
-    ],
-    "name": "process secret specs.decrypt secret for auth-token",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/minfs",
-      "[CLEANUP]/isolate_tmp_3/output.fs@3584M",
-      "create"
-    ],
-    "name": "create test image"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"path\": \"test-infra.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n]",
-      "[CLEANUP]/isolate_tmp_3/images.json"
-    ],
-    "infra_step": true,
-    "name": "write image manifest",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@images.json@[@@@",
-      "@@@STEP_LOG_LINE@images.json@  {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"test-infra.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@]@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/isolate_tmp_3/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/isolate_tmp_3/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/test-infra.zbi\": [\"[CLEANUP]/isolate_tmp_3/test-infra.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/isolate_tmp_3/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/isolate_tmp_3/testrunner\"]}"
-    ],
-    "infra_step": true,
-    "name": "create tree of build artifacts"
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/isolate_tmp_3:."
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts (2)",
-    "~followup_annotations": [
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests"
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_TEXT@passed@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//a/b/c:hello_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"fuchsia-pkg://fuchsia.com/hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//a/b/c:goodbye_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"fuchsia-pkg://fuchsia.com/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LINK@test outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.ensure swarming",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/swarming_client",
-      "-ensure-file",
-      "infra/tools/luci/swarming/${platform} git_revision:67b11ada44a625008a2db5cb49ad453494b16ba1",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.ensure swarming.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:67b\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/swarming/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "spawn-tasks",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-json-input",
-      "{\"requests\": [{\"name\": \"all tests\", \"priority\": \"200\", \"service_account\": \"\", \"tags\": [\"test_environment_name:QEMU-x64\", \"uses_legacy_qemu:true\"], \"task_slices\": [{\"expiration_secs\": \"0\", \"properties\": {\"cipd_input\": {\"packages\": [{\"package_name\": \"fuchsia/infra/secretshim/${platform}\", \"path\": \".\", \"version\": \"git_revision:63ab3ac613fceb52ac49b63b43fce841a2585645\"}, {\"package_name\": \"fuchsia/third_party/qemu/${platform}\", \"path\": \"qemu\", \"version\": \"git_revision:533bf2563d0213a7e002d9fcde75519d30ffa70f\"}]}, \"command\": [\"./secretshim\", \"./botanist\", \"-level\", \"debug\", \"qemu\", \"-type\", \"qemu\", \"-qemu-dir\", \"./qemu/bin\", \"-images\", \"images.json\", \"-arch\", \"x64\", \"-minfs\", \"output.fs\", \"-pci-addr\", \"06.0\", \"-use-kvm\", \"zircon.autorun.boot=/boot/bin/sh+/boot/infra/runcmds\"], \"containment\": {\"containment_type\": \"NONE\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"kvm\", \"value\": \"1\"}, {\"key\": \"os\", \"value\": \"Debian\"}, {\"key\": \"cpu\", \"value\": \"x64\"}, {\"key\": \"pool\", \"value\": \"fuchsia.tests\"}], \"env\": [], \"env_prefixes\": [], \"execution_timeout_secs\": \"0\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"inputs_ref\": {\"isolated\": \"[dummy hash]\", \"isolatedserver\": \"https://example.isolateserver.appspot.com\", \"namespace\": \"default-gzip\"}, \"io_timeout_secs\": \"0\", \"outputs\": [\"output.fs\"], \"secret_bytes\": \"eyJhdXRoLXRva2VuIjogIiJ9\"}}]}]}",
-      "-json-output",
-      "/path/to/tmp/json",
-      "-cancel-extra-tasks"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.trigger 1 task",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"tasks\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@    {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"request\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"all tests\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  ]@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LINK@task UI: all tests@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "collect",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-task-summary-json",
-      "/path/to/tmp/json",
-      "-task-output-stdout",
-      "json",
-      "-output-dir",
-      "[CLEANUP]/swarming_tmp_4",
-      "0"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.collect",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"1\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"output\": \"hello world!\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"output_dir\": \"output_dir\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"outputs\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"output.fs\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"results\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"duration\": 62.35, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"exit_code\": 0, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"name\": \"test\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"outputs_ref\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolated\": \"abc123\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"namespace\": \"default-gzip\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"state\": \"COMPLETED\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"1\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@task stdout+stderr: test@hello world!@@@",
-      "@@@STEP_LOG_END@task stdout+stderr: test@@@",
-      "@@@STEP_LINK@task isolated outputs: test@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.task results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/symbolize_tool",
-      "-llvm-symbolizer-restart-interval",
-      "2",
-      "-level",
-      "debug",
-      "-symbol-server",
-      "debug-symbols",
-      "-symbol-cache",
-      "[CACHE]/symbol",
-      "-llvm-symbolizer",
-      "[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.task results.symbolize logs",
-    "stdin": "hello world!",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@json.output[symbolizer-output.json]@{}@@@",
-      "@@@STEP_LOG_END@json.output[symbolizer-output.json]@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/minfs",
-      "[CLEANUP]/swarming_tmp_4/1/output.fs",
-      "cp",
-      "::",
-      "[CLEANUP]/test_results/target/1"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.extract results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "remove",
-      "[CLEANUP]/swarming_tmp_4/1/output.fs"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.remove output.fs",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/build-artifacts_tmp_1/tests.json",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.read tests.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@tests.json@[{\"test\": {\"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", \"path\": \"/path/to/hello\", \"os\": \"fuchsia\", \"name\": \"hello\", \"label\": \"//a/b/c:hello_test(//toolchain)\"}}, {\"test\": {\"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", \"path\": \"/path/to/goodbye\", \"os\": \"fuchsia\", \"name\": \"goodbye\", \"label\": \"//a/b/c:goodbye_test(//toolchain)\"}}]@@@",
-      "@@@STEP_LOG_END@tests.json@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.all test results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.all test results.all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.all test results.all passed tests.fuchsia-pkg://fuchsia.com/hello",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@stdio@hello@@@",
-      "@@@STEP_LOG_END@stdio@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.all test results.all passed tests.fuchsia-pkg://fuchsia.com/goodbye",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@stdio@goodbye@@@",
-      "@@@STEP_LOG_END@stdio@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "upload test test results",
-    "~followup_annotations": [
-      "@@@STEP_LINK@go/fuchsia-result-store/bid:8945511751514863184@https://goto.google.com/fuchsia-result-store/bid:8945511751514863184@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"gn_label\": \"//a/b/c:hello_test(//toolchain)\", \"output_file\": \"hello.out\", \"name\": \"fuchsia-pkg://fuchsia.com/hello\", \"result\": \"PASS\"}, {\"gn_label\": \"//a/b/c:goodbye_test(//toolchain)\", \"output_file\": \"goodbye.out\", \"name\": \"fuchsia-pkg://fuchsia.com/goodbye\", \"result\": \"PASS\"}]}",
-      "[CLEANUP]/swarming_tmp_4/summary.json"
-    ],
-    "infra_step": true,
-    "name": "upload test test results.write summary.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@summary.json@{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"gn_label\": \"//a/b/c:hello_test(//toolchain)\", \"output_file\": \"hello.out\", \"name\": \"fuchsia-pkg://fuchsia.com/hello\", \"result\": \"PASS\"}, {\"gn_label\": \"//a/b/c:goodbye_test(//toolchain)\", \"output_file\": \"goodbye.out\", \"name\": \"fuchsia-pkg://fuchsia.com/goodbye\", \"result\": \"PASS\"}]}@@@",
-      "@@@STEP_LOG_END@summary.json@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "upload test test results.ensure gsutil",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/gsutil",
-      "-ensure-file",
-      "infra/gsutil version:4.41",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "upload test test results.ensure gsutil.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-version:4.41----\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/gsutil\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-vpython-spec",
-      "RECIPE_MODULE[fuchsia::gsutil]/resources/gsutil.vpython",
-      "-u",
-      "[START_DIR]/cipd/gsutil/gsutil",
-      "-o",
-      "GSUtil:software_update_check_period=0",
-      "-m",
-      "rsync",
-      "-r",
-      "[CLEANUP]/swarming_tmp_4",
-      "gs://fuchsia_infra/builds/8945511751514863184/test"
-    ],
-    "infra_step": true,
-    "name": "upload test test results.upload test to fuchsia_infra",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@test@https://console.cloud.google.com/storage/browser/fuchsia_infra/builds/8945511751514863184/test@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "check log test:serial.txt"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "check log test:serial.txt.read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "name": "$result"
-  }
-]
\ No newline at end of file
diff --git a/recipe_modules/testing/examples/full.expected/retry_after_failure.json b/recipe_modules/testing/examples/full.expected/retry_after_failure.json
deleted file mode 100644
index 39eab00..0000000
--- a/recipe_modules/testing/examples/full.expected/retry_after_failure.json
+++ /dev/null
@@ -1,998 +0,0 @@
-[
-  {
-    "cmd": [],
-    "name": "download build artifacts"
-  },
-  {
-    "cmd": [],
-    "name": "download build artifacts.ensure isolated",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/isolated_client",
-      "-ensure-file",
-      "infra/tools/luci/isolated/${platform} git_revision:305e79001db1846906c7136d90a863bee5bd3bfc",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.ensure isolated.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:305\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolated/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "download",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-isolated",
-      "abc",
-      "-output-dir",
-      "[CLEANUP]/build-artifacts_tmp_1"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.download build_artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/args.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"build_type\": \"release\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"target\": \"x64\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"variants\": []@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/images.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"netboot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/shards.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.load test shards",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_END@json.output (invalid)@@@",
-      "@@@STEP_LOG_LINE@json.output (exception)@No JSON object could be decoded@@@",
-      "@@@STEP_LOG_END@json.output (exception)@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "isolate build artifacts"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"variants\": [], \n  \"product\": \"products/core.gni\", \n  \"target\": \"x64\", \n  \"board\": \"boards/x64.gni\", \n  \"build_type\": \"release\"\n}",
-      "[START_DIR]/args.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@args.json@{@@@",
-      "@@@STEP_LOG_LINE@args.json@  \"variants\": [], @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"target\": \"x64\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"build_type\": \"release\"@@@",
-      "@@@STEP_LOG_LINE@args.json@}@@@",
-      "@@@STEP_LOG_END@args.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"netboot\": {\n    \"path\": \"netboot.zbi\", \n    \"bootserver_netboot\": [\n      \"--boot\"\n    ], \n    \"type\": \"zbi\", \n    \"name\": \"netboot\"\n  }, \n  \"zircon-a\": {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n}",
-      "[START_DIR]/images.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@images.json@{@@@",
-      "@@@STEP_LOG_LINE@images.json@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ], @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"netboot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@  }, @@@",
-      "@@@STEP_LOG_LINE@images.json@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@}@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[]",
-      "[START_DIR]/shards.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write shards.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@shards.json@[]@@@",
-      "@@@STEP_LOG_END@shards.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"[CLEANUP]/build-artifacts_tmp_1/arm64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/arm64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/authorized_key\": [\"[CLEANUP]/build_artifacts_tmp_2/authorized_key\"], \"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/build_artifacts_tmp_2/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/covargs\": [\"[CLEANUP]/build_artifacts_tmp_2/covargs\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/ids.txt\": [\"[CLEANUP]/build_artifacts_tmp_2/ids.txt\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_cov\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_cov\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_profdata\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_profdata\"], \"[CLEANUP]/build-artifacts_tmp_1/minfs\": [\"[CLEANUP]/build_artifacts_tmp_2/minfs\"], \"[CLEANUP]/build-artifacts_tmp_1/netboot.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/netboot.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/private_key\": [\"[CLEANUP]/build_artifacts_tmp_2/private_key\"], \"[CLEANUP]/build-artifacts_tmp_1/symbolize_tool\": [\"[CLEANUP]/build_artifacts_tmp_2/symbolize_tool\"], \"[CLEANUP]/build-artifacts_tmp_1/tests.json\": [\"[CLEANUP]/build_artifacts_tmp_2/tests.json\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/zbi\"], \"[START_DIR]/args.json\": [\"[CLEANUP]/build_artifacts_tmp_2/args.json\"], \"[START_DIR]/images.json\": [\"[CLEANUP]/build_artifacts_tmp_2/images.json\"], \"[START_DIR]/shards.json\": [\"[CLEANUP]/build_artifacts_tmp_2/shards.json\"]}"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.create_links",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/build_artifacts_tmp_2:."
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.isolate",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "mkdir /tmp/infra-test-output\nwaitfor class=block topo=/dev/sys/pci/00:06.0/virtio-block/block timeout=60000\nmount /dev/sys/pci/00:06.0/virtio-block/block /tmp/infra-test-output\nruntests -o /tmp/infra-test-output \numount /tmp/infra-test-output\ndm poweroff",
-      "[CLEANUP]/runcmds"
-    ],
-    "infra_step": true,
-    "name": "write runcmds",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@runcmds@mkdir /tmp/infra-test-output@@@",
-      "@@@STEP_LOG_LINE@runcmds@waitfor class=block topo=/dev/sys/pci/00:06.0/virtio-block/block timeout=60000@@@",
-      "@@@STEP_LOG_LINE@runcmds@mount /dev/sys/pci/00:06.0/virtio-block/block /tmp/infra-test-output@@@",
-      "@@@STEP_LOG_LINE@runcmds@runtests -o /tmp/infra-test-output @@@",
-      "@@@STEP_LOG_LINE@runcmds@umount /tmp/infra-test-output@@@",
-      "@@@STEP_LOG_LINE@runcmds@dm poweroff@@@",
-      "@@@STEP_LOG_END@runcmds@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/zbi",
-      "--output",
-      "[CLEANUP]/build-artifacts_tmp_1/test-infra.zbi",
-      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
-      "--entry",
-      "infra/runcmds=[CLEANUP]/runcmds"
-    ],
-    "name": "create zbi"
-  },
-  {
-    "cmd": [],
-    "name": "ensure cloudkms"
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/cloudkms",
-      "-ensure-file",
-      "infra/tools/luci/cloudkms/${platform} latest",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "ensure cloudkms.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/cloudkms/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "process secret specs"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "listdir",
-      "[CLEANUP]/build-artifacts_tmp_1/secret_specs"
-    ],
-    "infra_step": true,
-    "name": "process secret specs.list",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_END@listdir@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/minfs",
-      "[CLEANUP]/isolate_tmp_3/output.fs@3584M",
-      "create"
-    ],
-    "name": "create test image"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"path\": \"test-infra.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n]",
-      "[CLEANUP]/isolate_tmp_3/images.json"
-    ],
-    "infra_step": true,
-    "name": "write image manifest",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@images.json@[@@@",
-      "@@@STEP_LOG_LINE@images.json@  {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"test-infra.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@]@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/isolate_tmp_3/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/isolate_tmp_3/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/test-infra.zbi\": [\"[CLEANUP]/isolate_tmp_3/test-infra.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/isolate_tmp_3/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/isolate_tmp_3/testrunner\"]}"
-    ],
-    "infra_step": true,
-    "name": "create tree of build artifacts"
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/isolate_tmp_3:."
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts (2)",
-    "~followup_annotations": [
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests"
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_TEXT@2 test(s) failed@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//a/b/c:hello_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"fuchsia-pkg://fuchsia.com/hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"FAIL\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//a/b/c:goodbye_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"fuchsia-pkg://fuchsia.com/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"FAIL\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LINK@test outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@",
-      "@@@STEP_FAILURE@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.ensure swarming",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/swarming_client",
-      "-ensure-file",
-      "infra/tools/luci/swarming/${platform} git_revision:67b11ada44a625008a2db5cb49ad453494b16ba1",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.ensure swarming.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:67b\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/swarming/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "spawn-tasks",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-json-input",
-      "{\"requests\": [{\"name\": \"all tests\", \"priority\": \"200\", \"service_account\": \"\", \"tags\": [\"test_environment_name:QEMU-x64\", \"uses_legacy_qemu:true\"], \"task_slices\": [{\"expiration_secs\": \"0\", \"properties\": {\"cipd_input\": {\"packages\": [{\"package_name\": \"fuchsia/infra/secretshim/${platform}\", \"path\": \".\", \"version\": \"git_revision:63ab3ac613fceb52ac49b63b43fce841a2585645\"}, {\"package_name\": \"fuchsia/third_party/qemu/${platform}\", \"path\": \"qemu\", \"version\": \"git_revision:533bf2563d0213a7e002d9fcde75519d30ffa70f\"}]}, \"command\": [\"./secretshim\", \"./botanist\", \"-level\", \"debug\", \"qemu\", \"-type\", \"qemu\", \"-qemu-dir\", \"./qemu/bin\", \"-images\", \"images.json\", \"-arch\", \"x64\", \"-minfs\", \"output.fs\", \"-pci-addr\", \"06.0\", \"-use-kvm\", \"zircon.autorun.boot=/boot/bin/sh+/boot/infra/runcmds\"], \"containment\": {\"containment_type\": \"NONE\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"kvm\", \"value\": \"1\"}, {\"key\": \"os\", \"value\": \"Debian\"}, {\"key\": \"cpu\", \"value\": \"x64\"}, {\"key\": \"pool\", \"value\": \"fuchsia.tests\"}], \"env\": [], \"env_prefixes\": [], \"execution_timeout_secs\": \"0\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"inputs_ref\": {\"isolated\": \"[dummy hash]\", \"isolatedserver\": \"https://example.isolateserver.appspot.com\", \"namespace\": \"default-gzip\"}, \"io_timeout_secs\": \"0\", \"outputs\": [\"output.fs\"], \"secret_bytes\": \"e30=\"}}]}]}",
-      "-json-output",
-      "/path/to/tmp/json",
-      "-cancel-extra-tasks"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.trigger 1 task",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"tasks\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@    {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"request\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"all tests\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  ]@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LINK@task UI: all tests@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "collect",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-task-summary-json",
-      "/path/to/tmp/json",
-      "-task-output-stdout",
-      "json",
-      "-output-dir",
-      "[CLEANUP]/swarming_tmp_4",
-      "0"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.collect",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"1\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"output\": \"hello world!\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"output_dir\": \"output_dir\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"outputs\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"output.fs\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"results\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"duration\": 62.35, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"exit_code\": 0, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"name\": \"test\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"outputs_ref\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolated\": \"abc123\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"namespace\": \"default-gzip\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"state\": \"COMPLETED\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"1\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@task stdout+stderr: test@hello world!@@@",
-      "@@@STEP_LOG_END@task stdout+stderr: test@@@",
-      "@@@STEP_LINK@task isolated outputs: test@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.task results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/symbolize_tool",
-      "-llvm-symbolizer-restart-interval",
-      "2",
-      "-level",
-      "debug",
-      "-symbol-server",
-      "debug-symbols",
-      "-symbol-cache",
-      "[CACHE]/symbol",
-      "-llvm-symbolizer",
-      "[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.task results.symbolize logs",
-    "stdin": "hello world!",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@json.output[symbolizer-output.json]@{}@@@",
-      "@@@STEP_LOG_END@json.output[symbolizer-output.json]@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/minfs",
-      "[CLEANUP]/swarming_tmp_4/1/output.fs",
-      "cp",
-      "::",
-      "[CLEANUP]/test_results/target/1"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.extract results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "remove",
-      "[CLEANUP]/swarming_tmp_4/1/output.fs"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.remove output.fs",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/build-artifacts_tmp_1/tests.json",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.read tests.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@tests.json@[{\"test\": {\"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", \"path\": \"/path/to/hello\", \"os\": \"fuchsia\", \"name\": \"hello\", \"label\": \"//a/b/c:hello_test(//toolchain)\"}}, {\"test\": {\"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", \"path\": \"/path/to/goodbye\", \"os\": \"fuchsia\", \"name\": \"goodbye\", \"label\": \"//a/b/c:goodbye_test(//toolchain)\"}}]@@@",
-      "@@@STEP_LOG_END@tests.json@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.all test results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_FAILURE@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.all test results.failed: fuchsia-pkg://fuchsia.com/hello",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@stdio@hello@@@",
-      "@@@STEP_LOG_END@stdio@@@",
-      "@@@STEP_FAILURE@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.all test results.failed: fuchsia-pkg://fuchsia.com/goodbye",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@stdio@goodbye@@@",
-      "@@@STEP_LOG_END@stdio@@@",
-      "@@@STEP_FAILURE@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.all test results.all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 1",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_TEXT@passed@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//a/b/c:hello_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"fuchsia-pkg://fuchsia.com/hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//a/b/c:goodbye_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"fuchsia-pkg://fuchsia.com/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LINK@test outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "spawn-tasks",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-json-input",
-      "{\"requests\": [{\"name\": \"all tests\", \"priority\": \"200\", \"service_account\": \"\", \"tags\": [\"test_environment_name:QEMU-x64\", \"uses_legacy_qemu:true\"], \"task_slices\": [{\"expiration_secs\": \"0\", \"properties\": {\"cipd_input\": {\"packages\": [{\"package_name\": \"fuchsia/infra/secretshim/${platform}\", \"path\": \".\", \"version\": \"git_revision:63ab3ac613fceb52ac49b63b43fce841a2585645\"}, {\"package_name\": \"fuchsia/third_party/qemu/${platform}\", \"path\": \"qemu\", \"version\": \"git_revision:533bf2563d0213a7e002d9fcde75519d30ffa70f\"}]}, \"command\": [\"./secretshim\", \"./botanist\", \"-level\", \"debug\", \"qemu\", \"-type\", \"qemu\", \"-qemu-dir\", \"./qemu/bin\", \"-images\", \"images.json\", \"-arch\", \"x64\", \"-minfs\", \"output.fs\", \"-pci-addr\", \"06.0\", \"-use-kvm\", \"zircon.autorun.boot=/boot/bin/sh+/boot/infra/runcmds\"], \"containment\": {\"containment_type\": \"NONE\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"kvm\", \"value\": \"1\"}, {\"key\": \"os\", \"value\": \"Debian\"}, {\"key\": \"cpu\", \"value\": \"x64\"}, {\"key\": \"pool\", \"value\": \"fuchsia.tests\"}], \"env\": [], \"env_prefixes\": [], \"execution_timeout_secs\": \"0\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"inputs_ref\": {\"isolated\": \"[dummy hash]\", \"isolatedserver\": \"https://example.isolateserver.appspot.com\", \"namespace\": \"default-gzip\"}, \"io_timeout_secs\": \"0\", \"outputs\": [\"output.fs\"], \"secret_bytes\": \"e30=\"}}]}]}",
-      "-json-output",
-      "/path/to/tmp/json",
-      "-cancel-extra-tasks"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 1.trigger 1 task",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"tasks\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@    {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"request\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"all tests\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  ]@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LINK@task UI: all tests@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "collect",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-task-summary-json",
-      "/path/to/tmp/json",
-      "-task-output-stdout",
-      "json",
-      "-output-dir",
-      "[CLEANUP]/swarming_tmp_4",
-      "0"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 1.collect",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"2\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"output\": \"hello world!\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"outputs\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"out.tar\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"results\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"duration\": 62.35, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"exit_code\": 0, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"name\": \"test\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"outputs_ref\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolated\": \"abc123\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"namespace\": \"default-gzip\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"state\": \"COMPLETED\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"2\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@task stdout+stderr: test@hello world!@@@",
-      "@@@STEP_LOG_END@task stdout+stderr: test@@@",
-      "@@@STEP_LINK@task isolated outputs: test@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 1.task results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/symbolize_tool",
-      "-llvm-symbolizer-restart-interval",
-      "2",
-      "-level",
-      "debug",
-      "-symbol-server",
-      "debug-symbols",
-      "-symbol-cache",
-      "[CACHE]/symbol",
-      "-llvm-symbolizer",
-      "[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 1.task results.symbolize logs",
-    "stdin": "hello world!",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@json.output[symbolizer-output.json]@{}@@@",
-      "@@@STEP_LOG_END@json.output[symbolizer-output.json]@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/minfs",
-      "[CLEANUP]/swarming_tmp_4/2/out.tar",
-      "cp",
-      "::",
-      "[CLEANUP]/test_results/target/2"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 1.extract results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "remove",
-      "[CLEANUP]/swarming_tmp_4/2/out.tar"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 1.remove out.tar",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/build-artifacts_tmp_1/tests.json",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 1.read tests.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@tests.json@[{\"test\": {\"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", \"path\": \"/path/to/hello\", \"os\": \"fuchsia\", \"name\": \"hello\", \"label\": \"//a/b/c:hello_test(//toolchain)\"}}, {\"test\": {\"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", \"path\": \"/path/to/goodbye\", \"os\": \"fuchsia\", \"name\": \"goodbye\", \"label\": \"//a/b/c:goodbye_test(//toolchain)\"}}]@@@",
-      "@@@STEP_LOG_END@tests.json@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 1.all test results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 1.all test results.all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 1.all test results.all passed tests.fuchsia-pkg://fuchsia.com/hello",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@stdio@hello@@@",
-      "@@@STEP_LOG_END@stdio@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 1.all test results.all passed tests.fuchsia-pkg://fuchsia.com/goodbye",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@stdio@goodbye@@@",
-      "@@@STEP_LOG_END@stdio@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "upload test test results",
-    "~followup_annotations": [
-      "@@@STEP_LINK@go/fuchsia-result-store/bid:8945511751514863184@https://goto.google.com/fuchsia-result-store/bid:8945511751514863184@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"gn_label\": \"//a/b/c:hello_test(//toolchain)\", \"output_file\": \"hello.out\", \"name\": \"fuchsia-pkg://fuchsia.com/hello\", \"result\": \"PASS\"}, {\"gn_label\": \"//a/b/c:goodbye_test(//toolchain)\", \"output_file\": \"goodbye.out\", \"name\": \"fuchsia-pkg://fuchsia.com/goodbye\", \"result\": \"PASS\"}]}",
-      "[CLEANUP]/swarming_tmp_4/summary.json"
-    ],
-    "infra_step": true,
-    "name": "upload test test results.write summary.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@summary.json@{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"gn_label\": \"//a/b/c:hello_test(//toolchain)\", \"output_file\": \"hello.out\", \"name\": \"fuchsia-pkg://fuchsia.com/hello\", \"result\": \"PASS\"}, {\"gn_label\": \"//a/b/c:goodbye_test(//toolchain)\", \"output_file\": \"goodbye.out\", \"name\": \"fuchsia-pkg://fuchsia.com/goodbye\", \"result\": \"PASS\"}]}@@@",
-      "@@@STEP_LOG_END@summary.json@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "upload test test results.ensure gsutil",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/gsutil",
-      "-ensure-file",
-      "infra/gsutil version:4.41",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "upload test test results.ensure gsutil.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-version:4.41----\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/gsutil\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-vpython-spec",
-      "RECIPE_MODULE[fuchsia::gsutil]/resources/gsutil.vpython",
-      "-u",
-      "[START_DIR]/cipd/gsutil/gsutil",
-      "-o",
-      "GSUtil:software_update_check_period=0",
-      "-m",
-      "rsync",
-      "-r",
-      "[CLEANUP]/swarming_tmp_4",
-      "gs://fuchsia_infra/builds/8945511751514863184/test"
-    ],
-    "infra_step": true,
-    "name": "upload test test results.upload test to fuchsia_infra",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@test@https://console.cloud.google.com/storage/browser/fuchsia_infra/builds/8945511751514863184/test@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "check log test:serial.txt"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "check log test:serial.txt.read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "name": "$result"
-  }
-]
\ No newline at end of file
diff --git a/recipe_modules/testing/examples/full.expected/retry_after_timeout.json b/recipe_modules/testing/examples/full.expected/retry_after_timeout.json
deleted file mode 100644
index f140deb..0000000
--- a/recipe_modules/testing/examples/full.expected/retry_after_timeout.json
+++ /dev/null
@@ -1,889 +0,0 @@
-[
-  {
-    "cmd": [],
-    "name": "download build artifacts"
-  },
-  {
-    "cmd": [],
-    "name": "download build artifacts.ensure isolated",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/isolated_client",
-      "-ensure-file",
-      "infra/tools/luci/isolated/${platform} git_revision:305e79001db1846906c7136d90a863bee5bd3bfc",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.ensure isolated.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:305\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolated/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "download",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-isolated",
-      "abc",
-      "-output-dir",
-      "[CLEANUP]/build-artifacts_tmp_1"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.download build_artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/args.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"build_type\": \"build_type\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"target\": \"x64\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"variants\": []@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/images.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"netboot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/shards.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.load test shards",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_END@json.output (invalid)@@@",
-      "@@@STEP_LOG_LINE@json.output (exception)@No JSON object could be decoded@@@",
-      "@@@STEP_LOG_END@json.output (exception)@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "isolate build artifacts"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"variants\": [], \n  \"product\": \"products/core.gni\", \n  \"target\": \"x64\", \n  \"board\": \"boards/x64.gni\", \n  \"build_type\": \"build_type\"\n}",
-      "[START_DIR]/args.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@args.json@{@@@",
-      "@@@STEP_LOG_LINE@args.json@  \"variants\": [], @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"target\": \"x64\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"build_type\": \"build_type\"@@@",
-      "@@@STEP_LOG_LINE@args.json@}@@@",
-      "@@@STEP_LOG_END@args.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"netboot\": {\n    \"path\": \"netboot.zbi\", \n    \"bootserver_netboot\": [\n      \"--boot\"\n    ], \n    \"type\": \"zbi\", \n    \"name\": \"netboot\"\n  }, \n  \"zircon-a\": {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n}",
-      "[START_DIR]/images.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@images.json@{@@@",
-      "@@@STEP_LOG_LINE@images.json@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ], @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"netboot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@  }, @@@",
-      "@@@STEP_LOG_LINE@images.json@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@}@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[]",
-      "[START_DIR]/shards.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write shards.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@shards.json@[]@@@",
-      "@@@STEP_LOG_END@shards.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"[CLEANUP]/build-artifacts_tmp_1/arm64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/arm64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/authorized_key\": [\"[CLEANUP]/build_artifacts_tmp_2/authorized_key\"], \"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/build_artifacts_tmp_2/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/covargs\": [\"[CLEANUP]/build_artifacts_tmp_2/covargs\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/ids.txt\": [\"[CLEANUP]/build_artifacts_tmp_2/ids.txt\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_cov\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_cov\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_profdata\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_profdata\"], \"[CLEANUP]/build-artifacts_tmp_1/minfs\": [\"[CLEANUP]/build_artifacts_tmp_2/minfs\"], \"[CLEANUP]/build-artifacts_tmp_1/netboot.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/netboot.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/private_key\": [\"[CLEANUP]/build_artifacts_tmp_2/private_key\"], \"[CLEANUP]/build-artifacts_tmp_1/symbolize_tool\": [\"[CLEANUP]/build_artifacts_tmp_2/symbolize_tool\"], \"[CLEANUP]/build-artifacts_tmp_1/tests.json\": [\"[CLEANUP]/build_artifacts_tmp_2/tests.json\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/zbi\"], \"[START_DIR]/args.json\": [\"[CLEANUP]/build_artifacts_tmp_2/args.json\"], \"[START_DIR]/images.json\": [\"[CLEANUP]/build_artifacts_tmp_2/images.json\"], \"[START_DIR]/shards.json\": [\"[CLEANUP]/build_artifacts_tmp_2/shards.json\"]}"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.create_links",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/build_artifacts_tmp_2:."
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.isolate",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "mkdir /tmp/infra-test-output\nwaitfor class=block topo=/dev/sys/pci/00:06.0/virtio-block/block timeout=60000\nmount /dev/sys/pci/00:06.0/virtio-block/block /tmp/infra-test-output\nruntests -o /tmp/infra-test-output \numount /tmp/infra-test-output\ndm poweroff",
-      "[CLEANUP]/runcmds"
-    ],
-    "infra_step": true,
-    "name": "write runcmds",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@runcmds@mkdir /tmp/infra-test-output@@@",
-      "@@@STEP_LOG_LINE@runcmds@waitfor class=block topo=/dev/sys/pci/00:06.0/virtio-block/block timeout=60000@@@",
-      "@@@STEP_LOG_LINE@runcmds@mount /dev/sys/pci/00:06.0/virtio-block/block /tmp/infra-test-output@@@",
-      "@@@STEP_LOG_LINE@runcmds@runtests -o /tmp/infra-test-output @@@",
-      "@@@STEP_LOG_LINE@runcmds@umount /tmp/infra-test-output@@@",
-      "@@@STEP_LOG_LINE@runcmds@dm poweroff@@@",
-      "@@@STEP_LOG_END@runcmds@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/zbi",
-      "--output",
-      "[CLEANUP]/build-artifacts_tmp_1/test-infra.zbi",
-      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
-      "--entry",
-      "infra/runcmds=[CLEANUP]/runcmds"
-    ],
-    "name": "create zbi"
-  },
-  {
-    "cmd": [],
-    "name": "ensure cloudkms"
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/cloudkms",
-      "-ensure-file",
-      "infra/tools/luci/cloudkms/${platform} latest",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "ensure cloudkms.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/cloudkms/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "process secret specs"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "listdir",
-      "[CLEANUP]/build-artifacts_tmp_1/secret_specs"
-    ],
-    "infra_step": true,
-    "name": "process secret specs.list",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_END@listdir@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/minfs",
-      "[CLEANUP]/isolate_tmp_3/output.fs@3584M",
-      "create"
-    ],
-    "name": "create test image"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"path\": \"test-infra.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n]",
-      "[CLEANUP]/isolate_tmp_3/images.json"
-    ],
-    "infra_step": true,
-    "name": "write image manifest",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@images.json@[@@@",
-      "@@@STEP_LOG_LINE@images.json@  {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"test-infra.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@]@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/isolate_tmp_3/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/isolate_tmp_3/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/test-infra.zbi\": [\"[CLEANUP]/isolate_tmp_3/test-infra.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/isolate_tmp_3/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/isolate_tmp_3/testrunner\"]}"
-    ],
-    "infra_step": true,
-    "name": "create tree of build artifacts"
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/isolate_tmp_3:."
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts (2)",
-    "~followup_annotations": [
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests"
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_TEXT@timed out@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LINK@test outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@",
-      "@@@STEP_FAILURE@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.ensure swarming",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/swarming_client",
-      "-ensure-file",
-      "infra/tools/luci/swarming/${platform} git_revision:67b11ada44a625008a2db5cb49ad453494b16ba1",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.ensure swarming.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:67b\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/swarming/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "spawn-tasks",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-json-input",
-      "{\"requests\": [{\"name\": \"all tests\", \"priority\": \"200\", \"service_account\": \"\", \"tags\": [\"test_environment_name:QEMU-x64\", \"uses_legacy_qemu:true\"], \"task_slices\": [{\"expiration_secs\": \"0\", \"properties\": {\"cipd_input\": {\"packages\": [{\"package_name\": \"fuchsia/infra/secretshim/${platform}\", \"path\": \".\", \"version\": \"git_revision:63ab3ac613fceb52ac49b63b43fce841a2585645\"}, {\"package_name\": \"fuchsia/third_party/qemu/${platform}\", \"path\": \"qemu\", \"version\": \"git_revision:533bf2563d0213a7e002d9fcde75519d30ffa70f\"}]}, \"command\": [\"./secretshim\", \"./botanist\", \"-level\", \"debug\", \"qemu\", \"-type\", \"qemu\", \"-qemu-dir\", \"./qemu/bin\", \"-images\", \"images.json\", \"-arch\", \"x64\", \"-minfs\", \"output.fs\", \"-pci-addr\", \"06.0\", \"-use-kvm\", \"zircon.autorun.boot=/boot/bin/sh+/boot/infra/runcmds\"], \"containment\": {\"containment_type\": \"NONE\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"kvm\", \"value\": \"1\"}, {\"key\": \"os\", \"value\": \"Debian\"}, {\"key\": \"cpu\", \"value\": \"x64\"}, {\"key\": \"pool\", \"value\": \"fuchsia.tests\"}], \"env\": [], \"env_prefixes\": [], \"execution_timeout_secs\": \"0\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"inputs_ref\": {\"isolated\": \"[dummy hash]\", \"isolatedserver\": \"https://example.isolateserver.appspot.com\", \"namespace\": \"default-gzip\"}, \"io_timeout_secs\": \"0\", \"outputs\": [\"output.fs\"], \"secret_bytes\": \"e30=\"}}]}]}",
-      "-json-output",
-      "/path/to/tmp/json",
-      "-cancel-extra-tasks"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.trigger 1 task",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"tasks\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@    {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"request\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"all tests\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  ]@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LINK@task UI: all tests@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "collect",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-task-summary-json",
-      "/path/to/tmp/json",
-      "-task-output-stdout",
-      "json",
-      "-output-dir",
-      "[CLEANUP]/swarming_tmp_4",
-      "0"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.collect",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"1\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"output\": \"hello world!\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"outputs\": [], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"results\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"duration\": 62.35, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"name\": \"test\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"outputs_ref\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolated\": \"abc123\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"namespace\": \"default-gzip\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"state\": \"TIMED_OUT\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"1\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@task stdout+stderr: test@hello world!@@@",
-      "@@@STEP_LOG_END@task stdout+stderr: test@@@",
-      "@@@STEP_LINK@task isolated outputs: test@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 0.task results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_FAILURE@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/symbolize_tool",
-      "-llvm-symbolizer-restart-interval",
-      "2",
-      "-level",
-      "debug",
-      "-symbol-server",
-      "debug-symbols",
-      "-symbol-cache",
-      "[CACHE]/symbol",
-      "-llvm-symbolizer",
-      "[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 0.task results.symbolize logs",
-    "stdin": "hello world!",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@json.output[symbolizer-output.json]@{}@@@",
-      "@@@STEP_LOG_END@json.output[symbolizer-output.json]@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 1",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_TEXT@passed@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//a/b/c:hello_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"fuchsia-pkg://fuchsia.com/hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//a/b/c:goodbye_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"fuchsia-pkg://fuchsia.com/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LINK@test outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "spawn-tasks",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-json-input",
-      "{\"requests\": [{\"name\": \"all tests\", \"priority\": \"200\", \"service_account\": \"\", \"tags\": [\"test_environment_name:QEMU-x64\", \"uses_legacy_qemu:true\"], \"task_slices\": [{\"expiration_secs\": \"0\", \"properties\": {\"cipd_input\": {\"packages\": [{\"package_name\": \"fuchsia/infra/secretshim/${platform}\", \"path\": \".\", \"version\": \"git_revision:63ab3ac613fceb52ac49b63b43fce841a2585645\"}, {\"package_name\": \"fuchsia/third_party/qemu/${platform}\", \"path\": \"qemu\", \"version\": \"git_revision:533bf2563d0213a7e002d9fcde75519d30ffa70f\"}]}, \"command\": [\"./secretshim\", \"./botanist\", \"-level\", \"debug\", \"qemu\", \"-type\", \"qemu\", \"-qemu-dir\", \"./qemu/bin\", \"-images\", \"images.json\", \"-arch\", \"x64\", \"-minfs\", \"output.fs\", \"-pci-addr\", \"06.0\", \"-use-kvm\", \"zircon.autorun.boot=/boot/bin/sh+/boot/infra/runcmds\"], \"containment\": {\"containment_type\": \"NONE\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"kvm\", \"value\": \"1\"}, {\"key\": \"os\", \"value\": \"Debian\"}, {\"key\": \"cpu\", \"value\": \"x64\"}, {\"key\": \"pool\", \"value\": \"fuchsia.tests\"}], \"env\": [], \"env_prefixes\": [], \"execution_timeout_secs\": \"0\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"inputs_ref\": {\"isolated\": \"[dummy hash]\", \"isolatedserver\": \"https://example.isolateserver.appspot.com\", \"namespace\": \"default-gzip\"}, \"io_timeout_secs\": \"0\", \"outputs\": [\"output.fs\"], \"secret_bytes\": \"e30=\"}}]}]}",
-      "-json-output",
-      "/path/to/tmp/json",
-      "-cancel-extra-tasks"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 1.trigger 1 task",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"tasks\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@    {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"request\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"all tests\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  ]@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LINK@task UI: all tests@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "collect",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-task-summary-json",
-      "/path/to/tmp/json",
-      "-task-output-stdout",
-      "json",
-      "-output-dir",
-      "[CLEANUP]/swarming_tmp_4",
-      "0"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 1.collect",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"2\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"output\": \"hello world!\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"outputs\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"out.tar\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"results\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"duration\": 62.35, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"exit_code\": 0, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"name\": \"test\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"outputs_ref\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolated\": \"abc123\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"namespace\": \"default-gzip\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"state\": \"COMPLETED\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"2\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@task stdout+stderr: test@hello world!@@@",
-      "@@@STEP_LOG_END@task stdout+stderr: test@@@",
-      "@@@STEP_LINK@task isolated outputs: test@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 1.task results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/symbolize_tool",
-      "-llvm-symbolizer-restart-interval",
-      "2",
-      "-level",
-      "debug",
-      "-symbol-server",
-      "debug-symbols",
-      "-symbol-cache",
-      "[CACHE]/symbol",
-      "-llvm-symbolizer",
-      "[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 1.task results.symbolize logs",
-    "stdin": "hello world!",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@json.output[symbolizer-output.json]@{}@@@",
-      "@@@STEP_LOG_END@json.output[symbolizer-output.json]@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/minfs",
-      "[CLEANUP]/swarming_tmp_4/2/out.tar",
-      "cp",
-      "::",
-      "[CLEANUP]/test_results/target/2"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 1.extract results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "remove",
-      "[CLEANUP]/swarming_tmp_4/2/out.tar"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 1.remove out.tar",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/build-artifacts_tmp_1/tests.json",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "run tests.attempt 1.read tests.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@tests.json@[{\"test\": {\"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", \"path\": \"/path/to/hello\", \"os\": \"fuchsia\", \"name\": \"hello\", \"label\": \"//a/b/c:hello_test(//toolchain)\"}}, {\"test\": {\"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", \"path\": \"/path/to/goodbye\", \"os\": \"fuchsia\", \"name\": \"goodbye\", \"label\": \"//a/b/c:goodbye_test(//toolchain)\"}}]@@@",
-      "@@@STEP_LOG_END@tests.json@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 1.all test results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 1.all test results.all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 1.all test results.all passed tests.fuchsia-pkg://fuchsia.com/hello",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@stdio@hello@@@",
-      "@@@STEP_LOG_END@stdio@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "run tests.attempt 1.all test results.all passed tests.fuchsia-pkg://fuchsia.com/goodbye",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@stdio@goodbye@@@",
-      "@@@STEP_LOG_END@stdio@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "upload test test results",
-    "~followup_annotations": [
-      "@@@STEP_LINK@go/fuchsia-result-store/bid:8945511751514863184@https://goto.google.com/fuchsia-result-store/bid:8945511751514863184@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"gn_label\": \"//a/b/c:hello_test(//toolchain)\", \"output_file\": \"hello.out\", \"name\": \"fuchsia-pkg://fuchsia.com/hello\", \"result\": \"PASS\"}, {\"gn_label\": \"//a/b/c:goodbye_test(//toolchain)\", \"output_file\": \"goodbye.out\", \"name\": \"fuchsia-pkg://fuchsia.com/goodbye\", \"result\": \"PASS\"}]}",
-      "[CLEANUP]/swarming_tmp_4/summary.json"
-    ],
-    "infra_step": true,
-    "name": "upload test test results.write summary.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@summary.json@{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"gn_label\": \"//a/b/c:hello_test(//toolchain)\", \"output_file\": \"hello.out\", \"name\": \"fuchsia-pkg://fuchsia.com/hello\", \"result\": \"PASS\"}, {\"gn_label\": \"//a/b/c:goodbye_test(//toolchain)\", \"output_file\": \"goodbye.out\", \"name\": \"fuchsia-pkg://fuchsia.com/goodbye\", \"result\": \"PASS\"}]}@@@",
-      "@@@STEP_LOG_END@summary.json@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "upload test test results.ensure gsutil",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/gsutil",
-      "-ensure-file",
-      "infra/gsutil version:4.41",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "upload test test results.ensure gsutil.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-version:4.41----\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/gsutil\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-vpython-spec",
-      "RECIPE_MODULE[fuchsia::gsutil]/resources/gsutil.vpython",
-      "-u",
-      "[START_DIR]/cipd/gsutil/gsutil",
-      "-o",
-      "GSUtil:software_update_check_period=0",
-      "-m",
-      "rsync",
-      "-r",
-      "[CLEANUP]/swarming_tmp_4",
-      "gs://fuchsia_infra/builds/8945511751514863184/test"
-    ],
-    "infra_step": true,
-    "name": "upload test test results.upload test to fuchsia_infra",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@test@https://console.cloud.google.com/storage/browser/fuchsia_infra/builds/8945511751514863184/test@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "check log test:serial.txt"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "check log test:serial.txt.read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "name": "$result"
-  }
-]
\ No newline at end of file
diff --git a/recipe_modules/testing/examples/full.expected/set_test_task_env_vars.json b/recipe_modules/testing/examples/full.expected/set_test_task_env_vars.json
deleted file mode 100644
index d0dba98..0000000
--- a/recipe_modules/testing/examples/full.expected/set_test_task_env_vars.json
+++ /dev/null
@@ -1,1013 +0,0 @@
-[
-  {
-    "cmd": [],
-    "name": "download build artifacts"
-  },
-  {
-    "cmd": [],
-    "name": "download build artifacts.ensure isolated",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/isolated_client",
-      "-ensure-file",
-      "infra/tools/luci/isolated/${platform} git_revision:305e79001db1846906c7136d90a863bee5bd3bfc",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.ensure isolated.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:305\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolated/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "download",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-isolated",
-      "abc",
-      "-output-dir",
-      "[CLEANUP]/build-artifacts_tmp_1"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.download build_artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/args.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"build_type\": \"release\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"target\": \"arm64\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"variants\": []@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/images.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"netboot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/shards.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.load test shards",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@[@@@",
-      "@@@STEP_LOG_LINE@json.output@  {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"deps\": [], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"environment\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"dimensions\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"device_type\": \"Khadas Vim2 Max\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    }, @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"Vim2\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"install_path\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"label\": \"//a/b/c:hello_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"hello\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"os\": \"fuchsia\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"path\": \"/path/to/hello\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"install_path\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"label\": \"//a/b/c:goodbye_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"goodbye\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"os\": \"fuchsia\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"path\": \"/path/to/goodbye\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@]@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "isolate build artifacts"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"variants\": [], \n  \"product\": \"products/core.gni\", \n  \"target\": \"arm64\", \n  \"board\": \"boards/x64.gni\", \n  \"build_type\": \"release\"\n}",
-      "[START_DIR]/args.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@args.json@{@@@",
-      "@@@STEP_LOG_LINE@args.json@  \"variants\": [], @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"target\": \"arm64\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"build_type\": \"release\"@@@",
-      "@@@STEP_LOG_LINE@args.json@}@@@",
-      "@@@STEP_LOG_END@args.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"netboot\": {\n    \"path\": \"netboot.zbi\", \n    \"bootserver_netboot\": [\n      \"--boot\"\n    ], \n    \"type\": \"zbi\", \n    \"name\": \"netboot\"\n  }, \n  \"zircon-a\": {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n}",
-      "[START_DIR]/images.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@images.json@{@@@",
-      "@@@STEP_LOG_LINE@images.json@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ], @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"netboot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@  }, @@@",
-      "@@@STEP_LOG_LINE@images.json@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@}@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"environment\": {\n      \"dimensions\": {\n        \"device_type\": \"Khadas Vim2 Max\"\n      }\n    }, \n    \"tests\": [\n      {\n        \"name\": \"hello\", \n        \"install_path\": \"/path/to/hello\", \n        \"label\": \"//a/b/c:hello_test(//toolchain)\", \n        \"path\": \"/path/to/hello\", \n        \"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", \n        \"os\": \"fuchsia\"\n      }, \n      {\n        \"name\": \"goodbye\", \n        \"install_path\": \"/path/to/goodbye\", \n        \"label\": \"//a/b/c:goodbye_test(//toolchain)\", \n        \"path\": \"/path/to/goodbye\", \n        \"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", \n        \"os\": \"fuchsia\"\n      }\n    ], \n    \"name\": \"Vim2\", \n    \"deps\": []\n  }\n]",
-      "[START_DIR]/shards.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write shards.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@shards.json@[@@@",
-      "@@@STEP_LOG_LINE@shards.json@  {@@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"environment\": {@@@",
-      "@@@STEP_LOG_LINE@shards.json@      \"dimensions\": {@@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"device_type\": \"Khadas Vim2 Max\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@      }@@@",
-      "@@@STEP_LOG_LINE@shards.json@    }, @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@shards.json@      {@@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"name\": \"hello\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"install_path\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"label\": \"//a/b/c:hello_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"path\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"os\": \"fuchsia\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@      }, @@@",
-      "@@@STEP_LOG_LINE@shards.json@      {@@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"name\": \"goodbye\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"install_path\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"label\": \"//a/b/c:goodbye_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"path\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"os\": \"fuchsia\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@      }@@@",
-      "@@@STEP_LOG_LINE@shards.json@    ], @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"name\": \"Vim2\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"deps\": []@@@",
-      "@@@STEP_LOG_LINE@shards.json@  }@@@",
-      "@@@STEP_LOG_LINE@shards.json@]@@@",
-      "@@@STEP_LOG_END@shards.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"[CLEANUP]/build-artifacts_tmp_1/arm64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/arm64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/authorized_key\": [\"[CLEANUP]/build_artifacts_tmp_2/authorized_key\"], \"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/build_artifacts_tmp_2/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/covargs\": [\"[CLEANUP]/build_artifacts_tmp_2/covargs\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/ids.txt\": [\"[CLEANUP]/build_artifacts_tmp_2/ids.txt\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_cov\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_cov\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_profdata\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_profdata\"], \"[CLEANUP]/build-artifacts_tmp_1/minfs\": [\"[CLEANUP]/build_artifacts_tmp_2/minfs\"], \"[CLEANUP]/build-artifacts_tmp_1/netboot.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/netboot.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/private_key\": [\"[CLEANUP]/build_artifacts_tmp_2/private_key\"], \"[CLEANUP]/build-artifacts_tmp_1/symbolize_tool\": [\"[CLEANUP]/build_artifacts_tmp_2/symbolize_tool\"], \"[CLEANUP]/build-artifacts_tmp_1/tests.json\": [\"[CLEANUP]/build_artifacts_tmp_2/tests.json\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/zbi\"], \"[START_DIR]/args.json\": [\"[CLEANUP]/build_artifacts_tmp_2/args.json\"], \"[START_DIR]/images.json\": [\"[CLEANUP]/build_artifacts_tmp_2/images.json\"], \"[START_DIR]/shards.json\": [\"[CLEANUP]/build_artifacts_tmp_2/shards.json\"]}"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.create_links",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/build_artifacts_tmp_2:."
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.isolate",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "shard Vim2"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"name\": \"hello\", \n    \"install_path\": \"/path/to/hello\", \n    \"label\": \"//a/b/c:hello_test(//toolchain)\", \n    \"path\": \"/path/to/hello\", \n    \"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", \n    \"os\": \"fuchsia\"\n  }, \n  {\n    \"name\": \"goodbye\", \n    \"install_path\": \"/path/to/goodbye\", \n    \"label\": \"//a/b/c:goodbye_test(//toolchain)\", \n    \"path\": \"/path/to/goodbye\", \n    \"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", \n    \"os\": \"fuchsia\"\n  }\n]",
-      "[CLEANUP]/isolate_tmp_3/tests.json"
-    ],
-    "infra_step": true,
-    "name": "shard Vim2.write test manifest",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@tests.json@[@@@",
-      "@@@STEP_LOG_LINE@tests.json@  {@@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"name\": \"hello\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"install_path\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"label\": \"//a/b/c:hello_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"path\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"os\": \"fuchsia\"@@@",
-      "@@@STEP_LOG_LINE@tests.json@  }, @@@",
-      "@@@STEP_LOG_LINE@tests.json@  {@@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"name\": \"goodbye\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"install_path\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"label\": \"//a/b/c:goodbye_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"path\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"os\": \"fuchsia\"@@@",
-      "@@@STEP_LOG_LINE@tests.json@  }@@@",
-      "@@@STEP_LOG_LINE@tests.json@]@@@",
-      "@@@STEP_LOG_END@tests.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"path\": \"netboot.zbi\", \n    \"bootserver_netboot\": [\n      \"--boot\"\n    ], \n    \"type\": \"zbi\", \n    \"name\": \"netboot\"\n  }, \n  {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n]",
-      "[CLEANUP]/isolate_tmp_3/images.json"
-    ],
-    "infra_step": true,
-    "name": "shard Vim2.write image manifest",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@images.json@[@@@",
-      "@@@STEP_LOG_LINE@images.json@  {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ], @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"netboot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@  }, @@@",
-      "@@@STEP_LOG_LINE@images.json@  {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@]@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/isolate_tmp_3/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/isolate_tmp_3/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/isolate_tmp_3/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/netboot.zbi\": [\"[CLEANUP]/isolate_tmp_3/netboot.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/isolate_tmp_3/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/isolate_tmp_3/testrunner\"]}"
-    ],
-    "infra_step": true,
-    "name": "shard Vim2.create tree of build artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/isolate_tmp_3:."
-    ],
-    "infra_step": true,
-    "name": "shard Vim2.isolate build artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect"
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_SUMMARY_TEXT@1 launched, 1 passed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch.Vim2 (attempt 0)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LINK@Swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch.Vim2 (attempt 0).ensure swarming",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/swarming_client",
-      "-ensure-file",
-      "infra/tools/luci/swarming/${platform} git_revision:67b11ada44a625008a2db5cb49ad453494b16ba1",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.launch.Vim2 (attempt 0).ensure swarming.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@5@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:67b\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/swarming/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "spawn-tasks",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-json-input",
-      "{\"requests\": [{\"name\": \"Vim2\", \"priority\": \"200\", \"service_account\": \"\", \"tags\": [\"test_environment_name:Khadas Vim2 Max-arm64\"], \"task_slices\": [{\"expiration_secs\": \"0\", \"properties\": {\"command\": [\"./botanist\", \"-level\", \"debug\", \"run\", \"-images\", \"images.json\", \"-timeout\", \"0s\", \"-syslog\", \"syslog.txt\", \"-serial-log\", \"serial.txt\", \"-repo\", \"http://$GCS_PROXY_HOST/fuchsia-artifacts/8945511751514863184/repository\", \"-blobs\", \"http://$GCS_PROXY_HOST/fuchsia-artifacts/blobs\", \"-config\", \"/etc/botanist/config.json\", \"./testrunner\", \"-archive\", \"out.tar\", \"tests.json\"], \"containment\": {\"containment_type\": \"NONE\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"pool\", \"value\": \"fuchsia.tests\"}, {\"key\": \"device_type\", \"value\": \"Khadas Vim2 Max\"}], \"env\": [{\"key\": \"BUILD_PRODUCT\", \"value\": \"products/core.gni\"}, {\"key\": \"FUCHSIA_TEST_OUTDIR\", \"value\": \"${ISOLATED_OUTDIR}\"}, {\"key\": \"INPUT_COMMIT_HOST\", \"value\": \"fuchsia.googlesource.com\"}, {\"key\": \"LSAN_SYMBOLIZER_PATH\", \"value\": \"llvm-symbolizer\"}, {\"key\": \"BUILDBUCKET_BUCKET\", \"value\": \"ci\"}, {\"key\": \"BUILD_TARGET\", \"value\": \"arm64\"}, {\"key\": \"ASAN_SYMBOLIZER_PATH\", \"value\": \"llvm-symbolizer\"}, {\"key\": \"UBSAN_SYMBOLIZER_PATH\", \"value\": \"llvm-symbolizer\"}, {\"key\": \"INPUT_COMMIT_PROJECT\", \"value\": \"fuchsia\"}, {\"key\": \"BUILDER_NAME\", \"value\": \"builder\"}, {\"key\": \"INPUT_COMMIT_REF\", \"value\": \"refs/heads/master\"}, {\"key\": \"FUCHSIA_DEVICE_TYPE\", \"value\": \"Khadas Vim2 Max\"}, {\"key\": \"BUILDBUCKET_ID\", \"value\": \"8945511751514863184\"}, {\"key\": \"BUILD_BOARD\", \"value\": \"boards/x64.gni\"}, {\"key\": \"BUILD_CREATE_TIME\", \"value\": \"1527292217\"}, {\"key\": \"BUILD_TYPE\", \"value\": \"release\"}], \"env_prefixes\": [], \"execution_timeout_secs\": \"0\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"inputs_ref\": {\"isolated\": \"[dummy hash]\", \"isolatedserver\": \"https://example.isolateserver.appspot.com\", \"namespace\": \"default-gzip\"}, \"io_timeout_secs\": \"0\", \"outputs\": [\"syslog.txt\", \"serial.txt\", \"out.tar\"]}}]}]}",
-      "-json-output",
-      "/path/to/tmp/json",
-      "-cancel-extra-tasks"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.launch.Vim2 (attempt 0).trigger",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"tasks\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@    {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"request\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"Vim2\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  ]@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LINK@task UI: Vim2@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "collect",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-task-summary-json",
-      "/path/to/tmp/json",
-      "-task-output-stdout",
-      "json",
-      "-output-dir",
-      "[CLEANUP]/swarming_tmp_4",
-      "0"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.collect",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"0\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"output\": \"hello world!\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"outputs\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"syslog.txt\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"serial.txt\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"out.tar\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"benchmark.catapult_json\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"results\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"duration\": 62.35, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"exit_code\": 0, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"name\": \"Vim2\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"outputs_ref\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolated\": \"abc123\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"namespace\": \"default-gzip\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"state\": \"COMPLETED\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@task stdout+stderr: Vim2@hello world!@@@",
-      "@@@STEP_LOG_END@task stdout+stderr: Vim2@@@",
-      "@@@STEP_LINK@task isolated outputs: Vim2@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.Vim2",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/symbolize_tool",
-      "-llvm-symbolizer-restart-interval",
-      "2",
-      "-level",
-      "debug",
-      "-symbol-server",
-      "debug-symbols",
-      "-symbol-cache",
-      "[CACHE]/symbol",
-      "-llvm-symbolizer",
-      "[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Vim2.symbolize logs",
-    "stdin": "hello world!",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@json.output[symbolizer-output.json]@{}@@@",
-      "@@@STEP_LOG_END@json.output[symbolizer-output.json]@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.Vim2.check log serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Vim2.check log serial.txt.read",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@5@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.Vim2.ensure bsdtar",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/bsdtar",
-      "-ensure-file",
-      "fuchsia/tools/bsdtar/${platform} latest",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Vim2.ensure bsdtar.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@5@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"fuchsia/tools/bsdtar/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cipd/bsdtar/bsdtar",
-      "--extract",
-      "--verbose",
-      "-f",
-      "[CLEANUP]/swarming_tmp_4/0/out.tar",
-      "-C",
-      "[CLEANUP]/test_results/0"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Vim2.extract",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "remove",
-      "[CLEANUP]/swarming_tmp_4/0/out.tar"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Vim2.remove out.tar",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.always pass",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks.Vim2 (attempt 0)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//path/to/hello:hello(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//path/to/goodbye:goodbye(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@",
-      "@@@STEP_LINK@swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@",
-      "@@@STEP_LINK@task outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks.Vim2 (attempt 0).all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_SUMMARY_TEXT@2 passed tests@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/syslog.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.passed tasks.Vim2 (attempt 0).read syslog.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.passed tasks.Vim2 (attempt 0).read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@1 passed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.Vim2",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.Vim2.attempt 0 (pass)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//path/to/hello:hello(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//path/to/goodbye:goodbye(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@",
-      "@@@STEP_LINK@swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@",
-      "@@@STEP_LINK@task outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.Vim2.attempt 0 (pass).all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_TEXT@<br/>hello<br/>goodbye@@@",
-      "@@@STEP_SUMMARY_TEXT@2 passed tests@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/syslog.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "passes.Vim2.attempt 0 (pass).read syslog.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "passes.Vim2.attempt 0 (pass).read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "flakes",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@0 flaked@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "failures",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@0 failed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "all tasks passed"
-  },
-  {
-    "cmd": [],
-    "name": "upload Vim2 test results",
-    "~followup_annotations": [
-      "@@@STEP_LINK@go/fuchsia-result-store/bid:8945511751514863184@https://goto.google.com/fuchsia-result-store/bid:8945511751514863184@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"gn_label\": \"//path/to/hello:hello(//toolchain)\", \"output_file\": \"hello.out\", \"name\": \"hello\", \"result\": \"PASS\"}, {\"gn_label\": \"//path/to/goodbye:goodbye(//toolchain)\", \"output_file\": \"goodbye.out\", \"name\": \"goodbye\", \"result\": \"PASS\"}]}",
-      "[CLEANUP]/swarming_tmp_4/0/summary.json"
-    ],
-    "infra_step": true,
-    "name": "upload Vim2 test results.write summary.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@summary.json@{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"gn_label\": \"//path/to/hello:hello(//toolchain)\", \"output_file\": \"hello.out\", \"name\": \"hello\", \"result\": \"PASS\"}, {\"gn_label\": \"//path/to/goodbye:goodbye(//toolchain)\", \"output_file\": \"goodbye.out\", \"name\": \"goodbye\", \"result\": \"PASS\"}]}@@@",
-      "@@@STEP_LOG_END@summary.json@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "upload Vim2 test results.ensure gsutil",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/gsutil",
-      "-ensure-file",
-      "infra/gsutil version:4.41",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "upload Vim2 test results.ensure gsutil.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-version:4.41----\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/gsutil\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-vpython-spec",
-      "RECIPE_MODULE[fuchsia::gsutil]/resources/gsutil.vpython",
-      "-u",
-      "[START_DIR]/cipd/gsutil/gsutil",
-      "-o",
-      "GSUtil:software_update_check_period=0",
-      "-m",
-      "rsync",
-      "-r",
-      "[CLEANUP]/swarming_tmp_4/0",
-      "gs://fuchsia_infra/builds/8945511751514863184/Vim2"
-    ],
-    "infra_step": true,
-    "name": "upload Vim2 test results.upload Vim2 to fuchsia_infra",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@Vim2@https://console.cloud.google.com/storage/browser/fuchsia_infra/builds/8945511751514863184/Vim2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "check log Vim2:serial.txt"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "check log Vim2:serial.txt.read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "name": "$result"
-  }
-]
\ No newline at end of file
diff --git a/recipe_modules/testing/examples/full.expected/test_with_Linux_shard.json b/recipe_modules/testing/examples/full.expected/test_with_Linux_shard.json
deleted file mode 100644
index 3558f37..0000000
--- a/recipe_modules/testing/examples/full.expected/test_with_Linux_shard.json
+++ /dev/null
@@ -1,953 +0,0 @@
-[
-  {
-    "cmd": [],
-    "name": "download build artifacts"
-  },
-  {
-    "cmd": [],
-    "name": "download build artifacts.ensure isolated",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/isolated_client",
-      "-ensure-file",
-      "infra/tools/luci/isolated/${platform} git_revision:305e79001db1846906c7136d90a863bee5bd3bfc",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.ensure isolated.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:305\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolated/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "download",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-isolated",
-      "abc",
-      "-output-dir",
-      "[CLEANUP]/build-artifacts_tmp_1"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.download build_artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/args.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"build_type\": \"release\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"target\": \"x64\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"variants\": []@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/images.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"netboot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/shards.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.load test shards",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@[@@@",
-      "@@@STEP_LOG_LINE@json.output@  {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"deps\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"/path/to/dep\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"environment\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"dimensions\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"os\": \"Linux\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    }, @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"Linux\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"install_path\": \"/path/to/test\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"label\": \"//path/to/test:test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"test\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"os\": \"linux\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"path\": \"/path/to/test\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@]@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "isolate build artifacts"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"variants\": [], \n  \"product\": \"products/core.gni\", \n  \"target\": \"x64\", \n  \"board\": \"boards/x64.gni\", \n  \"build_type\": \"release\"\n}",
-      "[START_DIR]/args.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@args.json@{@@@",
-      "@@@STEP_LOG_LINE@args.json@  \"variants\": [], @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"target\": \"x64\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"build_type\": \"release\"@@@",
-      "@@@STEP_LOG_LINE@args.json@}@@@",
-      "@@@STEP_LOG_END@args.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"netboot\": {\n    \"path\": \"netboot.zbi\", \n    \"bootserver_netboot\": [\n      \"--boot\"\n    ], \n    \"type\": \"zbi\", \n    \"name\": \"netboot\"\n  }, \n  \"zircon-a\": {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n}",
-      "[START_DIR]/images.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@images.json@{@@@",
-      "@@@STEP_LOG_LINE@images.json@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ], @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"netboot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@  }, @@@",
-      "@@@STEP_LOG_LINE@images.json@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@}@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"environment\": {\n      \"dimensions\": {\n        \"os\": \"Linux\"\n      }\n    }, \n    \"tests\": [\n      {\n        \"path\": \"/path/to/test\", \n        \"os\": \"linux\", \n        \"name\": \"test\", \n        \"install_path\": \"/path/to/test\", \n        \"label\": \"//path/to/test:test(//toolchain)\"\n      }\n    ], \n    \"name\": \"Linux\", \n    \"deps\": [\n      \"/path/to/dep\"\n    ]\n  }\n]",
-      "[START_DIR]/shards.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write shards.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@shards.json@[@@@",
-      "@@@STEP_LOG_LINE@shards.json@  {@@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"environment\": {@@@",
-      "@@@STEP_LOG_LINE@shards.json@      \"dimensions\": {@@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"os\": \"Linux\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@      }@@@",
-      "@@@STEP_LOG_LINE@shards.json@    }, @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@shards.json@      {@@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"path\": \"/path/to/test\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"os\": \"linux\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"name\": \"test\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"install_path\": \"/path/to/test\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"label\": \"//path/to/test:test(//toolchain)\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@      }@@@",
-      "@@@STEP_LOG_LINE@shards.json@    ], @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"name\": \"Linux\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"deps\": [@@@",
-      "@@@STEP_LOG_LINE@shards.json@      \"/path/to/dep\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@    ]@@@",
-      "@@@STEP_LOG_LINE@shards.json@  }@@@",
-      "@@@STEP_LOG_LINE@shards.json@]@@@",
-      "@@@STEP_LOG_END@shards.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"/path/to/dep\": [\"/path/to/dep\"], \"/path/to/test\": [\"/path/to/test\"], \"[CLEANUP]/build-artifacts_tmp_1/arm64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/arm64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/authorized_key\": [\"[CLEANUP]/build_artifacts_tmp_2/authorized_key\"], \"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/build_artifacts_tmp_2/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/covargs\": [\"[CLEANUP]/build_artifacts_tmp_2/covargs\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/ids.txt\": [\"[CLEANUP]/build_artifacts_tmp_2/ids.txt\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_cov\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_cov\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_profdata\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_profdata\"], \"[CLEANUP]/build-artifacts_tmp_1/minfs\": [\"[CLEANUP]/build_artifacts_tmp_2/minfs\"], \"[CLEANUP]/build-artifacts_tmp_1/netboot.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/netboot.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/private_key\": [\"[CLEANUP]/build_artifacts_tmp_2/private_key\"], \"[CLEANUP]/build-artifacts_tmp_1/symbolize_tool\": [\"[CLEANUP]/build_artifacts_tmp_2/symbolize_tool\"], \"[CLEANUP]/build-artifacts_tmp_1/tests.json\": [\"[CLEANUP]/build_artifacts_tmp_2/tests.json\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/zbi\"], \"[START_DIR]/args.json\": [\"[CLEANUP]/build_artifacts_tmp_2/args.json\"], \"[START_DIR]/images.json\": [\"[CLEANUP]/build_artifacts_tmp_2/images.json\"], \"[START_DIR]/shards.json\": [\"[CLEANUP]/build_artifacts_tmp_2/shards.json\"]}"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.create_links",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/build_artifacts_tmp_2:."
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.isolate",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "shard Linux"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"path\": \"/path/to/test\", \n    \"os\": \"linux\", \n    \"name\": \"test\", \n    \"install_path\": \"/path/to/test\", \n    \"label\": \"//path/to/test:test(//toolchain)\"\n  }\n]",
-      "[CLEANUP]/isolate_tmp_3/tests.json"
-    ],
-    "infra_step": true,
-    "name": "shard Linux.write test manifest",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@tests.json@[@@@",
-      "@@@STEP_LOG_LINE@tests.json@  {@@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"path\": \"/path/to/test\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"os\": \"linux\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"name\": \"test\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"install_path\": \"/path/to/test\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"label\": \"//path/to/test:test(//toolchain)\"@@@",
-      "@@@STEP_LOG_LINE@tests.json@  }@@@",
-      "@@@STEP_LOG_LINE@tests.json@]@@@",
-      "@@@STEP_LOG_END@tests.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"/path/to/dep\": [\"/path/to/dep\"], \"/path/to/test\": [\"/path/to/test\"], \"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/isolate_tmp_3/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/isolate_tmp_3/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/isolate_tmp_3/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/isolate_tmp_3/testrunner\"]}"
-    ],
-    "infra_step": true,
-    "name": "shard Linux.create tree of build artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/isolate_tmp_3:."
-    ],
-    "infra_step": true,
-    "name": "shard Linux.isolate build artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect"
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_SUMMARY_TEXT@1 launched, 1 passed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch.Linux (attempt 0)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LINK@Swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch.Linux (attempt 0).ensure swarming",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/swarming_client",
-      "-ensure-file",
-      "infra/tools/luci/swarming/${platform} git_revision:67b11ada44a625008a2db5cb49ad453494b16ba1",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.launch.Linux (attempt 0).ensure swarming.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@5@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:67b\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/swarming/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "spawn-tasks",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-json-input",
-      "{\"requests\": [{\"name\": \"Linux\", \"priority\": \"200\", \"service_account\": \"\", \"tags\": [\"test_environment_name:Linux-x64\"], \"task_slices\": [{\"expiration_secs\": \"0\", \"properties\": {\"command\": [\"./testrunner\", \"-archive\", \"out.tar\", \"tests.json\"], \"containment\": {\"containment_type\": \"NONE\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"os\", \"value\": \"Linux\"}, {\"key\": \"pool\", \"value\": \"fuchsia.tests\"}], \"env\": [{\"key\": \"BUILD_PRODUCT\", \"value\": \"products/core.gni\"}, {\"key\": \"FUCHSIA_TEST_OUTDIR\", \"value\": \"${ISOLATED_OUTDIR}\"}, {\"key\": \"BUILDBUCKET_ID\", \"value\": \"8945511751514863184\"}, {\"key\": \"LSAN_SYMBOLIZER_PATH\", \"value\": \"llvm-symbolizer\"}, {\"key\": \"BUILDBUCKET_BUCKET\", \"value\": \"ci\"}, {\"key\": \"BUILD_TARGET\", \"value\": \"x64\"}, {\"key\": \"ASAN_SYMBOLIZER_PATH\", \"value\": \"llvm-symbolizer\"}, {\"key\": \"UBSAN_SYMBOLIZER_PATH\", \"value\": \"llvm-symbolizer\"}, {\"key\": \"INPUT_COMMIT_PROJECT\", \"value\": \"fuchsia\"}, {\"key\": \"BUILDER_NAME\", \"value\": \"builder\"}, {\"key\": \"INPUT_COMMIT_REF\", \"value\": \"refs/heads/master\"}, {\"key\": \"INPUT_COMMIT_HOST\", \"value\": \"fuchsia.googlesource.com\"}, {\"key\": \"BUILD_BOARD\", \"value\": \"boards/x64.gni\"}, {\"key\": \"BUILD_CREATE_TIME\", \"value\": \"1527292217\"}, {\"key\": \"BUILD_TYPE\", \"value\": \"release\"}], \"env_prefixes\": [], \"execution_timeout_secs\": \"0\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"inputs_ref\": {\"isolated\": \"[dummy hash]\", \"isolatedserver\": \"https://example.isolateserver.appspot.com\", \"namespace\": \"default-gzip\"}, \"io_timeout_secs\": \"0\", \"outputs\": [\"out.tar\"]}}]}]}",
-      "-json-output",
-      "/path/to/tmp/json",
-      "-cancel-extra-tasks"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.launch.Linux (attempt 0).trigger",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"tasks\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@    {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"request\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"Linux\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  ]@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LINK@task UI: Linux@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "collect",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-task-summary-json",
-      "/path/to/tmp/json",
-      "-task-output-stdout",
-      "json",
-      "-output-dir",
-      "[CLEANUP]/swarming_tmp_4",
-      "0"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.collect",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"0\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"output\": \"hello world!\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"outputs\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"syslog.txt\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"serial.txt\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"out.tar\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"benchmark.catapult_json\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"results\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"duration\": 62.35, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"exit_code\": 0, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"name\": \"Linux\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"outputs_ref\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolated\": \"abc123\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"namespace\": \"default-gzip\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"state\": \"COMPLETED\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@task stdout+stderr: Linux@hello world!@@@",
-      "@@@STEP_LOG_END@task stdout+stderr: Linux@@@",
-      "@@@STEP_LINK@task isolated outputs: Linux@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.Linux",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/symbolize_tool",
-      "-llvm-symbolizer-restart-interval",
-      "2",
-      "-level",
-      "debug",
-      "-symbol-server",
-      "debug-symbols",
-      "-symbol-cache",
-      "[CACHE]/symbol",
-      "-llvm-symbolizer",
-      "[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Linux.symbolize logs",
-    "stdin": "hello world!",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@json.output[symbolizer-output.json]@{}@@@",
-      "@@@STEP_LOG_END@json.output[symbolizer-output.json]@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.Linux.check log serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Linux.check log serial.txt.read",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@5@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.Linux.ensure bsdtar",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/bsdtar",
-      "-ensure-file",
-      "fuchsia/tools/bsdtar/${platform} latest",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Linux.ensure bsdtar.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@5@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"fuchsia/tools/bsdtar/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cipd/bsdtar/bsdtar",
-      "--extract",
-      "--verbose",
-      "-f",
-      "[CLEANUP]/swarming_tmp_4/0/out.tar",
-      "-C",
-      "[CLEANUP]/test_results/0"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Linux.extract",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "remove",
-      "[CLEANUP]/swarming_tmp_4/0/out.tar"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Linux.remove out.tar",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.always pass",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks.Linux (attempt 0)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//path/to/hello:hello(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//path/to/goodbye:goodbye(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@",
-      "@@@STEP_LINK@swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@",
-      "@@@STEP_LINK@task outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks.Linux (attempt 0).all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_SUMMARY_TEXT@2 passed tests@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/syslog.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.passed tasks.Linux (attempt 0).read syslog.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.passed tasks.Linux (attempt 0).read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@1 passed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.Linux",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.Linux.attempt 0 (pass)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//path/to/hello:hello(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//path/to/goodbye:goodbye(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@",
-      "@@@STEP_LINK@swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@",
-      "@@@STEP_LINK@task outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.Linux.attempt 0 (pass).all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_TEXT@<br/>hello<br/>goodbye@@@",
-      "@@@STEP_SUMMARY_TEXT@2 passed tests@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/syslog.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "passes.Linux.attempt 0 (pass).read syslog.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "passes.Linux.attempt 0 (pass).read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "flakes",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@0 flaked@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "failures",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@0 failed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "all tasks passed"
-  },
-  {
-    "cmd": [],
-    "name": "upload Linux test results",
-    "~followup_annotations": [
-      "@@@STEP_LINK@go/fuchsia-result-store/bid:8945511751514863184@https://goto.google.com/fuchsia-result-store/bid:8945511751514863184@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"gn_label\": \"//path/to/hello:hello(//toolchain)\", \"output_file\": \"hello.out\", \"name\": \"hello\", \"result\": \"PASS\"}, {\"gn_label\": \"//path/to/goodbye:goodbye(//toolchain)\", \"output_file\": \"goodbye.out\", \"name\": \"goodbye\", \"result\": \"PASS\"}]}",
-      "[CLEANUP]/swarming_tmp_4/0/summary.json"
-    ],
-    "infra_step": true,
-    "name": "upload Linux test results.write summary.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@summary.json@{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"gn_label\": \"//path/to/hello:hello(//toolchain)\", \"output_file\": \"hello.out\", \"name\": \"hello\", \"result\": \"PASS\"}, {\"gn_label\": \"//path/to/goodbye:goodbye(//toolchain)\", \"output_file\": \"goodbye.out\", \"name\": \"goodbye\", \"result\": \"PASS\"}]}@@@",
-      "@@@STEP_LOG_END@summary.json@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "upload Linux test results.ensure gsutil",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/gsutil",
-      "-ensure-file",
-      "infra/gsutil version:4.41",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "upload Linux test results.ensure gsutil.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-version:4.41----\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/gsutil\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-vpython-spec",
-      "RECIPE_MODULE[fuchsia::gsutil]/resources/gsutil.vpython",
-      "-u",
-      "[START_DIR]/cipd/gsutil/gsutil",
-      "-o",
-      "GSUtil:software_update_check_period=0",
-      "-m",
-      "rsync",
-      "-r",
-      "[CLEANUP]/swarming_tmp_4/0",
-      "gs://fuchsia_infra/builds/8945511751514863184/Linux"
-    ],
-    "infra_step": true,
-    "name": "upload Linux test results.upload Linux to fuchsia_infra",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@Linux@https://console.cloud.google.com/storage/browser/fuchsia_infra/builds/8945511751514863184/Linux@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "check log Linux:serial.txt"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "check log Linux:serial.txt.read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "name": "$result"
-  }
-]
\ No newline at end of file
diff --git a/recipe_modules/testing/examples/full.expected/test_with_shards_arm64.json b/recipe_modules/testing/examples/full.expected/test_with_shards_arm64.json
deleted file mode 100644
index 7768f43..0000000
--- a/recipe_modules/testing/examples/full.expected/test_with_shards_arm64.json
+++ /dev/null
@@ -1,990 +0,0 @@
-[
-  {
-    "cmd": [],
-    "name": "download build artifacts"
-  },
-  {
-    "cmd": [],
-    "name": "download build artifacts.ensure isolated",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/isolated_client",
-      "-ensure-file",
-      "infra/tools/luci/isolated/${platform} git_revision:305e79001db1846906c7136d90a863bee5bd3bfc",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.ensure isolated.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:305\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolated/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "download",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-isolated",
-      "abc",
-      "-output-dir",
-      "[CLEANUP]/build-artifacts_tmp_1"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.download build_artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/args.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"build_type\": \"release\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"target\": \"arm64\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"variants\": []@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/images.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"netboot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/shards.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.load test shards",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@[@@@",
-      "@@@STEP_LOG_LINE@json.output@  {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"deps\": [], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"environment\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"dimensions\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"device_type\": \"Khadas Vim2 Max\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"netboot\": true, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"service_account\": \"my-service-account@example.com\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }, @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"Vim2\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"install_path\": \"/path/to/test\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"label\": \"//path/to/test:test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"test\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"os\": \"linux\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"path\": \"/path/to/test\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@]@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "isolate build artifacts"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"variants\": [], \n  \"product\": \"products/core.gni\", \n  \"target\": \"arm64\", \n  \"board\": \"boards/x64.gni\", \n  \"build_type\": \"release\"\n}",
-      "[START_DIR]/args.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@args.json@{@@@",
-      "@@@STEP_LOG_LINE@args.json@  \"variants\": [], @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"target\": \"arm64\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"build_type\": \"release\"@@@",
-      "@@@STEP_LOG_LINE@args.json@}@@@",
-      "@@@STEP_LOG_END@args.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"netboot\": {\n    \"path\": \"netboot.zbi\", \n    \"bootserver_netboot\": [\n      \"--boot\"\n    ], \n    \"type\": \"zbi\", \n    \"name\": \"netboot\"\n  }, \n  \"zircon-a\": {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n}",
-      "[START_DIR]/images.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@images.json@{@@@",
-      "@@@STEP_LOG_LINE@images.json@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ], @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"netboot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@  }, @@@",
-      "@@@STEP_LOG_LINE@images.json@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@}@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"environment\": {\n      \"netboot\": true, \n      \"dimensions\": {\n        \"device_type\": \"Khadas Vim2 Max\"\n      }, \n      \"service_account\": \"my-service-account@example.com\"\n    }, \n    \"tests\": [\n      {\n        \"path\": \"/path/to/test\", \n        \"os\": \"linux\", \n        \"name\": \"test\", \n        \"install_path\": \"/path/to/test\", \n        \"label\": \"//path/to/test:test(//toolchain)\"\n      }\n    ], \n    \"name\": \"Vim2\", \n    \"deps\": []\n  }\n]",
-      "[START_DIR]/shards.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write shards.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@shards.json@[@@@",
-      "@@@STEP_LOG_LINE@shards.json@  {@@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"environment\": {@@@",
-      "@@@STEP_LOG_LINE@shards.json@      \"netboot\": true, @@@",
-      "@@@STEP_LOG_LINE@shards.json@      \"dimensions\": {@@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"device_type\": \"Khadas Vim2 Max\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@      }, @@@",
-      "@@@STEP_LOG_LINE@shards.json@      \"service_account\": \"my-service-account@example.com\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@    }, @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@shards.json@      {@@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"path\": \"/path/to/test\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"os\": \"linux\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"name\": \"test\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"install_path\": \"/path/to/test\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"label\": \"//path/to/test:test(//toolchain)\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@      }@@@",
-      "@@@STEP_LOG_LINE@shards.json@    ], @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"name\": \"Vim2\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"deps\": []@@@",
-      "@@@STEP_LOG_LINE@shards.json@  }@@@",
-      "@@@STEP_LOG_LINE@shards.json@]@@@",
-      "@@@STEP_LOG_END@shards.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"/path/to/test\": [\"/path/to/test\"], \"[CLEANUP]/build-artifacts_tmp_1/arm64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/arm64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/authorized_key\": [\"[CLEANUP]/build_artifacts_tmp_2/authorized_key\"], \"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/build_artifacts_tmp_2/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/covargs\": [\"[CLEANUP]/build_artifacts_tmp_2/covargs\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/ids.txt\": [\"[CLEANUP]/build_artifacts_tmp_2/ids.txt\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_cov\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_cov\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_profdata\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_profdata\"], \"[CLEANUP]/build-artifacts_tmp_1/minfs\": [\"[CLEANUP]/build_artifacts_tmp_2/minfs\"], \"[CLEANUP]/build-artifacts_tmp_1/netboot.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/netboot.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/private_key\": [\"[CLEANUP]/build_artifacts_tmp_2/private_key\"], \"[CLEANUP]/build-artifacts_tmp_1/symbolize_tool\": [\"[CLEANUP]/build_artifacts_tmp_2/symbolize_tool\"], \"[CLEANUP]/build-artifacts_tmp_1/tests.json\": [\"[CLEANUP]/build_artifacts_tmp_2/tests.json\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/zbi\"], \"[START_DIR]/args.json\": [\"[CLEANUP]/build_artifacts_tmp_2/args.json\"], \"[START_DIR]/images.json\": [\"[CLEANUP]/build_artifacts_tmp_2/images.json\"], \"[START_DIR]/shards.json\": [\"[CLEANUP]/build_artifacts_tmp_2/shards.json\"]}"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.create_links",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/build_artifacts_tmp_2:."
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.isolate",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "shard Vim2"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"path\": \"/path/to/test\", \n    \"os\": \"linux\", \n    \"name\": \"test\", \n    \"install_path\": \"/path/to/test\", \n    \"label\": \"//path/to/test:test(//toolchain)\"\n  }\n]",
-      "[CLEANUP]/isolate_tmp_3/tests.json"
-    ],
-    "infra_step": true,
-    "name": "shard Vim2.write test manifest",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@tests.json@[@@@",
-      "@@@STEP_LOG_LINE@tests.json@  {@@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"path\": \"/path/to/test\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"os\": \"linux\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"name\": \"test\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"install_path\": \"/path/to/test\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"label\": \"//path/to/test:test(//toolchain)\"@@@",
-      "@@@STEP_LOG_LINE@tests.json@  }@@@",
-      "@@@STEP_LOG_LINE@tests.json@]@@@",
-      "@@@STEP_LOG_END@tests.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"path\": \"netboot.zbi\", \n    \"bootserver_netboot\": [\n      \"--boot\"\n    ], \n    \"type\": \"zbi\", \n    \"name\": \"netboot\"\n  }, \n  {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n]",
-      "[CLEANUP]/isolate_tmp_3/images.json"
-    ],
-    "infra_step": true,
-    "name": "shard Vim2.write image manifest",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@images.json@[@@@",
-      "@@@STEP_LOG_LINE@images.json@  {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ], @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"netboot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@  }, @@@",
-      "@@@STEP_LOG_LINE@images.json@  {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@]@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"/path/to/test\": [\"/path/to/test\"], \"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/isolate_tmp_3/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/isolate_tmp_3/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/isolate_tmp_3/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/netboot.zbi\": [\"[CLEANUP]/isolate_tmp_3/netboot.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/isolate_tmp_3/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/isolate_tmp_3/testrunner\"]}"
-    ],
-    "infra_step": true,
-    "name": "shard Vim2.create tree of build artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/isolate_tmp_3:."
-    ],
-    "infra_step": true,
-    "name": "shard Vim2.isolate build artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect"
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_SUMMARY_TEXT@1 launched, 1 passed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch.Vim2 (attempt 0)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LINK@Swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch.Vim2 (attempt 0).ensure swarming",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/swarming_client",
-      "-ensure-file",
-      "infra/tools/luci/swarming/${platform} git_revision:67b11ada44a625008a2db5cb49ad453494b16ba1",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.launch.Vim2 (attempt 0).ensure swarming.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@5@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:67b\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/swarming/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "spawn-tasks",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-json-input",
-      "{\"requests\": [{\"name\": \"Vim2\", \"priority\": \"200\", \"service_account\": \"my-service-account@example.com\", \"tags\": [\"test_environment_name:Khadas Vim2 Max-arm64\"], \"task_slices\": [{\"expiration_secs\": \"0\", \"properties\": {\"cipd_input\": {\"packages\": [{\"package_name\": \"infra/tools/luci-auth/${platform}\", \"path\": \".\", \"version\": \"latest\"}]}, \"command\": [\"./luci-auth\", \"context\", \"--\", \"./botanist\", \"-level\", \"debug\", \"run\", \"-images\", \"images.json\", \"-timeout\", \"0s\", \"-syslog\", \"syslog.txt\", \"-serial-log\", \"serial.txt\", \"-repo\", \"http://$GCS_PROXY_HOST/fuchsia-artifacts/8945511751514863184/repository\", \"-blobs\", \"http://$GCS_PROXY_HOST/fuchsia-artifacts/blobs\", \"-netboot\", \"-config\", \"/etc/botanist/config.json\", \"./testrunner\", \"-archive\", \"out.tar\", \"tests.json\"], \"containment\": {\"containment_type\": \"NONE\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"pool\", \"value\": \"fuchsia.tests\"}, {\"key\": \"device_type\", \"value\": \"Khadas Vim2 Max\"}], \"env\": [{\"key\": \"BUILD_PRODUCT\", \"value\": \"products/core.gni\"}, {\"key\": \"FUCHSIA_TEST_OUTDIR\", \"value\": \"${ISOLATED_OUTDIR}\"}, {\"key\": \"INPUT_COMMIT_HOST\", \"value\": \"fuchsia.googlesource.com\"}, {\"key\": \"LSAN_SYMBOLIZER_PATH\", \"value\": \"llvm-symbolizer\"}, {\"key\": \"BUILDBUCKET_BUCKET\", \"value\": \"ci\"}, {\"key\": \"BUILD_TARGET\", \"value\": \"arm64\"}, {\"key\": \"ASAN_SYMBOLIZER_PATH\", \"value\": \"llvm-symbolizer\"}, {\"key\": \"UBSAN_SYMBOLIZER_PATH\", \"value\": \"llvm-symbolizer\"}, {\"key\": \"INPUT_COMMIT_PROJECT\", \"value\": \"fuchsia\"}, {\"key\": \"BUILDER_NAME\", \"value\": \"builder\"}, {\"key\": \"INPUT_COMMIT_REF\", \"value\": \"refs/heads/master\"}, {\"key\": \"FUCHSIA_DEVICE_TYPE\", \"value\": \"Khadas Vim2 Max\"}, {\"key\": \"BUILDBUCKET_ID\", \"value\": \"8945511751514863184\"}, {\"key\": \"BUILD_BOARD\", \"value\": \"boards/x64.gni\"}, {\"key\": \"BUILD_CREATE_TIME\", \"value\": \"1527292217\"}, {\"key\": \"BUILD_TYPE\", \"value\": \"release\"}], \"env_prefixes\": [], \"execution_timeout_secs\": \"0\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"inputs_ref\": {\"isolated\": \"[dummy hash]\", \"isolatedserver\": \"https://example.isolateserver.appspot.com\", \"namespace\": \"default-gzip\"}, \"io_timeout_secs\": \"0\", \"outputs\": [\"syslog.txt\", \"serial.txt\", \"out.tar\"]}}]}]}",
-      "-json-output",
-      "/path/to/tmp/json",
-      "-cancel-extra-tasks"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.launch.Vim2 (attempt 0).trigger",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"tasks\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@    {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"request\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"Vim2\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  ]@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LINK@task UI: Vim2@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "collect",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-task-summary-json",
-      "/path/to/tmp/json",
-      "-task-output-stdout",
-      "json",
-      "-output-dir",
-      "[CLEANUP]/swarming_tmp_4",
-      "0"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.collect",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"0\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"output\": \"hello world!\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"outputs\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"syslog.txt\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"serial.txt\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"out.tar\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"benchmark.catapult_json\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"results\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"duration\": 62.35, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"exit_code\": 0, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"name\": \"Vim2\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"outputs_ref\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolated\": \"abc123\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"namespace\": \"default-gzip\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"state\": \"COMPLETED\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@task stdout+stderr: Vim2@hello world!@@@",
-      "@@@STEP_LOG_END@task stdout+stderr: Vim2@@@",
-      "@@@STEP_LINK@task isolated outputs: Vim2@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.Vim2",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/symbolize_tool",
-      "-llvm-symbolizer-restart-interval",
-      "2",
-      "-level",
-      "debug",
-      "-symbol-server",
-      "debug-symbols",
-      "-symbol-cache",
-      "[CACHE]/symbol",
-      "-llvm-symbolizer",
-      "[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Vim2.symbolize logs",
-    "stdin": "hello world!",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@json.output[symbolizer-output.json]@{}@@@",
-      "@@@STEP_LOG_END@json.output[symbolizer-output.json]@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.Vim2.check log serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Vim2.check log serial.txt.read",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@5@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.Vim2.ensure bsdtar",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/bsdtar",
-      "-ensure-file",
-      "fuchsia/tools/bsdtar/${platform} latest",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Vim2.ensure bsdtar.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@5@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"fuchsia/tools/bsdtar/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cipd/bsdtar/bsdtar",
-      "--extract",
-      "--verbose",
-      "-f",
-      "[CLEANUP]/swarming_tmp_4/0/out.tar",
-      "-C",
-      "[CLEANUP]/test_results/0"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Vim2.extract",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "remove",
-      "[CLEANUP]/swarming_tmp_4/0/out.tar"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Vim2.remove out.tar",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.always pass",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks.Vim2 (attempt 0)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//path/to/hello:hello(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//path/to/goodbye:goodbye(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@",
-      "@@@STEP_LINK@swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@",
-      "@@@STEP_LINK@task outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks.Vim2 (attempt 0).all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_SUMMARY_TEXT@2 passed tests@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/syslog.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.passed tasks.Vim2 (attempt 0).read syslog.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.passed tasks.Vim2 (attempt 0).read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@1 passed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.Vim2",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.Vim2.attempt 0 (pass)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//path/to/hello:hello(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//path/to/goodbye:goodbye(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@",
-      "@@@STEP_LINK@swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@",
-      "@@@STEP_LINK@task outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.Vim2.attempt 0 (pass).all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_TEXT@<br/>hello<br/>goodbye@@@",
-      "@@@STEP_SUMMARY_TEXT@2 passed tests@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/syslog.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "passes.Vim2.attempt 0 (pass).read syslog.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "passes.Vim2.attempt 0 (pass).read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "flakes",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@0 flaked@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "failures",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@0 failed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "all tasks passed"
-  },
-  {
-    "cmd": [],
-    "name": "upload Vim2 test results",
-    "~followup_annotations": [
-      "@@@STEP_LINK@go/fuchsia-result-store/bid:8945511751514863184@https://goto.google.com/fuchsia-result-store/bid:8945511751514863184@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"gn_label\": \"//path/to/hello:hello(//toolchain)\", \"output_file\": \"hello.out\", \"name\": \"hello\", \"result\": \"PASS\"}, {\"gn_label\": \"//path/to/goodbye:goodbye(//toolchain)\", \"output_file\": \"goodbye.out\", \"name\": \"goodbye\", \"result\": \"PASS\"}]}",
-      "[CLEANUP]/swarming_tmp_4/0/summary.json"
-    ],
-    "infra_step": true,
-    "name": "upload Vim2 test results.write summary.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@summary.json@{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"gn_label\": \"//path/to/hello:hello(//toolchain)\", \"output_file\": \"hello.out\", \"name\": \"hello\", \"result\": \"PASS\"}, {\"gn_label\": \"//path/to/goodbye:goodbye(//toolchain)\", \"output_file\": \"goodbye.out\", \"name\": \"goodbye\", \"result\": \"PASS\"}]}@@@",
-      "@@@STEP_LOG_END@summary.json@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "upload Vim2 test results.ensure gsutil",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/gsutil",
-      "-ensure-file",
-      "infra/gsutil version:4.41",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "upload Vim2 test results.ensure gsutil.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-version:4.41----\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/gsutil\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-vpython-spec",
-      "RECIPE_MODULE[fuchsia::gsutil]/resources/gsutil.vpython",
-      "-u",
-      "[START_DIR]/cipd/gsutil/gsutil",
-      "-o",
-      "GSUtil:software_update_check_period=0",
-      "-m",
-      "rsync",
-      "-r",
-      "[CLEANUP]/swarming_tmp_4/0",
-      "gs://fuchsia_infra/builds/8945511751514863184/Vim2"
-    ],
-    "infra_step": true,
-    "name": "upload Vim2 test results.upload Vim2 to fuchsia_infra",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@Vim2@https://console.cloud.google.com/storage/browser/fuchsia_infra/builds/8945511751514863184/Vim2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "check log Vim2:serial.txt"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "check log Vim2:serial.txt.read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "name": "$result"
-  }
-]
\ No newline at end of file
diff --git a/recipe_modules/testing/examples/full.expected/test_with_shards_arm64_with_runtests.json b/recipe_modules/testing/examples/full.expected/test_with_shards_arm64_with_runtests.json
deleted file mode 100644
index 88f8ac2..0000000
--- a/recipe_modules/testing/examples/full.expected/test_with_shards_arm64_with_runtests.json
+++ /dev/null
@@ -1,990 +0,0 @@
-[
-  {
-    "cmd": [],
-    "name": "download build artifacts"
-  },
-  {
-    "cmd": [],
-    "name": "download build artifacts.ensure isolated",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/isolated_client",
-      "-ensure-file",
-      "infra/tools/luci/isolated/${platform} git_revision:305e79001db1846906c7136d90a863bee5bd3bfc",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.ensure isolated.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:305\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolated/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "download",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-isolated",
-      "abc",
-      "-output-dir",
-      "[CLEANUP]/build-artifacts_tmp_1"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.download build_artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/args.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"build_type\": \"release\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"target\": \"arm64\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"variants\": []@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/images.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"netboot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/shards.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.load test shards",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@[@@@",
-      "@@@STEP_LOG_LINE@json.output@  {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"deps\": [], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"environment\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"dimensions\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"device_type\": \"Khadas Vim2 Max\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"netboot\": true, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"service_account\": \"my-service-account@example.com\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }, @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"Vim2\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"install_path\": \"/path/to/test\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"label\": \"//path/to/test:test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"test\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"os\": \"linux\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"path\": \"/path/to/test\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@]@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "isolate build artifacts"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"variants\": [], \n  \"product\": \"products/core.gni\", \n  \"target\": \"arm64\", \n  \"board\": \"boards/x64.gni\", \n  \"build_type\": \"release\"\n}",
-      "[START_DIR]/args.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@args.json@{@@@",
-      "@@@STEP_LOG_LINE@args.json@  \"variants\": [], @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"target\": \"arm64\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"build_type\": \"release\"@@@",
-      "@@@STEP_LOG_LINE@args.json@}@@@",
-      "@@@STEP_LOG_END@args.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"netboot\": {\n    \"path\": \"netboot.zbi\", \n    \"bootserver_netboot\": [\n      \"--boot\"\n    ], \n    \"type\": \"zbi\", \n    \"name\": \"netboot\"\n  }, \n  \"zircon-a\": {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n}",
-      "[START_DIR]/images.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@images.json@{@@@",
-      "@@@STEP_LOG_LINE@images.json@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ], @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"netboot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@  }, @@@",
-      "@@@STEP_LOG_LINE@images.json@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@}@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"environment\": {\n      \"netboot\": true, \n      \"dimensions\": {\n        \"device_type\": \"Khadas Vim2 Max\"\n      }, \n      \"service_account\": \"my-service-account@example.com\"\n    }, \n    \"tests\": [\n      {\n        \"path\": \"/path/to/test\", \n        \"os\": \"linux\", \n        \"name\": \"test\", \n        \"install_path\": \"/path/to/test\", \n        \"label\": \"//path/to/test:test(//toolchain)\"\n      }\n    ], \n    \"name\": \"Vim2\", \n    \"deps\": []\n  }\n]",
-      "[START_DIR]/shards.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write shards.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@shards.json@[@@@",
-      "@@@STEP_LOG_LINE@shards.json@  {@@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"environment\": {@@@",
-      "@@@STEP_LOG_LINE@shards.json@      \"netboot\": true, @@@",
-      "@@@STEP_LOG_LINE@shards.json@      \"dimensions\": {@@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"device_type\": \"Khadas Vim2 Max\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@      }, @@@",
-      "@@@STEP_LOG_LINE@shards.json@      \"service_account\": \"my-service-account@example.com\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@    }, @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@shards.json@      {@@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"path\": \"/path/to/test\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"os\": \"linux\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"name\": \"test\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"install_path\": \"/path/to/test\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"label\": \"//path/to/test:test(//toolchain)\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@      }@@@",
-      "@@@STEP_LOG_LINE@shards.json@    ], @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"name\": \"Vim2\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"deps\": []@@@",
-      "@@@STEP_LOG_LINE@shards.json@  }@@@",
-      "@@@STEP_LOG_LINE@shards.json@]@@@",
-      "@@@STEP_LOG_END@shards.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"/path/to/test\": [\"/path/to/test\"], \"[CLEANUP]/build-artifacts_tmp_1/arm64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/arm64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/authorized_key\": [\"[CLEANUP]/build_artifacts_tmp_2/authorized_key\"], \"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/build_artifacts_tmp_2/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/covargs\": [\"[CLEANUP]/build_artifacts_tmp_2/covargs\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/ids.txt\": [\"[CLEANUP]/build_artifacts_tmp_2/ids.txt\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_cov\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_cov\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_profdata\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_profdata\"], \"[CLEANUP]/build-artifacts_tmp_1/minfs\": [\"[CLEANUP]/build_artifacts_tmp_2/minfs\"], \"[CLEANUP]/build-artifacts_tmp_1/netboot.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/netboot.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/private_key\": [\"[CLEANUP]/build_artifacts_tmp_2/private_key\"], \"[CLEANUP]/build-artifacts_tmp_1/symbolize_tool\": [\"[CLEANUP]/build_artifacts_tmp_2/symbolize_tool\"], \"[CLEANUP]/build-artifacts_tmp_1/tests.json\": [\"[CLEANUP]/build_artifacts_tmp_2/tests.json\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/zbi\"], \"[START_DIR]/args.json\": [\"[CLEANUP]/build_artifacts_tmp_2/args.json\"], \"[START_DIR]/images.json\": [\"[CLEANUP]/build_artifacts_tmp_2/images.json\"], \"[START_DIR]/shards.json\": [\"[CLEANUP]/build_artifacts_tmp_2/shards.json\"]}"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.create_links",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/build_artifacts_tmp_2:."
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.isolate",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "shard Vim2"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"path\": \"/path/to/test\", \n    \"os\": \"linux\", \n    \"name\": \"test\", \n    \"install_path\": \"/path/to/test\", \n    \"label\": \"//path/to/test:test(//toolchain)\"\n  }\n]",
-      "[CLEANUP]/isolate_tmp_3/tests.json"
-    ],
-    "infra_step": true,
-    "name": "shard Vim2.write test manifest",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@tests.json@[@@@",
-      "@@@STEP_LOG_LINE@tests.json@  {@@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"path\": \"/path/to/test\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"os\": \"linux\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"name\": \"test\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"install_path\": \"/path/to/test\", @@@",
-      "@@@STEP_LOG_LINE@tests.json@    \"label\": \"//path/to/test:test(//toolchain)\"@@@",
-      "@@@STEP_LOG_LINE@tests.json@  }@@@",
-      "@@@STEP_LOG_LINE@tests.json@]@@@",
-      "@@@STEP_LOG_END@tests.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"path\": \"netboot.zbi\", \n    \"bootserver_netboot\": [\n      \"--boot\"\n    ], \n    \"type\": \"zbi\", \n    \"name\": \"netboot\"\n  }, \n  {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n]",
-      "[CLEANUP]/isolate_tmp_3/images.json"
-    ],
-    "infra_step": true,
-    "name": "shard Vim2.write image manifest",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@images.json@[@@@",
-      "@@@STEP_LOG_LINE@images.json@  {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ], @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"netboot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@  }, @@@",
-      "@@@STEP_LOG_LINE@images.json@  {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@]@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"/path/to/test\": [\"/path/to/test\"], \"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/isolate_tmp_3/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/isolate_tmp_3/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/isolate_tmp_3/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/netboot.zbi\": [\"[CLEANUP]/isolate_tmp_3/netboot.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/isolate_tmp_3/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/isolate_tmp_3/testrunner\"]}"
-    ],
-    "infra_step": true,
-    "name": "shard Vim2.create tree of build artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/isolate_tmp_3:."
-    ],
-    "infra_step": true,
-    "name": "shard Vim2.isolate build artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect"
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_SUMMARY_TEXT@1 launched, 1 passed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch.Vim2 (attempt 0)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LINK@Swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch.Vim2 (attempt 0).ensure swarming",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/swarming_client",
-      "-ensure-file",
-      "infra/tools/luci/swarming/${platform} git_revision:67b11ada44a625008a2db5cb49ad453494b16ba1",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.launch.Vim2 (attempt 0).ensure swarming.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@5@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:67b\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/swarming/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "spawn-tasks",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-json-input",
-      "{\"requests\": [{\"name\": \"Vim2\", \"priority\": \"200\", \"service_account\": \"my-service-account@example.com\", \"tags\": [\"test_environment_name:Khadas Vim2 Max-arm64\"], \"task_slices\": [{\"expiration_secs\": \"0\", \"properties\": {\"cipd_input\": {\"packages\": [{\"package_name\": \"infra/tools/luci-auth/${platform}\", \"path\": \".\", \"version\": \"latest\"}]}, \"command\": [\"./luci-auth\", \"context\", \"--\", \"./botanist\", \"-level\", \"debug\", \"run\", \"-images\", \"images.json\", \"-timeout\", \"0s\", \"-syslog\", \"syslog.txt\", \"-serial-log\", \"serial.txt\", \"-repo\", \"http://$GCS_PROXY_HOST/fuchsia-artifacts/8945511751514863184/repository\", \"-blobs\", \"http://$GCS_PROXY_HOST/fuchsia-artifacts/blobs\", \"-netboot\", \"-config\", \"/etc/botanist/config.json\", \"./testrunner\", \"-archive\", \"out.tar\", \"-use-runtests\", \"tests.json\"], \"containment\": {\"containment_type\": \"NONE\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"pool\", \"value\": \"fuchsia.tests\"}, {\"key\": \"device_type\", \"value\": \"Khadas Vim2 Max\"}], \"env\": [{\"key\": \"BUILD_PRODUCT\", \"value\": \"products/core.gni\"}, {\"key\": \"FUCHSIA_TEST_OUTDIR\", \"value\": \"${ISOLATED_OUTDIR}\"}, {\"key\": \"INPUT_COMMIT_HOST\", \"value\": \"fuchsia.googlesource.com\"}, {\"key\": \"LSAN_SYMBOLIZER_PATH\", \"value\": \"llvm-symbolizer\"}, {\"key\": \"BUILDBUCKET_BUCKET\", \"value\": \"ci\"}, {\"key\": \"BUILD_TARGET\", \"value\": \"arm64\"}, {\"key\": \"ASAN_SYMBOLIZER_PATH\", \"value\": \"llvm-symbolizer\"}, {\"key\": \"UBSAN_SYMBOLIZER_PATH\", \"value\": \"llvm-symbolizer\"}, {\"key\": \"INPUT_COMMIT_PROJECT\", \"value\": \"fuchsia\"}, {\"key\": \"BUILDER_NAME\", \"value\": \"builder\"}, {\"key\": \"INPUT_COMMIT_REF\", \"value\": \"refs/heads/master\"}, {\"key\": \"FUCHSIA_DEVICE_TYPE\", \"value\": \"Khadas Vim2 Max\"}, {\"key\": \"BUILDBUCKET_ID\", \"value\": \"8945511751514863184\"}, {\"key\": \"BUILD_BOARD\", \"value\": \"boards/x64.gni\"}, {\"key\": \"BUILD_CREATE_TIME\", \"value\": \"1527292217\"}, {\"key\": \"BUILD_TYPE\", \"value\": \"release\"}], \"env_prefixes\": [], \"execution_timeout_secs\": \"0\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"inputs_ref\": {\"isolated\": \"[dummy hash]\", \"isolatedserver\": \"https://example.isolateserver.appspot.com\", \"namespace\": \"default-gzip\"}, \"io_timeout_secs\": \"0\", \"outputs\": [\"syslog.txt\", \"serial.txt\", \"out.tar\"]}}]}]}",
-      "-json-output",
-      "/path/to/tmp/json",
-      "-cancel-extra-tasks"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.launch.Vim2 (attempt 0).trigger",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"tasks\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@    {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"request\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"Vim2\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  ]@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LINK@task UI: Vim2@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "collect",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-task-summary-json",
-      "/path/to/tmp/json",
-      "-task-output-stdout",
-      "json",
-      "-output-dir",
-      "[CLEANUP]/swarming_tmp_4",
-      "0"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.collect",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"0\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"output\": \"hello world!\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"outputs\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"syslog.txt\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"serial.txt\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"out.tar\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"benchmark.catapult_json\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"results\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"duration\": 62.35, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"exit_code\": 0, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"name\": \"Vim2\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"outputs_ref\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolated\": \"abc123\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"namespace\": \"default-gzip\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"state\": \"COMPLETED\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@task stdout+stderr: Vim2@hello world!@@@",
-      "@@@STEP_LOG_END@task stdout+stderr: Vim2@@@",
-      "@@@STEP_LINK@task isolated outputs: Vim2@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.Vim2",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/symbolize_tool",
-      "-llvm-symbolizer-restart-interval",
-      "2",
-      "-level",
-      "debug",
-      "-symbol-server",
-      "debug-symbols",
-      "-symbol-cache",
-      "[CACHE]/symbol",
-      "-llvm-symbolizer",
-      "[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Vim2.symbolize logs",
-    "stdin": "hello world!",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@json.output[symbolizer-output.json]@{}@@@",
-      "@@@STEP_LOG_END@json.output[symbolizer-output.json]@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.Vim2.check log serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Vim2.check log serial.txt.read",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@5@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.Vim2.ensure bsdtar",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/bsdtar",
-      "-ensure-file",
-      "fuchsia/tools/bsdtar/${platform} latest",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Vim2.ensure bsdtar.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@5@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"fuchsia/tools/bsdtar/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cipd/bsdtar/bsdtar",
-      "--extract",
-      "--verbose",
-      "-f",
-      "[CLEANUP]/swarming_tmp_4/0/out.tar",
-      "-C",
-      "[CLEANUP]/test_results/0"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Vim2.extract",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "remove",
-      "[CLEANUP]/swarming_tmp_4/0/out.tar"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.Vim2.remove out.tar",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.always pass",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks.Vim2 (attempt 0)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//path/to/hello:hello(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//path/to/goodbye:goodbye(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@",
-      "@@@STEP_LINK@swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@",
-      "@@@STEP_LINK@task outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks.Vim2 (attempt 0).all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_SUMMARY_TEXT@2 passed tests@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/syslog.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.passed tasks.Vim2 (attempt 0).read syslog.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.passed tasks.Vim2 (attempt 0).read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@1 passed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.Vim2",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.Vim2.attempt 0 (pass)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//path/to/hello:hello(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//path/to/goodbye:goodbye(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@",
-      "@@@STEP_LINK@swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@",
-      "@@@STEP_LINK@task outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.Vim2.attempt 0 (pass).all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_TEXT@<br/>hello<br/>goodbye@@@",
-      "@@@STEP_SUMMARY_TEXT@2 passed tests@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/syslog.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "passes.Vim2.attempt 0 (pass).read syslog.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "passes.Vim2.attempt 0 (pass).read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "flakes",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@0 flaked@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "failures",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@0 failed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "all tasks passed"
-  },
-  {
-    "cmd": [],
-    "name": "upload Vim2 test results",
-    "~followup_annotations": [
-      "@@@STEP_LINK@go/fuchsia-result-store/bid:8945511751514863184@https://goto.google.com/fuchsia-result-store/bid:8945511751514863184@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"gn_label\": \"//path/to/hello:hello(//toolchain)\", \"output_file\": \"hello.out\", \"name\": \"hello\", \"result\": \"PASS\"}, {\"gn_label\": \"//path/to/goodbye:goodbye(//toolchain)\", \"output_file\": \"goodbye.out\", \"name\": \"goodbye\", \"result\": \"PASS\"}]}",
-      "[CLEANUP]/swarming_tmp_4/0/summary.json"
-    ],
-    "infra_step": true,
-    "name": "upload Vim2 test results.write summary.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@summary.json@{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"gn_label\": \"//path/to/hello:hello(//toolchain)\", \"output_file\": \"hello.out\", \"name\": \"hello\", \"result\": \"PASS\"}, {\"gn_label\": \"//path/to/goodbye:goodbye(//toolchain)\", \"output_file\": \"goodbye.out\", \"name\": \"goodbye\", \"result\": \"PASS\"}]}@@@",
-      "@@@STEP_LOG_END@summary.json@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "upload Vim2 test results.ensure gsutil",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/gsutil",
-      "-ensure-file",
-      "infra/gsutil version:4.41",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "upload Vim2 test results.ensure gsutil.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-version:4.41----\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/gsutil\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-vpython-spec",
-      "RECIPE_MODULE[fuchsia::gsutil]/resources/gsutil.vpython",
-      "-u",
-      "[START_DIR]/cipd/gsutil/gsutil",
-      "-o",
-      "GSUtil:software_update_check_period=0",
-      "-m",
-      "rsync",
-      "-r",
-      "[CLEANUP]/swarming_tmp_4/0",
-      "gs://fuchsia_infra/builds/8945511751514863184/Vim2"
-    ],
-    "infra_step": true,
-    "name": "upload Vim2 test results.upload Vim2 to fuchsia_infra",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@Vim2@https://console.cloud.google.com/storage/browser/fuchsia_infra/builds/8945511751514863184/Vim2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "check log Vim2:serial.txt"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "check log Vim2:serial.txt.read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "name": "$result"
-  }
-]
\ No newline at end of file
diff --git a/recipe_modules/testing/examples/full.expected/without_experiment_ssh_into_aemu.json b/recipe_modules/testing/examples/full.expected/without_experiment_ssh_into_aemu.json
deleted file mode 100644
index a3528b4..0000000
--- a/recipe_modules/testing/examples/full.expected/without_experiment_ssh_into_aemu.json
+++ /dev/null
@@ -1,998 +0,0 @@
-[
-  {
-    "cmd": [],
-    "name": "download build artifacts"
-  },
-  {
-    "cmd": [],
-    "name": "download build artifacts.ensure isolated",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/isolated_client",
-      "-ensure-file",
-      "infra/tools/luci/isolated/${platform} git_revision:305e79001db1846906c7136d90a863bee5bd3bfc",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.ensure isolated.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:305\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolated/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "download",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-isolated",
-      "abc",
-      "-output-dir",
-      "[CLEANUP]/build-artifacts_tmp_1"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.download build_artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/args.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"build_type\": \"release\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"target\": \"x64\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"variants\": []@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/images.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"netboot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/shards.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.load test shards",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@[@@@",
-      "@@@STEP_LOG_LINE@json.output@  {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"deps\": [], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"environment\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"dimensions\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"device_type\": \"AEMU\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    }, @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"AEMU\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"install_path\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"label\": \"//a/b/c:hello_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"hello\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"os\": \"fuchsia\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"path\": \"/path/to/hello\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"install_path\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"label\": \"//a/b/c:goodbye_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"goodbye\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"os\": \"fuchsia\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"path\": \"/path/to/goodbye\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@]@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "isolate build artifacts"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"variants\": [], \n  \"product\": \"products/core.gni\", \n  \"target\": \"x64\", \n  \"board\": \"boards/x64.gni\", \n  \"build_type\": \"release\"\n}",
-      "[START_DIR]/args.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@args.json@{@@@",
-      "@@@STEP_LOG_LINE@args.json@  \"variants\": [], @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"target\": \"x64\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"build_type\": \"release\"@@@",
-      "@@@STEP_LOG_LINE@args.json@}@@@",
-      "@@@STEP_LOG_END@args.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"netboot\": {\n    \"path\": \"netboot.zbi\", \n    \"bootserver_netboot\": [\n      \"--boot\"\n    ], \n    \"type\": \"zbi\", \n    \"name\": \"netboot\"\n  }, \n  \"zircon-a\": {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n}",
-      "[START_DIR]/images.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@images.json@{@@@",
-      "@@@STEP_LOG_LINE@images.json@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ], @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"netboot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@  }, @@@",
-      "@@@STEP_LOG_LINE@images.json@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@}@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"environment\": {\n      \"dimensions\": {\n        \"device_type\": \"AEMU\"\n      }\n    }, \n    \"tests\": [\n      {\n        \"name\": \"hello\", \n        \"install_path\": \"/path/to/hello\", \n        \"label\": \"//a/b/c:hello_test(//toolchain)\", \n        \"path\": \"/path/to/hello\", \n        \"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", \n        \"os\": \"fuchsia\"\n      }, \n      {\n        \"name\": \"goodbye\", \n        \"install_path\": \"/path/to/goodbye\", \n        \"label\": \"//a/b/c:goodbye_test(//toolchain)\", \n        \"path\": \"/path/to/goodbye\", \n        \"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", \n        \"os\": \"fuchsia\"\n      }\n    ], \n    \"name\": \"AEMU\", \n    \"deps\": []\n  }\n]",
-      "[START_DIR]/shards.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write shards.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@shards.json@[@@@",
-      "@@@STEP_LOG_LINE@shards.json@  {@@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"environment\": {@@@",
-      "@@@STEP_LOG_LINE@shards.json@      \"dimensions\": {@@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"device_type\": \"AEMU\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@      }@@@",
-      "@@@STEP_LOG_LINE@shards.json@    }, @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@shards.json@      {@@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"name\": \"hello\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"install_path\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"label\": \"//a/b/c:hello_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"path\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"os\": \"fuchsia\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@      }, @@@",
-      "@@@STEP_LOG_LINE@shards.json@      {@@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"name\": \"goodbye\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"install_path\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"label\": \"//a/b/c:goodbye_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"path\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"os\": \"fuchsia\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@      }@@@",
-      "@@@STEP_LOG_LINE@shards.json@    ], @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"name\": \"AEMU\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"deps\": []@@@",
-      "@@@STEP_LOG_LINE@shards.json@  }@@@",
-      "@@@STEP_LOG_LINE@shards.json@]@@@",
-      "@@@STEP_LOG_END@shards.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"[CLEANUP]/build-artifacts_tmp_1/arm64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/arm64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/authorized_key\": [\"[CLEANUP]/build_artifacts_tmp_2/authorized_key\"], \"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/build_artifacts_tmp_2/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/covargs\": [\"[CLEANUP]/build_artifacts_tmp_2/covargs\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/ids.txt\": [\"[CLEANUP]/build_artifacts_tmp_2/ids.txt\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_cov\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_cov\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_profdata\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_profdata\"], \"[CLEANUP]/build-artifacts_tmp_1/minfs\": [\"[CLEANUP]/build_artifacts_tmp_2/minfs\"], \"[CLEANUP]/build-artifacts_tmp_1/netboot.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/netboot.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/private_key\": [\"[CLEANUP]/build_artifacts_tmp_2/private_key\"], \"[CLEANUP]/build-artifacts_tmp_1/symbolize_tool\": [\"[CLEANUP]/build_artifacts_tmp_2/symbolize_tool\"], \"[CLEANUP]/build-artifacts_tmp_1/tests.json\": [\"[CLEANUP]/build_artifacts_tmp_2/tests.json\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/zbi\"], \"[START_DIR]/args.json\": [\"[CLEANUP]/build_artifacts_tmp_2/args.json\"], \"[START_DIR]/images.json\": [\"[CLEANUP]/build_artifacts_tmp_2/images.json\"], \"[START_DIR]/shards.json\": [\"[CLEANUP]/build_artifacts_tmp_2/shards.json\"]}"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.create_links",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/build_artifacts_tmp_2:."
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.isolate",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "/path/to/hello\n/path/to/goodbye\n",
-      "[CLEANUP]/tests-AEMU"
-    ],
-    "infra_step": true,
-    "name": "write test list",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@tests-AEMU@/path/to/hello@@@",
-      "@@@STEP_LOG_LINE@tests-AEMU@/path/to/goodbye@@@",
-      "@@@STEP_LOG_END@tests-AEMU@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "mkdir /tmp/infra-test-output\nwaitfor class=block topo=/dev/sys/pci/00:06.0/virtio-block/block timeout=60000\nmount /dev/sys/pci/00:06.0/virtio-block/block /tmp/infra-test-output\nruntests -o /tmp/infra-test-output -f /boot/infra/shard-AEMU.run -i 1\numount /tmp/infra-test-output\ndm poweroff",
-      "[CLEANUP]/runcmds-AEMU"
-    ],
-    "infra_step": true,
-    "name": "write runcmds",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@runcmds-AEMU@mkdir /tmp/infra-test-output@@@",
-      "@@@STEP_LOG_LINE@runcmds-AEMU@waitfor class=block topo=/dev/sys/pci/00:06.0/virtio-block/block timeout=60000@@@",
-      "@@@STEP_LOG_LINE@runcmds-AEMU@mount /dev/sys/pci/00:06.0/virtio-block/block /tmp/infra-test-output@@@",
-      "@@@STEP_LOG_LINE@runcmds-AEMU@runtests -o /tmp/infra-test-output -f /boot/infra/shard-AEMU.run -i 1@@@",
-      "@@@STEP_LOG_LINE@runcmds-AEMU@umount /tmp/infra-test-output@@@",
-      "@@@STEP_LOG_LINE@runcmds-AEMU@dm poweroff@@@",
-      "@@@STEP_LOG_END@runcmds-AEMU@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/zbi",
-      "--output",
-      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
-      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
-      "--entry",
-      "infra/runcmds-AEMU=[CLEANUP]/runcmds-AEMU",
-      "--entry",
-      "infra/shard-AEMU.run=[CLEANUP]/tests-AEMU"
-    ],
-    "name": "create zbi"
-  },
-  {
-    "cmd": [],
-    "name": "shard AEMU"
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/minfs",
-      "[CLEANUP]/isolate_tmp_3/output.fs@3584M",
-      "create"
-    ],
-    "name": "shard AEMU.create test image",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n]",
-      "[CLEANUP]/isolate_tmp_3/images.json"
-    ],
-    "infra_step": true,
-    "name": "shard AEMU.write image manifest",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@images.json@[@@@",
-      "@@@STEP_LOG_LINE@images.json@  {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@]@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/isolate_tmp_3/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/isolate_tmp_3/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/isolate_tmp_3/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/isolate_tmp_3/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/isolate_tmp_3/testrunner\"]}"
-    ],
-    "infra_step": true,
-    "name": "shard AEMU.create tree of build artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/isolate_tmp_3:."
-    ],
-    "infra_step": true,
-    "name": "shard AEMU.isolate build artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect"
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_SUMMARY_TEXT@1 launched, 1 passed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch.AEMU (attempt 0)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LINK@Swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch.AEMU (attempt 0).ensure swarming",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/swarming_client",
-      "-ensure-file",
-      "infra/tools/luci/swarming/${platform} git_revision:67b11ada44a625008a2db5cb49ad453494b16ba1",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.launch.AEMU (attempt 0).ensure swarming.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@5@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:67b\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/swarming/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "spawn-tasks",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-json-input",
-      "{\"requests\": [{\"name\": \"AEMU\", \"priority\": \"200\", \"service_account\": \"\", \"tags\": [\"test_environment_name:AEMU-x64\", \"uses_legacy_qemu:true\"], \"task_slices\": [{\"expiration_secs\": \"0\", \"properties\": {\"cipd_input\": {\"packages\": [{\"package_name\": \"fuchsia/third_party/aemu/${platform}\", \"path\": \"aemu/bin\", \"version\": \"git_revision:058240c99e7a1b0782798a2e536f2be75b5f08cf\"}]}, \"command\": [\"./botanist\", \"-level\", \"debug\", \"qemu\", \"-type\", \"aemu\", \"-qemu-dir\", \"./aemu/bin\", \"-images\", \"images.json\", \"-arch\", \"x64\", \"-minfs\", \"output.fs\", \"-pci-addr\", \"06.0\", \"-use-kvm\", \"zircon.autorun.boot=/boot/bin/sh+/boot/infra/runcmds-AEMU\"], \"containment\": {\"containment_type\": \"NONE\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"kvm\", \"value\": \"1\"}, {\"key\": \"os\", \"value\": \"Debian\"}, {\"key\": \"cpu\", \"value\": \"x64\"}, {\"key\": \"pool\", \"value\": \"fuchsia.tests\"}], \"env\": [], \"env_prefixes\": [], \"execution_timeout_secs\": \"0\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"inputs_ref\": {\"isolated\": \"[dummy hash]\", \"isolatedserver\": \"https://example.isolateserver.appspot.com\", \"namespace\": \"default-gzip\"}, \"io_timeout_secs\": \"0\", \"outputs\": [\"output.fs\"]}}]}]}",
-      "-json-output",
-      "/path/to/tmp/json",
-      "-cancel-extra-tasks"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.launch.AEMU (attempt 0).trigger",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"tasks\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@    {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"request\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"AEMU\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  ]@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LINK@task UI: AEMU@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "collect",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-task-summary-json",
-      "/path/to/tmp/json",
-      "-task-output-stdout",
-      "json",
-      "-output-dir",
-      "[CLEANUP]/swarming_tmp_4",
-      "0"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.collect",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"0\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"output\": \"hello world!\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"outputs\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"syslog.txt\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"serial.txt\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"out.tar\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"benchmark.catapult_json\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"results\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"duration\": 62.35, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"exit_code\": 0, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"name\": \"AEMU\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"outputs_ref\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolated\": \"abc123\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"namespace\": \"default-gzip\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"state\": \"COMPLETED\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@task stdout+stderr: AEMU@hello world!@@@",
-      "@@@STEP_LOG_END@task stdout+stderr: AEMU@@@",
-      "@@@STEP_LINK@task isolated outputs: AEMU@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.AEMU",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/symbolize_tool",
-      "-llvm-symbolizer-restart-interval",
-      "2",
-      "-level",
-      "debug",
-      "-symbol-server",
-      "debug-symbols",
-      "-symbol-cache",
-      "[CACHE]/symbol",
-      "-llvm-symbolizer",
-      "[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.AEMU.symbolize logs",
-    "stdin": "hello world!",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@json.output[symbolizer-output.json]@{}@@@",
-      "@@@STEP_LOG_END@json.output[symbolizer-output.json]@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.AEMU.check log serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.AEMU.check log serial.txt.read",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@5@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/minfs",
-      "[CLEANUP]/swarming_tmp_4/0/out.tar",
-      "cp",
-      "::",
-      "[CLEANUP]/test_results/0"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.AEMU.extract",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "remove",
-      "[CLEANUP]/swarming_tmp_4/0/out.tar"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.AEMU.remove out.tar",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.always pass",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks.AEMU (attempt 0)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//a/b/c:hello_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"fuchsia-pkg://fuchsia.com/hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//a/b/c:goodbye_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"fuchsia-pkg://fuchsia.com/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@",
-      "@@@STEP_LINK@swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@",
-      "@@@STEP_LINK@task outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks.AEMU (attempt 0).all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_SUMMARY_TEXT@2 passed tests@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/syslog.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.passed tasks.AEMU (attempt 0).read syslog.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.passed tasks.AEMU (attempt 0).read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@1 passed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.AEMU",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.AEMU.attempt 0 (pass)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//a/b/c:hello_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"fuchsia-pkg://fuchsia.com/hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//a/b/c:goodbye_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"fuchsia-pkg://fuchsia.com/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@",
-      "@@@STEP_LINK@swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@",
-      "@@@STEP_LINK@task outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.AEMU.attempt 0 (pass).all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_TEXT@<br/>fuchsia-pkg://fuchsia.com/hello<br/>fuchsia-pkg://fuchsia.com/goodbye@@@",
-      "@@@STEP_SUMMARY_TEXT@2 passed tests@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/syslog.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "passes.AEMU.attempt 0 (pass).read syslog.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "passes.AEMU.attempt 0 (pass).read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "flakes",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@0 flaked@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "failures",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@0 failed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "all tasks passed"
-  },
-  {
-    "cmd": [],
-    "name": "upload AEMU test results",
-    "~followup_annotations": [
-      "@@@STEP_LINK@go/fuchsia-result-store/bid:8945511751514863184@https://goto.google.com/fuchsia-result-store/bid:8945511751514863184@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"gn_label\": \"//a/b/c:hello_test(//toolchain)\", \"output_file\": \"hello.out\", \"name\": \"fuchsia-pkg://fuchsia.com/hello\", \"result\": \"PASS\"}, {\"gn_label\": \"//a/b/c:goodbye_test(//toolchain)\", \"output_file\": \"goodbye.out\", \"name\": \"fuchsia-pkg://fuchsia.com/goodbye\", \"result\": \"PASS\"}]}",
-      "[CLEANUP]/swarming_tmp_4/0/summary.json"
-    ],
-    "infra_step": true,
-    "name": "upload AEMU test results.write summary.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@summary.json@{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"gn_label\": \"//a/b/c:hello_test(//toolchain)\", \"output_file\": \"hello.out\", \"name\": \"fuchsia-pkg://fuchsia.com/hello\", \"result\": \"PASS\"}, {\"gn_label\": \"//a/b/c:goodbye_test(//toolchain)\", \"output_file\": \"goodbye.out\", \"name\": \"fuchsia-pkg://fuchsia.com/goodbye\", \"result\": \"PASS\"}]}@@@",
-      "@@@STEP_LOG_END@summary.json@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "upload AEMU test results.ensure gsutil",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/gsutil",
-      "-ensure-file",
-      "infra/gsutil version:4.41",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "upload AEMU test results.ensure gsutil.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-version:4.41----\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/gsutil\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-vpython-spec",
-      "RECIPE_MODULE[fuchsia::gsutil]/resources/gsutil.vpython",
-      "-u",
-      "[START_DIR]/cipd/gsutil/gsutil",
-      "-o",
-      "GSUtil:software_update_check_period=0",
-      "-m",
-      "rsync",
-      "-r",
-      "[CLEANUP]/swarming_tmp_4/0",
-      "gs://fuchsia_infra/builds/8945511751514863184/AEMU"
-    ],
-    "infra_step": true,
-    "name": "upload AEMU test results.upload AEMU to fuchsia_infra",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@AEMU@https://console.cloud.google.com/storage/browser/fuchsia_infra/builds/8945511751514863184/AEMU@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "check log AEMU:serial.txt"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "check log AEMU:serial.txt.read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "name": "$result"
-  }
-]
\ No newline at end of file
diff --git a/recipe_modules/testing/examples/full.expected/without_experiment_ssh_into_qemu.json b/recipe_modules/testing/examples/full.expected/without_experiment_ssh_into_qemu.json
deleted file mode 100644
index 1569ca1..0000000
--- a/recipe_modules/testing/examples/full.expected/without_experiment_ssh_into_qemu.json
+++ /dev/null
@@ -1,998 +0,0 @@
-[
-  {
-    "cmd": [],
-    "name": "download build artifacts"
-  },
-  {
-    "cmd": [],
-    "name": "download build artifacts.ensure isolated",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/isolated_client",
-      "-ensure-file",
-      "infra/tools/luci/isolated/${platform} git_revision:305e79001db1846906c7136d90a863bee5bd3bfc",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.ensure isolated.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:305\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolated/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "download",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-isolated",
-      "abc",
-      "-output-dir",
-      "[CLEANUP]/build-artifacts_tmp_1"
-    ],
-    "infra_step": true,
-    "name": "download build artifacts.download build_artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/args.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"build_type\": \"release\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"target\": \"x64\", @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"variants\": []@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/images.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.read images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"netboot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/build-artifacts_tmp_1/shards.json",
-      "/path/to/tmp/json"
-    ],
-    "name": "download build artifacts.load test shards",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@[@@@",
-      "@@@STEP_LOG_LINE@json.output@  {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"deps\": [], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"environment\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"dimensions\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"device_type\": \"QEMU\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    }, @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"name\": \"QEMU\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"install_path\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"label\": \"//a/b/c:hello_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"hello\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"os\": \"fuchsia\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"path\": \"/path/to/hello\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"install_path\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"label\": \"//a/b/c:goodbye_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"goodbye\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"os\": \"fuchsia\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"path\": \"/path/to/goodbye\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@]@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "isolate build artifacts"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"variants\": [], \n  \"product\": \"products/core.gni\", \n  \"target\": \"x64\", \n  \"board\": \"boards/x64.gni\", \n  \"build_type\": \"release\"\n}",
-      "[START_DIR]/args.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write args.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@args.json@{@@@",
-      "@@@STEP_LOG_LINE@args.json@  \"variants\": [], @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"product\": \"products/core.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"target\": \"x64\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"board\": \"boards/x64.gni\", @@@",
-      "@@@STEP_LOG_LINE@args.json@  \"build_type\": \"release\"@@@",
-      "@@@STEP_LOG_LINE@args.json@}@@@",
-      "@@@STEP_LOG_END@args.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\n  \"netboot\": {\n    \"path\": \"netboot.zbi\", \n    \"bootserver_netboot\": [\n      \"--boot\"\n    ], \n    \"type\": \"zbi\", \n    \"name\": \"netboot\"\n  }, \n  \"zircon-a\": {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n}",
-      "[START_DIR]/images.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write images.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@images.json@{@@@",
-      "@@@STEP_LOG_LINE@images.json@  \"netboot\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"netboot.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_netboot\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ], @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"netboot\"@@@",
-      "@@@STEP_LOG_LINE@images.json@  }, @@@",
-      "@@@STEP_LOG_LINE@images.json@  \"zircon-a\": {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@}@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"environment\": {\n      \"dimensions\": {\n        \"device_type\": \"QEMU\"\n      }\n    }, \n    \"tests\": [\n      {\n        \"name\": \"hello\", \n        \"install_path\": \"/path/to/hello\", \n        \"label\": \"//a/b/c:hello_test(//toolchain)\", \n        \"path\": \"/path/to/hello\", \n        \"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", \n        \"os\": \"fuchsia\"\n      }, \n      {\n        \"name\": \"goodbye\", \n        \"install_path\": \"/path/to/goodbye\", \n        \"label\": \"//a/b/c:goodbye_test(//toolchain)\", \n        \"path\": \"/path/to/goodbye\", \n        \"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", \n        \"os\": \"fuchsia\"\n      }\n    ], \n    \"name\": \"QEMU\", \n    \"deps\": []\n  }\n]",
-      "[START_DIR]/shards.json"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.write shards.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@shards.json@[@@@",
-      "@@@STEP_LOG_LINE@shards.json@  {@@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"environment\": {@@@",
-      "@@@STEP_LOG_LINE@shards.json@      \"dimensions\": {@@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"device_type\": \"QEMU\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@      }@@@",
-      "@@@STEP_LOG_LINE@shards.json@    }, @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@shards.json@      {@@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"name\": \"hello\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"install_path\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"label\": \"//a/b/c:hello_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"path\": \"/path/to/hello\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"package_url\": \"fuchsia-pkg://fuchsia.com/hello\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"os\": \"fuchsia\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@      }, @@@",
-      "@@@STEP_LOG_LINE@shards.json@      {@@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"name\": \"goodbye\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"install_path\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"label\": \"//a/b/c:goodbye_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"path\": \"/path/to/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"package_url\": \"fuchsia-pkg://fuchsia.com/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@        \"os\": \"fuchsia\"@@@",
-      "@@@STEP_LOG_LINE@shards.json@      }@@@",
-      "@@@STEP_LOG_LINE@shards.json@    ], @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"name\": \"QEMU\", @@@",
-      "@@@STEP_LOG_LINE@shards.json@    \"deps\": []@@@",
-      "@@@STEP_LOG_LINE@shards.json@  }@@@",
-      "@@@STEP_LOG_LINE@shards.json@]@@@",
-      "@@@STEP_LOG_END@shards.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"[CLEANUP]/build-artifacts_tmp_1/arm64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/arm64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/arm64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/authorized_key\": [\"[CLEANUP]/build_artifacts_tmp_2/authorized_key\"], \"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/build_artifacts_tmp_2/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/covargs\": [\"[CLEANUP]/build_artifacts_tmp_2/covargs\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/ids.txt\": [\"[CLEANUP]/build_artifacts_tmp_2/ids.txt\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_cov\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_cov\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm_profdata\": [\"[CLEANUP]/build_artifacts_tmp_2/llvm_profdata\"], \"[CLEANUP]/build-artifacts_tmp_1/minfs\": [\"[CLEANUP]/build_artifacts_tmp_2/minfs\"], \"[CLEANUP]/build-artifacts_tmp_1/netboot.zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/netboot.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/private_key\": [\"[CLEANUP]/build_artifacts_tmp_2/private_key\"], \"[CLEANUP]/build-artifacts_tmp_1/symbolize_tool\": [\"[CLEANUP]/build_artifacts_tmp_2/symbolize_tool\"], \"[CLEANUP]/build-artifacts_tmp_1/tests.json\": [\"[CLEANUP]/build_artifacts_tmp_2/tests.json\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/build_artifacts_tmp_2/x64/testrunner\"], \"[CLEANUP]/build-artifacts_tmp_1/zbi\": [\"[CLEANUP]/build_artifacts_tmp_2/zbi\"], \"[START_DIR]/args.json\": [\"[CLEANUP]/build_artifacts_tmp_2/args.json\"], \"[START_DIR]/images.json\": [\"[CLEANUP]/build_artifacts_tmp_2/images.json\"], \"[START_DIR]/shards.json\": [\"[CLEANUP]/build_artifacts_tmp_2/shards.json\"]}"
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.create_links",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/build_artifacts_tmp_2:."
-    ],
-    "infra_step": true,
-    "name": "isolate build artifacts.isolate",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "/path/to/hello\n/path/to/goodbye\n",
-      "[CLEANUP]/tests-QEMU"
-    ],
-    "infra_step": true,
-    "name": "write test list",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@tests-QEMU@/path/to/hello@@@",
-      "@@@STEP_LOG_LINE@tests-QEMU@/path/to/goodbye@@@",
-      "@@@STEP_LOG_END@tests-QEMU@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "mkdir /tmp/infra-test-output\nwaitfor class=block topo=/dev/sys/pci/00:06.0/virtio-block/block timeout=60000\nmount /dev/sys/pci/00:06.0/virtio-block/block /tmp/infra-test-output\nruntests -o /tmp/infra-test-output -f /boot/infra/shard-QEMU.run -i 1\numount /tmp/infra-test-output\ndm poweroff",
-      "[CLEANUP]/runcmds-QEMU"
-    ],
-    "infra_step": true,
-    "name": "write runcmds",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@runcmds-QEMU@mkdir /tmp/infra-test-output@@@",
-      "@@@STEP_LOG_LINE@runcmds-QEMU@waitfor class=block topo=/dev/sys/pci/00:06.0/virtio-block/block timeout=60000@@@",
-      "@@@STEP_LOG_LINE@runcmds-QEMU@mount /dev/sys/pci/00:06.0/virtio-block/block /tmp/infra-test-output@@@",
-      "@@@STEP_LOG_LINE@runcmds-QEMU@runtests -o /tmp/infra-test-output -f /boot/infra/shard-QEMU.run -i 1@@@",
-      "@@@STEP_LOG_LINE@runcmds-QEMU@umount /tmp/infra-test-output@@@",
-      "@@@STEP_LOG_LINE@runcmds-QEMU@dm poweroff@@@",
-      "@@@STEP_LOG_END@runcmds-QEMU@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/zbi",
-      "--output",
-      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
-      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
-      "--entry",
-      "infra/runcmds-QEMU=[CLEANUP]/runcmds-QEMU",
-      "--entry",
-      "infra/shard-QEMU.run=[CLEANUP]/tests-QEMU"
-    ],
-    "name": "create zbi"
-  },
-  {
-    "cmd": [],
-    "name": "shard QEMU"
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/minfs",
-      "[CLEANUP]/isolate_tmp_3/output.fs@3584M",
-      "create"
-    ],
-    "name": "shard QEMU.create test image",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[\n  {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n]",
-      "[CLEANUP]/isolate_tmp_3/images.json"
-    ],
-    "infra_step": true,
-    "name": "shard QEMU.write image manifest",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@images.json@[@@@",
-      "@@@STEP_LOG_LINE@images.json@  {@@@",
-      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
-      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
-      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
-      "@@@STEP_LOG_LINE@images.json@    ]@@@",
-      "@@@STEP_LOG_LINE@images.json@  }@@@",
-      "@@@STEP_LOG_LINE@images.json@]@@@",
-      "@@@STEP_LOG_END@images.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
-      "--link-json",
-      "{\"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/isolate_tmp_3/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/isolate_tmp_3/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/isolate_tmp_3/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/isolate_tmp_3/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/isolate_tmp_3/testrunner\"]}"
-    ],
-    "infra_step": true,
-    "name": "shard QEMU.create tree of build artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/isolated_client/isolated",
-      "archive",
-      "-verbose",
-      "-isolate-server",
-      "https://example.isolateserver.appspot.com",
-      "-namespace",
-      "default-gzip",
-      "-dump-hash",
-      "/path/to/tmp/",
-      "-dirs",
-      "[CLEANUP]/isolate_tmp_3:."
-    ],
-    "infra_step": true,
-    "name": "shard QEMU.isolate build artifacts",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect"
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_SUMMARY_TEXT@1 launched, 1 passed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch.QEMU (attempt 0)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LINK@Swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.launch.QEMU (attempt 0).ensure swarming",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[CACHE]/swarming_client",
-      "-ensure-file",
-      "infra/tools/luci/swarming/${platform} git_revision:67b11ada44a625008a2db5cb49ad453494b16ba1",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.launch.QEMU (attempt 0).ensure swarming.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@5@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:67b\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/swarming/resolved-platform\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "spawn-tasks",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-json-input",
-      "{\"requests\": [{\"name\": \"QEMU\", \"priority\": \"200\", \"service_account\": \"\", \"tags\": [\"test_environment_name:QEMU-x64\", \"uses_legacy_qemu:true\"], \"task_slices\": [{\"expiration_secs\": \"0\", \"properties\": {\"cipd_input\": {\"packages\": [{\"package_name\": \"fuchsia/third_party/qemu/${platform}\", \"path\": \"qemu\", \"version\": \"git_revision:533bf2563d0213a7e002d9fcde75519d30ffa70f\"}]}, \"command\": [\"./botanist\", \"-level\", \"debug\", \"qemu\", \"-type\", \"qemu\", \"-qemu-dir\", \"./qemu/bin\", \"-images\", \"images.json\", \"-arch\", \"x64\", \"-minfs\", \"output.fs\", \"-pci-addr\", \"06.0\", \"-use-kvm\", \"zircon.autorun.boot=/boot/bin/sh+/boot/infra/runcmds-QEMU\"], \"containment\": {\"containment_type\": \"NONE\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"kvm\", \"value\": \"1\"}, {\"key\": \"os\", \"value\": \"Debian\"}, {\"key\": \"cpu\", \"value\": \"x64\"}, {\"key\": \"pool\", \"value\": \"fuchsia.tests\"}], \"env\": [], \"env_prefixes\": [], \"execution_timeout_secs\": \"0\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"inputs_ref\": {\"isolated\": \"[dummy hash]\", \"isolatedserver\": \"https://example.isolateserver.appspot.com\", \"namespace\": \"default-gzip\"}, \"io_timeout_secs\": \"0\", \"outputs\": [\"output.fs\"]}}]}]}",
-      "-json-output",
-      "/path/to/tmp/json",
-      "-cancel-extra-tasks"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.launch.QEMU (attempt 0).trigger",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"tasks\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@    {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"request\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"QEMU\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  ]@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LINK@task UI: QEMU@https://example.swarmingserver.appspot.com/task?id=0@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "collect",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-task-summary-json",
-      "/path/to/tmp/json",
-      "-task-output-stdout",
-      "json",
-      "-output-dir",
-      "[CLEANUP]/swarming_tmp_4",
-      "0"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.collect",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"0\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"output\": \"hello world!\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"outputs\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"syslog.txt\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"serial.txt\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"out.tar\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"benchmark.catapult_json\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"results\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"duration\": 62.35, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"exit_code\": 0, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"name\": \"QEMU\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"outputs_ref\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolated\": \"abc123\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"namespace\": \"default-gzip\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"state\": \"COMPLETED\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"task_id\": \"0\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@task stdout+stderr: QEMU@hello world!@@@",
-      "@@@STEP_LOG_END@task stdout+stderr: QEMU@@@",
-      "@@@STEP_LINK@task isolated outputs: QEMU@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.QEMU",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/symbolize_tool",
-      "-llvm-symbolizer-restart-interval",
-      "2",
-      "-level",
-      "debug",
-      "-symbol-server",
-      "debug-symbols",
-      "-symbol-cache",
-      "[CACHE]/symbol",
-      "-llvm-symbolizer",
-      "[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.QEMU.symbolize logs",
-    "stdin": "hello world!",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@json.output[symbolizer-output.json]@{}@@@",
-      "@@@STEP_LOG_END@json.output[symbolizer-output.json]@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.QEMU.check log serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.QEMU.check log serial.txt.read",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@5@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CLEANUP]/build-artifacts_tmp_1/minfs",
-      "[CLEANUP]/swarming_tmp_4/0/out.tar",
-      "cp",
-      "::",
-      "[CLEANUP]/test_results/0"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.QEMU.extract",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "remove",
-      "[CLEANUP]/swarming_tmp_4/0/out.tar"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.process results.QEMU.remove out.tar",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.process results.always pass",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks.QEMU (attempt 0)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//a/b/c:hello_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"fuchsia-pkg://fuchsia.com/hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//a/b/c:goodbye_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"fuchsia-pkg://fuchsia.com/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@",
-      "@@@STEP_LINK@swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@",
-      "@@@STEP_LINK@task outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "launch/collect.0.passed tasks.QEMU (attempt 0).all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_SUMMARY_TEXT@2 passed tests@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/syslog.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.passed tasks.QEMU (attempt 0).read syslog.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "launch/collect.0.passed tasks.QEMU (attempt 0).read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@4@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@1 passed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.QEMU",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.QEMU.attempt 0 (pass)",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@summary.json@{@@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"outputs\": {@@@",
-      "@@@STEP_LOG_LINE@summary.json@    \"goodbye-txt\": \"goodbye.txt\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@  }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@  \"tests\": [@@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//a/b/c:hello_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"fuchsia-pkg://fuchsia.com/hello\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"hello.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }, @@@",
-      "@@@STEP_LOG_LINE@summary.json@    {@@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"gn_label\": \"//a/b/c:goodbye_test(//toolchain)\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"name\": \"fuchsia-pkg://fuchsia.com/goodbye\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"output_file\": \"goodbye.out\", @@@",
-      "@@@STEP_LOG_LINE@summary.json@      \"result\": \"PASS\"@@@",
-      "@@@STEP_LOG_LINE@summary.json@    }@@@",
-      "@@@STEP_LOG_LINE@summary.json@  ]@@@",
-      "@@@STEP_LOG_LINE@summary.json@}@@@",
-      "@@@STEP_LOG_END@summary.json@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_LINE@symbolized log@blah@@@",
-      "@@@STEP_LOG_END@symbolized log@@@",
-      "@@@STEP_LOG_LINE@goodbye-txt@goodbye@@@",
-      "@@@STEP_LOG_END@goodbye-txt@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@",
-      "@@@STEP_LINK@swarming task@https://example.swarmingserver.appspot.com/task?id=0@@@",
-      "@@@STEP_LINK@task outputs@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "passes.QEMU.attempt 0 (pass).all passed tests",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_TEXT@<br/>fuchsia-pkg://fuchsia.com/hello<br/>fuchsia-pkg://fuchsia.com/goodbye@@@",
-      "@@@STEP_SUMMARY_TEXT@2 passed tests@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/syslog.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "passes.QEMU.attempt 0 (pass).read syslog.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@syslog.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@syslog.txt@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "passes.QEMU.attempt 0 (pass).read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@3@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "flakes",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@0 flaked@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "failures",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@0 failed@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "all tasks passed"
-  },
-  {
-    "cmd": [],
-    "name": "upload QEMU test results",
-    "~followup_annotations": [
-      "@@@STEP_LINK@go/fuchsia-result-store/bid:8945511751514863184@https://goto.google.com/fuchsia-result-store/bid:8945511751514863184@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"gn_label\": \"//a/b/c:hello_test(//toolchain)\", \"output_file\": \"hello.out\", \"name\": \"fuchsia-pkg://fuchsia.com/hello\", \"result\": \"PASS\"}, {\"gn_label\": \"//a/b/c:goodbye_test(//toolchain)\", \"output_file\": \"goodbye.out\", \"name\": \"fuchsia-pkg://fuchsia.com/goodbye\", \"result\": \"PASS\"}]}",
-      "[CLEANUP]/swarming_tmp_4/0/summary.json"
-    ],
-    "infra_step": true,
-    "name": "upload QEMU test results.write summary.json",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@summary.json@{\"outputs\": {\"goodbye-txt\": \"goodbye.txt\"}, \"tests\": [{\"gn_label\": \"//a/b/c:hello_test(//toolchain)\", \"output_file\": \"hello.out\", \"name\": \"fuchsia-pkg://fuchsia.com/hello\", \"result\": \"PASS\"}, {\"gn_label\": \"//a/b/c:goodbye_test(//toolchain)\", \"output_file\": \"goodbye.out\", \"name\": \"fuchsia-pkg://fuchsia.com/goodbye\", \"result\": \"PASS\"}]}@@@",
-      "@@@STEP_LOG_END@summary.json@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "upload QEMU test results.ensure gsutil",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "cipd",
-      "ensure",
-      "-root",
-      "[START_DIR]/cipd/gsutil",
-      "-ensure-file",
-      "infra/gsutil version:4.41",
-      "-json-output",
-      "/path/to/tmp/json"
-    ],
-    "infra_step": true,
-    "name": "upload QEMU test results.ensure gsutil.ensure_installed",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-version:4.41----\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/gsutil\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }@@@",
-      "@@@STEP_LOG_LINE@json.output@    ]@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-vpython-spec",
-      "RECIPE_MODULE[fuchsia::gsutil]/resources/gsutil.vpython",
-      "-u",
-      "[START_DIR]/cipd/gsutil/gsutil",
-      "-o",
-      "GSUtil:software_update_check_period=0",
-      "-m",
-      "rsync",
-      "-r",
-      "[CLEANUP]/swarming_tmp_4/0",
-      "gs://fuchsia_infra/builds/8945511751514863184/QEMU"
-    ],
-    "infra_step": true,
-    "name": "upload QEMU test results.upload QEMU to fuchsia_infra",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LINK@QEMU@https://console.cloud.google.com/storage/browser/fuchsia_infra/builds/8945511751514863184/QEMU@@@"
-    ]
-  },
-  {
-    "cmd": [],
-    "name": "check log QEMU:serial.txt"
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/swarming_tmp_4/0/serial.txt",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "check log QEMU:serial.txt.read serial.txt",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@serial.txt@extra log contents@@@",
-      "@@@STEP_LOG_END@serial.txt@@@"
-    ]
-  },
-  {
-    "name": "$result"
-  }
-]
\ No newline at end of file
diff --git a/recipe_modules/testing/examples/full.py b/recipe_modules/testing/examples/full.py
index 4a1e236..9177d84 100644
--- a/recipe_modules/testing/examples/full.py
+++ b/recipe_modules/testing/examples/full.py
@@ -13,6 +13,7 @@
     'fuchsia/experimental',
     'fuchsia/fuchsia',
     'fuchsia/testing',
+    'fuchsia/testing_requests',
     'fuchsia/testsharder',
     'recipe_engine/buildbucket',
     'recipe_engine/isolated',
@@ -116,7 +117,7 @@
   )
 
   if test_in_shards:
-    shard_requests = api.testing.shard_requests(
+    shard_requests = api.testing_requests.shard_requests(
         build_artifacts,
         api.buildbucket.build,
         spec.test.per_test_timeout_secs,
@@ -135,9 +136,9 @@
         orchestration_inputs=orchestration_inputs,
         max_attempts=spec.test.max_attempts)
   else:
-    shard_requests = api.testing.deprecated_shard_requests(
+    shard_requests = api.testing_requests.deprecated_shard_requests(
         build_artifacts,
-        api.testing.deprecated_test_cmds(spec),
+        api.testing_requests.deprecated_test_cmds(test_spec),
         test_spec.device_type,
         test_spec.pool,
         test_spec.timeout_secs,
@@ -197,14 +198,6 @@
 
   # Test cases for running Fuchsia tests as a swarming task.
   yield api.testing.test(
-      'isolated_tests_x64_with_secrets',
-      properties={
-          'requires_secrets': True,
-          'per_test_timeout_secs': 1,
-      },
-  )
-
-  yield api.testing.test(
       'isolated_tests_no_json',
       status='failure',
       # Test a missing summary.json file. Clear the default steps and manage
@@ -216,15 +209,9 @@
               api.swarming.task_result(
                   id='1', name='test', outputs=['out.tar']),
           ]),
-          api.testing.args_test_data(),
+          api.testing_requests.args_test_data(),
       ])
   yield api.testing.test(
-      'isolated_tests_device',
-      properties={
-          'device_type': 'Intel NUC Kit NUC6i3SYK',
-      },
-  )
-  yield api.testing.test(
       'isolated_test_device_no_pave',
       properties={
           'device_type': 'Intel NUC Kit NUC6i3SYK',
@@ -232,15 +219,6 @@
       },
   )
   yield api.testing.test(
-      'isolated_tests_device_arm64',
-      properties={
-          'device_type': 'Khadas Vim2 Max',
-      },
-      steps=[
-          api.testing.args_test_data('arm64'),
-      ],
-  )
-  yield api.testing.test(
       'isolated_tests_test_failure',
       expect_failure=True,  # Failure steps injected below.
       steps=[
@@ -267,6 +245,7 @@
           api.step_data('run tests.attempt 1.task results.symbolize logs',
                         api.raw_io.stream_output('bt1\nbt2\n')),
       ])
+  # TODO(garymm): Remove retries to simplify this test.
   yield api.testing.test(
       'isolated_tests_no_resource',
       status='infra_failure',
@@ -321,52 +300,6 @@
           ),
       ],
   )
-  yield api.testing.test(
-      'retry_after_failure',
-      steps=[
-          api.testing.task_step_data(
-              [
-                  api.swarming.task_result(
-                      id='2',
-                      name='test',
-                      outputs=['out.tar'],
-                  ),
-              ],
-              iteration=1,
-          ),
-          api.testing.tests_json_data(iteration=1),
-          api.testing.test_step_data(failure=True, iteration=0),
-          api.testing.test_step_data(failure=False, iteration=1),
-      ])
-  yield api.testing.test(
-      'retry_after_timeout',
-      steps=[
-          api.testing.task_step_data(
-              [
-                  api.swarming.task_result(
-                      id='1',
-                      name='test',
-                      state=api.swarming.TaskState.TIMED_OUT,
-                      outputs=[],
-                  ),
-              ],
-              iteration=0,
-          ),
-          api.testing.task_step_data(
-              [
-                  api.swarming.task_result(
-                      id='2',
-                      name='test',
-                      outputs=['out.tar'],
-                  ),
-              ],
-              iteration=1,
-          ),
-          api.testing.tests_json_data(iteration=1),
-          api.testing.test_step_data(failure=False, iteration=1),
-      ],
-      clear_default_steps=True,
-  )
   # Test case for generating test coverage
   yield api.testing.test(
       'upload_test_coverage',
@@ -374,12 +307,13 @@
           'gcs_bucket': 'fuchsia-build',
       },
       steps=[
-          api.testing.args_test_data('x64', ['profile']),
+          api.testing_requests.args_test_data('x64', ['profile']),
       ])
   # Test case for ASan.
   yield api.testing.test(
-      'asan_tests', steps=[
-          api.testing.args_test_data('x64', ['asan']),
+      'asan_tests',
+      steps=[
+          api.testing_requests.args_test_data('x64', ['asan']),
       ])
 
   # Test cases for testing in shards.
@@ -405,12 +339,13 @@
     step_data += api.testing.task_retry_step_data(results, iteration=iteration)
     return step_data
 
+  # TODO(garymm): Remove retries to simplify this test.
   yield api.testing.test(
       'sharded_kernel_panic',
       expect_failure=True,  # Failure step injected below.
       properties={'test_in_shards': True},
       steps=[
-          api.testing.shards_step_data(shards=[
+          api.testing_requests.shards_step_data(shards=[
               api.testsharder.shard(
                   name='Vim2',
                   tests=[
@@ -446,12 +381,13 @@
       ],
   )
 
+  # TODO(garymm): Remove retries to simplify this test.
   yield api.testing.test(
       'sharded_failure_string',
       expect_failure=True,  # Failure step injected below.
       properties={'test_in_shards': True},
       steps=[
-          api.testing.shards_step_data(shards=[
+          api.testing_requests.shards_step_data(shards=[
               api.testsharder.shard(
                   name='Vim2',
                   tests=[
@@ -506,59 +442,6 @@
           'test_in_shards': True,
       }))
   yield (api.testing.test(
-      'test_with_shards_arm64',
-      clear_default_steps=True,
-      properties={
-          'test_in_shards': True,
-      },
-      steps=[
-          api.testing.shards_step_data(shards=[
-              api.testsharder.shard(
-                  name='Vim2',
-                  tests=[
-                      api.testsharder.test(
-                          name='test',
-                          label='//path/to/test:test(//toolchain)',
-                          os='linux',
-                          path='/path/to/test',
-                      )
-                  ],
-                  dimensions=dict(device_type='Khadas Vim2 Max'),
-                  service_account='my-service-account@example.com',
-                  netboot=True,
-              ),
-          ]),
-          test_task_data('Vim2'),
-          api.testing.args_test_data('arm64'),
-      ]))
-  yield (api.testing.test(
-      'test_with_shards_arm64_with_runtests',
-      clear_default_steps=True,
-      properties={
-          'test_in_shards': True,
-          'use_runtests': True,
-      },
-      steps=[
-          api.testing.shards_step_data(shards=[
-              api.testsharder.shard(
-                  name='Vim2',
-                  tests=[
-                      api.testsharder.test(
-                          name='test',
-                          label='//path/to/test:test(//toolchain)',
-                          os='linux',
-                          path='/path/to/test',
-                      )
-                  ],
-                  dimensions=dict(device_type='Khadas Vim2 Max'),
-                  service_account='my-service-account@example.com',
-                  netboot=True,
-              ),
-          ]),
-          test_task_data('Vim2'),
-          api.testing.args_test_data('arm64'),
-      ]))
-  yield (api.testing.test(
       'test_with_shards_arm64_serial_failure',
       status='failure',
       clear_default_steps=True,
@@ -566,7 +449,7 @@
           'test_in_shards': True,
       },
       steps=[
-          api.testing.shards_step_data(shards=[
+          api.testing_requests.shards_step_data(shards=[
               api.testsharder.shard(
                   name='Vim2',
                   tests=[
@@ -581,35 +464,10 @@
               ),
           ]),
           test_task_data('Vim2'),
-          api.testing.args_test_data('arm64'),
+          api.testing_requests.args_test_data('arm64'),
           api.step_data('check log Vim2:serial.txt.read serial.txt',
                         api.raw_io.output_text('...DEVICE SUSPEND TIMED OUT\n'))
       ]))
-  yield api.testing.test(
-      'test_with_Linux_shard',
-      clear_default_steps=True,
-      properties={
-          'test_in_shards': True,
-      },
-      steps=[
-          api.testing.shards_step_data(shards=[
-              api.testsharder.shard(
-                  name='Linux',
-                  tests=[
-                      api.testsharder.test(
-                          name='test',
-                          label='//path/to/test:test(//toolchain)',
-                          os='linux',
-                          path='/path/to/test',
-                          deps=['/path/to/dep'],
-                      )
-                  ],
-                  dimensions=dict(os='Linux'),
-              ),
-          ]),
-          test_task_data('Linux'),
-          api.testing.args_test_data(),
-      ])
 
   # fuchsia-0000 passes the first time.
   # fuchsia-0001 has tests that always fail.
@@ -625,10 +483,10 @@
           'per_test_timeout_secs': 1,
       },
       steps=[
-          api.testing.shards_step_data(shards=[
+          api.testing_requests.shards_step_data(shards=[
               api.testsharder.shard(
                   name='fuchsia-0000',
-                  tests=api.testing.default_tests(),
+                  tests=api.testing_requests.default_tests(),
                   dimensions=dict(device_type='QEMU'),
               ),
               api.testsharder.shard(
@@ -645,7 +503,7 @@
               ),
               api.testsharder.shard(
                   name='fuchsia-0002',
-                  tests=api.testing.default_tests(),
+                  tests=api.testing_requests.default_tests(),
                   dimensions=dict(device_type='QEMU'),
               ),
               api.testsharder.shard(
@@ -712,7 +570,7 @@
               shard_name='fuchsia-0003', qemu=False, failure=True, iteration=0),
           api.testing.test_step_data(
               shard_name='fuchsia-0003', qemu=False, iteration=1),
-          api.testing.args_test_data(),
+          api.testing_requests.args_test_data(),
       ])  # yapf: disable
 
   yield api.testing.test(
@@ -724,10 +582,10 @@
           'per_test_timeout_secs': 1,
       },
       steps=[
-          api.testing.shards_step_data(shards=[
+          api.testing_requests.shards_step_data(shards=[
               api.testsharder.shard(
                   name='multiplied:fuchsia-0000',
-                  tests=api.testing.default_tests(),
+                  tests=api.testing_requests.default_tests(),
                   dimensions=dict(device_type='QEMU'),
               ),
           ]),
@@ -740,9 +598,11 @@
           ], iteration=0),
           api.testing.test_step_data(
               shard_name='multiplied:fuchsia-0000', failure=True, iteration=0),
-          api.testing.args_test_data(),
+          api.testing_requests.args_test_data(),
       ])  # yapf: disable
 
+  # TODO(garymm): combine this with another test. Just set collect_timeout_secs on some
+  # other test's properties to get the same coverage.
   yield api.testing.test(
       'fail_then_timeout',
       status='failure',
@@ -752,10 +612,10 @@
           'collect_timeout_secs': 2,
       },
       steps=[
-          api.testing.shards_step_data(shards=[
+          api.testing_requests.shards_step_data(shards=[
               api.testsharder.shard(
                   name='fuchsia-0000',
-                  tests=api.testing.default_tests(),
+                  tests=api.testing_requests.default_tests(),
                   dimensions=dict(device_type='QEMU'),
               ),
           ]),
@@ -776,67 +636,10 @@
           ], iteration=1),
           api.testing.test_step_data(
               shard_name='fuchsia-0000', iteration=0, failure=True),
-          api.testing.args_test_data(),
+          api.testing_requests.args_test_data(),
       ])  # yapf: disable
 
-  yield (api.testing.test(
-      'without_experiment_ssh_into_qemu',
-      clear_default_steps=True,
-      properties={
-          'experimental.ssh_into_qemu': False,
-          'per_test_timeout_secs': 1,
-          'test_in_shards': True,
-      },
-      steps=[
-          api.testing.shards_step_data(shards=[
-              api.testsharder.shard(
-                  name='QEMU',
-                  tests=api.testing.default_tests(),
-                  dimensions=dict(device_type='QEMU'),
-              ),
-          ]),
-          test_task_data('QEMU'),
-          api.testing.args_test_data('x64'),
-      ]))
-
-  yield (api.testing.test(
-      'without_experiment_ssh_into_aemu',
-      clear_default_steps=True,
-      properties={
-          'experimental.ssh_into_qemu': False,
-          'per_test_timeout_secs': 1,
-          'test_in_shards': True,
-      },
-      steps=[
-          api.testing.shards_step_data(shards=[
-              api.testsharder.shard(
-                  name='AEMU',
-                  tests=api.testing.default_tests(),
-                  dimensions=dict(device_type='AEMU'),
-              ),
-          ]),
-          test_task_data('AEMU'),
-          api.testing.args_test_data('x64'),
-      ]))
-
-  yield (api.testing.test(
-      'aemu',
-      clear_default_steps=True,
-      properties={
-          'test_in_shards': True,
-      },
-      steps=[
-          api.testing.shards_step_data(shards=[
-              api.testsharder.shard(
-                  name='AEMU',
-                  tests=api.testing.default_tests(),
-                  dimensions=dict(device_type='AEMU'),
-              ),
-          ]),
-          test_task_data('AEMU'),
-          api.testing.args_test_data('x64'),
-      ]))
-
+  # TODO(garymm): combine this with another test.
   yield (api.testing.test(
       'upload_to_catapult',
       clear_default_steps=True,
@@ -845,36 +648,18 @@
           'upload_to_catapult': True,
       },
       steps=[
-          api.testing.shards_step_data(shards=[
+          api.testing_requests.shards_step_data(shards=[
               api.testsharder.shard(
                   name='QEMU',
-                  tests=api.testing.default_tests(),
+                  tests=api.testing_requests.default_tests(),
                   dimensions=dict(device_type='QEMU'),
               ),
           ]),
           test_task_data('QEMU'),
-          api.testing.args_test_data('arm64'),
+          api.testing_requests.args_test_data('arm64'),
       ]))
 
   yield api.testing.test(
-      'set_test_task_env_vars',
-      clear_default_steps=True,
-      properties={
-          'test_in_shards': True,
-      },
-      steps=[
-          api.testing.shards_step_data(shards=[
-              api.testsharder.shard(
-                  name='Vim2',
-                  tests=api.testing.default_tests(),
-                  dimensions=dict(device_type='Khadas Vim2 Max'),
-              ),
-          ]),
-          test_task_data('Vim2'),
-          api.testing.args_test_data('arm64'),
-      ])
-
-  yield api.testing.test(
       'async',
       # TODO(garymm): remove requires_secrets.
       # It's only here to minimize diffs during an unrelated change.
diff --git a/recipe_modules/testing/test_api.py b/recipe_modules/testing/test_api.py
index 12c7591..3098d83 100644
--- a/recipe_modules/testing/test_api.py
+++ b/recipe_modules/testing/test_api.py
@@ -50,11 +50,8 @@
     if not clear_default_steps:
       # Don't add these if the test is expected to raise an exception;
       # the recipes engine will complain that these steps aren't consumed.
-      requires_secrets = properties.get('requires_secrets', False)
       on_device = properties.get('device_type', 'QEMU') != 'QEMU'
 
-      if requires_secrets:
-        extra_steps.extend(self.secrets_step_data())
       if not expect_failure:
         outputs = ['out.tar', 'serial.txt'] if on_device else ['output.fs']
         task_result = self.m.swarming.task_result(
@@ -65,7 +62,7 @@
             self.task_step_data([task_result], enable_retries=enable_retries))
         extra_steps.append(self.tests_json_data(enable_retries=enable_retries))
         extra_steps.append(self.test_step_data(enable_retries=enable_retries))
-      extra_steps.append(self.args_test_data())
+      extra_steps.append(self.m.testing_requests.args_test_data())
 
     # Assemble the return value.
     if status is None:
@@ -74,12 +71,11 @@
         status = 'failure'
     ret = self.m.status_check.test(name, status=status)
 
+    ret += self.m.properties(**properties)
     git_repo = 'https://fuchsia.googlesource.com/fuchsia'
     if tryjob:
-      ret += self.m.properties.tryserver(**properties)
       ret += self.m.buildbucket.try_build(project='fuchsia', git_repo=git_repo)
     else:
-      ret += self.m.properties(**properties)
       ret += self.m.buildbucket.ci_build(project='fuchsia', git_repo=git_repo)
 
     for s in extra_steps:
@@ -89,34 +85,6 @@
       ret += s
     return ret
 
-  def args_test_data(self, target='x64', variants=None):
-    args = self.m.json.output({
-        'board': 'boards/x64.gni',
-        'build_type': 'release',
-        'product': 'products/core.gni',
-        'target': target,
-        'variants': variants if variants else [],
-    })
-    return self.step_data('download build artifacts.read args.json', args)
-
-  def shards_step_data(self,
-                       shards,
-                       step_name='download build artifacts.load test shards'):
-    """Returns mock step data for test shards.
-
-    This should be used by any test which calls api.fuchsia.test*() and expects
-    to shard tests.
-
-    Args:
-      shards (seq[api.testsharder.Shard]): A set of example shards which should
-        be used as step data for the result of invoking the testsharder.
-      step_name (str): name to use for step data
-
-    Returns:
-      RecipeTestApi.step_data for the extract_results step.
-    """
-    return self.m.testsharder.execute(step_name=step_name, shards=shards)
-
   def task_requests_step_data(self, task_requests, step_name):
     """Returns mock step data for swarming task requests.
 
@@ -192,39 +160,6 @@
 
   # pylint: enable=unused-argument
 
-  def _example_tests_json(self):
-    return [
-        {
-            'test': {
-                'name': 'hello',
-                'label': '//a/b/c:hello_test(//toolchain)',
-                'os': 'fuchsia',
-                'path': '/path/to/hello',
-                'package_url': 'fuchsia-pkg://fuchsia.com/hello',
-            }
-        },
-        {
-            'test': {
-                'name': 'goodbye',
-                'label': '//a/b/c:goodbye_test(//toolchain)',
-                'os': 'fuchsia',
-                'path': '/path/to/goodbye',
-                'package_url': 'fuchsia-pkg://fuchsia.com/goodbye',
-            }
-        },
-    ]
-
-  def default_tests(self):
-    """Returns mock step data for the output of testsharder.
-
-    Returns:
-      list(testsharder.Test)
-    """
-    return [
-        self.m.testsharder.test(**t['test'])
-        for t in self._example_tests_json()
-    ]
-
   def test_step_data(
       self,
       failure=False,
@@ -244,7 +179,7 @@
       shard_name (str): name of the shard for step name
       iteration (int): iteration of launch/collect step for step name
       tests_json (seq(dict)): The tests.json to mock. Defaults to
-        `self._example_tests_json()`.
+        `testing_requests.EXAMPLE_TESTS_JSON`.
       qemu (bool): Whether the tests are being run on QEMU.
 
     Returns:
@@ -266,7 +201,7 @@
     }
     summary_tests = []
     if tests_json is None:
-      tests_json = self._example_tests_json()
+      tests_json = self.m.testing_requests.EXAMPLE_TESTS_JSON
     for item in tests_json:
       test = item['test']
       name = test['name']
@@ -303,34 +238,5 @@
     if enable_retries:
       step_name = 'run tests.attempt %d.%s' % (iteration, step_name)
     if tests is None:
-      tests = self._example_tests_json()
+      tests = self.m.testing_requests.EXAMPLE_TESTS_JSON
     return self.step_data(step_name, self.m.file.read_json(tests))
-
-  def secrets_step_data(self):
-    """Returns mock step data for the secrets pipeline.
-
-    This should be used by any test which calls api.fuchsia.test() with
-    requires_secrets is set to True.
-
-    Returns:
-      list(RecipeTestApi.step_data) for the steps around secrets decryption.
-    """
-    step_data = []
-    secret_name = 'auth-token'
-    step_data.append(
-        self.step_data(
-            'process secret specs.list',
-            self.m.file.listdir([
-                '%s.json' % secret_name,
-                'ciphertext'  # the 'ciphertext' subdir, which will be skipped.
-            ])))
-    step_data.append(
-        self.step_data('process secret specs.read spec for %s' % secret_name,
-                       self.m.json.output({
-                           'cloudkms_key_path': 'key-path',
-                       })))
-    step_data.append(
-        self.step_data(
-            'process secret specs.decrypt secret for %s' % secret_name,
-            self.m.raw_io.output_text('plaintext')))
-    return step_data
diff --git a/recipe_modules/testing_requests/__init__.py b/recipe_modules/testing_requests/__init__.py
new file mode 100644
index 0000000..e2ab3e4
--- /dev/null
+++ b/recipe_modules/testing_requests/__init__.py
@@ -0,0 +1,23 @@
+# Copyright 2019 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+DEPS = [
+    'fuchsia/artifacts',
+    'fuchsia/build',
+    'fuchsia/cloudkms',
+    'fuchsia/emu',
+    'fuchsia/experimental',
+    'fuchsia/minfs',
+    'fuchsia/testsharder',
+    'fuchsia/zbi',
+    'recipe_engine/buildbucket',
+    'recipe_engine/cipd',
+    'recipe_engine/file',
+    'recipe_engine/isolated',
+    'recipe_engine/json',
+    'recipe_engine/path',
+    'recipe_engine/raw_io',
+    'recipe_engine/step',
+    'recipe_engine/swarming',
+]
diff --git a/recipe_modules/testing_requests/api.py b/recipe_modules/testing_requests/api.py
new file mode 100644
index 0000000..f4bd8f0
--- /dev/null
+++ b/recipe_modules/testing_requests/api.py
@@ -0,0 +1,854 @@
+# Copyright 2019 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import copy
+
+from recipe_engine import recipe_api
+
+# System path at which authorized SSH keys are stored.
+AUTHORIZED_KEY_PATH = 'data/ssh/authorized_keys'
+# The path to the botanist config on the host.
+BOTANIST_DEVICE_CONFIG = '/etc/botanist/config.json'
+# The log level to use for botanist invocations in test tasks. Can be one of
+# "fatal", "error", "warning", "info", "debug", or "trace", where "trace" is
+# the most verbose, and fatal is the least.
+BOTANIST_LOG_LEVEL = 'debug'
+# Name of image manifest produced by the build.
+IMAGES_JSON = 'images.json'
+# The path in the BootFS manifest that we want runcmds to show up at.
+RUNCMDS_BOOTFS_PATH = 'infra/runcmds'
+
+SECRETSHIM_CIPD_VERSION = 'git_revision:63ab3ac613fceb52ac49b63b43fce841a2585645'
+STORAGE_FULL = 'storage-full'
+
+# The PCI address to use for the block device to contain test results.
+TEST_FS_PCI_ADDR = '06.0'
+
+
+class _TaskRequester(object):
+  """Creates requests for swarming tasks that run tests."""
+
+  def __init__(self, api, buildbucket_build, per_test_timeout_secs, pool,
+               swarming_expiration_timeout_secs, swarming_io_timeout_secs,
+               timeout_secs, use_runtests):
+    self._api = api
+    self._buildbucket_build = buildbucket_build
+    self._per_test_timeout_secs = per_test_timeout_secs
+    self._pool = pool
+    self._swarming_expiration_timeout_secs = swarming_expiration_timeout_secs
+    self._swarming_io_timeout_secs = swarming_io_timeout_secs
+    self._timeout_secs = timeout_secs
+    self._use_runtests = use_runtests
+
+  def request(self, shard, build_artifacts):
+    # Copy the build_artifacts object to be modified for each shard.
+    build_artifacts = copy.deepcopy(build_artifacts)
+
+    if self._api.testing_requests._uses_legacy_qemu(shard):
+      task_request = self._api.testing_requests._construct_legacy_qemu_task_request(
+          task_name=shard.name,
+          pool=self._pool,
+          build_artifacts=build_artifacts,
+          timeout_secs=self._timeout_secs,
+          swarming_io_timeout_secs=self._swarming_io_timeout_secs,
+          swarming_expiration_timeout_secs=(
+              self._swarming_expiration_timeout_secs),
+          # secret_bytes is only supported in the deprecated testing code path.
+          secret_bytes='',
+          qemu_type=shard.device_type,
+          shard=shard,
+      )
+    else:
+      task_request = self._construct_test_task_request(
+          build_artifacts=build_artifacts, shard=shard)
+
+    return self._api.build.ShardTaskRequest(shard, task_request)
+
+  def _construct_test_task_request(self, build_artifacts, shard):
+    """Constructs a Swarming task request to run a shard of Fuchsia tests.
+
+    Args:
+      build_artifacts (BuildArtifacts): The Fuchsia build artifacts to test.
+      shard (api.testsharder.Shard): A shard of tests.
+      timeout_secs (int): The amount of seconds to wait for the tests to execute
+        before giving up.
+
+    Returns:
+      An api.swarming.TaskRequest representing the swarming task request.
+    """
+    # To freely archive files from the build directory, the source, and those we
+    # dynamically create, we create a tree of symlinks in a fresh directory and
+    # isolate that. This solves the problems of (a) finding a root directory
+    # that works for all artifacts, (b) being able to create files in that
+    # directory without fear of collision, and (c) not having to isolate
+    # extraneous files.
+    isolate_tree = self._api.file.symlink_tree(
+        root=self._api.path.mkdtemp('isolate'))
+
+    test_manifest = 'tests.json'
+    self._api.file.write_json(
+        'write test manifest',
+        isolate_tree.root.join(test_manifest),
+        [test.render_to_jsonish() for test in shard.tests],
+        indent=2)
+
+    cmd = []
+    outputs = []
+    ensure_file = self._api.cipd.EnsureFile()
+    dimensions = {'pool': self._pool}
+    test_bot_cpu = 'x64'
+    is_emu_type = self._api.emu.is_emulator_type(shard.device_type)
+
+    # This command spins up a metadata server that allows its subcommands to
+    # automagically authenticate with LUCI auth, provided the sub-exec'ed tool
+    # was written in go or dart and respectively makes use of the standard
+    # cloud.google.com/go/compute/metadata or
+    # github.com/dart-lang/googleapis_auth authentication libraries. Such
+    # libraries look for a metadata server under environment variables
+    # like $GCE_METADATA_HOST, which LUCI emulates.
+    if shard.service_account:
+      # TODO(fxbug.dev/37142): Find a way to use the version that LUCI is
+      # currently using, instead of 'latest'.
+      ensure_file.add_package('infra/tools/luci-auth/${platform}', 'latest')
+      cmd.extend(['./luci-auth', 'context', '--'])
+
+    if is_emu_type:
+      dimensions.update(os='Debian', cpu=build_artifacts.target, kvm='1')
+      # To take advantage of KVM, we execute QEMU-arm tasks on arm hardware.
+      test_bot_cpu = build_artifacts.target
+    else:
+      dimensions.update(shard.dimensions)
+
+    if shard.targets_fuchsia:
+      botanist_cmd = [
+          './botanist',
+          '-level', BOTANIST_LOG_LEVEL,
+          'run',
+          '-images', IMAGES_JSON,
+          '-timeout', '%ds' % self._timeout_secs,
+          '-syslog', self._api.testing_requests.SYSLOG_NAME,
+          '-serial-log', self._api.testing_requests.SERIAL_LOG_NAME,
+      ] # yapf: disable
+      outputs.append(self._api.testing_requests.SYSLOG_NAME)
+      outputs.append(self._api.testing_requests.SERIAL_LOG_NAME)
+
+      # TODO(fxbug.dev/40840): Once we can scope the proxy server to a
+      # an individual task, we can make free use of it in the emulator case.
+      if not is_emu_type:
+        botanist_cmd.extend([
+          # For container networking and authentication reasons, we access GCS
+          # via a proxy server running on the controller.
+          '-repo', self._api.artifacts.package_repo_url(host='$GCS_PROXY_HOST'),
+          '-blobs', self._api.artifacts.package_blob_url(host='$GCS_PROXY_HOST'),
+        ]) # yapf: disable
+
+      config = BOTANIST_DEVICE_CONFIG
+      if self._api.emu.is_emulator_type(shard.device_type):
+        config = './qemu.json'
+        botanist_cmd.extend(
+            ['-ssh', build_artifacts.DEFAULT_ISOLATED_LAYOUT.private_key])
+        qemu_config = [{
+            'type': shard.device_type.lower(),
+            'path': './%s/bin' % shard.device_type.lower(),
+            'target': build_artifacts.target,
+            'cpu': 8,
+            'memory': 8192,
+            'kvm': True,
+        }]
+
+        if shard.device_type == 'AEMU':
+          self._api.emu.add_aemu_to_ensure_file(ensure_file, subdir='aemu/bin')
+        elif shard.device_type == 'QEMU':
+          self._api.emu.add_qemu_to_ensure_file(ensure_file, subdir='qemu')
+
+        self._api.file.write_json(
+            'write qemu config',
+            isolate_tree.root.join('qemu.json'),
+            qemu_config,
+            indent=2)
+      elif shard.netboot:
+        botanist_cmd.append('-netboot')
+
+      botanist_cmd.extend(['-config', config])
+
+      cmd.extend(botanist_cmd)
+
+    cmd.extend([
+        './testrunner',
+        '-archive',
+        self._api.testing_requests.TEST_RESULTS_ARCHIVE_NAME,
+    ])
+    if self._use_runtests:
+      cmd.append('-use-runtests')
+    if self._per_test_timeout_secs:
+      cmd.extend(['-per-test-timeout', '%ds' % self._per_test_timeout_secs])
+    cmd.append(test_manifest)
+
+    outputs.append(self._api.testing_requests.TEST_RESULTS_ARCHIVE_NAME)
+
+    isolated_hash = self._api.testing_requests._isolate_build_artifacts(
+        isolate_tree, build_artifacts, shard=shard, test_bot_cpu=test_bot_cpu)
+
+    env_name = '%s-%s' % (shard.device_type or shard.os, build_artifacts.target)
+    tags = {'test_environment_name': [env_name]}
+
+    request = (self._api.swarming.task_request().
+        with_name(shard.name).
+        with_service_account(shard.service_account).
+        with_tags(tags)
+    ) #yapf: disable
+    return request.with_slice(0, request[0].
+      with_command(cmd).
+      with_isolated(isolated_hash).
+      with_dimensions(**dimensions).
+      with_expiration_secs(self._swarming_expiration_timeout_secs).
+      with_io_timeout_secs(self._swarming_io_timeout_secs).
+      with_execution_timeout_secs(self._timeout_secs).
+      with_outputs(outputs).
+      with_cipd_ensure_file(ensure_file).
+      with_env_vars(**self._test_task_env_vars(shard, build_artifacts))
+    ) #yapf: disable
+
+  def _test_task_env_vars(self, shard, build_artifacts):
+    """Returns the environment variables to be set for the test task.
+
+    Returns:
+      A dict mapping string env var names to string values.
+    """
+    build = self._buildbucket_build
+    commit = build.input.gitiles_commit
+    llvm_symbolizer = self._api.path.basename(build_artifacts.llvm_symbolizer)
+    env_vars = dict(
+        # `${ISOLATED_OUTDIR}` is a magic string that Swarming will replace
+        # with a temporary directory into which files will be automatically
+        # collected upon exit of a task.
+        FUCHSIA_TEST_OUTDIR='${ISOLATED_OUTDIR}',
+        BUILDBUCKET_ID=str(build.id),
+        BUILD_BOARD=build_artifacts.board,
+        BUILD_TYPE=build_artifacts.build_type,
+        BUILD_PRODUCT=build_artifacts.product,
+        BUILD_TARGET=build_artifacts.target,
+        BUILDBUCKET_BUCKET=build.builder.bucket,
+
+        # Used for symbolization:
+        ASAN_SYMBOLIZER_PATH=llvm_symbolizer,
+        UBSAN_SYMBOLIZER_PATH=llvm_symbolizer,
+        LSAN_SYMBOLIZER_PATH=llvm_symbolizer,
+
+        # Used by the catapult converter
+        BUILD_CREATE_TIME=str(build.create_time.seconds),
+        BUILDER_NAME=build.builder.builder,
+        FUCHSIA_DEVICE_TYPE=shard.device_type,
+        INPUT_COMMIT_HOST=commit.host,
+        INPUT_COMMIT_PROJECT=commit.project,
+        INPUT_COMMIT_REF=commit.ref,
+    )
+    # For some reason, empty string environment variables sent to the swarming
+    # API get interpreted as null and rejected. So don't bother sending them to
+    # avoid breaking the task request.
+    # TODO(olivernewman): Figure out whether this logic should be moved into
+    # the upstream swarming module (or obviated by fixing the "" -> null
+    # behavior).
+    return {k: v for k, v in env_vars.iteritems() if v}
+
+
+class TestingRequestsApi(recipe_api.RecipeApi):
+  """APIs for constructing Swarming task requests to test Fuchsia."""
+
+  SERIAL_LOG_NAME = 'serial.txt'
+  SYSLOG_NAME = 'syslog.txt'
+  TEST_RESULTS_ARCHIVE_NAME = 'out.tar'
+  TEST_RESULTS_MINFS_NAME = 'output.fs'
+
+  def shard_requests(
+      self,
+      build_artifacts,
+      buildbucket_build,
+      per_test_timeout_secs,
+      pool,
+      swarming_expiration_timeout_secs,
+      swarming_io_timeout_secs,
+      use_runtests,
+      # TODO(garymm): Remove default value.
+      # We should always get this from a spec.
+      timeout_secs=40 * 60):
+    """Returns a _ShardTaskRequest for each shard in build_artifact.shards.
+
+    Args:
+      build_artifacts (BuildArtifacts): The Fuchsia build artifacts to test.
+      buildbucket_build (build_pb2.Build): The buildbucket build that is going
+        to orchestrate testing.
+      per_test_timeout_secs (int): Any test that executes for longer than this
+        will be considered failed.
+      pool (str): The Swarming pool to schedule test tasks in.
+      use_runtests (bool): Whether to use runtests (or else run_test_component)
+        when executing tests on target.
+      timeout_secs (int): The amount of seconds to wait for the tests to execute
+        before giving up.
+    """
+
+    self.m.minfs.minfs_path = build_artifacts.minfs
+    self.m.zbi.zbi_path = build_artifacts.zbi
+    # This modifies the build artifacts so must be done before calling
+    # task_requester.request().
+    self._install_runcmds_files(
+        build_artifacts,
+        test_in_shards=True,
+        per_test_timeout_secs=per_test_timeout_secs,
+        in_place=True)
+    task_requester = _TaskRequester(
+        self.m,
+        buildbucket_build=buildbucket_build,
+        per_test_timeout_secs=per_test_timeout_secs,
+        pool=pool,
+        swarming_expiration_timeout_secs=swarming_expiration_timeout_secs,
+        swarming_io_timeout_secs=swarming_io_timeout_secs,
+        timeout_secs=timeout_secs,
+        use_runtests=use_runtests,
+    )
+    shard_requests = []
+    for s in build_artifacts.shards:
+      with self.m.step.nest('shard %s' % s.name):
+        shard_requests.append(task_requester.request(s, build_artifacts))
+    return shard_requests
+
+  def deprecated_shard_requests(self,
+                                build_artifacts,
+                                test_cmds,
+                                device_type,
+                                pool,
+                                timeout_secs,
+                                pave,
+                                requires_secrets=False,
+                                swarming_expiration_timeout_secs=18000,
+                                swarming_io_timeout_secs=5 * 60):
+    """Returns a swarming task request for testing in the deprecated way.
+
+    Args:
+      build_artifacts (BuildArtifacts): The Fuchsia build artifacts to test.
+      test_cmds (list[str]): Command to have Fuchsia run on boot.
+      pool (str): Swarming pool from which the test task will be drawn.
+      timeout_secs (int): The amount of seconds to wait for the tests to execute
+        before giving up.
+      pave (bool): Whether to pave the image to disk. Ignored if device_type ==
+        'QEMU'.
+      requires_secrets (bool): Whether tests require plaintext secrets; ignored
+        if device_type != 'QEMU'. TODO(41665): Remove secrets support once done.
+      swarming_expiration_timeout_secs (int): Maximum run time for the swarming
+        task, once scheduled (enforced by swarming).
+      swarming_io_timeout_secs (int): The swarming task will be killed if it does
+        not produce any output for this long.
+
+    Returns:
+      A list of a single ShardTaskRequest.
+    """
+    assert test_cmds
+    assert device_type
+
+    self.m.minfs.minfs_path = build_artifacts.minfs
+    self.m.zbi.zbi_path = build_artifacts.zbi
+
+    # Copy build_artifacts because we modify its contents below.
+    build_artifacts = copy.deepcopy(build_artifacts)
+    self._install_runcmds_files(
+        build_artifacts,
+        device_type=device_type,
+        pave=pave,
+        test_cmds=test_cmds,
+    )
+
+    if self.m.emu.is_emulator_type(device_type):
+      secret_bytes = ''
+      if requires_secrets:
+        secret_bytes = self.m.json.dumps(self._decrypt_secrets(build_artifacts))
+      task = self._construct_legacy_qemu_task_request(
+          task_name='all tests',
+          build_artifacts=build_artifacts,
+          pool=pool,
+          timeout_secs=timeout_secs,
+          swarming_expiration_timeout_secs=swarming_expiration_timeout_secs,
+          swarming_io_timeout_secs=swarming_io_timeout_secs,
+          secret_bytes=secret_bytes,
+          qemu_type=device_type,
+      )
+    else:
+      task = self._construct_device_task_request(
+          task_name='all tests',
+          device_type=device_type,
+          build_artifacts=build_artifacts,
+          pool=pool,
+          pave=pave,
+          timeout_secs=timeout_secs,
+          swarming_expiration_timeout_secs=swarming_expiration_timeout_secs,
+          swarming_io_timeout_secs=swarming_io_timeout_secs,
+      )
+    # In the deprecated testing code paths, shards are not used, but it makes
+    # other code simpler to have a valid shard here.
+    dummy_shard = self.m.testsharder.Shard('dummy', (), {})
+    return [self.m.build.ShardTaskRequest(dummy_shard, task)]
+
+  def deprecated_test_cmds(self, test_spec):
+    runtests_cmd_parts = ['runtests', '-o', self.results_dir_on_target]
+    if test_spec.per_test_timeout_secs:
+      runtests_cmd_parts.extend(['-i', '%d' % test_spec.per_test_timeout_secs])
+    runtests_cmd_parts.append(test_spec.runtests_args)
+    return [' '.join(runtests_cmd_parts)]
+
+  @property
+  def results_dir_on_target(self):
+    """The directory on target to which target test results will be written."""
+    return '/tmp/infra-test-output'
+
+  def _decrypt_secrets(self, build_artifacts):
+    """Decrypts the secrets included in the build.
+
+    Args:
+      build (FuchsiaBuildResults): The build for which secret specs were
+        generated.
+
+    Returns:
+      The dictionary that maps secret spec name to the corresponding plaintext.
+    """
+    self.m.cloudkms.ensure()
+
+    secret_spec_dir = build_artifacts.secret_specs
+    secrets_map = {}
+    with self.m.step.nest('process secret specs'):
+      secret_spec_files = self.m.file.listdir('list', secret_spec_dir)
+      for secret_spec_file in secret_spec_files:
+        basename = self.m.path.basename(secret_spec_file)
+        # Skip the 'ciphertext' subdirectory.
+        if basename == 'ciphertext':
+          continue
+
+        secret_name, _ = basename.split('.json', 1)
+        secret_spec = self.m.json.read('read spec for %s' % secret_name,
+                                       secret_spec_file).json.output
+
+        # For each test spec file <name>.json in this directory, there is an
+        # associated ciphertext file at ciphertext/<name>.ciphertext.
+        ciphertext_file = secret_spec_dir.join('ciphertext',
+                                               '%s.ciphertext' % secret_name)
+
+        key_path = secret_spec['cloudkms_key_path']
+        secrets_map[secret_name] = self.m.cloudkms.decrypt(
+            'decrypt secret for %s' % secret_name, key_path, ciphertext_file,
+            self.m.raw_io.output()).raw_io.output
+    return secrets_map
+
+  def _construct_legacy_qemu_task_request(self,
+                                          task_name,
+                                          build_artifacts,
+                                          pool,
+                                          timeout_secs,
+                                          swarming_expiration_timeout_secs,
+                                          swarming_io_timeout_secs,
+                                          secret_bytes,
+                                          qemu_type,
+                                          shard=None):
+    """Constructs a Swarming task request which runs Fuchsia tests inside QEMU.
+
+    Expects the build and artifacts to be at the same place they were at
+    the end of the build.
+
+    Args:
+      build_artifacts (BuildArtifacts): The Fuchsia build artifacts to test.
+      pool (str): Swarming pool from which the test task will be drawn.
+      timeout_secs (int): The amount of seconds to wait for the tests to execute
+        before giving up.
+      secret_bytes (str): secret bytes to pass to the QEMU task.
+      qemu_type (str): type of qemu, either QEMU or AEMU.
+      shard (api.testsharder.Shard|None): The shard associated with the task or
+        None if it's not a shard.
+
+    Returns:
+      An api.swarming.TaskRequest representing the swarming task request.
+    """
+    # To freely archive files from the build directory, the source, and those we
+    # dynamically create, we create a tree of symlinks in a fresh directory and
+    # isolate that. This solves the problems of (a) finding a root directory
+    # that works for all artifacts, (b) being able to create files in that
+    # directory without fear of collision, and (c) not having to isolate
+    # extraneous files.
+    isolate_tree = self.m.file.symlink_tree(root=self.m.path.mkdtemp('isolate'))
+
+    # As part of running tests, we'll send a MinFS image over to another machine
+    # which will be declared as a block device in QEMU, at which point
+    # Fuchsia will mount it and write test output to. We choose 3.5G for the
+    # MinFS image arbitrarily, as it appears it can hold our test output
+    # comfortably without going overboard on size.
+    #
+    minfs_image_path = isolate_tree.root.join(self.TEST_RESULTS_MINFS_NAME)
+    self.m.minfs.create(minfs_image_path, '3584M', name='create test image')
+
+    ensure_file = self.m.cipd.EnsureFile()
+
+    botanist_cmd = [
+      './botanist',
+      '-level', BOTANIST_LOG_LEVEL,
+      'qemu',
+      '-type', '%s' % qemu_type.lower(),
+      '-qemu-dir', './%s/bin' % qemu_type.lower(),
+      '-images', IMAGES_JSON,
+      '-arch', build_artifacts.target,
+      '-minfs', self.TEST_RESULTS_MINFS_NAME,
+      '-pci-addr', TEST_FS_PCI_ADDR,
+      '-use-kvm'
+    ] # yapf: disable
+
+    if secret_bytes:
+      # Wrap botanist command with secretshim which starts the secrets server
+      # before running the following command.
+      botanist_cmd = ['./secretshim'] + botanist_cmd
+      ensure_file.add_package('fuchsia/infra/secretshim/${platform}',
+                              SECRETSHIM_CIPD_VERSION)
+
+    if [v for v in ['asan', 'profile'] if v in build_artifacts.variants]:
+      botanist_cmd.extend([
+          '-cpu',
+          str(8),
+          '-memory',
+          str(8192),
+      ])
+
+    # storage-full not being present signifies the exclusion of the system
+    # partition, which means `boot` (i.e. running on boot) must be used instead
+    # of `system` (i.e., running after the system partition is mounted).
+    storage_free_build = STORAGE_FULL not in build_artifacts.images
+    arg_key = 'zircon.autorun.%s' % ('boot' if storage_free_build else 'system')
+    botanist_cmd.append('%s=/boot/bin/sh+/boot/%s' %
+                        (arg_key, self._get_runcmds_path_per_shard(shard)))
+
+    isolated_hash = self._isolate_build_artifacts(
+        isolate_tree,
+        build_artifacts,
+        # To take advantage of KVM, we execute QEMU-arm tasks on arm hardware.
+        test_bot_cpu=build_artifacts.target,
+        legacy_qemu=True,
+    )
+
+    if qemu_type == 'AEMU':
+      self.m.emu.add_aemu_to_ensure_file(ensure_file, subdir='aemu/bin')
+    elif qemu_type == 'QEMU':
+      self.m.emu.add_qemu_to_ensure_file(ensure_file, subdir='qemu')
+
+    env_name = '%s-%s' % (qemu_type, build_artifacts.target)
+    tags = {
+        # consumed by google3 results uploader
+        'test_environment_name': [env_name],
+        # consumed by this recipe module
+        'uses_legacy_qemu': ['true']
+    }
+    request = self.m.swarming.task_request().with_name(task_name).with_tags(
+        tags)
+    return (request.with_slice(0, request[0].
+      with_command(botanist_cmd).
+      with_isolated(isolated_hash).
+      with_dimensions(pool=pool, os='Debian', cpu=build_artifacts.target, kvm='1').
+      with_io_timeout_secs(swarming_io_timeout_secs).
+      with_execution_timeout_secs(timeout_secs).
+      with_expiration_secs(swarming_expiration_timeout_secs).
+      with_secret_bytes(secret_bytes).
+      with_outputs([self.TEST_RESULTS_MINFS_NAME]).
+      with_cipd_ensure_file(ensure_file)
+    )) #yapf: disable
+
+  def _construct_device_task_request(self, task_name, device_type,
+                                     build_artifacts, pool, pave, timeout_secs,
+                                     swarming_expiration_timeout_secs,
+                                     swarming_io_timeout_secs):
+    """Constructs a Swarming task request to run Fuchsia tests on a device.
+
+    Expects the build and artifacts to be at the same place they were at
+    the end of the build.
+
+    Args:
+      build_artifacts (BuildArtifacts): The Fuchsia build artifacts to test.
+      pool (str): Swarming pool from which the test task will be drawn.
+      pave (bool): Whether or not the build artifacts should be paved.
+      timeout_secs (int): The amount of seconds to wait for the tests to execute
+        before giving up.
+
+    Returns:
+      An api.swarming.TaskRequest representing the swarming task request.
+    """
+    # Construct the botanist command.
+    botanist_cmd = [
+      './botanist',
+      '-level', BOTANIST_LOG_LEVEL,
+      'zedboot',
+      '-config', BOTANIST_DEVICE_CONFIG,
+      '-images', IMAGES_JSON,
+      '-results-dir', self.results_dir_on_target,
+      '-out', self.TEST_RESULTS_ARCHIVE_NAME,
+      '-serial-log', self.SERIAL_LOG_NAME,
+    ] # yapf: disable
+
+    if not pave:
+      botanist_cmd.append('-netboot')
+
+    # storage-full not being present signifies the exclusion of the system
+    # partition, which means `boot` (i.e. running on boot) must be used instead
+    # of `system` (i.e., running after the system partition is mounted).
+    storage_free_build = STORAGE_FULL not in build_artifacts.images
+    arg_key = 'zircon.autorun.%s' % ('boot' if storage_free_build else 'system')
+    botanist_cmd.append('%s=/boot/bin/sh+/boot/%s' %
+                        (arg_key, RUNCMDS_BOOTFS_PATH))
+
+    # To freely archive files from the build directory, the source, and those we
+    # dynamically create, we create a tree of symlinks in a fresh directory and
+    # isolate that. This solves the problems of (a) finding a root directory
+    # that works for all artifacts, (b) being able to create files in that
+    # directory without fear of collision, and (c) not having to isolate
+    # extraneous files.
+    isolate_tree = self.m.file.symlink_tree(root=self.m.path.mkdtemp('isolate'))
+    isolated_hash = self._isolate_build_artifacts(isolate_tree, build_artifacts)
+
+    dimensions = {
+        'pool': pool,
+        'device_type': device_type,
+    }
+
+    env_name = '%s-%s' % (device_type, build_artifacts.target)
+    tags = {'test_environment_name': [env_name]}
+    request = self.m.swarming.task_request().with_name(task_name).with_tags(
+        tags)
+    return (request.with_slice(0, request[0].
+      with_command(botanist_cmd).
+      with_isolated(isolated_hash).
+      with_dimensions(**dimensions).
+      with_expiration_secs(swarming_expiration_timeout_secs).
+      with_io_timeout_secs(swarming_io_timeout_secs).
+      with_execution_timeout_secs(timeout_secs).
+      with_outputs([self.TEST_RESULTS_ARCHIVE_NAME, self.SERIAL_LOG_NAME])
+    )) #yapf: disable
+
+  def _create_runcmds_script(self, device_type, test_cmds, output_path):
+    """Creates a script for running tests on boot."""
+    # The device topological path is the toplogical path to the block device
+    # which will contain test output.
+    device_topological_path = '/dev/sys/pci/00:%s/virtio-block/block' % (
+        TEST_FS_PCI_ADDR)
+
+    # Script that mounts the block device to contain test output and runs tests,
+    # dropping test output into the block device.
+    results_dir = self.results_dir_on_target
+    runcmds = [
+        'mkdir %s' % results_dir,
+    ]
+    if self.m.emu.is_emulator_type(device_type):
+      runcmds.extend([
+          # Wait until the MinFS test image shows up (max <timeout> ms).
+          'waitfor class=block topo=%s timeout=60000' % device_topological_path,
+          'mount %s %s' % (device_topological_path, results_dir),
+      ] + test_cmds + [
+          'umount %s' % results_dir,
+          'dm poweroff',
+      ])
+    else:
+      runcmds.extend(test_cmds)
+    runcmds_bytes = []
+    for line in runcmds:
+      if isinstance(line, unicode):
+        runcmds_bytes.append(line.encode('utf-8'))
+      elif isinstance(line, str):
+        runcmds_bytes.append(line)
+      else:  # pragma: no cover
+        assert False, 'line is not unicode or a str: %s, %s' % (line,
+                                                                type(line))
+    self.m.file.write_text('write runcmds', output_path,
+                           '\n'.join(runcmds_bytes))
+
+  def _isolate_build_artifacts(self,
+                               isolate_tree,
+                               build_artifacts,
+                               shard=None,
+                               test_bot_cpu='x64',
+                               legacy_qemu=False):
+    """Populates a tree with build artifacts and isolates it.
+
+    Specifically, the following is linked into or created within the tree:
+      - The images in the build are linked in and manifest of them is created
+        in the root, if targeting a fuchsia device;
+      - The Linux/Mac tests in the shard and their runtime dependencies.
+
+    Args:
+      isolate_tree (api.file.SymlinkTree): A tree into which artifacts may be
+        linked.
+      build (FuchsiaBuildResults): The result of a fuchsia build.
+      shard (api.testsharder.Shard|None): A test shard.
+      test_bot_cpu (str|None): The host cpu of the bot running the test task.
+      legacy_qemu (bool): Whether to only isolate the images needed to run QEMU
+        alone.
+
+    Returns:
+      The isolated hash that may be used to reference and download the
+      artifacts.
+    """
+
+    def register_link(relpath):
+      """Prepares a symlink of a relative path within the build directory to the tree."""
+      isolate_tree.register_link(
+          target=build_artifacts.fuchsia_build_dir.join(relpath),
+          linkname=isolate_tree.root.join(relpath),
+      )
+
+    # TODO(IN-931): Remove `shard is None` condition once device and QEMU
+    # codepaths are passing shard and using _construct_test_task_request().
+    no_shard = shard is None
+    if no_shard or shard.targets_fuchsia:
+      image_list = build_artifacts.images.values()
+      # In the case of an emulated target, we restrict what we isolate to the
+      # bare essentials to avoid the needless downloading of several gigabytes
+      # of images on the other end.
+      is_emulated_target = (
+            (no_shard and legacy_qemu) or
+            (shard and self.m.emu.is_emulator_type(shard.device_type))
+      ) # yapf: disable
+      if is_emulated_target:
+        image_list = [
+          img for img in image_list
+          if img['name'] in ['qemu-kernel', 'zircon-a', 'storage-full']
+        ] # yapf: disable
+      image_manifest_path = isolate_tree.root.join(IMAGES_JSON)
+      self.m.file.write_json(
+          'write image manifest', image_manifest_path, image_list, indent=2)
+      for image in image_list:
+        register_link(image['path'])
+
+    if shard:
+      for test in shard.tests:
+        if test.os in ['linux', 'mac']:
+          register_link(test.path)
+      for dep in shard.deps:
+        register_link(dep)
+
+    # If targeting QEMU we include a private key corresponding to an authorized
+    # key already in the boot image; this is needed as we do not pave QEMU.
+    if shard and self.m.emu.is_emulator_type(shard.device_type):
+      isolate_tree.register_link(
+          target=build_artifacts.private_key,
+          linkname=isolate_tree.root.join(
+              build_artifacts.DEFAULT_ISOLATED_LAYOUT.private_key,),
+      )
+
+    for tool in [
+        build_artifacts.botanist(test_bot_cpu),
+        build_artifacts.testrunner(test_bot_cpu),
+        build_artifacts.llvm_symbolizer,
+        build_artifacts.bootserver,
+    ]:
+      tool_name = self.m.path.basename(tool)
+      isolate_tree.register_link(
+          target=tool, linkname=isolate_tree.root.join(tool_name))
+
+    isolate_tree.create_links('create tree of build artifacts')
+    isolated = self.m.isolated.isolated(isolate_tree.root)
+    isolated.add_dir(isolate_tree.root)
+    return isolated.archive('isolate build artifacts')
+
+  def _create_test_list(self, shard):
+    test_locations = []
+    for test in shard.tests:
+      test_locations.append(test.path)
+    test_list_path = self.m.path['cleanup'].join('tests-%s' %
+                                                 self._normalize(shard.name))
+    self.m.file.write_text(
+        name='write test list',
+        dest=test_list_path,
+        text_data='\n'.join(test_locations) + '\n',
+    )
+    return test_list_path
+
+  def _normalize(self, name):
+    return name.replace(' ', '_').replace('(', '').replace(')', '')
+
+  def _get_runcmds_path_per_shard(self, shard=None):
+    if not shard:
+      return RUNCMDS_BOOTFS_PATH
+    return '%s-%s' % (RUNCMDS_BOOTFS_PATH, self._normalize(shard.name))
+
+  def _uses_legacy_qemu(self, shard):
+    return (not self.m.experimental.ssh_into_qemu and
+            self.m.emu.is_emulator_type(shard.device_type))
+
+  def _install_runcmds_files(self,
+                             build_artifacts,
+                             test_in_shards=False,
+                             per_test_timeout_secs=None,
+                             device_type=None,
+                             pave=False,
+                             test_cmds=None,
+                             in_place=False):
+    """Creates the files used to invoke runtests on boot.
+
+    This is only necessary for QEMU shards, which are the only shards that
+    use runcmds, and the non-sharding codepath.
+    """
+    self.m.zbi.zbi_path = build_artifacts.zbi
+
+    manifest = {}
+    zbi_name = 'zircon-a'
+    new_zbi_filename = None
+    new_zbi_path = None
+    if test_in_shards:
+      # if testing in shards, zbi file should be modified once for all shards in
+      # place before uploading through artifactory.
+      assert in_place
+      needs_key = False
+      for shard in build_artifacts.shards:
+        if self.m.emu.is_emulator_type(shard.device_type):
+          if self._uses_legacy_qemu(shard):
+            test_list_path = self._create_test_list(shard)
+            runtests_file_bootfs_path = 'infra/shard-%s.run' % self._normalize(
+                shard.name)
+            runcmds_path = self.m.path['cleanup'].join(
+                'runcmds-%s' % self._normalize(shard.name))
+            runtests_cmd_parts = [
+                'runtests', '-o', self.results_dir_on_target, '-f',
+                '/boot/%s' % runtests_file_bootfs_path
+            ]
+            if per_test_timeout_secs:
+              runtests_cmd_parts.extend(['-i', '%d' % per_test_timeout_secs])
+            self._create_runcmds_script(
+                device_type=shard.device_type,
+                test_cmds=[' '.join(runtests_cmd_parts)],
+                output_path=runcmds_path,
+            )
+            manifest[self._get_runcmds_path_per_shard(shard)] = runcmds_path
+            manifest[runtests_file_bootfs_path] = test_list_path
+          else:
+            needs_key = True
+      if needs_key:
+        manifest[AUTHORIZED_KEY_PATH] = build_artifacts.authorized_key
+
+    else:
+      assert device_type and test_cmds
+      if not in_place:
+        new_zbi_filename = 'test-infra.zbi'
+        new_zbi_path = build_artifacts.fuchsia_build_dir.join(new_zbi_filename)
+      if not self.m.emu.is_emulator_type(device_type):
+        zbi_name = next(
+            (image['name']
+             for image in build_artifacts.images.values()
+             if '--boot' in image.get(
+                 'bootserver_%s' % ('netboot' if not pave else 'pave'), [])),
+            None)
+        assert zbi_name, 'Could not find kernel image to boot.'
+      runcmds_path = self.m.path['cleanup'].join('runcmds')
+      self._create_runcmds_script(device_type, test_cmds, runcmds_path)
+      manifest[RUNCMDS_BOOTFS_PATH] = runcmds_path
+
+    # Inject the runcmds script and/or authorized key into the bootfs image.
+    if manifest and zbi_name in build_artifacts.images:
+      self.m.zbi.copy_and_extend(
+          step_name='create zbi',
+          input_image=build_artifacts.fuchsia_build_dir.join(
+              build_artifacts.images[zbi_name]['path']),
+          output_image=new_zbi_path or build_artifacts.fuchsia_build_dir.join(
+              build_artifacts.images[zbi_name]['path']),
+          manifest=manifest,
+      )
+      if new_zbi_filename:
+        build_artifacts.images[zbi_name]['path'] = new_zbi_filename
diff --git a/recipe_modules/testing_requests/examples/full.expected/aemu.json b/recipe_modules/testing_requests/examples/full.expected/aemu.json
new file mode 100644
index 0000000..a14df53
--- /dev/null
+++ b/recipe_modules/testing_requests/examples/full.expected/aemu.json
@@ -0,0 +1,286 @@
+[
+  {
+    "cmd": [],
+    "name": "download build artifacts"
+  },
+  {
+    "cmd": [],
+    "name": "download build artifacts.ensure isolated",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/isolated_client",
+      "-ensure-file",
+      "infra/tools/luci/isolated/${platform} git_revision:305e79001db1846906c7136d90a863bee5bd3bfc",
+      "-json-output",
+      "/path/to/tmp/json"
+    ],
+    "infra_step": true,
+    "name": "download build artifacts.ensure isolated.ensure_installed",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:305\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolated/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/isolated_client/isolated",
+      "download",
+      "-verbose",
+      "-isolate-server",
+      "https://example.isolateserver.appspot.com",
+      "-isolated",
+      "abc",
+      "-output-dir",
+      "[CLEANUP]/build-artifacts_tmp_1"
+    ],
+    "infra_step": true,
+    "name": "download build artifacts.download build_artifacts",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/args.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.read args.json",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"board\": \"boards/x64.gni\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"build_type\": \"build_type\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"product\": \"products/core.gni\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"target\": \"x64\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"variants\": []@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/images.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.read images.json",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"netboot\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"bootserver_netboot\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--boot\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"netboot\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"path\": \"netboot.zbi\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  }, @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"zircon-a\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"bootserver_pave\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--boot\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--zircona\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"zircon-a\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"path\": \"fuchsia.zbi\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/shards.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.load test shards",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@[@@@",
+      "@@@STEP_LOG_LINE@json.output@  {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"deps\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"/path/to/dep\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"environment\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"dimensions\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"device_type\": \"AEMU\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    }, @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"NAME\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"tests\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"install_path\": \"/path/to/test\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"label\": \"//path/to/test:test(//toolchain)\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"TEST\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"os\": \"linux\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"path\": \"/path/to/test\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@]@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CLEANUP]/build-artifacts_tmp_1/zbi",
+      "--output",
+      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
+      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
+      "--entry",
+      "data/ssh/authorized_keys=[CLEANUP]/build-artifacts_tmp_1/authorized_key"
+    ],
+    "name": "create zbi"
+  },
+  {
+    "cmd": [],
+    "name": "shard NAME"
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[\n  {\n    \"path\": \"/path/to/test\", \n    \"os\": \"linux\", \n    \"name\": \"TEST\", \n    \"install_path\": \"/path/to/test\", \n    \"label\": \"//path/to/test:test(//toolchain)\"\n  }\n]",
+      "[CLEANUP]/isolate_tmp_2/tests.json"
+    ],
+    "infra_step": true,
+    "name": "shard NAME.write test manifest",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@tests.json@[@@@",
+      "@@@STEP_LOG_LINE@tests.json@  {@@@",
+      "@@@STEP_LOG_LINE@tests.json@    \"path\": \"/path/to/test\", @@@",
+      "@@@STEP_LOG_LINE@tests.json@    \"os\": \"linux\", @@@",
+      "@@@STEP_LOG_LINE@tests.json@    \"name\": \"TEST\", @@@",
+      "@@@STEP_LOG_LINE@tests.json@    \"install_path\": \"/path/to/test\", @@@",
+      "@@@STEP_LOG_LINE@tests.json@    \"label\": \"//path/to/test:test(//toolchain)\"@@@",
+      "@@@STEP_LOG_LINE@tests.json@  }@@@",
+      "@@@STEP_LOG_LINE@tests.json@]@@@",
+      "@@@STEP_LOG_END@tests.json@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[\n  {\n    \"target\": \"x64\", \n    \"kvm\": true, \n    \"memory\": 8192, \n    \"path\": \"./aemu/bin\", \n    \"type\": \"aemu\", \n    \"cpu\": 8\n  }\n]",
+      "[CLEANUP]/isolate_tmp_2/qemu.json"
+    ],
+    "infra_step": true,
+    "name": "shard NAME.write qemu config",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@qemu.json@[@@@",
+      "@@@STEP_LOG_LINE@qemu.json@  {@@@",
+      "@@@STEP_LOG_LINE@qemu.json@    \"target\": \"x64\", @@@",
+      "@@@STEP_LOG_LINE@qemu.json@    \"kvm\": true, @@@",
+      "@@@STEP_LOG_LINE@qemu.json@    \"memory\": 8192, @@@",
+      "@@@STEP_LOG_LINE@qemu.json@    \"path\": \"./aemu/bin\", @@@",
+      "@@@STEP_LOG_LINE@qemu.json@    \"type\": \"aemu\", @@@",
+      "@@@STEP_LOG_LINE@qemu.json@    \"cpu\": 8@@@",
+      "@@@STEP_LOG_LINE@qemu.json@  }@@@",
+      "@@@STEP_LOG_LINE@qemu.json@]@@@",
+      "@@@STEP_LOG_END@qemu.json@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[\n  {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n]",
+      "[CLEANUP]/isolate_tmp_2/images.json"
+    ],
+    "infra_step": true,
+    "name": "shard NAME.write image manifest",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@images.json@[@@@",
+      "@@@STEP_LOG_LINE@images.json@  {@@@",
+      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
+      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
+      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
+      "@@@STEP_LOG_LINE@images.json@    ]@@@",
+      "@@@STEP_LOG_LINE@images.json@  }@@@",
+      "@@@STEP_LOG_LINE@images.json@]@@@",
+      "@@@STEP_LOG_END@images.json@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
+      "--link-json",
+      "{\"/path/to/dep\": [\"/path/to/dep\"], \"/path/to/test\": [\"/path/to/test\"], \"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/isolate_tmp_2/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/isolate_tmp_2/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/isolate_tmp_2/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/private_key\": [\"[CLEANUP]/isolate_tmp_2/private_key\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/isolate_tmp_2/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/isolate_tmp_2/testrunner\"]}"
+    ],
+    "infra_step": true,
+    "name": "shard NAME.create tree of build artifacts",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/isolated_client/isolated",
+      "archive",
+      "-verbose",
+      "-isolate-server",
+      "https://example.isolateserver.appspot.com",
+      "-namespace",
+      "default-gzip",
+      "-dump-hash",
+      "/path/to/tmp/",
+      "-dirs",
+      "[CLEANUP]/isolate_tmp_2:."
+    ],
+    "infra_step": true,
+    "name": "shard NAME.isolate build artifacts",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
+    ]
+  },
+  {
+    "name": "$result"
+  }
+]
\ No newline at end of file
diff --git a/recipe_modules/testing_requests/examples/full.expected/deprecated_non_emu.json b/recipe_modules/testing_requests/examples/full.expected/deprecated_non_emu.json
new file mode 100644
index 0000000..2562f8e
--- /dev/null
+++ b/recipe_modules/testing_requests/examples/full.expected/deprecated_non_emu.json
@@ -0,0 +1,229 @@
+[
+  {
+    "cmd": [],
+    "name": "download build artifacts"
+  },
+  {
+    "cmd": [],
+    "name": "download build artifacts.ensure isolated",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/isolated_client",
+      "-ensure-file",
+      "infra/tools/luci/isolated/${platform} git_revision:305e79001db1846906c7136d90a863bee5bd3bfc",
+      "-json-output",
+      "/path/to/tmp/json"
+    ],
+    "infra_step": true,
+    "name": "download build artifacts.ensure isolated.ensure_installed",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:305\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolated/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/isolated_client/isolated",
+      "download",
+      "-verbose",
+      "-isolate-server",
+      "https://example.isolateserver.appspot.com",
+      "-isolated",
+      "abc",
+      "-output-dir",
+      "[CLEANUP]/build-artifacts_tmp_1"
+    ],
+    "infra_step": true,
+    "name": "download build artifacts.download build_artifacts",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/args.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.read args.json",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"board\": \"boards/x64.gni\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"build_type\": \"build_type\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"product\": \"products/core.gni\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"target\": \"x64\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"variants\": []@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/images.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.read images.json",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"netboot\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"bootserver_netboot\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--boot\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"netboot\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"path\": \"netboot.zbi\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  }, @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"zircon-a\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"bootserver_pave\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--boot\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--zircona\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"zircon-a\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"path\": \"fuchsia.zbi\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/shards.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.load test shards",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_END@json.output (invalid)@@@",
+      "@@@STEP_LOG_LINE@json.output (exception)@No JSON object could be decoded@@@",
+      "@@@STEP_LOG_END@json.output (exception)@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "mkdir /tmp/infra-test-output\nruntests -o /tmp/infra-test-output ",
+      "[CLEANUP]/runcmds"
+    ],
+    "infra_step": true,
+    "name": "write runcmds",
+    "~followup_annotations": [
+      "@@@STEP_LOG_LINE@runcmds@mkdir /tmp/infra-test-output@@@",
+      "@@@STEP_LOG_LINE@runcmds@runtests -o /tmp/infra-test-output @@@",
+      "@@@STEP_LOG_END@runcmds@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CLEANUP]/build-artifacts_tmp_1/zbi",
+      "--output",
+      "[CLEANUP]/build-artifacts_tmp_1/test-infra.zbi",
+      "[CLEANUP]/build-artifacts_tmp_1/netboot.zbi",
+      "--entry",
+      "infra/runcmds=[CLEANUP]/runcmds"
+    ],
+    "name": "create zbi"
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[\n  {\n    \"path\": \"test-infra.zbi\", \n    \"bootserver_netboot\": [\n      \"--boot\"\n    ], \n    \"type\": \"zbi\", \n    \"name\": \"netboot\"\n  }, \n  {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n]",
+      "[CLEANUP]/isolate_tmp_2/images.json"
+    ],
+    "infra_step": true,
+    "name": "write image manifest",
+    "~followup_annotations": [
+      "@@@STEP_LOG_LINE@images.json@[@@@",
+      "@@@STEP_LOG_LINE@images.json@  {@@@",
+      "@@@STEP_LOG_LINE@images.json@    \"path\": \"test-infra.zbi\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"bootserver_netboot\": [@@@",
+      "@@@STEP_LOG_LINE@images.json@      \"--boot\"@@@",
+      "@@@STEP_LOG_LINE@images.json@    ], @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"name\": \"netboot\"@@@",
+      "@@@STEP_LOG_LINE@images.json@  }, @@@",
+      "@@@STEP_LOG_LINE@images.json@  {@@@",
+      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
+      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
+      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
+      "@@@STEP_LOG_LINE@images.json@    ]@@@",
+      "@@@STEP_LOG_LINE@images.json@  }@@@",
+      "@@@STEP_LOG_LINE@images.json@]@@@",
+      "@@@STEP_LOG_END@images.json@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
+      "--link-json",
+      "{\"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/isolate_tmp_2/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/isolate_tmp_2/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/isolate_tmp_2/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/test-infra.zbi\": [\"[CLEANUP]/isolate_tmp_2/test-infra.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/isolate_tmp_2/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/isolate_tmp_2/testrunner\"]}"
+    ],
+    "infra_step": true,
+    "name": "create tree of build artifacts"
+  },
+  {
+    "cmd": [
+      "[CACHE]/isolated_client/isolated",
+      "archive",
+      "-verbose",
+      "-isolate-server",
+      "https://example.isolateserver.appspot.com",
+      "-namespace",
+      "default-gzip",
+      "-dump-hash",
+      "/path/to/tmp/",
+      "-dirs",
+      "[CLEANUP]/isolate_tmp_2:."
+    ],
+    "infra_step": true,
+    "name": "isolate build artifacts",
+    "~followup_annotations": [
+      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
+    ]
+  },
+  {
+    "name": "$result"
+  }
+]
\ No newline at end of file
diff --git a/recipe_modules/testing_requests/examples/full.expected/deprecated_with_secrets.json b/recipe_modules/testing_requests/examples/full.expected/deprecated_with_secrets.json
new file mode 100644
index 0000000..e723566
--- /dev/null
+++ b/recipe_modules/testing_requests/examples/full.expected/deprecated_with_secrets.json
@@ -0,0 +1,320 @@
+[
+  {
+    "cmd": [],
+    "name": "download build artifacts"
+  },
+  {
+    "cmd": [],
+    "name": "download build artifacts.ensure isolated",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/isolated_client",
+      "-ensure-file",
+      "infra/tools/luci/isolated/${platform} git_revision:305e79001db1846906c7136d90a863bee5bd3bfc",
+      "-json-output",
+      "/path/to/tmp/json"
+    ],
+    "infra_step": true,
+    "name": "download build artifacts.ensure isolated.ensure_installed",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:305\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolated/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/isolated_client/isolated",
+      "download",
+      "-verbose",
+      "-isolate-server",
+      "https://example.isolateserver.appspot.com",
+      "-isolated",
+      "abc",
+      "-output-dir",
+      "[CLEANUP]/build-artifacts_tmp_1"
+    ],
+    "infra_step": true,
+    "name": "download build artifacts.download build_artifacts",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/args.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.read args.json",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"board\": \"boards/x64.gni\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"build_type\": \"build_type\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"product\": \"products/core.gni\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"target\": \"x64\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"variants\": []@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/images.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.read images.json",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"netboot\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"bootserver_netboot\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--boot\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"netboot\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"path\": \"netboot.zbi\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  }, @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"zircon-a\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"bootserver_pave\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--boot\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--zircona\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"zircon-a\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"path\": \"fuchsia.zbi\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/shards.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.load test shards",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_END@json.output (invalid)@@@",
+      "@@@STEP_LOG_LINE@json.output (exception)@No JSON object could be decoded@@@",
+      "@@@STEP_LOG_END@json.output (exception)@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "mkdir /tmp/infra-test-output\nwaitfor class=block topo=/dev/sys/pci/00:06.0/virtio-block/block timeout=60000\nmount /dev/sys/pci/00:06.0/virtio-block/block /tmp/infra-test-output\nruntests -o /tmp/infra-test-output -i 1 \numount /tmp/infra-test-output\ndm poweroff",
+      "[CLEANUP]/runcmds"
+    ],
+    "infra_step": true,
+    "name": "write runcmds",
+    "~followup_annotations": [
+      "@@@STEP_LOG_LINE@runcmds@mkdir /tmp/infra-test-output@@@",
+      "@@@STEP_LOG_LINE@runcmds@waitfor class=block topo=/dev/sys/pci/00:06.0/virtio-block/block timeout=60000@@@",
+      "@@@STEP_LOG_LINE@runcmds@mount /dev/sys/pci/00:06.0/virtio-block/block /tmp/infra-test-output@@@",
+      "@@@STEP_LOG_LINE@runcmds@runtests -o /tmp/infra-test-output -i 1 @@@",
+      "@@@STEP_LOG_LINE@runcmds@umount /tmp/infra-test-output@@@",
+      "@@@STEP_LOG_LINE@runcmds@dm poweroff@@@",
+      "@@@STEP_LOG_END@runcmds@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CLEANUP]/build-artifacts_tmp_1/zbi",
+      "--output",
+      "[CLEANUP]/build-artifacts_tmp_1/test-infra.zbi",
+      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
+      "--entry",
+      "infra/runcmds=[CLEANUP]/runcmds"
+    ],
+    "name": "create zbi"
+  },
+  {
+    "cmd": [],
+    "name": "ensure cloudkms"
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[START_DIR]/cipd/cloudkms",
+      "-ensure-file",
+      "infra/tools/luci/cloudkms/${platform} latest",
+      "-json-output",
+      "/path/to/tmp/json"
+    ],
+    "infra_step": true,
+    "name": "ensure cloudkms.ensure_installed",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-latest----------\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/cloudkms/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "process secret specs"
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "listdir",
+      "[CLEANUP]/build-artifacts_tmp_1/secret_specs"
+    ],
+    "infra_step": true,
+    "name": "process secret specs.list",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@listdir@[CLEANUP]/build-artifacts_tmp_1/secret_specs/auth-token.json@@@",
+      "@@@STEP_LOG_LINE@listdir@[CLEANUP]/build-artifacts_tmp_1/secret_specs/ciphertext@@@",
+      "@@@STEP_LOG_END@listdir@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/secret_specs/auth-token.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "process secret specs.read spec for auth-token",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"cloudkms_key_path\": \"key-path\"@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[START_DIR]/cipd/cloudkms/cloudkms",
+      "decrypt",
+      "-input",
+      "[CLEANUP]/build-artifacts_tmp_1/secret_specs/ciphertext/auth-token.ciphertext",
+      "-output",
+      "/path/to/tmp/",
+      "key-path"
+    ],
+    "name": "process secret specs.decrypt secret for auth-token",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CLEANUP]/build-artifacts_tmp_1/minfs",
+      "[CLEANUP]/isolate_tmp_2/output.fs@3584M",
+      "create"
+    ],
+    "name": "create test image"
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[\n  {\n    \"path\": \"test-infra.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n]",
+      "[CLEANUP]/isolate_tmp_2/images.json"
+    ],
+    "infra_step": true,
+    "name": "write image manifest",
+    "~followup_annotations": [
+      "@@@STEP_LOG_LINE@images.json@[@@@",
+      "@@@STEP_LOG_LINE@images.json@  {@@@",
+      "@@@STEP_LOG_LINE@images.json@    \"path\": \"test-infra.zbi\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
+      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
+      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
+      "@@@STEP_LOG_LINE@images.json@    ]@@@",
+      "@@@STEP_LOG_LINE@images.json@  }@@@",
+      "@@@STEP_LOG_LINE@images.json@]@@@",
+      "@@@STEP_LOG_END@images.json@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
+      "--link-json",
+      "{\"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/isolate_tmp_2/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/isolate_tmp_2/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/test-infra.zbi\": [\"[CLEANUP]/isolate_tmp_2/test-infra.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/isolate_tmp_2/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/isolate_tmp_2/testrunner\"]}"
+    ],
+    "infra_step": true,
+    "name": "create tree of build artifacts"
+  },
+  {
+    "cmd": [
+      "[CACHE]/isolated_client/isolated",
+      "archive",
+      "-verbose",
+      "-isolate-server",
+      "https://example.isolateserver.appspot.com",
+      "-namespace",
+      "default-gzip",
+      "-dump-hash",
+      "/path/to/tmp/",
+      "-dirs",
+      "[CLEANUP]/isolate_tmp_2:."
+    ],
+    "infra_step": true,
+    "name": "isolate build artifacts",
+    "~followup_annotations": [
+      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
+    ]
+  },
+  {
+    "name": "$result"
+  }
+]
\ No newline at end of file
diff --git a/recipe_modules/testing_requests/examples/full.expected/legacy_aemu.json b/recipe_modules/testing_requests/examples/full.expected/legacy_aemu.json
new file mode 100644
index 0000000..ff151ed
--- /dev/null
+++ b/recipe_modules/testing_requests/examples/full.expected/legacy_aemu.json
@@ -0,0 +1,285 @@
+[
+  {
+    "cmd": [],
+    "name": "download build artifacts"
+  },
+  {
+    "cmd": [],
+    "name": "download build artifacts.ensure isolated",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/isolated_client",
+      "-ensure-file",
+      "infra/tools/luci/isolated/${platform} git_revision:305e79001db1846906c7136d90a863bee5bd3bfc",
+      "-json-output",
+      "/path/to/tmp/json"
+    ],
+    "infra_step": true,
+    "name": "download build artifacts.ensure isolated.ensure_installed",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:305\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolated/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/isolated_client/isolated",
+      "download",
+      "-verbose",
+      "-isolate-server",
+      "https://example.isolateserver.appspot.com",
+      "-isolated",
+      "abc",
+      "-output-dir",
+      "[CLEANUP]/build-artifacts_tmp_1"
+    ],
+    "infra_step": true,
+    "name": "download build artifacts.download build_artifacts",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/args.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.read args.json",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"board\": \"boards/x64.gni\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"build_type\": \"build_type\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"product\": \"products/core.gni\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"target\": \"x64\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"variants\": []@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/images.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.read images.json",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"netboot\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"bootserver_netboot\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--boot\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"netboot\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"path\": \"netboot.zbi\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  }, @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"zircon-a\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"bootserver_pave\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--boot\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--zircona\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"zircon-a\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"path\": \"fuchsia.zbi\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/shards.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.load test shards",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@[@@@",
+      "@@@STEP_LOG_LINE@json.output@  {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"deps\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"/path/to/dep\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"environment\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"dimensions\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"device_type\": \"AEMU\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    }, @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"NAME\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"tests\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"install_path\": \"/path/to/test\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"label\": \"//path/to/test:test(//toolchain)\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"TEST\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"os\": \"linux\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"path\": \"/path/to/test\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@]@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "/path/to/test\n",
+      "[CLEANUP]/tests-NAME"
+    ],
+    "infra_step": true,
+    "name": "write test list",
+    "~followup_annotations": [
+      "@@@STEP_LOG_LINE@tests-NAME@/path/to/test@@@",
+      "@@@STEP_LOG_END@tests-NAME@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "mkdir /tmp/infra-test-output\nwaitfor class=block topo=/dev/sys/pci/00:06.0/virtio-block/block timeout=60000\nmount /dev/sys/pci/00:06.0/virtio-block/block /tmp/infra-test-output\nruntests -o /tmp/infra-test-output -f /boot/infra/shard-NAME.run\numount /tmp/infra-test-output\ndm poweroff",
+      "[CLEANUP]/runcmds-NAME"
+    ],
+    "infra_step": true,
+    "name": "write runcmds",
+    "~followup_annotations": [
+      "@@@STEP_LOG_LINE@runcmds-NAME@mkdir /tmp/infra-test-output@@@",
+      "@@@STEP_LOG_LINE@runcmds-NAME@waitfor class=block topo=/dev/sys/pci/00:06.0/virtio-block/block timeout=60000@@@",
+      "@@@STEP_LOG_LINE@runcmds-NAME@mount /dev/sys/pci/00:06.0/virtio-block/block /tmp/infra-test-output@@@",
+      "@@@STEP_LOG_LINE@runcmds-NAME@runtests -o /tmp/infra-test-output -f /boot/infra/shard-NAME.run@@@",
+      "@@@STEP_LOG_LINE@runcmds-NAME@umount /tmp/infra-test-output@@@",
+      "@@@STEP_LOG_LINE@runcmds-NAME@dm poweroff@@@",
+      "@@@STEP_LOG_END@runcmds-NAME@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CLEANUP]/build-artifacts_tmp_1/zbi",
+      "--output",
+      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
+      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
+      "--entry",
+      "infra/runcmds-NAME=[CLEANUP]/runcmds-NAME",
+      "--entry",
+      "infra/shard-NAME.run=[CLEANUP]/tests-NAME"
+    ],
+    "name": "create zbi"
+  },
+  {
+    "cmd": [],
+    "name": "shard NAME"
+  },
+  {
+    "cmd": [
+      "[CLEANUP]/build-artifacts_tmp_1/minfs",
+      "[CLEANUP]/isolate_tmp_2/output.fs@3584M",
+      "create"
+    ],
+    "name": "shard NAME.create test image",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[\n  {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n]",
+      "[CLEANUP]/isolate_tmp_2/images.json"
+    ],
+    "infra_step": true,
+    "name": "shard NAME.write image manifest",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@images.json@[@@@",
+      "@@@STEP_LOG_LINE@images.json@  {@@@",
+      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
+      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
+      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
+      "@@@STEP_LOG_LINE@images.json@    ]@@@",
+      "@@@STEP_LOG_LINE@images.json@  }@@@",
+      "@@@STEP_LOG_LINE@images.json@]@@@",
+      "@@@STEP_LOG_END@images.json@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
+      "--link-json",
+      "{\"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/isolate_tmp_2/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/isolate_tmp_2/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/isolate_tmp_2/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/isolate_tmp_2/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/isolate_tmp_2/testrunner\"]}"
+    ],
+    "infra_step": true,
+    "name": "shard NAME.create tree of build artifacts",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/isolated_client/isolated",
+      "archive",
+      "-verbose",
+      "-isolate-server",
+      "https://example.isolateserver.appspot.com",
+      "-namespace",
+      "default-gzip",
+      "-dump-hash",
+      "/path/to/tmp/",
+      "-dirs",
+      "[CLEANUP]/isolate_tmp_2:."
+    ],
+    "infra_step": true,
+    "name": "shard NAME.isolate build artifacts",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
+    ]
+  },
+  {
+    "name": "$result"
+  }
+]
\ No newline at end of file
diff --git a/recipe_modules/testing_requests/examples/full.expected/legacy_qemu.json b/recipe_modules/testing_requests/examples/full.expected/legacy_qemu.json
new file mode 100644
index 0000000..5d3a068
--- /dev/null
+++ b/recipe_modules/testing_requests/examples/full.expected/legacy_qemu.json
@@ -0,0 +1,287 @@
+[
+  {
+    "cmd": [],
+    "name": "download build artifacts"
+  },
+  {
+    "cmd": [],
+    "name": "download build artifacts.ensure isolated",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/isolated_client",
+      "-ensure-file",
+      "infra/tools/luci/isolated/${platform} git_revision:305e79001db1846906c7136d90a863bee5bd3bfc",
+      "-json-output",
+      "/path/to/tmp/json"
+    ],
+    "infra_step": true,
+    "name": "download build artifacts.ensure isolated.ensure_installed",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:305\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolated/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/isolated_client/isolated",
+      "download",
+      "-verbose",
+      "-isolate-server",
+      "https://example.isolateserver.appspot.com",
+      "-isolated",
+      "abc",
+      "-output-dir",
+      "[CLEANUP]/build-artifacts_tmp_1"
+    ],
+    "infra_step": true,
+    "name": "download build artifacts.download build_artifacts",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/args.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.read args.json",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"board\": \"boards/x64.gni\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"build_type\": \"release\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"product\": \"products/core.gni\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"target\": \"x64\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"variants\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"asan\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  ]@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/images.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.read images.json",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"netboot\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"bootserver_netboot\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--boot\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"netboot\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"path\": \"netboot.zbi\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  }, @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"zircon-a\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"bootserver_pave\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--boot\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--zircona\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"zircon-a\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"path\": \"fuchsia.zbi\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/shards.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.load test shards",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@[@@@",
+      "@@@STEP_LOG_LINE@json.output@  {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"deps\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"/path/to/dep\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"environment\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"dimensions\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"device_type\": \"QEMU\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    }, @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"NAME\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"tests\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"install_path\": \"/path/to/test\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"label\": \"//path/to/test:test(//toolchain)\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"TEST\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"os\": \"linux\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"path\": \"/path/to/test\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@]@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "/path/to/test\n",
+      "[CLEANUP]/tests-NAME"
+    ],
+    "infra_step": true,
+    "name": "write test list",
+    "~followup_annotations": [
+      "@@@STEP_LOG_LINE@tests-NAME@/path/to/test@@@",
+      "@@@STEP_LOG_END@tests-NAME@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "mkdir /tmp/infra-test-output\nwaitfor class=block topo=/dev/sys/pci/00:06.0/virtio-block/block timeout=60000\nmount /dev/sys/pci/00:06.0/virtio-block/block /tmp/infra-test-output\nruntests -o /tmp/infra-test-output -f /boot/infra/shard-NAME.run -i 1\numount /tmp/infra-test-output\ndm poweroff",
+      "[CLEANUP]/runcmds-NAME"
+    ],
+    "infra_step": true,
+    "name": "write runcmds",
+    "~followup_annotations": [
+      "@@@STEP_LOG_LINE@runcmds-NAME@mkdir /tmp/infra-test-output@@@",
+      "@@@STEP_LOG_LINE@runcmds-NAME@waitfor class=block topo=/dev/sys/pci/00:06.0/virtio-block/block timeout=60000@@@",
+      "@@@STEP_LOG_LINE@runcmds-NAME@mount /dev/sys/pci/00:06.0/virtio-block/block /tmp/infra-test-output@@@",
+      "@@@STEP_LOG_LINE@runcmds-NAME@runtests -o /tmp/infra-test-output -f /boot/infra/shard-NAME.run -i 1@@@",
+      "@@@STEP_LOG_LINE@runcmds-NAME@umount /tmp/infra-test-output@@@",
+      "@@@STEP_LOG_LINE@runcmds-NAME@dm poweroff@@@",
+      "@@@STEP_LOG_END@runcmds-NAME@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CLEANUP]/build-artifacts_tmp_1/zbi",
+      "--output",
+      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
+      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
+      "--entry",
+      "infra/runcmds-NAME=[CLEANUP]/runcmds-NAME",
+      "--entry",
+      "infra/shard-NAME.run=[CLEANUP]/tests-NAME"
+    ],
+    "name": "create zbi"
+  },
+  {
+    "cmd": [],
+    "name": "shard NAME"
+  },
+  {
+    "cmd": [
+      "[CLEANUP]/build-artifacts_tmp_1/minfs",
+      "[CLEANUP]/isolate_tmp_2/output.fs@3584M",
+      "create"
+    ],
+    "name": "shard NAME.create test image",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[\n  {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n]",
+      "[CLEANUP]/isolate_tmp_2/images.json"
+    ],
+    "infra_step": true,
+    "name": "shard NAME.write image manifest",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@images.json@[@@@",
+      "@@@STEP_LOG_LINE@images.json@  {@@@",
+      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
+      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
+      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
+      "@@@STEP_LOG_LINE@images.json@    ]@@@",
+      "@@@STEP_LOG_LINE@images.json@  }@@@",
+      "@@@STEP_LOG_LINE@images.json@]@@@",
+      "@@@STEP_LOG_END@images.json@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
+      "--link-json",
+      "{\"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/isolate_tmp_2/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/isolate_tmp_2/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/isolate_tmp_2/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/isolate_tmp_2/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/isolate_tmp_2/testrunner\"]}"
+    ],
+    "infra_step": true,
+    "name": "shard NAME.create tree of build artifacts",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/isolated_client/isolated",
+      "archive",
+      "-verbose",
+      "-isolate-server",
+      "https://example.isolateserver.appspot.com",
+      "-namespace",
+      "default-gzip",
+      "-dump-hash",
+      "/path/to/tmp/",
+      "-dirs",
+      "[CLEANUP]/isolate_tmp_2:."
+    ],
+    "infra_step": true,
+    "name": "shard NAME.isolate build artifacts",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
+    ]
+  },
+  {
+    "name": "$result"
+  }
+]
\ No newline at end of file
diff --git a/recipe_modules/testing_requests/examples/full.expected/not-emu.json b/recipe_modules/testing_requests/examples/full.expected/not-emu.json
new file mode 100644
index 0000000..420952c
--- /dev/null
+++ b/recipe_modules/testing_requests/examples/full.expected/not-emu.json
@@ -0,0 +1,257 @@
+[
+  {
+    "cmd": [],
+    "name": "download build artifacts"
+  },
+  {
+    "cmd": [],
+    "name": "download build artifacts.ensure isolated",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/isolated_client",
+      "-ensure-file",
+      "infra/tools/luci/isolated/${platform} git_revision:305e79001db1846906c7136d90a863bee5bd3bfc",
+      "-json-output",
+      "/path/to/tmp/json"
+    ],
+    "infra_step": true,
+    "name": "download build artifacts.ensure isolated.ensure_installed",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:305\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolated/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/isolated_client/isolated",
+      "download",
+      "-verbose",
+      "-isolate-server",
+      "https://example.isolateserver.appspot.com",
+      "-isolated",
+      "abc",
+      "-output-dir",
+      "[CLEANUP]/build-artifacts_tmp_1"
+    ],
+    "infra_step": true,
+    "name": "download build artifacts.download build_artifacts",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/args.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.read args.json",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"board\": \"boards/x64.gni\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"build_type\": \"build_type\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"product\": \"products/core.gni\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"target\": \"x64\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"variants\": []@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/images.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.read images.json",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"netboot\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"bootserver_netboot\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--boot\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"netboot\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"path\": \"netboot.zbi\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  }, @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"zircon-a\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"bootserver_pave\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--boot\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--zircona\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"zircon-a\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"path\": \"fuchsia.zbi\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/shards.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.load test shards",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@[@@@",
+      "@@@STEP_LOG_LINE@json.output@  {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"deps\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"/path/to/dep\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"environment\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"dimensions\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"device_type\": \"DEVICE TYPE\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }, @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"netboot\": true, @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"service_account\": \"my-service-account@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    }, @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"NAME\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"tests\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"install_path\": \"/path/to/test\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"label\": \"//path/to/test:test(//toolchain)\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"TEST\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"os\": \"linux\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"path\": \"/path/to/test\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@]@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [],
+    "name": "shard NAME"
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[\n  {\n    \"path\": \"/path/to/test\", \n    \"os\": \"linux\", \n    \"name\": \"TEST\", \n    \"install_path\": \"/path/to/test\", \n    \"label\": \"//path/to/test:test(//toolchain)\"\n  }\n]",
+      "[CLEANUP]/isolate_tmp_2/tests.json"
+    ],
+    "infra_step": true,
+    "name": "shard NAME.write test manifest",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@tests.json@[@@@",
+      "@@@STEP_LOG_LINE@tests.json@  {@@@",
+      "@@@STEP_LOG_LINE@tests.json@    \"path\": \"/path/to/test\", @@@",
+      "@@@STEP_LOG_LINE@tests.json@    \"os\": \"linux\", @@@",
+      "@@@STEP_LOG_LINE@tests.json@    \"name\": \"TEST\", @@@",
+      "@@@STEP_LOG_LINE@tests.json@    \"install_path\": \"/path/to/test\", @@@",
+      "@@@STEP_LOG_LINE@tests.json@    \"label\": \"//path/to/test:test(//toolchain)\"@@@",
+      "@@@STEP_LOG_LINE@tests.json@  }@@@",
+      "@@@STEP_LOG_LINE@tests.json@]@@@",
+      "@@@STEP_LOG_END@tests.json@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[\n  {\n    \"path\": \"netboot.zbi\", \n    \"bootserver_netboot\": [\n      \"--boot\"\n    ], \n    \"type\": \"zbi\", \n    \"name\": \"netboot\"\n  }, \n  {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n]",
+      "[CLEANUP]/isolate_tmp_2/images.json"
+    ],
+    "infra_step": true,
+    "name": "shard NAME.write image manifest",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@images.json@[@@@",
+      "@@@STEP_LOG_LINE@images.json@  {@@@",
+      "@@@STEP_LOG_LINE@images.json@    \"path\": \"netboot.zbi\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"bootserver_netboot\": [@@@",
+      "@@@STEP_LOG_LINE@images.json@      \"--boot\"@@@",
+      "@@@STEP_LOG_LINE@images.json@    ], @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"name\": \"netboot\"@@@",
+      "@@@STEP_LOG_LINE@images.json@  }, @@@",
+      "@@@STEP_LOG_LINE@images.json@  {@@@",
+      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
+      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
+      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
+      "@@@STEP_LOG_LINE@images.json@    ]@@@",
+      "@@@STEP_LOG_LINE@images.json@  }@@@",
+      "@@@STEP_LOG_LINE@images.json@]@@@",
+      "@@@STEP_LOG_END@images.json@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
+      "--link-json",
+      "{\"/path/to/dep\": [\"/path/to/dep\"], \"/path/to/test\": [\"/path/to/test\"], \"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/isolate_tmp_2/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/isolate_tmp_2/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/isolate_tmp_2/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/netboot.zbi\": [\"[CLEANUP]/isolate_tmp_2/netboot.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/isolate_tmp_2/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/isolate_tmp_2/testrunner\"]}"
+    ],
+    "infra_step": true,
+    "name": "shard NAME.create tree of build artifacts",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/isolated_client/isolated",
+      "archive",
+      "-verbose",
+      "-isolate-server",
+      "https://example.isolateserver.appspot.com",
+      "-namespace",
+      "default-gzip",
+      "-dump-hash",
+      "/path/to/tmp/",
+      "-dirs",
+      "[CLEANUP]/isolate_tmp_2:."
+    ],
+    "infra_step": true,
+    "name": "shard NAME.isolate build artifacts",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
+    ]
+  },
+  {
+    "name": "$result"
+  }
+]
\ No newline at end of file
diff --git a/recipe_modules/testing_requests/examples/full.expected/qemu.json b/recipe_modules/testing_requests/examples/full.expected/qemu.json
new file mode 100644
index 0000000..7059288
--- /dev/null
+++ b/recipe_modules/testing_requests/examples/full.expected/qemu.json
@@ -0,0 +1,286 @@
+[
+  {
+    "cmd": [],
+    "name": "download build artifacts"
+  },
+  {
+    "cmd": [],
+    "name": "download build artifacts.ensure isolated",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/isolated_client",
+      "-ensure-file",
+      "infra/tools/luci/isolated/${platform} git_revision:305e79001db1846906c7136d90a863bee5bd3bfc",
+      "-json-output",
+      "/path/to/tmp/json"
+    ],
+    "infra_step": true,
+    "name": "download build artifacts.ensure isolated.ensure_installed",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"result\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:305\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolated/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/isolated_client/isolated",
+      "download",
+      "-verbose",
+      "-isolate-server",
+      "https://example.isolateserver.appspot.com",
+      "-isolated",
+      "abc",
+      "-output-dir",
+      "[CLEANUP]/build-artifacts_tmp_1"
+    ],
+    "infra_step": true,
+    "name": "download build artifacts.download build_artifacts",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/args.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.read args.json",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"board\": \"boards/x64.gni\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"build_type\": \"build_type\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"product\": \"products/core.gni\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"target\": \"x64\", @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"variants\": []@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/images.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.read images.json",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@{@@@",
+      "@@@STEP_LOG_LINE@json.output@  \"netboot\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"bootserver_netboot\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--boot\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"netboot\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"path\": \"netboot.zbi\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  }, @@@",
+      "@@@STEP_LOG_LINE@json.output@  \"zircon-a\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"bootserver_pave\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--boot\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"--zircona\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"zircon-a\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"path\": \"fuchsia.zbi\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"type\": \"zbi\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@}@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
+      "[CLEANUP]/build-artifacts_tmp_1/shards.json",
+      "/path/to/tmp/json"
+    ],
+    "name": "download build artifacts.load test shards",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@json.output@[@@@",
+      "@@@STEP_LOG_LINE@json.output@  {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"deps\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"/path/to/dep\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"environment\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"dimensions\": {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"device_type\": \"QEMU\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    }, @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"NAME\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"tests\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      {@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"install_path\": \"/path/to/test\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"label\": \"//path/to/test:test(//toolchain)\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"TEST\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"os\": \"linux\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"path\": \"/path/to/test\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      }@@@",
+      "@@@STEP_LOG_LINE@json.output@    ]@@@",
+      "@@@STEP_LOG_LINE@json.output@  }@@@",
+      "@@@STEP_LOG_LINE@json.output@]@@@",
+      "@@@STEP_LOG_END@json.output@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CLEANUP]/build-artifacts_tmp_1/zbi",
+      "--output",
+      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
+      "[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi",
+      "--entry",
+      "data/ssh/authorized_keys=[CLEANUP]/build-artifacts_tmp_1/authorized_key"
+    ],
+    "name": "create zbi"
+  },
+  {
+    "cmd": [],
+    "name": "shard NAME"
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[\n  {\n    \"path\": \"/path/to/test\", \n    \"os\": \"linux\", \n    \"name\": \"TEST\", \n    \"install_path\": \"/path/to/test\", \n    \"label\": \"//path/to/test:test(//toolchain)\"\n  }\n]",
+      "[CLEANUP]/isolate_tmp_2/tests.json"
+    ],
+    "infra_step": true,
+    "name": "shard NAME.write test manifest",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@tests.json@[@@@",
+      "@@@STEP_LOG_LINE@tests.json@  {@@@",
+      "@@@STEP_LOG_LINE@tests.json@    \"path\": \"/path/to/test\", @@@",
+      "@@@STEP_LOG_LINE@tests.json@    \"os\": \"linux\", @@@",
+      "@@@STEP_LOG_LINE@tests.json@    \"name\": \"TEST\", @@@",
+      "@@@STEP_LOG_LINE@tests.json@    \"install_path\": \"/path/to/test\", @@@",
+      "@@@STEP_LOG_LINE@tests.json@    \"label\": \"//path/to/test:test(//toolchain)\"@@@",
+      "@@@STEP_LOG_LINE@tests.json@  }@@@",
+      "@@@STEP_LOG_LINE@tests.json@]@@@",
+      "@@@STEP_LOG_END@tests.json@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[\n  {\n    \"target\": \"x64\", \n    \"kvm\": true, \n    \"memory\": 8192, \n    \"path\": \"./qemu/bin\", \n    \"type\": \"qemu\", \n    \"cpu\": 8\n  }\n]",
+      "[CLEANUP]/isolate_tmp_2/qemu.json"
+    ],
+    "infra_step": true,
+    "name": "shard NAME.write qemu config",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@qemu.json@[@@@",
+      "@@@STEP_LOG_LINE@qemu.json@  {@@@",
+      "@@@STEP_LOG_LINE@qemu.json@    \"target\": \"x64\", @@@",
+      "@@@STEP_LOG_LINE@qemu.json@    \"kvm\": true, @@@",
+      "@@@STEP_LOG_LINE@qemu.json@    \"memory\": 8192, @@@",
+      "@@@STEP_LOG_LINE@qemu.json@    \"path\": \"./qemu/bin\", @@@",
+      "@@@STEP_LOG_LINE@qemu.json@    \"type\": \"qemu\", @@@",
+      "@@@STEP_LOG_LINE@qemu.json@    \"cpu\": 8@@@",
+      "@@@STEP_LOG_LINE@qemu.json@  }@@@",
+      "@@@STEP_LOG_LINE@qemu.json@]@@@",
+      "@@@STEP_LOG_END@qemu.json@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[\n  {\n    \"path\": \"fuchsia.zbi\", \n    \"type\": \"zbi\", \n    \"name\": \"zircon-a\", \n    \"bootserver_pave\": [\n      \"--boot\", \n      \"--zircona\"\n    ]\n  }\n]",
+      "[CLEANUP]/isolate_tmp_2/images.json"
+    ],
+    "infra_step": true,
+    "name": "shard NAME.write image manifest",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LOG_LINE@images.json@[@@@",
+      "@@@STEP_LOG_LINE@images.json@  {@@@",
+      "@@@STEP_LOG_LINE@images.json@    \"path\": \"fuchsia.zbi\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"type\": \"zbi\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"name\": \"zircon-a\", @@@",
+      "@@@STEP_LOG_LINE@images.json@    \"bootserver_pave\": [@@@",
+      "@@@STEP_LOG_LINE@images.json@      \"--boot\", @@@",
+      "@@@STEP_LOG_LINE@images.json@      \"--zircona\"@@@",
+      "@@@STEP_LOG_LINE@images.json@    ]@@@",
+      "@@@STEP_LOG_LINE@images.json@  }@@@",
+      "@@@STEP_LOG_LINE@images.json@]@@@",
+      "@@@STEP_LOG_END@images.json@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/symlink.py",
+      "--link-json",
+      "{\"/path/to/dep\": [\"/path/to/dep\"], \"/path/to/test\": [\"/path/to/test\"], \"[CLEANUP]/build-artifacts_tmp_1/bootserver\": [\"[CLEANUP]/isolate_tmp_2/bootserver\"], \"[CLEANUP]/build-artifacts_tmp_1/fuchsia.zbi\": [\"[CLEANUP]/isolate_tmp_2/fuchsia.zbi\"], \"[CLEANUP]/build-artifacts_tmp_1/llvm-symbolizer\": [\"[CLEANUP]/isolate_tmp_2/llvm-symbolizer\"], \"[CLEANUP]/build-artifacts_tmp_1/private_key\": [\"[CLEANUP]/isolate_tmp_2/private_key\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/botanist\": [\"[CLEANUP]/isolate_tmp_2/botanist\"], \"[CLEANUP]/build-artifacts_tmp_1/x64/testrunner\": [\"[CLEANUP]/isolate_tmp_2/testrunner\"]}"
+    ],
+    "infra_step": true,
+    "name": "shard NAME.create tree of build artifacts",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/isolated_client/isolated",
+      "archive",
+      "-verbose",
+      "-isolate-server",
+      "https://example.isolateserver.appspot.com",
+      "-namespace",
+      "default-gzip",
+      "-dump-hash",
+      "/path/to/tmp/",
+      "-dirs",
+      "[CLEANUP]/isolate_tmp_2:."
+    ],
+    "infra_step": true,
+    "name": "shard NAME.isolate build artifacts",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@1@@@",
+      "@@@STEP_LINK@isolated UI@https://example.isolateserver.appspot.com/browse?namespace=default-gzip&hash=%5Bdummy+hash%5D@@@"
+    ]
+  },
+  {
+    "name": "$result"
+  }
+]
\ No newline at end of file
diff --git a/recipe_modules/testing_requests/examples/full.py b/recipe_modules/testing_requests/examples/full.py
new file mode 100644
index 0000000..a7741b8
--- /dev/null
+++ b/recipe_modules/testing_requests/examples/full.py
@@ -0,0 +1,182 @@
+# Copyright 2019 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from PB.infra.fuchsia import Fuchsia
+from recipe_engine.recipe_api import Property
+
+DEPS = [
+    'fuchsia/artifacts',
+    'fuchsia/build',
+    'fuchsia/buildbucket_util',
+    'fuchsia/checkout',
+    'fuchsia/experimental',
+    'fuchsia/fuchsia',
+    'fuchsia/testing',
+    'fuchsia/testing_requests',
+    'fuchsia/testsharder',
+    'recipe_engine/buildbucket',
+    'recipe_engine/isolated',
+    'recipe_engine/file',
+    'recipe_engine/json',
+    'recipe_engine/path',
+    'recipe_engine/properties',
+    'recipe_engine/raw_io',
+    'recipe_engine/step',
+    'recipe_engine/swarming',
+]
+
+PROPERTIES = {
+    'build_artifact_hash':
+        Property(
+            kind=str,
+            help='Hash for which build artifact may be downloaded',
+            default='abc'),
+    'device_type':
+        Property(
+            kind=str,
+            help='Passed through to spec field Fuchsia.Test.device_type',
+            default='QEMU'),
+    'pave':
+        Property(
+            kind=bool,
+            help='Passed through to spec field Fuchsia.Test.pave',
+            default=True),
+    'requires_secrets':
+        Property(
+            kind=bool,
+            help='Passed through to spec field Fuchsia.Test.requires_secrets',
+            default=True),
+    'test_in_shards':
+        Property(
+            kind=bool,
+            help='Passed through to spec field Fuchsia.Test.test_in_shards',
+            default=False),
+    'collect_timeout_secs':
+        Property(
+            kind=int,
+            help=('Passed through to spec field '
+                  'Fuchsia.Test.collect_timeout_secs'),
+            default=0),
+    'deprecated':
+        Property(
+            kind=bool,
+            help='Whether to use the deprecated code path',
+            default=False),
+    'per_test_timeout_secs':
+        Property(
+            kind=int,
+            help='Passed through to spec field Fuchsia.Test.per_test_timeout_secs',
+            default=0),
+    'use_runtests':
+        Property(kind=bool, help='Whether to use runtests', default=False),
+}
+
+
+def RunSteps(api, build_artifact_hash, device_type, pave, requires_secrets,
+             test_in_shards, collect_timeout_secs, deprecated,
+             per_test_timeout_secs, use_runtests):
+  build_artifacts = api.build.BuildArtifacts.download(api, build_artifact_hash)
+
+  # Configure context of uploaded artifacts for test task construction.
+  api.artifacts.gcs_bucket = 'fuchsia-artifacts'
+  api.artifacts.uuid = api.buildbucket_util.id
+
+  test_spec = Fuchsia.Test(
+      device_type=device_type,
+      pave=pave,
+      pool='fuchsia.tests',
+      requires_secrets=requires_secrets,
+      test_in_shards=test_in_shards,
+      collect_timeout_secs=collect_timeout_secs,
+      per_test_timeout_secs=per_test_timeout_secs,
+      use_runtests=use_runtests,
+  )
+
+  if deprecated:
+    shard_requests = api.testing_requests.deprecated_shard_requests(
+        build_artifacts,
+        api.testing_requests.deprecated_test_cmds(test_spec),
+        test_spec.device_type,
+        test_spec.pool,
+        test_spec.timeout_secs,
+        test_spec.pave,
+        requires_secrets=test_spec.requires_secrets)
+    assert len(shard_requests) == 1
+  else:
+    _ = api.testing_requests.shard_requests(
+        build_artifacts, api.buildbucket.build, test_spec.per_test_timeout_secs,
+        test_spec.pool, test_spec.swarming_expiration_timeout_secs,
+        test_spec.swarming_io_timeout_secs, test_spec.use_runtests,
+        test_spec.timeout_secs)
+
+
+def GenTests(api):
+  # For coverage
+  api.testing_requests.task_requests_step_data(
+      [api.testing_requests.task_request_jsonish(False)], '')
+  api.testing_requests.default_tests()
+
+  testsharder_tests = [
+      api.testsharder.test(
+          name='TEST',
+          label='//path/to/test:test(//toolchain)',
+          os='linux',
+          path='/path/to/test',
+          deps=['/path/to/dep'],
+      )
+  ]
+
+  # Test cases for running Fuchsia tests as a swarming task.
+  yield (api.test('deprecated_with_secrets') + api.properties(
+      deprecated=True, requires_secrets=True, per_test_timeout_secs=1) +
+         api.testing_requests.secrets_step_data())
+
+  yield api.test('deprecated_non_emu') + api.properties(
+      deprecated=True, pave=False, device_type='DEVICE TYPE')
+
+  yield api.test('not-emu') + api.testing_requests.shards_step_data(shards=[
+      api.testsharder.shard(
+          name='NAME',
+          tests=testsharder_tests,
+          dimensions={'device_type': 'DEVICE TYPE'},
+          netboot=True,
+          service_account='my-service-account@example.com',
+      )
+  ]) + api.properties(
+      use_runtests=True, per_test_timeout_secs=1)
+
+  yield api.test('legacy_qemu') + api.testing_requests.shards_step_data(shards=[
+      api.testsharder.shard(
+          name='NAME',
+          tests=testsharder_tests,
+          dimensions={'device_type': 'QEMU'},
+      )
+  ]) + api.properties(**{
+      'experimental.ssh_into_qemu': False,
+      'per_test_timeout_secs': 1
+  }) + api.testing_requests.args_test_data(variants=['asan'])
+
+  yield api.test('legacy_aemu') + api.testing_requests.shards_step_data(shards=[
+      api.testsharder.shard(
+          name='NAME',
+          tests=testsharder_tests,
+          dimensions={'device_type': 'AEMU'},
+      )
+  ]) + api.properties(**{'experimental.ssh_into_qemu': False})
+
+  yield api.test('qemu') + api.testing_requests.shards_step_data(shards=[
+      api.testsharder.shard(
+          name='NAME',
+          tests=testsharder_tests,
+          dimensions={'device_type': 'QEMU'},
+      )
+  ]) + api.properties(per_test_timeout_secs=1)
+
+  yield api.test('aemu') + api.testing_requests.shards_step_data(shards=[
+      api.testsharder.shard(
+          name='NAME',
+          tests=testsharder_tests,
+          dimensions={'device_type': 'AEMU'},
+      )
+  ])
diff --git a/recipe_modules/testing_requests/test_api.py b/recipe_modules/testing_requests/test_api.py
new file mode 100644
index 0000000..bfb13df
--- /dev/null
+++ b/recipe_modules/testing_requests/test_api.py
@@ -0,0 +1,114 @@
+# Copyright 2019 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from recipe_engine import recipe_test_api
+
+
+class FuchsiaTestingRequestsTestApi(recipe_test_api.RecipeTestApi):
+
+  EXAMPLE_TESTS_JSON = [
+      {
+          'test': {
+              'name': 'hello',
+              'label': '//a/b/c:hello_test(//toolchain)',
+              'os': 'fuchsia',
+              'path': '/path/to/hello',
+              'package_url': 'fuchsia-pkg://fuchsia.com/hello',
+          }
+      },
+      {
+          'test': {
+              'name': 'goodbye',
+              'label': '//a/b/c:goodbye_test(//toolchain)',
+              'os': 'fuchsia',
+              'path': '/path/to/goodbye',
+              'package_url': 'fuchsia-pkg://fuchsia.com/goodbye',
+          }
+      },
+  ]
+
+  def default_tests(self):
+    """Returns mock step data for the output of testsharder.
+
+    Returns:
+      list(testsharder.Test)
+    """
+    return [
+        self.m.testsharder.test(**t['test']) for t in self.EXAMPLE_TESTS_JSON
+    ]
+
+  def task_request_jsonish(self, legacy_qemu):
+    ret = self.m.swarming.example_task_request_jsonish()
+    ret['tags'] = ['uses_legacy_qemu:%s' % str(legacy_qemu).lower()]
+    return ret
+
+  def task_requests_step_data(self, task_requests, step_name):
+    """Returns mock step data for swarming task requests.
+
+    This should be used by any test which calls api.testing_requests.shard_requests() and expects
+    to shard tests.
+
+    Args:
+      shards (seq[dict]): A set of example shards which should
+        be used as step data for the result of invoking the testsharder.
+      step_name (str): name to use for step data
+
+    Returns:
+      RecipeTestApi.step_data for the extract_results step.
+    """
+    return self.step_data(step_name, self.m.json.output(task_requests))
+
+  def shards_step_data(self,
+                       shards,
+                       step_name='download build artifacts.load test shards'):
+    """Returns mock step data for test shards.
+
+    This should be used by any test which calls api.fuchsia.test*() and expects
+    to shard tests.
+
+    Args:
+      shards (seq[api.testsharder.Shard]): A set of example shards which should
+        be used as step data for the result of invoking the testsharder.
+      step_name (str): name to use for step data
+
+    Returns:
+      RecipeTestApi.step_data for the extract_results step.
+    """
+    return self.m.testsharder.execute(step_name=step_name, shards=shards)
+
+  def secrets_step_data(self):
+    """Returns mock step data for the secrets pipeline.
+
+    This should be used by any test which calls api.fuchsia.test() with
+    requires_secrets is set to True.
+
+    Returns:
+      list(RecipeTestApi.step_data) for the steps around secrets decryption.
+    """
+    secret_name = 'auth-token'
+    step_data = self.step_data(
+        'process secret specs.list',
+        self.m.file.listdir([
+            '%s.json' % secret_name,
+            'ciphertext'  # the 'ciphertext' subdir, which will be skipped.
+        ]))
+    step_data += self.step_data(
+        'process secret specs.read spec for %s' % secret_name,
+        self.m.json.output({
+            'cloudkms_key_path': 'key-path',
+        }))
+    step_data += self.step_data(
+        'process secret specs.decrypt secret for %s' % secret_name,
+        self.m.raw_io.output_text('plaintext'))
+    return step_data
+
+  def args_test_data(self, target='x64', variants=None):
+    args = self.m.json.output({
+        'board': 'boards/x64.gni',
+        'build_type': 'release',
+        'product': 'products/core.gni',
+        'target': target,
+        'variants': variants if variants else [],
+    })
+    return self.step_data('download build artifacts.read args.json', args)
diff --git a/recipes/fuchsia.py b/recipes/fuchsia.py
index 7c6cb94..158a3a0 100644
--- a/recipes/fuchsia.py
+++ b/recipes/fuchsia.py
@@ -35,6 +35,7 @@
     'fuchsia/tar',
     'fuchsia/testsharder',
     'fuchsia/testing',
+    'fuchsia/testing_requests',
     'fuchsia/spec',
     'recipe_engine/buildbucket',
     'recipe_engine/cipd',
@@ -253,7 +254,7 @@
   orchestration_inputs = None
   if spec.build.run_tests:
     if spec.test.test_in_shards:
-      shard_requests = api.testing.shard_requests(
+      shard_requests = api.testing_requests.shard_requests(
           build_artifacts,
           bb_build,
           spec.test.per_test_timeout_secs,
@@ -263,9 +264,9 @@
           spec.test.use_runtests,
           timeout_secs=spec.test.timeout_secs)
     else:
-      shard_requests = api.testing.deprecated_shard_requests(
+      shard_requests = api.testing_requests.deprecated_shard_requests(
           build_artifacts,
-          api.testing.deprecated_test_cmds(spec),
+          api.testing_requests.deprecated_test_cmds(spec.test),
           spec.test.device_type,
           spec.test.pool,
           spec.test.timeout_secs,
@@ -413,12 +414,12 @@
                 ),
             ],
             iteration=0) +
-        api.testing.shards_step_data(
+        api.testing_requests.shards_step_data(
             step_name='create test shards',
             shards=[
                 api.testsharder.shard(
                     name='QEMU',
-                    tests=api.testing.default_tests(),
+                    tests=api.testing_requests.default_tests(),
                     dimensions=dict(device_type='QEMU'),
                 ),
             ]) +
diff --git a/recipes/fuchsia/build.py b/recipes/fuchsia/build.py
index 52b5758..246bf1f 100644
--- a/recipes/fuchsia/build.py
+++ b/recipes/fuchsia/build.py
@@ -26,7 +26,7 @@
     'fuchsia/jiri',
     'fuchsia/jsonutil',
     'fuchsia/spec',
-    'fuchsia/testing',
+    'fuchsia/testing_requests',
     'fuchsia/testsharder',
     'fuchsia/upload_debug_symbols',
     'recipe_engine/buildbucket',
@@ -249,7 +249,7 @@
 
     build_artifacts = build.get_artifacts(shards)
     if spec.test.test_in_shards:
-      shard_requests = api.testing.shard_requests(
+      shard_requests = api.testing_requests.shard_requests(
           build_artifacts,
           buildbucket_build,
           spec.test.per_test_timeout_secs,
@@ -259,9 +259,9 @@
           spec.test.use_runtests,
           timeout_secs=spec.test.timeout_secs)
     else:
-      shard_requests = api.testing.deprecated_shard_requests(
+      shard_requests = api.testing_requests.deprecated_shard_requests(
           build_artifacts,
-          api.testing.deprecated_test_cmds(spec),
+          api.testing_requests.deprecated_test_cmds(spec.test),
           spec.test.device_type,
           spec.test.pool,
           spec.test.timeout_secs,
diff --git a/recipes/fuchsia/fuchsia.py b/recipes/fuchsia/fuchsia.py
index 82b537e..31b7243 100644
--- a/recipes/fuchsia/fuchsia.py
+++ b/recipes/fuchsia/fuchsia.py
@@ -48,6 +48,7 @@
     'fuchsia/gitiles',
     'fuchsia/spec',
     'fuchsia/testing',
+    'fuchsia/testing_requests',
     'fuchsia/testsharder',
     'recipe_engine/buildbucket',
     'recipe_engine/file',
@@ -352,12 +353,12 @@
 
   def download_step_data():
     task_request_jsonish = api.testing.task_request_jsonish(legacy_qemu=True)
-    return api.testing.shards_step_data(
+    return api.testing_requests.shards_step_data(
         step_name='build.download test orchestration inputs.load test shards',
         shards=[
             api.testsharder.shard(
                 name='QEMU',
-                tests=api.testing.default_tests(),
+                tests=api.testing_requests.default_tests(),
                 dimensions=dict(device_type='QEMU'),
             ),
         ]) + api.testing.task_requests_step_data(
diff --git a/recipes/fuchsia_perf.py b/recipes/fuchsia_perf.py
index 047b06f..b550b4b 100644
--- a/recipes/fuchsia_perf.py
+++ b/recipes/fuchsia_perf.py
@@ -24,6 +24,7 @@
     'fuchsia/fuchsia',
     'fuchsia/minfs',
     'fuchsia/testing',
+    'fuchsia/testing_requests',
     'fuchsia/testsharder',
     'fuchsia/upload',
     'recipe_engine/buildbucket',
@@ -162,7 +163,7 @@
   # yapf: disable
   test_cmds = [
       ' '.join(['/pkgfs/packages/%s/0/bin/benchmarks.sh' % benchmarks_package,
-                api.testing.results_dir_on_target,
+                api.testing_requests.results_dir_on_target,
                 '--catapult-converter-args',
                 '--bots', dashboard_bots_name,
                 '--masters', dashboard_masters_name,
@@ -189,7 +190,7 @@
 
   build.upload_debug_symbols(debug_symbol_gcs_bucket=debug_symbol_gcs_bucket)
 
-  shard_requests = api.testing.deprecated_shard_requests(
+  shard_requests = api.testing_requests.deprecated_shard_requests(
       build_artifacts, test_cmds, device_type, test_pool, test_timeout_secs,
       pave)
 
diff --git a/recipes/fuchsia_perfcompare.py b/recipes/fuchsia_perfcompare.py
index 5655e77..11a0434 100644
--- a/recipes/fuchsia_perfcompare.py
+++ b/recipes/fuchsia_perfcompare.py
@@ -22,6 +22,7 @@
     'fuchsia/checkout',
     'fuchsia/fuchsia',
     'fuchsia/testing',
+    'fuchsia/testing_requests',
     'recipe_engine/buildbucket',
     'recipe_engine/context',
     'recipe_engine/file',
@@ -145,7 +146,7 @@
   test_cmds = [
       ' '.join([
           '/pkgfs/packages/fuchsia_benchmarks/0/bin/benchmarks_perfcompare.sh',
-          api.testing.results_dir_on_target
+          api.testing_requests.results_dir_on_target
       ])
   ]
 
@@ -181,7 +182,7 @@
       api.step('binary size data', ['cat', snapshot_file])
 
       build_artifacts = build.get_artifacts()
-      shard_requests = api.testing.deprecated_shard_requests(
+      shard_requests = api.testing_requests.deprecated_shard_requests(
           build_artifacts, test_cmds, device_type, test_pool, test_timeout_secs,
           pave)
       orchestration_inputs = api.build.TestOrchestrationInputs(