来源:
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 tests196 通过(新增 8 个);cd web && npm test62 通过;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。