/-- The red and the blue arrows in ![this diagram](https://i.imgur.com/0GiBUh6.png) commute. -/
@[simp, reassoc]
theorem f_invApp_f_app (i j k : D.J) (U : Opens (D.V (i, j)).carrier) :
    (D.f_open i j).invApp U ≫ (D.f i k).c.app _ =
      (π₁ i, j, k).c.app (op U) ≫
        (π₂⁻¹ i, j, k) (unop _) ≫
          (D.V _).presheaf.map
            (eqToHom
              (by
                delta IsOpenImmersion.openFunctor
                dsimp only [Functor.op, IsOpenMap.functor, Opens.map, unop_op]
                congr
                apply pullback_base)) := by
  have := PresheafedSpace.congr_app (@pullback.condition _ _ _ _ _ (D.f i j) (D.f i k) _)
  dsimp only [comp_c_app] at this
  rw [← cancel_epi (inv ((D.f_open i j).invApp U)), IsIso.inv_hom_id_assoc,
    IsOpenImmersion.inv_invApp]
  simp_rw [Category.assoc]
  erw [(π₁ i, j, k).c.naturality_assoc, reassoc_of% this, ← Functor.map_comp_assoc,
    IsOpenImmersion.inv_naturality_assoc, IsOpenImmersion.app_invApp_assoc, ←
    (D.V (i, k)).presheaf.map_comp, ← (D.V (i, k)).presheaf.map_comp]
  -- Porting note : need to provide an explicit argument, otherwise Lean does not know which
  -- category we are talking about
  

Proof state:
C : Type u
inst✝ : Category.{v, u} C
D : GlueData C
i j k : D.J
U : Opens ↑↑(V D.toGlueData (i, j))
this :
  ∀ (U : (Opens ↑↑(CategoryTheory.GlueData.U D.toGlueData i))ᵒᵖ),
    (f D.toGlueData i j).c.app U ≫ pullback.fst.c.app (op ((Opens.map (f D.toGlueData i j).base).obj U.unop)) =
      ((f D.toGlueData i k).c.app U ≫ pullback.snd.c.app (op ((Opens.map (f D.toGlueData i k).base).obj U.unop))) ≫
        (pullback (f D.toGlueData i j) (f D.toGlueData i k)).presheaf.map
          (eqToHom
            (_ :
              (Opens.map (pullback.snd ≫ f D.toGlueData i k).base).op.obj U =
                (Opens.map (pullback.fst ≫ f D.toGlueData i j).base).op.obj U))
⊢ (f D.toGlueData i k).c.app (op ((IsOpenImmersion.openFunctor (_ : IsOpenImmersion (f D.toGlueData i j))).obj U)) =
    (f D.toGlueData i k).c.app (op ((IsOpenImmersion.openFunctor (_ : IsOpenImmersion (f D.toGlueData i j))).obj U)) ≫
      (V D.toGlueData (i, k)).presheaf.map
        ((homOfLE
              (_ :
                ⇑pullback.snd.base ''
                    (⇑pullback.snd.base ⁻¹'
                      ((Opens.map (f D.toGlueData i k).base).obj
                          (op
                              ((IsOpenImmersion.openFunctor (_ : IsOpenImmersion (f D.toGlueData i j))).obj
                                U)).unop).carrier) ⊆
                  ((Opens.map (f D.toGlueData i k).base).obj
                      (op
                          ((IsOpenImmersion.openFunctor (_ : IsOpenImmersion (f D.toGlueData i j))).obj
                            U)).unop).carrier)).op ≫
          (IsOpenImmersion.openFunctor (_ : IsOpenImmersion pullback.snd)).op.map
              (eqToHom
                  (_ :
                    (Opens.map (pullback.snd ≫ f D.toGlueData i k).base).op.obj
                        (op ((IsOpenImmersion.openFunctor (_ : IsOpenImmersion (f D.toGlueData i j))).obj U)) =
                      (Opens.map (pullback.fst ≫ f D.toGlueData i j).base).op.obj
                        (op ((IsOpenImmersion.openFunctor (_ : IsOpenImmersion (f D.toGlueData i j))).obj U))) ≫
                (Opens.map pullback.fst.base).op.map
                  (eqToHom
                    (_ :
                      op
                          ((Opens.map (f D.toGlueData i j).base).obj
                            (op
                                ((IsOpenImmersion.openFunctor (_ : IsOpenImmersion (f D.toGlueData i j))).obj
                                  U)).unop) =
                        op U))) ≫
            eqToHom
              (_ :
                op
                    ((IsOpenImmersion.openFunctor (_ : IsOpenImmersion pullback.snd)).obj
                      {
                          unop :=
                            { carrier := ⇑pullback.fst.base ⁻¹' ↑(op U).unop,
                              is_open' := (_ : IsOpen (⇑pullback.fst.base ⁻¹' ↑(op U).unop)) } }.unop) =
                  (Opens.map (f D.toGlueData i k).base).op.obj
                    (op ((IsOpenImmersion.openFunctor (_ : IsOpenImmersion (f D.toGlueData i j))).obj U))))

Next tactic:
convert (Category.comp_id ((f D.toGlueData i k).c.app _)).symm