UX-NB-001 — Separate closing a view from shutting down compute
| Field | Value |
|---|---|
| Status | Open; source-verified, deployed confirmation pending |
| Architecture state | Source-backed current behavior; deployed confirmation pending |
| Severity | High |
| Affected surface | Closing the last Workspace tab for a notebook |
| Components | sparqd/oqullus; Jupyter session API |
| Associated issue | oqullus #522 |
Where the problem appears
Define in-memory state and close the final open tab for that notebook without selecting an explicit compute-shutdown action.
Concrete observed case
Reviewed source clears runtime state and deletes the Jupyter session when no other open tab has the same notebook path. The close action does not offer a separate shutdown choice.
Expected condition
Close detaches the view while the authorized session remains subject to idle culling. Close and Shut Down explicitly deletes it, warns about state loss, and confirms success or failure.
Cause and evidence
View lifecycle and compute-session lifecycle are coupled in the same close path.
Why it matters
Removing tab clutter can unexpectedly erase variables and terminate work. The behavior also conflicts with refresh and reconnect expectations.
Existing controls and workarounds
Keep the notebook tab open or save content before closing. Idle culling limits the cost of a detached session once Close no longer implies shutdown.
Alternatives considered
- Recommended: separate Close from Close and Shut Down.
- Always retain compute after close — avoids data loss but hides resource release unless idle policy is clearly shown.
- Always shut down — rejected because closing a view is not consent to destroy stateful compute.
Component involvement
sparqd/oqullusowns the user choice, warning, and session cleanup request.- Jupyter Server owns the session deletion result.
Reproduction and verification
Follow NB-S013.
Resolution conditions
Close when view closure preserves the session, explicit shutdown removes it, both outcomes are truthful, and multi-tab scope is tested.
Validation and blockers
Source behavior is confirmed. A disposable deployed notebook is required to capture state, cleanup, and cost behavior.