Skills Manager v1.28.1
发布日期:2026-07-05
递交范围:v1.28.0...v1.28.1
发布概览
- 来自首次真实多设备同步的加固补丁:旧版本时代的历史残留不再永久阻塞合并、同步失败显示真实原因、涉及远端更新时备份页改说「同步」而非「备份」。
用户可见更新
- 历史残留不再阻塞同步 — 被旧版本备份过的技能库可能带着不可见的残留(没有元数据认领的技能目录、很久以前被提交进历史的半成品临时文件)。第一次真实的双设备合并恰好撞上了这些,永久失败且报错难以理解。现在合并会自动把临时垃圾从合并结果中清除,并容忍先前已存在的无主目录——它们照常随同步流动;只有合并自身会引入的不一致才会中止。
- 失败卡片显示真实原因 — 同步错误此前只显示最外层概要(「object merge aborted」),真正原因被吞掉;现在完整错误链会到达备份页,失败可以直接自诊断,不用翻日志。
- 「立即同步」取代「立即备份」 — 在「本地更改:0 · 远端更新:1」时按钮却叫「立即备份」,读起来像一次可能覆盖远端的推送。待同步状态现在区分三种情况:仅远端更新时有专属标题(「其他设备有更新」)、明确的「本机不会上传或覆盖任何内容」说明和「立即同步」按钮;双向状态则说明同步按技能合并、任何一端都不会被覆盖。
开发者与治理更新
- 构树输入自愈:托管元数据命名空间下应用从不书写的残余文件(
*.tmp.*原子写残留、非 JSON 杂物)在 plan 阶段从合并树丢弃;所有 commit 路径也会先删除工作区中的此类残留——只推不拉的设备永远轮不到 reconcile 清理,这正是当初垃圾被提交进历史的原因。 - 校验器规则 4 增加存量宽限集:合并输入任一侧已存在的无主技能目录被容忍(视角无关:两侧 tip 的并集);合并树对「合并自身引入的孤儿」保持从严。输入 tip 的校验(旧客户端检测)另经新增的
validate_input_tip容忍已提交的元数据垃圾。 classify_git_chain为所有备份命令错误保留完整 anyhow 链({:#})。- codex 对事故修复的评审发现两处缺口并已修复:旧客户端 tip 校验仍会对已提交的临时文件硬性失败;「垃圾已在历史里」的集成测试因应用自身提交路径现在会先清理临时文件而被静默掏空——改用 raw git 提交构造,并经变异验证(禁用 plan 阶段丢弃逻辑该测试即失败)。后端测试 377 个。
当前校验状态
- ✅ 跨平台构建通过(macOS Intel / macOS ARM / Windows x64 / Linux x64)
- ✅ TypeScript typecheck 通过
English release notes
Release date: 2026-07-05
Commit range: v1.28.0...v1.28.1
Release Overview
- Hardening patch from the first real-world multi-device sync: legacy leftovers from older app versions no longer permanently block merging, sync failures show their actual reason, and the Backup page says "sync" instead of "back up" when remote updates are involved.
User-facing
- Legacy leftovers no longer block syncing — Libraries that were backed up by older app versions could carry invisible remains (skill folders without metadata, half-written temp files committed long ago). The very first real two-device merge hit exactly this and failed permanently with an opaque error. Merging now cleans temp junk out of the merged result automatically and tolerates pre-existing unmanaged folders — they sync along untouched; only inconsistencies a merge itself would introduce still abort.
- Failure cards show the real reason — Sync errors previously displayed only the outermost summary ("object merge aborted") while the actual cause stayed hidden; the full error chain now reaches the Backup page, making failures diagnosable without log spelunking.
- "Sync Now" instead of "Back Up Now" — With "local changes: 0 · remote updates: 1" the button said "Back Up Now", reading like a push that might overwrite the remote. The pending state now distinguishes its three situations: remote-only updates get their own title ("Updates from your other devices"), an explicit "nothing here is uploaded or overwritten" description, and a "Sync Now" button; mixed states say that syncing merges per skill and neither side overwrites the other.
Developer & Governance
- Plan-stage input self-heal: residual files inside the managed metadata namespace that the app never writes (
*.tmp.*atomic-write leftovers, non-JSON strays) are dropped from the merged tree; every commit path also deletes such leftovers from the working tree first — a push-only machine never runs the reconcile cleanup, which is how one got committed in the first place. - Validator rule 4 gains a grandfather set: skill dirs already unclaimed in either merge input are tolerated (viewpoint-independent: the union of both tips); the merged tree stays strict about orphans a merge would introduce. Input-tip validation (old-client checks) additionally tolerates committed metadata junk via the new
validate_input_tip. classify_git_chainpreserves the full anyhow error chain ({:#}) for all backup command errors.- A codex review of the incident fixes surfaced two gaps, both fixed: the old-client tip validation still hard-failed on committed temp files, and the legacy-dirt integration test silently lost its "junk already in history" topology because the app's own commit path now cleans temp files — it commits via raw git now and was mutation-verified (disabling the plan-stage drop makes it fail). Backend tests: 377.
Current Verification
- ✅ Cross-platform build passed (macOS Intel / macOS ARM / Windows x64 / Linux x64)
- ✅ TypeScript typecheck passed
完整变更:v1.28.0...v1.28.1