Skip to content

phpstan: op misses inheritance errors (property.extraNativeType) that pre-push catches at same level #263

Description

@fdaviddpt

Friction

During a framework typing pass on FwkDistribution/shared-private/src2/Shared/1.0.0, sub-agents ran ./supertool 'phpstan:<file>' per file and got CLEAN, but the DVSI pre-push hook (PHPStan fwk level 7 — same level) blocked the push with:

Property Shared\Components\Fields\Select\SelectOptionGroup::$label (string)
overriding property Shared\Components\ComponentGroupBase::$label should not have a native type.
🪪 property.extraNativeType (non-ignorable)

Cause

The phpstan: op analyses the single file in isolation. property.extraNativeType (and similar LSP/inheritance-compat errors) require loading and comparing the parent class — which single-file scope doesn't do. So the op reports CLEAN on exactly the error class that matters most for framework base/child typing.

Impact

False "CLEAN" confidence. Agents typed dozens of framework component properties believing they were safe; the inheritance incompatibilities only surfaced at git push. For autonomous typing runs this defeats the local gate.

Ask

Make the phpstan: op catch what pre-push catches at the same level — i.e. analyse with enough context (parent classes loaded) to surface property.extraNativeType and related inheritance errors. If full parity isn't feasible per-file, document that the op cannot gate inheritance-compat and that pre-push / phpstan2_full is required for framework typing.

Repro

Type a child property native where the parent declares it untyped (e.g. any extends ComponentGroupBase class typing $label). phpstan:<file> → CLEAN; pre-push → blocked.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions