From 3673f6f92b06f4876a90e3d26ae6c5cd43e3a3ef Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Tue, 6 Oct 2026 19:06:57 +0800 Subject: [PATCH] =?UTF-8?q?fix(agc):=20AGC=20=E5=A3=B3=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E9=97=A8=E7=A6=81=E6=8C=89=E4=BA=A4=E4=BB=98=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E6=94=B6=E7=AA=84=E5=88=B0=20Windows=EF=BC=8C=E4=BF=AE=20Linux?= =?UTF-8?q?=20CI=20=E7=BA=A2=E5=9B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 背景(CI run 3603 证据):lane 1/2 在 Linux 上报 `error: could not compile genarrative-ai-game-creator-shell (bin) due to 54 previous errors`,逐条是 `never used`(acl_repair_gate 的 AclRepairGateResult/AclRepairPolicy/ACL_REPAIR_POLICY/LeaderGuard、Windows 策略路径 normalize_windows_policy_path、编辑器 RPC managed_editor_rpc/execute_unity_editor_code/execute_godot_editor_code、process_session_bridge 的 verdict 枚举与桥服务、configure_windows_background_tokio_command 等)。这些项在 Windows 上都被真实调用(本地 Windows bin 口径 0 warning 可证),在 Linux 上因大量 Windows 专用实现被整块编掉而变成未用项。 修法:main.rs 顶部由 `#![cfg_attr(not(test), deny(warnings))]` 改为 `#![cfg_attr(all(not(test), windows), deny(warnings))]`,并把注释写清两个条件(not(test) = 隔离 test harness 实例假死;windows = 交付面是 WebView2/Windows,Linux 构建存在的未用项是“编译剔除”产物)。 CI 无外部 RUSTFLAGS/-D warnings 注入(已全仓核对 .gitea/scripts/package.json),因此 Linux 构建只会把它们当普通 warning,不会红。 同步更新 dev 运维文档「Rust 编译告警门禁」的 AGC 特例条目:记录 cfg(windows) 的来历与 54 条实测数字,并保留 not(test) 的原有说明。 验证(Windows,门禁仍生效):bin 口径 0 warning / EXIT=0;--all-targets EXIT=0(test harness 实例 336 条,全部属测试构建产物);cargo fmt --all --check、npm run check:encoding(5406 文件)、git diff --check 全 rc=0;零新增 #[allow]。 同批还包含:合并 origin/master(merge commit 2a3d1b3d6),满足 CI 守卫步骤 “pull request head 必须包含最新 base commit”(此前 Backend tests 因此 exit=1)。 --- apps/ai-game-creator-shell/src-tauri/src/main.rs | 14 +++++++++----- ...€�开发运维】本地开发验证与生产运维-2026-05-15.md | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/src/main.rs b/apps/ai-game-creator-shell/src-tauri/src/main.rs index f3e32ed34..8ed84955a 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/main.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/main.rs @@ -1,9 +1,13 @@ #![cfg_attr(all(not(dev), target_os = "windows"), windows_subsystem = "windows")] -// AGC 壳的 warning 门禁只作用于生产口径:`cfg(not(test))` 让 `cargo check`(不带 `--all-targets`)与发布构建 -// 把 first-party warning 当错误,而 test harness 实例不受影响——同一个 bin target 在 `--all-targets` 下会被 -// 编第二次,其中 `#[cfg(not(test))] fn main()` 被排除,`generate_handler!`/`desktop::run()` 链不可达, -// 会产生一批属测试构建产物的假死告警,不能按废弃生产代码处理。口径与基线见 dev 运维文档「Rust 编译告警门禁」。 -#![cfg_attr(not(test), deny(warnings))] +// AGC 壳的 warning 门禁只作用于「生产口径 + Windows 交付平台」: +// - `cfg(not(test))`:`cargo check`(不带 `--all-targets`)与发布构建把 first-party warning 当错误;test harness +// 实例不受影响——同一个 bin target 在 `--all-targets` 下会被编第二次,其中 `#[cfg(not(test))] fn main()` +// 被排除,`generate_handler!`/`desktop::run()` 链不可达,会产生一批属测试构建产物的假死告警。 +// - `cfg(windows)`:本壳交付面是 WebView2 / Windows;在 Linux 上大量 Windows 专用实现会被整块编掉 +// (acl_repair、Windows 策略路径、编辑器 RPC、process session bridge 等),它们留下的未用项是“编译剔除” +// 的产物而不是废弃生产代码,不能当缺陷处理(本仓 CI 不在外部注入 RUSTFLAGS/-D warnings)。 +// 口径与基线见 dev 运维文档「Rust 编译告警门禁」。 +#![cfg_attr(all(not(test), windows), deny(warnings))] #[cfg(test)] #[path = "../build_support/godot_bundle.rs"] diff --git a/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md b/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md index c810546bb..4fdc2f628 100644 --- a/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md +++ b/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md @@ -372,7 +372,7 @@ npm run check - 落法:workspace 根写 `[workspace.lints.rust] warnings = "deny"`,成员 crate 用 `[lints] workspace = true` 继承;被 `exclude` 或自带 manifest 的独立 crate 各自声明 `[lints.rust] warnings = "deny"`。 - 依据:cargo 只对**目标 crate** 传 `--deny=warnings`,**不改 `RUSTFLAGS`**,因此不会让 CI 的 Rust 编译缓存整体失效(已用一个最小 crate 实证)。缓存边界见本节「Rust 测试组的隔离编译缓存」。 - 覆盖范围:`server-rs` workspace(成员见 `server-rs/Cargo.toml` 的 `members`)、4 个被 `exclude` 的独立 crate(`agent-runtime-core`、`agent-runtime-orchestration`、`editor-adapter-api`、`platform-agent`)、`apps/desktop-shell/src-tauri`、三个编辑器 native bridge;AGC 壳(`apps/ai-game-creator-shell/src-tauri`)已于 2026-10-06 由起始基线 613 条清零,并按下面特例启用生产口径门禁。 -- AGC 壳的门禁落法(特例,不使用 `[lints]` 表):在 `apps/ai-game-creator-shell/src-tauri/src/main.rs` 顶部写 `#![cfg_attr(not(test), deny(warnings))]`;AGC 壳的 `Cargo.toml` 不加 `[lints]`。原因是该 crate 没有 lib 目标,`cargo check --all-targets` 会把同一个 bin target 以 test harness 再编一次;harness 实例里 `#[cfg(not(test))] fn main()` 被排除,`generate_handler!` 注册的 Tauri 命令与 `desktop::run()` 链整体不可达,于是产生一批**属于测试构建产物**的假死告警(2026-10-06 实测 339 条)。若改用 `[lints.rust] warnings = "deny"`,这批 harness 告警会被 deny 而 CI 必红;若逐条用 `cfg` 收敛它们,又会因为 handler 注册仍在编译而报 `E0425`。因此 AGC 壳门禁限定 `cfg(not(test))`,CI 的 `cargo check --features …`(不带 `--all-targets`)与发布构建自动成为门禁。 +- AGC 壳的门禁落法(特例,不使用 `[lints]` 表):在 `apps/ai-game-creator-shell/src-tauri/src/main.rs` 顶部写 `#![cfg_attr(all(not(test), windows), deny(warnings))]`;AGC 壳的 `Cargo.toml` 不加 `[lints]`。两个条件的来历:① `cfg(not(test))`——该 crate 没有 lib 目标,`cargo check --all-targets` 会把同一个 bin target 以 test harness 再编一次;harness 实例里 `#[cfg(not(test))] fn main()` 被排除,`generate_handler!` 注册的 Tauri 命令与 `desktop::run()` 链整体不可达,于是产生一批**属于测试构建产物**的假死告警(2026-10-06 实测 339 条)。若改用 `[lints.rust] warnings = "deny"`,这批 harness 告警会被 deny 而 CI 必红;若逐条用 `cfg` 收敛它们,又会因为 handler 注册仍在编译而报 `E0425`。② `cfg(windows)`——本壳交付面是 WebView2 / Windows,在 Linux 目标上大量 Windows 专用实现被整块编掉(`acl_repair_gate`、Windows 策略路径、编辑器 RPC、process session bridge 等),它们留下的未用项是“编译剔除”的产物而非废弃生产代码;2026-10-06 实测 Linux 下壳内因此报 54 条 `never used`,若门禁不加平台限定会把它们判死。因此门禁落在 Windows 交付平台,CI 的 `cargo check --features …`(不带 `--all-targets`)与发布构建自动成为门禁;CI 不在外部注入 `RUSTFLAGS`/`-D warnings`,Linux 构建只把它们当普通 warning。 - 边界:harness 实例的那批告警**不作为废弃生产代码处理**,也**不在门禁覆盖内**;它们与生产口径的 0 warning 是两个不同目标。可选方向是把 handler 列表抽到 cfg 无关位置以批量消除命令可达链的假死,但“同一个 bin 被编两次”这一事实不变,`--all-targets` 无法归零。 - AGC 壳的测量命令必须带编辑器 feature(`cocos-editor-execute,unity-editor-execute,godot-editor-execute`),否则 `build.rs` 的随包资源校验会 panic;生产口径不带 `--all-targets`,测试口径另加 `--all-targets`(见下方命令块)。 - 收尾判据(对修剪 / 退役清理过的文件):文件名与模块文档承诺的职责必须与删完剩下的内容一致;只剩单个通用工具函数的文件要并回同族模块或改名,不允许留下“名字是业务模块、内容却只剩一个与之无关的工具函数”的空壳(本次 `repository_context.rs` 与 `agent/generation/pass_artifacts.rs` 即按此判据处理:内容分别并入 `agent/redaction.rs` 与 `project/memory.rs`,原文件删除)。