journal: archive importer (L2) — extract→validate→merge→rescan with lockfile + var-tmp cleanup master
- Add JournalArchiveImporter to FileImporter registry (auto-detected for .zip uploads). - Harden validate_journal_archive against zip-slip: rejects absolute paths, ".." traversal, and symlink entries. - New <journal>/.merge.lock contract (O_EXCL + PID reclaim) shared between dispatcher and importer; serializes file imports with archive merges. - Pre-merge principal-collision detection surfaced via ImportResult.principal_collision. - Merge-phase progress bridges through _progress_callback into the existing 5s callosum emitter. - Async sol indexer --rescan-full kickoff (Popen, start_new_session) on successful merge. - Supervisor startup sweeps stale /var/tmp/solstone-merge-* directories older than 24h. - FileImporter.process() Protocol gains dry_run: bool = False; all existing implementations updated. - ImportResult gains optional merge_summary / principal_collision fields, propagated through file_imported emit, imported.json, and the CLI --json output. L2 ships no UI and no new HTTP endpoints. L3 will add the convey UI. Co-Authored-By: OpenAI Codex <codex@openai.com>