anchor.diff:          | Modals.Str _ -> ()
           | Modals.Link link ->
               if not (Map.containsKey link.LinkName Modals.modals) then
  -                printfn "Room %A has an invalid modal link: %s" kvp.Value link.LinkName+                printfn "Page %s has an invalid modal link: %s" kvp.Value.Name link.LinkName
positive.code: 
  for kvp in pages do
      if not (Set.contains kvp.Value.Name allRoutedPages) && kvp.Value.Name <> "start" then
          printfn "Page %A is not reachable from any other pages" kvp.Value
      for continuation in kvp.Value.Continuations do
          if not (Map.containsKey continuation.NextPageName pages) then
              printfn "Page %A has an invalid continuation: %s" kvp.Value continuation.NextPageName
          match continuation.Condition with
          | SkillCheckRequired (attr, skill, target, effect) ->
              match effect with
              | AlternatePage name ->
              if not (Map.containsKey name pages) then
                      printfn "Continuation %A has an invalid alternate room." continuation
              | AttributeDamage -> ()
          | _ -> ()
      for part in List.collect Modals.parseLine kvp.Value.Text do
  
negative.code:                     mountains...""",
                  "eresh-1")]
          )
  
  
          pb.Build(
              "eresh-1",
              [
                  """It was two days' journey along the [[Great Eastern Road]], making a good pace through the foothills
                  before the mountains proper began, when I finally caught up with some of Greltza's scragglers.  It was
                  early afternoon, right after I had finished my midday meal of dried pork strips that tasted like the
                  saddle I was sitting in while I ate them.  I had to make good time to reduce their lead, and that meant
                  no time to prepare food."""
              ],
              [
                  cb.Build(
                      "Seeing them, I spurred my monitor beetle on, in an attempt to catch up to the bandits.",
                      "eresh-2-close",
                      SkillCheckRequired (Will, Sneaking, 1, AlternatePage "eresh-2-close-spotted"))
                  cb.Build(
                      """Seeing them, I let my monitor beetle maintain its pace.  It wouldn't do to be noticed this early.,
                          and I figured I could always scout their positions at night.""",
                      "eresh-2-maintain")
              ]
          )
  
          pb.Build(
              "eresh-2-close",
              [
                  """I was able to ride closer without being spotted, and I was able to count five bandits in this group.
                  They each had a circle pierced by a line, Greltza's symbol, painted on their saddlebags.  This group
                  must have been delayed from the others."""
              ],
              [
                  cb.Build(
                      "A chance like this might not come again, so I rode forward and shouted, \"Hello!\"",
                      "eresh-2-close-greeted")
                  cb.Build(
                      "A chance like this might not come again, so I rode up and prepared a sleeping spell.",
                      "eresh-2-close-sleeping",
                      SkillCheckRequired (Will, Ritual, 2, AlternatePage "eresh-2-close-sleeping-failed"))
                  cb.Build(
                      """A chance like this might not come again, so I drew my sword, and spurred my monitor beetle into a
                          charge!""",
                      "eresh-2-close-fighting")
                  cb.Build(
                      """Having gotten a good look, I pulled back again.  I had learned their faces, and could now take my
                          time to plan.""",
                      "eresh-3",
                      setFlags=["ERESH-2-INTEL"])
              ]
          )
  
  
          pb.Build(
              "middle",
              ["You made it closer..."],
  