{
	"artifact": "NavigationObstacle avoidance vs pathfinding in Godot",
	"created_at": "2026-07-01T15:18:23",
	"engine": "4.7-stable (official)",
	"measurement_scope": "Scenario-behavior receipt for the article demo. This is not a throughput benchmark.",
	"motion_probe": {
		"active_units": 24,
		"duration_seconds": 5.0,
		"escaped_units": 0,
		"max_desired_safe_velocity_delta": 1196.51,
		"max_stall_seconds": 0.14,
		"preset": "avoidance",
		"stall_recovery_delay_seconds": 0.14,
		"wave_spawned": 24
	},
	"route_contract": "Route status comes from an explicit spawn-to-base NavigationServer2D.map_get_path query, not from visible agent motion.",
	"scenarios": [
		{
			"avoidance_obstacle_count": 0,
			"blocker_count": 0,
			"preset": "clean",
			"rejected_attempt_visible": false,
			"route_connected": true,
			"route_delta_px": 0.0,
			"route_length_px": 1171.27,
			"route_point_count": 143,
			"status": "PATH READY",
			"tower_count": 0
		},
		{
			"avoidance_obstacle_count": 1,
			"blocker_count": 0,
			"preset": "avoidance",
			"rejected_attempt_visible": false,
			"route_connected": true,
			"route_delta_px": 0.0,
			"route_length_px": 1171.27,
			"route_point_count": 143,
			"status": "PATH UNCHANGED",
			"tower_count": 1
		},
		{
			"avoidance_obstacle_count": 0,
			"blocker_count": 1,
			"preset": "reroute",
			"rejected_attempt_visible": false,
			"route_connected": true,
			"route_delta_px": 129.73,
			"route_length_px": 1301.0,
			"route_point_count": 153,
			"status": "PATH CHANGED",
			"tower_count": 1
		},
		{
			"avoidance_obstacle_count": 0,
			"blocker_count": 1,
			"candidate_accepted_by_runtime": false,
			"candidate_center": {
				"x": 656.0,
				"y": 378.92
			},
			"candidate_rejected_by_runtime": true,
			"post_attempt_route_connected": true,
			"post_attempt_route_length_px": 1197.53,
			"post_attempt_status": "REJECTED WOULD SEAL",
			"preset": "rejected",
			"rejected_attempt_visible": true,
			"route_connected": true,
			"route_delta_px": 0.0,
			"route_length_px": 1197.53,
			"route_point_count": 145,
			"status": "REJECTED WOULD SEAL",
			"tower_count": 1
		}
	],
	"scene": "res://scenes/lab_2d_working.tscn",
	"source_notes": [
		"Field Pylon uses NavigationObstacle2D avoidance and should leave the explicit route unchanged.",
		"Wall Tower changes route data and should produce a visible route-length delta.",
		"Rejected candidate is classified by route endpoint connectivity, not by non-empty path alone."
	]
}