diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
index d9f7cf7..4106f10 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
@@ -748,7 +748,6 @@
             tsgm.get(),
             pathResolver,
             skyframeActionExecutor.getExecRoot().asFragment(),
-            PathFragment.create(directories.getRelativeOutputPath()),
             expandedFilesets);
 
     // We only need to check the action cache if we haven't done it on a previous run.
@@ -808,15 +807,12 @@
             "Input discovery returned null but no more deps were requested by %s",
             action);
       }
-      switch (addDiscoveredInputs(state, env, action)) {
-        case VALUES_MISSING:
-          return null;
-        case NO_DISCOVERED_DATA:
-          break;
-        case DISCOVERED_DATA:
-          metadataHandler = metadataHandler.transformAfterInputDiscovery(new OutputStore());
-          metadataHandler.prepareForActionExecution();
+
+      addDiscoveredInputs(state, env, action);
+      if (env.valuesMissing()) {
+        return null;
       }
+
       // When discover inputs completes, post an event with the duration values.
       env.getListener()
           .post(
@@ -866,17 +862,9 @@
           state.getExpandedFilesets();
       if (action.discoversInputs()) {
         state.discoveredInputs = action.getInputs();
-        switch (addDiscoveredInputs(state, env, action)) {
-          case VALUES_MISSING:
-            return;
-          case NO_DISCOVERED_DATA:
-            break;
-          case DISCOVERED_DATA:
-            // We are in the interesting case of an action that discovered its inputs during
-            // execution, and found some new ones, but the new ones were already present in the
-            // graph. We must therefore cache the metadata for those new ones.
-            metadataHandler =
-                metadataHandler.transformAfterInputDiscovery(metadataHandler.getOutputStore());
+        addDiscoveredInputs(state, env, action);
+        if (env.valuesMissing()) {
+          return;
         }
       }
       checkState(!env.valuesMissing(), action);
@@ -895,13 +883,7 @@
     }
   }
 
-  private enum DiscoveredState {
-    VALUES_MISSING,
-    NO_DISCOVERED_DATA,
-    DISCOVERED_DATA
-  }
-
-  private DiscoveredState addDiscoveredInputs(
+  private void addDiscoveredInputs(
       InputDiscoveryState state, Environment env, Action actionForError)
       throws InterruptedException, ActionExecutionException {
     // TODO(janakr): This code's assumptions are wrong in the face of Starlark actions with unused
@@ -919,7 +901,7 @@
     }
 
     if (unknownDiscoveredInputs.isEmpty()) {
-      return DiscoveredState.NO_DISCOVERED_DATA;
+      return;
     }
 
     SkyframeLookupResult nonMandatoryDiscovered =
@@ -980,7 +962,6 @@
             "unknown metadata for " + input.getExecPathString() + ": " + retrievedMetadata);
       }
     }
-    return env.valuesMissing() ? DiscoveredState.VALUES_MISSING : DiscoveredState.DISCOVERED_DATA;
   }
 
   @Nullable
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java
index 43d4f99..d439ebf 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java
@@ -85,11 +85,6 @@
 
   /**
    * Creates a new metadata handler.
-   *
-   * <p>If the handler is for use during input discovery, calling {@link #getMetadata} with an
-   * artifact which is neither in {@code inputArtifactData} nor {@code outputs} is tolerated and
-   * will return {@code null}. To subsequently transform the handler for regular action execution
-   * (where such a call is not permitted), use {@link #transformAfterInputDiscovery}.
    */
   static ActionMetadataHandler create(
       ActionInputMap inputArtifactData,
@@ -100,7 +95,6 @@
       TimestampGranularityMonitor tsgm,
       ArtifactPathResolver artifactPathResolver,
       PathFragment execRoot,
-      PathFragment derivedPathPrefix,
       Map<Artifact, ImmutableList<FilesetOutputSymlink>> expandedFilesets) {
     return new ActionMetadataHandler(
         inputArtifactData,
@@ -111,7 +105,6 @@
         tsgm,
         artifactPathResolver,
         execRoot,
-        derivedPathPrefix,
         createFilesetMapping(expandedFilesets, execRoot),
         new OutputStore());
   }
@@ -128,7 +121,6 @@
   private final TimestampGranularityMonitor tsgm;
   private final ArtifactPathResolver artifactPathResolver;
   private final PathFragment execRoot;
-  private final PathFragment derivedPathPrefix;
 
   private final AtomicBoolean executionMode = new AtomicBoolean(false);
   private final OutputStore store;
@@ -142,7 +134,6 @@
       TimestampGranularityMonitor tsgm,
       ArtifactPathResolver artifactPathResolver,
       PathFragment execRoot,
-      PathFragment derivedPathPrefix,
       ImmutableMap<PathFragment, FileArtifactValue> filesetMapping,
       OutputStore store) {
     this.inputArtifactData = checkNotNull(inputArtifactData);
@@ -153,38 +144,11 @@
     this.tsgm = checkNotNull(tsgm);
     this.artifactPathResolver = checkNotNull(artifactPathResolver);
     this.execRoot = checkNotNull(execRoot);
-    this.derivedPathPrefix = checkNotNull(derivedPathPrefix);
     this.filesetMapping = checkNotNull(filesetMapping);
     this.store = checkNotNull(store);
   }
 
   /**
-   * Returns a new handler mostly identical to this one, except uses the given {@code store} and
-   * does not permit {@link #getMetadata} to be called with an artifact which is neither in inputs
-   * nor outputs.
-   *
-   * <p>The returned handler will be in the mode for action cache checking. To prepare it for action
-   * execution, call {@link #prepareForActionExecution}.
-   *
-   * <p>This method is designed to be called after input discovery when a fresh handler is needed
-   * but all of the parameters in {@link #create} would be the same as the original handler.
-   */
-  ActionMetadataHandler transformAfterInputDiscovery(OutputStore store) {
-    return new ActionMetadataHandler(
-        inputArtifactData,
-        archivedTreeArtifactsEnabled,
-        outputPermissions,
-        outputs,
-        xattrProvider,
-        tsgm,
-        artifactPathResolver,
-        execRoot,
-        derivedPathPrefix,
-        filesetMapping,
-        store);
-  }
-
-  /**
    * If {@code value} represents an existing file, returns it as is, otherwise throws {@link
    * FileNotFoundException}.
    */
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandlerTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandlerTest.java
index 7b8be7e..1b574cb 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandlerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandlerTest.java
@@ -103,7 +103,6 @@
         tsgm,
         ArtifactPathResolver.IDENTITY,
         execRoot.asFragment(),
-        derivedPathPrefix,
         /* expandedFilesets= */ ImmutableMap.of());
   }
 
@@ -420,7 +419,6 @@
             tsgm,
             ArtifactPathResolver.IDENTITY,
             execRoot.asFragment(),
-            derivedPathPrefix,
             expandedFilesets);
 
     // Only the regular FileArtifactValue should have its metadata stored.
@@ -530,7 +528,6 @@
             tsgm,
             ArtifactPathResolver.IDENTITY,
             execRoot.asFragment(),
-            derivedPathPrefix,
             /* expandedFilesets= */ ImmutableMap.of());
     handler.prepareForActionExecution();
 
@@ -582,37 +579,6 @@
   }
 
   @Test
-  public void transformAfterInputDiscovery() throws Exception {
-    Artifact known =
-        ActionsTestUtil.createArtifactWithRootRelativePath(
-            outputRoot, PathFragment.create("known"));
-    Artifact unknown =
-        ActionsTestUtil.createArtifactWithRootRelativePath(
-            outputRoot, PathFragment.create("unknown"));
-    ActionMetadataHandler handler =
-        createHandler(
-            new ActionInputMap(0), /* forInputDiscovery= *//* outputs= */ ImmutableSet.of(known));
-
-    // Unknown artifact returns null during input discovery.
-    assertThat(handler.getInputMetadata(unknown)).isNull();
-
-    OutputStore newStore = new OutputStore();
-    FileArtifactValue knownMetadata =
-        RemoteFileArtifactValue.create(new byte[] {1, 2, 3}, 5, 1, /* expireAtEpochMilli= */ -1);
-    newStore.putArtifactData(known, knownMetadata);
-    ActionMetadataHandler newHandler = handler.transformAfterInputDiscovery(newStore);
-    assertThat(newHandler.getOutputStore()).isNotEqualTo(handler.getOutputStore());
-    assertThat(newHandler.getOutputStore()).isEqualTo(newStore);
-
-    assertThat(newHandler.getOutputMetadata(known)).isEqualTo(knownMetadata);
-    // Unknown artifact throws outside of input discovery.
-    // assertThrows(IllegalStateException.class, () -> newHandler.getInputMetadata(unknown));
-    // We can transform it again.
-    assertThat(newHandler.transformAfterInputDiscovery(new OutputStore())).isNotNull();
-    assertThat(chmodCalls).isEmpty();
-  }
-
-  @Test
   public void getTreeArtifactChildren_noData_returnsEmptySet() {
     SpecialArtifact treeArtifact =
         ActionsTestUtil.createTreeArtifactWithGeneratingAction(
