给子扬 · 提交规范 + 本周提交复盘

一周
193 次提交

这份文档只解决一件事:敲下 git commit 之前,脑子里该过哪几道题。所有例子都不是编的——全部取自你本人这一周的真实提交记录。

// 收件人:子扬 · skyrim1179676226@gmail.com · GitHub @ZiYang0702
// 统计窗口:2026-07-27 → 2026-08-03 · 数据源:GitHub Search API(author-email 精确匹配)

WORKFLOWUP/WORKFLOW · 169 WORKFLOWUP/SHORTVIDEO · 20 AKKE-AI/AKKE · 4 38 个 PR +60,882 行 630 个文件
SCROLL / 向下滚动
01
Weekly Checkup

先看体检报告

规范不是拿来背的,是拿来对照自己的。所以先把你这一周的数字摆出来——后面每一条规则,都会回到这些数字上找你自己的例子

0
次提交
横跨 3 个仓库、8 天
0
个 Pull Request
37 个已合并 · 1 个还开着
0
行新增代码与文档
删除仅 735 行
0
个文件被动过
平均每个 PR 摸 17 个文件

每天提交几次

307-27周一
3807-28周二
4307-29周三
1407-30周四
3607-31周五
2208-01周六
2008-02周日
1708-03周一

// 07-27 那根灰柱矮是统计窗口的切边(GitHub 按 UTC 零点切),不是你那天没干活。
// 周六周日各 20+ 次——这份文档不劝你少提交,只想让每一条更值钱。

提交都落在哪个仓库

WorkflowUP/Workflow视频产线 · 主战场 169
WorkflowUP/shortvideo门店工作台 · 07-31 新建 20
Akke-AI/Akke主产品 · 接口对接 4
一句话读懂

你这周的重心是 WorkflowUP/Workflow 的 B-roll 素材库与视频复刻产线(169 次里 74 次带 brollreplica 标签),中途分出两天把门店短视频工作台从零建成一个新仓,末尾在 Akke 侧开了一个只读接口把两边接上。这是一条完整的产品线,不是零散的活。

02
Anatomy of a Commit

一次提交,拆开来看有五块

团队用的是业界通用的 Conventional Commits(约定式提交)。它不神秘,就是把提交信息切成固定的五块,让人和机器都能一眼读懂。下面这条是你自己写的(Akke 8a785e3),我把它拆开标了颜色。

feat(api): 每日素材只读接口,供短视频工作台读今日选题 (#1142) │ ← 这里必须空一行,机器靠它区分标题和正文 短视频获客工作台需要在页面上显示「今日选题」,运营在飞书群看到哪几条、 页面上就该是哪几条。 实现上读 material_digest_pushed 台账 join videos,不重跑一遍筛选: video-material-digest 那 1300 行里是整部业务口径迭代史,任何再实现 都会跟飞书卡对不上,而对不上比没有更糟——运营会以为页面漏了素材。
① type

这次改动属于哪一类。七个候选词,选错不会报错但会误导所有人。

② scope

动的是哪一块。写模块名,让队友一眼判断"关不关我的事"。

③ 标题

一句话说清做了什么。中文,不超过一行,句尾不加句号。

④ 正文

解释为什么这么做。代码只能说明"怎么做",为什么只能你写。

⑤ 引用

PR 号 (#1142) 由 GitHub 合并时自动补,你不用手写。

同一件事,两种写法

下面这个演示会自己循环播放。左边是随手写的,右边是按规范写的——改动的代码完全一样

GIT COMMIT -M …
$
为什么较真

三个月后线上出问题,有人 git log 翻到这一行。「修改工作台」告诉他的信息量是零,他只能一个个点开看 diff;「fix(workbench): 去掉多门店切换,任务改为并行生成多支视频」让他 3 秒判断是不是这条。差别只有你多敲的 20 个字。

03
Choosing a Type

七个词,怎么选

团队规定只用这七个(全局 CLAUDE.md「Git 提交」条)。不要自创。判断法很简单:问自己"这次改动,对使用者意味着什么"

FEAT加了新能力

用户/队友现在能做一件之前做不到的事

你的例子 · 57 次
feat: 今日选题加「抓一批新的」按钮

FIX修了坏的

之前行为不对,现在对了。没有新增能力。

你的例子 · 38 次
fix(middleware): /api/material-feed 加入免登白名单

DOCS只动了文档

一行代码没改,只改 .md / 注释 / 记录。

你的例子 · 68 次
docs(replica):审片系统建设全过程与九个卡点

PERF变快/变省了

行为不变,但更快、更省钱、更省资源

你的例子 · 7 次
用于 B-roll 检索与标注的提速改动

REFACTOR只是重整

外部行为一点没变,只是代码结构更清楚了。

你这周 · 0 次
不是问题——重构本来就该少而慎重

TEST只动了测试

加测试、改测试。被测的代码没动

你的例子 · 1 次
这一项偏少,见第 10 节建议

CHORE杂务

依赖升级、配置调整、脚本搬家。跟业务无关

你的例子 · 2 次
chore: 工作台 demo 页挂到 worker 静态托管

✗ 自创不允许

你写过 4 次 memory(broll):——memory 不在名单里,工具认不出来。

应该写成 · docs(memory):
你在 Workflow 仓其它 34 次就是这么写的

你这一周的 type 分布

193COMMITS
docs 生产记录、方案、经验档案——你最大的产出68 35.2%
feat 新能力:工作台、素材接口、审片闸门57 29.5%
fix 修正:鉴权白名单、闸门判据、差一天38 19.7%
perf + chore + test 提速 7 · 杂务 2 · 测试 110 5.2%
Merge 分支合并,Git 自动生成,不用管10 5.2%
✗ 不合规 没有 type 前缀,或用了名单外的词10 5.2%

// 94.8% 合规——这个数字放在团队里是好的。剩下 10 条不合规全部集中在两处,第 09 节会具体点出来。

04
Scope

括号里那个词,是给队友的路标

scope 就是"我动了哪一块"。它不是必填的,但写了之后,队友刷 git log 时能直接跳过跟自己无关的行。你这周写得相当好——135 条带了 scope,而且用词稳定。

brollB-roll 素材库与标注 57
memory团队共享记忆库 34
replica视频复刻产线 17
douyin-replica抖音复刻 skill 11
video / hooks / skills选题调研 · 会话钩子 · 技能 9
其它单次 scopeapi · middleware · runner · workbench… 7
没写 scope只有 feat: / fix: / docs: 41
✗ 没有路标
feat: 门店素材上传服务
feat: 迁到团队账号,改用 R2 binding
fix: 登录框默认填门店码
fix: 移除工作台冗余说明文案

这四条都是 shortvideo 仓的真实提交。孤立看没问题,但连成一片 log 时,读者不知道哪几条属于同一块——上传服务、存储迁移、登录、文案,其实分属四个模块。

✓ 有路标
feat(upload): 门店素材上传服务
feat(storage): 迁到团队账号,改用 R2 binding
fix(auth): 登录框默认填门店码
fix(workbench): 移除工作台冗余说明文案

同样四条,加了括号。负责存储的人只需要看第二条;查登录问题的人一眼锁定第三条。你在 Workflow 仓一直是这么写的,只是新仓开工时没带过去。

怎么定 scope

不用纠结。用你自己在项目里叫它的那个名字——目录名、模块名、功能名都行,只要同一块东西每次都用同一个词。你的 broll 用了 57 次都没变过,这就是标准答案。

05
The Body

标题说"做了什么",正文说"为什么"

代码本身已经完整记录了怎么做的——diff 摆在那儿。代码唯一说不出口的是为什么这么做、为什么不那么做。这就是正文存在的全部理由。

0/193
条提交写了正文
占比 33.7%
0
你写过最长的一条
douyin-replica #42
0
走 PR 合入的提交
这些几乎都带了正文
0
直推 main 的提交
正文比例明显偏低

范本:你自己写的那条

这是 3723a96(Akke,fix middleware)。它只有 4 行正文,但把一次修改该交代的东西全交代完了——照着这个模板写就够了

✓ 你的原文
fix(middleware): /api/material-feed 加入免登白名单

跟 /api/internal/* 同款:没有 Supabase 登录态,
route 自校验 MATERIAL_FEED_KEY。

漏了这条时 middleware 直接 401,返回的
{"error":"Unauthorized"} 跟 route 自己的鉴权
失败几乎一样,排查时会误以为 key 配错了。

第一段答"为什么这么改"(有现成同款做法可循);第二段答"不这么改会怎样"(报错长得一模一样,下一个人要浪费半小时排查)。

✗ 如果只写标题
fix(middleware): /api/material-feed 加入免登白名单

读者能知道你加了白名单,但不知道为什么这个接口可以免登(它自带 key 校验),也不知道踩过什么坑。三个月后有人做安全审计,看到"免登"两个字,第一反应是把它删掉。

正文写什么 · 三段式

段一什么问题逼你动手

业务场景、报错现象、谁在抱怨。写给不在场的人看

"运营当天素材用完或不满意时,不想干等明早 09:00 那班定时车。"

段二为什么选这个做法

尤其是否决掉的另一条路——这才是最值钱的信息。

"不重跑一遍筛选:那 1300 行里是整部业务口径迭代史,任何再实现都会跟飞书卡对不上。"

段三留了什么坑给后人

已知限制、未验证的假设、需要谁拍板。诚实比完美重要

"⚠️ 四句品牌承诺尚未经甲方核实,发布前须逐条确认。"

// 三段都是你自己写过的原句。你已经会了——问题只是这一周里有 128 条提交没这么写。

06
Four Lanes into Main

代码进 main,有四条路

写完 commit 不算完——它得进 main 才算数。团队里有四条路,每条路的"审查强度"不一样。选错路的代价是:要么白排队,要么没人看就上线了。

通道 A
直推 main
本地 commit → git push,代码立刻进 main、立刻触发部署。零审查。 你这周走了 121 次(62.7%)· Workflow 100 + shortvideo 20 + Akke 1
通道 B
走 PR
开分支 → gh pr createCI 跑 + Claude 自动评审 → 绿了才 squash 合并。 你这周走了 29 次(15.0%)· 对应 38 个 PR,37 个已合并
通道 C
钩子自动
会话结束时 Stop hook 自动把记忆库改动 commit 并直推,你不用管。 你这周被自动提交 33 次(17.1%)· 全是 docs(memory): auto-commit
通道 D
Merge 提交
本地 git pull 撞上远端新提交时 Git 自动生成的合并记录。 你这周产生 10 次(5.2%)· 用 git pull --rebase 可以基本消除
A · 直推 main零审查 121 62.7%
C · 钩子自动机器写的 33 17.1%
B · 走 PR有审查 29 15.0%
D · Merge 提交Git 自动 10 5.2%
重点

62.7% 直推本身不是错——文档、记忆库、诊断脚本本来就该直推,团队规则明写了。真正要看的是:那 121 次里,有没有该走 PR 的东西混进去了。第 08 节讲怎么判。

07
Two Orgs, Two Rulebooks

两个组织,两套规矩

你横跨的三个仓库,纪律强度完全不同。同一个动作(比如直推 main)在一个仓是常规操作,在另一个仓会被 CI 标红 + 推飞书告警。换仓库先换脑子。

对比项Akke-AI / AkkeWorkflowUP / WorkflowWorkflowUP / shortvideo
仓库性质主产品 · 多租户线上系统视频产线 · 工作流与档案门店工作台 · 07-31 新建
CI 检查tsc + lint + vitest仅部署类 workflow
PR 自动评审claude-review 生效配了但一直失败
高危路径闸门本地 pre-push + CI 标红
直推 main仅限 docs/**scripts/_*常规做法(记忆库靠钩子直推)目前 100% 直推
自动合并auto-merge 标签,pr-janitor 四道闸放行手动合
你的提交数416920
建议保持 现在的姿势就是对的修评审 见 09-①补规范 见 09-②

AKKE 的分层规则按改动路径决定走不走 PR

高危路径必须 PR;其余 src/ / scripts/ 建议 PR、小 fix 可直推;docs/**scripts/_* 直推。

这套规则的唯一事实源是仓里的 scripts/high-risk-paths.regex,不是谁的记忆。

WORKFLOW 的钩子机制记忆库改动自动直推

每轮会话结束,Stop hook 自动把 docs/claude-memory/ 的改动 commit 并推 main——只在主目录、只在 main 分支、只含记忆路径

这解释了你那 33 条 auto-commit不是你手写的,不用为它们负责

08
High-Risk Paths

什么改动必须走 PR

Akke 仓里有一份"高危路径"清单。判断标准不是"重要",而是——改错了不会报错,而是安静地在线上出事。这类改动谁都不许直推。

改错 = 线上静默事故

  • src/lib/llm.tsllm/** — 线上话术
  • src/lib/langfuse.ts — 全链路追踪
  • src/app/api/cron/** — 定时管道
  • vercel.json — cron 排程(曾被直推覆盖丢行)

改错 = 数据/权限出事

  • supabase/migrations/** — 数据库结构
  • src/lib/auth/** — 多租户隔离守卫
  • .github/** — CI 与部署链路本身

随便直推

  • docs/** — 含团队记忆库
  • scripts/_* — 带下划线前缀的一次性诊断脚本
  • *.md — 说明文档

两道闸怎么拦你

git push
你敲下推送
闸门 ①
本地 pre-push
命中高危路径直接拒绝推送,
当场提醒你开 PR
闸门 ②
CI 事后标红
绕过闸①也逃不掉:
GitHub 上标红 + 推飞书告警

// 闸① 拦不住 git push --no-verify,闸② 也只标红不回滚——它们的作用是"必留痕、必有第二双眼睛知道",不是物理阻断。
// 为什么不用 GitHub 原生分支保护?免费计划的私有仓开不了,这两道自建闸就是全部防线。

给你的实操建议

你这周在 Akke 只提交了 4 次,其中 3 次走了 PR、1 次是 fix(middleware) 直推。那次直推严格说踩线了——middleware.ts 虽不在清单里,但它是全站鉴权入口。判断法很简单:问自己"这行改错了,系统会报错吗?"报错的可以直推,安静出错的一律走 PR。

09
Three Real Findings

三个实测出来的问题

下面三条不是泛泛而谈,是逐条跑命令核出来的,都附了原始证据。第一条最要紧,而且不是你的错——但它让你这周 34 个 PR 的审查全部白做了

Finding 01 · 高

Workflow 仓的 PR 评审,一次都没真跑过

仓里配了 claude-code-review.yml,每开一个 PR 就触发 Claude 自动评审。但它每一次都失败,而且失败原因不是代码问题——是这个仓库没安装 Claude Code 的 GitHub App,换令牌的那一步直接 401。

$ gh run list --workflow=claude-code-review.yml --limit 8 30817754320 failure 2026-08-03T13:23:48Z pull_request 30805180907 failure 2026-08-03T10:20:32Z pull_request 30804357606 failure 2026-08-03T10:08:35Z pull_request …(最近 8 次全部 failure) $ gh run view 30817754320 --log-failed App token exchange failed: 401 Unauthorized — Claude Code is not installed on this repository.

更要命的是时间对不上。以 PR #71 为例:你 10:20:29 建 PR、10:20:46 就合了——17 秒。而评审任务 10:20:36 才启动、10:21:03 才结束。就算它能跑通,你也早合完了。

PR #71 存活时间WORKFLOWUP/WORKFLOW
17 秒建完就合,没等任何人
Claude 评审耗时10:20:36 → 10:21:03
27 秒合并后才跑完,且以 401 告终
对照:Akke PR #1142同一周 · 正确姿势
13 分钟claude[bot] 留了评审意见

对照组是你自己做的:Akke 的 PR #1142,13:33 开、13:46 合,中间 13 分钟里 claude[bot] 留下了评审意见,你按意见改了三处并写进了 commit 正文(评论查询封顶、days 差一天、补 env 示例)。这就是 PR 该有的样子。

怎么修 ① 让仓库 admin 到 github.com/apps/claude 给 WorkflowUP/Workflow 装上 App —— 这是一次性动作,装完 34 个 PR 的评审能力立刻恢复。
② 建 PR 后别立刻合。哪怕只等 60 秒——评审跑完再点合并,否则开 PR 这个动作只剩形式。
Finding 02 · 中

shortvideo 新仓开工时,规范没带过去

这个仓 2026-07-31 新建,两天里你提交了 20 次。问题不在提交本身,在于你在老仓的好习惯,一条都没带进来

20 条提交里 — 6 条没有 type 前缀:「精简今日选题页面文案」「调整工作台导航与品牌信息」 「重做审核意见交互」「简化顶栏账号与主题控制」… 20 条全部直推 main(0 个 PR) 只有 3 条带 scope(workbench / runner) 仓库配置 — .github/workflows 不存在(无 CI、无评审) 无 CLAUDE.md(新同学接手时没有任何规则可读)

对比一下:同一双手,同一周,在 Workflow 仓写的是 fix(broll): 口型闸门加局部低谷判据 + 闸门进产线的观察模式;在 shortvideo 写的是 重做审核意见交互差别不是能力,是新仓开工时没人提醒。

怎么修 ① 补一个 CLAUDE.md,把提交规范和分支策略写进去——三行也行,关键是有。
② 从 Akke 抄一份最小 CI(tsc --noEmit + lint 就够),让它至少能拦住语法级错误。
③ 已经推上去的那 6 条不用改(改历史比留着更危险),从下一条开始带前缀就行
Finding 03 · 低

memory: 不是合法的 type

你有 4 条提交写成 memory(broll): …memory: …。意思很清楚——"这次动的是记忆库"。但 memory 不在七个词的名单里,任何按 Conventional Commits 解析的工具(变更日志生成、版本号推导、提交筛选)都会把它当成不合规而跳过

你写的: memory(broll): 搜图去水印直接用 — 用户拍板通过 应该写: docs(memory): broll 搜图去水印直接用 — 用户拍板通过 └─ type 用 docs(本来就只动了 .md) scope 用 memory(正好表达"动的是记忆库") 参照:你自己另外 34 条就是这么写的 — docs(memory): auto-commit MEMORY.md broll-library-semantic-match.md

这条影响很小,放在这里是因为它暴露了一个通用判断法:当你想不出该用哪个 type 时,说明你把"改的是什么"塞进 type 了——那是 scope 的活。

记住这个口诀 type 回答"这次改动的性质"(新增 / 修复 / 文档 / 提速 / 重整 / 测试 / 杂务,只有七选一);
scope 回答"改的是哪一块"(随便你写,只要前后一致)。
10
What You Got Right

这些你已经做得比多数人好

上面挑了三个毛病,但这一周的整体质量是高的。把做对的地方明确写出来,是因为下面这几条最容易在赶工时第一个丢掉

01 · 合规率 94.8%type 前缀基本没漏

193 条里 183 条带了合法 type。更难得的是七个词你用得准——没有把新增写成 fix,也没有把改文档写成 feat。这一项很多人做不到。

02 · scope 词表稳定同一块永远同一个词

broll 用了 57 次没变过,replica 17 次、memory 34 次同理。稳定的 scope 让 git log 变成可检索的索引,这是长期价值。

03 · 正文写得深会写"否决了什么"

你的长正文里反复出现"为什么不那么做"——不重跑筛选、不复用 CRON_SECRET、不落在 cron 目录下。这是资深工程师才有的习惯,绝大多数提交正文只会复述 diff。

04 · 会标风险不确定的地方明确写出来

「⚠️ 四句品牌承诺尚未经甲方核实,发布前须逐条确认」「已知语义:手动挑走的这批不再出现在明早那张卡里」。把未验证的东西写进提交,比藏起来强一百倍。

05 · 会吸收评审意见并写回提交正文

Akke #1142 的第三个 commit 开头就是「按 auto-review 的三条」,逐条列了改法。这让后来人知道这段代码经过审查、审了什么。

06 · PR 粒度合理一半在 500 行以内

38 个 PR 里 24 个新增 < 500 行。超 2000 行的 6 个全是文档/档案入库(最大的 #39 是 28,472 行经验档案),不是代码巨块——这个分布是健康的

唯一的能力缺口

193 次提交里只有 1 次test。产线类代码(闸门判据、配额、去重、状态机)出错是静默的,而你这周恰好写了很多这类逻辑。不用追求覆盖率,但"闸门判据"这种一句话能测的地方,值得顺手补一个断言。

11
The 60-Second Card

提交前,过这六题

前面十节都可以忘掉,这一张记住就行。六个问题,正常情况下 60 秒能过完。

1
这次改动是哪一类?
七选一:feat 新能力 / fix 修错 / docs 只动文档 / perf 变快 / refactor 只重整 / test 只动测试 / chore 杂务。想不出来就说明你在纠结 scope,不是 type。
2
动的是哪一块?
括号里写模块名。关键是同一块每次用同一个词——你的 broll 就是范本。实在跨多块就不写。
3
标题能让人 3 秒判断"关不关我的事"吗?
一句中文说清做了什么,别写「优化」「调整」「更新」这种空词。句尾不加句号。
4
有没有"为什么"是代码看不出来的?
有就空一行写正文。三段式:什么问题逼你动手 / 为什么选这条路(尤其否决了什么)/ 留了什么坑。没有就只写标题,不用硬凑。
5
这行改错了,系统会报错吗?
会报错 → 可以直推会安静出错 → 必须走 PR。鉴权、定时任务、数据库迁移、CI 配置、线上话术,全属后者。
6
开了 PR,等评审跑完了吗?
CI 绿 + 评审有结论再合。17 秒就合掉的 PR 等于没开。Workflow 仓的评审现在是坏的(见 09-①),修好前那个仓的 PR 只是留痕。
一句话总括:提交信息不是写给 Git 看的,是写给三个月后那个正在排查线上问题、没时间读代码的人——而那个人多半是你自己。你这周 193 次提交里,写得最好的几条已经证明你完全会写;要补的只有两件事:新仓开工时把规范带过去,以及开了 PR 就等评审跑完。
Palette · Pantone Reference

本页色板

全页只用五个信号色,每个色固定对应一种语义——看到颜色就知道该用什么态度读。括号内为最接近的 Pantone 参考色号。

PANTONE 3255 C#3FE0C5

合规 · 自动化 · 做对了的地方

PANTONE 143 C#F6B352

需要人来判断 · 注意事项

PANTONE 279 C#6FA8FF

规则 · 流程 · 服务端

PANTONE 2645 C#B48CFF

后台机制 · 钩子自动执行

PANTONE 190 C#FF7D97

风险 · 红线 · 必须修的问题