{"record":{"id":"84dc2cf9d7ba1ba7","repo":"apache/beam","slug":"unknown-or-inapplicable-phase-for-pre-optimize-s-portable","errorCode":null,"errorMessage":"Unknown or inapplicable phase for pre_optimize: %s","messagePattern":"Unknown or inapplicable phase for pre_optimize: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/runners/portability/portable_runner.py","lineNumber":339,"sourceCode":"        ]\n        partial = True\n      elif pre_optimize == 'all':\n        phases = translations.standard_optimize_phases()\n        partial = False\n      elif pre_optimize == 'all_except_fusion':\n        # TODO(https://github.com/apache/beam/issues/19422): Delete this branch\n        # after PortableRunner supports beam:runner:executable_stage:v1.\n        phases = translations.standard_optimize_phases()\n        phases.remove(translations.greedily_fuse)\n        partial = True\n      else:\n        phases = []\n        for phase_name in pre_optimize.split(','):\n          # For now, these are all we allow.\n          if phase_name in ('pack_combiners', 'lift_combiners', 'expand_sdf'):\n            phases.append(getattr(translations, phase_name))\n          else:\n            raise ValueError(\n                'Unknown or inapplicable phase for pre_optimize: %s' %\n                phase_name)\n        phases.append(translations.sort_stages)\n        partial = True\n\n      # All (known) portable runners (ie Flink and Spark) support these URNs.\n      known_urns = frozenset([\n          common_urns.composites.RESHUFFLE.urn,\n          common_urns.primitives.IMPULSE.urn,\n          common_urns.primitives.FLATTEN.urn,\n          common_urns.primitives.GROUP_BY_KEY.urn\n      ])\n      proto_pipeline = translations.optimize_pipeline(\n          proto_pipeline,\n          phases=phases,\n          known_runner_urns=known_urns,\n          partial=partial)\n","sourceCodeStart":321,"sourceCodeEnd":357,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/runners/portability/portable_runner.py#L321-L357","documentation":"pre_optimize accepts only a comma-separated whitelist of optimization phases: pack_combiners, lift_combiners, expand_sdf. Any other name passed via --pre_optimize raises this ValueError in _optimize_pipeline.","triggerScenarios":"Setting --pre_optimize to a name not in ('pack_combiners','lift_combiners','expand_sdf') — e.g. a typo like 'lift_combiner', an unknown phase, or sort_stages which is added automatically.","commonSituations":"Typos in pipeline options; copying phase names from newer/older Beam versions where the whitelist differs; trying to enable internal phases like sort_stages explicitly.","solutions":["Use only pack_combiners, lift_combiners, or expand_sdf in --pre_optimize.","Remove the misspelled/unsupported phase from the comma-separated list.","Check translations module of your Beam version for the supported phase set."],"exampleFix":"// before\n--pre_optimize=pack_combiners,sort_stages\n// after\n--pre_optimize=pack_combiners,lift_combiners","handlingStrategy":"validation","validationCode":"ALLOWED = {'pack_combiners', 'lift_combiners', 'expand_sdf'}\nrequested = set(pre_optimize.split(','))\nassert requested <= ALLOWED, f'unsupported pre_optimize phases: {requested - ALLOWED}'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Copy phase names only from the whitelist in _optimize_pipeline.","Do not include sort_stages; it is appended automatically.","Re-check the whitelist when upgrading Beam versions."],"tags":["configuration","optimization","invalid-value"],"backgroundTag":"invalid-enum-value","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}