诊断闭环:Stage 必须绑定本次运行与制品身份

自动关联目录:诊断闭环:Stage 必须绑定本次运行与制品身份

核心判断:日志写出 stage=cook 只能帮助搜索;要证明一次慢或失败发生在哪份输入、哪个目标和哪组制品上,Stage 必须与 Intent、Run、ArtifactSet 和目标角色共同关联。

一、业务冲突

导入跨桌面进程、Python 服务、UE Cook 子进程和远端发布。用户看到“上传失败”时,真正原因可能是旧计划、特定平台包、凭证、远端保存结果未知或 UI 读到了上次运行。没有关联身份,更多日志只会扩大搜索空间。

二、实际实现

运行记录已经包含 RunId、OperationId、Stage、CurrentStage、Attempt、Retry、Failure 和冻结计划摘要;Issue 能定位字段、节点与产品。构建/运行验证又引入 ArtifactSetId、RuntimePackageSetId 与 RuntimeRunId,并要求引擎日志、运行时 JSON 和实际包字节三方一致。进度事件还带 Stage 超时,能区分子进程整体超时和某个原子阶段停滞。

三、值得保留

诊断不再依赖自然语言拼接,失败可分为确定性内容错误、可重试传输错误、等待资源和结果未知。制品集合与运行证据绑定尤其重要,它把“这次跑过”提升为“这组字节在这个目标上跑过”。

四、结构性缺陷

不同子系统仍使用各自 ID 与 Stage 词汇,日志若没有统一 Trace Context,跨进程关联仍需猜测。currentStage 与顶层 Stage 的兼容投影会积累历史分支;错误码有了结构,但 Repair Action 尚未必机器可读。高频日志还可能泄露路径或凭证上下文。

五、目标设计

struct PipelineTrace {
    TraceId trace;
    IntentId intent;
    RunId run;
    StageId stage;
    Attempt attempt;
    TargetId target;
    Optional<ArtifactSetId> artifacts;
};

Emit(EventCode code, PipelineTrace ctx, SafeFields fields);

每次进程边界都传递同一 TraceId,Stage 使用注册表而非自由字符串;事件 Schema 声明允许字段、敏感级别与 RepairAction。崩溃报告、UE Trace、结构化日志和 UI Issue 只保存同一关联键,不复制完整私密上下文。

六、取舍与验证

统一关联会增加协议字段和日志治理成本,但能直接回答“哪次、哪步、哪组字节”。端到端故障注入应检查从 UI 错误到子进程日志、Journal 与制品清单能单键贯通;同时测试敏感字段拒绝和日志采样不会破坏关键状态事件。