feat(orchestrator): DataGate 机制化 + 任务级持久化(T14/T16 架构审查整改)

- T14 (OV5): 新建 src/genesis/orchestrator/datagate.py
  - DataGate.load(source, selector) 机制化:子集加载 + 规模保护(超 500 行
    无 selector 拒绝全量,1000 行 Excel 防上下文爆炸)+ token 预算(8000,
    复用 CJK 保守估算)+ 未知表容错
  - agent-runtime §4.2 原则→机制说明
- T16 (OV7): 新建 src/genesis/orchestrator/task_queue.py
  - TaskQueue ABC + PersistentTaskQueue(SQLite 落盘)
  - enqueue/poll/update_status/get/cancel/recover/close
  - 幂等去重(§5.3 缓存结果)+ recover 将 running→failed、pending 保留
  - api-design §5.2/5.3、agent-runtime §3.5/3.6、design §8.4.1 同步
- 新增 test_datagate.py(8 用例)+ test_task_queue.py(11 用例)
- TDD: RED(模块缺失)→ GREEN(聚焦 16 passed)→ 全量 218 passed / 100.00%(1140 stmts/278 br)
This commit is contained in:
lhl
2026-08-12 15:43:10 +08:00
parent 3decdfc31c
commit 6a54580ca4
9 changed files with 734 additions and 5 deletions
+20 -2
View File
@@ -288,13 +288,18 @@ events 表:
### 3.5 步骤内部任务队列
```
Task Queue(抽象 `TaskQueue`v1 仅 InMemoryQueue 实现;RedisQueue/ValkeyQueue 为 v2 预留,接口与幂等键见 api-design §5:
Task Queue(抽象 `TaskQueue`v1 仅 PersistentTaskQueue 实现;RedisQueue/ValkeyQueue 为 v2 预留,接口与幂等键见 api-design §5:
task:generate-chapter-3
status: pending | running | completed | failed
status: pending | running | completed | failed | cancelled
payload: {chapter_id, data_refs, rule_refs, prompt_version}
result: {chapter_html, source_uris, tokens, time_ms}
```
> **T16 任务级持久化(OV7**`PersistentTaskQueue`SQLite 落盘)已实现于
> `src/genesis/orchestrator/task_queue.py`。任务状态/payload/result 全部持久化,
> 服务重启不丢;`recover()` 将中断的 running 任务标记 failed、pending 保留,
> 由编排层重新消费(幂等键防止重复执行)。
Writer 逐章生成、Impact 批量推理等重活**进队列异步执行**,提供细粒度进度(「第3章生成中」)与单任务重试。
### 3.6 失败恢复与重入
@@ -308,6 +313,7 @@ Writer 逐章生成、Impact 批量推理等重活**进队列异步执行**,
失败的任务重新入队(retry_count 内)
已完成的章节保留(result 持久化)
中断后继续 → 只执行未完成章节
实现: PersistentTaskQueue.recover()T16SQLite 落盘)
```
### 3.7 会话并发控制
@@ -355,6 +361,18 @@ Writer 逐章生成、Impact 批量推理等重活**进队列异步执行**,
实现: 每章配置 data_selector(哪些表、哪些要素)
```
> **T14 机制化(OV5**DataGate 已从原则落地为代码组件
> `src/genesis/orchestrator/datagate.py``DataGate.load(source, selector)`)。
> 机制三要素:
> 1. **子集加载** — `DataSelector.table_ids` 指定要加载的表,不复制全量
> 2. **规模保护** — 源总行数超过 `max_total_rows`(默认 500)且未指定 selector
> → 抛 `DataGateError` 拒绝加载(1000 行 Excel 上下文爆炸防护)
> 3. **token 预算** — 加载后按 CJK 保守估算 token(复用 inference/tokenT9),
> 超过 `max_total_tokens`(默认 8000)→ 拒绝
>
> 未知表 ID 容错:selector 引用不存在的表 → 返回空结果(不抛错)。
> 阈值可通过编排层配置注入(对齐 `config/rag.yaml` 检索预算策略)。
### 4.3 跨 Agent 状态传递格式
```