<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>I am also wary of us to deferring checking whole platforms and
      what not. I think that's just kicking the can down the road, and
      will result in more variance and uncertainty. It might be alright
      for those authoring PRs, but it will make Ben's job keeping the
      system running even more grueling.</p>
    <p>Before getting into these complex trade-offs, I think we should
      focus on the cornerstone issue that CI isn't incremental.</p>
    <ol>
      <li>Building and testing happen together. When tests failure
        spuriously, we also have to rebuild GHC in addition to
        re-running the tests. That's pure waste.
        <a class="moz-txt-link-freetext" href="https://gitlab.haskell.org/ghc/ghc/-/issues/13897">https://gitlab.haskell.org/ghc/ghc/-/issues/13897</a> tracks this
        more or less.</li>
      <li>We don't cache between jobs. Shake and Make do not enforce
        dependency soundness, nor cache-correctness when the build plan
        itself changes, and this had made this hard/impossible to do
        safely. Naively this only helps with stage 1 and not stage 2,
        but if we have separate stage 1 and --freeze1 stage 2 builds,
        both can be incremental. Yes, this is also lossy, but I only see
        it leading to false failures not false acceptances (if we can
        also test the stage 1 one), so I consider it safe. MRs that only
        work with a slow full build because ABI can so indicate.</li>
    </ol>
    The second, main part is quite hard to tackle, but I strongly
    believe incrementality is what we need most, and what we should
    remain focused on.<br>
    <p>John<br>
    </p>
  </body>
</html>