There seems to be rather more to the evaluation sequence of runtime filters than the "bottom to top" mentioned at The script execution model/Scope and lifetime of variables. A more complete description would seem to be:
sequence = ""
BlankClip(length=2, width=180, height=30, color=$000000)
FrameEvaluate("""sequence = sequence + "f"""", show=false, after_frame=false)
FrameEvaluate("""sequence = sequence + "e"""", show=false, after_frame=false)
FrameEvaluate("""sequence = sequence + "g"""", show=false, after_frame=true)
FrameEvaluate("""sequence = sequence + "h"""", show=false, after_frame=true)
Invert()
FrameEvaluate("""sequence = sequence + "d"""", show=false, after_frame=false)
FrameEvaluate("""sequence = sequence + "c"""", show=false, after_frame=false)
FrameEvaluate("""sequence = sequence + "i"""", show=false, after_frame=true)
FrameEvaluate("""sequence = sequence + "j"""", show=false, after_frame=true)
clip1 = last
BlankClip(length=2, width=180, height=30, color=$FFFFFF)
FrameEvaluate("""sequence = sequence + "n"""", show=false, after_frame=false)
FrameEvaluate("""sequence = sequence + "m"""", show=false, after_frame=false)
FrameEvaluate("""sequence = sequence + "o"""", show=false, after_frame=true)
FrameEvaluate("""sequence = sequence + "p"""", show=false, after_frame=true)
Invert()
FrameEvaluate("""sequence = sequence + "l"""", show=false, after_frame=false)
FrameEvaluate("""sequence = sequence + "k"""", show=false, after_frame=false)
FrameEvaluate("""sequence = sequence + "q"""", show=false, after_frame=true)
FrameEvaluate("""sequence = sequence + "r"""", show=false, after_frame=true)
clip2 = last
clip1.Dissolve(clip2, 1)
FrameEvaluate("""sequence = sequence + "b"""", show=false, after_frame=false)
FrameEvaluate("""sequence = "a"""", show=false, after_frame=false)
FrameEvaluate("""sequence = sequence + "s"""", show=false, after_frame=true)
ScriptClip("""
sequence = sequence + "t"
Subtitle(sequence)
""", show=false, after_frame=true)
Runtime filter evaluation sequence rather more complex than documented.