log DirectProject 审批拒绝原因 #566
Reference in New Issue
Block a user
Delete Branch "fix/log-cmd-refuse-reason"
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?
宿主拒绝 app-server 的审批 / 交互请求时,原因落日志。
1. 未绑定执行器路径与回包失败的留痕没有去重与限流(performance · medium)
denied_response(execution.rs,未绑定宿主执行器时的交互兜底)与response_write_failed每次触发都无条件app_log!写一行。denied_response恰好就是「模型被拒后反复重试同一动作」的路径,而app_log!走的是同一份 AppData 日志,逐次写会把其它诊断刷掉,也和适配器路径已有的有界去重设计不一致。(method, outcome)有界去重(NO_ADAPTER_INTERACTION_LOGGED);适配器拒绝与回包失败抽出共用的log_once。上限统一MAX_DENIED_REASON_LOGS = 64,并新增distinct_outcomes保留「一共出现过几种」。2. 透传的宿主错误文本可能把绝对路径写进日志(security · low)
reason直接取自format!("lease-admit-failed: {error}"),而error可能来自validate_patch_paths→ 私有路径校验,形如...:{绝对路径}。sanitize_diagnostic_message兜底,但app_log!还会把未清洗的文本原样eprintln!,去重键里也存原文,而模块文档写的是「绝不带路径」——契约没有在源头兑现。log_denied_reason调crate::sanitize_diagnostic_message,脱敏后再做去重键与输出。denied_reason_logging_scrubs_embedded_paths用例)3. 持
state互斥锁期间做同步文件 I/O(performance · low)respond解析 target 的临界区里,多处return self.denied(...)是在 guard 仍存活时调用的;log_denied_reason→app_log!→append_application_log_line会同步 open/write/flush,必要时还做日志轮转,且走全局诊断锁。ExecutionAdapter::resolve_approval_gate,锁内只做状态判定与 ticket 登记;新增ApprovalGateOutcome::{Proceed, Cached, Deny},拒绝原因带出临界区,state释放后才走denied留痕。state.tickets.insert与MAX_REQUEST_CACHE清理仍在锁内。15 条拒绝原因分类逐条等价迁移(已用集合比对确认零增零漏),返回形状不变。native_approval_is_bound_to_item_and_reuses_one_pass_without_duplicate_leases、same_argument_mcp_cohort_keeps_all_permits_until_every_member_finishes、patch_targets_and_moves_are_checked_and_owned_mcp_does_not_double_charge、unknown_development_fingerprint_preserves_execution_but_invalidates_verification等 17 条用例全过。TurnBindMismatch原先共用「执行许可回包丢失,不能确认原操作是否已执行。」,现在按cause分开——只有写失败说回包丢失,绑定失败说明「回合绑定与当前 app-server 不一致,无法确认本轮操作的作用域」。提交:2220682e5,含response_delivery_failure_texts_match_their_cause用例。4.
response_write_failed被回合绑定失败复用,日志名不达意(maintainability · low)mod.rs:4887(stdin 写入 / flush 失败)与mod.rs:4919(bind_turn返回 false)调用同一个函数、共用一个日志键。response_delivery_failed(cause),新增ResponseDeliveryFailure::{Write, TurnBindMismatch},两个调用点各传真实原因;日志键改为agent.direct_codex.approval.response_delivery_failed并带cause字段。5.
denied_response把非审批方法也记成approval.denied(maintainability · low)denied_response是所有交互方法的兜底,但日志无条件写approval.denied。item/permissions/requestApproval回的是空授权、未知方法回-32601error,两者都不是decline,日志会误导排查方向。agent.direct_codex.interaction.no_adapter,新增outcome字段区分decline/empty-permissions/unsupported-method。