Build the read-first wrapper's M0 (GET /<SID> single-card viewer: PlaneClient.get_issue → Task.from_plane → rendered card) and M2 (mirror-vs-Plane field-by-field diff view: Task.from_md vs live Plane) as a persistent local service. Fetch layer behind a swappable seam — Plane-live today, mirror-read after Gate 2. Spec: corpus/scratch/memy-1121-ledger/streams/plane-wrapper.md §2/§3/§8 + OPTIONS.md §3. Operator 2026-08-08: build ASAP; house as our own persistent process with room to load heavy deps (my-basis) later; Plane demoted to auxiliary GUI/HCI.
M0 + M2 built as corpus.planeview (corpus repo), console script planeview. 36 new tests, ruff+pyrefly clean, verified live against real Plane: found a genuine relates_to divergence on this card itself, and 559 divergent MEMY cards in the full /sweep (~21s; type-differs is mostly the known CE type-paywall gap, not real corruption). Comments (D2) are out of scope per the spec's own enumerated diff field list — flagged, not built.
Committed on agent/MEMY-1155-wrapper-m0-m2-diff-view (39e357417aa172598dc6bfb8411c7e5f0f357b58), awaiting launcher review + agent-worktree merge. Bump to Verified once landed on main.