From 5f0bcba994fa36c625f3193ae236f85c7c633315 Mon Sep 17 00:00:00 2001 From: Yvette Carlisle Date: Thu, 21 May 2026 11:11:23 +0800 Subject: [PATCH 1/2] {"schema":"decodex/commit/1","summary":"Fold recovery worktrees unless blocked","authority":"manual"} --- apps/decodex/src/orchestrator/operator_dashboard.html | 2 +- .../src/orchestrator/tests/operator/status/dashboard.rs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/decodex/src/orchestrator/operator_dashboard.html b/apps/decodex/src/orchestrator/operator_dashboard.html index 829a80da..26897f43 100644 --- a/apps/decodex/src/orchestrator/operator_dashboard.html +++ b/apps/decodex/src/orchestrator/operator_dashboard.html @@ -9165,7 +9165,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..cbdee520 100644 --- a/apps/decodex/src/orchestrator/tests/operator/status/dashboard.rs +++ b/apps/decodex/src/orchestrator/tests/operator/status/dashboard.rs @@ -1326,7 +1326,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);")); From 2175ffdfb57079162129000cd671936dc71cbd78 Mon Sep 17 00:00:00 2001 From: Yvette Carlisle Date: Thu, 21 May 2026 11:20:31 +0800 Subject: [PATCH 2/2] {"schema":"decodex/commit/1","summary":"Fix project filter active scope","authority":"manual"} --- .../src/orchestrator/operator_dashboard.html | 22 +++++++------------ .../tests/operator/status/dashboard.rs | 4 +++- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/apps/decodex/src/orchestrator/operator_dashboard.html b/apps/decodex/src/orchestrator/operator_dashboard.html index 26897f43..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; } diff --git a/apps/decodex/src/orchestrator/tests/operator/status/dashboard.rs b/apps/decodex/src/orchestrator/tests/operator/status/dashboard.rs index cbdee520..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);"));