#[test]
fn a_first_visit_renders_no_previous_visits() {
let dir = memory_plan_dir(&[]);
let plan_path = dir.path().join("plan.rhei.md");
let loaded = load_plan(&plan_path).expect("plan loads");
let memory =
prompt_memory(&loaded, &plan_path, &dir.path().join("runtime"), BTreeSet::new());
let machine = memory_machine();
let task = find_task_by_id_str(&loaded.rhei.tasks, "plan.1.3").expect("task 1.3");
let context =
memory_context(dir.path(), &plan_path, &loaded, &memory, &machine, task, "review");
assert_eq!(render_previous_visits(&context).expect("visits"), "");
}
#[test]
fn a_revisit_renders_its_trail_result_and_previous_log() {
let dir = memory_plan_dir(&[
("runtime/state-transitions.log", "plan.1.3 pending@review\n"),
(
"runtime/results/plan.1.3.md",
"## Result\n\nagent timed out in state 'review' after 30m\n",
),
("runtime/logs/task-plan.1.3-review.log", "=== rhei agent log v1 ===\n"),
]);
let plan_path = dir.path().join("plan.rhei.md");
let loaded = load_plan(&plan_path).expect("plan loads");
let memory =
prompt_memory(&loaded, &plan_path, &dir.path().join("runtime"), BTreeSet::new());
let machine = memory_machine();
let task = find_task_by_id_str(&loaded.rhei.tasks, "plan.1.3").expect("task 1.3");
let mut context =
memory_context(dir.path(), &plan_path, &loaded, &memory, &machine, task, "review");
let metadata = visit_metadata("plan.1.3", "review", 2);
context.metadata = Some(&metadata);
let visits = render_previous_visits(&context).expect("visits");
assert!(
visits.contains("Trail for this task: pending \u{2192} review (this visit, visit 2).\n"),
"got:\n{visits}"
);
assert!(visits.contains("Result entries so far:\n\n```markdown\n"), "got:\n{visits}");
assert!(
visits.contains("agent timed out in state 'review' after 30m"),
"the engine's own entry is why a retry knows what stalled; got:\n{visits}"
);
assert!(
visits.contains("Previous log: `runtime/logs/task-plan.1.3-review.log`\n"),
"got:\n{visits}"
);
}
#[test]
fn a_missing_previous_log_is_not_named() {
let dir = memory_plan_dir(&[("runtime/state-transitions.log", "plan.1.3 pending@review\n")]);
let plan_path = dir.path().join("plan.rhei.md");
let loaded = load_plan(&plan_path).expect("plan loads");
let memory =
prompt_memory(&loaded, &plan_path, &dir.path().join("runtime"), BTreeSet::new());
let machine = memory_machine();
let task = find_task_by_id_str(&loaded.rhei.tasks, "plan.1.3").expect("task 1.3");
let mut context =
memory_context(dir.path(), &plan_path, &loaded, &memory, &machine, task, "review");
let metadata = visit_metadata("plan.1.3", "review", 2);
context.metadata = Some(&metadata);
let visits = render_previous_visits(&context).expect("visits");
assert!(visits.contains("Trail for this task:"), "got:\n{visits}");
assert!(!visits.contains("Previous log:"), "got:\n{visits}");
}
#[test]
fn a_result_holding_a_fence_gets_a_longer_one() {
let dir = memory_plan_dir(&[
("runtime/state-transitions.log", "plan.1.3 pending@review\n"),
("runtime/results/plan.1.3.md", "## Result\n\n```\ncode\n```\n"),
]);
let plan_path = dir.path().join("plan.rhei.md");
let loaded = load_plan(&plan_path).expect("plan loads");
let memory =
prompt_memory(&loaded, &plan_path, &dir.path().join("runtime"), BTreeSet::new());
let machine = memory_machine();
let task = find_task_by_id_str(&loaded.rhei.tasks, "plan.1.3").expect("task 1.3");
let context =
memory_context(dir.path(), &plan_path, &loaded, &memory, &machine, task, "review");
let visits = render_previous_visits(&context).expect("visits");
assert!(visits.contains("````markdown\n## Result"), "got:\n{visits}");
assert!(visits.contains("\n````\n"), "got:\n{visits}");
}
#[test]
fn a_trail_ending_in_this_state_is_annotated_not_repeated() {
let dir = memory_plan_dir(&[(
"runtime/state-transitions.log",
"plan.1.3 pending@review\nplan.1.3 review@review\n",
)]);
let plan_path = dir.path().join("plan.rhei.md");
let loaded = load_plan(&plan_path).expect("plan loads");
let memory =
prompt_memory(&loaded, &plan_path, &dir.path().join("runtime"), BTreeSet::new());
let machine = memory_machine();
let task = find_task_by_id_str(&loaded.rhei.tasks, "plan.1.3").expect("task 1.3");
let mut context =
memory_context(dir.path(), &plan_path, &loaded, &memory, &machine, task, "review");
let metadata = visit_metadata("plan.1.3", "review", 3);
context.metadata = Some(&metadata);
let visits = render_previous_visits(&context).expect("visits");
assert!(
visits.contains(
"Trail for this task: pending \u{2192} review \u{2192} review \
(this visit, visit 3).\n"
),
"got:\n{visits}"
);
}
#[test]
fn a_trail_that_does_not_end_here_gets_this_state_appended() {
let dir = memory_plan_dir(&[
("runtime/results/plan.1.3.md", "## Result\n\nImported verdict.\n"),
("runtime/state-transitions.log", "plan.1.1 pending@completed\n"),
]);
let plan_path = dir.path().join("plan.rhei.md");
let loaded = load_plan(&plan_path).expect("plan loads");
let memory =
prompt_memory(&loaded, &plan_path, &dir.path().join("runtime"), BTreeSet::new());
let machine = memory_machine();
let task = find_task_by_id_str(&loaded.rhei.tasks, "plan.1.3").expect("task 1.3");
let context =
memory_context(dir.path(), &plan_path, &loaded, &memory, &machine, task, "review");
let visits = render_previous_visits(&context).expect("visits");
assert!(
visits.contains("Trail for this task: review (this visit, visit 1).\n"),
"got:\n{visits}"
);
assert!(visits.contains("Imported verdict."), "got:\n{visits}");
}
#[test]
fn a_suffixed_ledger_line_still_names_one_state() {
let dir = memory_plan_dir(&[(
"runtime/state-transitions.log",
"plan.1.3 pending@review\nplan.1.3 review@review-2\nplan.1.3 review-2@review-3\n",
)]);
let plan_path = dir.path().join("plan.rhei.md");
let loaded = load_plan(&plan_path).expect("plan loads");
let memory =
prompt_memory(&loaded, &plan_path, &dir.path().join("runtime"), BTreeSet::new());
let machine = memory_machine();
let task = find_task_by_id_str(&loaded.rhei.tasks, "plan.1.3").expect("task 1.3");
let mut context =
memory_context(dir.path(), &plan_path, &loaded, &memory, &machine, task, "review");
let metadata = visit_metadata("plan.1.3", "review", 3);
context.metadata = Some(&metadata);
let visits = render_previous_visits(&context).expect("visits");
assert!(
visits.contains(
"Trail for this task: pending \u{2192} review \u{2192} review \u{2192} review \
(this visit, visit 3).\n"
),
"got:\n{visits}"
);
assert!(!visits.contains("review-"), "no raw suffix survives; got:\n{visits}");
}