/-- The derivative of the inverse of the chart at a base point is the inverse of the chart of the
tangent bundle, composed with the identification between the tangent bundle of the model space and
the product space. -/
theorem tangentMap_chart_symm {p : TangentBundle I M} {q : TangentBundle I H}
    (h : q.1 ∈ (chartAt H p.1).target) :
    tangentMap I I (chartAt H p.1).symm q =
      (chartAt (ModelProd H E) p).symm (TotalSpace.toProd H E q) := by
  dsimp only [tangentMap]
  rw [MDifferentiableAt.mfderiv (mdifferentiableAt_atlas_symm _ (chart_mem_atlas _ _) h)]
  simp only [ContinuousLinearMap.coe_coe, TangentBundle.chartAt, h, tangentBundleCore,
    mfld_simps, (· ∘ ·)]
  -- `simp` fails to apply `PartialEquiv.prod_symm` with `ModelProd`
  

Proof state:
𝕜 : Type u_1
inst✝¹⁸ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹⁷ : NormedAddCommGroup E
inst✝¹⁶ : NormedSpace 𝕜 E
H : Type u_3
inst✝¹⁵ : TopologicalSpace H
I : ModelWithCorners 𝕜 E H
M : Type u_4
inst✝¹⁴ : TopologicalSpace M
inst✝¹³ : ChartedSpace H M
inst✝¹² : SmoothManifoldWithCorners I M
E' : Type u_5
inst✝¹¹ : NormedAddCommGroup E'
inst✝¹⁰ : NormedSpace 𝕜 E'
H' : Type u_6
inst✝⁹ : TopologicalSpace H'
I' : ModelWithCorners 𝕜 E' H'
M' : Type u_7
inst✝⁸ : TopologicalSpace M'
inst✝⁷ : ChartedSpace H' M'
inst✝⁶ : SmoothManifoldWithCorners I' M'
E'' : Type u_8
inst✝⁵ : NormedAddCommGroup E''
inst✝⁴ : NormedSpace 𝕜 E''
H'' : Type u_9
inst✝³ : TopologicalSpace H''
I'' : ModelWithCorners 𝕜 E'' H''
M'' : Type u_10
inst✝² : TopologicalSpace M''
inst✝¹ : ChartedSpace H'' M''
inst✝ : SmoothManifoldWithCorners I'' M''
s : Set M
x : M
e : PartialHomeomorph M H
p : TangentBundle I M
q : TangentBundle I H
h : q.proj ∈ (chartAt H p.proj).toPartialEquiv.target
⊢ { proj := ↑(PartialHomeomorph.symm (chartAt H p.proj)) q.proj,
      snd :=
        (fderivWithin 𝕜
            (fun x =>
              ↑I
                (↑(chartAt H (↑(PartialHomeomorph.symm (chartAt H p.proj)) q.proj))
                  (↑(PartialHomeomorph.symm (chartAt H p.proj)) (↑(ModelWithCorners.symm I) x))))
            (range ↑I) (↑I q.proj))
          q.snd } =
    ↑(PartialHomeomorph.symm
          (FiberBundleCore.localTriv
              (VectorBundleCore.toFiberBundleCore
                { baseSet := fun i => (↑i).source, isOpen_baseSet := (_ : ∀ (i : ↑(atlas H M)), IsOpen (↑i).source),
                  indexAt := achart H, mem_baseSet_at := (_ : ∀ (x : M), x ∈ (chartAt H x).toPartialEquiv.source),
                  coordChange := fun i j x =>
                    fderivWithin 𝕜 (fun x => ↑I (↑↑j (↑(PartialHomeomorph.symm ↑i) (↑(ModelWithCorners.symm I) x))))
                      (range ↑I) (↑I (↑↑i x)),
                  coordChange_self :=
                    (_ :
                      ∀ (i : ↑(atlas H M)),
                        ∀ x ∈ (fun i => (↑i).source) i,
                          ∀ (v : E),
                            ((fun i j x =>
                                    fderivWithin 𝕜
                                      (↑(PartialHomeomorph.extend (↑j) I) ∘
                                        ↑(PartialEquiv.symm (PartialHomeomorph.extend (↑i) I)))
                                      (range ↑I) (↑(PartialHomeomorph.extend (↑i) I) x))
                                  i i x)
                                v =
                              v),
                  continuousOn_coordChange :=
                    (_ :
                      ∀ (i j : ↑(atlas H M)),
                        ContinuousOn
                          (fderivWithin 𝕜
                              (↑(PartialHomeomorph.extend (↑j) I) ∘
                                ↑(PartialEquiv.symm (PartialHomeomorph.extend (↑i) I)))
                              (range ↑I) ∘
                            fun x => ↑(PartialHomeomorph.extend (↑i) I) x)
                          ((fun i => (↑i).source) i ∩ (fun i => (↑i).source) j)),
                  coordChange_comp :=
                    (_ :
                      ∀ (i j k : ↑(atlas H M)),
                        ∀ x ∈ (fun i => (↑i).source) i ∩ (fun i => (↑i).source) j ∩ (fun i => (↑i).source) k,
                          ∀ (v : E),
                            ((fun i j x =>
                                    fderivWithin 𝕜
                                      (↑(PartialHomeomorph.extend (↑j) I) ∘
                                        ↑(PartialEquiv.symm (PartialHomeomorph.extend (↑i) I)))
                                      (range ↑I) (↑(PartialHomeomorph.extend (↑i) I) x))
                                  j k x)
                                (((fun i j x =>
                                      fderivWithin 𝕜
                                        (↑(PartialHomeomorph.extend (↑j) I) ∘
                                          ↑(PartialEquiv.symm (PartialHomeomorph.extend (↑i) I)))
                                        (range ↑I) (↑(PartialHomeomorph.extend (↑i) I) x))
                                    i j x)
                                  v) =
                              ((fun i j x =>
                                    fderivWithin 𝕜
                                      (↑(PartialHomeomorph.extend (↑j) I) ∘
                                        ↑(PartialEquiv.symm (PartialHomeomorph.extend (↑i) I)))
                                      (range ↑I) (↑(PartialHomeomorph.extend (↑i) I) x))
                                  i k x)
                                v) })
              (achart H p.proj)).toPartialHomeomorph)
      (↑(PartialHomeomorph.symm (PartialHomeomorph.prod (chartAt H p.proj) (PartialHomeomorph.refl E))) (q.proj, q.snd))

Next tactic:
congr