diff --git a/apps/decodex/src/orchestrator/operator_dashboard.html b/apps/decodex/src/orchestrator/operator_dashboard.html index 3da61c3..6f3c3b9 100644 --- a/apps/decodex/src/orchestrator/operator_dashboard.html +++ b/apps/decodex/src/orchestrator/operator_dashboard.html @@ -6855,6 +6855,10 @@

Run History

return `${childBucketSharePercent(bucket, totalWall)}% ยท ${formatDuration(seconds)} / ${formatDuration(totalWall)}`; } + function childBucketRenderKey(bucket) { + return `child-bucket:${bucket?.name || "unknown"}`; + } + function childDiagnosticBucketRank(bucket) { const name = String(bucket?.name || "").toLowerCase(); if (name.includes("protocol")) { @@ -6955,7 +6959,7 @@

Run History

const width = childBucketWidth(bucket, totalWall); return ` -
+
${escapeHtml(humanizeToken(bucket.name))} ${escapeHtml(childBucketShareLabel(bucket, totalWall))} @@ -6982,7 +6986,7 @@

Run History

const signalSummary = childBucketDiagnosticSummary(bucket); return ` -
+
${escapeHtml(humanizeToken(bucket.name))} ${renderChildBucketDiagnosticSignals(bucket)} diff --git a/apps/decodex/src/orchestrator/tests/operator/status/dashboard.rs b/apps/decodex/src/orchestrator/tests/operator/status/dashboard.rs index 3e0896a..de94301 100644 --- a/apps/decodex/src/orchestrator/tests/operator/status/dashboard.rs +++ b/apps/decodex/src/orchestrator/tests/operator/status/dashboard.rs @@ -368,6 +368,19 @@ fn operator_dashboard_child_bucket_rows_split_time_bars_from_event_diagnostics() )); } +#[test] +fn operator_dashboard_keys_child_bucket_rows_for_stable_patching() { + let response = dashboard_response(); + + assert!(response.contains("function childBucketRenderKey(bucket)")); + assert_eq!( + response + .matches("data-render-key=\"${escapeHtml(childBucketRenderKey(bucket))}\"") + .count(), + 2 + ); +} + #[test] fn operator_dashboard_active_run_status_copy_stays_concise() { let response = dashboard_response();