journal: archive importer (L2) — extract→validate→merge→rescan with lockfile + var-tmp cleanup
- 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>