Skip to content

PQA017 — Circular inheritance detected

Device types form a cycle through extends:.

extends: lets a device type inherit properties, functions and commands from a base type — the shape shared by three SIO module variants is declared once and specialised three times. Resolving a type means walking that chain to its base.

A cycle makes the walk endless.

- type_id: ModuleBase
  extends: Module
- type_id: Module
  extends: ModuleBase

Why the build refuses this

The full property set of the type cannot be computed. Every generator downstream — Thing class, validator, deserializer — needs the resolved set, and there is no base case to stop at.

How to fix it

Make one type the base and give it no extends:. Inheritance chains here are shallow by design: a shared base and its variants.

A cycle of two usually means both types were specialised from each other instead of from a common ancestor; extract the shared shape into a third, abstract: true type and let both extend it.

If you disagree with a report

Do not suppress it. A wrong report is a bug in the check — report it with the YAML that triggered it.