Skip to content

Name selector coerced to a stringified item on 37 pairs whose records have no name property #153

Description

Summary

37 cmdlet/parameter pairs bind a name-shaped selector against an endpoint whose items carry no
name property
, for reasons unrelated to policy join records. The selector cannot bind by
property name, so the PowerShell pipeline stringifies the whole object onto the wire as the
selector value.

Same symptom as the join-item class, different cause, so they are tracked separately rather
than conflated into one fix.

Mechanism

A parameter declared ValueFromPipelineByPropertyName binds by locating a property of the matching
name on the incoming object. These endpoints return items that have no such property, so nothing
binds by name and the object itself becomes the value.

Unlike the join-item class, there is no single shape here -- the items are unrelated record types
that simply happen to lack name:

BoundValue (truncated) rows what it is
@{component_address=…; component_name=…; description=…} 13 hardware/alert records keyed on component_name, not name
@{group=; member=} 10 membership items -- both members are objects
@{context=; object_store=…; realm=} 4 realm/object-store association records
@{component_address=…; component_name=…; context=…} 2 as above, realm-scoped variant
@{context=; copyable=…; key=…; namespace=…; resource=; value=…} 2 workload tag items -- keyed on key
@{coordinator_of=…; fleet=; member=; status=…} 2 fleet membership
@{created=…; expires=…; fleet_key=…} 2 fleet key records
@{file_system=; legal_hold=; path=…; status=…} 2 legal-hold placements
remainder 3
total 40 across 37 pairs

The heterogeneity is the point: a fix for the join-item class will not resolve these, because there
is no shared member/policy structure to key on. Several of these arguably want a different
selector parameter altogether (component_name, key) rather than a binding fix.

Scope of exposure

Primary producers are unaffected -- all 40 rows are non-primary. Every row is classified
Coerced rather than Bound, so the rail detects all of them; none is silently mis-binding.

Affected pairs (37)

Get-PfbActiveDirectory|Name, Get-PfbAlertWatcher|Name, Get-PfbCertificate|Name,
Get-PfbCertificateGroup|Name, Get-PfbCertificateGroupUse|Name, Get-PfbCertificateUse|Name,
Get-PfbFleet|Name, Get-PfbKmip|Name, Get-PfbLegalHold|Name, Get-PfbNodeGroup|Name,
Get-PfbNodeGroupUse|Name, Get-PfbOidcIdp|Name, Get-PfbRealm|Name, Get-PfbRealmSpace|Name,
Get-PfbRealmStorageClass|Name, Get-PfbResiliencyGroup|Name, Get-PfbSaml2Idp|Name,
Get-PfbSnmpManager|Name, Get-PfbSupport|Name, Get-PfbSupportDiagnostics|Name,
Get-PfbSupportDiagnosticsDetails|Name, Get-PfbSyslogServer|Name, Get-PfbWorkload|Name,
Remove-PfbActiveDirectory|Name, Remove-PfbAlertWatcher|Name, Remove-PfbCertificate|Name,
Remove-PfbCertificateGroup|Name, Remove-PfbFleet|Name, Remove-PfbLegalHold|Name,
Remove-PfbNodeGroup|Name, Remove-PfbOidcIdp|Name, Remove-PfbRealm|Name,
Remove-PfbSaml2Idp|Name, Remove-PfbSnmpManager|Name, Remove-PfbSyslogServer|Name,
Remove-PfbWorkload|Name, Update-PfbKmip|Name

Evidence

Reports/PfbPipelineSelectorMap.json, regenerated on the #141 branch. Filter results to
Outcome = 'Coerced' with a BoundValue beginning @{, then exclude the pairs whose BoundValue
contains both member= and policy= (those are the join-item class).

Together the two classes account for all 266 Coerced findings across 102 pairs.

Relationship to existing issues

Not in scope

The 65-pair join-item class -- family endpoints returning @{context=; member=; policy=} and
its two variants. Same symptom, one coherent shared cause, and a single fix plausibly resolves all
65; tracked in #152.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions