feat: certify chat operator turns through loop-run

This commit is contained in:
thanhnv
2026-07-08 22:31:03 +09:00
parent 004afa73c9
commit 49d0363c6a
13 changed files with 423 additions and 26 deletions
@@ -121,6 +121,19 @@ export interface ChatAnswer {
requires_approval: boolean;
audit?: { record_hash?: string; head?: string; seq?: number };
};
loop_run?: {
success: boolean;
decision: string;
reason: string;
run_id: string;
draft_ref?: string;
draft_certified?: boolean;
side_effect_released?: boolean;
artifact?: string;
success_criteria?: string;
trace_verify?: { ok: boolean; output: string };
replay?: { ok: boolean; output: string };
};
actor: SettingsActor;
}
@@ -173,6 +173,7 @@ export function Chat() {
<StatusBadge value={last.decision} />
{last.agent_binding && <StatusBadge value={last.agent_binding.agent_selected} />}
{last.agent_binding && <StatusBadge value={`L${last.agent_binding.delegation_level}`} />}
{last.loop_run && <StatusBadge value={last.loop_run.draft_certified ? 'loop certified' : 'loop held'} />}
<StatusBadge value={last.audit_verify.ok ? 'audit ok' : 'audit fail'} />
</div>
<div className="whitespace-pre-wrap text-sm leading-6 text-gray-800">{last.answer}</div>
@@ -234,6 +235,18 @@ export function Chat() {
</div>
</div>
)}
{last.loop_run && (
<div className="rounded border border-gray-200 p-3">
<div className="text-xs font-semibold uppercase text-gray-400">Loop run</div>
<div className="mt-1 font-medium text-gray-800 break-all">{last.loop_run.run_id}</div>
<div className="mt-2 flex flex-wrap gap-2">
<StatusBadge value={last.loop_run.decision} />
<StatusBadge value={last.loop_run.draft_certified ? 'draft certified' : 'draft held'} />
<StatusBadge value={last.loop_run.side_effect_released ? 'released' : 'held'} />
<StatusBadge value={last.loop_run.replay?.ok ? 'replay ok' : 'replay pending'} />
</div>
</div>
)}
<div>
<div className="text-xs font-semibold uppercase text-gray-400">Matched rules</div>
<div className="mt-1 flex flex-wrap gap-2">