theorem comp_Hσ_eq {Y : C} {n a q : ℕ} {φ : Y ⟶ X _[n + 1]} (v : HigherFacesVanish q φ)
    (hnaq : n = a + q) :
    φ ≫ (Hσ q).f (n + 1) =
      -φ ≫ X.δ ⟨a + 1, Nat.succ_lt_succ (Nat.lt_succ_iff.mpr (Nat.le.intro hnaq.symm))⟩ ≫
        X.σ ⟨a, Nat.lt_succ_iff.mpr (Nat.le.intro hnaq.symm)⟩ := by
  have hnaq_shift : ∀ d : ℕ, n + d = a + d + q := by
    intro d
    rw [add_assoc, add_comm d, ← add_assoc, hnaq]
  rw [Hσ, Homotopy.nullHomotopicMap'_f (c_mk (n + 2) (n + 1) rfl) (c_mk (n + 1) n rfl),
    hσ'_eq hnaq (c_mk (n + 1) n rfl), hσ'_eq (hnaq_shift 1) (c_mk (n + 2) (n + 1) rfl)]
  simp only [AlternatingFaceMapComplex.obj_d_eq, eqToHom_refl, comp_id, comp_sum, sum_comp,
    comp_add]
  simp only [comp_zsmul, zsmul_comp, ← assoc, ← mul_zsmul]
  -- cleaning up the first sum
  rw [← Fin.sum_congr' _ (hnaq_shift 2).symm, Fin.sum_trunc]
  swap
  · rintro ⟨k, hk⟩
    suffices φ ≫ X.δ (⟨a + 2 + k, by linarith⟩ : Fin (n + 2)) = 0 by
      simp only [this, Fin.natAdd_mk, Fin.cast_mk, zero_comp, smul_zero]
    convert v ⟨a + k + 1, by linarith⟩ (by rw [Fin.val_mk]; linarith)
    dsimp
    linarith
  -- cleaning up the second sum
  rw [← Fin.sum_congr' _ (hnaq_shift 3).symm, @Fin.sum_trunc _ _ (a + 3)]
  swap
  · rintro ⟨k, hk⟩
    rw [assoc, X.δ_comp_σ_of_gt', v.comp_δ_eq_zero_assoc, zero_comp, zsmul_zero]
    · simp only [Fin.lt_iff_val_lt_val]
      dsimp [Fin.natAdd, Fin.cast]
      linarith
    · intro h
      rw [Fin.pred_eq_iff_eq_succ, Fin.ext_iff] at h
      dsimp [Fin.cast] at h
      linarith
    · dsimp [Fin.cast, Fin.pred]
      rw [Nat.add_right_comm, Nat.add_sub_assoc (by norm_num : 1 ≤ 3)]
      linarith
  simp only [assoc]
  conv_lhs =>
    congr
    · rw [Fin.sum_univ_castSucc]
    · rw [Fin.sum_univ_castSucc, Fin.sum_univ_castSucc]
  

Proof state:
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Preadditive C
X : SimplicialObject C
Y : C
n a q : ℕ
φ : Y ⟶ X.obj (Opposite.op [n + 1])
v : HigherFacesVanish q φ
hnaq : n = a + q
hnaq_shift : ∀ (d : ℕ), n + d = a + d + q
⊢ (Finset.sum Finset.univ fun i =>
          ((-1) ^ a *
              (-1) ^ ↑(Fin.cast (_ : a + 2 + q = n + 2) (Fin.castLE (_ : a + 2 ≤ a + 2 + q) (Fin.castSucc i)))) •
            φ ≫
              δ X (Fin.cast (_ : a + 2 + q = n + 2) (Fin.castLE (_ : a + 2 ≤ a + 2 + q) (Fin.castSucc i))) ≫
                σ X { val := a, isLt := (_ : a < Nat.succ n) }) +
        ((-1) ^ a *
            (-1) ^ ↑(Fin.cast (_ : a + 2 + q = n + 2) (Fin.castLE (_ : a + 2 ≤ a + 2 + q) (Fin.last (a + 1))))) •
          φ ≫
            δ X (Fin.cast (_ : a + 2 + q = n + 2) (Fin.castLE (_ : a + 2 ≤ a + 2 + q) (Fin.last (a + 1)))) ≫
              σ X { val := a, isLt := (_ : a < Nat.succ n) } +
      ((Finset.sum Finset.univ fun i =>
            ((-1) ^
                  ↑(Fin.cast (_ : a + 3 + q = n + 3)
                      (Fin.castLE (_ : a + 3 ≤ a + 3 + q) (Fin.castSucc (Fin.castSucc i)))) *
                (-1) ^ (a + 1)) •
              φ ≫
                σ X { val := a + 1, isLt := (_ : a + 1 < Nat.succ (n + 1)) } ≫
                  δ X
                    (Fin.cast (_ : a + 3 + q = n + 3)
                      (Fin.castLE (_ : a + 3 ≤ a + 3 + q) (Fin.castSucc (Fin.castSucc i))))) +
          ((-1) ^
                ↑(Fin.cast (_ : a + 3 + q = n + 3)
                    (Fin.castLE (_ : a + 3 ≤ a + 3 + q) (Fin.castSucc (Fin.last (a + 1))))) *
              (-1) ^ (a + 1)) •
            φ ≫
              σ X { val := a + 1, isLt := (_ : a + 1 < Nat.succ (n + 1)) } ≫
                δ X
                  (Fin.cast (_ : a + 3 + q = n + 3)
                    (Fin.castLE (_ : a + 3 ≤ a + 3 + q) (Fin.castSucc (Fin.last (a + 1))))) +
        ((-1) ^ ↑(Fin.cast (_ : a + 3 + q = n + 3) (Fin.castLE (_ : a + 3 ≤ a + 3 + q) (Fin.last (a + 2)))) *
            (-1) ^ (a + 1)) •
          φ ≫
            σ X { val := a + 1, isLt := (_ : a + 1 < Nat.succ (n + 1)) } ≫
              δ X (Fin.cast (_ : a + 3 + q = n + 3) (Fin.castLE (_ : a + 3 ≤ a + 3 + q) (Fin.last (a + 2))))) =
    -φ ≫
        δ X { val := a + 1, isLt := (_ : Nat.succ a < Nat.succ (n + 1)) } ≫
          σ X { val := a, isLt := (_ : a < Nat.succ n) }

Next tactic:
dsimp [Fin.cast, Fin.castLE, Fin.castLT]