# Ortho viewport membership ## Runtime path `EntryPoint.RunDiagnostic` reads each `OrthoViewportInfo` and calls `PlantObjectReader.ReadObjects`. The reader resolves source Piping rows, then `PlantViewportMembershipReader.Read` evaluates the stored query for that exact view. It maps `MdObjectId.PrjObjectId` to a source DataLinks row and assigns a membership status to every independent `PlantObjectSnapshot`. | Status | Meaning | Diagnostic evidence | | --- | --- | --- | | `Resolved` | The source row was returned by the exact view query. | `VIEW_MEMBERSHIP_FROM_CONFIRMED_PNP_ID` | | `ObjectOutsideView` | The source row was not returned by that confirmed query. | `VIEW_MEMBERSHIP_OBJECT_OUTSIDE_CLIP` | | `NotResolved` | The view contract is unavailable, ambiguous, or failed. | `VIEW_MEMBERSHIP_API_UNSUPPORTED` | No source object is treated as visible solely because it belongs to the same model drawing. No geometry-only result is upgraded to `Resolved`. ## Plan effect `AnnotationPlanBuilder` includes membership status in its canonical plan input. `ObjectOutsideView`, unsupported, and unresolved objects are `Skip` operations with stable reason codes. `Resolved` membership can progress only through the existing annotation rules; this DryRun slice never writes an annotation. ## Runtime evidence still required The API contract and build/test coverage are complete, but the exact counts of resolved and outside-view objects require the next Launcher Next DryRun on the local Ortho fixture. The runtime report must record the command-pair PlanIds, summary equality, DBMOD, and automatic rollback.