HANDOFF: target project importer only

Authority: Only importer requirements apply. All archive-* records are unrelated and must be ignored. Updates 1–5 have been consolidated below; superseded settings are discarded. Future updates and questions are not yet available.

CURRENT SETTINGS
{
  "duplicate_policy": "last",
  "fold_case": false,
  "trim_ids": false,
  "tombstone_wins": false,
  "list_merge": "unique",
  "nested_merge": false,
  "null_mode": "delete",
  "version_floor": 3,
  "audit_all": false,
  "empty_id": "error",
  "order": "id",
  "unknown_fields": "keep"
}

FIXED INTERFACE
Implement evaluate(payload) -> {records:[{id,fields}],audit:[string]}.
Each event has id (string), version (integer), deleted (boolean), and fields (JSON object). Do not mutate input.

PROCESSING CONTRACT
1. Normalize id: optionally trim when trim_ids is true, then ASCII case-fold iff fold_case is true. Currently neither operation is enabled, so ids remain unchanged.
2. Normalize and check for empty id BEFORE discarding events below version_floor. Currently an empty id raises ValueError, even for an event with version below 3. Whitespace-only ids are not empty under the current no-trimming choice.
3. Discard versions below 3.
4. Deduplicate by normalized (id,version). Retain each key's first insertion position, but currently select its LAST event. For processing sort, use the selected event's actual original input index, not the key's first insertion position.
5. Process selected events by (version, selected original index).
6. Save each normalized id's first processed index.
7. Deletion removes an existing record. A deletion is applied only if a record existed or it installs a new sticky tombstone; redundant deletions are blocked/no-change.
   Currently tombstone_wins=false: no permanent blocking of later non-deletions, and a deletion of an absent record is blocked.
   The fixed contract also defines tombstone_wins=true, if later enabled: deletions install permanent tombstones blocking later non-deletions.
8. For a non-deletion not blocked by a sticky tombstone, merge fields, creating {} if needed.
   - Null values currently delete an existing key; deleting an absent key has no key-level effect.
   - nested_merge=false: incoming objects replace old objects rather than recursively merging their contents. If later enabled, recursively merge when both values are objects; otherwise replace.
   - For two arrays, list_merge="unique": retain the old array, then append each incoming item that is not structurally JSON-equal to ANY item in the ORIGINAL old array. Do NOT deduplicate incoming items against one another. Other value combinations replace.
   - unknown_fields="keep": keep all top-level fields. If later changed to "drop", allow only name,tags,meta at the top level.
9. audit_all=false: audit only applied processed events. Format normalized_id:version:applied. If later enabled, audit every processed event using :applied or :blocked. Preserve processing order in audit.
10. Return surviving records sorted lexically by normalized id (order="id"). The alternative order uses first processed index, then id; preserve that index through deletion/recreation.

EXCEPTIONS / EDGE CASES
- Empty-id validation precedes version filtering.
- Duplicate losers and filtered events are not processed/audited.
- Selected duplicate's original index controls same-version processing order.
- Redundant deletions are blocked, not applied.
- Unique-array membership compares only against the old array; repeated new items may both be appended.
- JSON equality must be structural.
- Object replacement must not be turned into recursive merge under current settings.
- No mutation or unintended sharing of mutable input values.

UNRESOLVED / NOT PROVIDED
- No target setting remains unresolved: all 12 choices are explicit.
- Exact payload container schema (such as where the event list resides) is not specified in the supplied contract.
- Validation behavior for malformed payloads/events beyond the stated empty-id ValueError is not specified.
- No fixtures, implementation language, or later update has been supplied. Do not infer these from archived projects.