{
  "language": "fr",
  "demonstration": {
    "id": "mcp-reach",
    "caption": "Même sonde, même machine. Seul le confinement change.",
    "runs": [
      {
        "id": "open",
        "label": "Sans confinement",
        "results": [
          {
            "attempt": "Ouvrir une connexion vers internet",
            "result": "atteint",
            "state": "reached"
          },
          {
            "attempt": "Lire les clés d’API de l’agent",
            "result": "lues",
            "state": "reached"
          },
          {
            "attempt": "Écrire hors de son périmètre",
            "result": "réussie",
            "state": "reached"
          }
        ]
      },
      {
        "id": "confined",
        "label": "Dans un confinement réel",
        "results": [
          {
            "attempt": "Ouvrir une connexion vers internet",
            "result": "injoignable",
            "state": "blocked"
          },
          {
            "attempt": "Lire les clés d’API de l’agent",
            "result": "inexistantes pour ce processus",
            "state": "blocked"
          },
          {
            "attempt": "Écrire hors de son périmètre",
            "result": "refusée",
            "state": "blocked"
          }
        ]
      }
    ],
    "repository": "https://github.com/NoaMatout/mcp-reach"
  },
  "person": {
    "id": "person:noa-matout",
    "fullName": "Noa Matout",
    "declaredAge": 23,
    "declaredAgeOn": "2026-09-21",
    "city": "Reims",
    "localized": {
      "fr": {
        "jobTitle": "Ingénieur systèmes, réseaux et sécurité",
        "knowsAbout": [
          "Exploitation des systèmes et des réseaux",
          "Automatisation de procédures par l’IA",
          "Sécurité appliquée aux automatisations"
        ]
      },
      "en": {
        "jobTitle": "Systems, network and security engineer",
        "knowsAbout": [
          "Systems and network operations",
          "Automating procedures with AI",
          "Security applied to automation"
        ]
      }
    },
    "availability": {
      "status": "available",
      "engagements": [
        "employment",
        "freelance"
      ]
    },
    "socialLinks": [
      "linkedin",
      "malt",
      "github"
    ],
    "contactLink": "email",
    "experience": [
      {
        "id": "freelance",
        "organization": "Supplay",
        "start": "2026-10",
        "localized": {
          "fr": {
            "title": "Ingénieur systèmes, réseaux et sécurité, en freelance"
          },
          "en": {
            "title": "Systems, network and security engineer, freelance"
          }
        }
      },
      {
        "id": "engineering",
        "organization": "Supplay",
        "start": "2024-10",
        "end": "2026-10",
        "localized": {
          "fr": {
            "title": "Ingénieur réseau et systèmes"
          },
          "en": {
            "title": "Network and systems engineer"
          }
        }
      },
      {
        "id": "zon",
        "organization": "ZON",
        "start": "2026-01",
        "localized": {
          "fr": {
            "title": "Cofondateur"
          },
          "en": {
            "title": "Co-founder"
          }
        }
      },
      {
        "id": "administration",
        "organization": "Supplay",
        "start": "2023-10",
        "end": "2024-10",
        "localized": {
          "fr": {
            "title": "Administrateur réseau et systèmes"
          },
          "en": {
            "title": "Network and systems administrator"
          }
        }
      },
      {
        "id": "support",
        "organization": "Supplay",
        "start": "2021-09",
        "end": "2023-09",
        "localized": {
          "fr": {
            "title": "Gestionnaire maintenance et support informatique"
          },
          "en": {
            "title": "IT maintenance and support officer"
          }
        }
      }
    ],
    "earlierCareer": {
      "fr": "Avant 2021, j’ai effectué un service civique en médiation numérique et trois ans d’apprentissage en viticulture. Je me suis reconverti vers l’informatique en 2021.",
      "en": "Before 2021, I did a civic service in digital inclusion and a three-year apprenticeship in winegrowing. I retrained in IT in 2021."
    },
    "estate": {
      "virtualMachines": [
        {
          "operatingSystem": "Linux",
          "count": 150
        },
        {
          "operatingSystem": "Windows",
          "count": 30
        }
      ],
      "virtualization": "vsphere",
      "linuxAutomation": "ansible",
      "windowsDeclarativeAutomation": false
    },
    "education": [
      {
        "id": "mastere-securite",
        "institution": "ESGI",
        "startYear": 2024,
        "endYear": 2026,
        "status": "pending-validation",
        "localized": {
          "fr": {
            "title": "Mastère Sécurité informatique",
            "certification": "Titre RNCP de niveau 7 : Expert en ingénierie informatique"
          },
          "en": {
            "title": "Master’s degree in IT security (Mastère)",
            "certification": "French level 7 certification: IT Engineering Expert"
          }
        }
      },
      {
        "id": "bachelor",
        "institution": "ESGI",
        "startYear": 2023,
        "endYear": 2024,
        "localized": {
          "fr": {
            "title": "Bachelor Sécurité informatique",
            "certification": "Titre RNCP de niveau 6 : Chef de projet systèmes, réseaux et sécurité"
          },
          "en": {
            "title": "Bachelor’s degree in IT security",
            "certification": "French level 6 certification: Systems, Network and Security Project Manager"
          }
        }
      },
      {
        "id": "cesi-systems",
        "institution": "CESI",
        "startYear": 2021,
        "endYear": 2023,
        "localized": {
          "fr": {
            "title": "Formation systèmes et réseaux"
          },
          "en": {
            "title": "Systems and networks training"
          }
        }
      },
      {
        "id": "viticulture",
        "institution": "CFA d’Avize",
        "startYear": 2017,
        "endYear": 2020,
        "localized": {
          "fr": {
            "title": "Baccalauréat professionnel Conduite et gestion d’une exploitation viti-vinicole"
          },
          "en": {
            "title": "Vocational baccalaureate in vineyard and winery management"
          }
        }
      }
    ],
    "credentials": [
      {
        "id": "toeic",
        "name": "TOEIC",
        "takenAt": "2026-01-10",
        "score": 800,
        "evidence": "self-reported"
      }
    ],
    "email": "noamatout@gmail.com",
    "sameAs": [
      "https://linkedin.com/in/noa-matout",
      "https://www.malt.fr/profile/noamatout",
      "https://github.com/NoaMatout"
    ]
  },
  "projects": [
    {
      "id": "projet-bastion-prestataires",
      "entity": "project:bastion-prestataires",
      "title": "Je borne les accès des prestataires",
      "url": "/fr/#projet-bastion-prestataires",
      "schemaType": "CreativeWork",
      "fields": {
        "problem": {
          "key": "project:bastion-prestataires:/localized/fr/problem",
          "value": "Je devais remplacer les accès VPN des prestataires par des accès limités à leur intervention."
        },
        "role": {
          "key": "project:bastion-prestataires:/localized/fr/role",
          "value": "J’ai mené le projet seul, de l’étude au maintien."
        },
        "choice": {
          "key": "project:bastion-prestataires:/localized/fr/choice",
          "value": "J’ai retenu Apache Guacamole pour un accès par navigateur avec enregistrement des sessions."
        },
        "coverage": {
          "key": "project:bastion-prestataires:/localized/fr/coverage",
          "value": "100 % des accès prestataires passent par le bastion."
        },
        "limit": {
          "key": "project:bastion-prestataires:/localized/fr/limit",
          "value": "Je n’ai ni le support commercial ni les fonctions de découverte et de rotation de secrets des solutions payantes de gestion des accès à privilèges."
        }
      },
      "evidence": {
        "state": "missing"
      },
      "providerAccessCoveragePercent": 100
    },
    {
      "id": "projet-acces-distance",
      "entity": "project:acces-distance",
      "title": "Je reprends la main sur un accès hérité",
      "url": "/fr/#projet-acces-distance",
      "schemaType": "CreativeWork",
      "fields": {
        "problem": {
          "key": "project:acces-distance:/localized/fr/problem",
          "value": "Je devais remplacer un accès VNC non sécurisé, déployé historiquement par un ancien script."
        },
        "role": {
          "key": "project:acces-distance:/localized/fr/role",
          "value": "J’ai remplacé cet accès par une prise en main à distance centralisée."
        },
        "choice": {
          "key": "project:acces-distance:/localized/fr/choice",
          "value": "J’ai retenu MeshCentral avec des comptes nominatifs et une authentification multifacteur."
        },
        "scale": {
          "key": "project:acces-distance:/localized/fr/scale",
          "value": "J’ai migré environ 1 300 postes, avec un mois de coexistence et un déploiement par stratégie de groupe."
        },
        "limit": {
          "key": "project:acces-distance:/localized/fr/limit",
          "value": "Je dois aussi maintenir le composant installé sur les postes et vérifier son comportement quand il perd le contact avec la console."
        }
      },
      "evidence": {
        "state": "missing"
      },
      "scale": {
        "migratedWorkstations": {
          "value": 1300,
          "approximate": true
        },
        "coexistenceMonths": 1
      }
    }
  ],
  "articles": [
    {
      "id": "article:agent-personnel-deux-profils",
      "title": "J'ai coupé mon assistant en deux",
      "url": "/fr/articles/agent-personnel-deux-profils/",
      "measurements": {
        "profiles": {
          "value": 2,
          "unit": {
            "fr": "profils",
            "en": "profiles"
          },
          "scope": {
            "fr": "Profils de mon agent personnel, chacun sous un compte distinct.",
            "en": "Profiles of my personal agent, each under a separate account."
          }
        },
        "agentSetupFailures": {
          "value": 6,
          "unit": {
            "fr": "pannes",
            "en": "failures"
          },
          "scope": {
            "fr": "Pannes constatées après la séparation de mon agent personnel.",
            "en": "Failures found after splitting my personal agent."
          }
        },
        "silentFailures": {
          "value": 5,
          "unit": {
            "fr": "pannes silencieuses",
            "en": "silent failures"
          },
          "scope": {
            "fr": "Sous-ensemble des pannes constatées sans erreur visible dans l'usage courant de mon agent.",
            "en": "Subset of the failures found with no visible error in the everyday use of my agent."
          }
        },
        "serviceRestarts": {
          "value": 6000,
          "unit": {
            "fr": "redémarrages",
            "en": "restarts"
          },
          "scope": {
            "fr": "Boucle des unités ajoutées par erreur, pendant que le service fourni fonctionnait.",
            "en": "Loop of the units added by mistake, while the shipped service was working."
          }
        },
        "monitorDays": {
          "value": 2,
          "unit": {
            "fr": "jours",
            "en": "days"
          },
          "scope": {
            "fr": "Durée pendant laquelle la surveillance échouait à chaque passage.",
            "en": "How long the monitoring failed on every run."
          }
        },
        "auditInterval": {
          "value": 1,
          "unit": {
            "fr": "heure",
            "en": "hour"
          },
          "scope": {
            "fr": "Intervalle prévu entre les sauvegardes de configuration par le compte d'audit.",
            "en": "Planned interval between configuration backups by the audit account."
          }
        },
        "wakeups": {
          "value": 288,
          "unit": {
            "fr": "réveils par jour",
            "en": "wakeups per day"
          },
          "scope": {
            "fr": "Boucle de surveillance avant remplacement du sondage par un déclenchement au changement.",
            "en": "Monitoring loop before polling was replaced by a trigger on change."
          }
        },
        "pollMinutes": {
          "value": 5,
          "unit": {
            "fr": "minutes",
            "en": "minutes"
          },
          "scope": {
            "fr": "Intervalle du sondage du répertoire avant sa correction.",
            "en": "Directory polling interval before the fix."
          }
        },
        "backupBefore": {
          "value": 2,
          "unit": {
            "fr": "Go",
            "en": "GB"
          },
          "scope": {
            "fr": "Environnement d'exécution réinstallable inclus à tort dans la sauvegarde.",
            "en": "Reinstallable runtime wrongly included in the backup."
          }
        },
        "backupAfter": {
          "value": 85,
          "unit": {
            "fr": "Mo",
            "en": "MB"
          },
          "scope": {
            "fr": "Taille de la sauvegarde après exclusions, planifications comprises.",
            "en": "Size of the backup after exclusions, schedules included."
          }
        }
      }
    },
    {
      "id": "article:agent-que-les-sysadmins-accepteraient",
      "title": "Je veux savoir quand mon agent échoue",
      "url": "/fr/articles/agent-que-les-sysadmins-accepteraient/",
      "measurements": {
        "agentSetupFailures": {
          "value": 6,
          "unit": {
            "fr": "pannes",
            "en": "failures"
          },
          "scope": {
            "fr": "Pannes constatées après la séparation de mon agent personnel.",
            "en": "Failures found after splitting my personal agent."
          }
        },
        "silentFailures": {
          "value": 5,
          "unit": {
            "fr": "pannes silencieuses",
            "en": "silent failures"
          },
          "scope": {
            "fr": "Sous-ensemble des pannes constatées sans erreur visible dans l'usage courant de mon agent.",
            "en": "Subset of the failures found with no visible error in the everyday use of my agent."
          }
        },
        "monitorDays": {
          "value": 2,
          "unit": {
            "fr": "jours",
            "en": "days"
          },
          "scope": {
            "fr": "Durée pendant laquelle la surveillance échouait à chaque passage.",
            "en": "How long the monitoring failed on every run."
          }
        },
        "wakeups": {
          "value": 288,
          "unit": {
            "fr": "réveils par jour",
            "en": "wakeups per day"
          },
          "scope": {
            "fr": "Boucle de surveillance avant remplacement du sondage par un déclenchement au changement.",
            "en": "Monitoring loop before polling was replaced by a trigger on change."
          }
        }
      },
      "quantities": {
        "pdqRespondents": {
          "value": 1034,
          "unit": {
            "fr": "répondants"
          },
          "scope": {
            "fr": "Administrateurs systèmes et professionnels de l'informatique interrogés par PDQ pour son rapport publié le 3 mars 2026."
          }
        },
        "pdqExpectHelp": {
          "value": 94,
          "unit": {
            "fr": "%"
          },
          "scope": {
            "fr": "Part des répondants de PDQ qui estiment que l'IA aidera leur travail."
          }
        },
        "pdqWorryUnsupervised": {
          "value": 75,
          "unit": {
            "fr": "%"
          },
          "scope": {
            "fr": "Part des répondants de PDQ qui s'inquiètent d'un contrôle de l'IA sans supervision."
          }
        },
        "action1PatchPredicted": {
          "value": 67,
          "unit": {
            "fr": "%"
          },
          "scope": {
            "fr": "Part des administrateurs qui, en 2024, prévoyaient une gestion des correctifs entièrement automatisée pour 2026, selon l'enquête d'Action1 publiée le 30 juillet 2026."
          }
        },
        "action1PatchImplemented": {
          "value": 16,
          "unit": {
            "fr": "%"
          },
          "scope": {
            "fr": "Part des administrateurs qui déclarent en 2026 l'avoir mise en place, dans la même enquête d'Action1."
          }
        },
        "action1TroubleshootingUsed": {
          "value": 47,
          "unit": {
            "fr": "%"
          },
          "scope": {
            "fr": "Part des administrateurs qui utilisent l'IA pour le dépannage, selon Action1."
          }
        },
        "action1TroubleshootingPredicted": {
          "value": 52,
          "unit": {
            "fr": "%"
          },
          "scope": {
            "fr": "Part prévue en 2024 pour ce même usage, selon Action1."
          }
        }
      }
    },
    {
      "id": "article:auditer-ses-propres-mcp",
      "title": "J'ai noté mon propre serveur MCP",
      "url": "/fr/articles/auditer-ses-propres-mcp/",
      "measurements": {
        "exposureBefore": {
          "value": 9.2,
          "unit": {
            "fr": "sur 10",
            "en": "out of 10"
          },
          "scope": {
            "fr": "Note d'exposition de mon serveur MCP avant durcissement, relevée par l'outil d'analyse de systemd. Plus elle est basse, mieux c'est.",
            "en": "Exposure score of my MCP server before hardening, as reported by systemd's analysis tool. The lower, the better."
          }
        },
        "meterExposure": {
          "value": 8.1,
          "unit": {
            "fr": "sur 10",
            "en": "out of 10"
          },
          "scope": {
            "fr": "Note d'exposition d'un autre de mes services, écrit avec les bonnes pratiques habituelles, relevée au même moment.",
            "en": "Exposure score of another of my services, written with the usual good practice, recorded at the same time."
          }
        },
        "exposureFirstPass": {
          "value": 1.6,
          "unit": {
            "fr": "sur 10",
            "en": "out of 10"
          },
          "scope": {
            "fr": "Note de la première version durcie, qui lisait encore les clés de l'agent.",
            "en": "Score of the first hardened version, which could still read the agent's keys."
          }
        },
        "exposureAfter": {
          "value": 1.5,
          "unit": {
            "fr": "sur 10",
            "en": "out of 10"
          },
          "scope": {
            "fr": "Note de la version finale, où les clés et la mémoire de l'agent sont hors d'atteinte.",
            "en": "Score of the final version, where the agent's keys and memory are out of reach."
          }
        }
      }
    },
    {
      "id": "article:bastion-plutot-que-vpn",
      "title": "J'ai retiré le VPN des prestataires",
      "url": "/fr/articles/bastion-plutot-que-vpn/",
      "measurements": {
        "providerAccessCoveragePercent": {
          "value": 100,
          "unit": {
            "fr": "%"
          },
          "scope": {
            "fr": "Part des connexions d'un prestataire externe vers un service interne qui passent par le bastion."
          }
        }
      }
    },
    {
      "id": "article:controle-negatif",
      "title": "Une protection que je n'ai pas vue refuser n'existe pas",
      "url": "/fr/articles/controle-negatif/",
      "measurements": {
        "controls": {
          "value": 2,
          "unit": {
            "fr": "contrôles",
            "en": "controls"
          },
          "scope": {
            "fr": "Contrôles essayés sur mon site privé, chacun ayant révélé un défaut réel.",
            "en": "Controls tried on my private site, each of which revealed a real flaw."
          }
        },
        "windowWords": {
          "value": 6,
          "unit": {
            "fr": "mots consécutifs",
            "en": "consecutive words"
          },
          "scope": {
            "fr": "Taille des fenêtres glissantes utilisées dans ma recherche de fuites de texte.",
            "en": "Size of the sliding windows used in my search for text leaks."
          }
        }
      }
    },
    {
      "id": "article:memoire-choisie",
      "title": "Je choisis ce que mon agent retient",
      "url": "/fr/articles/memoire-choisie/",
      "measurements": {
        "triggers": {
          "value": 33,
          "unit": {
            "fr": "déclenchements"
          },
          "scope": {
            "fr": "Sessions lancées par la condition de répertoire non vide avant sa correction."
          }
        },
        "triggerMinutes": {
          "value": 27,
          "unit": {
            "fr": "minutes"
          },
          "scope": {
            "fr": "Fenêtre observée pendant la boucle de déclenchement du rangement."
          }
        },
        "memoryIngestionDefects": {
          "value": 3,
          "unit": {
            "fr": "défauts"
          },
          "scope": {
            "fr": "Boucle de déclenchement, droits non effectifs et concurrence entre traitements."
          }
        },
        "profiles": {
          "value": 2,
          "unit": {
            "fr": "profils",
            "en": "profiles"
          },
          "scope": {
            "fr": "Profils de mon agent personnel, chacun sous un compte distinct.",
            "en": "Profiles of my personal agent, each under a separate account."
          }
        }
      }
    },
    {
      "id": "article:mesurer-cout-agent",
      "title": "Je me trompais de coupable",
      "url": "/fr/articles/mesurer-cout-agent/",
      "measurements": {
        "beforeInput": {
          "value": 511963,
          "unit": {
            "fr": "tokens d’entrée brute"
          },
          "scope": {
            "fr": "Exécution avant corrections : entrée totale, lectures de cache comprises."
          }
        },
        "beforeOutput": {
          "value": 20655,
          "unit": {
            "fr": "tokens de sortie"
          },
          "scope": {
            "fr": "Exécution avant corrections : sortie annoncée par le fournisseur."
          }
        },
        "beforeCached": {
          "value": 469504,
          "unit": {
            "fr": "tokens lus en cache"
          },
          "scope": {
            "fr": "Part de l’entrée brute de l’exécution avant corrections."
          }
        },
        "beforeModelCalls": {
          "value": 13,
          "unit": {
            "fr": "appels au modèle"
          },
          "scope": {
            "fr": "Exécution avant corrections ; ne compte pas les sondes de capacité."
          }
        },
        "beforeModelSeconds": {
          "value": 97.2,
          "unit": {
            "fr": "secondes de temps modèle"
          },
          "scope": {
            "fr": "Temps modèle cumulé pour l’exécution avant corrections, distinct de la durée complète du brief."
          }
        },
        "afterInput": {
          "value": 383913,
          "unit": {
            "fr": "tokens d’entrée brute"
          },
          "scope": {
            "fr": "Une seule exécution après corrections, attribuée par tâche, lectures de cache comprises."
          }
        },
        "afterOutput": {
          "value": 12453,
          "unit": {
            "fr": "tokens de sortie"
          },
          "scope": {
            "fr": "Une seule exécution après corrections, attribuée par tâche."
          }
        },
        "afterCached": {
          "value": 348288,
          "unit": {
            "fr": "tokens lus en cache"
          },
          "scope": {
            "fr": "Part de l’entrée brute de l’exécution après corrections."
          }
        },
        "afterModelCalls": {
          "value": 12,
          "unit": {
            "fr": "appels au modèle"
          },
          "scope": {
            "fr": "Exécution après corrections ; ne compte pas les sondes de capacité."
          }
        },
        "afterProbes": {
          "value": 12,
          "unit": {
            "fr": "sondes de capacité"
          },
          "scope": {
            "fr": "Requêtes de l’exécution après corrections, sans token consommé."
          }
        },
        "wrongWindowInput": {
          "value": 392666,
          "unit": {
            "fr": "tokens d’entrée brute"
          },
          "scope": {
            "fr": "Ancienne attribution erronée : toute la fenêtre horaire, autre tâche et sondes comprises."
          }
        },
        "discoveryProbes": {
          "value": 517,
          "unit": {
            "fr": "sondes de découverte"
          },
          "scope": {
            "fr": "Sondes dans le relevé à la date de rédaction, pas dans la seule exécution du brief."
          }
        },
        "recordedRequests": {
          "value": 814,
          "unit": {
            "fr": "requêtes enregistrées"
          },
          "scope": {
            "fr": "Dénominateur du relevé des sondes à la date de rédaction."
          }
        },
        "beforeMessages": {
          "value": 17,
          "unit": {
            "fr": "messages"
          },
          "scope": {
            "fr": "Courrier traité avant corrections selon le brouillon, avec un arriéré de week-end."
          }
        },
        "afterMessages": {
          "value": 5,
          "unit": {
            "fr": "messages"
          },
          "scope": {
            "fr": "Courrier traité après corrections selon le brouillon."
          }
        },
        "observedWakeups": {
          "value": 370,
          "unit": {
            "fr": "déclenchements"
          },
          "scope": {
            "fr": "Décompte des réveils fourni dans le brouillon, distinct des compteurs API."
          }
        },
        "minimalPromptInput": {
          "value": 14950,
          "unit": {
            "fr": "tokens d’entrée"
          },
          "scope": {
            "fr": "Demande minimale avant retrait d’une famille d’outils, relevée dans le brouillon."
          }
        },
        "prunedPromptInput": {
          "value": 14950,
          "unit": {
            "fr": "tokens d’entrée"
          },
          "scope": {
            "fr": "Même demande après retrait d’une famille d’outils, relevée dans le brouillon."
          }
        },
        "neutralPromptInput": {
          "value": 14947,
          "unit": {
            "fr": "tokens d’entrée"
          },
          "scope": {
            "fr": "Demande depuis un dossier neutre sans règles de projet, relevée dans le brouillon."
          }
        },
        "repeatedCachePercent": {
          "value": 98,
          "unit": {
            "fr": "% de cache"
          },
          "scope": {
            "fr": "Relevé sur des appels répétés dans l’expérience distincte du brouillon."
          }
        },
        "editedCachePercent": {
          "value": 31,
          "unit": {
            "fr": "% de cache"
          },
          "scope": {
            "fr": "Relevé après modification de la configuration dans l’expérience distincte du brouillon."
          }
        },
        "inventoryTokens": {
          "value": 1000,
          "unit": {
            "fr": "tokens environ"
          },
          "scope": {
            "fr": "Inventaire produit par le script de collecte selon le brouillon."
          }
        },
        "duration18": {
          "value": 181.7,
          "unit": {
            "fr": "secondes"
          },
          "scope": {
            "fr": "Durée totale du brief matinal du premier jour décrit dans le brouillon ; pas temps modèle cumulé."
          }
        },
        "duration19": {
          "value": 182.5,
          "unit": {
            "fr": "secondes"
          },
          "scope": {
            "fr": "Durée totale du brief matinal du jour suivant dans le brouillon."
          }
        },
        "duration20": {
          "value": 181.7,
          "unit": {
            "fr": "secondes"
          },
          "scope": {
            "fr": "Durée totale du troisième brief matinal dans le brouillon."
          }
        },
        "duration21": {
          "value": 241.6,
          "unit": {
            "fr": "secondes"
          },
          "scope": {
            "fr": "Durée totale du brief matinal précédent les corrections dans le brouillon."
          }
        },
        "duration22": {
          "value": 120.8,
          "unit": {
            "fr": "secondes"
          },
          "scope": {
            "fr": "Durée totale du brief matinal après les corrections dans le brouillon."
          }
        },
        "afterModelSeconds": {
          "value": 62.1,
          "unit": {
            "fr": "secondes de temps modèle"
          },
          "scope": {
            "fr": "Temps modèle cumulé après corrections indiqué dans le brouillon, distinct de la durée totale du brief."
          }
        },
        "beforeCachePercent": {
          "value": 91.7,
          "unit": {
            "fr": "% de cache"
          },
          "scope": {
            "fr": "Part des tokens d’entrée brute déjà lus en cache avant corrections ; arrondi à une décimale."
          }
        },
        "afterCachePercent": {
          "value": 90.7,
          "unit": {
            "fr": "% de cache"
          },
          "scope": {
            "fr": "Part des tokens d’entrée brute déjà lus en cache après corrections ; arrondi à une décimale."
          }
        },
        "inputReductionPercent": {
          "value": 25,
          "unit": {
            "fr": "% de baisse observée"
          },
          "scope": {
            "fr": "Écart relatif d’entrée brute entre les exécutions ; ne mesure pas un effet causal des corrections."
          }
        },
        "outputReductionPercent": {
          "value": 39.7,
          "unit": {
            "fr": "% de baisse observée"
          },
          "scope": {
            "fr": "Écart relatif de sortie entre les exécutions ; heures et volumes de courrier différents."
          }
        },
        "discoveryPercent": {
          "value": 63.5,
          "unit": {
            "fr": "% de sondes"
          },
          "scope": {
            "fr": "Part des sondes dans les requêtes enregistrées à la date de rédaction ; arrondi à une décimale."
          }
        },
        "modelCallsRemoved": {
          "value": 1,
          "unit": {
            "fr": "appel au modèle en moins"
          },
          "scope": {
            "fr": "Différence du nombre d’appels au modèle entre les deux exécutions observées."
          }
        },
        "windowOvercountPercent": {
          "value": 2.2,
          "unit": {
            "fr": "% de surestimation du premier relevé"
          },
          "scope": {
            "fr": "Écart rapporté au premier relevé erroné de la fenêtre horaire, arrondi à une décimale."
          }
        },
        "afterRequests": {
          "value": 24,
          "unit": {
            "fr": "requêtes enregistrées"
          },
          "scope": {
            "fr": "Appels au modèle et sondes de capacité de l’exécution après corrections."
          }
        },
        "modelTimeReductionPercent": {
          "value": 36.1,
          "unit": {
            "fr": "% de baisse observée"
          },
          "scope": {
            "fr": "Écart relatif du temps modèle cumulé ; ne mesure pas un effet causal des corrections."
          }
        }
      },
      "quantities": {
        "pollingMinutes": {
          "value": 15,
          "unit": {
            "fr": "minutes"
          },
          "scope": {
            "fr": "Intervalle de la tâche de vérification décrit dans le brouillon."
          }
        },
        "observationDays": {
          "value": 4,
          "unit": {
            "fr": "jours"
          },
          "scope": {
            "fr": "Période du décompte des réveils fourni dans le brouillon, pas couverture du compteur API."
          }
        },
        "slowWakeups": {
          "value": 1,
          "unit": {
            "fr": "déclenchement"
          },
          "scope": {
            "fr": "Déclenchement au-delà du seuil de durée dans le décompte du brouillon."
          }
        },
        "slowWakeupSeconds": {
          "value": 5,
          "unit": {
            "fr": "secondes"
          },
          "scope": {
            "fr": "Seuil de durée utilisé pour décrire le décompte des réveils."
          }
        },
        "dailyWakeups": {
          "value": 96,
          "unit": {
            "fr": "réveils prévus par jour"
          },
          "scope": {
            "fr": "Fréquence théorique de la tâche décrite dans l’ouverture, pas nombre d’appels au modèle."
          }
        },
        "installedTools": {
          "value": 70,
          "unit": {
            "fr": "outils"
          },
          "scope": {
            "fr": "Catalogue de compétences décrit dans le brouillon."
          }
        },
        "toolFamilies": {
          "value": 12,
          "unit": {
            "fr": "familles"
          },
          "scope": {
            "fr": "Ordre de grandeur du catalogue décrit comme une douzaine de familles."
          }
        },
        "cachePriceFactor": {
          "value": 10,
          "unit": {
            "fr": "fois moins cher"
          },
          "scope": {
            "fr": "Rapport de tarification déclaré dans le brouillon pour les tokens déjà vus ; pas un montant de facture."
          }
        },
        "mailboxes": {
          "value": 4,
          "unit": {
            "fr": "boîtes mail"
          },
          "scope": {
            "fr": "Périmètre de collecte des messages décrit dans le brouillon."
          }
        },
        "collectionSteps": {
          "value": 15,
          "unit": {
            "fr": "allers-retours environ"
          },
          "scope": {
            "fr": "Ordre de grandeur de la collecte avant son remplacement par un script."
          }
        },
        "changes": {
          "value": 3,
          "unit": {
            "fr": "corrections"
          },
          "scope": {
            "fr": "Effort par tâche, collecte par script et fréquence de relecture du profil de voix."
          }
        },
        "potentialExtraTasks": {
          "value": 10,
          "unit": {
            "fr": "tâches supplémentaires hypothétiques"
          },
          "scope": {
            "fr": "Scénario illustratif de la conclusion, pas une charge observée."
          }
        },
        "potentialSteps": {
          "value": 15,
          "unit": {
            "fr": "étapes hypothétiques par tâche"
          },
          "scope": {
            "fr": "Scénario illustratif de la conclusion, pas une mesure du compteur."
          }
        },
        "potentialDeterministicSteps": {
          "value": 12,
          "unit": {
            "fr": "étapes hypothétiques sans décision"
          },
          "scope": {
            "fr": "Scénario illustratif de la conclusion, pas une mesure du compteur."
          }
        }
      },
      "events": {
        "beforeRun": {
          "date": "2026-09-21",
          "time": "14:56"
        },
        "afterRun": {
          "date": "2026-09-22",
          "time": "07:31"
        },
        "counterStart": {
          "date": "2026-09-21",
          "time": "14:34"
        },
        "morning18": {
          "date": "2026-09-18",
          "time": "07:30"
        },
        "morning19": {
          "date": "2026-09-19",
          "time": "07:30"
        },
        "morning20": {
          "date": "2026-09-20",
          "time": "07:30"
        },
        "morning21": {
          "date": "2026-09-21",
          "time": "07:30"
        },
        "morning22": {
          "date": "2026-09-22",
          "time": "07:30"
        }
      }
    },
    {
      "id": "article:serveur-mcp-garmin",
      "title": "Ma montre parle à Claude, sous conditions",
      "url": "/fr/articles/serveur-mcp-garmin/",
      "measurements": {
        "tools": {
          "value": 16,
          "unit": {
            "fr": "outils typés",
            "en": "typed tools"
          },
          "scope": {
            "fr": "Outils exposés par le serveur MCP, sans aucun accès SQL libre.",
            "en": "Tools exposed by the MCP server, with no free-form SQL access."
          }
        },
        "testsPassed": {
          "value": 214,
          "unit": {
            "fr": "tests réussis",
            "en": "passing tests"
          },
          "scope": {
            "fr": "Suite hermétique, sans données réelles ni réseau, relancée le 2 octobre 2026.",
            "en": "Hermetic suite, with no real data and no network, rerun on October 2, 2026."
          }
        },
        "corpusFiles": {
          "value": 42,
          "unit": {
            "fr": "enregistrements réels",
            "en": "real recordings"
          },
          "scope": {
            "fr": "Fichiers FIT réels utilisés pour valider le lecteur, hors de la suite hermétique.",
            "en": "Real FIT files used to validate the reader, outside the hermetic suite."
          }
        },
        "corpusDevices": {
          "value": 19,
          "unit": {
            "fr": "appareils",
            "en": "devices"
          },
          "scope": {
            "fr": "Appareils différents représentés dans le corpus de validation.",
            "en": "Different devices represented in the validation corpus."
          }
        },
        "corpusMakers": {
          "value": 8,
          "unit": {
            "fr": "fabricants",
            "en": "manufacturers"
          },
          "scope": {
            "fr": "Fabricants représentés dans le corpus de validation.",
            "en": "Manufacturers represented in the validation corpus."
          }
        },
        "corpusParsed": {
          "value": 30,
          "unit": {
            "fr": "fichiers lus",
            "en": "files read"
          },
          "scope": {
            "fr": "Fichiers du corpus lus comme des activités.",
            "en": "Corpus files read as activities."
          }
        },
        "corpusRejected": {
          "value": 12,
          "unit": {
            "fr": "rejets corrects",
            "en": "correct rejections"
          },
          "scope": {
            "fr": "Fichiers du corpus qui ne sont pas des activités ou sont tronqués, et que le lecteur refuse à raison.",
            "en": "Corpus files that are not activities or are truncated, and that the reader rightly refuses."
          }
        },
        "streamSamples": {
          "value": 1513,
          "unit": {
            "fr": "échantillons",
            "en": "samples"
          },
          "scope": {
            "fr": "Points de fréquence cardiaque d'une sortie réelle, utilisés pour mesurer l'effet du sous-échantillonnage.",
            "en": "Heart rate points from a real ride, used to measure the effect of downsampling."
          }
        },
        "overviewPoints": {
          "value": 10,
          "unit": {
            "fr": "points",
            "en": "points"
          },
          "scope": {
            "fr": "Résolution d'un aperçu grossier de la même sortie.",
            "en": "Resolution of a coarse overview of the same ride."
          }
        },
        "hrMaxRead": {
          "value": 160.2,
          "unit": {
            "fr": "battements par minute",
            "en": "beats per minute"
          },
          "scope": {
            "fr": "Fréquence cardiaque maximale lue dans l'aperçu à dix points, avant correction.",
            "en": "Maximum heart rate read from the ten-point overview, before the fix."
          }
        },
        "hrMaxTrue": {
          "value": 174,
          "unit": {
            "fr": "battements par minute",
            "en": "beats per minute"
          },
          "scope": {
            "fr": "Fréquence cardiaque maximale réelle de la même sortie.",
            "en": "Actual maximum heart rate of the same ride."
          }
        },
        "hrMinRead": {
          "value": 138,
          "unit": {
            "fr": "battements par minute",
            "en": "beats per minute"
          },
          "scope": {
            "fr": "Fréquence cardiaque minimale lue dans l'aperçu à dix points, avant correction.",
            "en": "Minimum heart rate read from the ten-point overview, before the fix."
          }
        },
        "hrMinTrue": {
          "value": 111,
          "unit": {
            "fr": "battements par minute",
            "en": "beats per minute"
          },
          "scope": {
            "fr": "Fréquence cardiaque minimale réelle de la même sortie.",
            "en": "Actual minimum heart rate of the same ride."
          }
        },
        "loadSessions": {
          "value": 6,
          "unit": {
            "fr": "séances",
            "en": "sessions"
          },
          "scope": {
            "fr": "Séances d'une semaine réelle additionnées par l'ancien résumé hebdomadaire.",
            "en": "Sessions of a real week added up by the old weekly summary."
          }
        },
        "loadSports": {
          "value": 4,
          "unit": {
            "fr": "sports",
            "en": "sports"
          },
          "scope": {
            "fr": "Sports représentés dans cette semaine.",
            "en": "Sports represented in that week."
          }
        },
        "loadValue": {
          "value": 17,
          "unit": {
            "fr": "points de charge",
            "en": "load points"
          },
          "scope": {
            "fr": "Somme sans signification produite par l'ancien résumé, affichée comme une charge d'entraînement.",
            "en": "Meaningless sum produced by the old summary, displayed as a training load."
          }
        },
        "titledActivities": {
          "value": 66,
          "unit": {
            "fr": "activités",
            "en": "activities"
          },
          "scope": {
            "fr": "Activités Garmin présentes dans ma base au moment où j'ai remarqué la perte des titres.",
            "en": "Garmin activities in my database when I noticed the titles were lost."
          }
        },
        "survivingTitles": {
          "value": 1,
          "unit": {
            "fr": "titre",
            "en": "title"
          },
          "scope": {
            "fr": "Titre encore présent après la relecture complète des fichiers.",
            "en": "Title still present after the full reread of the files."
          }
        },
        "recoveredTitles": {
          "value": 91,
          "unit": {
            "fr": "titres",
            "en": "titles"
          },
          "scope": {
            "fr": "Titres récupérés après correction, en élargissant la liste lue chez Garmin.",
            "en": "Titles recovered after the fix, by widening the list read from Garmin."
          }
        },
        "missedActivities": {
          "value": 25,
          "unit": {
            "fr": "activités",
            "en": "activities"
          },
          "scope": {
            "fr": "Activités plus anciennes jamais importées, découvertes pendant la même correction.",
            "en": "Older activities never imported, discovered during the same fix."
          }
        },
        "exposureBefore": {
          "value": 9.2,
          "unit": {
            "fr": "sur 10",
            "en": "out of 10"
          },
          "scope": {
            "fr": "Note d'exposition de mon serveur MCP avant durcissement, relevée par l'outil d'analyse de systemd. Plus elle est basse, mieux c'est.",
            "en": "Exposure score of my MCP server before hardening, as reported by systemd's analysis tool. The lower, the better."
          }
        }
      }
    },
    {
      "id": "article:vnc-herite-meshcentral",
      "title": "L'accès que personne n'avait décidé",
      "url": "/fr/articles/vnc-herite-meshcentral/",
      "measurements": {
        "migratedWorkstations": {
          "value": 1300,
          "unit": {
            "fr": "postes"
          },
          "scope": {
            "fr": "Postes passés à la prise en main centralisée, valeur approchée."
          }
        },
        "coexistenceMonths": {
          "value": 1,
          "unit": {
            "fr": "mois"
          },
          "scope": {
            "fr": "Période pendant laquelle l'ancien accès et le nouveau ont coexisté."
          }
        }
      }
    },
    {
      "id": "article:zon-le-code-netait-pas-le-probleme",
      "title": "Le code n'était pas le problème de ZON",
      "url": "/fr/articles/zon-le-code-netait-pas-le-probleme/",
      "measurements": {
        "firstVersionCommits": {
          "value": 185,
          "unit": {
            "fr": "commits"
          },
          "scope": {
            "fr": "Commits que j'ai écrits sur la première version de l'application, de février à décembre 2025."
          }
        },
        "firstVersionTotal": {
          "value": 540,
          "unit": {
            "fr": "commits"
          },
          "scope": {
            "fr": "Commits de la première version, toutes contributions confondues, sur la même période."
          }
        }
      }
    }
  ],
  "facts": {
    "person:noa-matout:/fullName": "Noa Matout",
    "person:noa-matout:/localized/fr/jobTitle": "Ingénieur systèmes, réseaux et sécurité",
    "person:noa-matout:/city": "Reims",
    "person:noa-matout:/declaredAge": "23",
    "person:noa-matout:/declaredAgeOn": "21 septembre 2026",
    "person:noa-matout:/estate/virtualMachines/0/count": "150",
    "person:noa-matout:/estate/virtualMachines/1/count": "30",
    "person:noa-matout:/estate/virtualMachines/0/operatingSystem": "Linux",
    "person:noa-matout:/estate/virtualMachines/1/operatingSystem": "Windows",
    "person:noa-matout:/earlierCareer/fr": "Avant 2021, j’ai effectué un service civique en médiation numérique et trois ans d’apprentissage en viticulture. Je me suis reconverti vers l’informatique en 2021.",
    "person:noa-matout:/availability/status": "Je suis disponible",
    "person:noa-matout:/availability/engagements/0": "un poste",
    "person:noa-matout:/availability/engagements/1": "une mission",
    "person:noa-matout:/estate/virtualization": "VMware vSphere",
    "person:noa-matout:/estate/linuxAutomation": "Ansible",
    "person:noa-matout:/estate/windowsDeclarativeAutomation": "Je n’utilise pas de gestion déclarative côté Windows.",
    "person:noa-matout:/education/0/localized/fr/title": "Mastère Sécurité informatique",
    "person:noa-matout:/education/0/localized/fr/certification": "Titre RNCP de niveau 7 : Expert en ingénierie informatique",
    "person:noa-matout:/education/0/institution": "ESGI",
    "person:noa-matout:/education/0/status": "En attente de validation",
    "person:noa-matout:/education/0/startYear": "2024",
    "person:noa-matout:/education/0/endYear": "2026",
    "person:noa-matout:/education/1/localized/fr/title": "Bachelor Sécurité informatique",
    "person:noa-matout:/education/1/localized/fr/certification": "Titre RNCP de niveau 6 : Chef de projet systèmes, réseaux et sécurité",
    "person:noa-matout:/education/1/institution": "ESGI",
    "person:noa-matout:/education/1/startYear": "2023",
    "person:noa-matout:/education/1/endYear": "2024",
    "person:noa-matout:/education/2/localized/fr/title": "Formation systèmes et réseaux",
    "person:noa-matout:/education/2/institution": "CESI",
    "person:noa-matout:/education/2/startYear": "2021",
    "person:noa-matout:/education/2/endYear": "2023",
    "person:noa-matout:/education/3/localized/fr/title": "Baccalauréat professionnel Conduite et gestion d’une exploitation viti-vinicole",
    "person:noa-matout:/education/3/institution": "CFA d’Avize",
    "person:noa-matout:/education/3/startYear": "2017",
    "person:noa-matout:/education/3/endYear": "2020",
    "person:noa-matout:/experience/0/localized/fr/title": "Ingénieur systèmes, réseaux et sécurité, en freelance",
    "person:noa-matout:/experience/0/organization": "Supplay",
    "person:noa-matout:/experience/0/start": "octobre 2026",
    "person:noa-matout:/experience/1/localized/fr/title": "Ingénieur réseau et systèmes",
    "person:noa-matout:/experience/1/organization": "Supplay",
    "person:noa-matout:/experience/1/start": "octobre 2024",
    "person:noa-matout:/experience/1/end": "octobre 2026",
    "person:noa-matout:/experience/2/localized/fr/title": "Cofondateur",
    "person:noa-matout:/experience/2/organization": "ZON",
    "person:noa-matout:/experience/2/start": "janvier 2026",
    "person:noa-matout:/experience/3/localized/fr/title": "Administrateur réseau et systèmes",
    "person:noa-matout:/experience/3/organization": "Supplay",
    "person:noa-matout:/experience/3/start": "octobre 2023",
    "person:noa-matout:/experience/3/end": "octobre 2024",
    "person:noa-matout:/experience/4/localized/fr/title": "Gestionnaire maintenance et support informatique",
    "person:noa-matout:/experience/4/organization": "Supplay",
    "person:noa-matout:/experience/4/start": "septembre 2021",
    "person:noa-matout:/experience/4/end": "septembre 2023",
    "person:noa-matout:/credentials/0/score": "800",
    "person:noa-matout:/credentials/0/takenAt": "10 janvier 2026",
    "project:bastion-prestataires:/localized/fr/problem": "Je devais remplacer les accès VPN des prestataires par des accès limités à leur intervention.",
    "project:bastion-prestataires:/localized/fr/role": "J’ai mené le projet seul, de l’étude au maintien.",
    "project:bastion-prestataires:/localized/fr/choice": "J’ai retenu Apache Guacamole pour un accès par navigateur avec enregistrement des sessions.",
    "project:bastion-prestataires:/localized/fr/coverage": "100 % des accès prestataires passent par le bastion.",
    "project:bastion-prestataires:/localized/fr/limit": "Je n’ai ni le support commercial ni les fonctions de découverte et de rotation de secrets des solutions payantes de gestion des accès à privilèges.",
    "project:acces-distance:/localized/fr/problem": "Je devais remplacer un accès VNC non sécurisé, déployé historiquement par un ancien script.",
    "project:acces-distance:/localized/fr/role": "J’ai remplacé cet accès par une prise en main à distance centralisée.",
    "project:acces-distance:/localized/fr/choice": "J’ai retenu MeshCentral avec des comptes nominatifs et une authentification multifacteur.",
    "project:acces-distance:/localized/fr/scale": "J’ai migré environ 1 300 postes, avec un mois de coexistence et un déploiement par stratégie de groupe.",
    "project:acces-distance:/localized/fr/limit": "Je dois aussi maintenir le composant installé sur les postes et vérifier son comportement quand il perd le contact avec la console.",
    "graph:sentinelle:/flows/serveur": "5 486 961",
    "graph:sentinelle:/flows/base": "185 232",
    "graph:sentinelle:/flows/regles": "1 111",
    "graph:sentinelle:/flows/bruit": "5",
    "graph:sentinelle:/remaining": "5",
    "graph:sentinelle:/caption": "La détection décide, l’IA explique.",
    "graph:mcp-reach:/caption": "Même sonde, même machine. Seul le confinement change.",
    "graph:mcp-reach:/runs/open/internet": "atteint",
    "graph:mcp-reach:/runs/open/keys": "lues",
    "graph:mcp-reach:/runs/open/write": "réussie",
    "graph:mcp-reach:/runs/confined/internet": "injoignable",
    "graph:mcp-reach:/runs/confined/keys": "inexistantes pour ce processus",
    "graph:mcp-reach:/runs/confined/write": "refusée",
    "article:agent-personnel-deux-profils:/measurements/profiles/value": "2",
    "article:agent-personnel-deux-profils:/measurements/agentSetupFailures/value": "6",
    "article:agent-personnel-deux-profils:/measurements/silentFailures/value": "5",
    "article:agent-personnel-deux-profils:/measurements/serviceRestarts/value": "6 000",
    "article:agent-personnel-deux-profils:/measurements/monitorDays/value": "2",
    "article:agent-personnel-deux-profils:/measurements/auditInterval/value": "1",
    "article:agent-personnel-deux-profils:/measurements/wakeups/value": "288",
    "article:agent-personnel-deux-profils:/measurements/pollMinutes/value": "5",
    "article:agent-personnel-deux-profils:/measurements/backupBefore/value": "2",
    "article:agent-personnel-deux-profils:/measurements/backupAfter/value": "85",
    "article:agent-que-les-sysadmins-accepteraient:/measurements/agentSetupFailures/value": "6",
    "article:agent-que-les-sysadmins-accepteraient:/measurements/silentFailures/value": "5",
    "article:agent-que-les-sysadmins-accepteraient:/measurements/monitorDays/value": "2",
    "article:agent-que-les-sysadmins-accepteraient:/measurements/wakeups/value": "288",
    "article:auditer-ses-propres-mcp:/measurements/exposureBefore/value": "9,2",
    "article:auditer-ses-propres-mcp:/measurements/meterExposure/value": "8,1",
    "article:auditer-ses-propres-mcp:/measurements/exposureFirstPass/value": "1,6",
    "article:auditer-ses-propres-mcp:/measurements/exposureAfter/value": "1,5",
    "article:bastion-plutot-que-vpn:/measurements/providerAccessCoveragePercent/value": "100",
    "article:controle-negatif:/measurements/controls/value": "2",
    "article:controle-negatif:/measurements/windowWords/value": "6",
    "article:memoire-choisie:/measurements/triggers/value": "33",
    "article:memoire-choisie:/measurements/triggerMinutes/value": "27",
    "article:memoire-choisie:/measurements/memoryIngestionDefects/value": "3",
    "article:memoire-choisie:/measurements/profiles/value": "2",
    "article:mesurer-cout-agent:/measurements/beforeInput/value": "511 963",
    "article:mesurer-cout-agent:/measurements/beforeOutput/value": "20 655",
    "article:mesurer-cout-agent:/measurements/beforeCached/value": "469 504",
    "article:mesurer-cout-agent:/measurements/beforeModelCalls/value": "13",
    "article:mesurer-cout-agent:/measurements/beforeModelSeconds/value": "97,2",
    "article:mesurer-cout-agent:/measurements/afterInput/value": "383 913",
    "article:mesurer-cout-agent:/measurements/afterOutput/value": "12 453",
    "article:mesurer-cout-agent:/measurements/afterCached/value": "348 288",
    "article:mesurer-cout-agent:/measurements/afterModelCalls/value": "12",
    "article:mesurer-cout-agent:/measurements/afterProbes/value": "12",
    "article:mesurer-cout-agent:/measurements/wrongWindowInput/value": "392 666",
    "article:mesurer-cout-agent:/measurements/discoveryProbes/value": "517",
    "article:mesurer-cout-agent:/measurements/recordedRequests/value": "814",
    "article:mesurer-cout-agent:/measurements/beforeMessages/value": "17",
    "article:mesurer-cout-agent:/measurements/afterMessages/value": "5",
    "article:mesurer-cout-agent:/measurements/observedWakeups/value": "370",
    "article:mesurer-cout-agent:/measurements/minimalPromptInput/value": "14 950",
    "article:mesurer-cout-agent:/measurements/prunedPromptInput/value": "14 950",
    "article:mesurer-cout-agent:/measurements/neutralPromptInput/value": "14 947",
    "article:mesurer-cout-agent:/measurements/repeatedCachePercent/value": "98",
    "article:mesurer-cout-agent:/measurements/editedCachePercent/value": "31",
    "article:mesurer-cout-agent:/measurements/inventoryTokens/value": "1 000",
    "article:mesurer-cout-agent:/measurements/duration18/value": "181,7",
    "article:mesurer-cout-agent:/measurements/duration19/value": "182,5",
    "article:mesurer-cout-agent:/measurements/duration20/value": "181,7",
    "article:mesurer-cout-agent:/measurements/duration21/value": "241,6",
    "article:mesurer-cout-agent:/measurements/duration22/value": "120,8",
    "article:mesurer-cout-agent:/measurements/afterModelSeconds/value": "62,1",
    "article:mesurer-cout-agent:/measurements/beforeCachePercent/value": "91,7",
    "article:mesurer-cout-agent:/measurements/afterCachePercent/value": "90,7",
    "article:mesurer-cout-agent:/measurements/inputReductionPercent/value": "25",
    "article:mesurer-cout-agent:/measurements/outputReductionPercent/value": "39,7",
    "article:mesurer-cout-agent:/measurements/discoveryPercent/value": "63,5",
    "article:mesurer-cout-agent:/measurements/modelCallsRemoved/value": "1",
    "article:mesurer-cout-agent:/measurements/windowOvercountPercent/value": "2,2",
    "article:mesurer-cout-agent:/measurements/afterRequests/value": "24",
    "article:mesurer-cout-agent:/measurements/modelTimeReductionPercent/value": "36,1",
    "article:mesurer-cout-agent:/events/beforeRun": "21 septembre 2026 à 14 h 56",
    "article:mesurer-cout-agent:/events/afterRun": "22 septembre 2026 à 7 h 31",
    "article:mesurer-cout-agent:/events/counterStart": "21 septembre 2026 à 14 h 34",
    "article:mesurer-cout-agent:/events/morning18": "18 septembre 2026 à 7 h 30",
    "article:mesurer-cout-agent:/events/morning19": "19 septembre 2026 à 7 h 30",
    "article:mesurer-cout-agent:/events/morning20": "20 septembre 2026 à 7 h 30",
    "article:mesurer-cout-agent:/events/morning21": "21 septembre 2026 à 7 h 30",
    "article:mesurer-cout-agent:/events/morning22": "22 septembre 2026 à 7 h 30",
    "article:serveur-mcp-garmin:/measurements/tools/value": "16",
    "article:serveur-mcp-garmin:/measurements/testsPassed/value": "214",
    "article:serveur-mcp-garmin:/measurements/corpusFiles/value": "42",
    "article:serveur-mcp-garmin:/measurements/corpusDevices/value": "19",
    "article:serveur-mcp-garmin:/measurements/corpusMakers/value": "8",
    "article:serveur-mcp-garmin:/measurements/corpusParsed/value": "30",
    "article:serveur-mcp-garmin:/measurements/corpusRejected/value": "12",
    "article:serveur-mcp-garmin:/measurements/streamSamples/value": "1 513",
    "article:serveur-mcp-garmin:/measurements/overviewPoints/value": "10",
    "article:serveur-mcp-garmin:/measurements/hrMaxRead/value": "160,2",
    "article:serveur-mcp-garmin:/measurements/hrMaxTrue/value": "174",
    "article:serveur-mcp-garmin:/measurements/hrMinRead/value": "138",
    "article:serveur-mcp-garmin:/measurements/hrMinTrue/value": "111",
    "article:serveur-mcp-garmin:/measurements/loadSessions/value": "6",
    "article:serveur-mcp-garmin:/measurements/loadSports/value": "4",
    "article:serveur-mcp-garmin:/measurements/loadValue/value": "17",
    "article:serveur-mcp-garmin:/measurements/titledActivities/value": "66",
    "article:serveur-mcp-garmin:/measurements/survivingTitles/value": "1",
    "article:serveur-mcp-garmin:/measurements/recoveredTitles/value": "91",
    "article:serveur-mcp-garmin:/measurements/missedActivities/value": "25",
    "article:serveur-mcp-garmin:/measurements/exposureBefore/value": "9,2",
    "article:vnc-herite-meshcentral:/measurements/migratedWorkstations/value": "1 300",
    "article:vnc-herite-meshcentral:/measurements/coexistenceMonths/value": "1",
    "article:zon-le-code-netait-pas-le-probleme:/measurements/firstVersionCommits/value": "185",
    "article:zon-le-code-netait-pas-le-probleme:/measurements/firstVersionTotal/value": "540"
  }
}
