@@ -99,6 +99,13 @@ def _effective_profile(profile: str, taint_level: str) -> str:
9999 return profile
100100
101101
102+ def _expected_witness_taint_level (taint_level : str ) -> str :
103+ # Engine contract: unknown and untrusted inputs normalize to untrusted.
104+ if taint_level in {"unknown" , "untrusted" }:
105+ return "untrusted"
106+ return taint_level
107+
108+
102109def _target_for (category : str , sink_type : str , variant : int ) -> str :
103110 if sink_type == "shell.exec" :
104111 return (
@@ -201,7 +208,24 @@ def test_expanded_attack_pack_blocks(case: ExpandedAttackCase) -> None:
201208 decision = runtime .evaluate (request )
202209
203210 assert decision .decision == "block"
211+ assert decision .sink_type == case .category .sink_type
212+ assert decision .target == case .target
204213 assert decision .reason_code == case .category .expected_reason_code
205214 assert decision .annotations .get ("effective_policy_profile" ) == case .expected_profile
206- assert runtime .last_witness is not None
207215
216+ witness = runtime .last_witness
217+ assert isinstance (witness , dict )
218+ assert witness .get ("request_id" ) == decision .request_id
219+ assert witness .get ("decision" ) == "block"
220+ assert witness .get ("reason_code" ) == case .category .expected_reason_code
221+ assert witness .get ("sink_type" ) == case .category .sink_type
222+ assert witness .get ("target" ) == case .target
223+
224+ provenance = witness .get ("provenance" )
225+ assert isinstance (provenance , dict )
226+ assert provenance .get ("source" ) == f"{ case .category .name } _payload"
227+ assert provenance .get ("taint_level" ) == _expected_witness_taint_level (case .taint_level )
228+ markers = provenance .get ("taint_markers" )
229+ assert isinstance (markers , list )
230+ assert case .category .name in markers
231+ assert f"variant_{ case .variant :02d} " in markers
0 commit comments