Skip to content

Finish tabs: Orbit's own row menus, blank windows, the tab switcher, tab sleep, Spaces' toasts and themes, and the import guard (TB, SP, PR, FD) - #31

Merged
siyabendoezdemir merged 31 commits into
mainfrom
lane/finish-tabs
Oct 11, 2026
Merged

siyabendoezdemir merged 31 commits into
mainfrom
lane/finish-tabs

Conversation

@siyabendoezdemir

@siyabendoezdemir siyabendoezdemir commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

The finish-tabs lane finishes tabs, Today, folders, Favorites, Spaces and profiles. Most of their gaps waited on chrome's sidebar, the Settings window and the Library, which are on main now.

It's built from lanes/finish-tabs.md. Since then it has merged feel (PR #25), finish-views (PR #26), pages (PR #27), the sign-off marks (PR #28) and sign-offs 2 to 4 (PR #29); main is 9a30d3d. Against main it changes 118 files (+8538/−1000). The lane stopped near D30's 9k lines, and the review's two fix rounds added about 680 more.

The builder's report is reviews/lane-finish-tabs-report.md in the project's context folder.

What it builds

  • Orbit's own row menus (TB-14, P0). The tab, pinned, Favorite, folder, multi-selection and split row menus open in Orbit's overlay, in the Space's colours.

    • An item that does what a key does shows that key from the live keymap (KS-18). While a menu is open, it takes the keys first (KS-19).
    • A menu anchors on its row's slot, and the row stays drawn while its menu is open (FL-21).
    • Tests read the menus through a row-menu test hook. The page menu stays native.
  • Spaces and toasts (P0):

    • SP-02: the toast shown while the sidebar is hidden gets Show.
    • SP-14: ⌘Z after the theme picker reverts the theme.
    • SP-16 and SB-13: toasts take the Space's tint, and show over the page while the sidebar is hidden.
    • SP-15: the neutral theme shows the window's material where the platform has one. This completes SB-24. Linux and older Windows have none in Electron, so the neutral theme is solid there.
  • TD-03: the per-profile archive timing, checked and tested. Archive periods apply at once.

  • Drops (TB-09, NV-08):

    • a row dropped on a page's edge or centre makes a split (SV-04);
    • over a field that takes links, a row drops its URL there instead;
    • a link dragged from a page onto the sidebar opens as a tab where it lands.
  • Blank windows (TB-17, which completes NV-10): KS-05's ⌃⌘N on macOS, and the command bar elsewhere.

  • The recent-tab switcher (TB-05, FL-26). With ⌃Tab, the list shows at the second Tab or after 150 ms, with MD-11's sound and recording indicators. It switches when ⌃ is let go.

  • Tab sleep (TB-16):

    • a background tab using half a core for 30 s is frozen;
    • low memory and the battery saver put tabs to sleep sooner.

    A sleeping tab costs 1.0 MB, against the spec's target of under 5 MB.

  • Also:

    • tabs: Open as Split for a multi-selection (TB-13), and notes on a Favorite that plays sound (TB-15);
    • folders: full-colour folder icons (FD-07), and "Open " in the command bar (FD-09);
    • Spaces: ⌘Z for a Space reorder (SP-11), and Select Next and Previous Space (SP-22);
    • profiles: a deleted profile's folder removed from disk (PR-08), and the profile rename (PR-09);
    • keys: sidebar undo and redo in the keymap (KS-05).
  • SV-26's sidebar part: two rows merge into one split row in place, and split back out, with the reorder spring.

  • AR-11 (sign-off 2's gap 3, D82): a folder that comes back with its tabs draws its row in the same frame as them.

  • Hardening:

    • the Recently Closed list holds only what the calling window may reopen (chrome fix check B, F2);
    • main shows or places no tab that an unfinished import hasn't shown (D66 (1), N2). This comes with a test of the restore's undo and redo (N1), and IM-14's crash note (N3);
    • ⌘W on a busy page that may warn shows the next tab at once (D77 (4)). The page comes back only if it warns;
    • pages fix check 2's follow-ups 1–3: the wording, D77 (4)'s limit while DevTools are attached, and the dead code.
  • Built:

    • yes: TB-05, TB-13, TB-14, TB-15, TB-16, TB-17, PN-05 (Peek already covered it, so tests only), TD-03, FD-07, FD-09, SV-26, SP-02, SP-14, SP-15, SP-16, PR-08, PR-09, NV-10, SB-13 and SB-24.
    • partial:
      • TB-09: there's no drop into another window's sidebar, or into SP-13's overview.
      • KS-05: only ⌘⇧D is left, which is the look lane's.
      • NV-08: only SV-08's link drag onto a page's edge is left.
      • SP-11 and SP-22: their Library parts wait for SP-13.
      • PR-10: there are no passwords or site settings pages to act on yet.
  • Left (D30): SP-13, large-state saves (PERF.md's open item), and the P2s TB-19, TB-21, FV-09, TD-07, FD-11 and SP-25. TD-08 and SP-26 are out of scope (D41).

Decisions where the spec was unclear

  • TB-17, the blank window:
    • It uses a blank Space that stays out of the Space order, in the source window's profile, with a neutral theme.
    • Closing it archives its tabs. It's kept when it is the last window.
    • A Today tab dragged out moves. A pinned tab, a Favorite or a split pane goes as a copy.
    • It has no Spaces, pins, Favorites or folders, and finds only its own tabs.
  • TB-05: the switch happens when ⌃ is let go, which replaces feel's live-switch test.
    • W keeps the list open.
    • Esc, a click outside, another action or losing focus cancels.
    • An unfinished import's tabs are left out (D65).
  • TB-16:
    • A tab using half a core for 30 s (10 s with the battery saver) is frozen through the engine's page lifecycle.
    • Low memory (under 10 %, or under 1 GB) puts tabs idle for 5 min to sleep, even with the timer set to Never.
    • The battery saver (under 20 %) cuts the timer to a quarter, but never below 5 min.
  • ⌘W: only a close that the pages lane takes over selects the next tab early, and never in a split pane. Undo shows the tab again in the windows that showed it.
  • SV-26: it animates only when two or more rows of one list merge or separate. With reduced motion there's no animation.
  • D87, what a page's drag may open in the sidebar (review follow-up 1): an http(s) address only, as the split drop already rules. Other text makes a search on the tab list or in a folder, and nothing on the Favorites. Every other scheme opens nothing.
  • D88, a blank window's new-window links (review follow-up 8): ⇧-click, Open Link in New Window and a page's own request open a new blank window of the same profile, so the page keeps its session.
  • Smaller calls:
    • SP-11: any reorder of the Spaces can be undone.
    • TB-15: the notes show on any Favorite that is playing sound.
    • PR-08: the profile's folder is removed at once, and again at the next launch, and only inside Partitions.
    • F2: closed tabs are filtered by the calling window, with no fallback to the focused one.
    • A blank Space found at launch without its window has its tabs archived, as when a blank window closes.

Edits in other lanes' files

  • Files feel-fix owns since D80 (small, so they may conflict when feel-fix merges):
    • peek/index.ts: the undo key;
    • miniwindow/index.ts: newBlank;
    • split/index.ts: the menu hook;
    • commandbar/: rank, search and sources;
    • SplitRow.tsx and SplitFavoriteTile.tsx: menuAt.
  • The review's fix round:
    • the import lane's import/unplaced.ts, which now holds hiddenByImport, and renderer/import/sidebar.ts;
    • feel-fix's split/index.ts and miniwindow/index.ts: the D66 guard's calls only;
    • nav/new-window.ts (D88), persist.ts, and shared/link-drop.ts, Sidebar.tsx and drag.ts (D87).
  • Fix round 2:
    • feel-fix's split/index.ts: split.focusPane's guard, and Change Icon… focusing the sidebar first;
    • the import lane's renderer/import/sidebar.ts and import-file.spec.ts: where a dropped file's fallback text lands (F4);
    • docs/FEEL.md: FL-22's line.
  • Pages:
    • pages/gestures.ts: a comment only;
    • ARCHITECTURE.md: the wording, and the DevTools limit;
    • pages-gestures.spec.ts: a test for a pop-up window's own opens;
    • pages-support.ts: /opener takes as;
    • a test title in pages-gestures.test.ts;
    • the NV-24 and NV-09 notes.
  • Shared files:
    • main: context, index, material (new), menu, nav, persist and windows, and the shell preload;
    • renderer: the overlay app, the Library app, the profiles section, the shell app, toasts, the split engine and useTabDrop, global.css, the theme and shortcuts;
    • shared: actions, blank, commands, private, rpc, state, theme and toast;
    • docs/FEEL.md.
  • Other lanes' tests:
    • finish-views.spec.ts's three split-row menu tests read the overlay now (1cd4832);
    • feel-rows.spec.ts's budgets are judged on the best of three rounds (e4ff9d7, D46);
    • TB-05's test replaces feel's live-switch test.
  • Other lanes' notes: IM-14, AR-11, SV-26, FL-09 and KS-19. CB-13's note is out of date (it says New Blank Window isn't built). It's feel-fix's row, so feel-fix updates it.

Merge gate (D42, local)

Gate r4 ran on this exact head, dce14c5, on the VPS (Linux, under Xvfb), from 21:47 to 22:32 UTC. The lead ran it with the gate script:

npm run build && npm run typecheck && npm run lint && ./node_modules/.bin/vitest run
xvfb-run -a -s "-screen 0 1440x900x24" ./node_modules/.bin/playwright test --workers 1 --retries 0 --reporter=line
  • Build, typecheck and lint: exit 0.
  • Unit: 112 files, 1085/1085 passed.
  • E2E: 814 passed, 2 skipped, 0 failed. Exit 0, 44.7 min, load 5.0 → 6.5. The 2 skips are nav.spec's macOS-only key tests.
  • Earlier gates:
    • r3, on 24fde53 (fix round 1's head): 812 passed, 2 skipped, 0 failed (45.1 min).
    • r2, on fb3297b (the head the review read): 805 passed, 2 skipped, 0 failed (44.4 min).
    • r1, on dbca55d: 803 passed, 2 failed, 2 skipped.
      • downloads.spec.ts:577 (DL-03) passed when rerun alone. As a new row arrives, the old row is still fading out, and the test's strict locator finds both. The finish-downloads lane fixes that test.
      • import-file.spec.ts:397 was real: the N2 guard refused the test's own step that places a hidden import tab. fb3297b turns the guard off for that step through its test hook, as import-unplaced.spec.ts already does.
  • D18: each fix fails a named test without it. The lane report and both fix rounds' reports list each one. The fix check also cut all of round 1's fixes at once, and all 13 of the matching tests failed.
  • Unverified (not run here):
    • the window's material on macOS and Windows (tested on Linux with a stand-in);
    • the macOS haptic tick;
    • a page really freezing: pages don't freeze under Playwright, so TB-16's freezing is tested through hooks;
    • nav.spec's two macOS-only key tests.

Review

  • Review: REQUEST CHANGES, 5 must-fix (an independent reviewer, reviews/lane-finish-tabs.md), each reproduced:

    1. split.create, split.addTab, split.openUrl and mini.fromTab still showed a tab an unfinished import hadn't shown (D66 (1)).
    2. An open Peek's page could be frozen and put to sleep (TB-16). Main then threw on every Peek layout.
    3. A row menu closed by Enter, a click or a bound key gave the keyboard to the page, even when it was opened from the sidebar (KS-19).
    4. A page could read the address of a row dragged across it, with no drop (TB-09).
    5. No test failed without 3a's filter in the tabs.recentlyClosed command (D18).
  • Fix round 1 (860426c, 24fde53; reviews/lane-finish-tabs-fix1-report.md) fixes all five. Each fix has a test that failed with it taken out. It also takes these follow-ups:

    • D87's sidebar drops and D88's blank-window links (above);
    • FL-26's test budget is now the spec's one frame, and FD-07's check takes the best of three (D46);
    • FEEL.md's FL-22 entry drops the two exceptions SB-13 and SP-16 ended;
    • a blank Space found without its window at launch has its tabs archived.
  • Routed to other lanes:

    • the Peek layout's own guard for a page that has gone goes to feel-fix (its item 9, pushed), which rewrote that code;
    • the blank window's command bar goes to finish-downloads (item 12), with its private-window filter;
    • CB-13's note goes to feel-fix.
  • A side effect of must-fix 2: an open Peek's page counts as on screen, so the media tray doesn't list it while the Peek shows.

  • Fix check: APPROVE WITH FIXES, 1 must-fix (reviews/lane-finish-tabs-fixcheck.md). All five must-fixes held, and each round-1 test failed with its fix cut.

    • The must-fix [reproduced]: split.focusPane still showed a tab an unfinished import hadn't shown (D66 (1)). Every other command in its sweep of src/main refuses one.
    • Follow-ups:
      • F1: a split row's Change Icon…, chosen from a menu opened while the page had the keyboard, left the keyboard in the page.
      • F2: FEEL.md's FL-22 line left out one of its two exceptions.
      • F3: a playing Peek replaced by another overlay makes the media code ask for the floating player. It's harmless as the Peek's page is gone first. It goes to feel-fix, which owns src/main/media/.
      • F4: a dropped bookmarks file that can't be read fell back to its drag's text as if dropped on the tab list, wherever it landed.
      • F5, a nit: a page reads a row drag's effectAllowed as none. Left as is.
  • Fix round 2 (dce14c5; reviews/lane-finish-tabs-fix2-report.md):

    • split.focusPane accepts only a pane of a split, and N2's test now sends it a hidden tab;
    • F1: Change Icon… on a split row gives the sidebar the keyboard first, as Rename… does;
    • F2: FEEL.md's FL-22 line names both exceptions, as FL-22's note does;
    • F4: a dropped file's fallback text is judged by where it lands, so on the Favorites, text that isn't an address opens nothing (D87 (3)).

    Each code fix's test failed with its fix taken out.

  • Fix check 2: APPROVE, no must-fix (reviews/lane-finish-tabs-fixcheck2.md).

    • The must-fix, F1, F2 and F4 hold. split.focusPane refuses a hidden import tab, and any tab outside a split; every sender passes a pane, and Focus Pane and the pane drop still work.
    • Cutting the three code fixes at once failed all five matching tests. The four regression specs passed (109 tests).
    • Its one follow-up is wording: FL-22's note says only a toast with a button waits while hovered, which holds only at the sidebar's foot. It goes to the look lane's one toast system (AP-14).

🤖 Generated with Claude Code


Note

Medium Risk
Wide changes to tab lifecycle, persistence, command bar, and import visibility affect core browsing flows, though the lane reports extensive unit/e2e coverage rather than security-critical paths.

Overview
This PR marks a large batch of finish-tabs work: the generated FEATURES.md checklist moves many P0/P1 items from partial to built, with matching behavior notes across sidebar, tabs, Spaces, profiles, and import.

Tabs and chrome: Sidebar rows get Orbit-themed overlay context menus (with keymap hints and keyboard handling). Blank windows use a profile-scoped hidden Space (not in the switcher), ⌃⌘N / command-bar entry, cascade + command bar on open, and archive-on-close persistence rules. The ⌃Tab recent-tab switcher shows a themed overlay list and switches on ⌃ release. Tab sleep adds engine page freezing for busy background tabs, plus low-memory and battery-saver paths. Drag-and-drop extends to split creation, dropping URLs into link-capable fields, and opening http(s) links dragged onto the sidebar.

Spaces, profiles, and polish: Neutral theme can show macOS vibrancy / Windows Mica via new windowMaterial(). Theme picker edits support ⌘Z undo; toasts are Space-tinted and, when the sidebar is hidden, appear over the page card with optional Show actions (new tabs, new Spaces). Profile delete clears session data and removes partition folders (with a relaunch cleanup list). Space reorder is undoable; command bar gains “Open <folder>” matching and blank-window tab/Space filtering.

Guards and docs: Unfinished import tabs are hidden from activation paths via hiddenByImport. Small updates to page gesture rules (website-first shortcuts count as gestures; ⌘W busy-close behavior documented). docs/ARCHITECTURE.md and docs/FEEL.md reflect switcher and toast motion measurements.

Reviewed by Cursor Bugbot for commit dce14c5. Bugbot is set up for automated code reviews on this repo. Configure here.

siyabendoezdemir and others added 27 commits October 11, 2026 10:45
…s colours (TB-14)

The tab, pinned, Favorite, folder, multi-selection and split row menus are
Orbit's own now, drawn in the overlay that SP-16 tints. Main builds the items
as before and keeps what they do; the overlay draws them and sends back the
item chosen.

- Keys: arrows round the ends, Home/End, type-ahead, submenus with the
  arrows or hover, Enter or Space chooses, Esc closes a level then the menu,
  and a click outside closes it.
- KS-18: each item shows its key from the live keymap.
- KS-19: the menu takes the keys first; a key bound to an Orbit action only
  closes it (Cmd+W closes the menu, not the tab).
- KS-16: the keyboard then goes back where it was. Rename for a tab or a split
  hands the sidebar the keyboard.
- FL-21: a keyboard-opened menu sits under the row's slot, and the row stays
  drawn while its menu is open.
- PK-13: while a Peek is open the row menu stays the system's, so the Peek
  stays open.
- Tests use a new hook, rowMenu/chooseRowMenu, in place of lastMenu/clickMenu.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ow; Space-tinted toasts; Cmd+Z after the theme picker

SB-13, SP-02, SP-16, NV-08, NV-03, FL-22:
- While the sidebar is hidden, toasts go to a small view of their own over the bottom centre of
  the page card (or the pane in use in a split, following focus), sized to the stack. With the
  sidebar shown they stay at its foot.
- New Space while hidden says so with Show (shows the sidebar). Tabs opened in the background
  (Cmd/middle-click, Open Link in New Tab, Cmd-click Back/Forward/Reload) toast with Show (goes to
  the tab). A toast with a button is clickable as a whole.
- Toasts take the Space's surface, text and accent colours, in the sidebar and over the page.

SP-14, TB-18: Cmd+Z after the theme picker closes puts back the theme (and light/dark, if changed
there) as it was when it opened; Cmd+Shift+Z re-applies; from the sidebar or a page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hive periods apply at once

SB-24, SP-15: over macOS vibrancy or Windows 11 22H2+ Mica the window is
see-through and the neutral theme's frame lets the material through under a
light veil; coloured themes stay solid, and a blend is partly see-through.
Linux and older Windows have no material in Electron and keep the solid grey.
Test runs may name a material (ORBIT_E2E + ORBIT_MATERIAL) to check the rest.

TD-03: a change to a profile's archive period (or the default one) archives
the Today tabs it now covers at once, not at the next minute's pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
KS-05, TB-18: "Undo Sidebar Change" (Cmd+Z, Ctrl+Z) and a new "Redo Sidebar
Change" (Cmd+Shift+Z, Ctrl+Shift+Z) carry their keys in the keymap, so
Settings > Shortcuts can change them. Their keys are still handled where they
are pressed (the sidebar, a page, the Library, the Space-delete note, Peek's
reopen), each reading the live keymap: a key that edits text stays a text
field's own undo inside one (KS-16); any other key acts everywhere. The key
router and the UI fallback leave them alone, so nothing runs twice. Notes that
say how to undo name the key as it is now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…y land (TB-09, NV-08)

TB-09: a sidebar row dragged over the page drops its URL where the page
takes links (a text field or editable area in sight, in any pane) instead
of making a split. The pages are asked once at lift, as drawn before the
split preview makes room, so the zone is decided at each move without a
question to the page (FL-18 holds); a page that doesn't answer in 150 ms
gets the split preview. The page gets dragenter/over/leave/drop with the
link and may take it itself; otherwise it is typed into the field, which
gets the keyboard, and its pane becomes the focused one.

NV-08: a link or text dragged from a page onto the sidebar opens as a tab
where it is dropped, as a row dragged there would (TB-02): rows make room,
a closed folder takes it in, Favorites open a place, a Space icon takes it
there. The new row lands whole in the room it opened, in the same render.
The older sidebar drop tests now drop at the top of Today.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
New Blank Window (the command bar; ⌃⌘N and the File menu on macOS) opens
a window with a sidebar of its own that starts empty, cascaded, with the
command bar open; a Today tab dragged out of the sidebar moves into one
(⌘Z puts it back), a pinned tab, Favorite or split pane goes as a copy.

- A blank window shows a Space of its own (`blank: true`), kept out of
  the Space order, in the profile of the window it came from. No other
  window lists, shows or finds its tabs, and it finds only its own.
- It has no Spaces, pinned tabs, Favorites or folders: their actions do
  nothing there and its row menus leave them out.
- Open at quit, it comes back after a relaunch (TB-22 keeps it when it is
  the last window); closed, its Space goes and its tabs go to the Archive.
- A profile a blank window uses can't be deleted until it closes.
- Redo of a drag-out whose blank window has since closed puts the tab in
  the first Space, not a Space that's gone.

Tests: sturdier new-window waits in tabs-review (the TB-17 flake), and
the FL-21 300-tab test waits out the reveal's 450 ms settle, which pulled
the list back under the drag (feel lane's test).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…(D46)

FL-04's sweep, FL-06's new row, FL-07's ⌘D/⌘Z travel, FL-09's close of the second row and
FL-10's drag measured once against a time, so one slow frame on a loaded machine failed them
(FL-09's gap closed in 263 ms at load 13.7). Each now measures up to three rounds that undo what
they did (reopen, close, ⌘Z, Escape) and judges its budgets on the best one. What must hold every
time still holds on every round: the next row selected before the closed one leaves, the new row
selected in its first frame, hover never moving a row, the row never gone or drawn twice, gaps
without flicker.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts:
- src/main/split/index.ts: both. Main's split.addMenu, and the split row's menu keeps
  finish-tabs' `at` (TB-14's overlay menu) beside main's Change Icon… item.
- src/main/commandbar/search.ts: both. A Mini Window's bar offers no tabs, archive, Spaces,
  folders or actions (CB-23), and a blank window finds only its own tabs and no Spaces or
  folders (TB-17).
- docs/feature-status.json: TB-14 finish-tabs' (yes), TB-15 main's (screen-share indicator).
- FEATURES.md: regenerated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ow menus open (TB-14)

The split row's right-click menu opens in Orbit's overlay since TB-14, so
the test that muted one pane from it waited for a native popup that never
came ("Received: []" at media.spec.ts:1638). It now reads and chooses the
overlay's row menu through the tabs hooks, as the other row-menu tests do.
The menu and the per-pane mute are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…et go (TB-05, FL-26)

Holding ⌃, Tab shows the five most recently used tabs of the window's
sidebar in the middle of the window, in the Space's colours, over a page
that is not dimmed: the tab shown first, the second highlighted. Each has
its favicon or emoji, its title, its camera/microphone or screen-share
indicator and its sound state (MD-11). Tab moves on, ⇧Tab and ⌃` move back,
W closes the highlighted tab, and letting go of ⌃ switches to it. A quick
tap goes straight to the previous tab and draws nothing. Esc, a click
beside the list, any other action or the window losing focus ends it with
no switch; a click on a tab switches to it.

FL-26: the list is drawn in a frame at the second Tab, or after a 150 ms
hold, and fades in over 90 ms with no slide. The page changes only on the
release; main then shows the page and hides the overlay's layer in the
same task.

- The engine drops a view's key-ups after Orbit takes a key from it, until
  another key goes down there, so the release of ⌃ never came from the
  page. The panel now opens, undrawn, at the first Tab and has the
  keyboard; main runs the switcher's keys there without taking them, and
  the overlay takes them so they act once. Esc is handled in main, in step
  with the release.
- The list is this window's sidebar tabs that it may show: a private or
  blank window's own, never a tab an unfinished import keeps out of sight
  (D65).
- Activation moves from each Tab to the release: the keys lane's KS-06
  tests follow the spec's release, and finish-tabs' FL-26 test replaces
  the feel lane's live-switch one in feel-rows. A page's ⌃ key-up no
  longer settles from the sidebar; main settles it.
- tabs-more's ⌃Tab test now sends its keys to whatever has the keyboard,
  as the keyboard does (keys sent over CDP never reach main).

docs/FEEL.md has FL-26's numbers. TB-05 and SP-16 are marked yes; the
MD-11 and KS-06 notes lose their "no switcher list" parts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r>" in the command bar (FD-09); TB-13 and PR-09 checked

- SP-11: any change of the Space order alone is recorded as "Reorder Spaces" on the sidebar's undo
  stack (src/main/spaces/order-undo.ts), so ⌘Z puts the Spaces back and ⌘⇧Z reorders them again;
  the Space on screen stays. A Space added since keeps its place after them; one deleted is left out.
  Without it: unit space-order-undo :36 and :52 fail. SP-11 stays partial: the Library overview's
  reorder is SP-13's.
- FD-09: the command bar finds a folder by "Open" and its name as well as by its name alone
  (commandbar/rank.ts). Without it: unit commandbar :742 fails.
- TB-13: an e2e test for the selection's menu (pin, unpin, move to a Space, a new pinned folder,
  a split of two to four). PR-09: an e2e test for renaming in Settings (Default too) showing at once
  in the Space menu, the badge and the switcher's tooltip. Both pass as built.
- Statuses: TB-13, FD-09 and PR-09 yes; SP-11 partial with ⌘Z. FEATURES.md regenerated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts:
- src/main/tabs/runtime.ts: both. Main's letGo hook (NV-24), and finish-tabs' recentSwitch with
  cancel and the onControlUp comment (TB-05).
- src/shared/rpc.ts: both. finish-tabs' toasts view (SB-13, SP-02) and main's dialog, screen,
  print and swipe views.
- tests/e2e/keys.spec.ts: both imports (FOCUS_IS_EDITABLE, switcherOf).
- tests/unit/keymap-defaults.test.ts: the comment drops both built features (blank window; save
  page and full screen keys).
- docs/feature-status.json: per key, the side that changed it; KS-19 is main's (yes, with full
  screen and the print dialog) plus finish-tabs' row menus (TB-14).
- FEATURES.md: regenerated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…profile's folder goes (PR-08); pages fix check 2 follow-ups

- TB-15: a Favorite playing sound shows two small notes rising over its tile in turn; muted, the
  still dot; reduced motion, still notes. Without the reduced rule: feel-reduced :410 fails.
- PR-08: deleting a profile removes its partition folder (session.storagePath, only ever a folder
  right inside userData/Partitions) at once, and again at the next launch, since its session may
  write there until Orbit quits (src/main/spaces/erase.ts, orbit-erase.json). The confirmation
  names logins too. Without the removal at delete: finish-tabs PR-08 :1794 and unit
  profile-erase :21 fail; without the one at launch: finish-tabs :1800 fails.
- Pages follow-ups (fix check 2):
  1. isActivation and NON_ACTIVATING_KEYS removed from tabs/runtime.ts: nothing calls them.
  2. A pop-up window's own opens read its gestures from pages/gestures.ts, as a tab's do, so a
     click in a frame from another site there can open a tab. Without it: pages-gestures :217
     fails. The /opener fixture takes the window's name (`as`), since a frame naming the pop-up's
     own `popup` loads the page in the pop-up.
  3. Wording: a shortcut that goes to the page first counts as a gesture; one Orbit takes first
     doesn't (⌘W unless set to go to websites first): gestures.ts, ARCHITECTURE.md, the unit
     test's title and NV-24's note.
  4. NV-24's note and ARCHITECTURE.md: ⌘W's 1 s limit on a busy page holds only while no DevTools
     client is attached.
- Statuses: TB-15 and PR-08 yes; NV-09's note names the pop-up window's own opens.
  FEATURES.md regenerated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… open versions cross-fading (FD-07)

Without an icon of its own, a folder shows a folder glyph filled in the Space's accent, its front a
lighter tone. Closed, the front covers it; open, the front tips forward. The two fronts cross-fade
as the folder opens or closes (FL-12, --motion-quick), a fade that reduced motion keeps.

FEEL.md gets the FL-12 row for the icon (three runs).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Data and capture scripts only. docs/feature-status.json merged per feature: no feature changed on
both sides; the 74 "feel": true marks are kept. FEATURES.md regenerated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he battery saver make tabs sleep sooner (TB-16)

- A tab in the background whose process keeps half a core busy for 30 s is frozen with the
  engine's page freezing (Page.setWebLifecycleState) and carries on when shown or navigating.
  Never one on screen, playing or recording, or a page that would warn before it goes, nor any tab
  sharing a process with one of those or with a page that isn't a tab.
- Under 10 % of memory available (1 GB at most), tabs idle 5 minutes in the background sleep at
  once, whatever the timer.
- Below 20 % on battery power, as the window's page reads it, the battery saver: a toast says so,
  tabs sleep after a quarter of the timer (5 minutes at least) and CPU-heavy ones freeze after
  10 s. It lifts above 20 % or on charge.
- Measured: a sleeping tab costs 1.0 MB over all processes, its sidebar row included.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…command bar (SP-22)

Next Space and Previous Space are found by those names too. SP-22's note now says what the bar
offers; Manage Spaces / View Spaces wait for the Spaces overview (SP-13), so it stays partial.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…w may reopen (chrome fix check B, F2)

`tabs.recentlyClosed` returned every closed tab, private windows' too; its one
caller (the archive's menus) filtered them itself. The list now goes through
Reopen Closed Tab's own rule (`mayReopenIn`) for the calling window, so the next
caller can't forget. Called with no window (the macOS app menu, made for every
window), it holds what a normal window may reopen.

Without the filter, unit tabs-recently-closed :31 and :48 fail.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the frame they show (AR-11, sign-off 2)

Restore Data put a folder and its tabs back in one store update, but the
sidebar drew the tabs at once (the folder's list mounts with it, without
an enter animation) while the folder's own row grew in from nothing: for
several frames the tabs showed in the pinned section with no folder above
them, then shifted down under it. A folder that arrives open with its tabs
(Restore Data, an undo, a new folder made from tabs) now draws its row
whole from its first frame. An empty new folder still grows in.

Test: finish-tabs.spec.ts "[AR-11][FD-01] a folder that comes back..."
samples every pinned row in each frame. Without the fix it fails: 10 tab
rows drawn without their folder row (frames 3-7, the folder row 1-19 px
high at opacity 0).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…own (D66 (1)); restore undo/redo test (N1); IM-14 crash note (N3)

Import fix check 3's follow-ups, given to this lane by D66.

N2 / D66 (1): a tab an unfinished import made out of sight, that no section
holds, isn't there for a window. `ops.hiddenByImport` says which; switching to
it (`ops.activate`), a split view by either side (`ops.splitWith`), its own
window (`ops.toNewWindow`), a copy (`tabs.duplicate`), its row menu
(`tabs.contextMenu`), a close or delete to the Archive and a selection
(`tabs.close`, `tabs.delete`, `tabs.setSelection`) refuse it. Moves, pins and
Favorites already went nowhere for a tab no section holds. One the user placed
anyway stays theirs (D65 (2)): its test turns the guard off with a test hook,
standing for a route main doesn't guard.

N1: import-unplaced's restore test also undoes and redoes the restore, each
while an import adds: each stops the import, none of its pages go to the
Archive and none of its tabs are left.

N3: IM-14's note says a hidden tab the user placed survives a crash, as D65 (2)
allows; it also names D66 (1).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… (D77 (4))

A close the pages lane hands to the engine first (a page with a user gesture
and a leave listener) waited for the engine's answer, up to its 1 s limit on a
busy page, before the next tab showed. The window now shows the next tab as
the close starts (FL-09) and the page is hidden; a page that warns shows again
to ask (the pages lane's reveal), and Cancel keeps it there. ⌘Z after the
close still shows the tab where it showed (AR-09). A split pane keeps its
split on screen, so it is left as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t Peek

Each bullet is met by Peek (PK-01 to PK-04, PK-07 to PK-09, PK-12). New tests
name PN-05: the decision for pinned tabs and Favorites with each setting,
Shift-click under its own setting included, and a Favorite end to end (same
site stays, another site previews, ⌘O makes a Today tab, previews off opens a
Today tab, Shift-click still previews).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ight profile

Each bullet in the base has a test: import into a chosen profile and several
profiles at once (IM-06), the Library per profile (AR-03, AR-10, DL-10), and
two new ones: Settings opened from a Work Space clears the Work profile's data
(from another Space, Default's), and picture-in-picture Back to tab returns to
a tab in another profile's Space. Passwords and site settings pages don't
exist yet (ST-13, ST-20), so PR-10 stays partial.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rlay (TB-14)

Since TB-14 the split row's and the split Favorite tile's right-click menus
are Orbit's own, in the overlay, so the three finish-views tests that
recorded the system menu saw none ("received []"). They now read and choose
the row menu with the tabs hook (menuFor, chooseRowMenu), as the other specs
do since TB-14, and close it after finding an item that can't be chosen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t, with the reorder spring (SV-26)

When two rows or more of one list become a split row there, the split row is
drawn whole where the lowest of them was, that row goes at once, and the ones
above fade as their room closes up into it with the reorder spring (TB-08).
On separate, the first pane's row is drawn in the split row's place and the
others slide out from under it with the same spring. A single row joining a
pane still pending, and reduced motion, keep the motion they had.

SV-26 is built: the haptic tick on macOS is left as a platform limit
(Electron has no haptic API).

Without it: the split row is 20 px of 32 in its first frame after the merge
(finish-tabs.spec.ts:2205), and the first row 25 px on separate (:2229).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ff (N2)

Since N2, main refuses to put a tab an unfinished import hasn't shown in a
split view (D66 (1)), so import-file's quit test, which places one to check
that the quit takes it back too (D65 (2)), got no split (gate r1:
import-file.spec.ts:451, received []). It now turns the guard off for that
step through the tabs test hook, as import-unplaced's D65 (2) test does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@cursor

cursor Bot commented Oct 11, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: 9f34dd0d-419a-4543-b7e4-9231a1e7e2d4)

siyabendoezdemir and others added 2 commits October 11, 2026 19:42
feature-status.json keeps this lane's built and note fields and takes
all 41 of PR #29's "feel" marks; FEATURES.md is regenerated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- D66 (1): split.create, split.addTab, split.openUrl (and its target) and
  mini.fromTab refuse a tab the import hasn't shown; one guard,
  hiddenByImport in import/unplaced.ts, serves them and TabOps.
- TB-16: an open Peek's page counts as displayed, so it is never frozen
  or put to sleep.
- TB-14/KS-19: a row menu gives the keyboard back from close() itself,
  before the chosen item runs, however the menu closes.
- TB-09: a row passing over a page lists the link's types with empty
  values in dragenter/dragover; only the drop carries the address.
- D87: one check (sidebarDropUrl) for every sidebar drop: a web address
  only; other text a search on the list or in a folder, nothing on the
  Favorites; any other scheme nothing.
- TB-17: a blank Space whose window is missing at load goes, and its
  tabs go to the Archive (F7). D88: a blank window's new-window links
  open a new blank window of its profile.
- Tests: tabs.recentlyClosed from a normal window and from no window;
  FL-26's budgets are the spec's frame; FD-07 takes the best of three.
- FEEL.md: FL-22's two ended exceptions removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… ways together

- TB-16, TB-14, TB-09, TB-02, NV-08, TB-17 and IM-14 notes say what the
  fix round changed (D87, D88, D66 (1)); no feel mark touched.
- The row menu test records where the keyboard went for Enter, a click
  and a bound key, and judges them together, so a check without the fix
  shows all three.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@cursor

cursor Bot commented Oct 11, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: 4d9d343e-485b-4439-beca-2c294252e670)

- split.focusPane takes only a pane of a split, so a tab an unfinished
  import hasn't shown, which is in none, isn't shown by it (D66 (1)).
  N2's test sends it.
- A split row's Change Icon… gives the sidebar the keyboard before the
  picker opens, as Rename… does, though the page had it (TB-14).
- A dropped file that can't be read falls back to its drag's text,
  judged where it lands: on the Favorites, words open nothing (D87 (3)).
- FEEL.md: FL-22's second exception, as its note says: with the sidebar
  shown, toasts still show at its foot.
- Notes: IM-13, IM-14, TB-14.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@cursor

cursor Bot commented Oct 11, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: 377bf970-3a3f-40a9-a562-fdbdca7f0bf4)

@siyabendoezdemir
siyabendoezdemir merged commit 21487aa into main Oct 11, 2026
1 check passed
siyabendoezdemir added a commit that referenced this pull request Oct 11, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
siyabendoezdemir added a commit that referenced this pull request Oct 11, 2026
Conflicts, each keeping both sides:
- src/main/tabs/commands.ts imports: the Tweak menu items and keys, and
  registerBlankWindows / registerLinkDrop.
- src/shared/rpc.ts imports: TweakCommands, TweakEvents and WindowMaterial.
- docs/ARCHITECTURE.md: main's paragraph on scripts in pages (shortcuts that
  count as gestures, DevTools) with this lane's sentence on the Hide picker's
  world 1040 (D89).
- FEATURES.md: regenerated (472 features).
docs/feature-status.json merged without conflict: no row changed on both
sides; 385 keys, no duplicates, 115 feel marks.

The tab's menu is now finish-tabs' row menu in the overlay (TB-14), so the
Tweak tests read and choose it through rowMenu / chooseRowMenu, and check the
key hint the overlay draws beside "Tweak this Site…".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
siyabendoezdemir added a commit that referenced this pull request Oct 11, 2026
Conflicts:
- docs/feature-status.json: SV-26 is built yes (finish-tabs' row merge in
  the sidebar) with this lane's motion text and finish-tabs' row-merge and
  haptic text. FEATURES.md regenerated.
- src/main/split/index.ts: imports hiddenByImport; selectsInPlace now asks
  hiddenByImport (D66 (1)) instead of isUnplacedImportTab, as every other
  split command does.
- src/renderer/src/shell/split/useTabDrop.ts: finish-tabs' follow(drag);
  show(drag, next), with this lane's flushSync around setDrop in show()
  (FL-18); both imports kept.
- src/main/commandbar/search.ts, src/main/context.ts,
  src/renderer/src/overlay/OverlayApp.tsx: imports only; both kept.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant