/-- 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
  convert (Category.comp_id ((f D.toGlueData i k).c.app _)).symm
  

Proof state:
case h.e'_3.h.h.e'_7
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))
⊢ (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)))) =
    𝟙
      (((f D.toGlueData i k).base _* (V D.toGlueData (i, k)).presheaf).obj
        (op ((IsOpenImmersion.openFunctor (_ : IsOpenImmersion (f D.toGlueData i j))).obj U)))

Next tactic:
erw [(D.V (i, k)).presheaf.map_id]