huskies: merge 870
This commit is contained in:
@@ -218,6 +218,7 @@ max_budget_usd = 5.00
|
||||
#[test]
|
||||
fn watchdog_marks_story_blocked_after_limit_termination() {
|
||||
crate::db::ensure_content_store();
|
||||
crate::crdt_state::init_for_test();
|
||||
|
||||
let tmp = tempfile::tempdir().unwrap();
|
||||
let root = tmp.path();
|
||||
@@ -239,6 +240,18 @@ max_turns = 10
|
||||
let story_id = "42_story_runaway";
|
||||
let initial = "---\nname: Runaway Story\n---\n# Runaway Story\n";
|
||||
crate::db::write_content(story_id, initial);
|
||||
crate::crdt_state::write_item(
|
||||
story_id,
|
||||
"2_current",
|
||||
Some("Runaway Story"),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
);
|
||||
|
||||
// 12 turns in a single session exceeds the configured max of 10.
|
||||
write_fake_session_log(root, story_id, "coder-1", "sess-runaway", 12);
|
||||
@@ -334,6 +347,7 @@ max_turns = 10
|
||||
#[test]
|
||||
fn per_session_counting_terminates_over_limit() {
|
||||
crate::db::ensure_content_store();
|
||||
crate::crdt_state::init_for_test();
|
||||
|
||||
let tmp = tempfile::tempdir().unwrap();
|
||||
let root = tmp.path();
|
||||
@@ -352,6 +366,18 @@ max_turns = 10
|
||||
|
||||
let story_id = "story_e_per_session";
|
||||
crate::db::write_content(story_id, "---\nname: Per-Session Test\n---\n");
|
||||
crate::crdt_state::write_item(
|
||||
story_id,
|
||||
"2_current",
|
||||
Some("Per-Session Test"),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
);
|
||||
|
||||
// Prior session with 5 turns (under limit alone).
|
||||
write_fake_session_log(root, story_id, "coder-1", "old-sess", 5);
|
||||
@@ -416,38 +442,55 @@ max_turns = 10
|
||||
|
||||
let story_id = "88_story_retry_watchdog";
|
||||
let initial = "---\nname: Retry Test\n---\n";
|
||||
crate::crdt_state::init_for_test();
|
||||
crate::db::write_content(story_id, initial);
|
||||
crate::crdt_state::write_item(
|
||||
story_id,
|
||||
"2_current",
|
||||
Some("Retry Test"),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
);
|
||||
|
||||
// Session 1: exceeds limit → retry_count=1, NOT blocked.
|
||||
// Session 1: exceeds limit → retry_count=1 in CRDT, NOT blocked.
|
||||
{
|
||||
write_fake_session_log(root, story_id, "coder-1", "session-1", 12);
|
||||
let pool = AgentPool::new_test(3001);
|
||||
pool.inject_test_agent_with_session(story_id, "coder-1", AgentStatus::Running, "session-1");
|
||||
pool.run_watchdog_pass(Some(root));
|
||||
|
||||
let content = crate::db::read_content(story_id).unwrap();
|
||||
assert!(
|
||||
content.contains("retry_count: 1"),
|
||||
"after session 1, retry_count should be 1 — got:\n{content}"
|
||||
let item = crate::crdt_state::read_item(story_id).expect("story must be in CRDT");
|
||||
assert_eq!(
|
||||
item.retry_count,
|
||||
Some(1),
|
||||
"after session 1, retry_count should be 1 in CRDT"
|
||||
);
|
||||
let content = crate::db::read_content(story_id).unwrap();
|
||||
assert!(
|
||||
!content.contains("blocked: true"),
|
||||
"story should NOT be blocked after session 1"
|
||||
);
|
||||
}
|
||||
|
||||
// Session 2: exceeds limit → retry_count=2, NOT blocked.
|
||||
// Session 2: exceeds limit → retry_count=2 in CRDT, NOT blocked.
|
||||
{
|
||||
write_fake_session_log(root, story_id, "coder-1", "session-2", 12);
|
||||
let pool = AgentPool::new_test(3001);
|
||||
pool.inject_test_agent_with_session(story_id, "coder-1", AgentStatus::Running, "session-2");
|
||||
pool.run_watchdog_pass(Some(root));
|
||||
|
||||
let content = crate::db::read_content(story_id).unwrap();
|
||||
assert!(
|
||||
content.contains("retry_count: 2"),
|
||||
"after session 2, retry_count should be 2 — got:\n{content}"
|
||||
let item = crate::crdt_state::read_item(story_id).expect("story must be in CRDT");
|
||||
assert_eq!(
|
||||
item.retry_count,
|
||||
Some(2),
|
||||
"after session 2, retry_count should be 2 in CRDT"
|
||||
);
|
||||
let content = crate::db::read_content(story_id).unwrap();
|
||||
assert!(
|
||||
!content.contains("blocked: true"),
|
||||
"story should NOT be blocked after session 2"
|
||||
@@ -466,5 +509,11 @@ max_turns = 10
|
||||
content.contains("blocked: true"),
|
||||
"story must be blocked after session 3 (retry_count=3 >= max_retries=3) — got:\n{content}"
|
||||
);
|
||||
let item = crate::crdt_state::read_item(story_id).expect("story must be in CRDT");
|
||||
assert_eq!(
|
||||
item.retry_count,
|
||||
Some(3),
|
||||
"retry_count should be 3 in CRDT after session 3"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user