devflow-engine 1.2.2__py3-none-any.whl → 1.2.3__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.
@@ -244,7 +244,23 @@ def _validate_ui_fix_proof(
244
244
  return True, normalized, None
245
245
 
246
246
 
247
- def _validate_ui_observability_repro(observation: dict[str, Any]) -> tuple[bool, str | None]:
247
+ def _artifact_under_observability_sandbox(artifact: str, *, error_task_id: str) -> bool:
248
+ normalized = artifact.replace("\\", "/").strip()
249
+ allowed_prefixes = (
250
+ f".devflow/observability/{error_task_id}/",
251
+ ".devflow/observability/<id>/",
252
+ )
253
+ if any(normalized.startswith(prefix) for prefix in allowed_prefixes):
254
+ return True
255
+ marker = f"/.devflow/observability/{error_task_id}/"
256
+ return marker in normalized
257
+
258
+
259
+ def _validate_ui_observability_repro(
260
+ observation: dict[str, Any],
261
+ *,
262
+ error_task_id: str,
263
+ ) -> tuple[bool, str | None]:
248
264
  artifact = str(observation.get("repro_artifact_path") or "").strip()
249
265
  command = str(observation.get("repro_run_command") or "").strip()
250
266
  output = str(observation.get("repro_output") or "").strip()
@@ -256,6 +272,8 @@ def _validate_ui_observability_repro(observation: dict[str, Any]) -> tuple[bool,
256
272
  return False, "ui_observability_missing_playwright_repro_artifact"
257
273
  if "playwright" not in command.lower():
258
274
  return False, "ui_observability_requires_playwright_repro_command"
275
+ if not _artifact_under_observability_sandbox(artifact, error_task_id=error_task_id):
276
+ return False, "ui_observability_repro_artifact_outside_sandbox"
259
277
  if not output:
260
278
  return False, "ui_observability_missing_repro_output"
261
279
  if not isinstance(oracles, list) or not any(str(o or "").strip() for o in oracles):
@@ -876,7 +894,10 @@ class BuildObservabilityNode(Node):
876
894
  else {}
877
895
  )
878
896
  if observed_flag and _ui_proof_required({"runtimeContext": user_report_context_for_ui}):
879
- ui_repro_ok, ui_repro_failure_reason = _validate_ui_observability_repro(observation)
897
+ ui_repro_ok, ui_repro_failure_reason = _validate_ui_observability_repro(
898
+ observation,
899
+ error_task_id=error_task_id,
900
+ )
880
901
 
881
902
  # Split deferred questions via LLM classifier (v1.1.22).
882
903
  # An injectable hook is used when present so tests can
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devflow-engine
3
- Version: 1.2.2
3
+ Version: 1.2.3
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=U7n6pgt95SIePgFDPNMp_OFOW8Eq0Nyw29Kjf7XBf9E,59446
35
+ devflow_engine/errors/error_solver_dag.py,sha256=GZXVqssgqUgoqRqA5r7_fnz7noZVKD-g3NS5r0ShBms,60195
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.2.dist-info/METADATA,sha256=gs_L91c1G3EHidj1wi52bGWurkduxKak2V5DlW2yKdM,7755
386
- devflow_engine-1.2.2.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
387
- devflow_engine-1.2.2.dist-info/entry_points.txt,sha256=U5Pw4y4v4u4xcRS5DbXfemBg0RKp74kMxcnEoL0MACY,99
388
- devflow_engine-1.2.2.dist-info/RECORD,,
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,,