173 lines
8.5 KiB
Markdown
173 lines
8.5 KiB
Markdown
---
|
|
id: "02-shared-task-errors"
|
|
title: "Show shared errors across task tabs"
|
|
status: complete
|
|
wave: 2
|
|
depends_on:
|
|
- 01-session-history
|
|
plan: "plan.md"
|
|
requirements:
|
|
- REQ-TASKS-TASK-LAUNCH-FAILURE-RECOVERY-002
|
|
acceptance_criteria:
|
|
- AC-TASKS-TASK-LAUNCH-FAILURE-RECOVERY-002.1
|
|
- AC-TASKS-TASK-LAUNCH-FAILURE-RECOVERY-002.4
|
|
- AC-TASKS-TASK-LAUNCH-FAILURE-RECOVERY-002.5
|
|
- AC-TASKS-TASK-LAUNCH-FAILURE-RECOVERY-002.6
|
|
- AC-TASKS-TASK-LAUNCH-FAILURE-RECOVERY-002.7
|
|
- AC-TASKS-TASK-LAUNCH-FAILURE-RECOVERY-002.8
|
|
system_design:
|
|
- ../../specs/tasks/system-design/task-launch-failure-recovery.md
|
|
---
|
|
|
|
# Task 02: Show shared errors across task tabs
|
|
|
|
## Summary
|
|
|
|
Expose shared failures independently of session errors and render them once in the task shell.
|
|
|
|
## In scope
|
|
|
|
- Add optional scope to normalized metadata and wire types. Audit existing task admission, shared preparation, bootstrap, and resume producers.
|
|
- Preserve originating session correlation without using it as scope. Legacy sessionless task metadata remains shared.
|
|
- Add `task_error` to summary model, projector/rebuild, persistence, boot/HTTP/WS projection, and web state consumers.
|
|
- Render a proposed `TaskSharedError` outside tab content, with dialog/Drawer details and existing guarded recovery actions.
|
|
- Cover no-session, preview, mobile/tablet, full desktop, maximized panel, and plugin-tab paths.
|
|
- Suppress equivalent active controls only by scope and stamp. Preserve unrelated session history and all existing authorization.
|
|
- Localize new labels in the five catalogs and generate Traditional Chinese.
|
|
|
|
## Out of scope
|
|
|
|
A global notification center, a multi-incident queue, and inferred workspace-wide broadcasts.
|
|
|
|
## Acceptance
|
|
|
|
1. A shared failure survives newer session failures, session recovery, reload, and tab switches with unchanged identity.
|
|
2. Exactly one shared control surface exists per task view. Same-stamp session controls do not duplicate it.
|
|
3. Desktop and phone expose equivalent guarded actions with no overflow and reachable no-session recovery.
|
|
|
|
## ASCII UI preview
|
|
|
|
UI-01: Desktop task, shared failure plus an independently recovered session error.
|
|
|
|
```text
|
|
+--------------------------------------------------------+
|
|
| Task title / workflow | fixed
|
|
| ! Workspace preparation failed. [Recovery details] | shared
|
|
+--------------------------------------------------------+
|
|
| Session A | Session B | Plan | Pull request | Files | tabs
|
|
+--------------------------------------------------------+
|
|
| Earlier conversation ^ |
|
|
| ! Session resume failed. 10:18 | |
|
|
| Loading timed out. [Recovery details] | | scrolls
|
|
| Recovered. | |
|
|
| Agent: I resumed work... v |
|
|
+--------------------------------------------------------+
|
|
| Message input | fixed
|
|
+--------------------------------------------------------+
|
|
```
|
|
|
|
UI-02: Phone task Chat, same two independent failures.
|
|
|
|
```text
|
|
+--------------------------------+
|
|
| < Task title Session A v | fixed task chrome
|
|
| ! Workspace preparation failed |
|
|
| [Recovery details] | shared on every view
|
|
+--------------------------------+
|
|
| Earlier messages ^ |
|
|
| ! Session resume failed | |
|
|
| Loading timed out. | | transcript scrolls
|
|
| Recovered. [Details] | |
|
|
| Agent: I resumed work... v |
|
|
+--------------------------------+
|
|
| Message input | safe-area clearance
|
|
| Chat | Plan | Files | More | existing navigation
|
|
+--------------------------------+
|
|
```
|
|
|
|
UI-03: Session entry states, inside either transcript.
|
|
|
|
```text
|
|
Unresolved: ! Resume failed. [Resume] [Recovery details]
|
|
Pending: ! Resume failed. Resuming... [Details]
|
|
Recovered: ! Resume failed. Recovered. [Details]
|
|
Older: ! Resume failed. [Details] (no stale actions)
|
|
```
|
|
|
|
Expanded session details wrap inline. Phone actions stack with 44-pixel targets.
|
|
A failed new attempt appends a separate error entry. Same-stamp updates retain position.
|
|
|
|
UI-04: Shared details, desktop dialog / phone inset bottom drawer.
|
|
|
|
```text
|
|
+--------------------------------+
|
|
| Workspace preparation X |
|
|
| Affected repository: owner/repo|
|
|
| Safe cause and bounded details |
|
|
| [Valid recovery action] |
|
|
+--------------------------------+
|
|
```
|
|
|
|
The phone drawer has safe-area clearance, an internally scrolling body, and 44-pixel controls.
|
|
The desktop dialog uses compact controls. Closing details does not clear the shared alert.
|
|
Views map to recovery criteria 006.4/6/7/8/9 and task criteria 002.4/5/6/7.
|
|
Fixed versus scrolling regions, scope, order, and retained history are requirements.
|
|
Copy and spacing are illustrative and must use localized strings and existing tokens.
|
|
The two errors coexist only because they represent different failures.
|
|
|
|
See the [combined plan](plan.md#ascii-ui-preview). Task 02 implements the views within its scope.
|
|
|
|
## Verification
|
|
|
|
Run from the repository root. Install workspace dependencies once before the first package command if this checkout lacks them.
|
|
Use `/tdd` for changed logic and `/e2e` for browser work. First establish the regression against current behavior.
|
|
|
|
```bash
|
|
(cd apps/backend && go test ./internal/task/statussummary ./internal/task/repository/sqlite ./internal/orchestrator)
|
|
(cd apps/web && pnpm exec vitest run lib/session-recovery-presentation.test.ts components/task/task-shared-error.test.tsx components/task/task-page-content.test.tsx components/task/mobile/session-mobile-layout.test.tsx components/task/task-chat-panel.launch-error.test.tsx)
|
|
(cd apps/web && pnpm run typecheck && pnpm run lint && pnpm run i18n:check)
|
|
(cd apps/web && pnpm e2e:run --project chromium tests/task/launch-failure-recovery.spec.ts)
|
|
(cd apps/web && pnpm e2e:run --project mobile-chrome tests/task/mobile-launch-failure-recovery.spec.ts)
|
|
```
|
|
|
|
## Files likely touched
|
|
|
|
- `apps/backend/internal/task/models/models.go` normalized errors and `internal/task/statussummary/{model,projector,projector_helpers,rebuild}.go` plus tests.
|
|
- `apps/backend/internal/orchestrator/task_launch_recovery.go`, launch failure producers, and fenced task metadata operations.
|
|
- Corresponding boot/HTTP/WS summary serialization and replacement consumers found through `TaskStatusSummary` references.
|
|
- `apps/web/lib/types/task-status-summary.ts`, `lib/session-recovery-presentation.ts`, and task summary state tests.
|
|
- Proposed `apps/web/components/task/task-shared-error.tsx` and `task-shared-error.test.tsx`.
|
|
- `apps/web/components/task/task-page-content.tsx`, `task-layout.tsx`, preview composition, mobile/tablet layouts, and launch-error context.
|
|
- Existing task recovery action components, five locale catalogs, and launch-failure E2E files.
|
|
|
|
## Dependencies
|
|
|
|
01-session-history.
|
|
|
|
## Inputs
|
|
|
|
Read both owning specs linked from the plan and the September 14 scope decision.
|
|
Use the existing launch-recovery tests as the fixture pattern.
|
|
|
|
## Risks
|
|
|
|
Preserve failure identity, sanitized details, existing recovery guards, and message ordering under reversed delivery.
|
|
The shared repository can contain other edits. Do not revert unrelated changes.
|
|
|
|
## Parallelism
|
|
|
|
`sequential`
|
|
|
|
## Results
|
|
|
|
Complete on September 14, 2026. Normalized failures now carry explicit session or task scope. Task-owned errors are projected independently as `task_error`, preserve originating session correlation, and render once above task content. Baseline restoration and fallback derivation route explicit scope before applying legacy session-ID inference, so clearing task metadata also clears the task-owned active error without a session refresh. The shared surface reads the live summary after hydration and emits one assertive announcement for each task and error stamp. Desktop details use a dialog. Phone details use a safe-area-aware, internally scrolling drawer with touch-sized controls and no nested top-bar padding. Existing recovery guards and legacy sessionless task errors remain supported.
|
|
|
|
Validation passed:
|
|
|
|
- Backend status-summary, SQLite, and orchestrator tests passed.
|
|
- Frontend summary, recovery presentation, shared-shell, task layout, mobile layout, and launch-entry tests passed.
|
|
- Frontend typecheck, lint, i18n checks, and Vite build passed.
|
|
- Cold-projector clearing and composed-panel single-representation regressions passed.
|
|
- Chromium and Mobile Chrome launch-recovery suites passed with 4 and 3 tests respectively.
|
|
- The live-summary replacement, one-announcement remount, and mobile top-bar geometry regressions passed.
|