feat(import): one native-client staging contract (client_item_id, /meta, canonical source) master
Evolve the import staging API in place so web, `sol import`, and native clients stage through one strengthened contract. - /save + /save-path now REQUIRE client_item_id (idempotency key). Staged scan gives idempotent replay (same id + same content) vs 409 import_client_id_conflict (same id, different content). Replay of an already-started item recommends do_not_start. - Duplicates are terminal: content matching an imported manifest OR an already-staged item returns status=duplicate / recommended_action= do_not_start and is NOT staged again. /start refuses a saved terminal duplicate regardless of force. - /save returns a versioned summary: schema_version, status, replay, path, timestamp, client_item_id, source (server-inferred canonical audio|image|document|text), facet, setting, recommended_action, a metadata bag (incl. flexible client bag), diagnostics (folds timestamp_detection_*), and a duplicate object when applicable. /save-path shares the shape. - /api/facet renamed to /api/meta (clean break, no alias). - /start is saved-metadata-authority (ignores request source/facet/setting) and routes via saved source_hint. recording/quick/apple never reach the wire or the importer as source values. Conservative PDF: canonical source reports "document" for PDFs as metadata, but generic/quick PDF processing is unchanged (still the text path). Intentional BREAKING changes to import.save, re-pinned via `make openapi`: required client_item_id; top-level timestamp_detection_* moved under diagnostics. Adds import.savePath + import.meta ops. Native-client (iOS) owners must update. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>