fix(agc): AGC 壳生产门禁按交付平台收窄到 Windows,修 Linux CI 红因
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Failing after 4m39s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Failing after 3m50s
Project CI / AI game creator shell Rust crates (pull_request) Failing after 5m4s
Project CI / Frontend tests (pull_request) Successful in 2m36s
Project CI / Repository checks (pull_request) Failing after 3m34s
Project CI / Backend tests (pull_request) Successful in 9m4s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m54s
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Failing after 4m39s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Failing after 3m50s
Project CI / AI game creator shell Rust crates (pull_request) Failing after 5m4s
Project CI / Frontend tests (pull_request) Successful in 2m36s
Project CI / Repository checks (pull_request) Failing after 3m34s
Project CI / Backend tests (pull_request) Successful in 9m4s
Project CI / AI game creator shell web tests (pull_request) Successful in 2m54s
Project CI / Native shell tests (pull_request) Has been cancelled
背景(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)。
This commit is contained in:
@@ -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"]
|
||||
|
||||
@@ -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`,原文件删除)。
|
||||
|
||||
Reference in New Issue
Block a user