use super::stub::Script;
use super::*;
fn settle_role(ws: &Path, wt: &Path, role: &str) -> Option<Outcome> {
crate::workspace::retarget::write_role(ws, "a", role, &g()).unwrap();
land(ws, "a", wt, &g()).unwrap()
}
#[test]
fn a_role_mark_alone_settles_the_branch_on_that_role_from_the_same_config() {
let (_h, ws, wt) = agent();
let governing_before = governing(&ws, &agent_ref("a"), &g()).unwrap();
step(
&wt,
"messages/001-user.md",
"how would you add X?\n",
"transcript 001: user [a]",
);
assert_eq!(settle_role(&ws, &wt, "planner"), Some(Outcome::Landed));
assert_eq!(
governing(&ws, &agent_ref("a"), &g()).unwrap(),
governing_before,
"the role settles from the same config commit",
);
assert_eq!(
subjects(&wt)[..2],
["transcript 001: user [a]", "dispatch: planner [a]"],
);
let soul = std::fs::read_to_string(wt.join("soul.md")).unwrap();
assert!(soul.starts_with("# Planner"), "got {soul:?}");
assert!(wt.join("descriptions/tools/read_file.json").exists());
assert!(
!wt.join("descriptions/tools/bash.json").exists(),
"the grant is the confinement: a planner holds no shell",
);
assert!(crate::workspace::retarget::read_role(&ws, "a", &g()).is_none());
}
#[test]
fn the_role_a_landing_settles_is_what_the_next_resolution_reads() {
let (_h, ws, wt) = agent();
settle_role(&ws, &wt, "planner");
assert_eq!(
role::derive(&wt, &agent_ref("a"), "a", &g())
.unwrap()
.as_deref(),
Some("planner"),
);
}
#[test]
fn a_role_mark_alone_lands_without_the_lineage_moving() {
let s = Script {
fail_capture: Some("--verify refs/litany/retarget"),
role_mark: "planner",
..Script::default()
};
assert_eq!(s.land().unwrap(), Some(Outcome::Landed));
}
#[test]
fn an_unreadable_role_mark_leaves_the_branch_its_committed_role() {
let s = Script {
fail_capture: Some("cat-file"),
..Script::default()
};
assert_eq!(s.land().unwrap(), Some(Outcome::Landed));
}