fix(knowledge): gate policy answers by formal sources

This commit is contained in:
key
2026-07-31 00:28:41 +08:00
parent a3689591e7
commit bf703b7853
16 changed files with 470 additions and 20 deletions
@@ -0,0 +1,96 @@
-- 2026-08-01 受控内部试点正式来源白名单。
-- 必须先独立核验原文件 SHA-256,再执行本文件;本文件只会命中精确的附件 ID + doc_id。
-- 访谈、经验萃取、AI 生成内容和草稿不得加入此清单。
INSERT INTO aihr_knowledge_source_governance (
tenant_id, source_id, attachment_id, source_doc_id, authority_type, lifecycle_status,
source_version, effective_date, expires_date, applicability_scope, content_sha256,
approval_basis, approved_by, approved_time
)
SELECT a.tenant_id, source_seed.source_id, a.id, a.doc_id, 'FORMAL_POLICY', 'APPROVED',
source_seed.source_version, source_seed.effective_date, source_seed.expires_date,
source_seed.applicability_scope, source_seed.content_sha256,
'2026-08-01受控内部试点正式来源白名单', 'PROJECT_SPONSOR_DELEGATION', '2026-07-30 23:59:00'
FROM aihr_knowledge_attach a
JOIN (
SELECT 1883 attachment_id, '017e4a5dfadd40279bbe5f947cfdf5e1' source_doc_id,
'FORMAL-ZZKF01-20240919' source_id, '2024-09-19' source_version,
DATE '2024-09-19' effective_date, NULL expires_date,
'住宅物业/生活顾问网格化作业' applicability_scope,
'f79a9a3f29f73d518761aa3e8707928a10b8a9ce6b56dd53f30ef73219c0c9db' content_sha256
UNION ALL SELECT 1884, 'd544749eb13b456aaa06f0fd6c84dfc0',
'FORMAL-ZZKF02-20240919', '2024-09-19', DATE '2024-09-19', NULL,
'住宅物业/客户报事报修作业',
'1cbecb71e28750a033c683928745ef0de3e2cf688ee8d838806f098b4a0e0182'
UNION ALL SELECT 1885, '77a84c25c1c14b80b74c6211a76a3fa1',
'FORMAL-ZZKF03-20240919', '2024-09-19', DATE '2024-09-19', NULL,
'住宅物业/客户投诉处理作业',
'eb6b7efa269cb46feba14d7aeb65f41bbb15352a05cdb8d092c781e9a4328ed9'
UNION ALL SELECT 1886, '22a68eda3b6e476192224ad54a47d0a3',
'FORMAL-ZZKF05-20240919', '2024-09-19', DATE '2024-09-19', NULL,
'住宅物业/装修管理作业',
'bf822957ba738ef5075e465ed5da4a279e1f37a0b141109425049a72b0c71550'
UNION ALL SELECT 1922, '4e484a61c8ab473cadab75e61a672fe8',
'FORMAL-ZZBJ06-20240919', '2024-09-19', DATE '2024-09-19', NULL,
'住宅物业/垃圾收集和清运作业',
'df3a35f6c6a624fc06c7807f6b8b7cf9e7e3c17bba974ae1c5850cf7c2483c2c'
UNION ALL SELECT 1927, '954f717921ed43b5882ec8be7a9886ab',
'FORMAL-ZZBJ12-20240919', '2024-09-19', DATE '2024-09-19', NULL,
'住宅物业/突发事件应急作业',
'739db239f623854b89c8a57a43484f86d244d2d126e0d623f2773b430d63b7b5'
UNION ALL SELECT 1932, 'f448a336c14c4d6790e423abf7beb4fd',
'FORMAL-ZZAQ04-20240919', '2024-09-19', DATE '2024-09-19', NULL,
'住宅物业/车辆管理作业',
'3d1e74a9abec8c2da43c95f42a877e41a93f22aa794ad75b65a1d5056a71b4f2'
UNION ALL SELECT 1947, 'c3402e7a86504b188807f548277576ce',
'FORMAL-YC-2026-33', '银城物业[2026]第33号', DATE '2026-05-26', NULL,
'银城物业各事业部、公司/2026年汛期防台防汛',
'824e6355f5506ab113919f4744a13a68c9356af0e946347bb159804e0e32feb8'
UNION ALL SELECT 1984, 'f5bd66670ee345aa96e03c328e0753e8',
'FORMAL-LIFE-ADVISOR-HANDBOOK-20220928', '2022-09-28', DATE '2022-09-28', NULL,
'生活顾问岗位学习与作业参考',
'362b9a2f01454a16eaf8fcd2cf76fe283f0dc2ced99533ade4a6ae8cc1f480fa'
UNION ALL SELECT 1990, '31b7249eaa3c4b8d8ca59738edc1fc37',
'FORMAL-NJ-HOUSING-CONTRACT-2025-134', '宁房办[2025]134号', DATE '2025-12-16', NULL,
'南京市住宅小区物业服务合同示范文本适用事项',
'9a61349811d292d7d2e75e66384e60a0e2e30f66b92d8a43557127e07b983534'
) source_seed
ON source_seed.attachment_id = a.id
AND source_seed.source_doc_id = a.doc_id
WHERE a.tenant_id = '000000'
AND a.status = 2
ON DUPLICATE KEY UPDATE
source_doc_id = VALUES(source_doc_id),
authority_type = VALUES(authority_type),
lifecycle_status = VALUES(lifecycle_status),
source_version = VALUES(source_version),
effective_date = VALUES(effective_date),
expires_date = VALUES(expires_date),
applicability_scope = VALUES(applicability_scope),
content_sha256 = VALUES(content_sha256),
approval_basis = VALUES(approval_basis),
approved_by = VALUES(approved_by),
approved_time = VALUES(approved_time);
-- 失败关闭:10 个精确来源未全部注册时让 mysql 进程返回非零。
DROP TEMPORARY TABLE IF EXISTS aihr_aug1_formal_source_assert;
CREATE TEMPORARY TABLE aihr_aug1_formal_source_assert (
assertion_value tinyint NOT NULL
);
INSERT INTO aihr_aug1_formal_source_assert (assertion_value)
SELECT CASE WHEN COUNT(*) = 10 THEN 1 ELSE NULL END
FROM aihr_knowledge_source_governance
WHERE tenant_id = '000000'
AND source_id IN (
'FORMAL-ZZKF01-20240919', 'FORMAL-ZZKF02-20240919', 'FORMAL-ZZKF03-20240919',
'FORMAL-ZZKF05-20240919', 'FORMAL-ZZBJ06-20240919', 'FORMAL-ZZBJ12-20240919',
'FORMAL-ZZAQ04-20240919', 'FORMAL-YC-2026-33',
'FORMAL-LIFE-ADVISOR-HANDBOOK-20220928', 'FORMAL-NJ-HOUSING-CONTRACT-2025-134'
)
AND authority_type = 'FORMAL_POLICY'
AND lifecycle_status = 'APPROVED'
AND effective_date <= current_date()
AND (expires_date IS NULL OR expires_date >= current_date())
AND CHAR_LENGTH(TRIM(source_version)) > 0
AND content_sha256 REGEXP '^[0-9a-f]{64}$';
DROP TEMPORARY TABLE aihr_aug1_formal_source_assert;
@@ -0,0 +1,62 @@
-- 正式知识来源治理:附件级权威性、发布状态、版本、生效期和原文件哈希。
-- 只创建治理契约,不把任何既有附件自动认定为正式来源。
-- 可重复执行;生产请求只读校验,不允许在运行时补表。
CREATE TABLE IF NOT EXISTS `aihr_knowledge_source_governance` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` varchar(20) NOT NULL COMMENT '租户编号',
`source_id` varchar(80) NOT NULL COMMENT '稳定来源编号',
`attachment_id` bigint NOT NULL COMMENT '知识附件ID',
`source_doc_id` varchar(80) NOT NULL COMMENT '审批时附件文档ID快照',
`authority_type` varchar(30) NOT NULL COMMENT 'FORMAL_POLICY/TRAINING/EXPERIENCE/INTERVIEW/DRAFT',
`lifecycle_status` varchar(20) NOT NULL DEFAULT 'DRAFT' COMMENT 'DRAFT/APPROVED/REJECTED/RETIRED',
`source_version` varchar(80) NOT NULL COMMENT '正式版本或发文号',
`effective_date` date NOT NULL COMMENT '生效日期',
`expires_date` date DEFAULT NULL COMMENT '失效日期',
`applicability_scope` varchar(500) NOT NULL COMMENT '适用范围',
`content_sha256` char(64) NOT NULL COMMENT '审批时原文件SHA-256',
`approval_basis` varchar(255) NOT NULL COMMENT '审批依据或受控试点决策',
`approved_by` varchar(100) DEFAULT NULL COMMENT '审批主体',
`approved_time` datetime DEFAULT NULL COMMENT '审批时间',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_aihr_knowledge_source_id` (`tenant_id`, `source_id`),
UNIQUE KEY `uk_aihr_knowledge_source_attachment` (`tenant_id`, `attachment_id`),
KEY `idx_aihr_knowledge_source_retrieval`
(`tenant_id`, `authority_type`, `lifecycle_status`, `effective_date`, `expires_date`),
KEY `idx_aihr_knowledge_source_doc` (`tenant_id`, `source_doc_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
COMMENT='AIHR知识附件来源治理';
-- 与租户事实表保持同一排序规则,兼容历史库和全新 MySQL 8 数据库。
SET @formal_source_target_collation := (
SELECT collation_name FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'aihr_knowledge_info'
AND column_name = 'tenant_id'
LIMIT 1
);
SET @formal_source_target_collation := COALESCE(@formal_source_target_collation, @@collation_database);
SET @formal_source_table_collation := (
SELECT table_collation FROM information_schema.tables
WHERE table_schema = DATABASE()
AND table_name = 'aihr_knowledge_source_governance'
LIMIT 1
);
SET @formal_source_ddl := IF(
@formal_source_table_collation = @formal_source_target_collation,
'SELECT 1',
CONCAT(
'ALTER TABLE aihr_knowledge_source_governance ',
'CONVERT TO CHARACTER SET utf8mb4 COLLATE ',
@formal_source_target_collation
)
);
PREPARE aihr_formal_source_stmt FROM @formal_source_ddl;
EXECUTE aihr_formal_source_stmt;
DEALLOCATE PREPARE aihr_formal_source_stmt;
SET @formal_source_target_collation := NULL;
SET @formal_source_table_collation := NULL;
SET @formal_source_ddl := NULL;