devflow-engine 1.2.3__py3-none-any.whl → 1.2.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -256,6 +256,32 @@ def _artifact_under_observability_sandbox(artifact: str, *, error_task_id: str)
256
256
  return marker in normalized
257
257
 
258
258
 
259
+ def _command_targets_observability_sandbox(command: str, *, error_task_id: str) -> bool:
260
+ normalized = command.replace("\\", "/").strip()
261
+ allowed_fragments = (
262
+ f".devflow/observability/{error_task_id}/",
263
+ ".devflow/observability/<id>/",
264
+ f"/.devflow/observability/{error_task_id}/",
265
+ )
266
+ return any(fragment in normalized for fragment in allowed_fragments)
267
+
268
+
269
+ def _repro_tests_under_observability_sandbox(
270
+ repro_tests: object,
271
+ *,
272
+ error_task_id: str,
273
+ ) -> bool:
274
+ if not isinstance(repro_tests, list):
275
+ return True
276
+ for test in repro_tests:
277
+ if not isinstance(test, dict):
278
+ continue
279
+ path = str(test.get("file") or test.get("path") or "").strip()
280
+ if path and not _artifact_under_observability_sandbox(path, error_task_id=error_task_id):
281
+ return False
282
+ return True
283
+
284
+
259
285
  def _validate_ui_observability_repro(
260
286
  observation: dict[str, Any],
261
287
  *,
@@ -274,6 +300,13 @@ def _validate_ui_observability_repro(
274
300
  return False, "ui_observability_requires_playwright_repro_command"
275
301
  if not _artifact_under_observability_sandbox(artifact, error_task_id=error_task_id):
276
302
  return False, "ui_observability_repro_artifact_outside_sandbox"
303
+ if not _command_targets_observability_sandbox(command, error_task_id=error_task_id):
304
+ return False, "ui_observability_repro_command_outside_sandbox"
305
+ if not _repro_tests_under_observability_sandbox(
306
+ observation.get("repro_tests"),
307
+ error_task_id=error_task_id,
308
+ ):
309
+ return False, "ui_observability_repro_test_outside_sandbox"
277
310
  if not output:
278
311
  return False, "ui_observability_missing_repro_output"
279
312
  if not isinstance(oracles, list) or not any(str(o or "").strip() for o in oracles):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devflow-engine
3
- Version: 1.2.3
3
+ Version: 1.2.4
4
4
  Summary: DevFlow v2 CLI-first engine (projects, stories, execution store, review packets)
5
5
  Author: DevFlow
6
6
  License: Proprietary
@@ -32,7 +32,7 @@ devflow_engine/devin2/agent_definition.py,sha256=pCp915tojwPlepRpvjlU1DoPuT_anxR
32
32
  devflow_engine/devin2/pi_runner.py,sha256=xRl-qA3RgMFgiR5fnG6fTwwL95PMk6zVdRdFa-fXy2E,7466
33
33
  devflow_engine/error/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
34
  devflow_engine/error/remediation.py,sha256=Z4LJQzZPzb7_6tea_XtasDvFYQiEdpkFlyxoCEO1I2k,548
35
- devflow_engine/errors/error_solver_dag.py,sha256=GZXVqssgqUgoqRqA5r7_fnz7noZVKD-g3NS5r0ShBms,60195
35
+ devflow_engine/errors/error_solver_dag.py,sha256=jwFewUFxZPUurHrT2WGk85antB5w2S5TEMCUq9sy3k0,61429
36
36
  devflow_engine/errors/question_classifier.py,sha256=oBJ29hszG--TUna62BQHnNmi6hPwf-wEE8eGLmgS624,9729
37
37
  devflow_engine/errors/repo_quality_judge.py,sha256=LVBaXN6AsID-x8qb-IriQKYY1c9AMMRNo-tWMeiuMaA,9962
38
38
  devflow_engine/errors/runtime_observability.py,sha256=Do93Ah3vxLEocYtC0JpnRIRQN6uNAOkYjBz0pmOqg5g,29719
@@ -382,7 +382,7 @@ devflow_engine/prompts/source_doc_mutation/source_doc_enrichment_coherence/promp
382
382
  devflow_engine/prompts/source_doc_mutation/user_workflows/prompt.md,sha256=2Bv-EkZwzxtPSsDGdw9YuuuzT1c_2R9c6HPSMdP-MD0,406
383
383
  devflow_engine/prompts/source_scope/doctrine/prompt.md,sha256=AJk1gfePTdaBSw5DHvCr7Sigsk2orGaRVNZ3Dj3NdcQ,837
384
384
  devflow_engine/prompts/ui_grounding/doctrine/prompt.md,sha256=0L5y-QjjquPABqxAHZNPkcjyHMZQSDRVncNDQa2app0,409
385
- devflow_engine-1.2.3.dist-info/METADATA,sha256=spmTNfOipkpqYWkJx_uOVJjLtfYG_ZZ9PBs6aOWSjDM,7755
386
- devflow_engine-1.2.3.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
387
- devflow_engine-1.2.3.dist-info/entry_points.txt,sha256=U5Pw4y4v4u4xcRS5DbXfemBg0RKp74kMxcnEoL0MACY,99
388
- devflow_engine-1.2.3.dist-info/RECORD,,
385
+ devflow_engine-1.2.4.dist-info/METADATA,sha256=6RFdShXKS6HOlHJ7MWGIukO1KPwM--VG8Bz8TSx-3fU,7755
386
+ devflow_engine-1.2.4.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
387
+ devflow_engine-1.2.4.dist-info/entry_points.txt,sha256=U5Pw4y4v4u4xcRS5DbXfemBg0RKp74kMxcnEoL0MACY,99
388
+ devflow_engine-1.2.4.dist-info/RECORD,,