Skip to content

功能许愿池运营 SOP

发表于 2026-08-24
最后修改 2026-08-24
阅读量 —

许愿池的对外页面在 docs/zhHans/guide/light-weight-work/feature-wishlist/。本文是内部运营流程。

机制前提

站点的 giscus 评论挂在 doc-after 插槽上全站生效,映射方式是 pathname,评论仓库是 atomeocean/logbook-comment 的 Announcements 分类。

这意味着一个页面对应一条 GitHub Discussion,主楼的 👍 数就是该页面对应功能的票数。整套许愿池就建立在这一条上,下面所有规则都是它的推论。

两个门槛(对外硬承诺)

门槛计票对象达成后必须做什么
7 票submit-idea.md 评论区里某一条提议评论自身的 👍建成 candidates/<slug>.md,加入总览清单,开放投票
19 票候选功能页面主楼的 👍状态改为「已排期」

这两个数字已经公开写在对外页面上,是承诺而不是参考值。相应的约束:

  • 满票必须执行,不能因为实现成本高而搁置。 如果一个满 19 票的功能确实做不了,走「暂不做」并在该功能页面公开写出原因,不允许让它无声地停在「已排期」或「投票中」。
  • 票数不结转。 提议阶段的 7 票不带进候选阶段的 19 票,新页面从 0 开始。建页时必须在原提议评论下回复新页面链接,并提示投过票的人重新投一次,否则等于把已有支持者丢掉。
  • 门槛是下限不是唯一入口。 影响面明显或有合规要求的需求,可以不等满票直接建页或直接排期。
  • 内部账号一律不投票,两个门槛只统计客户的票。内部只在候选页面发首楼评论、在提议评论下回复。
  • 提议人自己的 👍 计入那 7 票,这一条已对外公开,不要另立标准。

计票口径

  • 只数 👍,其他表情不计入任何门槛。
  • 一个 GitHub 账号在一个计票对象上只算一票,取消点赞则票数减少——门槛按当前实时票数判断,不按历史峰值。一条提议曾经到过 7 票又掉回 6 票,在还没建页的情况下不触发升级。
  • 候选功能页面只认主楼,楼下回复的 👍 不计票。
  • submit-idea.md 的主楼是内部说明帖,它自身的 👍 不代表支持任何具体提议,不计入任何门槛。

定期分诊

按周查看提一个新需求页面的评论区。对每条新评论选一个处理路径,并在该评论下回复结果,不要静默处理:

情况处理
该提议评论已满 7 票必须建候选页面,回复新页面链接并提示重新投票
未满 7 票但影响面明显或有合规要求可以提前建候选页面,同样回复链接
未满 7 票且无特殊理由不动,留在评论区继续累积票数,不要删除
与已有候选重复回复已有候选的链接,请对方去那里投票
是故障或个人事务回复引导到工单系统
描述不足以判断回复追问缺失的信息,等补充后再分诊
明确不做回复原因,同时在已上线与已关闭登记

建一个候选功能页面

  1. 复制 candidates/_template.mdcandidates/<slug>.md。slug 用 kebab-case、动宾结构、不带日期,例如 payroll-pdf-export
  2. 填写 frontmatter 与正文各节。order 控制侧边栏顺序,默认 50,需要置顶的候选调小。
  3. 保留 tags: [功能许愿池],专题页聚合依赖这个标签。
  4. index.md 的候选功能表格加一行:功能名(链接到新页面)、一句话说明、当前状态。
  5. 合并上线。

上线后必须「开池」

候选页面上线后,必须由内部人在该页面评论区发一条首楼评论,例如「本候选功能已开放投票,支持请给本楼点 👍」。

原因:giscus 只在第一次有人互动时才创建对应的 Discussion,而主楼的 👍 按钮在 Discussion 不存在时根本不会渲染。不发这条首楼评论,客户打开页面看不到任何投票入口,只能看到一个空评论框。

状态流转

正文第二行的 **当前状态:xxx** 是唯一的状态来源。改状态时同步做三件事:改候选页面这一行、改 index.md 表格对应那一列、在候选页面的「进展记录」表格加一行。

状态取值只用这五个:投票中、已排期、开发中、已上线、暂不做。

「投票中 → 已排期」这一步由 19 票门槛触发,看到满票就改,不需要额外审批。改状态时在「进展记录」里记明达成日期和当时票数。

进入「已上线」或「暂不做」时,从 index.md 的候选表格移除该行,改为在 shipped.md 对应的表格登记,候选页面本身保留不删

禁止事项

  • 不要改已发布候选页面的文件名或目录位置。 pathname 是 Discussion 的映射键,改路径等于换成一条新的空 Discussion,已有票数和讨论全部变成孤儿。slug 一次定死。
  • 不要把候选页面镜像到 docs/en/ /en/... 是另一个 pathname,会开出第二条 Discussion 把票数分流到两处。需要英文就在同一个页面里写双语。
  • 不要给 index.mdhow-to-vote.mdshipped.md 打开评论。 这三个页面的 frontmatter 里有 comment: false,目的是把提需求的流量全部收敛到 submit-idea.md,不要形成第二个入口。
  • 不要用内部账号给候选功能投票。 首楼评论由内部发,👍 留给客户。
  • 不要把重复提议各自建页。 相似需求必须合并到一条提议或一个候选页面上,票数分散会让两边都到不了门槛。
  • 不要改这两个数字。 7 和 19 写在对外页面上,调整门槛等于改对外承诺,需要先决定怎么处理已经在按旧门槛累积票数的提议和候选。

已知限制

总览页表格里的状态是人工维护的,票数不在总览页展示。要在总览页显示实时票数,需要一个组件走 GitHub GraphQL 查 Discussion 的 reaction 计数,而这需要 token,得挂在 Worker 后面转发。当前版本不做,先跑纯 markdown 加 giscus 的流程。

因此两个门槛都靠人工巡检发现:没有任何自动提醒会告诉我们某条提议满了 7 票、某个候选满了 19 票。既然门槛已经对外承诺,周巡检不能漏——每周需要过一遍 submit-idea.md 的评论区票数,以及全部「投票中」候选页面的主楼票数。这是当前设计里最脆的一环,也是后续做票数组件时优先要解决的问题。