质量门禁:Error、Warning 与 Retryable 是三个维度

自动关联目录:质量门禁:Error、Warning 与 Retryable 是三个维度

核心判断:严重度回答“能否继续”,可重试性回答“原输入不变时再跑是否可能成功”,二者不能合成一个成功/失败布尔值。

一、业务冲突

导入失败可能来自缺少必需引用、参数越界、工具崩溃、凭证暂不可用或远端拒绝。它们对用户的下一步完全不同:修内容、改配置、等待、重试或联系工具维护者。只有一个错误字符串会把所有失败都变成“再点一次试试”。

二、实际实现

实际合约中的 Issue 同时包含稳定 code、warning/error、目标列表和 retryable。目标可以指向任务、输入、字段、节点、缺失引用、产品或平台表示。提交资格只在错误数为零且计划仍有效时放行;运行失败另外记录 Stage、错误码、可重试性和下一次重试时间,业务拒绝不会进入自动退避循环。

三、值得保留

Issue 与运行 Failure 分层合理:前者描述内容或配置事实,后者描述一次执行结果。结构化 target 让 UI 能定位到具体字段或节点,而不是只弹 Toast;Warning 可以保留可见性而不阻断所有创作。

四、结构性缺陷

若 code 没有中央目录,字符串仍会逐渐失去稳定语义;retryable=true 也不代表应该自动重试,还需要错误类别、预算和副作用安全性。自由文本 message 无法稳定映射修复入口,多个 target 的主次关系也未必明确。

五、目标设计

struct Diagnostic {
    DiagnosticCode code;
    Severity severity;
    RetryPolicy retry;
    Array<TargetRef> targets;
    RepairAction action;
    StageId stage;
    IntentId intent;
};

enum RetryPolicy { Never, AutomaticBounded, ManualAfterChange, ReconcileFirst };

诊断目录定义参数 Schema、默认文案、阻断规则和允许的 RepairAction。管线只产生 code 与结构化参数,UI 决定本地化展示;自动重试还必须同时通过幂等性和剩余预算检查。

六、取舍与验证

类型化诊断增加维护成本,却能统计真实故障分布并自动跳转修复。契约测试应拒绝未知 code、缺参数和非法 target;E2E 测试验证阻断、警告、自动重试、人工修改和对账五类路径不会互相混淆。