2
0
Эх сурвалжийг харах

docs: Epic 质量修复与 UX 线框图

- 重写 Epic 目标为用户价值聚焦 (Epic 1, 2, 4)
- 拆分 Epic 7 为 Epic 7a (任务调度) 和 7b (用户界面)
- 补充 7 个缺失 Story (FR6, FR22, FR23, FR26, FR37, FR42-43, FR46-49)
- 新增 29 故事点,总计 315 点
- 创建 UX 低保真线框图

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
d8dfun 4 өдөр өмнө
parent
commit
dbe35cbf1b

+ 2137 - 0
planning-artifacts/architecture.md

@@ -0,0 +1,2137 @@
+---
+stepsCompleted: [1, 2, 3, 4, 5]
+inputDocuments: ['prd.md']
+workflowType: 'architecture'
+project_name: '223-236-template-6'
+user_name: 'User'
+date: '2026-03-13'
+status: 'complete'
+version: '1.0'
+---
+
+# Architecture Decision Document
+
+_This document builds collaboratively through step-by-step discovery. Sections are appended as we work through each architectural decision together._
+
+## Project Context Analysis
+
+### Requirements Overview
+
+**Functional Requirements:**
+
+项目包含 52 个功能需求,分为六个核心模块:
+
+1. **指纹模块 (FR1-FR8)**: 章节指纹查重,支持批量检测与人工审核
+2. **清洗模块 (FR9-FR16)**: 正则替换规则引擎、格式标准化、HTML/Markdown 处理
+3. **术语模块 (FR17-FR24)**: 术语库管理、智能提取、锁定标记 (§Ti§)
+4. **翻译模块 (FR25-FR33)**: M2M100 模型推理、GPU/CPU 自适应、批处理优化
+5. **上传模块 (FR34-FR40)**: 平台 API 对接、失败重试、CU 扣费
+6. **任务调度器 (FR41-FR47)**: 流水线编排、并发控制、断点续传
+7. **系统集成 (FR48-FR52)**: 配置管理、日志系统、版本检测
+
+**Non-Functional Requirements:**
+
+| 类别 | 关键要求 | 架构影响 |
+|------|----------|----------|
+| 性能 | 3000-5000 词/分钟 (RTX 3060) | 需要批处理优化、GPU 内存管理 |
+| 可靠性 | Crash-Safe 原子写 | 所有持久化操作需使用 .tmp + fsync + rename 模式 |
+| 安全性 | 零数据泄露 | 全流程本地处理,禁止数据外传 |
+| 兼容性 | NVIDIA GTX 1650+ (4GB+ VRAM) | 需要优雅的 GPU 降级策略 |
+| 许可证 | 零授权费依赖 | 所有依赖必须为标准库或 MIT 协议 |
+
+**Scale & Complexity:**
+
+- Primary domain: Desktop Application + AI Inference
+- Complexity level: Medium
+- Estimated architectural components: 7 major components
+
+### Technical Constraints & Dependencies
+
+**硬约束:**
+- 必须使用 MIT 协议库(排除 GPL 污染)
+- 必须 100% 本地处理(无云 API 调用)
+- 必须支持 Crash-Safe 原子写
+
+**外部依赖:**
+- CTranslate2 (MIT): 模型推理引擎
+- facebook/m2m100_418M: 翻译模型
+- PyQt6: GUI 框架
+- PyTorch (CUDA): GPU 加速
+
+**集成接口:**
+- 指纹查重 API: POST /api/fingerprint/check
+- 平台上传 API: 章节提交接口
+- CU 扣费 API: 按字数计费
+
+### Cross-Cutting Concerns Identified
+
+1. **Crash-Safe 持久化**: 影响所有写操作(进度、清洗结果、翻译结果)
+2. **GPU 资源管理**: 翻译模块独占,需协调与其他模块的并发
+3. **术语一致性**: 术语锁定机制需跨越清洗→翻译流程传递
+4. **进度可见性**: 六个阶段进度需统一展示
+5. **错误恢复**: 每个模块的失败处理与断点续传
+6. **许可证合规性**: 所有新增依赖需验证许可证类型
+
+## Starter Template Evaluation
+
+### Primary Technology Domain
+
+**Python Desktop Application** (PyQt6 + CTranslate2 GPU Inference)
+
+基于项目需求分析,这是一个本地桌面应用,需要:
+- GUI框架:PyQt6
+- AI推理引擎:CTranslate2 (GPU加速)
+- 系统集成:文件I/O、网络API调用
+
+### Starter Options Considered
+
+由于Python桌面应用领域没有统一的"启动模板"生态系统,我们评估了以下选项:
+
+| 选项 | 优点 | 缺点 | 适用性 |
+|------|------|------|--------|
+| **从零构建** | 完全控制,无技术债 | 需要手动配置所有工具 | ✅ 推荐 - 特定需求较多 |
+| **Python Boilerplate** | 标准结构,包含测试/代码质量 | 针对Web/服务端优化 | ⚠️ 部分适用 |
+| **Cookiecutter模板** | 快速启动,最佳实践 | 需要定制化修改 | ⚠️ 部分适用 |
+
+### Selected Approach: 自定义项目结构 (基于2025年最佳实践)
+
+**Rationale for Selection:**
+
+本项目有以下独特约束,标准模板无法满足:
+1. **Crash-Safe 原子写机制**:需要在所有持久化点实现
+2. **GPU 资源管理**:CTranslate2 需要特定配置
+3. **零授权费约束**:需要严格验证所有依赖的许可证
+4. **六模块流水线架构**:需要特定的模块划分
+
+**项目初始化命令:**
+
+```bash
+# 1. 创建项目目录结构
+mkdir -p xling-matrix-assistant/src/xling_matrix/{core,modules,ui,infrastructure}
+mkdir -p xling-matrix-assistant/tests/{unit,integration}
+mkdir -p xling-matrix-assistant/{data,models,logs,docs}
+
+# 2. 创建虚拟环境
+python -m venv venv
+source venv/bin/activate  # Windows: venv\Scripts\activate
+
+# 3. 安装核心依赖
+pip install PyQt6 ctranslate2 torch numpy requests pyyaml
+
+# 4. 安装开发工具
+pip install pytest pytest-qt pytest-cov black ruff mypy
+```
+
+**Architectural Decisions Established:**
+
+**Language & Runtime:**
+- Python 3.11+ (类型注解支持,性能优化)
+- 类型检查:mypy (严格模式)
+- 代码格式化:black
+- 代码检查:ruff
+
+**项目结构 (src layout):**
+
+```
+xling-matrix-assistant/
+├── src/
+│   └── xling_matrix/
+│       ├── __init__.py
+│       ├── __main__.py           # 应用入口点
+│       ├── core/                 # 核心领域模型
+│       │   ├── __init__.py
+│       │   ├── models.py         # 数据模型
+│       │   ├── state.py          # 状态机
+│       │   └── pipeline.py       # 流水线编排
+│       ├── modules/              # 六大核心模块
+│       │   ├── __init__.py
+│       │   ├── fingerprint/      # FR1-FR8
+│       │   ├── cleaning/         # FR9-FR16
+│       │   ├── terminology/      # FR17-FR24
+│       │   ├── translation/      # FR25-FR33
+│       │   └── upload/           # FR34-FR40
+│       ├── ui/                   # PyQt6 GUI
+│       │   ├── __init__.py
+│       │   ├── main_window.py
+│       │   ├── widgets/          # 自定义控件
+│       │   └── dialogs/          # 对话框
+│       └── infrastructure/       # 基础设施层
+│           ├── __init__.py
+│           ├── storage.py        # Crash-Safe 持久化
+│           ├── gpu_manager.py    # GPU 资源管理
+│           ├── api_client.py     # 外部 API 客户端
+│           └── logger.py         # 日志系统
+├── tests/
+│   ├── unit/
+│   └── integration/
+├── models/                       # 翻译模型存储
+├── data/                         # 用户数据目录
+├── logs/                         # 日志目录
+├── pyproject.toml                # 项目配置
+├── pyproject.toml                # 打包配置
+└── README.md
+```
+
+**Build Tooling & Packaging:**
+
+```toml
+# pyproject.toml
+[project]
+name = "xling-matrix-assistant"
+version = "0.1.0"
+requires-python = ">=3.11"
+dependencies = [
+    "PyQt6>=6.6.0",
+    "ctranslate2>=4.0.0",
+    "torch>=2.1.0",
+    "numpy>=1.24.0",
+    "requests>=2.31.0",
+    "pyyaml>=6.0.0",
+]
+
+[project.optional-dependencies]
+dev = ["pytest>=7.4.0", "pytest-qt>=4.2.0", "pytest-cov>=4.1.0", "black>=23.12.0", "ruff>=0.1.0", "mypy>=1.7.0"]
+
+[project.scripts]
+xling-matrix = "xling_matrix.__main__:main"
+
+[tool.black]
+line-length = 100
+target-version = ["py311"]
+
+[tool.ruff]
+line-length = 100
+select = ["E", "F", "I", "N", "W"]
+
+[tool.mypy]
+python_version = "3.11"
+strict = true
+```
+
+**Testing Framework:**
+- pytest (单元测试)
+- pytest-qt (PyQt6 测试工具)
+- pytest-cov (覆盖率报告)
+
+**Development Experience:**
+- 虚拟环境隔离
+- 类型检查 (mypy strict)
+- 即时重载 (开发模式)
+- 调试配置 (VS Code / PyCharm)
+
+**GPU Inference Configuration (CTranslate2):**
+
+```python
+# 推荐配置
+import ctranslate2
+
+translator = ctranslate2.Translator(
+    "models/m2m100_418m_ct2/",
+    device="cuda",                    # GPU 加速
+    device_index=0,                   # 主 GPU
+    compute_type="float16",           # Tensor Core 优化
+    inter_threads=4,                  # 并发批处理
+)
+
+# 批处理优化
+batch_size = 16  # 根据显存调整 (RTX 3060: 16-32)
+```
+
+**Note:** 项目初始化应作为第一个实现故事执行。
+
+## Core Architectural Decisions
+
+### Decision Priority Analysis
+
+**Critical Decisions (Block Implementation):**
+
+1. **Crash-Safe 原子写机制**: 采用 .tmp + fsync + rename 模式,所有持久化操作必须遵循
+2. **数据文件格式**: 使用 JSON 格式存储进度、清洗结果、翻译结果、术语库
+3. **GPU 推理配置**: CTranslate2 + float16 + 批处理优化
+4. **六模块流水线架构**: Fingerprint → Cleaning → Terminology → Translation → Upload
+
+**Important Decisions (Shape Architecture):**
+
+1. **PyQt6 ModelView 架构**: 使用 Qt Model/View 分离,实现数据驱动UI更新
+2. **Repository 模式**: 抽象数据持久化层,统一 Crash-Safe 机制
+3. **Observer 模式**: 进度事件通知机制,解耦业务逻辑与UI
+4. **打包策略**: PyInstaller 打包为可执行文件
+
+**Deferred Decisions (Post-MVP):**
+
+1. **自动更新机制**: Growth 阶段功能,使用第三方库 (如 PyUpdater)
+2. **插件系统**: Vision 阶段功能,允许扩展自定义模块
+3. **云同步**: Vision 阶段功能,可选的云端备份
+
+### Data Architecture
+
+**数据存储策略:**
+
+| 数据文件 | 格式 | 访问模式 | Crash-Safe 实现 |
+|---------|------|-----------|----------------|
+| progress.json | JSON | 读写频繁 | 原子替换 + 锁机制 |
+| novel_cleaned.json | JSON | 写入一次 | 原子写入 |
+| terms_temp.json | JSON | 读写频繁 | 原子替换 + 锁机制 |
+| novel_translated.json | JSON | 写入一次 | 原子写入 |
+| upload_failed.jsonl | JSONL | 追加写入 | 原子追加 + 锁机制 |
+| terms_library.json | JSON | 读写频繁 | 原子替换 + 锁机制 |
+
+**数据验证策略:**
+
+- **Pydantic 模型**: 定义数据模型的类型约束
+- **运行时验证**: 所有外部输入必须经过验证
+- **Schema 迁移**: 版本化数据格式,支持自动升级
+
+**Crash-Safe 持久化实现:**
+
+```python
+# infrastructure/storage.py
+import os
+import fcntl
+
+class AtomicWriter:
+    """Crash-Safe 原子写工具"""
+
+    @staticmethod
+    def write(filepath: str, data: dict | str) -> None:
+        tmp_path = f"{filepath}.tmp"
+
+        # 写入临时文件
+        with open(tmp_path, 'w', encoding='utf-8') as f:
+            if isinstance(data, dict):
+                json.dump(data, f, ensure_ascii=False, indent=2)
+            else:
+                f.write(data)
+            f.flush()  # 强制写入磁盘
+            os.fsync(f.fileno())  # 强制同步
+
+        # 原子重命名
+        os.replace(tmp_path, filepath)
+```
+
+### Authentication & Security
+
+**不适用**: 本地桌面应用,无需认证/授权机制
+
+**数据安全:**
+- 所有数据 100% 本地存储
+- 禁止任何网络数据上传(除平台API上传外)
+- GPU 模型本地推理,无云端API调用
+
+### API & Communication Patterns
+
+**外部 API 集成:**
+
+```python
+# infrastructure/api_client.py
+import requests
+from typing import Dict, Optional
+
+class PlatformAPIClient:
+    """平台 API 客户端"""
+
+    def __init__(self, base_url: str, api_key: str):
+        self.base_url = base_url
+        self.api_key = api_key
+        self.timeout = 30  # 30秒超时
+
+    def check_fingerprint(self, text: str) -> Dict:
+        """指纹查重 API"""
+        response = requests.post(
+            f"{self.base_url}/api/fingerprint/check",
+            json={"text": text},
+            headers={"Authorization": f"Bearer {self.api_key}"},
+            timeout=self.timeout
+        )
+        response.raise_for_status()
+        return response.json()
+
+    def upload_chapter(self, chapter_data: Dict) -> Dict:
+        """章节上传 API"""
+        response = requests.post(
+            f"{self.base_url}/api/chapters",
+            json=chapter_data,
+            headers={"Authorization": f"Bearer {self.api_key}"},
+            timeout=self.timeout
+        )
+        response.raise_for_status()
+        return response.json()
+
+    def deduct_cu(self, word_count: int) -> Dict:
+        """CU 扣费 API"""
+        response = requests.post(
+            f"{self.base_url}/api/cu/deduct",
+            json={"words": word_count},
+            headers={"Authorization": f"Bearer {self.api_key}"},
+            timeout=self.timeout
+        )
+        response.raise_for_status()
+        return response.json()
+```
+
+**重试策略:**
+- 指数退避重试
+- 最大重试次数:3次
+- 超时配置:30秒
+
+### Frontend Architecture
+
+**PyQt6 ModelView 架构:**
+
+```python
+# ui/models/task_model.py
+from PyQt6.QtCore import QAbstractTableModel, Qt
+
+class TaskModel(QAbstractTableModel):
+    """任务数据模型"""
+
+    def __init__(self):
+        super().__init__()
+        self._tasks = []
+
+    def rowCount(self, parent=None):
+        return len(self._tasks)
+
+    def columnCount(self, parent=None):
+        return 5  # work_id, status, progress, start_time, end_time
+
+    def data(self, index, role=Qt.ItemDataRole.DisplayRole):
+        if not index.isValid() or role != Qt.ItemDataRole.DisplayRole:
+            return None
+        return self._tasks[index.row()][index.column()]
+
+    def update_task(self, work_id: str, status: str, progress: int):
+        """更新任务状态"""
+        row = self._find_row(work_id)
+        if row is not None:
+            self._tasks[row]['status'] = status
+            self._tasks[row]['progress'] = progress
+            self.dataChanged.emit(self.index(row, 0), self.index(row, 4))
+
+# ui/main_window.py
+from PyQt6.QtWidgets import QMainWindow, QTableView
+from ui.models.task_model import TaskModel
+
+class MainWindow(QMainWindow):
+    def __init__(self):
+        super().__init__()
+        self.task_model = TaskModel()
+
+        self.task_table = QTableView()
+        self.task_table.setModel(self.task_model)
+```
+
+**进度通知机制 (Observer 模式):**
+
+```python
+# core/events.py
+from PyQt6.QtCore import QObject, pyqtSignal
+
+class ProgressEmitter(QObject):
+    """进度事件发射器"""
+
+    stage_progress = pyqtSignal(str, int)  # (work_id, percentage)
+    stage_completed = pyqtSignal(str, str)    # (work_id, stage_name)
+    stage_failed = pyqtSignal(str, str, str)  # (work_id, stage_name, error)
+    task_finished = pyqtSignal(str)           # (work_id)
+
+# modules/cleaning/cleaner.py
+from core.events import ProgressEmitter
+
+class TextCleaner:
+    def __init__(self, emitter: ProgressEmitter):
+        self.emitter = emitter
+
+    def clean(self, text: str, work_id: str) -> str:
+        # 执行清洗
+        cleaned = self._apply_rules(text)
+
+        # 发送进度通知
+        self.emitter.stage_progress.emit(work_id, 100)
+        self.emitter.stage_completed.emit(work_id, "cleaning")
+
+        return cleaned
+```
+
+### Infrastructure & Deployment
+
+**打包策略:**
+
+```python
+# pyproject.toml
+[build-system]
+requires = ["setuptools>=68.0", "wheel", "pyinstaller>=6.0"]
+build-backend = "setuptools.build_meta"
+
+[tool.pyinstaller]
+name = "序灵Matrix助手"
+console = true
+onefile = true
+icon = "assets/icon.ico"
+add-data = [
+    ("models/*", "models/"),
+    ("assets/*", "assets/")
+]
+hiddenimports = [
+    "PyQt6.sip",
+    "ctranslate2"
+]
+```
+
+**环境配置:**
+
+| 配置项 | 位置 | 说明 |
+|--------|------|------|
+| 配置文件 | `~/.config/xling-matrix/config.yaml` | API密钥、GPU设置 |
+| 数据目录 | `~/Documents/xling-matrix/` | 输入/输出文件 |
+| 日志目录 | `~/Documents/xling-matrix/logs/` | 运行日志 |
+| 模型目录 | `~/.local/share/xling-matrix/models/` | 翻译模型 |
+
+**日志系统:**
+
+```python
+# infrastructure/logger.py
+import logging
+from pathlib import Path
+
+def setup_logger(name: str, log_dir: Path) -> logging.Logger:
+    logger = logging.getLogger(name)
+    logger.setLevel(logging.INFO)
+
+    # 文件处理器
+    file_handler = logging.FileHandler(
+        log_dir / f"{name}.log",
+        encoding='utf-8'
+    )
+    file_handler.setFormatter(
+        logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+    )
+    logger.addHandler(file_handler)
+
+    # 控制台处理器
+    console_handler = logging.StreamHandler()
+    console_handler.setFormatter(
+        logging.Formatter('%(levelname)s: %(message)s')
+    )
+    logger.addHandler(console_handler)
+
+    return logger
+```
+
+### Decision Impact Analysis
+
+**Implementation Sequence:**
+
+1. Crash-Safe 持久化层 → 所有模块的基础
+2. PyQt6 ModelView 架构 → UI 层的基础
+3. 六个核心模块 → 业务逻辑实现
+4. GPU 推理优化 → 性能优化
+5. API 集成与上传 → 外部对接
+
+**Cross-Component Dependencies:**
+
+```
+                    ┌─────────────┐
+                    │   GUI UI   │
+                    └──────┬──────┘
+                           │ Observer
+                    ┌──────▼──────┐
+                    │  Scheduler   │
+                    └──────┬──────┘
+                           │
+        ┌──────────────────┼──────────────────┐
+        │                  │                  │
+   ┌────▼────┐     ┌────▼────┐     ┌────▼────┐
+   │Fingerprint│    │Cleaning  │    │Translation│
+   └────┬────┘     └────┬────┘     └────┬────┘
+        │                  │                  │
+        └────────┬────────┴──────────────────┘
+                 │
+         ┌───────▼────────┐
+         │  Storage Layer  │
+         │ (Crash-Safe)  │
+         └─────────────────┘
+```
+
+## Implementation Patterns & Consistency Rules
+
+### Pattern Categories Defined
+
+**Critical Conflict Points Identified:**
+8 个领域需要一致性规则以确保 AI 代理代码兼容
+
+### Core Design Patterns
+
+**1. Pipeline 模式(翻译流水线)**
+
+所有翻译任务必须通过统一的 Pipeline 执行:
+
+```python
+# core/pipeline.py
+from dataclasses import dataclass
+from typing import Protocol
+
+@dataclass
+class PipelineContext:
+    """流水线上下文"""
+    work_id: str
+    input_file: str
+    output_dir: str
+    current_stage: str
+    error: str | None = None
+    metadata: dict = None
+
+class PipelineStage(Protocol):
+    """流水线阶段协议"""
+
+    def name(self) -> str:
+        """返回阶段名称"""
+        ...
+
+    def execute(self, context: PipelineContext) -> PipelineContext:
+        """执行阶段逻辑"""
+        ...
+
+class TranslationPipeline:
+    """翻译流水线"""
+
+    def __init__(self):
+        self.stages: list[PipelineStage] = []
+
+    def add_stage(self, stage: PipelineStage) -> None:
+        self.stages.append(stage)
+
+    def execute(self, context: PipelineContext) -> PipelineContext:
+        for stage in self.stages:
+            context.current_stage = stage.name()
+            try:
+                context = stage.execute(context)
+                if context.error:
+                    context.error = f"{stage.name()}: {context.error}"
+                    return context
+            except Exception as e:
+                context.error = f"{stage.name()}: {str(e)}"
+                return context
+        return context
+```
+
+**2. State Machine(任务状态)**
+
+任务状态转换必须遵循状态机规则:
+
+```python
+# core/state.py
+from enum import Enum
+from dataclasses import dataclass
+
+class TaskState(Enum):
+    """任务状态枚举"""
+    PENDING = "pending"
+    RUNNING = "running"
+    PAUSED = "paused"
+    SUCCESS = "success"
+    FAILED = "failed"
+
+@dataclass
+class TaskTransition:
+    """状态转换"""
+    from_state: TaskState
+    to_state: TaskState
+    is_valid: bool
+    error: str | None = None
+
+class TaskStateMachine:
+    """任务状态机"""
+
+    # 允许的状态转换
+    VALID_TRANSITIONS = {
+        TaskState.PENDING: [TaskState.RUNNING],
+        TaskState.RUNNING: [TaskState.PAUSED, TaskState.SUCCESS, TaskState.FAILED],
+        TaskState.PAUSED: [TaskState.RUNNING, TaskState.FAILED],
+        TaskState.SUCCESS: [],  # 终态
+        TaskState.FAILED: [TaskState.PENDING],  # 可重试
+    }
+
+    def can_transition(self, from_state: TaskState, to_state: TaskState) -> bool:
+        return to_state in self.VALID_TRANSITIONS.get(from_state, [])
+
+    def transition(self, current: TaskState, target: TaskState) -> TaskTransition:
+        if not self.can_transition(current, target):
+            valid_targets = ", ".join(s.value for s in self.VALID_TRANSITIONS.get(current, []))
+            return TaskTransition(current, target, False,
+                f"Invalid transition: {current.value} -> {target.value}. Valid targets: {valid_targets}")
+        return TaskTransition(current, target, True)
+```
+
+**3. Repository 模式(数据持久化)**
+
+所有数据访问必须通过 Repository 接口:
+
+```python
+# core/repository.py
+from abc import ABC, abstractmethod
+from typing import TypeVar, Generic
+
+T = TypeVar('T')
+
+class Repository(ABC, Generic[T]):
+    """Repository 接口"""
+
+    @abstractmethod
+    def save(self, entity: T) -> None:
+        """保存实体"""
+        pass
+
+    @abstractmethod
+    def load(self, id: str) -> T | None:
+        """加载实体"""
+        pass
+
+# infrastructure/repositories/progress_repository.py
+from core.repository import Repository
+from infrastructure.storage import AtomicWriter
+
+class CrashSafeProgressRepository(Repository[Progress]):
+    """Crash-Safe 进度仓储"""
+
+    def __init__(self, file_path: str):
+        self.file_path = file_path
+
+    def save(self, progress: Progress) -> None:
+        AtomicWriter.write(self.file_path, progress.to_dict())
+
+    def load(self, work_id: str) -> Progress | None:
+        if not os.path.exists(self.file_path):
+            return None
+        with open(self.file_path, 'r', encoding='utf-8') as f:
+            data = json.load(f)
+            return Progress.from_dict(data.get(work_id))
+```
+
+**4. Observer 模式(进度通知)**
+
+使用 PyQt6 信号槽机制实现进度通知:
+
+```python
+# core/events.py
+from PyQt6.QtCore import QObject, pyqtSignal
+from typing import Protocol
+
+class ProgressObserver(Protocol):
+    """进度观察者协议"""
+
+    def on_stage_start(self, work_id: str, stage: str) -> None:
+        """阶段开始"""
+        ...
+
+    def on_stage_progress(self, work_id: str, stage: str, percent: int) -> None:
+        """阶段进度"""
+        ...
+
+    def on_stage_complete(self, work_id: str, stage: str) -> None:
+        """阶段完成"""
+        ...
+
+    def on_stage_error(self, work_id: str, stage: str, error: str) -> None:
+        """阶段错误"""
+        ...
+
+class ProgressEmitter(QObject):
+    """进度事件发射器"""
+
+    # 定义信号
+    stage_started = pyqtSignal(str, str)      # (work_id, stage)
+    stage_progress = pyqtSignal(str, str, int)  # (work_id, stage, percent)
+    stage_completed = pyqtSignal(str, str)    # (work_id, stage)
+    stage_failed = pyqtSignal(str, str, str)  # (work_id, stage, error)
+    task_finished = pyqtSignal(str, str)      # (work_id, final_state)
+
+# 使用示例
+class TranslationStage:
+    def __init__(self, emitter: ProgressEmitter):
+        self.emitter = emitter
+
+    def execute(self, context: PipelineContext) -> PipelineContext:
+        self.emitter.stage_started.emit(context.work_id, "translation")
+
+        try:
+            for i, batch in enumerate(batches):
+                # 执行翻译
+                self._translate_batch(batch)
+                progress = int((i + 1) / len(batches) * 100)
+                self.emitter.stage_progress.emit(context.work_id, "translation", progress)
+
+            self.emitter.stage_completed.emit(context.work_id, "translation")
+            return context
+        except Exception as e:
+            self.emitter.stage_failed.emit(context.work_id, "translation", str(e))
+            context.error = str(e)
+            return context
+```
+
+### Naming Patterns
+
+**代码命名约定:**
+
+| 类别 | 约定 | 示例 |
+|------|------|------|
+| 类名 | PascalCase | `TranslationPipeline`, `TaskStateMachine` |
+| 函数名 | snake_case | `execute_pipeline()`, `load_progress()` |
+| 变量名 | snake_case | `work_id`, `batch_size` |
+| 常量 | UPPER_SNAKE_CASE | `MAX_BATCH_SIZE`, `DEFAULT_TIMEOUT` |
+| 私有成员 | 前缀下划线 | `_internal_state`, `_helper()` |
+| 协议/接口 | PascalCase + Protocol 后缀 | `ProgressObserver`, `Repository` |
+
+**文件命名约定:**
+
+| 类型 | 命名 | 示例 |
+|------|------|------|
+| 模块文件 | snake_case.py | `translation_stage.py`, `progress_repository.py` |
+| 测试文件 | test_<module>.py | `test_pipeline.py`, `test_translation.py` |
+| 包目录 | snake_case | `translation/`, `cleaning/` |
+
+### Structure Patterns
+
+**项目组织原则:**
+
+```
+src/xling_matrix/
+├── core/              # 核心领域模型(无依赖)
+│   ├── models.py      # 数据模型
+│   ├── state.py       # 状态机
+│   ├── pipeline.py    # 流水线
+│   ├── events.py      # 事件系统
+│   └── repository.py  # Repository 接口
+│
+├── modules/           # 业务模块(依赖 core)
+│   └── <module>/
+│       ├── __init__.py
+│       ├── <module>_stage.py    # 阶段实现
+│       ├── <module>_service.py  # 服务逻辑
+│       └── models.py            # 模块特定模型
+│
+├── ui/                # UI 层(依赖 core)
+│   ├── main_window.py
+│   ├── widgets/
+│   └── dialogs/
+│
+└── infrastructure/    # 基础设施(可依赖任何层)
+    ├── storage/
+    ├── gpu/
+    ├── network/
+    └── logging/
+```
+
+**测试组织原则:**
+
+```
+tests/
+├── unit/              # 单元测试
+│   ├── test_core/
+│   │   ├── test_pipeline.py
+│   │   ├── test_state.py
+│   │   └── test_events.py
+│   └── test_modules/
+│       ├── test_translation.py
+│       └── test_cleaning.py
+│
+├── integration/       # 集成测试
+│   ├── test_workflow_integration.py
+│   └── test_api_integration.py
+│
+└── fixtures/          # 测试数据
+    ├── sample_novels/
+    └── expected_outputs/
+```
+
+### Format Patterns
+
+**数据文件格式:**
+
+所有 JSON 文件必须遵循以下格式:
+
+```python
+# 通用 JSON 结构
+{
+    "version": "1.0",           # 数据版本
+    "work_id": "uuid",          # 工作ID
+    "timestamp": "ISO-8601",    # 时间戳
+    "data": { ... }             # 实际数据
+}
+```
+
+**进度文件格式 (progress.json):**
+
+```json
+{
+    "version": "1.0",
+    "work_id": "abc123",
+    "state": "running",
+    "current_stage": "translation",
+    "stages": {
+        "fingerprint": {"status": "success", "progress": 100},
+        "cleaning": {"status": "success", "progress": 100},
+        "terminology": {"status": "success", "progress": 100},
+        "translation": {"status": "running", "progress": 45},
+        "upload": {"status": "pending", "progress": 0}
+    },
+    "created_at": "2026-03-13T12:00:00Z",
+    "updated_at": "2026-03-13T12:30:00Z"
+}
+```
+
+**错误响应格式:**
+
+```python
+# 统一错误格式
+@dataclass
+class ErrorInfo:
+    code: str           # 错误代码 (如 "STAGE_FAILED", "GPU_OOM")
+    message: str        # 用户友好的错误消息
+    detail: str | None  # 详细错误信息(日志级别)
+    stage: str | None   # 失败的阶段
+
+# 错误代码规范
+class ErrorCode:
+    # 通用错误
+    UNKNOWN_ERROR = "UNKNOWN_ERROR"
+    INVALID_INPUT = "INVALID_INPUT"
+    FILE_NOT_FOUND = "FILE_NOT_FOUND"
+
+    # 阶段错误
+    FINGERPRINT_FAILED = "FINGERPRINT_FAILED"
+    CLEANING_FAILED = "CLEANING_FAILED"
+    TERMINOLOGY_FAILED = "TERMINOLOGY_FAILED"
+    TRANSLATION_FAILED = "TRANSLATION_FAILED"
+    UPLOAD_FAILED = "UPLOAD_FAILED"
+
+    # GPU 错误
+    GPU_NOT_AVAILABLE = "GPU_NOT_AVAILABLE"
+    GPU_OOM = "GPU_OOM"
+
+    # 网络错误
+    API_CONNECTION_FAILED = "API_CONNECTION_FAILED"
+    API_TIMEOUT = "API_TIMEOUT"
+```
+
+### Communication Patterns
+
+**事件命名约定:**
+
+```python
+# 事件命名格式: <subject>_<action>
+class Events:
+    # 阶段事件
+    STAGE_STARTED = "stage.started"
+    STAGE_PROGRESS = "stage.progress"
+    STAGE_COMPLETED = "stage.completed"
+    STAGE_FAILED = "stage.failed"
+
+    # 任务事件
+    TASK_CREATED = "task.created"
+    TASK_STARTED = "task.started"
+    TASK_PAUSED = "task.paused"
+    TASK_RESUMED = "task.resumed"
+    TASK_FINISHED = "task.finished"
+```
+
+**日志级别使用:**
+
+| 级别 | 用途 | 示例 |
+|------|------|------|
+| DEBUG | 详细调试信息 | `"Batch size: 16, GPU memory: 3.2GB"` |
+| INFO | 正常操作流程 | `"Stage 'translation' started for work_id: abc123"` |
+| WARNING | 可恢复的问题 | `"GPU memory low, reducing batch size to 8"` |
+| ERROR | 操作失败但可恢复 | `"API request failed, retrying (1/3)"` |
+| CRITICAL | 严重错误需人工介入 | `"GPU OOM, cannot continue"` |
+
+### Process Patterns
+
+**Crash-Safe 写入模式(强制执行):**
+
+```python
+# 所有持久化操作必须使用此模式
+from infrastructure.storage import AtomicWriter
+
+# 正确示例
+def save_progress(progress: Progress) -> None:
+    AtomicWriter.write("progress.json", progress.to_dict())
+
+# 错误示例 - 禁止直接写入
+def save_progress_WRONG(progress: Progress) -> None:
+    with open("progress.json", "w") as f:
+        json.dump(progress.to_dict(), f)  # ❌ 非 Crash-Safe
+```
+
+**错误处理模式:**
+
+```python
+# 统一错误处理流程
+def execute_stage(context: PipelineContext) -> PipelineContext:
+    try:
+        # 业务逻辑
+        result = do_work(context)
+        return context
+    except GPUOutOfMemoryError as e:
+        # 特定错误处理
+        return handle_gpu_oom(context, e)
+    except APIError as e:
+        # 重试逻辑
+        return retry_with_backoff(context, e)
+    except Exception as e:
+        # 通用错误处理
+        context.error = str(e)
+        logger.error(f"Stage failed: {e}", exc_info=True)
+        return context
+```
+
+**GPU 资源管理模式:**
+
+```python
+# infrastructure/gpu/manager.py
+import ctranslate2
+from typing import ContextManager
+
+class GPUManager:
+    """GPU 资源管理器"""
+
+    _instance = None
+    _translator = None
+
+    @classmethod
+    def get_instance(cls) -> 'GPUManager':
+        if cls._instance is None:
+            cls._instance = cls()
+        return cls._instance
+
+    def initialize(self, model_path: str) -> None:
+        """初始化 GPU 翻译器"""
+        if self._translator is None:
+            self._translator = ctranslate2.Translator(
+                model_path,
+                device=self._detect_device(),
+                device_index=0,
+                compute_type="float16",
+                inter_threads=4
+            )
+
+    def _detect_device(self) -> str:
+        """检测可用设备"""
+        try:
+            import torch
+            if torch.cuda.is_available():
+                return "cuda"
+        except:
+            pass
+        return "cpu"  # 降级到 CPU
+
+    def translate_batch(self, tokens: list[list[str]]) -> list[list[str]]:
+        """执行批处理翻译"""
+        return self._translator.translate_batch(tokens)
+```
+
+### Enforcement Guidelines
+
+**All AI Agents MUST:**
+
+1. **使用 Crash-Safe 写入**: 所有持久化操作必须通过 `AtomicWriter`
+2. **遵循状态机规则**: 状态转换必须通过 `TaskStateMachine` 验证
+3. **使用 Repository 接口**: 数据访问必须实现 `Repository` 协议
+4. **通过信号通知进度**: 使用 `ProgressEmitter` 发送进度事件
+5. **遵循命名约定**: 代码命名必须符合定义的约定
+6. **返回统一错误格式**: 所有错误必须返回 `ErrorInfo` 结构
+
+## Complete Project Structure
+
+### Directory Layout
+
+```
+xling-matrix-assistant/
+├── src/
+│   └── xling_matrix/
+│       ├── __init__.py
+│       ├── __main__.py
+│       │
+│       ├── core/                          # 核心领域层
+│       │   ├── __init__.py
+│       │   ├── models.py                  # 数据模型定义
+│       │   ├── state.py                   # 状态机实现
+│       │   ├── pipeline.py                # 流水线编排
+│       │   ├── events.py                  # 事件系统
+│       │   └── repository.py              # Repository 接口
+│       │
+│       ├── modules/                       # 业务模块层
+│       │   ├── __init__.py
+│       │   │
+│       │   ├── fingerprint/               # 指纹模块 (FR1-FR8)
+│       │   │   ├── __init__.py
+│       │   │   ├── fingerprint_stage.py   # 指纹查重阶段
+│       │   │   ├── fingerprint_service.py # 指纹服务
+│       │   │   └── models.py              # 指纹数据模型
+│       │   │
+│       │   ├── cleaning/                  # 清洗模块 (FR9-FR16)
+│       │   │   ├── __init__.py
+│       │   │   ├── cleaning_stage.py
+│       │   │   ├── rule_engine.py         # 正则替换引擎
+│       │   │   ├── formatter.py           # 格式标准化
+│       │   │   └── models.py
+│       │   │
+│       │   ├── terminology/               # 术语模块 (FR17-FR24)
+│       │   │   ├── __init__.py
+│       │   │   ├── terminology_stage.py
+│       │   │   ├── extractor.py           # 术语提取器
+│       │   │   ├── library.py             # 术语库管理
+│       │   │   └── models.py
+│       │   │
+│       │   ├── translation/               # 翻译模块 (FR25-FR33)
+│       │   │   ├── __init__.py
+│       │   │   ├── translation_stage.py
+│       │   │   ├── translator.py          # CTranslate2 封装
+│       │   │   ├── batch_processor.py     # 批处理优化
+│       │   │   └── models.py
+│       │   │
+│       │   └── upload/                    # 上传模块 (FR34-FR40)
+│       │       ├── __init__.py
+│       │       ├── upload_stage.py
+│       │       ├── uploader.py            # 平台上传
+│       │       └── models.py
+│       │
+│       ├── ui/                            # 表示层
+│       │   ├── __init__.py
+│       │   ├── main_window.py             # 主窗口
+│       │   ├── widgets/
+│       │   │   ├── __init__.py
+│       │   │   ├── task_list_widget.py    # 任务列表
+│       │   │   ├── progress_widget.py     # 进度显示
+│       │   │   └── log_widget.py          # 日志显示
+│       │   ├── dialogs/
+│       │   │   ├── __init__.py
+│       │   │   ├── new_task_dialog.py     # 新建任务对话框
+│       │   │   ├── settings_dialog.py     # 设置对话框
+│       │   │   └── fingerprint_dialog.py  # 指纹审核对话框
+│       │   └── models/
+│       │       ├── __init__.py
+│       │       └── task_model.py          # 任务数据模型
+│       │
+│       └── infrastructure/                # 基础设施层
+│           ├── __init__.py
+│           ├── storage/
+│           │   ├── __init__.py
+│           │   ├── atomic_writer.py       # Crash-Safe 写入
+│           │   └── file_lock.py           # 文件锁机制
+│           ├── gpu/
+│           │   ├── __init__.py
+│           │   └── manager.py             # GPU 资源管理
+│           ├── network/
+│           │   ├── __init__.py
+│           │   ├── api_client.py          # 平台 API 客户端
+│           │   └── retry.py               # 重试策略
+│           └── logging/
+│               ├── __init__.py
+│               └── logger.py              # 日志配置
+│
+├── tests/
+│   ├── __init__.py
+│   ├── conftest.py                        # pytest 配置
+│   │
+│   ├── unit/
+│   │   ├── test_core/
+│   │   │   ├── __init__.py
+│   │   │   ├── test_pipeline.py
+│   │   │   ├── test_state.py
+│   │   │   └── test_events.py
+│   │   ├── test_modules/
+│   │   │   ├── test_fingerprint.py
+│   │   │   ├── test_cleaning.py
+│   │   │   ├── test_terminology.py
+│   │   │   ├── test_translation.py
+│   │   │   └── test_upload.py
+│   │   └── test_infrastructure/
+│   │       ├── test_storage.py
+│   │       ├── test_gpu_manager.py
+│   │       └── test_api_client.py
+│   │
+│   ├── integration/
+│   │   ├── __init__.py
+│   │   ├── test_workflow.py               # 完整工作流测试
+│   │   └── test_api_integration.py
+│   │
+│   └── fixtures/
+│       ├── novels/
+│       │   └── sample_chinese.txt
+│       └── expected/
+│           └── sample_translated.json
+│
+├── models/                                # 翻译模型文件
+│   └── m2m100_418m_ct2/
+│
+├── assets/                                # 资源文件
+│   ├── icons/
+│   │   └── app_icon.ico
+│   └── config/
+│       └── default_config.yaml
+│
+├── docs/
+│   ├── architecture.md                    # 架构文档
+│   ├── api.md                             # API 文档
+│   └── user_guide.md                      # 用户指南
+│
+├── pyproject.toml                         # 项目配置
+├── README.md
+├── LICENSE
+└── .gitignore
+```
+
+### Module Dependencies
+
+```
+┌─────────────────────────────────────────────────────────────┐
+│                        UI Layer                             │
+│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐      │
+│  │ MainWindow   │  │   Widgets    │  │   Dialogs    │      │
+│  └──────┬───────┘  └──────┬───────┘  └──────┬───────┘      │
+└─────────┼──────────────────┼──────────────────┼─────────────┘
+          │                  │                  │
+          ▼                  ▼                  ▼
+┌─────────────────────────────────────────────────────────────┐
+│                     Application Layer                        │
+│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐      │
+│  │  Scheduler   │  │  Workflows   │  │ State Machine│      │
+│  └──────┬───────┘  └──────┬───────┘  └──────┬───────┘      │
+└─────────┼──────────────────┼──────────────────┼─────────────┘
+          │                  │                  │
+          ▼                  ▼                  ▼
+┌─────────────────────────────────────────────────────────────┐
+│                      Domain Layer                            │
+│  ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌─────────┐  │
+│  │Fingerprint │ │  Cleaning  │ │Terminology │ │Translation│ │
+│  └────┬───────┘ └────┬───────┘ └────┬───────┘ └────┬────┘  │
+│       └────────────────┴────────────────┴────────┘         │
+│                          │                                  │
+│                    ┌─────▼─────┐                            │
+│                    │   Core    │                            │
+│                    │(Pipeline, │                            │
+│                    │ Events,   │                            │
+│                    │ Models)   │                            │
+│                    └───────────┘                            │
+└─────────────────────────────────────────────────────────────┘
+                          │
+                          ▼
+┌─────────────────────────────────────────────────────────────┐
+│                  Infrastructure Layer                        │
+│  ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌─────────┐  │
+│  │  Storage   │ │     GPU    │ │  Network   │ │ Logging │  │
+│  │(Crash-Safe)│ │  Manager   │ │  API Client│ │         │  │
+│  └────────────┘ └────────────┘ └────────────┘ └─────────┘  │
+└─────────────────────────────────────────────────────────────┘
+```
+
+## API Interface Design
+
+### Internal Module APIs
+
+**Pipeline Stage 接口:**
+
+```python
+# core/pipeline.py
+class PipelineStage(Protocol):
+    """流水线阶段协议 - 所有阶段必须实现"""
+
+    def name(self) -> str:
+        """返回阶段唯一标识符"""
+        ...
+
+    def execute(self, context: PipelineContext) -> PipelineContext:
+        """执行阶段逻辑
+
+        Args:
+            context: 流水线上下文
+
+        Returns:
+            更新后的上下文。如果失败,设置 context.error
+        """
+        ...
+
+    def estimate_progress(self, context: PipelineContext) -> int:
+        """估算当前进度百分比"""
+        ...
+```
+
+**Repository 接口:**
+
+```python
+# core/repository.py
+class Repository(ABC, Generic[T]):
+    """数据仓储接口 - 所有数据访问必须实现"""
+
+    @abstractmethod
+    def save(self, entity: T) -> None:
+        """保存实体(使用 Crash-Safe 写入)"""
+        pass
+
+    @abstractmethod
+    def load(self, id: str) -> T | None:
+        """加载实体"""
+        pass
+
+    @abstractmethod
+    def delete(self, id: str) -> bool:
+        """删除实体"""
+        pass
+```
+
+### External API Integration
+
+**平台 API 客户端接口:**
+
+```python
+# infrastructure/network/platform_api.py
+class PlatformAPIClient:
+    """平台 API 客户端 - 对接外部平台"""
+
+    BASE_URL: str
+    API_KEY: str
+    TIMEOUT: int = 30
+
+    # 指纹查重 API
+    def check_fingerprint(self, text: str) -> FingerprintResult:
+        """检查文本指纹
+
+        Args:
+            text: 待检查的文本
+
+        Returns:
+            FingerprintResult: 包含相似度、匹配章节等
+
+        Raises:
+            APIConnectionError: 网络连接失败
+            APITimeoutError: 请求超时
+            APIError: API 返回错误
+        """
+        ...
+
+    # 章节上传 API
+    def upload_chapter(self, chapter: ChapterData) -> UploadResult:
+        """上传翻译章节
+
+        Args:
+            chapter: 章节数据(标题、内容、字数等)
+
+        Returns:
+            UploadResult: 包含章节 ID、URL 等
+
+        Raises:
+            APIConnectionError, APITimeoutError, APIError
+        """
+        ...
+
+    # CU 扣费 API
+    def deduct_cu(self, word_count: int) -> DeductResult:
+        """扣除 CU
+
+        Args:
+            word_count: 字数
+
+        Returns:
+            DeductResult: 包含剩余 CU
+        """
+        ...
+
+    # 健康检查
+    def health_check(self) -> bool:
+        """检查 API 连接状态"""
+        ...
+```
+
+**API 请求/响应格式:**
+
+**1. 指纹查重 API**
+
+```http
+POST /api/fingerprint/check
+Content-Type: application/json
+Authorization: Bearer {api_key}
+
+# Request
+{
+  "fingerprint": "md5hash",
+  "sample": "第一章样本文本...",
+  "work_id": "uuid"
+}
+
+# Response
+{
+  "exists": false,
+  "work_id": "uuid",
+  "similarity": 0.0,
+  "matches": []
+}
+```
+
+**2. 上传章节 API**
+
+```http
+POST /api/chapters
+Content-Type: application/json
+Authorization: Bearer {api_key}
+
+# Request
+{
+  "work_id": "uuid",
+  "chapter_id": "Chapter 0001",
+  "title": "第一章 开始",
+  "content_en": "Chapter 1 The Beginning...",
+  "word_count": 1234,
+  "source_language": "zh",
+  "target_language": "en"
+}
+
+# Response
+{
+  "success": true,
+  "chapter_id": "Chapter 0001",
+  "chapter_url": "https://platform.com/novels/uuid/chapters/Chapter%200001",
+  "uploaded_at": "2026-03-13T12:00:00Z"
+}
+```
+
+**3. CU 扣费 API**
+
+```http
+POST /api/cu/deduct
+Content-Type: application/json
+Authorization: Bearer {api_key}
+
+# Request
+{
+  "work_id": "uuid",
+  "words": 1234,
+  "chapter_id": "Chapter 0001"
+}
+
+# Response
+{
+  "success": true,
+  "deducted": 12.34,
+  "balance": 987.66,
+  "transaction_id": "txn_abc123"
+}
+```
+
+**错误响应格式:**
+
+```http
+# Error Response
+{
+  "error": {
+    "code": "INVALID_API_KEY",
+    "message": "API密钥无效或已过期",
+    "detail": "请联系客服获取新的API密钥"
+  }
+}
+```
+
+## Data Model Design
+
+### Core Data Models
+
+```python
+# core/models.py
+from dataclasses import dataclass, field
+from datetime import datetime
+from typing import Literal
+from enum import Enum
+
+class TaskState(Enum):
+    PENDING = "pending"
+    RUNNING = "running"
+    PAUSED = "paused"
+    SUCCESS = "success"
+    FAILED = "failed"
+
+class StageStatus(Enum):
+    PENDING = "pending"
+    RUNNING = "running"
+    SUCCESS = "success"
+    FAILED = "failed"
+    SKIPPED = "skipped"
+
+@dataclass
+class StageProgress:
+    """阶段进度"""
+    status: StageStatus
+    progress: int  # 0-100
+    error: str | None = None
+    started_at: datetime | None = None
+    completed_at: datetime | None = None
+
+@dataclass
+class Progress:
+    """任务进度"""
+    work_id: str
+    state: TaskState
+    current_stage: str
+    stages: dict[str, StageProgress] = field(default_factory=dict)
+    input_file: str = ""
+    output_dir: str = ""
+    created_at: datetime = field(default_factory=datetime.now)
+    updated_at: datetime = field(default_factory=datetime.now)
+
+    def to_dict(self) -> dict:
+        """序列化为字典"""
+        return {
+            "version": "1.0",
+            "work_id": self.work_id,
+            "state": self.state.value,
+            "current_stage": self.current_stage,
+            "stages": {
+                name: {
+                    "status": stage.status.value,
+                    "progress": stage.progress,
+                    "error": stage.error,
+                    "started_at": stage.started_at.isoformat() if stage.started_at else None,
+                    "completed_at": stage.completed_at.isoformat() if stage.completed_at else None,
+                }
+                for name, stage in self.stages.items()
+            },
+            "input_file": self.input_file,
+            "output_dir": self.output_dir,
+            "created_at": self.created_at.isoformat(),
+            "updated_at": self.updated_at.isoformat(),
+        }
+
+    @classmethod
+    def from_dict(cls, data: dict) -> 'Progress':
+        """从字典反序列化"""
+        stages = {
+            name: StageProgress(
+                status=StageStatus(stage["status"]),
+                progress=stage["progress"],
+                error=stage.get("error"),
+                started_at=datetime.fromisoformat(stage["started_at"]) if stage.get("started_at") else None,
+                completed_at=datetime.fromisoformat(stage["completed_at"]) if stage.get("completed_at") else None,
+            )
+            for name, stage in data.get("stages", {}).items()
+        }
+        return cls(
+            work_id=data["work_id"],
+            state=TaskState(data["state"]),
+            current_stage=data["current_stage"],
+            stages=stages,
+            input_file=data.get("input_file", ""),
+            output_dir=data.get("output_dir", ""),
+            created_at=datetime.fromisoformat(data["created_at"]),
+            updated_at=datetime.fromisoformat(data["updated_at"]),
+        )
+
+@dataclass
+class Term:
+    """术语条目"""
+    source: str           # 原文
+    target: str           # 译文
+    category: str = ""    # 分类
+    locked: bool = False  # 是否锁定
+
+@dataclass
+class TerminologyLibrary:
+    """术语库"""
+    version: str = "1.0"
+    terms: list[Term] = field(default_factory=list)
+
+@dataclass
+class ChapterData:
+    """章节数据"""
+    title: str
+    content: str
+    word_count: int
+    source_language: str = "zh"
+    target_language: str = "en"
+
+@dataclass
+class Chapter:
+    """章节实体"""
+    chapter_id: str        # "Chapter 0001"
+    part_index: int        # 卷索引
+    title_src: str         # 原文标题
+    content: str           # 原文内容
+    content_en: str | None = None  # 译文内容
+    word_count: int = 0
+    translated_at: datetime | None = None
+
+@dataclass
+class Term:
+    """术语条目"""
+    source: str              # 原文
+    translation: str | None  # 译文
+    count: int = 0           # 出现次数
+    chapters: int = 0        # 涉及章节数
+    locked: bool = False     # 是否锁定
+
+    def to_dict(self) -> dict:
+        return {
+            "source": self.source,
+            "translation": self.translation,
+            "count": self.count,
+            "chapters": self.chapters,
+            "locked": self.locked
+        }
+
+    @classmethod
+    def from_dict(cls, data: dict) -> 'Term':
+        return cls(
+            source=data["source"],
+            translation=data.get("translation"),
+            count=data.get("count", 0),
+            chapters=data.get("chapters", 0),
+            locked=data.get("locked", False)
+        )
+```
+
+### Extended Data Models
+
+**指纹数据模型:**
+
+```python
+@dataclass
+class FingerprintData:
+    """指纹查重数据"""
+    work_id: str
+    fingerprint: str       # MD5 hash
+    sample: str            # 样本文本(前1000字)
+    exists: bool = False
+    similarity: float = 0.0
+    matches: list[str] = field(default_factory=list)  # 匹配的 work_id 列表
+
+@dataclass
+class FingerprintResult:
+    """指纹查重结果"""
+    exists: bool
+    work_id: str
+    similarity: float
+    matches: list[dict] = field(default_factory=list)
+    # matches format: [{"work_id": "uuid", "similarity": 0.95, "chapter": "Chapter 0001"}]
+```
+
+**上传队列模型:**
+
+```python
+@dataclass
+class UploadQueueItem:
+    """上传队列项"""
+    work_id: str
+    chapter_id: str
+    title: str
+    content_en: str
+    word_count: int
+    retry_count: int = 0
+    max_retries: int = 3
+    created_at: datetime = field(default_factory=datetime.now)
+
+@dataclass
+class UploadFailedItem:
+    """上传失败项(JSONL 格式)"""
+    work_id: str
+    chapter_id: str
+    error_code: str
+    error_message: str
+    failed_at: datetime = field(default_factory=datetime.now)
+    retry_count: int = 0
+```
+
+## Security Design
+
+### Data Protection
+
+**1. 本地数据存储策略:**
+
+- 所有用户数据 100% 存储在本地
+- 不上传任何原文到云端(除平台 API 上传翻译结果外)
+- 配置文件(API 密钥)使用系统密钥环存储
+
+**2. API 密钥管理:**
+
+```python
+# infrastructure/security/secret_manager.py
+import keyring
+from typing import Optional
+
+class SecretManager:
+    """密钥管理器 - 使用系统密钥环"""
+
+    SERVICE_NAME = "xling-matrix-assistant"
+
+    def set_api_key(self, key: str) -> None:
+        """存储 API 密钥"""
+        keyring.set_password(self.SERVICE_NAME, "platform_api", key)
+
+    def get_api_key(self) -> Optional[str]:
+        """获取 API 密钥"""
+        return keyring.get_password(self.SERVICE_NAME, "platform_api")
+
+    def delete_api_key(self) -> None:
+        """删除 API 密钥"""
+        keyring.delete_password(self.SERVICE_NAME, "platform_api")
+```
+
+**3. 文件权限控制:**
+
+```python
+# infrastructure/storage/permissions.py
+import os
+import stat
+
+def set_secure_permissions(filepath: str) -> None:
+    """设置安全的文件权限(仅用户可读写)"""
+    os.chmod(filepath, stat.S_IRUSR | stat.S_IWUSR)
+```
+
+### License Compliance
+
+**依赖许可证验证:**
+
+```python
+# tools/license_checker.py
+import subprocess
+import json
+
+ALLOWED_LICENSES = {"MIT", "Apache-2.0", "BSD-3-Clause", "PSF-2.0"}
+BANNED_LICENSES = {"GPL", "AGPL", "LGPL", "SSPL", "CPAL"}
+
+def check_dependency_licenses() -> dict:
+    """检查所有依赖的许可证"""
+    result = subprocess.run(
+        ["pip", "show", "--json"],
+        capture_output=True,
+        text=True
+    )
+    packages = json.loads(result.stdout)
+
+    issues = []
+    for pkg in packages:
+        license_ = pkg.get("License", "UNKNOWN")
+        if any(banned in license_ for banned in BANNED_LICENSES):
+            issues.append({
+                "package": pkg["Name"],
+                "license": license_,
+                "severity": "BLOCKING",
+                "reason": "Contains GPL contamination"
+            })
+        elif license_ not in ALLOWED_LICENSES and license_ != "UNKNOWN":
+            issues.append({
+                "package": pkg["Name"],
+                "license": license_,
+                "severity": "WARNING",
+                "reason": "License not in whitelist"
+            })
+
+    return {"valid": len(issues) == 0, "issues": issues}
+```
+
+**4. 许可证管理(Growth 阶段):**
+
+```python
+# infrastructure/security/license_manager.py
+import hashlib
+import platform
+import requests
+
+class LicenseManager:
+    """许可证管理器 - 硬件绑定与在线激活验证"""
+
+    def generate_fingerprint(self) -> str:
+        """生成硬件指纹(用于软件绑定)"""
+        # 获取硬件信息
+        machine_id = platform.node()
+        cpu_info = platform.processor()
+        mac_address = self._get_mac_address()
+
+        # 组合生成指纹
+        fingerprint_data = f"{machine_id}:{cpu_info}:{mac_address}"
+        return hashlib.md5(fingerprint_data.encode()).hexdigest()
+
+    def _get_mac_address(self) -> str:
+        """获取本机 MAC 地址"""
+        try:
+            import uuid
+            return ':'.join(['{:02x}'.format((uuid.getnode() >> elements) & 0xff)
+                                   for elements in range(0, 2*6, 8)][::-1])
+        except:
+            return "unknown"
+
+    def verify_activation(self, activation_key: str) -> bool:
+        """在线验证激活密钥
+
+        Args:
+            activation_key: 用户输入的激活密钥
+
+        Returns:
+            bool: 激活是否有效
+        """
+        try:
+            fingerprint = self.generate_fingerprint()
+            response = requests.post(
+                "https://license.xling-matrix.com/verify",
+                json={
+                    "activation_key": activation_key,
+                    "fingerprint": fingerprint,
+                    "version": "0.1.0"
+                },
+                timeout=10
+            )
+            response.raise_for_status()
+            return response.json().get("valid", False)
+        except Exception:
+            return False
+
+    def check_expiration(self, activation_key: str) -> dict | None:
+        """检查激活是否过期"""
+        try:
+            response = requests.post(
+                "https://license.xling-matrix.com/check",
+                json={"activation_key": activation_key},
+                timeout=10
+            )
+            response.raise_for_status()
+            data = response.json()
+            return {
+                "expired": data.get("expired", False),
+                "expires_at": data.get("expires_at"),
+                "days_remaining": data.get("days_remaining")
+            }
+        except Exception:
+            return None
+
+    def activate_offline(self, activation_key: str, max_credits: int = 1000) -> bool:
+        """离线激活(本地验证签名)"""
+        # TODO: 实现离线激活逻辑(需要服务器生成签名密钥对)
+        return True
+```
+
+**激活状态存储:**
+
+```python
+# infrastructure/storage/license_storage.py
+import json
+from pathlib import Path
+
+class LicenseStorage:
+    """激活状态存储"""
+
+    ACTIVATION_FILE = Path.home() / ".config" / "xling-matrix" / "activation.json"
+
+    def save_activation(self, activation_key: str, fingerprint: str) -> None:
+        """保存激活信息"""
+        data = {
+            "activation_key": activation_key,
+            "fingerprint": fingerprint,
+            "activated_at": datetime.now().isoformat(),
+            "version": "0.1.0"
+        }
+        self.ACTIVATION_FILE.parent.mkdir(parents=True, exist_ok=True)
+        AtomicWriter.write(str(self.ACTIVATION_FILE), data)
+
+    def load_activation(self) -> dict | None:
+        """加载激活信息"""
+        if not self.ACTIVATION_FILE.exists():
+            return None
+        with open(self.ACTIVATION_FILE, 'r', encoding='utf-8') as f:
+            return json.load(f)
+
+    def is_activated(self) -> bool:
+        """检查是否已激活"""
+        activation = self.load_activation()
+        if not activation:
+            return False
+        # 检查硬件指纹是否匹配
+        current_fingerprint = LicenseManager().generate_fingerprint()
+        return activation.get("fingerprint") == current_fingerprint
+```
+
+**许可证验证流程:**
+
+```
+启动 → 检查本地激活 → [无激活] 显示激活对话框
+                ↓
+         [有激活] 检查硬件指纹 → [不匹配] 重新激活
+                ↓
+         [匹配] 检查过期 → [已过期] 提示续费
+                ↓
+         [有效] 验证 CU 余额 → [不足] 提示充值
+                ↓
+         [有效] 允许使用
+```
+
+## Performance Optimization
+
+### GPU Optimization
+
+**1. 批处理策略:**
+
+```python
+# modules/translation/batch_processor.py
+class BatchProcessor:
+    """批处理优化器"""
+
+    def __init__(self, max_tokens: int = 4096):
+        self.max_tokens = max_tokens
+
+    def create_batches(self, texts: list[str]) -> list[list[str]]:
+        """将文本分割为最优批次
+
+        策略:
+        1. 按 token 数量分组
+        2. 每批接近 max_tokens 但不超过
+        3. 相邻文本尽量在同一批(保持上下文)
+        """
+        batches = []
+        current_batch = []
+        current_tokens = 0
+
+        for text in texts:
+            tokens = self._count_tokens(text)
+            if current_tokens + tokens > self.max_tokens and current_batch:
+                batches.append(current_batch)
+                current_batch = [text]
+                current_tokens = tokens
+            else:
+                current_batch.append(text)
+                current_tokens += tokens
+
+        if current_batch:
+            batches.append(current_batch)
+
+        return batches
+
+    def _count_tokens(self, text: str) -> int:
+        """估算 token 数量(中文约 1.5 字符/token)"""
+        return int(len(text) / 1.5)
+```
+
+**2. 动态批次大小调整:**
+
+```python
+# infrastructure/gpu/batch_optimizer.py
+import torch
+
+class BatchSizeOptimizer:
+    """动态批次大小优化器"""
+
+    def __init__(self, initial_size: int = 16):
+        self.current_size = initial_size
+        self.min_size = 4
+        self.max_size = 32
+
+    def adjust_for_memory(self, oom_occurred: bool) -> int:
+        """根据显存使用情况调整批次大小"""
+        if oom_occurred:
+            self.current_size = max(self.min_size, self.current_size // 2)
+        else:
+            # 逐步增加以找到最优值
+            self.current_size = min(self.max_size, int(self.current_size * 1.2))
+        return self.current_size
+
+    def get_memory_info(self) -> dict:
+        """获取 GPU 显存信息"""
+        if not torch.cuda.is_available():
+            return {"available": False}
+        return {
+            "available": True,
+            "total_gb": torch.cuda.get_device_properties(0).total_memory / 1e9,
+            "allocated_gb": torch.cuda.memory_allocated(0) / 1e9,
+            "free_gb": (torch.cuda.get_device_properties(0).total_memory -
+                      torch.cuda.memory_allocated(0)) / 1e9,
+        }
+```
+
+### I/O Optimization
+
+**1. 增量进度保存:**
+
+```python
+# infrastructure/storage/incremental.py
+class IncrementalProgressSaver:
+    """增量进度保存器 - 减少磁盘写入"""
+
+    def __init__(self, threshold: int = 5):
+        self.threshold = threshold  # 进度变化超过 5% 才保存
+        self.last_saved = 0
+
+    def should_save(self, current_progress: int) -> bool:
+        return abs(current_progress - self.last_saved) >= self.threshold
+
+    def mark_saved(self, progress: int) -> None:
+        self.last_saved = progress
+```
+
+**2. 文件读取优化:**
+
+```python
+# infrastructure/storage/chunked_reader.py
+class ChunkedFileReader:
+    """分块文件读取器 - 支持大文件"""
+
+    def __init__(self, chunk_size: int = 8192):
+        self.chunk_size = chunk_size
+
+    def read_by_paragraphs(self, filepath: str) -> list[str]:
+        """按段落读取文件(更适合小说)"""
+        with open(filepath, 'r', encoding='utf-8') as f:
+            content = f.read()
+        # 按双换行符分割段落
+        paragraphs = [p.strip() for p in content.split('\n\n') if p.strip()]
+        return paragraphs
+```
+
+## Deployment Architecture
+
+### Application Packaging
+
+**1. PyInstaller 配置:**
+
+```python
+# build/pyinstaller_spec.py
+import sys
+from PyInstaller.utils.hooks import collect_data_files, collect_submodules
+
+block_cipher = None
+
+datas = [
+    ('models', 'models'),
+    ('assets', 'assets'),
+]
+
+hiddenimports = [
+    'PyQt6.sip',
+    'ctranslate2',
+    'torch',
+]
+
+a = Analysis(
+    ['src/xling_matrix/__main__.py'],
+    pathex=[],
+    binaries=[],
+    datas=datas,
+    hiddenimports=hiddenimports,
+    hookspath=[],
+    hooksconfig={},
+    runtime_hooks=[],
+    excludes=[],
+    win_no_prefer_redirects=False,
+    win_private_assemblies=False,
+    cipher=block_cipher,
+    noarchive=False,
+)
+
+pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
+
+exe = EXE(
+    pyz,
+    a.scripts,
+    a.binaries,
+    a.zipfiles,
+    a.datas,
+    [],
+    name='序灵Matrix助手',
+    debug=False,
+    bootloader_ignore_signals=False,
+    strip=False,
+    upx=True,
+    upx_exclude=[],
+    runtime_tmpdir=None,
+    console=True,
+    disable_windowed_traceback=False,
+    argv_emulation=False,
+    target_arch=None,
+    codesign_identity=None,
+    entitlements_file=None,
+    icon='assets/icons/app_icon.ico',
+)
+```
+
+**2. 安装程序配置:**
+
+```
+安装结构:
+序灵Matrix助手/
+├── 序灵Matrix助手.exe          # 主程序
+├── models/                      # 翻译模型(首次运行时下载)
+│   └── m2m100_418m_ct2/
+├── configs/
+│   └── default_config.yaml
+└── README.txt
+
+用户数据目录:
+~/Documents/xling-matrix/        # Windows
+~/Documents/xling-matrix/        # macOS
+~/xling-matrix/                  # Linux
+```
+
+### Distribution Strategy
+
+**1. 版本管理:**
+
+```python
+# core/version.py
+__version__ = "0.1.0"
+__build__ = "20260313"
+
+def get_version() -> str:
+    return f"{__version__}+{__build__}"
+```
+
+**2. 更新检查 (Growth 阶段):**
+
+```python
+# infrastructure/update/update_checker.py
+import requests
+
+class UpdateChecker:
+    """更新检查器"""
+
+    UPDATE_URL = "https://updates.xling-matrix.com/version.json"
+
+    def check_for_updates(self, current_version: str) -> dict | None:
+        """检查是否有新版本"""
+        try:
+            response = requests.get(self.UPDATE_URL, timeout=5)
+            response.raise_for_status()
+            data = response.json()
+
+            if self._is_newer(current_version, data["latest_version"]):
+                return {
+                    "has_update": True,
+                    "latest_version": data["latest_version"],
+                    "download_url": data["download_url"],
+                    "release_notes": data.get("release_notes", ""),
+                }
+        except Exception:
+            pass
+        return None
+
+    def _is_newer(self, current: str, latest: str) -> bool:
+        """比较版本号"""
+        from packaging import version
+        return version.parse(latest) > version.parse(current)
+```
+
+---
+
+## Architecture Summary
+
+本架构设计文档定义了序灵 Matrix 助手的完整技术架构,包括:
+
+- **分层架构**: Presentation / Application / Domain / Infrastructure
+- **核心设计模式**: Pipeline, State Machine, Repository, Observer
+- **Crash-Safe 机制**: 原子写入确保数据安全
+- **GPU 加速**: CTranslate2 + 动态批处理优化
+- **六模块流水线**: Fingerprint → Cleaning → Terminology → Translation → Upload
+- **本地优先**: 100% 本地处理,零数据泄露
+- **零授权费**: 仅使用 MIT 协议依赖
+
+本架构确保所有 AI 代理可以协同工作,编写一致、兼容的代码。
+
+---
+
+**文档版本**: 1.0
+**最后更新**: 2026-03-13
+**状态**: 完成 ✅

+ 2082 - 0
planning-artifacts/epics.md

@@ -0,0 +1,2082 @@
+---
+stepsCompleted: [1, 2, 3]
+inputDocuments: ['prd.md', 'architecture.md']
+workflowType: 'epics-and-stories'
+project_name: '223-236-template-6'
+user_name: 'User'
+date: '2026-03-13'
+---
+
+# 223-236-template-6 - Epic Breakdown
+
+## Overview
+
+This document provides a complete epic and story breakdown for 序灵 Matrix 助手, decomposing requirements from PRD, UX Design if it exists, and Architecture requirements into implementable stories with complete acceptance criteria.
+
+## Requirements Inventory
+
+### Functional Requirements
+
+**FR1**: 系统能够读取用户导入的 TXT 格式网文文件
+
+**FR2**: 系统能够从 TXT 文件第一章提取内容并计算 MD5 指纹
+
+**FR3**: 系统能够通过 API 检查指纹是否已存在于服务器数据库
+
+**FR4**: 系统能够为首次处理的作品生成唯一 work_id 标识符
+
+**FR5**: 系统能够检测续更作品(已存在 work_id)并仅处理新增章节
+
+**FR6**: 系统能够在网络错误时自动重试 API 调用
+
+**FR7**: 系统能够识别 TXT 文件中的章节标题(兼容多种格式)
+
+**FR8**: 系统能够清洗正文格式(合并空行、统一缩进、压缩空格)
+
+**FR9**: 系统能够将清洗后的内容按固定长度分段(避免句子中间断开)
+
+**FR10**: 系统能够将清洗后的数据输出为结构化 JSON 格式
+
+**FR11**: 系统能够使用原子写机制保存清洗数据(防止断电损坏)
+
+**FR12**: 系统能够从全文中提取候选术语(中文 2-6 字、英文大写开头)
+
+**FR13**: 系统能够统计每个术语的出现频次和跨章分布
+
+**FR14**: 系统能够根据频次和分布筛选核心术语(Top 200)
+
+**FR15**: 系统能够向用户预览提取的术语列表及其建议翻译
+
+**FR16**: 系统能够手动编辑术语翻译并锁定
+
+**FR17**: 系统能够复用已翻译作品的术语库处理续更内容
+
+**FR18**: 系统能够使用本地 GPU 加速的 m2m100 模型进行中译英翻译
+
+**FR19**: 系统能够在翻译前将核心术语替换为占位符(§T1§, §T2§...)
+
+**FR20**: 系统能够在翻译后将占位符还原为锁定的术语翻译
+
+**FR21**: 系统能够批量处理多个分段以提高 GPU 利用率
+
+**FR22**: 系统能够在批量翻译失败时降级为单条翻译
+
+**FR23**: 系统能够记录翻译失败的项目到失败清单
+
+**FR24**: 系统能够将同一章节的分段合并为完整章节
+
+**FR25**: 系统能够逐章调用上传 API 发布翻译内容
+
+**FR26**: 系统能够在上传前根据章节字数计算并扣除 CU 费用
+
+**FR27**: 系统能够在上传失败时自动重试
+
+**FR28**: 系统能够记录上传失败的章节并提供批量重试
+
+**FR29**: 系统能够标记缺失分段章节为不完整状态
+
+**FR30**: 系统能够显示翻译任务进度(当前章节/总章节)
+
+**FR31**: 系统能够响应用户暂停请求立即中断翻译任务
+
+**FR32**: 系统能够从暂停点或崩溃点恢复翻译任务
+
+**FR33**: 系统能够在任务执行过程中持续保存进度状态
+
+**FR34**: 系统能够在启动时检测并提示用户未完成的任务
+
+**FR35**: 系统能够显示任务预计完成时间
+
+**FR36**: 系统能够通过拖放方式导入 TXT 文件
+
+**FR37**: 系统能够在导入后显示作品预览信息(章节数、术语数、预计时间)
+
+**FR38**: 系统能够在翻译完成后发送桌面通知
+
+**FR39**: 系统能够最小化到系统托盘并在后台运行
+
+**FR40**: 系统能够记录任务历史(翻译/上传/失败)
+
+**FR41**: 系统能够将用户数据本地存储(不上传云端)
+
+**FR42**: 系统能够在生成的翻译内容中添加翻译标识
+
+**FR43**: 系统能够声明用户需拥有内容翻译权和发布权
+
+**FR44**: 系统能够将用户数据本地存储(不上传云端)
+
+**FR45**: 系统能够通过 work_id MD5 仅用于指纹查重(不上传内容)
+
+**FR46**: 系统能够在网络断开时继续执行本地翻译任务
+
+**FR47**: 系统能够检测网络连接状态并显示给用户
+
+**FR48**: 系统能够将网络断开期间的上传任务保存到队列
+
+**FR49**: 系统能够在网络恢复时自动执行队列中的上传任务
+
+**FR50**: 系统能够在启动时检查是否有新版本可用
+
+**FR51**: 系统能够记录应用日志用于问题诊断
+
+**FR52**: 系统能够按量计费(一次性买断 + CU 扣费)
+
+### Non-Functional Requirements
+
+**NFR-P1**: 翻译速度 ≥ 5000 字符/分钟(基于 RTX 3060 基准 GPU)
+
+**NFR-P2**: GPU 利用率 ≥ 80%(非空闲处理状态)
+
+**NFR-P3**: 内存占用 < 4 GB(不含模型文件)
+
+**NFR-P4**: 应用启动时间 < 10 秒(GPU 检测 + 模型加载)
+
+**NFR-P5**: Pause 指令响应时间 < 1 秒(立即中断)
+
+**NFR-P6**: 用户界面操作响应 < 200 毫秒(无卡顿感知)
+
+### Additional Requirements
+
+**AR1**: Python 3.11+ 编程语言
+
+**AR2**: PyQt6 桌面 GUI 框架
+
+**AR3**: CTranslate2 推理引擎 + facebook/m2m100_418M 模型
+
+**AR4**: CUDA GPU 加速支持(RTX 3050/3060 最小)
+
+**AR5**: Crash-Safe 原子写机制(.tmp + fsync + rename)
+
+**AR6**: Pipeline 模式(六阶段流水线编排)
+
+**AR7**: State Machine 状态管理
+
+**AR8**: Repository 模式(数据持久化抽象)
+
+**AR9**: Observer 模式(GUI 更新通知)
+
+**AR10**: PyInstaller 打包为可执行文件
+
+**AR11**: GPU 批处理优化(动态调整批次大小)
+
+**AR12**: 增量进度保存(减少磁盘写入)
+
+**AR13**: 章节识别(兼容多种标题格式)
+
+**AR14**: 定长分段(900 字符基准,950 字符上限,1200 字符断点)
+
+**AR15**: Top200 术语自动提取
+
+**AR16**: 术语锁定占位符机制(§Ti§)
+
+**AR17**: 失败检测 + 自动重试(3次,指数退避)
+
+**AR18**: 失败清单保存(upload_failed.jsonl)
+
+**AR19**: 断点续传(跳过已完成章节)
+
+**AR20**: 任务历史记录
+
+**AR21**: 桌面通知(Windows 原生 Toast, macOS NotificationCenter)
+
+**AR22**: 系统托盘最小化 + 后台运行
+
+**AR23**: License 硬件指纹绑定 + 在线激活验证
+
+**AR24**: 离线激活支持(本地验证签名)
+
+### UX Design Requirements
+
+不适用 - 未提供 UX 设计文档
+
+### FR Coverage Map
+
+| Epic | FRs 覆盖 |
+|------|---------|
+| Epic 1: 基础架构与 Crash-Safe 机制 | AR5, AR6, AR7, AR8 |
+| Epic 2: 指纹机制模块 | FR1-FR6 |
+| Epic 3: 清洗模块 | FR7, FR9-FR11 |
+| Epic 4: 术语提取模块 | FR12-FR17 |
+| Epic 5: 翻译模块 | FR18-FR23 |
+| Epic 6: 上传模块 | FR24-FR29, FR26, FR42-FR43, AR17, AR18, AR19 |
+| Epic 7a: 任务调度核心 | FR30-FR35, AR20 |
+| Epic 7b: 用户界面完整版 | FR36-FR52, AR21, AR22 |
+
+## Epic List
+
+---
+
+## Epic 1: 基础架构与 Crash-Safe 机制
+
+**Epic 目标:** 用户在系统意外关闭或断电后,能够从断点继续翻译,无需重新开始。
+
+**覆盖的需求:** AR5 (Crash-Safe 原子写), AR6 (Pipeline 模式), AR7 (State Machine), AR8 (Repository 模式)
+
+### Story 1.1: 实现 Pipeline 编排框架
+
+**As a** 系统开发者,
+**I want** 建立六阶段 Pipeline 编排框架,
+**So that** 可以将文件处理流程模块化并支持灵活组合。
+
+**验收标准:**
+
+**Given** 系统已初始化
+**When** 创建 Pipeline 对象并添加多个阶段处理器
+**Then** Pipeline 按顺序执行所有阶段并将每个阶段的输出传递给下一阶段
+**And** 任一阶段抛出异常时,Pipeline 捕获异常并停止执行
+**And** 支持 get_stage_result(stage_name) 获取指定阶段的输出
+**And** 支持 reset() 方法重置 Pipeline 状态
+
+**技术任务:**
+1. 创建 `pipeline/pipeline.py` 核心类
+2. 实现 `Stage` 抽象基类和 `PipelineExecutor`
+3. 实现阶段结果缓存机制
+4. 编写单元测试验证顺序执行和异常处理
+
+**估算:** 5 故事点
+
+---
+
+### Story 1.2: 实现 State Machine 任务状态管理
+
+**As a** 系统,
+**I want** 使用状态机管理翻译任务的生命周期,
+**So that** 可以追踪任务状态并支持状态转换验证。
+
+**验收标准:**
+
+**Given** 系统已定义任务状态 (IDLE, RUNNING, PAUSED, COMPLETED, FAILED)
+**When** 任务从 IDLE 状态请求转换到 RUNNING 状态
+**Then** 状态转换成功并记录状态变更时间戳
+**And** 状态机拒绝无效的状态转换 (如从 FAILED 直接到 RUNNING 必须经过 PAUSED)
+**And** 支持 get_current_state() 和 get_state_history() 查询
+**And** 状态变更事件可通过 Observer 订阅
+
+**技术任务:**
+1. 创建 `state_machine/task_state.py` 状态枚举
+2. 实现 `TaskStateMachine` 类和状态转换规则
+3. 实现状态历史记录功能
+4. 实现 Observer 模式支持状态变更通知
+5. 编写单元测试验证所有状态转换路径
+
+**估算:** 8 故事点
+
+---
+
+### Story 1.3: 实现 Repository 数据持久化抽象
+
+**As a** 系统,
+**I want** 使用 Repository 模式抽象数据持久化,
+**So that** 可以灵活切换存储后端 (本地文件/数据库) 并统一数据访问接口。
+
+**验收标准:**
+
+**Given** Repository 抽象基类已定义
+**When** 创建 FileTaskRepository 实现
+**Then** 支持保存任务数据到 JSON 文件
+**And** 支持按 work_id 查询任务
+**And** 支持更新任务状态和进度
+**And** 支持获取所有未完成任务列表
+**And** 所有操作返回统一的 Result 对象 (包含 data/error)
+
+**技术任务:**
+1. 创建 `repository/base.py` 抽象基类
+2. 创建 `repository/file_task_repository.py` 实现
+3. 定义数据模型类 (Task, Chapter, Term 等)
+4. 实现 CRUD 操作和查询方法
+5. 编写单元测试验证 Repository 操作
+
+**估算:** 6 故事点
+
+---
+
+### Story 1.4: 实现 Crash-Safe 原子写入机制
+
+**As a** 系统,
+**I want** 使用原子写入机制保存关键数据,
+**So that** 即使断电或崩溃也不会损坏数据文件。
+
+**验收标准:**
+
+**Given** 需要保存任务数据到文件
+**When** 调用 atomic_write() 方法保存数据
+**Then** 数据首先写入临时文件 (.tmp 后缀)
+**And** 使用 fsync() 确保数据刷新到磁盘
+**And** 原子操作重命名临时文件为目标文件
+**And** 如果写入失败,目标文件保持不变
+**And** 系统启动时检测并清理残留的临时文件
+
+**技术任务:**
+1. 创建 `utils/atomic_write.py` 工具模块
+2. 实现临时文件写入逻辑
+3. 实现文件系统同步 (fsync) 调用
+4. 实现原子重命名操作 (os.replace)
+5. 实现启动时临时文件清理
+6. 编写集成测试验证断电场景
+
+**估算:** 5 故事点
+
+---
+
+### Story 1.5: 实现 Observer 模式进度通知
+
+**As a** GUI,
+**I want** 通过 Observer 模式订阅任务进度事件,
+**So that** 可以实时更新用户界面显示翻译进度。
+
+**验收标准:**
+
+**Given** 系统正在执行翻译任务
+**When** 任务状态或进度发生变化
+**Then** 所有订阅的 Observer 接收到进度更新通知
+**And** 通知包含当前阶段、当前章节、总章节数、进度百分比
+**And** 支持订阅者注册和取消订阅
+**And** 支持按事件类型过滤通知 (STATE_CHANGE, PROGRESS_UPDATE, ERROR)
+
+**技术任务:**
+1. 创建 `observer/event.py` 事件数据类
+2. 创建 `observer/publisher.py` 发布者基类
+3. 实现订阅者注册/取消注册逻辑
+4. 实现事件分发机制
+5. 编写单元测试验证通知传递
+
+**估算:** 4 故事点
+
+---
+
+**Epic 1 总结:** 5 个故事,共 28 故事点
+
+---
+
+## Epic 2: 指纹机制模块
+
+**Epic 目标:** 用户导入已处理过的文件时,系统自动识别并复用结果,避免重复翻译。
+
+**覆盖的需求:** FR1 (文件指纹计算), FR2 (分块哈希), FR3 (指纹缓存), FR4 (重复检测), FR5 (缓存失效), FR6 (指纹导出)
+
+### Story 2.1: 实现文件内容哈希计算
+
+**As a** 系统,
+**I want** 计算文件的 SHA-256 内容哈希值,
+**So that** 可以唯一标识文件内容并检测重复。
+
+**验收标准:**
+
+**Given** 用户选择了一个文本文件
+**When** 系统计算文件哈希值
+**Then** 使用 SHA-256 算法计算完整文件内容的哈希
+**And** 只读取文件内容,忽略元数据 (文件名、修改时间)
+**And** 返回 64 位十六进制哈希字符串
+**And** 大文件 (>100MB) 支持进度回调
+
+**技术任务:**
+1. 创建 `fingerprint/hasher.py` 模块
+2. 实现 `calculate_file_hash(file_path, algorithm='sha-256')` 函数
+3. 实现大文件流式读取和进度回调
+4. 编写单元测试验证哈希计算正确性
+
+**估算:** 3 故事点
+
+---
+
+### Story 2.2: 实现分块增量哈希
+
+**As a** 系统,
+**I want** 支持按固定大小的块计算文件哈希,
+**So that** 大文件可以分块处理并支持增量验证。
+
+**验收标准:**
+
+**Given** 大文件需要分块处理
+**When** 系统计算分块哈希
+**Then** 按 4MB 块大小分割文件
+**And** 为每个块计算独立哈希值
+**And** 返回块哈希列表和组合哈希 (Merkle Tree 根哈希)
+**And** 支持配置块大小
+
+**技术任务:**
+1. 在 `fingerprint/hasher.py` 中实现分块读取逻辑
+2. 实现 `calculate_chunked_hash(file_path, chunk_size=4*1024*1024)`
+3. 实现 Merkle Tree 根哈希计算
+4. 编写单元测试验证分块哈希
+
+**估算:** 5 故事点
+
+---
+
+### Story 2.3: 实现指纹缓存存储
+
+**As a** 系统,
+**I want** 将文件指纹缓存到本地数据库,
+**So that** 已处理文件可以快速复用无需重新计算。
+
+**验收标准:**
+
+**Given** 文件哈希计算完成
+**When** 系统保存指纹到缓存
+**Then** 存储文件哈希、文件路径、文件大小、计算时间戳
+**And** 缓存文件位于 `~/.cache/bmad_translator/fingerprints/`
+**And** 使用 SQLite 存储缓存索引
+**And** 支持按哈希值快速查询缓存
+
+**技术任务:**
+1. 创建 `fingerprint/cache.py` 缓存模块
+2. 定义 `FingerprintCache` 数据模型
+3. 实现 SQLite 缓存存储和查询
+4. 实现缓存目录管理
+5. 编写单元测试验证缓存操作
+
+**估算:** 5 故事点
+
+---
+
+### Story 2.4: 实现重复文件检测
+
+**As a** 用户,
+**I want** 系统自动检测重复文件,
+**So that** 避免重复翻译相同内容。
+
+**验收标准:**
+
+**Given** 用户添加了新文件
+**When** 系统检测到文件哈希已存在缓存
+**Then** 提示用户"此文件已处理过,是否复用上次结果?"
+**And** 显示上次处理时间和处理结果
+**And** 用户选择复用时直接加载缓存结果
+**And** 用户选择重新处理时重新执行完整流程
+
+**技术任务:**
+1. 实现 `fingerprint/detector.py` 重复检测模块
+2. 实现 `is_duplicate(file_hash)` 查询方法
+3. 实现重复结果复用逻辑
+4. 集成到文件添加流程
+5. 编写单元测试验证检测逻辑
+
+**估算:** 4 故事点
+
+---
+
+### Story 2.5: 实现缓存失效机制
+
+**As a** 系统,
+**I want** 在源文件内容变化时使缓存失效,
+**So that** 确保处理结果始终反映最新文件内容。
+
+**验收标准:**
+
+**Given** 文件已建立指纹缓存
+**When** 用户修改了源文件内容
+**Then** 文件哈希值发生变化
+**And** 系统检测到哈希不匹配
+**And** 标记旧缓存为无效
+**And** 重新计算新哈希并创建新缓存条目
+**And** 定期清理超过 30 天的无效缓存
+
+**技术任务:**
+1. 实现 `fingerprint/invalidator.py` 模块
+2. 实现文件变化检测逻辑
+3. 实现缓存失效标记
+4. 实现定期清理任务 (使用 Python `sched` 模块)
+5. 编写单元测试验证失效逻辑
+
+**估算:** 4 故事点
+
+---
+
+### Story 2.6: 实现指纹导出功能
+
+**As a** 用户,
+**I want** 导出文件指纹报告,
+**So that** 可以离线审核文件处理历史。
+
+**验收标准:**
+
+**Given** 用户已处理多个文件
+**When** 用户选择导出指纹报告
+**Then** 生成 CSV 格式报告包含:文件名、哈希值、文件大小、处理时间
+**And** 支持选择日期范围导出
+**And** 支持导出到指定路径
+**And** 导出完成后显示文件位置
+
+**技术任务:**
+1. 创建 `fingerprint/exporter.py` 模块
+2. 实现 `export_fingerprints(output_path, date_range)` 函数
+3. 实现日期范围过滤
+4. 实现格式化输出
+5. 编写单元测试验证导出格式
+
+**估算:** 3 故事点
+
+---
+
+---
+
+### Story 2.7: 实现网络错误自动重试
+
+**As a** 系统,
+**I want** 在网络错误时自动重试 API 调用,
+**So that** 可以提高指纹查重的可靠性。
+
+**验收标准:**
+
+**Given** 系统正在执行 API 调用
+**When** 发生网络错误 (超时/连接失败/5xx错误)
+**Then** 系统等待 2 秒后自动重试
+**And** 最多重试 3 次
+**And** 重试成功后继续正常流程
+**And** 3 次重试均失败后记录错误并提示用户
+**And** 记录重试次数到日志
+
+**技术任务:**
+1. 创建 `fingerprint/retry_handler.py` 模块
+2. 实现指数退避重试逻辑 (2秒间隔)
+3. 定义可重试错误类型
+4. 实现重试计数和日志记录
+5. 编写单元测试验证重试机制
+
+**估算:** 3 故事点
+
+---
+
+**Epic 2 总结:** 7 个故事,共 27 故事点
+
+---
+
+## Epic 3: 清洗模块
+
+**Epic 目标:** 清洗和规范化小说内容,去除无关元素、修复格式问题、统一标点符号,为翻译提供干净的输入文本。
+
+**覆盖的需求:** FR7 (移除无关内容), FR9 (段落格式修复), FR10 (标点统一), FR11 (硬/软回车处理)
+
+### Story 3.1: 实现无关内容过滤
+
+**As a** 系统,
+**I want** 自动过滤小说中的广告、版权声明和章节标题无关内容,
+**So that** 翻译输入保持纯净的小说正文。
+
+**验收标准:**
+
+**Given** 小说文件包含广告、版权声明等内容
+**When** 系统执行清洗过滤
+**Then** 识别并删除包含"版权所有"、"转载请注明"等特征的行
+**And** 删除纯 URL 行
+**And** 删除重复出现的页眉/页脚
+**And** 保留有效的章节标题
+**And** 生成清洗日志报告删除的内容类型和数量
+
+**技术任务:**
+1. 创建 `cleaning/filter.py` 模块
+2. 定义无关内容正则模式库
+3. 实现 `remove_irrelevant_content(text)` 函数
+4. 实现清洗日志记录
+5. 编写单元测试验证过滤规则
+
+**估算:** 5 故事点
+
+---
+
+### Story 3.2: 实现段落格式修复
+
+**As a** 系统,
+**I want** 修复破损的段落结构,
+**So that** 翻译时能够正确识别段落边界。
+
+**验收标准:**
+
+**Given** 文本存在孤立的单词或短语行
+**When** 系统检测段落格式
+**Then** 识别被错误分割的段落 (如行尾无标点且非章节标题)
+**And** 将孤立行合并到前一段落
+**And** 保持对话行独立 (包含引号的行)
+**And** 确保段落之间有空行分隔
+**And** 生成格式修复报告
+
+**技术任务:**
+1. 创建 `cleaning/paragraph_fixer.py` 模块
+2. 实现段落边界检测算法
+3. 实现段落合并逻辑
+4. 实现对话行识别规则
+5. 编写单元测试验证修复效果
+
+**估算:** 6 故事点
+
+---
+
+### Story 3.3: 实现标点符号统一
+
+**As a** 系统,
+**I want** 将全角/半角标点符号统一转换为全角中文标点,
+**So that** 翻译质量更好且格式一致。
+
+**验收标准:**
+
+**Given** 文本混合使用全角和半角标点
+**When** 系统执行标点统一
+**Then** 将半角句号、逗号、问号、感叹号转换为全角
+**And** 统一引号样式 (中文使用 "" 而非 "")
+**And** 统一省略号样式 (使用 …… 而非 ...)
+**And** 保留英文引号内的英文标点不变
+**And** 生成标点修正统计
+
+**技术任务:**
+1. 创建 `cleaning/punctuation_normalizer.py` 模块
+2. 定义标点映射表
+3. 实现上下文感知的标点转换 (处理中英混合)
+4. 实现统计报告
+5. 编写单元测试验证转换规则
+
+**估算:** 4 故事点
+
+---
+
+### Story 3.4: 实现硬/软回车处理
+
+**As a** 系统,
+**I want** 识别并处理硬回车和软回车,
+**So that** 正确保留段落结构并去除行末连字符。
+
+**验收标准:**
+
+**Given** 文本包含软回车和硬回车
+**When** 系统分析回车类型
+**Then** 识别行末连字符 (如 "exam-\nple") 并合并为完整单词
+**And** 识别连续的软回车 (单个换行符) 合并为段落
+**And** 保留硬回车 (双换行符) 作为段落分隔
+**And** 支持 Windows (\r\n) 和 Unix (\n) 换行符
+**And** 生成回车处理报告
+
+**技术任务:**
+1. 创建 `cleaning/line_break_handler.py` 模块
+2. 实现连字符检测和合并逻辑
+3. 实现回车类型识别算法
+4. 实现换行符标准化
+5. 编写单元测试验证处理逻辑
+
+**估算:** 5 故事点
+
+---
+
+### Story 3.5: 集成清洗流程并生成报告
+
+**As a** 用户,
+**I want** 一键执行完整的清洗流程并查看清洗报告,
+**So that** 了解文本处理效果并验证清洗质量。
+
+**验收标准:**
+
+**Given** 用户已选择待清洗的文本文件
+**When** 用户执行清洗操作
+**Then** 按顺序执行:过滤无关内容 → 修复段落 → 统一标点 → 处理回车
+**And** 显示实时进度条
+**And** 完成后生成 HTML 格式清洗报告
+**And** 报告包含:原文长度、清洗后长度、删除行数、修改统计、预览对比
+**And** 支持导出清洗报告
+
+**技术任务:**
+1. 创建 `cleaning/pipeline.py` 清洗流程编排
+2. 实现各清洗步骤的顺序执行
+3. 实现 `CleaningReport` 数据类
+4. 实现 HTML 报告生成模板
+5. 编写集成测试验证完整流程
+
+**估算:** 5 故事点
+
+---
+
+**Epic 3 总结:** 5 个故事,共 25 故事点
+
+---
+
+## Epic 4: 术语提取模块
+
+**Epic 目标:** 翻译过程中角色名和专有术语保持一致,符合用户设定。
+
+**覆盖的需求:** FR12 (术语识别), FR13 (术语表管理), FR14 (术语标注), FR15 (冲突检测), FR16 (术语导入导出), FR17 (上下文感知)
+
+### Story 4.1: 实现基础术语识别算法
+
+**As a** 系统,
+**I want** 自动识别文本中的专有术语和角色名,
+**So that** 构建初始术语表供用户审核。
+
+**验收标准:**
+
+**Given** 小说文本已加载
+**When** 系统执行术语识别
+**Then** 使用词性标注识别人名 (nr)、地名 (ns)、机构名 (nt)
+**And** 识别高频连续大写/中文组合 (2-4 字)
+**And** 识别数字+单位组合 (如"三阶法师")
+**And** 过滤停用词表 (如"今天"、"有人")
+**And** 按频率排序生成候选术语列表
+
+**技术任务:**
+1. 创建 `terminology/extractor.py` 模块
+2. 集成 jieba 分词进行词性标注
+3. 实现术语识别规则引擎
+4. 实现停用词过滤
+5. 编写单元测试验证识别准确性
+
+**估算:** 6 故事点
+
+---
+
+### Story 4.2: 实现术语表 CRUD 管理
+
+**As a** 用户,
+**I want** 管理术语表 (增删改查),
+**So that** 可以自定义术语并控制翻译行为。
+
+**验收标准:**
+
+**Given** 术语表已初始化
+**When** 用户添加新术语
+**Then** 支持输入术语原文、目标翻译、术语类型、备注
+**And** 验证术语格式 (不能为空,不能含特殊字符)
+**And** 检测重复术语并提示用户
+**When** 用户编辑术语
+**Then** 支持修改所有字段
+**And** 记录修改历史
+**When** 用户删除术语
+**Then** 术语从表中移除
+**And** 翻译时不再使用该术语
+
+**技术任务:**
+1. 创建 `terminology/terminology_manager.py` 模块
+2. 定义 `Term` 数据类
+3. 实现 CRUD 操作方法
+4. 实现修改历史记录
+5. 编写单元测试验证 CRUD 逻辑
+
+**估算:** 5 故事点
+
+---
+
+### Story 4.3: 实现术语冲突检测
+
+**As a** 用户,
+**I want** 系统检测术语表中的冲突,
+**So that** 避免翻译时出现不一致。
+
+**验收标准:**
+
+**Given** 术语表包含多个术语
+**When** 用户添加或修改术语
+**Then** 检测以下冲突类型:
+  - 同一原文有多个翻译
+  - 不同原文翻译相同 (可能导致混淆)
+  - 术语是另一个术语的子串 (如"魔法"和"魔法师")
+**And** 高亮显示冲突术语
+**And** 提供冲突解决建议
+**And** 用户确认后才允许保存冲突术语
+
+**技术任务:**
+1. 创建 `terminology/conflict_detector.py` 模块
+2. 实现冲突检测规则引擎
+3. 实现冲突建议生成
+4. 集成到术语保存流程
+5. 编写单元测试验证检测规则
+
+**估算:** 5 故事点
+
+---
+
+### Story 4.4: 实现术语表导入导出
+
+**As a** 用户,
+**I want** 导入和导出术语表,
+**So that** 可以在不同项目间复用术语表。
+
+**验收标准:**
+
+**Given** 用户有现成的术语表文件
+**When** 用户导入术语表
+**Then** 支持 CSV 格式 (原文,翻译,类型,备注)
+**And** 支持 JSON 格式
+**And** 导入时验证数据格式
+**And** 检测并报告导入冲突
+**And** 显示导入结果摘要
+**When** 用户导出术语表
+**Then** 支持导出为 CSV 和 JSON
+**And** 包含所有术语字段
+**And** 支持选择性导出 (按类型筛选)
+
+**技术任务:**
+1. 创建 `terminology/io.py` 模块
+2. 实现 CSV 解析和生成
+3. 实现 JSON 序列化和反序列化
+4. 实现导入验证逻辑
+5. 编写单元测试验证导入导出
+
+**估算:** 4 故事点
+
+---
+
+### Story 4.5: 实现术语上下文标注
+
+**As a** 系统,
+**I want** 在文本中标注术语出现的上下文,
+**So that** 用户可以根据上下文确定合适的翻译。
+
+**验收标准:**
+
+**Given** 文本包含多个术语实例
+**When** 系统标注术语上下文
+**Then** 为每个术语提取前后各 20 字的上下文
+**And** 高亮显示术语位置
+**And** 按术语分组显示所有实例
+**And** 支持点击跳转到原文位置
+**And** 支持用户根据上下文调整翻译
+
+**技术任务:**
+1. 创建 `terminology/context_annotator.py` 模块
+2. 实现上下文窗口提取
+3. 实现术语实例索引
+4. 实现位置映射 (原文位置→清洗后位置)
+5. 编写单元测试验证标注准确性
+
+**估算:** 5 故事点
+
+---
+
+### Story 4.6: 实现术语翻译应用
+
+**As a** 系统,
+**I want** 在翻译前将术语标注应用到文本,
+**So that** AI 翻译模型能识别并保留术语翻译。
+
+**验收标准:**
+
+**Given** 术语表已定义
+**When** 系统准备翻译文本
+**Then** 在术语前后插入特殊标记 (如 `<TERM>原文</TERM><TRANS>翻译</TRANS>`)
+**And** 长术语优先匹配 (避免"魔法"覆盖"魔法师")
+**And** 生成标注后文本预览
+**And** 标记数量统计显示
+**And** 翻译后提取术语翻译并移除标记
+
+**技术任务:**
+1. 创建 `terminology/term_tagger.py` 模块
+2. 实现最长匹配算法
+3. 实现术语标记插入
+4. 实现翻译后术语提取
+5. 编写单元测试验证标记逻辑
+
+**估算:** 5 故事点
+
+---
+
+**Epic 4 总结:** 6 个故事,共 30 故事点
+
+---
+
+## Epic 5: 翻译模块
+
+**Epic 目标:** 使用 GPU 加速的 AI 翻译引擎,支持批量处理、术语注入、断点续译和质量检查。
+
+**覆盖的需求:** FR18 (AI 翻译集成), FR19 (GPU 加速), FR20 (批量处理), FR21 (术语注入), FR22 (断点续译), FR23 (质量检查)
+
+### Story 5.1: 集成 CTranslate2 翻译引擎
+
+**As a** 系统,
+**I want** 集成 CTranslate2 和 m2m100 模型,
+**So that** 可以执行高质量的中文到英文翻译。
+
+**验收标准:**
+
+**Given** 系统已安装 CTranslate2
+**When** 用户选择待翻译文本
+**Then** 加载 facebook/m2m100_418M 模型
+**And** 执行中文→英文翻译
+**And** 支持自定义翻译参数 (beam_size, repetition_penalty)
+**And** 返回翻译结果和置信度分数
+**And** 记录翻译耗时
+
+**技术任务:**
+1. 创建 `translation/ctranslate_engine.py` 模块
+2. 实现 `CTranslateEngine` 类
+3. 实现模型加载和卸载
+4. 实现翻译参数配置
+5. 编写单元测试验证翻译功能
+
+**估算:** 6 故事点
+
+---
+
+### Story 5.2: 实现 GPU 自动检测和加速
+
+**As a** 系统,
+**I want** 自动检测并使用 GPU 加速翻译,
+**So that** 大幅提升翻译速度。
+
+**验收标准:**
+
+**Given** 系统启动
+**When** 检测可用硬件
+**Then** 使用 cuda_detect_library 检测 NVIDIA GPU
+**And** 检测 GPU 显存大小 (推荐 >= 6GB)
+**And** 自动配置 CTranslate2 使用 CUDA 设备
+**And** 如果 GPU 不可用,回退到 CPU 并警告用户
+**And** 显示当前使用的设备信息
+
+**技术任务:**
+1. 创建 `translation/device_detector.py` 模块
+2. 实现 GPU 检测逻辑 (使用 pynvml 库)
+3. 实现显存大小检测
+4. 实现 CTranslate2 设备配置
+5. 编写单元测试验证检测逻辑
+
+**估算:** 5 故事点
+
+---
+
+### Story 5.3: 实现批量章节翻译
+
+**As a** 用户,
+**I want** 批量翻译多个章节,
+**So that** 可以高效处理整本小说。
+
+**验收标准:**
+
+**Given** 用户已加载小说并选择待翻译章节
+**When** 用户开始批量翻译
+**Then** 按章节顺序执行翻译
+**And** 每翻译完一个章节保存中间结果
+**And** 显示实时进度 (当前章节/总章节)
+**And** 显示预估剩余时间
+**And** 支持暂停/恢复翻译
+**And** 翻译失败时记录错误并继续下一章节
+
+**技术任务:**
+1. 创建 `translation/batch_translator.py` 模块
+2. 实现章节队列管理
+3. 实现批量翻译循环
+4. 实现中间结果保存
+5. 实现暂停/恢复控制
+6. 编写集成测试验证批量翻译
+
+**估算:** 7 故事点
+
+---
+
+### Story 5.4: 实现术语翻译注入
+
+**As a** 系统,
+**I want** 在翻译前注入术语翻译提示,
+**So that** 确保术语翻译一致性。
+
+**验收标准:**
+
+**Given** 术语表已定义
+**When** 系统翻译包含术语的文本
+**Then** 在翻译提示中加入术语对照表
+**And** 使用 few-shot 提示示例引导模型
+**And** 翻译后验证术语是否按指定翻译
+**And** 记录术语应用统计 (成功/失败)
+**And** 失败时在报告中标注
+
+**技术任务:**
+1. 创建 `translation/term_injector.py` 模块
+2. 实现术语提示模板生成
+3. 实现术语翻译验证
+4. 实现统计记录
+5. 编写单元测试验证注入效果
+
+**估算:** 5 故事点
+
+---
+
+### Story 5.5: 实现断点续译机制
+
+**As a** 用户,
+**I want** 从中断位置继续翻译,
+**So that** 意外中断后无需重新翻译已完成内容。
+
+**验收标准:**
+
+**Given** 批量翻译任务执行中
+**When** 任务被中断 (程序关闭/崩溃)
+**Then** 系统保存已翻译章节索引
+**And** 保存翻译任务状态到磁盘
+**When** 用户重新启动并选择继续翻译
+**Then** 系统检查已翻译章节
+**And** 从第一个未翻译章节开始
+**And** 显示续译提示"从第 X 章继续"
+
+**技术任务:**
+1. 创建 `translation/checkpoint.py` 模块
+2. 实现检查点数据结构
+3. 实现检查点保存和加载
+4. 集成到批量翻译流程
+5. 编写集成测试验证续译功能
+
+**估算:** 6 故事点
+
+---
+
+### Story 5.6: 实现翻译质量检查
+
+**As a** 系统,
+**I want** 自动检查翻译质量,
+**So that** 发现潜在问题并提示用户审核。
+
+**验收标准:**
+
+**Given** 翻译完成
+**When** 系统执行质量检查
+**Then** 检测漏译 (原文行数≠译文行数)
+**And** 检测未翻译术语 (术语未按指定翻译)
+**And** 检测异常长度 (译文长度异常短/长)
+**And** 检测重复内容 (连续重复句子)
+**And** 生成质量报告并标注问题位置
+**And** 显示质量分数 (0-100)
+
+**技术任务:**
+1. 创建 `translation/quality_checker.py` 模块
+2. 实现各项质量检查规则
+3. 实现质量分数计算
+4. 实现 HTML 质量报告生成
+5. 编写单元测试验证检查规则
+
+**估算:** 6 故事点
+
+---
+
+---
+
+### Story 5.7: 实现 GPU 批量失败降级
+
+**As a** 系统,
+**I want** 批量翻译失败时降级为单条翻译,
+**So that** 提高翻译成功率。
+
+**验收标准:**
+
+**Given** 系统正在执行批量翻译 (batch_size > 1)
+**When** 批量翻译失败 (GPU OOM/超时)
+**Then** 自动切换为 batch_size=1 重试
+**And** 记录降级事件到日志
+**And** 显示降级提示给用户
+**And** 单条翻译完成后继续处理下一批
+**And** 统计批量/单条翻译成功率
+
+**技术任务:**
+1. 在 `translation/batch_translator.py` 中实现降级逻辑
+2. 实现异常类型检测 (区分可恢复和不可恢复错误)
+3. 实现 batch_size 动态调整
+4. 实现降级统计记录
+5. 编写集成测试验证降级机制
+
+**估算:** 4 故事点
+
+---
+
+### Story 5.8: 实现失败清单记录
+
+**As a** 用户,
+**I want** 系统记录翻译失败的章节,
+**So that** 可以批量重试。
+
+**验收标准:**
+
+**Given** 翻译过程中出现失败
+**When** 章节翻译失败
+**Then** 失败信息写入 translate_failed.jsonl
+**And** 每行一条记录,包含:章节号、原文、错误类型、失败时间、重试次数
+**And** 使用 JSONL 格式 (每行独立 JSON)
+**And** 支持导出失败清单
+**And** 支持从失败清单批量重试
+
+**技术任务:**
+1. 创建 `translation/failed_recorder.py` 模块
+2. 定义失败记录数据结构
+3. 实现 JSONL 写入逻辑
+4. 实现批量重试接口
+5. 编写测试验证失败记录
+
+**估算:** 3 故事点
+
+---
+
+**Epic 5 总结:** 8 个故事,共 42 故事点
+
+---
+
+## Epic 6: 上传模块
+
+**Epic 目标:** 将翻译后的内容上传到目标平台 (RoyalRoad),支持章节分割、格式转换和错误重试。
+
+**覆盖的需求:** FR24 (平台格式转换), FR25 (章节分割), FR26 (API 上传), FR27 (上传状态), FR28 (断点续传), FR29 (上传历史)
+
+### Story 6.1: 实现 RoyalRoad 格式转换
+
+**As a** 系统,
+**I want** 将翻译内容转换为 RoyalRoad 格式,
+**So that** 可以正确显示在目标平台。
+
+**验收标准:**
+
+**Given** 翻译后的文本内容
+**When** 系统执行格式转换
+**Then** 转换为 HTML 格式
+**And** 段落使用 `<p>` 标签包裹
+**And** 对话使用 `<p>` 标签保留引号
+**And** 章节标题使用 `<h2>` 或 `<h3>` 标签
+**And** 保留斜体 `<i>` 和粗体 `<b>` 标记
+**And** 生成格式预览
+
+**技术任务:**
+1. 创建 `upload/formatter.py` 模块
+2. 实现 Markdown 到 HTML 转换
+3. 实现 RoyalRoad 特定格式规则
+4. 实现格式预览生成
+5. 编写单元测试验证格式输出
+
+**估算:** 4 故事点
+
+---
+
+### Story 6.2: 实现智能章节分割
+
+**As a** 系统,
+**I want** 按章节标题分割长文,
+**So that** 每个章节可以作为独立作品发布。
+
+**验收标准:**
+
+**Given** 翻译后的完整文本
+**When** 系统执行章节分割
+**Then** 识别章节标题 (如"Chapter 1", "第一章")
+**And** 按标题分割文本为多个章节
+**And** 每个章节包含标题和正文
+**And** 生成分割预览 (章节列表和字数)
+**And** 支持手动调整分割点
+**And** 支持合并连续章节
+
+**技术任务:**
+1. 创建 `upload/splitter.py` 模块
+2. 实现章节标题识别规则
+3. 实现文本分割算法
+4. 实现手动调整接口
+5. 编写单元测试验证分割准确性
+
+**估算:** 5 故事点
+
+---
+
+### Story 6.3: 集成 RoyalRoad API 上传
+
+**As a** 用户,
+**I want** 通过 API 直接上传到 RoyalRoad,
+**So that** 无需手动复制粘贴内容。
+
+**验收标准:**
+
+**Given** 用户已配置 RoyalRoad API 凭证
+**When** 用户执行上传操作
+**Then** 系统使用 RoyalRoad Fiction API 上传内容
+**And** 设置作品标题、描述、标签
+**And** 逐章节发布内容
+**And** 支持设置为草稿或直接发布
+**And** 显示上传进度 (当前章节/总章节)
+**And** 处理 API 错误并提示用户
+
+**技术任务:**
+1. 创建 `upload/royalroad_api.py` 模块
+2. 实现 RoyalRoad API 客户端
+3. 实现作品创建和章节发布
+4. 实现错误处理和重试逻辑
+5. 编写集成测试验证上传流程
+
+**估算:** 7 故事点
+
+---
+
+### Story 6.4: 实现上传状态跟踪
+
+**As a** 用户,
+**I want** 实时查看上传状态,
+**So that** 了解上传进度和问题。
+
+**验收标准:**
+
+**Given** 上传任务执行中
+**When** 用户查看上传状态
+**Then** 显示当前上传章节序号
+**And** 显示已完成/失败/待上传章节列表
+**And** 显示上传速度和预估剩余时间
+**And** 失败时显示具体错误信息
+**And** 支持点击失败章节查看详情
+
+**技术任务:**
+1. 创建 `upload/status_tracker.py` 模块
+2. 定义 `UploadStatus` 数据类
+3. 实现状态更新逻辑
+4. 实现速度和剩余时间计算
+5. 集成进度通知到 UI
+
+**估算:** 4 故事点
+
+---
+
+### Story 6.5: 实现断点续传机制
+
+**As a** 用户,
+**I want** 从失败位置继续上传,
+**So that** 网络中断后无需重新上传已完成内容。
+
+**验收标准:**
+
+**Given** 上传任务执行中
+**When** 上传被中断 (网络断开/程序关闭)
+**Then** 系统保存已上传章节列表
+**And** 保存上传任务状态
+**When** 用户选择继续上传
+**Then** 系统跳过已上传章节
+**And** 从第一个未上传章节开始
+**And** 显示续传提示"从第 X 章继续上传"
+
+**技术任务:**
+1. 创建 `upload/upload_checkpoint.py` 模块
+2. 实现上传检查点保存和加载
+3. 实现已上传章节查询 (通过 API)
+4. 集成到上传流程
+5. 编写集成测试验证续传功能
+
+**估算:** 5 故事点
+
+---
+
+### Story 6.6: 实现上传历史管理
+
+**As a** 用户,
+**I want** 查看和管理上传历史,
+**So that** 可以追踪已发布内容。
+
+**验收标准:**
+
+**Given** 用户已完成多次上传
+**When** 用户查看上传历史
+**Then** 显示所有上传任务列表
+**And** 每条记录包含:时间、目标平台、章节数、状态
+**And** 支持按状态筛选 (成功/失败/部分)
+**And** 支持查看任务详情
+**And** 支持重新上传失败的任务
+**And** 支持删除历史记录
+
+**技术任务:**
+1. 创建 `upload/history_manager.py` 模块
+2. 定义 `UploadHistory` 数据模型
+3. 实现历史记录存储 (SQLite)
+4. 实现查询和筛选接口
+5. 编写单元测试验证历史管理
+
+**估算:** 4 故事点
+
+---
+
+---
+
+### Story 6.7: 实现 CU 费用计算
+
+**As a** 平台,
+**I want** 上传前计算并扣除章节 CU 费用,
+**So that** 按量计费。
+
+**验收标准:**
+
+**Given** 用户准备上传翻译内容
+**When** 计算章节 CU 费用
+**Then** CU = 章节字数 ÷ 100 (向上取整)
+**And** 上传前调用扣费 API
+**And** 扣费成功后继续上传流程
+**And** 扣费失败时提示用户并阻止上传
+**And** 记录扣费历史
+
+**技术任务:**
+1. 创建 `upload/cu_calculator.py` 模块
+2. 实现 CU 计算逻辑 (math.ceil)
+3. 集成扣费 API 调用
+4. 实现扣费失败处理
+5. 编写测试验证 CU 计算
+
+**估算:** 4 故事点
+
+---
+
+### Story 6.8: 实现内容合规处理
+
+**As a** 平台,
+**I want** 翻译内容添加标识并声明版权,
+**So that** 符合合规要求。
+
+**验收标准:**
+
+**Given** 翻译内容准备上传
+**When** 添加合规标识
+**Then** 在章节末尾添加 "Translated by 序灵 Matrix 助手" 标识
+**And** 标识格式统一 (HTML 或纯文本)
+**And** 首次上传时显示版权声明弹窗
+**And** 用户确认后继续上传
+**And** 记录版权声明确认状态
+
+**技术任务:**
+1. 创建 `upload/compliance_handler.py` 模块
+2. 实现标识添加逻辑
+3. 创建版权声明对话框 UI
+4. 实现确认状态持久化
+5. 编写测试验证合规处理
+
+**估算:** 3 故事点
+
+---
+
+**Epic 6 总结:** 8 个故事,共 36 故事点
+
+---
+
+## Epic 7a: 任务调度核心
+
+**Epic 目标:** 用户可以暂停、恢复、取消翻译任务,并查看任务执行历史。
+
+**覆盖的需求:** FR30-FR35, AR20 (任务历史记录)
+
+### Story 7.1: 实现任务队列管理器
+
+**As a** 系统,
+**I want** 管理翻译任务队列,
+**So that** 可以控制任务执行顺序和状态。
+
+**验收标准:**
+
+**Given** 系统已初始化
+**When** 添加新任务到队列
+**Then** 任务获得唯一 ID 并进入 PENDING 状态
+**And** 队列按优先级排序 (高/中/低)
+**And** 同优先级任务按添加时间排序
+**When** 执行器从队列获取任务
+**Then** 任务状态变为 RUNNING
+**And** 其他任务等待当前任务完成
+**And** 支持查询队列状态 (等待/运行/完成)
+
+**技术任务:**
+1. 创建 `scheduler/task_queue.py` 模块
+2. 定义 `Task` 数据类和 `Priority` 枚举
+3. 实现 `TaskQueue` 类
+4. 实现优先级排序逻辑
+5. 编写单元测试验证队列行为
+
+**估算:** 5 故事点
+
+---
+
+### Story 7.2: 实现任务优先级调度
+
+**As a** 用户,
+**I want** 设置任务优先级,
+**So that** 重要任务优先执行。
+
+**验收标准:**
+
+**Given** 任务队列中有多个待执行任务
+**When** 用户调整任务优先级
+**Then** 支持将任务设为高/中/低优先级
+**And** 高优先级任务插队到队列前部
+**And** 显示调整后的队列顺序
+**And** 保存优先级到任务配置
+
+**技术任务:**
+1. 创建 `scheduler/priority_scheduler.py` 模块
+2. 实现优先级比较逻辑
+3. 实现队列重排序
+4. 集成到任务管理接口
+5. 编写单元测试验证调度逻辑
+
+**估算:** 4 故事点
+
+---
+
+### Story 7.3: 实现并行任务执行
+
+**As a** 系统,
+**I want** 并行执行多个翻译任务,
+**So that** 充分利用多核 CPU 和 GPU。
+
+**验收标准:**
+
+**Given** 有多个独立翻译任务
+**When** 系统执行并行调度
+**Then** 根据配置的并发数 (默认 2) 启动任务
+**And** 每个任务在独立线程中执行
+**And** GPU 任务串行化 (避免显存冲突)
+**And** 非 GPU 任务可并行 (如清洗、格式转换)
+**And** 显示各任务的执行状态
+
+**技术任务:**
+1. 创建 `scheduler/parallel_executor.py` 模块
+2. 实现 ThreadPoolExecutor 包装
+3. 实现 GPU 任务锁
+4. 实现任务类型分类
+5. 编写集成测试验证并行执行
+
+**估算:** 6 故事点
+
+---
+
+### Story 7.4: 实现任务暂停和恢复
+
+**As a** 用户,
+**I want** 暂停和恢复正在执行的任务,
+**So that** 可以灵活控制任务执行时机。
+
+**验收标准:**
+
+**Given** 任务正在执行中
+**When** 用户点击暂停按钮
+**Then** 当前任务在下一个检查点暂停
+**And** 任务状态变为 PAUSED
+**And** 保存任务执行进度
+**When** 用户点击恢复按钮
+**Then** 任务从暂停点继续执行
+**And** 任务状态变回 RUNNING
+**And** 显示恢复进度
+
+**技术任务:**
+1. 创建 `scheduler/pause_controller.py` 模块
+2. 实现暂停信号机制
+3. 实现检查点检测
+4. 集成到任务执行循环
+5. 编写单元测试验证暂停恢复
+
+**估算:** 5 故事点
+
+---
+
+### Story 7.5: 实现任务取消功能
+
+**As a** 用户,
+**I want** 取消不需要的任务,
+**So that** 释放资源并避免浪费时间。
+
+**验收标准:**
+
+**Given** 任务在队列中或执行中
+**When** 用户取消任务
+**Then** 等待中任务直接从队列移除
+**And** 执行中任务在下一个检查点停止
+**And** 任务状态变为 CANCELLED
+**And** 释放已占用资源
+**And** 记录取消原因和时间
+
+**技术任务:**
+1. 创建 `scheduler/cancel_controller.py` 模块
+2. 实现取消信号机制
+3. 实现资源清理逻辑
+4. 集成到任务管理
+5. 编写单元测试验证取消行为
+
+**估算:** 4 故事点
+
+---
+
+### Story 7.6: 实现任务历史记录
+
+**As a** 用户,
+**I want** 查看任务执行历史,
+**So that** 追踪已完成任务的状态和结果。
+
+**验收标准:**
+
+**Given** 系统已完成多个任务
+**When** 用户查看任务历史
+**Then** 显示所有已完成任务列表
+**And** 每条记录包含:任务 ID、开始时间、结束时间、状态、结果摘要
+**And** 支持按日期范围筛选
+**And** 支持按状态筛选 (成功/失败/取消)
+**And** 支持查看任务详情和日志
+**And** 支持重新执行历史任务
+
+**技术任务:**
+1. 创建 `scheduler/task_history.py` 模块
+2. 定义 `TaskRecord` 数据模型
+3. 实现历史记录存储 (SQLite)
+4. 实现查询和筛选接口
+5. 编写单元测试验证历史管理
+
+**估算:** 5 故事点
+
+---
+
+### Story 7.22: 实现定时任务功能
+
+**As a** 用户,
+**I want** 设置定时自动翻译,
+**So that** 在指定时间自动执行任务。
+
+**验收标准:**
+
+**Given** 用户打开定时任务设置
+**When** 用户创建定时任务
+**Then** 支持设置执行时间 (如每日 22:00)
+**And** 支持设置重复规则 (每日/每周/自定义)
+**And** 支持选择要执行的任务
+**And** 到达设定时间后自动执行
+**And** 任务执行完成后发送通知
+**And** 支持启用/禁用定时任务
+
+**技术任务:**
+1. 创建 `scheduler/timed_task.py` 模块
+2. 实现 APScheduler 集成
+3. 实现定时任务配置管理
+4. 实现任务触发通知
+5. 编写测试验证定时功能
+
+**估算:** 6 故事点
+
+---
+
+**Epic 7a 总结:** 7 个故事,共 34 故事点
+
+---
+
+## Epic 7b: 用户界面完整版
+
+**Epic 目标:** 用户通过图形界面轻松操作翻译工具,包括文件导入、进度查看、配置管理和结果预览。
+
+**覆盖的需求:** FR36-FR52, AR21, AR22
+
+### Story 7.7: 创建主窗口框架
+
+**As a** 用户,
+**I want** 看到应用程序主窗口,
+**So that** 可以开始使用翻译工具。
+
+**验收标准:**
+
+**Given** 应用程序启动
+**When** 主窗口加载
+**Then** 显示应用标题 "BMAD Novel Translator"
+**And** 包含菜单栏 (文件、编辑、视图、帮助)
+**And** 包含工具栏 (常用操作按钮)
+**And** 包含主工作区 (文件列表/任务队列)
+**And** 包含状态栏 (当前状态/版本信息)
+**And** 窗口尺寸可调整 (默认 1200x800)
+
+**技术任务:**
+1. 创建 `ui/main_window.py` 模块
+2. 实现 `MainWindow` 类继承 QMainWindow
+3. 创建菜单栏和工具栏
+4. 创建中心部件布局
+5. 编写 UI 测试验证窗口显示
+
+**估算:** 5 故事点
+
+---
+
+### Story 7.8: 实现文件选择组件
+
+**As a** 用户,
+**I want** 选择待翻译的文件,
+**So that** 添加文件到处理队列。
+
+**验收标准:**
+
+**Given** 主窗口已打开
+**When** 用户点击"添加文件"按钮
+**Then** 打开文件选择对话框
+**And** 支持选择 .txt, .md, .html 文件
+**And** 支持多选 (Ctrl+点击)
+**And** 支持文件夹导入
+**And** 选中的文件显示在文件列表
+**And** 显示文件名、大小、状态
+
+**技术任务:**
+1. 创建 `ui/file_selector.py` 模块
+2. 实现 QFileDialog 集成
+3. 实现文件列表模型
+4. 实现 QTableView 显示
+5. 编写 UI 测试验证选择功能
+
+**估算:** 4 故事点
+
+---
+
+### Story 7.9: 实现进度显示组件
+
+**As a** 用户,
+**I want** 实时查看任务执行进度,
+**So that** 了解任务完成情况。
+
+**验收标准:**
+
+**Given** 任务正在执行
+**When** 用户查看进度显示
+**Then** 显示当前任务名称和状态
+**And** 显示进度条 (0-100%)
+**And** 显示当前阶段 (如"正在翻译 第 5/10 章")
+**And** 显示已用时间和预估剩余时间
+**And** 支持最小化到系统托盘
+**And** 任务完成时显示通知
+
+**技术任务:**
+1. 创建 `ui/progress_widget.py` 模块
+2. 实现 QProgressBar 组件
+3. 实现时间计算逻辑
+4. 实现系统托盘集成
+5. 编写 UI 测试验证进度显示
+
+**估算:** 5 故事点
+
+---
+
+### Story 7.10: 实现配置管理界面
+
+**As a** 用户,
+**I want** 管理应用程序配置,
+**So that** 自定义翻译行为。
+
+**验收标准:**
+
+**Given** 用户打开设置对话框
+**When** 用户查看配置选项
+**Then** 显示分类配置项:
+  - 翻译设置 (模型选择、GPU 加速开关、批处理大小)
+  - 界面设置 (主题、语言、字体大小)
+  - 路径设置 (工作目录、缓存目录、输出目录)
+  - 高级设置 (日志级别、并发数)
+**And** 支持修改配置并实时保存
+**And** 支持恢复默认配置
+**And** 配置文件保存为 JSON 格式
+
+**技术任务:**
+1. 创建 `ui/settings_dialog.py` 模块
+2. 创建 `config/config_manager.py` 模块
+3. 实现 QTabWidget 分页配置
+4. 实现配置持久化
+5. 编写测试验证配置管理
+
+**估算:** 6 故事点
+
+---
+
+### Story 7.11: 实现主题切换功能
+
+**As a** 用户,
+**I want** 切换界面主题,
+**So that** 选择舒适的视觉风格。
+
+**验收标准:**
+
+**Given** 应用程序运行中
+**When** 用户切换主题
+**Then** 支持浅色主题 (默认)
+**And** 支持深色主题
+**And** 支持系统主题 (跟随系统)
+**And** 主题切换立即生效
+**And** 主题选择保存到配置
+
+**技术任务:**
+1. 创建 `ui/theme_manager.py` 模块
+2. 实现主题样式表定义
+3. 实现主题切换逻辑
+4. 集成到设置界面
+5. 编写 UI 测试验证主题切换
+
+**估算:** 4 故事点
+
+---
+
+### Story 7.12: 实现多语言界面支持
+
+**As a** 用户,
+**I want** 切换界面语言,
+**So that** 使用熟悉的语言操作软件。
+
+**验收标准:**
+
+**Given** 应用程序已启动
+**When** 用户切换语言
+**Then** 支持中文 (简体)
+**And** 支持英文
+**And** 所有界面元素文字相应切换
+**And** 语言切换立即生效
+**And** 语言选择保存到配置
+
+**技术任务:**
+1. 创建 `ui/i18n.py` 国际化模块
+2. 创建语言资源文件 (zh_CN.json, en_US.json)
+3. 实现 QTranslator 集成
+4. 实现动态语言切换
+5. 编写测试验证多语言支持
+
+**估算:** 5 故事点
+
+---
+
+### Story 7.13: 实现快捷键支持
+
+**As a** 用户,
+**I want** 使用快捷键操作软件,
+**So that** 提高操作效率。
+
+**验收标准:**
+
+**Given** 应用程序运行中
+**When** 用户使用快捷键
+**Then** 支持常用快捷键:
+  - Ctrl+O: 打开文件
+  - Ctrl+S: 保存配置
+  - Ctrl+T: 开始翻译
+  - Ctrl+P: 暂停任务
+  - Ctrl+,: 打开设置
+  - F1: 打开帮助
+**And** 快捷键在菜单中显示
+**And** 支持自定义快捷键
+
+**技术任务:**
+1. 创建 `ui/shortcut_manager.py` 模块
+2. 实现 QShortcut 定义
+3. 集成到菜单和按钮
+4. 实现快捷键编辑器
+5. 编写测试验证快捷键功能
+
+**估算:** 4 故事点
+
+---
+
+### Story 7.14: 实现拖拽上传功能
+
+**As a** 用户,
+**I want** 直接拖拽文件到窗口,
+**So that** 快速添加待翻译文件。
+
+**验收标准:**
+
+**Given** 主窗口已打开
+**When** 用户拖拽文件到窗口
+**Then** 窗口高亮显示拖拽区域
+**And** 释放鼠标后文件添加到队列
+**And** 支持拖拽多个文件
+**And** 支持拖拽文件夹
+**And** 不支持的文件格式显示错误提示
+
+**技术任务:**
+1. 创建 `ui/drop_zone.py` 模块
+2. 实现 dragEnterEvent 和 dropEvent
+3. 实现文件类型验证
+4. 集成到主窗口
+5. 编写 UI 测试验证拖拽功能
+
+**估算:** 4 故事点
+
+---
+
+### Story 7.15: 实现日志查看器
+
+**As a** 用户,
+**I want** 查看应用程序日志,
+**So that** 诊断问题和了解执行详情。
+
+**验收标准:**
+
+**Given** 应用程序运行中
+**When** 用户打开日志查看器
+**Then** 显示按时间排序的日志列表
+**And** 支持日志级别过滤 (DEBUG/INFO/WARNING/ERROR)
+**And** 支持关键词搜索
+**And** 支持导出日志到文件
+**And** 错误日志高亮显示
+**And** 自动滚动到最新日志
+
+**技术任务:**
+1. 创建 `ui/log_viewer.py` 模块
+2. 实现 QListView 日志显示
+3. 实现日志过滤逻辑
+4. 实现搜索功能
+5. 编写测试验证日志查看
+
+**估算:** 5 故事点
+
+---
+
+### Story 7.16: 实现错误提示对话框
+
+**As a** 系统,
+**I want** 显示用户友好的错误提示,
+**So that** 用户理解问题并知道如何处理。
+
+**验收标准:**
+
+**Given** 应用程序运行中
+**When** 发生错误
+**Then** 显示错误对话框
+**And** 包含错误类型和描述
+**And** 包含建议的解决方案
+**And** 提供"查看详情"按钮显示完整错误信息
+**And** 提供"复制错误信息"按钮
+**And** 支持"不再提示此错误"选项
+
+**技术任务:**
+1. 创建 `ui/error_dialog.py` 模块
+2. 定义错误类型和解决方案映射
+3. 实现错误对话框 UI
+4. 实现详情显示
+5. 编写测试验证错误提示
+
+**估算:** 4 故事点
+
+---
+
+### Story 7.17: 实现报告导出功能
+
+**As a** 用户,
+**I want** 导出翻译报告,
+**So that** 分享或存档翻译结果。
+
+**验收标准:**
+
+**Given** 翻译任务已完成
+**When** 用户选择导出报告
+**Then** 支持导出为 HTML 格式 (包含样式)
+**And** 支持导出为 PDF 格式
+**And** 报告包含:任务摘要、翻译统计、质量分析、术语使用
+**And** 支持自定义报告内容和样式
+**And** 导出进度显示
+
+**技术任务:**
+1. 创建 `ui/report_exporter.py` 模块
+2. 实现 HTML 报告生成
+3. 集成 PDF 生成库 (weasyprint)
+4. 实现导出对话框
+5. 编写测试验证报告生成
+
+**估算:** 6 故事点
+
+---
+
+### Story 7.18: 实现内容预览功能
+
+**As a** 用户,
+**I want** 预览翻译前后内容,
+**So that** 验证翻译效果。
+
+**验收标准:**
+
+**Given** 翻译已完成或进行中
+**When** 用户打开预览窗口
+**Then** 左侧显示原文
+**And** 右侧显示译文
+**And** 支持同步滚动 (一侧滚动时另一侧跟随)
+**And** 高亮显示差异位置
+**And** 支持全屏预览
+**And** 支持在预览中直接编辑译文
+
+**技术任务:**
+1. 创建 `ui/preview_widget.py` 模块
+2. 实现双栏对比视图
+3. 实现同步滚动逻辑
+4. 实现差异高亮
+5. 编写 UI 测试验证预览功能
+
+**估算:** 6 故事点
+
+---
+
+### Story 7.19: 实现术语表编辑器
+
+**As a** 用户,
+**I want** 可视化编辑术语表,
+**So that** 方便管理术语翻译。
+
+**验收标准:**
+
+**Given** 用户打开术语表编辑器
+**When** 用户查看术语表
+**Then** 显示术语表格 (原文、翻译、类型、备注)
+**And** 支持添加新术语 (弹出对话框输入)
+**And** 支持编辑现有术语 (双击编辑)
+**And** 支持删除术语
+**And** 支持搜索和筛选术语
+**And** 支持导入/导出术语表
+
+**技术任务:**
+1. 创建 `ui/terminology_editor.py` 模块
+2. 实现 QTableView 表格显示
+3. 实现增删改查操作
+4. 实现搜索和筛选
+5. 编写 UI 测试验证编辑器功能
+
+**估算:** 5 故事点
+
+---
+
+### Story 7.20: 实现一键翻译功能
+
+**As a** 用户,
+**I want** 一键执行完整翻译流程,
+**So that** 简化操作步骤。
+
+**验收标准:**
+
+**Given** 用户已选择文件并配置好参数
+**When** 用户点击"一键翻译"按钮
+**Then** 自动执行完整流程:清洗 → 术语提取 → 翻译 → 格式化
+**And** 每个步骤显示进度
+**And** 步骤失败时暂停并提示用户
+**And** 完成后显示结果摘要
+**And** 提供打开输出文件夹按钮
+
+**技术任务:**
+1. 创建 `core/one_click_workflow.py` 模块
+2. 实现工作流编排逻辑
+3. 集成进度通知
+4. 实现错误处理
+5. 编写集成测试验证工作流
+
+**估算:** 5 故事点
+
+---
+
+### Story 7.21: 实现批量操作功能
+
+**As a** 用户,
+**I want** 对多个文件执行批量操作,
+**So that** 高效处理多个文件。
+
+**验收标准:**
+
+**Given** 文件列表中有多个文件
+**When** 用户选择批量操作
+**Then** 支持全选/反选文件
+**And** 支持批量开始翻译
+**And** 支持批量暂停
+**And** 支持批量删除
+**And** 支持批量导出
+**And** 显示批量操作进度
+
+**技术任务:**
+1. 创建 `ui/batch_operations.py` 模块
+2. 实现文件选择逻辑
+3. 实现批量操作调度
+4. 实现批量进度显示
+5. 编写测试验证批量功能
+
+**估算:** 5 故事点
+
+---
+
+### Story 7.23: 实现统计面板
+
+**As a** 用户,
+**I want** 查看翻译统计数据,
+**So that** 了解工作量和效率。
+
+**验收标准:**
+
+**Given** 用户打开统计面板
+**When** 用户查看统计数据
+**Then** 显示以下统计:
+  - 总翻译字数
+  - 总翻译章节数
+  - 总翻译时长
+  - 平均翻译速度 (字/分钟)
+  - 术语使用率
+  - 任务完成率 (成功/失败)
+**And** 支持按日期范围筛选
+**And** 支持图表可视化 (柱状图、折线图)
+**And** 支持导出统计报告
+
+**技术任务:**
+1. 创建 `ui/statistics_panel.py` 模块
+2. 实现统计数据计算
+3. 集成 matplotlib 绘图
+4. 实现日期筛选
+5. 编写测试验证统计准确性
+
+**估算:** 6 故事点
+
+---
+
+---
+
+### Story 7.24: 实现导入预览界面
+
+**As a** 用户,
+**I want** 导入 TXT 后看到预览信息,
+**So that** 确认导入正确。
+
+**验收标准:**
+
+**Given** 用户选择并导入 TXT 文件
+**When** 文件解析完成
+**Then** 显示预览界面包含:
+  - 章节数量
+  - 总字数统计
+  - 预计翻译时间 (基于 GPU 速度估算)
+  - 前 3 章标题预览
+**And** 提供"确认开始翻译"按钮
+**And** 提供"取消导入"按钮
+**And** 支持在预览界面调整翻译参数
+
+**技术任务:**
+1. 创建 `ui/import_preview.py` 模块
+2. 实现预览信息收集逻辑
+3. 实现时间估算算法
+4. 创建预览界面 UI
+5. 编写测试验证预览功能
+
+**估算:** 4 故事点
+
+---
+
+### Story 7.25: 实现离线翻译支持
+
+**As a** 用户,
+**I want** 网络断开时继续翻译,
+**So that** 不受网络状态影响。
+
+**验收标准:**
+
+**Given** 用户正在使用翻译工具
+**When** 检测到网络断开
+**Then** 显示离线模式提示
+**And** 继续执行本地翻译任务
+**And** 上传任务保存到本地队列
+**When** 检测到网络恢复
+**Then** 自动执行队列中的上传任务
+**And** 显示"网络已恢复,正在上传..."提示
+**And** 支持手动触发队列上传
+
+**技术任务:**
+1. 创建 `network/status_monitor.py` 模块
+2. 实现网络状态检测 (ping/API 测试)
+3. 创建 `upload/offline_queue.py` 离线队列模块
+4. 实现队列自动执行逻辑
+5. 编写测试验证离线/恢复流程
+
+**估算:** 8 故事点
+
+---
+
+**Epic 7b 总结:** 19 个故事,共 93 故事点
+
+---
+
+## 项目总览
+
+| Epic | 故事数 | 故事点 | 核心价值 |
+|------|--------|--------|----------|
+| Epic 1: 基础架构与 Crash-Safe | 5 | 28 | 系统可靠性基础 |
+| Epic 2: 指纹机制模块 | 7 | 27 | 避免重复处理 |
+| Epic 3: 清洗模块 | 5 | 25 | 翻译输入质量 |
+| Epic 4: 术语提取模块 | 6 | 30 | 翻译一致性 |
+| Epic 5: 翻译模块 | 8 | 42 | 核心翻译能力 |
+| Epic 6: 上传模块 | 8 | 36 | 平台发布自动化 |
+| Epic 7a: 任务调度核心 | 7 | 34 | 任务状态管理 |
+| Epic 7b: 用户界面完整版 | 19 | 93 | 完整用户体验 |
+| **总计** | **65** | **315** | **完整产品** |
+
+## 需求覆盖确认
+
+- ✅ 所有 52 个功能需求 (FR1-FR52) 已覆盖
+- ✅ 所有 24 个架构需求 (AR1-AR24) 已覆盖
+- ✅ 所有 6 个非功能性需求 (NFR-P1 到 NFR-P6) 已考虑

+ 1436 - 0
planning-artifacts/prd.md

@@ -0,0 +1,1436 @@
+---
+stepsCompleted: ['step-01-init', 'step-02-discovery', 'step-02b-vision', 'step-02c-executive-summary', 'step-03-success', 'step-04-journeys', 'step-05-domain', 'step-06-innovation', 'step-07-project-type', 'step-08-scoping', 'step-09-functional', 'step-10-nonfunctional', 'step-11-polish']
+inputDocuments: []
+workflowType: 'prd'
+classification:
+  projectType: Desktop App
+  domain: Content/Publishing
+  complexity: Medium
+  projectContext: Greenfield
+---
+
+# Product Requirements Document - 223-236-template-6
+
+**Author:** User
+**Date:** 2026-03-13
+
+## Executive Summary
+
+### 产品愿景
+
+序灵 Matrix 助手是面向中文网络小说作者的本地化 AI 翻译流水线,解决百万字级长篇网文出海的核心基础设施问题。产品将复杂的翻译流程(分段、术语处理、批量翻译、格式化)简化为一键操作,使 200-500 万字网文的海外发布从"数周手动工作"变为"一夜自动完成"。
+
+**核心问题:** 现有翻译方案无法满足网文出海场景 — 在线翻译服务数据安全风险高、批量处理效率低、术语无法统一;专业人工翻译成本高昂且周期过长。作者需要的是批量、高质量、安全、成本可控的端到端解决方案。
+
+**目标用户:**
+- 主要:想要将自有网文作品推向海外市场的个人作者
+- 次要:小型翻译工作室
+
+### What Makes This Special
+
+1. **本地化安全**:全流程在本地桌面运行,作品未发布前零外泄风险
+
+2. **网文专门化**:
+   - 术语锁定:Top200 人名/地名/门派名全书统一翻译
+   - 智能章节识别:正确识别"第123章"并在章节边界分段
+   - 定长分段:900 字符分段适配 GPU 批处理
+
+3. **GPU 极速**:基于 CTranslate2 + m2m100_418M + 本地 CUDA 加速,比在线翻译服务快 5-10 倍
+
+4. **一键全流程**:拖入 TXT 文件 → 自动完成指纹查重/清洗/术语提取/翻译/上传 → 输出结构化英文版,无需任何手动分段、上传、下载操作
+
+**核心洞察:** 这个产品解决的不是"翻译"问题本身,而是"网文出海的基础设施"问题 — 批量处理能力、质量可控、数据安全、成本可控四个维度的综合需求。
+
+**商业模式:** 一次性软件买断 + 按量计费混合模式(按 CU = 章节字数÷100 计费,预充值扣费)
+
+### Project Classification
+
+| 维度 | 分类 |
+|------|------|
+| 项目类型 | Desktop App (桌面应用) |
+| 领域 | Content/Publishing (内容出版) |
+| 复杂度 | Medium (中等 - CUDA加速、大规模文本处理、任务调度) |
+| 项目上下文 | Greenfield (绿地项目 - 全新产品) |
+
+## Success Criteria
+
+### User Success
+
+**任务完成标志:**
+- 用户界面显示绿色勾号 + 状态消息:"翻译完成,共 XXX 章,XX 万字"
+- 输出文件:英文版 TXT 文件生成成功 + 目标平台上传确认
+- 用户感知:一觉醒来,500 万字小说已自动翻译完成
+
+**质量标准:**
+- 术语准确率:≥ 95%(核心人名/地名全书一致)
+- 翻译流畅度:达到可出版水平(编辑仅需润色,无需重译)
+- 章节完整性:0 断章、0 漏章
+
+**效率提升:**
+- 对比基准:手动方案 2-3 周处理周期
+- 自动方案:1 晚完成 500 万字
+- 量化收益:节省 95% 处理时间
+
+### Business Success
+
+**3 个月指标:**
+- 软件购买用户:≥ 100 人
+- 平均 CU 消耗:5000-50000 CU/用户(对应 50-500 万字)
+
+**12 个月指标:**
+- 用户留存率:≥ 60%(续用或充值)
+- 净推荐值 (NPS):≥ 40
+
+**成功标志:**
+- 用户自发传播:"这个工具救了我"
+- 海外平台出现明确标注:"使用 Matrix 助手翻译"
+
+### Technical Success
+
+**关键性能指标:**
+- 翻译速度:≥ 5000 字符/分钟(基于 RTX 3060)
+- GPU 利用率:≥ 80%(非空闲处理状态)
+- 崩溃恢复率:99.9%(Crash-Safe 机制可靠性)
+
+### Measurable Outcomes
+
+| 指标类别 | 具体指标 | 目标值 |
+|-----------|-----------|--------|
+| 用户时间 | 500 万字处理时间 | 8-12 小时 |
+| 术语质量 | 核心术语准确率 | ≥ 95% |
+| 章节完整性 | 断章/漏章率 | 0% |
+| 业务增长 | 首季购买用户 | ≥ 100 |
+| 用户留存 | 12 个月留存率 | ≥ 60% |
+| 技术性能 | 翻译速度 | ≥ 5000 字符/分钟 |
+
+## Product Scope
+
+### MVP - Minimum Viable Product
+
+**六大核心模块(必需功能):**
+- 指纹查重模块:MD5 唯一 work_id 生成,防重复处理
+- 清洗分章模块:章节识别、正文清洗、900 字符定长分段
+- 术语提取模块:Top200 人名/地名/门派名自动提取
+- 翻译模块:m2m100 中译英,CUDA 加速
+- 上传模块:逐章上传,按章节字数扣费
+- 任务调度模块:Pause/Resume/Crash-Safe/失败重试
+
+**技术基础:**
+- Python 3.11
+- CTranslate2 + facebook/m2m100_418M
+- CUDA 支持(RTX 3050/3060)
+- 零授权费依赖(requests MIT)
+
+### Growth Features (Post-MVP)
+
+**版本 2 增长功能:**
+- 多语言支持:中→日/韩/西语扩展
+- 批量多文件处理:同时处理多部小说
+- 翻译记忆库:用户自定义术语表导入/导出
+
+### Vision (Future)
+
+**版本 3+ 愿景功能:**
+- AI 辅助润色:基于用户反馈自动优化翻译质量
+- 平台 API 直接对接:Webnovel/Wattpad/Royal Road 直接发布
+- 协作功能:多译者协作、审阅流程
+
+## User Journeys
+
+### Journey 1: 首次使用 - 李明的出海之旅
+
+**角色:** 李明,35 岁网络小说作者,已完成 300 万字仙侠小说《九天剑主》
+
+**场景设定:**
+李明在作者群看到有人推荐"序灵 Matrix 助手",说"一晚上把 500 万字翻完了"。他的小说在国内已经完结,一直想推向海外市场,但咨询了翻译机构 — 50 万美元,3 个月交稿。这对个人作者来说完全不可接受。
+
+**上升动作:**
+李明下载了 Matrix 助手安装包,安装过程中软件检测到他的 RTX 3060 显卡,显示绿色勾号:"GPU 已就绪,预计翻译速度 5200 字符/分钟"。他心跳加速,这可能真的有用。
+
+他拖入《九天剑主》的 TXT 文件(1500 章,约 300 万字)。软件自动扫描:
+- "检测到 1500 章"
+- "提取到 238 个术语"(人名、门派、功法名)
+- "预计处理时间:9.5 小时"
+
+李明点击"开始翻译"按钮,看到一个圆圈开始旋转,显示进度条和预计完成时间。他去睡了一觉。
+
+**高潮时刻:**
+第二天早上,李明醒来看到桌面通知:
+```
+✅ 翻译完成!
+《九天剑主》- 1500 章,312 万字
+术语准确率:96.7%
+已生成英文版 TXT
+```
+
+他颤抖着手打开英文版,搜索主角名字"叶凡" — 从第 1 章到第 1500 章,全部是 "Ye Fan",从未变成 "Leaf Emperor" 或 "Ye Van"。章节标题 "Chapter 1234" 规规整整,没有断在句子中间。
+
+**结局:**
+李明将英文版上传到海外网文平台。两周后,他的小说获得了首批英文读者评论:"This cultivation novel is amazing! Can't wait for more chapters."
+
+李明在作者群发了条消息:"Matrix 助手救了我。我的小说现在有英文版了。"
+
+**此旅程揭示需求:**
+- GPU 检测和可用性提示
+- 导入前预览(章节数、术语数、预计时间)
+- 进度显示和预计完成时间
+- 完成通知(桌面通知)
+- 术语验证功能
+- 英文版生成和下载
+
+---
+
+### Journey 2: 续更翻译 - 张华的连载更新
+
+**角色:** 张华,29 岁,连载作者,每天更新 2 章
+
+**场景设定:**
+张华的《星河霸主》已经翻译到第 800 章(英文版),每天晚上他会更新 2 章中文。之前他需要手动提取新章节、上传到翻译服务、等待、下载、合并到英文版 — 每天 1 小时。
+
+**上升动作:**
+张华启动 Matrix 助手,软件自动识别:
+```
+检测到已知作品:《星河霸主》
+work_id: 7f8e9d2a... (MD5)
+已翻译:800 章
+新章节:801-802 (2 章)
+```
+
+他直接拖入包含新章节的 TXT 文件,点击"继续翻译"。软件自动复用之前的术语库(已经锁定的 156 个术语),只翻译新增内容。
+
+20 分钟后,桌面通知:"2 章翻译完成"。张华将新章节追加到英文版 TXT,一键上传到平台。
+
+**高潮时刻:**
+张华看了一眼时间 — 从导入到上传完成,总共 25 分钟。之前需要 1 小时,现在节省了 58% 的时间。他可以多写 1000 字了。
+
+**结局:**
+张华继续连载,每天晚上重复这个流程。他的英文读者和中文读者几乎同步追更,收入增加了 40%。
+
+**此旅程揭示需求:**
+- 续更自动识别(基于 work_id)
+- 术语库复用
+- 增量翻译(只处理新章节)
+- 追加到现有英文版
+- 快速流程优化
+
+---
+
+### Journey 3: 崩溃恢复 - 王芳的意外断电
+
+**角色:** 王芳,32 岁,翻译工作室负责人,处理 500 万字作品
+
+**场景设定:**
+王芳正在用 Matrix 助手翻译客户的 500 万字小说。翻译到 60% 时,突然停电了。她惊慌失措 — 之前用其他工具,断电意味着一切从头开始。
+
+**上升动作:**
+王芳重启电脑,忐忑不安地打开 Matrix 助手。
+
+软件启动界面显示:
+```
+⚠️ 检测到未完成任务
+《长夜将明》- 已完成 60%
+上次中断:意外断电
+是否恢复? [恢复] [放弃]
+```
+
+她点击"恢复"。软件显示:
+```
+✅ 任务已恢复
+已翻译:300 万字 / 500 万字 (60%)
+剩余:200 万字
+预计剩余时间:6.4 小时
+跳过已完成章节...
+```
+
+**高潮时刻:**
+王芳松了一口气 — Crash-Safe 机制救了她。软件从第 3001 章继续翻译,没有重复处理已完成的内容,也没有遗漏任何章节。
+
+**结局:**
+6.5 小时后,500 万字全部翻译完成。王芳的客户收到英文版,非常满意。王芳在工作室的 SOP 中更新了:"强制使用 Matrix 助手,唯一支持断点续传的工具。"
+
+**此旅程揭示需求:**
+- Crash-Safe 机制(状态持久化)
+- 崩溃检测和恢复提示
+- 断点续传(跳过已完成)
+- 进度可见性
+- 任务状态管理
+
+---
+
+### Journey 4: 术语校准 - 陈刚的专有名词
+
+**角色:** 陈刚,40 岁,资深玄幻作者,作品包含大量自创术语
+
+**场景设定:**
+陈刚的《虚空战纪》有大量自创术语:"虚元力"、"九转虚空决"、"虚空殿"等。他担心 AI 翻译会把这些术语翻得五花八门。
+
+**上升动作:**
+陈刚导入 TXT 文件后,软件显示"术语提取完成"按钮。他点击后看到一个术语列表:
+
+| 原文 | 自动翻译 | 频次 |
+|------|----------|------|
+| 叶辰 | Ye Chen | 2341 次 |
+| 虚元力 | Void Origin Power | 1876 次 |
+| 九转虚空决 | Nine Revolution Void Art | 543 次 |
+| 虚空殿 | Void Temple | 421 次 |
+
+陈刚发现"虚元力"应该翻译成 "Void Origin Force" 而不是 "Void Origin Power"。他直接在表格中修改,点击"保存并锁定"。
+
+**高潮时刻:**
+翻译完成后,陈刚搜索"虚元力" — 全书 1876 处,全部是 "Void Origin Force",无一例外。
+
+**结局:**
+陈刚将自己常用的术语表导出保存。下次翻译新作品时,他直接导入这个术语表,确保系列作品术语一致。
+
+**此旅程揭示需求:**
+- 术语提取和预览
+- 手动编辑术语翻译
+- 术语锁定机制
+- 术语表导入/导出
+- 术语验证功能
+
+---
+
+### Journey 5: 失败处理 - 赵敏的网络异常
+
+**角色:** 赵敏,27 岁,兼职作者,网络不稳定
+
+**场景设定:**
+赵敏在翻译过程中上传模块遇到了网络异常 — 连接超时。她不知道哪些章节上传成功了,哪些失败了。
+
+**上升动作:**
+翻译完成后,Matrix 助手显示:
+```
+⚠️ 部分章节上传失败
+成功:1245 章
+失败:3 章(章节 892, 893, 895)
+是否重试? [重试] [跳过]
+```
+
+赵敏点击"重试"。软件自动重新上传失败的 3 章,这次成功了。
+
+**结局:**
+赵敏在历史记录中看到这次任务的完整日志,包括失败和重试记录。她感到安心 — 即使网络不稳定,也不会丢章节。
+
+**此旅程揭示需求:**
+- 上传失败检测
+- 失败章节列表
+- 批量重试功能
+- 任务历史记录
+- 详细日志
+
+---
+
+### Journey Requirements Summary
+
+基于以上用户旅程,序灵 Matrix 助手需要以下核心能力:
+
+| 功能领域 | 需求来源 | 优先级 |
+|----------|----------|--------|
+| GPU 检测和配置 | Journey 1 | P0 |
+| 导入前预览(章节/术语/时间) | Journey 1 | P0 |
+| 进度显示和预计完成时间 | Journey 1 | P0 |
+| 完成通知(桌面通知) | Journey 1 | P0 |
+| Crash-Safe 机制 | Journey 3 | P0 |
+| 断点续传 | Journey 3 | P0 |
+| 术语提取和预览 | Journey 1, 4 | P0 |
+| 术语手动编辑 | Journey 4 | P0 |
+| 术语锁定机制 | Journey 1, 4 | P0 |
+| 续更自动识别 | Journey 2 | P1 |
+| 术语库复用 | Journey 2 | P1 |
+| 术语表导入/导出 | Journey 4 | P1 |
+| 上传失败检测 | Journey 5 | P1 |
+| 批量重试 | Journey 5 | P1 |
+| 任务历史记录 | Journey 5 | P2 |
+| 详细日志 | Journey 5 | P2 |
+
+## Domain-Specific Requirements
+
+### Compliance & Regulatory
+
+**版权与知识产权:**
+- 用户必须拥有源内容的翻译权和发布权
+- 软件需明确声明:不处理盗版内容,用户承担版权责任
+- 生成内容添加翻译标识:"Translated by 序灵 Matrix 助手"
+
+**内容合规:**
+- 过滤敏感内容(可选功能,适配平台规则)
+- 保留原作版权声明和作者信息
+- 翻译内容不得用于训练第三方 AI 模型(本地处理保障)
+
+### Technical Constraints
+
+**翻译质量标准:**
+- 术语一致性:≥ 95% 核心术语全书统一
+- 章节完整性:0 断章、0 漏章
+- 可读性:达到"可直接发布"水平(仅需润色,无需重译)
+
+**性能要求:**
+- 翻译速度:≥ 5000 字符/分钟(RTX 3060 基准)
+- GPU 利用率:≥ 80%(高效资源使用)
+- 批处理能力:支持 500 万字单文件处理
+
+**数据安全:**
+- 全流程本地处理,零数据外泄
+- work_id MD5 仅用于指纹查重,不上传内容
+- 用户术语表本地存储,不上云
+
+### Integration Requirements
+
+**平台对接(MVP 后):**
+- 目标平台:Webnovel、Wattpad、Royal Road、起点国际
+- 上传格式:章节化 TXT/EPUB
+- API 集成:Vision 阶段功能
+
+**术语管理:**
+- 用户自定义术语表导入/导出(JSON/CSV)
+- 术语表复用于续更和系列作品
+- 术语锁定机制保证全书一致
+
+### Risk Mitigations
+
+**翻译质量风险:**
+| 风险 | 缓解措施 |
+|------|----------|
+| 术语翻译不一致 | Top200 术语锁定 + 占位符替换机制 |
+| 断章影响阅读 | 900 字符分段 + 章节边界识别 |
+| GPU 翻译失败 | 三级降级:批量→单条→失败清单 |
+| 网络上传失败 | 失败检测 + 自动重试 + 手动重试 |
+
+**数据完整性风险:**
+| 风险 | 缓解措施 |
+|------|----------|
+| 断电/崩溃丢失进度 | Crash-Safe:原子写 progress.json |
+| 重复处理浪费 CU | MD5 指纹查重 + work_id 去重 |
+| 分段数据损坏 | .tmp 原子写 + fsync + rename |
+| 章节遗漏 | 分段元数据校验 + 缺失检测 |
+
+**用户体验风险:**
+| 风险 | 缓解措施 |
+|------|----------|
+| 首次配置困难 | GPU 自动检测 + 一键向导 |
+| 进度不可见 | 实时进度条 + 预计完成时间 |
+| 术语不可控 | 术语预览 + 手动编辑界面 |
+| 暂停无响应 | Pause 立即中断 + Resume 断点续传 |
+
+### 六大核心模块领域规格
+
+#### 1. 指纹机制
+
+**输入:** TXT 文件第一章正文
+
+**处理流程:**
+```
+去空行 → 去标点 → MD5 计算 → API 调用
+```
+
+**API 规格:**
+```
+POST /api/fingerprint/check
+Request: { "fingerprint": "md5hash", "chapter_1": "content" }
+Response: { "work_id": "uuid", "exists": false }
+```
+
+**异常处理:**
+- 每 2 秒重试,最多 3 次
+- 失败后记录日志,不阻塞后续流程
+- 此阶段不可 Pause(原子操作)
+
+#### 2. 清洗模块
+
+**章节识别:**
+- 正则匹配:`第\s*[一二三四五六七八九十百千0-9]+\s*章`
+- 兼容格式:"第123章"、"第一千二百三十四章"、"Chapter 123"
+
+**正文清洗:**
+- 合并连续空行为单换行
+- 统一缩进为 2 空格
+- 压缩多余空格
+
+**定长分段:**
+- 基准:900 字符
+- 软上限:950 字符(避免句子中间断开)
+- 硬上限:1200 字符(强制断点)
+
+**输出格式:**
+```json
+{
+  "chapters": [
+    {
+      "chapter_id": 1,
+      "title": "第123章 少年觉醒",
+      "parts": [
+        { "part_index": 0, "content": "..." },
+        { "part_index": 1, "content": "..." }
+      ]
+    }
+  ]
+}
+```
+
+**Crash-Safe:**
+- 原子写:`novel_cleaned.json.tmp`
+- `fsync()` 强制刷盘
+- `rename()` 原子替换
+
+#### 3. 术语提取
+
+**候选抽取规则:**
+- 中文:`[\u4e00-\u9fff]{2,6}`(2-6 字连续中文)
+- 英文/拼音:`[A-Z][A-Za-z0-9\-]{1,20}`(大写开头)
+- 排除:常见停用词(的、了、是、在等)
+
+**统计算法:**
+```python
+Counter(terms)  # 全文频次
+cross_chapter_count  # 跨章出现次数
+```
+
+**筛选条件:**
+- `count >= 2`(至少出现 2 次)
+- `chapters >= 2`(至少在 2 章出现)
+- 取 Top200,按频次降序
+
+**回退机制:**
+- 可选 jieba 分词补充(未匹配到足够术语时)
+
+**输出格式:**
+```json
+{
+  "terms": [
+    { "source": "叶凡", "count": 2341, "chapters": 1500 },
+    { "source": "逍遥派", "count": 1876, "chapters": 1342 }
+  ]
+}
+```
+
+#### 4. 翻译模块
+
+**模型配置:**
+- 模型:`facebook/m2m100_418M`
+- 推理引擎:CTRanslate2
+- 设备:CUDA(RTX 3050/3060)
+
+**推理参数:**
+```python
+{
+  "beam_size": 1,  # 贪心解码,速度优先
+  "int8_float16": true,  # 混合精度
+  "batch_size": 8  # 动态调整 4-12
+}
+```
+
+**术语锁定流程:**
+```
+原文 → 占位符替换(§Ti§) → 翻译 → 术语还原 → 输出
+```
+
+**失败降级策略:**
+1. GPU 批量翻译(正常)
+2. GPU 单条翻译(批量失败)
+3. 记录失败清单(单条失败)
+
+**Pause/Resume:**
+- 章节级中断点
+- Pause:立即停止当前批次
+- Resume:从中断章节开头重跑
+
+#### 5. 上传模块
+
+**上传策略:** 逐章上传(固定策略)
+
+**扣费逻辑:**
+```
+CU = 章节字数 ÷ 100(向上取整)
+上传前触发扣费 API
+余额不足时跳过并记录
+```
+
+**失败重试:**
+- 自动重试 1 次
+- 仍失败 → 记录到 `upload_failed.jsonl`
+- 提供批量重试界面
+
+**分段合并:**
+- 同章分段 → 合并为整章
+- 缺失分段 → 标记 `incomplete: true`
+
+#### 6. 任务调度
+
+**状态机:**
+```
+pending → running → (success | failed | paused)
+         ↓
+      crashed → resume → running
+```
+
+**Pause/Resume:**
+- Pause:状态设为 `paused`,保存当前章节
+- Resume:从保存章节开头重跑(保证数据完整)
+
+**Crash-Safe:**
+- `progress.json` 原子写
+- 记录:当前章节、分段索引、翻译状态
+- 启动时检测未完成任务
+
+**失败清单:**
+- 格式:JSONL(每行一个失败项)
+- 写盘时机:每 10 个失败项或章节切换时
+- 边界保护:即使崩溃也保存已记录失败
+
+## Innovation & Novel Patterns
+
+### Detected Innovation Areas
+
+#### 1. 技术创新:本地 GPU 翻译流水线
+
+**创新描述:**
+将消费级 GPU (RTX 3050/3060) 用于大规模文本翻译,实现比在线翻译服务快 5-10 倍的处理速度。
+
+**新颖性:**
+- **现有方案**:在线翻译服务(Google/DeepL)受限于网络延迟和 API 配额
+- **Matrix 方案**:本地 CTranslate2 + CUDA,完全受控的吞吐量
+- **突破点**:在消费级硬件上实现企业级翻译吞吐
+
+**技术组合:**
+- CTranslate2 推理引擎(优化 Transformer 模型)
+- m2m100_418M 多语言模型
+- 混合精度推理(int8_float16)
+- 动态批量大小调整(4-12)
+
+#### 2. 流程创新:术语锁定占位符机制
+
+**创新描述:**
+使用占位符替换机制(§Ti§)确保全书术语 100% 统一翻译。
+
+**新颖性:**
+- **现有方案**:后处理正则替换(容易遗漏)或逐句人工校对
+- **Matrix 方案**:预替换占位符 → 翻译 → 原位还原
+- **突破点**:从根本上解决术语不一致问题
+
+**实现原理:**
+```
+原文: "叶凡加入了逍遥派"
+↓ 占位符替换
+"§T1§ 加入了 §T2§"
+↓ AI 翻译
+"§T1§ joined §T2§"
+↓ 术语还原
+"Ye Fan joined Xiaoyao Sect"
+```
+
+#### 3. 流程创新:Crash-Safe 原子写设计
+
+**创新描述:**
+使用 `.tmp` + `fsync()` + `rename()` 原子写模式,确保断电/崩溃不丢失进度。
+
+**新颖性:**
+- **现有方案**:定期保存(崩溃时可能损坏)或无保护(崩溃需重跑)
+- **Matrix 方案**:数据库级别的 ACID 保证应用于桌面应用
+- **突破点**:长时间任务(8-12 小时)的崩溃安全性
+
+**技术细节:**
+```python
+# 原子写模式
+write("progress.json.tmp", data)
+fsync(fd)  # 强制刷盘
+rename("progress.json.tmp", "progress.json")  # 原子替换
+```
+
+#### 4. 产品创新:网文专门化流水线
+
+**创新描述:**
+针对网文特点(章节结构、术语密集、超长篇幅)优化的端到端翻译方案。
+
+**新颖性:**
+- **通用翻译工具**:按段落/句子分割,破坏章节结构
+- **Matrix 方案**:章节识别 → 900 字符分段 → 术语锁定
+- **突破点**:首次将网文翻译作为专门领域
+
+**专门化特性:**
+- 智能章节识别(兼容"第123章"/"第一千二百三十四章")
+- 定长分段适配 GPU 批处理(900 字符基准)
+- Top200 术语自动提取(人名/地名/门派名)
+
+#### 5. 商业模式创新:混合计费
+
+**创新描述:**
+软件一次性买断 + 翻译按量计费 (CU) 的混合模式。
+
+**新颖性:**
+- **纯订阅**:用户持续付费压力
+- **纯买断**:厂商缺乏持续收入
+- **Matrix 方案**:降低使用门槛 + 持续收入激励
+
+#### 6. 用户体验创新:续更自动识别
+
+**创新描述:**
+基于 work_id 自动识别已翻译作品,仅处理新增章节。
+
+**新颖性:**
+- **现有方案**:手动管理版本、手动提取新章节
+- **Matrix 方案**:MD5 指纹自动匹配、增量翻译
+- **突破点**:连载作者的日更无缝衔接
+
+---
+
+### Market Context & Competitive Landscape
+
+**竞品分析:**
+
+| 竞品类型 | 代表产品 | 局限性 | Matrix 差异化 |
+|----------|----------|--------|---------------|
+| 在线翻译 | Google/DeepL | 数据外泄、批量限制、术语不一致 | 本地安全、批量处理、术语锁定 |
+| CAT 工具 | Trados/MemoQ | 面向专业译员、需要人工翻译 | 全自动 AI、面向作者 |
+| 网文平台 | Webnovel | 平台垄断、分成比例低 | 独立发布、作者控制 |
+| 翻译公司 | 人工服务 | 成本高($50万/500万字)、周期长 | 成本低、速度快 |
+
+**市场空白:**
+- **无专门针对网文的翻译工具**:现有工具都是通用设计
+- **无本地化批量翻译方案**:都是云服务,存在数据安全风险
+- **无术语锁定机制**:AI 翻译术语一致性是行业痛点
+
+---
+
+### Validation Approach
+
+**技术验证:**
+- ✅ m2m100 模型已在中文-英文翻译上验证有效
+- ✅ CTranslate2 + CUDA 性能在 NVIDIA 官方文档验证
+- ⚠️ 术语锁定占位符机制需要原型测试
+
+**市场验证:**
+- 用户访谈:10 位网文作者试用原型
+- A/B 测试:术语锁定 vs 无锁定的翻译质量
+- 性能基准:与 Google Translate 的速度对比
+
+**风险假设:**
+| 假设 | 验证方法 | 成功标准 |
+|------|----------|----------|
+| GPU 翻译质量可接受 | 100 章盲测 | ≥ 85% 用户认为"可直接发布" |
+| 术语锁定有效 | 全书一致性检查 | ≥ 95% 核心术语一致 |
+| 本地处理是刚需 | 用户调研 | ≥ 70% 用户因"数据安全"选择 |
+
+---
+
+### Risk Mitigation
+
+**技术风险:**
+
+| 风险 | 概率 | 影响 | 缓解措施 |
+|------|------|------|----------|
+| GPU 翻译质量不足 | 中 | 高 | 三级降级策略;保留人工编辑入口 |
+| CUDA 兼容性问题 | 低 | 中 | 降级到 CPU 模式(速度慢但可用) |
+| 术语锁定引入错误 | 低 | 中 | 术语预览 + 手动编辑界面 |
+
+**市场风险:**
+
+| 风险 | 概率 | 影响 | 缓解措施 |
+|------|------|------|----------|
+| 作者不愿付费 | 中 | 高 | 免费试用 + 按量计费降低门槛 |
+| 网文平台自建翻译 | 低 | 中 | 专注长尾作者/小型工作室 |
+| 开源竞品出现 | 中 | 中 | 建立用户习惯 + 持续优化体验 |
+
+**回退计划:**
+- 如果 GPU 翻译质量不达标:集成第三方翻译 API(有成本但可接受)
+- 如果混合计费不被接受:转为纯订阅模式
+- 如果网文作者市场太小:扩展到小说出版商、翻译工作室
+
+## Desktop App Specific Requirements
+
+### Project-Type Overview
+
+序灵 Matrix 助手是一款**本地桌面应用**,专为中文网络小说作者设计的 AI 翻译流水线。作为桌面应用,核心优势在于:
+- **数据安全**:全流程本地处理,作品内容零外泄
+- **性能可控**:直接访问 GPU 硬件,无云端延迟
+- **离线可用**:核心翻译功能无需网络连接
+
+---
+
+### Platform Support
+
+**目标平台(MVP):**
+- **主要**:Windows 10/11(占据网文作者市场 80%+)
+- **次要(V2)**:macOS 12+(Intel/Apple Silicon 统一)
+
+**技术选型:**
+```python
+# 跨平台 GUI 框架
+PyQt6 / PySide6  # 成熟稳定,商业友好
+或
+Electron + Python 后端  # 开发效率高,但包体积大
+
+# 推荐:PyQt6 + Nuitka 编译
+# 原因:零授权费依赖要求,Nuitka 可生成原生二进制
+```
+
+**GPU 支持矩阵:**
+
+| GPU 系列 | CUDA 支持 | 目标速度 | 备注 |
+|----------|-----------|----------|------|
+| RTX 40 系列 | ✅ 完整 | ≥ 8000 字符/分 | 最高性能 |
+| RTX 30 系列 | ✅ 完整 | ≥ 5000 字符/分 | 标准配置 |
+| GTX 16 系列 | ✅ 完整 | ≥ 3000 字符/分 | 入门配置 |
+| GTX 10 系列 | ⚠️ 有限 | ≥ 1500 字符/分 | 降级支持 |
+| 无 NVIDIA GPU | ❌ 不支持 | N/A | 提示升级硬件 |
+
+**最低硬件要求:**
+- CPU:4 核 2.0 GHz+
+- 内存:8 GB(推荐 16 GB)
+- 显卡:NVIDIA GTX 1650 或更高,4GB VRAM
+- 存储:10 GB 可用空间(模型文件 + 缓存)
+
+---
+
+### System Integration
+
+**文件系统集成:**
+- **拖放支持**:直接拖入 TXT 文件启动翻译
+- **文件关联**:双击 TXT 文件自动打开 Matrix 助手
+- **最近文件**:记住最近处理的 10 个作品
+
+**GPU 检测与初始化:**
+```python
+# 启动时自动检测
+def detect_gpu():
+    try:
+        import torch
+        if torch.cuda.is_available():
+            gpu_name = torch.cuda.get_device_name(0)
+            vram_gb = torch.cuda.get_device_properties(0).total_memory / 1e9
+            return {
+                "available": True,
+                "name": gpu_name,
+                "vram_gb": vram_gb,
+                "estimated_speed": calculate_speed(gpu_name)
+            }
+    except:
+        return {"available": False}
+```
+
+**桌面通知:**
+- Windows:原生 Toast 通知
+- macOS:NotificationCenter 集成
+- 通知类型:"翻译完成"、"部分章节上传失败"、"GPU 温度警告"
+
+**系统托盘:**
+- 最小化到托盘(后台运行)
+- 托盘图标显示进度百分比
+- 右键菜单:暂停/恢复/查看进度
+
+---
+
+### Update Strategy
+
+**MVP(手动更新):**
+- 启动时检查更新(HTTP GET /api/version)
+- 发现新版本时显示通知
+- 用户手动下载安装包覆盖安装
+
+**V2(自动更新):**
+- 增量更新:仅下载变更的模型文件
+- 后台下载,安装时提示重启
+- 回滚机制:保留上一版本
+
+---
+
+### Offline Capabilities
+
+**离线核心功能:**
+- ✅ 清洗分章(完全离线)
+- ✅ 术语提取(完全离线)
+- ✅ GPU 翻译(完全离线)
+- ⚠️ 指纹查重(需要网络)
+- ⚠️ 上传模块(需要网络)
+
+**网络断开处理:**
+- 检测网络状态:定期 ping 服务器
+- 网络断开时显示状态图标(橙色)
+- 上传失败时保存到本地队列
+- 网络恢复时自动重试上传
+
+**本地数据存储:**
+```
+~/.matrix-assistant/
+├── models/               # 模型文件缓存
+├── works/               # 作品工作目录
+│   └── {work_id}/
+│       ├── progress.json       # 进度状态
+│       ├── novel_cleaned.json  # 清洗后数据
+│       ├── terms_temp.json     # 术语提取
+│       └── translated/         # 翻译结果
+├── config/              # 配置文件
+└── logs/                # 日志文件
+```
+
+---
+
+### Implementation Considerations
+
+**打包与分发:**
+
+**MVP(简单方案):**
+- PyInstaller 单文件打包
+- 生成的 EXE 约 500 MB(含模型)
+- 用户下载后直接运行
+
+**V2(专业方案):**
+- Nuitka 编译为原生代码
+- 安装程序(NSIS/InnoSetup)
+- 模型文件分离下载(首次运行时下载)
+
+**许可证管理:**
+- 一次性购买密钥绑定
+- 硬件指纹绑定(防止共享)
+- 在线激活(MVP)或离线激活(V2)
+
+**性能优化:**
+- GPU 预热:启动时加载模型到显存
+- 内存管理:大文件流式处理,避免全部加载到内存
+- 多线程:UI 线程与翻译线程分离
+
+## Project Scoping & Phased Development
+
+### MVP Strategy & Philosophy
+
+**MVP 方法:问题解决型 (Problem-Solving MVP)**
+- 核心目标:验证"本地 GPU 翻译能否满足网文出海需求"
+- 目标用户:早期采用者 — 对数据安全敏感的网文作者
+- 成功标准:用户完成端到端翻译,愿意付费
+
+**MVP 哲学:**
+- **专注核心价值**:一键完成 500 万字翻译,术语统一
+- **技术验证优先**:验证 GPU 翻译质量、术语锁定机制、Crash-Safe 可靠性
+- **快速迭代**:3 个月 MVP,6 个月 V2,12 个月 V3
+
+**资源需求:**
+- 团队规模:2-3 人(1 全栈 + 1 ML/后端 + 1 QA 兼职)
+- 技能栈:Python、PyQt6、CTRanslate2、CUDA、REST API
+- 开发周期:12 周(2 周设计 + 8 周开发 + 2 周测试)
+
+---
+
+### MVP Feature Set (Phase 1)
+
+**核心用户旅程支持:**
+- ✅ Journey 1:首次使用 - 完整端到端翻译
+- ✅ Journey 2:续更翻译 - 增量翻译
+- ✅ Journey 3:崩溃恢复 - Crash-Safe 断点续传
+- ✅ Journey 4:术语校准 - 术语预览与编辑
+- ⚠️ Journey 5:失败处理 - 基础重试(P1 优先级)
+
+**六大核心模块(P0 必需):**
+
+| 模块 | 功能 | 验收标准 |
+|------|------|----------|
+| **指纹机制** | MD5 查重 + work_id | 防止重复处理 |
+| **清洗模块** | 章节识别 + 900 字符分段 | 0 断章,0 漏章 |
+| **术语提取** | Top200 自动提取 | ≥95% 核心术语覆盖 |
+| **翻译模块** | m2m100 + CUDA 加速 | ≥5000 字符/分钟 |
+| **上传模块** | 逐章上传 + 扣费 | API 调用成功率 ≥99% |
+| **任务调度** | Pause/Resume/Crash-Safe | 断电后可恢复 |
+
+**用户界面(P0 最小可用):**
+
+| 功能 | 描述 | 优先级 |
+|------|------|--------|
+| GPU 检测 | 启动时检测 GPU 可用性 | P0 |
+| 文件导入 | 拖入 TXT 文件 | P0 |
+| 进度显示 | 实时进度条 + 预计时间 | P0 |
+| 完成通知 | 桌面通知 | P0 |
+| 术语预览 | 翻译前预览术语列表 | P0 |
+| 术语编辑 | 手动修改术语翻译 | P0 |
+
+**平台支持(MVP 限制):**
+- ✅ Windows 10/11(主要市场)
+- ❌ macOS 支持(移至 V2)
+- ❌ Linux 支持(不考虑)
+
+---
+
+### Out of Scope (MVP 明确不做)
+
+**明确排除的功能(避免范围蔓延):**
+
+| 功能 | 排除原因 | 计划版本 |
+|------|----------|----------|
+| 多语言支持(非中→英) | 聚焦核心场景 | V2 |
+| 多文件批量处理 | 用户需求待验证 | V2 |
+| 用户术语表导入/导出 | MVP 内置提取足够 | V2 |
+| 平台 API 直接对接 | 依赖平台合作 | V3 |
+| 协作功能 | B2C 产品优先 | V3 |
+| macOS 支持 | 市场份额验证 | V2 |
+| CPU fallback | 性能无法保证 | 永久不做 |
+| 在线翻译备选 | 与本地定位冲突 | 永远不做 |
+
+---
+
+### Post-MVP Features
+
+**Phase 2: Growth (V2 - MVP 后 6 个月)**
+
+**目标:** 扩大用户群体,提升产品竞争力
+
+| 功能类别 | 具体功能 | 用户价值 |
+|----------|----------|----------|
+| **平台扩展** | macOS 12+ 支持 | 覆盖 Mac 用户 |
+| **语言扩展** | 中→日/韩/西语 | 拓展海外市场 |
+| **效率提升** | 批量多文件处理 | 工作室需求 |
+| **术语管理** | 用户术语表导入/导出 | 系列作品一致性 |
+| **质量优化** | 翻译记忆库 | 提升翻译质量 |
+
+**Phase 3: Expansion (V3 - MVP 后 12 个月)**
+
+**目标:** 构建平台生态,深化护城河
+
+| 功能类别 | 具体功能 | 用户价值 |
+|----------|----------|----------|
+| **AI 增强** | AI 辅助润色 | 减少人工编辑 |
+| **平台对接** | Webnovel/Wattpad/Royal Road API | 一键发布 |
+| **协作功能** | 多译者协作 + 审阅流程 | 团队翻译 |
+| **社区功能** | 术语表共享市场 | 网络效应 |
+
+---
+
+### Risk Mitigation Strategy
+
+**技术风险:**
+
+| 风险 | 概率 | 影响 | 缓解措施 |
+|------|------|------|----------|
+| GPU 翻译质量不达标 | 中 | 高 | MVP 原型验证;保留人工编辑入口 |
+| CUDA 兼容性问题 | 低 | 中 | 明确硬件要求;GPU 检测提示 |
+| 术语锁定引入错误 | 低 | 中 | 术语预览;用户可编辑 |
+
+**市场风险:**
+
+| 风险 | 概率 | 影响 | 缓解措施 |
+|------|------|------|----------|
+| 作者不愿付费 | 中 | 高 | 免费试用(10 万字);按量计费降低门槛 |
+| 网文平台自建翻译 | 低 | 中 | 专注长尾作者;快速建立用户习惯 |
+| GPU 普及率不足 | 低 | 中 | 明确系统要求;目标用户筛选 |
+
+**资源风险:**
+
+| 风险 | 概率 | 影响 | 缓解措施 |
+|------|------|------|----------|
+| 开发周期延长 | 中 | 中 | MVP 功能裁剪;分阶段发布 |
+| 团队规模不足 | 低 | 高 | 外包非核心模块(如安装包制作) |
+| 模型下载流量成本 | 中 | 低 | CDN 加速;增量更新 |
+
+---
+
+### Development Phases Summary
+
+| 阶段 | 周期 | 核心交付 | 成功指标 |
+|------|------|----------|----------|
+| **Phase 0: 设计** | 2 周 | 技术方案验证 | 原型可运行 |
+| **Phase 1: MVP** | 10 周 | 可发布的 Windows 版 | 100 用户试用 |
+| **Phase 2: Growth** | 6 个月 | macOS + 多语言 | 60% 留存率 |
+| **Phase 3: Expansion** | 12 个月 | 平台生态 | NPS ≥ 40 |
+
+## Functional Requirements
+
+> **能力契约声明:** 此功能需求列表是产品能力的正式定义。任何未在此列表中列出的功能将不会出现在最终产品中,除非我们明确添加。
+
+### 文件处理与指纹识别
+
+- **FR1**: 系统能够读取用户导入的 TXT 格式网文文件
+- **FR2**: 系统能够从 TXT 文件第一章提取内容并计算 MD5 指纹
+- **FR3**: 系统能够通过 API 检查指纹是否已存在于服务器数据库
+- **FR4**: 系统能够为首次处理的作品生成唯一 work_id 标识符
+- **FR5**: 系统能够检测续更作品(已存在 work_id)并仅处理新增章节
+- **FR6**: 系统能够在网络错误时自动重试 API 调用
+
+### 内容清洗与结构化
+
+- **FR7**: 系统能够识别 TXT 文件中的章节标题(兼容多种格式)
+- **FR8**: 系统能够清洗正文格式(合并空行、统一缩进、压缩空格)
+- **FR9**: 系统能够将清洗后的内容按固定长度分段(避免句子中间断开)
+- **FR10**: 系统能够将清洗后的数据输出为结构化 JSON 格式
+- **FR11**: 系统能够使用原子写机制保存清洗数据(防止断电损坏)
+
+### 术语提取与管理
+
+- **FR12**: 系统能够从全文中提取候选术语(中文 2-6 字、英文大写开头)
+- **FR13**: 系统能够统计每个术语的出现频次和跨章分布
+- **FR14**: 系统能够根据频次和分布筛选核心术语(Top200)
+- **FR15**: 系统能够向用户预览提取的术语列表及其建议翻译
+- **FR16**: 用户能够手动编辑术语翻译并锁定
+- **FR17**: 系统能够复用已翻译作品的术语库处理续更内容
+
+### AI 翻译处理
+
+- **FR18**: 系统能够使用本地 GPU 加速的 m2m100 模型进行中译英翻译
+- **FR19**: 系统能够在翻译前将核心术语替换为占位符
+- **FR20**: 系统能够在翻译后将占位符还原为锁定的术语翻译
+- **FR21**: 系统能够批量处理多个分段以提高 GPU 利用率
+- **FR22**: 系统能够在批量翻译失败时降级为单条翻译
+- **FR23**: 系统能够记录翻译失败的项目到失败清单
+
+### 内容上传与发布
+
+- **FR24**: 系统能够将同一章节的分段合并为完整章节
+- **FR25**: 系统能够逐章调用上传 API 发布翻译内容
+- **FR26**: 系统能够在上传前根据章节字数计算并扣除 CU 费用
+- **FR27**: 系统能够在上传失败时自动重试
+- **FR28**: 系统能够记录上传失败的章节并提供批量重试
+- **FR29**: 系统能够标记缺失分段的章节为不完整状态
+
+### 任务调度与状态管理
+
+- **FR30**: 系统能够显示翻译任务进度(当前章节/总章节)
+- **FR31**: 系统能够响应用户暂停请求立即中断翻译任务
+- **FR32**: 系统能够从暂停点或崩溃点恢复翻译任务
+- **FR33**: 系统能够在任务执行过程中持续保存进度状态
+- **FR34**: 系统能够在启动时检测并提示用户未完成的任务
+- **FR35**: 系统能够显示任务预计完成时间
+
+### 用户界面与交互
+
+- **FR36**: 系统能够在启动时检测 GPU 可用性并显示状态
+- **FR37**: 用户能够通过拖放方式导入 TXT 文件
+- **FR38**: 系统能够在导入后显示作品预览信息(章节数、术语数、预计时间)
+- **FR39**: 系统能够在翻译完成后发送桌面通知
+- **FR40**: 系统能够最小化到系统托盘并在后台运行
+- **FR41**: 用户能够查看历史任务记录和日志
+
+### 数据安全与合规
+
+- **FR42**: 系统能够全流程在本地处理翻译任务(不上传原始内容)
+- **FR43**: 系统能够在生成的翻译内容中添加"Translated by 序灵 Matrix 助手"标识
+- **FR44**: 系统能够声明用户需拥有内容翻译权和发布权
+- **FR45**: 系统能够将用户数据本地存储(不上传云端)
+
+### 离线与网络处理
+
+- **FR46**: 系统能够在网络断开时继续执行本地翻译任务
+- **FR47**: 系统能够检测网络连接状态并显示给用户
+- **FR48**: 系统能够将网络断开期间的上传任务保存到队列
+- **FR49**: 系统能够在网络恢复时自动执行队列中的上传任务
+
+### 软件更新与维护
+
+- **FR50**: 系统能够在启动时检查是否有新版本可用
+- **FR51**: 系统能够向用户通知新版本的发布说明
+- **FR52**: 系统能够记录应用日志用于问题诊断
+
+## Non-Functional Requirements
+
+### Performance
+
+**翻译性能:**
+- **NFR-P1**: 翻译速度 ≥ 5000 字符/分钟(基于 RTX 3060 基准 GPU)
+- **NFR-P2**: GPU 利用率 ≥ 80%(非空闲处理状态)
+- **NFR-P3**: 内存占用 < 4 GB(不含模型文件)
+
+**响应时间:**
+- **NFR-P4**: 应用启动时间 < 10 秒(GPU 检测 + 模型加载)
+- **NFR-P5**: Pause 命令响应时间 < 1 秒(立即中断)
+- **NFR-P6**: 用户界面操作响应 < 200 毫秒(无卡顿感知)
+
+**批处理能力:**
+- **NFR-P7**: 支持单文件 ≥ 500 万字处理
+- **NFR-P8**: 支持同时加载 ≥ 10 个作品记录
+
+### Reliability
+
+**数据完整性:**
+- **NFR-R1**: 数据完整性 100%(原子写机制保证)
+- **NFR-R2**: 崩溃恢复率 99.9%(Crash-Safe 机制)
+- **NFR-R3**: 进度保存频率:每完成一个章节
+
+**服务可用性:**
+- **NFR-R4**: 上传成功率 ≥ 99%(含自动重试 1 次)
+- **NFR-R5**: 网络错误自动重试间隔:2 秒
+- **NFR-R6**: API 调用超时:30 秒
+
+**错误处理:**
+- **NFR-R7**: 所有失败项记录到失败清单(JSONL 格式)
+- **NFR-R8**: 失败清单写盘边界:每 10 个失败项或章节切换时
+
+### Usability
+
+**学习成本:**
+- **NFR-U1**: 零学习成本 — 新用户拖入 TXT 即可开始翻译
+- **NFR-U2**: 新用户 5 分钟内完成首次翻译(从启动到生成英文版)
+- **NFR-U3**: 无需阅读用户手册完成核心功能
+
+**界面清晰度:**
+- **NFR-U4**: 错误信息清晰可懂,包含解决建议
+- **NFR-U5**: 进度显示包含:当前章节/总章节/预计完成时间
+- **NFR-U6**: GPU 不可用时明确提示升级硬件
+
+**操作效率:**
+- **NFR-U7**: 续更作品自动识别,无需手动配置
+- **NFR-U8**: 术语预览界面支持批量编辑
+
+### Security
+
+**数据保护:**
+- **NFR-S1**: 100% 本地处理翻译内容(不上传原始文本)
+- **NFR-S2**: work_id MD5 仅用于指纹查重,不包含原文内容
+- **NFR-S3**: 用户术语表本地存储(不上传云端)
+
+**版权合规:**
+- **NFR-S4**: 生成翻译内容添加"Translated by 序灵 Matrix 助手"标识
+- **NFR-S5**: 用户需确认拥有内容翻译权和发布权
+
+**许可证管理:**
+- **NFR-S6**: 硬件指纹绑定(防止密钥共享)
+- **NFR-S7**: 在线激活验证(MVP)或离线激活(V2)
+
+### Compatibility
+
+**平台支持:**
+- **NFR-C1**: Windows 10/11(64 位)- MVP 唯一支持平台
+- **NFR-C2**: Windows 7/8 不支持(明确提示升级)
+
+**硬件要求:**
+- **NFR-C3**: NVIDIA GPU(GTX 1650 或更高,4GB VRAM)
+- **NFR-C4**: CUDA 11.0 或更高版本
+- **NFR-C5**: CPU 4 核 2.0 GHz 或更高
+- **NFR-C6**: 内存 8 GB(推荐 16 GB)
+- **NFR-C7**: 存储 10 GB 可用空间
+
+**运行时依赖:**
+- **NFR-C8**: Python 3.11 运行时(打包在安装包中)
+- **NFR-C9**: 零授权费依赖(requests MIT 许可)
+
+**GPU 支持矩阵:**
+
+| GPU 系列 | 支持 | 最低性能 | 备注 |
+|----------|------|----------|------|
+| RTX 40 系列 | ✅ | ≥ 8000 字符/分 | 最高性能 |
+| RTX 30 系列 | ✅ | ≥ 5000 字符/分 | 标准配置 |
+| GTX 16 系列 | ✅ | ≥ 3000 字符/分 | 入门配置 |
+| GTX 10 系列 | ⚠️ | ≥ 1500 字符/分 | 降级支持 |
+| 无 NVIDIA GPU | ❌ | N/A | 明确提示不支持 |
+
+### Maintainability
+
+**日志记录:**
+- **NFR-M1**: 所有操作记录到日志文件(轮转,最大 100MB)
+- **NFR-M2**: 日志级别:DEBUG/INFO/WARNING/ERROR
+- **NFR-M3**: 任务历史记录包含:开始时间/结束时间/状态/错误信息
+
+**诊断支持:**
+- **NFR-M4**: 支持导出诊断包(日志 + 配置 + 进度文件)
+- **NFR-M5**: GPU 信息显示:名称/VRAM/驱动版本/CUDA 版本
+
+---
+
+## Data Models
+
+### progress.json
+
+任务进度状态文件,用于 Crash-Safe 恢复:
+
+```json
+{
+  "work_id": "uuid-v4",
+  "fingerprint": "md5hash",
+  "current_chapter": 123,
+  "current_part": 2,
+  "status": "running|paused|completed|failed",
+  "updated_at": "2026-03-13T12:00:00Z",
+  "total_chapters": 1500,
+  "total_parts": 4500
+}
+```
+
+### novel_cleaned.json
+
+清洗后的结构化章节数据:
+
+```json
+{
+  "chapters": [
+    {
+      "chapter_id": "Chapter 0001",
+      "part_index": 0,
+      "title_src": "第1章 礼物",
+      "content": "清洗后内容..."
+    },
+    {
+      "chapter_id": "Chapter 0001",
+      "part_index": 1,
+      "title_src": "第1章 礼物",
+      "content": "更多内容..."
+    }
+  ]
+}
+```
+
+### terms_temp.json
+
+术语提取结果(Top200):
+
+```json
+{
+  "terms": [
+    {
+      "term": "叶凡",
+      "translation": "Ye Fan",
+      "count": 124,
+      "chapters": 87
+    },
+    {
+      "term": "逍遥派",
+      "translation": "Xiaoyao Sect",
+      "count": 56,
+      "chapters": 42
+    }
+  ]
+}
+```
+
+### novel_translated.json
+
+翻译结果数据:
+
+```json
+{
+  "chapters": [
+    {
+      "chapter_id": "Chapter 0001",
+      "part_index": 0,
+      "title_src": "第1章 礼物",
+      "title_en": "Chapter 1: The Gift",
+      "content": "中文内容",
+      "content_en": "English content..."
+    }
+  ]
+}
+```
+
+### upload_failed.jsonl
+
+上传失败清单(JSONL 格式,每行一个失败项):
+
+```jsonl
+{"chapter_id": "Chapter 0892", "part_index": 0, "error": "Connection timeout", "retry_count": 1}
+{"chapter_id": "Chapter 0893", "part_index": 0, "error": "Connection timeout", "retry_count": 1}
+```
+
+---
+
+## Appendix
+
+### Glossary
+
+| 术语 | 定义 |
+|------|------|
+| **CU** | Chapter Unit,章节字数÷100 向上取整,计费单位 |
+| **work_id** | 作品唯一标识符,基于第一章 MD5 生成 |
+| **术语锁定** | 使用占位符替换机制确保全书术语翻译一致 |
+| **Crash-Safe** | 原子写机制保证断电/崩溃不丢失进度 |
+| **定长分段** | 900 字符基准分段,适配 GPU 批处理 |
+| **Pause/Resume** | 任务暂停和恢复功能,章节级断点 |
+| **失败清单** | 记录翻译/上传失败项目的 JSONL 文件 |
+
+### References
+
+**技术栈参考:**
+- CTranslate2: https://opennmt.net/CTranslate2/
+- m2m100 模型: https://huggingface.co/facebook/m2m100_418M
+- PyQt6 文档: https://www.riverbankcomputing.com/static/Docs/PyQt6/
+- CUDA 文档: https://developer.nvidia.com/cuda-toolkit
+
+**竞品参考:**
+- Google Translate: https://translate.google.com
+- DeepL: https://www.deepl.com
+- SDL Trados: https://www.trados.com
+
+**行业标准:**
+- WCAG 2.1: Web 内容无障碍指南
+- ISO 9241-210: 以人为中心交互系统设计
+
+---
+
+**文档版本:** 1.0
+**最后更新:** 2026-03-13
+**文档状态:** ✅ 完成
+
+---
+
+# PRD Workflow Completion
+
+**创建日期:** 2026-03-13
+**工作流版本:** BMAD PRD Workflow
+**项目名称:** 序灵 Matrix 助手
+
+## 工作流完成摘要
+
+✅ **PRD 创建工作流已成功完成**
+
+**已完成步骤:**
+1. ✅ Workflow Initialization (step-01-init)
+2. ✅ Project Discovery (step-02-discovery)
+3. ✅ Product Vision Discovery (step-02b-vision)
+4. ✅ Executive Summary Generation (step-02c-executive-summary)
+5. ✅ Success Criteria Definition (step-03-success)
+6. ✅ User Journey Mapping (step-04-journeys)
+7. ✅ Domain-Specific Requirements (step-05-domain)
+8. ✅ Innovation Discovery (step-06-innovation)
+9. ✅ Project-Type Deep Dive (step-07-project-type)
+10. ✅ Scoping Exercise (step-08-scoping)
+11. ✅ Functional Requirements Synthesis (step-09-functional)
+12. ✅ Non-Functional Requirements (step-10-nonfunctional)
+13. ✅ Document Polish (step-11-polish)
+14. ✅ Workflow Completion (step-12-complete)
+
+## 交付成果
+
+**文档位置:** `/mnt/code/223-236-template-6/planning-artifacts/prd.md`
+
+**包含内容:**
+- Executive Summary(执行摘要)
+- Success Criteria(成功标准 - 用户/业务/技术)
+- Product Scope(产品范围 - MVP/Growth/Vision)
+- User Journeys(用户旅程 - 5个完整场景)
+- Domain-Specific Requirements(领域需求 - 六大核心模块规格)
+- Innovation & Novel Patterns(创新分析)
+- Desktop App Specific Requirements(桌面应用特定需求)
+- Project Scoping & Phased Development(范围界定)
+- Functional Requirements(功能需求 - 52项)
+- Non-Functional Requirements(非功能需求 - 性能/可靠性/可用性/安全/兼容性)
+- Data Models(数据模型 - 5个)
+- Appendix(附录 - 术语表/参考文档)
+
+## 下一步建议
+
+**选项 1:验证 PRD 完整性**
+```
+使用 bmad-check-implementation-readiness 技能
+验证 PRD 是否包含开始实现所需的所有信息
+```
+
+**选项 2:创建架构设计**
+```
+使用 bmad-create-architecture 技能
+基于 PRD 创建技术架构设计方案
+```
+
+**选项 3:创建 UX 设计**
+```
+使用 bmad-create-ux-design 技能
+基于用户旅程创建交互设计规范
+```
+
+**选项 4:分解 Epic 和 Story**
+```
+使用 bmad-create-epics-and-stories 技能
+将功能需求分解为可执行的 Epic 和 User Story
+```
+
+**选项 5:项目文档**
+```
+使用 bmad-generate-project-context 技能
+为项目创建 AI 上下文文件
+```
+
+---
+
+**恭喜!序灵 Matrix 助手的 PRD 文档创建完成!** 🎉
+

+ 433 - 0
planning-artifacts/ux-wireframes.md

@@ -0,0 +1,433 @@
+# 序灵 Matrix 助手 - UX 低保真线框图
+
+本文档描述序灵 Matrix 助手的关键界面线框图布局。
+
+---
+
+## 1. 主窗口布局 (Main Window)
+
+**用途**:应用主界面,展示所有已导入的作品
+
+```
+┌─────────────────────────────────────────────────────────────────────────────┐
+│  文件    编辑    设置    帮助                                                    │
+├─────────────────────────────────────────────────────────────────────────────┤
+│                                                                              │
+│  ┌─────────────────────────┐  ┌────────────────────────────────────────────┐ │
+│  │     作品列表             │  │            作品详情                          │ │
+│  ├─────────────────────────┤  ├────────────────────────────────────────────┤ │
+│  │ ┌─────────────────────┐ │  │                                            │ │
+│  │ │ 三体                 │ │  │  作品名称: 三体                            │ │
+│  │ │ 刘慈欣               │ │  │  作者: 刘慈欣                              │ │
+│  │ │ 30章 | 翻译中...     │ │  │  总章节数: 30                              │ │
+│  │ └─────────────────────┘ │  │  总字数: 300,000                           │ │
+│  │                         │  │  翻译状态: 进行中                           │ │
+│  │ ┌─────────────────────┐ │  │  目标语言: English                          │ │
+│  │ │ 球状闪电             │ │  │                                            │ │
+│  │ │ 刘慈欣               │ │  │  ┌──────────────────────────────────────┐  │ │
+│  │ │ 18章 | 已完成        │ │ │  │  翻译进度                               │  │ │
+│  │ └─────────────────────┘ │ │  │  ████████████░░░░░░░░ 60%              │  │ │
+│  │                         │ │  └──────────────────────────────────────┘  │ │
+│  │ ┌─────────────────────┐ │  │                                            │ │
+│  │ │ [+] 导入新作品        │ │  │  章节状态:                                 │ │
+│  └─────────────────────────┘ │  │    ✓ 第1-18章 已完成                      │ │
+│                              │  │    → 第19章 翻译中...                      │ │
+│                              │  │    ○ 第20-30章 等待中                      │ │
+│                              │  │                                            │ │
+│                              │  │  [ 打开工作台 ]  [ 重新翻译 ]              │ │
+│                              │  └────────────────────────────────────────────┘ │
+└─────────────────────────────────────────────────────────────────────────────┘
+```
+
+**布局说明**:
+- **左侧作品列表**(占宽度 30%):卡片式列表,显示作品封面/标题、作者、章节数和状态
+- **右侧详情面板**(占宽度 70%):显示选中作品的完整信息和操作按钮
+- **顶部菜单栏**:全局操作入口
+
+---
+
+## 2. 导入文件界面 (Import File Dialog)
+
+**用途**:导入新的待翻译作品文件
+
+```
+┌─────────────────────────────────────────────────────────────────────────────┐
+│                                   导入作品                                     │
+├─────────────────────────────────────────────────────────────────────────────┤
+│                                                                              │
+│  ┌────────────────────────────────────────────────────────────────────────┐  │
+│  │                                                                        │  │
+│  │     ┌────────────────┐                                                │  │
+│  │     │                │                                                │  │
+│  │     │   📁           │   点击或拖拽文件到此处                           │  │
+│  │     │  选择文件      │   支持 .epub, .txt, .docx 格式                  │  │
+│  │     │                │                                                │  │
+│  │     └────────────────┘                                                │  │
+│  │                                                                        │  │
+│  └────────────────────────────────────────────────────────────────────────┘  │
+│                                                                              │
+│  ┌────────────────────────────────────────────────────────────────────────┐  │
+│  │  文件预览                                                                │  │
+│  │  ────────────────────────────────────────────────────────────────────  │  │
+│  │                                                                          │  │
+│  │  文件名: 三体第一部.epub                                                  │  │
+│  │  文件大小: 2.4 MB                                                        │  │
+│  │  检测到章节数: 30 章                                                     │  │
+│  │  总字数: 约 300,000 字                                                   │  │
+│  │  编码: UTF-8                                                             │  │
+│  │                                                                          │  │
+│  └────────────────────────────────────────────────────────────────────────┘  │
+│                                                                              │
+│  ┌────────────────────────────────────────────────────────────────────────┐  │
+│  │  翻译设置                                                                │  │
+│  │  ────────────────────────────────────────────────────────────────────  │  │
+│  │                                                                          │  │
+│  │  目标语言: [ English ▼ ]                                                 │  │
+│  │  翻译模型: [ Claude Sonnet 4 ▼ ]                                        │  │
+│  │  输出目录: [ ~/Documents/Translated/...  ] [ 浏览... ]                  │  │
+│  │                                                                          │  │
+│  └────────────────────────────────────────────────────────────────────────┘  │
+│                                                                              │
+│                                        [ 取消 ]  [ 导入并开始翻译 ]           │
+│                                                                              │
+└─────────────────────────────────────────────────────────────────────────────┘
+```
+
+**布局说明**:
+- 居中对话框,固定宽度约 600px
+- 拖拽区域突出显示
+- 文件预览区域在确认文件后显示
+- 底部翻译设置可折叠展开
+
+---
+
+## 3. 翻译进度界面 (Translation Progress)
+
+**用途**:实时显示翻译进度和状态
+
+```
+┌─────────────────────────────────────────────────────────────────────────────┐
+│  三体 - 翻译进度                                              [ × ]           │
+├─────────────────────────────────────────────────────────────────────────────┤
+│                                                                              │
+│  整体进度                                                                    │
+│  ┌────────────────────────────────────────────────────────────────────────┐  │
+│  │  ████████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  45% │  │
+│  │                                                                           │  │
+│  │  已完成: 13/30 章节    |    已处理: 156,789/300,000 字                    │  │
+│  └────────────────────────────────────────────────────────────────────────┘  │
+│                                                                              │
+│  当前阶段                                                                    │
+│  ┌────────────────────────────────────────────────────────────────────────┐  │
+│  │                                                                           │  │
+│  │  ✓ 指纹提取    已完成 (30/30)                                            │  │
+│  │  ✓ 文本清洗    已完成 (30/30)                                            │  │
+│  │  ✓ 术语提取    已完成 (30/30)                                            │  │
+│  │  → 翻译处理    进行中... (13/30)                                         │  │
+│  │     └─ 当前: 第13章 - 三体、红岸之一                                     │  │
+│  │  ○ 文件上传    等待中                                                   │  │
+│  │                                                                           │  │
+│  └────────────────────────────────────────────────────────────────────────┘  │
+│                                                                              │
+│  章节状态                                                                    │
+│  ┌────────────────────────────────────────────────────────────────────────┐  │
+│  │  第1章   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  ✓ 已完成              │  │
+│  │  第2章   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  ✓ 已完成              │  │
+│  │  第3章   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  ✓ 已完成              │  │
+│  │  ...                                                                        │  │
+│  │  第12章  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  ✓ 已完成              │  │
+│  │  第13章  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  → 翻译中 67%          │  │
+│  │  第14章  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  ○ 等待中              │  │
+│  │  第15章  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  ○ 等待中              │  │
+│  │  ...                                                                        │  │
+│  │                                                                           │  │
+│  │  [ 查看完整章节列表 ]                                                     │  │
+│  └────────────────────────────────────────────────────────────────────────┘  │
+│                                                                              │
+│                            [ 暂停 ]  [ 打开工作台 ]                           │
+│                                                                              │
+└─────────────────────────────────────────────────────────────────────────────┘
+```
+
+**布局说明**:
+- 顶部显示整体进度条和统计数据
+- 中间显示处理阶段流程图
+- 底部显示章节状态列表(可滚动)
+- 右上角关闭按钮(最小化而非真正关闭)
+
+---
+
+## 4. 工作台界面 (Workbench)
+
+**用途**:处理失败的翻译任务,支持重试和手动编辑
+
+```
+┌─────────────────────────────────────────────────────────────────────────────┐
+│  三体 - 工作台                                                   [ 返回 ]     │
+├─────────────────────────────────────────────────────────────────────────────┤
+│                                                                              │
+│  ┌───────────────────────────────────────┐  ┌──────────────────────────────┐ │
+│  │      问题章节列表                      │  │      章节编辑器              │ │
+│  ├───────────────────────────────────────┤  ├──────────────────────────────┤ │
+│  │                                       │  │                              │ │
+│  │  筛选: [ 全部 ▼ ]  [ 仅失败 ]         │  │  第13章 - 三体、红岸之一     │ │
+│  │                                       │  │  ─────────────────────────   │ │
+│  │  ┌─────────────────────────────────┐  │  │                              │ │
+│  │  │ 第13章                          │  │  │  原文                        │ │
+│  │  │ 状态: ❌ API错误                │  │  │  ┌────────────────────────┐  │ │
+│  │  │ 重试: 2次                       │  │  │  │                       │  │ │
+│  │  └─────────────────────────────────┘  │  │  │ 中国科学院某研究所...   │  │ │
+│  │                                       │  │  │                       │  │ │
+│  │  ┌─────────────────────────────────┐  │  │  │                       │  │ │
+│  │  │ 第27章                          │  │  │  │                       │  │ │
+│  │  │ 状态: ❌ 超时                   │  │  │  └────────────────────────┘  │ │
+│  │  │ 重试: 1次                       │  │  │                              │ │
+│  │  └─────────────────────────────────┘  │  │  译文                        │ │
+│  │                                       │  │  ┌────────────────────────┐  │ │
+│  │  ┌─────────────────────────────────┐  │  │  │                       │  │ │
+│  │  │ 第28章                          │  │  │  │ Institute of Chinese... │  │ │
+│  │  │ 状态: ⚠️ 术语冲突               │  │  │  │                       │  │ │
+│  │  │ 重试: 0次                       │  │  │  │                       │  │ │
+│  │  └─────────────────────────────────┘  │  │  └────────────────────────┘  │ │
+│  │                                       │  │                              │ │
+│  │                                       │  │  ┌────────────────────────┐  │ │
+│  │  批量操作:                           │  │  │ 修改后的译文            │  │ │
+│  │  [ 全部重试 ]  [ 导出失败列表 ]      │  │  │ ┌────────────────────┐  │  │ │
+│  │                                       │  │  │ │                    │  │  │ │
+│  └───────────────────────────────────────┘  │  │ │                    │  │  │ │
+│                                              │  │ └────────────────────┘  │  │ │
+│                                              │  └────────────────────────┘  │ │
+│                                              │                              │ │
+│                                              │  错误信息:                   │ │
+│                                              │  ┌────────────────────────┐  │ │
+│                                              │  │ APIError: Rate limit   │  │ │
+│                                              │  │ exceeded. Retry after  │  │ │
+│                                              │  │ 30 seconds.            │  │ │
+│                                              │  └────────────────────────┘  │ │
+│                                              │                              │ │
+│                                              │  [ 重新翻译 ] [ 保存修改 ]   │ │
+│                                              └──────────────────────────────┘ │
+│                                                                              │
+└─────────────────────────────────────────────────────────────────────────────┘
+```
+
+**布局说明**:
+- **左侧列表**(占宽度 35%):显示有问题的章节,支持筛选
+- **右侧编辑器**(占宽度 65%):显示原文、译文、错误信息和操作按钮
+- 支持对比查看原文和译文
+- 可以手动编辑译文并保存
+
+---
+
+## 5. 设置界面 (Settings)
+
+**用途**:配置应用参数和 API 设置
+
+```
+┌─────────────────────────────────────────────────────────────────────────────┐
+│  设置                                                           [ 保存 ] [×]│
+├─────────────────────────────────────────────────────────────────────────────┤
+│                                                                              │
+│  ┌────────────────────────────────────────────────────────────────────────┐  │
+│  │  通用设置                                                               │  │
+│  │  ────────────────────────────────────────────────────────────────────  │  │
+│  │                                                                          │  │
+│  │  界面语言:    [ 简体中文 ▼ ]                                            │  │
+│  │  主题:        [ 系统默认 ▼ ]  [ 浅色 ]  [ 深色 ]                       │  │
+│  │  默认输出目录: [ ~/Documents/Matrix翻译/          ] [ 浏览... ]         │  │
+│  │  自动保存:    [✓]                                                       │  │
+│  │                                                                          │  │
+│  └────────────────────────────────────────────────────────────────────────┘  │
+│                                                                              │
+│  ┌────────────────────────────────────────────────────────────────────────┐  │
+│  │  API 配置                                                               │  │
+│  │  ────────────────────────────────────────────────────────────────────  │  │
+│  │                                                                          │  │
+│  │  ┌────────────────────────────────────────────────────────────────┐    │  │
+│  │  │  Anthropic Claude API                                            │    │  │
+│  │  ├────────────────────────────────────────────────────────────────┤    │  │
+│  │  │  API Key:    [•••••••••••••••••••••••••••••••           ] [ 验证 ]│    │  │
+│  │  │  Base URL:   [ https://api.anthropic.com            ]           │    │  │
+│  │  │  模型:       [ Claude Sonnet 4.1 ▼ ]                              │    │  │
+│  │  └────────────────────────────────────────────────────────────────┘    │  │
+│  │                                                                          │  │
+│  │  ┌────────────────────────────────────────────────────────────────┐    │  │
+│  │  │  OpenAI API                                                      │    │  │
+│  │  ├────────────────────────────────────────────────────────────────┤    │  │
+│  │  │  API Key:    [•••••••••••••••••••••••••••••••           ] [ 验证 ]│    │  │
+│  │  │  Base URL:   [ https://api.openai.com               ]           │    │  │
+│  │  │  模型:       [ GPT-4o ▼ ]                                        │    │  │
+│  │  └────────────────────────────────────────────────────────────────┘    │  │
+│  │                                                                          │  │
+│  │  [+ 添加自定义 API]                                                     │  │
+│  └────────────────────────────────────────────────────────────────────────┘  │
+│                                                                              │
+│  ┌────────────────────────────────────────────────────────────────────────┐  │
+│  │  翻译设置                                                               │  │
+│  │  ────────────────────────────────────────────────────────────────────  │  │
+│  │                                                                          │  │
+│  │  并发数:      [ 4 ] 个章节同时翻译                                       │  │
+│  │  重试次数:    [ 3 ] 次失败后标记为错误                                   │  │
+│  │  超时时间:    [ 120 ] 秒                                               │  │
+│  │  批量大小:    [ 5000 ] 字/段                                           │  │
+│  │                                                                          │  │
+│  └────────────────────────────────────────────────────────────────────────┘  │
+│                                                                              │
+│  ┌────────────────────────────────────────────────────────────────────────┐  │
+│  │  高级设置                                                               │  │
+│  │  ────────────────────────────────────────────────────────────────────  │  │
+│  │                                                                          │  │
+│  │  GPU 加速:    [✓] 启用本地推理加速                                      │  │
+│  │  缓存目录:    [ ~/.cache/matrix/                      ] [ 浏览... ]     │  │
+│  │  日志级别:    [ INFO ▼ ]  [ DEBUG ]  [ WARNING ]  [ ERROR ]           │  │
+│  │  代理设置:    [ http://proxy.example.com:8080         ]                 │  │
+│  │                                                                          │  │
+│  └────────────────────────────────────────────────────────────────────────┘  │
+│                                                                              │
+│  ┌────────────────────────────────────────────────────────────────────────┐  │
+│  │  术语库                                                                 │  │
+│  │  ────────────────────────────────────────────────────────────────────  │  │
+│  │                                                                          │  │
+│  │  自定义术语库: [ ~/Documents/terminology.json      ] [ 浏览... ]       │  │
+│  │  [ 编辑术语库 ]  [ 从文件导入 ]                                          │  │
+│  │                                                                          │  │
+│  └────────────────────────────────────────────────────────────────────────┘  │
+│                                                                              │
+│                                        [ 重置默认 ]  [ 保存并关闭 ]          │
+│                                                                              │
+└─────────────────────────────────────────────────────────────────────────────┘
+```
+
+**布局说明**:
+- 分组显示不同类别的设置
+- API 配置支持多个提供商
+- 敏感信息(如 API Key)默认隐藏
+- 所有设置即时生效或需要点击保存按钮
+
+---
+
+## 6. 辅助界面
+
+### 6.1 术语库编辑器
+
+```
+┌─────────────────────────────────────────────────────────────────────────────┐
+│  术语库编辑器 - 三体                                          [ 保存 ] [×]  │
+├─────────────────────────────────────────────────────────────────────────────┤
+│                                                                              │
+│  ┌────────────────────────────────────────────────────────────────────────┐  │
+│  │  搜索: [ 搜素术语...                            ]  [ 添加新术语 ]        │  │
+│  ├────────────────────────────────────────────────────────────────────────┤  │
+│  │                                                                           │  │
+│  │  原文        │  译文 (English)     │  上下文      │  操作               │  │
+│  │  ────────────┼─────────────────────┼─────────────┼───────────────────   │  │
+│  │  三体        │  Three-Body        │  书名/专有   │  [ 编辑 ] [ 删除 ]   │  │
+│  │  红岸基地    │  Red Coast Base    │  地名        │  [ 编辑 ] [ 删除 ]   │  │
+│  │  叶文洁      │  Ye Wenjie         │  人名        │  [ 编辑 ] [ 删除 ]   │  │
+│  │  汪淼        │  Wang Miao         │  人名        │  [ 编辑 ] [ 删除 ]   │  │
+│  │  史强        │  Shi Qiang / Da Shi│  人名/昵称   │  [ 编辑 ] [ 删除 ]   │  │
+│  │  ETO         │  ETO               │  组织名      │  [ 编辑 ] [ 删除 ]   │  │
+│  │  古筝行动    │  Operation Guzheng │  行动代号    │  [ 编辑 ] [ 删除 ]   │  │
+│  │  ...                                                                           │  │
+│  │                                                                           │  │
+│  └────────────────────────────────────────────────────────────────────────┘  │
+│                                                                              │
+│                                      [ 从文件导入 ]  [ 导出术语库 ]          │
+│                                                                              │
+└─────────────────────────────────────────────────────────────────────────────┘
+```
+
+### 6.2 日志查看器
+
+```
+┌─────────────────────────────────────────────────────────────────────────────┐
+│  系统日志                                              [ 清空 ] [ 导出 ] [×] │
+├─────────────────────────────────────────────────────────────────────────────┤
+│                                                                              │
+│  级别: [ 全部 ▼ ]  [ INFO ]  [ WARNING ]  [ ERROR ]                          │
+│                                                                              │
+│  ┌────────────────────────────────────────────────────────────────────────┐  │
+│  │  2026-03-13 14:32:15 [INFO ]    开始翻译: 第13章                         │  │
+│  │  2026-03-13 14:32:18 [INFO ]    指纹提取完成: 5,234 字                   │  │
+│  │  2026-03-13 14:32:20 [INFO ]    术语匹配: 3 个术语命中                   │  │
+│  │  2026-03-13 14:32:25 [INFO ]    调用 Claude API 开始翻译...              │  │
+│  │  2026-03-13 14:33:10 [WARNING ] API 响应较慢: 45秒                       │  │
+│  │  2026-03-13 14:33:15 [INFO ]    翻译完成: 4,987 字                       │  │
+│  │  2026-03-13 14:33:16 [INFO ]    质量检查通过                            │  │
+│  │  2026-03-13 14:33:17 [INFO ]    第13章翻译完成                           │  │
+│  │  2026-03-13 14:33:18 [INFO ]    开始翻译: 第14章                         │  │
+│  │  2026-03-13 14:33:21 [ERROR ]   API 错误: Rate limit exceeded            │  │
+│  │  2026-03-13 14:33:22 [INFO ]   等待30秒后重试...                         │  │
+│  │  ...                                                                           │  │
+│  │                                                                           │  │
+│  └────────────────────────────────────────────────────────────────────────┘  │
+│                                                                              │
+└─────────────────────────────────────────────────────────────────────────────┘
+```
+
+---
+
+## 设计规范
+
+### 颜色方案
+| 元素 | 颜色 | 说明 |
+|------|------|------|
+| 主色 | #6366f1 (Indigo) | 品牌色、主要按钮 |
+| 成功 | #22c55e (Green) | 完成状态 |
+| 警告 | #f59e0b (Amber) | 进行中、注意 |
+| 错误 | #ef4444 (Red) | 失败状态 |
+| 中性 | #6b7280 (Gray) | 次要文本 |
+| 背景 | #ffffff | 主背景 |
+| 面板 | #f9fafb | 次级背景 |
+
+### 字体规范
+| 元素 | 字号 | 字重 |
+|------|------|------|
+| 标题 H1 | 24px | Bold |
+| 标题 H2 | 20px | Semibold |
+| 标题 H3 | 16px | Semibold |
+| 正文 | 14px | Regular |
+| 辅助文本 | 12px | Regular |
+
+### 间距规范
+| 名称 | 数值 |
+|------|------|
+| xs | 4px |
+| sm | 8px |
+| md | 16px |
+| lg | 24px |
+| xl | 32px |
+
+---
+
+## 交互说明
+
+### 1. 主窗口
+- 点击作品卡片:在右侧显示详情
+- 双击作品卡片:打开工作台
+- 拖拽文件到左侧区域:触发导入对话框
+
+### 2. 导入界面
+- 支持拖拽文件到对话框
+- 文件选择后自动解析章节数
+- 点击"导入并开始翻译"后自动关闭并显示进度
+
+### 3. 进度界面
+- 可最小化到系统托架
+- 点击暂停按钮:暂停当前翻译
+- 点击工作台按钮:打开工作台界面
+
+### 4. 工作台
+- 选择左侧章节:右侧显示对应编辑器
+- 支持批量选择和操作
+- 修改译文后可保存或重新翻译
+
+### 5. 设置界面
+- 修改即时预览(部分设置)
+- API Key 验证:点击验证按钮测试连接
+- 重置按钮:恢复默认设置
+
+---
+
+*文档版本: 1.0*
+*创建日期: 2026-03-13*

+ 500 - 0
ux-prototype.md

@@ -0,0 +1,500 @@
+# UX 低保真原型
+# Translation Tool UI Mockups
+
+**版本**: 1.0
+**日期**: 2026-03-13
+**项目**: 翻译工具 (Translation Tool)
+
+---
+
+## 目录
+
+1. [主窗口布局](#1-主窗口布局)
+2. [导入界面](#2-导入界面)
+3. [翻译进度界面](#3-翻译进度界面)
+4. [术语预览界面](#4-术语预览界面)
+
+---
+
+## 1. 主窗口布局
+
+### 1.1 整体布局结构 (Mermaid)
+
+```mermaid
+flowchart TB
+    subgraph Main["主窗口 (1200x800)"]
+        subgraph Header["顶部导航栏 (1200x60)"]
+            H1["Logo"]
+            H2["菜单: 文件 | 编辑 | 视图 | 帮助"]
+            H3["状态: 已连接 ✓"]
+        end
+
+        subgraph LeftPanel["左侧作品列表 (300x740)"]
+            L1["搜索框"]
+            L2["筛选: 全部 | 进行中 | 已完成"]
+            L3["作品列表 (可滚动)"]
+            L4["┌─ 作品 A ────────┐"]
+            L5["│ 章节: 12/25     │"]
+            L6["│ 进度: ████░░ 48%│"]
+            L7["└────────────────┘"]
+            L8["┌─ 作品 B ────────┐"]
+            L9["│ 章节: 8/10      │"]
+            L10["│ 进度: ██████ 80%│"]
+            L11["└────────────────┘"]
+            L12["+ 新建作品"]
+        end
+
+        subgraph CenterPanel["中间作品详情 (500x740)"]
+            C1["作品标题: 示例小说"]
+            C2["原文语言: 中文 → 日文"]
+            C3["┌─────────────────────────┐"]
+            C4["│ 章节列表 │"]
+            C5["├─────────────────────────┤"]
+            C6["│ ✓ 第1章 │ 翻译完成 │"]
+            C7["│ → 第2章 │ 翻译中... │"]
+            C8["│ ⏸ 第3章 │ 待翻译   │"]
+            C9["│ ⏸ 第4章 │ 待翻译   │"]
+            C10["└─────────────────────────┘"]
+            C11["原文预览区"]
+            C12["译文预览区"]
+        end
+
+        subgraph RightPanel["右侧翻译进度 (400x740)"]
+            R1["当前进度"]
+            R2["████████████░░░ 60%"]
+            R3["章节: 15/25"]
+            R4["已翻译: 45,230 / 75,400 字"]
+            R5["────────────────────"]
+            R6["预计完成: 约2小时15分"]
+            R7["────────────────────"]
+            R8["术语表预览"]
+            R9["┌────────────────┐"]
+            R10["│ 主角 → 主人公  │"]
+            R11["│ 魔法 → 魔法    │"]
+            R12["│ 剑 → 剣        │"]
+            R13["└────────────────┘"]
+            R14["[查看全部术语]"]
+            R15["────────────────────"]
+            R16["[⏸ 暂停] [▶ 继续]"]
+        end
+    end
+```
+
+### 1.2 ASCII 线框图
+
+```
+┌─────────────────────────────────────────────────────────────────────────────────────┐
+│  📚 TranslationTool          文件  编辑  视图  帮助              ● 已连接 Claude API  │
+├──────────────┬─────────────────────────────────┬────────────────────────────────────┤
+│              │                                 │                                    │
+│  🔍 搜索...  │  作品标题: 示例小说              │  当前翻译进度                      │
+│              │  原文: 中文 → 目标: 日文          │  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━  │
+│  ────────────│  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━  │  ████████████░░░░ 60%             │
+│  筛选: [全部] │                                 │                                    │
+│  [进行中]     │  章节列表                       │  📊 统计                           │
+│  [已完成]     │  ┌─────────────────────────┐   │  • 章节:     15 / 25              │
+│              │  │ ✓ 第1章  │  翻译完成      │   │  • 字数:   45,230 / 75,400        │
+│  ────────────│  │ → 第2章  │  翻译中 45%   │   │  • 已用时间:   1h 23m             │
+│  📁 作品列表  │  │ ⏸ 第3章  │  待翻译       │   │  • 预计剩余:   1h 45m             │
+│              │  │ ⏸ 第4章  │  待翻译       │   │                                    │
+│  ┌─────────┐ │  │ ⏸ 第5章  │  待翻译       │   │  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━  │
+│  │📕 作品A │ │  │ ...                    │   │                                    │
+│  │12/25 章 │ │  └─────────────────────────┘   │  📖 术语预览                      │
+│  │███░ 48% │ │                                 │  ┌──────────────────────────┐    │
+│  └─────────┘ │  原文预览:                      │  │ 主角   → 主人公           │    │
+│              │  "这是一个风雨交加的夜           │  │ 魔法   → 魔法             │    │
+│  ┌─────────┐ │   晚,主人公独自走在空           │  │ 剑     → 剣               │    │
+│  │📗 作品B │ │   旷的街道上..."                │  │ ...                     │    │
+│  │ 8/10 章 │ │                                 │  └──────────────────────────┘    │
+│  │████ 80% │ │  译文预览:                      │  [查看全部术语 →]               │
+│  └─────────┘ │  "これは嵐の夜であり、            │                                    │
+│              │   主人公は一人で寂しい            │  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━  │
+│  ┌─────────┐ │   街を歩いていた..."             │                                    │
+│  │📙 作品C │ │                                 │  [ ⏸ 暂停 ]  [ ▶ 继续 ]           │
+│  │ 3/15 章 │ │  [编辑术语] [开始翻译]           │  [ ⏹ 停止 ]  [ 📁 导出 ]          │
+│  │██░ 20%  │ │                                 │                                    │
+│  └─────────┘ │                                 │                                    │
+│              │                                 │                                    │
+│              │                                 │                                    │
+│  [+ 新建作品]│                                 │                                    │
+├──────────────┴─────────────────────────────────┴────────────────────────────────────┤
+│  状态栏: 就绪 | 最后更新: 2026-03-13 13:45 | 版本 1.0.0                              │
+└─────────────────────────────────────────────────────────────────────────────────────┘
+```
+
+---
+
+## 2. 导入界面
+
+### 2.1 导入流程 (Mermaid)
+
+```mermaid
+flowchart LR
+    Start([开始]) --> Browse[点击选择文件<br/>或拖放文件]
+    Browse --> Analyze{分析文件}
+    Analyze -->|成功| ShowInfo[显示文件信息]
+    Analyze -->|失败| ShowError[显示错误信息]
+    ShowError --> Browse
+
+    ShowInfo --> Confirm{确认导入?}
+    Confirm -->|取消| Start
+    Confirm -->|确认| Process[处理文件]
+
+    Process --> Extract[提取章节信息]
+    Extract --> Count[统计字数]
+    Count --> Estimate[计算预计时间]
+    Estimate --> Complete([导入完成])
+
+    Complete --> Main[进入主界面]
+```
+
+### 2.2 导入界面布局
+
+```
+┌─────────────────────────────────────────────────────────────────────────────────────┐
+│                                                                                     │
+│                              📚 导入 TXT 文件                                        │
+│                                                                                     │
+│                              ┌─────────────────────────┐                            │
+│                              │                         │                            │
+│                              │      ════════════       │                            │
+│                              │     │ 拖放文件到此处 │     │                            │
+│                              │     │   或            │     │                            │
+│                              │     │  [选择文件]     │     │                            │
+│                              │      ════════════       │                            │
+│                              │                         │                            │
+│                              │  支持 .txt 格式文件     │                            │
+│                              │                         │                            │
+│                              └─────────────────────────┘                            │
+│                                                                                     │
+│                              或选择最近使用的文件:                                    │
+│                              ┌─────────────────────────┐                            │
+│                              │ 📄 novel_chapter01.txt  │                            │
+│                              │ 📄 story_part2.txt      │                            │
+│                              │ 📄 book_final.txt       │                            │
+│                              └─────────────────────────┘                            │
+│                                                                                     │
+└─────────────────────────────────────────────────────────────────────────────────────┘
+
+┌─────────────────────────────────────────────────────────────────────────────────────┐
+│                              📋 文件分析结果                                          │
+│                                                                                     │
+│  文件名:     my_novel.txt                                                           │
+│  大小:       2.4 MB                                                                 │
+│  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  │
+│                                                                                     │
+│  📊 统计信息:                                                                        │
+│  ┌─────────────────────────────────────────────────────────────────────────┐       │
+│  │  检测到的章节数:     25  章                                              │       │
+│  │  总字数:            75,400  字                                           │       │
+│  │  平均章节长度:       3,016  字/章                                         │       │
+│  │  检测到的语言:       中文 (简体)                                          │       │
+│  └─────────────────────────────────────────────────────────────────────────┘       │
+│                                                                                     │
+│  ⏱️  时间估算:                                                                       │
+│  ┌─────────────────────────────────────────────────────────────────────────┐       │
+│  │  假设翻译速度:      500 字/分钟                                           │       │
+│  │  预计总时间:        约 2小时 30分钟                                       │       │
+│  │  建议批处理:        每次翻译 5 章                                         │       │
+│  └─────────────────────────────────────────────────────────────────────────┘       │
+│                                                                                     │
+│  🎯 翻译设置:                                                                        │
+│  ┌─────────────────────────────────────────────────────────────────────────┐       │
+│  │  原文语言:     [中文 ▼]                                                   │       │
+│  │  目标语言:     [日文 ▼]                                                   │       │
+│  │  翻译模型:     [Claude 3.5 Sonnet ▼]                                      │       │
+│  │  使用术语表:   [✓] 启用自动术语提取                                       │       │
+│  └─────────────────────────────────────────────────────────────────────────┘       │
+│                                                                                     │
+│  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  │
+│                                                                                     │
+│                                  [← 返回]    [确认导入 →]                           │
+│                                                                                     │
+└─────────────────────────────────────────────────────────────────────────────────────┘
+```
+
+---
+
+## 3. 翻译进度界面
+
+### 3.1 翻译状态流程
+
+```mermaid
+stateDiagram-v2
+    [*] --> Queued: 文件导入
+    Queued --> Processing: 开始翻译
+    Processing --> Paused: 用户暂停
+    Paused --> Processing: 用户继续
+    Processing --> Completed: 全部完成
+    Processing --> Failed: 翻译失败
+    Failed --> Processing: 重试
+    Paused --> [*]: 取消
+    Completed --> [*]
+
+    note right of Processing
+        当前: 第15章 / 共25章
+        进度: 60%
+    end note
+```
+
+### 3.2 进度界面布局
+
+```
+┌─────────────────────────────────────────────────────────────────────────────────────┐
+│  📖 正在翻译: 示例小说 - 第15章                                                      │
+├─────────────────────────────────────────────────────────────────────────────────────┤
+│                                                                                     │
+│  ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓  │
+│  ┃  总体进度                                                                      ┃  │
+│  ┃  ████████████████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  60%  ┃  │
+│  ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  │
+│                                                                                     │
+│  ┌────────────────────────┬────────────────────────┬─────────────────────────┐     │
+│  │  已完成章节             │  进行中                │  待翻译                 │     │
+│  │  14 / 25               │  第15章                │  10 章                  │     │
+│  │  ████████████████      │  ████████░░            │  ░░░░░░░░░░░░░░░        │     │
+│  └────────────────────────┴────────────────────────┴─────────────────────────┘     │
+│                                                                                     │
+│  ┌──────────────────────────────────────────────────────────────────────────────┐  │
+│  │  当前翻译内容: 第15章 - 决战                                                  │  │
+│  ├──────────────────────────────────────────────────────────────────────────────┤  │
+│  │  ┌─────────────────────┐  ┌─────────────────────┐                           │  │
+│  │  │ 原文 (中文)         │  │ 译文 (日文)         │                           │  │
+│  │  ├─────────────────────┤  ├─────────────────────┤                           │  │
+│  │  │ "决战的时刻终于到   │  │ "決戦の時がついに    │                           │  │
+│  │  │  来了。主人公紧紧   │  │  来た。主人公はしっ   │                           │  │
+│  │  │ 握着手中的剑,眼    │  │  かりと剣を握り、    │                           │  │
+│  │  │ 前的敌人露出了一    │  │  目の前の敵をじっと   │                           │  │
+│  │  │ 丝不苟的表情..."    │  │  見つめた..."         │                           │  │
+│  │  │                     │  │  [正在生成...]       │                           │  │
+│  │  └─────────────────────┘  └─────────────────────┘                           │  │
+│  └──────────────────────────────────────────────────────────────────────────────┘  │
+│                                                                                     │
+│  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  │
+│                                                                                     │
+│  📊 详细统计:                                                                       │
+│  ┌─────────────────────────────────────────────────────────────────────────┐       │
+│  │  • 当前章节进度:          ████████░░ 45%                                 │       │
+│  │  • 已翻译字数:            45,230 / 75,400 字                             │       │
+│  │  • 本章节已翻译:          1,357 / 3,016 字                               │       │
+│  │  • 平均翻译速度:          约 485 字/分钟                                  │       │
+│  └─────────────────────────────────────────────────────────────────────────┘       │
+│                                                                                     │
+│  ⏱️  时间统计:                                                                      │
+│  ┌─────────────────────────────────────────────────────────────────────────┐       │
+│  │  • 已用时间:              1小时 23分钟                                   │       │
+│  │  • 预计剩余时间:          1小时 45分钟                                   │       │
+│  │  • 预计完成时间:          15:30 (今天)                                   │       │
+│  └─────────────────────────────────────────────────────────────────────────┘       │
+│                                                                                     │
+│  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  │
+│                                                                                     │
+│   [⏸ 暂停翻译]  [⏹ 停止翻译]  [📁 导出已完成]  [⚙️ 设置]                            │
+│                                                                                     │
+└─────────────────────────────────────────────────────────────────────────────────────┘
+```
+
+### 3.3 暂停状态界面
+
+```
+┌─────────────────────────────────────────────────────────────────────────────────────┐
+│  ⏸ 翻译已暂停                                                                       │
+├─────────────────────────────────────────────────────────────────────────────────────┤
+│                                                                                     │
+│                              ╔═════════════════════════════╗                        │
+│                              ║                           ║                        │
+│                              ║      ⏸  翻译已暂停         ║                        │
+│                              ║                           ║                        │
+│                              ║  已完成: 14/25 章 (60%)    ║                        │
+│                              ║                           ║                        │
+│                              ╚═════════════════════════════╝                        │
+│                                                                                     │
+│  您可以:                                                                             │
+│  ┌─────────────────────────────────────────────────────────────────────────┐       │
+│  │  [ ▶ 继续翻译 ]        从暂停处继续翻译                                    │       │
+│  │  [ 💾 保存进度 ]       保存当前进度,稍后继续                              │       │
+│  │  [ 📁 导出译文 ]        导出已翻译的章节                                    │       │
+│  │  [ ⚙️ 修改设置 ]        调整翻译参数                                        │       │
+│  └─────────────────────────────────────────────────────────────────────────┘       │
+│                                                                                     │
+│  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  │
+│                                                                                     │
+│  💡 提示: 暂停时您可以修改术语表、调整翻译设置,或导出已完成的部分                    │
+│                                                                                     │
+└─────────────────────────────────────────────────────────────────────────────────────┘
+```
+
+---
+
+## 4. 术语预览界面
+
+### 4.1 术语管理流程
+
+```mermaid
+flowchart LR
+    Auto[自动术语提取<br/>AI分析原文] --> Preview[术语预览界面]
+    Manual[手动添加术语] --> Preview
+    Import[导入术语表] --> Preview
+
+    Preview --> Edit{操作}
+    Edit -->|修改| Update[更新术语]
+    Edit -->|删除| Delete[移除术语]
+    Edit -->|批量| Batch[批量编辑模式]
+
+    Batch --> BatchExport[导出CSV]
+    Batch --> BatchImport[导入CSV]
+
+    Update --> Save[保存术语表]
+    Delete --> Save
+    BatchExport --> Save
+    BatchImport --> Save
+
+    Save --> Apply[应用到翻译]
+    Apply --> Translate[继续翻译]
+```
+
+### 4.2 术语表界面
+
+```
+┌─────────────────────────────────────────────────────────────────────────────────────┐
+│  📖 术语表管理 - 示例小说                                                            │
+├─────────────────────────────────────────────────────────────────────────────────────┤
+│                                                                                     │
+│  🔍 搜索术语: [_______________]  筛选: [全部 ▼]  排序: [频次 ↓▼]                    │
+│                                                                                     │
+│  ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓  │
+│  ┃  ☐ 原文        │  译文        │  频次  │  类别    │  状态    │  操作          ┃  │
+│  ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫  │
+│  ┃  ☐ 主角       │  主人公      │   156  │  人物   │  ✓ 已确认 │  ✏️ 🗑️         ┃  │
+│  ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫  │
+│  ┃  ☐ 魔法       │  魔法        │    89  │  技能   │  ✓ 已确认 │  ✏️ 🗑️         ┃  │
+│  ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫  │
+│  ┃  ☐ 剑         │  剣          │    67  │  武器   │  ✓ 已确认 │  ✏️ 🗑️         ┃  │
+│  ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫  │
+│  ┃  ☐ 龙         │  竜          │    45  │  生物   │  ✓ 已确认 │  ✏️ 🗑️         ┃  │
+│  ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫  │
+│  ┃  ☐ 王国       │  王国        │    38  │  地点   │  ⏳ 待审核 │  ✏️ 🗑️         ┃  │
+│  ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫  │
+│  ┃  ☐ 公主       │  姫          │    34  │  人物   │  ✓ 已确认 │  ✏️ 🗑️         ┃  │
+│  ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫  │
+│  ┃  ☐ 勇者       │  勇者        │    29  │  称号   │  ⚠️ 有冲突 │  ✏️ 🗑️         ┃  │
+│  ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫  │
+│  ┃  ☐ 冒险者公会 │  冒険者ギルド │    28  │  组织   │  ✓ 已确认 │  ✏️ 🗑️         ┃  │
+│  ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫  │
+│  ┃  ☐ 炼金术     │  錬金術      │    22  │  技能   │  ✓ 已确认 │  ✏️ 🗑️         ┃  │
+│  ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫  │
+│  ┃  ☐ ...        │  ...         │   ...  │  ...    │  ...     │  ...           ┃  │
+│  ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  │
+│                                                                                     │
+│  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  │
+│                                                                                     │
+│  批量操作: [✓ 全选] [🗑️ 删除选中] [📤 导出选中] [✅ 确认选中]                        │
+│                                                                                     │
+│  [+ 添加术语]  [📥 导入CSV]  [📤 导出CSV]  [🔄 重新提取]  [💾 保存并返回]             │
+│                                                                                     │
+└─────────────────────────────────────────────────────────────────────────────────────┘
+```
+
+### 4.3 添加/编辑术语弹窗
+
+```
+┌─────────────────────────────────────────────┐
+│  ✏️ 编辑术语                                │
+├─────────────────────────────────────────────┤
+│                                             │
+│  原文:              [主角            ]     │
+│  译文:              [主人公          ]     │
+│                                             │
+│  类别:              [人物 ▼]                │
+│  ┌─────────────────────┐                   │
+│  │ 人物                │                   │
+│  │ 地点                │                   │
+│  │ 技能                │                   │
+│  │ 物品                │                   │
+│  │ 组织                │                   │
+│  │ 称号                │                   │
+│  │ 自定义...           │                   │
+│  └─────────────────────┘                   │
+│                                             │
+│  备注:              [__________            │
+│                    __________            ] │
+│                                             │
+│  ☐ 锁定翻译 (禁止AI自动修改)                │
+│  ☐ 应用到所有相关变体 (主角→主角的→主角等)   │
+│                                             │
+├─────────────────────────────────────────────┤
+│           [取消]        [保存]              │
+└─────────────────────────────────────────────┘
+```
+
+### 4.4 术语冲突提示
+
+```
+┌─────────────────────────────────────────────────────────────────────────────────────┐
+│  ⚠️ 发现术语冲突                                                                    │
+├─────────────────────────────────────────────────────────────────────────────────────┤
+│                                                                                     │
+│  检测到以下术语存在多个翻译选项,请选择正确的翻译:                                    │
+│                                                                                     │
+│  ┌─────────────────────────────────────────────────────────────────────────┐       │
+│  │  原文: "勇者"                                                             │       │
+│  │  ┌─────────────────────────────────────────────────────────────────────┐ │       │
+│  │  │ 选项      │  译文      │  来源     │  使用次数     │  操作            │ │       │
+│  │  ├─────────────────────────────────────────────────────────────────────┤ │       │
+│  │  │ ○ 选项1   │  勇者      │  术语表   │  29次        │                  │ │       │
+│  │  │ ○ 选项2   │  ブレイブ  │  AI建议   │  8次         │                  │ │       │
+│  │  │ ○ 自定义  │  [______] │  -        │  -           │                  │ │       │
+│  │  └─────────────────────────────────────────────────────────────────────┘ │       │
+│  └─────────────────────────────────────────────────────────────────────────┘       │
+│                                                                                     │
+│  ☑ 将此选择应用到所有类似冲突                                                       │
+│                                                                                     │
+│  [跳过全部]    [应用到选中]    [全部应用]                                            │
+│                                                                                     │
+└─────────────────────────────────────────────────────────────────────────────────────┘
+```
+
+---
+
+## 附录: 交互状态说明
+
+### 按钮状态规范
+
+| 状态 | 示例 | 说明 |
+|------|------|------|
+| 默认 | `[开始翻译]` | 可点击,正常状态 |
+| 禁用 | `[开始翻译]` | 不可点击,灰色显示 |
+| 加载 | `[⏳ 处理中...]` | 操作进行中 |
+| 成功 | `[✓ 已完成]` | 操作成功 |
+| 错误 | `[✕ 失败]` | 操作失败 |
+
+### 进度条规范
+
+| 进度 | 显示 | 颜色 |
+|------|------|------|
+| 0-30% | `███░░░░░░░` | 蓝色 |
+| 31-70% | `███████░░░` | 蓝色 |
+| 71-99% | `██████████░` | 绿色 |
+| 100% | `████████████` | 绿色 |
+
+### 图标说明
+
+| 图标 | 含义 |
+|------|------|
+| ✓ | 已完成/已确认 |
+| → | 进行中/当前项 |
+| ⏸ | 暂停/待处理 |
+| ⏹ | 停止 |
+| ⚠️ | 警告/冲突 |
+| ❌ | 错误/失败 |
+| ℹ️ | 信息/提示 |
+| ⚙️ | 设置 |
+| 💾 | 保存 |
+| 📁 | 文件/导出 |
+| 📥 | 导入 |
+| ✏️ | 编辑 |
+| 🗑️ | 删除 |
+
+---
+
+**文档结束**