{
  "schema": "socing-public-proof",
  "schemaVersion": 1,
  "appVersion": "0.37.2",
  "serviceWorker": "socing-sw-v101-welcome-wordmark",
  "generatedAt": "2026-08-14T17:49:18Z",
  "environment": {
    "host": "Lenovo Windows local",
    "browser": "Chromium Playwright isolé fourni avec le runtime de test",
    "server": "boucle locale 127.0.0.1",
    "matrixLog": "runtime/matrix-v0.37.2-contribution-mailto-final-20260814.log",
    "matrixSha256": "6fc6549adcccfc923ca38ef98496984d85e09f5e57a34dc02144ffbee9bea067",
    "targetedReplayLog": "runtime/replay-v0.37.2-welcome-wordmark-boot-20260814.log",
    "targetedAccessibilityReplayLog": "runtime/replay-v0.37.2-welcome-wordmark-a11y-20260814.log",
    "presentationReplayLog": "runtime/replay-v0.37.2-presentation-20260814.log",
    "matrixSummary": "Base v0.37.2 : matrice complète 11/11 verte. Patch visuel du vrai mot-signe SOCING prouvé par rejeu ciblé boot 19/19 et accessibilité 16/16. Aucun déploiement."
  },
  "application": {
    "status": "LOCAL_PATCH_TARGETED_PROVED",
    "appliesToVersion": "0.37.2",
    "passed": 300,
    "total": 300,
    "candidateReplay": {
      "version": "0.37.2",
      "unit": { "passed": 124, "total": 124 },
      "presentation": { "passed": 20, "total": 20 },
      "browser": { "passed": 176, "total": 176 },
      "fullMatrix": "PASS"
    },
    "suites": {
      "coffreFormat": { "passed": 22, "total": 22 },
      "domaineAdapters": { "passed": 96, "total": 96 },
      "tutorielLocales": { "passed": 6, "total": 6 },
      "bootServiceWorkerRoutesNetwork": { "passed": 19, "total": 19 },
      "tutorielNavigateur": { "passed": 22, "total": 22 },
      "fluxProduit": { "passed": 85, "total": 85 },
      "vault": { "passed": 13, "total": 13 },
      "circleDemo": { "passed": 8, "total": 8 },
      "security": { "passed": 13, "total": 13 },
      "accessibility": { "passed": 16, "total": 16 }
    }
  },
  "featureEvidence": {
    "localTutorialLanguages": {
      "status": "PASS",
      "coverage": "app/tests/unit/tutoriel.test.mjs, app/tests/browser/tutorial.cjs, BOOT-01.choix-bienvenue et A11Y-01.verrouillage",
      "languages": ["fr-CH", "fr-simple", "en", "pt", "de", "it"],
      "officialLanguageRelay": "lien volontaire vers les vidéos État de Vaud en 14 langues ; aucune requête avant clic",
      "storage": "choix de langue et checklist en mémoire vive uniquement ; aucun stockage ni appel de traduction",
      "properties": [
        "le choix bilingue de la langue apparaît avant les trois chemins personne, proche et professionnel, dans le premier écran utile et sans stockage",
        "six écrans et six locales embarquées, portugais/allemand/italien signalés beta jusqu’à relecture humaine",
        "parcours portugais complet jusqu’au sas privé localisé",
        "rendu 320 px avec texte 200 %, cibles tactiles et aucun débordement horizontal",
        "dialogue top-layer fermé avant voile, arrière-plan, verrouillage ou masquage",
        "langue en mémoire remise à fr-CH au masquage afin de ne laisser aucun indice sur appareil partagé",
        "bouton global Masquer localisé pendant le parcours temporaire",
        "champs personnels exclus de la traduction et du correcteur orthographique",
        "zéro requête externe, WebSocket ou écriture Web Storage pendant le parcours"
      ]
    },
    "backupVerificationLocal": {
      "status": "PASS",
      "coverage": "EXPORT-09.test-copie-sans-restauration dans app/tests/browser/flux.cjs",
      "storage": "fichier choisi et déchiffré localement ; seule la date du test est gardée chiffrée dans meta",
      "properties": [
        "voir un téléchargement ne suffit plus à déclarer la copie récente",
        "un mauvais secret ne change ni le carnet ni l’état de vérification",
        "le fichier est authentifié et validé intégralement sans restauration",
        "aucun titre, contenu, nom de fichier, empreinte ou compteur n’est gardé dans le marqueur",
        "les six collections métier restent bit-à-bit identiques pendant le test",
        "le rappel disparaît seulement après une relecture réussie",
        "le formulaire et son résumé disparaissent au démontage ou au masquage"
      ]
    },
    "bureauConseillerMultiRelais": {
      "status": "PASS",
      "coverage": "RELAIS-02.destinataire-volatil dans app/tests/browser/flux.cjs",
      "maxFiles": 24,
      "maxTotalBytes": 1048576,
      "storage": "mémoire vive uniquement",
      "properties": [
        "doublons canoniques écartés",
        "conflits d'identifiant exclus",
        "cartes sans lignes sensibles avant sélection",
        "un brouillon distinct par passage reste uniquement en mémoire vive",
        "un fichier refusé conserve les brouillons et aperçus déjà préparés",
        "l’aperçu relu et les téléchargements répétés utilisent exactement les mêmes octets",
        "les boutons de reprise sont distingués par type et date sans révéler de contenu",
        "zéro requête externe et zéro stockage",
        "purge complète au masquage, en arrière-plan, à la fermeture ou lors d’un nouveau lot valide"
      ]
    },
    "csrOfficialFinder": {
      "status": "PASS",
      "coverage": "ROUTES-01 dans app/tests/browser/boot-sw-routes.cjs et NET-01",
      "storage": "aucun stockage, aucune géolocalisation, aucune requête automatique",
      "properties": [
        "quatrième geste visible en tête d’Aide",
        "lien unique vers la recherche officielle des CSR de l’État de Vaud",
        "ouverture seulement après le clic explicite de la personne",
        "nouvel onglet avec noopener et noreferrer",
        "commune, NPA et position ne sont ni demandés ni reçus par SOCING",
        "96 requêtes du scénario restent same-origin avant le clic"
      ]
    },
    "relayReturnHumanMessage": {
      "status": "PASS",
      "coverage": "RELAIS-03/07 dans app/tests/browser/flux.cjs et contrat v3 dans app/tests/unit/adapters.test.mjs",
      "requestVersion": 2,
      "returnVersion": 3,
      "storage": "fichier local volontaire puis reçu chiffré après acceptation explicite",
      "properties": [
        "retours historiques v1/v2 encore lisibles",
        "mot facultatif limité à 300 caractères",
        "rendu comme texte sans interprétation HTML",
        "le mot reste dans la note métier et n’est recopié dans aucun reçu technique",
        "les reçus chiffrés ne contiennent aucun texte libre de la réponse",
        "attestation de l’empreinte recalculée depuis la cible locale pendant l’acceptation exclusive",
        "aucun chat, accusé de lecture, présence ou notification automatique",
        "schéma strict et champs inconnus refusés"
      ]
    },
    "projectRelayVoluntary": {
      "status": "PASS",
      "coverage": "RELAIS-09.projet-volontaire-note-only dans app/tests/browser/flux.cjs",
      "targetType": "project",
      "storage": "fichier local volontaire, puis note chiffrée après acceptation explicite",
      "properties": [
        "aucune case cochée par défaut",
        "cinq champs indépendants et titres strictement dérivés",
        "champs de 500 caractères découpés sans perte",
        "projet jamais réécrit par un retour non authentifié",
        "un seul retour accepté par fichier relayId",
        "empreinte périmée refusée sans écriture"
      ]
    },
    "rightsPreparationRelayVoluntary": {
      "status": "PASS",
      "coverage": "RELAIS-11.droits-volontaire-note-only dans app/tests/browser/flux.cjs, SEC-07 dans app/tests/security/security.cjs et A11Y-10 dans app/tests/a11y/a11y.cjs",
      "targetType": "rights-prep",
      "storage": "fichier local volontaire, puis note chiffrée et rappel futur facultatif après acceptation explicite",
      "properties": [
        "aucune case cochée par défaut",
        "cinq champs indépendants aux titres canoniques",
        "seuls les noms des papiers choisis sont transmis, jamais leurs octets",
        "la préparation Droits / recours originale reste inchangée",
        "le retour ajoute uniquement une note et, si demandé, un rappel futur",
        "un seul retour est accepté par relayId grâce à un reçu de demande sans texte libre",
        "le reçu atteste l’empreinte recalculée depuis la préparation locale",
        "cible modifiée, supprimée, décalée ou retour dupliqué refusés sans écriture",
        "zéro requête externe et rendu mobile 320 px prouvés"
      ]
    },
    "localProjectIdeaBank": {
      "status": "PASS",
      "coverage": "PROJET-05.banque-idees-locale dans app/tests/browser/flux.cjs",
      "catalogue": "app/content/help/idees-projets.json",
      "storage": "catalogue public précaché ; recherche et filtre en mémoire vive uniquement",
      "properties": [
        "douze pistes réparties dans cinq catégories",
        "schéma strict et rejet fermé d’un catalogue altéré",
        "préremplissage de l’idée seule dans un brouillon non fictif",
        "aucun brouillon ni projet en cours écrasé",
        "zéro requête hors origine et zéro persistance des filtres",
        "rendu sans débordement à 320 px"
      ]
    },
    "monthlyBudgetLocal": {
      "status": "PASS",
      "coverage": "MOIS-01/MOIS-02 et RELAIS-10 dans app/tests/browser/flux.cjs",
      "targetType": "monthly-budget",
      "storage": "snapshot mensuel agrégé dans le coffre local chiffré ; aucun compte, relevé, document ou total persisté",
      "properties": [
        "montants CHF entiers en centimes et totaux dérivés en mémoire",
        "écriture concurrente compare la version chiffrée avant remplacement",
        "impression seulement après un geste explicite et une relecture fraîche",
        "relais v2 sans aucune case cochée par défaut",
        "retour v3 ajoute une note durable sans modifier montant, total ou rappel",
        "suppression atomique du budget, de ses notes liées et des reçus textuels",
        "marqueur opaque réduit à id/type/version, sans montant, message, date ni cible",
        "la note déterministe monthly-budget-relay:<relayId> bloque un autre returnId pour le même relais",
        "idempotence de l'ancien retour conservée après copie et restauration"
      ]
    },
    "journalLocalEdit": {
      "status": "PASS",
      "coverage": "JOURNAL-01 dans app/tests/browser/flux.cjs et A11Y-01.journal dans app/tests/a11y/a11y.cjs",
      "storage": "même objet JOURNAL chiffré, sans copie ni changement d'identité",
      "properties": [
        "id et createdAt conservés, aucun doublon",
        "préremplissage local des quatre champs et du moment",
        "version opaque relue puis comparée dans la transaction CAS",
        "écriture ou suppression concurrente refusée sans remplacement",
        "saisie locale conservée en cas de conflit",
        "annulation avec retour du focus et rendu sans débordement à 320 px",
        "rendez-vous et rappel liés volontairement inchangés"
      ]
    },
    "letterLocalEdit": {
      "status": "PASS",
      "coverage": "COURRIER-04 dans app/tests/browser/flux.cjs et A11Y-01.decoder-edition dans app/tests/a11y/a11y.cjs",
      "storage": "même objet LETTER chiffré, sans copie ni changement d'identité",
      "properties": [
        "id et createdAt conservés, updatedAt avance, aucun doublon",
        "type, forme et statut de fiction conservés",
        "version opaque relue par getVersioned puis comparée dans la transaction CAS",
        "modification ou suppression concurrente refusée sans remplacement",
        "saisie locale conservée en cas de conflit",
        "annulation avec retour du focus, exemples refermés et rendu sans débordement à 320 px",
        "rendez-vous, préparations et notes liés non mutés grâce au même identifiant"
      ]
    },
    "professionalDirectEntry": {
      "status": "PASS",
      "coverage": "BOOT-01.choix-bienvenue dans app/tests/browser/boot-sw-routes.cjs et A11Y-05 dans app/tests/a11y/a11y.cjs",
      "storage": "simple navigation locale vers relais.html ; aucun profil, rôle, compte ou contenu n'est persisté",
      "properties": [
        "la carte Je travaille dans le social ouvre directement le bureau RELAIS volatile",
        "l'exploration du carnet fictif reste une action séparée",
        "aucune qualité professionnelle n'est reconnue et aucun privilège n'est accordé",
        "le lien cible exactement relais.html sans paramètre ni donnée dans l'URL",
        "les deux actions restent tactiles et lisibles sur mobile",
        "après le choix de langue prioritaire, le chemin de la personne porte le bouton primaire ; le bureau professionnel reste une action secondaire"
      ]
    },
    "extensionChrome": {
      "status": "PREVIOUS_VERSION_PROOF",
      "appliesToVersion": "0.37.1",
      "passed": 9,
      "total": 9,
      "applicationFiles": 95,
      "totalFiles": 99,
      "package": "runtime/extension-v0.37.1-simple-sealed-local",
      "proof": "runtime/extension-proof-v0.37.1-simple/extension-proof.json",
      "captureGuide": "runtime/extension-proof-v0.37.1-simple/ext-guide-installation-320x844.png",
      "captureBureau": "runtime/extension-proof-v0.37.1-simple/ext-bureau-conseiller-390x844.png",
      "workerContract": "app/sw.js est embarqué comme source PWA ; background.js est le worker MV3 actif de l’extension",
      "launchContract": "aucun onglet automatique ; le harnais observe le worker MV3 puis ouvre une page de preuve, tandis que le geste icône vers panneau reste manuel",
      "profileContract": "le profil Chromium jetable de preuve reste hors du paquet"
    }
  },
  "presentation": { "passed": 20, "total": 20 },
  "additionalBrowserEvidence": {
    "braveChromium": {
      "version": "151.1.93.132",
      "bootServiceWorkerRoutesNetwork": { "passed": 19, "total": 19 },
      "vault": { "passed": 13, "total": 13 },
      "bfcacheDesktop": {
        "passed": 7,
        "total": 7,
        "proof": "runtime/bfcache-desktop-proof.json",
        "note": "Cycle BFCache réel sur Brave 151 (BFCache réactivé dans le harnais, Playwright le désactive par défaut) : voile posé au gel, grâce de 5 min au retour, et gel réel de 320 s suivi du verrouillage automatique (écran verrouillé, marqueur absent, deverrouille=false)."
      }
    },
    "firefox": {
      "version": "149.0.2",
      "status": "APP_PROOF",
      "pilotage": "WebDriver BiDi natif sur Firefox stock, zéro dépendance (app/tests/browser/firefox-proof.cjs)",
      "firefoxBidi": { "passed": 5, "total": 5 },
      "proof": "runtime/firefox-bidi-proof.json",
      "screenshots": [
        "runtime/ffx-accueil-390x844.png",
        "runtime/ffx-hors-ligne-serveur-coupe.png",
        "runtime/ffx-coffre-deverrouille.png"
      ]
    },
    "webkit": {
      "version": "WebKit 26.5 (playwright webkit v2336, Windows)",
      "status": "ENGINE_PROOF",
      "cadre": "moteur WebKit seul, pas Safari produit — Safari et iPhone physique restent ouverts",
      "pilotage": "Playwright webkit natif, profil jetable (app/tests/browser/webkit-proof.cjs)",
      "webkit": { "passed": 6, "total": 6 },
      "proof": "runtime/webkit-proof.json",
      "screenshots": [
        "runtime/wk-accueil-390x844.png",
        "runtime/wk-hors-ligne-serveur-coupe.png",
        "runtime/wk-coffre-deverrouille.png"
      ]
    },
    "androidPhysique": {
      "appareil": "Samsung Galaxy S21 Ultra (SM-G998B), Android 16",
      "navigateur": "Cromite 148.0.7778.168 (Chromium degooglisé)",
      "status": "APP_PROOF",
      "pilotage": "CDP via adb reverse/forward sur téléphone physique USB, serveur local (app/tests/browser/android-proof.cjs)",
      "androidCdp": { "passed": 5, "total": 5 },
      "cacheActif": "socing-sw-v75-bfcache-verrouillage-shell (88/88 SHELL_PATHS)",
      "bfcachePosture": {
        "passed": 3,
        "total": 3,
        "proof": "runtime/bfcache-android-proof.json",
        "note": "Cromite désactive le BFCache côté navigateur : le retour arrière recharge la page puis verrouille le coffre (posture documentée, repli de sécurité prouvé, marqueur absent du DOM). Le cycle réel de restauration BFCache est prouvé sur Brave desktop."
      },
      "proof": "runtime/android-cdp-proof.json",
      "screenshots": [
        "runtime/and-accueil-s21ultra.png",
        "runtime/and-hors-ligne-serveur-coupe.png",
        "runtime/and-coffre-deverrouille.png"
      ]
    }
  },
  "publicationStaging": {
    "status": "SIGNED_LOCAL_CANDIDATE",
    "appliesToVersion": "0.37.2",
    "builder": "publication/Build-SocingPublication.ps1",
    "output": "runtime/publication-v0.37.2-signed-release-20260815-02",
    "publicFiles": 122,
    "noteLot": "Candidate v0.37.2 construite par allowlist, signee Ed25519 et verifiee fichier par fichier. La cle est sauvegardee hors Lenovo et son empreinte est ancree sur un canal GitHub independant ; le deploiement socing.ch reste a verifier avant de le revendiquer.",
    "sourceMatrixLog": "runtime/matrix-v0.37.2-contribution-mailto-final-20260814.log",
    "targetedReplayLog": null,
    "candidateReplayLog": "retour/PAT_SIGNED_RELEASE_MOVE_20260815.md",
    "forbiddenArtifacts": 0,
    "reproducibleManifest": "publication-manifest.json",
    "releaseSignature": {
      "algorithm": "Ed25519",
      "file": "publication-signature.json",
      "publicKey": "SOCING_RELEASE_PUBLIC_KEY.pem",
      "publicKeyFingerprint": "SHA256:441ad45b40c855697b2ce489f833a395caeba6a3d3ee81bf9ab2cf25549a5a62",
      "verifier": "publication/Verify-SocingPublication.mjs",
      "privateKeyPublished": false,
      "tamperTest": "PASS_REJECTED",
      "independentTrustAnchor": "https://gist.github.com/Cristallo-Swiss/0d7f515871e8cfe01c7c33107db5886b",
      "vpsMirror": "https://api.ing.katoying.ai/.well-known/socing-release-anchor-v1.txt",
      "offMachineBackup": "PASS_RSA4096_OAEP_SHA256_RESTORE_FINGERPRINT_MATCH"
    },
    "testsFromStaging": {
      "status": "SIGNATURE_INVENTORY_AND_PRESENTATION_PASS",
      "note": "Signature et inventaire exact verifies ; une copie modifiee d'un octet est refusee ; la presentation publique repasse 20/20. La matrice applicative 300/300 reste la preuve source pre-scellage."
    }
  },
  "sealedArtifacts": {
    "appliesToVersion": "0.37.2",
    "publication": "runtime/publication-v0.37.2-signed-release-20260815-02",
    "extension": "runtime/extension-v0.37.2-legal-final-20260815",
    "extensionProof": null,
    "archive": null,
    "pdf": [
      {
        "path": "presentation/SOCING-presentation-centre-social-vivant-v5-20260814.pdf",
        "bytes": 103292,
        "sha256": "4d7c24b9d76a54d8b353f69ab44ba662e145d3c03363d7980dec3774456e4f57"
      },
      {
        "path": "presentation/SOCING-affiche-A4-QR-vivant-v5-20260814.pdf",
        "bytes": 82664,
        "sha256": "6e90f66f5bed443111c1c6ddc968eb1c848ce124b663c34c9cc49e00ff4e5148"
      }
    ]
  },
  "limits": [
    "PWA_SECURITY_REVIEW_REQUIRED",
    "La candidate v0.37.2 est signee et verifiee localement. Empreinte ancree hors de socing.ch sur le Gist public Cristallo-Swiss ; miroir HTTPS VPS actif ; sauvegarde chiffree hors Lenovo restauree a blanc avec empreinte identique. Le deploiement et les en-tetes finaux restent a verifier avant revendication publique.",
    "Revue Ken du 12 août 2026 : intégrité du lot audité confirmée ; traduction privée, discrétion hors application, compatibilité KDF, secrets prévisibles, métadonnées et ICS corrigés dans la source candidate. La traduction sur un vrai Android en langue différente reste à observer.",
    "Re-audit final Ken / Claude Opus 5 du 11 août 2026 : code v0.36.0 GO conditionnel, B1-B3/I1-I5/O1 vérifiés corrigés ; conditions de preuve levées localement par matrice isolée complète, lot allowlist et replays staging. Ce n'est pas un audit tiers professionnel. La candidate v0.36.1 a ensuite été rejouée localement avec sa refonte IDEAING mobile.",
    "Revue interne de sécurité 2026-08-07 : PASS AVEC RÉSERVES, aucune faille critique/haute (retour/SECURITY_AUDIT_20260807.md)",
    "Seconde revue interne assistée par IA 2026-08-07 : PASS AVEC RÉSERVES, aucune faille critique/haute (retour/SECURITY_REVIEW_INDEPENDENTE_20260807.md). Ce document n'est pas un audit tiers professionnel ; finding moyen F1 corrigé en v0.33.9, F2 désormais corrigé par une identité d'installation neutre, F3 corrigé par SEC-08.",
    "Essai physique Android rejoué sur v0.33.10 (5/5 + posture BFCache 3/3, S21 Ultra, cache v75 actif) ; essai physique iOS encore nécessaire",
    "File Handling mesuré sur Android physique (S21 Ultra, Cromite 148) : surface launchQueue présente, repli sélecteur manuel prouvé 4/4 (filehandling-android-proof.json) ; chaîne système « Ouvrir avec » structurellement impossible sur navigateur dégooglé sans WebAPK — intent OS irrésoluble (filehandling-install-android-proof.json) ; association système sur Android avec Google Play services non mesurable ici",
    "Moteur WebKit 26.5 prouvé (6/6 : boot, rendu mobile, SW v75, hors-ligne réel, coffre chiffré, zéro fuite) ; Safari produit et iOS physique restent ouverts",
    "Règles Apache de non-publication des artefacts à valider sur l’hébergement final"
  ]
}
