From 9dd1ace30178686cbfc98cc4f38d24f0004bec30 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Fri, 16 Oct 2026 17:33:49 +0800 Subject: [PATCH] refactor(types): describe lazy log message object contract --- app/runtime/log.py | 18 ++++++++++-------- docs/refactor/optimization-checklist.md | 4 ++-- tests/fixtures/architecture/mypy-baseline.json | 4 +--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/runtime/log.py b/app/runtime/log.py index 6c97a52ac..9b108397a 100644 --- a/app/runtime/log.py +++ b/app/runtime/log.py @@ -913,7 +913,7 @@ class LoggerManager: return writer.write_log(level, message, log_path / logfile) - def logger(self, method: str, msg: str, *args: Any, **kwargs: Any) -> None: + def logger(self, method: str, msg: object, *args: Any, **kwargs: Any) -> None: """按调用来源路由并输出一条日志。 主日志等级过滤看 `current_plugin_instance_id()`;资源日志独立接收 DEBUG, @@ -925,6 +925,8 @@ class LoggerManager: 经宿主公共方法转发调用时,栈顶是宿主而不是发起调用的插件,按它判等级 会认错来源。 + 消息可为文本、异常或其它可格式化对象;格式化留在日志分流内部,调用方无需预先转成字符串。 + 这里只是一道提前短路,省掉被丢弃日志的栈帧内省与格式化;控制台输出端 由 `_ContextLevelFilter` 用同一个判据再判一次,两处结论因而一致。 """ @@ -963,31 +965,31 @@ class LoggerManager: log_method = getattr(configured_logger, method, configured_logger.info) log_method(formatted_msg, **kwargs) - def scoped_info(self, msg: str) -> None: + def scoped_info(self, msg: object) -> None: """仅向已绑定资源输出 INFO 摘要,保持主日志的批次摘要密度。""" self.logger("info", msg, scope_only=True) - def info(self, msg: str, *args: Any, **kwargs: Any) -> None: + def info(self, msg: object, *args: Any, **kwargs: Any) -> None: """输出 INFO 日志。""" self.logger("info", msg, *args, **kwargs) - def debug(self, msg: str, *args: Any, **kwargs: Any) -> None: + def debug(self, msg: object, *args: Any, **kwargs: Any) -> None: """输出 DEBUG 日志。""" self.logger("debug", msg, *args, **kwargs) - def warning(self, msg: str, *args: Any, **kwargs: Any) -> None: + def warning(self, msg: object, *args: Any, **kwargs: Any) -> None: """输出 WARNING 日志。""" self.logger("warning", msg, *args, **kwargs) - def warn(self, msg: str, *args: Any, **kwargs: Any) -> None: + def warn(self, msg: object, *args: Any, **kwargs: Any) -> None: """兼容历史调用并输出 WARNING 日志。""" self.warning(msg, *args, **kwargs) - def error(self, msg: str, *args: Any, **kwargs: Any) -> None: + def error(self, msg: object, *args: Any, **kwargs: Any) -> None: """输出 ERROR 日志。""" self.logger("error", msg, *args, **kwargs) - def critical(self, msg: str, *args: Any, **kwargs: Any) -> None: + def critical(self, msg: object, *args: Any, **kwargs: Any) -> None: """输出 CRITICAL 日志。""" self.logger("critical", msg, *args, **kwargs) diff --git a/docs/refactor/optimization-checklist.md b/docs/refactor/optimization-checklist.md index 7cd650329..501325c33 100644 --- a/docs/refactor/optimization-checklist.md +++ b/docs/refactor/optimization-checklist.md @@ -106,9 +106,9 @@ ARCH-201 至 ARCH-204 均达到实现、验证、提交、推送和远端门禁 | Model/Oper 事务债务 | 0 | 自建 Session、自动事务装饰器、直接 commit/rollback 等基线均为零 | | Module Contract | 215 specs / 211 methods / 263 calls | 动态方法名为 0;分类事实富化通过显式合同进入插件调度,旧 YAML 分类方法已移除;download 新增 custom_words 可选参数,旧 provider 签名通过显式合同兼容 | | Event Contract | 53 | 均已有 payload model,但当前全部是 diagnostic enforcement | -| Python 源码量 | 372,299 行 | 本次重新扫描物理行数,排除 `app/plugins/**`;74 个文件超过 1,000 行,12 个超过 2,000 行;源码尺寸仅作观察 | +| Python 源码量 | 372,301 行 | 本次重新扫描物理行数,排除 `app/plugins/**`;74 个文件超过 1,000 行,12 个超过 2,000 行;源码尺寸仅作观察 | | 长方法 | 309 个超过 80 行 | 本次 AST 扫描排除 `app/plugins/**`;61 个超过 150 行,17 个超过 250 行;新增函数仍受 C901/嵌套深度门禁约束 | -| 全量 mypy 历史债务 | 8,843 / 460 文件 | 通知排版补齐 Slack 消息块类型,历史债务减少 2 项;工作流资源过滤改用领域对象调用过滤链,恢复的节点输出在消费前归一化,并收紧可空资源列表的类型低水位;消息媒体交互类型债务已清零,canonical Facade 与 endpoint 类型边界已补齐,低水位只允许继续下降;微信 ClawBot 入站 item_list 媒体解析改为按子项键名分派后,类型错误减少 4 项;站点解析器分享率改用浮点初值,类型错误减少 20 项;本次下载与文件安全修复再减少 3 项;Transmission 进度回退值归一化再减少 2 项,逐文件逐错误码无增长 | +| 全量 mypy 历史债务 | 8,840 / 460 文件 | 通知排版补齐 Slack 消息块类型,历史债务减少 2 项;工作流资源过滤改用领域对象调用过滤链,恢复的节点输出在消费前归一化,并收紧可空资源列表的类型低水位;消息媒体交互类型债务已清零,canonical Facade 与 endpoint 类型边界已补齐,低水位只允许继续下降;微信 ClawBot 入站 item_list 媒体解析改为按子项键名分派后,类型错误减少 4 项;站点解析器分享率改用浮点初值,类型错误减少 20 项;本次下载与文件安全修复再减少 3 项;Transmission 进度回退值归一化再减少 2 项,逐文件逐错误码无增长 | | Ruff 历史诊断 | 98 | 低水位门禁通过,但规则集只覆盖 `E4/E7/E9/F/I` | | 覆盖率固定基线 | Application 80.00%,Domain 80.00% | Chain、Runtime、Agent、Adapter、Startup 未进入包级覆盖率门禁 | diff --git a/tests/fixtures/architecture/mypy-baseline.json b/tests/fixtures/architecture/mypy-baseline.json index e7310ebe5..e8a20927e 100644 --- a/tests/fixtures/architecture/mypy-baseline.json +++ b/tests/fixtures/architecture/mypy-baseline.json @@ -118,7 +118,6 @@ "union-attr": 2 }, "app/agent/llm/provider.py": { - "arg-type": 1, "no-untyped-def": 1 }, "app/agent/mcp.py": { @@ -608,7 +607,6 @@ "type-arg": 5 }, "app/application/mediaserver.py": { - "arg-type": 1, "operator": 1 }, "app/application/messaging/agent.py": { @@ -790,7 +788,7 @@ "type-arg": 1 }, "app/chain/message.py": { - "arg-type": 18, + "arg-type": 17, "assignment": 2, "no-any-return": 11, "no-untyped-def": 4,