fix(aihr): gate case learning pii
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
- 2026-07-14 23:18 生产 Prompt 内容只读复核:生产 `aihr_prompt_template` 表存在但内置模板数量为 `0`;现新增 `aihr_20260714_prompt_template_seed_mysql8.sql`,按唯一键幂等补齐 6 个内置模板,不覆盖同 code/output_format/version 的自定义模板。未写入生产数据。
|
||||
- 2026-07-14 23:25 生产迁移顺序固化:新增 `docs/BRD_PRODUCTION_MIGRATION_RUNBOOK.md`,明确场景/Rubric 基础表、场景与 SOP/Prompt 内置内容、音频/案例媒体、五维与字段迁移的执行顺序,并提供迁移后只读 schema/模板核验 SQL;未执行生产写入,也不把 seed/schema 完成等同于正式试点通过。
|
||||
- 2026-07-14 案例学习闭环补齐:案例整理结果现在从真实摘要提取并持久化 `learning_points`,主管可通过 `/api/knowledge/case/records/{caseId}/review` 提交脱敏点评,管理端和员工端详情可查看;新增 `aihr_20260714_case_learning_mysql8.sql`,未新增视频占位资源,也未修改生产数据。
|
||||
- 2026-07-14 BRD G3 案例学习字段脱敏门禁补强:严格预检原先只扫描案例标题、转写和摘要,可能漏掉新增 `learning_points` 或 `supervisor_comment` 中的手机号、邮箱、房号;现统一纳入同一已知 PII 扫描,并用门禁测试分别注入学习点和主管点评验证 `case_unmasked` 会失败。
|
||||
- 2026-07-14 23:44 线上只读发布复核:生产根站、`/h5/`、租户列表和员工首页 API 均返回 `200`,`wygj-aihr.service` 为 `active`;线上管理端资源 `assets/index-B9T505HT.js` SHA-256 为 `66a827a7b3e5d794ae9da54c6e2276080995614fa52f54d49f746087663f8c94`,H5 资源 `assets/index-CDn6TrX8.js` SHA-256 为 `eecb4820f3887aceb952efe3e6f2210bab325be8b03f2813e6ec304c68b26f08`,当前 `HEAD=0bfaee7d` 本地产物分别为 `assets/index-C20ZRMal.js`(`7ea5a989d67464af32b55ea4fc65e4ce5f0ca761d597fea40b4a8c13f3612b80`)、`assets/index-Zx4zkWxo.js`(`8ef22016ce8587e0264fc53ee100f0e4bfa2f17ea66d7b72fd90c972d4d0a0e9`),后端当前构建 SHA-256 为 `9598b98f340bcac3e7400f695c7ed5de5a9a62e081c19824b9b6839822e2d4f1`,均未与线上对齐;本轮只读核对,未执行生产静态同步、迁移、后端重启或业务数据写入。
|
||||
|
||||
更新时间:2026-07-14
|
||||
|
||||
@@ -150,7 +150,7 @@ check_pilot_samples() {
|
||||
hire_date_schema_count="$(pilot_sql_scalar "SELECT COUNT(*) FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'aihr_org_snapshot' AND column_name = 'hire_date'")"
|
||||
sop_document_count="$(pilot_sql_scalar "SELECT COUNT(*) FROM aihr_knowledge_attach WHERE tenant_id = '$pilot_tenant' AND type = 'sop' AND status = 2")"
|
||||
case_stored_count="$(pilot_sql_scalar "SELECT COUNT(*) FROM aihr_case_record WHERE tenant_id = '$pilot_tenant' AND status = '已入库'")"
|
||||
case_unmasked_count="$(pilot_sql_scalar "SELECT COUNT(*) FROM aihr_case_record WHERE tenant_id = '$pilot_tenant' AND status = '已入库' AND CONCAT_WS(' ', title, transcript, summary) REGEXP '1[3-9][0-9]{9}|[[:alnum:]._%+-]+@[[:alnum:].-]+\\.[[:alpha:]]{2,}|[0-9]{1,2}(栋|幢|号楼|单元)[0-9]{3,4}|[0-9]{1,2}[--][0-9]{3,4}'")"
|
||||
case_unmasked_count="$(pilot_sql_scalar "SELECT COUNT(*) FROM aihr_case_record WHERE tenant_id = '$pilot_tenant' AND status = '已入库' AND CONCAT_WS(' ', title, transcript, summary, learning_points, supervisor_comment) REGEXP '1[3-9][0-9]{9}|[[:alnum:]._%+-]+@[[:alnum:].-]+\\.[[:alpha:]]{2,}|[0-9]{1,2}(栋|幢|号楼|单元)[0-9]{3,4}|[0-9]{1,2}[--][0-9]{3,4}'")"
|
||||
completed_people="$(pilot_sql_scalar "
|
||||
SELECT COUNT(*)
|
||||
FROM (
|
||||
|
||||
@@ -194,6 +194,14 @@ pilot_sql_scalar "UPDATE aihr_case_record SET transcript = '手机号13900000000
|
||||
pilot_output="$(AIHR_PILOT_START_DATE=2026-07-07 AIHR_PILOT_END_DATE=2026-07-10 check_pilot_samples)"
|
||||
[[ "$pilot_output" == *'case_unmasked=1'* ]] || { echo "FAIL: unmasked case PII was not detected: $pilot_output" >&2; exit 1; }
|
||||
|
||||
pilot_sql_scalar "UPDATE aihr_case_record SET transcript = '已完成回访', learning_points = '[\"手机号13900000000\"]' WHERE tenant_id = '000000' AND status = '已入库' LIMIT 1" >/dev/null
|
||||
pilot_output="$(AIHR_PILOT_START_DATE=2026-07-07 AIHR_PILOT_END_DATE=2026-07-10 check_pilot_samples)"
|
||||
[[ "$pilot_output" == *'case_unmasked=1'* ]] || { echo "FAIL: unmasked learning point PII was not detected: $pilot_output" >&2; exit 1; }
|
||||
|
||||
pilot_sql_scalar "UPDATE aihr_case_record SET learning_points = '[\"已完成回访\"]', supervisor_comment = '请联系13900000000复核' WHERE tenant_id = '000000' AND status = '已入库' LIMIT 1" >/dev/null
|
||||
pilot_output="$(AIHR_PILOT_START_DATE=2026-07-07 AIHR_PILOT_END_DATE=2026-07-10 check_pilot_samples)"
|
||||
[[ "$pilot_output" == *'case_unmasked=1'* ]] || { echo "FAIL: unmasked supervisor comment PII was not detected: $pilot_output" >&2; exit 1; }
|
||||
|
||||
if (AIHR_PILOT_STRICT=true AIHR_PILOT_START_DATE= AIHR_PILOT_END_DATE= check_pilot_samples) >/tmp/wygj-pilot-strict-test.log 2>&1; then
|
||||
echo "FAIL: strict mode accepted an implicit date window" >&2
|
||||
exit 1
|
||||
|
||||
Reference in New Issue
Block a user