sequenceDiagram
autonumber
actor Admin as Admin（管理员）
participant UI as 前端UI
participant API as 后端API（服务）
participant PG_Task as PostgreSQL（kg_task）
participant Ext as 外部抽取服务
participant PG_M as PostgreSQL（kg_entity_mention/kg_relation_mention）
participant PG_Cand as PostgreSQL（kg_*_candidate）
participant PG_Conf as PostgreSQL（kg_*_confirm）
participant Audit as PostgreSQL（audit_log）
participant SyncW as 同步Worker
participant Neo4j as Neo4j（投影）

Note over Admin,PG_Task: 任务创建与门禁（3.1.3.1 / 3.1.3.1.1）
Admin->>UI: 配置任务Schema（ext_entity_codes / ext_relation_codes）
UI->>API: 提交创建任务请求（创建门禁检查）
API->>PG_Task: 创建kg_task（status=created，持久化tenant上下文）
API-->>UI: 返回task信息（external_task_id在触发抽取时获取）

Note over API,Ext: 任务运行期（status: running → finished/failed）
API->>Ext: 触发抽取（外部异步执行，分配external_task_id）
Ext-->>PG_Task: 任务状态更新（running → finished/failed）（由系统对接，P0仅约束状态口径）

Note over Ext,API: 抽取结果回调（5.1 回调/导入）
Ext->>API: POST /api/callback/extract（external_task_id, records...）
API->>PG_Task: 基于external_task_id反查kg_task（仅接受status=finished）
API->>PG_Task: 行级锁/门禁（单消费者/重复通知幂等处理）
API->>PG_M: 同事务写入Mention
activate API
API->>API: Schema白名单裁决 + Task生命周期过滤\n→ mention.status=active/invalid（3.2.4）
API->>Audit: 写审计（filtered_by_schema / callback_*）
deactivate API
API-->>Ext: 回调处理结果（成功/冲突）

Note over Admin,PG_Cand: 候选生成（3.3 / 5.3）
Admin->>UI: 在任务详情发起“由mentions生成candidate”
UI->>API: POST /api/candidates/from-mentions
API->>PG_M: 仅读取status=active 且 task非revoking/revoked 的mentions\n（统一可见性过滤 2.11）
API->>PG_Cand: 单事务聚合去重 + 规范化 + 决策canonical\n→ candidate.status=pending（3.3.4）
API-->>UI: 返回候选数据

Note over Admin,PG_Conf: 审核确认至Confirm（3.4 / 5.3）
Admin->>UI: 在候选审核页选择通过（approve）
UI->>API: POST /api/candidates/{id}/approve
API->>PG_Conf: Confirm Upsert（复合键/UID）→ status=CONFIRMED\n统一置 sync_status='PENDING'（3.4/4.3）
API->>PG_Cand: 将被锁定的候选设为locked（locked_by_confirm=true）
API->>Audit: 写审计（review.accept / merge 等）
API-->>UI: 返回审核结果

Note over Admin,PG_Conf: 发布（6.1 / 5.4）
Admin->>UI: 发起发布（publish）
UI->>API: POST /api/publish?task_id=...（影响预估/阻断策略）
API->>PG_Conf: 事务内将相关Confirm置 status=PUBLISHED\n统一置 sync_status='PENDING'
API->>Audit: 写审计（publish）
API-->>UI: 返回发布受理结果

Note over SyncW,Neo4j: 同步器执行（4.3 指令集）
SyncW->>PG_Conf: 扫描 sync_status IN ('PENDING','FAILED')
SyncW->>PG_Conf: 原子置 SYNCING（加锁避免并发）
alt status=PUBLISHED
  SyncW->>Neo4j: 幂等MERGE/SET（节点/关系及属性）
else status=ROLLED_BACK
  SyncW->>Neo4j: 物理删除（DETACH DELETE）
end
SyncW->>PG_Conf: 写回 sync_status='SYNCED' 或 'FAILED'
SyncW->>Audit: 写审计（action='sync'，记录结果）