[proofplan]
The proof is the standard shifted-horizon MPC argument followed by a direct discrete-time Lyapunov argument. Starting from an optimizer at $x$, we drop the first input, append the terminal controller at the old terminal state, and use terminal invariance of $X_f$ to obtain a feasible candidate at the successor state. Comparing this candidate cost with the old optimal cost gives the Lyapunov decrease for $V_N$. The local stability claim is then proved directly on the compact invariant sublevel set $\Omega_c$: monotonicity of $V_N$ gives invariance and Lyapunov stability, while the lower bound $\ell(x,u)\ge \alpha(|x|)$ forces closed-loop trajectories to converge to the origin.
[/proofplan]
[step:Shift an optimal trajectory and append the terminal controller]
Fix $x \in \mathcal X_N$. Let
\begin{align*}
((x_0^*,\dots,x_N^*),(u_0^*,\dots,u_{N-1}^*)) \in \mathcal A_N(x)
\end{align*}
be the optimizer selected in the definition of $\kappa_N(x)$. Thus $x_0^*=x$, $u_0^*=\kappa_N(x)$, $x_{j+1}^*=F(x_j^*,u_j^*)$ for every $j \in \{0,\dots,N-1\}$, and $x_N^* \in X_f$.
Define the closed-loop successor
\begin{align*}
x^+ := F(x,\kappa_N(x)).
\end{align*}
Since $u_0^*=\kappa_N(x)$ and $x_1^*=F(x_0^*,u_0^*)$, we have $x^+=x_1^*$.
Define the shifted input sequence
\begin{align*}
\tilde u := (\tilde u_0,\dots,\tilde u_{N-1}) \in U^N
\end{align*}
by $\tilde u_j:=u_{j+1}^*$ for $j \in \{0,\dots,N-2\}$ and $\tilde u_{N-1}:=\kappa_f(x_N^*)$. This is an element of $U^N$ because $u_j^* \in U$ for all $j$ and $\kappa_f:X_f\to U$ with $x_N^*\in X_f$.
Define the shifted state sequence
\begin{align*}
\tilde x := (\tilde x_0,\dots,\tilde x_N) \in X^{N+1}
\end{align*}
by $\tilde x_j:=x_{j+1}^*$ for $j \in \{0,\dots,N-1\}$ and $\tilde x_N:=F(x_N^*,\kappa_f(x_N^*))$. Since $F:X\times U\to X$, all entries of $\tilde x$ lie in $X$. Also $\tilde x_0=x_1^*=x^+$.
For $j \in \{0,\dots,N-2\}$,
\begin{align*}
\tilde x_{j+1}=x_{j+2}^*=F(x_{j+1}^*,u_{j+1}^*)=F(\tilde x_j,\tilde u_j).
\end{align*}
For the last transition,
\begin{align*}
\tilde x_N=F(x_N^*,\kappa_f(x_N^*))=F(\tilde x_{N-1},\tilde u_{N-1}).
\end{align*}
Finally, because $x_N^*\in X_f$ and the terminal controller satisfies $F(y,\kappa_f(y))\in X_f$ for every $y\in X_f$, we have $\tilde x_N\in X_f$. Therefore
\begin{align*}
((\tilde x_0,\dots,\tilde x_N),(\tilde u_0,\dots,\tilde u_{N-1})) \in \mathcal A_N(x^+).
\end{align*}
Thus $x^+ \in \mathcal X_N$.
[guided]
The point of recursive feasibility is to construct, from a feasible optimal plan at $x$, at least one feasible plan at the next state $x^+$. We begin with the selected optimizer
\begin{align*}
((x_0^*,\dots,x_N^*),(u_0^*,\dots,u_{N-1}^*)) \in \mathcal A_N(x).
\end{align*}
By definition of $\mathcal A_N(x)$, this means $x_0^*=x$, $x_{j+1}^*=F(x_j^*,u_j^*)$ for each $j \in \{0,\dots,N-1\}$, every $u_j^*$ lies in $U$, every $x_j^*$ lies in $X$, and the terminal state $x_N^*$ lies in $X_f$.
The MPC feedback is the first input of this selected optimizer, so $u_0^*=\kappa_N(x)$. Therefore the closed-loop successor is
\begin{align*}
x^+=F(x,\kappa_N(x))=F(x_0^*,u_0^*)=x_1^*.
\end{align*}
This identity is the reason the shifted plan starts at the correct state.
We now define the candidate input sequence at $x^+$ by dropping the already-used input $u_0^*$ and appending the terminal feedback at the old terminal state. Explicitly, define
\begin{align*}
\tilde u := (\tilde u_0,\dots,\tilde u_{N-1}) \in U^N
\end{align*}
by $\tilde u_j:=u_{j+1}^*$ for $j \in \{0,\dots,N-2\}$ and $\tilde u_{N-1}:=\kappa_f(x_N^*)$. The last input belongs to $U$ because $x_N^*\in X_f$ and $\kappa_f:X_f\to U$.
The matching state sequence is
\begin{align*}
\tilde x := (\tilde x_0,\dots,\tilde x_N) \in X^{N+1},
\end{align*}
where $\tilde x_j:=x_{j+1}^*$ for $j \in \{0,\dots,N-1\}$ and $\tilde x_N:=F(x_N^*,\kappa_f(x_N^*))$. Since $F:X\times U\to X$, the final state $\tilde x_N$ belongs to $X$. The initial state condition is also correct:
\begin{align*}
\tilde x_0=x_1^*=x^+.
\end{align*}
It remains to verify the dynamics and terminal constraint. For every $j \in \{0,\dots,N-2\}$, the old optimal dynamics give
\begin{align*}
\tilde x_{j+1}=x_{j+2}^*=F(x_{j+1}^*,u_{j+1}^*)=F(\tilde x_j,\tilde u_j).
\end{align*}
For the last transition, the definition of the appended state gives
\begin{align*}
\tilde x_N=F(x_N^*,\kappa_f(x_N^*))=F(\tilde x_{N-1},\tilde u_{N-1}).
\end{align*}
Finally, terminal invariance says that $F(y,\kappa_f(y))\in X_f$ for every $y\in X_f$. Applying this with $y=x_N^*$ gives $\tilde x_N\in X_f$. Hence the shifted pair belongs to $\mathcal A_N(x^+)$, so $\mathcal A_N(x^+)\neq \varnothing$ and $x^+\in \mathcal X_N$.
[/guided]
[/step]
[step:Compare the shifted candidate cost with the old optimal cost]
Since the shifted pair constructed above is feasible for $x^+$, the optimal value at $x^+$ is no larger than its cost:
\begin{align*}
V_N(x^+) \le \sum_{j=0}^{N-1}\ell(\tilde x_j,\tilde u_j)+V_f(\tilde x_N).
\end{align*}
Using the definitions of $\tilde x$ and $\tilde u$, the right-hand side is
\begin{align*}
\sum_{j=1}^{N-1}\ell(x_j^*,u_j^*)+\ell(x_N^*,\kappa_f(x_N^*))+V_f(F(x_N^*,\kappa_f(x_N^*))).
\end{align*}
The terminal decrease condition applied at $x_N^*\in X_f$ gives
\begin{align*}
\ell(x_N^*,\kappa_f(x_N^*))+V_f(F(x_N^*,\kappa_f(x_N^*))) \le V_f(x_N^*).
\end{align*}
Therefore
\begin{align*}
V_N(x^+) \le \sum_{j=1}^{N-1}\ell(x_j^*,u_j^*)+V_f(x_N^*).
\end{align*}
Because the selected trajectory is optimal at $x$,
\begin{align*}
V_N(x)=\sum_{j=0}^{N-1}\ell(x_j^*,u_j^*)+V_f(x_N^*).
\end{align*}
Subtracting the nonnegative first-stage term in this identity yields
\begin{align*}
V_N(x^+) \le V_N(x)-\ell(x_0^*,u_0^*).
\end{align*}
Since $x_0^*=x$ and $u_0^*=\kappa_N(x)$, this is
\begin{align*}
V_N(x^+)-V_N(x) \le -\ell(x,\kappa_N(x)).
\end{align*}
[/step]
[step:Iterate recursive feasibility to obtain constraint admissibility]
Let $x_0\in \mathcal X_N$, and define the closed-loop sequence inductively by
\begin{align*}
x_{k+1}:=F(x_k,\kappa_N(x_k))
\end{align*}
whenever $x_k\in \mathcal X_N$. The previous step proves that $x_k\in \mathcal X_N$ implies $x_{k+1}\in \mathcal X_N$. By induction over $k\in \mathbb N\cup\{0\}$, the entire trajectory is well-defined and satisfies $x_k\in \mathcal X_N\subset X$ for every $k\ge 0$. Since $\kappa_N:\mathcal X_N\to U$, we also have $\kappa_N(x_k)\in U$ for every $k\ge 0$. This proves constraint admissibility.
[/step]
[step:Use the Lyapunov decrease to prove positive invariance of $\Omega_c$]
Assume now that $c>0$ is such that
\begin{align*}
\Omega_c=\{x\in \mathcal X_N:V_N(x)\le c\}
\end{align*}
is a neighbourhood of $0$ relative to $\mathcal X_N$ and $\Omega_c\subset D$.
Let $x\in \Omega_c$, and set $x^+:=F(x,\kappa_N(x))$. Recursive feasibility gives $x^+\in\mathcal X_N$. The Lyapunov decrease and nonnegativity of $\ell$ give
\begin{align*}
V_N(x^+) \le V_N(x)-\ell(x,\kappa_N(x)) \le V_N(x)\le c.
\end{align*}
Hence $x^+\in\Omega_c$. Therefore $\Omega_c$ is positively invariant for the closed-loop map.
[/step]
[step:Show that the origin is an equilibrium on the invariant sublevel set]
Since $0\in\Omega_c$, define
\begin{align*}
x_1^0:=F(0,\kappa_N(0)).
\end{align*}
Positive invariance gives $x_1^0\in\Omega_c\subset D$. The Lyapunov decrease at $x=0$ gives
\begin{align*}
V_N(x_1^0)-V_N(0)\le -\ell(0,\kappa_N(0)).
\end{align*}
Because $V_N(0)=0$ and $\ell\ge 0$, this implies $V_N(x_1^0)\le 0$. Since $V_N$ takes values in $[0,\infty)$, we get $V_N(x_1^0)=0$. The point $x_1^0$ lies in $D$, and $V_N|_D$ is positive definite, so $x_1^0=0$. Thus
\begin{align*}
F(0,\kappa_N(0))=0.
\end{align*}
[/step]
[step:Prove Lyapunov stability relative to $\Omega_c$]
We prove stability in the metric inherited from $\mathbb R^n$, with initial conditions restricted to $\Omega_c$. Let $\varepsilon>0$ be given. Define
\begin{align*}
A_\varepsilon:=\{x\in\Omega_c: |x|\ge \varepsilon\}.
\end{align*}
The set $\Omega_c$ is compact by the assumed properness, because $\Omega_c\subset D$. The set $A_\varepsilon$ is a closed subset of $\Omega_c$, hence compact. If $A_\varepsilon=\varnothing$, then every trajectory in $\Omega_c$ already satisfies $|x_k|<\varepsilon$ for all $k$ by positive invariance.
Assume $A_\varepsilon\neq\varnothing$. Since $V_N|_D$ is continuous and $A_\varepsilon\subset D$, the minimum
\begin{align*}
\eta_\varepsilon:=\min_{x\in A_\varepsilon}V_N(x)
\end{align*}
exists. Since $A_\varepsilon\subset D\setminus\{0\}$ and $V_N|_D$ is positive definite, $\eta_\varepsilon>0$.
Continuity of $V_N|_D$ at $0$, together with $V_N(0)=0$, gives a number $\delta>0$ such that $x\in D$ and $|x|<\delta$ imply
\begin{align*}
V_N(x)<\eta_\varepsilon.
\end{align*}
Shrinking $\delta$ if necessary, we may also ensure that every $x\in\mathcal X_N$ with $|x|<\delta$ lies in $\Omega_c$, because $\Omega_c$ is a neighbourhood of $0$ relative to $\mathcal X_N$.
Let $x_0\in\Omega_c$ satisfy $|x_0|<\delta$, and let $(x_k)_{k\ge 0}$ be the closed-loop trajectory. Positive invariance gives $x_k\in\Omega_c\subset D$ for every $k\ge 0$. The Lyapunov decrease gives $V_N(x_{k+1})\le V_N(x_k)$ for every $k$, so
\begin{align*}
V_N(x_k)\le V_N(x_0)<\eta_\varepsilon
\end{align*}
for every $k\ge 0$. Hence $x_k\notin A_\varepsilon$ for every $k$, and therefore $|x_k|<\varepsilon$ for every $k\ge 0$. This proves Lyapunov stability of the origin relative to $\Omega_c$.
[guided]
We need a stability estimate that does not use continuity of the feedback $\kappa_N$. The only object we know is continuous is $V_N$ on $D$, so we use sublevel sets of $V_N$.
Fix $\varepsilon>0$. The set of points in the invariant region that are at least $\varepsilon$ away from the origin is
\begin{align*}
A_\varepsilon:=\{x\in\Omega_c: |x|\ge \varepsilon\}.
\end{align*}
Because $\Omega_c=\{x\in\mathcal X_N:V_N(x)\le c\}$ is contained in $D$, the properness assumption says that $\Omega_c$ is compact. The condition $|x|\ge\varepsilon$ defines a closed condition in $\mathbb R^n$, so $A_\varepsilon$ is a closed subset of the compact set $\Omega_c$. Hence $A_\varepsilon$ is compact.
If $A_\varepsilon$ is empty, then no point of $\Omega_c$ has norm at least $\varepsilon$, and positive invariance immediately gives $|x_k|<\varepsilon$ for every trajectory starting in $\Omega_c$. Suppose now that $A_\varepsilon\neq\varnothing$. Since $V_N|_D$ is continuous and $A_\varepsilon\subset D$, $V_N$ attains a minimum on $A_\varepsilon$:
\begin{align*}
\eta_\varepsilon:=\min_{x\in A_\varepsilon}V_N(x).
\end{align*}
Every point of $A_\varepsilon$ is nonzero, and $A_\varepsilon\subset D$. Positive definiteness of $V_N|_D$ therefore gives $V_N(x)>0$ on $A_\varepsilon$, so the compact minimum satisfies $\eta_\varepsilon>0$.
The role of continuity at the origin is to make the initial value of $V_N$ smaller than this separating level. Since $V_N(0)=0$ and $V_N|_D$ is continuous at $0$, there is $\delta>0$ such that $x\in D$ and $|x|<\delta$ imply
\begin{align*}
V_N(x)<\eta_\varepsilon.
\end{align*}
Because $\Omega_c$ is a neighbourhood of $0$ relative to $\mathcal X_N$, we shrink $\delta$ if necessary so that every $x\in\mathcal X_N$ with $|x|<\delta$ belongs to $\Omega_c$.
Now take any initial state $x_0\in\Omega_c$ with $|x_0|<\delta$. Positive invariance gives $x_k\in\Omega_c\subset D$ for all $k\ge 0$. The Lyapunov decrease implies monotonicity:
\begin{align*}
V_N(x_{k+1})\le V_N(x_k)
\end{align*}
for every $k\ge 0$. Hence, by induction,
\begin{align*}
V_N(x_k)\le V_N(x_0)<\eta_\varepsilon
\end{align*}
for every $k\ge 0$. If some $x_k$ had $|x_k|\ge\varepsilon$, then $x_k\in A_\varepsilon$, which would force $V_N(x_k)\ge\eta_\varepsilon$, contradicting the displayed inequality. Therefore $|x_k|<\varepsilon$ for every $k\ge 0$. This is Lyapunov stability relative to $\Omega_c$.
[/guided]
[/step]
[step:Use the stage-cost lower bound to prove convergence to the origin]
Let $x_0\in\Omega_c$, and let $(x_k)_{k\ge 0}$ be the closed-loop trajectory. By positive invariance, $x_k\in\Omega_c\subset\mathcal X_N$ for every $k\ge 0$. Applying the Lyapunov decrease at $x_k$ gives
\begin{align*}
V_N(x_{k+1})-V_N(x_k)\le -\ell(x_k,\kappa_N(x_k)).
\end{align*}
Using $\ell(x,u)\ge\alpha(|x|)$ with $u=\kappa_N(x_k)$, we obtain
\begin{align*}
V_N(x_{k+1})-V_N(x_k)\le -\alpha(|x_k|).
\end{align*}
Summing this inequality from $k=0$ to $M$ gives
\begin{align*}
\sum_{k=0}^{M}\alpha(|x_k|)\le V_N(x_0)-V_N(x_{M+1})\le V_N(x_0)
\end{align*}
for every $M\ge 0$, because $V_N\ge 0$. Therefore the nonnegative series
\begin{align*}
\sum_{k=0}^{\infty}\alpha(|x_k|)
\end{align*}
converges, and in particular $\alpha(|x_k|)\to 0$ as $k\to\infty$.
Since $\alpha$ is class-$\mathcal K$, it is strictly increasing, continuous, and satisfies $\alpha(0)=0$. Hence $\alpha(r)>0$ for every $r>0$. If $|x_k|$ did not converge to $0$, there would exist $\varepsilon>0$ and a subsequence $(x_{k_i})_{i\ge 1}$ such that $|x_{k_i}|\ge\varepsilon$ for every $i$. Then
\begin{align*}
\alpha(|x_{k_i}|)\ge \alpha(\varepsilon)>0
\end{align*}
for every $i$, contradicting $\alpha(|x_k|)\to 0$. Thus $|x_k|\to 0$, so $x_k\to 0$ in $\mathbb R^n$.
Combining equilibrium of the origin, Lyapunov stability relative to $\Omega_c$, and convergence of every trajectory starting in $\Omega_c$ proves that the origin is asymptotically stable for the closed-loop system restricted to $\Omega_c$.
[/step]