— PR Triage
【免费下载链接】voiceboxThe open-source AI voice studio. Clone, dictate, create.项目地址: https://gitcode.com/GitHub_Trending/voicebox1/voicebox
Working doc for tracking which open PRs land in . Delete after release cut.
Last updated:
Progress
Tier 1: 0 / N mergedTier 2: 0 / M handledSupersede triage: pending
Merge for — critical bug fixes
| PR | Status | Size | What it fixes | Why must-have |
|---|---|---|---|---|
| #123 | [ ] | +5/-0 | ... | ... |
Strong candidate — needs a quick review
| PR | Status | Size | Summary |
|---|
Close as superseded
| PR | Status | Reason |
|---|
Defer to <NEXT_VERSION>
- #xxx ... — reason
Order of attack
- Close superseded PRs (one-liner comments)
- Merge tier-1 in dependency-free batches — check file paths don't overlap
- Review tier-2 individually
- Rerun
draft-release-notesto pick up everything - Run
release-bump
文档明确指出:**Progress 头部是全文最重要的部分**——它既是记分牌,也保证会话中断后可以干净地续作。这条与后续第 10 步呼应:每一次合并、关闭、follow-up 之后都要更新该文档,因为"丢失文档就是丢失整个会话状态"。 ## 第五步:逐 PR 执行合并循环 对 tier-1 / tier-2 列表中的每个 PR 执行 a–g 七个动作。 **a. 在 review worktree 中 checkout:** ```bash cd ../voicebox-pr-review git checkout pr-review-<VERSION> # 先重置到中性基点 gh pr checkout <N>b. 读"实际的提交",而不是main..HEAD:
git show HEAD # PR 的改动本体 git show --stat HEAD # 触碰的文件 + 行数技能文档用加粗警告:绝不要用git diff main..HEADreview 一个比 main 老的 PR 分支。那个 diff 会把"PR 分叉之后 main 上落下的每个提交"都显示为-(删除)行——一个 3 行的 PR 会伪装成 700 行的 revert。文档称这是"误判一个 PR 的最容易的方式"。
c. 评估关注点:正确性、改动范围、与已合并工作的交互、版本兼容性(例如不能用到一个当前依赖版本尚未固定的 API)。
d. 若分支落后于 main,则 rebase:
git fetch origin main git rebase origin/main这一步在 squash 合并前是必须的。原理:GitHub 的 squash 计算的是diff(PR-head, merge-base)——分支陈旧时,这个 diff 会包含"回滚中间所有提交"的内容。rebase 把 merge-base 前移,squash 结果才干净。
e. 若maintainerCanModify为真,把 rebase 后的分支推回贡献者的 fork:
git remote add <author> https://github.com/<author>/<repo>.git git fetch <author> <branch> # 先取对方的 ref git push <author> HEAD:<branch> --force-with-lease这保证 GitHub 的 PR 页面与 rebase 后的状态一致,从 GitHub 侧看合并是干净的。
f. 合并:
gh pr merge <N> --squashg. 更新 triage 文档——把勾选项翻成✅ merged <sha>(短 SHA 取自gh pr view <N> --json mergeCommit --jq '.mergeCommit.oid[0:7]'),并同步 Progress 头部。
第六步:批量合并"微型修复"
满足以下全部条件的 PR 可以跳过"逐 PR 仪式",在一个循环里直接合并:改动 ≤5 行、CI 干净、文件路径不重叠、意图显然正确(如单行依赖放宽、加环境变量、修 import 路径)。
for pr in 425 384 416 429; do echo "=== Merging PR $pr ===" gh pr merge $pr --squash done合并后必须验证每一条都干净落地:
for pr in 425 384 416 429; do gh pr view $pr --json state,mergeCommit --jq "{pr: $pr, state, sha: .mergeCommit.oid[0:7]}" done第七步:合并后的 follow-up 策略
有时一个 PR 带着一个已知的小问题也值得合并(文档举例:不完整的 dtype map、遗留的 stale sentinel 清理)。原则是:不要用 follow-up 阻塞合并——先合并,紧接着在主 worktree 里以正常"分支 + PR"方式补上:
cd <main-worktree> git pull --ff-only origin main git checkout -b fix/<short-name> # edit... git commit -m "fix(<area>): <one-liner>" git push -u origin fix/<short-name> gh pr create --title "..." --body "Follow-up to #<N>. ..."两个 SHA(本 PR 与 follow-up PR)都要记入 triage 文档(✅ merged <pr-sha> + follow-up <pr>)。文档同时给出例外条款:直推 main 只在显式、有限范围的政策下(例如"release speedrun")允许,不要把它当默认。
第八、九步:Supersede 关闭与 Partial-apply 模式
Supersede 的标准动作是关闭时附一条指向取代者的信用评论:
gh pr close <N> --comment "Closing — superseded by merged #<M> which landed <brief description>. Thanks!"再次强调:先看 diff 再下结论,"标题相似"不够。如果 PR 只是部分被取代(诊断正确,但只有一半改动仍然需要),走 partial-apply:
cd <main-worktree> git pull --ff-only origin main # 从 PR 分支按文件 cherry-pick git checkout <pr-commit-sha> -- <file1> <file2> # review 暂存区,按需调整 git diff --cached # 对不想整体覆盖的文件做外科式编辑 # (例如 PR 里的文件早于 main 上需要保留的近期提交) # 提交,并用 trailer 记原始作者的功劳 git commit -m "$(cat <<'EOF' <subject> <body explaining what was kept vs dropped> Co-Authored-By: <author> <noreply@github.com> EOF )" git push ... # 分支 + PR,除非处于直推 main 例外然后关闭该 PR,用评论说明哪些内容被应用、哪些被丢弃,并引用被应用的 commit SHA。
第十、十一步:文档保鲜与完成判定
- 每一步都更新
<VERSION>_PR_TRIAGE.md:它是会话日志,中断后第二天续作时是"我在哪"的唯一事实来源。 - triage 完成的判定:文档中每个 PR 都有终态(✅ merged / ✅ closed / deferred);Progress 头部每个 tier 都显示 N/N;下一个要跑的技能是
draft-release-notes(针对新 main 重新生成[Unreleased]),然后release-bump。 - 发布后可以删除 triage 文档,也可以留在版本历史里作为记录。
技能总结的"深坑",以及它们在 Voicebox 仓库中的对应证据
Gotchas一节是这个技能最有复用价值的部分——多数条目直接对应 Voicebox 仓库里真实存在的实现。逐条对照:
1. 陈旧分支上的main..HEAD会撒谎。它把分叉后 main 新增的内容全部显示为删除行。永远用git show HEAD看 PR 的实际提交。这是文档在 Notes 中自称"本技能最重要的一行"。
2. Squash 合并未 rebase 的分支会回滚中间的工作。Squash 计算diff(PR-head, merge-base);rebase 把 merge-base 前移。(对应第五步 d。)
3.mergeable=UNKNOWN是瞬态。GitHub 在推送后重新计算中,直接尝试合并即可。
4. 路由注册顺序在 FastAPI 中很关键。文档原文:DELETE /history/failed必须先于DELETE /history/{id}注册,否则参数化路径会把"failed"当成 ID 消费。这条在 Voicebox 后端中有直接对应:backend/routes/history.py 中固定资源路由@router.delete("/history/failed")(L65–L69,供 UI 的 "Clear failed" 按钮使用)确实定义在参数化路由@router.get("/history/{generation_id}")(L72 起)之前——同文件中/history/stats(L35)同样位于/history/{generation_id}之前,可见这是一个贯穿该文件的注册顺序约定。
5. Apple 的-weak_framework会覆盖同名 framework 的-framework,与顺序无关。当依赖硬链接了某个可选框架时,应通过cargo:rustc-link-arg=-Wl,-weak_framework,Name处理。Voicebox 的 tauri/src-tauri/build.rs 正是这么用的:其中对ScreenCaptureKit输出cargo:rustc-link-arg=-Wl,-weak_framework,ScreenCaptureKit(L10),因为 ScreenCaptureKit 是 macOS 上按需链接的可选能力,与仓库的系统音频捕获模块(tauri/src-tauri/src/audio_capture)配套。
6. 依赖版本下限约束你能套用多少内容。文档举例:在接受torch_dtype=→dtype=这类 kwarg 改名前,要检查最小版本 pin 是否支持它;有时正确动作就是 cherry-pick PR 的一半。仓库中 backend/backends/hume_backend.py 在加载 Hume 模型时仍使用torch_dtype=model_dtype(L190),与该提示的场景吻合。
7.cpal::Stream等!Send音频类型不能跨await点或spawn_blocking移动。此时"不理想但正确"的同步等待有时就是能选的最佳修复——标记问题但不要阻塞合并。仓库的 Tauri 端确以 cpal 0.15 作为音频栈(见 tauri/src-tauri/Cargo.toml),且cpal的Stream在 tauri/src-tauri/src/audio_output.rs 与各平台 audio_capture 实现 中均为非Send类型,这一条是其在 Rust/Tokio 环境下的直接工程约束。
8. PyTorch nightly 构建不可用于发布。非确定性、可能逐次回归。若某 PR 建议切到 nightly 修 GPU 问题,优先TORCH_CUDA_ARCH_LIST=...+PTX或等稳定版支持。CHANGELOG.md 中有对应先例:曾通过TORCH_CUDA_ARCH_LIST加入sm_120+PTX为 Blackwell 架构做前向兼容(一次关闭 #386/#395/#396/#399/#400 五个报告);docs/content/docs/overview/gpu-acceleration.mdx 也记录了构建以TORCH_CUDA_ARCH_LIST=...12.0+PTX固定的做法。
Canonical 命令速查
技能末尾给出的命令参考(原样保留,<N>为 PR 编号):
# 批量 PR 元数据 gh pr list --state open --limit 50 --json number,title,author,mergeable,mergeStateStatus,additions,deletions,maintainerCanModify,files # 单个 PR 详情 gh pr view <N> --json body,author,headRefName,baseRefName,mergeable,maintainerCanModify,files,statusCheckRollup # 实际提交,而非 branch-vs-main diff git show HEAD git show --stat HEAD gh pr diff <N> # 把贡献者分支 rebase 到当前 main git fetch origin main && git rebase origin/main # 把 rebase 推回贡献者 fork(要求 maintainerCanModify=true) git remote add <author> https://github.com/<author>/<repo>.git git fetch <author> <branch> git push <author> HEAD:<branch> --force-with-lease # 合并 gh pr merge <N> --squash # 取合并 SHA 记入 triage 文档 gh pr view <N> --json state,mergeCommit --jq '{state, sha: .mergeCommit.oid[0:7]}' # 关闭被取代 PR gh pr close <N> --comment "Closing — superseded by merged #<M>. Thanks!"【免费下载链接】voiceboxThe open-source AI voice studio. Clone, dictate, create.项目地址: https://gitcode.com/GitHub_Trending/voicebox1/voicebox
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考