Repository navigation
Expand file tree
/
Copy pathjournal.jsonl
More file actions
63 lines (63 loc) · 109 KB
/
Copy pathjournal.jsonl
File metadata and controls
63 lines (63 loc) · 109 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
{"date":"2026-07-05","session":1,"lot":"Bootstrap amorçage","fichiers":["AGENTS.md","CLAUDE.md","manifest.md","journal.md","journal.jsonl","journal_archive.md",".opencode/agent/archiviste.md",".claude/agents/archiviste.md",".opencode/command/reprise.md",".opencode/command/cloture.md",".claude/commands/reprise.md",".claude/commands/cloture.md","graphify-out/"],"decisions":["Canonisation AGENTS.md avec règles de style et permissions","manifest.md mis à jour v1.1.0 + RESTE À FAIRE","Graphify construit en mode code-only (pas de clé LLM)"],"pieges":["pyproject.toml encore à 1.0.5 alors que code à 1.1.0"],"graphify_rebuild":true}
{"date":"2026-07-05","session":2,"lot":"ALIKED/LightGlue + multi-modèle + complétion bootstrap","fichiers_modifies":["app/core/params.py","app/core/engine.py","app/cli/parser.py","app/cli/commands.py","app/gui/tabs/params_tab.py","assets/locales/en.json","assets/locales/fr.json","tests/test_colmap_engine.py"],"fichiers_crees":["opencode.multimodel.json",".claude/agents/ (8 agents)",".claude/commands/ (3 commandes)"],"decisions":["COLMAP 4.1 compatible — aucun flag deprecated","ALIKED/LightGlue ONNX disponibles via brew colmap (déjà compilé avec)","glomap standalone déprécié → migrer vers colmap global_mapper (pas urgent)","Multi-modèles configurés dans opencode.json mais nécessite copie manuelle"],"pieges":["tests MagicMock utilisent getattr → feature_type/matching_type doivent être mockés explicitement","opencode.multimodel.json pas encore copié dans ~/.config/opencode/ (action manuelle)"],"graphify_rebuild":true}
{"date":"2026-07-05","session":3,"lot":"Clôture RESTE À FAIRE + correctifs","fichiers_modifies":["manifest.md","journal.md","pyproject.toml","tests/conftest.py","tests/test_workers.py","tests/integration/conftest.py"],"fichiers_crees":["tests/integration/test_cleaner_export_integration.py","tests/integration/test_engine_params_integration.py","tests/integration/test_security_i18n_integration.py"],"decisions":["ExportTab déjà async — manifest désynchronisé","Conftest numpy mock conditionnel (cassait plyfile)","Subagents flash bloqués step limit → intégrateur (kimi) en fallback","Bug colmap_pipeline: mock_subprocess_run crée database.db"],"pieges":["ColmapParams n'a pas quality/use_gpu/vocab_tree_path","headroom/deepseek-v4-flash absent du proxy → archiviste/chercheur/testeur KO","serena_execute_shell_command timeout systématique"],"graphify_rebuild":true}
{"date":"2026-07-06","session":1,"lot":"Fix timeout Brush 3600s","fichiers_modifies":["app/core/base_engine.py","app/core/brush_engine.py","config.json","journal.md"],"decisions":["Timeout murale 3600s → 14400s pour Brush","Ajout inactivity_timeout (10min sans stdout = gelé) dans _execute_command()","Nouveau paramètre rétrocompatible (inactivity_timeout=0 = désactivé)"],"pieges":["Serena bloque config.json même avec permission utilisateur explicite","headroom/deepseek-v4-flash toujours absent du proxy → archiviste KO"],"graphify_rebuild":true}
{"date":"2026-07-06","session":2,"lot":"Fix round 2 : inactivity_timeout désactivé","fichiers_modifies":["app/core/brush_engine.py","CHANGELOG.md","journal.md","journal.jsonl"],"decisions":["Inactivity_timeout=600s trop court : Brush a des phases silencieuses (viewer init, I/O, calcul lourd)","Passé à 0 (désactivé) pour Brush — le timeout murale 4h suffit"],"pieges":["headroom/deepseek-v4-flash absent du proxy → archiviste KO (écriture journal directe)"],"graphify_rebuild":false}
{"date":"2026-07-06","session":3,"lot":"Optimisation Apple Silicon + adaptation responsive GUI","fichiers_modifies":["app/core/system.py","app/gui/tabs/config_tab.py","app/gui/tabs/sharp_tab.py","app/gui/tabs/extractor_360_tab.py","app/gui/tabs/four_dgs_tab.py","app/gui/tabs/superplat_tab.py","app/gui/tabs/upscale_tab.py","app/gui/widgets/upscale_widgets.py"],"decisions":["Bug adapt_max_splats : branche morte elif thermal=='warning' remplacée par paliers réels fair→0.75, serious→0.5, critical→0.2","5 onglets sans QScrollArea enveloppés pour accessible sur écran court (MacBook Air 13\")","Word-wrap sur labels d'aide engine + ModelCard description pour éviter overflow horizontal"],"pieges":[],"graphify_rebuild":false}
{"date":"2026-07-06","session":4,"lot":"Analyse COLMAP + 4 améliorations SfM","fichiers_modifies":["app/core/params.py","app/core/engine.py","app/gui/tabs/params_tab.py","tests/test_colmap_engine.py"],"decisions":["Feature extraction défaut SIFT (au lieu ALIKED), estimate_affine_shape=True → DSP-SIFT complet (force CPU)","vocab_tree implémenté en feature_matching (corrige bug latent → tombait silencieusement en exhaustif)","loop_detection vidéo : --SequentialMatching.loop_detection 1 (SIFT uniquement, incompatible ALIKED)","Fallback auto colmap mapper incrémental si GLOMAP sans modèle valide (méthode _has_valid_sparse_model)","GUI params_tab alignée : combo feature SIFT, case affine cochée, getattr → SIFT/SIFT_BRUTEFORCE"],"tests":"30/34 pass (4 préexistants: 3 TestDeleteProjectContent + test_default_for_aliked)","graphify_rebuild":true,"graphify_stats":"1967 noeuds, 3548 aretes, 137 communautes","caveats":"SIFT+affine force CPU (lent, robuste); vocab_tree/loop_detection téléchargent arbre vocab (connexion 1e fois)"}
{"date":"2026-07-06","session":5,"lot":"Réparation suite tests + audit i18n + CHANGELOG 1.2.2","fichiers_modifies":["tests/test_four_dgs_engine.py","tests/test_sharp_engine.py","tests/test_colmap_engine.py","tests/test_upscayl_manager.py","tests/test_workers.py","tests/test_cli.py","app/core/base_engine.py","CHANGELOG.md","assets/locales/fr.json","assets/locales/en.json","journal.jsonl","journal.md","journal_archive.md"],"decisions":["Boucle infinie tests : refactor session 1 (readline) vs anciens mocks (stdout_iter) → fix mocks en readline='' (EOF)","Pollution cv2 session-wide : import réel d'abord, MagicMock seulement si ImportError (CI headless)","Fixtures obsolètes : SessionManager structure v1.0.6, mock sparse/0/, GLB export skip gracieux","delete_project_content sécurité : bloque racine '/', $HOME, dossier app, ancêtres (is_relative_to)","CHANGELOG 1.2.2 anglais : DSP-SIFT défaut, loop_detection seq, vocab_tree, mapper incrémental, QScrollArea, adapt_max_splats, garde delete, tests","Audit i18n : 459 clés vérifiées, 9 locales cohérentes, morphologie ok (aucune terminaison ES)"],"pieges":["confirm_reset ES valeur incohérente (avertissement long vs label court) → NON corrigé"],"tests":"262 passed, 2 skipped, 0 failed (avant : gel infini + 13 échecs)","graphify_rebuild":false,"notes":"Git commits 62a1531 + fd04f50 poussés. app/__init__.py + pyproject.toml encore 1.2.0 (CHANGELOG devance 1.2.2). RESTE À FAIRE : confirm_reset ES, synchro versions, tests e2e, revoir traduction confirm_reset."}
{"date":"2026-07-06","session":6,"lot":"Reprise — synchro versions + validation tests intégration","fichiers_modifies":["app/__init__.py","pyproject.toml","journal.md","journal.jsonl","manifest.md"],"decisions":["Synchro versions : app/__init__.py + pyproject.toml passés 1.2.0 → 1.2.2 (alignés CHANGELOG + manifest)","Tests intégration validés : 32 pass, 1 skip (tests/integration/)"],"commits":["08fb98b (chore: sync version)","97a519b (docs: journal + manifest)"],"git_state":"2 commits locaux d'avance sur origin/main","rest_todo_updated":"Par orchestrateur — point 'synchro versions' retiré. Restent : confirm_reset ES incohérent, tests e2e réels absents","graphify_rebuild":false}
{"date":"2026-07-07","session":1,"lot":"Reprise — réparation SharpEngine (ModuleNotFoundError)","fichiers_modifies":[],"decisions":["engines/sharp/ dossier source disparu → install editable cassée (ModuleNotFoundError: sharp)","SharpEngineDep().install() reclone le dépôt Apple et rétablit l installation éditable","Aucun fichier de code modifié — intervention uniquement infrastructure"],"pieges":["engines/sharp/ supprimé silencieusement (cause inconnue)","Graphify 2 commits derrière HEAD (non bloquant)"],"graphify_rebuild":false}
{"date":"2026-07-08","session":1,"lot":"Bouton 'Ouvrir le splat' post-entraînement Brush","fichiers_modifies":["app/gui/main_window.py","assets/locales/fr.json","assets/locales/en.json","assets/locales/de.json","assets/locales/es.json","assets/locales/it.json","assets/locales/ja.json","assets/locales/ru.json","assets/locales/zh.json","assets/locales/ar.json"],"decisions":["Dialog post-training : QMessageBox avec boutons OK + 'Ouvrir le splat' (ActionRole)","Nouvelle méthode _show_training_done_dialog(output_path)","Nouvelle méthode _open_latest_splat(output_path) : cherche .ply le plus récent, lance SuperSplat","on_brush_finished() et _on_post_training_finished() appellent dialog","i18n : 2 clés (btn_open_splat, msg_no_ply_found) ajoutées dans 9 locales"],"verifications":["JSON locales valides (parsing OK)","262 tests pass (0 fail, 2 skip — aucune régression)","graphify update : 1981 noeuds, 3582 aretes, 141 communautes"],"graphify_rebuild":false,"notes":"Git 3 commits locaux d'avance sur origin/main (push non effectué). RESTE À FAIRE inchangé."}
{"date":"2026-07-08","session":2,"lot":"confirm_reset ES + démarrage tests e2e réels","fichiers_modifies":["assets/locales/es.json","app/gui/main_window.py","journal.md","journal.jsonl"],"decisions":["confirm_reset ES : ancien avertissement long 'Restablecimiento de Fábrica' remplacé par 'Elija el nivel de restablecimiento:' (aligné sur en.json/fr.json)","9 locales valides JSON","Tests i18n 10/10 pass (tests/integration/test_security_i18n_integration.py)","Tests e2e démarrés : binaires réels vérifiés (colmap 4.1.0, glomap, brush v0.3.0, ffmpeg 8.1.2, node, sharp venv + checkpoint ~/.cache/torch/hub/checkpoints/sharp_2572gikvuh.pt) ; upscayl manquant","SharpEngine.predict testé sur image synthétique — inference lancée OK, interrompue par utilisateur avant terme"],"reste_a_faire":["confirm_reset ES — RÉSOLU","tests e2e réels — en cours"],"commits":[],"git_state":"3 commits locaux d'avance sur origin/main ; arbre sale (assets/locales/es.json, app/gui/main_window.py, journal.md, journal.jsonl)","graphify_rebuild":false,"notes":"Aucun commit cette session. Modifications uniquement dans le working tree."}
{"date":"2026-07-09","session":1,"lot":"Amorçage complété + tests e2e réels + feature « Ouvrir le splat »","fichiers_crees":["tests/integration/_synthetic_scene.py","tests/integration/test_e2e_pipeline.py",".opencode/agent/orchestrateur.md",".opencode/agent/chercheur.md",".opencode/agent/integrateur.md",".opencode/agent/optimiseur.md",".opencode/agent/refonteur.md",".opencode/agent/testeur.md",".opencode/agent/validateur.md",".opencode/agent/archiviste.md"],"fichiers_modifies":["pyproject.toml","app/gui/main_window.py","assets/locales/ar.json","assets/locales/de.json","assets/locales/en.json","assets/locales/es.json","assets/locales/fr.json","assets/locales/it.json","assets/locales/ja.json","assets/locales/ru.json",".claude/agents/optimiseur.md",".claude/agents/integrateur.md",".claude/agents/refonteur.md",".claude/agents/testeur.md"],"environnement":["opencv-python-headless réinstallé .venv (>=4.8,<5 → 4.13)"],"decisions":["Tests e2e RÉELS pipeline COLMAP→Brush→clean→export SPZ sur scène synthétique numpy+PIL (no data/network)","Opt-in marqueur pytest 'e2e' (défaut désélectionné, lancement 'pytest -m e2e')","Scène 3D : coin boîte 3 faces non coplanaires + texture bruit multi-octave PNG → SIFT stable","opencv réinstallé (manquant venv) ; absence causait cv2 mock cassant 4 tests COLMAP run complet","9 agents .opencode/agent/ créés (config cassée opencode.json)","Hook graphify post-commit + post-checkout auto-refresh"],"pieges":[".venv sans cv2 → suite rouge run complet (isolation OK) ; fix install","COLMAP 2 modèles features faibles (bruit JPEG) ; résolu texture multi-octave PNG (sparse/0 unique)","numpy 2.x ptp() supprimé → np.ptp()","pytest skipif mark ne décore pas fixture → guard classe"],"commits":["2e82496 (test e2e)","ff3bb75 (feat Ouvrir splat)"],"tests":"263 pass/1 skip (défaut); 7 pass ~21s (e2e)","graphify_rebuild":true,"notes":"Commits origin/main. 'Ouvrir splat' : _show_training_done_dialog() + _open_latest_splat(). Tests e2e : _synthetic_scene.py numpy+PIL (no cv2). RESTE À FAIRE inchangé."}
{"date":"2026-07-10","session":1,"lot":"Feature destination perso checkpoints Brush (mode auto COLMAP→Brush)","fichiers_modifies":["app/gui/tabs/config_tab.py","app/gui/main_window.py","app/gui/workers.py","assets/locales/en.json","assets/locales/fr.json","assets/locales/de.json","assets/locales/es.json","assets/locales/it.json","assets/locales/ja.json","assets/locales/ru.json","assets/locales/zh.json","assets/locales/ar.json","tests/test_workers.py"],"decisions":["Champ optionnel 'Destination des checkpoints' + bouton Parcourir dans groupe Sortie config_tab","Vide → comportement inchangé (checkpoints dans <dataset>/checkpoints)","Mode automatique COLMAP→Brush : checkpoints écrits dans <dest>/<nom_projet>/ ; après succès seul .ply le plus récent conservé (intermédiaires + dossiers vides supprimés)","Mémorisé entre sessions (get_state/set_state), traduit dans 9 locales","Nettoyage 'garder dernier checkpoint' UNIQUEMENT si destination perso renseignée (flux par défaut garde tous — mode Refine les cherche)"],"pieges":[],"tests":"264 passed, 2 skipped, 0 failed. py_compile OK.","graphify_rebuild":true,"graphify_stats":"2027 noeuds, 3662 aretes","commits":[],"git_state":"working tree non committé (changements en attente confirmation utilisateur pour commit)","notes":"Fichiers modifiés : config_tab.py (champ UI, browse_ckpt_dest, get/set_checkpoint_dest, state, retranslate_ui) ; main_window.py (train_brush construit <dest>/<projet> et passe keep_only_latest à BrushWorker) ; workers.py (BrushWorker.__init__ param keep_only_latest, _prune_to_latest_checkpoint() appelée dans branche succès) ; 9 locales (label_ckpt_dest, ckpt_dest_placeholder, ckpt_dest_tip) ; test_workers.py (+2 tests : test_prune_to_latest_checkpoint, test_prune_to_latest_checkpoint_single + ajout worker.keep_only_latest=False dans test_run_success). RESTE À FAIRE : (1) commit changements ; (2) e2e réel Sharp/Upscale/4DGS/360 (upscayl à installer) ; (3) alléger manifest.md."}
{"date":"2026-07-12","session":1,"lot":"Bugfix SplatTransform + e2e P0/P1/P2 livrés","fichiers_crees":["tests/integration/_synthetic_image.py","tests/integration/test_e2e_upscale.py","tests/test_extractor_360_engine.py","tests/integration/test_e2e_sharp.py","feature-proposal.md"],"fichiers_modifies":["app/gui/tabs/splat_transform_tab.py","pyproject.toml"],"decisions":["Bugfix _browse_input() ligne 227 : déstructuration tuple PyQt6 getOpenFileName (path, _ = ...)","P0 Upscale e2e : générateur synthétique 160×120 + 4 tests upscayl-bin (4 pass)","P1 360 Extractor unit : 303 lignes 25 tests mock (25 pass)","P2 Sharp e2e : generate_depth_image() 640×480 + 4 tests Apple ML (4 pass, 142s)","Marqueurs pytest e2e_sharp/e2e_upscale/e2e_4dgs/e2e_360 ajoutés pyproject.toml","feature-proposal.md : design complet P3-P5 (407 lignes)"],"pieges":["getOpenFileName tuple PyQt6 — seul SplatTransform manquait déstructuration","Sharp predict ~142s Apple Silicon → timeout tests ajusté 300s"],"tests":"291 pass, 2 skip, 15 deselected, 0 fail","graphify_rebuild":false,"commits":[],"git_state":"working tree non committé (cumule sessions 2026-07-10 + 2026-07-12)","notes":"RESTE : commit, P3-P5 e2e, alléger manifest.md"}
{"date":"2026-07-15","session":2,"lot":"Allègement manifest.md + audit SRP ColmapEngine + commits P0-P2 e2e","fichiers_modifies":["manifest.md","app/gui/tabs/splat_transform_tab.py","pyproject.toml","app/core/engine.py","tests/test_colmap_engine.py"],"fichiers_crees":["app/core/colmap_commands.py","tests/integration/_synthetic_image.py","tests/integration/test_e2e_upscale.py","tests/test_extractor_360_engine.py","tests/integration/test_e2e_sharp.py","feature-proposal.md"],"decisions":["manifest.md allégé 227→97 lignes : sections Architecture/Key Design Patterns/Engines/Dependencies/Security remplacées par résumé + pointeur graphify query/explain","test_export_spz_created revérifié → passe systématiquement ; 'known issue' signalé manifest.md retiré","Commit 12f260f : fix SplatTransformTab._browse_input() déstructuration tuple PyQt6 (ligne 227) + tests e2e P0 (upscale 4 pass) P1 (360 extractor 25 mocks pass) P2 (Sharp image 4 pass 142s)","Audit SRP ColmapEngine (~1006 lignes) : violation limitée construction CLI COLMAP (flags SIFT/ALIKED, feature/matching/mapper commands) vs orchestration ; extraction app/core/colmap_commands.py (178 lignes, 5 fonctions pures : build_feature_extraction/matching/global_mapper/incremental_mapper/image_undistorter_command)","ColmapEngine.mapper() garde logique repli global→incremental ; signatures publiques inchangées ; autres méthodes (_filter_blurry_images, _check_and_normalize_resolution, etc.) jugées non-extractibles","engine.py : 1006→901 lignes ; tests 292 passed, 1 skip, 15 deselected (inchangés)","Commit 3f8e51d : refactor extraction commandes CLI COLMAP"],"pieges":["uv.lock (891 lignes, non lié projet, pas [tool.uv] pyproject.toml) laissé volontairement hors commit, untracked"],"caveats":["Vérification manuelle Apple Silicon utilisateur confirmée ('ça a fonctionné')"],"tests":"292 passed, 1 skipped, 15 deselected","graphify_rebuild":false,"commits":["12f260f","3f8e51d"],"git_state":"main 2 commits d'avance origin/main (non pushé) ; uv.lock untracked","rest_todo":["E2E 360 Extractor (.venv_360)","E2E Sharp vidéo (ffmpeg + frames)","E2E 4DGS (ffmpeg + nerfstudio)"],"notes":"manifest.md mise à jour conséquence audit. Deux commits ciblés : SplatTransform bugfix + e2e P0-P2 implémentés, puis refactor SRP ColmapEngine."}
{"date":"2026-07-17","session":3,"lot":"Régénération complète du graphe graphify-out/","fichiers_modifies":[],"fichiers_crees":[],"decisions":["Régénération complète du graphe de connaissance graphify-out/","123 fichiers scannés (97 code, 11 docs, 12 images, 0 vidéo)","1950 nœuds AST + 75 nœuds sémantiques → 2002 nœuds après build, 3747 arêtes, 120 communautés","30 communautés labellisées manuellement","HTML interactif généré","92% EXTRACTED, 8% INFERRED, 0% AMBIGUOUS"],"pieges":[],"graphify_rebuild":true,"graphify_stats":"2002 noeuds, 3747 aretes, 120 communautes","commits":[],"git_state":"main 2 commits d'avance origin/main (non pushé)","tests":"292 passed, 1 skipped, 0 failed","notes":"Aucun code modifié, aucune feature livrée. RESTE À FAIRE inchangé : P3 (e2e 360), P4 (e2e Sharp vidéo), P5 (e2e 4DGS)."}
{"date":"2026-07-17","session":4,"lot":"Bugfix crash Brush disque externe + audit complet + corrections C1+I1-I5","fichiers_modifies":["app/gui/main_window.py","app/core/engine.py","app/core/four_dgs_engine.py","app/gui/workers.py","app/upscayl_manager.py","app/core/sharp_engine.py","tests/test_sharp_engine.py"],"fichiers_crees":["audit-report.md"],"decisions":["Bugfix crash Brush disque externe déconnecté (/Volumes/T7/...) : OSError au mkdir → try/except + QMessageBox.critical (2 endroits : ~L452 Indépendant, ~L484 Automatique)","Audit complet par @auditeur → audit-report.md (7.5/10) : C1 timeout 3600s trop court + I1-I5 (Refine exFAT symlink, upscayl SHA256, Sharp FFmpeg bloquant, delete_project_content fail silent, on_finished mauvais worker) + M1-M8 mineurs non traités","Corrections par @optimiseur : engine.py (timeout 14400s, delete retourne status), four_dgs_engine.py (14400s), workers.py (symlink sparse + copytree repli), upscayl_manager.py (SHA256 → RuntimeError), sharp_engine.py (FFmpeg via runner), main_window.py (on_finished via sender()), test_sharp_engine.py adapté"],"pieges":["Disque externe déconnecté → Abort trap 6 (app crash, data loss risk)","Timeout COLMAP/4DGS 3600s insuffisant gros datasets (10+GB)","upscayl SHA256 mismatch continuait install"],"tests":"292 passed, 1 skipped, 15 deselected, 0 failed","graphify_rebuild":false,"git_state":"2 commits avance origin/main; arbre modifié non committé","rest_todo":["Commit C1+I1-I5","P3-P5 e2e","Mineurs M1-M8"],"notes":"Bugfix + audit complet + corrections. Aucun commit avant archiviste."}
{"date":"2026-07-17","session":5,"lot":"Diagnostic CI : 4 jobs échoués (lint, audit, test-gui, test 3.10-3.12)","fichiers_modifies":[],"fichiers_crees":[],"decisions":["CI cassée : tous les jobs échouent sur run 29564984659 (commit 611f216)","Lint : ruff sans scope → 1483 erreurs (1008 auto-fixables) ; verify_imports.py (script debug oublié, imports FourDGS inutilisés) + app/cli/__init__.py (I001 désordre, F401 run_colmap inutilisé)","Audit : pyobjc-framework-Cocoa sans marker darwin → pip-audit compile sur Linux → ModuleNotFoundError pkg_resources","Tests : test_colmap_pipeline::test_run_returns_success échoue img.shape[:2] car mock/fixture image vide (régression session 4 commit 611f216)","Workflow ci.yml : ruff/mypy/pip-audit installés sans version figée → vulnérable nouvelles releases upstream"],"pieges":["verify_imports.py racine scannée par ruff sans scope","ci.yml packaging sans pinning → cause probable régression soudaine"],"tests":"Tous échoués : audit, test-gui, lint, test 3.10/3.11/3.12","graphify_rebuild":false,"git_state":"HEAD 611f216 ; working tree propre","rest_todo":["Restreindre lint CI scope → app/ (exclure verify_imports.py)","ruff check . --fix + manual cleanup","Ajouter marker sys_platform == 'darwin' pyobjc-framework-Cocoa requirements.txt/.lock","Corriger fixture mock test_colmap_pipeline (image vide)","Pin versions ruff/mypy/pip-audit ci.yml"],"plan_validé":"Oui (utilisateur) ; exécution reportée session suivante","notes":"Diagnostic complet, aucune correction appliquée. Priorité absolue : 4 blocages CI avant tout commit. P3-P5 e2e + mineurs M1-M8 restent inchangés."}
{"date":"2026-07-17","session":6,"lot":"Fix CI GitHub Actions + mypy lint + Pillow CVE 11.3.0→12.3.0","fichiers_modifies":["requirements.txt","requirements.lock",".github/workflows/ci.yml","tests/test_setup_dependencies.py","app/core/base_engine.py","app/core/export_engine.py","app/scripts/installers/base.py","app/scripts/installers/brush.py","app/upscayl_manager.py","app/gui/tabs/splat_transform_tab.py","app/core/engine.py"],"decisions":["(1) opencv-python-headless 4.13.0.92 manquante requirements.lock (utilisée requirements.txt) → ajoutée lock","(2) CI GitHub Actions Ubuntu 24.04 : libegl1-mesa→libegl1, libgl1-mesa-glx→libgl1 (paquets renommés)","(3) Pillow 11.3.0 : 8 CVE connues (PYSEC-2026-*) → upgrade 12.3.0 (API stable, aucune régression Image.LANCZOS)","(4) 27 erreurs mypy : annotations Optional implicites (PEP 484 interdit = None sans | None), collisions noms vars, bugs réels détectés","(5) test_setup_dependencies.py::test_check_xcode_tools_present sans skipif sys.platform!='darwin' → causait fail Linux (test bugué, code OK)","(6) app/core/engine.py : ctypes.CDLLError n'existe pas (except tuple aurait cascadé); collision var p (Path vs int pct); mapper() cast sparse_dir inutile; upscale_config attribut dynamique → getattr pattern"],"pieges":["opencv-python-headless utilisée cv2 mocks mais absente lock → circulation cv2 mocks cassait tests COLMAP","CI cassée paquets OpenGL Ubuntu 24.04 (changement soudain GitHub Actions)","ctypes.CDLLError en except tuple : si AttributeError/OSError dans try clonefile, le tuple d'except levait nouvelle AttributeError au lieu fallback shutil.copy2","upscale_config jamais déclaré __init__ (attribut dynamique) → 6 appels .get() risquaient AttributeError"],"tests":"292 passed, 0 failed; mypy 0 erreur (2 notes info non-bloquantes upscale_tab.py)","graphify_rebuild":false,"commits":["c83c1fc","be924e9","ca4ab1b"],"git_state":"main 3 commits avance origin/main ; CI GitHub Actions tous jobs verts (lint, audit, test-gui, 3.10/3.11/3.12)","rest_todo":["P3-P5 e2e (360, Sharp vidéo, 4DGS)","Mineurs M1-M8 audit"],"notes":"Push final ca4ab1b validé CI verte (gh run watch). Aucun changement architecture/feature — uniquement bugfix latents, dépendances, typage PEP 484. opencv headless + paquets Ubuntu + Pillow CVE + mypy lint + 6 bugs moteur/workers/installers corrigés. manifest.md inchangé."}
{"date":"2026-07-18","session":7,"lot":"Migration PyQt6→PySide6 v1.2.3→v1.5.0 + thèmes sombres + i18n Upscale","fichiers_modifies":["app/__init__.py","pyproject.toml","app/gui/main_window.py","app/gui/styles.py","app/gui/tabs/config_tab.py","app/gui/tabs/upscale_tab.py","app/gui/widgets/upscale_widgets.py","app/core/brush_engine.py","app/core/sharp_engine.py","app/core/four_dgs_engine.py","app/core/base_engine.py","app/upscayl_manager.py","app/cli/parser.py","app/cli/commands.py","app/scripts/run.command","assets/locales/en.json","assets/locales/fr.json","assets/locales/de.json","assets/locales/es.json","assets/locales/it.json","assets/locales/ja.json","assets/locales/ru.json","assets/locales/zh.json","assets/locales/ar.json","tests/conftest.py","tests/integration/conftest.py","tests/test_cli.py","tests/test_managers.py","tests/test_workers.py","CHANGELOG.md","README.md"],"decisions":["Remplacement mécanique PyQt6→PySide6 : pyqtSignal→Signal, imports QtCore/QtGui/QtWidgets refactorisés app/ + tests/","PySide6 6.11.1 déjà .venv (même version Qt que PyQt6 6.11.0) → migration 1:1 sans changement API","Tests refactorisés : conftest.py mock réécrit PySide6 + os.environ.setdefault(PYTEST_QT_API,pyside6), integration/conftest/test_cli/test_managers/test_workers imports PyQt6→PySide6","Requirements.txt PySide6>=6.6,<7, requirements.lock (PySide6/-Essentials/-Addons/shiboken6 6.11.1), pyproject.toml override mypy PySide6.*","Version 1.5.0 bump : app/__init__ + pyproject, libellé UI main_window lit app.VERSION → auto","UI 3 thèmes sombres (slate/graphite/blue) : app/gui/styles.py dict THEMES, CSS commun via string.Template","Thème config_tab : menu déroulant Thème en-tête gauche + change_theme(), persist config.json clé theme, get_saved_theme()/save_theme()","set_dark_theme(app, theme=None) lit thème mémorisé → applique volée","i18n Upscale complet ~46 clés (préfixe up_) 9 locales, upscale_tab chaînes dur→tr()+retranslate_ui, ModelCard traduit + abonné observer","Fix RuntimeWarning PySide6 disconnect(None) : widget mémorise handler connecté, déconnecte seul lui (contextlib.suppress retiré inutilisé)","CHANGELOG [1.5.0] anglais sections emoji, README crédit Qt for Python LGPL"],"commits":["e7d5688","b4e88db"],"tags":["v1.5.0"],"git_state":"branche migration-pyside6 créée + mergée fast-forward main, commits e7d5688/b4e88db poussés origin/main, tag v1.5.0 annoté créé + poussé","tests":"292 passed, 1 skipped, 15 deselected (identique baseline, GUI non lançable ici macOS requis, utilisateur validé Mac)","graphify_rebuild":false,"rest_todo":["P3 e2e 360 Extractor (.venv_360)","P4 e2e Sharp vidéo (ffmpeg frames)","P5 e2e 4DGS (ffmpeg nerfstudio)","M1-M8 mineurs audit"],"notes":"Migration bindings complète : aucun pyqtSlot/pyqtProperty/exec_()/pos()/globalPos() à traiter. Version 1.5.0 stabilisée. Thèmes + i18n Upscale livrés. RESTE À FAIRE inchangé."}
{"date":"2026-07-18","session":8,"lot":"Reprise + génération ETAT_DES_LIEUX.md complet (669 lignes)","fichiers_crees":["ETAT_DES_LIEUX.md"],"decisions":["Reprise session 7 : état HEAD b4e88db (v1.5.0), graphe graphify à jour, arbre propre","Tâche principale : ETAT_DES_LIEUX.md cartographie factuelle complète autosuffisante destinée refonte interface externe","Contenu : moteurs app/core/ (8), dataclasses/params cross-ref get/set, GUI app/gui/ (main_window + 13 onglets + managers/workers/widgets/styles), couplages flux (signaux/slots, post-training, modes), i18n (9 locales 516 clés), sécurité (validate_path, shell=True, Brush allowlist, SuperSplat CORS, sanitisation projet), tests, dette + anomalies factuelles","Lecture seule stricte : zéro modification code, zéro build/GUI, 6 agents Explore parallèles (moteurs, dataclasses, GUI, flux, i18n/sécurité/tests/anomalies, arbo/métadonnées)","Anomalies documentées (non corrigées) : guided_matching mort, sequential_overlap orphelin, split undistort/filter/blur entre ParamsTab-ConfigTab, double mapping blur_factor, ExportTab jamais instanciée, 2 chemins Brush (orchestré vs standalone), workers FourDGS/360 dupliqués, import privé _apply_robust"],"fichiers_modifies":[],"commits":[],"git_state":"main 3 commits avance origin/main ; arbre propre","tests":"292 passed, 1 skipped (inchangés, validation lointaine)","graphify_rebuild":false,"notes":"ETAT_DES_LIEUX.md seul livrable (doc audit, no code). Manifest.md inchangé (RESTE À FAIRE identique). Aucun push."}
{"date":"2026-07-18","session":9,"lot":"Correction dette technique audit (6 correctifs A-F) + version 1.5.1","fichiers_modifies":["app/core/params.py","app/gui/tabs/params_tab.py","assets/locales/en.json","assets/locales/fr.json","assets/locales/de.json","assets/locales/es.json","assets/locales/it.json","assets/locales/ja.json","assets/locales/ru.json","assets/locales/zh.json","assets/locales/ar.json","app/gui/main_window.py","app/core/engine.py","app/cli/commands.py","app/gui/tabs/brush_tab.py","app/gui/tabs/four_dgs_tab.py","app/gui/tabs/extractor_360_tab.py","app/gui/tabs/export_tab.py"],"decisions":["A. guided_matching (ColmapParams) : case réactivée params_tab.py, écriture set_params() ajoutée","B. sequential_overlap (ColmapParams) : QSpinBox ajouté params_tab.py, câblé get/set_params, i18n 9 locales","C. blur_factor mapping : unifié dans app/core/params.py::blur_factor_from_strength() (était dupliqué main_window.py + cli/commands.py)","D. ExportTab (code mort jamais instanciée) supprimée ; ExportEngine/ExportWorker restent intacts","E. Brush standalone (BrushTab.run_standalone) : subprocess.Popen fire-and-forget→BrushWorker, logs+arrêt propre, slot on_brush_standalone_finished distinct","F. FourDGSTab/Extractor360Tab : suppression instanciation worker locale, orchestration unique main_window (signaux runRequested/stopRequested/extractRequested)"],"tests":"292 passed, 1 skipped, 15 deselected, 0 failed","commits":["74bd4d1","765722a"],"changelog":"[1.5.1] - 2026-07-18 : 6 correctifs debt technique (guided_matching, sequential_overlap, blur_factor, ExportTab orpheline, Brush standalone, orchestration FourDGS/360)","version":"1.5.1","graphify_rebuild":true,"git_state":"2 commits locaux d'avance (non pushés)","notes":"Session 8 audit ETAT_DES_LIEUX.md → session 9 correctifs. Fichiers hors commit (choix délibéré) : PROMPT_CLAUDE_CODE_REFONTE_UI.md, REFONTE_UI_SPEC.md (notes utilisateur). manifest.md inchangé. graphify update lancé séparément."}
{"date":"2026-07-18","session":"10 suite 5","lot":"Refonte UI Lot 6 — Clôture","features":["Charger/Sauvegarder config nommée","Notifications macOS natives (pyobjc NSUserNotificationCenter)","Icône erreur rail → déplie auto logbar","i18n 9 langues (93 clés +, 610 total/fichier, parité vérifiée)","Tests notifications (graceful pyobjc missing)"],"commits":["5996564"],"tests":"376 passed, 1 skipped, 15 deselected","decisions":["Config I/O via collect_config/apply_config + ChainConfig (app/core/config_io.py existant Lot 1)","Notifications : nouveau app/core/notifications.py is_available/notify via pyobjc, zéro dépendance ajoutée","Toggle notifications Réglages ⟷ SettingsWindow, hook StudioWindow.notify() câblé (pas encore appelé sans run réel)","i18n Upscale : 9 locales 46 clés (préfixe up_) ; parité sous-agent + revérification indépendante","2 tests notifications.py : dégradation propre si pyobjc absent"],"etat_global":["Lots 1-6 UI/logique TERMINÉS, non encore activés dans main.py (ColmapGUI inchangée)"],"reste_a_faire":["Câblage moteurs réels : launch() dispatch ColmapWorker/BrushWorker/PostTrainingWorker, boutons Nettoyage/Export/Visualiser déclenchent workers, closeEvent → SuperSplatEngine.stop_all(), notifications déclenchées","Lot 7 : supprimer tabs/*.py, ColmapGUI, _apply_robust import, bascule main.py → StudioWindow"],"notes":"Commande user : traiter câblage moteurs AVANT Lot 7 (pour valider StudioWindow avant nettoyage ColmapGUI). Aucune tâche suivante lancée en fin session.","graphify_rebuild":false}
{"date":"2026-07-18","session":"10 suite 6","lot":"Reprise — P0 câblage moteurs lancé et en cours","fichiers_modifies":["app/gui/panels/cleaner_panel.py","app/gui/panels/export_panel.py","app/gui/panels/extractor360_panel.py","app/gui/panels/four_dgs_panel.py","app/gui/panels/sharp_panel.py","app/gui/panels/splat_transform_panel.py","app/gui/panels/upscale_panel.py","app/gui/topbar.py"],"commits":[],"tests":"376 passed, 1 skipped, 15 deselected (inchangé)","decisions":["Lecture reprise : manifest.md, journal.md, GRAPH_REPORT.md","Graphe désynchronisé d'un commit (basé sur Lot 5, HEAD Lot 6) graphify update nécessaire","P0 câblage moteurs réels dans launch() priorisé par l'utilisateur","Avant-projets socle préparatoire lancés : bouton Lancer + collecte réglages 7 panneaux OUTILS (cleaner, export, extractor360, four_dgs, sharp, splat_transform, upscale) + topbar.py","Travail incomplet → demande annulation par utilisateur ; socle sera finalisé et committé session suivante"],"reste_a_faire":["P0 : Finalisation + commit socle préparatoire, puis câblage réel moteurs dans launch()","P1 : Bug scroll horizontal barre droite","P2 Lot 7 (nettoyage anciens onglets + bascule main.py vers StudioWindow)","graphify update (graphe 1 commit derrière)"],"graphify_rebuild":false,"notes":"Session : travail préparatoire socle lancé mais incomplet lors demande annulation. Socle finalisé et committé session 19 juillet."}
{"date":"2026-07-19","session":"10 7","lot":"Socle committé","fichiers_modifies":["app/gui/panels/cleaner_panel.py","app/gui/panels/export_panel.py","app/gui/panels/extractor360_panel.py","app/gui/panels/four_dgs_panel.py","app/gui/panels/sharp_panel.py","app/gui/panels/splat_transform_panel.py","app/gui/panels/upscale_panel.py","app/gui/topbar.py"],"commits":["6cbfb38"],"tests":"376 1 15 feat(refonte-ui): topbar.py","decisions":["Collecte 7 OUTILS UI ColmapWorker/BrushWorker/PostTrainingWorker studio_window.py","Déclenchement post-run","P1 7 main.py StudioWindow)"],"graphify_rebuild":false,"notes":"Socle UI"}
{"date":"2026-07-19","session":"10 8","lot":"Refonte UI 8 7","commits":["6cbfb38","3e0a608","18c52f6","78ba2a8","56a5588","619705d","4de8d53"],"features":["Socle 7 OUTILS)","Correction studio_window.py CleanerWorker, ExportWorker, FourDGSWorker, SharpWorker/SharpVideoWorker, SplatTransformWorker, UpscaleWorker (TestWorker)","Lot 5 9 OUTILS)","Fix 22 PIPELINE, 9 7 StudioWindow, ColmapGUI 11 SuperSplat/worker","SuperSplat VisualiserPanel, AppLifecycle app)"],"tests":"385 1 15 deselected","verifications":["StudioWindow (PySide6 mock)","13 UI UI 8 COMPLET réels, pas seulement UI vide","closeEvent() gère shutdown propre SuperSplat + cancel worker actif","SessionManager orphelin : rebrancher ou supprimer ?"],"rest_todo":["P0 : validation manuelle complète utilisateur données réelles (3 pipelines + 7 modules OUTILS avec vrais fichiers)","Bug scroll horizontal barre droite (différé, documenté REFONTE_UI_PROGRESS.md)"],"notes":"Vérification visuelle/non-crash réelle, pas exécution COLMAP/Brush/Sharp. 7 commits, tous sur main. manifest.md non modifié. graphify_rebuild:false"}
{"date":"2026-07-19","session":"10 suite 9","lot":"Résolution bug scroll horizontal barre droite","commits":["149111d"],"features":["Résolution complète bug scroll horizontal 18 QFormLayout (RowWrapPolicy)"],"decisions":["Bug scroll horizontal barre droite géométrie réelle détectée dépassement 34px combo_mode ('Modo de Entrenamiento') en espagnol, faute espace colonne droite (400px)","Fix appliqué : setRowWrapPolicy(QFormLayout.RowWrapPolicy.WrapLongRows) sur 18 QFormLayout du projet","Vérification sans débordement : 10 panneaux + Réglages, espagnol/anglais/russe, instanciation réelle StudioWindow (PySide6 réel, non mocké)"],"tests":"385 passed, 1 skipped, 15 deselected (inchangé)","verifications":["Combo + labels sans débordement horizontal"],"all_known_issues_resolved":true,"rest_todo":["P0 : validation manuelle complète utilisateur données réelles (3 pipelines + 7 modules OUTILS avec vrais fichiers)"],"notes":"Tous points refonte UI connus codifiés et résolus. Reste uniquement validation manuelle utilisateur sur données réelles et décision SessionManager orphelin."}
{"date":"2026-07-19","session":"10 10","lot":"Accessibilité run.command, CorbeauSplat.command","fichiers_modifies":["app/scripts/set_launcher_icon.py","app/gui/managers.py","app/core/notifications.py","tests/test_managers.py","README.md","assets/locales/de.json","assets/locales/en.json","assets/locales/es.json","assets/locales/fr.json","assets/locales/it.json"],"decisions":["run.command CorbeauSplat.command' code/tests/README maj)","set_launcher_icon.py assets/icon.icns NSWorkspace/pyobjc, (3 FR Xcode/Homebrew/pip), --verbose bloquants/erreurs visibles"],"tests":"385 1 15 com.apple.ResourceFork)."}
{"date":"2026-07-19","session":"10","lot":"UI 8 StudioWindow 7 OUTILS (Cleaner/Export/Extractor360/FourDGS/Sharp/SplatTransform/Upscale)","features":["Lot 5 9 OUTILS), COLMAP-only 4DGS","Fix 22 9 PIPELINE)","Lot 7 StudioWindow, ColmapGUI 11 sécurité","SuperSplat VisualiserPanel, factory/relancer QFormLayout (18 WrapLongRows)","Accessibilité run.command CorbeauSplat.command' (NSWorkspace/pyobjc), défaut"],"tests":"385 1 15 bout-en-bout)","decisions":["Chantier UI 8 UI SuperSplat UI câblage)","SessionManager orphelin : décision différée (rebrancher ou supprimer)"],"reste_a_faire":["P0 : validation manuelle complète utilisateur sur données réelles (3 pipelines COLMAP→Brush→Export + 7 modules OUTILS avec vrais fichiers) — aucun outil automatisé ne peut la remplacer","SessionManager : décision technique (rebrancher ou supprimer)"],"notes":"Vérification visuelle/exécution réelle StudioWindow macOS (PySide6, 13 panneaux rendus, sans erreur). Manifest.md mis à jour section RESTE À FAIRE. REFONTE_UI_PROGRESS.md documente tous points fermés. Utilisateur valide maintenant sur sa machine avant prochaine session.","graphify_rebuild":false}
{"date":"2026-07-19","session":11,"lot":"Tests E2E Sharp vidéo + SessionManager restauré + 8 correctifs pipeline/UI","fichiers_modifies":["app/gui/studio_window.py","app/gui/panels/training_panel.py","app/gui/managers.py","tests/integration/test_e2e_sharp.py","app/core/launcher.py","assets/locales/en.json","assets/locales/fr.json","app/gui/rail.py","app/core/notifications.py"],"commits":["60e9ab1","abf6710","bb109e9","9ce3132","d1b7993","f455de1","155b9b9","7a5fc75"],"features":["Test E2E Sharp vidéo réel (ffmpeg → extraction frames → Sharp predict → vérif PLY)","Fix critique câblage pipeline COLMAP→Brush (ColmapWorker/BrushWorker démarrés dans launch())","Restauration SessionManager pour StudioWindow (persiste état panel Source, fusion config.json sûre)","Bouton Lancer manquant module Brush OUTILS","Bottom bar Redémarrer/Quitter + fix bouton supprimer-dataset + viewer (i18n)"],"tests":"385 1 15 360 Extractor","decisions":["SessionManager sauvegarde/restaure COLMAP/Brush/Sharp .venv/bin/python -m 4DGS, 360 UI (3 7 OUTILS)"],"graphify_rebuild":false,"notes":"8 385/386 ré-appliquée SessionManager config.json['last_project']. 8"}
{"date":"2026-08-06","session":12,"lot":"P3 360 4DGS COLMAP degrade","fichiers_crees":["tests/integration/test_e2e_extractor_360.py","tests/integration/_synthetic_video.py","tests/integration/test_e2e_4dgs.py"],"fichiers_modifies":[],"commits":[],"tests":"389 1 24 1 engines/extractor_360/src/, (CLI ring/cube/fibonacci)","decisions":["P5 COLMAP 1 48 1024x768","_synthetic_video.py _synthetic_scene.generate_scene ffmpeg/colmap (~2-3 engines/extractor_360/ 389/390/24"]}
{"date":"2026-08-06","session":12,"lot":"P3 360 4DGS 23/23 corriges","fichiers_crees":["tests/integration/test_e2e_extractor_360.py","tests/integration/_synthetic_video.py","tests/integration/test_e2e_4dgs.py","audit-report-2026-08-06.md"],"fichiers_modifies":["requirements.lock","app/core/engine.py","app/core/base_engine.py","app/core/brush_engine.py","app/core/sharp_engine.py","app/core/upscale_engine.py","app/core/export_engine.py","app/core/superplat_engine.py","app/core/brush_params.py","app/cli/commands.py","app/cli/parser.py","app/gui/panels/source_panel.py","app/gui/panels/upscale_panel.py","app/gui/panels/entrainement_panel.py","app/gui/studio_window.py","app/scripts/set_launcher_icon.py",".gitignore"],"fichiers_supprimes":["verify_imports.py","app/core/ply_utils.py","requirements.lock.bak","config.sync-conflict-*.json upscale_widgets.py"],"decisions":["P3: 360Extractor engines/extractor_360/src/, layout grid->ring correction CLI","P5 Phase A: COLMAP degrade sans nerfstudio, 1 cam x48 frames x1024x768 robuste, _synthetic_video via ffmpeg","Audit 23 findings: C1 urllib3 2.6.3->2.7.0 CVE, C2 delete_project_content validate_path_standalone, I1-I2 factorisation CLI + SIFT defaut, I3 chk_upscale/stabilized retires SourcePanel, I4 TTA+compression UpscalePanel, I5 refine_mode BrushParams persiste, I6 threading.Event bind SuperSplat, I7 clonefile AttributeError catch, I8 Blender 4.x fallback, I9 logs sans SECURITY","M1-M3 verify_imports.py/ply_utils.py/.bak/.sync-conflict supprimes + .gitignore","M4-M8 code mort (Brush no-op, face_enhance, BinaryInstallWorker/ModelDownloadWorker/ModelCard orphelins, _models_dir)","M9 import AppKit + noqa, M10 fallbacks XYZ/OBJ retires, M11-M12 docstrings","Ruff clean, mypy inchange (5 stubs manquants)"],"tests":"389 passed, 1 skipped, 24 deselected, 0 regression","reste_a_faire":["P5 Phase B nerfstudio (.venv_4dgs, ~2-3 j)"],"graphify_rebuild":false}
{"date":"2026-08-07","session":13,"lot":"Audit complet session 2026-08-06 + corrections intégrales (A2-* prefixé)","fichiers_modifies":["app/core/base_engine.py","app/core/brush_engine.py","app/core/brush_params.py","app/core/engine.py","app/core/export_engine.py","app/core/sharp_engine.py","app/core/superplat_engine.py","app/core/upscale_engine.py","app/cli/commands.py","app/cli/parser.py","app/gui/panels/source_panel.py","app/gui/panels/reconstruction_logic.py","app/gui/panels/entrainement_panel.py","app/gui/panels/upscale_panel.py","app/gui/studio_window.py","app/scripts/set_launcher_icon.py",".gitignore"],"fichiers_crees":["audit-report-2026-08-07.md","tests/test_locales.py","tests/test_panel_contracts.py","docs/archive/","app/gui/panels/reconstruction_logic.py"],"fichiers_supprimes":["app/gui/workers.py::PostTrainingWorker","7 docs/archive/"],"decisions":["A2-C1 fail-open/fail-closed 3 GUI reconstruction_logic.py","A2-I2: ExportEngine 2 symlink/hardlink issym()/islnk() 3 np.savetxt, PostTrainingWorker 0 376 633→257 ColmapEngine._prepare_images 5 CC 40→19, MI","A2-I8: (AST, 0 test_locales.py","A2-I9: UpscalePanel.combo_model refresh_models()+ModelDownloadWorker, 4 Extractor360Panel.combo_layout is_amx/neural_engine, verify_integrity/size_on_disk_mb, docs→archive"],"tests":"418 1 24 265 9 alignées","graphify_rebuild":true,"graphify_stats":"2605 4430 193 13: read-only audit-report-2026-08-07.md GUI, PostTrainingWorker (RÉSERVE HEAD)."}
{"date":"2026-08-07","session":14,"lot":"Refonte UI 4 0: ETAT_DES_LIEUX.md (709 1: 4 source_panel.py FPS 5 NoScrollCombo 2: studio_window.py (TopBar 3: 265→272 clés (10 ajoutées, 3 orphelines retirées; faiblesse test découverte: indirection tuple/dict non détectée)","decisions":["Phase 4: refonte rail visuelle (hiérarchie statique 3-level, QSS pur filets d'arbre, QLabel en-têtes, mécanisme fold/unfold supprimé)"],"bugs_corriges":["refine_mode restauré params['refine_mode']=panel.combo_mode.currentData()=='refine' dans _build_brush_worker+_launch_brush"],"incidents":["stash/pop concurrent 3 agents → uv.lock écarté (vérification post-incident: 12 fichiers cibles intacts)","4 sous-agents signalé instructions injectées (faux « tes edits annulés », faux « CRITICAL:texte-seulement »), tous ignorés et rapportés"],"tests":"418 pass, 1 skip, 24 deselected — strictement compte d'avant chantier, ruff clean","reste_a_faire":["Routing mode Sharp/4DGS (combo ne pilote rien encore, Lancer exécute COLMAP+Brush quel que soit le mode)","Validation manuelle macOS données réelles: FPS conditionnel, bannière mélange images/vidéo, chaînage bout-en-bout, molette combos, rail rendus thèmes","Style rail appliqué setStyleSheet littéral non-réactif au changement thème chaud (valeurs figées palette dark)","A2-M3 checksums.json, A2-M8, A2-M14 arbitrages ouverts inchangés"],"graphify_rebuild":false,"notes":"Aucun commit cette session. Arbre partagé ~70 fichiers non-committés. CHANGELOG [Unreleased] reçu entrée bump non-fait."}
{"date":"2026-08-07","session":12,"lot":"Upscale devient une étape du pipeline","fichiers_modifies":["app/core/run_state.py","app/core/pipeline_planner.py","app/gui/rail.py","app/gui/panels/upscale_panel.py","app/gui/panels/source_panel.py","app/core/config_io.py","app/gui/studio_window.py","app/gui/widgets/upscale_widgets.py","CHANGELOG.md","manifest.md"],"fichiers_locales":["assets/locales/ar.json","assets/locales/de.json","assets/locales/en.json","assets/locales/es.json","assets/locales/fr.json","assets/locales/it.json","assets/locales/ja.json","assets/locales/ru.json","assets/locales/zh.json"],"fichiers_tests":["tests/test_pipeline_planner.py","tests/test_run_state.py","tests/test_config_io.py","tests/test_studio_nav.py","tests/test_panel_contracts.py"],"decisions":["PIPELINE_STEPS 6→7 TOOL_KEYS (7→6) PARAMÈTRES UI","Nouveau _FLAG_DEFAULTS","UpscalePanel QScrollArea get_state/set_state collect_config/apply_config","Rail PARAMÈTRES PREMIÈRE _TOOL_ICONS→_STEP_ICONS","Architecture dual-path UpscaleImagesWorker) ColmapEngine)","run_upscale_job() module-level upscale_widgets.py TestWorker UpscaleImagesWorker","Helper UpscaleImagesWorker→<sortie>/<projet>/images_upscaled COLMAP; features"],"tests":"422 1 24 45 1 skipped","i18n":"265→275 (9 46 macOS (7 UI, images/vidéo, <dataset>/images ColmapEngine._prepare_images"}
{"date":"2026-08-07","session":"12 suite","lot":"3 chantiers — Câblage champs orphelins Projet + Suppression presets Brush + Configurations nommées + 360 Extractor pipeline variant","fichiers_modifies":["app/gui/panels/source_panel.py","app/gui/studio_window.py","app/core/brush_engine.py","app/core/brush_params.py","app/gui/panels/entrainement_panel.py","app/gui/settings_window.py","app/core/brush_presets.py","app/core/config_io.py","app/core/run_state.py","app/core/pipeline_planner.py","app/gui/rail.py","app/gui/panels/extractor360_panel.py","app/gui/workers.py","CHANGELOG.md","manifest.md"],"fichiers_locales":["assets/locales/ar.json","assets/locales/de.json","assets/locales/en.json","assets/locales/es.json","assets/locales/fr.json","assets/locales/it.json","assets/locales/ja.json","assets/locales/ru.json","assets/locales/zh.json"],"fichiers_crees":["app/gui/chaining_logic.py","tests/test_chaining_logic.py"],"fichiers_tests":["tests/test_brush_presets.py","tests/test_config_io.py","tests/test_pipeline_planner.py","tests/test_run_state.py"],"decisions":["Chantier 1: checkpoint_dest → BrushWorker sémantique 1.2.3 restaurée (<destination>/<projet>/), keep_only_latest=True, _latest_brush_ply() corrigé resolve_checkpoints_dir(), export_dir/export_format l'emportent chaîne, déduplication listes formats, app/gui/chaining_logic.py module pur Qt-free (resolve_checkpoints_dir, keeps_only_latest_checkpoint, resolve_export_dir, resolve_export_format)","Chantier 2: Bouton 🗑 EntrainementPanel preset UTILISATEUR (Défaut+intégrés non supprimables), Bouton Supprimer SettingsWindow confirmation, brush_presets.is_deletable() pure, piège i18n confirmé documenté (tr().format() sans défaut)","Chantier 3: extraction360 PIPELINE_STEPS 7→8, rail PARAMÈTRES pos 1, double accès PARAMÈTRES+OUTILS (Extractor360Panel indépendantes), _upscaled_images_dir→_pipeline_images_dir, 360→upscale→COLMAP séquentiel"],"tests":"447 passed, 1 skipped, 24 deselected; 45 intégration passed, 1 skipped; ruff clean; py_compile OK","i18n":"275→283 clés/fichier, 9 locales alignées, orphelines retirées","graphify_rebuild":true,"graphify_stats":"2027 noeuds, 3662 aretes, 141 communautes","notes":"CHANGELOG/manifest maj 3 chantiers. Piège outillage: .venv/bin/pytest mort (uv run python -m pytest). Reste: 6 vérifications Mac (rail 360 position, chaîne 360+upscale ordonnée, 🗑 presets, suppr configs, checkpoint_dest, export_dir/format)."}
{"date":"2026-08-07","session":"12 suite (final)","lot":"Démarrage correctifs + Brush épinglage + deptry CI + UI rail/logbar refonte","fichiers_modifies":["app/__init__.py","pyproject.toml","CHANGELOG.md","manifest.md","checksums.json","app/cli/commands.py","app/core/base_engine.py","app/core/brush_engine.py","app/gui/studio_window.py","app/gui/rail.py","app/gui/logbar.py","app/gui/activity_bar.py","app/gui/logs_window.py",".github/workflows/ci.yml","requirements.txt","requirements.lock","tests/test_brush_pinning.py","tests/integration/test_tool_launch_integration.py"],"fichiers_supprimes":["app/gui/logbar.py"],"fichiers_crees":["app/gui/activity_bar.py","app/gui/logs_window.py","tests/test_brush_pinning.py"],"version":"2.0.0-beta.1","decisions":["VERSION 2.0.0-beta.1 (PEP440→2.0.0b1 normalisation packaging); CHANGELOG [Unreleased]→[2.0.0-beta.1]-2026-08-07; manifest.md en-tête+tableau","INCIDENT uv deep-reset recréé .venv de zéro (non causé édition version) — piège uv: uv pip install re-résout contre plages pyproject, défait alignement lock → réappliquer uv pip install -r requirements.lock EN DERNIER","CORRECTIFS DÉMARRAGE ×4: (1) Brush checksums.json pin obsolète → recoupé 3 sources (GitHub API digest, sidecar sha256, sha256.sum amont), v0.3.0 revalidée 65b26313..., fail-closed verify_download_strict() refusait → on_startup_ready() conditionné engine.is_installed(); (2) Message succès mensonger (install() retourne False mais log affichait ✅) → succès conditionné check is_installed(); (3) --clean oubliait .venv_4dgs → tous 4 venvs purgés; (4) trimesh installé en doute hors lock via pip install→contrôle SANS installation, retour erreur+commande réparation, ordre log décalé après contrôles; VALIDATION TERRAIN: Brush v0.3.0 installe OK, log cohérent, no mismatch","ÉPINGLAGE BRUSH STRUCTURE: contradiction conception (install() résolvait DERNIÈRE release, _install_from_release() vérifiait empreinte figée) → checksums.json reçoit brush_release:v0.3.0; get_remote_version() retourne version épinglée mode release; tag amont interrogé INFORMATION SEULE (ℹ️ Brush vX disponible, dépôt épingle vY); repli dur retiré install(); nouvelle _fetch_latest_release_tag() isolée; ❌ DÉLIBÉRÉMENT REJETÉ: sidecar upstream sha256 (même source artefact = pas garantie réelle)","DEPTRY 4 SIGNALEMENTS: requests/urllib3 déclarés PIL/CacheControl-only → retirés requirements.txt/lock/pyproject (DEP002×2); spz/open3d/bpy ignorées DEP003 (compilés extérieurement ou deps opt); CI job lint câblé; deptry added requirements-dev + extra dev","RAIL ORDRE AFFICHAGE: reconstruction, entraînement, upscale, nettoyage, export, visualiser, extraction360 (NOT ordre exécution — 360/upscale lancées avant reconstruction); bouton par clé, pas position → séquence indépendante affichage; ICÔNES: Projet ↧→⌂ (U+2302), Nettoyage ◈→⊘, Extraction360 ◍→⬡ (U+2B21 hexagone); 14 items icône unique; vérification QFontMetrics.inFont() réelle","BARRE BAS BOUTONS COUPÉS: diagnostic MESURE (PySide6 instanciation offscreen) — pas troncature Qt, collage bord (barre 33px @899 dans 900); paddings (8,2,8,2)→(10,6,10,8), barre 43px, marge 8px; taille min 820×560 OK","LOGS REFONTE: logbar.py SUPPRIMÉ→activity_bar.py + logs_window.py; activité en cours + détail + progress + Annuler; journal non-modal encapsule LogsTab, alimenté continu (historique complet pre-ouverture); rail.item_label(key) nomme étape; détail ElideMiddle; BrushWorker log_signal+status_signal; DÉCISION SOLO À CONFIRMER: journal ne s'ouvre jamais (même erreur)","TESTS 456 pass, 1 skip, 24 deselected (export PLY ASCII skip préexistant); ruff clean app/ + tests/; deptry clean; bash -n CorbeauSplat.command OK; GUI instanciation offscreen réelle QT_QPA_PLATFORM=offscreen; graphify update exécuté","RESTE SOLO DÉCISIONS: (1) CollapseState code mort (5 tests test_studio_nav.py) — non supprimée ATTENTE UTILISATEUR; (2) Brush entraînement aucune progression — format Brush v0.3.0 inconnu ATTENTE logs réels utilisateur; (3) Journal ouverture erreur retirée solo À CONFIRMER; (4) Épinglage Brush bumpage manuel version+empreinte par release amont futur; (5) Vérifications GUI chantiers Upscale/Extraction360/Projet/suppressions SUR VRAIES DONNÉES — entièrement à faire"],"graphify_rebuild":false,"pieges":["uv pip install sans version re-résout contre pyproject → défait lock","verify_download_strict() guard fail-closed masque cause réelle (empreinte obsolète, pas réseau)","Sidecar SHA256 upstream fausse garantie (même source = pas protection)","QFormLayout.setRowWrapPolicy pas applicable post-setup (PySide6 timing)"],"caveats":["activity_bar contient solo logs, alias limpide; ancien logbar jamais affichait logs (barre de logs en nom seulement)","Épinglage Brush fragilité résiduelle (bump manuel à chaque release amont)","Tests GUI manquels tests réels (offscreen mock seul)"],"notes":"Troisième et dernière tranche 2026-08-07. Démarrage validé sur terrain utilisateur. Solo decisions attendant confirmation. RESTE À FAIRE inchangé architectural, manque vérifications GUI terrain + Brush progression parsing."}
{"date":"2026-08-07","session":"12 suite (troisième/finale)","lot":"Remous UI finaux — Cancel buttons & ProgressRing","fichiers_crees":["app/gui/widgets/cancel_button.py","app/gui/widgets/progress_ring.py"],"fichiers_modifies":["app/gui/panels/source_panel.py","app/gui/panels/cleaner_panel.py","app/gui/panels/export_panel.py","app/gui/panels/extractor360_panel.py","app/gui/panels/four_dgs_panel.py","app/gui/panels/reconstruction_panel.py","app/gui/panels/sharp_panel.py","app/gui/panels/upscale_panel.py","app/gui/panels/visualiser_panel.py","app/gui/studio_window.py","app/gui/activity_bar.py"],"decisions":["Cancel buttons : retirés barre bas, ajoutés sous Lancer chaque panneau (9 panneaux + CancelButton widget unique)","SplatTransform bouton vide corrigé : btn_run.setText() dans retranslate_ui(), seul panneau manquant","ProgressRing : anneau 52px centré au-dessus Lancer Projet, indéterminé (rotation) pour Brush, déterminé (arc %) pour COLMAP/360/Sharp/Export, masqué hors run","Suivi page automatique supprimé : follow_step() + _auto_follow retirés, page reste sur Projet pendant run, icône rail se met à jour","Orchestration : tous cancel buttons activés ensemble (un worker tourne), coordination via is_running flag partagé"],"tests":"456 passed, 1 skipped, 24 deselected, 0 failed","linting":"ruff clean; deptry clean","status":"Code livré, testé, prêt livraison","reste_a_faire":"Traduction CorbeauSplat.command en anglais","graphify_rebuild":false,"notes":"Remous UI finaux avant nouvelle tâche traduction lanceur. Aucun commit cette session (arbre partagé en attente validation utilisateur)."}
{"date":"2026-08-24","session":1,"lot":"Bugfix upscale SIGBUS + PNG validation","fichiers_modifies":["app/core/upscale_engine.py","app/upscayl_manager.py","app/__init__.py","app/gui/panels/upscale_panel.py","assets/locales/en.json","assets/locales/fr.json","assets/locales/de.json","assets/locales/es.json","assets/locales/it.json","assets/locales/ja.json","assets/locales/ru.json","assets/locales/zh.json","assets/locales/ar.json"],"decisions":["Bug 1 — SIGBUS upscayl ~46% progression: Apple Silicon RAM≥16Go → UpscaleEngine.load_model tile=0 (auto) → upscayl-bin traite image entière GPU, SIGBUS (Vulkan overflow). Fix: tile=0 interdit, tile≥1024 plancher; run_upscayl() retry auto tile/=2 si returncode<0 (tué par signal)","Bug 2a — PNG impossible: browse_input() ouvrait folder picker (get_existing_directory) au lieu file picker. Fix: QMessageBox demande Image/Dossier; get_open_file_name (image.png) ou get_existing_directory (batch). 3 clés i18n (up_browse_kind, up_browse_file, up_browse_dir)","Bug 2b — PIL DecompressionBombError: images photogrammo/drone dépassent Pillow MAX_IMAGE_PIXELS (89Mpx). resize_to_original() levait erreur décompression. Fix: PIL.Image.MAX_IMAGE_PIXELS=None app/__init__.py (import 1er, local desktop OK). Requiert relance app (hot-reload N/A)."],"tests":"456 passed, 1 skipped, 24 deselected; tests/test_locales.py 4 pass (i18n)","graphify_rebuild":false,"reste_a_faire":["Confirmation utilisateur fix MAX_IMAGE_PIXELS post-relance app"],"notes":"Aucun commit cette session (travail non committé, modifications working tree). Session terrain utilisateur rapportant 2 bugs distincts upscale; racines causes isolées + fixes validées tests."}
{"date":"2026-08-24","session":2,"lot":"Bugfixes upscale complets (4 fixes SIGBUS/PNG/nommage/collision)","fichiers_modifies":["app/core/upscale_engine.py","app/upscayl_manager.py","app/__init__.py","app/gui/panels/upscale_panel.py","app/gui/widgets/upscale_widgets.py","assets/locales/en.json","assets/locales/fr.json","assets/locales/de.json","assets/locales/es.json","assets/locales/it.json","assets/locales/ja.json","assets/locales/ru.json","assets/locales/zh.json","assets/locales/ar.json"],"decisions":["Fix 2a PNG: _browse_input() folder→file picker; QMessageBox Image/Dossier + get_open_file_name/get_existing_directory; 3 clés i18n (up_browse_kind/file/dir 9 locales)","Fix 2b PIL: DecompressionBombError >89Mpx (drone/photog); PIL.Image.MAX_IMAGE_PIXELS=None app/__init__.py global (hot-reload N/A, relance app requis)","Fix 3 PNG 16-bit/palette/exotique: upscayl-bin reject 'channels:0'; _copy_as_supported_image() normalise RGB/RGBA via Pillow avant copie temp; fallback copy brut si Pillow échoue; testé PNG 16-bit+palette OK","Fix 4 Nommage: <nom>_<modèle>_x<échelle>.<format> appliqué STAGING (avant upscale), suffixe stable visible sans ouvrir; DownloadWorker dédiée refresh_models()","Fix 5 SIGBUS: tile=0 (auto) → GPU overflow Apple Silicon; tile≥1024 plancher; run_upscayl() retry auto tile/=2 si returncode<0; anneau ProgressRing indéterminé Brush déterminé% autres","Fix 6 Collision: refonte complète run_upscale_job(); staging images source sous nom+suffixe DANS temp AVANT upscayl-bin; upscayl-bin écrit directement nom final; jamais overwrite original; testé batch+single OK","Crash QThread double-clic: _start_tool_worker() garde-fou if existing.isRunning(): return; i18n err_worker_already_running"],"tests":"456 passed, 1 skipped, 24 deselected (inchangé)","graphify_rebuild":true,"graphify_stats":"2629 noeuds, 4774 aretes, 183 communautes","commits":[],"git_state":"working tree modifié non committé (modifs accumulées session 1+2, attente validation terrain)","notes":"Continuation session 2026-08-24 après fix PIL matin. Fix 2-6 complets, testés, prêts. Avertissement 'Langue invalide' config.json non-bloquant (comportement normal first-run). RESTE: validations manuelles Mac réelles sur données réelles (drone/photog) + commit décision utilisateur."}
{"date":"2026-08-24","session":3,"lot":"Versioning & Release v2.0.0-beta.2 + validation finale","fichiers_modifies":["CHANGELOG.md","app/__init__.py","pyproject.toml","README.md","manifest.md"],"decisions":["CHANGELOG.md [2.0.0-beta.2] - 2026-08-24 : section ajoutée documentant 6 fixes upscale (SIGBUS tile auto, PNG validation folder picker, PIL MAX_IMAGE_PIXELS drone, PNG 16-bit/palette normalisation, nommage staging <nom>_<modèle>_x<scale>, file collision run_upscale_job refonte)","VERSION app/__init__.py + pyproject.toml : 2.0.0-beta.1→2.0.0-beta.2","README.md table versions : v2.0.0-beta.2 actuelle listée, descriptifs fixes court-circuités","manifest.md header section Versions : table mise à jour, beta.2 première ligne","Git commit 275f171 : message « chore: Upscale engine fixes & v2.0.0-beta.2 bump » (20 fichiers, 207 insertions)","Tag v2.0.0-beta.2 créé, annoté, poussé origin","Release GitHub créée --prerelease target=beta avec notes détaillées 6 fixes"],"tests":"456 passed, 1 skipped, 24 deselected, 0 failed (inchangé depuis session 2)","graphify_rebuild":false,"graphify_stats":"2633 noeuds, 4783 aretes, 193 communautes (stable)","commits":["275f171"],"git_state":"v2.0.0-beta.2 tagué + poussé origin/beta","release":"GitHub Releases v2.0.0-beta.2 --prerelease créée; notes détaillées incluent 6 bugfixes + test coverage","rest_todo":[],"notes":"Session 3 clôture : versioning + release livrée. Aucun changement architecture RESTE À FAIRE. manifest.md version bump uniquement (contenu RESTE À FAIRE identique)."}
{"date":"2026-08-28","session":1,"lot":"Bugfix 4DGS AppleDouble + Feature Upscale 4DGS + Version control nerfstudio","fichiers_modifies":["app/core/four_dgs_engine.py","app/gui/panels/four_dgs_panel.py","app/gui/studio_window.py","app/gui/workers.py","app/scripts/setup_dependencies.py","assets/locales/en.json","assets/locales/fr.json","assets/locales/de.json","assets/locales/es.json","assets/locales/it.json","assets/locales/ja.json","assets/locales/ru.json","assets/locales/zh.json","assets/locales/ar.json","tests/integration/test_tool_launch_integration.py","tests/test_four_dgs_engine.py","tests/test_setup_dependencies.py"],"fichiers_crees":["app/scripts/installers/four_dgs.py"],"decisions":["Bugfix 1 : FourDGSEngine.process_dataset() filtrait vidéos par extension, ignorant fichiers cachés macOS ._* (AppleDouble, métadonnées USB/disque externe). Scan ajouté exclusion noms commençant ._; test regression test_process_dataset_ignores_appledouble_files (suite 456→457 tests)","Feature 2 : option Upscale avant nerfstudio reconstruction (onglet 4DGS). Réutilise paramètres panel Upscale dédié (modèle/échelle/format/tuiles/TTA/compression). Implémentation: FourDGSEngine.upscale_config, upscale_dataset_images(output_dir), appel post-extraction frames; FourDGSWorker param upscale_params; FourDGSPanel case chk_upscale_before (tr()); studio_window._fourdgs_upscale_params() fusionne réglages. i18n 9 locales (clé four_dgs_upscale_before). Tests: test_upscale_dataset_images_inactive_is_noop, test_upscale_dataset_images_upscales_each_camera_folder","Feature 3 : version control nerfstudio (.venv_4dgs, déjà utilisé four_dgs_engine.py mais non géré dépendances). Nouveau fichier app/scripts/installers/four_dgs.py classe FourDGSEngineDep(PipEngine), dépôt nerfstudio GitHub, ask_before_update=True, désactivé défaut (requiert config.json four_dgs_enabled). setup_dependencies.py register() + __all__. Contrôle déclenché startup _uniquement_ si réinstallation détectée (engines/brush absent). Tests: TestFourDGSEngineDep"],"tests":"461 passed, 1 skipped, 24 deselected, 0 failed (+4 tests nouveaux)","graphify_rebuild":true,"graphify_stats":"2655 noeuds, 4879 aretes, 180 communautes","commits":[],"git_state":"working tree modifié, aucun commit (validation manuelle utilisateur requise avant commit)","notes":"RESTE À FAIRE inchangé (4 points liste manifest.md). Graphify update exécuté post-modifications structurantes."}
{"date":"2026-08-28","session":2,"lot":"Panneau 4DGS — checkbox upscale avant reconstruction + finalisation, puis versioning beta.3","fichiers_modifies":["app/core/four_dgs_engine.py","app/gui/panels/four_dgs_panel.py","app/gui/studio_window.py","app/gui/workers.py","app/gui/rail.py","app/scripts/setup_dependencies.py","app/scripts/installers/four_dgs.py","assets/locales/*.json","tests/integration/test_tool_launch_integration.py","tests/test_four_dgs_engine.py","tests/test_setup_dependencies.py","CHANGELOG.md","app/__init__.py","pyproject.toml"],"decisions":["Finalisation checkbox upscale-before-reconstruction + colmap_only simplifié UI unique Lancer","Rail réorganisé : PARAMÈTRES → ENTRAÎNEMENT + OPTIONS (upscale, nettoyage, export, extraction 360)","FourDGSEngine.upscale_dataset_images() pré-COLMAP, cam_XX → cam_XX_src (no-op si inactif)","Paramètres COLMAP avancés (camera_model, matcher_type, single_camera, sequential_overlap) moteur/CLI/worker, pas UI panneau encore","Versioning beta.3 : 2.0.0-beta.2 → 2.0.0-beta.3, CHANGELOG section ajoutée","Pas de tag/release GitHub (branche beta seulement)"],"tests":"460 pass, 2 skipped, 24 deselected","graphify":"2661 nodes, 4894 edges, 197 communities","commit":"8d03055 (23 fichiers, 361+111, origin/beta)"}
{"date":"2026-09-09","session":1,"lot":"Publication GitHub v2.0.0-beta.3 + refonte Settings/Project panel + investigation SuperSplat","commits":["4 commits poussés origin/beta","tag v2.0.0-beta.3 créé/poussé","release GitHub créée (prerelease)","commit 775392d settings refactoring"],"features":["Publication v2.0.0-beta.3 GitHub (6 commits locaux, tag annoté, release notes structurées)","Refonte panneau General Settings : suppression bloc Load/Save/Delete/Reset, ajout footer centré (nom+version app, lien clickable Changelog)","Refonte panneau Project : nouveau bloc Paramètres actuels (QGroupBox) Load/Save/Delete/Reset (lignes) + Reset rouge (dessous)","i18n : clé settings_changelog_link ajoutée 9 locales"],"investigation":["SuperSplat mise à jour systématique à chaque redémarrage : cause identifiée épinglé HEAD mouvant (très actif, plusieurs commits/jour)","Fix proposé : appliquer pattern release-tag comme Brush (stabiliser versioning)","Fix EN ATTENTE de confirmation utilisateur (choix comportement, pas bugfix mécanique)"],"tests":"460 passed, 2 skipped (inchangé)","git_state":"working tree propre, tout committé/poussé origin/beta","graphify_rebuild":false,"notes":"v2.0.0-beta.3 publiée GitHub. Point ouvert SuperSplat versioning : stratégie décisionnelle différée. Localisation (commentaires français→anglais) : studio_window.py priorité 1 (~67 occurrences) restent en attente."}
{"date":"2026-09-11","session":1,"lot":"Bugfix Brush enchaînement + incident recovery dataset","fichiers_modifies":["app/gui/panels/entrainement_panel.py","app/gui/studio_window.py"],"fichiers_crees":[],"decisions":["Bug 1 INITIAL : Brush ne s'enchaîne pas après COLMAP via bouton local Reconstruction; EntrainementPanel boutons Lancer/Annuler absents (mode standalone=True OUTILS→Brush seulement)","Bug 2 FIX V1 (incorrect) : boutons ajoutés EntrainementPanel câblés _launch_brush() lisant panel.input_path/output_path (champs manuels mode standalone) — ces champs jamais renseignés onglet Training → chemin vide/périmé passé Brush","INCIDENT SÉRIEUX : BrushWorker.run() mode 'new' archive checkpoints via shutil.move(output_dir, backup_dir) — à cause bug v1 output_path pointait racine projet utilisateur → dossier entier DÉPLACÉ vers checkpoints_backup_<timestamp>","Dossier backup retrouvé intact : /Users/frederick/Interweb/wip/LeCorbeau/checkpoints_backup_1789127002 (contient sous-dossiers projets + fichiers .ply ~173Mo) — récupérable renommage manuel, aucune suppression","Bug 3 FIX V2 (correct) : nouvelle méthode StudioWindow._launch_entrainement() réutilisant _build_brush_worker() — chemin dataset = Source panel output_path + nom projet (MÊME chaîne auto), checkpoints via resolve_checkpoints_dir() — PAS champs manuels","Bouton Entraînement câblé _launch_entrainement() ; bouton OUTILS→Brush reste sur _launch_brush() (usage standalone légitime) — pattern aligné _launch_reconstruction","Tests complets deux fois : 463 passed, 1 skipped, 24 deselected chaque fois — pas régression","État utilisateur : rassuré sur récupération, a exprimé vouloir arrêter cette fonctionnalité; décision finale (garder/retirer bouton Lancer Entraînement) EN ATTENTE prochaine session"],"commits":[],"tests":"463 passed, 1 skipped, 24 deselected (deux passes complètes, pas régression)","git_state":"working tree modifié non-committé (app/gui/panels/entrainement_panel.py, app/gui/studio_window.py); aucun push","graphify_rebuild":false,"graphify_note":"graphify update . tenté deux fois refusé : 'WARNING: new graph 2676 nodes but existing 2678. Refusing overwrite — you may be missing chunk files. Pass --force override.' Graph.json reste état commit 898e100, donc légèrement désynchronisé des 2 fichiers modifiés.","rest_todo":["Décision utilisateur finale : garder/retirer bouton Lancer onglet Entraînement après incident","graphify update (graph.json 1 commit derrière) à investiguer/forcer prochaine session si jugé sûr"],"notes":"Session 2026-09-11 : diagnostic complet dual-path Brush (orchestré COLMAP→Brush vs standalone), fix v2 appliqué et validé, incident recovery confirmé utilisateur. Aucun commit effectué cette session. Fichiers non-committé : studio_window.py, entrainement_panel.py. Point critique : utilisateur hésitant fonctionnalité après frayeur archivage accidentel. Graphify garde-fou déclenché mais 2 nœuds manquants expliquent divergence (enquête ultérieure)."}
{"date":"2026-09-11","session":2,"lot":"Audit dépendances tierces + fixes checksums/flags splat-transform + UI Décimer","fichiers_modifies":["app/core/checksums.json","app/core/engines/splat_transform_engine.py","app/gui/tabs/splat_transform_tab.py","assets/locales/en.json","assets/locales/fr.json","assets/locales/de.json","assets/locales/es.json","assets/locales/it.json","assets/locales/ja.json","assets/locales/ru.json","assets/locales/zh.json","assets/locales/ar.json","CHANGELOG.md","manifest.md"],"decisions":["Audit complet 9 outils upstream : upscayl-ncnn, COLMAP/GLOMAP, Brush, ml-sharp, nianticlabs/spz, playcanvas/splat-transform, playcanvas/supersplat, vercel/serve, 360Extractor","Bugs découverts : (1) hash darwin_upscayl dans checksums.json sans release publiée (latent), (2) clés darwin_glomap/linux_glomap orphelines (GLOMAP via colmap global_mapper, pas binaire séparé), (3) flag --summary splat-transform renommé --stats amont, (4) flag --filter-floaters nouveau non intégré, (5) contrainte implicite --decimate exige format .ply en sortie","Fixes appliqués : checksums.json re-hashé (macOS + Linux upscayl-ncnn), clés glomap supprimées, SplatTransformEngine.ALLOWED_FLAGS_BOOLEAN --summary→--stats + ajout --filter-floaters, _launch_splat_transform() valide --decimate + format .ply avec message d'erreur clair, CHANGELOG.md documenté","UI complément : checkbox 'Supprimer îlots isolés' SplatTransformPanel câblé --filter-floaters, champ Décimer grisé automatiquement si format sortie ≠ .ply, i18n 2 nouvelles clés (err_decimate_ply_only, st_filter_floaters) × 9 locales","Feature identifiée non implémentée : flag --export-colmap 360Extractor (génère calibration virtuelle + rig + reconstruct.py), upstream \"qualification expérimentale pending\" → design d'intégration opt-in esquissé manifest.md RESTE À FAIRE point 14"],"pieges":[],"tests":"471 passed, 1 skipped, 24 deselected","commits":["9746c09 (fix: sync checksums.json + splat-transform flags)","0a64f9b (feat: UI checkbox filter-floaters + validate decimate)"],"git_state":"2 commits poussés origin/beta ; graphify rebuild auto post-commit","graphify_rebuild":true,"graphify_stats":"2699 noeuds, 4924 aretes, 185 communautes","notes":"manifest.md mis à jour en session : point A2-M3 marqué résolu, point 14 ajouté (RESTE À FAIRE --export-colmap). Graphify déjà à jour post-commit (AST-only, aucune action supplémentaire). Prochaine étape : rien d'urgent en cours, priorités consultables manifest.md."}
{"date":"2026-09-13","session":1,"lot":"Audit LightGlue/ONNX + recherche LOMA + vérification CoreML accélération","audit":"LightGlue/ALIKED ONNX matcher neuronal COLMAP","recherche_web":"LOMA matcher récent ECCV 2026 Oral (David Nordström)","fichiers_modifies":[],"fichiers_crees":[],"decisions":["Reprise /reprise : État HEAD 0a64f9b (v2.0.0-beta.3), graphe graphify-out/ à jour, aucun fichier modifié hors journal.jsonl, 471 tests pass","Audit demandé : déterminer si LightGlue/ONNX exploitable dans pipeline. Découverte clé CONTREDISANT prémisse : LightGlue/ALIKED DÉJÀ entièrement implémentés depuis commit 8e7af63 (2026-07-17), depuis import initial. Exposés params.py FEATURE_TYPES/MATCHING_TYPES, colmap_commands.py build_feature_extraction/matching, cli/parser.py --feature_type/--matching_type, GUI reconstruction_panel.py combos (rien à débrider)","Vérification macOS installation : COLMAP 4.2.0 Homebrew, onnx/onnxruntime dans dépendances, otool -L confirme libcolmap_feature.dylib linke libonnxruntime.1.dylib → ONNX actif déjà","Point réellement ouvert identifié : LOMA (matcher plus récent que LightGlue), présent binaire COLMAP 4.2.0 mais absent params.py FEATURE_TYPES/MATCHING_TYPES (implémentation partielle)","Recherche web LOMA : intégré PR colmap/colmap#4524 par David Nordström, papier ECCV 2026 Oral « LoMa: Local Feature Matching Revisited », architecture DeDoDe+DaD+LightGlue, plus robuste LightGlue/RoMa benchmarks difficiles (HardMatch/WxBS/InLoc/IMC22). Poids hébergés repo auteur perso, pas asset officiel COLMAP","Vérification technique accélération Mac : cmake/FindDependencies.cmake active COLMAP_COREML_ENABLED inconditionnellement macOS; colmap/feature/onnx_utils.cc mappe use_gpu=true (défaut COLMAP) vers CoreMLExecutionProvider Apple avec repli CPU silencieux. Accélération GPU/Neural Engine via CoreML DÉJÀ active défaut, sans changement code requis — à confirmer logs GLOG_v=2 (attendre 'Enabling CoreML execution provider')"],"conseils_utilisateur":["(1) Vérifier logs CoreML s'active réellement avant considérer gain acquis","(2) Tester ALIKED_LIGHTGLUE run réel plutôt qu'audit statique","(3) Ne pas se précipiter intégration LOMA (poids non officiels, gain non démontré usage réel) — réévaluer si LightGlue insuffisant scènes difficiles"],"manifest_update":"Ajout point 15 section RESTE À FAIRE documentant état LightGlue/CoreML déjà actif + piste LOMA ouverte non implémentée (effectué session)","pieges":[],"tests":"471 passed, 1 skipped, 24 deselected (inchangé, aucun test relancé)","graphify_rebuild":false,"git_state":"working tree clean, aucun commit (audit seul)","notes":"Session audit + recherche : découverte LightGlue/CoreML déjà actif, piste LOMA identifiée (non urgente). Aucun changement code. Manifest.md déjà mis à jour en session (hors périmètre archiviste). Prochaine étape : validation logs CoreML utilisateur avant avancer."}
{"date":"2026-09-15","session":1,"lot":"Audit complet chaînes fonctionnelles bot-en-bout (GUI, code mort, optimisation Apple Silicon)","audit":{"fichier":"audit-report.md","score_global":"6.5/10","bloquants":3,"importants":16,"mineurs":13},"fichiers_crees":["audit-report.md"],"fichiers_modifies":["manifest.md"],"decisions":["Audit délégué agent auditeur (lecture seule, 94 appels outils, ~18 min)","audit-report.md créé daté 2026-09-15, score 6.5/10","3 bloquants: Lancer toujours COLMAP (Sharp/4DGS jamais exécutés), export PLY ASCII cassé, exports GLB/OBJ/XYZ sans couleur (SH→RGB)","16 importants, 13 mineurs documentés audit-report.md","Socle jugé sain: pas injection commande, cycle import, 471 tests 4s","Apple Silicon satisfaisant, réserve alerte Rosetta invisible GUI","Plan d'action 8 lots indépendants pour exécution agent sans contexte","manifest.md +sous-section 🔴 Audit 2026-09-15 résumant 3 bloquants + renvoi rapport"],"pieges":[],"tests":"471 passed, 1 skipped, 24 deselected (inchangé)","graphify_rebuild":false,"commits":[],"git_state":"HEAD 0a64f9b, graphe 2699 nœuds; working tree propre (journal.jsonl seul modifié avant archiviste)","notes":"Audit lecture seule, aucun code modifié. .coverage non-trackée (tests exécutés) — laisser/nettoyer selon préférence. Prochaine: transmettre audit-report.md Fable ou décision exécution corrections."}
{"date":"2026-09-16","session":1,"lot":"Remédiation audit (Lots 0, 1, 3) — chore/quality, fix/safety, fix/export","commits":["42a38cb","26c8cb9","3b31ffc"],"decisions":["Lot 0 (chore/quality): ruff --fix, mypy overrides (AppKit/Foundation/spz), pytest-cov added, coverage baseline 39% (471 tests)","Lot 3 (fix/safety): checkpoint PLY detection (is_checkpoint_ply/find_checkpoint_plys), atomic writes Sharp worker, 485 tests (+14)","Lot 1 (fix/export): PLY ASCII export RGB from SH_C0, no self-export, assimp timeout 300s, export tests +11, 497 total","Lot 2 (C1) explored read-only (_run_pipeline_step hardcode, plan_pipeline correct) then interrupted"],"tests":"497 passed (Lot 1), 1 skipped, 0 failed","git_state":"beta branch, 3 commits non poussés, arbre propre","graphify_rebuild":false,"notes":"Exécution plan remédiation 8 lots issu audit-report.md 2026-09-15 (score 6.5/10, 3 bloquants). RESTE À FAIRE: Lot 2 + lots 4-8."}
{"date":"2026-09-17","session":1,"lot":"Bugfix pip install ModuleNotFoundError + Python fallback + release v2.0.0-beta.4","fichiers_modifies":["CorbeauSplat.command","CHANGELOG.md","pyproject.toml","app/__init__.py","README.md","manifest.md"],"decisions":["Bug external: pip install fails ModuleNotFoundError pkg_resources on pyobjc-framework-Cocoa build from source","Fix #1 (607fdf4): Added setuptools+wheel upgrade in CorbeauSplat.command Phase 3 before dependency sync (new venv lacked pkg_resources)","Release v2.0.0-beta.4: CHANGELOG [Unreleased]→[2.0.0-beta.4] 2026-09-17, versions bumped pyproject.toml app/__init__.py README.md, tag v2.0.0-beta.4 created origin/beta","Fix #2 (3455640): Removed unsafe python3 fallback (could pick untested ≥3.14), PY_CANDIDATES proposes brew install python@3.13, added venv integrity check auto-rebuild if built with >3.13","Phase 0.5 launcher already checks Xcode CLT + Homebrew, proposes install if absent — no changes needed","Release correction: deleted v2.0.0-beta.4 tag/release, recreated on 3455640 (not beta.5—both fixes in single release per user request)"],"commits":["607fdf4 chore(release): bump to v2.0.0-beta.4","3455640 fix(launcher): remove unsafe python3 fallback that could pick an untested Python version"],"tests":"471 passed before both commits","git_state":"beta branch = origin/beta = commit 3455640; .coverage + journal.jsonl untracked (out of scope)","graphify_rebuild":false,"notes":"Session: User bug report via WhatsApp (pip install ModuleNotFoundError). Two distinct fixes (setuptools/wheel + Python fallback) bundled single release v2.0.0-beta.4. GitHub release live with both fixes documented."}
{"date":"2026-09-19","session":1,"lot":"Traduction commentaires FR→EN (LOT 1) + découverte merge conflicts (LOT 2) + formats vidéo (LOT 3) + formats images HEIC (LOT 4)","fichiers_modifies":["app/core/studio_window.py","app/core/engine.py","app/core/run_state.py","app/core/colmap_commands.py","app/core/brush_params.py","app/core/config_io.py","app/core/base_engine.py","app/core/system.py","app/core/brush_presets.py","app/core/params.py","app/core/four_dgs_engine.py","app/core/notifications.py","app/core/sharp_engine.py","app/cli/__init__.py","app/cli/parser.py","app/cli/commands.py","app/scripts/set_launcher_icon.py","app/scripts/installers/base.py","app/scripts/installers/brush.py","app/scripts/installers/mapping.py","app/scripts/installers/tools.py","app/scripts/installers/upscayl.py","app/upscayl_manager.py","app/gui/base_worker.py","app/gui/chaining_logic.py","app/gui/managers.py","app/gui/panels/__init__.py","app/gui/panels/extractor360_panel.py","app/gui/panels/reconstruction_logic.py","app/gui/panels/reconstruction_panel.py","app/gui/panels/upscale_panel.py","app/gui/run_state_binding.py","app/gui/settings_window.py","app/gui/studio_nav.py","app/gui/studio_window.py","app/gui/tabs/logs_tab.py","app/gui/widgets/cancel_button.py","app/gui/widgets/upscale_widgets.py","tests/conftest.py","tests/test_brush_params.py","tests/test_brush_pinning.py","tests/test_brush_presets.py","tests/test_cli.py","tests/test_colmap_engine.py","tests/test_export_engine.py","tests/test_four_dgs_engine.py","tests/test_managers.py","tests/test_ply_cleaner.py","tests/test_setup_dependencies.py","tests/test_sharp_engine.py","tests/test_upscayl_manager.py","tests/test_workers.py"],"fichiers_crees":["app/core/media.py","tests/test_media.py"],"decisions":["LOT 1 (partiel): Scan AST détecta 598 occurrences commentaires FR dans 66 fichiers (manifest annonçait ~76, comptait incomplet). Converti app/ entier (studio_window 95, engine 39, run_state, colmap_commands, brush_params, config_io, base_engine, system, brush_presets, params, four_dgs_engine, notifications, sharp_engine, cli/, scripts/, upscayl_manager, helpers GUI) + tests partiels (colmap_engine, setup_dependencies, workers, four_dgs_engine, cli, upscayl_manager, managers, sharp_engine, ply_cleaner, brush_*, conftest). Non converti: ~65 fichiers tests (test_chaining_logic, config_io, extractor_360_engine, locales, notifications, panel_contracts, pipeline_planner, run_state, run_state_binding, studio_nav, integration/).","LOT 2 (découverte): Audit révéla ~40 fichiers *.sync-conflict-2026-09-19-* (pas manifest.sync-conflict). 4 copies assets/locales/*.sync-conflict-*.json. Fusion manuelle déléguée utilisateur. Conséquence: tests/test_locales.py::test_all_nine_locales_present échoue (*.sync-conflict comptés comme locales) — pré-existant, sans rapport code livré.","LOT 3 (vidéo): Cause identifiée—trois listes extensions recopiées (app/core/engine.py, app/core/four_dgs_engine.py, app/gui/panels/reconstruction_logic.py), limitées mp4/mov/avi/mkv→webm/m4v/mts/ts/insv/mxf ignorés. Nouveau module app/core/media.py: VIDEO_EXTENSIONS (28 conteneurs) + is_video_file(). Trois sites consomment même liste (test _VIDEO_EXTS is VIDEO_EXTENSIONS). Repli FFmpeg: si -hwaccel videotoolbox échoue, commande relancée sans hwaccel (ColmapEngine, FourDGSEngine, SharpEngine via without_hwaccel()).","LOT 4 (images HEIC): COLMAP 4.2.0 lit natif tif/bmp/webp/ppm/gif/tga/HEIC (pas jp2). cv2 exclut HEIC. upscayl-bin accepte jpg/png/webp/ppm/HEIF. Validation empirique: 3 HEIC + 1 TIFF→4 PNG via HEIC decoder empirique. COLMAP EXIF extraction TIFF/PNG/JPEG uniquement (HEIC sans EXIF native macOS). Log explicite ajouté. Défaut PNG conversion (accord utilisateur: pillow-heif non ajouté dépendances). Tests run_upscale_job réel sur 5 images (jpg/tif/bmp/webp/heic) x2 scales (x4, x1) = 5 images upscalées succès."],"pieges":["manifest.md annonçait ~76 commentaires, scan réel=598 (lacune comptabilité Lot 1 et tests/)","~40 *.sync-conflict fichiers révélés (fusion manuelle utile)","HEIC sans EXIF → COLMAP fallback 1.2× côté max (mesurable gap focale)"],"tests":"565 passed, 2 skipped, 24 deselected, 1 failed (test_locales pré-existant)","fichiers_modifies_count":53,"fichiers_crees_count":2,"graphify_rebuild":true,"graphify_stats":"2878 noeuds, 5405 aretes, 192 communautes","commits":[],"git_state":"working tree modifié non-committé (héritée session antérieure, durcissement ply_cleaner/export_engine/sharp_engine + tests + pytest-cov outillage)","rest_todo":["Lot 1 : conversion FR→EN déléguée à utilisateur","Lot 2 : fusion manuelle *.sync-conflict fichiers + validation test_locales","Lot 3 : câblage conversion images upscale depuis GUI validé CLI seulement (non GUI testé)","Lot 4 : sélecteur plage vidéo UI (point-in/point-out + aperçu, stockage ChainConfig, passage -ss/-to ColmapEngine/4DGS/Sharp)"],"notes":"HEAD 0206833, graphe graphify-out/ à jour (graphify update . lancé). Changements Lot 3/4 livrables (media.py complet, tests 69 cas), Lot 1 stoppée en cours (comptabilité revisitée), Lot 2 documentée (action utilisateur). manifest.md déjà mis à jour."}
{"date": "2026-09-20", "session": 1, "lot": "Récupération 2 sessions perdues + audit 8 lots terminé + réparation journal", "fichiers_modifies": [".gitignore", "app/cli/__init__.py", "app/cli/commands.py", "app/cli/launcher.py", "app/cli/parser.py", "app/core/base_engine.py", "app/core/brush_engine.py", "app/core/brush_params.py", "app/core/brush_presets.py", "app/core/colmap_commands.py", "app/core/config_io.py", "app/core/engine.py", "app/core/export_engine.py", "app/core/four_dgs_engine.py", "app/core/notifications.py", "app/core/params.py", "app/core/ply_cleaner.py", "app/core/run_state.py", "app/core/sharp_engine.py", "app/core/superplat_engine.py", "app/core/system.py", "app/core/upscale_engine.py", "app/gui/base_worker.py", "app/gui/chaining_logic.py", "app/gui/managers.py", "app/gui/panels/__init__.py", "app/gui/panels/entrainement_panel.py", "app/gui/panels/extractor360_panel.py", "app/gui/panels/reconstruction_logic.py", "app/gui/panels/reconstruction_panel.py", "app/gui/panels/source_panel.py", "app/gui/panels/upscale_panel.py", "app/gui/panels/visualiser_panel.py", "app/gui/run_state_binding.py", "app/gui/settings_window.py", "app/gui/studio_nav.py", "app/gui/studio_window.py", "app/gui/tabs/logs_tab.py", "app/gui/widgets/cancel_button.py", "app/gui/widgets/upscale_widgets.py", "app/gui/workers.py", "app/scripts/checksums.json", "app/scripts/installers/base.py", "app/scripts/installers/brush.py", "app/scripts/installers/extractor_360.py", "app/scripts/installers/four_dgs.py", "app/scripts/installers/mapping.py", "app/scripts/installers/sharp.py", "app/scripts/installers/tools.py", "app/scripts/installers/upscayl.py", "app/scripts/set_launcher_icon.py", "app/scripts/setup_dependencies.py", "app/upscayl_manager.py", "app/upscayl_models.py", "assets/locales/ar.json", "assets/locales/de.json", "assets/locales/en.json", "assets/locales/es.json", "assets/locales/fr.json", "assets/locales/it.json", "assets/locales/ja.json", "assets/locales/ru.json", "assets/locales/zh.json", "journal.jsonl", "manifest.md", "pyproject.toml", "requirements-dev.txt", "tests/conftest.py", "tests/integration/_synthetic_scene.py", "tests/integration/_synthetic_video.py", "tests/integration/conftest.py", "tests/integration/test_colmap_pipeline.py", "tests/integration/test_e2e_4dgs.py", "tests/integration/test_e2e_extractor_360.py", "tests/integration/test_e2e_pipeline.py", "tests/integration/test_e2e_sharp.py", "tests/integration/test_e2e_upscale.py", "tests/integration/test_security_i18n_integration.py", "tests/integration/test_tool_launch_integration.py", "tests/test_base_engine.py", "tests/test_brush_params.py", "tests/test_brush_pinning.py", "tests/test_brush_presets.py", "tests/test_chaining_logic.py", "tests/test_cli.py", "tests/test_colmap_engine.py", "tests/test_config_io.py", "tests/test_export_engine.py", "tests/test_extractor_360_engine.py", "tests/test_four_dgs_engine.py", "tests/test_locales.py", "tests/test_managers.py", "tests/test_notifications.py", "tests/test_panel_contracts.py", "tests/test_pipeline_planner.py", "tests/test_ply_cleaner.py", "tests/test_reconstruction_logic.py", "tests/test_run_state.py", "tests/test_run_state_binding.py", "tests/test_setup_dependencies.py", "tests/test_sharp_engine.py", "tests/test_studio_nav.py", "tests/test_upscayl_manager.py", "tests/test_workers.py"], "fichiers_crees": ["app/core/media.py", "tests/test_gui_config_roundtrip.py", "tests/test_gui_panel_state_roundtrip.py", "tests/test_journal_integrity.py", "tests/test_media.py", "tests/test_superplat_engine.py", "tests/test_upscale_engine.py"], "decisions": ["Recuperation travail perdu : 40 fichiers *.sync-conflict-* (Syncthing L5MJGGH/Q2GLHKA) analyses un par un. CorbeauSplat.command de l'arbre avait regresse (perte des correctifs v2.0.0-beta.4) -> restaure depuis git HEAD. Reglages pyproject.toml du Lot 0 presents dans AUCUN commit, uniquement dans la copie en conflit -> reinjectes.", "3 commits orphelins retrouves (42a38cb Lot 0, 26c8cb9 Lot 3, 3b31ffc Lot 1 du 2026-09-16) : presents dans l'object database mais rattaches a aucune branche, beta ayant ete refaite depuis leur parent 0a64f9b. Proteges par tag recovery/lots-0-1-3, Lot 3 recupere par cherry-pick + merge, tag supprime apres verification exhaustive (20 symboles, 15 tests, 4 cles i18n x 9 locales).", "Lot 4 (contrats honnetes, I4/I5/I6/I11) : is_safe_path() -> path_exists() (promettait un confinement jamais implemente, aucun appelant applicatif) ; parametre mort project_root supprime ; 3 tests de securite tautologiques reecrits ; docstring de delete_project_content() corrigee (liste blanche annoncee sur un corps en liste noire) ; ExportEngine.is_available() ne retourne plus True en dur ; SharpEngine.is_installed() redefinie et repli sys.executable supprime (lancait Python 3.13 alors que Sharp exige 3.11) ; check_dependencies() elargi et enfin execute par la GUI.", "Lot 5 (convergence CLI/GUI, I7/I8/I9/I10/M9) : I7 deja resolu (constat d'audit perime) ; pipeline enchaine enfin Nettoyage et Export (--clean, --export) ; la CLI utilise resolve_checkpoints_dir() comme la GUI (un projet lance d'un cote et repris de l'autre perdait ses checkpoints) ; is_checkpoint_ply/find_checkpoint_plys deplacees vers chaining_logic.py (sans Qt) ; --sequential_overlap et --guided_matching declares (lus par getattr donc figes silencieusement) ; BooleanOptionalAction. Garde-fou : test parametrique ColmapParams <-> drapeaux CLI, 25 champs, 0 exception.", "Lot 6 (chaine d'approvisionnement, I2/I3/I12/I15/I16/M10/M12) : I16 = le vrai risque securite, ml-sharp / nerfstudio / 360Extractor etaient clones puis reset --hard sur branche par defaut puis COMPILES ET EXECUTES ; EngineDependency accepte un pinned_ref (nerfstudio v1.1.5, 360Extractor v4.0.1, ml-sharp commit aed6527 car ce depot ne publie aucun tag). get_brush_build_mode() interroge brush --help au lieu de supposer release. Heuristique d'echelle upscale supprimee (produisait realesrgan-2plus, modele inexistant). Catalogue Upscayl epingle sur un commit, doublon fusionne avec alias, 10 empreintes SHA256 completees et verifiees, verification passee en FAIL-CLOSED, telechargement en streaming. CORS SuperSplat nommait le mauvais port ; socket lie dans le thread appelant (course sur self.httpd).", "Lot 7 (dette de fond, M4/M11/M13) : BrushWorker.run() 153 -> 36 lignes, decoupee en 7 methodes nommees, comportement d'erreur preserve ; le chemin Refine devient testable ; nouveau test_upscale_engine.py (17% -> 77%) ; conversion FR->EN TERMINEE, 25 fichiers de tests, zero occurrence restante dans tout le depot.", "Decisions utilisateur appliquees : bouton Lancer retire de l'onglet Entrainement (conserve dans OUTILS/Brush) ; linux_brush renseigne dans checksums.json AVEC ACCORD EXPLICITE, depuis le sha256.sum amont et non en re-hachant le telechargement ; dependances manquantes sur 2 niveaux (dialogue si vital, journal sinon) ; alerte Rosetta 2 via rosetta_warning() qui RETOURNE le texte au lieu de warnings.warn (stderr invisible au lancement par l'icone) ; message d'erreur source refait (un format inconnu affichait 'Chemins manquants') ; widget de conversion d'images ajoute au panneau Source, derniere divergence CLI/GUI connue.", "Reparation du journal : 6 enregistrements invalides depuis 6 semaines. Cause trouvee par bissection git = commit 8e7af63 'Import CorbeauSplat v2 (Studio)' du 2026-08-08, pas le code d'ecriture. Chaque ligne avait perdu une cle de tableau et son crochet ouvrant. 2 cles certaines recuperees dans la version pre-corruption, 3 deduites, 1 mise sous 'features' car decisions y existait deja. Contenu preserve au caractere pres. Garde-fou : tests/test_journal_integrity.py."], "commits": ["13fc9ff", "15483db", "0cd043e", "668674c", "aab7a03", "8add898", "bd92507", "dcf1a08", "1cdb207", "0e236ff", "07081fd", "c802679", "71e56c5", "73d6a7d", "cbc3e92", "ac47785", "e64759c"], "pieges": ["Un fichier *.sync-conflict-* peut etre la SEULE copie de travail reel : c'est arrive 2 fois cette session. Ne jamais supprimer en masse.", "json.loads garde le DERNIER doublon de cle et jette le premier, silencieusement. Une reparation qui reutilise une cle deja presente perd exactement le contenu qu'elle recupere.", "tr() consomme le 1er argument supplementaire comme valeur de .format() quand la cle existe : ne pas passer de defaut aux messages a placeholder.", "Les cles i18n doivent etre LITTERALES, pas construites par f-string : le test d'orphelines analyse les appels tr() statiquement.", "Charger une configuration nommee peut DECLENCHER UN TELECHARGEMENT RESEAU : UpscalePanel._on_model_changed() est appele depuis set_state(). NON CORRIGE, a trancher.", "Incident : set_language() appele dans un script de verification persiste dans config.json utilisateur (langue passee a 'ja', restauree a null). Isoler ces appels comme le fait la fixture de test_security_i18n_integration.py."], "tests": "676 passed, 2 skipped, 24 deselected ; ruff et mypy propres sur 79 fichiers ; couverture 39% -> 45%", "couverture": "39% → 45%", "git_state": "beta, 17 commits pousses sur origin, arbre propre", "graphify_rebuild": true, "graphify_stats": "3121 noeuds, 5891 aretes, 209 communautes (avant : 2878/5405/192)", "notes": "Récupération 2 sessions perdues (merge conflicts, CorbeauSplat.command regression). Audit 8 lots terminé (Lots 4/5/7 livrés, 57 tests +, ruff/mypy propres 79 fichiers). Réparation journal 6 enregistrements cassés. Maintenance récurrente: épinglages bumper Brush/SuperSplat/nerfstudio/360Extractor/ml-sharp."}
{"date":"2026-09-20","session":2,"lot":"Correctif effet de bord + fenêtre de sélection vidéo + release beta.5 + M11/M4","commits":["ce38582","c728f1e","e2a38b0","216a464","4d8cecd","8f4e55a"],"fichiers_crees":["app/gui/widgets/video_range_dialog.py","tests/_real_qt.py","tests/test_gui_panel_contracts_live.py","tests/test_upscale_model_download.py","tests/test_video_range.py"],"fichiers_modifies":["app/core/media.py","app/core/engine.py","app/core/params.py","app/core/sharp_engine.py","app/cli/parser.py","app/cli/commands.py","app/gui/panels/source_panel.py","app/gui/panels/upscale_panel.py","app/gui/panels/reconstruction_logic.py","pyproject.toml","CHANGELOG.md","README.md","manifest.md","app/__init__.py","assets/locales/en.json","assets/locales/fr.json","assets/locales/de.json","assets/locales/es.json","assets/locales/it.json","assets/locales/ja.json","assets/locales/ru.json","assets/locales/zh.json","assets/locales/ar.json"],"decisions":["Correctif UpscalePanel._on_model_changed(): ne se tait pas, affiche 'modèle non installé' hors réseau (sinon surprise reportée au traitement)","Fenêtre sélection vidéo (c728f1e): bouton actif seul pour vidéo unique, grisé pour dossier; aperçu FFmpeg (28 conteneurs vs QtMultimedia .mts/.insv/.mxf cassés); VideoRangeDialog → SourcePanel.get_state()[video_trim] → ColmapParams.video_trim_start/end → -ss/-t extract_frames_from_video","Timecode manuel + conseil format (e2a38b0): 90/1:30/00:06.0/1:02:05.2 + conseil .mp4/.mov, broadcast/action-cam","v2.0.0-beta.5 pre-release GitHub (e2a38b0)","M11 refactor long functions (4d8cecd): SharpEngine.process_video_frames 170→97 lignes (3 fonctions extraites), get_parser 302→34 lignes (CLI par sous-commande, équivalence prouvée), SourcePanel._build_center 152→3 sections (non traités: reconstruction/training _build_center, variables locales bloquantes)","M4 coverage (8f4e55a): Qt sous-processus invisibles à coverage → _real_qt.py amorce session enfant; test_gui_panel_contracts_live 13 contrats, 4 panels parallèles (coverage 45%→68%)"],"tests":"774 passed, 5 skipped, 24 deselected ; ruff et mypy propres sur 80 fichiers ; couverture 45% -> 68%","pieges":["-ss -i vs -ss -to -t (ffmpeg compte -to depuis seek); -t duration non -to","QtMultimedia échoue silencieusement .mts/.insv/.mxf"],"git_state":"beta, 6 commits poussés sur origin/beta, arbre propre, release v2.0.0-beta.5 publiée (pre-release)","graphify_rebuild":false}
{"date":"2026-09-20","session":"3 (configuration)","lot":"Audit consommation tokens Claude Code + optimisations config","fichiers_modifies":[],"fichiers_crees":["claude-code-audit.md (audit token consumption, ignored by git)","AGENTS.md.bak-tokens","CLAUDE.md.bak-tokens"],"decisions":["Audit tokens Claude Code: 12 sessions, total 384,29$, moyenne 32,02$, médiane 8,23$. Opus 5 = 91% coût, cache 95,2%, une session = 73% total, manifest.md relue 36x.","Optimisations appliquées (config uniquement, sauvegardes *.bak-tokens): AGENTS.md manifest lu UNE SEULE FOIS/session + graphify query --budget 1500; CLAUDE.md section Compact instructions ajoutée; .claude/settings.json hooks graphify supprimés, model: sonnet; agents auditeur/refonteur opus→sonnet, graphify query --budget 1500 dans 5 agents, orchestrateur.md supprimé (.claude/_backup); audit/refonte test -f graphify-out/graph.json; reprise.md stat sans lire GRAPH_REPORT.md."],"reste_a_faire":["Plan réduction manifest.md, cible ≈8-10 Ko (pas 100 lignes trop denses); validation avant écriture","Utilisateur décide hooks headroom après `headroom perf`","Réglage /effort medium au démarrage session","Changements applicables prochaine session (clear ou redémarrage)"],"notes":"Aucune modification code applicatif. Configuration transparente, économies tokens immédiates pour futures sessions. AGENTS.md + CLAUDE.md + settings.json + 5 agents + reprise.md optimisés.","graphify_rebuild":false}
{"date":"2026-09-20","session":4,"lot":"Audit de code complet + campagne de correction (15 findings)","fichiers_crees":["audit/REPORT.md","audit/FIX_PLAN.md","audit/fix_plan.json","audit/audit.sarif","FIX_REPORT.md"],"decisions":["Audit complet skill code-audit-orchestrator : 7 lots / 103 fichiers / ~286K tokens ; 36 findings fusionnés, 15 vérifiés (14 confirmed + 1 likely, 0% faux positifs), aucun critical/high, 21 en hold","Livrables audit/ (REPORT.md, FIX_PLAN.md, fix_plan.json, audit.sarif) ; modèles locaux scout deepseek-v4-flash, scout2 glm-5.2, vérificateur kimi-k2.7-code ; aucun scanner automatique installé (limite notée)","Campagne de correction skill code-audit-fixer : branche audit-fixes/20260920 (depuis beta 16b5512), baseline ok, 15 findings corrigés en 15 commits (F-013 9a76270, F-003 0a7e871, F-011 132df84, F-001 3a1fcf1, F-006 d9fd89b, F-007 e9a10c6, F-012 3246ec9, F-009 92cfd39, F-008 6b9d09c, F-014 365937c, F-005 d62074f, F-010 f9d31eb, F-015 7d4f32c, F-004 1ce71d6, F-002 e021a67)","Domaines corrigés : perte de données (temp_frames, colmap_reference_frames, splat NaN), fiabilité GUI (closeEvent wait, workers try/except), chaîne d'approvisionnement (pins pip, upscayl, checksum Windows, install try/except, Pillow), outillage audit (recettes hostiles, cmd_apply, cmd_relocate, zizmor)","Tests 774 → 855, suite complète verte, ruff ok, FIX_REPORT.md écrit"],"reste_a_faire":["Reporter les correctifs des 4 scripts de skill vers ~/.config/opencode/skills/ (fixplan.py, run_checks.py, merge_findings.py, tool_scan.py)","21 findings en hold à vérifier","Branche audit-fixes/20260920 non fusionnée (revue humaine requise)"],"tests":"855 passed (774 → +81), suite complète verte ; ruff ok","commits":["15 commits sur audit-fixes/20260920 (F-013→F-002)","aucun commit sur beta"],"git_state":"v2.0.0-beta.5 inchangée ; branche audit-fixes/20260920 non fusionnée (depuis beta 16b5512)","graphify_rebuild":false,"notes":"Aucun critical/high détecté ; 21 findings en hold."}
{"date":"2026-09-20","session":5,"lot":"Point 2 RESTE À FAIRE — Vérification de 21 findings + corrections F-023/F-027","decisions":["2A : copie 4 scripts du skill code-audit vers ~/.config/opencode/skills/ — refusée système, abandonnée (scripts non suivis déjà synchronisés côté installé)","2B : vérification 21 findings F-016..F-036 par sous-agent en lecture seule : 2 CONFIRMÉ (F-023, F-027), 14 CONFIRMÉ-THÉORIQUE, 5 FAUX POSITIF (F-017, F-019, F-025, F-034, F-036)","F-023 corrigé : SuperSplat viewer lié 127.0.0.1, flags `-l tcp://127.0.0.1:port` dans superplat_engine.py (commit ededc26)","F-027 corrigé : upscale deux images même nom base ne s'écrasent plus, extension ajoutée en cas collision dans upscayl_manager.py (commit 7cf0e90)","CHANGELOG beta.5 mise à jour : 15 correctifs d'audit + F-023/F-027, compteur tests 854, commit b8aa759","GitHub : branche beta fast-forward 16b5512→b8aa759 (15 commits audit + 3 fusionnés = 18 total), ancien tag v2.0.0-beta.5 supprimé et recréé annoté sur b8aa759, pré-release recréée avec notes CHANGELOG"],"fichiers_modifies":["app/core/superplat_engine.py","app/core/upscayl_manager.py","CHANGELOG.md"],"non_commites":["manifest.md","journal.jsonl","audit/","code-audit-skills.zip","4 scripts du skill (build_report, chunk_repo, graph_tool, project_docs)"],"commits":["ededc26","7cf0e90","b8aa759"],"tests":"854 passed, 5 skipped","graphify_rebuild":false,"git_state":"branche audit-fixes/20260920 : 18 commits d'avance sur main ; beta fast-forward appliquée","rest_todo":["19 findings hold restants (F-016,F-018,F-020-F-021,F-024,F-026,F-028-F-033,F-035)","5 faux positifs à écarter (F-017,F-019,F-025,F-034,F-036)","Validation manuelle GUI sur Mac (M8/M11)","Bump manuel épinglage Brush"],"notes":"Sessions 3-4 du 2026-09-20 : audit code-audit, skills orchestrator (scout/scout2/kimi). Session 5 : vérification findings + 2 correctifs livrés. 14 CONFIRMÉ-THÉORIQUE = durcissement/doc/configs ; les plus utiles : F-029 F-030 F-032 F-022 (configs corrompues). Non-committés : manifestement audit/ du skill, code-audit-skills.zip du téléchargement, 4 scripts du skill non suivis (build_report/chunk_repo/graph_tool/project_docs)."}
{"date":"2026-09-20","session":6,"lot":"Mise à jour README v2.0.0-rc1 + finalisation avant 2.0.0 final","fichiers_modifies":["README.md","app/__init__.py","pyproject.toml","CHANGELOG.md","manifest.md",".gitignore"],"decisions":["README sections réécrites (What it does, How to Use, chaîne en clic, vidéo, conversion images, galerie Upscale, configs nommées)","assets/interface.png optimisée 362 Ko → 72 Ko","Sections Versions & Branches + historique retirées README à demande utilisateur",".serena/ et opencode.multimodel.json ajoutés .gitignore + sortis suivi git","Version bumpée 2.0.0-rc1 : app/__init__.py + pyproject.toml, CHANGELOG rc1","manifest.md mis à jour","code-audit-skills/ restauré (4 scripts supprimés causaient 19 tests échec) → 852 pass, 7 skip","Fusion branche beta dans main avance directe 120 commits","Création branche v1 depuis ancien main (1.5.1)","Tag + release GitHub v2.0.0-rc1 recréés 37791a4, marqués Latest","Issue #7 (4DGS/nerfstudio/av Python 3.13) vérifiée obsolète, fermée avec commentaire"],"caveats":["CI github-actions non vérifiée post-push main — valider manuel Mac avant 2.0.0 final"],"rest_todo":["Validation manuelle GUI Mac (points 6-7 manifest)","Bump Brush final 2.0.0"],"commits":["37791a4","4e68a00","66858c7","6c3b0c2","e8c62ab"],"git_state":"main à jour, beta fusionnée, v1 créée","graphify_rebuild":false}
{"date":"2026-09-22","session":7,"lot":"Validation upscale + correction conversion images depuis <projet>/images/","fichiers_modifies":["app/core/engine.py","tests/test_media.py","tests/test_colmap_engine.py"],"decisions":["T1 VALIDÉ : câblage conversion d'images ↔ Upscale interface ; script Qt réel offscreen (upscayl-bin, sips), dossier mixte jpg/tif/bmp/webp/heic ; chaîne Source → Upscale → Reconstruction ; 5 PNG dans images_upscaled/, transmission vers Reconstruction confirmée, originaux intacts","T1 écart mineur non corrigé : filtre sélecteur 'Parcourir › Image' (app/gui/panels/upscale_panel.py:242) limité png/jpg/webp/tif (HEIC/BMP par glisser-déposer/saisie)","T2 corrigé : quand Source pointe <projet>/images/ lui-même, conversion sautée & redimensionnement écrasait originaux ; implementation engine.py : _collect_source_images → _move_project_images_aside() déplace images/ → images_src/ (protocole upscale) puis reconstruit images/ converti","T2 robustesse : si images_src/ existe sans sentinelle, copie ignorée (originaux préservés) ; _run_upscale : images_src/ existant + images/ contient images → upscale depuis images/ vers images_upscaling/ puis basculer vers images/ (bruts HEIC/TIFF non transmis upscayl)","Décision utilisateur : réutiliser images_src/ plutôt que dossier dédié","Tests ajoutés : test_media.py ×2, test_colmap_engine.py ×1 ; graphify update . exécuté"],"tests":"857 passed, 5 skipped","git_state":"modifications non commitées (app/core/engine.py, tests/test_media.py, tests/test_colmap_engine.py)","rest_todo":["Commit engine.py + tests","Validation GUI Mac (points 6-7 manifest)","CI post-push","Filtre Parcourir upscale_panel"],"graphify_rebuild":true,"notes":"Workflow inchangé. T1 intégration complète validée. T2 robustesse augmentée quand source=<projet>/images/. Commit + validation macro non effectués en fin session."}
{"date":"2026-09-22","session":"8 — Tests e2e + 3 correctifs","lot":"Validation chaîne 360 + bugfix format/scan/prefill","fichiers_modifies":["app/core/engine.py","app/gui/panels/extractor360_panel.py","app/gui/widgets/upscale_widgets.py","app/gui/chaining_logic.py","app/gui/studio_window.py","tests/test_chaining_logic.py","tests/test_upscale_staging.py","tests/test_gui_config_roundtrip.py"],"decisions":["Test e2e réel : StudioWindow.launch() tous drapeaux (blur, undistort, upscale×2, Brush 200 steps, clean, export spz, SuperSplat) ; images OK 124s, vidéo OK 280s, 360 initial fail","Correctif 1 : extractor360_panel.py combo format envoyait 'jpeg' (refusé, accepte jpg/png/tiff) → item data 'jpg'/'png', get_params via currentData(), set_state via findData() compat 'jpeg'→'jpg'","Correctif 2 : upscale_widgets.py run_upscale_job scan non-récursif dossier → sortie 360Extractor parfois images_360/equi_processed/ → 0 image upscalée → COLMAP 'No matches'. Désormais rglob trié ; _staged_names(root=) dédoublonne stems sous-dossiers différents (tag sous-dossier+ext)","Correctif 3 : studio_window.py + chaining_logic.py sorties Nettoyage/Export préremplies collaient premier projet en 2e session ; is_chain_owned() + dict self._chain_prefilled : chaîne remplace ce qu'elle écrit, garde valeur utilisateur"],"tests":"3 tests ajoutés ; suite 865 passed, 5 skipped, 0 failed ; ruff + mypy OK","graphify":"graphify update exécuté","validation":"360 extraction JPEG→8 vues, upscale 1024×1024 OK ; COLMAP échoue texture synthétique (limite image test, pas app)","graphify_rebuild":false,"reste_a_faire":["Commit","Valider reconstruction 360 vrai panorama/vidéo"]}
{"date":"2026-09-23","session":9,"lot":"Audit version stable","fichiers_modifies":["CLI.md","app/cli/__init__.py","app/cli/commands.py","app/cli/parser.py","app/core/engine.py","app/core/four_dgs_engine.py","app/core/media.py","app/core/sharp_engine.py","app/core/superplat_engine.py","app/core/sparse_models.py","app/core/brush_refine.py","app/gui/chaining_logic.py","app/gui/managers.py","app/gui/panels/cleaner_panel.py","app/gui/panels/entrainement_panel.py","app/gui/panels/export_panel.py","app/gui/panels/extractor360_panel.py","app/gui/panels/reconstruction_panel.py","app/gui/panels/sharp_panel.py","app/gui/panels/source_panel.py","app/gui/panels/upscale_panel.py","app/gui/studio_window.py","app/gui/tabs/logs_tab.py","app/gui/workers.py","app/gui/widgets/upscale_widgets.py","assets/locales/ar.json","assets/locales/de.json","assets/locales/en.json","assets/locales/es.json","assets/locales/fr.json","assets/locales/it.json","assets/locales/ja.json","assets/locales/ru.json","assets/locales/zh.json","manifest.md"],"decisions":["Audit structuré 9 lots (L1-L6 audits statiques, L7 e2e, L8 correctifs, L9 clôture) ; rapports docs/AUDIT_STABLE.md + docs/audit-stable/lot-*.md","78 défauts relevés, 51 corrigés avec régression tests ; 1005 pass/5 skip, ruff/mypy propres","E2E réels : 4DGS 4/4, Sharp+Upscale+360 17/17 ; pipeline COLMAP+Brush relancé en fin session","Nouveaux modules : sparse_models.py (promotion grand modèle), brush_refine.py (reprise partagée)","Défauts bloquants : D1 reprise COLMAP jamais câblée, L5-01 Sharp isolation, L5-02 PLY manquant, L2-01 Upscale jpeg, L2-07 extract360 layout, F-02 4DGS mono, F-03 COLMAP sparse, F-01 FFmpeg 9 -vsync","Décisions : L3-05/L5-08 non câblés, L5-07/D3 à l'utilisateur, L6-01 bloqué (config.json), version non bumpée, aucun commit"],"tests":"1005 passed, 5 skipped, 0 failed","graphify_rebuild":false,"reste":["Lire résultat e2e pipeline","Décisions utilisateur (L3-05, L5-07, D3, L6-01, rc2)","Commit selon utilisateur"]}
{"date":"2026-09-23","session":9,"suite":"L6-01_L3-05_L5-08_stable","files_modified":["app/core/notifications.py","app/gui/studio_window.py","app/gui/settings_window.py","app/__init__.py","pyproject.toml","manifest.md","CHANGELOG.md","docs/AUDIT_STABLE.md"],"files_created":["tests/test_audit_lot9_wiring.py","app/core/brush_refine.py","app/core/sparse_models.py"],"decisions":["L6-01 accord\u00e9 (write config.json)","L3-05/L5-08 wired into StudioWindow chain logic","Version 2.0.0 stable"],"implementations":["L6-01: notifications_enabled in config.json, get_saved_enabled/save_enabled pattern same as theme","L3-05/L5-08: _start_tool_worker(post_steps, ply_root, producer_label); _on_tool_finished returns control to chain; single finished_signal slot; _tool_ply_root/_tool_producer_label used by successors"],"tests_modified":["test_reconstruction_standalone_chaining.py rewritten","test_tool_launch_integration.py (run_state added)"],"test_results":"1023 pass, 5 skip; ruff clean, mypy clean; graphify update done","version":"2.0.0 stable (2026-09-23)","uncommitted":true,"pending":["L5-07","D3","L6-02/L6-04","10 backlog items"],"graphify_rebuild":true,"lot":"L6-01/L3-05/L5-08 stabilisation version 2.0.0"}
{"date":"2026-10-07","session":1,"lot":"Cl\u00f4ture session 2.0.0 + release 2.0.1 + 1 test fix","fichiers_modifies":["CHANGELOG.md","app/__init__.py","pyproject.toml","manifest.md","tests/test_journal_integrity.py"],"decisions":["Backlog audit 2.0.0 trait\u00e9 : D9 (Brush d\u00e9faut RunState), D8/D13 (ReconstructionPanel \u00e9tat Source), D5/L3-08/L3-11/L5-10 (commentaires document\u00e9s)","Utilisateur : L5-07 limite accept\u00e9e, D3 FPS GUI video=5 partout, L6-02 launcher + confirmation DependencyManager, L6-04 README uniquement","Version 2.0.1 : CHANGELOG, app/__init__.py, pyproject.toml, manifest.md ligne 3","Commits 75f3ed9 et 7feb53a push\u00e9s origin/main, tag v2.0.1 cr\u00e9\u00e9","Test journal_integrity fail : journal.jsonl ligne 62 champ lot manquant \u2014 corrig\u00e9"],"tests":"1024 passed, 7 skipped","commits":["75f3ed9 release: 2.0.1","7feb53a fix: close audit backlog (Brush default in RunState, clean colmap config, FPS 5, ask before startup install)"],"git_state":"main \u00e0 jour, v2.0.1 tagg\u00e9 et push\u00e9","reste_a_faire":["D14, D18 (=L6-04), M11, M8, E2E 4DGS phase B","Validation manuelle Mac (points 6-7 manifest, point 2 valid\u00e9)","Modifications untracked : LICENSE, Makefile, assets/icon*, interface.webp"],"graphify_rebuild":false}