## MODIFIED Requirements ### Requirement: 自动调度器函数迁移至独立模块 系统 SHALL 将调度器相关的状态变量和函数从 `main.py` 提取至 `services/scheduler.py`,包括:`_scheduler_next_times`、`_auto_log`(列表)、`_auto_log_append`、`_scheduler_loop`、`start_scheduler`、`stop_scheduler`、`get_auto_log`、`get_scheduler_status`、`_learn_running`、`_learn_scheduler_loop`、`start_learn_scheduler`、`stop_learn_scheduler`。 `_scheduler_loop` 中的自动发布分支 SHALL 改为调用 `generate_to_queue(auto_schedule=True, auto_approve=True)` 生成内容入队,不再调用 `auto_publish_once` 中的 MCP client 直接发布逻辑。 #### Scenario: 调度器启停正常工作 - **WHEN** `start_scheduler(...)` 被调用并传入合法参数 - **THEN** 调度器线程 SHALL 正常启动,`get_scheduler_status()` 返回运行中状态 #### Scenario: 日志追加线程安全 - **WHEN** 多个自动化任务并发调用 `_auto_log_append(msg)` - **THEN** 日志条目 SHALL 正确追加,不丢失和乱序 #### Scenario: engagement 通过回调写日志 - **WHEN** `services/engagement.py` 中的函数需要写日志时 - **THEN** SHALL 通过 `log_fn` 参数(由 `scheduler.py` 传入 `_auto_log_append`)写入,不直接导入 `scheduler.py` #### Scenario: 自动发布走队列路径 - **WHEN** `_scheduler_loop` 中 `publish_enabled=True` 且到达发布时间 - **THEN** SHALL 调用 `generate_to_queue(auto_schedule=True, auto_approve=True)` 替代直接发布,日志记录入队结果