diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
index cec2f00..c3891df 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
@@ -180,7 +180,6 @@
    *
    * <p>Preserves the original input ordering.
    */
-  // Keep this in sync with PrepareAnalysisPhaseFunction.
   public static TopLevelTargetsAndConfigsResult getTargetsWithConfigs(
       BuildConfigurationValue targetConfiguration,
       Collection<Target> targets,
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
index fbe68d4..a7b99a5 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
@@ -437,7 +437,6 @@
   //   should never make it through analysis (and especially not seed ConfiguredTargetValues)
   // TODO(gregce): merge this more with resolveConfigurations? One crucial difference is
   //   resolveConfigurations can null-return on missing deps since it executes inside Skyfunctions.
-  // Keep this in sync with {@link PrepareAnalysisPhaseFunction#resolveConfigurations}.
   public static TopLevelTargetsAndConfigsResult getConfigurationsFromExecutor(
       Iterable<TargetAndConfiguration> defaultContext,
       Multimap<BuildConfigurationValue, DependencyKey> targetsToEvaluate,
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/producers/TargetAndConfigurationProducer.java b/src/main/java/com/google/devtools/build/lib/analysis/producers/TargetAndConfigurationProducer.java
index ae4338d..c83cff9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/producers/TargetAndConfigurationProducer.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/producers/TargetAndConfigurationProducer.java
@@ -164,30 +164,47 @@
     // this. It won't be possible afterwards because null configuration keys will only be used for
     // visibility dependencies.
     BuildConfigurationKey configurationKey = preRuleTransitionKey.getConfigurationKey();
-    if ((configurationKey != null) != target.isConfigurable()) {
-      // We somehow ended up in a target that requires a non-null configuration as a dependency of
-      // one that requires a null configuration or the other way round. This is always an error, but
-      // we need to analyze the dependencies of the latter target to realize that. Short-circuit the
-      // evaluation to avoid doing useless work and running code with a null configuration that's
-      // not prepared for it.
-      sink.acceptTargetAndConfigurationError(
-          TargetAndConfigurationError.of(new InconsistentNullConfigException()));
-      return DONE;
-    }
-
-    // TODO(b/261521010): after removing the rule transition from dependency resolution, the logic
-    // here changes.
-    //
-    // A null configuration key will only be used for visibility dependencies so when that's true, a
-    // check that the target is a PackageGroup will be performed, throwing
-    // InvalidVisibilityDependencyException on failure.
     if (configurationKey == null) {
+      if (target.isConfigurable()) {
+        // We somehow ended up in a target that requires a non-null configuration but with a key
+        // that doesn't have a configuration. This is always an error, but we need to analyze the
+        // dependencies of the latter target to realize that. Short-circuit the evaluation to avoid
+        // doing useless work and running code with a null configuration that's not prepared for it.
+        sink.acceptTargetAndConfigurationError(
+            TargetAndConfigurationError.of(new InconsistentNullConfigException()));
+        return DONE;
+      }
+      // TODO(b/261521010): after removing the rule transition from dependency resolution, the logic
+      // here changes.
+      //
+      // A null configuration key will only be used for visibility dependencies so when that's
+      // true, a check that the target is a PackageGroup will be performed, throwing
+      // InvalidVisibilityDependencyException on failure.
+      //
       // The ConfiguredTargetKey cannot fan-in in this case.
       sink.acceptTargetAndConfiguration(
           new TargetAndConfiguration(target, /* configuration= */ null), preRuleTransitionKey);
       return DONE;
     }
 
+    // This may happen for top-level ConfiguredTargets.
+    //
+    // TODO(b/261521010): this may also happen for targets that are not top-level after removing
+    // rule transitions from dependency resolution. Update this comment.
+    if (!target.isConfigurable()) {
+      var nullConfiguredTargetKey =
+          ConfiguredTargetKey.builder().setDelegate(preRuleTransitionKey).build();
+      ActionLookupKey delegate = nullConfiguredTargetKey.toKey();
+      if (!delegate.equals(preRuleTransitionKey)) {
+        // Delegates to the key that already owns the null configuration.
+        delegateTo(tasks, delegate);
+        return DONE;
+      }
+      sink.acceptTargetAndConfiguration(
+          new TargetAndConfiguration(target, /* configuration= */ null), nullConfiguredTargetKey);
+      return DONE;
+    }
+
     return new RuleTransitionConfigurationProducer();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index b4eaf60..2e055bf 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -1747,7 +1747,7 @@
       ExtendedEventHandler eventHandler,
       BuildConfigurationValue originalConfig,
       Iterable<DependencyKey> keys)
-      throws TransitionException, InvalidConfigurationException, InterruptedException {
+      throws InvalidConfigurationException, InterruptedException {
     return getConfiguredTargetMapForTesting(eventHandler, originalConfig, keys).values().asList();
   }
 
@@ -1996,7 +1996,6 @@
    *
    * <p>Skips targets with loading phase errors.
    */
-  // Keep this in sync with {@link PrepareAnalysisPhaseFunction#getConfigurations}.
   // TODO(ulfjack): Remove this legacy method after switching to the Skyframe-based implementation.
   @Override
   public ConfigurationsResult getConfigurations(
@@ -2205,22 +2204,12 @@
   @VisibleForTesting
   @Nullable
   public ConfiguredTarget getConfiguredTargetForTesting(
-      ExtendedEventHandler eventHandler, Label label, BuildConfigurationValue configuration)
-      throws TransitionException, InvalidConfigurationException, InterruptedException {
-    return getConfiguredTargetForTesting(eventHandler, label, configuration, NoTransition.INSTANCE);
-  }
-
-  /** Returns a particular configured target after applying the given transition. */
-  @VisibleForTesting
-  @Nullable
-  public ConfiguredTarget getConfiguredTargetForTesting(
       ExtendedEventHandler eventHandler,
       Label label,
-      BuildConfigurationValue configuration,
-      ConfigurationTransition transition)
-      throws TransitionException, InvalidConfigurationException, InterruptedException {
+      @Nullable BuildConfigurationValue configuration)
+      throws InvalidConfigurationException, InterruptedException {
     ConfiguredTargetAndData configuredTargetAndData =
-        getConfiguredTargetAndDataForTesting(eventHandler, label, configuration, transition);
+        getConfiguredTargetAndDataForTesting(eventHandler, label, configuration);
     return configuredTargetAndData == null ? null : configuredTargetAndData.getConfiguredTarget();
   }
 
@@ -2229,29 +2218,19 @@
   public ConfiguredTargetAndData getConfiguredTargetAndDataForTesting(
       ExtendedEventHandler eventHandler,
       Label label,
-      BuildConfigurationValue configuration,
-      ConfigurationTransition transition)
-      throws TransitionException, InvalidConfigurationException, InterruptedException {
-
-    ConfigurationTransition transition1 =
-        configuration == null ? NullTransition.INSTANCE : transition;
+      @Nullable BuildConfigurationValue configuration)
+      throws InvalidConfigurationException, InterruptedException {
     DependencyKey dependencyKey =
-        DependencyKey.builder().setLabel(label).setTransition(transition1).build();
+        DependencyKey.builder()
+            .setLabel(label)
+            .setTransition(configuration == null ? NullTransition.INSTANCE : NoTransition.INSTANCE)
+            .build();
     return Iterables.getFirst(
         getConfiguredTargetsForTesting(
             eventHandler, configuration, ImmutableList.of(dependencyKey)),
         null);
   }
 
-  @VisibleForTesting
-  @Nullable
-  public ConfiguredTargetAndData getConfiguredTargetAndDataForTesting(
-      ExtendedEventHandler eventHandler, Label label, BuildConfigurationValue configuration)
-      throws TransitionException, InvalidConfigurationException, InterruptedException {
-    return getConfiguredTargetAndDataForTesting(
-        eventHandler, label, configuration, NoTransition.INSTANCE);
-  }
-
   /**
    * Invalidates Skyframe values corresponding to the given set of modified files under the given
    * path entry.
@@ -2823,6 +2802,11 @@
     return statusReporterRef.get();
   }
 
+  @VisibleForTesting
+  public void clearEmittedEventStateForTesting() {
+    emittedEventState.clear();
+  }
+
   /**
    * Initializes and syncs the graph with the given options, readying it for the next evaluation.
    *
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
index 643573d..ae534b6 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
@@ -43,11 +43,7 @@
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
-import com.google.devtools.build.lib.analysis.config.TransitionResolver;
-import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransition;
-import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
 import com.google.devtools.build.lib.analysis.configuredtargets.InputFileConfiguredTarget;
-import com.google.devtools.build.lib.analysis.starlark.StarlarkTransition;
 import com.google.devtools.build.lib.bazel.bzlmod.BazelLockFileFunction;
 import com.google.devtools.build.lib.bazel.bzlmod.BazelModuleResolutionFunction;
 import com.google.devtools.build.lib.bazel.bzlmod.FakeRegistry;
@@ -61,8 +57,6 @@
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.exec.ExecutionOptions;
 import com.google.devtools.build.lib.packages.NativeAspectClass;
-import com.google.devtools.build.lib.packages.NoSuchPackageException;
-import com.google.devtools.build.lib.packages.NoSuchTargetException;
 import com.google.devtools.build.lib.packages.PackageFactory;
 import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
@@ -553,9 +547,7 @@
     }
     try {
       return skyframeExecutor.getConfiguredTargetAndDataForTesting(reporter, parsedLabel, config);
-    } catch (StarlarkTransition.TransitionException
-        | InvalidConfigurationException
-        | InterruptedException e) {
+    } catch (InvalidConfigurationException | InterruptedException e) {
       throw new AssertionError(e);
     }
   }
@@ -603,22 +595,9 @@
       throw new AssertionError(e);
     }
     try {
-      // Need to emulate the activities of the top-level trimming transition since not going
-      // through sufficiently normal evaluation channels.
-      Target target = skyframeExecutor.getPackageManager().getTarget(reporter, parsedLabel);
-      ConfigurationTransition transition =
-          TransitionResolver.evaluateTransition(
-              configuration,
-              NoTransition.INSTANCE,
-              target,
-              ruleClassProvider.getTrimmingTransitionFactory());
       return skyframeExecutor.getConfiguredTargetAndDataForTesting(
-          reporter, parsedLabel, configuration, transition);
-    } catch (StarlarkTransition.TransitionException
-        | InvalidConfigurationException
-        | InterruptedException
-        | NoSuchPackageException
-        | NoSuchTargetException e) {
+          reporter, parsedLabel, configuration);
+    } catch (InvalidConfigurationException | InterruptedException e) {
       throw new AssertionError(e);
     }
   }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
index aa2c41c..64c494c 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
@@ -71,9 +71,6 @@
 import com.google.devtools.build.lib.analysis.config.ConfigurationResolver;
 import com.google.devtools.build.lib.analysis.config.DependencyEvaluationException;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
-import com.google.devtools.build.lib.analysis.config.TransitionResolver;
-import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransition;
-import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
 import com.google.devtools.build.lib.analysis.configuredtargets.MergedConfiguredTarget;
 import com.google.devtools.build.lib.analysis.constraints.IncompatibleTargetChecker.IncompatibleTargetException;
 import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
@@ -518,30 +515,6 @@
     return result;
   }
 
-  private ConfigurationTransition getTopLevelTransitionForTarget(
-      Label label, BuildConfigurationValue config, ExtendedEventHandler handler) {
-    Target target;
-    try {
-      target = skyframeExecutor.getPackageManager().getTarget(handler, label);
-    } catch (NoSuchPackageException | NoSuchTargetException e) {
-      // TODO(bazel-team): refactor this method so we actually throw an exception here (likely
-      // {@link TransitionException}. Every version of getConfiguredTarget runs through this
-      // method and many test cases rely on not erroring out here so be able to reach an error
-      // later on.
-      return NoTransition.INSTANCE;
-    } catch (InterruptedException e) {
-      Thread.currentThread().interrupt();
-      throw new AssertionError("Configuration of " + label + " interrupted");
-    }
-    // Return early if a rule target is in error. We don't want whatever caused the rule error to
-    // also cause problems in computing the transition (e.g. an unchecked exception).
-    if (target instanceof Rule && ((Rule) target).containsErrors()) {
-      return null;
-    }
-    return TransitionResolver.evaluateTransition(
-        config, NoTransition.INSTANCE, target, ruleClassProvider.getTrimmingTransitionFactory());
-  }
-
   /**
    * Returns a configured target for the specified target and configuration. If the target in
    * question has a top-level rule class transition, that transition is applied in the returned
@@ -551,27 +524,14 @@
    */
   public ConfiguredTarget getConfiguredTargetForTesting(
       ExtendedEventHandler eventHandler, Label label, BuildConfigurationValue config)
-      throws StarlarkTransition.TransitionException, InvalidConfigurationException,
-          InterruptedException {
-    ConfigurationTransition transition =
-        getTopLevelTransitionForTarget(label, config, eventHandler);
-    if (transition == null) {
-      return null;
-    }
-    return skyframeExecutor.getConfiguredTargetForTesting(eventHandler, label, config, transition);
+      throws InvalidConfigurationException, InterruptedException {
+    return skyframeExecutor.getConfiguredTargetForTesting(eventHandler, label, config);
   }
 
   ConfiguredTargetAndData getConfiguredTargetAndDataForTesting(
       ExtendedEventHandler eventHandler, Label label, BuildConfigurationValue config)
-      throws StarlarkTransition.TransitionException, InvalidConfigurationException,
-          InterruptedException {
-    ConfigurationTransition transition =
-        getTopLevelTransitionForTarget(label, config, eventHandler);
-    if (transition == null) {
-      return null;
-    }
-    return skyframeExecutor.getConfiguredTargetAndDataForTesting(
-        eventHandler, label, config, transition);
+      throws InvalidConfigurationException, InterruptedException {
+    return skyframeExecutor.getConfiguredTargetAndDataForTesting(eventHandler, label, config);
   }
 
   /**
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index a2aab1e..0c69cdc 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -1056,9 +1056,7 @@
   protected ConfiguredTarget getConfiguredTarget(Label label, BuildConfigurationValue config) {
     try {
       return view.getConfiguredTargetForTesting(reporter, label, config);
-    } catch (InvalidConfigurationException
-        | StarlarkTransition.TransitionException
-        | InterruptedException e) {
+    } catch (InvalidConfigurationException | InterruptedException e) {
       throw new AssertionError(e);
     }
   }
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java
index e9e208f..25c2499 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java
@@ -2987,7 +2987,10 @@
     assertContainsEvent("bad transition");
 
     // Try #2: make sure the cache doesn't suppress the error message.
+    invalidatePackages();
+    skyframeExecutor.clearEmittedEventStateForTesting();
     eventCollector.clear();
+
     getConfiguredTarget("//test:mytarget");
     assertContainsEvent("bad transition");
   }
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java
index 71dbb7c..6c84ba2 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java
@@ -27,7 +27,7 @@
 import com.google.common.collect.Lists;
 import com.google.devtools.build.lib.actions.Action;
 import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
-import com.google.devtools.build.lib.actions.ActionLookupKey;
+import com.google.devtools.build.lib.actions.ActionLookupKeyOrProxy;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.Artifact.ArtifactExpander;
 import com.google.devtools.build.lib.actions.Artifact.DerivedArtifact;
@@ -3167,7 +3167,7 @@
             DerivedArtifact.create(
                 artifact.getRoot(),
                 artifact.getExecPath().getRelative(file),
-                (ActionLookupKey) artifact.getArtifactOwner()));
+                (ActionLookupKeyOrProxy) artifact.getArtifactOwner()));
       }
     };
   }
