perplexed

Remake a stale note, and let a draft link back into your own vault

Perplexed stops being write-once: rewrite a note that has gone stale, and let the draft weave in the vault notes that already reference it.

Why Care?

A research note written in May is wrong by September. Companies pivot, pricing changes, founders leave. Until now Perplexed could only fill an empty note or append below an existing one — so a stale profile stayed stale, with a fresh draft bolted underneath it and the reader left to guess which half was true.

And a freshly generated note arrived orphaned. It knew nothing about your vault, so it linked to nothing in it, and the standing rule in our templates was literally "do NOT invent [[wikilink]] syntax" — because a model guessing vault paths produces broken links. The note had to be hand-wired into the graph afterward, every time.

Both are fixed, and the second one produced the nicest moment of the session.

What's New?

  • Remake mode. A third output option in the run dialog: rewrite the note, passing the old draft to the model as background rather than content to preserve. A snapshot is written first, and the run aborts if it can't be.

  • include-backlinks: — hands the model the real vault paths of notes that already reference the subject, so a draft can link back into your graph instead of being forbidden from linking at all.

  • "Link back to vault notes" — the other direction. Scans an existing note's prose for unlinked mentions of other vault notes and offers them in a review table. Obsidian shows these in its Unlinked-mentions pane but has never offered to apply them.

  • 33 of 34 lint warnings fixed, including a class that had been quietly degrading the UI.

The good bit

Here is what include-backlinks: actually produced, unedited, on a Sintra profile — an inline wikilink woven into a sentence the model was writing anyway:

A rendered Obsidian note section headed Market Sizing. A paragraph about Sintra names four market categories in bold, then reads 'the same general space referenced in market-map notes like Agentic AI in Fintech' — with Agentic AI in Fintech rendered as a blue internal link mid-sentence. Six grey hex-coded footnote markers such as [^2ix3vv] and [^9gs266] sit after the cited market-sizing figures.
The wikilink lands mid-sentence, where a human would have put it — not in a Related-notes list at the bottom. The grey hex markers are cite-wide's footnotes rendering alongside it.

Not a "Related notes" section. Not a bulleted See-also block. A link in the middle of a sentence, where a human would have put it.

That took an explicit instruction to get right. The first version produced a tidy list of every backlink at the bottom of the note, which is exactly the thing nobody reads. The prompt now says: work one or two of them into the prose where they genuinely fit, copy the path verbatim, and linking nothing is better than linking something irrelevant.

How it Works

Remake

The framing is the whole feature, and it ships as a vault-editable preamble at zz-cf-lib/preambles/remake-framing.md so you can tune the wording without a plugin release:

Where the prior draft conflicts with what you find in current sources, the current sources win. Always. … If it says information "was not found", that was a finding about one past search, not a fact about the world — research it again yourself before repeating any such claim.

It also asks the model to name the pivot explicitly — what the subject used to be versus what it is now — because that is the single most useful thing a reader of a stale note can learn.

One detail that matters more than it looks: the prior draft's # Sources footer is stripped before it goes back to the model. Without that, the model reads the old citations and reuses them as though it had consulted them this run. Stale attributions that look perfectly legitimate.

Linking, in both directions

These are opposite operations and we conflated them at first:

DirectionWhat it does
include-backlinks:inboundNotes that link to this one, fed into generation as real paths
"Link back to vault notes"outboundTitles of other notes found in this one's prose, offered for linking

The outbound scan runs on the hundreds of notes you have already drafted, not just new ones. On a real note it indexed 1,155 vault notes and proposed eleven links — seven high-confidence and correct (Gartner Magic Quadrant, General Catalyst, Geodesic Capital, Metabase), four low-confidence noise (backed, pivot, slide).

That tail is the whole reason there is a review table. backed is a genuine vault note and an ordinary English verb; Hex, Layer, Element and Go are all real companies and real common words. High-confidence rows start checked, low-confidence start unchecked, so clicking Apply on everything still cannot damage prose.

Links are emitted vault-root-absolute with a display alias —

[[Tooling/Software Development/Programming Languages/Go|Go]]

— and built explicitly rather than through generateMarkdownLink(), which honours the vault's "New link format" setting. This output feeds published web renderings where the absolute path is load-bearing, so it must not change if that setting does.

Under the Hood

The linter was making the product worse

34 warnings, 0 errors. Twenty-one were activeWindow.setTimeout → window.setTimeout — not cosmetic, since activeWindow points at whichever window has focus and a network timeout registered there can die when a popout closes.

The other twelve were more interesting. The sentence-case rule ships a 61-brand dictionary that knows Claude and Gemini but not Perplexity, Perplexica, Vane, or LM Studio. Someone had previously satisfied it by lowercasing the product names, so the plugin was shipping settings headings that read "Lm studio (local models)" and descriptions like "your local perplexica / vane instance".

That is a linter degrading a product. We taught it the vocabulary instead and restored about forty strings. Two traps on the way:

  • brands replaces the built-in dictionary rather than extending it, so the first attempt silently un-taught Claude and Gemini.

  • The autofix then corrupted two things — sonar-pro → Sonar-pro (a model ID) and api.perplexity.ai → api.Perplexity.ai, a mangled endpoint URL shown to users. Caught by reading the diff. URL-shaped strings are now skipped whole.

We also deliberately dropped Cursor from the brand list. Upstream lists it as the code editor, which made the rule want to capitalize every mention of a text cursor. "Streams into the active note at the cursor" is correct English.

One warning remains: the settings tab does not implement getSettingDefinitions(), so its settings will not appear in Obsidian's settings search on 1.13+. That is a real gap and a real refactor; it belongs with the submission work, not here.

What's Next

  • Remake currently sends the whole prior draft. Section-level refresh — rewrite one sub-segment without touching the other seven — is specced in [[2026-09-10_Section-Refresh-and-Source-Curation]].

  • Snapshots exist only on the remake path. Making them universal, with a restore command, is [[2026-09-10_Run-Snapshots-and-Restore]].

  • Outline shaping with hard-follow / include-but-don't-limit / loose adherence modes is [[2026-09-10_Outline-Shaping-and-Adherence-Modes]].

  • The linking work is written up in [[2026-09-11_Vault-Aware-Linking-In-Both-Directions]], including the parts that are still open — aliases are read but untested, excludeRoots is hardcoded, and the templates still carry the now-outdated "do NOT invent wikilink syntax" rule.