{"files":{"main.py":"from core import run\nfrom policy import POLICY\ndef evaluate(payload):\n    return run(payload, POLICY)\n","core.py":"import copy\nfrom helpers import jeq, norm_id\n\n\ndef _merge(old, new, policy):\n    for k, v in new.items():\n        if v is None:\n            if policy['null_mode'] == 'delete':\n                old.pop(k, None)\n            continue\n        if k in old:\n            o = old[k]\n            if policy['nested_merge'] and isinstance(o, dict) and isinstance(v, dict):\n                _merge(o, v, policy)\n                continue\n            if isinstance(o, list) and isinstance(v, list) and policy['list_merge'] == 'unique':\n                add = [copy.deepcopy(x) for x in v if not any(jeq(x, y) for y in o)]\n                old[k] = o + add\n                continue\n        old[k] = copy.deepcopy(v)\n\n\ndef run(payload, policy):\n    if isinstance(payload, dict):\n        events = payload.get('events', [])\n    else:\n        events = payload\n    groups = {}\n    for idx, ev in enumerate(events):\n        nid = norm_id(ev['id'], policy)\n        if nid == '':\n            if policy['empty_id'] == 'error':\n                raise ValueError('empty id')\n            continue\n        ver = ev['version']\n        if ver < policy['version_floor']:\n            continue\n        key = (nid, ver)\n        if key not in groups:\n            groups[key] = [idx, idx]\n        else:\n            g = groups[key]\n            if policy['duplicate_policy'] == 'last':\n                g[1] = idx\n    selected = []\n    for (nid, ver), (first, sel) in groups.items():\n        selected.append((ver, sel, nid))\n    selected.sort(key=lambda t: (t[0], t[1]))\n    records = {}\n    tombs = set()\n    first_idx = {}\n    audit = []\n    for pos, (ver, sel, nid) in enumerate(selected):\n        ev = events[sel]\n        if nid not in first_idx:\n            first_idx[nid] = pos\n        applied = False\n        if ev.get('deleted'):\n            if policy['tombstone_wins']:\n                if nid not in tombs:\n                    tombs.add(nid)\n                    records.pop(nid, None)\n                    applied = True\n            else:\n                if nid in records:\n                    del records[nid]\n                    applied = True\n        else:\n            if policy['tombstone_wins'] and nid in tombs:\n                applied = False\n            else:\n                if nid not in records:\n                    records[nid] = {}\n                _merge(records[nid], ev.get('fields') or {}, policy)\n                applied = True\n        if applied or policy['audit_all']:\n            audit.append('%s:%d:%s' % (nid, ver, 'applied' if applied else 'blocked'))\n    ids = list(records.keys())\n    if policy['order'] == 'id':\n        ids.sort()\n    else:\n        ids.sort(key=lambda i: (first_idx[i], i))\n    out = []\n    for i in ids:\n        f = records[i]\n        if policy['unknown_fields'] == 'drop':\n            f = {k: v for k, v in f.items() if k in ('name', 'tags', 'meta')}\n        out.append({'id': i, 'fields': copy.deepcopy(f)})\n    return {'records': out, 'audit': audit}\n","policy.py":"POLICY = {\n    'trim_ids': False,\n    'fold_case': False,\n    'duplicate_policy': 'last',\n    'tombstone_wins': False,\n    'version_floor': 3,\n    'list_merge': 'unique',\n    'nested_merge': False,\n    'null_mode': 'delete',\n    'empty_id': 'error',\n    'audit_all': False,\n    'order': 'input',\n    'unknown_fields': 'drop',\n}\n","helpers.py":"def jeq(a, b):\n    if isinstance(a, bool) or isinstance(b, bool):\n        return isinstance(a, bool) and isinstance(b, bool) and a == b\n    if isinstance(a, dict) and isinstance(b, dict):\n        if set(a.keys()) != set(b.keys()):\n            return False\n        return all(jeq(a[k], b[k]) for k in a)\n    if isinstance(a, list) and isinstance(b, list):\n        return len(a) == len(b) and all(jeq(x, y) for x, y in zip(a, b))\n    if isinstance(a, (dict, list)) or isinstance(b, (dict, list)):\n        return False\n    if isinstance(a, (int, float)) and isinstance(b, (int, float)):\n        return a == b\n    return type(a) == type(b) and a == b\n\n\ndef _fold(s):\n    return ''.join(chr(ord(c) + 32) if 'A' <= c <= 'Z' else c for c in s)\n\n\ndef norm_id(s, policy):\n    if policy['trim_ids']:\n        s = s.strip()\n    if policy['fold_case']:\n        s = _fold(s)\n    return s\n"}}