Competitive teardown · internal

Sky: what applies to us

A UI and UX read of Sky, the Mac assistant from the Workflow and Shortcuts team, against our two-object architecture and the seam problem. Four things to take, two to avoid, one uncomfortable finding.

Source
MacStories preview, 28 May 2025
Product status
Never shipped publicly
Company
Acquired by OpenAI, 23 Oct 2025
Verdict
Prior art, not a competitor

Ledger

TakeCollapse a completed set into one line, with countsimg 10
TakeGhost preview in place, not a text diffimg 14, 15
TakeAmend in place as the third verb, and the home for parkimg 15
TakeProvenance as links back to sourceimg 13
AvoidChips labelled by verb, with the object hiddenimg 09, 12
AvoidSerializing dispositions that are not orderedimg 09, 12
RejectWallpaper-sampled chrome and low-contrast glassimg 02, 03
NoteProse held an open loop with no structure at allimg 10
NoteSky's only terminal action is New Chatimg 13
Take

Collapse a completed set into one line, and keep the counts

Before execution, Sky shows a strip of six pending operation chips. After execution, that strip has collapsed into a single chip reading Create Folder ×2, Move File ×6 with a checkmark.

Sky showing six pending action chips, only the first inspectable
img 09 Six pending chips. Only the focused one shows its parameters.
The same six chips collapsed into one chip reading Create Folder times 2, Move File times 6 with a checkmark
img 10 After execution: six operations, one line, counts preserved.

This is a derivation being compressed into a decision-state line, executed as an animation, and it reads as progress rather than as loss. It is the closest shipped thing to our seam event.

A settled line reading “4 considered, 1 struck” carries the fact that a derivation exists without showing any of it.

The design brief asks for a page that visibly shrinks. This is the mechanic that makes shrinking feel earned instead of feeling like the model quietly dropped things. Take the counts.

Where we must differ

Sky's collapsed chip is not re-expandable in any state shown. Ours is the pointer back into the substrate. That is the whole difference between a summary and a transclusion.

Take

Show the proposal in place as a ghost, not as a tracked change

Sky's Add Event card: editable form on the left, live calendar day view on the right with the proposed event drawn hatched among real events
img 15 Editable form left, live day view right, proposal drawn hatched among the user's real events.

The proposal is not described and not diffed. It is rendered in the destination's own visual language, in situ, marked provisional by hatching, sitting alongside what is already there.

Our spec says model replies land as tracked changes. Tracked changes answer what did the model alter. The ghost answers what will the page be if I accept. On a decision page the second question is the one the reader actually has, and the ghost is cheaper to render than insert and strike markup.

Confidence: high. The one case for keeping a diff is a user returning after a week who wants to see what moved; that is a history view, not the default.

Take

Amend in place is the missing verb, and probably where park lives

Every field in that card is directly editable: location, all-day, start, end, calendar, notes. Sky's verb set is accept, amend in place, reject. Three, not two.

Our verb set is do nothing, or tap once. Amend in place is the missing middle, and it gives park a definition it has been lacking. A parked node is not one the user deferred. It is one they started editing and could not finish. Park then has a natural exit condition: it resolves when the edit resolves. It stops being a bucket, which means it stops being a graveyard.

Take

Provenance as links, at almost no cost

Sky listing calendar events, each rendered as an underlined deep link back into the Calendar app
img 13 Every returned item links back to the object it came from. Note the bottom chrome.

Sky never presents retrieved data as an opaque assertion. One line of UI, and it is the same mechanic as our transclusion pointer: a settled line linking to the turn that produced it. That link is the difference between “the model says” and “here is where this came from”, and we get it nearly free from the substrate we are already keeping.

Avoid

Never label a set of proposals by their verb

Four identical chips reading Trash File, only the first showing which file path it will delete
img 12 Four irreversible deletions. The object of each is hidden until focus.

The chip carries the verb; the parameter appears only on focus. The reader cannot see the set of proposed operations at a glance, only one of them.

If we render Adopt / Adopt / Adopt we have rebuilt this. Label the node, colour the disposition.

The second half of the same mistake

The strip is a queue, not a set: confirm one, the next lights up. Sky's operations genuinely are ordered, since a folder must exist before files move into it. Our dispositions are not ordered with respect to each other. Inheriting the queue would invent a dependency that is not there and turn a handful of cheap taps into a sequence of blocking modals.

Reject

The chrome is beautiful and unreadable

Sky's floating chrome sampled against a green wallpaper, with labels barely legible
img 03 The same chrome against a green desktop. Labels fail contrast here and in the pink variant.

The panel tints itself from the desktop wallpaper. It is a defensible choice for an ambient accessory that sits on screen all day and should recede. It is the wrong choice for a page someone reads closely for twenty minutes while deciding whether to have a second child. Our light, high-contrast, high-air direction is correct, and this is the counterexample that shows why.

One thing worth keeping

Cards separate by shifting position within the gradient rather than by borders or rules. Depth without lines. Three tonal bands might do the work that Settled, Open and Set aside currently do with headed sections, on a page that has sixteen lines to spend.

Counter-evidence

Prose held an open loop, with no structure at all

Sky finishes the job, then states what it could not resolve: two image files whose purpose is not clear from their filenames, and would the user like those organised once he says what they are for. The next card is him typing they're wallpapers, and Sky acting immediately.

img 10 detail Collapsed chip, then the outcome, then a closing condition in the final sentence. No structure anywhere in it.

That is a closing condition, stated in prose, carried across a turn, and discharged. It worked.

This is the strongest available attack on the product and we should have the answer written down before someone else says it. For tasks where the residual ambiguity is small and enumerable, prose plus a follow-up question is sufficient and structure is pure overhead.

Our defence is that a life decision carries eight to fifteen simultaneous open loops rather than one, and that prose cannot hold them across a week of returning to the page. I think that defence is correct. It is still a defence, and the burden is ours.

Positioning

Sky's only terminal action is New Chat

The whole persistent chrome, everything the app offers you at all times: orb, name, Attach, Settings, New Chat. There is no send button, because Return sends. And there is no completed session anywhere in the app, only one you abandon and replace.

img 13 detail Sky's entire persistent chrome. The rightmost control is the only way a session ends.

Terminal verb in Sky: New Chat. Terminal verb here: Conclude. Our whole counter-position, visible in a screenshot.

Internal only. This does not go on the site. We cannot put a competitor's chrome on a marketing page, and the claims inventory does not license comparative claims in any case.

Related, from the settings pane

Sky exposes Show confirmation before using tool as a per-tool checkbox. Authorization is a preference, not a policy. The analogous move for us is a toggle for auto-conclude. We should not ship it: it is the one mechanism the product is, and making it optional converts a stance into a setting.

What this changes

  1. Replace the tracked-change idiom with ghost-in-place on the decision page. Spec change. The diff becomes a history view, not the default rendering.
  2. Add amend-in-place as a third disposition, and redefine park as an unfinished edit. Gives park the exit condition it has been missing.
  3. Chips label the node, never the disposition. Colour carries adopt, park, strike. No set of proposals may share a label.
  4. Dispositions resolve in parallel. No confirmation queue, no forced ordering between independent nodes.
  5. Settled lines carry counts and a link to the originating turn. Counts as evidence of the derivation, link as the transclusion pointer.
  6. Verify prompt construction feeds the derivation subtree, not the rendered page. If we render the page and then re-read our own rendering, struck content is absent from context and the collision surface cannot work. Grep the loop.
  7. Resolve the two-pane layout against the one-viewport constraint. These currently contradict each other. Node-local drill-down is the likelier answer than a permanent second pane.
  8. Write the “why not just prose” defence into the README. Before a user test finds it for us.
  9. No auto-conclude toggle. Standing decision, recorded here so it does not get reopened as a convenience feature.