From 417dabb1276d2e7c270878e61753d4396d24d6e6 Mon Sep 17 00:00:00 2001 From: XiuChengWu <732857315@qq.com> Date: Fri, 3 Jul 2026 15:17:59 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=96=B0=E5=9B=A2?= =?UTF-8?q?=E9=98=9F=E6=88=90=E5=91=98=E7=8A=B6=E6=80=81=E5=92=8C=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E6=B8=85=E7=90=86=E7=BB=8F=E9=AA=8C=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=96=87=E6=A1=A3=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .showen/TEAM_CHAT.md | 142 +++++++++++++++++++++++++++++++++++++++++++ CLAUDE.md | 9 +-- souls/wang-haoran.md | 8 +++ souls/zhao-yuwei.md | 7 +++ souls/zhou-yating.md | 1 + 5 files changed, 163 insertions(+), 4 deletions(-) diff --git a/.showen/TEAM_CHAT.md b/.showen/TEAM_CHAT.md index fca383b..c38b097 100644 --- a/.showen/TEAM_CHAT.md +++ b/.showen/TEAM_CHAT.md @@ -2719,3 +2719,145 @@ plugin-sdk 镜像(plugin-sdk/src/lib.rs:70-149)与主库 17 个变体一一 ### 五、总判定 17 个变体中:**11 个闭环 ✅;WifiProvisioned/DeviceEvent 为 Phase 2 占位 ❌(非回归缺陷);Shutdown/DeviceResponse/CursorVisibility 弱链 ⚠️(行为性瑕疵,已给建议);Custom 六种 plugin_* kind 全部闭环(修正赵雨薇过时结论)**。风险3 可关闭:无"消息发出去没人处理"的黑洞(除示例性 Custom heartbeat 外),断链项全部是已规划的 Phase 2 占位,且每条均有 file:line 可复核。 + +--- + +## [2026-07-03] 赵雨薇 → 陈逸飞:设备磁盘清理 + +老板批准的目标机磁盘清理已完成。**96% → 44%(可用 1.2G → 15G),共回收约 13.4G**。showen_v2.service 全程未受影响(清理前后同一 PID 12896)。 + +### 清理明细 + +| 目录 | 删前大小 | 依赖检查结论 | 结果 | +|------|---------|-------------|------| +| ~/.gradle | 2.8G | 无 gradle/flutter/dart 进程;systemd/autostart/crontab 无引用 | ✅ 已删 | +| ~/Android | 2.4G | 同上 | ✅ 已删 | +| ~/flutter-sdk | 2.2G | 同上 | ✅ 已删 | +| ~/.pub-cache | 214M | 同上 | ✅ 已删 | +| ~/.dartServer | 63M | 同上 | ✅ 已删 | +| target/debug | 3.5G | 无进程使用 debug 产物;只删 debug,release(526M)未碰 | ✅ 已删 | +| ~/.nvm | 1.1G | 无 node 进程;systemd/autostart 无 node/nvm 引用;设备未装 cron(crontab 命令不存在) | ✅ 已删(条件满足) | +| /var/cache/apt | 392M | apt-get clean 官方缓存清理 | ✅ 392M → 24K | +| /var/log/journal | 1.5G | journalctl --vacuum-size=100M(只清归档日志) | ✅ 1.5G → 89M | + +### df 前后对比 + +``` +前: /dev/mmcblk0p3 28G 26G 1.2G 96% / +后: /dev/mmcblk0p3 28G 12G 15G 44% / +``` + +### 服务健康证据(清理后) + +``` +$ systemctl --user is-active showen_v2.service +active +$ pgrep -af "showen_v2 --config" # 过滤 ssh 自身后 +12896 /home/showen/Showen/ShowenV2/target/release/showen_v2 --config /home/showen/Showen/ShowenV2/configs/dog_state_machine.json # 单实例,与清理前同 PID +$ ls -la target/release/showen_v2 +-rwxr-xr-x 2 showen showen 11508080 6月 3 2026 showen_v2 # 大小/日期与清理前一致 +``` + +红线目录抽查完好:~/.rustup、~/.cargo、~/.claude、~/.config、~/autostart_backup_20260702、Showen/ShowenV2/configs 均在。无跳过项(清单全部执行)。 + +备注:CLAUDE.md 待处理#6 的"磁盘长期 9x% 满"本次已解除;时钟慢一年(NTP 失效)仍未处理,属另案。两轮验收被迫清 target/debug/incremental 的问题以后不会再发生——debug 产物已整体移除,下次目标机跑 test 会重新编译 debug(首次耗时略长,属预期)。 + +## [2026-07-03] 赵雨薇 → 陈逸飞:设备开发工具清除(追加指令) + +老板追加指令执行完毕:设备上后装开发工具(Claude Code / VSCode / Cursor 及同类残留)已全部清除。**44% → 35%(再回收约 2.7G)**;两轮累计 **96% → 35%,可用 1.2G → 18G**。服务全程无感知(仍为同一 PID 12896)。 + +### 清除明细 + +| 项目 | 位置 | 大小 | 处理方式 | +|------|------|------|---------| +| Claude Code 配置/数据 | ~/.claude + ~/.claude.json | 131M + 12K | rm(claude 可执行文件随上一轮 ~/.nvm 已灭,which claude 为空) | +| VSCode 主程序 | dpkg 包 `code` 1.110.0 | 489M (Installed-Size) | sudo apt-get purge -y,dpkg -l 确认无残留 | +| VSCode 用户数据 | ~/.vscode + ~/.config/Code | 20K + 18M | rm | +| Cursor 主程序 | dpkg 包 `cursor` 2.6.14 | 786M (Installed-Size) | sudo apt-get purge -y | +| Cursor 用户数据 | ~/.config/Cursor | 4.2M | rm(~/.cursor、AppImage、/opt 均不存在) | +| Cursor apt 源 | /etc/apt/sources.list.d/cursor.sources + /usr/share/keyrings/anysphere.gpg | — | rm(防止 apt update 再拉取;Signed-By 指向确认过才删) | +| kilo 残留 | ~/.local/share/kilo | **1.2G**(bin 952M node_modules/kotlin-ls/rg + kilo.db 104M + snapshot 76M) | rm。判断依据:kilo 机制老板 2026-07-02 已明令废除,PATH 无 kilo 可执行,无任何引用。**注意:kilo.db 任务历史一并删除,特此声明** | +| opentui 残留 | ~/.local/share/opentui | 6.1M | rm(kilo CLI 配套 TUI 的 tree-sitter 缓存,同属废除机制) | +| kotlin daemon 残留 | ~/.local/share/kotlin | 8K | rm(上一轮已删 Android/Gradle 环境的日志残留) | + +依赖检查证据:`pgrep -af "claude|vscode|cursor|code-server|kilo|opentui"` 过滤 ssh 自匹配后为空;systemd/autostart 无任何引用;~/.cache 下无 Code/Cursor/claude 缓存;purge 后 `apt-get autoremove --dry-run` 无 Remv 条目(无孤儿依赖)。 + +### 存疑未删清单 + +| 名称 | 大小 | 判断 | +|------|------|------| +| ~/.local/share/flatpak | 8K | 仅一个空 db,flatpak 二进制未安装;非编辑器/IDE,8K 无收益,未动 | +| ~/.local/share/kate | — | KDE 自带编辑器组件,属 KDE 桌面红线,未动 | + +### df 对比与服务健康 + +``` +本轮前: /dev/mmcblk0p3 28G 12G 15G 44% / +本轮后: /dev/mmcblk0p3 28G 9.3G 18G 35% / +$ systemctl --user is-active showen_v2.service → active +$ pgrep -af "showen_v2 --config"(滤自匹配)→ 12896 单实例(与清理前同 PID,未重启) +$ ls -la target/release/showen_v2 → -rwxr-xr-x 2 showen showen 11508080 6月3 2026(完好) +``` + +红线抽查:~/.rustup、~/.cargo、~/.config(除 Code/Cursor 子目录)、~/autostart_backup_20260702、Showen/ShowenV2/ 均完好。 + +--- + +## [2026-07-03] 王浩然 → 陈逸飞:设备时钟修复(待处理 #6 时钟部分,闭环) + +### 根因(证据齐全,两个叠加) + +1. **systemd-timesyncd 从未启用**:`systemctl status` = `disabled; inactive (dead)`,`journalctl -u systemd-timesyncd` = `-- No entries --`(一次都没跑过)。设备上无 chrony/ntpd,唯一时间服务就没开。 +2. **RTC 芯片 hym8563 内容失效**:开机 dmesg `rtc-hym8563 14-0051: no valid clock/calendar values available` + `hctosys: unable to read the hardware clock`;`hwclock -r` 报 `ioctl(RTC_RD_TIME) 无效的参数`。芯片掉电后 VL 标志置位,内容作废——开机无法从硬件钟恢复,NTP 又没开,时间永远停在内核 fallback(2025-06-26)。 +3. **排除"NTP 源不可达"假设**:启用后 debian pool 实测可达(193.182.111.142,延迟 167ms),但为可靠性仍换国内源(aliyun 延迟 20ms)。 +4. 旁证:/etc/adjtime 记录 last calibration ≈ 2026-03-07,说明设备历史上有过正确时间,掉电丢失。 + +### 改动清单(只动时间配置,未碰其他任何东西) + +| 动作 | 命令/文件 | +|------|----------| +| 手动拨时 | `sudo date -s "2026-07-03 14:54:06"`(timedatectl 因 RTC 读失败不可用,用 date -s 破局) | +| 修复 RTC | `sudo hwclock -w` —— 写入即清除 hym8563 失效标志,此后 `hwclock -r` 恢复可读,芯片没坏 | +| NTP 配置 | 重写 /etc/systemd/timesyncd.conf:`NTP=ntp.aliyun.com ntp1.aliyun.com`,`FallbackNTP=cn.pool.ntp.org time1.cloud.tencent.com` | +| 启用服务 | `sudo timedatectl set-ntp true` + restart → enabled + active(持久化) | + +### 验证证据 + +- 修复后 `timedatectl`:`System clock synchronized: yes / NTP service: active / RTC time 与 UTC 一致`;`timesync-status`:Server 203.107.6.88 (ntp.aliyun.com),offset -673us +- **apt 复活**:`sudo apt-get update` exit 0,清华源+radxa 源全部 HTTPS 拉取成功,零证书报错(只刷新索引,未装任何包) +- **重启持久化**:`sudo reboot` 后 40s 回归。开机 dmesg:`rtc-hym8563: setting system clock to 2026-07-03T07:03:04 UTC`——**开机第一秒时间即正确**,不再依赖网络校时;timesyncd enabled+active 自启并再次同步 aliyun +- 服务健康:`ps aux | grep "[s]howen_v2 --config"` 单实例(count=1)+ `systemctl --user is-active showen_v2.service` = active + +### 遗留风险(如实记录,无需现在处理) + +- **RTC 备份电池未验证**:热重启 RTC 保持了时间,但若整机长时间断电且无备份电池,RTC 会再次失效。此时开机时间错,需等网络可用后 NTP 自动拉回(timesyncd 已持久化,会自愈)。影响:断电冷启动到联网前的窗口期内时间不可信。 +- 时钟前跳一年副作用:journal 时间线出现断层(2025-06-26 → 2026-07-03)属正常现象;磁盘 9x% 满是独立问题(本轮已由清理任务缓解至 35%),与时钟无关。 + +**待处理 #6 的时钟部分可关闭。** 未 commit(老板管提交)。 + +--- + +[2026-07-03] 周雅婷(测试工程师) → 陈逸飞(CEO): M1.2 设备同步完成 + +老板提交 2a6e14b 后的设备仓库同步 + 形式验证: + +1. **丢弃 scp 旧版**:设备 `git checkout -- tests/` 清掉 07-03 两轮验收期间 scp 的未提交测试文件 +2. **bundle 同步 + ff 合并**:5770b70 → 2a6e14b(1 个提交,19 文件,含两个返工测试文件 + 全部文档),预检确认 configs/dog_state_machine.json 不在 diff 内、纯祖先关系 +3. **设备最终状态**: +``` +$ git log -1 --format="%H %an %s" +2a6e14b976e38348ced120cbafdd0d1c376c00bc XiuChengWu feat: Update project documentation and workflow to reflect changes in task dispatching and testing processes +$ git status --short + M configs/dog_state_machine.json ← 仅剩设备本地改动,未触碰 +``` +4. **cargo check --workspace --all-targets 形式验证**(/tmp/m12_synccheck.log,未停服务): +``` + Checking showen_v2 v0.2.0 (/home/showen/Showen/ShowenV2) + Finished `dev` profile [unoptimized + debuginfo] target(s) in 3m 57s +===CHECK_OK=== +``` +`grep -cE "^warning" /tmp/m12_synccheck.log` = **0(零 warning)** + +设备环境确认:时钟已正常(2026-07-03 15:07 CST),磁盘 18G 可用(35%)。showen_v2.service 单实例运行中(pid 1180, target/release)。 + +**M1.2 设备侧收尾完成,只差老板打 tag。** diff --git a/CLAUDE.md b/CLAUDE.md index 5492fc2..68edbc2 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -80,7 +80,7 @@ export PATH="/home/showen/.rustup/toolchains/stable-aarch64-unknown-linux-gnu/bi | 张明远 | 1 | — | 2026-07-03 | | 李思琪 | 0 | — | 2026-03-19 | | 王浩然 | 0 | — | 2026-03-19 | -| 赵雨薇 | 1 | — | 2026-07-03 | +| 赵雨薇 | 0 | — | 2026-07-03(设备双 P0 修复 + 两轮磁盘清理连续出色,按"连续2次成功"重置) | | 林晓峰(QA) | 0 | — | 2026-03-19 | | 周雅婷 | 0 | — | 2026-07-03(两轮验收执行出色) | @@ -91,7 +91,7 @@ export PATH="/home/showen/.rustup/toolchains/stable-aarch64-unknown-linux-gnu/bi ## 当前状态 - **质量**: **147/147 已在 Linux ARM64 目标机验证**(2026-07-03 实跑:lib 105 + example 7 + m1_2_dynamic 15 + m1_2_http 12 + m1_2_service_manager 8);Flutter 15/15;零 warning -- **里程碑**: M1.1 完成,**M1.2 测试验收已通过**(两轮:第一轮 1 失败 3 warning → 返工 → 第二轮全绿),收尾差 commit+tag(待老板批准)+ 风险3 核查 +- **里程碑**: M1.1 完成,**M1.2 收尾完成**(147/147 两轮验收全绿、风险3 关闭、老板已提交 2a6e14b、设备已同步并复验零 warning),仅差老板打 tag - **DevicePlugin 能力**: Display + SleepInhibit + Backlight + Cursor (Linux ARM64) - **ScreenPlugin**: 已重构为 thin wrapper - **Flutter App**: 完成度 ~98%, APK v0.3 (52.6MB) 已编译, cupertino_icons 已修复 @@ -138,12 +138,12 @@ export PATH="/home/showen/.rustup/toolchains/stable-aarch64-unknown-linux-gnu/bi ### 待处理 -1. **[M1.2 收尾 — 待老板批准]** git commit 返工后的两个测试文件 + 本轮文档改动,打 M1.2 tag;**commit 后必须重新同步设备**(设备 tests/ 下是 scp 的未提交版本,HEAD 仍 5770b700) +1. **[M1.2 收尾]** ✅ commit(老板 2a6e14b)→ ✅ 设备同步至 2a6e14b + cargo check 零 warning(周雅婷 2026-07-03,设备仅剩本地调参文件 configs/dog_state_machine.json 一处差异);**仅剩:老板打 tag(建议在 2a6e14b 上打 `m1.2`)** 2. ~~**[M1.2 收尾]** tests/m1_2_http.rs 过时注释更新~~ ✅ 赵雨薇完成(2026-07-03,纯注释改动,核实点位后订正为"六种 plugin_* 闭环,唯 check_updates 结果回传属 Phase 2");注意此改动在第二轮验收之后,commit 前设备端补一次 cargo check 即可 3. **[M1.2 收尾]** sanitize_filename 集成测试测的是逻辑复制而非产品函数,转正需产品侧小改动(改 pub 或 routes.rs 内加单测)— 赵雨薇上报 4. DevicePlugin 阶段三(framebuffer迁移/触摸/音频/多平台)— Phase 2 规划 5. **[设备遗留-代码]** 单实例保护(锁文件/socket 互斥)+ unclutter 僵尸子进程 reap — 派内核/视频工程师 -6. **[设备遗留-系统]** 设备时钟慢约一年(NTP 失效,apt HTTPS 证书报 not yet valid)+ 磁盘长期 9x% 满(两轮验收均被迫清 target/debug/incremental)— 需排查 +6. ~~**[设备遗留-系统]** 时钟慢约一年 + 磁盘 9x% 满~~ ✅ 全部解决(2026-07-03):时钟 — 王浩然修复(根因:timesyncd 出厂未启用 + RTC hym8563 掉电失效标志;已配 aliyun NTP 持久化 + hwclock 恢复,apt 复活,重启验证开机即正确;遗留:RTC 备份电池未验证,冷启动需联网自愈);磁盘 — 赵雨薇两轮清理 96%→35%(删 Flutter/Android/编辑器/kilo 等 ~16G) 7. **[环境]** 设备 SSH 已打通:`ssh -p 2222 showen@192.168.31.105` 免密(2026-07-02 配置),目标机验收可远程执行 8. **[代码质量-P2]** Shutdown 消息无生产触发者:main.rs:117-120 Ctrl+C 只置 AtomicBool,主循环阻塞在 rx.recv(),需等下一条任意消息才真正退出(王浩然发现) 9. **[Phase 2 清理]** SDK 文档教开发者监听永不触发的 WifiProvisioned (plugin-sdk/src/lib.rs:522);CursorVisibility 有消费无生产(实际链路已走 DeviceCommand);check_updates 结果仅 println 不回传;DeviceResponse 广播后核心无人读、Error 静默 @@ -194,6 +194,7 @@ export PATH="/home/showen/.rustup/toolchains/stable-aarch64-unknown-linux-gnu/bi - ❌ 直接写代码/改代码/跑测试 - ❌ 微观管理具体执行细节 - ❌ 接受无证据交付 +- ❌ **执行 git commit/push/tag** — 改动就绪后提醒老板提交,绝不代办(2026-07-03 老板指示) ### 评审节奏 - **周评审**: PM 进度 + QA 质量 + 产品规划 diff --git a/souls/wang-haoran.md b/souls/wang-haoran.md index 1fe9c99..6b9b81e 100644 --- a/souls/wang-haoran.md +++ b/souls/wang-haoran.md @@ -64,3 +64,11 @@ - 审计陷阱:构造点可能藏在 #[cfg(test)] 内(如 ble/gatt.rs:772、dynamic_plugin.rs:348),必须回看 mod tests 边界再下判定 - BLE 命令的真实生产者是 core/dispatch.rs::parse_command(gatt.rs:120 调用),不在 gatt.rs 里直接构造消息 - 结论:WifiProvisioned/DeviceEvent 均为"有消费无生产"的 Phase 2 占位(DeviceBackend trait 连事件通道都没有);plugin_rollback/switch/install 已是完整实现,队友旧注释会过时——审计要以当前代码为准,不能沿用他人历史结论 + +## 个人经验 (2026-07-03) — 设备时钟修复 + +- 时钟类故障先分层:服务层(timesyncd 是否 enabled)→ 硬件层(RTC 可读?dmesg 找 rtc 驱动报错)→ 网络层(NTP 源可达性)。本次前两层全中,第三层假设被证伪——别先入为主怪网络。 +- hym8563 这类 I2C RTC 掉电后置 VL 失效标志,`hwclock -r` 报 EINVAL 不等于芯片坏:`hwclock -w` 写一次即清标志恢复。 +- `timedatectl` 依赖 RTC 可读,RTC 失效时它整个不可用——破局用 `sudo date -s`。 +- `sudo -S` 从 stdin 读密码,与 heredoc 重定向互斥(heredoc 会顶掉管道,首行被当密码吞掉);远程写 root 文件用 `echo pwd | sudo -S bash -c 'printf ... > file'`。 +- apt "certificate not yet valid" 时禁止走 apt 装 ntp/chrony(自举死锁),只能用系统自带 timesyncd 或手动设时破局。 diff --git a/souls/zhao-yuwei.md b/souls/zhao-yuwei.md index 938c83f..f459ef0 100644 --- a/souls/zhao-yuwei.md +++ b/souls/zhao-yuwei.md @@ -107,3 +107,10 @@ - **测试要先实跑再交付**:m1_2_http.rs 首次交付时本机编不了 aarch64 依赖、没实跑,结果目标机暴露 1 个失败 + 1 个 dead_code warning。编不了也要逐个测试核对前提,不能只靠"看起来对" - **写测试前先核对产品校验(坏前提)**:`test_empty_playlist_does_not_panic` 假设空 playlist 配置能通过 `AppConfig::from_file`,但 config.rs `validate()` 自 init 提交就 `bail!("playlist 不能为空")`。测试的每个 expect/unwrap 前提都要回到产品代码里确认,产品故意拒绝的状态应改测"拒绝行为"(防退化),而不是硬造不可达状态 - 测试辅助 struct 里"以后可能用"的方法(如本次的 `sender()`)不要预留;用不上就删,dead_code warning 违反零 warning 铁律 +## 设备磁盘清理经验(2026-07-03) +- 磁盘清理逐项走"依赖检查→du 记录→删除→确认"四步,每步留证据;条件项(如 ~/.nvm)先查进程 + systemd/autostart/crontab 引用再决定 +- `pgrep -af` / `ps | grep` 远程执行时会命中承载命令的 `bash -c` 自身,必须过滤自匹配再下结论,否则会把"无进程"误判成"有进程" +- 只删 target/debug 时用绝对路径精确到 debug 子目录,删后立即 `du + ls` 复核 release;运行中服务健康以"前后同一 PID"为最强证据(说明连重启都没发生过) +- journal 是隐形大户(本次 1.5G),`journalctl --vacuum-size=100M` 只清归档段、安全;apt 缓存 `apt-get clean` 即可(392M→24K) +- 本次共回收 ~13.4G:Flutter/Android 环境 7.6G + target/debug 3.5G + nvm 1.1G + apt 392M + journal 1.4G,96%→44% +- 追加(开发工具清除):deb 装的编辑器(code/cursor)用 `dpkg -l` 确认来源后走 `apt-get purge`,配套删 sources.list.d 源文件和 keyring(Cursor 的 keyring 叫 anysphere.gpg,按 .sources 里 Signed-By 找,别按名字猜);purge 后跑 `autoremove --dry-run` 确认无孤儿依赖;删除有历史数据的工具目录(如 kilo.db)时在交付里显式声明,不能默默带走 diff --git a/souls/zhou-yating.md b/souls/zhou-yating.md index 96c9040..7b567d4 100644 --- a/souls/zhou-yating.md +++ b/souls/zhou-yating.md @@ -80,3 +80,4 @@ - 2026-03-14:新增 `tests/m1_2_service_manager.rs`,补齐 M1.2 ServiceManager 集成测试基建,覆盖依赖启动顺序、Shutdown 停机、ConfigReloaded/PlayerStatus/WifiResult/StateChanged/PluginReady 广播,以及禁用插件路由跳过 - 2026-07-02:M1.2 目标机验收(Linux ARM64)。经验:① 跑全量测试前先 `df -h`——ARM 设备 28G 盘 98% 满导致 ld 链接失败(No space left on device),清 target/debug/incremental + 过期 deps 即可,不必 cargo clean 全量重编;② cargo test 默认 fail-fast,验收要加 `--no-fail-fast` 才能拿到全部 target 的统计;③ "从未实跑过的测试"是最大风险源——test_empty_playlist_does_not_panic 的前提(空 playlist 可加载)与 config.rs 自 init 起的校验矛盾,代码评审没发现,一跑就露馅;④ 同步版本用 git bundle + fetch + merge --ff-only 最安全,先确认祖先关系和设备脏文件不在 diff 内 - 2026-07-03:M1.2 第二轮(返工后)验收全绿 147/147 零 warning。经验:scp 未提交文件到设备时必须两端 sha256 对账,并在交付中显式标注设备与 git HEAD 的不一致状态,提醒 commit 后重新同步 +- 2026-07-03:M1.2 设备同步收尾(2a6e14b)。流程定型:先 `git checkout -- ` 丢弃临时 scp 版本 → bundle ff 同步(预检祖先关系 + 设备脏文件不在 diff 内)→ 同步后补 cargo check(纯 check 不必停服务)。新规矩:git commit 由老板亲自管,团队一律不 commit