labfy-investigation/docs/architecture/OPERATIONAL_AGENT.md

74 lines
4 KiB
Markdown

# Agent opérationnel local — fondations V1
**État : CURRENT local, validé exclusivement sur `SPECIMEN`.** Cette
tranche étend le runtime Qwen local existant avec un overview borné, une mission
humaine bornée, des propositions candidates et des fondations d'outils. Elle ne
publie ni une autonomie générale, ni une mémoire agent persistante, ni une
autorisation implicite.
## Contexte et corrélations
Après l'ouverture explicite d'un workspace valide, le runtime reçoit uniquement
un contexte `labfy.investigation_context.v1` : identité opaque, titre, révision,
compteurs, types, sélection et activité récente bornée. Il ne reçoit ni SQLite,
ni chemins, ni corpus de preuves. Les références sont réévaluées dans le
workspace actif.
Le [parcours d'enquête existante](EXISTING_INVESTIGATION_LIBRARY.md) ferme
explicitement A avant l'ouverture de B. Les turns non terminaux de A sont
annulés avant le changement, et un nouveau turn reçoit un
`InvestigationContext` reconstruit depuis B seulement. Sans workspace actif,
le backend refuse de démarrer Qwen ; les continuations, références et demandes
de tooling de A ne sont pas admises dans B.
Les corrélations sont des candidats déterministes d'égalité normalisée (email,
domaine, téléphone, username, URL, IP, IBAN/BIC, hash, identifiant structuré,
provenance ou observation). Elles gardent les sources et `confidence_kind`; elles
ne créent ni relation, ni identité confirmée, ni écriture automatique.
## Mission et propositions
Une mission requiert un démarrage humain explicite, des références de scope et
pivots appartenant à l'espace actif, et des plafonds conservateurs. V1 admet
seulement `LOCAL_READ_ONLY` et `PASSIVE_PUBLIC`; `PUBLIC_ACTIVE`,
`AUTHORIZED_INTRUSIVE` et `PROHIBITED` sont refusés. Chaque tentative repasse
par Policy, scope et budget.
Une proposition est `CANDIDATE`, avec motifs et références. Une décision
`APPROVED` garde explicitement `policy_grant_created: false`: ce n'est ni un
fait ni un grant ni l'exécution d'une capability.
## Modèle local
`LocalModelSupervisor` est opt-in. Il lit une configuration XDG JSON explicite
non versionnée, démarre seulement son propre `llama-server` sur
`127.0.0.1:<port éphémère>`, et ne signale prêt qu'après `GET /health = 200`.
Il ne recherche, ne tue ni ne réutilise un processus tiers. L'arrêt gracieux,
puis ciblé après délai, ne concerne que son PID/groupe de processus possédé.
Le chemin de modèle reste hors du dépôt. Sans configuration, binaire ou
healthcheck valides, l'agent est indisponible sans bascule cloud ou fake.
Le service local utilise `--agent-mode local-model --agent-autostart
--agent-timeout 90`. Le superviseur démarre son propre serveur modèle sur un
port loopback éphémère ; le navigateur appelle seulement Labfy. Le champ
« Objectif utilisateur » existant lance le turn Qwen et ses appels d'outils
passent par `AgentRuntime` et les capabilities. L'interface distingue Qwen prêt,
occupé et indisponible. Le choix manuel d'outil reste dans « Mode expert/debug ».
## Limites actuelles
La fondation Sandbox/Tool Registry et l'egress privacy sont décrites dans leurs
documents dédiés. Le smoke réel
`prototypes/web-graph/tests/manual_operational_agent_smoke.py` a
atteint `COMPLETED` avec 8 appels d'outils Qwen dans trois turns liés par la
même mission et les références renvoyées par la recherche : overview,
search, corrélation, registre, documentation, sandbox offline, proposition
candidate et `web.fetch`. Le contact `PASSIVE_PUBLIC` passe par l'egress
rootless `PRIVACY_TOR` vérifié ; un contact est comptabilisé dans la mission,
sans repli direct. La proposition ne crée aucun grant. Les sondes actives
restent soumises à la Policy et n'ont pas été exercées live ; l'intrusif est
`LAB-ONLY TARGET`. Le [provisionnement contrôlé](TOOL_PROVISIONING.md) et la
[self integration](QWEN_SELF_INTEGRATION.md) sont `CURRENT local` sur
`SPECIMEN` avec portes humaines distinctes. Resource Governor et Persistent
Agent Memory restent `TARGET`.