Inquiry context (#401)¶
Purpose-led context honors these same exclusions, including managed-system folders. Its default is the user's explicitly selected notes; expanding by one recorded link hop is optional. Exclusions override both choices and also apply to source links. Missing or newly excluded references remain unavailable context, never silently replaced by another note. The scoped gather is bounded and reports truncation; it is not a whole-vault semantic search over the user's written purpose.
Knowledge scope (excluded paths)¶
Not everything in a vault is knowledge. Config folders, template libraries, attachments-as-notes and other tooling are just files that happen to live next to your thinking. Knowledge scope (#311) lets you keep them out of the thinking system entirely.
What it does¶
Add folders under Settings → ZettelFlow → Knowledge scope → Excluded folders. It is a small CRUD: each excluded folder is one row with a remove button, and you add a new one from a folder autosuggest (add/remove, no free-text list). Every note whose path is under an excluded folder never enters the index — so it drops out of every mechanism at once:
- the 3D graph and the living knowledge map
- slip-box health, knowledge debt and balance
- discovery, open questions, evidence maps
- Cultivate sessions and Home (recommendations, next session, counts)
- maturity, the thinking heatmap, the weekly review — everything downstream of the model
It is one filter, by subtraction: because excluded notes never become ideas, no individual view needs to know about the setting.
How matching works¶
Each entry is a folder-boundary "starts with" match. templates excludes templates/note.md, templates/sub/deep.md and the note templates.md — but not templates-other/…. Leading/ trailing slashes and back-slashes are normalised, values are Unicode-normalised to NFC, and blanks and duplicates dropped. Adding or removing a folder rebuilds the index and refreshes any open Home / Cultivate surface immediately.
Because you add folders from the autosuggest, the stored value is the exact folder.path Obsidian uses — which is what fixes a class of silent no-ops (#374): a folder named with emoji, spaces or accents typed into a free-text box rarely byte-matches the real path (variation selectors, ZWJ, Unicode form), so the old open-list exclusion matched nothing. Picking the folder removes that gap entirely; the NFC step covers any remaining accented-name mismatch.
System folders are excluded automatically¶
ZettelFlow's own machinery is never part of your thinking, so it is excluded automatically — you don't have to list it. That covers the flows folder (foldersFlowsPath, default _ZettelFlow/folders), the hook-flow folder (hooks.folderFlowPath, default _ZettelFlow/hooks) and the zf JS library folder (jsLibraryFolderPath). Their step notes and scripts therefore never get indexed, cultivated, or counted anywhere. Your manual list is merged on top of these.
Notes¶
- A link from an in-scope note to an excluded note is tolerated (the target simply isn't a node); it won't resurrect the excluded note into the graph.
- Excluding a path doesn't move or change any file — it only changes what the knowledge system reads.
Architecture¶
The pure predicate lives in architecture/knowledge/scope/knowledgeScope.ts (isPathExcluded / normalizeExcludedPaths), with scopeExcludedPaths(settings) merging the user's excludedPaths with the auto-excluded system folders. It is applied at the single boundary in KnowledgeIndex.inScope (build / upsert / enrichInlineRelations / onRename). Settings: ZettelFlowSettings.excludedPaths (+ foldersFlowsPath, hooks.folderFlowPath, jsLibraryFolderPath).