Task Entry owns the renderer state that chooses where a new task will run. It loads the Runtime Host/Project catalog, preserves a selection per Host, derives the new-task target and draft identity, projects the Workspace Picker, and owns add/relink plus remote-directory handoff lifecycles.
It also reveals folders in the system file manager: a task‘s project folder through that task, otherwise the default Runtime Host’s project or workspace folder. The Desktop adapter resolves the default Host and names the task or Host profile each failure belongs to; the controller reports it in the shell's open-folder copy, and a task whose workspace is gone gets the workspace-unavailable notice instead.
features/task-entry.features/task-entry/testing.TaskEntryRoot is the only production owner of the controller hook. Renderer roots receive a stable semantic projection rather than catalog lifecycle state or the controller itself.AppShell, preload, or the main process.TaskEntryServices; feature code never reads the Desktop global bridge directly.AppShell consumes only the target, Host defaults, project path, draft identity, and stable commands. Host and Workspace Picker updates are read at their local UI boundaries; Project Settings remains an injected navigation intent.useProjectRegistration owns single-flight pending state, archived-project confirmation, and recovery through the injected catalog. ProjectRegistrationBoundary is a thin render-prop adapter for legacy callers, whose architecture contract forbids adding hook calls. Cancellation is silent; failures return to the caller's existing error surface. Host changes, lost Host verification, locale changes, unmount, and caller request fences prevent stale confirmation or recovery results from continuing.
Project Settings keeps its original folder-picker add operation, row-action errors, and refresh. The shared remote-directory browser keeps directory I/O, navigation, request sequencing, and accepted-project handoff. The hook does not take ownership of either surface's broader lifecycle.
useSessionWorkspaceRecovery owns the repair request, not the new-task target. Its Add action shares resolveProjectRegistration with other registration callers: confirm restoring the original Project and using it for this Session, restore it, check availability, then call the existing Session relocation port. Even a same-Project move must pass Runtime Host eligibility checks.
Session creation, first-send/task submission, Composer state, attachments, readiness, Project Settings, and the shared remote-directory browser internals remain separate. Task Entry supplies their target/workspace inputs but does not own their lifecycles.
The Desktop adapter is created once in the renderer composition root. Tests use createFakeTaskEntryServices from testing.ts; production code must not import that entry.