From e01ab7ea65dc5375c2c14d958c9b2a994b48fdbd Mon Sep 17 00:00:00 2001 From: Chengrui Qu Date: Wed, 19 Aug 2026 20:17:53 +0000 Subject: [PATCH] fix: override strategist post_checks in design_workflow() with dual-format sentinels Design mode serves two contexts: new projects (phased plans with "### Phase 1") and existing projects (improvement hypotheses with "### Hypotheses"). The inherited build_workflow sentinel required "### Architecture", which only appears in new-project plans, causing false verification failures on existing projects. Override the strategist's post_checks in design_workflow() to use must_contain=["### Phase 1", "### Hypotheses"], which leverages checks_to_bash() OR semantics (grep -qE with | alternation) to accept either format. Closes #1323 --- factory/workflow/definitions.py | 12 ++++++++++++ tests/test_verification.py | 6 +++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/factory/workflow/definitions.py b/factory/workflow/definitions.py index 6a51ce869..498edf5ce 100644 --- a/factory/workflow/definitions.py +++ b/factory/workflow/definitions.py @@ -646,6 +646,18 @@ def design_workflow(just_plan: bool = False) -> Workflow: update={"reads": (node.reads or set()) | {".factory/strategy/study-combined.md"}}, ) + _strat = wf.nodes["strategist"] + wf.nodes["strategist"] = _strat.model_copy( + update={"post_checks": [ + ArtifactCheck( + path=".factory/strategy/current.md", + must_exist=True, + min_size=200, + must_contain=["### Phase 1", "### Hypotheses"], + ) + ]}, + ) + wf.edges.extend( [ *s_edges, diff --git a/tests/test_verification.py b/tests/test_verification.py index eac903a5a..5f55bc010 100644 --- a/tests/test_verification.py +++ b/tests/test_verification.py @@ -521,16 +521,16 @@ def test_build_workflow_has_post_checks(self) -> None: assert "code_reviewer" in wf.nodes assert "adversarial_tester" in wf.nodes - def test_design_workflow_inherits_post_checks(self) -> None: + def test_design_workflow_overrides_post_checks(self) -> None: from factory.workflow.definitions import design_workflow wf = design_workflow() - # Design inherits from build — verify inherited sentinel values + # Design overrides build's strategist post_checks with dual-format sentinels strat = wf.nodes["strategist"] assert isinstance(strat, AgentNode) assert len(strat.post_checks) > 0 assert "### Phase 1" in strat.post_checks[0].must_contain - assert "### Architecture" in strat.post_checks[0].must_contain + assert "### Hypotheses" in strat.post_checks[0].must_contain builder = wf.nodes["builder"] assert isinstance(builder, AgentNode)