diff --git a/docs/agents.md b/docs/agents.md index c5bf951..5afd3b5 100644 --- a/docs/agents.md +++ b/docs/agents.md @@ -34,7 +34,7 @@ Where two beads name one pane, `bdi` awards the key's claim to neither. The refusal is reported as a conflict, and nothing errors. What the pane says about itself then stands alone: a `display_agent` naming exactly one of those beads keeps that bead's agent, and one naming nothing drops your pane among the -unattributed panes below the trees, reading exactly like an agent that never +unclaimed panes below the trees, reading exactly like an agent that never registered. Working on two beads at once, name your pane on one of them. ## Clear the key when you stop diff --git a/docs/configuration.md b/docs/configuration.md index 5869061..a3bac9e 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -450,9 +450,9 @@ says its anomalies: | what the badge met | what the row says | |---|---| -| a value that left part of the `link` unfilled | `no link for delivery_pr: this value leaves part of it unfilled` | +| a value that left part of the `link` unfilled | `no link for delivery_pr: its value does not fit the link template` | | a link holding a control character | `no link for delivery_pr: it holds a control character` | -| a value that left part of the `short` unfilled | `no short form for delivery_pr: this value leaves part of it unfilled` | +| a value that left part of the `short` unfilled | `no short form for delivery_pr: its value does not fit the template` | | a `short` holding a control character, on a badge with a `link` | `no short form for delivery_pr: it holds a control character` | The first `short` row holds whether or not the badge has a `link`. The second is diff --git a/docs/design.md b/docs/design.md index 0e0829b..74fbadf 100644 --- a/docs/design.md +++ b/docs/design.md @@ -1916,9 +1916,9 @@ reader's choice rather than a producer failing where nobody can see. **A socket that cannot be opened is said twice, deliberately, and the two are not copies.** No path to put it at, or another `bdi` already listening on the one it has, and this one polls everything exactly as it did before. The notice -at the foot says what it costs the reader — *nothing can tell bdi a project -changed · every project is polled instead*, or *another bdi held the inbound -channel* where that is the cause, since that one names a process the reader can +at the foot says what it costs the reader — *bdi cannot hear about changes · +every project is polled instead*, or *another bdi is already listening for +changes* where that is the cause, since that one names a process the reader can close. The `stderr` line names the path and the `io::Error` under it, and the remedy: a process to close where there is one, and where there is not, the flag and the key that name a path — a reader with no runtime directory has none to diff --git a/src/collect/changes.rs b/src/collect/changes.rs index e6369a2..15ddced 100644 --- a/src/collect/changes.rs +++ b/src/collect/changes.rs @@ -266,7 +266,7 @@ impl fmt::Display for Refused { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, - "nothing can tell bdi a project changed, so every project is polled: " + "bdi cannot hear about changes, so every project is polled: " )?; match self { // The refusal a machine can be in for ever, so the one whose @@ -280,7 +280,7 @@ impl fmt::Display for Refused { Refused::NoRuntimeDirectory => { write!( f, - "this session has no {RUNTIME_DIRECTORY} to put the socket in — name a path with --socket, or with socket under [changes] in the config, and bdi listens there" + "this session has no {RUNTIME_DIRECTORY} to put the socket in; choose a path with --socket, or with socket under [changes] in the config" ) } // The one refusal a reader answers by closing something, so the @@ -306,7 +306,7 @@ impl fmt::Display for Refused { Refused::AlreadyListening(at) => { write!( f, - "another bdi is listening on {}; ss -lxp or lsof -U names which — close it and restart bdi to get the channel", + "another bdi is listening on {}; find it with ss -lxp or lsof -U, close it, then restart bdi", at.display() ) } @@ -318,7 +318,7 @@ impl fmt::Display for Refused { Refused::NotASocket(at) => { write!( f, - "{} is not a socket and bdi will not take it — name another path with --socket, or with socket under [changes] in the config", + "{} is not a socket, so bdi will not use it; choose another path with --socket, or with socket under [changes] in the config", at.display() ) } @@ -330,7 +330,7 @@ impl fmt::Display for Refused { Refused::NameOthersMayTake(directory) => { write!( f, - "another user may take a name in {} — name a socket path with no such directory above it, with --socket or with socket under [changes] in the config", + "other users can create files in {}, so bdi will not put its socket there; choose a path outside it with --socket, or with socket under [changes] in the config", directory.display() ) } @@ -1416,7 +1416,7 @@ mod tests { assert!(said.contains("another bdi"), "{said}"); assert!(said.contains("/run/user/1000/x.sock"), "{said}"); - assert!(said.contains("ss -lxp or lsof -U names which"), "{said}"); + assert!(said.contains("find it with ss -lxp or lsof -U"), "{said}"); } /// The remedy is two steps and the second one is the one a reader would diff --git a/src/collect/discovery.rs b/src/collect/discovery.rs index ad7560b..584770c 100644 --- a/src/collect/discovery.rs +++ b/src/collect/discovery.rs @@ -39,7 +39,7 @@ pub fn from_the_current_directory( ) { return Err(failure.into()); } - anyhow::bail!("{} is not in anything beads tracks", cwd.display()); + anyhow::bail!("{} is not inside a beads project", cwd.display()); } }; diff --git a/src/config.rs b/src/config.rs index dcd8a06..7321994 100644 --- a/src/config.rs +++ b/src/config.rs @@ -764,8 +764,8 @@ impl Config { .is_some() { anyhow::bail!( - "[roots] metadata_keys is gone: every unfinished bead is a root, so a key \ - could name nothing bd's statuses do not; remove it" + "[roots] metadata_keys is no longer used, because every unfinished bead is \ + now a root; remove it" ); } let cfg: Config = table.try_into()?; @@ -775,8 +775,7 @@ impl Config { let repeated = cfg.names_borne_by_more_than_one_project(); if !repeated.is_empty() { anyhow::bail!( - "a project's name is how bdi tells its beads from another tracker's, so \ - two projects cannot answer to one; repeated: {}", + "each project needs a name of its own, and these are used more than once: {}", repeated.join(", ") ); } @@ -786,17 +785,15 @@ impl Config { .is_some_and(Command::names_no_program) }) { anyhow::bail!( - "{} names an environment_command with no program in it; bdi appends its own \ - probe to what you write, so an empty one would read the project in bdi's \ - environment while saying it was read in its own", + "{}'s environment_command is empty; name a program, or remove the setting", project.name ); } for (named, ids) in &cfg.roots.explicit { if !cfg.is_configured(named) { anyhow::bail!( - "[roots.explicit] gives {} to {named}, which is no project of this \ - config; bdi is reading {}", + "[roots.explicit] lists {} under {named}, but there is no project called \ + {named}; the configured projects are {}", ids.join(", "), names_of(&cfg.projects).join(", ") ); @@ -804,9 +801,7 @@ impl Config { } let mut named: HashSet<&Cell> = HashSet::new(); if let Some(twice) = cfg.row.cells().find(|cell| !named.insert(cell)) { - anyhow::bail!( - "[row] names {twice} twice; a cell is drawn in one place, so name it in one list" - ); + anyhow::bail!("[row] names {twice} twice; name it in only one list"); } let configured: BTreeSet = cfg .projects @@ -820,8 +815,8 @@ impl Config { .find(|cell| matches!(cell, Cell::Badge(key) if !configured.contains(key))) { anyhow::bail!( - "[row] names {unconfigured}, which no [[badges]] or [[projects.badges]] entry \ - configures, so it would draw nothing on any row" + "[row] names {unconfigured}, but no [[badges]] or [[projects.badges]] entry \ + defines it" ); } Ok(cfg) @@ -868,8 +863,8 @@ impl Config { .collect(); if !unknown.is_empty() { anyhow::bail!( - "--project names {}, which is no project of this config; bdi is \ - configured for {}", + "--project names {}, which is not a configured project; the configured \ + projects are {}", unknown.join(", "), names_of(&self.projects).join(", ") ); @@ -938,8 +933,8 @@ impl Config { return match reading.as_slice() { [only] => Ok((only.name.clone(), named.to_string())), several => anyhow::bail!( - "{named} names no project, and bdi is reading {}; write it as \ - :{named}", + "{named} does not say which project it is in, and bdi is reading {}; \ + write it as :{named}", several .iter() .map(|p| p.name.as_str()) @@ -953,8 +948,8 @@ impl Config { } if !self.is_configured(project) { anyhow::bail!( - "{named} gives {id} to {project}, which is not among the projects \ - bdi is configured for: {}", + "{named}: {project} is not a configured project; the configured \ + projects are {}", names_of(&self.projects).join(", ") ); } @@ -962,8 +957,7 @@ impl Config { match &mut self.scope { Scope::Directory { widened, .. } => widened.push(project.to_string()), Scope::Asked(_) | Scope::Everything => anyhow::bail!( - "{named} gives {id} to {project}, which is not among the projects \ - bdi is reading: {}", + "{named}: bdi is not reading {project}; it is reading {}", self.read() .map(|p| p.name.as_str()) .collect::>() @@ -2277,7 +2271,7 @@ metadata_keys = ["working_topic"] ) .unwrap_err(); assert!(err.to_string().contains("metadata_keys"), "got: {err}"); - assert!(err.to_string().contains("gone"), "got: {err}"); + assert!(err.to_string().contains("no longer used"), "got: {err}"); } #[test] diff --git a/src/tui/screen.rs b/src/tui/screen.rs index 8470ffd..5804deb 100644 --- a/src/tui/screen.rs +++ b/src/tui/screen.rs @@ -4124,7 +4124,7 @@ mod tests { assert_eq!(cursor(&shown), Some(&bead("grove", "grv-1.2"))); assert!( - foot_of(&mut shown, 80, 24).contains("grove · grv-1.2 — 2 of 6 matching"), + foot_of(&mut shown, 80, 24).contains("grove · grv-1.2 · match 2 of 6"), "{:?}", foot_of(&mut shown, 80, 24) ); @@ -4161,7 +4161,7 @@ mod tests { assert_eq!(forest_band(&mut shown, 60, 24), was); at_prompt(&mut shown, Typing::Sought); assert!( - foot_of(&mut shown, 100, 24).contains("nothing matching \"grv-1.3x\""), + foot_of(&mut shown, 100, 24).contains("nothing matches \"grv-1.3x\""), "{:?}", foot_of(&mut shown, 100, 24) ); @@ -4282,7 +4282,7 @@ mod tests { assert_eq!(cursor(&shown), Some(&bead("grove", "grv-1.3"))); assert!( - foot_of(&mut shown, 80, 24).contains("grove · grv-1.3 — the only match"), + foot_of(&mut shown, 80, 24).contains("grove · grv-1.3 · the only match"), "{:?}", foot_of(&mut shown, 80, 24) ); @@ -4298,7 +4298,7 @@ mod tests { search_for(&mut shown, "grv-1."); assert!( - foot_of(&mut shown, 80, 24).contains("grove · grv-1.1 — 1 of 6 matching"), + foot_of(&mut shown, 80, 24).contains("grove · grv-1.1 · match 1 of 6"), "{:?}", foot_of(&mut shown, 80, 24) ); @@ -4314,7 +4314,7 @@ mod tests { assert_eq!(cursor(&shown), Some(&bead("grove", "grv-1.2"))); assert!( - foot_of(&mut shown, 80, 24).contains("grove · grv-1.2 — 2 of 6 matching"), + foot_of(&mut shown, 80, 24).contains("grove · grv-1.2 · match 2 of 6"), "{:?}", foot_of(&mut shown, 80, 24) ); @@ -4347,8 +4347,7 @@ mod tests { assert_eq!(cursor(&shown).cloned(), was); assert!( - foot_of(&mut shown, 80, 24) - .contains("nothing matching \"grv-404\" in any tracker read"), + foot_of(&mut shown, 80, 24).contains("nothing matches \"grv-404\""), "{:?}", foot_of(&mut shown, 80, 24) ); @@ -4397,7 +4396,7 @@ mod tests { fn the_readers_next_press_takes_a_searchs_answer_off_the_foot() { let mut shown = shown(a_grove(6)); search_for(&mut shown, "grv-404"); - assert!(foot_of(&mut shown, 80, 24).contains("nothing matching \"grv-404\"")); + assert!(foot_of(&mut shown, 80, 24).contains("nothing matches \"grv-404\"")); assert!(shown.pressed()); @@ -4490,7 +4489,7 @@ mod tests { ); let foot = foot_of(&mut shown, 100, 24); assert!(foot.contains("F whole forest"), "{foot:?}"); - assert!(foot.contains("the forest is focused"), "{foot:?}"); + assert!(foot.contains("showing focused beads"), "{foot:?}"); press(&mut shown, KeyCode::Char('F')); @@ -4533,7 +4532,7 @@ mod tests { } /// A grove on a machine whose herdr will not answer, which is a notice on - /// every frame and fifty-four of an eighty-column foot's columns. + /// every frame and forty-one of the foot's columns. fn a_grove_with_no_herdr(beads: usize) -> Snapshot { Snapshot { agents: a_provider(ProviderState::NotAnswering), @@ -4544,14 +4543,14 @@ mod tests { /// The bead this was written for. The window holds four fifths of the /// screen and its title no longer names the way out, so a notice that /// took the whole row away left nothing on screen saying how to leave. - /// Eighty columns is a supported width, and a machine with no herdr - /// raises that notice on every frame rather than in a corner. + /// A machine with no herdr raises that notice on every frame rather than + /// in a corner, and at this width it leaves no room for every key. #[test] fn the_windows_row_keeps_the_way_out_beside_a_notice() { let mut shown = shown(a_grove_with_no_herdr(6)); assert!(shown.apply(Action::ShowBead)); - let foot = bead_view(&mut shown, 80, 24) + let foot = bead_view(&mut shown, 67, 24) .pop() .expect("a screen with rows on it"); @@ -4567,11 +4566,11 @@ mod tests { fn the_forests_row_still_goes_whole_beside_a_notice() { let mut shown = shown(a_grove_with_no_herdr(6)); - let foot = foot_of(&mut shown, 80, 24); + let foot = foot_of(&mut shown, 67, 24); assert_eq!( foot.trim_end(), - "\u{26a0} no herdr session \u{b7} which agents are alive is unknown" + "\u{26a0} no herdr session \u{b7} agents are not shown" ); } diff --git a/src/view/draw/bead.rs b/src/view/draw/bead.rs index 8e9aaa7..be87362 100644 --- a/src/view/draw/bead.rs +++ b/src/view/draw/bead.rs @@ -493,7 +493,7 @@ mod tests { ) .rows(); - says(&drawn[0], "2 beads beneath"); + says(&drawn[0], "2 beads to check"); } /// A count of nought is left out rather than drawn, exactly as the @@ -548,7 +548,7 @@ mod tests { "{painted:?}" ); assert_eq!( - colour_of("2 beads beneath"), + colour_of("2 beads to check"), palette::ATTENTION.fg, "{painted:?}" ); diff --git a/src/view/draw/foot.rs b/src/view/draw/foot.rs index 225d421..561109d 100644 --- a/src/view/draw/foot.rs +++ b/src/view/draw/foot.rs @@ -324,10 +324,7 @@ mod tests { ) .rows(); - says( - &drawn[0], - "no herdr session · which agents are alive is unknown", - ); + says(&drawn[0], "no herdr session · agents are not shown"); } /// The bead this row was built for: a `bdi` that could not open its @@ -353,7 +350,7 @@ mod tests { says( &drawn[0], - "nothing can tell bdi a project changed · every project is polled instead", + "bdi cannot hear about changes · every project is polled instead", ); } @@ -378,8 +375,8 @@ mod tests { .rows(); for words in [ - "no herdr session · which agents are alive is unknown", - "nothing can tell bdi a project changed · every project is polled instead", + "no herdr session · agents are not shown", + "bdi cannot hear about changes · every project is polled instead", ] { says(&drawn[0], words); } @@ -405,11 +402,8 @@ mod tests { ) .rows(); - says( - &drawn[0], - "no herdr session · which agents are alive is unknown", - ); - says(&drawn[0], "polled, not reported"); + says(&drawn[0], "no herdr session · agents are not shown"); + says(&drawn[0], "polling for changes"); } /// The bead window's row as the loop hands it to the foot: the forms it @@ -428,9 +422,8 @@ mod tests { /// The bead this was written for. A window holding four fifths of the /// screen leaves the reader nothing to look at, so the row that says how - /// to leave it must not be what a notice takes away. Eighty columns is a - /// supported width and a machine with no herdr raises this notice on - /// every frame. + /// to leave it must not be what a notice takes away. A machine with no + /// herdr raises this notice on every frame. #[test] fn a_row_that_can_say_less_says_less_rather_than_going() { let drawn = Painted::of( @@ -441,9 +434,9 @@ mod tests { &a_row_that_can_say_less(), Spine::default(), false, - 80, + 67, ), - 80, + 67, 1, ) .rows(); @@ -466,16 +459,16 @@ mod tests { &a_row_that_can_say_less(), Spine::default(), false, - 60, + 47, ), - 60, + 47, 1, ) .rows(); assert_eq!( drawn[0].trim_end(), - "\u{26a0} no herdr session \u{b7} which agents are alive is unknown" + "\u{26a0} no herdr session \u{b7} agents are not shown" ); } @@ -527,8 +520,8 @@ mod tests { assert_eq!( drawn[0].trim_end(), format!( - "⚠ no herdr session · which agents are alive is unknown copied grv-1{}{A_KEY_ROW}", - " ".repeat(120 - 54 - 2 - 12 - A_KEY_ROW.chars().count()) + "⚠ no herdr session · agents are not shown copied grv-1{}{A_KEY_ROW}", + " ".repeat(120 - 41 - 2 - 12 - A_KEY_ROW.chars().count()) ) ); } @@ -592,7 +585,7 @@ mod tests { ) .rows(); - assert_eq!(drawn[0], "⚠ agents unknown ⚠ polled, not reported"); + assert_eq!(drawn[0], "⚠ agents unknown ⚠ polling for changes "); } /// A second `bdi` on a machine whose herdr is well: one notice, and in @@ -616,7 +609,7 @@ mod tests { ) .rows(); - assert!(drawn[0].starts_with("⚠ polled, not reported"), "{drawn:?}"); + assert!(drawn[0].starts_with("⚠ polling for changes"), "{drawn:?}"); } /// A notice is drawn in the colour that asks to be looked at, and saying @@ -641,7 +634,7 @@ mod tests { assert!( painted .iter() - .any(|run| run.said.contains("polled, not reported") + .any(|run| run.said.contains("polling for changes") && run.style.fg == palette::ATTENTION.fg), "{painted:?}" ); @@ -672,7 +665,7 @@ mod tests { says( &drawn[0], - "another bdi held the inbound channel · every project is polled instead", + "another bdi is already listening for changes · every project is polled instead", ); } @@ -701,7 +694,7 @@ mod tests { assert_eq!( drawn[0].trim_end(), - "⚠ agents unknown ⚠ another bdi had it" + "⚠ agents unknown ⚠ another bdi running" ); } @@ -830,14 +823,14 @@ mod tests { assert!( row(Spine::default()) .trim_end() - .ends_with(" the forest is focused"), + .ends_with(" showing focused beads"), "{:?}", row(Spine::default()) ); assert!( row(Spine::Shallowest) .trim_end() - .ends_with(" the forest is focused · opening the shallowest copy of each bead"), + .ends_with(" showing focused beads · opening the shallowest copy of each bead"), "{:?}", row(Spine::Shallowest) ); @@ -894,9 +887,9 @@ mod tests { assert_eq!( drawn[0].trim_end(), format!( - "⚠ no herdr session · which agents are alive is unknown \ + "⚠ no herdr session · agents are not shown \ opening the shallowest copy of each bead{}{A_KEY_ROW}", - " ".repeat(150 - 54 - 2 - 40 - A_KEY_ROW.chars().count()) + " ".repeat(150 - 41 - 2 - 40 - A_KEY_ROW.chars().count()) ) ); assert!( @@ -1039,7 +1032,7 @@ mod tests { assert_eq!( drawn[0].trim_end(), - "⚠ no herdr session · which agents are alive is unknown" + "⚠ no herdr session · agents are not shown" ); } @@ -1069,7 +1062,7 @@ mod tests { /// Whole where it fits, and the column under that is the whole difference. #[test] fn the_key_row_is_drawn_whole_at_the_first_width_that_holds_it() { - let notice = "⚠ no herdr session · which agents are alive is unknown"; + let notice = "⚠ no herdr session · agents are not shown"; let fits = notice.chars().count() + GAP + A_KEY_ROW.chars().count(); let row = |width: usize| { Painted::of( diff --git a/src/view/draw/groups.rs b/src/view/draw/groups.rs index a6e6656..906db59 100644 --- a/src/view/draw/groups.rs +++ b/src/view/draw/groups.rs @@ -288,7 +288,7 @@ mod tests { assert!(drawn[0].contains("3 other trees"), "{drawn:?}"); assert!( - drawn[0].ends_with("2 agents beneath ⚠ 1 bead beneath"), + drawn[0].ends_with("2 agents beneath ⚠ 1 bead to check"), "{drawn:?}" ); } diff --git a/src/view/draw/mod.rs b/src/view/draw/mod.rs index 9794ace..fa0e3e0 100644 --- a/src/view/draw/mod.rs +++ b/src/view/draw/mod.rs @@ -777,7 +777,7 @@ mod tests { " ", " ", " ", - "⚠ no herdr session · which agents are alive is unknown ", + "⚠ no herdr session · agents are not shown ", ] ); } @@ -847,7 +847,7 @@ mod tests { " ", " ", " ", - "⚠ nothing can tell bdi a project changed · every project is polled instead ", + "⚠ bdi cannot hear about changes · every project is polled instead ", ] ); } @@ -960,7 +960,7 @@ mod tests { [ "▾ summit-works ⚠ 30s ago ", " ├── ⚠ smt-4kd3p the tracker did not answer ", - " └── ⚠ 1 unattributed pane ", + " └── ⚠ 1 unclaimed pane ", " └── ◍ wCM:p9 working /tmp/bdi-ground/summit-works ", ] ); diff --git a/src/view/draw/project.rs b/src/view/draw/project.rs index fbbc7c5..2667808 100644 --- a/src/view/draw/project.rs +++ b/src/view/draw/project.rs @@ -837,7 +837,10 @@ mod tests { .rows(); says(&drawn[0], "smt-4kd3p"); - says(&drawn[0], "this root drew no rows, and nothing said why"); + says( + &drawn[0], + "this tree could not be drawn, for no known reason", + ); } /// The identity of a root outlasts everything else on its line: a reader diff --git a/src/view/phrase.rs b/src/view/phrase.rs index 138b4a5..4082729 100644 --- a/src/view/phrase.rs +++ b/src/view/phrase.rs @@ -66,21 +66,21 @@ pub fn tracker_failure(failure: &TrackerFailure) -> String { fn redacted(failure: &TrackerFailure) -> &'static str { match failure { TrackerFailure::NoEnvironment => concat!( - "asked for an environment bdi could not produce · nothing was read, ", - "because the bd here is not the one this project asked for" + "could not set up this project's environment · ", + "nothing was read" ), TrackerFailure::NoCredential => concat!( - "the credential command this project names would not run · nothing ", - "was read, and no bd was asked for this project" + "this project's credential command failed · ", + "nothing was read" ), - TrackerFailure::Auth => "the tracker refused the credential it was given", + TrackerFailure::Auth => "the tracker rejected the credential", TrackerFailure::Unavailable => "the tracker did not answer", TrackerFailure::NotInstalled => "bd is not installed", TrackerFailure::Unstartable => "bd could not be started", - TrackerFailure::InstalledUnstartable => "bd is installed and could not be started", - TrackerFailure::Parse(_) => "bd answered with something bdi cannot read", + TrackerFailure::InstalledUnstartable => "bd is installed but could not be started", + TrackerFailure::Parse(_) => "bdi could not understand bd's answer", TrackerFailure::UnknownFlag => concat!( - "bd does not know a flag bdi uses · bdi needs bd ", + "bd rejected a flag bdi uses · bdi needs bd ", bd_floor!(), " or newer" ), @@ -93,21 +93,22 @@ fn redacted(failure: &TrackerFailure) -> &'static str { /// they can no longer see, or how stale what they are looking at may be. pub fn notice(notice: &Notice) -> String { match notice { - Notice::AgentsUnknown => "no herdr session · which agents are alive is unknown".to_string(), + Notice::AgentsUnknown => "no herdr session · agents are not shown".to_string(), Notice::SessionUnanswered(session) => { - format!("herdr session {session} did not answer · which agents are in it is unknown") + format!("herdr session {session} did not answer · its agents are not shown") } Notice::NoInboundChannel => { - "nothing can tell bdi a project changed · every project is polled instead".to_string() + "bdi cannot hear about changes · every project is polled instead".to_string() } Notice::AnotherBdiHadTheInboundChannel => { - "another bdi held the inbound channel · every project is polled instead".to_string() + "another bdi is already listening for changes · every project is polled instead" + .to_string() } Notice::ConfigWouldNotReload => { - "the config would not load · bdi is still on the one before the edit".to_string() + "the edited config has an error · still using the previous one".to_string() } Notice::ProjectNamedWithoutGit => { - "git could not be run · this project is named after its directory · set BDI_PROJECT" + "git could not be run · project name guessed from its directory · set BDI_PROJECT" .to_string() } } @@ -125,12 +126,12 @@ pub fn brief_notice(notice: &Notice) -> String { Notice::AgentsUnknown => "agents unknown".to_string(), // The session's name is what survives the cut: which session's // agents are unknown is the whole of what the reader can act on. - Notice::SessionUnanswered(session) => format!("{session} unanswered"), - Notice::NoInboundChannel => "polled, not reported".to_string(), + Notice::SessionUnanswered(session) => format!("{session} not answering"), + Notice::NoInboundChannel => "polling for changes".to_string(), // The cause is what survives the cut, not the cost. A reader who // keeps only *polled* has what the notice this one replaced already // gave them, and still nothing to do about it. - Notice::AnotherBdiHadTheInboundChannel => "another bdi had it".to_string(), + Notice::AnotherBdiHadTheInboundChannel => "another bdi running".to_string(), // What survives the cut is that the edit did not take, because that // is the half the reader cannot see: their editor is still showing // them the text they wrote. @@ -320,7 +321,7 @@ pub fn failed_project(failed: &FailedProject) -> String { pub fn anomaly(anomaly: &Anomaly) -> String { match anomaly { Anomaly::OrphanClaim { refused } => orphan_claim(refused.as_ref()), - Anomaly::StalePane => "closed · its pane is still alive".to_string(), + Anomaly::StalePane => "closed · its pane is still open".to_string(), Anomaly::StaleClaim { days } => { let day = if *days == 1 { "day" } else { "days" }; format!("claimed · untouched for {days} {day}") @@ -342,16 +343,16 @@ fn orphan_claim(refused: Option<&Conflict>) -> String { pane_project.as_deref().unwrap_or("no configured project") ), Some(Conflict::SeveralBeadsNameOnePane { beads, .. }) => { - format!("claimed · {} beads name its pane", beads.len()) + format!("claimed · {} beads claim its pane", beads.len()) } Some(Conflict::PaneIdInSeveralSessions { sessions, .. }) => { - format!("claimed · {} sessions hold its pane id", sessions.len()) + format!("claimed · its pane id is in {} sessions", sessions.len()) } // Neither of these ever gets here. A refusal sends the reader to the // disagreement's row to find the pane the claim was for, and these two // name no one pane, so `join::resolve` refuses no claim with either. Some(Conflict::BeadAndPaneDisagree { .. } | Conflict::SeveralPanesNameOneBead { .. }) - | None => "claimed · no pane".to_string(), + | None => "claimed · no live pane".to_string(), } } @@ -362,13 +363,13 @@ pub fn conflict(conflict: &Conflict) -> String { named_by_bead, named_by_pane, } => format!( - "{}: the bead names pane {}, and pane {} names the bead", + "{}: the bead names pane {}, but pane {} claims it", bead_key(bead), pane_key(named_by_bead), pane_key(named_by_pane) ), Conflict::SeveralPanesNameOneBead { bead, panes } => format!( - "{}: {} panes name this bead — {} — so none holds it", + "{}: claimed by {} panes: {} · none is shown on it", bead_key(bead), panes.len(), panes.iter().map(pane_key).collect::>().join(", ") @@ -378,7 +379,7 @@ pub fn conflict(conflict: &Conflict) -> String { caption, beads, } => format!( - "pane {}{}: {} beads name it — {} — so none holds it", + "pane {}{} is claimed by {} beads: {} · none is shown on it", pane_key(pane), caption.as_deref().map(saying).unwrap_or_default(), beads.len(), @@ -389,7 +390,7 @@ pub fn conflict(conflict: &Conflict) -> String { pane, pane_project, } => format!( - "{}: pane {} is working in {}, so it joins nothing here", + "{}: its pane {} is in {}, not this project", bead_key(bead), pane_key(pane), pane_project.as_deref().unwrap_or("no configured project") @@ -399,7 +400,7 @@ pub fn conflict(conflict: &Conflict) -> String { pane_id, sessions, } => format!( - "{}: the bead names pane {pane_id}, which {} sessions each hold — {} — so none is its", + "{}: pane {pane_id} is in {} sessions: {} · cannot tell which is meant", bead_key(bead), sessions.len(), sessions.join(", ") @@ -411,13 +412,13 @@ pub fn conflict(conflict: &Conflict) -> String { /// reach this, and a root that quietly left the screen would be the one kind /// of wrong answer `bdi` exists to prevent. pub fn root_unread() -> &'static str { - "this root drew no rows, and nothing said why" + "this tree could not be drawn, for no known reason" } /// A root the tracker was asked to draw and holds no bead for. The tracker /// did nothing wrong, so the phrase sends the reader to what named it. pub fn root_not_found() -> &'static str { - "no such bead in this tracker · named in config or on the command line" + "no such bead in this tracker · check the config or command line" } /// Why a blocker a bead waits on is not drawn beneath it. @@ -425,14 +426,14 @@ pub fn unreachable(why: &Unreachable) -> String { match why { Unreachable::NotHeld { projects } => format!("no such bead in {}", projects.join(", ")), Unreachable::HeldBySeveral { projects } => format!( - "{} projects hold a bead by this id — {} — so none is its", + "{} projects have a bead with this id: {} · cannot tell which is meant", projects.len(), projects.join(", ") ), Unreachable::NotRead { projects } => { - format!("in no project bdi read · not read: {}", projects.join(", ")) + format!("not found · projects not read: {}", projects.join(", ")) } - Unreachable::Unconfigured => "in no project bdi is configured to read".to_string(), + Unreachable::Unconfigured => "not in any configured project".to_string(), } } @@ -440,7 +441,7 @@ pub fn unreachable(why: &Unreachable) -> String { /// than as rows of its own. pub fn elided(count: usize) -> String { let bead = if count == 1 { "bead" } else { "beads" }; - format!("{count} more {bead} · finished, and nobody on them") + format!("{count} more finished {bead} with no agent") } /// Work still to do behind a closed line resting shut over it. @@ -477,20 +478,20 @@ pub fn agents_beneath(count: usize) -> String { /// that opening this is worth it. pub fn anomalies_beneath(count: usize) -> String { let bead = if count == 1 { "bead" } else { "beads" }; - format!("{count} {bead} beneath") + format!("{count} {bead} to check") } /// Projects whose tracker could not be read at all, so they have no root to /// hang anything on. pub fn failed_projects(count: usize) -> String { let project = if count == 1 { "project" } else { "projects" }; - format!("{count} {project} whose tracker could not be read") + format!("{count} {project} could not be read") } /// Beads and panes that name each other in ways that cannot all be true. pub fn conflicts(count: usize) -> String { - let conflict = if count == 1 { "conflict" } else { "conflicts" }; - format!("{count} {conflict} nothing could settle") + let claim = if count == 1 { "claim" } else { "claims" }; + format!("{count} conflicting {claim}") } /// The trees the forest is not drawing because the reader rooted it at one @@ -547,7 +548,7 @@ pub fn spine(spine: Spine) -> &'static str { /// That the forest is drawn from the beads the reader focused, with the rest /// behind a line in each project. pub fn focused() -> &'static str { - "the forest is focused" + "showing focused beads" } /// How to see the projects a scope the directory chose left out. @@ -586,7 +587,7 @@ pub fn claim_refused() -> &'static str { /// Live panes that resolved to no bead. pub fn unattributed(count: usize) -> String { let pane = if count == 1 { "pane" } else { "panes" }; - format!("{count} unattributed {pane}") + format!("{count} unclaimed {pane}") } /// Live panes working somewhere `bdi` was never told about. The finding is @@ -594,27 +595,25 @@ pub fn unattributed(count: usize) -> String { /// each directory below it is the one a `[[projects]]` entry would name. pub fn unconfigured(count: usize) -> String { if count == 1 { - return "1 pane in a directory no configured project covers".to_string(); + return "1 pane working outside every configured project".to_string(); } - format!("{count} panes in directories no configured project covers") + format!("{count} panes working outside every configured project") } /// Beads naming something they depend on that this tree does not hold. One /// left with nowhere else to sit hangs off the root. pub fn orphaned_dependency(count: usize) -> String { - let bead = if count == 1 { "bead" } else { "beads" }; - format!( - "{count} {bead} waiting on work outside this tree · no bead by the id each names is in it" - ) + if count == 1 { + return "1 bead depends on a bead not in this tree".to_string(); + } + format!("{count} beads depend on beads not in this tree") } /// Beads whose own descendants lead back to them, each drawn where the loop /// was cut. pub fn cycle(count: usize) -> String { let bead = if count == 1 { "bead" } else { "beads" }; - format!( - "{count} {bead} that must finish before themselves · a chain of dependencies that loops" - ) + format!("{count} {bead} in a dependency loop") } /// Why the whole forest is empty. `bd` is asked for unfinished work and @@ -624,7 +623,7 @@ pub fn cycle(count: usize) -> String { /// own. The clause after the separator is the point: it says the trackers /// answered, which is what a reader must not mistake a blank screen for. pub fn no_roots() -> &'static str { - "no unfinished work anywhere · every tracker answered, and none of them had a root to draw" + "no unfinished work · every tracker was read" } /// Why the tail is showing no pane, where the selection points at none. @@ -641,7 +640,7 @@ pub fn no_agent_to_tail() -> &'static str { } pub fn no_session_to_tail() -> &'static str { - "no herdr session · there is no pane to read" + "no herdr session · no pane to show" } /// That nothing on this machine provides agents at all, which is the ordinary @@ -651,7 +650,7 @@ pub fn no_session_to_tail() -> &'static str { /// they do not recognise would read as something broken. What it says instead /// is what the run is, which is a whole answer rather than a loss. pub fn no_provider_to_tail() -> &'static str { - "no agent provider · bdi is reading beads alone" + "no agents to show · reading beads only" } /// That the pane the selection points at is being read and has not answered @@ -702,10 +701,10 @@ pub fn said(said: &Said) -> String { match said { Said::Copied(id) => format!("copied {id}"), Said::NothingMatched(sought) => { - format!("nothing matching \"{sought}\" in any tracker read") + format!("nothing matches \"{sought}\"") } - Said::Matched { key, of: 1, .. } => format!("{} — the only match", bead_key(key)), - Said::Matched { key, at, of } => format!("{} — {at} of {of} matching", bead_key(key)), + Said::Matched { key, of: 1, .. } => format!("{} · the only match", bead_key(key)), + Said::Matched { key, at, of } => format!("{} · match {at} of {of}", bead_key(key)), } } @@ -768,10 +767,10 @@ pub fn unrecognised_status(status: &Status) -> Option { pub fn undrawn(undrawn: &Undrawn) -> String { match undrawn { Undrawn::Link { key } => { - format!("no link for {key}: this value leaves part of it unfilled") + format!("no link for {key}: its value does not fit the link template") } Undrawn::Short { key } => { - format!("no short form for {key}: this value leaves part of it unfilled") + format!("no short form for {key}: its value does not fit the template") } } } @@ -842,7 +841,7 @@ pub fn bead_window_title(id: &str, from: usize, room: usize, total: usize) -> St /// A bead an edge names that the tracker's answer does not hold, which is /// all the answer can say of it. pub fn not_in_the_answer() -> &'static str { - "not in the tracker's answer" + "not found in the tracker" } /// A kind of edge outside the two `bdi` knows, said as bd's word for it. @@ -1596,7 +1595,7 @@ mod tests { fn an_answer_that_would_not_parse_says_which_read_broke_and_where() { let said = tracker_failure(&TrackerFailure::Parse(an_unreadable())); - says(&said, "bdi cannot read"); + says(&said, "could not understand"); says(&said, "bd list"); says(&said, "expected a string"); says(&said, "line 1 column 25"); @@ -1666,7 +1665,7 @@ mod tests { ); says( redacted(&TrackerFailure::InstalledUnstartable), - "is installed and could not be started", + "is installed but could not be started", ); } @@ -1708,7 +1707,7 @@ mod tests { fn a_project_with_no_environment_is_not_reported_as_a_fault_in_bd() { let said = redacted(&TrackerFailure::NoEnvironment); - says(said, "asked for an environment"); + says(said, "environment"); says(said, "nothing was read"); assert!( !said.contains("bd is") && !said.contains("bd could"), @@ -1879,7 +1878,7 @@ mod tests { }); says(&said, "summit-works"); - says(&said, "the tracker refused the credential it was given"); + says(&said, "the tracker rejected the credential"); } /// bdi-9vm: every claimed bead on a live screen read `claimed · no pane` @@ -2047,7 +2046,7 @@ mod tests { .find("rebuild the installer image") .expect("the pane's own words are in the sentence"); let claims = said - .find("beads name it") + .find("claimed by") .expect("so is the roll of claims on it"); assert!(words < claims, "{said}"); diff --git a/src/view/row.rs b/src/view/row.rs index e73e008..5a2a8ec 100644 --- a/src/view/row.rs +++ b/src/view/row.rs @@ -615,7 +615,7 @@ mod tests { let said = anomaly_marker(&row.anomalies).expect("two rules fired"); assert_eq!(row.anomalies.len(), 2, "{:?}", row.anomalies); - assert!(said.contains("no pane"), "{said}"); + assert!(said.contains("no live pane"), "{said}"); assert!(said.contains("58"), "{said}"); } diff --git a/src/view/show.rs b/src/view/show.rs index e024618..230a81c 100644 --- a/src/view/show.rs +++ b/src/view/show.rs @@ -1543,7 +1543,7 @@ mod tests { let rows = drawn(&orphaned, &mut Show::default(), 50, 24); assert!( - rows.contains(&"│ → dun-9 not in the tracker's answer │".to_string()), + rows.contains(&"│ → dun-9 not found in the tracker │".to_string()), "{rows:#?}" ); } @@ -2564,7 +2564,7 @@ mod tests { " started 2026-03-15", " ◍ lifting the mast · working · inferred, not confirmed", " ⚠ claimed · untouched for 58 days", - " ⚠ closed · its pane is still alive", + " ⚠ closed · its pane is still open", " ⇢ #12 ⏸ waiting", " 3/7", ], diff --git a/tests/a_background_written_under_a_running_bdi_reaches_the_band.rs b/tests/a_background_written_under_a_running_bdi_reaches_the_band.rs index b85429d..c4a633a 100644 --- a/tests/a_background_written_under_a_running_bdi_reaches_the_band.rs +++ b/tests/a_background_written_under_a_running_bdi_reaches_the_band.rs @@ -47,7 +47,7 @@ const COLS: u16 = 120; /// so a sentence is in no run of the stream. The foot says something of its /// own about herdr, and this is the half of the band's sentence that is the /// band's alone. -const NO_PANE_TO_READ: &[u8] = "there is no pane to read".as_bytes(); +const NO_PANE_TO_READ: &[u8] = "no pane to show".as_bytes(); /// The dim attribute, which is the whole of the dark background's answer for /// the band and is asked for nowhere else on the screen. diff --git a/tests/a_bead_searched_for_by_id_is_where_the_selection_lands.rs b/tests/a_bead_searched_for_by_id_is_where_the_selection_lands.rs index 23d4c61..01dd19a 100644 --- a/tests/a_bead_searched_for_by_id_is_where_the_selection_lands.rs +++ b/tests/a_bead_searched_for_by_id_is_where_the_selection_lands.rs @@ -22,8 +22,8 @@ use terminal::{contains, over_the_described_subtree, window_over}; const ROWS: u16 = 40; /// Wider than the eighty columns most of these tests use. This machine has no -/// herdr, so its foot already carries the notice saying which agents are -/// alive is unknown — and the foot gives up what it said back to a keystroke +/// herdr, so its foot already carries the notice saying agents are not +/// shown — and the foot gives up what it said back to a keystroke /// whole rather than cut it, before it gives up a notice. At a hundred and /// twenty columns the notice, the answer and the keys do not all fit, and the /// answer is the one that goes. diff --git a/tests/a_click_on_a_reference_in_the_bead_window_follows_it.rs b/tests/a_click_on_a_reference_in_the_bead_window_follows_it.rs index cfa3d7f..2508c1d 100644 --- a/tests/a_click_on_a_reference_in_the_bead_window_follows_it.rs +++ b/tests/a_click_on_a_reference_in_the_bead_window_follows_it.rs @@ -52,7 +52,7 @@ const A_REFERENCE_THAT_CAN_BE_FOLLOWED: &[u8] = "↑".as_bytes(); /// A bead the capture's answer does not hold, which is drawn saying so and /// which `Tab` passes over. -const A_REFERENCE_THAT_CANNOT: &[u8] = "dun-rer.9 not in the tracker's answer".as_bytes(); +const A_REFERENCE_THAT_CANNOT: &[u8] = "dun-rer.9 not found in the tracker".as_bytes(); /// The heading over the parent, which is the row immediately above the /// reference — where a reader aiming at it and missing lands. diff --git a/tests/a_config_edited_under_a_running_bdi_is_read_again.rs b/tests/a_config_edited_under_a_running_bdi_is_read_again.rs index 75ffe10..48420b5 100644 --- a/tests/a_config_edited_under_a_running_bdi_is_read_again.rs +++ b/tests/a_config_edited_under_a_running_bdi_is_read_again.rs @@ -37,7 +37,7 @@ const THE_FIRST_FRAME: &[u8] = "arkham".as_bytes(); /// The notice, from `view::phrase`. Its first words rather than the whole /// line: the foot is drawn as a difference from the frame before, so a phrase /// that lands where another had letters reaches the wire in pieces. -const WOULD_NOT_LOAD: &[u8] = "the config would not load".as_bytes(); +const WOULD_NOT_LOAD: &[u8] = "the edited config has an error".as_bytes(); /// The same row, read off a later frame, where it says `bdi` is still /// drawing a forest: a broken config does not take it down and does not diff --git a/tests/a_credential_command_that_will_not_run_says_so_and_reads_no_bd.rs b/tests/a_credential_command_that_will_not_run_says_so_and_reads_no_bd.rs index f88db7a..609c317 100644 --- a/tests/a_credential_command_that_will_not_run_says_so_and_reads_no_bd.rs +++ b/tests/a_credential_command_that_will_not_run_says_so_and_reads_no_bd.rs @@ -50,11 +50,9 @@ const THE_TRACKER: &str = include_str!("fixtures/bd_list.json"); /// screen that happens to hold it, and the two other phrases about a /// credential are exactly the ones this failure must not be confused with. /// -/// The clause rather than the whole sentence, because the sentence is longer -/// than the row: it is drawn under a tree prefix at 120 columns and the tail -/// of it is cut. This is what fits, and it is the half that says which +/// The clause rather than the whole sentence: it is the half that says which /// command. -const THE_CLAUSE: &[u8] = "the credential command this project names would not run".as_bytes(); +const THE_CLAUSE: &[u8] = "this project's credential command failed".as_bytes(); /// How long a keystroke gets before waiting for it is called stalling. const LONG_ENOUGH_TO_ANSWER: Duration = Duration::from_secs(10); diff --git a/tests/a_fold_key_leaves_the_forest_it_left_before.rs b/tests/a_fold_key_leaves_the_forest_it_left_before.rs index af58eed..058c11d 100644 --- a/tests/a_fold_key_leaves_the_forest_it_left_before.rs +++ b/tests/a_fold_key_leaves_the_forest_it_left_before.rs @@ -25,7 +25,7 @@ //! 5 │ │ └┄▸ ○ ark-1.1 cast the bracket 0/2 ◍ 1 agent beneath //! 6 │ ├── ○ .3 mount the lens 0/3 //! 7 │ │ └┄▸ ○ ark-1.1 cast the bracket 0/2 ◍ 1 agent beneath -//! 8 │ └─▸ ✓ 3 more beads · finished, and nobody on them +//! 8 │ └─▸ ✓ 3 more finished beads with no agent //! 9 └─▸ 1 tree with no live agent //! ``` //! @@ -128,7 +128,7 @@ const FRESH: &[&str] = &[ " │ │ └┄┄ ○ ark-1.1 cast the bracket 0/2", " │ │ └── ◐ .1 pour the iron ◍ wT:p2 · working", " │ ├─▸ ○ .3 mount the lens 0/3 ◍ 1 agent beneath", - " │ └─▸ ✓ 3 more beads · finished, and nobody on them", + " │ └─▸ ✓ 3 more finished beads with no agent", " └─▸ 1 tree with no live agent", ]; @@ -143,7 +143,7 @@ const AT_REST: &[&str] = &[ " │ │ └┄▸ ○ ark-1.1 cast the bracket 0/2 ◍ 1 agent beneath", " │ ├── ○ .3 mount the lens 0/3", " │ │ └┄▸ ○ ark-1.1 cast the bracket 0/2 ◍ 1 agent beneath", - " │ └─▸ ✓ 3 more beads · finished, and nobody on them", + " │ └─▸ ✓ 3 more finished beads with no agent", " └─▸ 1 tree with no live agent", ]; @@ -160,7 +160,7 @@ const EVERYTHING_OPEN: &[&str] = &[ " │ ├── ○ .3 mount the lens 0/3", " │ │ └┄┄ ○ ark-1.1 cast the bracket 0/2", " │ │ └── ◐ .1 pour the iron ◍ wT:p2 · working", - " │ └── ✓ 3 more beads · finished, and nobody on them", + " │ └── ✓ 3 more finished beads with no agent", " │ ├── ✓ .4 survey the headland", " │ ├── ✓ .5 draw up the plans", " │ └── ✓ .6 clear the site", @@ -181,7 +181,7 @@ const GLAZE_THE_LANTERN_SHUT: &[&str] = &[ " │ ├─▸ ○ .2 glaze the lantern 0/3 ◍ 1 agent beneath", " │ ├── ○ .3 mount the lens 0/3", " │ │ └┄▸ ○ ark-1.1 cast the bracket 0/2 ◍ 1 agent beneath", - " │ └─▸ ✓ 3 more beads · finished, and nobody on them", + " │ └─▸ ✓ 3 more finished beads with no agent", " └─▸ 1 tree with no live agent", ]; @@ -197,7 +197,7 @@ const THE_COPY_OPEN: &[&str] = &[ " │ │ └── ◐ .1 pour the iron ◍ wT:p2 · working", " │ ├── ○ .3 mount the lens 0/3", " │ │ └┄▸ ○ ark-1.1 cast the bracket 0/2 ◍ 1 agent beneath", - " │ └─▸ ✓ 3 more beads · finished, and nobody on them", + " │ └─▸ ✓ 3 more finished beads with no agent", " └─▸ 1 tree with no live agent", ]; @@ -341,7 +341,7 @@ fn a_moves_the_hidden_tree_and_leaves_the_folds_alone() { " │ ├─▸ ○ .2 glaze the lantern 0/3 ◍ 1 agent beneath", " │ ├── ○ .3 mount the lens 0/3", " │ │ └┄▸ ○ ark-1.1 cast the bracket 0/2 ◍ 1 agent beneath", - " │ └─▸ ✓ 3 more beads · finished, and nobody on them", + " │ └─▸ ✓ 3 more finished beads with no agent", " └─▸ ○ ark-2 dredge the harbour 0/2", ] ); @@ -388,7 +388,7 @@ fn a_refresh_lets_a_fold_go_when_live_work_arrives_under_it() { " │ ├── ○ .2 glaze the lantern 0/3", " │ │ └┄▸ ○ ark-1.1 cast the bracket 0/2 ◍ 1 agent beneath", " │ ├─▸ ○ .3 mount the lens 0/3 ◍ 1 agent beneath", - " │ └─▸ ✓ 3 more beads · finished, and nobody on them", + " │ └─▸ ✓ 3 more finished beads with no agent", " └─▸ 1 tree with no live agent", ] ); @@ -411,7 +411,7 @@ fn a_refresh_lets_a_fold_go_when_live_work_arrives_under_it() { " │ ├── ○ .3 mount the lens 0/4", " │ │ ├── ◐ .1 grind the glass ◍ wT:p3 · working", " │ │ └┄▸ ○ ark-1.1 cast the bracket 0/2 ◍ 1 agent beneath", - " │ └─▸ ✓ 3 more beads · finished, and nobody on them", + " │ └─▸ ✓ 3 more finished beads with no agent", " └─▸ 1 tree with no live agent", ] ); @@ -441,7 +441,7 @@ fn a_refresh_keeps_a_fold_e_found_resting_open_open_when_the_work_under_it_finis " │ ├── ○ .3 mount the lens 0/3", " │ │ └┄┄ ○ ark-1.1 cast the bracket 0/2", " │ │ └── ◐ .1 pour the iron ◍ wT:p2 · working", - " │ └── ✓ 3 more beads · finished, and nobody on them", + " │ └── ✓ 3 more finished beads with no agent", " │ ├── ✓ .4 survey the headland", " │ ├── ✓ .5 draw up the plans", " │ └── ✓ .6 clear the site", @@ -466,7 +466,7 @@ fn a_refresh_keeps_a_fold_e_found_resting_open_open_when_the_work_under_it_finis " │ ├── ○ .3 mount the lens 1/3", " │ │ └┄┄ ○ ark-1.1 cast the bracket 1/2", " │ │ └── ✓ .1 pour the iron", - " │ └── ✓ 3 more beads · finished, and nobody on them", + " │ └── ✓ 3 more finished beads with no agent", " │ ├── ✓ .4 survey the headland", " │ ├── ✓ .5 draw up the plans", " │ └── ✓ .6 clear the site", @@ -495,7 +495,7 @@ fn a_search_opens_the_folds_over_the_bead_it_lands_on() { " │ │ └── ◐ .1 pour the iron ◍ wT:p2 · working", " │ ├─▸ ○ .2 glaze the lantern 0/3 ◍ 1 agent beneath", " │ ├─▸ ○ .3 mount the lens 0/3 ◍ 1 agent beneath", - " │ └─▸ ✓ 3 more beads · finished, and nobody on them", + " │ └─▸ ✓ 3 more finished beads with no agent", " └─▸ 1 tree with no live agent", ] ); diff --git a/tests/a_machine_with_no_agent_provider.rs b/tests/a_machine_with_no_agent_provider.rs index b861fef..24e17f2 100644 --- a/tests/a_machine_with_no_agent_provider.rs +++ b/tests/a_machine_with_no_agent_provider.rs @@ -27,8 +27,8 @@ const THE_TRACKER: &str = include_str!("fixtures/bd_list.json"); /// is on the screen only because a run with no panes draws every tree. const THE_ROOT: &[u8] = "bdi-2bb".as_bytes(); -/// One word of the foot notice, *no herdr session · which agents are alive is -/// unknown*, that nothing else `bdi` writes says. One word rather than the +/// One word of the foot notice, *no herdr session · agents are not shown*, +/// that nothing else `bdi` writes says. One word rather than the /// phrase, because a repaint reaches the wire a word at a time with a cursor /// move where each space would be. /// @@ -38,11 +38,10 @@ const THE_ROOT: &[u8] = "bdi-2bb".as_bytes(); /// screen, so it is in what a test reads back on every machine with no /// `XDG_RUNTIME_DIR`. That is the build sandbox and not this one, so the /// wrong word passed here and failed there. -const A_WORD_OF_THE_NOTICE: &[u8] = "unknown".as_bytes(); +const A_WORD_OF_THE_NOTICE: &[u8] = "shown".as_bytes(); -/// The same for the tail band's *no agent provider · bdi is reading beads -/// alone*. -const A_WORD_OF_THE_BAND: &[u8] = "provider".as_bytes(); +/// The same for the tail band's *no agents to show · reading beads only*. +const A_WORD_OF_THE_BAND: &[u8] = "only".as_bytes(); /// A `bdi` run against a tracker holding the capture, in `environment`. fn drawn_by(bdi: &mut Driven) -> Vec { @@ -100,7 +99,7 @@ fn a_run_with_no_provider_installed_draws_every_tree_and_is_not_warned() { ); assert!( contains(&drawn, A_WORD_OF_THE_BAND), - "nothing said why there is no pane to read: {}", + "nothing said why there is no pane to show: {}", bdi.timeline() ); } diff --git a/tests/a_project_bdi_could_not_enter_says_so_and_reads_no_bd.rs b/tests/a_project_bdi_could_not_enter_says_so_and_reads_no_bd.rs index 06f6794..7c71e27 100644 --- a/tests/a_project_bdi_could_not_enter_says_so_and_reads_no_bd.rs +++ b/tests/a_project_bdi_could_not_enter_says_so_and_reads_no_bd.rs @@ -48,7 +48,7 @@ const THE_TRACKER: &str = include_str!("fixtures/bd_list.json"); /// word at a time with a cursor move where each space would be: the phrase as /// written is never in the bytes, and a test looking for it would fail on a /// screen that says it. -const A_WORD_OF_IT: &[u8] = "produce".as_bytes(); +const A_WORD_OF_IT: &[u8] = "environment".as_bytes(); /// How long a keystroke gets before waiting for it is called stalling. const LONG_ENOUGH_TO_ANSWER: Duration = Duration::from_secs(10); diff --git a/tests/a_projects_quiet_trees_and_loose_panes_hang_under_it.rs b/tests/a_projects_quiet_trees_and_loose_panes_hang_under_it.rs index 8ba090d..428bfbc 100644 --- a/tests/a_projects_quiet_trees_and_loose_panes_hang_under_it.rs +++ b/tests/a_projects_quiet_trees_and_loose_panes_hang_under_it.rs @@ -13,9 +13,9 @@ //! 1 ├── ○ ark-1 raise the beacon //! 2 │ └── ◐ .1 trim the wick ◍ wT:p2 working //! 3 ├─▸ 1 tree with no live agent -//! 4 └── ⚠ 1 unattributed pane +//! 4 └── ⚠ 1 unclaimed pane //! 5 └── ◍ wT:p3 idle -//! 6 ▸ ⚠ 1 project whose tracker could not be read +//! 6 ▸ ⚠ 1 project could not be read //! ``` //! //! The rows are read by what a click on them does, because a repaint reaches @@ -78,7 +78,7 @@ const ON_THE_LOOSE_PANE: &str = "moored at the quay\n"; const A_WORD_ON_IT: &[u8] = b"moored"; /// The word the line over the loose panes says, from `view::phrase`. -const NO_BEAD_CLAIMS_THEM: &[u8] = b"unattributed"; +const NO_BEAD_CLAIMS_THEM: &[u8] = b"unclaimed"; /// Where the rows are, counting from the top of the screen, before and after /// the quiet trees are opened. diff --git a/tests/a_screen_too_short_for_a_tail_line_keeps_its_key_bar.rs b/tests/a_screen_too_short_for_a_tail_line_keeps_its_key_bar.rs index 4ac9bcb..0231c76 100644 --- a/tests/a_screen_too_short_for_a_tail_line_keeps_its_key_bar.rs +++ b/tests/a_screen_too_short_for_a_tail_line_keeps_its_key_bar.rs @@ -54,9 +54,9 @@ const THE_TRACKER: &str = include_str!("fixtures/bd_list.json"); const A_WORD_OF_THE_KEY_ROW: &[u8] = "all".as_bytes(); /// The line the band would draw beneath its rule on a machine with no agent -/// provider — one word of *no agent provider · bdi is reading beads alone*, +/// provider — one word of *no agents to show · reading beads only*, /// by the same rule as above. -const THE_SILENT_LINE: &[u8] = "provider".as_bytes(); +const THE_SILENT_LINE: &[u8] = "only".as_bytes(); /// The line the band would draw beneath its rule while herdr is still /// answering, from `view::phrase`. Whole rather than one word, because a band @@ -72,7 +72,7 @@ const LAST_ROW: &[u8] = b"G"; /// so the group the key above aims at. The collection has to have come back /// before that key has a row to land on, and `bdi` opens its screen before /// its first collection returns. -const A_PANE_ROW_HAS_ARRIVED: &[u8] = "no configured project".as_bytes(); +const A_PANE_ROW_HAS_ARRIVED: &[u8] = "every configured project".as_bytes(); /// The shorter of the two heights where the band is one row: a forest of two /// rows, the band, and the keys. diff --git a/tests/a_tail_interval_written_under_a_running_bdi_takes_at_once.rs b/tests/a_tail_interval_written_under_a_running_bdi_takes_at_once.rs index 5d07fdb..fa81462 100644 --- a/tests/a_tail_interval_written_under_a_running_bdi_takes_at_once.rs +++ b/tests/a_tail_interval_written_under_a_running_bdi_takes_at_once.rs @@ -42,7 +42,7 @@ const LAST_ROW: &[u8] = b"G"; /// Part of the heading over the panes working outside every configured /// project, which is the group the one shimmed pane sits in. -const A_PANE_ROW_HAS_ARRIVED: &[u8] = "no configured project".as_bytes(); +const A_PANE_ROW_HAS_ARRIVED: &[u8] = "every configured project".as_bytes(); /// What is on the pane, and the word of it the band draws that this waits /// for. The band draws a pane in the pane's own colours, so its rows reach diff --git a/tests/loop_answers_during_a_pane_read.rs b/tests/loop_answers_during_a_pane_read.rs index b893198..aca763b 100644 --- a/tests/loop_answers_during_a_pane_read.rs +++ b/tests/loop_answers_during_a_pane_read.rs @@ -46,7 +46,7 @@ const BEING_READ: &[u8] = "reading that pane".as_bytes(); /// than the first frame: the collection has to have come back before the key /// below has a pane row to land on, and `bdi` opens its screen before its /// first collection returns. -const A_PANE_ROW_HAS_ARRIVED: &[u8] = "no configured project".as_bytes(); +const A_PANE_ROW_HAS_ARRIVED: &[u8] = "every configured project".as_bytes(); /// One word of what the shimmed herdr says is on the pane, from /// `ShimmedHerdr`, and a word that is on the screen nowhere else. /// diff --git a/tests/no_config.rs b/tests/no_config.rs index e4cd937..6e05846 100644 --- a/tests/no_config.rs +++ b/tests/no_config.rs @@ -305,7 +305,7 @@ fn a_directory_with_no_tracker_and_no_config_says_so() { assert!(!out.status.success(), "bdi exited {}: {said}", out.status); assert!(said.contains(&cwd.display().to_string()), "got: {said}"); - assert!(said.contains("beads tracks"), "got: {said}"); + assert!(said.contains("not inside a beads project"), "got: {said}"); assert!( said.contains(".config/beady-eye/config.toml"), "the config it looked for is not named: {said}" diff --git a/tests/the_band_reads_its_pane_again_on_its_own_clock.rs b/tests/the_band_reads_its_pane_again_on_its_own_clock.rs index 1dd2064..44c02f7 100644 --- a/tests/the_band_reads_its_pane_again_on_its_own_clock.rs +++ b/tests/the_band_reads_its_pane_again_on_its_own_clock.rs @@ -39,7 +39,7 @@ const LAST_ROW: &[u8] = b"G"; /// Part of the heading over the panes working outside every configured /// project, from `view::phrase` — the group the one shimmed pane sits in, and /// so the group the key above aims at. -const A_PANE_ROW_HAS_ARRIVED: &[u8] = "no configured project".as_bytes(); +const A_PANE_ROW_HAS_ARRIVED: &[u8] = "every configured project".as_bytes(); /// What is on that pane when the band first reads it, and what is on it when /// the band next looks. One word of each is what the test waits for, because