TARGET PROJECT: importer — handoff note

CURRENT CONFIGURATION (only these values apply; all archived/other-project settings are unrelated and discarded):
{
  "duplicate_policy": "first",
  "fold_case": true,
  "tombstone_wins": true,
  "trim_ids": true,
  "list_merge": "replace",
  "nested_merge": true,
  "null_mode": "ignore",
  "version_floor": 2,
  "audit_all": true,
  "empty_id": "skip",
  "order": "input",
  "unknown_fields": "drop"
}

FIXED INTERFACE / ALGORITHM CONTRACT:
- Implement evaluate(payload) -> {records:[{id,fields}], audit:[string]}. No mutation of input.
- Events have: id string, integer version, deleted boolean, fields JSON object.
- Normalize id: trim if trim_ids, then ASCII case-fold iff fold_case.
- Empty normalized id: skip (empty_id="skip"); would raise ValueError only if empty_id="error" (not current).
- Normalize/empty-check before discarding events with version below version_floor=2.
- Deduplicate by normalized (id,version), retaining first insertion position but selecting first event per duplicate_policy="first"; sorting uses selected event's actual original index.
- Process by (version, selected original index). Save each normalized id's first processed index.
- Deletion removes record; with tombstone_wins=true it also permanently blocks later non-deletions. A deletion is applied only if a record existed or it installs a new sticky tombstone; redundant deletions are blocked/no-change.
- Otherwise merge fields, creating {} if needed.
- Null values: ignore per null_mode="ignore" (do not delete existing key).
- nested_merge=true: recursively merge two objects; otherwise replace object.
- Arrays: replace per list_merge="replace". If list_merge were "unique", concatenate items not equal to any existing old-array item using structural JSON equality, with no deduplication among new-array items themselves.
- unknown_fields="drop": filter top-level fields to name, tags, meta only.
- audit_all=true: audit records every processed event, otherwise only applied ones. Format: normalized_id:version:applied or normalized_id:version:blocked. Preserve audit processing order.
- Records order: order="input" means sort by first processed index then id. If order="id", sort lexically by normalized id (not current).

EXCEPTIONS / UNRESOLVED:
- None recorded for importer. No other exceptions or open items in current target-project updates.