fix: improve sentinel observer evidence

This commit is contained in:
Codex
2026-07-06 23:48:33 +00:00
parent 51058f4635
commit e0199e5515
6 changed files with 171 additions and 15 deletions
+13 -1
View File
@@ -456,6 +456,10 @@ function hasCommandFailureEvidence(item: Record<string, unknown>): boolean {
return stringAtNullable(first, "type") !== null
|| stringAtNullable(first, "phase") !== null
|| stringAtNullable(first, "status") !== null
|| stringAtNullable(first, "failedReason") !== null
|| stringAtNullable(first, "failureKind") !== null
|| stringAtNullable(first, "message") !== null
|| stringAtNullable(first, "artifactRef") !== null
|| stringAtNullable(first, "stdoutPreview") !== null
|| stringAtNullable(first, "stderrPreview") !== null
|| numberAtNullable(first, "exitCode") !== null;
@@ -616,11 +620,19 @@ function compactSentinelReportCommandFailure(value: unknown): Record<string, unk
type: stringAtNullable(item, "type"),
phase: stringAtNullable(item, "phase"),
status: stringAtNullable(item, "status"),
resultOk: item.resultOk === true ? true : item.resultOk === false ? false : null,
failureKind: reportText(item.failureKind, 160),
failedReason: reportText(item.failedReason, 240),
message: reportText(item.message, 240),
exitCode: numberAtNullable(item, "exitCode"),
timedOut: item.timedOut === true ? true : item.timedOut === false ? false : null,
stdoutPreview: reportText(item.stdoutPreview, 160),
stderrPreview: reportText(item.stderrPreview, 160),
artifactBucket: stringAtNullable(item, "artifactBucket"),
artifactRef: stringAtNullable(item, "artifactRef"),
failedAt: stringAtNullable(item, "failedAt"),
completedAt: stringAtNullable(item, "completedAt"),
abandonedAt: stringAtNullable(item, "abandonedAt"),
valuesRedacted: true,
};
}
@@ -645,7 +657,7 @@ function readSentinelReportArtifactSummary(state: SentinelCicdState, body: Recor
"const sha=(buf)=>buf?`sha256:${crypto.createHash('sha256').update(buf).digest('hex')}`:null;",
"const rec=(v)=>v&&typeof v==='object'&&!Array.isArray(v)?v:{}; const arr=(v)=>Array.isArray(v)?v:[]; const clip=(v,n=180)=>v==null?null:String(v).slice(0,n);",
"const compactRootCauseSignals=(value)=>{const v=rec(value); const keys=['sessionListReadCount','traceEventsReadCount','webPerformanceBeaconFailureCount','eventSourceFailureCount','requestFailedCount','httpErrorCount','consoleAlertCount','requestfailedTop','httpStatusTop']; const out={}; for(const key of keys){if(v[key]!=null)out[key]=Array.isArray(v[key])?v[key].slice(0,8):v[key];} if(Object.keys(out).length===0)return null; out.valuesRedacted=true; return out;};",
"const compactCommandFailure=(value)=>{const v=rec(value); if(Object.keys(v).length===0)return null; return {commandId:clip(v.commandId,80),type:clip(v.type,48),phase:clip(v.phase,80),status:clip(v.status,80),exitCode:Number.isFinite(Number(v.exitCode))?Number(v.exitCode):null,timedOut:v.timedOut===true?true:v.timedOut===false?false:null,stdoutPreview:clip(v.stdoutPreview,160),stderrPreview:clip(v.stderrPreview,160),artifactRef:clip(v.artifactRef,160),valuesRedacted:true};};",
"const compactCommandFailure=(value)=>{const v=rec(value); if(Object.keys(v).length===0)return null; return {commandId:clip(v.commandId,80),type:clip(v.type,48),phase:clip(v.phase,80),status:clip(v.status,80),resultOk:v.resultOk===true?true:v.resultOk===false?false:null,failureKind:clip(v.failureKind,160),failedReason:clip(v.failedReason,240),message:clip(v.message,240),exitCode:Number.isFinite(Number(v.exitCode))?Number(v.exitCode):null,timedOut:v.timedOut===true?true:v.timedOut===false?false:null,stdoutPreview:clip(v.stdoutPreview,160),stderrPreview:clip(v.stderrPreview,160),artifactBucket:clip(v.artifactBucket,48),artifactRef:clip(v.artifactRef,160),failedAt:clip(v.failedAt,48),completedAt:clip(v.completedAt,48),abandonedAt:clip(v.abandonedAt,48),valuesRedacted:true};};",
"const sleep=(ms)=>{try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,ms)}catch{}};",
"let jsonBuf=read(reportPath); let report=null; let reportParseError=null; const deadline=Date.now()+waitMs;",
"while(true){ if(jsonBuf){try{report=JSON.parse(jsonBuf.toString('utf8')); break}catch(err){reportParseError=String(err&&err.message?err.message:err)}} if(Date.now()>=deadline)break; sleep(Math.min(500, Math.max(50, deadline-Date.now()))); jsonBuf=read(reportPath); }",