# Continuum Scratchpad and Window Actions Implementation Plan

> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.

**Goal:** Add address-scoped close and drag/drop workspace movement plus a global visual scratchpad shelf to Continuum.

**Architecture:** Window components emit intent; OverviewBody owns Hyprland dispatches. Workspace cards and the shelf are drop destinations, and the special scratch workspace remains separate from the positive-workspace filmstrip.

**Tech Stack:** Quickshell QML, QtQuick Drag APIs, Quickshell.Hyprland, Hyprland dispatchers, Bash contract tests

**Spec:** `docs/superpowers/specs/2026-08-17-continuum-scratchpad-design.md`

## Global Constraints

- Every close and move command must target one normalized window address.
- Existing click-to-focus, search, and focus-workspace integration must remain intact.
- `Super+X` and `Super+Shift+X` semantics remain unchanged.
- Drag feedback is event-driven and stops immediately after drop/cancel.

---

### Task 1: Address-scoped action boundary

**Files:**
- Modify: `config/dot/quickshell/modules/overview/OverviewBody.qml`
- Test: `tests/quickshell/overview-window-actions-contract.sh`

**Interfaces:**
- Produces: `addressOf(toplevel)`, `closeToplevel(toplevel)`, `moveToplevel(toplevel, workspaceName)`, and `restoreToplevel(toplevel)`.

- [ ] Write a static/live contract proving move and close operations include an exact disposable-window address.
- [ ] Run it and verify the missing IPC/action surface fails.
- [ ] Implement normalized address helpers and bounded post-dispatch refresh.
- [ ] Run the contract to green without touching non-disposable windows.

### Task 2: Draggable window chrome

**Files:**
- Modify: `config/dot/quickshell/modules/overview/WindowThumbnail.qml`
- Modify: `config/dot/quickshell/modules/overview/WorkspaceCard.qml`

**Interfaces:**
- Produces: activation, close, drag-start, and drag-finish signals carrying the toplevel.
- Consumes: workspace drop callback carrying toplevel and target workspace.

- [ ] Add a source contract for hover-only close chrome and drag payload identity.
- [ ] Implement restrained hover/drag states with activation suppression after drag.
- [ ] Make workspace cards highlight and accept the exact toplevel payload.
- [ ] Verify clicking still focuses and dropping leaves Continuum open.

### Task 3: Global scratchpad shelf

**Files:**
- Create: `config/dot/quickshell/modules/overview/ScratchpadShelf.qml`
- Modify: `config/dot/quickshell/modules/overview/OverviewBody.qml`
- Test: `tests/quickshell/scratchpad-shelf-contract.sh`

**Interfaces:**
- Consumes: Hyprland workspace named `special:scratch` and OverviewBody move/restore callbacks.
- Produces: always-available scratch drop target and populated live-card shelf.

- [ ] Write a contract confirming the global special workspace and existing keybindings.
- [ ] Implement the collapsed empty target and expanded populated shelf.
- [ ] Wire drop-to-hide, click-to-restore, and address-scoped close.
- [ ] Verify the selected positive workspace remains stable while hiding windows.

### Task 4: Keyboard navigation and visual refresh

**Files:**
- Modify: `config/dot/quickshell/modules/overview/Overview.qml`
- Modify: `config/dot/quickshell/modules/overview/OverviewBody.qml`

- [ ] Add workspace Left/Right, result navigation, Enter, Delete, and Escape handling.
- [ ] Refresh workspace/toplevel models and one-shot captures after successful actions.
- [ ] Verify keyboard and pointer flows do not double-activate.

### Task 5: System verification

- [ ] Run overview, focus, window-action, and scratchpad contracts.
- [ ] Use disposable windows to test move, hide, restore, and close end to end.
- [ ] Capture empty shelf, populated shelf, drop target, and close chrome states.
- [ ] Restart Quickshell and confirm the overview maps without warnings.
