来源:notes/documents/渠道开关实施记录:ticket_03_笔记线开关.md

渠道开关实施记录:ticket 03 笔记线开关

ticket 03(笔记线开关)做完并推送:7c597fd。spec 是 .scratch/channel-switches/ 的「用渠道开关取代 sensitivity」,ticket 是 .scratch/channel-switches/issues/03-note-line-switches.md。

做了什么

飞书文档从 status 解耦成独立开关

  • scripts/note_docs_projection.py:闸门从「status != 'active'」改成「status != 'active' or not note.feishu_docs_enabled」, 台账 error 写 feishu_docs_enabled=0;withdrawn 语义不动。
  • Docs 回写 register_note 时把 feishu_docs_enabled / feishu_base_enabled 原样带上,不重置(否则一投影就把关掉的开关打开)。

笔记 Base 补上它一直缺的闸门

  • scripts/note_base_projection.py::_note_rows 加 feishu_base_enabled 过滤(此前 131 篇全量输出); 单篇投影遇到被闸掉的笔记返回 skipped: 1 而不是 StopIteration。

拆掉一处隐藏耦合(原文没写,spec 验收逼出来的)

  • scripts/note_calendar_projection.py 原本把「Docs 投影必须 synced」当日历的前置条件, 于是 --no-feishu-docs 的笔记日历也会判 failed——直接违反本 ticket 的验收「Docs 不投、Base 与日历照投」。 改成:文档开关关掉时压根不调 Docs 投影,日历正文沿用 note.docs_url(没有就留空)。 Docs 投影真的失败(报错,而非开关关闭)时仍然阻断日历,fail-closed 不变。

CLI 写点带上四个开关

  • scripts/note_cli.py:--feishu-docs/--no-feishu-docs、--feishu-base/--no-feishu-base、 --calendar-enabled/--no-calendar、--publish-enabled/--no-publish-enabled,default=None 表示「没表态」。
  • create 走建新默认(docs/base/calendar 开,publish 关);sync 的 publish_enabled 从粘性 args.publish_enabled or note.publish_enabled 改成「不传就沿用已存值」——原来 --publish-enabled 一旦传过就再也关不掉。
  • status 输出补上四个开关现值,验收时一眼能看到各层为什么是这个状态。
  • --sensitivity 保留但标 Deprecated(ticket 07 删列时一并去掉)。

Go worker

  • captureInput 加 FeishuBaseEnabled(parseInput 默认 true),/note 的 noteCLIArguments 钉 true; 命令构建抽成 captureEventCommand 以便测试,false 时追加 --no-feishu-base;重建了 bin/ 里的部署产物。

文档

  • references/note-cli.md 补上四个开关的默认口径与「Docs 关掉不拖累日历」; SKILL.md 的完成判据不再要求三层必须 synced(开关关掉时那一层本来就是 skipped)。

怎么验的

  • python3 -m unittest discover -s tests 196 通过(新增 8 个);cd web && npm test 62 通过; go test / go vet 干净。
  • 验收 A:临时库 + 注入 fake 客户端跑真实 main(),create --no-feishu-docs --no-publish-enabled --apply → Docs []、Base 1 行、Calendar 1 条,status 显示 docs=skipped(feishu_docs_enabled=0) / base=synced / calendar=synced。
  • 验收 B:真库上把 HEAD 版代码与改动版代码各跑一遍 _note_rows + 两道 Docs 闸门判定, 131 篇笔记全部 feishu_docs_enabled=1、feishu_base_enabled=1,Base 行投影 sha256 两版相同, 闸门判定逐篇相同——两道新闸门对现存数据是 no-op。

code-review(Standards / Spec 两轴)

  • Spec 轴:日历解耦判为「justified」;另外两点不在本 ticket 范围,已记进 ticket 04: ①Base 的「退出语义」(开关翻 0 要删/撤回已投影的行,本 ticket 只做了闸门,就是 spec 禁止的那个 continue); ②闸门命中时不写 entity_projection_state,被闸掉的笔记 note_cli status 的 base 会是 {}。 还带出一条潜在 bug:update_note_operational 的两个开关默认 True,没显式传参的调用方会把关掉的开关静默重置回开。
  • Standards 轴:抓出 SKILL.md 与 note-cli.md 口径不一致(已修)、--sensitivity 参数定义重复(已抽成一个函数) 和若干判断性的坏味道。另有一条流程观察:claimed 状态没单独进历史,ticket 文件在本 commit 里是 ready-for-agent → resolved——实际上开工前已改成 claimed,只是没单独提交。

下一步

ticket 04(Base 列改造 + 退出语义)已解锁,checklist 里补进了上面两条 handoff。