Concrete problem
At main 14c9822bc6c01d8ff2788454d0e1dc7861bc3816, AppRouteWorkspace builds its Target selector from every key in epoch.targetDigests and defaults to portable when present. That says which projections exist somewhere in the application, not which projection actually launches the selected App's server. A composite can contain portable content while this server is Claude-only; the normal first App preview then requests an ineligible portable session.
This is a source-derived selection defect; this audit did not launch the browser fixture. It is distinct from the delivered production web-ownership fixes in #628 and does not justify reopening that PR.
Source evidence
- app-route-workspace.tsx:
preferredTarget, global targetDigests, and controller.open({ epochId, serverName, target }).
- application-tree.ts: leaves/server groups do not carry projection eligibility, and inspected servers are merged by name.
- web-host-launch-selection.ts already resolves declared launch candidates, compares normalized identities, and refuses genuinely ambiguous implicit selection before spawning anything.
Simplification
Give the App workspace a framework-resolved launch selection from the existing canonical build/launch machinery. Do not teach the UI a second artifact parser, host default list, or candidate-spawn probe. Where richer projection information must cross the Workbench boundary, extend the existing contracts rather than inventing a parallel application graph.
Acceptance
No process is started merely to see which candidate works. No new host requirement, portable requirement, duplicated transport, automatic tool approval or changes to domain code.
Concrete problem
At main
14c9822bc6c01d8ff2788454d0e1dc7861bc3816,AppRouteWorkspacebuilds its Target selector from every key inepoch.targetDigestsand defaults to portable when present. That says which projections exist somewhere in the application, not which projection actually launches the selected App's server. A composite can contain portable content while this server is Claude-only; the normal first App preview then requests an ineligible portable session.This is a source-derived selection defect; this audit did not launch the browser fixture. It is distinct from the delivered production web-ownership fixes in #628 and does not justify reopening that PR.
Source evidence
preferredTarget, globaltargetDigests, andcontroller.open({ epochId, serverName, target }).Simplification
Give the App workspace a framework-resolved launch selection from the existing canonical build/launch machinery. Do not teach the UI a second artifact parser, host default list, or candidate-spawn probe. Where richer projection information must cross the Workbench boundary, extend the existing contracts rather than inventing a parallel application graph.
Acceptance
No process is started merely to see which candidate works. No new host requirement, portable requirement, duplicated transport, automatic tool approval or changes to domain code.