feat: bounded subagent delegation (v5)
Coordinator parts gain three enforced bounds, validated in validate_parts and carried through the coordinator_parts JSON (no schema change): timeout_seconds (1..86400, per-attempt wall clock from coordinator start; the coordinator poll loop cancels only that child with the same cancel mechanism as the global timeout, other parts keep waiting, audit coordinator_child_bound_exceeded), on_failure fail|tolerate (tolerated failures do not fail the coordinator, are named in the report head, and their failed children are not requeued on coordinator re-run while interrupted children still are), and result_chars (0..2000, default 500, enforced in build_report; the 4000-char report writeback cap still applies). evaluate_outcome is the single outcome rule used by both build_report and the worker error text, so tolerated failures never leak into the coordinator failure reason. Unknown part names fail closed. Deliberately NOT added, after reading the execution layer: per-part token/cost budget (cost is recorded only on completion, so a running child's spend is unobservable and creator quota is monthly, not per part), per-part round cap (normal tasks have no per-task round cap in the worker), and write-scope isolation (sandbox is per-project worktree, a scope string in a prompt would be an instruction, not a guarantee). Tests: test_delegation_bounds.py (8 tests).
This commit is contained in:
1 parent
7f60f12639
commit
c15c224570
4 files changed
+443
-29
No files matched your search
@@ -95,7 +95,10 @@ class ValidatePartsTestCase(unittest.TestCase):
|
||||
self.assertIsNone(err)
|
||||
self.assertEqual(parts, [{"name": "a", "prompt": "做 a",
|
||||
"model": None, "effort": None,
|
||||
"executor": None}])
|
||||
"executor": None,
|
||||
"timeout_seconds": None,
|
||||
"on_failure": "fail",
|
||||
"result_chars": 500}])
|
||||
|
||||
def test_valid_with_options(self):
|
||||
parts, err = validate_parts([{
|
||||
|
||||
Reference in new issue
Block a user