Bridge step 1 of the SciDEX mission pipeline (landscapes → gaps → debates → ranking → action).
Today landscape entries describe a domain but the gaps inside them are buried in prose. This task wires landscape rows to the gap registry.
Acceptance:
- New API: POST /api/landscapes/{id}/extract_gaps returns N proposed gaps; idempotent on re-run (uses content_hash).
- For each landscape row, parse description/markdown for "Open questions", "Unanswered", "Gaps:", or LLM-classify if no explicit section.
- Insert into gaps table with layer=Atlas, source_landscape_id=, status='proposed', priority derived from landscape.priority and gap_strength heuristic.
- Backfill pass over current ~10 landscapes; report N gaps proposed.
- UI: landscape detail page shows "Detected gaps (k)" link to filtered /gaps view.
- Spec: docs/planning/specs/mission_landscape_to_gap_extraction.md (write as part of task).
Why now: K-Dense skills wiring (b1a8e549) is shipping; we need a steady supply of *good* gaps to fuel debates. Landscapes are the densest source.
Completion Notes
Released by supervisor slot 52 because credential acquisition failed after pre-claim. Reason: worktree_creation_failed