docs: refresh architecture and roadmap

This commit is contained in:
fy59 2026-08-27 18:02:38 +02:00
parent 6f2db41010
commit 31827a043d
3 changed files with 203 additions and 127 deletions

View file

@ -20,16 +20,16 @@ persistante, enrichissable et versionnable.
## État actuel
### Briques implémentées (IMPLEMENTED)
### Briques validées
- **Project** : cycle de vie persistant, identité stable et Project Database ouverte
- **Import** : premier task kind de production, exécuté par la file générique en lots bornés et reprenables
- **ScanSet / Image Catalog v1** : acquisitions, images logiques, provenance et assets SHA-256 persistants et paginés
- **Capture / Asset Provenance v1** : Captures par ScanSet, associations source/dérivé
et sélection explicite d'une image logique — IMPLEMENTED / VALIDATION PENDING
et sélection explicite d'une image logique — PASS / FROZEN
- **Découverte et planification de campagne bornées** : racines explicites,
plan metadata-only et exécution par groupes via S3-E — IMPLEMENTED /
VALIDATION PENDING
plan metadata-only et exécution par groupes via S3-E — PASS / FROZEN ; campagne
A6000 réelle validée sur 953 ARW + 953 JPEG MPF
- **Feature Store v1/v2** : ORB U8×32, SIFT/RootSIFT F32×128 et lecture typée bornée
- **Image View** : vues triées et filtrées pour la TUI
- **Task** : moteur de tâches avec pause/reprise, annulation et séquences
@ -60,19 +60,19 @@ persistante, enrichissable et versionnable.
- **Resource Snapshot** : capture instantanée des ressources
- **Resource Governor** : arbitrage centralisé des budgets et réservations
### Briques en cours de consolidation
### Prochaine tranche
- Intégration scheduler ↔ governor avec séquences adaptatives
- Documentation architecture
- **Visual Index v1** : LSH ORB persistant, incrémental et validé, avec recherche top-K bornée
- **Exécution durable de campagne d'acquisition** : confirmations et progression
persistantes, matérialisation S3-E incrémentale, reprise par `capture_id` retenu
et admission par les Task/Scheduler/Governor existants. Voir la
[roadmap canonique](docs/roadmap/roadmap.md).
### Briques prévues (PLANNED)
### Plus tard / différé
- Graphe de dépendances pour ordonner les futures reprises interdépendantes
- DAG de dépendances
- Pools de workers multiples (CPU/GPU/IO)
- Publication live validée
- Viewer intégré
- publication durable dense/mesh et scratch SSD externe optionnel gouverné ;
- workflow TUI de confirmation/progression et sources mixtes multi-ScanSet ;
- vidéo/keyframes, coverage assistance, viewer et exports ;
- DAG général, pools multiples et parallélisme inter-tâches restent différés.
## Architecture

View file

@ -2,7 +2,7 @@
## Capture / Asset Provenance v1 — Project DB v19
**IMPLEMENTED / VALIDATION PENDING.** La migration transactionnelle v18→v19
**PASS / FROZEN.** La migration transactionnelle v18→v19
ajoute seulement une fondation de catalogue : `captures`, `capture_images`,
`capture_assets`, `capture_selections` et `asset_derivations`. Un `Capture`
appartient à un seul ScanSet ; il n'est ni un `image_id` ni une nouvelle identité
@ -19,7 +19,7 @@ automatique.
### S3-E — Orchestration d'ingestion multi-source v1
**IMPLEMENTED / VALIDATION PENDING.** S3-E reçoit un ScanSet explicite et au
**PASS / FROZEN.** S3-E reçoit un ScanSet explicite et au
plus 64 chemins source explicitement fournis par l'appelant ; il ne parcourt
jamais un répertoire. Chaque fichier est d'abord publié comme asset immuable
géré, puis son évidence S3-D est extraite depuis ces octets publiés. Le
@ -58,7 +58,7 @@ interprété ; les IDs et la sémantique v18 restent inchangés.
### Couche finale bornée de découverte et de planification de campagne
**IMPLEMENTED / VALIDATION PENDING.** Cette couche reçoit de 1 à 64 racines
**PASS / FROZEN.** Cette couche reçoit de 1 à 64 racines
absolues, lexicalement normalisées et explicitement fournies par l'appelant.
Elle ne parcourt pas récursivement : chaque racine et chacune de ses entrées
immédiates régulières est inspectée sans suivre de lien symbolique. Seuls les
@ -116,7 +116,7 @@ sont applicables.
### S3-D — Acquisition Pairing Evidence v1
**IMPLEMENTED / VALIDATION PENDING — non FROZEN.** S3-D extrait, depuis des
**PASS / FROZEN.** S3-D extrait, depuis des
assets source immuables, un ensemble fixe et borné de métadonnées d'évidence
d'appariement. Pour les RAW, l'extraction est metadata-only avec LibRaw ; pour
les JPEG, elle utilise libexif. Cette évidence n'est pas une identité
@ -946,7 +946,7 @@ ouvert.
## Statut
**IMPLEMENTED / VALIDATION PENDING** — SQLite système, schéma v19 et migrations séquentielles
**PASS / FROZEN** — SQLite système, schéma v19 et migrations séquentielles
v1→v2→v3→v4→v5→v6→v7→v8→v9→v10→v11→v12→v13→v14→v15→v16→v17→v18→v19, identité projet, transactions
tâche+checkpoint, pagination de reprise et artefacts génériques.
@ -967,11 +967,11 @@ bornée à 256. Les identités sont des `INTEGER PRIMARY KEY AUTOINCREMENT` SQLi
allouées sous transaction ; aucun `SELECT MAX()+1` n'est utilisé en
fonctionnement normal et une identité validée n'est jamais réutilisée.
**IMPLEMENTED / VALIDATION PENDING** — Capture / Asset Provenance v1 :
**PASS / FROZEN** — Capture / Asset Provenance v1 :
Capture borné par ScanSet, associations explicites asset/image, sélection
courante optionnelle et dérivation asset à parent unique. RAW, vidéo,
appariement automatique et toute exécution de dérivation restent hors de cette
fondation.
courante optionnelle et dérivation asset à parent unique. S3-B1/S3-D/S3-E et la
campagne bornée réutilisent cette fondation sans redéfinir ses identités ; la
vidéo reste hors de S3.
La migration v3→v4 ne lit pas `manifest.tsv`. Elle crée le ScanSet legacy et
positionne `metadata.legacy_image_catalog_pending=1` dès qu'une ancienne tâche

View file

@ -1,125 +1,201 @@
# Roadmap Lardon3D
# Roadmap canonique Lardon3D
## Precision features
Cette feuille de route décrit l'ordre de dépendance actuel. Les contrats détaillés
restent dans `docs/architecture/`; ce document indique ce qui est fermé, ce qui
vient immédiatement ensuite et ce qui demeure volontairement différé.
- **IMPLEMENTED v1A** : ORB coarse stable, SIFT/RootSIFT OpenCV 5, Feature File
v2 F32×128, grille/coverage, tâches récupérables et consolidation intra-image.
- **IMPLEMENTED** : Candidate Pair Generator, matching précis et vérification géométrique.
- **PLANNED / BLOCKED** : ALIKED, en attente de provenance modèle et d'un export
ONNX reproductible validé contre un oracle upstream.
## Situation actuelle
## Direction générale
Lardon3D possède une chaîne scientifique persistante allant des acquisitions
explicites aux frontières Sparse SfM et MVS validées. Les travaux volumineux
doivent rester incrémentaux, bornés, reprenables, durables et admis par l'unique
Resource Governor : aucune étape ne peut supposer qu'une campagne entière tient
en RAM ou termine dans une seule vie de processus.
Lardon3D suit une feuille de route ordonnée qui privilégie la stabilité et la consolidation avant l'ajout de fonctionnalités complexes.
### Fondations PASS / FROZEN
## Étapes terminées (DONE)
- Gates AG Sparse SfM, dont F0, orchestration Task/Project DB et politique
Governor : [Sparse SfM](../architecture/sparse_sfm.md) et
[frontière ressource](../architecture/resource_boundary.md).
- Track Model / Track Builder v1 : [Track Model](../architecture/tracks.md) et
[Track Builder](../architecture/track_builder.md).
- Phase H v1 d'enrichissement incrémental multi-snapshot :
[Project DB](../architecture/project_database.md).
- MVS-M1, frontière OpenMVS v2.4.0, identité dense et export COLMAP/PLY borné :
[pipeline de reconstruction](../architecture/reconstruction_pipeline.md).
- Task Runtime, checkpoints atomiques, Queue, Scheduler et Resource Governor :
[Task](../architecture/task_system.md), [Queue](../architecture/task_queue.md)
et [Governor](../architecture/resource_governor.md).
- Project DB v19 et S1S3 Capture / Acquisition Ingestion : provenance
Capture/Asset, import capture-safe, publication dérivée, développement RAW,
siblings multi-source, évidence S3-D, orchestration S3-E et campagne bornée :
[Project DB et ingestion](../architecture/project_database.md).
### Phase 1 : Fondations
- ✅ TUI modulaire avec ncursesw
- ✅ Gestion persistante des projets
- ✅ Import d'images migré vers le scheduler générique, borné et reconstructible
- ✅ Catalogue d'images et vues
- ✅ Moteur de tâches avec pause/reprise, annulation, checkpoints
- ✅ File FIFO avec sélection adaptative et backpressure
- ✅ Profil matériel et snapshots de ressources
- ✅ Resource Governor avec réservations opaques
- ✅ Intégration scheduler ↔ governor
- ✅ Sélection de la première tâche admissible
### S3 Capture / Acquisition Ingestion — PASS / FROZEN
## Travaux d'infrastructure en cours (CURRENT FOUNDATION)
```text
S3-A Derived Image Publication PASS / FROZEN
S3-B1 Deterministic RAW Development PASS / FROZEN
S3-C Multi-Source Capture Association PASS / FROZEN
S3-D Acquisition Pairing Evidence v1 PASS / FROZEN
S3-E Multi-Source Ingestion v1 PASS / FROZEN
Bounded Campaign Ingestion PASS / FROZEN
Project DB v19
```
### Phase 2 : Consolidation
- 🔄 Documentation architecturale
- 🔄 Tests et validation
- 🔄 Optimisations mémoire
```text
entrées d'acquisition explicites
→ publication SOURCE immuable
→ provenance Capture/Asset
→ métadonnées RAW/JPEG et évidence d'acquisition
→ propositions de campagne déterministes
→ regroupement fort ou explicitement confirmé
→ un Capture par observation physique résolue et siblings SOURCE
→ développement RAW déterministe si demandé
→ image_id scientifique immuable
→ pipeline aval existant
```
## Prochaines étapes décidées (NEXT)
Les identités restent distinctes : `Capture != fichier`, `Capture != asset`,
`Capture != image_id`, `Capture != SHA-256` et `Capture != basename`.
### Phase 3 : Persistance
- ✅ Fondation versionnée des checkpoints de tâches
- ✅ Project Database v7 (tâches, catalogue, Feature Store, Visual Index et precision features)
- ✅ Branchement Project Database au cycle de vie projet et inventaire de reprise
- ✅ Registry durable des types métier de tâches
- ✅ Premier type métier reconstructible (`import.images`)
- ✅ Resoumission automatique contrôlée et bornée des tâches récupérables
- ✅ ScanSet v1 et Image Catalog persistant v1
### Validation réelle Sony A6000
### Phase 4 : Pipeline avancé
- ✅ Feature Store v1/v2, ORB, SIFT/RootSIFT et consolidation intra-image
- ✅ Visual Index v1 segmenté et persistant
- ✅ Candidate Pair Generator
- ✅ Matching et vérification géométrique
- ✅ Track Model / Track Builder v1
- ✅ Sparse SfM : primitives géométriques Gate C et noyau incrémental Gate D
implémentés
- ✅ Sparse SfM Gate E : Bundle Adjustment final par composante PASS / FROZEN
- ✅ Sparse SfM Gate F : orchestration durable et publication atomique PASS / FROZEN
- ✅ Sparse SfM Gate G : politique et cœur **PASS / FROZEN**
Campagne `Photogrammetrie/2026-08-26_Baie_Moteur_A6000` :
### Phase 5 : Reconstruction
- ✅ Orchestration de reconstruction incrémentale H v1 — **PASS / FROZEN**
- 🔄 Capture / Asset Provenance v1 — **IMPLEMENTED / VALIDATION PENDING** :
Project DB v19 ajoute les Captures par ScanSet, les associations source/dérivé
et la sélection explicite d'une image logique, sans changer le pipeline
scientifique. L'ingestion RAW et vidéo reste PLANNED.
- ✅ MVS-M1 — **PASS / FROZEN** : identité dense `L3DMDID2`
v2 (220 octets) liant reconstruction de base, jeu d'images source,
`calibration_scope_identity` historique, binding numérique exact `L3DMCAL1` v1,
backend et paramètres ; les octets source restent liés séparément ; frontière
OpenMVS v2.4.0 externe
`InterfaceCOLMAP`/`DensifyPointCloud` ; export COLMAP déterministe avec
undistortion OpenCV, observations transformées et tracks réels ; texte COLMAP
exporté en flux et tracks déterministes indexés sans rescan quadratique des
observations. Le binding de calibration trie les `image_id`, encode des champs
little-endian explicites à largeur fixe, rejette NaN/Inf et canonise `-0`. Chaque
invocation crée sous le staging appelant un espace de travail privé neuf, sans
réemployer scène, profondeur, cache ou sortie antérieure. Le PLY par défaut
OpenMVS v2.4.0, binaire little-endian, est validé avec listes
`view_indices`/`view_weights` bornées, nombres indépendants de la locale,
en-tête <= 1 MiB en octets bruts (CRLF = deux octets), lignes <= 64 KiB,
LF/CRLF acceptés et CR seul malformé rejeté ; le PLY fusionné est requis en mode
de fusion 0. Une coordonnée source undistordue
non finie est `INVALID_SOURCE_IMAGE`, une pose snapshot invalide reste
`INVALID_SNAPSHOT`. Capacité CPU-only conditionnelle et `--max-threads`
supporté ; bornes locales. Le SHA-256 source est complet et borné à 1 GiB par
fichier régulier, sans budget agrégé du jeu de sources ; le hashage des deux
binaires backend relève d'un budget partagé distinct. Sans nouveau sous-système.
Restent différés : publication Project DB/durable, Task Runtime,
Queue/Governor, `ResourceEstimate`, annulation, mesh, texturing, viewer,
scratch/SSD et infrastructure backend généralisée.
- 📋 Mesh
- 📋 Contraintes externes
- 📋 Consolidation
- 953 ARW et 953 JPEG, soit 1906 sources ;
- métadonnées : ARW 953/953 OK, JPEG 953/953 OK ;
- JPEG Sony reconnus comme conteneurs MPF valides : APP2 `MPF\0`, images JPEG
secondaires validées, remplissage inter-image/final nul, maximum privé huit ;
- `STRONG_GROUPS=0`, `CANDIDATE_PAIRS=953`, ambiguïtés 0, contradictions 0 ;
- plan identique après inversion de l'ordre des racines.
## Étapes futures (LATER)
Le stem commun ne prouve jamais une acquisition. Les 953 propositions doivent
être confirmées et deviennent `CALLER_EXPLICIT`, jamais `STRONG`. La campagne
complète n'a pas encore été matérialisée.
### Phase 6 : Production
- ⏳ Viewer intégré
- ⏳ Publication live validée
- ⏳ Export multi-formats
- ⏳ Optimisations performances
### Limite de reprise DB v19
### Phase 7 : Avancé
- ⏳ Priorités entre tâches
- ⏳ Pools de workers multiples (CPU/GPU/IO)
- ⏳ DAG de dépendances complet
- ⏳ Parallélisme inter-tâches
S3-E reprend une matérialisation connue par `resume_capture_id`. Une campagne
peut reconstruire son plan et conserver côté appelant le `capture_id` de chaque
groupe. Si le processus meurt après création du Capture mais avant rétention
durable de cet ID, DB v19 ne peut le redécouvrir sans inventer une identité
interdite. Il n'existe donc pas de garantie whole-campaign exactly-once. Une
future identité durable de requête/campagne pourra fermer cette fenêtre ; elle
ne sera jamais déduite d'un chemin, SHA, basename, timestamp, métadonnée ou
`image_id`.
## Sujets exploratoires (RESEARCH)
## NEXT — exécution durable de campagne d'acquisition
- 🔬 Intégration avec des sources de données externes
- 🔬 Support de formats d'entrée variés
- 🔬 Optimisation pour machines à très faible mémoire
- 🔬 Distribution de calcul
La prochaine tranche architecturale unique est l'exécution opérationnelle du
plan S3 gelé en réutilisant Task, Scheduler et Governor existants :
## Principes directeurs
1. identité durable de requête et payload Task borné ;
2. persistance/rechargement des confirmations, du curseur et des `capture_id` ;
3. matérialisation incrémentale d'un groupe S3-E par unité sûre ;
4. checkpoint après rétention durable, pause/reprise/annulation aux frontières ;
5. admission et budgets par l'unique Resource Governor ;
6. progression et échecs sans runtime, queue ou persistence parallèle.
1. **Stabilité avant performance** : ne jamais saturer le système hôte
2. **Séquençage avant parallélisme** : lots adaptatifs et workers uniques d'abord
3. **Réservation atomique** : aucune exécution sans contrat valide
4. **Persistance progressive** : chaque résultat doit pouvoir être repris
5. **Documentation vivante** : la documentation suit le code, pas l'inverse
Cette tranche décidera explicitement si une évolution additive après DB v19 est
nécessaire. Elle ne peut ni changer les identités S3 ni fusionner des Captures.
## Vérification
## NEXT REAL-DATA MILESTONE — A6000 ENGINE BAY END-TO-END
Cette roadmap est vérifiée contre l'état réel du code. Les fonctionnalités déjà implémentées ne sont pas marquées comme NEXT ou LATER.
1. confirmer explicitement les 953 propositions ARW/JPEG ;
2. matérialiser progressivement environ 953 Captures ;
3. produire les représentations scientifiques par lots gouvernés ;
4. exécuter features, candidats, matching, vérification, tracks et Sparse SfM ;
5. évaluer la qualité de la reconstruction sparse ;
6. exécuter MVS/dense avec budgets et scratch contrôlés ;
7. publier durablement nuage dense et mesh ;
8. comparer le résultat aux tentatives photogrammétriques antérieures.
Ce milestone est une intégration réelle, pas une nouvelle série de micro-gates
S3. Les antécédents d'OOM/SIGSEGV OpenMVS, pression swap, grands intermédiaires
et temps longs imposent reprise, progression et contrôle de ressources.
## NEAR TERM
### Scratch SSD externe et swap optionnel
Matériel envisagé : SSD externe d'environ 500 Go dans un boîtier USB-C 10 Gb/s.
La capacité planifiée est : détecter un disque externe adapté, le présenter dans
la configuration TUI/projet et demander si ce projet doit l'utiliser.
Usages possibles : workspace/scratch, intermédiaires dense/mesh/texturing et,
sur activation explicite, swap de sécurité. Le contrat devra être possédé par
l'exécution Task, le Resource Governor et la politique temporaire du projet ;
il ne doit pas devenir un gestionnaire de stockage ad hoc.
- le scratch déplace les gros intermédiaires hors de la RAM et du disque système ;
- il peut permettre des jobs bornés plus grands ;
- SSD/swap ne sont jamais de la RAM ni une extension du budget scientifique ;
- latence et débit USB restent distincts de la mémoire ;
- l'utilisation reste optionnelle et Governor-controlled ;
- retrait, déconnexion, ownership, nettoyage et publication atomique exigent
des sémantiques explicites ;
- aucun montage, formatage, `swapon` ou nettoyage destructif automatique n'est
actuellement implémenté ou autorisé.
### Publication durable dense / mesh
MVS-M1 reste la frontière scientifique gelée. Les prochaines étapes portent sur
exécution, reprise, budgets mémoire/stockage et publication atomique :
```text
dense → mesh → refinement → texturing → consolidation → export
```
Le scratch devient particulièrement pertinent à cette frontière.
### Workflow TUI-first
La TUI exposera état projet, découverte de campagne, confirmation des candidats,
progression, pause/reprise/annulation disponible, Governor, choix du scratch et
étapes aval. ncurses reste au thread principal. Aucun projet GUI général n'est
introduit.
### Sources mixtes et multi-ScanSet
Sony A6000, Samsung S21 et futures sources peuvent varier en device, objectif,
résolution et format. Elles réutilisent le même modèle Capture/Asset/Image, sans
fork par caméra. Plusieurs ScanSets et représentations sélectionnées alimentent
l'enrichissement Phase H existant vers un modèle consolidé ; Phase H n'est pas
redéfini ici.
## LATER
- **Vidéo/keyframes** : asset vidéo, timeline, extraction déterministe,
provenance frame↔vidéo, espacement, blur/qualité, redondance et couverture.
Ces politiques restent séparées des contrats photo gelés.
- **Maintenance projet** : vérification de provenance, assets orphelins,
scrub/réconciliation et réclamation sûre du scratch. Aucun asset immuable
partagé n'est supprimé silencieusement.
- **Coverage/capture assistance** : overlap, zones faibles, photos ou ScanSets
supplémentaires et comparaison de points de vue ; jamais une identité.
- **Viewer** : frontière passive et optionnelle pour sparse, dense, mesh, poses,
provenance, couverture et overlays qualité. Le projet reste TUI-first.
- **Exports/publication live** : snapshots validés et consommation sans accès
aux buffers workers mutables.
## DEFERRED / OPTIONAL
- pools multiples CPU/GPU/IO, parallélisme inter-tâches et multi-GPU ;
- DAG général de dépendances et priorités complexes ;
- infrastructure backend générique et distribution de calcul ;
- ALIKED tant que provenance modèle, export ONNX et oracle upstream ne sont pas
reproductibles.
Ces idées ne doivent pas devancer l'exécution durable de campagne ni créer un
second runtime, Governor ou système de persistance.
## Principes de séquencement
1. stabilité et intégrité scientifique avant débit ;
2. résultats atomiques et durables avant parallélisme ;
3. lots bornés et reprise avant taille de campagne ;
4. un Task Runtime, un Scheduler et un Resource Governor ;
5. scratch optionnel sans élargissement implicite des budgets RAM ;
6. TUI de contrôle avant visualisation riche ;
7. documentation canonique alignée sur le code validé.