MMA is well designed to fix problems it creates :)

What I've found is that `Dynamic` aren't stable but `Initialization` triggers as it should. Let's use it to overwrite it's content when new session occurs:

    restartProtect[Dynamic[DateString[], UpdateInterval -> 1]]

    restartProtect[Dynamic[DateString[], UpdateInterval -> 1]]

    Dynamic[DateString[], UpdateInterval -> 1]
 
    Dynamic[DateString[], UpdateInterval -> 1]

After restart only first two lines will still work.


Here's the code:

    restartProtect[expr_] := DynamicModule[{session = $SessionID},
      expr
      ,
      SynchronousInitialization -> False,
      Initialization :> (
          If[
              session =!= $SessionID,
              SetOptions[
                  EvaluationNotebook[], 
                  DefaultDuplicateCellStyle -> "Output"
              ];
              NotebookWrite[
                  EvaluationBox[],
                  BoxData @ ReplacePart[
                      NotebookRead[EvaluationBox[]], {1, 1, 2} -> $SessionID
                  ]
              ];
              SetOptions[
                  EvaluationNotebook[], 
                  DefaultDuplicateCellStyle -> "Input"
              ]
           ]
      )
     ]


  [1]: https://i.sstatic.net/Tz68g.png