Recall Evidence Workspace

Stable browsing and complete model provenance

Observed defect

RefreshRecallRuntimeAsync() calls LoadRecallTimelineAsync(""); RenderRecallCardsAsync() clears the FlipView. Rebuild resets browsing to the newest entry even with automatic capture disabled.

Selection contract

Preserve identity, not index

  1. Add stable Recall entry ID to each carousel item/view-model or FlipViewItem.Tag.
  2. Before refresh, capture selected entry ID, numeric index as fallback, and whether the user is at newest.
  3. Reconcile items by ID; avoid rebuilding when IDs/content revisions are unchanged.
  4. If selected ID survives, restore it. If deleted, clamp the prior index to the new range; use -1 only when empty.
  5. Background capture never steals navigation. Auto-select a new card only when the prior list was empty, the user explicitly enabled “Follow latest,” or a manual Capture now completed while the user was already at newest.
  6. Do not reload timeline on every status poll when entry_count and query are unchanged.

Evidence views per card

TabCanonical contentNotes
ImageFull frame + timestamp/model/statusAspect-fit; caption overlay optional.
ExtractedNormalized caption, OCR, labels, confidenceCurrent summary becomes an explicit derived view.
Raw VLMExact provider response body/message contentStore bytes/text before normalization; redact no game text.
ReviewRecall evidence agent output and validated actionsSeparate from VLM; link run ID.
TraceReview tool/reasoning activity when availableLinks into trace inspector.

Schema

entries: add analysis_id, capture_origin(manual|automatic), analysis_status
recall_analyses: id, entry_id, provider, model, prompt_version,
  raw_response, normalized_json, created_at, latency_ms, error
review_links: entry_id, local_run_id, review_status

Raw LM Studio/OpenAI responses may contain provider-specific fields. Save the complete JSON envelope plus a normalized projection. For Ollama, preserve both response and thinking if returned—even though current Recall requests set think:false.

Likely files

Acceptance