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.
Summary
37 cmdlet/parameter pairs bind a name-shaped selector against an endpoint whose items carry no
nameproperty, for reasons unrelated to policy join records. The selector cannot bind byproperty 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
ValueFromPipelineByPropertyNamebinds by locating a property of the matchingname 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)@{component_address=…; component_name=…; description=…}component_name, notname@{group=; member=}@{context=; object_store=…; realm=}@{component_address=…; component_name=…; context=…}@{context=; copyable=…; key=…; namespace=…; resource=; value=…}key@{coordinator_of=…; fleet=; member=; status=…}@{created=…; expires=…; fleet_key=…}@{file_system=; legal_hold=; path=…; status=…}The heterogeneity is the point: a fix for the join-item class will not resolve these, because there
is no shared
member/policystructure to key on. Several of these arguably want a differentselector 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
Coercedrather thanBound, 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|NameEvidence
Reports/PfbPipelineSelectorMap.json, regenerated on the #141 branch. FilterresultstoOutcome = 'Coerced'with aBoundValuebeginning@{, then exclude the pairs whoseBoundValuecontains both
member=andpolicy=(those are the join-item class).Together the two classes account for all 266
Coercedfindings across 102 pairs.Relationship to existing issues
it. Its header states the general fix issue would be filed once a PR existed; that never
happened.
rather than the cmdlets.
Not in scope
The 65-pair join-item class -- family endpoints returning
@{context=; member=; policy=}andits two variants. Same symptom, one coherent shared cause, and a single fix plausibly resolves all
65; tracked in #152.