fix: show code agent completion evidence
This commit is contained in:
@@ -83,6 +83,7 @@ const requiredTrustedRecordTerms = Object.freeze([
|
||||
"audit.event.query + SOURCE 回退",
|
||||
"evidence.record.query + SOURCE 回退",
|
||||
"conversationId、traceId 和 messageId",
|
||||
"provider/model/trace/conversation",
|
||||
"失败原因=",
|
||||
"只读 audit 缺少 M3 patch-panel live report / operation / trace / evidence 绑定",
|
||||
"只读 evidence 缺少 M3 patch-panel live report / operation / trace / audit 绑定",
|
||||
@@ -119,6 +120,20 @@ const workbenchMarkers = Object.freeze([
|
||||
"command-form"
|
||||
]);
|
||||
|
||||
const requiredCodeAgentEvidenceTerms = Object.freeze([
|
||||
"provider",
|
||||
"model",
|
||||
"backend",
|
||||
"conversation",
|
||||
"trace",
|
||||
"message",
|
||||
"providerTrace",
|
||||
"openai-responses",
|
||||
"codex-cli",
|
||||
"echo/mock/stub",
|
||||
"untrusted_completion"
|
||||
]);
|
||||
|
||||
const forbiddenWritePatterns = Object.freeze([
|
||||
/callRpc\(\s*["']hardware\./u,
|
||||
/hardware\.operation\.request/u,
|
||||
@@ -271,6 +286,11 @@ function runStaticSmoke() {
|
||||
evidence: ["BLOCKED 凭证缺口", "provider_unavailable", "OPENAI_API_KEY", "hwlab-code-agent-provider/openai-api-key", "completed -> dev-live guard"]
|
||||
});
|
||||
|
||||
addCheck(checks, blockers, "code-agent-completed-evidence-visible", hasCodeAgentCompletedEvidenceVisibility(files), "Completed Code Agent replies expose provider/model/trace/conversation evidence and reject echo/mock/stub completions.", {
|
||||
blocker: "observability_blocker",
|
||||
evidence: requiredCodeAgentEvidenceTerms
|
||||
});
|
||||
|
||||
addCheck(checks, blockers, "no-hardware-write-api", noForbiddenWriteSurface(source), "Workbench source does not expose hardware write APIs or live mutation commands.", {
|
||||
blocker: "safety_blocker",
|
||||
evidence: forbiddenWritePatterns.map(String)
|
||||
@@ -657,10 +677,14 @@ function hasCodeAgentReadinessVisibility({ html, app }) {
|
||||
/hwlab-code-agent-provider\/openai-api-key/u.test(app) &&
|
||||
/只有真实 completed 回复才标 DEV-LIVE/u.test(app) &&
|
||||
/不能因为只有 conversationId 标为开发实况/u.test(app) &&
|
||||
/Boolean\(message\.provider\)/u.test(app) &&
|
||||
/Boolean\(message\.model\)/u.test(app) &&
|
||||
/Boolean\(message\.backend\)/u.test(app) &&
|
||||
/status === "completed" \? "dev-live"/u.test(app) &&
|
||||
/isTrustedCodeAgentProvider/u.test(app) &&
|
||||
/Boolean\(value\?\.model\)/u.test(app) &&
|
||||
/Boolean\(value\?\.backend\)/u.test(app) &&
|
||||
/Boolean\(value\?\.traceId\)/u.test(app) &&
|
||||
/Boolean\(value\?\.conversationId \|\| value\?\.sessionId\)/u.test(app) &&
|
||||
/isRealCompletedChatMessage/u.test(app) &&
|
||||
/isRealCompletedChatResult/u.test(app) &&
|
||||
/hasRealCodeAgentEvidence/u.test(app) &&
|
||||
!/status === "failed" \? "dev-live"/u.test(app) &&
|
||||
!/tone:\s*state\.conversationId\s*\?\s*"dev-live"/u.test(app) &&
|
||||
!/provider_unavailable[\s\S]{0,120}tone-[\w-]*dev-live/iu.test(source) &&
|
||||
@@ -668,6 +692,32 @@ function hasCodeAgentReadinessVisibility({ html, app }) {
|
||||
);
|
||||
}
|
||||
|
||||
function hasCodeAgentCompletedEvidenceVisibility({ app }) {
|
||||
const messageEvidenceBody = functionBody(app, "messageEvidenceFields");
|
||||
const realEvidenceBody = functionBody(app, "hasRealCodeAgentEvidence");
|
||||
return (
|
||||
requiredCodeAgentEvidenceTerms.every((term) => app.includes(term)) &&
|
||||
/conversationId:\s*result\.conversationId \|\| result\.sessionId \|\| state\.conversationId/u.test(app) &&
|
||||
/providerTrace:\s*result\.providerTrace/u.test(app) &&
|
||||
/function\s+providerTraceSummary\s*\(/u.test(app) &&
|
||||
/recordField\("provider",\s*message\.provider\)/u.test(messageEvidenceBody) &&
|
||||
/recordField\("model",\s*message\.model\)/u.test(messageEvidenceBody) &&
|
||||
/recordField\("backend",\s*message\.backend\)/u.test(messageEvidenceBody) &&
|
||||
/recordField\("conversation",\s*message\.conversationId\)/u.test(messageEvidenceBody) &&
|
||||
/recordField\("trace",\s*message\.traceId\)/u.test(messageEvidenceBody) &&
|
||||
/recordField\("message",\s*message\.messageId\)/u.test(messageEvidenceBody) &&
|
||||
/providerTraceSummary\(message\.providerTrace\)/u.test(messageEvidenceBody) &&
|
||||
/isTrustedCodeAgentProvider\(value\?\.provider\)/u.test(realEvidenceBody) &&
|
||||
/TRUSTED_CODE_AGENT_PROVIDERS/u.test(app) &&
|
||||
/UNTRUSTED_CODE_AGENT_PROVIDER_PATTERN/u.test(realEvidenceBody) &&
|
||||
/value\?\.conversationId \|\| value\?\.sessionId/u.test(realEvidenceBody) &&
|
||||
/isRealCompletedChatResult\(result\)/u.test(app) &&
|
||||
/realCompleted \? "completed" : "failed"/u.test(app) &&
|
||||
/Code Agent 完成证据不足/u.test(app) &&
|
||||
/本次不会标记为真实完成/u.test(app)
|
||||
);
|
||||
}
|
||||
|
||||
function noForbiddenWriteSurface(source) {
|
||||
return forbiddenWritePatterns.every((pattern) => !pattern.test(source));
|
||||
}
|
||||
@@ -848,7 +898,18 @@ async function fetchText(url) {
|
||||
}
|
||||
|
||||
function liveHtmlLooksLikeWorkbench(html) {
|
||||
return /HWLAB 云工作台/u.test(html) && labelsPresent(html, workbenchMarkers) && !/<body[^>]*>\s*<(?:main|section)[^>]*(?:gate|diagnostics|status|help)/iu.test(html);
|
||||
const workspaceTag = firstTagForDataView(html, "workspace");
|
||||
const gateTag = firstTagForDataView(html, "gate");
|
||||
const helpTag = firstTagForDataView(html, "help");
|
||||
return (
|
||||
/HWLAB 云工作台/u.test(html) &&
|
||||
labelsPresent(html, workbenchMarkers) &&
|
||||
workspaceTag !== null &&
|
||||
!/\bhidden\b/u.test(workspaceTag) &&
|
||||
gateTag !== null &&
|
||||
/\bhidden\b/u.test(gateTag) &&
|
||||
(helpTag === null || /\bhidden\b/u.test(helpTag))
|
||||
);
|
||||
}
|
||||
|
||||
async function inspectLiveDom(url) {
|
||||
@@ -892,7 +953,7 @@ async function inspectLiveDom(url) {
|
||||
dom.htmlOverflow === "hidden" &&
|
||||
dom.workspaceHidden === false &&
|
||||
dom.gateHidden === true &&
|
||||
dom.diagnosticsHidden === true &&
|
||||
(dom.diagnosticsHidden === true || dom.diagnosticsHidden === null) &&
|
||||
dom.outerScrollLocked &&
|
||||
dom.labelsPresent;
|
||||
return {
|
||||
|
||||
Reference in New Issue
Block a user