TelevyBackup
TelevyBackup 是 macOS desktop backup app + Rust backend。README.md 标记为 work in progress,但已经有 Rust workspace、macOS app build/run scripts、packaging 和 release workflow,说明它不是单 crate 实验。
- Rust workspace
- Rust application
- macOS app
- Native macOS visual evidence
- PR label release
- Release failure notification
- Quality gates
目录
技术栈
运行与交付
- CI 工作流
- ci-main.yml
- ci-pr.yml
- label-gate.yml
- notify-release-failure.yml
- release.yml
- 能力标记
- cargo_toml
- github_actions
配置与质量
- 配置文件
- .gitignore
- Cargo.toml
- lefthook.yml
{
"ci_workflows": [
"ci-main.yml",
"ci-pr.yml",
"label-gate.yml",
"notify-release-failure.yml",
"release.yml"
],
"configs_root": [
".gitignore",
"Cargo.toml",
"lefthook.yml"
],
"markers_present": [
"cargo_toml",
"github_actions"
]
}Purpose
TelevyBackup 是 macOS desktop backup app + Rust backend。README.md 标记为 work in progress,但已经有 Rust workspace、macOS app build/run scripts、packaging 和 release workflow,说明它不是单 crate 实验。当前发布链路还把一次产品 PR 的 VERSION、merge SHA、tag、制品和 recovery 绑定成单一可审计的 release identity(docs/specs/product-version-release-chain/SPEC.md)。
Taxonomy
- Tags: Rust workspace, Rust application, macOS app, Native macOS visual evidence, PR label release, Release failure notification, Quality gates
- Why / evidence: 这些 tags 来自 checked-out repo 和 catalog record。主要证据包括
README.md、Cargo.toml、crates/core/、crates/daemon/、crates/cli/、macos/、packaging/、scripts/macos/build-app.sh。Topic token 的大小写以对应技术/工作流的官方写法为准;slug 只作为稳定 ID,不直接充当项目标题。
Repository map
Cargo.toml定义 workspace,members 包括crates/core、crates/daemon、crates/cli,并排除crates/mtproto-helper。macos/保存 macOS GUI app source/配置。scripts/macos/build-app.sh与scripts/macos/run-app.sh是本地 app 构建运行入口。packaging/保存打包材料,.github/workflows/*负责 CI/release。.github/release-contract.json是产品版本与 identity contract;.github/scripts/release_chain.py、release_reservation.py、release_preparation.py和release_completion.py分别承载版本解析、append-only refs、VERSION preparation 与完成 gate。.github/workflows/release-preparation.yml、release-completion.yml与release.yml将 preparation、merge gate 和 mainline build/publish 分开;.github/workflows/notify-release-failure.yml负责失败上下文。
Runtime and delivery
开发需要 Rust stable 和 Xcode Command Line Tools。CLI/daemon 用 cargo build,macOS app 用 ./scripts/macos/build-app.sh,dev variant 可用 TELEVYBACKUP_APP_VARIANT=dev,prod-like 运行可启用 Keychain。发布前由 Release intent label gate、release-preparation 和 release-completion 逐层验证;主线发布只消费已绑定 identity,并由 .github/scripts/test-release-chain.sh、test-release-reservation.sh、test-release-preparation.sh、test-release-completion.sh 与 test-release-workflows.sh 覆盖合同。
Architecture notes
架构分成 core domain、daemon、CLI 和 macOS GUI。Keychain 行为按 app variant 区分,这是 macOS app 记忆:dev 默认禁用 Keychain,prod-like 运行启用。未来备份引擎、daemon API 和 GUI 状态要保持 workspace 边界清楚。
证据锚点:README.md。
发布 identity 以最高合格 final vX.Y.Z tag 为唯一数字基线;prod 使用 final version,beta、rc、dev 使用同一 base 的精确 prerelease grammar,且 prerelease 不推进 final baseline(.github/release-contract.json、docs/specs/product-version-release-chain/SPEC.md)。
reservation 先于 VERSION preparation 创建,并通过 append-only 的 release-reservation、release-decision、release-bound 和 release-consumed refs 记录 claim、仲裁、merge binding 与 publication consumption;现有 ref 不更新、不删除、不 force-push(docs/adr/0010-release-identity-reservation.md、.github/scripts/release_reservation.py)。
发布失败只允许对相同 merge SHA/version/channel 做 same-SHA recovery;缺少 identity 的历史 merge 不能冒充 recovery,只能在单一边界上走显式、非空、只改 VERSION 的 version-only-release-pr,由新 PR merge SHA 产生新 identity(docs/specs/product-version-release-chain/SPEC.md、.github/scripts/release_preparation.py、.github/scripts/release_completion.py)。
窗口证据存在迁移状态:macos/TelevyBackupApp/UISnapshot.swift 仍使用 PDF/bitmap caching 预览和可见窗口枚举,不能作为当前严格的 WindowServer 证据;较新的 scripts/macos/capture-main-window.sh 与 capture-settings-window.sh 已开始绑定 PID、窗口语义和 screencapture -x -l,但仍需补齐 bundle identity、Accessibility 唯一性和歧义时 fail-closed。遗留路径只作为 Native macOS visual evidence 的负向样本,后续项目任务再迁移,不在本仓库修改下游脚本。
Workflow and quality gates
.github/workflows/ci-main.yml、ci-pr.yml、label-gate.yml、release-preparation.yml、release-completion.yml、release.yml、notify-release-failure.yml 和 review-policy.yml 表明 release intent、identity reservation、completion gate 与 failure notification 已接入;.github/quality-gates.json 将 release intent 和 completion 纳入 required checks。macOS app 还需要本地 Xcode 工具链验证,不能只看 Linux CI。release-intent.json 只是 run-bound 的 snapshot artifact;权威事实仍是 immutable refs、commit trailers、产品 tag 和已验证的 merge identity(docs/specs/product-version-release-chain/SPEC.md)。
Reusable decisions
- 把 core/daemon/cli 拆成 workspace crates,避免 GUI 直接承载业务逻辑。
- 用 app variant 管理 Keychain 行为,降低 dev 环境复杂度。
- macOS 打包脚本作为项目入口,写进 snapshot。
- 将窗口截图迁移拆成独立合同:先固定 target-window identity、fixture isolation 和 changed-surface matrix,再处理项目自身的 capture 实现;历史位图不作为正向证据。
- 先从 final tag 分配版本,再以 reservation/decision/bound/consumed append-only refs 固化 claim 与消费状态,避免把
VERSION当计数器(.github/release-contract.json、docs/adr/0010-release-identity-reservation.md)。 - 把
prod、beta、rc、dev的 channel grammar 与 final baseline 分离;same-SHA recovery 只复用原 SHA/version/channel,不计算 successor(.github/scripts/release_chain.py、docs/specs/product-version-release-chain/SPEC.md)。 - 将 normal preparation、
version-only-release-pr和 same-SHA recovery 作为不同 mode;version-only 补救产生新的 merge identity,不能伪装成旧 merge 的 recovery(.github/scripts/release_preparation.py、.github/scripts/release_completion.py)。 - 把 release intent snapshot 当作可丢失的 run context,恢复时回到 refs、trailers 与 product tag,避免 artifact 或 label snapshot 成为版本权威(
.github/workflows/release.yml、docs/specs/product-version-release-chain/SPEC.md)。
Risks and open questions
- WIP 状态下功能边界仍可能变化。
- Keychain、sandbox、签名/公证可能成为 release blocker。
- CI 与本地 macOS 构建能力不完全等价。
- reservation refs 与 product tags 依赖受保护的 release automation 权限;远端权限、provenance 或 identity 不完整时必须保持 fail closed,不能退回到
VERSION、merge order 或 snapshot 计算版本(.github/release-contract.json、docs/adr/0010-release-identity-reservation.md)。
Evidence index
README.mdCargo.tomlcrates/core/crates/daemon/crates/cli/macos/packaging/scripts/macos/build-app.shscripts/macos/run-app.sh.github/workflows/ci-main.yml.github/workflows/label-gate.yml.github/workflows/release-preparation.yml.github/workflows/release-completion.yml.github/workflows/release.yml.github/workflows/notify-release-failure.yml.github/release-contract.json.github/quality-gates.json.github/scripts/release_chain.py.github/scripts/release_reservation.py.github/scripts/release_preparation.py.github/scripts/release_completion.py.github/scripts/test-release-chain.sh.github/scripts/test-release-reservation.sh.github/scripts/test-release-preparation.sh.github/scripts/test-release-completion.sh.github/scripts/test-release-workflows.shdocs/adr/0010-release-identity-reservation.mddocs/specs/product-version-release-chain/SPEC.md
相关内容
macOS app
主题macOS app 指交付物是原生 macOS 图形应用,仓库需要长期处理 app bundle、平台工具链、桌面运行行为和 macOS 特有能力,而不是只有一个能在 macOS 上运行的 CLI。这里真正重要的是应用外壳和平台契约:如何构建 .app、怎样运行 dev/prod variant、何时接入 Keychain、文件访问与本地状态如何管理,以及后续是否能顺利走到签名、打包或分发(projects/televy-backup.
Manual version release delivery
主题Manual version release delivery 是一种可复用的发布交付合同:维护者显式选择或确认一次 release target,系统再用可插拔的 Version Policy 校验版本、绑定 source identity、完成 reservation、经过 PR 与质量门禁、创建显式 Release,并让部署与 recovery 复用该 identity 下对应的不可变产物。
Native macOS visual evidence
主题Native macOS visual evidence 是一套把原生 macOS 应用的 owner-facing 窗口截图当作可审计交付物的合同。它要求截图来自当前源码构建并运行的真实 .app,并且可以沿着 PID、bundle identifier、Accessibility role/title 语义和唯一 WindowServer window ID 回溯到目标窗口;PNG 只是证据载体,不是验收本身。
PR label release
主题PR label release 是逐 PR 的产品发布协议:PR labels 只提供经过 gate 验证的发布操作与发布阶段;最高的合格 final vX.Y.Z Git release tag 是唯一数字版本基线,VERSION 只锁定 trusted preparation 已决定的精确产品版本。label 不能计算、覆盖或为版本提供 fallback。
Quality gates
主题Quality gates 表示仓库把“什么叫可以合并、什么叫可以发布”写成了显式、可审计的契约,并通过本地脚本、CI workflows、review/signature policy、GitHub required checks 或同类机制把它执行出来。它关注的是 gate contract,而不是某一门具体技术。 这个 Topic 用来回答“仓库怎样防止低质量或不完整的改动穿过默认分支”。
Release failure notification
主题Release failure notification 指一个仓库为所有“预期成功但最终以 failure 结束”的交付 workflow 建立显式、可审查的告警路径。范围包括 release、deploy、CI、Docs Pages 和 required gate,但必须由 checked-in allowlist 声明;成功、skipped、cancelled 和通知 workflow 自身不属于通知条件。
Rust application
主题Rust application 指 Rust 是主执行面之一,交付物直接面向终端用户或操作者,而不是仅作为库、后端服务或固件组件存在。这里关心的是“应用如何被构建、运行、打包、调试和支撑用户工作流”,包括桌面 app、带 Web UI 的 hybrid app,或强用户导向的本地工具(projects/display-ambient-light-desktop.md、projects/televy-backup.md)。
Rust workspace
主题Rust workspace 指仓库通过 multi-crate workspace 明确拆出 domain、daemon、CLI、平台壳层或共享库边界,并把这种拆分当成长期维护契约,而不是一时为了方便 cargo 命令。这里关注的是 crate 之间的职责分工、共享代码如何流动、哪些能力应该被隔离,以及 workspace 结构怎样支撑后续测试、打包和演进(projects/televy-backup.md)。
Same-repository Homebrew Cask release
主题Same-repository Homebrew Cask release 指产品仓库同时承担产品源码、稳定 Release 产物和 Homebrew Tap 的一部分职责,并把 GUI Cask 作为稳定 Release metadata 的受约束投影。