Files
zheromiku dcdc8d1ddd feat: 知识治理平台(含已验证发布/回滚契约)
全栈知识治理平台首次入库(P1-P10 + 发布链路模拟验证闭环):

- 治理核心:源目录/变更集/人工审核/发布批次/发布执行(fail-closed 闸口)
- 测试通道:WeKnora 测试 KB 上传/轮询/验收;poll 完成时写入
  parser_generation/index_generation,修复 manual/seed 路径发布闸口永久拦截
- 发布适配器 v071(本地 source=测试角色 / 云端 target=生产角色 模拟验证通过):
  * ES 导出/导入 mapping 自适应(.keyword 子字段、可选 tenant_id)
  * OSS locator 支持嵌套 scheme;chunks.seq_id 由目标序列分配
  * bundle 归档同身份重试原子替换;verifier 按 bundle chunk_type 计数
  * 回滚 job payload 支持 prior_execution_id(strict 解码)
- 三通道发布+回滚演练实测:publish 4/4 verified,检索命中,
  rollback 4/4 rolled_back,目标端 PG is_enabled=false、ES is_enabled=false
- 前端 A·Data-console 风格全站统一,120 用例通过
- 门禁:go vet / go test 全包通过,gofmt 干净
2026-09-30 10:54:06 +08:00

58 lines
2.3 KiB
SQL

CREATE TABLE IF NOT EXISTS directory_scope_rules (
source_connection_id VARCHAR(36) NOT NULL
REFERENCES source_connections(id) ON DELETE RESTRICT,
directory_path TEXT NOT NULL DEFAULT '',
visibility VARCHAR(20) NOT NULL
CHECK (visibility IN ('internal', 'external')),
updated_by VARCHAR(128) NOT NULL,
reason VARCHAR(500) NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
PRIMARY KEY (source_connection_id, directory_path)
);
CREATE TABLE IF NOT EXISTS source_item_scope_overrides (
source_item_id VARCHAR(36) NOT NULL
REFERENCES source_items(id) ON DELETE RESTRICT,
visibility VARCHAR(20) NOT NULL
CHECK (visibility IN ('internal', 'external')),
updated_by VARCHAR(128) NOT NULL,
reason VARCHAR(500) NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
PRIMARY KEY (source_item_id)
);
CREATE TABLE IF NOT EXISTS scope_change_events (
id VARCHAR(36) PRIMARY KEY,
target_type VARCHAR(16) NOT NULL
CHECK (target_type IN ('directory', 'item')),
source_connection_id VARCHAR(36)
REFERENCES source_connections(id) ON DELETE RESTRICT,
directory_path TEXT NOT NULL DEFAULT '',
source_item_id VARCHAR(36)
REFERENCES source_items(id) ON DELETE RESTRICT,
action VARCHAR(16) NOT NULL
CHECK (action IN ('set', 'clear')),
previous_visibility VARCHAR(20)
CHECK (previous_visibility IS NULL OR previous_visibility IN ('internal', 'external')),
decided_visibility VARCHAR(20)
CHECK (decided_visibility IS NULL OR decided_visibility IN ('internal', 'external')),
operator_ref VARCHAR(128) NOT NULL,
reason VARCHAR(500) NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CHECK (
(target_type = 'directory' AND source_connection_id IS NOT NULL AND source_item_id IS NULL)
OR
(target_type = 'item' AND source_connection_id IS NULL AND source_item_id IS NOT NULL)
),
CHECK (
(action = 'set' AND decided_visibility IS NOT NULL)
OR
(action = 'clear' AND decided_visibility IS NULL)
)
);
CREATE INDEX IF NOT EXISTS idx_scope_change_events_target
ON scope_change_events (target_type, source_connection_id, source_item_id, created_at DESC);