Files
kandev/docs/plans/worktree-refresh-fail-closed/task-03-project-refresh-launch-failures.md
T

121 lines
4.4 KiB
Markdown

---
id: "03-project-refresh-launch-failures"
title: "Project refresh launch failures"
status: done
wave: 3
depends_on:
- "02-reject-stale-fallbacks"
plan: "plan.md"
requirements:
- REQ-WORKSPACES-WORKTREE-BASE-REFRESH-001
acceptance_criteria:
- AC-WORKSPACES-WORKTREE-BASE-REFRESH-001.6
- AC-WORKSPACES-WORKTREE-BASE-REFRESH-001.7
system_design:
- ../../specs/workspaces/system-design/worktree-base-refresh.md
---
# Task 03: Project Refresh Launch Failures
## Summary
Carry a required-refresh failure through lifecycle and task launch boundaries.
Prove that Kandev starts no agent and shows the durable repository-specific
error on desktop and mobile.
## In scope
- Add a failing multi-repository launch test where the second repository cannot
complete required refresh.
- Preserve exact repository identity while wrapping refresh errors.
- Use the existing generic typed launch-failure category unless a focused test
proves a new category is necessary for a valid recovery action.
- Bound and redact error detail through existing launch-error helpers.
- Prove that no agent runtime starts after a required refresh error.
- Extend existing desktop and mobile launch-failure recovery E2E fixtures with
a stale-origin refresh failure and reload assertion.
- Prove that normal retry succeeds after the remote and credentials are fixed.
## Out of scope
- A new recovery action, WebSocket schema, or task-error store.
- New UI components, responsive layout, or translations.
- Partial agent launch for multi-repository tasks.
## Acceptance
- A required refresh error prevents runtime startup and names the exact failed
repository without exposing credentials or an authenticated URL.
- The active task error survives reload and renders through the existing task
error surface on desktop and mobile.
- A later normal retry reruns refresh and can launch after the underlying Git
problem is corrected.
## Verification
Start with the multi-repository no-start regression and confirm it fails before
error propagation is complete. Then run:
```bash
# From apps/backend:
rtk go test ./internal/orchestrator/... ./internal/orchestrator/executor/... -run 'LaunchFailure|RepositoryRefresh|MultiRepo' -race
rtk go test ./internal/orchestrator/... ./internal/worktree/... -race
# From the repository root:
rtk make -C apps/backend build
rtk make -C apps/backend e2e-plugin-package
# From apps/web:
rtk pnpm run build:e2e
rtk pnpm e2e:raw --project=chromium e2e/tests/task/launch-failure-recovery.spec.ts
rtk pnpm e2e:raw --project=mobile-chrome e2e/tests/task/mobile-launch-failure-recovery.spec.ts
# From the repository root:
rtk make -C apps/backend lint
```
## Files likely touched
- `apps/backend/internal/orchestrator/executor/executor_resume.go`
- `apps/backend/internal/orchestrator/executor/executor_execute.go`
- `apps/backend/internal/orchestrator/executor/executor_launch_failure_classification_test.go`
- `apps/backend/internal/orchestrator/task_launch_failure_test.go`
- `apps/web/e2e/tests/task/launch-failure-recovery.spec.ts`
- `apps/web/e2e/tests/task/mobile-launch-failure-recovery.spec.ts`
## Dependencies
- Task 02 provides the required-refresh error from the worktree boundary.
## Risks
- Raw Git output can contain a credential-bearing URL. Test redaction with a
synthetic secret and assert that it is absent from logs and projected detail.
- An E2E fixture that fails clone instead of refresh does not prove this bug.
Seed a valid cached checkout, make its origin fail, and request a new
worktree.
- Backend E2E artifacts must be rebuilt before Playwright starts.
## Parallelism
`sequential`
## Inputs
- `AC-WORKSPACES-WORKTREE-BASE-REFRESH-001.6` and `.7`.
- `REQ-TASKS-TASK-LAUNCH-FAILURE-RECOVERY-001` as an adjacent task-system
contract.
- Existing desktop and mobile launch-failure recovery E2E tests.
## Results
- Multi-repository preparation preserves exact repository identity and rolls
back preparation without starting an agent runtime.
- Launch error details use existing credential-safe sanitization while keeping
repository-specific recovery actions.
- Desktop and mobile launch-failure fixtures cover a valid cached checkout with
a failing origin, reload persistence, and successful retry after recovery.
- Verified with the focused and full orchestrator/worktree race suites, backend
build, E2E plugin package, production E2E build, Chromium and mobile-chrome
specs, and backend lint.