Skip to content

Open questions

Questions you raise while writing get buried in note bodies and are never revisited. Open questions makes them first-class: it lists every unanswered question across the whole vault, and for each one proposes the note most likely to answer it — so a question is a live thread, not a dead end.

Opening it

Run "Show open questions" from the command palette, or click Open next to Open questions in Settings → ZettelFlow → Zettelkasten toolkit. The pane updates automatically (debounced) whenever notes or links change.

What counts as an open question

A question is a question semantic relation (#147): a note that points to a question note via question::. A question is open when its target has no incoming supports edge — nothing answers it yet. This is the vault-wide generalisation of the per-note find unanswered question action. Questions come only from the question relation — there is no NLP of note prose.

The pure query openQuestions(model) → { path, askedBy }[] lists each open question with the notes that asked it, sorted deterministically. Read-only and offline.

Answer detection

For each open question, proposeAnswers(model, questionPath) → { path, score }[] ranks candidate answering notes by graph-structural relatedness — the same #154 metric as suggest link (co-citation weighted above bibliographic coupling). It reuses that single metric (rankRelatedScored), which already excludes the question's askers and any directly connected note, and it returns [] for a question that is unknown, already answered, or shares no graph context. The top five candidates are shown per question.

Read-only (for now)

The view proposes the candidate --supports--> question link but does not write it — it lists and navigates only, so it adds no file-system capability. Create the edge yourself with the create semantic relation action; a one-click "link it" affordance is a possible follow-up.

Architecture

openQuestions(model)                              (pure, Obsidian-free, unit-tested)
  → [{ path, askedBy }]     every question target with no incoming `supports`

proposeAnswers(model, questionPath, { limit })    (pure, Obsidian-free, unit-tested)
  → [{ path, score }]       top-N by rankRelatedScored (#154), guards unknown/answered/context-less

OpenQuestionsView (ItemView) + OpenQuestionsComponent (show-open-questions command, no hotkey)
  reads the KnowledgeIndex model → openQuestions + proposeAnswers per question
  debounced metadataCache "resolved" + vault rename/delete listeners → recompute
  rows open notes via workspace.openLinkText; writes nothing