{"files":{"main.py":"from core import run\nfrom policy import POLICY\n\n\ndef evaluate(payload):\n    return run(payload, POLICY)\n","policy.py":"POLICY = {\n    'duplicate_policy': 'first',\n    'fold_case': True,\n    'trim_ids': True,\n    'tombstone_wins': True,\n    'null_mode': 'ignore',\n    'nested_merge': True,\n    'list_merge': 'replace',\n    'version_floor': 2,\n    'audit_all': True,\n    'empty_id': 'skip',\n    'order': 'id',\n    'unknown_fields': 'keep',\n}\n","helpers.py":"from copy import deepcopy\n\n\ndef normalize_id(value, policy):\n    if policy['trim_ids']:\n        value = value.strip()\n    if policy['fold_case']:\n        value = ''.join(chr(ord(c) + 32) if 'A' <= c <= 'Z' else c for c in value)\n    return value\n\n\ndef json_equal(a, b):\n    if isinstance(a, bool) or isinstance(b, bool):\n        return type(a) is type(b) and a == b\n    if a is None or b is None:\n        return a is None and b is None\n    if isinstance(a, dict) and isinstance(b, dict):\n        return a.keys() == b.keys() and all(json_equal(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(json_equal(x, y) for x, y in zip(a, b))\n    if isinstance(a, (int, float)) and isinstance(b, (int, float)):\n        return a == b\n    return type(a) is type(b) and a == b\n\n\ndef merge_fields(old, incoming, policy):\n    result = deepcopy(old)\n    for key, value in incoming.items():\n        if value is None:\n            if policy['null_mode'] == 'delete':\n                result.pop(key, None)\n            continue\n        previous = old.get(key)\n        if policy['nested_merge'] and isinstance(previous, dict) and isinstance(value, dict):\n            result[key] = merge_fields(previous, value, policy)\n        elif isinstance(previous, list) and isinstance(value, list) and policy['list_merge'] == 'unique':\n            result[key] = deepcopy(previous) + [deepcopy(item) for item in value if not any(json_equal(item, existing) for existing in previous)]\n        else:\n            result[key] = deepcopy(value)\n    return result\n","core.py":"from helpers import normalize_id, merge_fields\n\n\ndef run(payload, policy):\n    selected = {}\n    for index, event in enumerate(payload['events']):\n        identifier = normalize_id(event['id'], policy)\n        if not identifier:\n            if policy['empty_id'] == 'error':\n                raise ValueError('Empty normalized id')\n            continue\n        version = event['version']\n        if version < policy['version_floor']:\n            continue\n        key = (identifier, version)\n        if key not in selected or policy['duplicate_policy'] == 'last':\n            selected[key] = (index, event)\n\n    events = sorted(selected.items(), key=lambda entry: (entry[0][1], entry[1][0]))\n    records = {}\n    tombstones = set()\n    first_processed = {}\n    audit = []\n    for (identifier, version), (index, event) in events:\n        first_processed.setdefault(identifier, index)\n        applied = False\n        if event['deleted']:\n            existed = identifier in records\n            new_tombstone = policy['tombstone_wins'] and identifier not in tombstones\n            if existed:\n                del records[identifier]\n            if new_tombstone:\n                tombstones.add(identifier)\n            applied = existed or new_tombstone\n        elif identifier not in tombstones:\n            incoming = event['fields']\n            if policy['unknown_fields'] == 'drop':\n                incoming = {key: value for key, value in incoming.items() if key in ('name', 'tags', 'meta')}\n            records[identifier] = merge_fields(records.get(identifier, {}), incoming, policy)\n            applied = True\n        if policy['audit_all'] or applied:\n            status = 'applied' if applied else 'blocked'\n            audit.append(f'{identifier}:{version}:{status}')\n\n    if policy['order'] == 'id':\n        identifiers = sorted(records)\n    else:\n        identifiers = sorted(records, key=lambda identifier: (first_processed[identifier], identifier))\n    return {\n        'records': [{'id': identifier, 'fields': records[identifier]} for identifier in identifiers],\n        'audit': audit,\n    }\n"}}