// Package contract — resultshape.go:scheduler /result 线形状 golden 契约(ITER-1 F1)。 // // T1 契约双端同源:scheduler(生产方)与 gateway(消费方)的单测均引用本文件 // 的 golden 常量断言形状,从机制上杜绝「单测各自伪造形状」的契约漂移复发。 // 语义(impl-receipt-w3 §4 + fail-w5-smoke-iter1.md 方案 A): // - 终态(done/failed/dead):HTTP 200 + {request_id, status, envelope}——envelope // 为统一信封原样嵌套(scheduler 不改写); // - 非终态(queued/running):HTTP 202 + {request_id, status, position?}。 package contract // ResultShapeDone 终态线形状 golden(status/envelope 键名 + 嵌套信封顶层键样例)。 // scheduler handleResult 与 gateway resultState 序列化/反序列化测试共用。 const ResultShapeDone = `{"request_id":"r1","status":"done","envelope":{"ok":true,"kind":"search","request_id":"r1","took_ms":1,"usage":{"credits":1,"engine":"e","tokens_estimate":1},"provenance":{"adapter":"a","proxy_exit":"direct","cached":false,"retrieved_at":null},"error":null}}` // ResultShapeAccepted 非终态线形状 golden(202 body;position 为可选引导字段, // 生产实现可省略——键集下限:request_id/status 必在)。 const ResultShapeAccepted = `{"request_id":"r1","status":"queued"}` // ResultShapeFailed 失败终态线形状 golden(failed/dead 同构:200 + envelope 嵌套)。 const ResultShapeFailed = `{"request_id":"r1","status":"failed","envelope":{"ok":false,"kind":"search","request_id":"r1","took_ms":0,"usage":{"credits":0,"engine":"","tokens_estimate":0},"provenance":{"adapter":"","proxy_exit":"","cached":false,"retrieved_at":null},"error":{"code":"upstream","message":"x"}}}` // ResultStatuses /result status 字段合法值(与 Job* 常量一致,golden 测试遍历用)。 var ResultStatuses = map[string]bool{ JobQueued: true, JobRunning: true, JobDone: true, JobFailed: true, JobDead: true, }