清理 Rust 编译 warning(含 AGC 壳)并加门禁(#649) #650
Reference in New Issue
Block a user
Delete Branch "chore/rust-compile-warnings"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
关联
目标与硬约束
#[allow]掩盖、不用假引用、不为消警删测试;生成代码只改生成器、不手改生成物。结果
cargo check --locked --features cocos-editor-execute,unity-editor-execute,godot-editor-execute --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.tomlagc-linux档检查 Linux 默认 feature 口径——当前首采、待入册基线,见"已知盲区")--all-targets)--all-targets--all-targets的 harness 实例告警与门禁口径无关,不再计数)cargo check --locked --workspace --all-targets --manifest-path server-rs/Cargo.toml--all-targetsCARGO_TARGET_DIR+cargo clean -p强制重建(避免 cargo 重放缓存诊断给出假数字);bin 口径的 0 warning 由独立 session 复核。origin/master...HEAD)。Rust 告警门禁(现役机制,2026-10-07 起)
Werror 已撤:本 PR 原先给 AGC 壳与各 Rust crate 加的
deny(warnings)/[lints]全部移除。为什么撤:它会把上游新代码的存量告警直接变成编译错误(典型例子:一次同步 master 就多出 14 条,
需要额外改动才能过门),也会让本地开发构建无谓变红。
现在改为基线感知的告警白名单检查(单一实现
scripts/check-rust-warnings.mjs,npm run check:rust-warnings):.husky/pre-push对所有分支一视同仁,但按内容触发——本次推送的提交没碰*.rs/Cargo.toml/Cargo.lock就打印一行并 exit 0(推 master 时仍会额外跑一次 repository parity,既有约定未改)。Windows 跑
--profile=agc-windows+--profile=server-rs。ai-game-creator-shell-rust-lane-2跑--profile=agc-linux,ai-game-creator-shell-rust-crates跑--profile=server-rs(两 job 本来就有cargo fetch+ sccache 缓存);repository-checks不受影响(检查已从npm run lint链里摘下)。[新增] 路径:行 | lint | 符号;白名单里的条目被消除 → 只打印[已消除·可更新基线]并 exit 0;另有 fresh 完整性断言(本 profile 每个包都必须真被重编)防止「热 target 目录漏报」给出假的「新增 0」。
scripts/warning-baseline.json,键 =路径 | 符号 | lint(不含行号)。当前:agc-windows14 条(上游存量)、server-rs0 条、agc-linux首采(首次 CI 只采集不判失败)。agc-windows+server-rs;CI =agc-linux+server-rs。CI 绿 ≠ Windows 生产口径也验过(AGC 壳的 Windows 档只能在 Windows 上编)。
git push --no-verify可绕过;GENARRATIVE_SKIP_RUST_WARNINGS=1是应急整段跳过(非入册机制);白名单只吞「键完全相同」的那条,同文件里新的符号 / 新的 lint 照样会被拦。
agc-windows≈ 8s、server-rs≈ 9s。上游 14 项(已入白名单;交接见 #673)
master 本轮新代码在 Windows 生产口径下报 14 条
never used/unused import(Linux 也会报,只是原先不会让 CI 变红);12 条根因是b04aceb57(王德宇,2026-10-07)——它删掉了project/export.rs、commands/desktop.rs的调用点。这 14 条已入白名单、不阻断任何人;其中 7 条疑似发布链路半成品(project.bootstrap链 6 条 +ensure_staging_path_in_dir)已在 #673 请王德宇确认"删还是接线"。本 PR 曾做的两次最小修与 D1 修复都已 revert(按"不代改同事正在开发的实现"的决定),现在它们只作为白名单存在。明确不做(范围外,已写入 dev 运维文档)
--all-targets下 bin target 的测试实例告警:属测试构建产物;仓库既有约定“不能把测试目标的 dead_code 一律认定为废弃生产代码”;逐条cfg收敛会引入E0425。该批不在告警检查口径内,不再计数。决策记录(2026-10-06)
auth_handoff.rs整模块、AuthBridge变体、GAME_CREATOR_CODEX_AUTH_BRIDGE_API_BASE_URL、codex_cli请求路径等),保留平台会话中转 / 显式自定义 Key / provider-proxy 桥 / 共享模型目录捕获 / 隔离运行环境。删除前后做过只读核查:代码域零残留、无持久化或跨端契约耦合(模型目录回执中被删的取值无任何读方,且回执落盘于每回合新建的隔离 HOME)。PLATFORM_ART_GENERATION_RUNTIME_SCHEMA_VERSION采用#[cfg(test)]重导出:站得住——定义在生产有 5 处真实读取,跨模块使用者只有两处测试夹具;删掉它测试目标报E0425,写成pub(crate)报E0364,形态被双向钉死。command_exec.rslinux cfg 块的裸名导入:属批次删除 crate 根 glob 造成的自伤式编译失败;本机与"Windows + 编辑器 feature"口径看不见它,但 CI 的 Linux lane 会编到(M1 若当初跑过 CI 即会被 Linux 档抓到),已按 linux cfg 显式导入;静态审计未再发现同类(判为孤例,脚注见"已知盲区")。repository_context.rs不能整文件删(含 2 条现役用户可见诊断链)→ 抽出路径脱敏原语并入agent/redaction.rs,原文件删除。839051f53消失,实现区零写盘、无 DTO 或契约外泄。repository_context.rs→agent/redaction.rs;agent/generation/pass_artifacts.rs→project/memory.rs);4 项改名使名实相符(generation/game_html_validation.rs、agent/provider_request_snapshot.rs、process_session/shutdown.rs、generation/llm_request.rs),均零调用点改动;并新增长期收尾判据——被修剪/退役清理过的文件必须名实相符。agent/generation/llm_request.rs(原loop_orchestration.rs)、agent/generation/game_html_validation.rs(原draft_validation.rs)、agent/provider_request_snapshot.rs(原runtime_models.rs)、process_session/shutdown.rs(原recovery.rs);配套修掉两处技术文档里指向旧路径与失效行号的引用。已知盲区(记录在案)
-D dead-code、AGC 壳 Linux 下 54 条never used(当时的 Werror 口径,现已撤销)、Linux harness 3×E0599 run_turn)正是被它抓到的;两档口径互不覆盖。完整矩阵见 dev 运维文档「Rust 编译告警门禁」。not(test)越用 / windows-onlyuse被非 Windows 使用点依赖 / 跨平台谓词缺口)全为 0。此前称该问题为"孤例"需加脚注:M1 若当初跑过 CI,会被 Linux 档抓到(command_exec.rs由main.rs无 cfg 引入,落在 Linux lane 的编译面内)。#![cfg_attr(all(not(test), windows), deny(warnings))]已随 Werror 撤离一并撤销;现役机制是基线感知的白名单检查——agc-linux档由 CI 的lane-2检查(当前为首采,打印清单、不判失败,待入册基线),Windows 生产档仅由本地 pre-push 覆盖。Linux 默认 feature 口径的存量告警不再是编译错误,将以agc-linux基线入册。验证命令
(新工作树首次编译前先
npm run agc:bundled-resources:prepare,否则build.rs会因缺随包资源 panic。客户端本地验证:npm run agc;需要真实后端时另开npm run agc:backend。)WIP: 清理 Rust 编译 warning 并加门禁(#649)to WIP: 清理 Rust 编译 warning(含 AGC 壳)并加门禁(#649)Rust 编译告警清理:告警清单与处置结果(按危险等级从低到高)
口径:AGC 壳
apps/ai-game-creator-shell/src-tauri,feature =cocos-editor-execute,unity-editor-execute,godot-editor-execute;server-rs 为 workspace--all-targets。定级口径:低 = 噪声/一致性(会淹没有效告警);中 = 退役未同步或测试构建失败;高 = 真实构建 bug 或安全面/口径冲突。
总账:AGC 壳 613 条 → 已修 589 条;余下 24 条跨分支耦合已于同日全部落地(bin 口径 = 0)。
--all-targets下另有 339 条 test 实例告警判定不修(当时测得 358,合并后终值 339)。server-rs 1 条 → 0。unused_imports/unused_variables/dropping_copy_types三族(main.rs、runner/*、ui_editor/*等)clone()build_support/*生成物build.rs生成的 Rust 里 emit 了无人使用的常量/字段;手改生成物会被下次构建覆盖src/runner/tests.rs头部残行use crate::{unix_timestamp, ProcessSessionRecord};E0432)src/agent/generation.rs删除PLATFORM_ART_GENERATION_RUNTIME_SCHEMA_VERSION重导出agent/direct_runtime/mod.rs:6840/8071两处 cfg(test) 用例)E0425#[cfg(test)]重导出保留测试态)src/repository_context.rs/src/git_inspect.rs/src/patchset.rs839051f53退役漏删的实现(本地仓库检查、git 读取、patchset 生成)仍编进产物repository_context.rs3134 → 141 行、后两文件整删;其现役路径脱敏原语随后并入agent/redaction.rs,原文件删除)src/process_session*/src/project/*/src/runner/*退役实现src/debug.rs、src/debug/debug_drafts.rs整模块src/command_exec.rs:1598/1708/1709/1714(#[cfg(target_os = "linux")]块)use command_sandbox::*;后,Linux 目标下这 4 个裸名引用会E0425;Windows 两个口径全绿,跨平台构建失败被掩盖AuthBridge变体、GAME_CREATOR_CODEX_AUTH_BRIDGE_API_BASE_URL、auth_handoff.rs整模块、codex_cli(601 行)、runtime_models、thread_manager等cfg(test)3 / 丙 = 根因项 2 / 丁 = 改生成器 2 / 戊 = 摘空转参数 2)98cecdfc5→92ac35270,bin 24 → 0),门禁随其后启用Cargo.toml开[lints](harness 实例会被一并 deny、CI 必红)src/main.rs顶部#;其余 crate 用[lints.rust] warnings = "deny"。自证:插探针 → EXIT 101(#[deny(dead_code)] implied by #[deny(warnings)]),撤销 → 0--all-targets的 test 实例告警#[cfg(not(test))] fn main()被排除,generate_handler!/desktop::run()链不可达而判死cfg会引入E0425);已写入 dev 运维文档与 Issue #649 口径.agent/policy.json若含已不在契约清单内的 id,会让该项目权限门动作全被拒(机制已确证);退役能力仍写在契约与提示词文本里toHaveLength(67)仍在,故此前提到的"17 个孤儿契约 id"不成立;capabilities 共 41 条,准确表述是"其中 13 条已退役未兑现、前端 0 消费"附:server-rs 唯一 1 条(
crates/api-server/src/llm/mod.rs:326死常量TEST_AGC_MODEL_DEFAULT_ID)已删。验证方式(本地)
1. 非 Windows 目标会 E0425:main.rs 去掉 `use command_sandbox::*;` 后, command_exec.rs 在 `#[cfg(target_os = "linux")]` 块里裸名使用的 prepare_command_sandbox_launch / stage_command_sandbox_launch / CommandSandboxLaunch / command_sandbox_platform_metadata 失去来源 (command_exec.rs 靠 `use super::*` 继承 main.rs 的 glob)。改为在 command_exec.rs 顶部显式 `#[cfg(target_os = "linux")] use crate::command_sandbox::{...}`, Windows 口径下不引入新的 unused import。已核对这是全部裸名使用点: trampoline/process_session_bridge 均为全限定或自带 import。 2. src/runner/tests.rs 的 `use crate::{unix_timestamp, ProcessSessionRecord};` 两个名字在文件内各只在 import 行出现一次,整行删除(warning 已消失); lane B 已删 ProcessSessionRecord 本体,保留该名字合并后会 E0432。 实测:bin 与 --all-targets 两口径 cargo check 均 EXIT=0;领地 bin 21(不变)、 --all-targets 346→345。Linux 目标本机无法编译验证(缺少 GTK sysroot, glib-sys/gobject-sys/gio-sys 的 pkg-config 交叉编译失败,与本改动无关), 第 1 项按"显式 import 覆盖全部 4 个裸名"构造性验证。- 并入本地分支 chore/agc-warnings-misc @ 3a97ce6b1(22 文件,含两批):commands.rs/config.rs 命令接入收敛、debug.rs 删除、command_exec/command_sandbox/runner 等未用项清理、runtime_prompt_bundle 生成器停发无消费者 prompt section;末端两处必修项:command_exec.rs 补 #[cfg(target_os = "linux")] use crate::command_sandbox::{…}(M1)、runner/tests.rs 删残留 import(M2)。main.rs:删 `use platform_agent::{build_game_creation_seed_task_graph, plan_game_creation_agent_pass, route_game_creation_repair_issues};` 与 shared-contracts 列表中已无消费者的 `GAME_CREATION_AGENT_RUN_SCHEMA_VERSION`。 main.rs:删退役 DTO/结构 `GenerateLocalGameDraftResult`、`AgentPassArtifactPaths`、`AgentPassAgenda`、`LlmGameDraft`、`LlmAgentHandoff`、`GameCreatorAgentLoopResult`(后三者互引,一并删除后无级联孤儿)。 main.rs:删退役常量 `GAME_CREATOR_AGENT_LOOP_MAX_PASSES`、`GAME_CREATOR_CONVERSATION_CONTEXT_MAX_MESSAGES`。 platform_session.rs:删 `platform_session_is_available`。 project/agent_db.rs:删 `append_jsonl_line`(其内部 `append_jsonl_line_unlocked` 仍有其他使用者)。 project/conversation.rs:删 `append_markdown_entry`。 project/manifest.rs:删 `record_draft_task_progress`。 config.rs:删 `build_game_creator_llm_client_without_redirects_from_llm_config`。 验证:bin 口径 warning 24 → 9,EXIT=0,无 error 行;每个符号删前均以 Git 全树引用矩阵确认(见 local://rust-warning-coupling-report-20261006.md §3a)。build_support/runtime_prompt_bundle.rs:render_role_array 不再 emit `id`/`tool_id`,改为 `AgentRoleDefinition {{ role, task_id, brief_path_name }}`;render_group_value 不再 emit `role`/`brief_path_name`,改为 `AgentGroupDefinition {{ id, label, roles }}`。 src/main.rs:AgentRoleDefinition 删 `id`/`tool_id`(保留 `role`/`task_id`/`brief_path_name`——`agent/generation/pass_artifacts.rs:9` 仍在读 `brief_path_name`);AgentGroupDefinition 删 `role`/`brief_path_name`(保留 `id`/`label`/`roles`)。 tests/runtime_prompt_bundle_build.rs:fixture 自带的两个 struct 声明同步为新形状(358 与 882-891 的断言不受影响)。 prompts/runtime/manifest.json 与 build_support 的 catalog 字段一律未动;生成物只经生成器改(OUT_DIR/agent_runtime_prompt_bundle.rs 已被 include! 进 crate)。 验证:bin 口径 warning 4 → 2,EXIT=0;生成物新形状实例:`AgentRoleDefinition { role: "Director", task_id: "design-director", brief_path_name: "director.md" }`、`AgentGroupDefinition { id: "supervisor", label: "项目总控", roles: &PROJECT_SUPERVISOR_AGENT_ROLES }`。src/main.rs:删除 `AgentRoleBrief` 与 `AgentGroupBrief` 两个从未被构造的结构(全仓 0 处 `AgentRoleBrief {` / `AgentGroupBrief {`)。 canvas_generation.rs:摘掉 9 个函数形参(8 个 `briefs: &[AgentGroupBrief]` + 1 个 `_briefs: &[AgentGroupBrief]`:generate_platform_art_asset_at / admit_platform_art_generation_at / generate_admitted_platform_art_asset_at / generate_platform_art_asset_with_options_at / generate_platform_art_asset_with_runtime_options_at / generate_art_package_asset_with_runtime_options_at / generate_platform_art_asset_with_runtime_options_and_retention_at / request_platform_art_asset_with_runtime_options_at)。 删除 31 个调用点的对应实参(10 处 `briefs`/`_briefs` 透传、21 处字面量 `&[]`),涉及 canvas_generation.rs、agent/direct_runtime/mod.rs、agent/direct_tool_bridge.rs、asset_generation_tasks/runtime.rs、commands.rs、commands/desktop.rs。 定性:这些值可证永远为空且无读取者,函数可见性均 crate 内私有、无 `#[tauri::command]`、不涉持久化与公开契约;行为不变。 验证:bin 口径 warning 2 → **0**,EXIT=0;`cargo fmt --all --check` 干净。agent/generation/loop_orchestration.rs → agent/generation/llm_request.rs:剩 5 个符号全是 LLM 文本请求与其额度/进度错误面(request_game_creator_llm_text、GAME_CREATOR_MUD_POINTS_INSUFFICIENT_ERROR_KIND、消息构造、判定、公开摘要),多 pass 循环编排已随 Agent Runtime 退役。 同步 agent/generation.rs:6 的 mod 声明(mod loop_orchestration; → mod llm_request;)与 :52 的 pub(crate) use 前缀(loop_orchestration::{ → llm_request::{)。 文件顶部新增 //! 模块文档:LLM 文本请求与额度/进度错误面,并注明循环编排已退役。 实现、可见性、cfg 一律未改;调用点改动 0:git status 仅 1 个 R + 1 个 M(plumbing),无任何调用点文件被改(调用方使用再导出的项名)。 验证:bin 口径 0 warning / EXIT=0;--all-targets EXIT=0(test 实例 339 条不变);测试 runtime_prompt_bundle_build 17、prompt_source_boundaries 6、thread_manager 72、manifest_invalidation 1、agent_db 65、redaction 4 全 passed;cargo fmt --all --check、npm run check:encoding(5406 文件)、git diff --check 全 rc=0;零新增 #[allow]。上一条提交(0a735ec0d)因 git add 命令里带了已不存在的旧路径而返回 128,只带上了文件重命名;本提交补齐同一改名所需的另外两处: src/agent/generation.rs:6 mod loop_orchestration; → mod llm_request;,:52 pub(crate) use loop_orchestration::{ → llm_request::{。 src/agent/generation/llm_request.rs 顶部新增 //! 模块文档(LLM 文本请求与额度/进度错误面,注明循环编排已退役)。 两者与已提交的重命名构成完整改名;0a735ec0d 单独不可编译,本分支最终 tip 不受影响。 验证(在本 tip 上复测):bin 口径 0 warning / EXIT=0;--all-targets EXIT=0(test 实例 339 条);测试 runtime_prompt_bundle_build 17、prompt_source_boundaries 6、thread_manager 72、manifest_invalidation 1、agent_db 65、redaction 4 全 passed;cargo fmt --all --check、npm run check:encoding、git diff --check 全 rc=0;零新增 #[allow]。根因(CI run 3572 的 job 日志):godot-editor-bridge 的 src/files.rs:346 `pub fn verified_module_path` 在 Linux 库构建里无调用方(唯一库内调用点在 platform.rs 的 #[cfg(windows)] 分支),被切片一新增的 [lints.rust] warnings = "deny" 判为 `-D dead-code` 错误;5 个 job(Rust lane 1/2、lane 2/2、Rust crates、Native shell tests、Repository checks)全部死在这一条上。 修法(godot):给 `verified_module_path` 加 `#[cfg(any(windows, test))]` 并补 3 行文档说明——Windows 库路径才是它的活调用方,跨平台单测 official_loader_copy_requires_exact_parent_and_trusted_bytes 继续在 Linux 覆盖该逻辑;不新增 allow、不删测试、不改实现。 修法(unity):tests/protocol.rs 里 Windows-only 用例(shared_service_executes_serially_and_retains_uncertain_state_across_instances)专用的 2 条 import(editor_adapter_api::EditorAdapter、unity_editor_bridge::{configure_helper_candidates, disconnect_unity_editor, execute_unity_editor_code_for_project, UnityEditorAdapter})与 `fn project()` helper 补上与该用例一致的 `#[cfg(all(windows, target_arch = "x86_64"))]`;Linux 侧仍保留 helper_timeout_eof_oversized_frame_and_blocked_write_are_bounded 用例。 验证(本地复现 CI 的 Linux 口径:cargo check --target x86_64-unknown-linux-gnu --all-targets + 门禁):godot bridge RC=0、unity bridge RC=0、cocos bridge RC=0;3 个 exclude crate(agent-runtime-core / agent-runtime-orchestration / editor-adapter-api)RC=0;platform-agent 仅因本机缺 x86_64-linux-gnu-gcc 交叉编译器而失败(环境性,CI 原生 Linux 构建)。 验证(Windows 口径不变):unity bridge --all-targets RC=0、godot bridge --all-targets RC=0;godot 单测 30 passed(含受影响用例)、unity 单测 12 passed + 集成 3 passed,全 0 failed。 验证(仓库检查):npm run check:rustfmt(4 个 workspace)rc=0、npm run check:encoding rc=0(5406 文件)、git diff --check rc=0;零新增 #[allow]。`src/export/mod.rs`:`pub(crate) use registry::{…}` 里 `Loaded` 在任何档都无人使用(只在 registry.rs 内部用),`content_hash` 只被 `xhs_minitool/registry.rs` 的测试调用 → 收敛为 `use registry::{load_or_create, save, RegistryError};` + `#[cfg(test)] use registry::content_hash;`(未新增 allow)。 `src/export/draft/xhs_minitool/script.rs`:`NpmScript.package_json_relative` 在所有非测试构建中只写不读(`missing_error()` 自行用 `package_json_relative(cwd)` 重算),仅两处测试断言读它;非 serde 字段、不属线协议 → 删除字段与初始化,并把两条断言改为经同一生产函数断言(`assert_eq!(package_json_relative(script.cwd_relative), …)`),断言强度不变、未删用例。 验证:Windows 生产口径(三编辑器 feature)由 2 error 回到 **0 warning / EXIT 0**;`cargo fmt --all --check` rc=0。 背景:这两处属 master 新增的导出模块,是本分支 Windows 门禁 `all(not(test), windows)` 把它们从 warning 升格为 error;Linux/CI 档不受影响。origin/master = 441be8d62(落后 143 提交);合并前本分支 HEAD = aeebbee28。 冲突 11 处,按「master 侧是否活跃」分三桶处理。 M 桶(master 改过该文件 → 取 master 版本,不把我们的删除加回去): - agent/codex_app_server/mod.rs(master +348/-108) - agent/codex_app_server/model_catalog.rs(master +38/-18:CatalogSource::Authenticated / source_for_credential / verify_authenticated_source) - agent/codex_app_server/model_catalog/auth_handoff.rs(modify/delete → 保留 master 版,OAuth 轮换交接) - agent/codex_cli.rs(master +190/-44) - agent/codex_app_server/model_catalog/real_tests.rs:我们把该文件裁到 59 行以适配自建的 capture 签名;master 的 model_catalog.rs 恢复 4 参 capture 后取回 master 的 244 行用例,否则 --all-targets 报 2 处 E0061。 D 桶(master 未动过、我们删除的死码 → 保留删除): - 合并前已删:patchset.rs、git_inspect.rs、repository_context.rs、generation/pass_artifacts.rs、agent/runtime_models.rs、debug.rs(+debug/debug_drafts.rs) 等。 - process_session/{io,lifecycle,persistence,recovery}.rs 与 process_session/tests/owner_fixture_cleanup.rs → 裁决为「保留删除」:master 在这 4 个文件里只改「死码的错误正文」;实测整棵子树在 AGC 生产构建里 69 条 dead_code、且只被 tests.rs 引用;生产只用到 recovery.rs 的 2 个 shutdown 函数,而那 2 个我们已搬进 process_session/shutdown.rs。 G 桶(双方都改、我们那侧非语义 → 以 master 语义为准,手工合并): - agent.rs:取 master 的 claude_code_failure_to_turn_error(改名,codex_app_server/mod.rs:5323 依赖该再导出);保留我们的模块集合(provider_request_snapshot,去掉 runtime_models 与 dispatch 的再导出)。 - thread_manager/dispatch.rs:master 的 host_dropped_with_detail(panic 详情)+ 我们的 cfg(not(test))/cfg(test) 收口(测试态不读兜底结果,避免 harness 未用变量告警)。 - generation/llm_request.rs:取 master 的 AgentProgressEmitter(其唯一消费方 maybe_generate_platform_art_asset_step 已在我们那侧删除,随之成为残留,交由后续提交处理)。 - process_session/model.rs:master 的 8 处错误正文(WindowsProcessJob 的 last_os_error)**全部落在我们未裁的区间**,逐 hunk 叠加到我们的 382 行版本(结果 406 行;last_os_error 出现次数与 master 版一致,均为 13)。 - process_session/shutdown.rs:把 master 在 recovery.rs 里给 shutdown 广播加的诊断搬进我们的实现(`process_session.shutdown.send_failed processId=… detail=…`;收敛后的 LiveProcessSession 不再有 process_id 字段,进程身份取注册表 key)。 - docs/project-memory/shared-memory/pitfalls.md:两侧各新增一节,两节都保留。用户决定(本 PR 内落地):把 codex 这块 provider 相关逻辑收敛到一个模块内,给该模块打上允许 dead code,而不是删除——上游 master 正在活跃编辑这些文件,删除会与其在飞工作反复冲突。 本次只影响 AGC 壳;server-rs、其它目录、其它 lint 与 CI 都不受影响。 逐行说明: 1. 新增 agent/codex_provider/mod.rs - 顶部 `#![allow(dead_code)]`:唯一落点,覆盖本模块及其子模块(实测可压过 AGC 壳的 `#![cfg_attr(all(not(test), windows), deny(warnings))]`,但压不住 `unused_imports`)。 - `#[path = "../codex_app_server/mod.rs"] pub(crate) mod app_server;` `#[path = "../codex_cli.rs"] pub(crate) mod cli;` 用 `#[path]` 就地挂载,不搬动文件——与上游活跃编辑区的冲突面只剩本文件与 agent.rs。 - `pub(crate) use cli as codex_cli;`:子树内部既有的 `super::codex_cli::…` 相对路径照旧可用。 2. agent.rs - `mod codex_app_server;` + `mod codex_cli;` → `mod codex_provider;` `+ pub(crate) use codex_provider::{app_server as codex_app_server, cli as codex_cli};` 对外路径(`crate::agent::codex_cli::…`、`super::codex_app_server::…`)不变,既有调用点零改动。 3. agent/codex_app_server/mod.rs:`resolve_direct_codex_project_authority` 由 `pub(super)` 放宽为 `pub(in crate::agent)`——挂载多了一层后,保持它在挂载前对 agent 子树的有效可见性。 4. agent/codex_app_server/direct_project_identity.rs:`use super::super::*;` → `use crate::agent::*;` (同因,绝对路径与挂载前语义一致)。 5. agent/generation/llm_request.rs:删除 `AgentProgressEmitter` / `emit_agent_progress` 并同步模块文档。 理由:其唯一消费方 `maybe_generate_platform_art_asset_step` 已随退役批次删除(我们那侧), master 对它的改动只是给死函数加日志;且 `allow(dead_code)` 压不住其它 lint,残留必须真删。 6. agent/thread_manager/turn_completion.rs:`host_dropped()` 加 `#[cfg(test)]`。理由:master 的生产 Drop 已改用 `host_dropped_with_detail`,该兼容构造只剩用例引用,生产口径下是死码。 7. browser/process.rs:删除 `BrowserLaunchFailure::setup`。理由:master 把它改名成 `setup_with_detail` 后遗留的未用构造(全仓无调用点)。 8. command_exec.rs:`project_command_actual_target` 收窄为 `#[cfg(target_os = "linux")]`。理由: master 新增该函数,但其调用点全在 Linux 编译面(沙箱启动路径与该平台用例),Windows 生产构建无消费方。 结果(Windows msvc / rustc 1.98.1,编辑器 feature): - 生产口径 `cargo check`:0 warning / EXIT 0; - `cargo check --all-targets`:EXIT 0(352 条告警全部落在这一个 bin 的 test harness 实例,属既有口径, 与本提交无关); - `npm run check:rustfmt`、`npm run check:encoding`、`git diff --check` 均通过。origin/master = e6933762d(落后 106 提交);合并前本分支 HEAD = 1612ee944。 冲突只有 5 处,codex 区域 0 冲突。 M 桶(master 改过的文件 → 取 master 版本,不把我们的删除加回去): - agent/codex_app_server/**(mod.rs、model_catalog.rs、model_catalog/auth_handoff.rs、real_tests.rs)、 agent/codex_cli.rs、agent/codex_provider_proxy.rs、build_support/codex_bundle.rs 均与新 master 逐字节相同。 其中 real_tests.rs / codex_bundle.rs / direct_project_identity.rs 一并取 master 版本,清掉了本分支先前 在这几个文件里留下的多余 diff(口径:codex 区域一行不删不改)。 - 唯一保留的 codex 侧差异是 codex_app_server/mod.rs 的 1 行:resolve_direct_codex_project_authority 的 `pub(super)` → `pub(in crate::agent)`。挂载到 codex_provider 后 `pub(super)` 对兄弟模块 direct_tools_mcp.rs 不可见(E0603),这是收敛必需的适配,不是清理残留。 D 桶(master 未动过、我们删的死码 → 保留删除):patchset.rs、git_inspect.rs、 process_session/{io,lifecycle,persistence,recovery}.rs、generation/pass_artifacts.rs、 agent/runtime_models.rs、debug.rs(+debug/debug_drafts.rs)、process_session/tests/owner_fixture_cleanup.rs 等。 ⚠ 复核发现 D 清单里 3 个文件本轮被 master 改过(`git log a8ae81720..origin/master -- <path>` 非 0),逐条判定: - repository_context.rs(ad0877219:should_ignore_directory 的 "exports" → ".export"):该函数所在的 仓库扫描实现已在更早的退役批次(6d5436541)判为不可达并删除,全仓已无该符号 → 改动无处生效,保留删除。 - generation/pass_artifacts.rs(b04aceb57:黑板字符串去掉「发布包装:exports/README.md」):内容已并入 project/memory.rs(fbea59251),全仓已无该字符串 → 无需承接,保留删除。 - generation/draft_writer.rs(b04aceb57 −16:删掉 exports/README.md 写入):属 legacy draft 生成链, 已在22540a874整体退役;全仓 grep 0 引用,恢复只会留下未挂载的孤立文件 → 保留删除。 G 桶(双方都改、我们那侧不改变行为 → 以 master 语义为准): - agent/generation/trace.rs:唯一冲突块里 master 只把 "exports/README.md" 从产物清单里删掉,而该函数 (append_local_artifact_write_step)已由我们在退役批次里整段删除 → 保留我们的删除。 - useGameDistributionPublishForm.ts:master 本轮删除该文件(b04aceb57),我们侧只有上一轮同步带来的错误 正文改动 → 取 master 语义(删除)。 其余文件由 git 自动合并。本提交不含新写的功能改动:收敛形态与残留清理见后续提交。CI run 3708(head 694b54506)8 个 job:6 成功 / 2 失败。本提交修其中**我们引入**的那一条。 失败 1(我们引入 → 已修):AI game creator shell Rust lane 2/2 → shard 3/4 有 1 例失败 - 用例:agent::codex_provider::app_server::process_tree::tests::shutdown_stops_the_owned_background_writer_and_preserves_proof_scope - 原始报错:`called Result::unwrap() on an Err value: Elapsed(())`;shard 内重跑该用例仍失败(非偶发)。 - 根因:process_tree.rs 的夹具用 `--exact` 复跑本测试二进制,路径是**硬编码**的 `const FIXTURE = "agent::codex_app_server::process_tree::tests::owned_tree_process_fixture"` (process_tree.rs:307-308,master 原文;该文件本体与 master 逐字节相同)。codex provider 收敛把本模块 挂到 `agent::codex_provider::app_server::` 下后,`--exact` 匹配 0 个用例 → 子进程不写 marker、 不打印 TREE_READY → 父进程 `tokio::time::timeout(5s, …).unwrap()` 超时 → Elapsed(())。 - 修法(最小):该字符串同步为新模块路径,并补 2 行说明这个耦合。不改夹具逻辑、不删/不放宽用例、不用 #[allow]。 - 本地验证(Windows + 编辑器 feature):`cargo test -- process_tree::tests` → 3 passed / 0 failed; 其中 `shutdown_proves_entire_owned_job_exit_and_keeps_sibling_running` 修复前 FAILED(同 Elapsed(()))、 修复后 ok。cfg(unix) 的那条本机不编译,但走同一夹具常量,机制一致。 - 同类排查:全 crate 共 11 处「硬编码测试路径」字面量,逐条核对后**只有这一处**因本分支的模块搬迁失效 (`direct_tools_mcp` / `builtin_plugins` / `command_exec` / `command_sandbox_trampoline` / `environment_check::web_creation::ownership` / `windows` 的路径本分支未改名,仍与真实模块一致)。 失败 2(上游自带 → 未修,只给证据):AI game creator shell web tests → `directThreadChat.test.ts` - 失败用例 `DirectProject 聊天 reducer > 系统条目与未识别的 item 类型不进聊天视图`: `AssertionError: expected [ { itemId: 'sys-1', …(5) } ] to have a length of +0 but got 1` - 证据:① 本分支与 origin/master 在 `apps/ai-game-creator-shell/{src,tests}` 与 `packages/**` diff 为空 (零前端改动);② master 自己的 run 3715(head 9cd290362)同一 job 同一用例同一断言同样失败 ⇒ master 自带红色,与本分支无关;不擅自改、不合别人的分支。 验证(取数前 cargo clean -p genarrative-ai-game-creator-shell):bin EXIT 0 / 0 warning; --all-targets EXIT 0(harness 实例 382);check:rustfmt / check:encoding(5549 文件)/ git diff --check 全 EXIT 0; 六组测试 6 / 17 / 74 / 1 / 65 / 4 全部 0 failed;另 process_tree::tests 3 passed。按决策「不要替上游作者修」:这两处改动的唯一目的是让自己的 `deny(warnings)` 不把上游新代码的存量 告警判死,撤销 Werror 后不再需要,且它们动了 master 的文件,故整体撤回。 - revert 1a86675f4:把 master 本轮新代码带来的 14 处告警(`b04aceb57` 等的 exports/bootstrap 退役 留下的无消费者实现)恢复原样——`project/bootstrap.rs`(113 行)、`project.rs` 的 `mod bootstrap;` 与 glob 再导出、`project/verification.rs` 的薄包装、`command_exec.rs` 的两个 bootstrap 函数、 `game_package_upload{,/runtime}.rs`、`export/draft/taonier/{mod,registry,script}.rs` 全部回到 master 状态。 - revert 694b54506:撤掉上面那批里 `resolve_project_bootstrap_spec_at` 的 `#[cfg(all(target_os = "linux", test))]` 收窄;两个 revert 相抵后该函数就是 **master 原文**, `command_exec.rs` 里 Linux 用例仍能编译(此时它只是 Windows 侧的一条告警,不是错误)。 注:CI 修复提交 `ad33d42bc`(process_tree 夹具的硬编码测试路径)**保留**——那是收敛重命名造成的 真实故障(Linux 测试会失败),与 Werror 无关。 这 14 条告警已逐条入册 `scripts/warning-baseline.json` 的 `agc-windows` / `agc-linux` profile, 归属与风险分级见 `local://commit-1a86675f4-inventory.md`。suzmii referenced this pull request2026-10-07 20:47:11 +08:00
b1c89fbba) into chore/rust-compile-warnings:按「让路 master + 最小集恢复」收口跨文件契约冲突0576f0a3c) into chore/rust-compile-warnings:第二轮同步(游戏共创/作品 Fork 等 186 提交)