well… I tried your code, and with this:
git diff --staged
diff --git a/src/python/pants/backend/demo/BUILD b/src/python/pants/backend/demo/BUILD
new file mode 100644
index 000000000..0ec0a26db
--- /dev/null
+++ b/src/python/pants/backend/demo/BUILD
@@ -0,0 +1,5 @@
+# Copyright 2023 Pants project contributors (see CONTRIBUTORS.md).
+# Licensed under the Apache License, Version 2.0 (see LICENSE).
+python_sources()
+
+portable_object_file(name=“testing”)
diff --git a/src/python/pants/backend/demo/__init__.py b/src/python/pants/backend/demo/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/python/pants/backend/demo/messages.po b/src/python/pants/backend/demo/messages.po
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/python/pants/backend/demo/register.py b/src/python/pants/backend/demo/register.py
new file mode 100644
index 000000000..bb6119527
--- /dev/null
+++ b/src/python/pants/backend/demo/register.py
@@ -0,0 +1,64 @@
+# Copyright 2023 Pants project contributors (see CONTRIBUTORS.md).
+# Licensed under the Apache License, Version 2.0 (see LICENSE).
+from dataclasses import dataclass
+from typing import Iterable
+
+from pants.engine.rules import Rule, UnionRule, collect_rules, rule
+from pants.engine.target import (
+ COMMON_TARGET_FIELDS,
+ Dependencies,
+ FieldSet,
+ InferDependenciesRequest,
+ InferredDependencies,
+ SingleSourceField,
+ Target,
+)
+
+
+class PortableObjectSourceField(SingleSourceField):
+ expected_file_extensions = (“.po”,)
+ default = “messages.po”
+ required = False
+
+
+class PortableObjectDependenciesField(Dependencies):
+ pass
+
+
+class PortableObjectTarget(Target):
+ alias = “portable_object_file”
+ core_fields = (
+ PortableObjectSourceField,
+ PortableObjectDependenciesField,
+ *COMMON_TARGET_FIELDS,
+ )
+ help = “A gettext Portable Object file.”
+
+
+@dataclass(frozen=True)
+class PortableObjectFileInferenceFieldSet(FieldSet):
+ required_fields = (PortableObjectSourceField, PortableObjectDependenciesField)
+
+ source: PortableObjectSourceField
+ dependencies: PortableObjectDependenciesField
+
+
+class InferPortableObjectDependencies(InferDependenciesRequest):
+ infer_from = PortableObjectFileInferenceFieldSet
+
+
+@rule
+async def infer_markup_files_for_portable_object_file(
+ request: InferPortableObjectDependencies,
+) -> InferredDependencies:
+ raise RuntimeError(“Please Run”)
+
+ return InferredDependencies([])
+
+
+def rules() -> Iterable[Rule]:
+ return [*collect_rules(), UnionRule(InferDependenciesRequest, InferPortableObjectDependencies)]
+
+
+def target_types() -> Iterable[type[Target]]:
+ return [PortableObjectTarget]