Skip to content

项目指标改成读数器注册表,一个项目挂多个指标,新增 X 粉丝数 (#39) - #122

Merged
joesmart merged 4 commits into
mainfrom
joesmart/feat-project-metrics
Oct 24, 2026
Merged

joesmart merged 4 commits into
mainfrom
joesmart/feat-project-metrics

Conversation

@joesmart

@joesmart joesmart commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

改了什么

  • 读数器注册表(control-plane/src/metrics/readers.ts):每种能直读的指标按平台注册,声明走哪个平台的接口授权账号、请求哪个路径、从回包哪里取数、取不到怎么说。取令牌、超时、401 重试一次再记过期、非 2xx 这些通用部分留在 poller.ts。GitHub 星数迁进来,行为不变(原有星数用例只换了挂指标的辅助函数,goal 的期望多一个 metric: null,读数和时机的断言没动)。
  • 一个项目挂多个指标:契约 metricSource 改成 metricSources 数组(最多 8 个,同一个指标不能挂两次)。goal.metric 指明目标对的是哪一个,null 是手记的那条。任务卡新增 metrics,和 metricSources 一一对应:每个指标给出读数、读到的时间,以及账号是否连着(connected / disconnected;Bot 报的数为 null)。样本表加 metric 列,按 (群, 指标) 分序列。
  • 迁移 0051:加 goal_metric、metric_sources、metric_samples.metric 三列。旧的单个来源迁成一个元素的数组,旧样本和目标都归到这个指标上,然后删掉 metric_source。
  • X 粉丝数:走本人已连的 X 接口授权账号,读 /2/users/me 的 public_metrics.followers_count。只在电脑浏览器上登着、没连接口的账号不读,项目页提示「账号没连上,去连接」。
  • 读不到不清旧值:读数失败不落样本,项目页继续显示上次的数和「读于 MM-DD HH:mm」。
  • 改目标时选对哪个数:PATCH 校验目标对的指标必须挂着,直接对一个没挂的、或者摘掉目标对的那个,都回 400,什么都不改。goal 不带 metric 时保留原来对的那个,显式给 null 才改对手记那条(Web 照旧每次都带)。
  • Bot 报数:落到哪由 shared 的 landReported 一处定,控制面和运行器都用它。label 和挂着的某个「Bot 报的数」同名,记到那个指标;一个都没挂、目标对手记那条(或没目标),记到手记那条,单指标的老项目照旧;其余一律不收(目标对的是读数器读的数,或挂了 Bot 报的数但名字都对不上),控制面整条丢掉并打 warn(群、runId、label、原因,不记数值)。运行器发之前按任务卡先判一遍,不收就回中文错误让 Bot 改了重报,控制面那道仍是权威。运行器的任务卡在挂了 Bot 报的数时多一行「要报的数」,列出这些名字;没挂就没有这一行,旧项目的 prompt 字节不变。
  • Web:项目页逐行列出每个指标(名称、「目标」标签、值或「还没读到」、本周变化、读到的时间、账号断了时的去连接按钮,点了打开账号页)。任务卡目标表单在挂了指标时多一个「对哪个数」选择框,390 宽下格子和选择框能收窄,不超出聊天栏。mock 照控制面同步。

复核后这一轮(4bf4ea7)

  • 复核发现 label 对不上时报数落进目标那个指标:目标对互动率时报「粉丝数」会把互动率顶成 1200,目标对 GitHub 星数时报「小红书粉丝」会把星数顶成 9999。改成上面「Bot 报数」那条规则。
  • landReported 返回 MetricLanding:{ kind: "land", metric }(metric 为 null 是手记那条,和 goal.metric 同一约定)或 { kind: "refused", reason },reason 是 unknown_label(带挂着的名字)或 polled_goal。控制面 recordSample 改收一个落点函数,手动记数和 Bot 报数各传各的,原来的 PickMetric 三态收掉。
  • PATCH 目标不带 metric 不再悄悄改对手记那条,契约、控制面、mock 一起改。
  • 390 宽群页目标表单被「对哪个数」撑到 543px:光给 select 加 min-width: 0 不够,它外面那格 label 是 flex 项、默认不肯比内容窄,所以 .field 也加了 min-width: 0,输入框加 max-width: 100%。390 宽下整页仍有横向滚动(侧栏固定 272px,聊天栏只剩 118px,任务卡右上按钮、头部电脑按钮、保存按钮本来就出界),不是这个表单引起的,没在这一轮动。

为什么

#39:项目指标只能读 GitHub 星数,其他平台只能手填;评论里要求一个项目能挂多个指标(粉丝、星数、互动率)。

小红书这条没做,留给后续,所以这里写 Refs 不写 Fixes。后续接法:小红书没有公开读数接口,指标挂 { kind: "reported", platform: "xiaohongshu", label },由 Bot 在例行里用浏览器读完调 report_metric 上报。「建小红书项目时自动挂一条读数例行」要在建项目时按这类来源生成例行,也没做。控制面 README「目标与手动记数」一节写了怎么接。

怎么验证

pnpm format:check                                       → All matched files use Prettier code style!
pnpm typecheck                                          → 0 错误
pnpm lint                                               → 退出码 0(警告都在本线没碰的旧文件里)
pnpm --filter @baize/shared test                        → 280 passed
pnpm --filter @baize/bot-runner test                    → 1709 passed | 15 skipped
.lane/pg-serial.sh pnpm --filter @baize/control-plane test → 1605 passed | 1 skipped
.lane/pg-serial.sh pnpm --filter @baize/e2e test        → 55 passed
E2E_API_PORT=3951 E2E_WEB_PORT=5951 pnpm --filter @baize/web test → vitest 358 passed,Playwright 519 passed

新用例在 origin/main 上都是红的(在临时工作树里只换测试文件跑过):控制面 goals / metric-poller / metric-sources-migration 里 17 条失败,shared 2 条,runner 1 条,Web Playwright 1 条。复核这一轮的新用例先单独提交在 fcde304,在 e71677d 上红:控制面 3 条(P1、P2、PATCH 保留 metric),runner 2 条,shared 2 条,Web 390 宽 1 条(超出聊天栏 153px)。

Refs #39

🤖 Generated with Claude Code

https://claude.ai/code/session_01Be3SZps2JjqvyrJ1vbLmni

joesmart and others added 4 commits October 25, 2026 05:09
…90 宽目标表单不再被选择框撑开 (#39)

- shared 加 landReported,返回 MetricLanding:land 带序列键(null 是手记那条),refused 带原因(unknown_label 列出挂着的名字,polled_goal)。
- 控制面 handleMetricReport 改用它,不收的整条丢掉,warn 写群、runId、label 和原因,不记 value。recordSample 改收一个落点函数,PickMetric 三态收掉。
- 运行器 report_metric 发之前按任务卡判一遍,不收就抛中文错误,告诉 Bot 照哪个名字写,或者这个数由读数器读。
- UpdateTaskRequest 的 goal.metric 可省,省了保留原来对的那个,给 null 才改对手记那条,控制面和 mock 一起改。
- 目标表单的格子和选择框可以收窄,390 宽下不超出聊天栏。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Be3SZps2JjqvyrJ1vbLmni
@joesmart
joesmart force-pushed the joesmart/feat-project-metrics branch from 4bf4ea7 to ac626f4 Compare October 24, 2026 21:19
@joesmart
joesmart merged commit f82cafe into main Oct 24, 2026
1 check failed
@joesmart
joesmart deleted the joesmart/feat-project-metrics branch October 24, 2026 21:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant