Aller au contenu

K1 — Cas-témoin du moteur DBO (oracle calculé à la main)

🎯 À retenir

K1 est le cas-témoin de référence du moteur : un salarié IFC unique, dérivé à la main sur une grille back-loaded en mortalité seule, qui verrouille le noyau du calcul. Tant qu'une implémentation ne le reproduit pas dans les tolérances, elle est réputée fausse.

🔒 Oracle scellé

La DBO calculée ici (pleine précision : 2 751 205,018849 FCFA) est l'oracle de référence K1 : c'est la source de vérité, à reproduire et non à recalculer. Tout écart au-delà des seuils invalide l'implémentation, pas l'oracle, sauf erreur démontrée dans l'oracle même.

Rôle. K1 est le kill criterion de référence (formalisation §8) : un cas IFC unique, calculé à la main ici, que l'implémentation de actuariat_lib devra reproduire à \(|\Delta| \le 1\) FCFA et écart relatif \(\le 10^{-6}\). Tant qu'un module ne passe pas K1, il est réputé faux. Oracle exécutable jumeau : k1_oracle.py (arithmétique indépendante, auto-vérifiée). Les équations utilisées sont rappelées en forme générale au §2 (mêmes numéros (1)–(6) que moteur-dbo_formalisation_v2.md) pour que cette note soit auto-consistante.

1. Hypothèses figées

Donnée Symbole Valeur
Âge à \(t_0\) \(x\) 55 ans
Ancienneté à \(t_0\) \(k\) 25 ans
Âge de retraite \(r\) 60 ans
Horizon \(n = r-x\) 5 ans
Ancienneté projetée \(k_r = k+n\) 30 ans
Salaire de référence \(S_0\) 100 000 FCFA/mois (base = \(S_0\) directement)
Revalorisation salariale \(g\) 2 %/an
Taux d'actualisation \(i\) 4 %/an (effectif)
Charges sociales \(\tau_{\text{cs}}\) 0
Plafond aucun
Seuil d'entitlement \(s^{\ast}\) 5 ans
Décrément mortalité seule (rotation, invalidité = 0)
Table de mortalité CIMA H (Code CIMA 2019, annexe art. 338, p. 225)

Grille IFC back-loaded (convention collective, mois de salaire par année d'ancienneté) :

\[\text{0–5 ans : }0 \quad|\quad \text{5–15 ans : }1 \quad|\quad \text{> 15 ans : }2 \text{ mois/an}\]

Choix de conception de K1 : grille back-loaded (pour que l'attribution A2′ soit distincte de A1 et A2 — sinon le test ne mordrait pas sur D-ATTRIB), horizon court (\(n=5\), pour rester calculable à la main), mortalité seule (la survie se réduit alors à un simple rapport de la table, \(\,{}_n p_x = l_{x+n}/l_x\), ce qui exerce la lecture de table sans produit à dérouler).

2. Équations de référence (forme générale, pour auto-consistance)

Reproduites verbatim de moteur-dbo_formalisation_v2.md (mêmes numéros). Notations : \(x\) âge, \(k\) ancienneté, \(n=r-x\) horizon, \(k_r=k+n\), \(v=(1+i)^{-1}\) facteur d'actualisation, \(j\in\{d,w,\iota\}\) = décès / rotation / invalidité, \(G\) grille (mois), \(s^{\ast}\) seuil d'entitlement, \([u]_+=\max(u,0)\).

(1) Décrément combiné (approximation additive) et survie sur un an : $\(q^{(\tau)}_x = \min\!\big(1,\; q^{(d)}_x + q^{(w)}_x + q^{(\iota)}_x\big), \qquad p^{(\tau)}_x = 1 - q^{(\tau)}_x\)$

(2) Probabilité de maintien sur \(n\) années :

\[ {}_n p_x^{(\tau)} = \prod_{s=0}^{n-1} p^{(\tau)}_{x+s} = \prod_{s=0}^{n-1}\big(1 - q^{(\tau)}_{x+s}\big)\]

(3) Projections (salaire et ancienneté à la retraite) : $\(S_r = S_0\,(1+g)^{\,n}, \qquad k_r = k + n\)$

(4) Grille de prestation (mois dus pour l'ancienneté \(\kappa\), tranches \((b_j^{\inf},b_j^{\sup},\tau_j)\) en mois/an) : $\(G(\kappa) = \sum_j \big[\min(\kappa,\,b_j^{\sup}) - b_j^{\inf}\big]_+ \cdot \tau_j\)$

(5) Prestation projetée (carrière complète), puis plafonnement : $\(\text{PP} = G(k_r)\cdot S_r \cdot (1+\tau_{\text{cs}}), \qquad \text{PP} \leftarrow \min\big(\text{PP},\,\text{plafond}\big)\)$

(6) DBO individuelle — forme générale PUC : $\(\text{DBO}_i = \text{PP} \cdot \underbrace{A(k,k_r)}_{\text{attribution}} \cdot \underbrace{v^{\,n}}_{\text{actualisation}} \cdot \underbrace{{}_n p_x^{(\tau)}}_{\text{maintien}}\)$

(A2′) Facteur d'attribution retenu (droite dès l'entitlement, D-ATTRIB ratifié) : $\(A(k,k_r) = \frac{[\,k - s^{\ast}\,]_+}{k_r - s^{\ast}}\)$ Comparateurs cités : (A1) linéaire \(A=k/k_r\) ; (A2) formule stricte \(A=G(k)/G(k_r)\).

3. Dérivation à la main, pas à pas

① Grille — éq. (4). $\(G(k=25) = \underbrace{[\min(25,15)-5]\cdot 1}_{10} + \underbrace{[25-15]\cdot 2}_{20} = 30 \text{ mois}\)$ $\(G(k_r=30) = \underbrace{[15-5]\cdot 1}_{10} + \underbrace{[30-15]\cdot 2}_{30} = 40 \text{ mois}\)$

② Attribution — facteur (A2′). $\(A = \frac{[\,k-s^{\ast}\,]_+}{k_r - s^{\ast}} = \frac{25-5}{30-5} = \frac{20}{25} = \mathbf{0{,}80}\)$ Comparateurs : \(A_1 = k/k_r = 25/30 = 0{,}8333\) ; \(A_2 = G(k)/G(k_r) = 30/40 = 0{,}75\). → \(A_2 < A_2' < A_1\) : K1 distingue bien les trois attributions (la grille est back-loaded).

Pourquoi cet ordre est structurel : sur grille back-loaded, \(A_2(k)\) est convexe (pente croissante par paliers) et \(A_{2'}\) est exactement sa corde de \((s^{\ast},0)\) à \((k_r,1)\) — une convexe est sous sa corde, donc \(A_2 \le A_{2'}\) partout (égalité aux bornes) ; et \(A_1\), qui attribue dès \(k=0\) un droit que la grille dit nul, majore les deux. Interprétation complète A2 vs A2′ : formalisation v2, §6.3.

③ Salaire projeté — éq. (3). $\(S_r = S_0\,(1+g)^n = 100\,000 \times 1{,}02^{5} = 100\,000 \times 1{,}1040808032 = 110\,408{,}080320 \text{ FCFA/mois}\)$

④ Prestation projetée — éq. (5) (plafond \(=+\infty\), \(\tau_{\text{cs}}=0\)). $\(\text{PP} = G(k_r)\cdot S_r = 40 \times 110\,408{,}080320 = 4\,416\,323{,}212800 \text{ FCFA}\)$

⑤ Actualisation — facteur \(v^n\). $\(v^n = (1+i)^{-n} = 1{,}04^{-5} = 0{,}8219271068\)$

⑥ Maintien (mortalité seule) — éq. (2). Avec \(q^{(w)}=q^{(\iota)}=0\), le produit télescope :

\[ {}_{5}p_{55}^{(\tau)} = \prod_{s=0}^{4} p^{(d)}_{55+s} = \frac{l_{60}}{l_{55}} = \frac{815\,120}{860\,365} = 0{,}9474118543\]

(valeurs \(l_x\) : table CIMA H, annexe art. 338.)

⑦ DBO individuelle — éq. (6). $\(\text{DBO} = \text{PP}\cdot A\cdot v^n\cdot {}_{5}p_{55}^{(\tau)} = 4\,416\,323{,}212800 \times 0{,}80 \times 0{,}8219271068 \times 0{,}9474118543\)$

Décomposition : $\(4\,416\,323{,}2128 \xrightarrow{\times\,0{,}80} 3\,533\,058{,}570240 \xrightarrow{\times\,v^5} 2\,903\,916{,}608649 \xrightarrow{\times\,{}_5p_{55}} \boxed{2\,751\,205{,}018849}\)$

4. Valeurs attendues (l'oracle) et tolérances

Grandeur Valeur attendue
\(A\) (A2′) \(0{,}80\)
\(S_r\) \(110\,408{,}080320\) FCFA/mois
\(\text{PP}\) \(4\,416\,323{,}212800\) FCFA
\(v^5\) \(0{,}8219271068\)
\({}_5p_{55}\) \(0{,}9474118543\)
DBO (pleine précision) \(2\,751\,205{,}018849\) FCFA
DBO (arrondi FCFA) \(2\,751\,205\) FCFA

Seuils K1 (réussite) : \(\;|\Delta_{\text{DBO}}| \le 1\) FCFA et \(\dfrac{|\Delta_{\text{DBO}}|}{\text{DBO}} \le 10^{-6}\).

5. Usage en Temps 3

Quand actuariat_lib existera, un test (tests/test_k1.py) instanciera exactement ces hypothèses, appellera dbo_individuelle_puc(...), et comparera à k1_oracle.dbo_k1()["DBO"] sous les seuils ci-dessus. Le gardien K1 couvre engagements/dbo (cf. §11). Tout écart au-delà du seuil invalide l'implémentation (pas l'oracle) — sauf erreur démontrée dans l'oracle, auquel cas on corrige ici d'abord.

Limite assumée. K1 n'exerce pas les décréments combinés (rotation + invalidité, approximation additive §5.1) ni le plafonnement ni les charges sociales : ce sont d'autres faits/critères (F2, K3…). K1 verrouille le noyau (1)–(6) sur un cas exact et auditable. Le second cas-témoin K1-bis (rotation \(>0\)) exerce précisément (1).