labfy-investigation/docs/architecture/EXISTING_INVESTIGATION_LIBRARY.md

77 lines
4.5 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.

# Enquêtes existantes dans la bibliothèque locale — CURRENT local
Ce parcours a été validé uniquement avec deux enquêtes `SPECIMEN` temporaires.
Il ne donne ni accès à un sélecteur de chemin arbitraire, ni autorisation de
traiter une enquête réelle pendant le développement.
## Parcours humain
Le démarrage `--lazy-library` ne lit pas la bibliothèque. Depuis le poste Web,
« Charger les enquêtes » lit le registre, puis « Rechercher les dossiers
existants » déclenche une discovery distincte. Celle-ci examine uniquement les
enfants directs de `LABFY_LIBRARY`, sans descendre dans les sous-dossiers.
L'utilisateur enregistre un candidat, l'ouvre, puis peut choisir « Fermer
l’enquête » avant d'en ouvrir une autre. « Accueil » ne ferme pas l'enquête.
Une seule enquête est active par instance.
Les routes `POST /api/v1/library/discover-existing`,
`POST /api/v1/library/register-existing` et `POST /api/v1/library/close`
appliquent les contrôles de session, Host, Origin, CSRF, type et taille de corps
du serveur Web. Le navigateur ne transmet qu'un `candidate_id` opaque, une
génération et une clé d'idempotence ; il ne peut fournir un chemin serveur.
La réponse de discovery expose un nom d'affichage, un titre, un identifiant
d'enquête éventuel, un état et une raison bornée, jamais un chemin absolu.
## Registre et validation
`labfy.web_library.registry.v2` conserve des entrées `MANAGED` sous
`workspaces/<uuid>` et des entrées `EXISTING` référencées par un nom d'enfant
direct. La référence reste privée et relative à la bibliothèque. Le lecteur
accepte aussi `registry.v1` ; la conversion en v2 n'a lieu qu'à la première
mutation humaine explicite. L'écriture utilise un temporaire privé, `fsync`,
remplacement atomique et `fsync` du répertoire. Des identifiants, références ou
clés d'idempotence dupliqués sont refusés. Une entrée enregistrée devenue
absente ou invalide apparaît `MISSING` ou `INVALID` sans bloquer les autres.
La discovery est en lecture seule. Elle ignore les fichiers, dossiers cachés,
éléments internes et sous-dossiers imbriqués ; elle borne sa réponse à 256
candidats. Elle refuse les liens symboliques du dossier, des parents de
métadonnées, de la base, du JobStore et du manifeste. Le bridge C
`validate-workspace-json` vérifie en lecture seule le schéma runtime courant,
l'identité, le titre et le JobStore de la même enquête. Il ne publie aucun
snapshot et ne migre aucune base.
Les états des candidats sont `READY_TO_REGISTER`, `ALREADY_REGISTERED`,
`NEEDS_METADATA_MIGRATION`, `UNSUPPORTED_LEGACY_LAYOUT` et `INVALID`.
Un dossier prêt est inscrit par une mise à jour du registre uniquement : ni
copie, ni déplacement, ni renommage, ni modification de fichiers métier.
Lorsqu'une base et un JobStore sont déjà compatibles mais que seul
`workspace.json` manque, une action humaine séparée peut créer ce manifeste
après prévisualisation. La base reste inchangée. Un manifeste présent mais
invalide n'est jamais écrasé. Aucune migration SQLite n'est effectuée.
L'inscription revalide le candidat et sa signature au moment de la mutation.
Si le dossier a changé, l'utilisateur doit relancer la discovery. Une même
intention et une même clé se rejouent sans second enregistrement ; une clé liée
à une autre intention est refusée. L'ouverture revalide le registre, le
mapping de stockage, le manifeste et les données via le bridge C avant de
publier l'identité active. Un échec d'export ne laisse pas de demi-ouverture.
## Fermeture et contexte Qwen
La fermeture annule les turns Agent non terminaux du workspace et attend de
façon bornée les appels déjà en cours avant d'effacer l'identité active. Elle
terminalise la mission active. Les propositions et demandes historiques gardent
leur provenance, mais ne deviennent pas actives dans l'enquête suivante.
L'interface abandonne ses requêtes en cours et réinitialise graphe, sélection,
panneaux Agent, mission, propositions, toolbox et code change.
Sans enquête active, le démarrage d'un turn est refusé et l'interface affiche
« Ouvrez une enquête pour utiliser Qwen. ». Après A → fermeture → B,
`InvestigationContext` est reconstruit depuis B. Les références objet et les
continuations de A ne sont pas acceptées sous B. Qwen utilise les capabilities
existantes ; aucun accès direct au filesystem ou à SQLite ne lui est ajouté.
Un sélecteur de chemin extérieur à `LABFY_LIBRARY`, la discovery récursive,
une migration automatique de base et plusieurs contextes actifs simultanés
restent hors de ce contrat.