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
目录
技术栈
运行与交付
- 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
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
相关内容
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)。