@[to_additive]
noncomputable instance colimitMonoid : Monoid (M.{v, u} F) :=
  { colimitMulOneClass F with
    mul_assoc := fun x y z => by
      refine Quot.induction_on₃ x y z ?_
      clear x y z
      intro x y z
      cases' x with j₁ x
      cases' y with j₂ y
      cases' z with j₃ z
      change M.mk F _ * M.mk F _ * M.mk F _ = M.mk F _ * M.mk F _
      dsimp
      rw [colimit_mul_mk_eq F ⟨j₁, x⟩ ⟨j₂, y⟩ (IsFiltered.max j₁ (IsFiltered.max j₂ j₃))
          (IsFiltered.leftToMax j₁ (IsFiltered.max j₂ j₃))
          (IsFiltered.leftToMax j₂ j₃ ≫ IsFiltered.rightToMax _ _),
        colimit_mul_mk_eq F ⟨(IsFiltered.max j₁ (IsFiltered.max j₂ j₃)), _⟩ ⟨j₃, z⟩
          (IsFiltered.max j₁ (IsFiltered.max j₂ j₃)) (𝟙 _)
          (IsFiltered.rightToMax j₂ j₃ ≫ IsFiltered.rightToMax _ _),
        colimit_mul_mk_eq.{v, u} F ⟨j₁, x⟩ ⟨IsFiltered.max j₂ j₃, _⟩ _
          (IsFiltered.leftToMax _ _) (IsFiltered.rightToMax _ _)]
      

Proof state:
case mk.mk.mk
J : Type v
inst✝¹ : SmallCategory J
F : J ⥤ MonCat
inst✝ : IsFiltered J
src✝ : MulOneClass (M F) := colimitMulOneClass F
j₁ : J
x : (F ⋙ forget MonCat).obj j₁
j₂ : J
y : (F ⋙ forget MonCat).obj j₂
j₃ : J
z : (F ⋙ forget MonCat).obj j₃
⊢ M.mk F
      { fst := IsFiltered.max j₁ (IsFiltered.max j₂ j₃),
        snd :=
          (F.map
                (𝟙
                  { fst := IsFiltered.max j₁ (IsFiltered.max j₂ j₃),
                      snd :=
                        (F.map (IsFiltered.leftToMax j₁ (IsFiltered.max j₂ j₃))) { fst := j₁, snd := x }.snd *
                          (F.map (IsFiltered.leftToMax j₂ j₃ ≫ IsFiltered.rightToMax j₁ (IsFiltered.max j₂ j₃)))
                            { fst := j₂, snd := y }.snd }.fst))
              { fst := IsFiltered.max j₁ (IsFiltered.max j₂ j₃),
                  snd :=
                    (F.map (IsFiltered.leftToMax j₁ (IsFiltered.max j₂ j₃))) { fst := j₁, snd := x }.snd *
                      (F.map (IsFiltered.leftToMax j₂ j₃ ≫ IsFiltered.rightToMax j₁ (IsFiltered.max j₂ j₃)))
                        { fst := j₂, snd := y }.snd }.snd *
            (F.map (IsFiltered.rightToMax j₂ j₃ ≫ IsFiltered.rightToMax j₁ (IsFiltered.max j₂ j₃)))
              { fst := j₃, snd := z }.snd } =
    M.mk F
      {
        fst :=
          IsFiltered.max { fst := j₁, snd := x }.fst
            { fst := IsFiltered.max j₂ j₃,
                snd := (F.map (IsFiltered.leftToMax j₂ j₃)) y * (F.map (IsFiltered.rightToMax j₂ j₃)) z }.fst,
        snd :=
          (F.map
                (IsFiltered.leftToMax { fst := j₁, snd := x }.fst
                  { fst := IsFiltered.max j₂ j₃,
                      snd := (F.map (IsFiltered.leftToMax j₂ j₃)) y * (F.map (IsFiltered.rightToMax j₂ j₃)) z }.fst))
              { fst := j₁, snd := x }.snd *
            (F.map
                (IsFiltered.rightToMax { fst := j₁, snd := x }.fst
                  { fst := IsFiltered.max j₂ j₃,
                      snd := (F.map (IsFiltered.leftToMax j₂ j₃)) y * (F.map (IsFiltered.rightToMax j₂ j₃)) z }.fst))
              { fst := IsFiltered.max j₂ j₃,
                  snd := (F.map (IsFiltered.leftToMax j₂ j₃)) y * (F.map (IsFiltered.rightToMax j₂ j₃)) z }.snd }

Next tactic:
congr 2