857d2b8d57
action_process_image_* — the process an alert is about, the child a prevention module blocked — was mapped nowhere in get_incidents_full, so its command line existed only inside raw. It fills process.*, the group the SentinelOne and Carbon Black mappers reserve for the process acted upon. Its ancestry lands in process.lineage as OCSF Process objects, root-first; a generation XDR leaves null drops out instead of showing as an empty level. Every alert's chain also travels under a process_tree context key, not an OCSF field: process.lineage is the ancestry of ONE process, and an XDR incident groups N alerts each with its own chain. Nodes carry their role because the chain is positional — action_process_instance_id is null and the *_causality_id fields name the causality group, not the node. Also mapped: actor pid and MD5, the causality actor's command line, endpoint FQDN/domain/MAC/OS build, protection module, agent version, alert id, the incident id as the shared correlation key, activity kind, and the registry/DNS/user-agent fields other alert kinds carry. action_country is dropped when it is the literal UNKNOWN. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>