From 7027252a84e179003d9b9fad3610cfe785d3e292 Mon Sep 17 00:00:00 2001 From: Gros Frumos Date: Tue, 17 Mar 2026 16:01:51 +0200 Subject: [PATCH] kin: auto-commit after pipeline --- agents/runner.py | 13 ++++--------- tests/test_qa_gaps.py | 16 +++++++--------- web/frontend/src/api.ts | 1 + 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/agents/runner.py b/agents/runner.py index 5a7c295..0a24101 100644 --- a/agents/runner.py +++ b/agents/runner.py @@ -1090,15 +1090,6 @@ def _execute_department_head_step( role = step["role"] dept_name = role.replace("_head", "") - # Create child pipeline in DB - child_pipeline = models.create_pipeline( - conn, task_id, project_id, - route_type="dept_sub", - steps=sub_pipeline, - parent_pipeline_id=parent_pipeline_id, - department=dept_name, - ) - # Build initial context for workers: dept head's plan + artifacts dept_plan_context = json.dumps({ "department_head_plan": { @@ -1109,12 +1100,16 @@ def _execute_department_head_step( }, ensure_ascii=False) # Run the sub-pipeline (noninteractive=True — Opus already reviewed the plan) + # pass parent_pipeline_id and department so run_pipeline creates the child + # pipeline with correct attributes (route_type='dept_sub') — no double create sub_result = run_pipeline( conn, task_id, sub_pipeline, dry_run=False, allow_write=allow_write, noninteractive=True, initial_previous_output=dept_plan_context, + parent_pipeline_id=parent_pipeline_id, + department=dept_name, ) # Extract decisions from sub-pipeline results for handoff diff --git a/tests/test_qa_gaps.py b/tests/test_qa_gaps.py index 1fa5d0d..bfce568 100644 --- a/tests/test_qa_gaps.py +++ b/tests/test_qa_gaps.py @@ -518,10 +518,11 @@ class TestContextBuilderDuplicateAssignment: assert "PROJ-001" in result assert "My test task" in result - def test_source_code_has_duplicate_task_assignment(self): - """Documents that the duplicate assignment still exists in the source. + def test_source_code_has_single_task_assignment(self): + """Duplicate assignment was removed from context_builder.py. - This test will FAIL once the duplicate is removed (cleanup completed). + Issue 4 fixed: task = context.get('task') now appears exactly once + inside format_prompt(). """ import ast import pathlib @@ -533,14 +534,12 @@ class TestContextBuilderDuplicateAssignment: task_assign_count = 0 for node in ast.walk(tree): if isinstance(node, ast.Assign): - # Check target is 'task' targets_are_task = any( isinstance(t, ast.Name) and t.id == "task" for t in node.targets ) if not targets_are_task: continue - # Check value is context.get('task') or context.get("task") val = node.value if ( isinstance(val, ast.Call) @@ -554,8 +553,7 @@ class TestContextBuilderDuplicateAssignment: ): task_assign_count += 1 - assert task_assign_count == 2, ( - f"Expected exactly 2 duplicate 'task = context.get(\"task\")' assignments " - f"(documenting Issue 4), found {task_assign_count}. " - "If count is 1, the duplicate was removed — this test can be deleted." + assert task_assign_count == 1, ( + f"Expected exactly 1 'task = context.get(\"task\")' assignment, " + f"found {task_assign_count}. Duplicate may have been re-introduced." ) diff --git a/web/frontend/src/api.ts b/web/frontend/src/api.ts index 537a466..f4836fa 100644 --- a/web/frontend/src/api.ts +++ b/web/frontend/src/api.ts @@ -68,6 +68,7 @@ export interface Project { tech_stack: string[] | null execution_mode: string | null autocommit_enabled: number | null + auto_test_enabled: number | null obsidian_vault_path: string | null deploy_command: string | null test_command: string | null