@@ -116,8 +116,7 @@ def test_adversarial_bash_result_python_path_wraps_in_code_fence() -> None:
116116 code fence, neutralising the XSS vector as inert literal text.
117117
118118 Negative control: if the code fence were removed from ``_render_tool_result``
119- (renderer regressed to raw prose), ``opening_fence`` below would be None and
120- the assertion would fail — a diverging renderer cannot pass this test.
119+ (renderer regressed to raw prose), the odd-fence check below would fail.
121120 """
122121 parsed = _parse_tool_result (_adversarial_bash_tr ())
123122 assert parsed is not None
@@ -140,13 +139,13 @@ def test_adversarial_bash_result_python_path_wraps_in_code_fence() -> None:
140139 assert payload_indices , "adversarial payload must appear in at least one output line"
141140
142141 payload_idx = payload_indices [0 ]
143- opening_fence = next ((i for i in fence_indices if i < payload_idx ), None )
144- closing_fence = next ((i for i in fence_indices if i > payload_idx ), None )
145-
146- assert opening_fence is not None , (
147- f"no opening code fence before payload at line { payload_idx } ; "
148- "payload is exposed in bare Markdown prose — Python renderer diverged"
142+ fences_before = [i for i in fence_indices if i < payload_idx ]
143+ assert len (fences_before ) % 2 == 1 , (
144+ f"payload at line { payload_idx } must sit inside an open code fence "
145+ f"({ len (fences_before )} fence marker(s) before it); "
146+ "bare prose between fenced blocks would still pass a naive before/after check"
149147 )
148+ closing_fence = next ((i for i in fence_indices if i > payload_idx ), None )
150149 assert closing_fence is not None , (
151150 f"no closing code fence after payload at line { payload_idx } ; "
152151 "code fence is unclosed — Python renderer diverged"
0 commit comments