fix(cma): KR 名称污染存量清理 + 透传点护栏 (cma-kr-name-pollution-cleanup-20260916)
ci/woodpecker/push/main Pipeline was canceled

- kr_name.py/krName.ts: sanitize_kr_name 判据(尾部≥/≤数字≠目标值→截断;==目标值→保留)
- maps.py/okr.py/okr_templates.py: 模板名/JSON→krs.title 透传点护栏
- test: 28 passed(独立复核)
- 原会话因迭代上限停手,本提交代收口(工作已复核完成)
This commit is contained in:
Hermes CI Fix
2026-09-16 14:48:06 +08:00
parent 09fb11d86f
commit 06c23927aa
8 changed files with 300 additions and 3 deletions
+14
View File
@@ -7,7 +7,11 @@ from app.database import get_db
from app.deps import get_entity_id
from app.auth_middleware import require_auth, require_role
from app.models import StrategicMap, OperationLog, MapObjective, Objective, KR, KPIDefinition, ReviewRecord, User
from app.utils.kr_name import sanitize_kr_name
import json
import logging
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/cma/maps", tags=["战略地图"],
dependencies=[Depends(require_role("ceo", "finance"))],
@@ -481,6 +485,16 @@ def _sync_objectives_krs(m, db):
if kpi and kpi.threshold_green:
op2, tgt2 = _parse_kr_operator_target(kpi.threshold_green)
op, tgt = op2, (tgt2 if tgt is None else tgt)
# 护栏(2026-09-16):名称尾部「≥/≤+数字」与目标值不一致 = 历史污染截断值,
# 在此透传点(JSON/模板名 → krs.title)规整,防止污染继续传染(判据见 app/utils/kr_name.py)
clean_title, _polluted = sanitize_kr_name(title, kr_item.get("target_value"), tgt)
if _polluted:
logger.warning(
"KR名称污染已规整: map=%s objective=%s %r -> %r (target=%s)",
m.id, objective.id, title, clean_title, tgt,
)
title = clean_title
kr_item["name"] = clean_title # 同步回写 JSON,保持展示口径=落库口径
kr = existing_krs.get(title)
if kr is None:
kr = KR(