feat(adr100): surface replay execution gate
Some checks failed
CD Pipeline / tests (push) Successful in 1m43s
Code Review / ai-code-review (push) Successful in 14s
CD Pipeline / build-and-deploy (push) Successful in 4m20s
CD Pipeline / post-deploy-checks (push) Has been cancelled

This commit is contained in:
Your Name
2026-06-02 10:04:25 +08:00
parent 13f8e587f2
commit 4667a86c6d
7 changed files with 362 additions and 1 deletions

View File

@@ -217,6 +217,17 @@ type RecurrenceWorkItemActionResult = {
labels?: string[] | null;
body_preview?: string | null;
} | null;
replay_gate?: {
status?: string | null;
next_step?: string | null;
can_runtime_replay?: boolean | null;
execution_authorized?: boolean | null;
repair_executed?: boolean | null;
mutating_step_count?: number | null;
supported_write_route_count?: number | null;
unsupported_step_count?: number | null;
approval_required_count?: number | null;
} | null;
approval_id?: string | null;
approval?: {
id?: string | null;
@@ -2765,6 +2776,7 @@ function Adr100RemediationQueuePanel({
const result = state?.result ?? null;
const ticketPreview = result?.ticket_preview ?? null;
const approval = result?.approval ?? null;
const replayGate = result?.replay_gate ?? null;
const canCreateApproval = item.remediation_status === "needs_playbook_ticket"
|| item.remediation_action === "promote_diagnostic_to_repair_playbook";
return (
@@ -2876,6 +2888,23 @@ function Adr100RemediationQueuePanel({
</p>
</div>
) : null}
{replayGate ? (
<div className="mt-2 border-t border-[#e0ddd4] pt-2">
<p className="font-semibold text-[#141413]">{t("replayGate.title")}</p>
<div className="mt-1 grid gap-1 font-mono text-[11px] text-[#5f5b52] sm:grid-cols-2">
<span>{t("replayGate.status", { value: replayGate.status ?? "--" })}</span>
<span>{t("replayGate.next", { value: replayGate.next_step ?? "--" })}</span>
<span>{t("replayGate.routes", {
write: replayGate.supported_write_route_count ?? 0,
unsupported: replayGate.unsupported_step_count ?? 0,
})}</span>
<span>{t("replayGate.auth", {
authorized: String(replayGate.execution_authorized ?? false),
executed: String(replayGate.repair_executed ?? false),
})}</span>
</div>
</div>
) : null}
</div>
) : null}
</article>