labfy-investigation/docs/architecture/EVIDENCE_TIMELINE_REPORT.md
fy59 d65f9559e6 chore(checkpoint): preserve local investigation workbench
Preserve the local graph-first investigation stack through macro V1.

Include reviewed source, tests, contracts, documentation and synthetic assets.

Retain the standalone financial V21 test foundation without runtime migration.

Runtime remains V20; operational JobStore remains V3.

Local experimental checkpoint, not a stable release.
2026-09-27 08:34:46 +02:00

4.5 KiB
Raw Blame History

Preuves, chronologie et rapports locaux — J9

Statut : CURRENT — COMPLETE_LOCAL. Ce lot complète le poste Web local sans modifier le schéma publié : Enquete.sqlite reste V20, le JobStore reste V3 et la tranche financière V21 demeure indépendante.

Projections

Le graphe cœur reste la vérité commune. Les vues Preuves, Chronologie et Infrastructure locale filtrent cette projection ; elles ne créent ni base ni identité parallèle. La chronologie transporte les valeurs persistées de collecte, d’import, d’observation, d’intégration et d’exécution. Une valeur sans précision ou fuseau suffisant est montrée comme telle et n’est jamais complétée par inférence. Les rapprochements d’infrastructure restent exploratoires.

Sélection et prévisualisation

Depuis le détail d’un objet, « Ajouter au rapport » constitue une sélection explicite. Le service C local_report_service_build() vérifie l’appartenance à l’enquête, ferme la provenance dans une transaction SQLite en lecture et applique des limites d’objets, de dépendances, d’événements et d’octets. Le profil V1 est MINIMAL : aucun original, chemin absolu, secret, base SQLite, EML complet ou sortie complète d’outil n’est inclus. Le commentaire est explicitement humain.

La révision SHA-256 couvre règles, enquête, sélection et rôles, profil, sections, limites et valeurs rendues. La génération recalcule cette même coupe ; elle refuse donc un aperçu devenu périmé au lieu de mélanger deux états.

Dossier hors ligne

Une génération publie atomiquement sous exports/reports/<report_id>/ :

  • report.html, autonome, sans script ni ressource distante ;
  • report.json, document canonique ;
  • report.pdf, rendu local borné ;
  • manifest.json, tailles, SHA-256, sélection, profil et exclusions ;
  • NOTICE.txt, mode de vérification et portée des empreintes.

Le staging privé se trouve sous .labfy/reports/staging. Une interruption avant publication ne rend aucun dossier partiel ; une réponse perdue après publication est récupérée par l’intention idempotente. Une intention réutilisée avec un autre document est refusée. Le vérificateur rejette absence, fichier supplémentaire, lien symbolique, chemin dangereux, dépassement, contrat inconnu, taille ou hash discordant :

python3 prototypes/web-graph/report_bundle.py verify /chemin/du/dossier

Le serveur ne sert que les cinq noms autorisés, après vérification complète du dossier. Authentification locale, Host/Origin et CSRF restent obligatoires pour les mutations. Un GET ne déclenche jamais une analyse ou une génération.

Exécution SPECIMEN

make web-workspace-j9 WORKSPACE=/tmp/labfy-j9-specimen

Cette commande crée une fixture synthétique uniquement si le workspace ne contient pas déjà Enquete.sqlite. Elle ne doit jamais viser une enquête réelle. Le PDF utilise Cairo/Pango et la police locale DejaVu Sans, déjà fournis avec le runtime graphique. Le répertoire Unicode validé couvre notamment le français, œ, €, les ponctuations typographiques et Ł. Pango mesure et replie les lignes ; un contenu qui ne peut pas être paginé dans la limite de 40 pages est refusé sans substitution. pdftotext et pdftoppm servent à valider le texte et toutes les pages rendues.

Renforcement d’intégrité

La fermeture justificative suit les arêtes de provenance de la cible vers sa source : elle n’exporte plus les observations sœurs. Désactiver Preuves réduit les objets aux références minimales annoncées ; désactiver Chronologie ou Infrastructure produit respectivement une collection temporelle ou réseau vide. Le profil MINIMAL refuse tout dépassement d’événements plutôt que de tronquer.

Le vérificateur considère le dossier comme non fiable : racine ou composant symbolique, fichier non régulier, entrée supplémentaire, structure JSON mal typée, clé JSON ou chemin de manifeste dupliqué, hash mal formé et incohérence entre manifeste et document sont des échecs contrôlés. Il garantit l’intégrité interne, pas l’authenticité face à une réécriture cohérente non signée.

L’intention versionnée est écrite atomiquement avant le rendu. Un verrou par intention fait converger les demandes identiques ; un document différent est refusé, y compris quand une tâche mémoire est déjà GENERATING ou READY. Après publication complète mais avant reçu, un nouveau processus vérifie le dossier et réconcilie le même identifiant sans second rendu.