{
  "explanation": "Trois dossiers anonymes sont construits séparément sous les mêmes invariants. A utilise une base transactionnelle et un outbox; B un journal répliqué partitionné; C un journal par salon avec leader et quorum. Chaque dossier décrit son point de persistance, sa déduplication et son mécanisme de reprise. Le simulateur partagé intervient sur l'ordre d'arrivée, les répétitions et le curseur de reconnexion. Il représente la persistance par une insertion atomique en mémoire avant création de l'ACK; il ne réalise aucune écriture durable sur disque. Un succès des tests qualifie uniquement cette sémantique simulée, pas les implémentations distribuées. Aucun gagnant n'est promu et aucune comparaison indépendante n'est inventée.",
  "constraints": ["durable-before-ack", "durable-order-by-seq", "deduplicate-by-id", "replay-after-cursor"],
  "architectures": [
    {"id":"A", "design":"Base transactionnelle et outbox", "persistence":"Transaction atomique message, unicité (salon,id), unicité (salon,seq) et outbox; ACK après commit durable.", "ordering":"Séquence allouée par salon sous verrou transactionnel; lecture ORDER BY seq.", "deduplication":"Nouvelle tentative avec même id retourne le résultat enregistré; conflit de contenu rejeté.", "reconnect":"Requête seq > curseur, puis jonction au flux à une borne capturée sans perdre les messages intermédiaires.", "tradeoffs":"Transactions et exploitation familières; contention sur les salons chauds et rétention en base.", "factualGate":"eligible-for-model-comparison-only", "productionGate":"pending-real-persistence-and-fault-tests"},
    {"id":"B", "design":"Journal répliqué partitionné", "persistence":"Append confirmé par le quorum durable configuré; ACK client seulement après confirmation.", "ordering":"Un salon appartient à une partition; seq logique persistée avec le message, distincte de l'offset technique.", "deduplication":"Index durable id vers seq coordonné atomiquement avec append; sa reconstruction doit conserver l'idempotence.", "reconnect":"Index du curseur logique vers le journal; lecture filtrée seq > curseur puis suivi du même journal.", "tradeoffs":"Journal adapté au suivi continu; coordination de l'index, rétention et reconfiguration de partitions complexes.", "factualGate":"eligible-for-model-comparison-only", "productionGate":"pending-real-persistence-and-fault-tests"},
    {"id":"C", "design":"Leader par salon et journal à quorum", "persistence":"Leader clôturé par époque; réplication durable majoritaire avant commit puis ACK.", "ordering":"Leader attribue seq; seuls les éléments committés sont visibles dans l'ordre logique.", "deduplication":"Table id vers résultat dans l'état répliqué, conservée dans les snapshots.", "reconnect":"Lecture du journal committé après curseur; snapshot et archive requis si journal compacté.", "tradeoffs":"Isolation des salons et contrôle du protocole; coût de consensus, élections et exploitation personnalisée.", "factualGate":"eligible-for-model-comparison-only", "productionGate":"pending-real-persistence-and-fault-tests"}
  ],
  "failureModes": [
    {"failure":"Crash avant commit", "expected":"Aucun ACK; nouvelle tentative autorisée", "status":"non testé en processus réel"},
    {"failure":"Commit réussi puis ACK perdu", "expected":"Même id conserve une seule entrée et retourne le résultat durable", "status":"répétition simulable, perte réseau non testée"},
    {"failure":"Arrivées désordonnées et reconnexion", "expected":"Durable trié par seq; reprise strictement après curseur", "status":"scénario du vérificateur"},
    {"failure":"Même id avec contenu différent ou même seq avec autre id", "expected":"Rejet explicite sans écrasement", "status":"gate du simulateur"},
    {"failure":"Partition, ancien leader ou journal compacté", "expected":"Clôture du leader et conservation du chemin de reprise; sinon gate production échoue", "status":"non mesuré"}
  ],
  "acceptanceChecks": ["npm test: scénario imposé doublon, désordre et reconnexion", "Interventions supplémentaires: conflits id/seq, curseur invalide et absence d'ACK pendant déconnexion", "Avant qualification production: tuer le processus avant/après commit, redémarrer sur disque et vérifier chaque ACK", "Jury: comparer uniquement les survivants au niveau de preuve déclaré, sans identité d'auteur"],
  "juryRequest": {"status":"prepared-not-dispatched-no-jury-tool", "eligibleCandidates":["A","B","C"], "scope":"comparaison qualitative des dossiers et de la sémantique du modèle uniquement", "productionEligibleCandidates":[], "instruction":"Comparer anonymement A, B et C après lecture des preuves et limites communes; vote consultatif, aucune promotion automatique. Si le jury exige une validation production, aucun candidat ne survit actuellement."},
  "assumptions": ["Une seule portée de séquence est simulée; en production elle est un salon.", "Les send représentent des messages acceptés côté serveur, même si le client est déconnecté.", "Le curseur est une séquence contiguë déjà consommée; le serveur alloue les séquences en production.", "La rétention couvre la période de reconnexion."],
  "uncertainties": ["Aucun stockage, broker ou consensus réel implémenté.", "Débit, latence, coût et tolérance aux crashs réseau non mesurés.", "Le simulateur commun ne départage pas les architectures.", "L'intégration atomique journal/index du dossier B reste à démontrer.", "Aucun outil de jury ou de publication GenOS disponible."],
  "executionLimits": ["Mémoire volatile, aucune preuve de fsync ou de quorum", "Pas de processus concurrents ni réseau", "La reprise concatène les résultats de chaque reconnexion; un message peut être rejoué lors de plusieurs sessions", "Aucune vérification indépendante ni score de jury"],
  "strategy": "causal_replay_intervention",
  "promotion": "withheld-pending-independent-verification"
}
