Skip to content

[Feature] Auto-generate consistent retrieval tags for notes (type/domain/year/status, plugin-free) #6

Description

@jiang4wqy

English first, 中文见下 ⬇︎

Summary

DeepPaperNote produces excellent single-paper notes, but it is deliberately single-paper by design (SKILL.md: "it handles one paper at a time, it does not update daily reading lists"). Once a user accumulates dozens or hundreds of paper notes in their vault, a new problem appears: the notes don't connect and are hard to retrieve across the collection.

This proposal adds a small, deterministic step that auto-generates a consistent set of native Obsidian tags on each note, so the vault becomes filterable — no plugin required.

Proposed feature

When writing a note, automatically emit a set of clearly-namespaced, consistently-spelled native tags into its frontmatter. First version covers 4 facets:

Tag Source Controlled vocabulary
type/ paper type existing note_plan.paper_type AI-method / benchmark-dataset / clinical-empirical / humanities-social / survey
domain/ domain reuses the archived domain folder (dominant_domain) consistent with the vault's existing domain folders
year/ year publication year from metadata e.g. year/2026
status/ personal status default to-read, user edits later to-read / reading / read / to-reproduce / reproduced / archived

Example (a note's frontmatter):

tags:
  - type/AI-method
  - domain/medical-ai
  - year/2026
  - status/to-read

The user can then click type/survey, year/2026, or status/to-reproduce in Obsidian's native tag pane to aggregate matching papers — with no plugin such as Dataview.

Why this design (fits the project's philosophy)

  • Deterministic normalization → scripts. Per architecture.md, deterministic/repeated normalization belongs in the script layer. The tags are synthesized deterministically from artifacts the pipeline already computed (domain/ reuses the resolve_domain_subdir result, so the tag and the archive folder can never diverge). Consistency is locked in, not left to the model's discretion.
  • Contracts centralized, not buried in prompts. The controlled vocabulary lives in contracts.py, following "don't bury essential contracts only in prompt text."
  • Grounding-safe. All four values come from the paper / metadata / existing archive — nothing requires "world knowledge," so it does not conflict with the fail-closed grounding discipline.
  • Zero external dependency. Uses only Obsidian's native tags; users are not required to install any plugin.

Benefits

  1. The note collection turns from "a pile of documents" into "a click-to-filter mini-database," greatly improving reuse/retrieval.
  2. Consistency is guaranteed by the tool — the same concept always maps to the same tag, avoiding the drift of hand-typed tags.
  3. Zero disruption to existing single-note quality and workflow; purely additive.

Scope & non-goals (first version)

  • ✅ Only the 4 tag facets above, with deterministic generation + consistency guarantee.
  • ❌ No plugin dependency (Dataview etc.).
  • ❌ No method/ or dataset/ tags yet (their vocabularies are the messiest / most drift-prone; deferred).
  • ❌ No cross-paper comparison tables or vault-level dashboards — those are separate future proposals.

This feature is the foundation of a larger "knowledge-base retrieval layer" (optional follow-ups: a vault-level index/dashboard, and cross-paper auto-linking — both would consume the structured tags this feature produces).

Implementation sketch (for discussion)

  • Synthesize the 4 tags in the save path (write_obsidian_note.py) and write them into the frontmatter; keep the vocabulary + mapping in contracts.py.
  • Add a lightweight check in lint_note.py: the 4 tags exist, values are within the controlled vocabulary, and domain/ matches the archive folder.
  • Backward compatible: keep the existing tags/aliases conventions; new tags are additive and don't break old notes. Works on both POSIX and Windows.


背景 / 痛点(中文)

DeepPaperNote 目前把「写好单篇笔记」做到了很高的水准,但它明确是单篇工具(SKILL.md:"it handles one paper at a time, it does not update daily reading lists")。当用户在 vault 里攒下几十上百篇论文笔记后,会遇到一个新问题:笔记之间不连通、不好检索。

想找「我读过的、所有用了某类方法 / 属于某个领域 / 某年 / 我标了想复现的论文」,现在只能一篇篇翻或全文搜(不准)。笔记写得再好,攒多了也难以二次利用。

本提案新增一个小而确定性的步骤:自动为每篇笔记生成一组一致的原生 Obsidian 标签,让笔记库可筛选——零插件

提议的功能

写笔记时,自动在其 frontmatter 生成一组分类清晰、写法统一的原生标签。首版含 4 类:

标签 取值来源 受控词表
type/ 论文类型 note_plan 已有的 paper_type AI方法 / 基准数据 / 临床实证 / 人文社科 / 综述
domain/ 领域 复用归档用的领域文件夹(dominant_domain 与 vault 已有领域夹一致,不新造
year/ 年份 元数据中的发表年份 year/2026
status/ 个人状态 默认 待精读(用户后续手改) 待精读 / 精读中 / 已读 / 想复现 / 已复现 / 存档

示例:

tags:
  - type/AI方法
  - domain/医学AI
  - year/2026
  - status/待精读

用户即可在 Obsidian 原生标签面板点击 type/综述year/2026status/想复现 一键聚合,无需任何插件(如 Dataview)。

为什么这样设计(契合项目哲学)

  • 确定性归一化 → 放脚本:按 architecture.md,这类确定性、可重复的归一化逻辑应放脚本层。标签由脚本从管线已经算好的结构化产物确定性生成(domain/ 直接复用 resolve_domain_subdir 的结果,因此标签与归档目录永远一致、不会分裂),一致性是「锁死」的,而非靠模型自觉。
  • 契约集中、不藏在提示词里:受控词表放进 contracts.py,符合 "don't bury essential contracts only in prompt text"
  • 接地安全:4 类取值全部来自论文 / 元数据 / 既有归档,不引入需要"世界知识"的内容,不与 fail-closed 的接地纪律冲突。
  • 零外部依赖:只用 Obsidian 原生标签,不要求用户装插件。

好处

  1. 笔记库从「一堆文档」变成「可点击筛选的小数据库」,显著提升二次检索/复用价值。
  2. 一致性由工具保证——同一概念永远同一个标签,避免手打标签漂移。
  3. 对现有单篇笔记质量与流程零破坏,纯增量。

范围与非目标(首版)

  • ✅ 仅做上述 4 类标签的确定性生成 + 一致性保证。
  • ❌ 不引入 Dataview 等插件依赖。
  • ❌ 暂不做 method/ dataset/ 标签(词表最杂、最易漂,留待后续)。
  • ❌ 不做跨论文对比表、vault 级看板——那是后续独立提案。

本功能是更大的「知识库检索层」的地基(后续可选:② vault 级索引看板、③ 跨论文自动关联,二者都消费本功能产出的结构化标签)。先立地基。

实现草图(供讨论)

  • 在保存路径(write_obsidian_note.py)合成 4 类标签并写入 frontmatter;词表与映射放 contracts.py
  • lint_note.py 增加一道轻量检查:4 类标签存在、值在受控词表内、domain/ 与归档目录一致。
  • 向后兼容:保留现有 tags/aliases 约定,新标签为叠加,不破坏旧笔记;POSIX/Windows 均适用。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions