118 lines
5.8 KiB
Markdown
118 lines
5.8 KiB
Markdown
---
|
|
spec: docs/specs/tasks/requirements/task-create-executor-default.md
|
|
created: 2026-08-18
|
|
status: complete
|
|
---
|
|
|
|
# Implementation Plan: Reset Executor When Returning to Repo
|
|
|
|
## Overview
|
|
|
|
Reset the task-create executor selection whenever the dialog leaves repository-less mode so the
|
|
existing source-aware default effect can resolve the Repo destination again. Lock the transition
|
|
down with a focused handler regression, then exercise the complete Repo to None to Repo sequence in
|
|
the existing executor-default Playwright suite. No backend, persistence, API, copy, or layout change
|
|
is required.
|
|
|
|
## Confirmed root cause
|
|
|
|
`handleToggleNoRepository` in
|
|
`apps/web/components/task-create-dialog-handlers.ts` clears `executorId` and
|
|
`executorProfileId` only when entering repository-less mode. The source-aware auto-pick effect in
|
|
`apps/web/components/task-create-dialog-effects.ts` intentionally returns early while either
|
|
selection is populated. After repository-less mode selects Local, leaving the mode clears only
|
|
`workspacePath`. The stale Local profile therefore prevents Repo mode from reapplying the workspace
|
|
default or Worktree fallback.
|
|
|
|
The current focused handler and executor-effect suites pass 36 tests, but they do not cover the
|
|
repository-less-to-Repo transition.
|
|
|
|
## Frontend
|
|
|
|
### Source transition reset
|
|
|
|
- Update `handleToggleNoRepository` to clear `executorId` and `executorProfileId` when switching in
|
|
either direction.
|
|
- Preserve the current mutually exclusive source flags, repository and branch selections, remote
|
|
repository state, workspace-path cleanup, and last-used source cleanup.
|
|
- Reuse `useDefaultSelectionsEffect` for destination-specific selection. Repository-less mode
|
|
continues to prefer direct Local. Repo mode honors a valid workspace default and otherwise
|
|
prefers Worktree.
|
|
- Do not hardcode a Worktree profile in the handler. The existing policy remains authoritative for
|
|
workspaces that explicitly default to Local and for fallback behavior when Worktree is absent.
|
|
|
|
### Mobile parity
|
|
|
|
- **Desktop and mobile outcome:** the responsive Create Task dialog applies the same executor policy
|
|
after the Repo to None to Repo sequence.
|
|
- **Nearest shipped mobile exemplar:** the current mobile Create Task dialog remains the interaction
|
|
and composition baseline.
|
|
- **Presentation and state:** no markup, navigation, overlay, scrolling, safe-area, focus, or touch
|
|
behavior changes. The fix stays in the shared dialog handlers and selection effects.
|
|
- **Coverage:** the focused unit regression plus the desktop real-dialog E2E establish the shared
|
|
state transition. A new mobile-only Playwright test is not required because this is state
|
|
normalization inside an unchanged responsive component.
|
|
|
|
## Tests
|
|
|
|
- **What:** leaving repository-less mode invalidates the Local executor selection so destination
|
|
policy can run again.
|
|
- **File:** `apps/web/components/task-create-dialog-handlers.test.ts`
|
|
- **How:** render `useDialogHandlers` with repository-less mode active and a Local executor.
|
|
Invoke `handleToggleNoRepository`. Assert that both executor setters receive an empty value and
|
|
that the handler clears the workspace path.
|
|
- **What:** entering repository-less mode retains its current reset behavior.
|
|
- **File:** `apps/web/components/task-create-dialog-handlers.test.ts`
|
|
- **How:** keep or add the paired entry assertion so a later refactor cannot make the reset
|
|
one-directional again.
|
|
- **What:** an empty repository-backed selection still resolves to Worktree through existing policy.
|
|
- **File:** `apps/web/components/task-create-dialog-effects-executor.test.ts`
|
|
- **How:** retain the existing executor-first/default-policy cases as companion coverage. This
|
|
fix does not introduce a new policy branch.
|
|
|
|
## E2E Tests
|
|
|
|
- **Scenario:** **GIVEN** Repo with no executor default, **WHEN** the user selects None and Repo,
|
|
**THEN** the visible executor changes from Worktree to Local to Worktree.
|
|
- **File:** `apps/web/e2e/tests/task/create-task-executor-default.spec.ts`
|
|
- **Verification:** use the source-mode test IDs and the visible executor-profile selector.
|
|
Restore the workspace default and task-create preference during cleanup. Use the managed
|
|
production build.
|
|
|
|
## Verification Results
|
|
|
|
Task 01 and Task 02 are complete. During diagnosis, the unchanged baseline command
|
|
`cd apps/web && pnpm test -- --run components/task-create-dialog-handlers.test.ts components/task-create-dialog-effects-executor.test.ts`
|
|
passed 36 tests across 2 files. The Task 01 implementation command passed 37 tests across 2 files,
|
|
and the web typecheck passed. The managed Chromium command
|
|
`cd apps/web && pnpm e2e:run --project chromium tests/task/create-task-executor-default.spec.ts`
|
|
passed all 3 tests after rebuilding the production backend and Vite assets.
|
|
|
|
## Implementation Tasks
|
|
|
|
Wave 1:
|
|
|
|
- [x] [Task 01: Reset executor on source transition](task-01-reset-source-executor.md)
|
|
|
|
Wave 2:
|
|
|
|
- [x] [Task 02: Prove the real dialog transition](task-02-dialog-transition-e2e.md)
|
|
|
|
Execution is sequential in the primary conversation. No subagent delegation is planned or
|
|
authorized.
|
|
|
|
## Risks
|
|
|
|
- The executor-ID and executor-profile effects settle through microtasks. Unit assertions prove
|
|
invalidation at the handler boundary. Playwright proves the final visible selection.
|
|
- Hardcoding Worktree in the toggle handler would break explicit Local workspace defaults. The
|
|
handler must only invalidate stale state and let the existing policy select the destination.
|
|
- The E2E fixture persists workspace and task-create settings across tests, so cleanup must restore
|
|
both values even after a failed assertion.
|
|
|
|
## Out of scope
|
|
|
|
- Changing executor-default precedence or persistence.
|
|
- Changing Repo, Remote, or None presentation and labels.
|
|
- Changing repository, branch, or remote-source retention while switching modes.
|