mcpField
Z
zephyr

zephyr

github.com/gkwa生产力086 次安装2 天前更新
代码仓库

关于 zephyr

zephyr 是处理酸面包烘焙语音备忘录和烘焙日志的共享技能规范,供相关操作技能调用。它定义条目识别、日志定位、时间标记及数据规范;没有 Zephyr 条目的运行应保持静默。

主要功能

  1. 01按 Zephyr 标记识别烘焙条目
  2. 02将标记解析为烘焙日志文件
  3. 03规范事件时间与重量单位
  4. 04填写酵种峰值时长字段
  5. 05规定无匹配项时保持静默

适用场景

  1. 01将语音备忘录条目关联到对应烘焙
  2. 02为烘焙动作补充事件时间标记
  3. 03从日志计算酵种达到峰值的时长

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/gkwa/volcanicviper --skill zephyr

安装后在 Claude Code 中输入/zephyr确认已加载。

附带文件tile.json

详细介绍

Zephyr 方案

“Zephyr”是用于标记酸面团烘焙语音备忘录的哨兵词。

每条与烘焙相关的语音备忘录都以“Zephyr N”开头,其中 N 是烘焙开始的日期。

例如,5 月 28 日开始的烘焙,其整个烘焙周期内的所有备忘录都使用键“Zephyr 28”。

选择哨兵词“Zephyr”,是因为它在烘焙相关语音中很少见、有两个音节,且语音特征鲜明——语音转文字不会将它与日期、数字或常用词混淆。

同一天开始多次烘焙

同一天开始多次烘焙时,在连字符后添加数字后缀来区分。

“Zephyr 3”表示本月 3 日开始的第一次烘焙——可以省略默认的 -1 后缀。

“Zephyr 3-2”表示本月 3 日开始的第二次烘焙。

5 月说的“Zephyr 5-5”表示 5 月 5 日开始的第五次烘焙。

后缀直接对应烘焙日志文件名末尾的烘焙序号。

没有哨兵词

哨兵词是筛选条件,而非必需项。

大多数文本不包含 Zephyr 键,不含此类键的文本不属于此方案的处理范围。

一次处理未找到哨兵词,就算成功——它准确执行了所要求的操作。

没有找到可处理的内容并不代表失败。

这项指令是有条件的:如果文本中有 Zephyr 条目,就处理它们;如果没有,条件就不会触发。

条件不成立不是错误,因此绝不要报告此次运行失败,也绝不要因未找到内容而以非零状态码退出。

对此保持沉默。

不要解释没有找到键,不要列举缺少键的条目,不要重述不含键的条目永远不会被修改这一规则,也不要将缺失描述为发现、偏差或异常。

只报告发生的更改。

如果此次运行没有任何更改,就不输出任何内容——不提供摘要、不作确认,也不另起一行宣布无事可做。

这适用于方案中的所有动词技能。

技能运行后没有找到可处理的内容,属于正常状态,而非异常状态。

参数

技能接受带默认值的命名参数,类似 Python 关键字参数。

解析优先级从高到低如下:

  1. 调用或请求中明确指定的值
  2. 机器本地配置
  3. 内置默认值

参数:

  • 烘焙日志目录 — 内置默认值为 /Users/mtm/Documents/Obsidian Vault/;可通过 ZEPHYR_BAKE_LOG_DIR 环境变量设置机器本地值;也可在请求中指定目录来覆盖调用值

动词技能可声明自己的其他参数,并按相同的优先级解析。

在调用时使用 Bash 检查 ZEPHYR_BAKE_LOG_DIR;只有当该变量未设置时,才回退到内置默认值。

绝不要假设当前工作目录就是烘焙日志目录。

烘焙日志命名约定

本节是烘焙日志文件名解析的唯一依据。

包括路由在内的所有其他组件,都应根据这些规则解析文件名,而不是重复描述这些规则。

烘焙日志位于烘焙日志目录中(见“参数”)。

命名格式:bake log M-D-YYYY-N.md

N 是当天的烘焙序号,从 1 开始。

后缀不总是 -1:同一天开始的第二次烘焙使用 -2,第三次使用 -3,依此类推。

N 直接对应 Zephyr 键后缀——“Zephyr 3-2”解析为烘焙序号 2。

示例:

  • bake log 5-28-2026-1.md — 2026 年 5 月 28 日开始的第一次烘焙
  • bake log 5-21-2026-1.md — 2026 年 5 月 21 日开始的第一次烘焙
  • bake log 6-3-2026-2.md — 2026 年 6 月 3 日开始的第二次烘焙

将 Zephyr 键映射到烘焙日志

当前日期为 2026 年 5 月时,“Zephyr 28” → bake log 5-28-2026-1.md。

当前日期为 2026 年 6 月时,“Zephyr 3-2” → bake log 6-3-2026-2.md。

Zephyr 日期数字表示烘焙开始的月份日期。结合当前月份和年份即可确定完整日期。可选后缀表示烘焙序号;若未提供,则默认为 1。

阅读 Zephyr 条目

烘焙日志中的每条 Zephyr 条目都遵循以下格式:

For Zephyr N, [event description] at [time] on [date].

标题时间戳(条目上方的时间戳标题)是记录备忘录的时间。

事件时间戳是正文中提到的时间——也就是实际发生烘焙操作的时间。

提取烘焙事件时,务必使用事件时间戳,而非标题时间戳。

转录错误

条目来自语音转文字,因此有时会出现与上下文明显不符的词。

只有在上下文能确定正确词语时才更正;无法确定时就保留口述原文。

证据必须来自同一份烘焙日志,例如其中的步骤、其他条目或条目报告的测量值。

示例:“初始表盘体积是 1100mL”应改为“初始面团体积是 1100mL”,因为日志本身的步骤要求记录初始面团体积,表盘读数没有用途,而且没有其他词语符合语境。

如果要确定正确词语必须靠猜测,那就无法确定。

绝不要更正数字、单位、时间或否定词,因为错误猜测会改变记录;应将这些内容标记出来。

每次运行结束后,在该次运行自身的输出之后,用一行列出所有更改,注明条目标题、旧词和新词,以便看出是否有错误猜测。

没有更改词语时,不要说任何话。

如果某个词看起来有误,但上下文无法确定正确词语,就保留原文,并在本次运行最后将它与其他问题一并提出,不要在运行过程中提问。

只更正本次运行已经读取或写入的条目,绝不要通读整份烘焙日志来查找错误。

条目标题级别

在烘焙日志中,条目是嵌套在 ## bake log 章节下的 H3 标题。

语音备忘录导出内容会将条目设为 H2,因此将其导入烘焙日志时,应将每条标题降为 H3。

条目正文中的子标题从 H4 开始,因此应保留为该条目的子标题,而不是与条目标题平级。

较早的烘焙日志中,条目早于 ## bake log 章节,因此这些条目应保留为 H2,因为这些文件中没有可供嵌套的章节。

重量标注

语音备忘录由语音转文字生成,单位会被转写为单词,或者数字与单位缩写之间会多出空格。

编写或编辑 Zephyr 条目时,将所有重量数值规范为紧凑格式:

  • 数字与单位之间不留空格
  • 使用 g,不要使用 grams
  • 使用 mL,不要使用 milliliters 或 ml

示例:

  • “18 grams” → 18g
  • “562 grams” → 562g
  • “20 g” → 20g
  • “2190 milliliters” → 2190mL

这适用于条目正文中的所有重量和体积,包括原料用量、面团重量、容器皮重和测量值。

编写 Zephyr 烘焙记录的引用

绝不要在任何备注或表格中单独写 Zephyr 编号(例如“Zephyr 13”)。

单独的编号在不同月份可能有歧义——读者看到“Zephyr 13”时,可能会根据阅读时间将其理解为 6 月 13 日或 7 月 13 日。

写入备注之前,务必将 Zephyr 键解析为烘焙日志双向链接:

  • 正确:[[bake log 5-13-2026-1]]
  • 错误:Zephyr 13

这适用于表格单元格、正文引用和任何其他书面上下文。

event_time 标签

每条记录了特定烘焙操作的 Zephyr 条目,都应在正文后单独一行添加内联 event_time 标签:

`event_time: YYYY-MM-DDTHH:MM:00`

需要添加 event_time 的操作:

  • 喂养酵种
  • 酵种达到峰值
  • 从碗中取出酵种
  • 将水与酵种混合
  • 将 tangzhong 加入面团
  • 开始批量发酵(加入面粉)
  • 加盐/将盐按入面团
  • 拉伸折叠组
  • 层叠折叠
  • 预整形
  • 整形
  • 开始冷藏发酵
  • 开始烘烤/烘烤完成
  • 插入温度探针

不需要添加 event_time 的条目:

  • 一般备注、提醒或经验总结
  • 没有操作的纯测量或重量记录
  • 推测性或回顾性评论

时间精度:

  • 如果条目正文中注明了时间,则使用该时间
  • 只有正文未注明时间时,才使用标题中的时间戳
  • 转换为 ISO 8601 格式:YYYY-MM-DDTHH:MM:00

带标签的条目示例:

### Friday, June 5, 2026 at 9:57 AM

For Zephyr 4-2, the starter peaked at 9:57 AM on June 5th.

`event_time: 2026-06-05T09:57:00`

不带标签的条目示例(仅测量):

### Friday, June 5, 2026 at 10:59 AM

For Zephyr 4-2, the initial dough volume is 2100 ml.

酵种达到峰值所需时间

每份烘焙日志都包含一个 ## Starter peak duration 部分,其中有一个 YAML 块:

fed: "[TBD]"
peaked: "[TBD]"
duration_to_peak: "[TBD]"
starter_remaining: "[TBD]"

只有当烘焙日志中包含足够的信息来推导字段值时,才填写该字段。

切勿猜测或沿用先前烘焙日志中的值。

字段来源填写条件
fedfeed_starter 条目的 event_time存在时间明确的喂养条目
peakedstarter peaked 条目的 event_time存在时间明确的酵种达到峰值条目
duration_to_peak从 fed 到 peaked 的经过时间fed 和 peaked 均已知
starter_remaining记录使用后剩余酵种的测量条目烘焙日志中存在此类测量

格式规则:

  • fed 和 peaked:ISO 8601 格式,YYYY-MM-DDTHH:MM:00
  • duration_to_peak:XhYm(例如 11h52m)
  • starter_remaining:紧凑重量表示法(例如 1g)

如果烘焙日志中尚无所需信息,则将字段留为 "[TBD]"。

工作流

处理 Zephyr 烘焙日志:

  1. 确定 Zephyr 标识(例如 “Zephyr 28” 或 “Zephyr 3-2”)
  2. 根据日期、可选的烘焙序号后缀和当前日期,将其解析为烘焙日志文件名
  3. 阅读烘焙日志并提取所有 “For Zephyr N” 条目
  4. 使用事件时间戳(正文中的时间),而非标题时间戳(时间戳标题)
  5. 编写任何引用该次烘焙的输出时,使用 [[bake log M-D-YYYY-N]],切勿只使用 Zephyr 编号

为烘焙日志添加 event_time 标签:

  1. 阅读目标烘焙日志
  2. 对每条 Zephyr 条目,判断其是否记录了特定操作(参见上方列表)
  3. 如果是,则在正文最后一行后添加 event_time 标签
  4. 正文中注明时间时使用该时间;否则使用标题中的时间
  5. 添加完所有标签后提交

更新 Starter peak duration 块:

  1. 阅读烘焙日志并找到 ## Starter peak duration 部分
  2. 对每个字段,检查烘焙日志条目中是否包含所需信息
  3. 只填写可以推导的字段,其余字段留为 "[TBD]"
  4. 更新后提交

组件

此技能是共享核心:方案本身、文件名解析、重量表示法、event_time 标签、Starter peak duration 区块,以及参数优先级。

对烘焙日志执行操作的动词是独立技能,每个都可单独调用,也可互换,而无需更改核心方案。

skill处理内容
[[zephyr-routing]]将任意文档中的 Zephyr 条目送入相应的烘焙日志
[[zephyr-grafana-links]]## grafana 部分顶部的两个仪表板链接
[[grafana-bake-annotation]]## grafana 部分中的 annotate-grafana.py 命令块

每个动词技能都会使用上述规则,而不会重复说明这些规则。

当请求需要执行某个动词时,请阅读相应的动词技能,而不要只依据此技能行事。

最后两个技能共用 ## grafana 部分——顶部是链接,下方是注释命令块。

在修改该部分之前,请阅读你要调用的技能,确认它负责其中哪一部分。

将 Zephyr 应用于烘焙日志

“应用 zephyr”或“将 zephyr 技能应用于此烘焙日志”是一个复合请求。

它涵盖烘焙日志的全部标准状态,而不只是此技能负责的规则。

按以下顺序执行:

  1. 为每条记录了离散烘焙操作的条目添加 event_time 标签——此技能
  2. 添加 ## Starter peak duration 区块——此技能
  3. 在 ## grafana 部分顶部添加两个链接——[[zephyr-grafana-links]] 技能

即使请求没有提及这些链接,也要执行第 3 步。

这就是该请求属于复合请求的原因:只需指定核心技能,就足以涵盖链接组件。

以下两个动词不包括在内,仍须作为独立请求处理:

  • [[grafana-bake-annotation]] — ## grafana 部分中的 annotate-grafana.py 命令块
  • [[zephyr-routing]] — 将条目从一个文档送入另一个文档

只有此类请求会分派到多个技能。

其他所有请求都应指定自己的动词,并遵循上方的“组件”表。

测量数据的存放位置

烘焙期间测得的所有数据——tangzhong 重量、面团体积、温度、产量——都应放在 ## bake log 部分下按日期记录的条目中,最新的排在最前。

上方的脚手架部分,例如预防性缓冲检查、tangzhong 调整、baker's math 和步骤,描述的是配方及其公式。

脚手架是计划,会沿用到下一份烘焙日志中;按日期记录的条目则是本次烘焙的观察结果。将测量数据混入脚手架,会使计划无法作为模板使用。

如果有人要求汇总或记录烘焙期间观察到的数字,请在条目列表顶部添加一条带当前时间戳的新日期条目,不要改动脚手架。

脚手架部分可以在说明中引用之前某次烘焙的结果,以解释选择某个公式的原因,但绝不能累积本次烘焙的原始测量数据。

Levain 取整

Levain 计算结果含有小数克时,一律向上取整。不要保留 46.5g;应写成 47g。

秤无法测量不足 1 克的重量,因此小数值在实际操作中毫无意义。

在数学表达式中使用向上取整符号明确展示取整过程,例如 x = ⌈(278 − 19) / 2⌉ = ⌈129.5⌉ = 130g,并在说明中的配料用量里也使用取整后的数值。

评论

支持 Markdown