# 运行配置业务说明

本文档从业务视角说明配置字段含义、对阶段行为的影响，以及推荐的覆盖方式。

## 1. 推荐使用方式（先 default，再覆盖）

1. 先使用基线配置运行：
  - `run_profiles/preset/jsonl_to_jsonl.default.yaml`
2. 若需项目定制，再复制为：
   - `run_profiles/jsonl_to_jsonl.local.yaml`
3. 仅改有业务差异的字段，避免一次改太多导致排障困难。

占位符：
- `${PROJECT_ROOT}` 会在运行时替换为项目根目录绝对路径。

## 2. 顶层字段（你在改什么）

- `node_types`
  - 本轮参与同步的业务类型列表。
  - 顺序会影响依赖链执行时机（当前按 node_type 串行执行 bind/create/update）。
- `local_datasource` / `remote_datasource`
  - 分别定义两侧数据来源与执行端。
- `strategies`
  - 每个业务类型的行为策略（依赖、自动绑定、创建方向、更新方向、跳过等）。
- `persist`
  - 持久化开关与数据库位置。
- `logging`
  - 运行日志输出位置与级别。

## 3. 数据源字段（DataSource）

### 3.1 JSONL 数据源

- `type=jsonl`：使用本地 JSONL 文件作为数据源。
- `jsonl_dir`：JSONL 目录路径。
- `read_only=false`：允许该侧执行 create/update 回写；若为 true，通常用于只读加载。
- `handler_configs.project.data_id_filter=[]`：项目白名单；为空时不进行项目筛选。
- `handler_configs`：按节点类型下发给各业务 handler 的扩展参数。

### 3.2 API 数据源

- `type=api`：对接 HTTP API。
- `api_base_url` / `api_uid` / `api_secret`：接口访问参数。
- `api_debug`：开启后输出更多调试信息。
- `poll_max_retries` / `poll_interval`：异步任务轮询次数与间隔。
- `handler_configs.project.data_id_filter`：建议显式配置的项目白名单；至少需要指定一个项目ID，以避免加载过多远程数据。
- `handler_configs`：业务 handler 扩展参数。

## 4. 策略字段（Strategy）

每个 node_type 都建议显式写出以下字段，便于审阅与排障。

### 4.1 `update_direction`

- `push`：本地变更推送到远端。
- `pull`：远端变更拉取到本地。
- `bidirectional`：双向更新（需要明确冲突策略，谨慎使用）。
- `none`：关闭 update 阶段。

### 4.2 `local_orphan_action` / `remote_orphan_action`

- `create_remote`：本地孤儿创建到远端。
- `create_local`：远端孤儿创建到本地。
- `none`：不自动创建。
- `delete_local` / `delete_remote`：当前主流程未作为默认路径，谨慎使用。

### 4.3 `auto_bind` / `auto_bind_fields` / `pre_bind_data_id`

- `auto_bind=true`：在 `S02(MISSING)` 上尝试自动匹配。
- `auto_bind=false`：不会做自动匹配，也不会走自动创建识别路径；通常会进入阻断态等待人工处理。
- `auto_bind_fields`：自动匹配使用的业务键字段。
- `pre_bind_data_id`：显式 data_id 预绑定清单（通用能力），格式为：
  - `- local_data_id: "..."`
    `  remote_data_id: "..."`
  - 规则：若两侧数据源都存在这对 data_id 对应节点，且当前无绑定记录，则直接绑定。
  - 不依赖 `auto_bind/auto_bind_fields`，即使 `auto_bind=false` 也会执行。
  - 不做业务键一对一匹配检查，按你给定的映射对优先执行。

### 4.4 `depend_fields`

- 定义依赖字段到依赖 node_type 的映射，例如：`company_id -> company`。
- 依赖节点状态非 `NORMAL` 时，会在 bind 的依赖检查阶段进入 `DEPENDENCY_ERROR`。

### 4.5 `skip_sync`

- 运行配置中已不建议使用 `skip_sync`。
- 推荐使用显式组合：
  - `local_orphan_action: none`
  - `remote_orphan_action: none`
  - `update_direction: none`
- 当三者同时为 `none/none/none` 时，pipeline 会跳过该 node_type 的 bind/create/update。

### 4.6 Handler 级参数（`handler_configs`）

- 建议将 handler 特有参数放在 datasource 的 `handler_configs.<node_type>` 下。
- 示例：
  - `remote_datasource.handler_configs.supplier.load_mode: persisted_only`
- `persisted_only` 表示只使用已持久化数据，不主动从外部拉新数据（具体以对应 handler 实现为准）。

## 5. 阶段行为与配置关系

- bind 阶段
  - `depend_fields` 决定是否做依赖校验。
  - `pre_bind_data_id` 先按显式 local/remote data_id 映射做预绑定。
  - `auto_bind/auto_bind_fields` 决定是否继续进行业务键自动绑定。
- create 阶段
  - `local_orphan_action` / `remote_orphan_action` 决定孤儿是否创建。
- update 阶段
  - `update_direction` 决定是否和向哪侧更新。
- 写入后 reload（Pipeline 内置）
  - 当某个 node_type 的 create 或 update 发生实际写入成功后，pipeline 会自动对该 node_type 重新执行两侧 `load`。
  - 目的：让后续 update 判断基于最新远端/本地数据，支持“create 后再补一次 update”的链路。
- 同步后一致性检查（Pipeline 内置）
  - 每个 node_type 在本轮同步后会基于绑定对执行数据一致性校验（比较时忽略 `id/_id` 字段）。
  - 若发现差异，会在日志中打印差异样本，并在汇总表新增 `Consistent` 列展示 `Y` / `N(差异数)`。
- 全局跳过
  - `local_orphan_action=none` + `remote_orphan_action=none` + `update_direction=none`
    可直接跳过该类型的 bind/create/update。

## 6. 覆盖配置建议

- 先在 default 跑通一轮，再做 local 覆盖。
- 每次只改一类问题相关字段（例如只改 `project` 的依赖与自动绑定）。
- 覆盖后优先看 `sync_log` 是否出现预期状态迁移。

## 7. 持久化与日志字段

### `persist`

- `enable`：是否开启持久化。
- `db_path`：SQLite 路径。
- `wipe_on_start`：启动是否清理历史持久化。

### `logging`

- `file_dir`：日志目录。
- `file_name_pattern`：文件命名模板。
- `level`：日志级别。

排障建议：运行失败时优先看日志中的 `状态机流转` 与 `reason=`，再对照 `docs/state_machine.md` 与 `docs/node_state_definition.md` 理解含义。
