[isolate] Use go isolate binary

The isolate.py script is deprecated and should no longer be used. The
new go binary has feature parity and is distributed via CIPD instead of
via git.

* Remove unused parent_isolate feature.
* Remove custom gclient hack to checkout swarming_client.
* Remove build/swarming_client dependency.

Bug: https://crbug.com/1082177
Change-Id: I9b4870300e1b2269f9b338b89546cafaa393a5ce
Reviewed-on: https://dart-review.googlesource.com/c/recipes/+/148520
Reviewed-by: Karl Klose <karlklose@google.com>
diff --git a/README.recipes.md b/README.recipes.md
index 83efa70..a623fd1 100644
--- a/README.recipes.md
+++ b/README.recipes.md
@@ -33,65 +33,59 @@
 &mdash; **def [schedule](/recipe_modules/bisect_build/api.py#20)(self, repo_url, reason):**
 ### *recipe_modules* / [dart](/recipe_modules/dart)
 
-[DEPS](/recipe_modules/dart/__init__.py#5): [build/goma][build/recipe_modules/goma], [build/swarming\_client][build/recipe_modules/swarming_client], [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/depot\_tools][depot_tools/recipe_modules/depot_tools], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [depot\_tools/git][depot_tools/recipe_modules/git], [depot\_tools/gsutil][depot_tools/recipe_modules/gsutil], [depot\_tools/tryserver][depot_tools/recipe_modules/tryserver], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/runtime][recipe_engine/recipe_modules/runtime], [recipe\_engine/service\_account][recipe_engine/recipe_modules/service_account], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/swarming][recipe_engine/recipe_modules/swarming]
+[DEPS](/recipe_modules/dart/__init__.py#5): [build/goma][build/recipe_modules/goma], [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/depot\_tools][depot_tools/recipe_modules/depot_tools], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [depot\_tools/git][depot_tools/recipe_modules/git], [depot\_tools/gsutil][depot_tools/recipe_modules/gsutil], [depot\_tools/tryserver][depot_tools/recipe_modules/tryserver], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/isolated][recipe_engine/recipe_modules/isolated], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/runtime][recipe_engine/recipe_modules/runtime], [recipe\_engine/service\_account][recipe_engine/recipe_modules/service_account], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/swarming][recipe_engine/recipe_modules/swarming]
 
-#### **class [DartApi](/recipe_modules/dart/api.py#40)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
+#### **class [DartApi](/recipe_modules/dart/api.py#36)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
 
 Recipe module for code commonly used in dart recipes.
 
 Shouldn't be used elsewhere.
 
-&mdash; **def [build](/recipe_modules/dart/api.py#108)(self, build_args=None, name='build dart'):**
+&mdash; **def [build](/recipe_modules/dart/api.py#109)(self, build_args=None, name='build dart'):**
 
 Builds dart using the specified build_args
 
-&mdash; **def [checkout](/recipe_modules/dart/api.py#44)(self, clobber=False):**
+&mdash; **def [checkout](/recipe_modules/dart/api.py#45)(self, clobber=False):**
 
 Checks out the dart code and prepares it for building.
 
-&mdash; **def [collect\_all](/recipe_modules/dart/api.py#288)(self, steps):**
+&mdash; **def [collect\_all](/recipe_modules/dart/api.py#284)(self, steps):**
 
 Collects the results of a sharded test run.
 
-&mdash; **def [commit\_id](/recipe_modules/dart/api.py#101)(self):**
-
-The commit hash of a CI build or the patch set of a CQ build
-
-&mdash; **def [dart\_executable](/recipe_modules/dart/api.py#95)(self):**
+&mdash; **def [dart\_executable](/recipe_modules/dart/api.py#96)(self):**
 
 Returns the path to the checked-in SDK dart executable.
 
-&mdash; **def [delete\_debug\_log](/recipe_modules/dart/api.py#606)(self):**
+&mdash; **def [delete\_debug\_log](/recipe_modules/dart/api.py#602)(self):**
 
 Deletes the debug log file
 
-&mdash; **def [download\_browser](/recipe_modules/dart/api.py#888)(self, runtime, version):**
+&mdash; **def [download\_browser](/recipe_modules/dart/api.py#884)(self, runtime, version):**
 
-&mdash; **def [download\_parent\_isolate](/recipe_modules/dart/api.py#155)(self):**
-
-&mdash; **def [get\_secret](/recipe_modules/dart/api.py#64)(self, name):**
+&mdash; **def [get\_secret](/recipe_modules/dart/api.py#62)(self, name):**
 
 Decrypts the specified secret and returns the location of the result
 
-&mdash; **def [kill\_tasks](/recipe_modules/dart/api.py#87)(self, ok_ret='any'):**
+&mdash; **def [kill\_tasks](/recipe_modules/dart/api.py#84)(self, ok_ret='any'):**
 
 Kills leftover tasks from previous runs or steps.
 
-&mdash; **def [read\_debug\_log](/recipe_modules/dart/api.py#594)(self):**
+&mdash; **def [read\_debug\_log](/recipe_modules/dart/api.py#590)(self):**
 
 Reads the debug log file
 
-&mdash; **def [shard](/recipe_modules/dart/api.py#172)(self, name, isolate_hash, test_args, os, cpu='x86-64', pool='dart.tests', num_shards=0, last_shard_is_local=False, cipd_ensure_file=None, ignore_failure=False):**
+&mdash; **def [shard](/recipe_modules/dart/api.py#168)(self, name, isolate_hash, test_args, os, cpu='x86-64', pool='dart.tests', num_shards=0, last_shard_is_local=False, cipd_ensure_file=None, ignore_failure=False):**
 
 Runs test.py in the given isolate, sharded over several swarming tasks.
 Returns the created tasks, which can be collected with collect_all().
 
-&mdash; **def [test](/recipe_modules/dart/api.py#612)(self, test_data):**
+&mdash; **def [test](/recipe_modules/dart/api.py#608)(self, test_data):**
 
 Reads the test-matrix.json file in checkout and runs each step listed
 in the file.
 
-&mdash; **def [upload\_isolate](/recipe_modules/dart/api.py#132)(self, isolate_fileset):**
+&mdash; **def [upload\_isolate](/recipe_modules/dart/api.py#133)(self, isolate_fileset):**
 
 Builds an isolate
 ## Recipes
@@ -173,9 +167,9 @@
 &mdash; **def [RunSteps](/recipes/dart/linearize.py#24)(api):**
 ### *recipes* / [dart/neo](/recipes/dart/neo.py)
 
-[DEPS](/recipes/dart/neo.py#5): [build/swarming\_client][build/recipe_modules/swarming_client], [dart](#recipe_modules-dart), [depot\_tools/osx\_sdk][depot_tools/recipe_modules/osx_sdk], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step]
+[DEPS](/recipes/dart/neo.py#5): [dart](#recipe_modules-dart), [depot\_tools/osx\_sdk][depot_tools/recipe_modules/osx_sdk], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io]
 
-&mdash; **def [RunSteps](/recipes/dart/neo.py#53)(api):**
+&mdash; **def [RunSteps](/recipes/dart/neo.py#50)(api):**
 ### *recipes* / [dart/package\_co19](/recipes/dart/package_co19.py)
 
 [DEPS](/recipes/dart/package_co19.py#8): [depot\_tools/git][depot_tools/recipe_modules/git], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step]
@@ -193,7 +187,6 @@
 &mdash; **def [RunSteps](/recipe_modules/dart/examples/example-get_secret.py#12)(api):**
 
 [build/recipe_modules/goma]: https://chromium.googlesource.com/chromium/tools/build.git/+/1b536a38323d5aa2b35e593e263465c9f457cbd1/scripts/slave/README.recipes.md#recipe_modules-goma
-[build/recipe_modules/swarming_client]: https://chromium.googlesource.com/chromium/tools/build.git/+/1b536a38323d5aa2b35e593e263465c9f457cbd1/scripts/slave/README.recipes.md#recipe_modules-swarming_client
 [depot_tools/recipe_modules/bot_update]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/d24ae26520d089e89c2ecd8d6154e36fb9aa42ab/recipes/README.recipes.md#recipe_modules-bot_update
 [depot_tools/recipe_modules/depot_tools]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/d24ae26520d089e89c2ecd8d6154e36fb9aa42ab/recipes/README.recipes.md#recipe_modules-depot_tools
 [depot_tools/recipe_modules/gclient]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/d24ae26520d089e89c2ecd8d6154e36fb9aa42ab/recipes/README.recipes.md#recipe_modules-gclient
@@ -206,6 +199,7 @@
 [recipe_engine/recipe_modules/cipd]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/3809ffa82d6bc08da66eae89bc87cdbe5c5b5905/README.recipes.md#recipe_modules-cipd
 [recipe_engine/recipe_modules/context]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/3809ffa82d6bc08da66eae89bc87cdbe5c5b5905/README.recipes.md#recipe_modules-context
 [recipe_engine/recipe_modules/file]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/3809ffa82d6bc08da66eae89bc87cdbe5c5b5905/README.recipes.md#recipe_modules-file
+[recipe_engine/recipe_modules/isolated]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/3809ffa82d6bc08da66eae89bc87cdbe5c5b5905/README.recipes.md#recipe_modules-isolated
 [recipe_engine/recipe_modules/json]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/3809ffa82d6bc08da66eae89bc87cdbe5c5b5905/README.recipes.md#recipe_modules-json
 [recipe_engine/recipe_modules/path]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/3809ffa82d6bc08da66eae89bc87cdbe5c5b5905/README.recipes.md#recipe_modules-path
 [recipe_engine/recipe_modules/platform]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/3809ffa82d6bc08da66eae89bc87cdbe5c5b5905/README.recipes.md#recipe_modules-platform
diff --git a/recipe_modules/dart/__init__.py b/recipe_modules/dart/__init__.py
index c5a334c..95fb89e 100644
--- a/recipe_modules/dart/__init__.py
+++ b/recipe_modules/dart/__init__.py
@@ -14,6 +14,7 @@
     'recipe_engine/cipd',
     'recipe_engine/context',
     'recipe_engine/file',
+    'recipe_engine/isolated',
     'recipe_engine/json',
     'recipe_engine/path',
     'recipe_engine/platform',
@@ -24,5 +25,4 @@
     'recipe_engine/service_account',
     'recipe_engine/step',
     'recipe_engine/swarming',
-    'build/swarming_client',
 ]
diff --git a/recipe_modules/dart/api.py b/recipe_modules/dart/api.py
index 28e62bb..0420930 100644
--- a/recipe_modules/dart/api.py
+++ b/recipe_modules/dart/api.py
@@ -6,15 +6,11 @@
 from collections import OrderedDict
 import json, re
 
-BLACKLIST = (
-    r'(^(out|xcodebuild)[/\\](Release|Debug|Product)\w*[/\\]' +
-    r'(clang_\w*[/\\])?(generated_tests|obj)[/\\])' +
-    r'|(^tools[/\\]sdks)')
-# TODO(athom): move to third_party when swarming_client.path has a setter
-SWARMING_CLIENT_PATH = 'tools/swarming_client'
-SWARMING_CLIENT_REPO = (
-    'https://chromium.googlesource.com/infra/luci/client-py.git')
-SWARMING_CLIENT_REV = '7714cbceb37236e448809134d5e145e83600a9b3'
+PATH_FILTER = (r'(^(out|xcodebuild)[/\\](Release|Debug|Product)\w*[/\\]' +
+               r'(clang_\w*[/\\])?(generated_tests|obj)[/\\])' +
+               r'|(^tools[/\\]sdks)')
+ISOLATE_PACKAGE = 'infra/tools/luci/isolate/${platform}'
+ISOLATE_VERSION = 'git_revision:925759d89ea75996345c21cdcc80a8c540425a6f'
 
 TEST_PY_PATH = 'tools/test.py'
 BUILD_PY_PATH = 'tools/build.py'
@@ -41,12 +37,14 @@
   """Recipe module for code commonly used in dart recipes.
 
   Shouldn't be used elsewhere."""
+
+  def __init__(self, *args, **kwargs):
+    super(DartApi, self).__init__(*args, **kwargs)
+    self._isolate_client = None
+
   def checkout(self, clobber=False):
     """Checks out the dart code and prepares it for building."""
     self.m.gclient.set_config('dart')
-    sdk = self.m.gclient.c.solutions[0]
-    sdk.custom_deps['sdk/%s' % SWARMING_CLIENT_PATH] = \
-        '%s@%s' % (SWARMING_CLIENT_REPO, SWARMING_CLIENT_REV)
     self.m.goma.ensure_goma()
 
     with self.m.context(
@@ -73,14 +71,13 @@
       file_name = '%s.encrypted' % name
       self.m.gsutil.download('dart-ci-credentials', file_name, file_name)
 
-      executable_suffix = '.exe' if self.m.platform.name == 'win' else ''
+      cloudkms = self._executable(cloudkms_dir, 'cloudkms')
       secret_key = self.m.path['cleanup'].join('%s.key' % name)
-      self.m.step('cloudkms get key',
-               [cloudkms_dir.join('cloudkms%s' % executable_suffix), 'decrypt',
-               '-input', file_name,
-               '-output', secret_key,
-               'projects/dart-ci/locations/'
-                 'us-central1/keyRings/dart-ci/cryptoKeys/dart-ci'])
+      self.m.step('cloudkms get key', [
+          cloudkms, 'decrypt', '-input', file_name, '-output', secret_key,
+          'projects/dart-ci/locations/'
+          'us-central1/keyRings/dart-ci/cryptoKeys/dart-ci'
+      ])
       return secret_key
 
 
@@ -92,13 +89,17 @@
                ok_ret=ok_ret)
 
 
+  def _executable(self, path, cmd):
+    """Returns the path to the checked-in SDK dart executable."""
+    return path.join('%s.exe' % cmd if self.m.platform.name == 'win' else cmd)
+
   def dart_executable(self):
     """Returns the path to the checked-in SDK dart executable."""
-    executable = 'dart.exe' if self.m.platform.name == 'win' else 'dart'
-    return self.m.path['checkout'].join(
-      'tools','sdks', 'dart-sdk', 'bin', executable)
+    return self._executable(
+        self.m.path['checkout'].join('tools', 'sdks', 'dart-sdk', 'bin'),
+        'dart')
 
-  def commit_id(self):
+  def _commit_id(self):
     """The commit hash of a CI build or the patch set of a CQ build"""
     return str(self.m.buildbucket.gitiles_commit.id or 'refs/changes/%s/%s' %
                (self.m.buildbucket.build.input.gerrit_changes[0].change,
@@ -131,44 +132,39 @@
 
   def upload_isolate(self, isolate_fileset):
     """Builds an isolate"""
-    # TODO(athom): Use upstream isolated recipe. https://crbug.com/944902
-    if isolate_fileset == self.m.properties.get('parent_fileset_name', None):
-      return self.m.properties.get('parent_fileset')
-    step_result = self.m.python(
+    if not self._isolate_client:
+      ensure_file = self.m.cipd.EnsureFile().add_package(
+          ISOLATE_PACKAGE, ISOLATE_VERSION)
+      isolate_cache = self.m.path['cache'].join('isolate')
+      self.m.cipd.ensure(isolate_cache, ensure_file)
+      self._isolate_client = isolate_cache.join('isolate')
+    fileset_path = self.m.path['checkout'].join('%s' % isolate_fileset)
+    step_result = self.m.step(
         'upload testing fileset %s' % isolate_fileset,
-        self.m.swarming_client.path.join('isolate.py'),
-        args= ['archive',
-                 '--blacklist=%s' % BLACKLIST,
-                 '--ignore_broken_items', # TODO(athom) find a way to avoid that
-                 '-I', 'isolateserver.appspot.com',
-                 '--namespace', 'default-gzip',
-                 '-i%s' % self.m.path['checkout'].join('%s' % isolate_fileset),
-                 '-s%s' % self.m.path['checkout'].join(
-                     '%s.isolated' % isolate_fileset)],
+        [
+            self._isolate_client,
+            'archive',
+            # TODO(https://github.com/dart-lang/sdk/issues/41982):
+            #    We currently don't have build targets that produce exactly the
+            #    files needed for sharding. Instead, we have catch-all filesets
+            #    in the test matrix that include at least the files the shards
+            #    need. These filesets are not build outputs and don't know what
+            #    files the build actually produced, so they include many files
+            #    and directories that will be there in some builds, but not all.
+            #    Without -allow-missing-file-dir, these extra files/directories
+            #    cause the isolate command to fail.
+            '-allow-missing-file-dir',
+            '-ignored-path-filter-re=%s' % PATH_FILTER,
+            '-isolate=%s' % fileset_path,
+            '-isolated=%s.isolated' % fileset_path,
+            '-isolate-server=%s' % self.m.isolated.isolate_server,
+        ],
         stdout=self.m.raw_io.output('out'))
     isolate_hash = step_result.stdout.strip()[:40]
-    step_result.presentation.step_text = 'swarming fileset hash: %s' % (
-        isolate_hash)
+    step_result.presentation.step_text = 'fileset hash: %s' % isolate_hash
     return isolate_hash
 
 
-  def download_parent_isolate(self):
-    # TODO(athom): Use upstream isolated recipe. https://crbug.com/944902
-    self.m.path['checkout'] = self.m.path['cleanup']
-    isolate_hash = self.m.properties['parent_fileset']
-    fileset_name = self.m.properties['parent_fileset_name']
-    with self.m.context(cwd=self.m.path['cleanup']):
-      self.m.python(
-        'downloading fileset %s' % fileset_name,
-        self.m.swarming_client.path.join('isolateserver.py'),
-        args= ['download',
-                 '-I', 'isolateserver.appspot.com',
-                 '--namespace', 'default-gzip',
-                 '-s%s' % isolate_hash,
-                 '--target=.'],
-        stdout=self.m.raw_io.output('out'))
-
-
   def shard(self,
             name,
             isolate_hash,
@@ -568,7 +564,7 @@
       # Add more links and logs to the 'test results' step
       if self._try_builder():
         # Construct different results links for tryjobs and CI jobs
-        patchset = self.commit_id().replace('refs/changes/', '')
+        patchset = self._commit_id().replace('refs/changes/', '')
         log_url = 'https://dart-ci.firebaseapp.com/cl/%s' % patchset
       else:
         log_url = self._results_feed_url(results_str)
@@ -866,10 +862,10 @@
         flaky_json_str = self._update_flakiness_information(results_str)
         results_str = self._extend_results_records(
             results_str, self.m.path['checkout'].join('LATEST', 'results.json'),
-            flaky_json_str, self.m.path['checkout'].join(
-                'LATEST', 'flaky.json'), self.m.buildbucket.builder_name,
-            self.m.buildbucket.build.number,
-            self.m.git.get_timestamp(test_data='1234567'), self.commit_id())
+            flaky_json_str,
+            self.m.path['checkout'].join('LATEST', 'flaky.json'),
+            self.m.buildbucket.builder_name, self.m.buildbucket.build.number,
+            self.m.git.get_timestamp(test_data='1234567'), self._commit_id())
         try:
           # Try builders do not upload results, only publish to pub/sub
           with self.m.step.nest('upload new results'):
diff --git a/recipe_modules/dart/examples/example.expected/analyzer-linux-release.json b/recipe_modules/dart/examples/example.expected/analyzer-linux-release.json
index 3a0164e..46a98e9 100644
--- a/recipe_modules/dart/examples/example.expected/analyzer-linux-release.json
+++ b/recipe_modules/dart/examples/example.expected/analyzer-linux-release.json
@@ -39,7 +39,7 @@
       "-u",
       "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
       "--spec-path",
-      "cache_dir = '[CACHE]/git'\nsolutions = [{'custom_deps': {'sdk/tools/swarming_client': 'https://chromium.googlesource.com/infra/luci/client-py.git@7714cbceb37236e448809134d5e145e83600a9b3'}, 'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
+      "cache_dir = '[CACHE]/git'\nsolutions = [{'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
       "--revision_mapping_file",
       "{}",
       "--git-cache-dir",
@@ -1163,44 +1163,63 @@
   },
   {
     "cmd": [
-      "python",
-      "-u",
-      "[CACHE]/builder/sdk/tools/swarming_client/isolate.py",
-      "archive",
-      "--blacklist=(^(out|xcodebuild)[/\\\\](Release|Debug|Product)\\w*[/\\\\](clang_\\w*[/\\\\])?(generated_tests|obj)[/\\\\])|(^tools[/\\\\]sdks)",
-      "--ignore_broken_items",
-      "-I",
-      "isolateserver.appspot.com",
-      "--namespace",
-      "default-gzip",
-      "-i[CACHE]/builder/sdk/test",
-      "-s[CACHE]/builder/sdk/test.isolated"
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/isolate",
+      "-ensure-file",
+      "infra/tools/luci/isolate/${platform} git_revision:925759d89ea75996345c21cdcc80a8c540425a6f",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
     "infra_step": true,
-    "name": "upload testing fileset test",
+    "name": "ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_TEXT@swarming fileset hash: test_hash@@@"
+      "@@@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:925\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolate/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": [
-      "python",
-      "-u",
-      "[CACHE]/builder/sdk/tools/swarming_client/isolate.py",
+      "[CACHE]/isolate/isolate",
       "archive",
-      "--blacklist=(^(out|xcodebuild)[/\\\\](Release|Debug|Product)\\w*[/\\\\](clang_\\w*[/\\\\])?(generated_tests|obj)[/\\\\])|(^tools[/\\\\]sdks)",
-      "--ignore_broken_items",
-      "-I",
-      "isolateserver.appspot.com",
-      "--namespace",
-      "default-gzip",
-      "-i[CACHE]/builder/sdk/trigger",
-      "-s[CACHE]/builder/sdk/trigger.isolated"
+      "-allow-missing-file-dir",
+      "-ignored-path-filter-re=(^(out|xcodebuild)[/\\\\](Release|Debug|Product)\\w*[/\\\\](clang_\\w*[/\\\\])?(generated_tests|obj)[/\\\\])|(^tools[/\\\\]sdks)",
+      "-isolate=[CACHE]/builder/sdk/test",
+      "-isolated=[CACHE]/builder/sdk/test.isolated",
+      "-isolate-server=https://example.isolateserver.appspot.com"
+    ],
+    "infra_step": true,
+    "name": "upload testing fileset test",
+    "~followup_annotations": [
+      "@@@STEP_TEXT@fileset hash: test_hash@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/isolate/isolate",
+      "archive",
+      "-allow-missing-file-dir",
+      "-ignored-path-filter-re=(^(out|xcodebuild)[/\\\\](Release|Debug|Product)\\w*[/\\\\](clang_\\w*[/\\\\])?(generated_tests|obj)[/\\\\])|(^tools[/\\\\]sdks)",
+      "-isolate=[CACHE]/builder/sdk/trigger",
+      "-isolated=[CACHE]/builder/sdk/trigger.isolated",
+      "-isolate-server=https://example.isolateserver.appspot.com"
     ],
     "infra_step": true,
     "name": "upload testing fileset trigger",
     "~followup_annotations": [
-      "@@@STEP_TEXT@swarming fileset hash: trigger_hash@@@"
+      "@@@STEP_TEXT@fileset hash: trigger_hash@@@"
     ]
   },
   {
diff --git a/recipe_modules/dart/examples/example.expected/basic-failure.json b/recipe_modules/dart/examples/example.expected/basic-failure.json
index b9f630e..cfcf491 100644
--- a/recipe_modules/dart/examples/example.expected/basic-failure.json
+++ b/recipe_modules/dart/examples/example.expected/basic-failure.json
@@ -39,7 +39,7 @@
       "-u",
       "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
       "--spec-path",
-      "cache_dir = '[CACHE]/git'\nsolutions = [{'custom_deps': {'sdk/tools/swarming_client': 'https://chromium.googlesource.com/infra/luci/client-py.git@7714cbceb37236e448809134d5e145e83600a9b3'}, 'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
+      "cache_dir = '[CACHE]/git'\nsolutions = [{'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
       "--revision_mapping_file",
       "{}",
       "--git-cache-dir",
diff --git a/recipe_modules/dart/examples/example.expected/basic-mac.json b/recipe_modules/dart/examples/example.expected/basic-mac.json
index c1fac0c..ac26d44 100644
--- a/recipe_modules/dart/examples/example.expected/basic-mac.json
+++ b/recipe_modules/dart/examples/example.expected/basic-mac.json
@@ -39,7 +39,7 @@
       "-u",
       "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
       "--spec-path",
-      "cache_dir = '[CACHE]/git'\nsolutions = [{'custom_deps': {'sdk/tools/swarming_client': 'https://chromium.googlesource.com/infra/luci/client-py.git@7714cbceb37236e448809134d5e145e83600a9b3'}, 'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
+      "cache_dir = '[CACHE]/git'\nsolutions = [{'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
       "--revision_mapping_file",
       "{}",
       "--git-cache-dir",
@@ -872,48 +872,27 @@
     ]
   },
   {
-    "cmd": [],
-    "name": "trigger shards for test1"
-  },
-  {
-    "cmd": [],
-    "name": "trigger shards for test1.ensure swarming",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@"
-    ]
-  },
-  {
     "cmd": [
       "cipd",
       "ensure",
       "-root",
-      "[CACHE]/swarming_client",
+      "[CACHE]/isolate",
       "-ensure-file",
-      "infra/tools/luci/swarming/${platform} git_revision:2d3d6714d3e768108a1be7bfdd17c54a3693bdeb",
+      "infra/tools/luci/isolate/${platform} git_revision:925759d89ea75996345c21cdcc80a8c540425a6f",
       "-max-threads",
       "0",
       "-json-output",
       "/path/to/tmp/json"
     ],
-    "cwd": "[CACHE]/builder/sdk",
-    "env": {
-      "BUILDBOT_BUILDERNAME": "dart2js-strong-mac-x64-chrome-be"
-    },
-    "env_suffixes": {
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
     "infra_step": true,
-    "name": "trigger shards for test1.ensure swarming.ensure_installed",
+    "name": "ensure_installed (2)",
     "~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:2d3\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/swarming/resolved-platform\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"instance_id\": \"resolved-instance_id-of-git_revision:925\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolate/resolved-platform\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -923,14 +902,40 @@
   },
   {
     "cmd": [
-      "[CACHE]/swarming_client/swarming",
-      "spawn-tasks",
-      "-server",
-      "https://example.swarmingserver.appspot.com",
-      "-json-input",
-      "{\"requests\": [{\"name\": \"test1_shard_1\", \"priority\": \"25\", \"service_account\": \"\", \"task_slices\": [{\"expiration_secs\": \"3600\", \"properties\": {\"caches\": [{\"name\": \"vpython\", \"path\": \"cache/vpython\"}], \"cipd_input\": {\"packages\": [{\"package_name\": \"dart/browsers/chrome/${platform}\", \"path\": \"browsers\", \"version\": \"version:66.0.3359.139\"}, {\"package_name\": \"infra/tools/luci/vpython/${platform}\", \"path\": \"cipd_bin_packages\", \"version\": \"git_revision:b01b3ede35a24f76f21420f11d13f234848e5d34\"}, {\"package_name\": \"infra/tools/luci/vpython-native/${platform}\", \"path\": \"cipd_bin_packages\", \"version\": \"git_revision:b01b3ede35a24f76f21420f11d13f234848e5d34\"}, {\"package_name\": \"infra/3pp/tools/cpython/${platform}\", \"path\": \"cipd_bin_packages/cpython\", \"version\": \"version:2.7.17.chromium.24\"}, {\"package_name\": \"infra/3pp/tools/cpython3/${platform}\", \"path\": \"cipd_bin_packages/cpython3\", \"version\": \"version:3.8.1rc1.chromium.10\"}, {\"package_name\": \"dart/dart-sdk/${platform}\", \"path\": \"tools/sdks\", \"version\": \"\"}]}, \"command\": [\"tools/test.py\", \"--progress=status\", \"--report\", \"--time\", \"--silent-failures\", \"--write-results\", \"--write-logs\", \"--clean-exit\", \"-ndart2js-mac-chrome\", \"foo\", \"--bar\", \"-e co19, language_2\", \"--copy-coredumps\", \"--chrome=browsers/Google Chrome.app/Contents/MacOS/Google Chrome\", \"--shards=2\", \"--shard=1\", \"--output-directory=${ISOLATED_OUTDIR}\"], \"containment\": {\"containment_type\": \"AUTO\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"cpu\", \"value\": \"x86-64\"}, {\"key\": \"os\", \"value\": \"Mac\"}, {\"key\": \"pool\", \"value\": \"dart.tests\"}], \"env\": [{\"key\": \"VPYTHON_VIRTUALENV_ROOT\", \"value\": \"cache/vpython\"}], \"env_prefixes\": [{\"key\": \"PATH\", \"value\": [\"cipd_bin_packages\", \"cipd_bin_packages/bin\", \"cipd_bin_packages/cpython\", \"cipd_bin_packages/cpython/bin\", \"cipd_bin_packages/cpython3\", \"cipd_bin_packages/cpython3/bin\"]}], \"execution_timeout_secs\": \"3600\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"inputs_ref\": {\"isolated\": \"isolate_hash_123\", \"isolatedserver\": \"https://example.isolateserver.appspot.com\", \"namespace\": \"default-gzip\"}, \"io_timeout_secs\": \"1200\", \"outputs\": []}}]}, {\"name\": \"test1_shard_2\", \"priority\": \"25\", \"service_account\": \"\", \"task_slices\": [{\"expiration_secs\": \"3600\", \"properties\": {\"caches\": [{\"name\": \"vpython\", \"path\": \"cache/vpython\"}], \"cipd_input\": {\"packages\": [{\"package_name\": \"dart/browsers/chrome/${platform}\", \"path\": \"browsers\", \"version\": \"version:66.0.3359.139\"}, {\"package_name\": \"infra/tools/luci/vpython/${platform}\", \"path\": \"cipd_bin_packages\", \"version\": \"git_revision:b01b3ede35a24f76f21420f11d13f234848e5d34\"}, {\"package_name\": \"infra/tools/luci/vpython-native/${platform}\", \"path\": \"cipd_bin_packages\", \"version\": \"git_revision:b01b3ede35a24f76f21420f11d13f234848e5d34\"}, {\"package_name\": \"infra/3pp/tools/cpython/${platform}\", \"path\": \"cipd_bin_packages/cpython\", \"version\": \"version:2.7.17.chromium.24\"}, {\"package_name\": \"infra/3pp/tools/cpython3/${platform}\", \"path\": \"cipd_bin_packages/cpython3\", \"version\": \"version:3.8.1rc1.chromium.10\"}, {\"package_name\": \"dart/dart-sdk/${platform}\", \"path\": \"tools/sdks\", \"version\": \"\"}]}, \"command\": [\"tools/test.py\", \"--progress=status\", \"--report\", \"--time\", \"--silent-failures\", \"--write-results\", \"--write-logs\", \"--clean-exit\", \"-ndart2js-mac-chrome\", \"foo\", \"--bar\", \"-e co19, language_2\", \"--copy-coredumps\", \"--chrome=browsers/Google Chrome.app/Contents/MacOS/Google Chrome\", \"--shards=2\", \"--shard=2\", \"--output-directory=${ISOLATED_OUTDIR}\"], \"containment\": {\"containment_type\": \"AUTO\", \"limit_processes\": \"0\", \"limit_total_committed_memory\": \"0\", \"lower_priority\": false}, \"dimensions\": [{\"key\": \"cpu\", \"value\": \"x86-64\"}, {\"key\": \"os\", \"value\": \"Mac\"}, {\"key\": \"pool\", \"value\": \"dart.tests\"}], \"env\": [{\"key\": \"VPYTHON_VIRTUALENV_ROOT\", \"value\": \"cache/vpython\"}], \"env_prefixes\": [{\"key\": \"PATH\", \"value\": [\"cipd_bin_packages\", \"cipd_bin_packages/bin\", \"cipd_bin_packages/cpython\", \"cipd_bin_packages/cpython/bin\", \"cipd_bin_packages/cpython3\", \"cipd_bin_packages/cpython3/bin\"]}], \"execution_timeout_secs\": \"3600\", \"grace_period_secs\": \"30\", \"idempotent\": false, \"inputs_ref\": {\"isolated\": \"isolate_hash_123\", \"isolatedserver\": \"https://example.isolateserver.appspot.com\", \"namespace\": \"default-gzip\"}, \"io_timeout_secs\": \"1200\", \"outputs\": []}}]}]}",
-      "-json-output",
-      "/path/to/tmp/json"
+      "[CACHE]/isolate/isolate",
+      "archive",
+      "-allow-missing-file-dir",
+      "-ignored-path-filter-re=(^(out|xcodebuild)[/\\\\](Release|Debug|Product)\\w*[/\\\\](clang_\\w*[/\\\\])?(generated_tests|obj)[/\\\\])|(^tools[/\\\\]sdks)",
+      "-isolate=[CACHE]/builder/sdk/test",
+      "-isolated=[CACHE]/builder/sdk/test.isolated",
+      "-isolate-server=https://example.isolateserver.appspot.com"
+    ],
+    "infra_step": true,
+    "name": "upload testing fileset test",
+    "~followup_annotations": [
+      "@@@STEP_TEXT@fileset hash: @@@"
+    ]
+  },
+  {
+    "cmd": [
+      "python",
+      "-u",
+      "[CACHE]/builder/sdk/tools/test.py",
+      "--progress=status",
+      "--report",
+      "--time",
+      "--silent-failures",
+      "--write-results",
+      "--write-logs",
+      "--clean-exit",
+      "-ndart2js-mac-chrome",
+      "foo",
+      "--bar",
+      "-e co19, language_2",
+      "--copy-coredumps",
+      "--chrome=browsers/Google Chrome.app/Contents/MacOS/Google Chrome",
+      "--output-directory",
+      "[CLEANUP]/tmp_tmp_1"
     ],
     "cwd": "[CACHE]/builder/sdk",
     "env": {
@@ -942,28 +947,58 @@
       ]
     },
     "infra_step": true,
-    "name": "trigger shards for test1.trigger shards for test1",
+    "name": "test1"
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[CLEANUP]/tmp_tmp_1/logs.json",
+      "/path/to/tmp/"
+    ],
+    "cwd": "[CACHE]/builder/sdk",
+    "env": {
+      "BUILDBOT_BUILDERNAME": "dart2js-strong-mac-x64-chrome-be"
+    },
+    "env_suffixes": {
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "infra_step": true,
+    "name": "read logs.json for test1",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@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\": \"test1_shard_1\"@@@",
-      "@@@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@      \"request\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"name\": \"test1_shard_2\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      }, @@@",
-      "@@@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_LINK@task UI: test1_shard_1@https://example.swarmingserver.appspot.com/task?id=0@@@",
-      "@@@STEP_LINK@task UI: test1_shard_2@https://example.swarmingserver.appspot.com/task?id=1@@@"
+      "@@@STEP_LOG_END@logs.json@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "vpython",
+      "-u",
+      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
+      "--json-output",
+      "/path/to/tmp/json",
+      "copy",
+      "[CLEANUP]/tmp_tmp_1/results.json",
+      "/path/to/tmp/"
+    ],
+    "cwd": "[CACHE]/builder/sdk",
+    "env": {
+      "BUILDBOT_BUILDERNAME": "dart2js-strong-mac-x64-chrome-be"
+    },
+    "env_suffixes": {
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "infra_step": true,
+    "name": "read results.json for test1",
+    "~followup_annotations": [
+      "@@@STEP_LOG_END@results.json@@@"
     ]
   },
   {
@@ -995,7 +1030,7 @@
       "--bar",
       "--buildername",
       "--output-directory",
-      "[CLEANUP]/tmp_tmp_1"
+      "[CLEANUP]/tmp_tmp_2"
     ],
     "cwd": "[CACHE]/builder/sdk",
     "env": {
@@ -1017,7 +1052,7 @@
       "--json-output",
       "/path/to/tmp/json",
       "copy",
-      "[CLEANUP]/tmp_tmp_1/logs.json",
+      "[CLEANUP]/tmp_tmp_2/logs.json",
       "/path/to/tmp/"
     ],
     "cwd": "[CACHE]/builder/sdk",
@@ -1043,7 +1078,7 @@
       "--json-output",
       "/path/to/tmp/json",
       "copy",
-      "[CLEANUP]/tmp_tmp_1/results.json",
+      "[CLEANUP]/tmp_tmp_2/results.json",
       "/path/to/tmp/"
     ],
     "cwd": "[CACHE]/builder/sdk",
@@ -1080,7 +1115,7 @@
       "--copy-coredumps",
       "--chrome=browsers/Google Chrome.app/Contents/MacOS/Google Chrome",
       "--output-directory",
-      "[CLEANUP]/tmp_tmp_2"
+      "[CLEANUP]/tmp_tmp_3"
     ],
     "cwd": "[CACHE]/builder/sdk",
     "env": {
@@ -1102,7 +1137,7 @@
       "--json-output",
       "/path/to/tmp/json",
       "copy",
-      "[CLEANUP]/tmp_tmp_2/logs.json",
+      "[CLEANUP]/tmp_tmp_3/logs.json",
       "/path/to/tmp/"
     ],
     "cwd": "[CACHE]/builder/sdk",
@@ -1128,7 +1163,7 @@
       "--json-output",
       "/path/to/tmp/json",
       "copy",
-      "[CLEANUP]/tmp_tmp_2/results.json",
+      "[CLEANUP]/tmp_tmp_3/results.json",
       "/path/to/tmp/"
     ],
     "cwd": "[CACHE]/builder/sdk",
@@ -1147,158 +1182,6 @@
     ]
   },
   {
-    "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]/tmp_tmp_3",
-      "0"
-    ],
-    "infra_step": true,
-    "name": "test1_shard_1",
-    "~followup_annotations": [
-      "@@@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@    \"results\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"bot_id\": \"vm-123\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"duration\": 62.35, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"exit_code\": 0, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"name\": \"test1_shard_1\", @@@",
-      "@@@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: test1_shard_1@hello world!@@@",
-      "@@@STEP_LOG_END@task stdout+stderr: test1_shard_1@@@",
-      "@@@STEP_LINK@task isolated outputs: test1_shard_1@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/tmp_tmp_3/0/logs.json",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "read logs.json for test1_shard_1",
-    "~followup_annotations": [
-      "@@@STEP_LOG_END@logs.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/tmp_tmp_3/0/results.json",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "read results.json for test1_shard_1",
-    "~followup_annotations": [
-      "@@@STEP_LOG_END@results.json@@@"
-    ]
-  },
-  {
-    "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]/tmp_tmp_4",
-      "1"
-    ],
-    "infra_step": true,
-    "name": "test1_shard_2",
-    "~followup_annotations": [
-      "@@@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@      \"bot_id\": \"vm-123\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"duration\": 62.35, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"exit_code\": 0, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"name\": \"test1_shard_2\", @@@",
-      "@@@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: test1_shard_2@hello world!@@@",
-      "@@@STEP_LOG_END@task stdout+stderr: test1_shard_2@@@",
-      "@@@STEP_LINK@task isolated outputs: test1_shard_2@https://isolateserver.appspot.com/browse?namespace=default-gzip&hash=abc123@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/tmp_tmp_4/1/logs.json",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "read logs.json for test1_shard_2",
-    "~followup_annotations": [
-      "@@@STEP_LOG_END@logs.json@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "vpython",
-      "-u",
-      "RECIPE_MODULE[recipe_engine::file]/resources/fileutil.py",
-      "--json-output",
-      "/path/to/tmp/json",
-      "copy",
-      "[CLEANUP]/tmp_tmp_4/1/results.json",
-      "/path/to/tmp/"
-    ],
-    "infra_step": true,
-    "name": "read results.json for test1_shard_2",
-    "~followup_annotations": [
-      "@@@STEP_LOG_END@results.json@@@"
-    ]
-  },
-  {
     "cmd": [],
     "name": "download previous results"
   },
@@ -1843,22 +1726,6 @@
     ]
   },
   {
-    "cmd": [
-      "python",
-      "-u",
-      "[CLEANUP]/tools/swarming_client/isolateserver.py",
-      "download",
-      "-I",
-      "isolateserver.appspot.com",
-      "--namespace",
-      "default-gzip",
-      "-sisolate_hash_123",
-      "--target=."
-    ],
-    "cwd": "[CLEANUP]",
-    "name": "downloading fileset test"
-  },
-  {
     "name": "$result"
   }
 ]
\ No newline at end of file
diff --git a/recipe_modules/dart/examples/example.expected/basic-missing-name.json b/recipe_modules/dart/examples/example.expected/basic-missing-name.json
index 6200bcd..8195920 100644
--- a/recipe_modules/dart/examples/example.expected/basic-missing-name.json
+++ b/recipe_modules/dart/examples/example.expected/basic-missing-name.json
@@ -39,7 +39,7 @@
       "-u",
       "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
       "--spec-path",
-      "cache_dir = '[CACHE]/git'\nsolutions = [{'custom_deps': {'sdk/tools/swarming_client': 'https://chromium.googlesource.com/infra/luci/client-py.git@7714cbceb37236e448809134d5e145e83600a9b3'}, 'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
+      "cache_dir = '[CACHE]/git'\nsolutions = [{'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
       "--revision_mapping_file",
       "{}",
       "--git-cache-dir",
diff --git a/recipe_modules/dart/examples/example.expected/basic-timeout.json b/recipe_modules/dart/examples/example.expected/basic-timeout.json
index 4bb9728..18eaaaf 100644
--- a/recipe_modules/dart/examples/example.expected/basic-timeout.json
+++ b/recipe_modules/dart/examples/example.expected/basic-timeout.json
@@ -39,7 +39,7 @@
       "-u",
       "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
       "--spec-path",
-      "cache_dir = '[CACHE]/git'\nsolutions = [{'custom_deps': {'sdk/tools/swarming_client': 'https://chromium.googlesource.com/infra/luci/client-py.git@7714cbceb37236e448809134d5e145e83600a9b3'}, 'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
+      "cache_dir = '[CACHE]/git'\nsolutions = [{'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
       "--revision_mapping_file",
       "{}",
       "--git-cache-dir",
diff --git a/recipe_modules/dart/examples/example.expected/basic.json b/recipe_modules/dart/examples/example.expected/basic.json
index e8a93f2..02a1211 100644
--- a/recipe_modules/dart/examples/example.expected/basic.json
+++ b/recipe_modules/dart/examples/example.expected/basic.json
@@ -81,7 +81,7 @@
       "-u",
       "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
       "--spec-path",
-      "cache_dir = '[CACHE]/git'\nsolutions = [{'custom_deps': {'sdk/tools/swarming_client': 'https://chromium.googlesource.com/infra/luci/client-py.git@7714cbceb37236e448809134d5e145e83600a9b3'}, 'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
+      "cache_dir = '[CACHE]/git'\nsolutions = [{'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
       "--patch_root",
       "sdk",
       "--revision_mapping_file",
@@ -905,23 +905,47 @@
   },
   {
     "cmd": [
-      "python",
-      "-u",
-      "[CACHE]/builder/sdk/tools/swarming_client/isolate.py",
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/isolate",
+      "-ensure-file",
+      "infra/tools/luci/isolate/${platform} git_revision:925759d89ea75996345c21cdcc80a8c540425a6f",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
+    ],
+    "infra_step": true,
+    "name": "ensure_installed (2)",
+    "~followup_annotations": [
+      "@@@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:925\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolate/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]/isolate/isolate",
       "archive",
-      "--blacklist=(^(out|xcodebuild)[/\\\\](Release|Debug|Product)\\w*[/\\\\](clang_\\w*[/\\\\])?(generated_tests|obj)[/\\\\])|(^tools[/\\\\]sdks)",
-      "--ignore_broken_items",
-      "-I",
-      "isolateserver.appspot.com",
-      "--namespace",
-      "default-gzip",
-      "-i[CACHE]/builder/sdk/test",
-      "-s[CACHE]/builder/sdk/test.isolated"
+      "-allow-missing-file-dir",
+      "-ignored-path-filter-re=(^(out|xcodebuild)[/\\\\](Release|Debug|Product)\\w*[/\\\\](clang_\\w*[/\\\\])?(generated_tests|obj)[/\\\\])|(^tools[/\\\\]sdks)",
+      "-isolate=[CACHE]/builder/sdk/test",
+      "-isolated=[CACHE]/builder/sdk/test.isolated",
+      "-isolate-server=https://example.isolateserver.appspot.com"
     ],
     "infra_step": true,
     "name": "upload testing fileset test",
     "~followup_annotations": [
-      "@@@STEP_TEXT@swarming fileset hash: test_hash@@@"
+      "@@@STEP_TEXT@fileset hash: test_hash@@@"
     ]
   },
   {
diff --git a/recipe_modules/dart/examples/example.expected/example-android.json b/recipe_modules/dart/examples/example.expected/example-android.json
index b337f3b..b6761cb 100644
--- a/recipe_modules/dart/examples/example.expected/example-android.json
+++ b/recipe_modules/dart/examples/example.expected/example-android.json
@@ -39,7 +39,7 @@
       "-u",
       "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
       "--spec-path",
-      "cache_dir = '[CACHE]/git'\nsolutions = [{'custom_deps': {'sdk/tools/swarming_client': 'https://chromium.googlesource.com/infra/luci/client-py.git@7714cbceb37236e448809134d5e145e83600a9b3'}, 'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
+      "cache_dir = '[CACHE]/git'\nsolutions = [{'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
       "--revision_mapping_file",
       "{}",
       "--git-cache-dir",
@@ -815,23 +815,47 @@
   },
   {
     "cmd": [
-      "python",
-      "-u",
-      "[CACHE]/builder/sdk/tools/swarming_client/isolate.py",
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/isolate",
+      "-ensure-file",
+      "infra/tools/luci/isolate/${platform} git_revision:925759d89ea75996345c21cdcc80a8c540425a6f",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
+    ],
+    "infra_step": true,
+    "name": "ensure_installed",
+    "~followup_annotations": [
+      "@@@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:925\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolate/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]/isolate/isolate",
       "archive",
-      "--blacklist=(^(out|xcodebuild)[/\\\\](Release|Debug|Product)\\w*[/\\\\](clang_\\w*[/\\\\])?(generated_tests|obj)[/\\\\])|(^tools[/\\\\]sdks)",
-      "--ignore_broken_items",
-      "-I",
-      "isolateserver.appspot.com",
-      "--namespace",
-      "default-gzip",
-      "-i[CACHE]/builder/sdk/test",
-      "-s[CACHE]/builder/sdk/test.isolated"
+      "-allow-missing-file-dir",
+      "-ignored-path-filter-re=(^(out|xcodebuild)[/\\\\](Release|Debug|Product)\\w*[/\\\\](clang_\\w*[/\\\\])?(generated_tests|obj)[/\\\\])|(^tools[/\\\\]sdks)",
+      "-isolate=[CACHE]/builder/sdk/test",
+      "-isolated=[CACHE]/builder/sdk/test.isolated",
+      "-isolate-server=https://example.isolateserver.appspot.com"
     ],
     "infra_step": true,
     "name": "upload testing fileset test",
     "~followup_annotations": [
-      "@@@STEP_TEXT@swarming fileset hash: test_hash@@@"
+      "@@@STEP_TEXT@fileset hash: test_hash@@@"
     ]
   },
   {
diff --git a/recipe_modules/dart/examples/example.expected/example-mac.json b/recipe_modules/dart/examples/example.expected/example-mac.json
index 383596a..06971b8 100644
--- a/recipe_modules/dart/examples/example.expected/example-mac.json
+++ b/recipe_modules/dart/examples/example.expected/example-mac.json
@@ -39,7 +39,7 @@
       "-u",
       "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
       "--spec-path",
-      "cache_dir = '[CACHE]/git'\nsolutions = [{'custom_deps': {'sdk/tools/swarming_client': 'https://chromium.googlesource.com/infra/luci/client-py.git@7714cbceb37236e448809134d5e145e83600a9b3'}, 'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
+      "cache_dir = '[CACHE]/git'\nsolutions = [{'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
       "--revision_mapping_file",
       "{}",
       "--git-cache-dir",
diff --git a/recipe_modules/dart/examples/example.expected/fuzz-test.json b/recipe_modules/dart/examples/example.expected/fuzz-test.json
index 706f44a..4eff8c0 100644
--- a/recipe_modules/dart/examples/example.expected/fuzz-test.json
+++ b/recipe_modules/dart/examples/example.expected/fuzz-test.json
@@ -39,7 +39,7 @@
       "-u",
       "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
       "--spec-path",
-      "cache_dir = '[CACHE]/git'\nsolutions = [{'custom_deps': {'sdk/tools/swarming_client': 'https://chromium.googlesource.com/infra/luci/client-py.git@7714cbceb37236e448809134d5e145e83600a9b3'}, 'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
+      "cache_dir = '[CACHE]/git'\nsolutions = [{'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
       "--revision_mapping_file",
       "{}",
       "--git-cache-dir",
@@ -815,23 +815,47 @@
   },
   {
     "cmd": [
-      "python",
-      "-u",
-      "[CACHE]/builder/sdk/tools/swarming_client/isolate.py",
+      "cipd",
+      "ensure",
+      "-root",
+      "[CACHE]/isolate",
+      "-ensure-file",
+      "infra/tools/luci/isolate/${platform} git_revision:925759d89ea75996345c21cdcc80a8c540425a6f",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
+    ],
+    "infra_step": true,
+    "name": "ensure_installed",
+    "~followup_annotations": [
+      "@@@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:925\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolate/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]/isolate/isolate",
       "archive",
-      "--blacklist=(^(out|xcodebuild)[/\\\\](Release|Debug|Product)\\w*[/\\\\](clang_\\w*[/\\\\])?(generated_tests|obj)[/\\\\])|(^tools[/\\\\]sdks)",
-      "--ignore_broken_items",
-      "-I",
-      "isolateserver.appspot.com",
-      "--namespace",
-      "default-gzip",
-      "-i[CACHE]/builder/sdk/test",
-      "-s[CACHE]/builder/sdk/test.isolated"
+      "-allow-missing-file-dir",
+      "-ignored-path-filter-re=(^(out|xcodebuild)[/\\\\](Release|Debug|Product)\\w*[/\\\\](clang_\\w*[/\\\\])?(generated_tests|obj)[/\\\\])|(^tools[/\\\\]sdks)",
+      "-isolate=[CACHE]/builder/sdk/test",
+      "-isolated=[CACHE]/builder/sdk/test.isolated",
+      "-isolate-server=https://example.isolateserver.appspot.com"
     ],
     "infra_step": true,
     "name": "upload testing fileset test",
     "~followup_annotations": [
-      "@@@STEP_TEXT@swarming fileset hash: test_hash@@@"
+      "@@@STEP_TEXT@fileset hash: test_hash@@@"
     ]
   },
   {
diff --git a/recipe_modules/dart/examples/example.expected/vm-win.json b/recipe_modules/dart/examples/example.expected/vm-win.json
index be6b294..ca20e66 100644
--- a/recipe_modules/dart/examples/example.expected/vm-win.json
+++ b/recipe_modules/dart/examples/example.expected/vm-win.json
@@ -39,7 +39,7 @@
       "-u",
       "RECIPE_MODULE[depot_tools::bot_update]\\resources\\bot_update.py",
       "--spec-path",
-      "cache_dir = '[CACHE]\\\\git'\nsolutions = [{'custom_deps': {'sdk/tools/swarming_client': 'https://chromium.googlesource.com/infra/luci/client-py.git@7714cbceb37236e448809134d5e145e83600a9b3'}, 'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
+      "cache_dir = '[CACHE]\\\\git'\nsolutions = [{'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
       "--revision_mapping_file",
       "{}",
       "--git-cache-dir",
@@ -1200,44 +1200,63 @@
   },
   {
     "cmd": [
-      "python",
-      "-u",
-      "[CACHE]\\builder\\sdk\\tools\\swarming_client\\isolate.py",
-      "archive",
-      "--blacklist=(^(out|xcodebuild)[/\\\\](Release|Debug|Product)\\w*[/\\\\](clang_\\w*[/\\\\])?(generated_tests|obj)[/\\\\])|(^tools[/\\\\]sdks)",
-      "--ignore_broken_items",
-      "-I",
-      "isolateserver.appspot.com",
-      "--namespace",
-      "default-gzip",
-      "-i[CACHE]\\builder\\sdk\\test",
-      "-s[CACHE]\\builder\\sdk\\test.isolated"
+      "cipd.bat",
+      "ensure",
+      "-root",
+      "[CACHE]\\isolate",
+      "-ensure-file",
+      "infra/tools/luci/isolate/${platform} git_revision:925759d89ea75996345c21cdcc80a8c540425a6f",
+      "-max-threads",
+      "0",
+      "-json-output",
+      "/path/to/tmp/json"
     ],
     "infra_step": true,
-    "name": "upload testing fileset test",
+    "name": "ensure_installed",
     "~followup_annotations": [
-      "@@@STEP_TEXT@swarming fileset hash: test_hash@@@"
+      "@@@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:925\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"package\": \"infra/tools/luci/isolate/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": [
-      "python",
-      "-u",
-      "[CACHE]\\builder\\sdk\\tools\\swarming_client\\isolate.py",
+      "[CACHE]\\isolate\\isolate",
       "archive",
-      "--blacklist=(^(out|xcodebuild)[/\\\\](Release|Debug|Product)\\w*[/\\\\](clang_\\w*[/\\\\])?(generated_tests|obj)[/\\\\])|(^tools[/\\\\]sdks)",
-      "--ignore_broken_items",
-      "-I",
-      "isolateserver.appspot.com",
-      "--namespace",
-      "default-gzip",
-      "-i[CACHE]\\builder\\sdk\\trigger",
-      "-s[CACHE]\\builder\\sdk\\trigger.isolated"
+      "-allow-missing-file-dir",
+      "-ignored-path-filter-re=(^(out|xcodebuild)[/\\\\](Release|Debug|Product)\\w*[/\\\\](clang_\\w*[/\\\\])?(generated_tests|obj)[/\\\\])|(^tools[/\\\\]sdks)",
+      "-isolate=[CACHE]\\builder\\sdk\\test",
+      "-isolated=[CACHE]\\builder\\sdk\\test.isolated",
+      "-isolate-server=https://example.isolateserver.appspot.com"
+    ],
+    "infra_step": true,
+    "name": "upload testing fileset test",
+    "~followup_annotations": [
+      "@@@STEP_TEXT@fileset hash: test_hash@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]\\isolate\\isolate",
+      "archive",
+      "-allow-missing-file-dir",
+      "-ignored-path-filter-re=(^(out|xcodebuild)[/\\\\](Release|Debug|Product)\\w*[/\\\\](clang_\\w*[/\\\\])?(generated_tests|obj)[/\\\\])|(^tools[/\\\\]sdks)",
+      "-isolate=[CACHE]\\builder\\sdk\\trigger",
+      "-isolated=[CACHE]\\builder\\sdk\\trigger.isolated",
+      "-isolate-server=https://example.isolateserver.appspot.com"
     ],
     "infra_step": true,
     "name": "upload testing fileset trigger",
     "~followup_annotations": [
-      "@@@STEP_TEXT@swarming fileset hash: trigger_hash@@@"
+      "@@@STEP_TEXT@fileset hash: trigger_hash@@@"
     ]
   },
   {
diff --git a/recipe_modules/dart/examples/example.py b/recipe_modules/dart/examples/example.py
index cafdc89..20204a5 100644
--- a/recipe_modules/dart/examples/example.py
+++ b/recipe_modules/dart/examples/example.py
@@ -329,9 +329,6 @@
 
   api.dart.test(test_data=TEST_MATRIX)
 
-  if 'parent_fileset' in api.properties:
-    api.dart.download_parent_isolate()
-
 
 def _canned_step(api, name, shards=0, local_shard=True, deflake=True):
   step_name = '%s_shard_%s' % (name, 1) if shards > 0 else name
@@ -545,10 +542,7 @@
           builder='dart2js-strong-mac-x64-chrome-dev',
           git_repo='https://dart.googlesource.com/sdk',
           project='dart'),
-      api.properties(
-          clobber='True',
-          parent_fileset='isolate_hash_123',
-          parent_fileset_name='test'),
+      api.properties(clobber='True'),
       api.step_data('add fields to result records',
                     api.raw_io.output_text(RESULT_DATA)),
       api.post_process(StatusSuccess),
diff --git a/recipes/dart/forward_branch.expected/base.json b/recipes/dart/forward_branch.expected/base.json
index 68184b5..7a93b5c 100644
--- a/recipes/dart/forward_branch.expected/base.json
+++ b/recipes/dart/forward_branch.expected/base.json
@@ -39,7 +39,7 @@
       "-u",
       "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
       "--spec-path",
-      "cache_dir = '[CACHE]/git'\nsolutions = [{'custom_deps': {'sdk/tools/swarming_client': 'https://chromium.googlesource.com/infra/luci/client-py.git@7714cbceb37236e448809134d5e145e83600a9b3'}, 'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
+      "cache_dir = '[CACHE]/git'\nsolutions = [{'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
       "--revision_mapping_file",
       "{}",
       "--git-cache-dir",
diff --git a/recipes/dart/neo.expected/builders_analyzer-triggered.json b/recipes/dart/neo.expected/builders_analyzer-triggered.json
deleted file mode 100644
index 3f171d4..0000000
--- a/recipes/dart/neo.expected/builders_analyzer-triggered.json
+++ /dev/null
@@ -1,223 +0,0 @@
-[
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "RECIPE_MODULE[depot_tools::git]/resources/git_setup.py",
-      "--path",
-      "[START_DIR]/swarming.client",
-      "--url",
-      "https://chromium.googlesource.com/infra/luci/client-py.git"
-    ],
-    "env": {
-      "ANALYZER_STATE_LOCATION_OVERRIDE": "[CLEANUP]/analysis-cache"
-    },
-    "name": "git setup (swarming_client)"
-  },
-  {
-    "cmd": [
-      "git",
-      "fetch",
-      "origin",
-      "master",
-      "--progress"
-    ],
-    "cwd": "[START_DIR]/swarming.client",
-    "env": {
-      "ANALYZER_STATE_LOCATION_OVERRIDE": "[CLEANUP]/analysis-cache",
-      "PATH": "RECIPE_REPO[depot_tools]:<PATH>"
-    },
-    "infra_step": true,
-    "name": "git fetch (swarming_client)"
-  },
-  {
-    "cmd": [
-      "git",
-      "checkout",
-      "-f",
-      "FETCH_HEAD"
-    ],
-    "cwd": "[START_DIR]/swarming.client",
-    "env": {
-      "ANALYZER_STATE_LOCATION_OVERRIDE": "[CLEANUP]/analysis-cache"
-    },
-    "infra_step": true,
-    "name": "git checkout (swarming_client)"
-  },
-  {
-    "cmd": [
-      "git",
-      "rev-parse",
-      "HEAD"
-    ],
-    "cwd": "[START_DIR]/swarming.client",
-    "env": {
-      "ANALYZER_STATE_LOCATION_OVERRIDE": "[CLEANUP]/analysis-cache"
-    },
-    "infra_step": true,
-    "name": "read revision",
-    "~followup_annotations": [
-      "@@@STEP_TEXT@<br/>checked out 'deadbeef'<br/>@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "git",
-      "clean",
-      "-f",
-      "-d",
-      "-x"
-    ],
-    "cwd": "[START_DIR]/swarming.client",
-    "env": {
-      "ANALYZER_STATE_LOCATION_OVERRIDE": "[CLEANUP]/analysis-cache"
-    },
-    "infra_step": true,
-    "name": "git clean (swarming_client)"
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "sync"
-    ],
-    "cwd": "[START_DIR]/swarming.client",
-    "env": {
-      "ANALYZER_STATE_LOCATION_OVERRIDE": "[CLEANUP]/analysis-cache"
-    },
-    "infra_step": true,
-    "name": "submodule sync (swarming_client)"
-  },
-  {
-    "cmd": [
-      "git",
-      "submodule",
-      "update",
-      "--init",
-      "--recursive"
-    ],
-    "cwd": "[START_DIR]/swarming.client",
-    "env": {
-      "ANALYZER_STATE_LOCATION_OVERRIDE": "[CLEANUP]/analysis-cache"
-    },
-    "infra_step": true,
-    "name": "submodule update (swarming_client)"
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "[START_DIR]/swarming.client/isolateserver.py",
-      "download",
-      "-I",
-      "isolateserver.appspot.com",
-      "--namespace",
-      "default-gzip",
-      "-sisolate_123",
-      "--target=."
-    ],
-    "cwd": "[CLEANUP]",
-    "env": {
-      "ANALYZER_STATE_LOCATION_OVERRIDE": "[CLEANUP]/analysis-cache"
-    },
-    "name": "downloading fileset test_name"
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "[CLEANUP]/tools/task_kill.py",
-      "--kill_browsers=True",
-      "--kill_vsbuild=True"
-    ],
-    "env": {
-      "ANALYZER_STATE_LOCATION_OVERRIDE": "[CLEANUP]/analysis-cache"
-    },
-    "name": "kill processes"
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n",
-      "[CLEANUP]/tools/bots/test_matrix.json",
-      "/path/to/tmp/json"
-    ],
-    "env": {
-      "ANALYZER_STATE_LOCATION_OVERRIDE": "[CLEANUP]/analysis-cache"
-    },
-    "infra_step": true,
-    "name": "read test-matrix.json",
-    "~followup_annotations": [
-      "@@@STEP_LOG_LINE@json.output@{@@@",
-      "@@@STEP_LOG_LINE@json.output@  \"builder_configurations\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@    {@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"builders\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"dart2js-win-debug-x64-firefox\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"analyzer-linux-release-none\"@@@",
-      "@@@STEP_LOG_LINE@json.output@      ], @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"meta\": {}, @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"steps\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@        {@@@",
-      "@@@STEP_LOG_LINE@json.output@          \"arguments\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@            \"foo\", @@@",
-      "@@@STEP_LOG_LINE@json.output@            \"--bar\"@@@",
-      "@@@STEP_LOG_LINE@json.output@          ], @@@",
-      "@@@STEP_LOG_LINE@json.output@          \"name\": \"Build\", @@@",
-      "@@@STEP_LOG_LINE@json.output@          \"script\": \"tools/build.py\", @@@",
-      "@@@STEP_LOG_LINE@json.output@          \"shards\": 1@@@",
-      "@@@STEP_LOG_LINE@json.output@        }, @@@",
-      "@@@STEP_LOG_LINE@json.output@        {@@@",
-      "@@@STEP_LOG_LINE@json.output@          \"arguments\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@            \"foo\", @@@",
-      "@@@STEP_LOG_LINE@json.output@            \"--bar\", @@@",
-      "@@@STEP_LOG_LINE@json.output@            \"-e co19\", @@@",
-      "@@@STEP_LOG_LINE@json.output@            \"language_2\"@@@",
-      "@@@STEP_LOG_LINE@json.output@          ], @@@",
-      "@@@STEP_LOG_LINE@json.output@          \"name\": \"Test-step 1\", @@@",
-      "@@@STEP_LOG_LINE@json.output@          \"script\": \"tools/test.py\"@@@",
-      "@@@STEP_LOG_LINE@json.output@        }, @@@",
-      "@@@STEP_LOG_LINE@json.output@        {@@@",
-      "@@@STEP_LOG_LINE@json.output@          \"arguments\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@            \"foo\", @@@",
-      "@@@STEP_LOG_LINE@json.output@            \"--bar\", @@@",
-      "@@@STEP_LOG_LINE@json.output@            \"-mdebug\", @@@",
-      "@@@STEP_LOG_LINE@json.output@            \"-n${runtime}-foo-${mode}-${arch}-bar\"@@@",
-      "@@@STEP_LOG_LINE@json.output@          ], @@@",
-      "@@@STEP_LOG_LINE@json.output@          \"name\": \"Test-step 2\"@@@",
-      "@@@STEP_LOG_LINE@json.output@        }@@@",
-      "@@@STEP_LOG_LINE@json.output@      ]@@@",
-      "@@@STEP_LOG_LINE@json.output@    }@@@",
-      "@@@STEP_LOG_LINE@json.output@  ], @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"filesets\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"fileset1\": \"[]\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"nameoffileset\": \"[]\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }, @@@",
-      "@@@STEP_LOG_LINE@json.output@  \"global\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"chrome\": \"66.0.3359.139\", @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"firefox\": \"60.0.1\"@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@}@@@",
-      "@@@STEP_LOG_END@json.output@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "python",
-      "-u",
-      "[CLEANUP]/tools/task_kill.py",
-      "--kill_browsers=True",
-      "--kill_vsbuild=True"
-    ],
-    "env": {
-      "ANALYZER_STATE_LOCATION_OVERRIDE": "[CLEANUP]/analysis-cache"
-    },
-    "name": "kill processes (2)"
-  },
-  {
-    "failure": {
-      "humanReason": "Error, could not find builder by name analyzer-triggered in test-matrix"
-    },
-    "name": "$result"
-  }
-]
\ No newline at end of file
diff --git a/recipes/dart/neo.expected/builders_dart2js-win-debug-x64-firefox-try.json b/recipes/dart/neo.expected/builders_dart2js-win-debug-x64-firefox-try.json
index 4bf16eb..7e99b70 100644
--- a/recipes/dart/neo.expected/builders_dart2js-win-debug-x64-firefox-try.json
+++ b/recipes/dart/neo.expected/builders_dart2js-win-debug-x64-firefox-try.json
@@ -85,7 +85,7 @@
       "-u",
       "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
       "--spec-path",
-      "cache_dir = '[CACHE]/git'\nsolutions = [{'custom_deps': {'sdk/tools/swarming_client': 'https://chromium.googlesource.com/infra/luci/client-py.git@7714cbceb37236e448809134d5e145e83600a9b3'}, 'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
+      "cache_dir = '[CACHE]/git'\nsolutions = [{'deps_file': 'DEPS', 'managed': False, 'name': 'sdk', 'url': 'https://dart.googlesource.com/sdk.git'}]",
       "--patch_root",
       "sdk",
       "--revision_mapping_file",
@@ -187,8 +187,7 @@
       "@@@STEP_LOG_LINE@json.output@  \"builder_configurations\": [@@@",
       "@@@STEP_LOG_LINE@json.output@    {@@@",
       "@@@STEP_LOG_LINE@json.output@      \"builders\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"dart2js-win-debug-x64-firefox\", @@@",
-      "@@@STEP_LOG_LINE@json.output@        \"analyzer-linux-release-none\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"dart2js-win-debug-x64-firefox\"@@@",
       "@@@STEP_LOG_LINE@json.output@      ], @@@",
       "@@@STEP_LOG_LINE@json.output@      \"meta\": {}, @@@",
       "@@@STEP_LOG_LINE@json.output@      \"steps\": [@@@",
diff --git a/recipes/dart/neo.py b/recipes/dart/neo.py
index 17a92f0..05fa012 100644
--- a/recipes/dart/neo.py
+++ b/recipes/dart/neo.py
@@ -10,8 +10,6 @@
     'recipe_engine/path',
     'recipe_engine/properties',
     'recipe_engine/raw_io',
-    'recipe_engine/step',
-    'build/swarming_client',
 ]
 
 
@@ -28,7 +26,6 @@
     {
       "builders": [
         "dart2js-win-debug-x64-firefox",
-        "analyzer-linux-release-none"
       ],
       "meta": {},
       "steps": [{
@@ -59,17 +56,8 @@
 
 
 def _run_steps_impl(api):
-  # If parent_fileset is set, the bot is triggered by
-  # another builder, and we should not download the sdk.
-  # We rely on all files being in the isolate
-  if 'parent_fileset' in api.properties:
-    # todo(athom): this doesn't work on windows, see bug 785362.
-    api.swarming_client.checkout('master')
-    api.dart.download_parent_isolate()
-  else:
-    clobber = 'clobber' in api.properties
-    api.dart.checkout(clobber)
-
+  clobber = 'clobber' in api.properties
+  api.dart.checkout(clobber)
   api.dart.kill_tasks()
 
   try:
@@ -88,12 +76,3 @@
       api.step_data('add fields to result records',
                     api.raw_io.output_text('{"data":"result data"}\n')),
   )
-  yield api.test(
-      'builders/analyzer-triggered',
-      api.buildbucket.ci_build(
-          builder='analyzer-triggered',
-          git_repo='https://dart.googlesource.com/sdk',
-          project='dart'),
-      api.properties.generic(
-          parent_fileset='isolate_123', parent_fileset_name='test_name'),
-  )