Commit f2b6d74c authored by Jordan Grossemy's avatar Jordan Grossemy
Browse files

Le cahier des charges dit ce que le produit fait maintenant

Les exigences nées du comparatif avec le cahier des charges dérivé de F24 sont
consignées avec leur provenance, pour qu'on puisse retrouver d'où vient chacune
sans relire une conversation.

  EF-202a  détection des trous d'astreinte
  EF-307a  déclenchement par un système tiers      (RG-501)
  EF-307b  consultation d'état par l'émetteur      (RG-502)
  EF-1103a objectif chiffré
  EF-1103b mobilisations préparées
  EF-1103c réponses personnalisées et typées       (RG-318)
  EF-1107  anti-doublon                            (RG-221)
  EF-1108  alertes multilingues                    (RG-291 à RG-293)

Chacune dit aussi ce qu'elle ne fait pas, là où c'est le cas — le recueil de la
touche vocale attend la téléphonie entrante du lot L12, et il vaut mieux le
lire dans l'exigence que le découvrir à l'usage.

L'idée d'une passerelle vocale sur compte SIP y figure depuis un lot
précédent : les trois chemins possibles et leur coût, sans en choisir un.

Co-Authored-By: Claude (RCA)
parent 4c19aad6
Loading
Loading
Loading
Loading
Loading
+17 −5
Changes for README.md: 17 added lines, 5 removed lines.
Original line number Diff line number Diff line
@@ -14,18 +14,18 @@ l'enregistre intégralement — de manière à pouvoir la rembobiner.
|-----|---------|------|
| **L0** | Socle, conteneurisation, authentification, console root | 🟢 fait |
| **L1** | Noyau de persistance, main courante, rembobinage | 🟡 en cours — noyau, lecture à date, filtres et routes faits ; reste l'export PDF paginé de la main courante (EF-410) et la vue frise, qui suppose une interface |
| **L2** | Dossier de préparation (annuaire, tiers, fiches réflexes, kit) | 🟢 fait — plus les étiquettes, les destinataires de diffusion, les modèles de message et le dépôt d'annuaire depuis un SIRH |
| **L2** | Dossier de préparation (annuaire, tiers, fiches réflexes, kit) | 🟢 fait — plus les étiquettes, les destinataires de diffusion, les modèles de message, le dépôt d'annuaire depuis un SIRH et le détecteur de trous d'astreinte, qui dit *quand* personne n'est joignable au lieu de se contenter de dire qui l'est |
| **L3** | Décisions, actions, points de situation, cockpit | 🟢 fait |
| **L4** | Chat de crise, flux temps réel | 🟢 fait — plus les messages directs, les groupes hors journal et les canaux privés |
| **L5** | Gestion documentaire, stockage objet | 🟢 fait — indexation des PDF à venir avec l'aperçu |
| **L6** | Visioconférence, enregistrement, rétention | 🟢 fait côté serveur — les fonctions d'appel (partage d'écran, panneau flottant, repli audio) vivent dans le client ; une salle peut s'adosser à un canal et en prendre les droits |
| **L7** | Tableau blanc, modèles, instantanés | 🟢 fait côté serveur |
| **L8** | Mobilisation multicanal, relances, escalade | 🟢 fait — plus le recensement de sécurité, le ciblage par étiquettes et le canal vocal |
| **L8** | Mobilisation multicanal, relances, escalade | 🟢 fait — plus le recensement de sécurité, le ciblage par étiquettes, le canal vocal, l'objectif chiffré (la mobilisation s'arrête d'elle-même quand elle a le monde qu'il faut, au lieu de relancer indéfiniment), les mobilisations préparées au dossier, gelées au déclenchement et modifiables avant l'envoi, les réponses personnalisées et typées (positive, négative, neutre — c'est le type, pas le libellé, qui décide de l'objectif, de l'escalade et du rapport), l'anti-doublon réglable en secondes, et les alertes multilingues jusqu'à cinq versions, avec repli sur la langue par défaut plutôt que sur le silence |
| **L9** | Rembobinage complet, dossier de crise, retour d'expérience | 🟢 fait |
| **L10** | Intégration exercice, page d'état, vérificateur, CI, documentation | 🟢 fait côté serveur — application installable, accessibilité et bilinguisme suivent le client |
| **Interface** | Coque, visio flottante, rembobinage, dossier de préparation, console root, tableaux, mobilisation, clôture | 🟢 fait — plus les canaux, les messages directs, le recensement, les étiquettes, les destinataires et les modèles |
| **L10** | Intégration exercice, page d'état, vérificateur, CI, documentation | 🟢 fait côté serveur — plus le déclenchement par système tiers (supervision, SIEM, sonde) sur une portée de clé distincte de l'exercice, et la consultation d'état par l'émetteur, qui lit l'avancement sans jamais lire le journal ; application installable, accessibilité et bilinguisme suivent le client |
| **Interface** | Coque, visio flottante, rembobinage, dossier de préparation, console root, tableaux, mobilisation, clôture | 🟢 fait — plus les canaux, les messages directs, le recensement, les étiquettes, les destinataires, les modèles, et la boucle décisionnelle entière : enregistrer une décision, ouvrir une action, et l'ouvrir en un geste depuis la décision qui l'a produite |
| **L11** | Applications mobiles iOS et Android | 🟡 écrite — les six gestes du chemin critique (M0 à M3), sur iOS et Android, et le relais sert désormais les deux ; reste la distribution sur les magasins, qui n'est pas commencée |
| L12 | Téléphonie entrante, transcription | ⚪ hors d'atteinte sans infrastructure SIP — la diffusion vocale sortante existe (synthèse par passerelle), et le pont de conférence se renseigne sans être hébergé |
| L12 | Téléphonie entrante, transcription | ⚪ hors d'atteinte sans infrastructure SIP — la diffusion vocale sortante existe (synthèse par passerelle), et le pont de conférence se renseigne sans être hébergé. Brancher un compte SIP (trunk OVH ou autre) demande un sous-système, pas une entrée de catalogue : les trois chemins possibles et leurs coûts sont écrits au cahier des charges, sous L12 |

Ce qui fonctionne aujourd'hui : le journal inviolable et son chaînage
d'empreintes, le vérificateur indépendant, la reconstitution d'un état passé
@@ -686,6 +686,18 @@ un déclencheur. La console en exige une présentation de moins de quinze
minutes : un root sans TOTP détiendrait un droit qu'il ne pourrait jamais
exercer, et croirait en disposer le jour où il faut s'en servir.

Cette obligation est levée quand `KASTELL_ENV` vaut `developpement`, et
seulement là : sur une instance jetable, exiger un TOTP avant de pouvoir
seulement ouvrir la console qu'on veut essayer conduit à désarmer le garde pour
de bon. L'état dont dépend le déclencheur est écrit au démarrage par
l'application, hors de `reglage_instance` — un interrupteur capable de désarmer
l'authentification forte n'a rien à faire à portée de clic dans la console.
Trois conséquences : la variable n'a **pas** de valeur par défaut et
l'application refuse de démarrer sans elle ; une base sur laquelle rien n'a été
posé applique la contrainte ; et l'interface porte un bandeau permanent, servi
par la sonde publique `/etat`, pour qu'une instance de test ne se confonde
jamais avec une instance réelle.

Amorçage du premier root sur une instance neuve :

```bash
+33 −0
Changes for cahier-des-charges.html: 33 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -615,6 +615,7 @@ footer{
  <ul class="reqs">
    <li><span class="rid">EF-201</span><span class="rtx">Espace de préparation permanent, accessible sans crise ouverte, présentant en une vue l&rsquo;annuaire, les tiers, les fiches réflexes, le kit documentaire et l&rsquo;indicateur de fraîcheur de chacun.</span></li>
    <li><span class="rid">EF-202</span><span class="rtx"><strong>Annuaire interne</strong>&nbsp;: personnes, rôle tenu en cellule de crise, suppléant désigné, coordonnées professionnelles <em>et</em> personnelles, adresse e-mail hors SI, périodes d&rsquo;astreinte et d&rsquo;indisponibilité.</span></li>
    <li><span class="rid">EF-202a</span><span class="rtx"><strong>Détection des trous d&rsquo;astreinte</strong>&nbsp;: les créneaux où <em>personne</em> n&rsquo;est joignable, sur un horizon réglable, avec le geste qui les comble. Savoir qui est d&rsquo;astreinte ne dit pas quand personne ne l&rsquo;est&nbsp;: un tour comportant un trou le dimanche matin ne se voit pas en lisant la liste, il se voit le dimanche matin. Une organisation qui n&rsquo;a rien déclaré est signalée comme entièrement découverte, et non comme sans trou.</span></li>
    <li><span class="rid">EF-203</span><span class="rtx"><strong>Registre des tiers activables</strong>&nbsp;: prestataire de réponse à incident et CERT, assureur cyber, avocat, hébergeur, opérateurs, autorités de notification, agence de communication, expert judiciaire, prestataire de restauration de données.</span></li>
    <li><span class="rid">EF-204</span><span class="rtx">Chaque tiers porte les éléments contractuels utiles à chaud&nbsp;: référence de contrat ou de police, périmètre couvert et exclusions, engagement de délai d&rsquo;intervention, plafond, interlocuteur nommé et son suppléant.</span></li>
    <li><span class="rid">EF-205</span><span class="rtx">Chaque tiers porte sa <strong>procédure d&rsquo;activation en clair</strong>&nbsp;: qui est habilité à appeler, quel numéro d&rsquo;urgence, quelles informations préparer, quel délai attendre, quoi faire si personne ne répond.</span></li>
@@ -639,6 +640,8 @@ footer{
    <li><span class="rid">EF-305</span><span class="rtx">Le niveau de gravité est modifiable à tout moment&nbsp;; chaque changement exige une justification et produit un événement.</span></li>
    <li><span class="rid">EF-306</span><span class="rtx">Une crise peut être marquée <strong>exercice</strong>. Le marquage est permanent, affiché en bandeau non masquable, et exclut la crise des statistiques. Aucun moteur de scénario n&rsquo;est embarqué&nbsp;: l&rsquo;animation relève du projet dédié.</span></li>
    <li><span class="rid">EF-307</span><span class="rtx">Interface d&rsquo;intégration permettant à l&rsquo;outil d&rsquo;exercice tiers d&rsquo;ouvrir une crise en mode exercice, d&rsquo;y injecter des entrées et de la clôturer. Les injections sont journalisées avec une origine distincte et restent identifiables au rejeu.</span></li>
    <li><span class="rid">EF-307a</span><span class="rtx"><strong>Déclenchement par un système tiers</strong> <em>(RG-501)</em>&nbsp;: supervision, SIEM, GTB, sonde. La machine voit avant l&rsquo;humain, et les minutes gagnées là sont celles qui comptent. Une portée «&nbsp;alerte&nbsp;» distincte de «&nbsp;exercice&nbsp;», et étanche dans les deux sens&nbsp;: une clé d&rsquo;exercice n&rsquo;ouvre jamais de crise réelle, et un automate branché sur la production ne fabrique pas d&rsquo;exercices que personne n&rsquo;a demandés. L&rsquo;origine «&nbsp;externe&nbsp;» est journalisée avec la référence de l&rsquo;émetteur, pour que le retour d&rsquo;expérience distingue ce qu&rsquo;une machine a déclenché de ce qu&rsquo;une cellule a décidé. La mobilisation peut partir dans le même appel&nbsp;: une sonde n&rsquo;en fera pas deux.</span></li>
    <li><span class="rid">EF-307b</span><span class="rtx"><strong>Consultation d&rsquo;état par l&rsquo;émetteur</strong> <em>(RG-502)</em>&nbsp;: phase, gravité, avancement des mobilisations. Un <em>état</em>, jamais un <em>contenu</em>&nbsp;: le journal d&rsquo;une crise réelle reste hors de portée d&rsquo;une clé d&rsquo;intégration, comme il l&rsquo;est du compte root — administrer n&rsquo;est pas lire. Un système de détection a besoin de savoir si son alerte a été prise en charge&nbsp;; il n&rsquo;a pas besoin de lire ce que la cellule s&rsquo;est dit.</span></li>
    <li><span class="rid">EF-308</span><span class="rtx">Clôture en deux temps&nbsp;: passage en phase de sortie de crise, puis clôture définitive qui gèle le journal, lance la vérification d&rsquo;intégrité et déclenche la génération du dossier.</span></li>
  </ul>

@@ -737,9 +740,14 @@ footer{
    <li><span class="rid">EF-1101</span><span class="rtx">Campagne de mobilisation ciblant des rôles, des personnes ou des tiers de l&rsquo;annuaire, par notification, e-mail et SMS simultanément.</span></li>
    <li><span class="rid">EF-1102</span><span class="rtx">Suivi des accusés de réception en temps réel&nbsp;: qui a reçu, qui a confirmé, qui n&rsquo;a pas répondu. C&rsquo;est l&rsquo;information la plus utile de la première heure.</span></li>
    <li><span class="rid">EF-1103</span><span class="rtx">Relance automatique après un délai paramétrable, puis escalade vers le suppléant désigné.</span></li>
    <li><span class="rid">EF-1103a</span><span class="rtx"><strong>Objectif chiffré</strong>&nbsp;: le nombre de présents attendus, au-delà duquel la campagne se referme d&rsquo;elle-même. C&rsquo;est la différence entre notifier et mobiliser&nbsp;: notifier, c&rsquo;est envoyer à tous et attendre&nbsp;; mobiliser, c&rsquo;est avoir besoin de cinq personnes sur douze et s&rsquo;arrêter quand on les a — les relances cessent et les suppléants ne sont plus escaladés pour rien. L&rsquo;objectif compte les accusés de présence, non les réponses &laquo;&nbsp;j&rsquo;arrive&nbsp;&raquo;&nbsp;: confirmer depuis le lien d&rsquo;un SMS pose l&rsquo;accusé sans poser de réponse, et c&rsquo;est le chemin principal. Un objectif supérieur au nombre de personnes sollicitées est refusé à la source.</span></li>
    <li><span class="rid">EF-1103b</span><span class="rtx"><strong>Mobilisations préparées</strong>&nbsp;: le texte, la cible, l&rsquo;objectif, la relance et l&rsquo;escalade décidés à froid dans le dossier de préparation, versionnés et gelés au déclenchement comme le reste. Une mobilisation demandait cinq décisions à la minute où l&rsquo;on en a le moins le temps — et où l&rsquo;on rédige le plus mal. Ces cinq décisions ne dépendent pas de l&rsquo;heure&nbsp;: le scénario &laquo;&nbsp;cellule cyber, nuit&nbsp;&raquo; ne change pas parce qu&rsquo;il est trois heures du matin, seul le fait qu&rsquo;il faille l&rsquo;appliquer change. Le modèle appliqué reste modifiable avant l&rsquo;envoi&nbsp;: c&rsquo;est une avance de rédaction, pas un automatisme — la crise qu&rsquo;on traverse n&rsquo;est jamais exactement celle qu&rsquo;on avait prévue.</span></li>
    <li><span class="rid">EF-1104</span><span class="rtx">Chaque envoi, réception et accusé produit un événement&nbsp;: le délai de mobilisation est mesurable et rejouable.</span></li>
    <li><span class="rid">EF-1105</span><span class="rtx">Le canal SMS reste fonctionnel quand l&rsquo;e-mail du client est hors service — c&rsquo;est précisément le cas d&rsquo;usage.</span></li>
    <li><span class="rid">EF-1106</span><span class="rtx"><span class="later">v2</span> Appel vocal automatisé avec message de synthèse et confirmation au clavier, pour les mobilisations nocturnes.</span></li>
    <li><span class="rid">EF-1103c</span><span class="rtx"><strong>Réponses personnalisées et typées</strong> <em>(RG-318)</em>&nbsp;: dix au plus par campagne, chacune <strong>positive</strong>, <strong>négative</strong> ou <strong>neutre</strong>. Le type, et non le libellé, est ce que le moteur lit&nbsp;: positive compte pour l&rsquo;objectif et arrête la recherche&nbsp;; négative cesse les relances et sollicite le suppléant tout de suite&nbsp;; neutre cesse les relances sans rien compter ni escalader. Une campagne peut donc inventer ses mots — «&nbsp;je prends l&rsquo;astreinte&nbsp;», «&nbsp;je me connecte à distance&nbsp;» — sans qu&rsquo;aucune règle change. Le jeu est préparé à froid, gelé au lancement, et proposé aussi bien sur l&rsquo;application que sur le lien reçu par SMS. Le texte vocal qui associe chaque touche à sa réponse est produit&nbsp;; le <em>recueil</em> de la touche frappée suppose la téléphonie entrante du lot L12, hors périmètre actuel.</span></li>
    <li><span class="rid">EF-1107</span><span class="rtx"><strong>Anti-doublon</strong> <em>(RG-221)</em>&nbsp;: une fenêtre en secondes, réglable par organisation, pendant laquelle un déclenchement identique est <em>refusé</em> et non rejoué. Un système de détection ne déclenche pas une fois&nbsp;: il déclenche tant que la condition dure — une sonde qui perd sa liaison réémet toutes les trente secondes, ce qui ferait cent vingt crises en une heure, chacune avec ses SMS et ses relances. Le rapprochement se fait sur la référence fournie par l&rsquo;émetteur, ou à défaut sur l&rsquo;intitulé et le type. La même règle vaut entre humains&nbsp;: deux personnes de la cellule qui lancent le même appel à trente secondes d&rsquo;écart. Zéro désactive, pour l&rsquo;organisation qui déduplique déjà en amont.</span></li>
    <li><span class="rid">EF-1108</span><span class="rtx"><strong>Alertes multilingues</strong> <em>(RG-291 à RG-293)</em>&nbsp;: jusqu&rsquo;à cinq versions par alerte, chacun recevant celle de sa langue déclarée. Sans langue déclarée, ou dans une langue qu&rsquo;on n&rsquo;a pas rédigée, on reçoit la version par défaut — <strong>jamais rien</strong>&nbsp;: un message qu&rsquo;on lit mal vaut infiniment mieux qu&rsquo;un silence. Les relances et les escalades suivent la langue de la personne, y compris celle du suppléant. La langue par défaut voyage jusqu&rsquo;à la passerelle vocale, dont le gabarit demande la voix de synthèse à son fournisseur&nbsp;: Kastell ne synthétise pas, et prétendre choisir la voix serait prétendre connaître un catalogue qu&rsquo;il ne connaît pas.</span></li>
  </ul>

  <h3>6.12 &nbsp;Clôture et restitution</h3>
@@ -1106,6 +1114,31 @@ footer{
    <div class="lot"><div class="lid">L12</div><div><h3>Téléphonie et assistance</h3><p>Accès téléphonique entrant, appel vocal de mobilisation, transcription et proposition de compte rendu, brouillon de point de situation assisté.</p></div><div class="eff">4 sem.</div></div>
  </div>
  <p><strong>Environ 38 semaines jusqu&rsquo;au jalon 4</strong>, hors mobile. Le jalon 1 est atteignable en 14 semaines&nbsp;: c&rsquo;est déjà un produit vendable — un dossier de préparation tenu hors SI et une main courante probante valent à eux seuls l&rsquo;abonnement, la visio pouvant rester à côté.</p>
  <div class="note">
    <span class="lab">L12 &mdash; l&rsquo;appel vocal par compte SIP, &agrave; trancher</span>
    <p>La passerelle vocale actuelle est une <strong>requ&ecirc;te HTTPS</strong>&nbsp;: une adresse,
    un jeton, un gabarit JSON, et la synth&egrave;se vocale est faite par l&rsquo;op&eacute;rateur.
    Brancher un <strong>compte SIP</strong> &mdash; un trunk OVH, par exemple &mdash; ne s&rsquo;y
    ram&egrave;ne pas&nbsp;: il faut un agent SIP, du m&eacute;dia RTP, la travers&eacute;e de NAT,
    des codecs et une synth&egrave;se &agrave; diffuser. Ce n&rsquo;est pas une entr&eacute;e de
    catalogue, c&rsquo;est un sous-syst&egrave;me.</p>
    <p>Trois chemins, par co&ucirc;t croissant. <strong>Une passerelle m&eacute;dia s&eacute;par&eacute;e</strong>
    (Asterisk, FreeSWITCH) qui porte le compte SIP et expose un point HTTPS&nbsp;: le canal
    g&eacute;n&eacute;rique existant l&rsquo;appelle sans rien changer au produit. &Agrave; noter&nbsp;:
    l&rsquo;appel sortant refuse le r&eacute;seau interne en production, cette passerelle ne peut donc
    pas &ecirc;tre un simple conteneur de la composition &mdash; ce qui est coh&eacute;rent avec
    l&rsquo;intention du garde, une passerelle d&rsquo;alerte h&eacute;berg&eacute;e dans le syst&egrave;me
    qu&rsquo;elle secourt ne r&eacute;pondrait pas le jour venu. <strong>Un fournisseur d&eacute;di&eacute;</strong>
    si l&rsquo;op&eacute;rateur expose une API HTTP de t&eacute;l&eacute;phonie sortante&nbsp;: le chantier
    retombe alors &agrave; une entr&eacute;e de catalogue, sur le mod&egrave;le du SMS OVH d&eacute;j&agrave;
    en place. <strong>Le SIP dans le produit</strong>&nbsp;: d&eacute;conseill&eacute; &mdash; une pile
    m&eacute;dia temps r&eacute;el dans le processus qui doit tenir la main courante.</p>
    <p>Une contrainte de mod&egrave;le &agrave; conna&icirc;tre avant de d&eacute;cider&nbsp;: une
    organisation peut d&eacute;clarer plusieurs passerelles, mais <strong>une seule est active par
    genre</strong> &mdash; deux passerelles actives feraient partir les messages en double. R&eacute;partir
    la charge entre plusieurs comptes SIP, ou router selon la cellule, demanderait de lever cet
    invariant.</p>
  </div>
  <div class="note warn">
    <span class="lab">Écart avec les versions précédentes</span>
    <p>La v1 estimait 26 semaines, la v2 36. L&rsquo;écart cumulé tient à trois ajouts structurants&nbsp;: le noyau de persistance et le rembobinage (+5 semaines sur L1 et L9), le dossier de préparation passé d&rsquo;une sous-partie tardive à un lot entier avant le premier jalon (+3 semaines), et l&rsquo;administration d&rsquo;instance avec bris de glace (+2 semaines sur L0 et L10). Le retrait du moteur d&rsquo;exercice compense marginalement.</p>