@@ -454,7 +454,14 @@ async def _run_serial_phase(
454454 if result .modified_payload is not None :
455455 if apply_modifications :
456456 current_payload , decision_plugin_name = self ._apply_payload_modification (
457- hook_ref , result , effective_payload , policy , hook_type , current_payload , decision_plugin_name
457+ hook_ref ,
458+ result ,
459+ plugin_input ,
460+ policy ,
461+ hook_type ,
462+ current_payload ,
463+ decision_plugin_name ,
464+ apply_to = effective_payload ,
458465 )
459466 else :
460467 logger .debug (
@@ -510,9 +517,17 @@ def _apply_payload_modification(
510517 hook_type : str ,
511518 current_payload : Optional [PluginPayload ],
512519 decision_plugin_name : Optional [str ],
520+ * ,
521+ apply_to : Optional [PluginPayload ] = None ,
513522 ) -> tuple [Optional [PluginPayload ], Optional [str ]]:
514523 """Apply a plugin's payload modification, respecting the hook policy.
515524
525+ Args:
526+ effective_payload: The baseline payload the plugin received (may be
527+ an isolated/CoW copy). Used for diffing to detect changes.
528+ apply_to: The canonical pipeline payload to merge accepted changes
529+ into. When ``None``, changes are applied to *effective_payload*.
530+
516531 Returns:
517532 Updated (current_payload, decision_plugin_name) tuple.
518533 """
@@ -521,7 +536,7 @@ def _apply_payload_modification(
521536 effective_payload , BaseModel
522537 ):
523538 # Same-type BaseModel payload — apply field-level policy filtering
524- filtered = apply_policy (effective_payload , result .modified_payload , policy )
539+ filtered = apply_policy (effective_payload , result .modified_payload , policy , apply_to = apply_to )
525540 if filtered is not None :
526541 return filtered , hook_ref .plugin_ref .name
527542 else :
0 commit comments