* ✨ feat(task-dock): promote the upload dock into an app-level task dock
Background work of every kind now shares one dock instead of the
uploads-only one mounted inside the resource manager.
- `features/TaskDock` renders a `DockTask[]` collected from producer
hooks; producers own their copy, actions and results.
- One task renders as a result card, two or more as a panel grouped by
producer. The shape follows the task count and waits 400ms before
shrinking so a burst of dismissals cannot morph it repeatedly.
- A finished task with nothing to hand back clears itself after 3s; one
that left a result waits for the user, and a failure always does.
- File uploads keep their store untouched and are adapted into tasks;
`business/client/features/DockTasks` lets a distribution add its own.
- Mounted in `SPAGlobalProvider`, so the dock outlives the page that
started the work.
Claude-Session: https://claude.ai/code/session_014iyxmqssnrPopmKV1xKJ7k
* 🐛 fix(task-dock): batch a producer's cancel-all and label the expand toggle
- `DockTask.groupCancel` lets a producer cancel its whole set in one
operation. Walking `cancel` per task turned a folder upload's batched
cancel into one full-list update per file.
- The header toggle said "Collapse" while collapsed, i.e. the opposite of
what it does.
Claude-Session: https://claude.ai/code/session_014iyxmqssnrPopmKV1xKJ7k
* 🐛 fix(task-dock): lazy-load the dock and turn the size gate into a review
The dock pulled the upload/file chunks into the first-screen static
graph; it now loads through `lazy()` like the other global hosts.
The web and ASAR size gates no longer fail their jobs. A failing gate
submits a REQUEST_CHANGES review from github-actions that links the
report comment, updates it while still failing, and dismisses it once
the gate passes again.
Claude-Session: https://claude.ai/code/session_01BBCjqExuP6Ux5PRVJbU2ru