HANDOFF: importer

Scope
Only target project importer is authoritative. All archived records describe unrelated projects and must be ignored. Updates 1–5 have been applied in sequence; retain only the current settings below. No later update or question is available.

Current settings
{
  "duplicate_policy": "first",
  "fold_case": true,
  "trim_ids": true,
  "tombstone_wins": true,
  "null_mode": "ignore",
  "nested_merge": true,
  "list_merge": "replace",
  "version_floor": 2,
  "audit_all": true,
  "empty_id": "skip",
  "order": "input",
  "unknown_fields": "drop"
}

Fixed interface
Implement evaluate(payload) -> {"records":[{"id":..., "fields":...}], "audit":[string]}.
Events contain id (string), version (integer), deleted (boolean), and fields (JSON object).
Do not mutate input.

Normalization, filtering, deduplication
- Trim IDs, then fold ASCII uppercase to lowercase. Do not use Unicode case folding.
- Skip empty normalized IDs.
- Normalize and empty-check BEFORE discarding events whose version is below 2.
- Deduplicate by (normalized ID, version). Current policy selects the first event.
- Keep each deduplication key's first insertion position, but sorting must use the selected event's actual original input index, not an insertion-position surrogate.
- Process retained events by (version, selected original index).
- Save each normalized ID's first processed index for final record ordering.

Deletion and application
- Deletion removes an existing record.
- Sticky tombstones are enabled: a deletion permanently blocks subsequent non-deletion events for that ID.
- A deletion is applied only when a record existed or it installs a new sticky tombstone. A deletion for a previously absent ID therefore applies when installing its first tombstone.
- Redundant deletions are blocked/no-change.
- A non-deletion blocked by a sticky tombstone does not merge fields.
- Otherwise merge fields, creating an empty object if needed. Do not infer that an accepted non-deletion is blocked merely because its fields cause no change.

Field merging
- Null values are ignored; they do not remove existing keys.
- Recursively merge when both old and incoming values are objects; otherwise replace the value/object.
- When both values are arrays, current policy replaces the old array.
- Keep only top-level fields name, tags, meta. Do not apply this whitelist recursively.
- General fixed contract if list_merge later becomes "unique": concatenate incoming items that are not structurally JSON-equal to any item in the OLD array. Do not deduplicate incoming items against one another.

Output and audit
- Current order="input" means sort surviving records by each ID's first processed index, then ID; it does not mean raw input order.
- If order later becomes "id", sort lexically by normalized ID.
- Output record IDs are normalized IDs.
- Current audit_all=true: audit every processed event, including blocked/no-change events.
- Format entries as normalized_id:version:applied or normalized_id:version:blocked.
- Preserve event processing order in audit.
- Skipped empty IDs, below-floor events, and unselected duplicates are not processed and are not audited.

Other fixed conditional behavior
- If empty_id later becomes "error", raise ValueError for an empty normalized ID, still before version-floor filtering.
- If tombstone_wins is disabled later, deletions do not permanently block recreation.
- If null_mode becomes "delete", null deletes an existing key.
- If nested_merge is false, incoming objects replace rather than recursively merge.
- Filter top-level fields only when unknown_fields="drop".
- If audit_all=false, audit only applied events.
- Later target updates replace only their explicitly listed keys; all other current choices remain unchanged.

Unresolved / continuation
No unresolved setting conflicts are present: all 12 choices are specified.
The exact input payload container schema is not explicitly defined beyond the event structure; do not invent additional requirements or defaults.
No implementation, tests, next update, or later questions were supplied. Continue from this state using only authoritative importer requirements.