Skip to content

案例 A-03:电流状态误判与回退

内容类型:真实脱敏案例难度:进阶适合:需要了解 AI 判断错误时如何取证、决策和回退的开发者阅读时间:约 10 分钟前置:了解状态机和 Git 基础

先说明案例证据边界

本页保留的是一次真实脱敏排查与回退过程。能够确认的是:

  • 页面出现“电流超限”显示;
  • 找到了对应状态判断代码和阈值;
  • 人工确认该显示在当时项目中的业务价值有限;
  • 尝试修改后出现新的文本/XAML 异常;
  • 最终回退到修改前可信基线。

不能从现有记录直接证明的内容,不写成已确认事实,例如:

  • 乱码究竟由哪个编辑器、编码方式或保护软件机制导致;
  • 删除该状态显示后整个试验流程一定长期无影响;
  • 350 mA 在所有设备/工况下一定属于正常范围。

这类内容应保持 Inference / Unverified

原始现象

一路电流约 350 mA,但界面状态显示“电流超限”。用户认为该显示与现场实际情况不一致,希望确认:

  1. 状态在哪里判断;
  2. 判断输入是什么;
  3. 阈值来自哪里;
  4. 这个状态是否会影响真实设备控制或试验流程。

这一步首先是 Read-Only Trace,不是立即修改阈值。

Read-Only Trace:先找到状态语义的来源

沿最短链路定位到 ViewModel 中的状态判断逻辑:当前值与 OverLimitCurrentAWarningCurrentA 等阈值比较,再映射到界面状态。

当时记录显示这些阈值位于代码侧,没有看到明确的外部配置来源。由此只能得到:

text
SourceConfirmed:
当前界面状态依赖这组代码侧阈值。

Unknown:
这些阈值最初为什么这样定义,是否来自旧设备规格或历史调试值。

不要把“硬编码”自动等同于“错误”。真正的问题是阈值依据没有被当前材料证明

AI 初始建议与风险

AI 曾提出两种方向:

  • 把硬编码阈值改成配置;
  • 如果该显示没有业务价值,移除状态显示。

两者都不能立即执行。

改阈值的风险

如果状态还参与报警、记录、联锁或 MES,上层显示和底层控制可能共享同一语义。没有确认 ThresholdBasis 就换成另一个数字,只是把未知值替换成另一个未知值。

删除状态的风险

如果属性还被其他页面、序列化、历史记录或业务条件引用,删除 UI/属性可能产生跨层影响。

因此正确问题不是“改 350 还是删控件”,而是:

text
这个状态的 Owner 是谁?
它只用于 Display,还是 Domain Behavior?

人工业务决策

在结合项目人员对现场用途的确认后,当时做出的业务判断是:该电流状态显示属于早期遗留展示,不承担设备保护职责,设备本身另有独立保护机制。

这是项目业务决策,不能由 AI 从代码命名自行推断。

如果今天重新做这类任务,建议继续沿固定链确认一次:

text
UI
→ Domain/Application
→ 外部接口/MES(若存在)
→ DeviceApply / Interlock
→ Focused references

确认它确实是 DisplayOnly 后,再决定是否删除。

修改后出现新的异常

当时尝试删除相关 ViewModel 属性和 XAML 显示后,页面中文文本出现异常。

现有材料只能确认:

text
Observed:
修改后出现文本/XAML 异常。

Not Proven:
异常一定是“因为修改了包含中文字符的 XAML 区域”。

编码方式、编辑器写回、DLP/E-SafeNet、文件被替换或其它文本完整性问题都可能产生类似现象。没有证据时不要编造单一根因。

为什么选择回退

这次任务的主要目标是处理状态显示,不是顺便调查编码环境。新的异常已经让修改证据链变脏,因此采用:

text
停止叠补丁
→ 回退本次改动
→ 恢复可信基线
→ readback / diff
→ 再决定是否另开编码问题调查

回退不是“修复完成”,而是恢复到已知更可信的代码状态

这一区分很重要:

  • RegressionFixed:新行为已经修复并有证据;
  • RolledBackToKnownGood:撤销可疑改动,恢复旧基线;
  • 两者不能混写。

本案例实际能确认到什么程度

结论状态
找到电流状态判断入口SourceConfirmed
判断依赖代码侧阈值SourceConfirmed
阈值设计依据Unverified
人工认为该显示业务价值有限UserDecision
删除后出现文本/XAML 异常Observed
乱码具体根因Unverified
已回退到修改前代码基线Verified by Git/diff(若有对应记录)
删除状态后的长期试验行为HardwarePending / Unverified

如果项目档案没有保留对应 Git/构建/现场记录,连“Verified”也应降级成 SourceConfirmed,不能靠案例文字本身抬高证据等级。

如果今天重新执行,应怎样更快

text
1. Read-Only Trace
   找状态 owner、阈值来源和 consumers

2. 分类
   DisplayOnly / DomainConstraint / Interlock

3. 如果确认 DisplayOnly
   → MicroPatch
   → 删除最小展示链
   → V1

4. 如果跨业务层
   → Execution / BehaviorPatch 或 DomainConstraint
   → focused consumers
   → V2/V3

5. 如果修改后出现新乱码
   → 不把两个问题混在一个补丁里
   → 回退或隔离文本完整性问题

这样既不会为了一个状态标签做全仓库设计,也不会因为“看起来只是 UI”而跳过真实业务后果检查。

本案例最值得保留的经验

  1. Read-Only 先于修改。 用户问“为什么显示超限”时,先回答当前行为和依据。
  2. 硬编码不等于根因。 没有设计依据只能说明需要确认,不等于数值一定错。
  3. 显示、报警、联锁必须分层。 同一个“超限”文本可能只是 UI,也可能改变流程后果。
  4. Observed 与 RootCause 分开。 修改后乱码是现象,不自动等于已经知道编码根因。
  5. 回退是恢复基线,不等于修复完成。 最终报告要准确描述当前状态。
  6. 验证只写实际证据。 没有真机/长稳记录时保留 HardwarePending / Unverified

相关方法

下一步

别来无恙 · C# 上位机 AI 实战站 · 从零到交付 · QQ 群:1016188499