refactor(#2591): drop the client-side DAG label map — show source + node kinds

Per mara (#2660): the client shouldn't re-derive a friendly name from
node kinds — that re-bakes the domain knowledge the raw-graph redesign
removed. The queue card / hivectl header now shows what the backend sends
(the DAG's source + the raw node kinds); the node chain conveys the
operation. Removes the DagView::label() helper (hivectl was its only
consumer after iris dropped the frontend map in #2660) and points
hivectl's header at d.source instead.
This commit is contained in:
atlas 2026-07-23 17:56:00 +02:00 committed by mara
commit 0ee4647d1e
2 changed files with 8 additions and 36 deletions

View file

@ -192,32 +192,4 @@ impl DagView {
State::Done
}
}
/// A short human label for the DAG, derived from its node kinds — the
/// shared replacement for the old `Template` wire string now that the kind
/// isn't sent. Priority-ordered so the most distinctive node wins (an
/// approval deploy reads as "deploy" even though it also rebuilds). Purely
/// cosmetic (progress/queue display); consumers that need exactness inspect
/// the node kinds directly.
#[must_use]
pub fn label(&self) -> &'static str {
let has = |k: &str| self.nodes.iter().any(|n| n.kind == k);
if has("approval_deploy") {
"deploy"
} else if has("meta_lock") {
"meta-update"
} else if has("create") || has("provision") {
"spawn"
} else if has("swap") || has("prebuild") || has("post_swap") {
"rebuild"
} else if has("write_perm_file") {
"perm-change"
} else if has("signal") || has("drain") {
"graceful"
} else if has("set_wanted") || has("stop_for_update") {
"power"
} else {
"reconcile"
}
}
}

View file

@ -67,7 +67,7 @@ async fn wait_for_dags_plain(socket: &Path, ids: Vec<u64>) -> Result<()> {
// sees whether the agent came back.
if d.nodes.iter().all(|n| n.state.is_terminal()) {
if d.rollup_state() == hive_sh4re::jobs::State::Failed {
failed.push(format!("{} {}", d.label(), dag_agents(d)));
failed.push(format!("{} {}", d.source.as_str(), dag_agents(d)));
}
} else {
all_terminal = false;
@ -135,7 +135,7 @@ async fn wait_for_dags_animated(socket: &Path, ids: Vec<u64>) -> Result<()> {
hdr.set_message(format!(
"{} {} {} · {}",
state_glyph(d.rollup_state()),
d.label(),
d.source.as_str(),
dag_agents(d),
fmt_dur(dag_elapsed(d, now)),
));
@ -164,7 +164,7 @@ async fn wait_for_dags_animated(socket: &Path, ids: Vec<u64>) -> Result<()> {
}
if d.nodes.iter().all(|n| n.state.is_terminal()) {
if d.rollup_state() == hive_sh4re::jobs::State::Failed {
failed.push(format!("{} {}", d.label(), dag_agents(d)));
failed.push(format!("{} {}", d.source.as_str(), dag_agents(d)));
}
} else {
all_terminal = false;
@ -290,16 +290,16 @@ fn state_glyph(state: hive_sh4re::jobs::State) -> &'static str {
}
}
/// One progress line for a DAG: roll-up glyph, derived label, agents, then
/// the node chain — the CLI twin of the dashboard's queue card. Both the
/// roll-up state and the label are derived from the node set (the wire no
/// longer carries them). Used by the plain (non-TTY) path.
/// One progress line for a DAG: roll-up glyph, `source`, agents, then the
/// node chain — the CLI twin of the dashboard's queue card. The header shows
/// what the backend sends (`source` + the raw node kinds); only the roll-up
/// state glyph is derived from the node set. Used by the plain (non-TTY) path.
fn render_dag_line(d: &hive_sh4re::jobs::DagView) -> String {
use std::fmt::Write as _;
let mut out = format!(
"{} {} {:<12}",
state_glyph(d.rollup_state()),
d.label(),
d.source.as_str(),
dag_agents(d)
);
for (i, n) in d.nodes.iter().enumerate() {