class StructuredScanner:
"""Scan nested structured payloads (dict/list/scalar) at input boundary."""
def __init__(self, classifier: Classifier, policy_engine: PolicyEngine, audit_logger: AuditLogger) -> None:
self._classifier = classifier
self._policy_engine = policy_engine
self._audit = audit_logger
def scan(self, payload: Any, *, agent_id: str = "unknown") -> StructuredScanResult:
detections, path_map, nodes_scanned = _collect_detections(payload, self._classifier)
tags = sorted({item.tag for item in detections})
decision = self._policy_engine.evaluate(
PolicyContext(boundary="input", data_tags=tags, agent_id=agent_id)
)
filtered = _apply_payload_action(payload, path_map, decision.action)
self._audit.emit(
AuditEvent(
boundary="input",
action=decision.action,
policy_name=decision.policy_name,
reason=decision.reason,
data_tags=tags,
agent_id=agent_id,
metadata={
"phase": "structured_scan",
"nodes_scanned": nodes_scanned,
"detections": len(detections),
},
)
)
return StructuredScanResult(
original=payload,
filtered=filtered,
detections=detections,
decision=decision,
)