Add the four daemon-owned facets to PlatformPlugin, each typed against a PLATFORM-NEUTRAL wrapper (never the iOS provider seam), populate by wrapping the existing daemon branch, pin with a table-equivalence parity test, then route the daemon lookup through getPlugin(...).
Fan-out (parallelizable — one PR per facet)
| Facet |
Hand branch to wrap |
Neutral wrapper type |
Parity oracle |
providers |
REQUEST_PLATFORM_PROVIDER_DESCRIPTORS src/daemon/request-platform-providers.ts:117 |
() => Partial<PlatformProviderResolvers> (already neutral) |
same provider/undefined per sample device |
recording |
resolveRecordingBackendForDevice / stopActiveRecording src/daemon/handlers/record-trace-recording-backends.ts:73,84 |
daemon-owned RecordingBackend start+stop context (session/deps/fps/base/outPath for start; recording tag for stop) — NOT {device,outPath}->child/wait; de-iOS-name startIosSimulatorRecording src/daemon/recording-provider.ts:17 |
same backend tag per device; same stop dispatch per tag |
appLog |
resolveLogBackend / startLocalAppLog src/daemon/app-log.ts:179,344 |
existing AppLogStartRequest + LogBackend resolver |
same LogBackend + start path per device |
perf |
buildPerfResponseData / supportsPlatformPerfMetrics src/daemon/handlers/session-perf.ts:109,324; native-perf gate session-native-perf.ts:34 |
daemon perf request/response context |
same metrics/support per device |
Layering caveat
These facets reference daemon-owned types, so when populated the plugin's home likely moves under src/platforms/apple/ (keeps daemon → platforms the legal direction) — sequence with d.1. Until each facet is populated AND a real call-site routed through it with a passing parity test, the daemon branch stays the source of truth and the facet is NOT added to the contract.
Refs
perfect-shape.md §6; ADR-0009. (Phase 3 step b.3.)
Part of #972 (Phase 3 — Apple PlatformPlugin).
Add the four daemon-owned facets to
PlatformPlugin, each typed against a PLATFORM-NEUTRAL wrapper (never the iOS provider seam), populate by wrapping the existing daemon branch, pin with a table-equivalence parity test, then route the daemon lookup throughgetPlugin(...).Fan-out (parallelizable — one PR per facet)
providersREQUEST_PLATFORM_PROVIDER_DESCRIPTORSsrc/daemon/request-platform-providers.ts:117() => Partial<PlatformProviderResolvers>(already neutral)undefinedper sample devicerecordingresolveRecordingBackendForDevice/stopActiveRecordingsrc/daemon/handlers/record-trace-recording-backends.ts:73,84RecordingBackendstart+stop context (session/deps/fps/base/outPath for start; recording tag for stop) — NOT{device,outPath}->child/wait; de-iOS-namestartIosSimulatorRecordingsrc/daemon/recording-provider.ts:17appLogresolveLogBackend/startLocalAppLogsrc/daemon/app-log.ts:179,344AppLogStartRequest+LogBackendresolverLogBackend+ start path per deviceperfbuildPerfResponseData/supportsPlatformPerfMetricssrc/daemon/handlers/session-perf.ts:109,324; native-perf gatesession-native-perf.ts:34Layering caveat
These facets reference daemon-owned types, so when populated the plugin's home likely moves under
src/platforms/apple/(keepsdaemon → platformsthe legal direction) — sequence with d.1. Until each facet is populated AND a real call-site routed through it with a passing parity test, the daemon branch stays the source of truth and the facet is NOT added to the contract.Refs
perfect-shape.md §6; ADR-0009. (Phase 3 step b.3.)
Part of #972 (Phase 3 — Apple PlatformPlugin).