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_libdevra 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) quemoteur-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é) :
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 :
(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 :
(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).