- [P20260219-084845] 2026-02-19 08:48:45 +0800
  - summary: CONTEXT TRANSFER: We are continuing a conversation that had gotten too long. Here is a summary: --- ## TASK 1: Admin-web…
  - prompt:
```text
CONTEXT TRANSFER: We are continuing a conversation that had gotten too long. Here is a summary:

---
## TASK 1: Admin-web 同步检查与 Bug 修复（ETL 重构后）

- **STATUS**: done
- **USER QUERIES**: 1 (from earlier context transfer)
- **DETAILS**: 在大量 ETL 重构后，全面检查并修复了 admin-web 前端与后端的同步问题。共 12 处修复，构建验证通过。
- **FILEPATHS**: `apps/backend/app/config.py`, `apps/backend/app/services/cli_builder.py`, `apps/backend/app/schemas/tasks.py`, `apps/admin-web/src/api/tasks.ts`, `apps/admin-web/src/pages/LogViewer.tsx`, `apps/admin-web/src/pages/TaskConfig.tsx`, `apps/admin-web/src/types/index.ts`, `apps/admin-web/src/components/ScheduleTab.tsx`, `apps/admin-web/src/store/authStore.ts`, `apps/admin-web/vite.config.ts`

---

## TASK 2: ETL 执行深度分析 + Bug 修复

- **STATUS**: done
- **USER QUERIES**: 2-6 (from earlier context transfer)
- **DETAILS**: 用户从 admin-web 执行 api_full 任务，16.8 秒就"完成"，用户质疑。深度分析发现 5 个关键问题并全部修复。
- **FILEPATHS**: `apps/etl/connectors/feiqiu/tasks/ods/ods_json_archive_task.py`, `apps/etl/connectors/feiqiu/tasks/verification/base_verifier.py`, `apps/admin-web/src/pages/LogViewer.tsx`, `scripts/ops/fix_admin_site_id.py`

---

## TASK 3: Admin-web 全面 UI 优化

- **STATUS**: in-progress
- **USER QUERIES**: 7-12 (across context transfers), plus current conversation queries
- **DETAILS**: 用户要求全面优化 admin-web 所有页面。大部分页面已完成优化。当前正在进行 TaskSelector 的重大重构。

### 已完成的子任务：
1. **skip-quality 移除** — 从 `TaskConfig.tsx` 移除了 `skipQuality` state、Checkbox UI、useEffect 依赖
2. **is_common 字段全链路** — 后端 `TaskDefinition` dataclass 添加 `is_common: bool = True`，`TaskItem` 响应模型、API 序列化、前端类型、TaskSelector 排序+标签显示全部打通
3. **后端任务注册表同步** — `DWS_RETENTION_CLEANUP` / `DWS_MV_REFRESH_FINANCE_DAILY` / `DWS_MV_REFRESH_ASSISTANT_DAILY` 已替换为 `DWS_MAINTENANCE`；不常用任务标记为 `is_common=False`（DWD_QUALITY_CHECK, DWS_ML_MANUAL_IMPORT, DWS_MAINTENANCE, 全部 UTILITY 任务）
4. **fetch_before_verify 范围修正** — 前端限制为仅 `verify_only` 模式显示
5. **ods_use_local_json CLI 映射** — `cli_builder.py` 添加 `--data-source offline` 生成逻辑
6. **DWD 表选择移入 TaskSelector** — 从独立 DwdTableSelector Card 移入 TaskSelector 内部，作为 DWD_LOAD_FROM_ODS 的子选项
7. **dwd_only_tables 生效** — `task_executor._run_subprocess` 新增 `extra_env` 参数，注入 `DWD_ONLY_TABLES` 环境变量
8. **后端 sync-check 端点** — 新增 `GET /api/tasks/sync-check`，通过子进程调用 ETL 获取真实任务列表并对比差异
9. **前端 API 层更新** — `tasks.ts` 已重写，新增 `fetchFlows()`, `checkTaskSync()`, `fetchDwdTablesRich()`, 以及类型定义 `FlowDef`, `ProcessingModeDef`, `SyncCheckResult`, `DwdTableItem`

### 当前正在进行的重构（被截断）：

用户要求 4 项重大改造：

**A. TaskSelector 按业务域全链路展示（最重要，核心改造）**
- 当前问题：DWD 层只有 `DWD_LOAD_FROM_ODS` 一个通用任务，导致业务域下 ODS → DWD 断层
- 目标交互：每个业务域（如"助教"）下展示完整链路：ODS 任务 → DWD 表（该域的） → DWS/INDEX 任务
- DWD 表作为该域的"中间环节"自然嵌入，选中 DWD 表 = 过滤 DWD_LOAD_FROM_ODS 的装载范围
- 后端数据已就绪：`TaskDefinition` 有 `domain` 和 `layer` 字段，`DwdTableDefinition` 也有 `domain` 字段，两者的 domain 值一致（助教、结算、台桌、会员、商品、团购、库存、财务、指数、工具、通用）
- **尚未实现**——`TaskSelector.tsx` 需要完全重写

**B. 同步检查 UI**
- 后端端点已完成（`/api/tasks/sync-check`）
- 前端 API 调用已完成（`checkTaskSync()`）
- **尚未实现**——需要在任务选择 Card 的 title 旁边加同步状态指示器，有差异时显示警告 Badge，点击打开 Modal/新页面展示差异详情

**C. 任务选择按钮优化**
- **尚未实现**——需要在"全选"前加"全选常用"按钮（只选 `is_common=true` 的任务），"反选"后加"清空"按钮

**D. Flow 定义从 API 动态加载**
- 后端端点已存在（`GET /api/tasks/flows`）
- 前端 API 调用已完成（`fetchFlows()`）
- **尚未实现**——`TaskConfig.tsx` 中的 `FLOW_DEFINITIONS` 和 `PROCESSING_MODES` 需要改为从 API 加载，本地定义作 fallback

- **NEXT STEPS**:
  * 重写 `apps/admin-web/src/components/TaskSelector.tsx`：按业务域全链路展示（ODS 任务 → DWD 表 → DWS/INDEX 任务），每个域一个 Collapse 面板，内部按层分组显示
  * 在 TaskSelector 中集成同步检查：title 旁加 Badge，点击展示差异 Modal
  * 在 TaskSelector 中添加"全选常用"和"清空"按钮
  * 修改 `apps/admin-web/src/pages/TaskConfig.tsx`：将 `FLOW_DEFINITIONS` 和 `PROCESSING_MODES` 改为从 `fetchFlows()` API 动态加载，本地定义作 fallback；确保 TaskSelector 的 props 传递正确
  * 构建验证：`pnpm run build`（cwd: `apps/admin-web`）

- **FILEPATHS**: 
  - `apps/admin-web/src/components/TaskSelector.tsx`
  - `apps/admin-web/src/pages/TaskConfig.tsx`
  - `apps/admin-web/src/api/tasks.ts`（已完成更新）
  - `apps/admin-web/src/types/index.ts`
  - `apps/backend/app/routers/tasks.py`（已完成 sync-check 端点）
  - `apps/backend/app/services/task_registry.py`（已完成 is_common + DWS_MAINTENANCE）
  - `apps/backend/app/services/cli_builder.py`（已完成 ods_use_local_json 映射）
  - `apps/backend/app/services/task_executor.py`（已完成 extra_env 注入）

---

## USER CORRECTIONS AND INSTRUCTIONS:
- 所有说明性文字使用简体中文
- 后端用 `uv run` 启动（不是直接 `python`）
- 前端用 `pnpm` 管理
- 后端进程运行在端口 8000（`uv run uvicorn app.main:app --reload --port 8000`，cwd: `apps/backend`）
- 前端进程运行在端口 5174（`pnpm run dev`，cwd: `apps/admin-web`）
- ETL 项目实际路径是 `apps/etl/connectors/feiqiu/`
- 脚本执行规范：优先编写 Python 脚本再执行，避免 PowerShell 复杂逻辑
- `skip-quality` 参数在 ETL CLI 中不存在，已从前端移除
- 连接器和 Store ID 的交互是 TreeSelect 树形多选（已实现）
- pnpm build 需要 `Set-Location apps\admin-web; pnpm run build 2>&1`（cwd 参数在此环境中不可靠）
- 已有测试 bug：`test_cli_args.py::TestBuildCliOverrides::test_data_source_online_sets_run_key` 失败（`force_full` 属性缺失），非本次修改引起
- `--overlap-seconds` 默认值不一致（CLI 3600 vs 前端 600）是有意的，保持现状
- DWS/INDEX 层校验被跳过是设计如此（verifier 未实现），业务任务正常执行
- 业务域全链路交互：每个域（如助教）应包含 ODS → DWD 表 → DWS/INDEX 的完整路径，DWD 表作为中间环节嵌入

---

## Files to read
- `apps/admin-web/src/components/TaskSelector.tsx`
- `apps/admin-web/src/pages/TaskConfig.tsx`
- `apps/admin-web/src/api/tasks.ts`
- `apps/admin-web/src/types/index.ts`
- `apps/backend/app/services/task_registry.py`
- `apps/backend/app/routers/tasks.py`

USER QUERIES(most recent first):
1. - 加一个自动化检查脚本（比如 CI 中对比两边的任务列表），避免手动同步遗漏。这个好，加入这个功能，放在 任务选择 title 旁边，若有差异则提醒。点击后打开新页面展示差异。- 任务选择 全选之前加入按钮：全选常用任务。反选后面加入按钮 清空。- 把前端的 FLOW_DEFINITIONS 改为从 API 动态加载，本地定义仅作 fallback。- 现在的交互还是不对：如果按照现在的方案，以业务场景分类，则每一层都应包含 ODS - DWD - DWS（index）全路径。比如助教类，就会有从ODS一直到DWS和index的全部相关任务。所以，DWD方面还要优化，这样的交互应该是合理的吧？
2. Output:
Command executed successfully with no output.

Exit Code: 0
3. Output:
Command executed successfully with no output.

Exit Code: 0
4. - 加一个自动化检查脚本（比如 CI 中对比两边的任务列表），避免手动同步遗漏。这个好，加入这个功能，放在 任务选择 title 旁边，若有差异则提醒。点击后打开新页面展示差异。- 任务选择 全选之前加入按钮：全选常用任务。反选后面加入按钮 清空。- 把前端的 FLOW_DEFINITIONS 改为从 API 动态加载，本地定义仅作 fallback。- 现在的交互还是不对：如果按照现在的方案，以业务场景分类，则每一层都应包含 ODS - DWD - DWS（index）全路径。比如助教类，就会有从ODS一直到DWS和index的全部相关任务。所以，DWD方面还要优化，这样的交互应该是合理的吧？
5. Output:
Hook execution failed with exit code 1.

Error output:
[AUDIT REMINDER] Pending audit detected (root-file, dir:admin-web, dir:backend, dir:etl, dir:miniprogram, dir:db, db-schema-change). Run /audit (Manual: Run /audit hook) to sync docs & write audit artifacts. (rate limit: 15min)



Exit Code: 1
6. Output:
Command executed successfully with no output.

Exit Code: 0
7. Output:
Command executed successfully with no output.

Exit Code: 0
8. 把"DWD 表选择"从独立的 DwdTableSelector 改为 DWD 任务卡片内的"表过滤"子选项，并且真正让它生效。这个方案OK。并在修改后，再思考下，页面如何优化布局。其他的这些问题，分别给出你的参考意见。
9. Output:
Hook execution failed with exit code 1.

Error output:
[AUDIT REMINDER] Pending audit detected (root-file, dir:admin-web, dir:backend, dir:etl, dir:miniprogram, dir:db, db-schema-change). Run /audit (Manual: Run /audit hook) to sync docs & write audit artifacts. (rate limit: 15min)



Exit Code: 1
10. Output:
Command executed successfully with no output.

Exit Code: 0
11. Output:
Command executed successfully with no output.

Exit Code: 0
12. 任务选择 和 DWD 表选择 从功能的表达上看，是不是有点问题？如果有DWD表选择，也应该有ODS表选择。但表选择和DWD的任务是不是又有些冲突？另外，之前调试是否忽略了一些问题，回忆一下？
13. Output:
Command executed successfully with no output.

Exit Code: 0
14. Output:
Command executed successfully with no output.

Exit Code: 0
15. Output:
Command executed successfully with no output.

Exit Code: 0
16. 还有哪些内容不存在（任务、参数、配置）？都帮我检查下。
17. Output:
Command executed successfully with no output.

Exit Code: 0
18. Output:
Command executed successfully with no output.

Exit Code: 0
---

METADATA:
The previous conversation had 10 messages.

INSTRUCTIONS:
Continue working until the user query has been fully addressed. Do not ask for clarification - proceed with the work based on the context provided.
IMPORTANT: you need to read from the files to Read section
```
