2026-09-23·by Sijie Wang#standmeet#obsidian#contract

protocol

协议——frontmatter 字段来源契约

上级:obsidian-sync-mechanism · 已对照 backend/internal/corpus/obsidian/import.go 逐项核实(该包在 2026-07-29 从 usecases/ 搬出,9f1ffcf13;2026-09-07 复核)

对每一个字段,都问两个问题:它的值到底从哪里来,以及谁会读它——Obsidian、StandMeet、两者都读,还是都不读。凡是来源比"你手动敲进去"更可信的字段(文件名、系统时间、正文本身、导入器),就不该出现在模板里。已逐字段对照 buildSaveInputFromVaultimport.go:286)核实过——这是 writings 分支;wiki/subjectivity 分支解析的是自己那套更小的字段(corpFMsync_note.go:15),有差异的行会逐行注明。

全景矩阵

✅ = 被使用/被读取 · ✕ = 没有原生行为——Obsidian 依然会存储并显示每一个属性(excerpt/status/……之所以会出现在属性选择器里,只是因为你自己的笔记用过它们,不是因为 Obsidian 会拿它们做什么)。

字段来源ObsidianStandMeet说明
publish(这道闸门)✅ Obsidian Publish✅ 导入闸门(writings)· 可见性闸门(wiki/subjectivity)writings:true → 导入;corp 笔记:一律落库,publish 只设 published,没写这个键就保留现值(F-L-8 / F-L-22);渲染为一个复选框
tags✅ 标签面板 / 搜索双方共用的原生键
excerpt摘要
cover_headline / cover_sub封面文案
cover_hueamber(默认)/ violet / acid
cover_image你 / 正文中的一张图片会被解析为一个资源
visibilitypublic(默认)/ private
locked_body特殊字段不属于常规撰写流程
title文件名✅ 文件名就是标题——与 Obsidian 一致✅ 仅用于覆盖(pickTitle只在需要覆盖显示名时才设置
slug文件名✅ 文件名 = 笔记的身份标识——与 Obsidian 一致✅ 读取 fm.slug,否则用文件名(pickSlug不要手动设置;⚠️ 目前还没有折叠 folder-note 的逻辑
aliases✅ 备用名 / [[alias]] / 搜索✕ writings:会被解析但被忽略 · ✅ wiki/subjectivity:存进 corpus_notes.aliases,用来解析 [[别名]] 链接(463411b48,2026-08-05)corp 笔记两边共用的键
cssclasses✅ 逐笔记 CSS✕ writings · ✅ wiki/subjectivity:存为 css_classes,渲染时加到笔记容器上(f147b1e8f,2026-07-06)corp 笔记两边共用的键
lang / lang-labels✅ 仅 wiki/subjectivity:> [!lang] 笔记的身份语言 + 切换器上的字(corpus_notes.langlang_labelswritings 分支不读
created系统✕(文件系统时间是独立的)✕ 以数据库 created_at 为准两边都不需要手动填写
cross_refs正文中的 [[links]]✕ 硬编码为空关系全部来自正文中的 wikilink
path / parent_idvault 路径 / 文件夹树(文件所在的位置)✅ 自动不是一个 frontmatter 键
read_minutes根据正文计算✅ 计算得出不是一个 frontmatter 键
published_at · obsidian_source_path · obsidian_imported_at · updated_at导入器 / 数据库✅ 自动不是 frontmatter 键
Note

publish 有意沿用 Obsidian 的原生键 publish 是 Obsidian 原生识别的属性键之一(也就是 Obsidian Publish 读取的那个)。所以 StandMeet 的导入闸门和 Obsidian 共用一个标志、一个含义——publish: true 表示"公开这篇"——而不是另造一个自定义字段。带来的好处是:它在属性面板里会渲染为一个真正的复选框;而且如果你以后也用起 Obsidian Publish,同一个 publish: true 会同时触发两边(这是有意为之——两者都表示公开;只有当你想让二者分道扬镳时,才需要拆成两个键)。

两个违反直觉的陷阱

  1. cross_refs什么也不做:你可能以为在 frontmatter 里列出相关文章就能建立关系——但导入器把它硬编码为空。关系只来自正文中的 [[wikilinks]]
  2. 一个键,两个受众created/aliases 对 StandMeet 的导入毫无用处,但 aliases 对 Obsidian 有用,而 created 已经由文件系统时间覆盖。两者都不需要手动填写。

精简版模板(也就是 standmeet-article 模板)

---
publish: false
excerpt:
tags: []
# add visibility / cover_hue / cover_headline / cover_sub when needed
---

titleslugcreatedcross_refspath 全部缺席——分别交给文件名、系统时间、正文中的 wikilink,以及导入器。

about this entry

One of sijie's wiki entries. The AI on this site is grounded in the same corpus and answers in sijie's voice, with citations back to entries like this one — answering costs sijie money, so it waits behind a code: enter an access code →