Competitive teardown · internal
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.
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.
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.
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.
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.
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.
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.
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 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.
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.
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.
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.
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.
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.
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.
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.