# 代码重构提纲

> **目标**：删繁就简，将状态机、日志、持久化部分写扎实，提升代码质量
>
> **当前状态**：基本功能已打通，所有业务类型可以从零推送，但代码存在重复、错误、不严谨、赘余、与文档不符等问题

---

## 重构原则

1. **严格遵循文档**：以 `docs/` 文件夹中的架构文档为准
2. **类型安全优先**：充分利用 Python 类型系统和 Pydantic
3. **单一职责**：每个模块、类、方法只做一件事
4. **可测试性**：重构后的代码应该更易测试
5. **可观测性**：完善的日志和错误处理

---

## 第一阶段：核心状态机强化（最高优先级）

### 1.1 状态转换规范化

**问题诊断**：
- [ ] 检查状态转换是否严格遵循 `状态定义规范.md`
- [ ] 检查是否有非法的状态转换路径
- [ ] 检查状态转换是否都有日志记录

**重构任务**：

#### Task 1.1.1: 状态转换集中管理
```python
# sync_system_new/common/state_machine.py (新建)
class StateMachine:
    """集中管理所有合法的状态转换"""
    
    @staticmethod
    def can_transition(
        from_status: SyncStatus, 
        to_status: SyncStatus
    ) -> bool:
        """检查状态转换是否合法"""
        pass
    
    @staticmethod
    def validate_binding_status_transition(
        from_status: BindingStatus,
        to_status: BindingStatus
    ) -> bool:
        """检查绑定状态转换是否合法"""
        pass
```

**操作步骤**：
1. 创建 `state_machine.py`，定义状态转换矩阵
2. 在 `SyncNode` 的状态设置方法中调用验证
3. 添加状态转换日志（包含 from/to/reason）
4. 更新所有修改状态的代码，使用统一的转换方法

**验收标准**：
- 所有状态转换都经过 `StateMachine` 验证
- 非法转换会抛出明确的异常
- 每次转换都有日志记录

---

### 1.2 BindingStatus 判定逻辑强化

**问题诊断**：
- [ ] 检查 `BaseSyncStrategy.bind()` 是否严格遵循核心状态判定表（状态定义规范 § 1）
- [ ] 检查依赖解析逻辑是否符合规范（状态定义规范 § 2）
- [ ] 检查自动绑定逻辑是否符合 1:1 原则（状态定义规范 § 3）

**重构任务**：

#### Task 1.2.1: 核心状态判定表实现
```python
# sync_system_new/sync_system/binding_matrix.py (新建)
class BindingMatrix:
    """实现核心状态判定表（状态定义规范 § 1）"""
    
    @staticmethod
    def determine_binding_status(
        has_binding: bool,
        local_data_valid: bool,
        remote_data_valid: bool
    ) -> Tuple[Optional[BindingStatus], Optional[BindingStatus]]:
        """
        返回 (local_status, remote_status)
        
        实现状态定义规范 § 1 的判定表
        """
        pass
```

#### Task 1.2.2: 依赖解析逻辑分离
```python
# sync_system_new/sync_system/dependency_checker.py (已存在，需强化)
class DependencyChecker:
    """依赖检查与业务键解析（状态定义规范 § 2）"""
    
    @staticmethod
    def check_dependencies(
        node: SyncNode,
        local_collection: DataCollection,
        remote_collection: DataCollection,
        binding_manager: BindingManager
    ) -> Tuple[bool, Optional[str]]:
        """
        返回 (can_proceed, error_message)
        
        检查：
        1. 依赖节点是否存在
        2. 依赖节点的绑定状态是否为 NORMAL
        3. 依赖节点的 data_id 是否非空
        """
        pass
```

#### Task 1.2.3: 自动绑定逻辑重写
```python
# sync_system_new/sync_system/auto_binder.py (新建)
class AutoBinder:
    """自动绑定逻辑（状态定义规范 § 3）"""
    
    @staticmethod
    def try_auto_bind(
        local_nodes: List[SyncNode],
        remote_nodes: List[SyncNode],
        biz_key: tuple,
        binding_manager: BindingManager
    ) -> AutoBindResult:
        """
        实现去噪后 1:1 自动绑定
        
        算法：
        1. 全集搜索：寻找共享相同业务键的记录
        2. 排除稳态对：移除成对且互绑的 NORMAL 记录
        3. 判定剩余：L_remain=1 且 R_remain=1 才执行绑定
        """
        pass
```

**操作步骤**：
1. 创建 `binding_matrix.py`，实现核心判定表
2. 强化 `dependency_checker.py`，严格按规范检查依赖
3. 创建 `auto_binder.py`，将自动绑定逻辑从 `strategy.py` 中分离
4. 重构 `BaseSyncStrategy.bind()` 方法，调用上述三个模块
5. 添加详细的日志和错误信息（特别是 DEPENDENCY_ERROR 的格式）

**验收标准**：
- `bind()` 方法逻辑清晰，不超过 50 行
- 每个判定步骤都有日志记录
- DEPENDENCY_ERROR 的 error 字段格式符合文档规范
- 自动绑定只在 1:1 场景下触发

---

### 1.3 CREATE/UPDATE 逻辑规范化

**问题诊断**：
- [ ] 检查 CREATE 阶段的 ID 替换逻辑是否完整
- [ ] 检查 UPDATE 阶段是否正确跳过 FAILED 节点
- [ ] 检查是否正确处理空数据（业务键缺失）

**重构任务**：

#### Task 1.3.1: ID 替换逻辑统一
```python
# sync_system_new/sync_system/id_replacer.py (新建)
class IDReplacer:
    """ID 替换逻辑（架构分层设计 § 6）"""
    
    @staticmethod
    def replace_ids_for_create(
        data: Dict[str, Any],
        id_fields: List[str],
        binding_manager: BindingManager,
        direction: str  # "local_to_remote" or "remote_to_local"
    ) -> Dict[str, Any]:
        """
        创建新节点时，将依赖字段的本地 ID 替换为远程 ID
        
        示例：
        data = {"project_id": "P1", "code": "C01"}
        -> {"project_id": "RP_99", "code": "C01"}
        """
        pass
    
    @staticmethod
    def replace_ids_for_update(
        data: Dict[str, Any],
        id_fields: List[str],
        binding_manager: BindingManager,
        direction: str
    ) -> Dict[str, Any]:
        """准备更新数据时，替换数据中的依赖 ID"""
        pass
```

#### Task 1.3.2: UPDATE 阶段保护逻辑
```python
# sync_system_new/sync_system/strategy.py
class BaseSyncStrategy:
    def update(self):
        """UPDATE 操作必须跳过 FAILED 节点"""
        # 过滤掉 status == FAILED 的节点
        # 详见：持久化与人工介入规范 § 1.2 (UPDATE 阶段保护)
        pass
```

**操作步骤**：
1. 创建 `id_replacer.py`，集中管理 ID 替换逻辑
2. 从 `strategy.py` 中提取 ID 替换代码，迁移到 `IDReplacer`
3. 在 `update()` 方法开头添加 FAILED 节点过滤
4. 添加空数据检查（业务键缺失标记为 WARNING）

**验收标准**：
- CREATE/UPDATE 使用统一的 ID 替换逻辑
- UPDATE 不会覆盖 FAILED 节点的状态
- 空数据不参与同步，状态为 WARNING

---

## 第二阶段：持久化与状态重置强化

### 2.1 持久化规则严格执行

**问题诊断**：
- [x] ~~depend_ids 是否已移除持久化~~ ✅ 已修复
- [ ] 检查阶段1重置是否正确实现
- [ ] 检查阶段2清理是否正确实现

**重构任务**：

#### Task 2.1.1: 阶段1重置逻辑审查
```python
# sync_system_new/common/state_reset.py
def get_phase1_reset_defaults() -> Dict[str, Any]:
    """
    阶段1：加载时重置（持久化与人工介入规范 § 1.2）
    
    必须重置：
    - data/origin_data → None（等待重新加载）
    - depend_ids → []
    - binding_status → UNCHECKED
    - error → None
    
    必须保留：
    - node_id, data_id
    - action（用于识别 CREATE 失败节点）
    - status（只保留 FAILED，其他重置为 PENDING）
    - context
    """
    pass
```

#### Task 2.1.2: 阶段2清理逻辑审查
```python
# sync_system_new/pipeline/full_sync_pipeline.py
async def _cleanup_create_failed_zombies(self):
    """
    阶段2：数据加载后清理（持久化与人工介入规范 § 1.2）
    
    清理步骤：
    1. 检测：action == CREATE && status == FAILED
    2. 删除本地失败节点
    3. 解除绑定记录
    4. 删除远程僵尸节点
    5. 重置所有剩余节点的 action 为 NONE
    """
    pass
```

**操作步骤**：
1. 审查 `state_reset.py`，确保阶段1重置符合规范
2. 审查 `_cleanup_create_failed_zombies()`，确保清理逻辑完整
3. 添加详细的日志（清理了哪些节点，原因是什么）
4. 编写单元测试，验证重置和清理逻辑

**验收标准**：
- 阶段1重置字段完全符合文档表格
- 阶段2清理逻辑不遗漏任何步骤
- 每次重置/清理都有明确的日志

---

### 2.2 绑定记录持久性保证

**问题诊断**：
- [ ] 检查绑定记录是否真的"永久保留"
- [ ] 检查是否有意外修改绑定记录的代码

**重构任务**：

#### Task 2.2.1: 绑定记录保护机制
```python
# sync_system_new/common/binding.py
class BindingManager:
    """
    绑定记录持久性规则（持久化与人工介入规范 § 1.3）：
    
    - 只能手工 bind/unbind
    - 或 CREATE 失败自动清理
    - 其他情况绝不修改
    """
    
    def bind(self, local_node_id: str, remote_node_id: str, manual: bool = False):
        """
        建立绑定记录
        
        Args:
            manual: 是否为手工绑定（用于审计日志）
        """
        pass
    
    def unbind(self, node_id: str, manual: bool = False):
        """解除绑定（只在手工或 CREATE 失败时调用）"""
        pass
```

**操作步骤**：
1. 审查所有调用 `bind()/unbind()` 的地方
2. 添加 `manual` 参数，区分手工和自动操作
3. 添加审计日志（谁在何时为何修改了绑定）
4. 确保只有允许的场景才能修改绑定

**验收标准**：
- 绑定记录修改有完整的审计日志
- 自动绑定只在 1:1 场景触发
- CREATE 失败清理有明确的日志

---

## 第三阶段：日志与可观测性

### 3.1 结构化日志体系

**问题诊断**：
- [ ] 检查当前日志是否足够定位问题
- [ ] 检查日志格式是否统一
- [ ] 检查是否缺少关键操作的日志

**重构任务**：

#### Task 3.1.1: 统一日志格式
```python
# sync_system_new/common/logger.py (新建)
import logging
from typing import Optional, Dict, Any

class SyncLogger:
    """统一的结构化日志工具"""
    
    @staticmethod
    def log_state_transition(
        logger: logging.Logger,
        node_type: str,
        node_id: str,
        from_status: str,
        to_status: str,
        reason: str,
        extra: Optional[Dict[str, Any]] = None
    ):
        """状态转换日志"""
        logger.info(
            f"[{node_type}] State transition: {node_id} "
            f"{from_status} -> {to_status} | Reason: {reason}",
            extra=extra or {}
        )
    
    @staticmethod
    def log_binding_operation(
        logger: logging.Logger,
        operation: str,  # "bind", "unbind", "auto_bind"
        local_node_id: str,
        remote_node_id: Optional[str],
        reason: str,
        manual: bool = False
    ):
        """绑定操作日志"""
        op_type = "MANUAL" if manual else "AUTO"
        logger.info(
            f"[{op_type}] Binding {operation}: "
            f"local={local_node_id} <-> remote={remote_node_id} | {reason}"
        )
    
    @staticmethod
    def log_sync_action(
        logger: logging.Logger,
        action: str,  # "CREATE", "UPDATE", "DELETE"
        node_type: str,
        node_id: str,
        data_id: str,
        success: bool,
        error: Optional[str] = None
    ):
        """同步操作日志"""
        status = "SUCCESS" if success else "FAILED"
        msg = f"[{node_type}] {action} {status}: node_id={node_id}, data_id={data_id}"
        if error:
            msg += f" | Error: {error}"
        
        if success:
            logger.info(msg)
        else:
            logger.error(msg)
    
    @staticmethod
    def log_dependency_error(
        logger: logging.Logger,
        node_type: str,
        node_id: str,
        dependency_errors: List[str]
    ):
        """依赖错误日志"""
        logger.warning(
            f"[{node_type}] DEPENDENCY_ERROR: {node_id} | "
            f"Errors: {'; '.join(dependency_errors)}"
        )
```

**操作步骤**：
1. 创建 `logger.py`，定义结构化日志方法
2. 在关键模块引入 `SyncLogger`
3. 替换所有 `logger.info/warning/error` 为结构化方法
4. 添加日志级别配置（DEBUG/INFO/WARNING/ERROR）

**验收标准**：
- 所有状态转换都有日志
- 所有绑定操作都有日志
- 所有同步操作（CREATE/UPDATE/DELETE）都有成功/失败日志
- 日志格式统一，易于搜索和过滤

---

### 3.2 关键路径日志补充

**问题诊断**：
- [ ] bind() 阶段是否记录了每个判定步骤
- [ ] create()/update() 是否记录了 ID 替换细节
- [ ] cleanup 阶段是否记录了清理的节点

**重构任务**：

#### Task 3.2.1: bind() 阶段日志强化
```python
# sync_system_new/sync_system/strategy.py
class BaseSyncStrategy:
    def bind(self):
        # 1. 核心状态判定
        logger.debug(f"[{self.node_type}] Checking binding records...")
        
        # 2. 依赖检查
        logger.debug(f"[{self.node_type}] Checking dependencies for {node_id}...")
        
        # 3. 自动绑定尝试
        logger.info(f"[{self.node_type}] Auto-bind attempt: L_remain={L}, R_remain={R}")
        
        # 4. 状态转换
        SyncLogger.log_state_transition(...)
```

#### Task 3.2.2: create()/update() 日志强化
```python
class BaseSyncStrategy:
    def create(self):
        # 1. 孤儿节点识别
        logger.info(f"[{self.node_type}] Found {len(orphans)} orphan nodes")
        
        # 2. ID 替换
        logger.debug(f"[{self.node_type}] Replacing IDs: {old_ids} -> {new_ids}")
        
        # 3. action 设置
        SyncLogger.log_state_transition(...)
```

**操作步骤**：
1. 在 `bind()` 的每个判定步骤添加日志
2. 在 `create()/update()` 的关键操作添加日志
3. 在 `_cleanup_create_failed_zombies()` 添加详细日志
4. 设置合理的日志级别（DEBUG/INFO/WARNING）

**验收标准**：
- 开启 DEBUG 日志时，可以完整追踪每个节点的处理过程
- 生产环境只需 INFO 日志即可定位问题
- 关键错误都有 ERROR 级别日志

---

### 3.3 sync_log 字段利用

**问题诊断**：
- [ ] 检查 `SyncNode.sync_log` 是否被使用
- [ ] 检查是否记录了完整的处理历史

**重构任务**：

#### Task 3.3.1: sync_log 结构定义
```python
# sync_system_new/common/sync_node.py
class SyncNode:
    """
    sync_log 格式：
    [
        {
            "timestamp": "2025-01-15T10:30:00",
            "phase": "bind",
            "from_status": "UNCHECKED",
            "to_status": "NORMAL",
            "reason": "Found binding record",
            "details": {}
        },
        {
            "timestamp": "2025-01-15T10:30:05",
            "phase": "update",
            "action": "UPDATE",
            "reason": "Data diff detected",
            "details": {"changed_fields": ["name", "amount"]}
        }
    ]
    """
    
    def append_log(self, phase: str, action: str, reason: str, details: Optional[Dict] = None):
        """向 sync_log 添加记录"""
        pass
```

**操作步骤**：
1. 定义 `sync_log` 的 JSON 结构
2. 在每个阶段（bind/create/update/sync）添加日志记录
3. 持久化 `sync_log`，用于审计和调试
4. 提供查询接口，筛选特定类型的日志

**验收标准**：
- 每个节点的 `sync_log` 记录了完整的处理历史
- 可以通过 `sync_log` 回溯任何状态变化
- 失败节点的 `sync_log` 包含详细的错误信息

---

## 第四阶段：代码质量与结构优化

### 4.1 代码重复消除

**问题诊断**：
- [ ] 搜索重复的业务键提取逻辑
- [ ] 搜索重复的 ID 解析逻辑
- [ ] 搜索重复的数据校验逻辑

**重构任务**：

#### Task 4.1.1: 业务键处理统一
```python
# sync_system_new/sync_system/biz_key.py (新建)
class BizKeyExtractor:
    """业务键提取与处理"""
    
    @staticmethod
    def extract_from_data(
        data: Dict[str, Any],
        fields: List[str]
    ) -> Optional[Dict[str, Any]]:
        """从数据中提取业务键"""
        pass
    
    @staticmethod
    def to_tuple(biz_key: Dict[str, Any]) -> tuple:
        """转换为可哈希的 tuple"""
        pass
    
    @staticmethod
    def is_complete(biz_key: Dict[str, Any]) -> bool:
        """检查业务键是否完整（无空值）"""
        pass
```

**操作步骤**：
1. 创建 `biz_key.py`，集中业务键处理逻辑
2. 从各个 Strategy 中提取重复代码
3. 统一业务键的提取、验证、比较逻辑
4. 添加单元测试

**验收标准**：
- 业务键处理逻辑在一个文件中
- 各 Strategy 调用统一的工具方法
- 代码行数减少 20% 以上

---

### 4.2 错误处理统一

**问题诊断**：
- [ ] 检查是否有裸露的 try-except
- [ ] 检查异常类型是否明确
- [ ] 检查错误信息是否包含足够的上下文

**重构任务**：

#### Task 4.2.1: 自定义异常体系
```python
# sync_system_new/common/exceptions.py (新建)
class SyncSystemException(Exception):
    """同步系统基础异常"""
    pass

class StateTransitionError(SyncSystemException):
    """非法状态转换"""
    def __init__(self, from_status, to_status, reason):
        self.from_status = from_status
        self.to_status = to_status
        super().__init__(
            f"Illegal state transition: {from_status} -> {to_status} | {reason}"
        )

class DependencyError(SyncSystemException):
    """依赖错误"""
    def __init__(self, node_id, dependency_errors):
        self.node_id = node_id
        self.dependency_errors = dependency_errors
        super().__init__(
            f"Dependency error for {node_id}: {'; '.join(dependency_errors)}"
        )

class DataValidationError(SyncSystemException):
    """数据校验错误"""
    pass

class BindingConflictError(SyncSystemException):
    """绑定冲突（如 N:N）"""
    pass
```

**操作步骤**：
1. 创建 `exceptions.py`，定义异常类型
2. 替换通用异常为自定义异常
3. 在异常中包含足够的上下文信息
4. 在顶层捕获并记录异常

**验收标准**：
- 所有业务异常都是 `SyncSystemException` 的子类
- 异常信息包含 node_id、node_type 等上下文
- 顶层有统一的异常处理和日志记录

---

### 4.3 类型注解完善

**问题诊断**：
- [ ] 检查是否所有方法都有类型注解
- [ ] 检查返回值是否都有明确类型
- [ ] 运行 mypy 检查类型错误

**重构任务**：

#### Task 4.3.1: 类型注解审查
```bash
# 运行 mypy 检查
mypy sync_system_new/ --strict
```

**操作步骤**：
1. 为所有公共方法添加类型注解
2. 为复杂的返回值定义 TypedDict 或 Pydantic 模型
3. 修复 mypy 报告的类型错误
4. 添加 mypy 到 CI/CD 流程

**验收标准**：
- mypy 检查通过（允许少量 type: ignore）
- 所有公共 API 都有完整的类型注解
- IDE 可以提供准确的类型提示

---

### 4.4 文档字符串完善

**问题诊断**：
- [ ] 检查关键类/方法是否有 docstring
- [ ] 检查 docstring 是否符合 Google/Numpy 风格

**重构任务**：

#### Task 4.4.1: Docstring 补充
```python
class BaseSyncStrategy:
    """
    同步策略基类。
    
    职责：
    1. bind(): 判定 binding_status
    2. create(): 处理孤儿节点
    3. update(): 处理差异节点
    4. pre_sync_check() / post_sync_check(): 状态验证
    
    子类使用示例：
    ```python
    class ProjectStrategy(DefaultSyncStrategy):
        default_config = StrategyConfig(
            auto_bind_fields=["code"],
            local_orphan_action=OrphanAction.CREATE_REMOTE
        )
        schema = ProjectResponse
    ```
    
    参考文档：
    - 架构分层设计.md § 3
    - 状态定义规范.md § 1-4
    """
    
    def bind(self):
        """
        判定绑定状态。
        
        执行步骤：
        1. 核心状态判定（状态定义规范 § 1）
        2. 依赖检查（状态定义规范 § 2）
        3. 自动绑定尝试（状态定义规范 § 3）
        
        状态转换：
        - UNCHECKED -> NORMAL/MISSING/ABNORMAL/WARNING/DEPENDENCY_ERROR
        
        Raises:
            DependencyError: 依赖节点未就绪
            BindingConflictError: 出现 N:N 绑定冲突
        """
        pass
```

**操作步骤**：
1. 为所有公共类添加类级别 docstring
2. 为所有公共方法添加方法级别 docstring
3. 在 docstring 中引用相关文档章节
4. 添加使用示例和注意事项

**验收标准**：
- 核心类（SyncNode, BaseSyncStrategy, FullSyncPipeline 等）都有完整的 docstring
- 关键方法都有参数说明、返回值说明、异常说明
- 文档引用链接正确

---

## 第五阶段：测试覆盖与 pytest 修复

### 5.1 单元测试强化

**问题诊断**：
- [ ] 运行 pytest，检查失败的测试
- [ ] 检查测试覆盖率（目标 >80%）

**重构任务**：

#### Task 5.1.1: 修复现有测试
```bash
# 运行测试并查看失败原因
pytest sync_system_new/tests/ -v --tb=short

# 检查覆盖率
pytest sync_system_new/tests/ --cov=sync_system_new --cov-report=html
```

**操作步骤**：
1. 运行 pytest，逐个修复失败的测试
2. 更新测试用例，匹配重构后的代码
3. 添加缺失的测试（特别是状态转换、绑定逻辑）
4. 确保测试覆盖所有关键路径

**验收标准**：
- 所有测试通过
- 核心模块测试覆盖率 >80%
- 关键逻辑（状态判定、依赖检查、自动绑定）有完整的单元测试

---

### 5.2 集成测试补充

**问题诊断**：
- [ ] 检查是否有端到端的集成测试
- [ ] 检查集成测试是否覆盖主要场景

**重构任务**：

#### Task 5.2.1: 端到端测试场景
```python
# tests/integration/test_full_workflow.py
async def test_full_sync_workflow():
    """
    完整同步流程测试：
    1. 加载 JSONL 数据
    2. 执行策略（bind/create/update）
    3. 推送到 API
    4. 验证结果
    """
    pass

async def test_create_failed_recovery():
    """
    CREATE 失败恢复测试：
    1. 模拟 CREATE 失败
    2. 下次同步自动清理僵尸节点
    3. 重新尝试 CREATE
    """
    pass

async def test_dependency_blocking():
    """
    依赖阻断测试：
    1. 父节点 CREATE 失败
    2. 子节点标记为 DEPENDENCY_ERROR
    3. 修复父节点后，子节点自动恢复
    """
    pass
```

**操作步骤**：
1. 创建 `tests/integration/` 目录
2. 编写端到端集成测试
3. 使用真实的 JSONL 数据和 Mock API
4. 验证关键场景（自动绑定、CREATE 失败恢复、依赖阻断）

**验收标准**：
- 有至少 5 个集成测试场景
- 集成测试覆盖主要业务流程
- 集成测试可以在 CI/CD 中自动运行

---

## 第六阶段：文档与代码对齐

### 6.1 文档与代码对齐检查

**问题诊断**：
- [ ] 逐个对照文档，检查代码实现是否一致
- [ ] 检查文档中的示例代码是否可运行

**重构任务**：

#### Task 6.1.1: 对齐检查清单

| 文档章节 | 代码位置 | 对齐状态 | 备注 |
|---------|---------|---------|------|
| 架构分层设计 § 2 | common/sync_node.py | ✅ | SyncNode 定义 |
| 架构分层设计 § 3 | sync_system/strategy.py | ⚠️ | 需补充 ID 替换逻辑 |
| 状态定义规范 § 1 | sync_system/binding_matrix.py | ❌ | 需新建 |
| 状态定义规范 § 2 | sync_system/dependency_checker.py | ⚠️ | 需强化 |
| 状态定义规范 § 3 | sync_system/auto_binder.py | ❌ | 需新建 |
| 编排流程规范 | pipeline/full_sync_pipeline.py | ✅ | 流程正确 |
| 持久化与人工介入规范 § 1.2 | common/state_reset.py | ✅ | 阶段1/2 重置 |

**操作步骤**：
1. 创建对齐检查表
2. 逐个章节对照代码
3. 标记不一致的地方
4. 更新代码或文档，确保一致

**验收标准**：
- 所有文档章节都有对应的代码实现
- 代码实现严格遵循文档规范
- 文档示例代码可以直接运行

---

### 6.2 文档更新

**问题诊断**：
- [ ] 检查重构后的代码是否需要更新文档
- [ ] 检查是否有新增的设计决策需要文档化

**重构任务**：

#### Task 6.2.1: 文档更新清单
- [ ] 更新 `架构分层设计.md`，补充新模块说明
- [ ] 更新 `状态定义规范.md`，补充状态转换图
- [ ] 创建 `日志规范.md`，说明日志格式和级别
- [ ] 创建 `异常处理规范.md`，说明异常类型和处理
- [ ] 更新 `README.md`，补充使用示例

**操作步骤**：
1. 根据重构内容，识别需要更新的文档
2. 更新或创建文档
3. 添加架构图和流程图（使用 Mermaid）
4. 添加代码示例和最佳实践

**验收标准**：
- 文档完整覆盖重构后的架构
- 文档包含清晰的架构图和流程图
- 文档包含可运行的示例代码

---

## 执行计划与优先级

### 优先级定义

- **P0 (关键)**：影响正确性，必须立即修复
- **P1 (高)**：影响可维护性，应尽快完成
- **P2 (中)**：改善代码质量，可以分批完成
- **P3 (低)**：锦上添花，时间允许时完成

### 阶段划分

| 阶段 | 优先级 | 预计工时 | 依赖关系 |
|------|--------|---------|---------|
| 第一阶段：核心状态机强化 | P0 | 3-4 天 | 无 |
| 第二阶段：持久化与状态重置 | P0 | 1-2 天 | 第一阶段 |
| 第三阶段：日志与可观测性 | P1 | 2-3 天 | 第一、二阶段 |
| 第四阶段：代码质量优化 | P2 | 2-3 天 | 第一阶段 |
| 第五阶段：测试覆盖 | P1 | 2-3 天 | 第一、二阶段 |
| 第六阶段：文档对齐 | P2 | 1-2 天 | 所有阶段 |

### 建议执行顺序（3天计划）

**Day 1**：
1. 完成第一阶段（状态机强化）- P0
2. 完成第二阶段（持久化审查）- P0

**Day 2**：
3. 完成第三阶段（日志强化）- P1
4. 完成第五阶段（pytest 修复）- P1

**Day 3**：
5. 完成第四阶段（代码优化）- P2
6. 完成第六阶段（文档对齐）- P2
7. 全面回归测试

---

## 验收标准

### 代码质量指标

- [ ] **pytest 通过率**: 100%
- [ ] **测试覆盖率**: 核心模块 >80%
- [ ] **mypy 类型检查**: 通过（允许 <10 个 type: ignore）
- [ ] **代码重复率**: <5% (使用 pylint 检查)
- [ ] **文档覆盖率**: 所有公共 API 都有 docstring

### 功能完整性

- [ ] 所有业务类型可以从零推送
- [ ] CREATE 失败自动恢复
- [ ] 依赖阻断正确工作
- [ ] 自动绑定只在 1:1 场景触发
- [ ] 手工绑定永不自动修改

### 可观测性

- [ ] 每个节点都有完整的 sync_log
- [ ] 关键操作都有结构化日志
- [ ] 错误信息包含足够的上下文
- [ ] 可以通过日志快速定位问题

### 文档一致性

- [ ] 代码实现与文档规范一致
- [ ] 文档示例代码可运行
- [ ] 架构图和流程图准确

---

## 附录：重构检查清单

### 状态机检查

- [ ] 状态转换是否经过 `StateMachine` 验证
- [ ] 每次转换是否都有日志
- [ ] 是否有非法的状态路径

### 绑定逻辑检查

- [ ] 核心判定表是否实现（状态定义规范 § 1）
- [ ] 依赖检查是否完整（状态定义规范 § 2）
- [ ] 自动绑定是否只在 1:1 场景触发（状态定义规范 § 3）
- [ ] DEPENDENCY_ERROR 格式是否符合规范

### 持久化检查

- [ ] depend_ids 是否不持久化 ✅
- [ ] 阶段1重置是否正确
- [ ] 阶段2清理是否完整
- [ ] 绑定记录是否永久保留

### 日志检查

- [ ] 是否使用结构化日志
- [ ] 关键操作是否都有日志
- [ ] 日志级别是否合理
- [ ] sync_log 是否记录完整历史

### 错误处理检查

- [ ] 是否使用自定义异常
- [ ] 异常信息是否包含上下文
- [ ] 是否有顶层异常处理
- [ ] 错误是否正确传播

### 代码质量检查

- [ ] 是否有重复代码
- [ ] 是否有明确的类型注解
- [ ] 是否有完整的 docstring
- [ ] 是否通过 mypy 检查

---

## 总结

本重构提纲基于以下文档制定：

1. **架构分层设计.md** - 四层架构模型
2. **状态定义规范.md** - 状态机逻辑
3. **编排流程规范.md** - Pipeline 流程
4. **持久化与人工介入规范.md** - 持久化和重置规则
5. **业务流程与依赖关系.md** - 业务实体依赖

**核心目标**：
- 删繁就简：消除重复，提取公共逻辑
- 状态机强化：严格遵循状态定义规范
- 日志完善：结构化日志，完整的 sync_log
- 持久化规范：阶段1/2 重置，绑定记录保护
- 代码质量：类型安全，错误处理，文档完善

**关键原则**：
- 以文档为准，代码严格遵循规范
- 类型安全优先，充分利用 Python 类型系统
- 可观测性优先，完善的日志和错误信息
- 单一职责，每个模块只做一件事
- 可测试性，易于编写和维护测试

按照此提纲逐步执行，可以系统性地提升代码质量，同时保持与文档的一致性。
