labfy-investigation/docs/architecture/LOCAL_WORKSPACE_IMPORT.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

69 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Espace local et import navigateur — CURRENT
## Contrat
`make web-workspace-local WORKSPACE=/chemin/explicite` fixe l’unique destination
de l’instance. Le navigateur ne transmet jamais de chemin serveur. Après la
session locale, un espace absent présente **Créer l’enquête** ; seul ce POST
appelle `tools/local-jobs create-workspace`. Il crée une base V20 à la racine,
un JobStore V3 vide et `.labfy/runtime/workspace.json`. Aucun corpus, preuve,
observation, plan ou job n’est préinséré. Les espaces SPECIMEN J5–J9 conservent
leur manifeste et leurs commandes historiques.
Une disposition est non ambiguë lorsqu’elle contient soit `Enquete.sqlite` et
le manifeste générique à la racine, soit le manifeste SPECIMEN historique.
L’absence de base dans un espace manifesté, une version non supportée ou un
manifeste incohérent est une erreur d’ouverture ; il n’y a pas de recréation ni
de conversion d’une ancienne enquête GTK.
## Réception, préparation et publication
Le contrôle `input type=file` envoie les octets par `PUT application/octet-stream`
vers un `upload_id` opaque. Session, Host, Origin et CSRF sont contrôlés. Les
JSON restent plafonnés à 4 Kio. Les limites d’import sont 4 Mio par fichier,
8 fichiers et 16 Mio par sélection, 64 Mio de staging, deux réceptions et
30 secondes. Chaque sélection possède une identité opaque : le serveur réserve
atomiquement son nombre de fichiers, ses octets de lot, les octets de staging
et une place de réception avant de lire le corps. Le client sérialise une
sélection multiple ; le serveur relit la longueur effective par blocs avec une
échéance interruptible et refuse transfert tronqué, signature/type
incohérents, nom avec séparateur/contrôle et formats autres que EML/PNG/JPEG.
Le staging privé `.labfy/uploads` n’est pas servi. Les octets sont inchangés et
leur SHA-256 est calculé puis revérifié par le cœur. `EvidenceImporter` accepte
facultativement l’UUID réservé et le nom original de l’intention ; son contrat
historique reste inchangé quand ces champs valent `NULL`. La date de collecte
absente reste `NULL`. Un contenu identique dans deux intentions produit deux
preuves ; le rejeu d’une même clé retrouve le même UUID. Une clé liée à une
autre intention est refusée.
Les états persistés sont `RECEIVING`, `TRANSFERRING`, `PREPARED`, `CONFIRMING`,
`IMPORTED`, `CANCELLED` et `FAILED`. Réception, confirmation et annulation d’un
même upload sont sérialisées ; un état terminal ne peut pas être rouvert par un
nouveau PUT. Les reçus JSON privés `.labfy/imports` décrivent l’opération et
référencent la preuve V20 sans devenir une seconde vérité métier. L’intention
canonique structurée et le reçu `CONFIRMING` sont durables avant le premier
effet. Un verrou de publication sérialise ensuite les confirmations. L’ordre
est : réception temporaire, contrôle/format, renommage en `payload`, UUID
réservé, intention, copie immuable, transaction SQLite, reçu `IMPORTED`, puis
nouveaux snapshots. Un arrêt avant confirmation laisse une
préparation annulable ; après commit, la preuve est retrouvée par UUID et le
reçu peut être réconcilié. Chaque rejeu compare l’intention, le record V20 et
l’original effectivement publié (identités, métadonnées, taille et SHA-256).
Un reçu tronqué, un record incohérent ou un original manquant/altéré donne une
erreur de récupération, jamais une nouvelle preuve ni une réparation silencieuse.
## Raccordement et limites
Après chaque publication, le cœur relit les DAO et tente de republier graphe,
corrélations et planner. Cette projection est réessayable : son indisponibilité
ne transforme pas une preuve déjà commitée et vérifiée en import en attente.
Aucune analyse ne démarre à l’import : l’utilisateur approuve les
recommandations et budgets J8. Les rapports J9 utilisent ensuite les objets
persistés et leurs dérivés. Le mode affiché provient du manifeste : `SPECIMEN`
ou `local expérimental`, sans prétendre classifier les données.
Ce lot expérimental ne prend pas en charge ZIP, répertoire récursif, SQLite
téléversée, anciennes dispositions GTK, accès distant, TLS ni multi-utilisateur.
Il ne constitue pas une certification de production ni une autorisation de
traiter des enquêtes réelles.