The heading/block scanner and outgoing-link regex walked through fenced
code blocks and inline `code` spans as if they were prose. Notes
documenting `# heading` or `paragraph ^abc` inside a ```markdown fence
false-matched as real sections, and `obsidian_get_note` with
`includeLinks: true` returned wikilinks/markdown links pulled from
fenced syntax samples.
- Added computeFenceMask(lines, from?) in section-extractor.ts —
CommonMark fenced-block detector (matching opener char + length, no
info string on close; unclosed fence extends to EOF). Shared by
extractHeading, extractBlock, and the link parser.
- obsidian_get_note: parseOutgoingLinks blanks fenced blocks and
inline code spans via stripMarkdownCode before regex extraction.
- ambiguous_path joins the errors[] contract on obsidian_get_note
and obsidian_open_in_ui (JsonRpcErrorCode.Conflict). withCaseFallback
spreads ctx.recoveryFor('ambiguous_path') so the recovery hint
mirrors onto the wire.
- Tests: code-fence coverage for heading/block extraction (backtick +
tilde, unclosed-to-EOF), inline-code stripping in parseOutgoingLinks,
plus regression cases for setext headings, duplicate headings,
parent/child mismatch, frontmatter array/object/boolean/null, and
regex-special-char block IDs.
See changelog/3.1.x/3.1.9.md for the full release notes.