diff --git a/apps/decodex/src/orchestrator/operator_dashboard.html b/apps/decodex/src/orchestrator/operator_dashboard.html index 829a80da..cd430e21 100644 --- a/apps/decodex/src/orchestrator/operator_dashboard.html +++ b/apps/decodex/src/orchestrator/operator_dashboard.html @@ -8098,10 +8098,8 @@

Run History

(project.cleanup_blocked_count ?? 0) + (project.cleanup_pending_count ?? 0) + (project.post_review_lane_count ?? 0); - const connector = projectConnectorSummary(project); - const syncNeedsAttention = project.enabled && ["backoff", "degraded", "stale"].includes(connector); - return workCount > 0 || (project.warning_count ?? 0) > 0 || syncNeedsAttention; + return workCount > 0; } function activeProjects(projects) { @@ -8124,6 +8122,9 @@

Run History

if ((project.cleanup_blocked_count ?? 0) > 0) { return { label: "cleanup blocked", tone: "tone-wait", title: "Post-land cleanup needs operator action" }; } + if ((project.cleanup_pending_count ?? 0) > 0) { + return { label: "cleanup pending", tone: "tone-retained", title: "Post-land cleanup pending" }; + } if (project.connector_state === "backoff") { return { label: "sync backoff", @@ -8135,14 +8136,7 @@

Run History

(project.warning_count ?? 0) > 0 || ["degraded", "stale_cache"].includes(project.connector_state) ) { - if ((project.cleanup_pending_count ?? 0) > 0) { - return { label: "cleanup pending", tone: "tone-retained", title: "Post-land cleanup pending" }; - } - - return { label: "sync degraded", tone: "tone-wait", title: "Tracker sync or retry state degraded" }; - } - if ((project.cleanup_pending_count ?? 0) > 0) { - return { label: "cleanup pending", tone: "tone-retained", title: "Post-land cleanup pending" }; + return { label: "sync degraded", tone: "tone-muted", title: "Tracker sync or retry state degraded" }; } return { label: "ok", tone: "tone-ready", title: "No project warnings" }; @@ -8458,13 +8452,13 @@

Run History

if ((project.cleanup_pending_count ?? 0) > 0) { return 4; } - if (["backoff", "degraded", "stale_cache"].includes(project.connector_state)) { + if (projectHasActiveWork(project)) { return 5; } - if ((project.warning_count ?? 0) > 0) { + if (["backoff", "degraded", "stale_cache"].includes(project.connector_state)) { return 6; } - if (projectHasActiveWork(project)) { + if ((project.warning_count ?? 0) > 0) { return 7; } @@ -9165,7 +9159,7 @@

${escapeHtml(title)}

function recoveryWorktreeShouldDefaultOpen(renderedWorktree) { const role = renderedWorktree.role; - return role.tone === "tone-blocked" || role.label.includes("cleanup"); + return role.tone === "tone-blocked"; } function renderWorktrees(snapshot) { diff --git a/apps/decodex/src/orchestrator/tests/operator/status/dashboard.rs b/apps/decodex/src/orchestrator/tests/operator/status/dashboard.rs index f610ce08..eb4f439c 100644 --- a/apps/decodex/src/orchestrator/tests/operator/status/dashboard.rs +++ b/apps/decodex/src/orchestrator/tests/operator/status/dashboard.rs @@ -1140,7 +1140,8 @@ fn operator_dashboard_projects_show_compact_activity_work_and_location() { assert!(response.contains("return projects.filter(projectHasActiveWork);")); assert!(response.contains("project.queued_candidate_count ?? 0")); assert!(response.contains("project.post_review_lane_count ?? 0")); - assert!(response.contains("return workCount > 0 || (project.warning_count ?? 0) > 0 || syncNeedsAttention;")); + assert!(response.contains("return workCount > 0;")); + assert!(!response.contains("syncNeedsAttention")); assert!(!response.contains("project.retained_worktree_count ?? 0);")); assert!(!response.contains("projectHasRecentActivity(project)")); assert!(response.contains("class=\"project-activity\"")); @@ -1157,6 +1158,7 @@ fn operator_dashboard_projects_show_compact_activity_work_and_location() { assert!(response.contains("return { label: \"cleanup pending\", tone: \"tone-retained\"")); assert!(response.contains("label: \"sync backoff\"")); assert!(response.contains("label: \"sync degraded\"")); + assert!(response.contains("label: \"sync degraded\", tone: \"tone-muted\"")); assert!(response.contains("return { label: \"ok\", tone: \"tone-ready\"")); assert!(!response.contains("function projectSyncMeta(project, health)")); assert!(!response.contains("const connectorCopy = projectSyncMeta(project, health);")); @@ -1326,7 +1328,8 @@ fn operator_dashboard_flow_counts_distinguish_intake_attention() { assert!(response.contains("? pluralize(retainedWorktrees.length, \"worktree\")")); assert!(!response.contains("retained or cleanup")); assert!(response.contains("function recoveryWorktreeShouldDefaultOpen(renderedWorktree)")); - assert!(response.contains("role.tone === \"tone-blocked\" || role.label.includes(\"cleanup\")")); + assert!(response.contains("role.tone === \"tone-blocked\"")); + assert!(!response.contains("role.label.includes(\"cleanup\")")); assert!(response.contains("label: isDirty ? \"post-review cleanup blocked\" : \"post-review cleanup\"")); assert!(response.contains("retainedWorktrees.some(recoveryWorktreeShouldDefaultOpen)")); assert!(!response.contains("syncDefaultDetailOpenState(nodes.panels.worktrees, retainedWorktrees.length > 0);"));