# SYNOMAP DIGEST V4 — Bloc D (qB Cohérence) [CONTEXT] Bloc D = alignement entre: - intention ABC (A/B/C), - état qB (save_path, tags, status). Executed AFTER: E (map ok), G (FS ok), ABC (intent decided). [PHILOSOPHY] D1c hybrid: - If qB SAFE -> qB must conform to ABC. - If qB UNSAFE -> no corrections, protect torrent. [STATES] D0: qb_consistent D1: save_path_mismatch D2: tag_mismatch D3: unsafe_status [UNSAFE_MIN] Status in { error, missingFiles, metadataError, ioError, stalledUP_with_error, checkingResumeData_blocked, unknown } Tag for D3: SYNO_ERR_UNSAFE. [PROFILE_ABC] derive_expected_profile(ABC_state): A -> expect_save_path=/data ; tags: none required B -> expect_save_path=/data ; tags: {SYNO} C -> expect_save_path=/syno ; tags: {SYNO_OK} [ALGO] for each torrent where E_ok && G_ok && ABC_state known: status = qb.status(torrent) # 1) UNSAFE if status in UNSAFE_MIN: qb.add_tag(torrent, "SYNO_ERR_UNSAFE") log("D3_UNSAFE_STATUS", status) continue # no corrections # 2) SAVE_PATH mismatch expected_path = profile.save_path(ABC_state) if qb.save_path(torrent) != expected_path: qb.setLocation(torrent, expected_path) # R-ONCE qb.refresh_state(torrent) log("D1_SAVE_PATH_MISMATCH_fixed") continue # 3) TAG mismatch expected_tags = profile.tags(ABC_state) if not tags_match(qb.tags(torrent), expected_tags): qb.set_tags(torrent, expected_tags) # R-ONCE qb.refresh_tags(torrent) log("D2_TAG_MISMATCH_fixed") continue # 4) CONSISTENT log("D0_QB_CONSISTENT") [POLICY] - One strong correction per torrent/run (R-ONCE). - No while-loop; next attempts happen in next runs. - No ABC/D actions when status is UNSAFE. [OUTPUT] Bloc D v4 ready for integration in global Loop Spec.