Synomap – Loop Specification v1 – Bloc ABC (flux normal, seedtime-only) ------------------------------------------------------------------------------- ID : Synomap_Loop_Spec_v1_ABC Date : 2025-11-16 Périmètre : flux normal (sans erreurs) pour un torrent géré par Synomap Hypothèse v1 : condition de seed basée uniquement sur le seeding time (ratio ignoré) 0. Objet et périmètre Ce document décrit la spécification fonctionnelle du Synomap Loop pour les états normaux : A = STATE_A_NEW_MAPPED B = STATE_B_MIRROR_CREATED_SAVE_ON_DATA C = STATE_C_OK_SYNO Les états « anormaux » seront traités dans des documents séparés (v2, v3…). 1. Hypothèses générales 1.1 Topologie des chemins - OMV : /data/torrents/completed/{sonarr,radarr} - Synology : /syno/torrents/completed/{sonarr,radarr}, /syno/Series, /syno/Films 1.2 Mapping canonique - mapping_entries.txt est la seule source de vérité du couple (SRC_ABS, DST_ABS) - Une seule entrée par torrent pour ce document. 1.3 qBittorrent - save_path, seeding_time, tags (SYNO, SYNO_OK) sont utilisés. 1.4 .state - Sert uniquement au debug, ne pilote pas la logique ABC. 2. Stratégie globale 2.1 Chemin cible - Stratégie : S2_SYNO_CENTRIC → save_path final doit pointer vers Synology. 2.2 Condition de seed (v1) - SeedConditionPassed = true ↔ seeding_time >= seuil - ratio ignoré (config.ratio_threshold = -1) 3. Invariants du bloc ABC - A→B→C possible dans un run si toutes les conditions sont remplies. - Un seul essai qB par torrent/run, avec relecture obligatoire. - Aucun passage d’état sans confirmation qB. - C est un point fixe : aucun I/O, aucun setLocation. 4. Modèle d’état 4.1 État A - mapping OK, SRC présent, DST absent, save_path=/data. - Actions : créer miroirs ; si seed OK → migration qB possible dans ce run. 4.2 État B - mapping OK, SRC OK, DST OK, save_path=/data. - SeedConditionPassed=false : poser/maintenir SYNO. - SeedConditionPassed=true : setLocation vers Syno + relecture → si OK → SYNO_OK. 4.3 État C - mapping OK, SRC OK, DST OK, save_path=Syno, SYNO_OK, seed OK. - Actions : SKIP total. 5. Logique de boucle - Observer → Classer → Appliquer une séquence max. - A : créer DST, puis éventuellement migrer vers C. - B : migrer si seed OK ; sinon SYNO. - C : SKIP. 6. Tags - SYNO posé lorsque DST est créé. - SYNO_OK posé lorsque migration qB+seed OK est confirmée. 7. Limitations - Ne couvre pas : mapping_ambiguous, unknown_category, DST manquant, timeouts qB persistants, ratio actif.