Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions apps/dashboard/components/RunDetail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ export default function RunDetail({
const [planningContractsError, setPlanningContractsError] = useState("");
const [unblockTasks, setUnblockTasks] = useState<Array<Record<string, unknown>>>([]);
const [unblockTasksError, setUnblockTasksError] = useState("");
const [contextPackArtifact, setContextPackArtifact] = useState<Record<string, unknown> | null>(null);
const [harnessRequestArtifact, setHarnessRequestArtifact] = useState<Record<string, unknown> | null>(null);
const [chainSpecError, setChainSpecError] = useState("");
const [chainSpecLoading, setChainSpecLoading] = useState(false);
const [liveEnabled, setLiveEnabled] = useState(true);
Expand All @@ -108,6 +110,9 @@ export default function RunDetail({
const reviewReport = reportsState.find((r) => r.name === "review_report.json")?.data;
const taskResult = reportsState.find((r) => r.name === "task_result.json")?.data;
const workReport = reportsState.find((r) => r.name === "work_report.json")?.data;
const completionGovernanceReport = toObject(
reportsState.find((r) => r.name === "completion_governance_report.json")?.data
);
const evidenceReport = reportsState.find((r) => r.name === "evidence_report.json")?.data;
const incidentPack = reportsState.find((r) => r.name === "incident_pack.json")?.data;
const proofPack = reportsState.find((r) => r.name === "proof_pack.json")?.data;
Expand Down Expand Up @@ -147,6 +152,18 @@ export default function RunDetail({
const path = toStringOr(record.path, "");
return name === "planning_unblock_tasks" || path === "artifacts/planning_unblock_tasks.json";
});
const hasContextPackArtifact = manifestArtifacts.some((item) => {
const record = toObject(item);
const name = toStringOr(record.name, "");
const path = toStringOr(record.path, "");
return name === "context_pack" || path === "artifacts/context_pack.json";
});
const hasHarnessRequestArtifact = manifestArtifacts.some((item) => {
const record = toObject(item);
const name = toStringOr(record.name, "");
const path = toStringOr(record.path, "");
return name === "harness_request" || path === "artifacts/harness_request.json";
});
const observability = toObject(run?.manifest?.observability);
const summaryGroups = ["reports/", "events.jsonl", "contract.json", "other"];
const summary = summaryGroups.map((group) => {
Expand Down Expand Up @@ -319,6 +336,40 @@ export default function RunDetail({
};
}, [hasUnblockTasksArtifact, run?.run_id]);

useEffect(() => {
let alive = true;
async function loadGovernanceArtifacts() {
if (!run?.run_id) {
if (alive) {
setContextPackArtifact(null);
setHarnessRequestArtifact(null);
}
return;
}
const [contextPackRes, harnessRequestRes] = await Promise.allSettled([
hasContextPackArtifact ? fetchArtifact(run.run_id, "context_pack.json") : Promise.resolve(null),
hasHarnessRequestArtifact ? fetchArtifact(run.run_id, "harness_request.json") : Promise.resolve(null),
]);
if (!alive) {
return;
}
setContextPackArtifact(
contextPackRes.status === "fulfilled" && contextPackRes.value?.data && typeof contextPackRes.value.data === "object"
? (contextPackRes.value.data as Record<string, unknown>)
: null,
);
setHarnessRequestArtifact(
harnessRequestRes.status === "fulfilled" && harnessRequestRes.value?.data && typeof harnessRequestRes.value.data === "object"
? (harnessRequestRes.value.data as Record<string, unknown>)
: null,
);
}
void loadGovernanceArtifacts();
return () => {
alive = false;
};
}, [hasContextPackArtifact, hasHarnessRequestArtifact, run?.run_id]);

useEffect(() => {
let alive = true;
async function loadChainSpec() {
Expand Down Expand Up @@ -532,10 +583,13 @@ export default function RunDetail({
pendingApprovals={pendingApprovals}
evidenceHashes={evidenceHashes}
manifestArtifacts={manifestArtifacts}
completionGovernanceReport={completionGovernanceReport}
planningContracts={planningContracts}
planningContractsError={planningContractsError}
unblockTasks={unblockTasks}
unblockTasksError={unblockTasksError}
contextPackArtifact={contextPackArtifact}
harnessRequestArtifact={harnessRequestArtifact}
onOpenLogs={() => handleFailedTerminalAction("logs")}
onOpenReports={() => handleFailedTerminalAction("reports")}
failedTerminalActionFeedback={failedTerminalActionFeedback}
Expand Down
148 changes: 121 additions & 27 deletions apps/dashboard/components/run-detail/RunDetailStatusContractCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,13 @@ type RunDetailStatusContractCardProps = {
pendingApprovals: EventRecord[];
evidenceHashes: Record<string, unknown>;
manifestArtifacts: unknown[];
completionGovernanceReport: Record<string, unknown>;
planningContracts: Array<Record<string, unknown>>;
planningContractsError: string;
unblockTasks: Array<Record<string, unknown>>;
unblockTasksError: string;
contextPackArtifact: Record<string, unknown> | null;
harnessRequestArtifact: Record<string, unknown> | null;
onOpenLogs: () => void;
onOpenReports: () => void;
failedTerminalActionFeedback: string;
Expand All @@ -68,15 +71,19 @@ export default function RunDetailStatusContractCard({
pendingApprovals,
evidenceHashes,
manifestArtifacts,
completionGovernanceReport,
planningContracts,
planningContractsError,
unblockTasks,
unblockTasksError,
contextPackArtifact,
harnessRequestArtifact,
onOpenLogs,
onOpenReports,
failedTerminalActionFeedback,
}: RunDetailStatusContractCardProps) {
const bindingReadModelCopy = getUiCopy(DEFAULT_UI_LOCALE).desktop.runDetail.bindingReadModel;
const completionGovernanceCopy = getUiCopy(DEFAULT_UI_LOCALE).desktop.runDetail.completionGovernance;
const terminal = terminalStatus.toUpperCase();
const isTerminal = terminal === "FAILED" || terminal === "ERROR" || terminal === "SUCCESS" || terminal === "DONE" || terminal === "REJECTED";
const isFailedTerminal = terminal === "FAILED" || terminal === "ERROR" || terminal === "REJECTED";
Expand Down Expand Up @@ -129,6 +136,29 @@ export default function RunDetailStatusContractCard({
),
);
const roleBindingReadModel = run.role_binding_read_model;
const runtimeCompletionGovernance = toObject(completionGovernanceReport);
const hasRuntimeCompletionGovernance = Object.keys(runtimeCompletionGovernance).length > 0;
const runtimeDodChecker = toObject(runtimeCompletionGovernance.dod_checker);
const runtimeReplyAuditor = toObject(runtimeCompletionGovernance.reply_auditor);
const runtimeContinuationDecision = toObject(runtimeCompletionGovernance.continuation_decision);
const runtimeContextPack = toObject(runtimeCompletionGovernance.context_pack);
const runtimeHarnessRequest = toObject(runtimeCompletionGovernance.harness_request);
const contextPackRecord = toObject(contextPackArtifact);
const harnessRequestRecord = toObject(harnessRequestArtifact);
const runtimeDodRequiredChecks = Array.from(
new Set(
toArray(runtimeDodChecker.required_checks as unknown[] | null | undefined)
.map((value) => toDisplayText(value))
.filter((value) => value !== "-"),
),
);
const runtimeDodUnmetChecks = Array.from(
new Set(
toArray(runtimeDodChecker.unmet_checks as unknown[] | null | undefined)
.map((value) => toDisplayText(value))
.filter((value) => value !== "-"),
),
);
const unblockTaskOwners = Array.from(
new Set(unblockTasks.map((task) => toDisplayText(task.owner)).filter((value) => value !== "-")),
);
Expand Down Expand Up @@ -281,36 +311,100 @@ export default function RunDetailStatusContractCard({
</div>
</div>
) : null}
{planningContracts.length > 0 || planningContractsError || unblockTasks.length > 0 || unblockTasksError ? (
{hasRuntimeCompletionGovernance || planningContracts.length > 0 || planningContractsError || unblockTasks.length > 0 || unblockTasksError ? (
<div className="run-detail-section" data-testid="run-completion-governance-summary">
<div className="mono run-detail-section-label">Completion governance</div>
<div className="mono">Worker prompt contracts: {planningContracts.length}</div>
{unblockTasks.length > 0 ? <div className="mono">Unblock tasks: {unblockTasks.length}</div> : null}
{continuationOnIncomplete.length > 0 ? (
<div className="mono">On incomplete: {continuationOnIncomplete.join(" / ")}</div>
) : null}
{continuationOnBlocked.length > 0 ? (
<div className="mono">On blocked: {continuationOnBlocked.join(" / ")}</div>
) : null}
{doneChecks.length > 0 ? (
<div className="mono">DoD checks: {doneChecks.join(" / ")}</div>
) : null}
{unblockTaskOwners.length > 0 ? (
<div className="mono">Unblock owner: {unblockTaskOwners.join(" / ")}</div>
) : null}
{unblockTaskModes.length > 0 ? (
<div className="mono">Unblock mode: {unblockTaskModes.join(" / ")}</div>
<div className="mono run-detail-section-label">{completionGovernanceCopy.title}</div>
{hasRuntimeCompletionGovernance ? (
<div data-testid="run-completion-governance-report">
<div className="mono run-detail-section-label">{completionGovernanceCopy.runtimeTitle}</div>
<div className="mono">{completionGovernanceCopy.overallVerdict}: {toDisplayText(runtimeCompletionGovernance.overall_verdict)}</div>
<div className="mono">{completionGovernanceCopy.reportAuthority}: {toDisplayText(runtimeCompletionGovernance.authority)}</div>
<div className="mono">{completionGovernanceCopy.reportSource}: {toDisplayText(runtimeCompletionGovernance.source)}</div>
<div className="mono">{completionGovernanceCopy.reportExecutionAuthority}: {toDisplayText(runtimeCompletionGovernance.execution_authority)}</div>
<div className="mono">{completionGovernanceCopy.dodChecker}: {toDisplayText(runtimeDodChecker.status)}</div>
{toDisplayText(runtimeDodChecker.summary) !== "-" ? (
<div className="mono">{completionGovernanceCopy.dodSummary}: {toDisplayText(runtimeDodChecker.summary)}</div>
) : null}
{runtimeDodRequiredChecks.length > 0 ? (
<div className="mono">{completionGovernanceCopy.dodRequiredChecks}: {runtimeDodRequiredChecks.join(" / ")}</div>
) : null}
{runtimeDodUnmetChecks.length > 0 ? (
<div className="mono">{completionGovernanceCopy.dodUnmetChecks}: {runtimeDodUnmetChecks.join(" / ")}</div>
) : null}
<div className="mono">{completionGovernanceCopy.replyAuditor}: {toDisplayText(runtimeReplyAuditor.status)}</div>
{toDisplayText(runtimeReplyAuditor.summary) !== "-" ? (
<div className="mono">{completionGovernanceCopy.replySummary}: {toDisplayText(runtimeReplyAuditor.summary)}</div>
) : null}
<div className="mono">{completionGovernanceCopy.continuationDecision}: {toDisplayText(runtimeContinuationDecision.selected_action)}</div>
{toDisplayText(runtimeContinuationDecision.summary) !== "-" ? (
<div className="mono">{completionGovernanceCopy.continuationSummary}: {toDisplayText(runtimeContinuationDecision.summary)}</div>
) : null}
{toDisplayText(runtimeContinuationDecision.action_source) !== "-" ? (
<div className="mono">{completionGovernanceCopy.actionSource}: {toDisplayText(runtimeContinuationDecision.action_source)}</div>
) : null}
{toDisplayText(runtimeContinuationDecision.unblock_task_id) !== "-" ? (
<div className="mono">{completionGovernanceCopy.selectedUnblockTask}: {toDisplayText(runtimeContinuationDecision.unblock_task_id)}</div>
) : null}
<div className="mono">{completionGovernanceCopy.contextPack}: {toDisplayText(runtimeContextPack.status)}</div>
{toDisplayText(runtimeContextPack.summary) !== "-" ? (
<div className="mono">{completionGovernanceCopy.contextPackSummary}: {toDisplayText(runtimeContextPack.summary)}</div>
) : null}
{toDisplayText(contextPackRecord.pack_id) !== "-" ? (
<div className="mono">{completionGovernanceCopy.contextPackId}: {toDisplayText(contextPackRecord.pack_id)}</div>
) : null}
{toDisplayText(contextPackRecord.trigger_reason) !== "-" ? (
<div className="mono">{completionGovernanceCopy.contextPackTrigger}: {toDisplayText(contextPackRecord.trigger_reason)}</div>
) : null}
<div className="mono">{completionGovernanceCopy.harnessRequest}: {toDisplayText(runtimeHarnessRequest.status)}</div>
{toDisplayText(runtimeHarnessRequest.summary) !== "-" ? (
<div className="mono">{completionGovernanceCopy.harnessRequestSummary}: {toDisplayText(runtimeHarnessRequest.summary)}</div>
) : null}
{toDisplayText(harnessRequestRecord.request_id) !== "-" ? (
<div className="mono">{completionGovernanceCopy.harnessRequestId}: {toDisplayText(harnessRequestRecord.request_id)}</div>
) : null}
{toDisplayText(harnessRequestRecord.scope) !== "-" ? (
<div className="mono">{completionGovernanceCopy.harnessRequestScope}: {toDisplayText(harnessRequestRecord.scope)}</div>
) : null}
{harnessRequestRecord.approval_required !== undefined ? (
<div className="mono">{completionGovernanceCopy.harnessRequestApproval}: {toDisplayText(harnessRequestRecord.approval_required)}</div>
) : null}
<div className="mono muted">{completionGovernanceCopy.runtimeNote}</div>
</div>
) : null}
{unblockTaskTriggers.length > 0 ? (
<div className="mono">Unblock trigger: {unblockTaskTriggers.join(" / ")}</div>
{planningContracts.length > 0 || planningContractsError || unblockTasks.length > 0 || unblockTasksError ? (
<>
{hasRuntimeCompletionGovernance ? (
<div className="mono run-detail-section-label">{completionGovernanceCopy.planningFallbackTitle}</div>
) : null}
<div className="mono">{completionGovernanceCopy.workerPromptContracts}: {planningContracts.length}</div>
{unblockTasks.length > 0 ? (
<div className="mono">{completionGovernanceCopy.unblockTasks}: {unblockTasks.length}</div>
) : null}
{continuationOnIncomplete.length > 0 ? (
<div className="mono">{completionGovernanceCopy.onIncomplete}: {continuationOnIncomplete.join(" / ")}</div>
) : null}
{continuationOnBlocked.length > 0 ? (
<div className="mono">{completionGovernanceCopy.onBlocked}: {continuationOnBlocked.join(" / ")}</div>
) : null}
{doneChecks.length > 0 ? (
<div className="mono">{completionGovernanceCopy.doneChecks}: {doneChecks.join(" / ")}</div>
) : null}
{unblockTaskOwners.length > 0 ? (
<div className="mono">{completionGovernanceCopy.unblockOwner}: {unblockTaskOwners.join(" / ")}</div>
) : null}
{unblockTaskModes.length > 0 ? (
<div className="mono">{completionGovernanceCopy.unblockMode}: {unblockTaskModes.join(" / ")}</div>
) : null}
{unblockTaskTriggers.length > 0 ? (
<div className="mono">{completionGovernanceCopy.unblockTrigger}: {unblockTaskTriggers.join(" / ")}</div>
) : null}
{planningContractsError || unblockTasksError ? (
<div className="mono muted">{planningContractsError || unblockTasksError}</div>
) : (
<div className="mono muted">{completionGovernanceCopy.advisoryNote}</div>
)}
</>
) : null}
{planningContractsError || unblockTasksError ? (
<div className="mono muted">{planningContractsError || unblockTasksError}</div>
) : (
<div className="mono muted">
Derived from persisted worker prompt contracts and unblock tasks. These summaries stay advisory; task_contract still owns execution authority.
</div>
)}
</div>
) : null}
<div className="mono">Manifest artifacts:</div>
Expand Down
Loading
Loading