Skip to content

docs(service): SLA 跟踪一节按实测行为改写(#903) - #918

Merged
yinlianghui merged 2 commits into
mainfrom
claude/issue-903-sla-tracking-fidelity
Aug 6, 2026
Merged

yinlianghui merged 2 commits into
mainfrom
claude/issue-903-sla-tracking-fidelity

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes #903

三语同步改写 content/docs/service/sla-and-escalation{,.zh-Hans,.zh-Hant}.mdx 的 SLA 计算 / 跟踪一节。四族里三族属实并已写实,第四族(B,违约标记只读)复核后前提证伪 —— 按实情保留原判断并补上真实机制,而不是照单把它改成一句新的失实说法。未动任何字段定义、流程、视图或平台版本。

逐条前提复核(基线 7df29789,平台 17.0.0-rc.3)

行号为 issue 基线 90686a4f 的原始值。PR #907(#886+#890)与 #906(#844)确实动过同页,但其增删都落在 :57 一节及其后,本单四族的四处行号在 fresh main 上未位移,逐一原址命中。

A :12「每个工单创建即获 SLA 截止日期」—— 成立 ✅

src/objects/case.hook.ts:60-64 只在 priority === 'critical' 且字段为空时填 now + 4h,其余三档一律不写。改动:

D :17-19 High/Medium/Low 的「违约长什么样」—— 成立 ✅

src/views/case.view.ts:39-42 的 rowColor 键在 priority 而非违约,三重不符全部复现:行底色不是徽章、按优先级恒常渲染、High 是橙 #f97316 不是红 / Medium 是黄 #eab308。三行现写明「什么都不会发生」并交代真实归属(case_sla_monitor 只捞 sla_due_date 已过的工单,而它们没有截止日期),目标值如实降格为服务承诺(裁定 5);另加一句点明列表里真正报告违约的是 is_sla_violated 这一列(case.view.ts:28)。

C :34-38 实时倒计时 —— 成立 ✅

grep -rniE "countdown|remaining" src/ 仅两处无关注释(opportunity.dataset.ts:76、executive.dashboard.ts:149)。另有一处比 issue 更强的证据:src/pages/case_detail.page.ts:44-51 的 page:header 只带 {case_number} · {subject} 与副标题 {crm_account},页眉里根本没有 SLA 字段;两个 SLA 字段渲染在 :56-73 的 record:highlights(label Key Information)里。三条 emoji 阈值行替换为真实呈现,并补上两个确实能帮上忙的视图(sla_calendar / sla_at_risk),按各自的过滤条件如实描述 —— sla_at_risk 筛的是 priority in [high, critical],不是「离截止有多近」。

同族回声 :124「关注你的 SLA 倒计时——当你看到琥珀色区域时」指的是同一个不存在的部件,一并改写;只改 :34-38 会让页面继续在提示区承诺倒计时。

B :32「违约标记对客服只读」—— 前提证伪 ❌

Issue 的依据是 case.object.ts:205-210 不是 readonly,推论「那道门不存在」。字段确实不是 readonly(注释写明原因:case_sla_monitor 要写它,16.x 会丢弃对 readonly 字段的写入,#2948)—— 但这道门存在,只是实现在另一层:

src/profiles/service-agent.profile.ts:52
  fields: { 'crm_case.is_sla_violated': { readable: true, editable: false }, … }

fields 是 PermissionSetSchema 的一等键(PERMISSION_SET_KEYS 含 fields,FieldPermissionSchema = { readable, editable },.strict()),不是会被静默丢弃的未识别键。本仓自己的文档也已列过这条遮罩:content/docs/administration/profiles.mdx:82 —— 「crm_case.is_sla_violated / resolution_time_hours | Service agent | Nobody — they are computed」,sharing-and-security.mdx:194 写明 FLS「enforced everywhere」。其余 profile 里 sales_manager / sales_rep 对 crm_case 本就 allowEdit: false,marketing_user 无授权,guest_portal 只能 insert —— 也就是说页面说的「对客服只读」是对的。

照 issue 原样改写会把一句正确的话改成失实。故:保留该判断,补写真实机制(字段级安全,不是字段属性),并链到 Profiles 的 FLS 表让读者能自己核。

B 这一族真正失实的是相邻的 :30 —— 字段定义行。它写「SLA Breached? — true when the resolution time exceeds the target」,两处都不对:字段标签是 SLA Violated(case.object.ts:206 / translations/en.ts:659),不存在叫 SLA Breached? 的字段;置真条件也不是「解决时间超过目标」,而是每小时扫描命中「status 不在 resolved/closed + sla_due_date 已过」(case-sla-monitor.flow.ts:40-47)。由此两个后果值得写出来,且直接与 A 咬合:没有截止日期的工单永远不入选;在下一轮扫描前就被解决掉的超时工单也不会被标记。这条已改写。

裁定 4(只改页面承诺,不动字段定义)全程遵守 —— src/ 零改动。

反向验证的方向

本单是纯文档改写,没有可以「删掉再看诊断变红」的代码分支,pnpm test 也不含针对该页散文的断言(docs-drift.test.ts 的规则面是磁贴引用与对象覆盖,不是本页这几句)。按裁定如实报告:守卫盲区(散文列),predicted GREEN —— 各门在改前改后都应绿,绿本身不构成对文案正确性的证据。文案正确性的证据是上面每条的 file:line,而不是 CI。

裁定对齐

验证

全部在 flock -w 7200 /tmp/os-heavy-verify.lock 内串行执行,NODE_OPTIONS=--max-old-space-size=4096:

门 退出码 关键行
pnpm validate 0 ✓ Validation passed (1297ms)
pnpm typecheck 0 无输出
pnpm lint 0 13 warning(s), 14 suggestion(s) —— 全部为 main 既有(approval 审批人可能解析为空、campaign_member 字段组)
pnpm hygiene 0 ✓ no raw control bytes in first-party files
pnpm build 0 ✓ Build complete (1580ms),dist/objectstack.json (1921.4 KB)
pnpm test -- --maxWorkers=2 0 Test Files 66 passed (66) / Tests 1587 passed | 1 skipped (1588)

push 前自扫控制字节:grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f]' 覆盖三个 mdx 与 changeset,退出码 1(无命中)。未起 dev server。

附带


Generated by Claude Code

…903)

三语同步改写 `content/docs/service/sla-and-escalation{,.zh-Hans,.zh-Hant}.mdx`
的 SLA 计算/跟踪一节。四族里三族属实并已写实,第四族(只读)复核后证伪,
按实情保留原判断并补上真实机制,不改成新的失实说法。

A 只有 Critical 会自动拿到 sla_due_date:`case_sla_defaults`
  (src/objects/case.hook.ts:60-64) 仅为 critical 填 now+4h,其余三档留空。
  原 :12 与 #886/#890 已写实的「钩子只为 critical 填戳」句相隔 45 行说反话,
  本次连同 :8 导语一次改齐,#886/#890 的 :16/:57 族/:105/:134 原文不动。

D High/Medium/Low 的「违约长什么样」写的其实是优先级行底色:
  src/views/case.view.ts:39-42 的 rowColor 键在 priority 而非违约,恒常渲染,
  且 High 是橙 #f97316 不是红、Medium 是黄 #eab308。三行目标值如实降格为
  服务承诺,并点明列表里真正报告违约的是 is_sla_violated 这一列。

C 实时倒计时零实现:countdown/remaining 全仓无命中,page:header 只带
  case_number/subject/crm_account,SLA 两个字段渲染在 record:highlights
  「关键信息」栏。同族回声(给客服的提示「关注你的 SLA 倒计时」)一并改写。

B 前提证伪:字段确实不是 readonly(为了 case_sla_monitor 能写,#2948),
  但服务专员权限档案 src/profiles/service-agent.profile.ts:52 把
  crm_case.is_sla_violated 遮罩为 readable:true / editable:false —— 这道门
  存在,只是实现在字段级安全而非字段属性上(本仓
  content/docs/administration/profiles.mdx:82 已列此遮罩)。故保留「对客服只读」
  的判断并补写真实机制。同段真正失实的是相邻的字段定义行:字段标签是
  SLA Violated 而非「SLA Breached?」,且置真条件不是「解决时间超过目标」,
  而是每小时扫描命中「仍打开 + 截止日期已过」——这条已改写。

#595 不预判:只写实当前行为,不判断 High/Medium/Low 应否有 SLA 时钟。
未动任何字段定义、流程或视图。

Refs #886 #890 #595

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VHrPAGEgFDoHjphqYG4BMa
@vercel

vercel Bot commented Aug 6, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
hotcrm Ignored Ignored Aug 6, 2026 8:06am

Request Review

…x appears

详情页的分区标签是 Status & SLA(case_detail.page.ts:131-133),对象表单的
页签标签是 SLA(case.view.ts:186-199) —— 两处都写出来,避免读者按单一名字
去找那个改不动的勾选框。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VHrPAGEgFDoHjphqYG4BMa
@yinlianghui
yinlianghui marked this pull request as ready for review August 6, 2026 08:46
@yinlianghui
yinlianghui added this pull request to the merge queue Aug 6, 2026
Merged via the queue into main with commit 28d76c7 Aug 6, 2026
9 checks passed
This was referenced Aug 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants