Quick answer: Switch one preload() to load() to break the parse-time cycle. Or extract shared content into a third scene that neither side preloads.

Scene A’s script has preload("res://b.tscn"); B’s script has preload("res://a.tscn"). Loader can’t decide which to parse first.

The Symptom

Editor or runtime error: “Cyclic reference” or “Resource depends on itself.”

The Fix

# Bad — both preload
var b_scene = preload("res://b.tscn")

# Good — runtime load on one side
var b_scene: PackedScene
func _ready():
    b_scene = load("res://b.tscn")

load() resolves at runtime. By then both scripts have parsed.

Refactor

Better long-term: extract the shared content into a third scene C that neither A nor B preloads. A and B both preload C; cycle gone.

Verifying

Switch preload to load on one side. Editor parses both scenes without error. Runtime loads succeed.

“Break the parse-time cycle. Runtime load. Or extract shared.”

Related Issues

For Godot resource not found, see resource load. For C# Resource references, see references.

Defer with load. Cycle breaks.