From 3e5c07249a6a97a78f3bc5cf2df567e6587509a0 Mon Sep 17 00:00:00 2001 From: digital-garbage <133010426+digital-garbage@users.noreply.github.com> Date: Thu, 3 Sep 2026 18:59:47 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20close=20a=20gap=20in=20the=20H3=20disabl?= =?UTF-8?q?e=20pass=20=E2=80=94=20output=5Fguidance=20snapshot=20and=20Dyn?= =?UTF-8?q?aShift=20capture?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both were captured "regardless of the toggle" by original design (so turning guidance on later works immediately), which meant they kept running on H3 even after output_guidance/dynashift were forced off — exactly the kind of function the "disable everything unrelated to REINS" pass was supposed to catch, missed because the capture point predates any toggle check. Confirmed live: the user's own log showed "DynaShift negative bank updated — 1 entry" after the rest of the disable pass had already landed. --- conditioning.py | 4 +++- samplers.py | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/conditioning.py b/conditioning.py index 9da9ccd5..de01de64 100644 --- a/conditioning.py +++ b/conditioning.py @@ -10208,7 +10208,9 @@ class FunPackVideoRefinerV2(FunPackVideoRefiner): # discard otherwise. Separate from the value-function block above because # wrong_appearance is deliberately NOT reward-admissible there (repair # semantics), yet it is the canonical intrusion signal here. - if has_previous_run and refinement_key and not learning_profile.get("skip_learning"): + # NOT on H3 -- dynashift (the only reader of this bank) is forced off there, and + # the sampler no longer captures a pending latent for it either. + if has_previous_run and refinement_key and not learning_profile.get("skip_learning") and not _is_h3: try: try: from .negative_memory import consume_pending, is_negative_profile diff --git a/samplers.py b/samplers.py index 782e828f..155cdbee 100644 --- a/samplers.py +++ b/samplers.py @@ -8266,7 +8266,12 @@ class FunPackLTXAVSceneChainSampler: if self._is_nested(_snap): _parts = [t for t in _snap.unbind() if isinstance(t, torch.Tensor) and t.numel() > 0] _snap = max(_parts, key=lambda t: t.numel()) if _parts else None - if isinstance(_snap, torch.Tensor): + if isinstance(_snap, torch.Tensor) and not self._is_h3: + # NOT on H3: this snapshot only ever feeds output_guidance's value function + # and DynaShift's negative bank, both forced off for H3 (see self._is_h3 + # override above) — capturing it here anyway would just be banking video + # latents nothing ever reads, the same waste the "disable everything unrelated + # to REINS" pass was for. self._save_output_value_snapshot(refinement_key_input, _snap, None) # DynaShift pending candidate: same run/rating pairing as the snapshot, but # the RAW video latent (fp16) — the rating decides whether it becomes a