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

95 lines
4.8 KiB
Markdown

# Planner local et assistance contrôlée — lot J8 local
> État : `COMPLETE_LOCAL` pour l'espace synthétique J8. `Enquete.sqlite` reste V20 ;
> la V21 financière est indépendante. Aucun réseau ni J9.
## Parcours
```sh
workspace=$(mktemp -d /tmp/labfy-j8-specimen-XXXXXX)
chmod 700 "$workspace"
make -j8 tools/local-jobs
make web-workspace-j8 WORKSPACE="$workspace"
```
La commande crée seulement un corpus `SPECIMEN` si l'espace n'existe pas. Elle
ne remet jamais à zéro un espace existant. Le panneau **Prochaines actions**
affiche les recommandations issues du cœur C, leur priorité, raison, capability,
versions, empreinte, coût et contact réseau `NONE`. Un GET ne lance rien.
Après sélection, le navigateur transmet uniquement les identifiants de
recommandations, la révision, le profil et une clé d'idempotence. C revalide la
projection, les preuves, empreintes, capabilities et budgets, puis admet plan et
jobs en une transaction. Le worker existant exécute l'ensemble fini. Les
snapshots graphe, rapprochements et planner sont recalculés après publication ;
aucune recommandation nouvelle ne s'exécute sans nouvelle approbation.
## Contrats et identités
- `labfy.local_planner.snapshot.v1` est un cache recalculable ;
- `labfy.local_plan.v1` est l'intention durable ;
- `labfy.local_planner.rules.v1` classe `HIGH`, `MEDIUM`, `LOW` sans score
d'identité ;
- la clé d'analyse couvre enquête, preuve, hash/taille, capability, adapter et
versions ;
- même clé et même intention retrouvent plan et jobs ; une autre intention est
un conflit ; résultat compatible ou job actif rend la recommandation
indisponible. Les dérivés ne sont jamais candidats.
## JobStore V3 et budgets
V2 a ajouté `plans` et `plan_jobs`. V3 ajoute aux tentatives l'enveloppe de
temps réservée, la durée mesurée et l'acquittement comptable, ainsi que
l'unicité d'une analyse active. Une ouverture en écriture migre V1 ou V2 sous
`BEGIN IMMEDIATE`; un lecteur read-only ne migre rien. Jobs, tentatives,
transitions, contrôles et plans existants sont conservés.
`LOCAL_PRUDENT` borne 8 analyses, 16 tentatives réservées, 256 Mio de sources et
240 s actives. `SPECIMEN_SMALL` borne 2 analyses, 3 tentatives, 8 Mio et 30 s.
La réservation analyses/tentatives/octets est atomique. Avant chaque départ,
claim, propriétaire, tentative et enveloppe temporelle sont débités dans la
même transaction. L'horloge monotone mesure l'exécution ; seule la part
inutilisée prouvée est rendue. Après crash, l'enveloppe reste consommée. La
minuterie annule réellement EML ou ExifTool au solde autorisé. Une
réconciliation sans relance ne débite rien.
L'export C fournit `PENDING`, `ACTIVE`, `PAUSED`, `COMPLETED_SUCCESS`,
`PROCESSED_WITH_FAILURES`, `STOPPED`, `LIMIT_REACHED` ou
`RECOVERY_REQUIRED`, avec plafonds, réservations, consommations, soldes et
compteurs de jobs. Le Web affiche ces valeurs en unités réelles, sans pourcentage.
## Cohérence et limites
La projection métier utilise un snapshot SQLite. La base métier et le JobStore
ne partagent pas de transaction : la révision est donc revalidée avant admission,
puis hash/taille/capability avant création. Les limites atteintes ou résultats
incomplets ne prouvent aucune absence d'information.
Ce lot n'apporte ni autonomie, ni OSINT réseau, ni LLM, ni analyse d'enquête
réelle. Le serveur Python reste une passerelle loopback bornée ; il ne lit aucune
base et ne décide aucune recommandation.
## Validation de clôture locale
La clôture couvre le chemin C réel de migration JobStore V1/V2 vers V3, avec
rollback injecté après mutation de schéma, réouverture idempotente, lecture
seule sans migration, version future et fichier absent. Les trois interruptions
de processus sont distinguées : après admission avant claim, après
claim/débit avant publication, et après publication avant acquittement. Les
rejeux conservent identités, réservations et résultats sans double extraction.
Le service C de corrélation exerce les frontières observations, groupes,
connexions et octets JSON sur des observations `SPECIMEN` persistées. Les
projections incomplètes sont signalées, les connexions ne pendent pas et un
refus de taille ne remplace pas le dernier export valide. La révision couvre
les règles, les données et les limites effectives.
La commande canonique `npm run test:browser` inclut J8. Firefox couvre le refus
pré-admission atomique, la limite pendant l'exécution, pause/reprise,
annulation en attente, annulation RUNNING après barrière, stop/reprise, et le
redémarrage sur le même workspace sans recharge de budget ni republication.
Les hooks de faute et l'outil lent n'existent que dans `tools/local-jobs-test` ;
le bridge opérationnel et les routes HTTP ne les exposent pas.
`J8_LOCAL_PLANNER_ASSISTED = COMPLETE_LOCAL` ne signifie ni J9, ni publication,
ni validation sur une enquête réelle.