kin: auto-commit after pipeline

This commit is contained in:
Gros Frumos 2026-03-19 19:25:38 +02:00
parent 12bf510bbc
commit de52526659
3 changed files with 502 additions and 2 deletions

View file

@ -173,7 +173,7 @@ def test_create_project_with_phases_other_phases_remain_pending(conn):
conn, "proj1", "P1", "/path",
description="Desc", selected_roles=["market_researcher", "tech_researcher"],
)
# market_researcher, tech_researcher, knowledge_synthesizer, architect → 4 фазы (KIN-DOCS-003)
# market_researcher, tech_researcher, architect → 3 фазы; knowledge_synthesizer не фаза (P1-001)
for phase in result["phases"][1:]:
assert phase["status"] == "pending"
@ -394,3 +394,89 @@ def test_revise_phase_updates_task_id_to_new_task(conn):
new_task_id = out["phase"]["task_id"]
assert new_task_id != original_task_id
assert new_task_id == out["new_task"]["id"]
# ---------------------------------------------------------------------------
# Regression: knowledge_synthesizer не создаётся как pipeline-фаза (P1-001)
# ---------------------------------------------------------------------------
def test_create_project_with_phases_knowledge_synthesizer_not_in_phases(conn):
"""Регрессия P1-001: knowledge_synthesizer не создаётся как pipeline-фаза.
При 2 исследователях build_phase_order включает knowledge_synthesizer,
но create_project_with_phases должен фильтровать его из DB-фаз.
"""
result = create_project_with_phases(
conn, "proj1", "P1", "/path",
description="Desc", selected_roles=["market_researcher", "tech_researcher"],
)
roles = [ph["role"] for ph in result["phases"]]
assert "knowledge_synthesizer" not in roles
def test_create_project_with_phases_two_researchers_creates_three_phases(conn):
"""Регрессия P1-001: 2 исследователя → 3 фазы (researcher + researcher + architect), не 4.
До фикса knowledge_synthesizer создавался как фаза 4 фазы вместо 3.
"""
result = create_project_with_phases(
conn, "proj1", "P1", "/path",
description="Desc", selected_roles=["market_researcher", "tech_researcher"],
)
assert len(result["phases"]) == 3
roles = [ph["role"] for ph in result["phases"]]
assert roles == ["market_researcher", "tech_researcher", "architect"]
# ---------------------------------------------------------------------------
# Edge cases: "effectively empty" arrays — непустой вход, ноль валидных ролей (P1-001)
# ---------------------------------------------------------------------------
def test_create_project_with_phases_raises_if_only_architect(conn):
"""P1-001 edge case: [architect] → ValueError после фильтрации (architect не researcher)."""
with pytest.raises(ValueError, match="[Aa]t least one research role"):
create_project_with_phases(
conn, "proj1", "P1", "/path",
description="Desc", selected_roles=["architect"],
)
def test_create_project_with_phases_raises_if_only_knowledge_synthesizer(conn):
"""P1-001 edge case: [knowledge_synthesizer] → ValueError (авто-управляемая роль фильтруется)."""
with pytest.raises(ValueError, match="[Aa]t least one research role"):
create_project_with_phases(
conn, "proj1", "P1", "/path",
description="Desc", selected_roles=["knowledge_synthesizer"],
)
def test_create_project_with_phases_raises_if_architect_and_synthesizer_only(conn):
"""P1-001 edge case: [architect, knowledge_synthesizer] → ValueError (оба авто-управляемые)."""
with pytest.raises(ValueError, match="[Aa]t least one research role"):
create_project_with_phases(
conn, "proj1", "P1", "/path",
description="Desc", selected_roles=["architect", "knowledge_synthesizer"],
)
def test_create_project_with_phases_raises_if_unknown_roles_only(conn):
"""P1-001 edge case: только неизвестные роли → пустой список после validate_roles → ValueError."""
with pytest.raises(ValueError, match="[Aa]t least one research role"):
create_project_with_phases(
conn, "proj1", "P1", "/path",
description="Desc", selected_roles=["wizard", "ghost", "oracle"],
)
def test_build_phase_order_architect_only_returns_empty():
"""P1-001 edge case: build_phase_order([architect]) → [] (architect не researcher)."""
result = build_phase_order(["architect"])
assert result == []
def test_validate_roles_architect_and_synthesizer_returns_empty():
"""P1-001 edge case: validate_roles([architect, knowledge_synthesizer]) → [] (оба отфильтровываются)."""
result = validate_roles(["architect", "knowledge_synthesizer"])
assert result == []