The coupled block’s Lyapunov derivative — TARGET 6 (the genuine core of Prop IV.1)
Seal
Rung rung-2 · Status interfaced — axiom-clean (
#print axiomsverbatim in The machine seal; build 2445 jobs), withhpass(passivity in operator form) andhreal(the moving-metric calculus) as the two new named interfaces plus the established operator set. Discharges thehdechypothesis of reduction_cascade’spropIV1_tendstoviacoupled_hdec. See interfaces. Public definition:coupledLyapRate(the moving-metric correction kept visible).
Links: module index · interface ledger · related coupled_field, passivity_transport, reduction_cascade, coupled_collapse · source giordano2019coordinated · pinpin_coupled_dissipation.py
Sealed theorems
coupled_total_dissipation
The keystone: — the Coriolis term killed by passivity, with the moving-metric correction as a visible proof step.
coupled_decrease
from .
coupled_hdec
The exact hdec shape , given hreal — the hole in propIV1_tendsto, filled by construction.
coupled_block_tendsto
The capstone: coupled_hdec fed straight into the sealed propIV1_tendsto — the coupled-block trajectory converges to .
Thesis role — closing the hdec hole
Prop IV.1 (Giordano 2019 RA-L, §IV.D) proves stability of the driven coupled attitude+EE block by a Lyapunov/LaSalle argument on the mechanical energy. The sealed Reduction.propIV1_tendsto assembles that argument, but leaves its energy-decrease input as the named hypothesis
This lane discharges that hypothesis. It proves the physical statement Giordano writes as eqs 37-38 — that along the closed-loop field the storage function
has total time derivative — and feeds it straight back into propIV1_tendsto. It is the genuine core of the cascade’s step 2: the Coriolis term that made the state-space partial sign-indefinite is killed here, by passivity, leaving pure damping.
The module is (/Code/vault/lean/CoupledDissipation.lean), build copy /Code/vault/lean/pin_coupled_dissipation.py). It consumes the two upstream lanes of this run — ~/lean/leanpunov/Leanpunov/CoupledDissipation.lean. SymPy pin (CoupledField (the field g₂, the energy V, and the state-space partial coupledEnergy_fderiv_field) and PassivityTransport (the transported Christoffel factorization that makes eq 23 hold).
Sources and provenance
- giordano2019coordinated eqs 37-38: the storage function (eq 37) and the dissipation (eq 38).
- current_sota.md §4.6 eqs 4.15-4.16 (~/Code/Inspection/GNC/equations/current_sota.md): the house transcription, including the explicit term from the configuration-dependent inertia and its cancellation against the Coriolis term via eq 23.
- Composition anchors (sealed, reused verbatim, not re-proved):
Leanpunov.coupledEnergy_fderiv_field(CoupledField) — the state-space partial with the stiffness cross-terms already cancelled;Leanpunov.transported_passivity_identity(PassivityTransport) — the passivity property , produced (not assumed) from the Christoffel choice;Leanpunov.propIV1_tendsto(Reduction) — the assembly whosehdecthis lane fills.
The two-part derivative, and why the correction term is mandatory
The subtlety this lane resolves — and the reason it is difficulty L, not a corollary of the sealed field lemma — is that there are two notions of "" and only the second is .
The state-space partial (constant operators) is what the sealed coupledEnergy_fderiv_field returns:
The stiffness cross-terms and have already cancelled ( symmetric, the adjoint of ). But the Coriolis term survives, and it is sign-indefinite ( is not symmetric). This partial alone is not — it cannot discharge hdec.
The total time derivative along a real trajectory is larger, because the storage form carries a configuration-dependent inertia . Differentiating by the chain rule picks up, on top of the state-space partial, the extra term from itself moving:
This correction term is not optional bookkeeping — it is the physical difference between differentiating a quadratic form with a frozen metric and with the true moving metric. The constant-operator CoupledField module deliberately drops it (its operators are fixed continuous linear maps); reinstating it is precisely this lane’s job.
Passivity closes the gap. The sealed transported_passivity_identity gives, for every ,
which is exactly what is needed to cancel the surviving Coriolis term:
This is the whole content of Giordano’s “the Coriolis terms cancel by the skew-symmetry property” — made a theorem, with the skew-symmetry property itself already a theorem (produced by PassivityTransport), not an assertion.
The SymPy pin (frozen before the Lean)
pin_coupled_dissipation.py verifies the single new algebraic step, recomputing the state-space partial exactly as the Lean stone returns it (honest gradient of , held constant and symmetric, dotted into ):
- Total dissipation — , with the Christoffel/passivity source. Symbolic (
simplify → 0); numeric (max residual ). - Sign — for SPD (numeric, over 400 random draws at each ).
- Passivity operator form — , symbolic . This certifies that the operator-form hypothesis
hpass() is the faithful transcription of the sealed matrix identity .
All pins pass; the Lean statement was frozen only afterward.
The Lean, theorem by theorem
The module works on the same abstract real inner-product space as CoupledField (so coupledEnergy_fderiv_field applies with zero coercion friction), with the seven CoupledField operators plus (Mdot) as continuous linear maps.
coupledLyapRate (definition). The assembled total rate
state-space partial (the sealed fderiv) plus the time-varying-inertia correction. Naming the correction explicitly, rather than pre-substituting , keeps the mechanism visible: the passivity collapse is a proof step, not baked into the definition.
coupled_total_dissipation (the genuine core). . Three-line proof: unfold the rate; rewrite the partial with the sealed coupledEnergy_fderiv_field hMsa hKsa hMinv hJadj y; rewrite the correction with hpass y.2; ring closes the cancellation . The entire mathematical weight sits in the two sealed lemmas it composes.
coupled_decrease. : rewrite by the identity, then from hDnn () via neg_nonpos.mpr. This is verbatim the com_decrease shape.
coupled_hdec. For any field and Lyapunov whose Fréchet-derivative along realizes the assembled rate (hreal: ), the exact hdec shape holds — rw [hreal y] then coupled_decrease.
coupled_block_tendsto (capstone). Feeds coupled_hdec straight into the sealed propIV1_tendsto. The coupled-block trajectory converges to . The remaining inputs are Prop IV.1’s established named interfaces — hϕ (IsSolutionTo), hreal, hzero (the containment, StiffnessResidual-sealed algebra), hcpt (precompactness). The hdec hole is now filled by construction.
Interfaces left named (honest boundary)
The algebra is proved outright: the cross-term cancellation, the Coriolis kill, the sign. Three interfaces are named — none a silent sorry, each the established campaign precedent:
hpass— passivity in operator form. on abstract . It is the abstract transcription of the sealed matrix theoremtransported_passivity_identity(). For a concreteEuclideanSpaceblock the two are identical viaMatrix.toEuclideanCLM; bridging matrix↔operator is the sametoEuclideanCLM/WithLpplumbingCoupledFieldalready defers for its ownhMinv/hJadj/hMsa/hKsa. This lane inherits CoupledField’s abstract- formulation (so the sealed field lemma applies with no coercion) and defers the bridge identically. This is the one place the brief’s “consumetransported_passivity_identity” is met at the level of mathematical content (the passivity property, pinned identical inpin (3)) rather than a literal import — because the sealed theorem is matrix-shaped and the field is abstract, exactly the hMinv precedent. No weaker math is substituted.hMsa/hKsa/hMinv/hJadj/hDnn— symmetry of ; invertible; the adjoint; . The CoupledField/ComLaSalle operator hypotheses, theorems for concrete SPD blocks (Matrix.PosDef.isHermitian,nonsingularInverse,le_dotProduct_mulVec).hreal— the state-dependent-operator calculus. The TRUE closed-loop field carries ; its Lyapunov Fréchet-derivative equals the assembled rate . The constant-operator linearises those operators pointwise; identifying the moving-metric chain rule with the assembled rate is the deferred analytic step — theIsSolutionTo/ product-rule precedent used across L3/L4 and inPassivityTransport(which likewise names the product rule for ). It brackets exactly the analytic plumbing, never the algebra: the algebra it brackets iscoupled_total_dissipation, proved.
Nothing here needed BlockLyapunov (V’s coercivity/positivity) or Rayleigh (eigenvalue bounds): the argument uses only the dissipation identity and (hDnn, a named PSD hypothesis, not an eigenvalue bound). Those two sealed modules feed the stability/precompactness side (hcpt), which enters coupled_block_tendsto as the established hcpt interface — not the derivative computation.
Mathlib stones used
fderiv (via the sealed coupledEnergy_fderiv_field), neg_nonpos, ring. Plus, in the capstone, the sealed propIV1_tendsto and the Flow/IsSolutionTo interface from LaSalle. Deliberately thin: the heavy fderiv_inner_apply calculus was spent in CoupledField; this lane is the composition that turns its sign-indefinite partial into the sign-definite total rate.
The machine seal
#print axioms on the four theorems, verbatim from the full-integration lake build (2445 jobs, 2026-07-06):
info: Leanpunov/CoupledDissipation.lean:163:0: 'Leanpunov.coupled_total_dissipation' depends on axioms: [propext, Classical.choice, Quot.sound]
info: Leanpunov/CoupledDissipation.lean:164:0: 'Leanpunov.coupled_decrease' depends on axioms: [propext, Classical.choice, Quot.sound]
info: Leanpunov/CoupledDissipation.lean:165:0: 'Leanpunov.coupled_hdec' depends on axioms: [propext, Classical.choice, Quot.sound]
info: Leanpunov/CoupledDissipation.lean:166:0: 'Leanpunov.coupled_block_tendsto' depends on axioms: [propext, Classical.choice, Quot.sound]Nothing beyond {propext, Classical.choice, Quot.sound}; no sorryAx. First-attempt compile (11 s for the module). The whole L1-L4a + rung-1 + G2 + this lane project builds clean.
Cost feel
Well below an L2-scale push, despite the L difficulty label. The difficulty was conceptual, not tactical: understanding why the state-space partial is not and what the total derivative adds (the moving-metric correction), then routing the passivity cancellation through it. Once the two-part structure is seen and pinned, the Lean is a three-line rw/ring composition of two sealed lemmas plus a neg_nonpos. The upstream lanes (CoupledField, PassivityTransport) did the heavy calculus and algebra respectively; this lane is the keystone that joins them, and keystones are short. No fix cycles: the SymPy pin fixed the mental model first, and the Lean compiled on the first attempt.