Repository navigation
C11-245: offer a rare tip that teaches the tab rail - #474
Conversation
Deep review — C11-245: offer a rare tip that teaches the tab railThank you for this — it's a genuinely careful piece of work, and the PR writeup does This pass is against the current head SummaryAdds a rare, non-modal popover anchored under an area's tab-count cell that teaches the tab AlignmentSolidly in scope. This is operator-facing teaching for the workspace-as-infrastructure model; Findings1. [blocker — merge gate] The 2. [major] The entire AppKit half — 3. [major — verify on the finding-2 pass] The programmatic-close token can be cleared while 4. [nit] The escape monitor's closure runs on every Done right, noting so it isn't second-guessed. All 16 new strings are RecommendationMerge after fixes — specifically not before the 🌉 Drawbridge deep review (lane 3) — an automated pass; a maintainer has been notified and makes the final call. 🌉 Drawbridge deep review (lane 3) — an automated pass; a maintainer has been notified and makes the final call. |
Clickable HTML for when a tab bar overflows across days: a tip under the count cell, a rail preview, and Try Rail, Show tab list, or Don't show again. Co-Authored-By: Grok 4.7 <noreply@x.ai>
When a tab bar overflows on 4 days inside 14 and Tab Layout is still Tabs, a popover under the count cell offers the tab list and Rail. Try Rail switches every area to Rail and the popover becomes Undo. Undo puts Tabs back and is not a dismissal. Don't show again is the only dismissal. The trigger is a pure policy with logic tests. Overflow and the count-cell anchor come from bonsplit cc72cff (PR 10), pinned here until that commit is on bonsplit main. Co-Authored-By: Grok 4.7 <noreply@x.ai>
c11.tabRailTip.forceOffer skips the 4-day count and the 30-day gap for the next overflowing area, then clears when the tip is shown. Dismissal still blocks it. The skill line also names the three keys that reset the normal rule. Co-Authored-By: Grok 4.7 <noreply@x.ai>
The tip center runs on the main actor. Escape is returned to the window it was aimed at, key is restored once per offer, and an area that stays overflowing past midnight records the new day through the tested sustain rule. Pin bonsplit to the rebased count-cell branch. Co-Authored-By: Grok 4.7 <noreply@x.ai>
bcf51c8 to
08194b1
Compare
vendor/bonsplit is the merge commit of bonsplit#10 on bonsplit main, which also contains bonsplit#9. Co-Authored-By: Grok 4.7 <noreply@x.ai>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
An overflow that starts after today's mark still remembers when it started, so the next day can count. forceOffer, dismissal, and the last offer use KVO, and a programmatic popover close is matched to the show it closed. Co-Authored-By: Grok 4.7 <noreply@x.ai>
KVO never fires for a defaults key that contains dots, so an outside defaults write of forceOffer was ignored. The tip refreshes when the app becomes active instead. Co-Authored-By: Grok 4.7 <noreply@x.ai>
What
A rare, non-modal tip under the count cell when an area's tab bar overflows often. It teaches the tab list the number already opens, and Tab Layout: Rail, with a small preview of the rail.
Try Rail sets Tab Layout to Rail for every area and opens this area's rail. The popover stays up and becomes Undo. Undo puts Tabs back everywhere and is not a dismissal. Don't show again is the only dismissal. Leaving the tip alone waits 30 days.
Bonsplit reports when a strip is scrolling or folded, and the count cell's view, so the tip can anchor there. That hook is bonsplit#10, merged to bonsplit main at
d20db06827eb94c36b3d4c88bb9f89051b0e2ad6. That merge commit contains bonsplit#9 (05e158a) and the count-cell anchor. This PR pins that SHA.Why
Operators who regularly have more tabs than the bar can show never meet the rail. The tip is the introduction. It stays rare, it stays on this Mac, and Undo means trying Rail is not a permanent choice.
How validated
The trigger (overflow-day recording, 4 days inside 14, 30-day spacing, dismissal, Rail hiding the tip without dismissing it, Undo leaving
lastOfferedin place, and a one-shotc11.tabRailTip.forceOfferthat skips those waits) is a pure model with an injected calendar and defaults store.TabRailTipPolicyTestsinc11LogicTestsexercises those paths. Day keys use a Gregorian calendar in the current time zone.The app records a sustained overflow through
recordSustainedOverflow, with one 2 second timer per area. An area that is still overflowing when the day changes is recorded, including one that started after today's mark. Adefaults writeofforceOfferis read at the next tab change, window switch, or app switch.No local
xcodebuildand no app launch. CI is the compile gate and runs the logic tests.scripts/sync-installed-skills.sh c11was not run. The skill source has the new sentence. The installed copy in~/.claude/skills/c11/stays stale until that script is run.Visual check
To raise the tip without waiting 4 overflow days, write
c11.tabRailTip.forceOffer. The write takes effect at the next tab change, window switch, or app switch. The next overflowing area offers the tip once, then that flag clears itself. Tab Layout must still be Tabs. Don't show again still blocks it.Reset the recorded days, the last offer, and a dismissal:
The same keys apply on
com.stage11.c11and on a tagged dev domaincom.stage11.c11.debug.<tag>(dashes as dots).New localization keys
English source is
String(localized:defaultValue:). Translations for these keys are inResources/Localizable.xcstrings.tabRailTip.titletabRailTip.bodytabRailTip.bodyAfterListtabRailTip.previewLabeltabRailTip.tryRailtabRailTip.showListtabRailTip.dismisstabRailTip.undoTitletabRailTip.undoBodytabRailTip.undotabRailTip.tabOrdinal(token%lld)tabRailTip.status.workingtabRailTip.status.waitingtabRailTip.status.flaggedtabRailTip.status.idletabRailTip.status.coldCloses C11-245
🤖 Generated with Grok Build