From b63aed72df6306f137d4706bd1195d223fc70ab6 Mon Sep 17 00:00:00 2001 From: OG T Date: Sat, 18 Apr 2026 17:10:19 +0800 Subject: [PATCH] =?UTF-8?q?fix(drift-narrator):=20=E7=A0=8D=20spec.templat?= =?UTF-8?q?e.spec.=20=E5=89=8D=E7=B6=B4=20=E2=80=94=20=E4=BF=AE=20Telegram?= =?UTF-8?q?=20=E8=87=AA=E5=8B=95=E6=8F=9B=E8=A1=8C=E9=86=9C=E9=99=8B?= =?UTF-8?q?=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2026-04-18 下午(台北時區)— ogt + Claude Opus 4.7 統帥實彈三輪視覺回報: 字段名 'spec.template.spec.volumes' 共 24 字元, 加上 emoji+': '+summary 超過 Telegram
 視覺寬度,自動換行
造成 emoji 與 field name 斷開、單獨成行的醜狀。

修復: _shorten_field_path() 砍 3 種常見前綴:
  - 'spec.template.spec.' → ''
  - 'spec.template.' → ''  (後備)
  - 'spec.' → ''  (後備)

效果對比:
  前: '🟡 spec.template.spec.affinity.podAntiAffinity.preferredDuringS: [清單 3 項]'
  後: '🟡 affinity.podAntiAffinity.preferredDuringS: [清單 3 項]'

Co-Authored-By: Claude Opus 4.7 (1M context) 
---
 apps/api/src/services/drift_narrator_service.py | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/apps/api/src/services/drift_narrator_service.py b/apps/api/src/services/drift_narrator_service.py
index 36e92104..567c350f 100644
--- a/apps/api/src/services/drift_narrator_service.py
+++ b/apps/api/src/services/drift_narrator_service.py
@@ -577,6 +577,18 @@ class DriftNarratorService:
             n += 1
         return n
 
+    def _shorten_field_path(self, field: str) -> str:
+        """
+        砍掉常見冗長前綴,讓 Telegram 排版不換行
+        spec.template.spec.volumes → volumes
+        spec.template.metadata.labels → metadata.labels
+        spec.internalTrafficPolicy → internalTrafficPolicy
+        """
+        for prefix in ("spec.template.spec.", "spec.template.", "spec."):
+            if field.startswith(prefix):
+                return field[len(prefix):]
+        return field
+
     def _render_telegram_body(
         self,
         report: "DriftReport",
@@ -607,7 +619,8 @@ class DriftNarratorService:
         else:
             for it in items:
                 emoji = "🔴" if it.get("level") == "high" else "🟡"
-                lines.append(f"{emoji} {it['field']}: {it['summary']}")
+                short_field = self._shorten_field_path(it['field'])
+                lines.append(f"{emoji} {short_field}: {it['summary']}")
 
         shown = len(items)
         if actionable > shown: