Task relations
A task relates to another task with an entry on its 🪢 **LINKS:** line. The
reverse 🪢 **LINKED FROM:** line is generated output: reconcile rebuilds it
from other tasks' LINKS lines, so edit the source side and let the mirror
converge. Relations never block, promote, consume, schedule, stamp, or route
anything.
Both rows render as live chips in Live Preview and Reading view from the
relation index (api.relationIndex), never the stored mirror:
- Labels show as muted small-caps pills on the arrow side:
‹label› → (chip)on LINKS, and the inverse phrase (merged intoreadsmerged from) on LINKED FROM, otherwise(chip) · ‹label› → this. - A stored entry that is no longer live is dashed with the tooltip
No longer links here · refreshes on the next reconcile. A live edge missing from the text is appended in canonical order. A target that cannot be resolved is a dashed⚠^id not found. - Three or more closed chips collapse to
✓×N, which expands on click. - Closed and archived targets are dimmed and never struck;
#hidetasks are muted. Colour carries status, never direction. - With nav
api.relationsv1 present, a trailing + opens the Links / Linked-from stage and a hover × on each live chip removes the link (Unlink ‹name›on LINKS,Remove the link from ‹name›on LINKED FROM). Without it the rows stay navigation-only. - The shared
toggle-dependency-chipscommand covers both rows.
Without this plugin, both lines still read as English.
Linking from the Task Card¶
The Task Card's Links to… row (l, after Blocks…) shows
N · <first label> <first target> +K from the owner's LINKS line. Its
Linked from… row (⇧L) shows the counted source tasks from the live
relation index when ready; its detail stays empty while unavailable. Both
actions work on open and closed tasks. Ctrl+Shift+L (command
bob-navigation-hotkeys:task-card-links) opens Links to, and
Ctrl+Shift+Alt+L (command
bob-navigation-hotkeys:task-card-linked-from) opens Linked from. On
either relation line, Ctrl+Shift+P opens the owner's matching stage.
The Links stage title reads 🪢 Links · <task> with the subtitle
Links to K · searching P tasks · ⇥ to mark several · does not block.
CURRENT holds the outgoing links with label pills in authored order,
RESULTS holds open tasks, and CLOSED holds closed tasks then done/
archives. ↵ links (or unlinks on CURRENT), ⇧↵ opens the relation field
(or relabels on CURRENT), ⇥ marks several, and id-less targets run the
block-ID prompt once on apply. The relation field offers suggestions from
the live index with a live S — ‹label› → T sentence; an empty field
commits a plain link. Same-note writes share one undo entry; cross-note
mirrors follow best-effort with a · 🪢 LINKED FROM not updated suffix when
they cannot.
Linked from lists incoming sources in CURRENT from api.relationIndex, or
from a generation-guarded vault scan while that index is unavailable.
Sources of every task status count, including Next [*] and Blocked [?].
Its RESULTS are editable source tasks that can link here; Enter applies or
removes the selected source, and Shift+Enter adds or changes the relation
label. Shift+Enter labels the selected source's LINKS line, and the
relation field's live sentence reads ‹source› — ‹label› → this. Built-in
labels use their inverse phrase in CURRENT. N<Ctrl+Shift+L>
applies one Links-to target and label to each of N+1 source tasks;
N<Ctrl+Shift+Alt+L> is refused because one target cannot be chosen for a
reverse batch. Ctrl+D on Links to removes every outgoing relation and
updates generated mirrors; Linked from refuses Ctrl+D because its row is
generated. Hand edits to LINKS update LINKED FROM with the same-note undo
transaction or checked cross-note mirrors; Ctrl+Z runs the mirror again.
Editing LINKED FROM shows the generated-line notice and does not change an
edge.
In the relation-label stage, row zero is the typed label (or plain link), so
Tab accepts the top visible match while Enter uses the typed value. Arrow
keys and Ctrl+N / Ctrl+P move the highlight. Ctrl+D on a label row hides
or unhides that label from suggestions and leaves a ghost row for undo; on row
zero it toggles one-off for the next relation. Typing | also turns one-off
on. Ctrl+H opens or closes the Hidden section. A one-off relation is written
first, then bob hides its label; if that hide fails, the relation remains and
the notice gives the retry command. Hiding changes suggestions only: existing
links and typed use remain unchanged.
Ctrl+R on an existing label opens a separate rename mode. The preview lists
the affected notes, LINKS entries, generated mirrors, and done/ history.
Obsidian saves the active editor before previewing and refuses to continue when
another affected open editor has unsaved text. Apply refreshes the preview and
rechecks open editors; if the plan changed, review the new preview before
confirming again. A merge requires its own confirmation. Bob performs the
one-commit rename, including label spans in done/.
The Bob: Relation labels command opens a manager for hiding, unhiding, and renaming labels without starting a link gesture. Hidden labels remain in the manager, including labels with no current links.
The read-only api.relationLabels v1 exposes catalog rows and hidden state on
desktop and mobile. Its desktop hide, unhide, and rename methods delegate
writes to bob relations; rename(from, to, { dryRun, merge, via }) returns
Bob's preview report for dry runs and refreshes the journal mirror after a
successful write.
Related¶
- BLOCKS dependency mirrors — the reverse-dependency precedent for generated mirror rows.
- Bob Navigation Hotkeys — relation stages and gestures.
- Task dependencies — dependency storage and behavior.
- Task relations — relation storage and behavior.