message: Track in-chain violations
  Summary:
  Track the number of violations in a chain.
  The `SourceBlock`s should have non-increasing values in a chain, as a chain is a trivial dominator relation.
  This is a preparation for possibly eliding chains in non-instrumenting builds.
diff: @@ -495,15 +495,47 @@ size_t hot_all_pred_cold(
  return 1;
  }
  +size_t chain_hot_violations(
  + Block* block,
  + const dominators::SimpleFastDominators<cfg::GraphInterface>&) {
  + size_t sum{0};
  + for (auto& mie : *block) {
  + if (mie.type != MFLOW_SOURCE_BLOCK) {
  + continue;
  + }
  +
  + for (auto* sb = mie.src_block.get(); sb->next != nullptr;
  + sb = sb->next.get()) {
  + // Check that each interaction has at least as high a hit value as the
  + // next SourceBlock.
  + auto* next = sb->next.get();
  + for (size_t i = 0; i != sb->vals.size(); ++i) {
  + auto sb_val = sb->get_val(i);
  + auto next_val = next->get_val(i);
  + if (sb_val) {
  + if (next_val && *sb_val < *next_val) {
  + ++sum;
  + }
  + } else if (next_val) {
  + ++sum;
  + }
  + }
  + }
  + }
  +
  + return sum;
  +}
  +
  // Ugly but necessary for constexpr below.
  using CounterFnPtr = size_t (*)(
  Block*, const dominators::SimpleFastDominators<cfg::GraphInterface>&);
  -constexpr std::array<std::pair<std::string_view, CounterFnPtr>, 3> gCounters = {
  +constexpr std::array<std::pair<std::string_view, CounterFnPtr>, 4> gCounters = {
  {
  {"~blocks~count", &count_blocks},
  {"~blocks~with~source~blocks", &count_block_has_sbs},
  {"~assessment~source~blocks~total", &count_all_sbs},
  + {"~flow~violation~in~chain", &chain_hot_violations},
  }};
  constexpr std::array<std::pair<std::string_view, CounterFnPtr>, 3>
  