Simple recursive CTE bombs out when changing operator in the WHERE clause
If you model root nodes as having parent=child, you must exclude them from the recursive clause or you'll get an infinite loop.  Your s.TopDate &lt; d.TopDate is currently the only thing in your query preventing an infinite loop.

EG, if you change &lt; to &lt;= the query will enter an infinite loop.  Note this is why (maxrecursion 0) is perhaps not a good idea.

drop table if exists #Recursion
go
create table #Recursion(parent int, child int, topdate datetime)
go
insert into #Recursion(parent,child,topdate) values (1,1,getdate());

;WITH 
Parent AS
  ( SELECT parent
         , child
         , 1 as [order]
         , TopDate
     FROM #Recursion 
    WHERE parent = child
 UNION ALL
   SELECT s.parent
        , d.child
        , d.[order] + 1
        , s.TopDate
     FROM Parent as d
     JOIN #Recursion s
       ON s.child = d.parent
    WHERE s.TopDate &lt; d.TopDate
)

  SELECT parent
       , child
       , [order]
    FROM Parent 
ORDER BY parent, [order] desc
OPTION (maxrecursion 0);


Also

ON s.child = d.parent


should probably be 

ON d.child = s.parent


As you appear to be starting at the root nodes, so you need to recurse down by UNION ALL-ing rows whose parent is the previous iteration's child.