Commit 577d9af07d21d3747d38440d1ac3fad93de36513

Authored by graphlemon
2 parents dcac03bd c8501c46

graphlemon: merge 88612ded-ac9f-499c-9872-dcd05cad9495

src/e2e_pipeline.py
... ... @@ -412,7 +412,13 @@ def _test_script_verify_fn(node_artifact_types, script_artifact_type="test_scrip
412 412 def verify_fn(node, output):
413 413 if node_artifact_types.get(node["node_id"]) != script_artifact_type:
414 414 return True, None
415   - return check_script_compiles(output["content"])
  415 + ok, detail = check_script_compiles(output["content"])
  416 + # work_graph_orchestrate._verify_and_maybe_regenerate does
  417 + # "; ".join(feedback or []), i.e. it expects a list of messages (the
  418 + # PRD-consistency verify_fn's `issues` shape) -- check_script_compiles
  419 + # returns a single string, which `join` would otherwise iterate
  420 + # character-by-character into a garbled reflect-prompt.
  421 + return ok, ([detail] if detail else None)
416 422 return verify_fn
417 423  
418 424  
... ...
src/test_e2e_pipeline.py
... ... @@ -272,6 +272,12 @@ class TestScriptVerifyFnTest(unittest.TestCase):
272 272 verify_fn = e2e_pipeline._test_script_verify_fn(node_artifact_types)
273 273 ok, detail = verify_fn({"node_id": "script"}, {"content": "this is narrative, not code, no way"})
274 274 self.assertFalse(ok)
  275 + # regression: work_graph_orchestrate does "; ".join(feedback or []) on
  276 + # this return value -- a bare string would get joined character-by-
  277 + # character into a garbled reflect prompt (2026-08-06 self-hosting
  278 + # incident). Must be a list containing the message, not the message.
  279 + self.assertIsInstance(detail, list)
  280 + self.assertIn("py_compile", detail[0])
275 281  
276 282 def test_test_script_node_with_real_code_passes(self):
277 283 node_artifact_types = {"script": "test_script"}
... ...