Repository navigation
spec: Phase 31 — the desktop-app surface - #244
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Planning artifact for Phase 31 (v2.5), the desktop-app surface. No code: docs/specs/PHASE-31-SPEC.md plus the VISION entry.
The thesis: framesmith judges an application screen as if it were a marketing page. Run on its own viewer, version 2.4.0 scored every page's usability 100 with zero findings, though the viewer has a 17px-tall Back link and 21 click targets that are plain spans. The web hit-target rule measures only the four form controls, and imported buttons, links and tabs are plain frames. At the same time, page rules misfired on the app: the sidebar project list was read as a data table, the dense 13/14px type steps failed the scale ratio, and the projects' identity dots counted as competing accents. This phase adds a third canvas type,
desktop-app, for a tool you work in (persistent chrome, panes, dense controls, a current selection), in a browser tab or a native window.Slices
A. The type.
canvas_create({ type: "desktop-app" })gives a 1440×900 window. The type-scale ratio check gets a rule id so the desktop-app ruleset can replace it. Three corrections apply on every type: the WCAG 2.5.8 spacing exception on the 24px target floor, navigation lists that never read as tables, and identity dots that never count as accents. Evaluate and import results shrink so an agent can read them on a large screen.generate_design_systemgives a 14px body plus state, focus-ring and strong-border tokens. The baseline canvases are committed as fixtures.B. Vocabulary. A 24px
buttonwith an accessible name, pluslink,text-input,nav-item,tabs,tree-row,menu-row,property-rowanddivider.C. App rules. Every click target is measured. Hand-built click targets and icon-only actions without a name are reported. Each navigation group has exactly one current item. The type ladder accepts dense steps. Table rows stay consistent, truncation stays honest, and one primary button per region is advised. A canvas must declare its type when it contains app primitives.
D. Layouts. Structure resolution works for any number of types, and six desktop-app layouts ship under the existing pattern gate: workbench, list-detail, editor with inspector, browser, dashboard and settings.
E. Overlays.
tooltip,popover,menu,modal,toastanddrawer. The renderer lifts every overlay into one layer at the root, with a fixed stacking order by kind, so a menu opened from a sticky toolbar is never clipped.F. Overlay rules. One modal at a time, text-only tooltips, no large tables in a modal, and overlays inside the window. Stacked toasts and error toasts are reported as advisories.
G. Element states. Hover, focus, pressed and disabled are a property on each interactive primitive, drawn from state tokens.
H. State checks. Focus rings, active indicators, disabled renders and control borders are checked against the token colors on every interactive primitive, without the agent drawing any state.
I. Acceptance. The viewer's gallery, detail page with inspector, and archive are rebuilt as canvases, with the comment-popover and delete-confirm states. Each must reach CLEAN in both modes and both themes, with every click target a primitive and each of six baseline viewer defects fixed by name.
Decisions I'd like your eyes on
Each is decided with a recommendation in the spec's Clarify section, and each could go the other way:
desktop-app(C1).appis ambiguous because phone screens are apps too, anddesktopreads as a wide web page. The cost is an asymmetry withmobile.xandy, not anchored to their trigger (C5). Anchored rendering needs CSS anchor positioning, which not every browser supports, or a layout pass before rendering. An overlay can still name its trigger, and the rules use that name.The main risks, plainly
buttonwith an explicit height below 24px is measured for the first time. A form control still below 24px after its padded row changes from an error in both modes to a fast-mode warning plus a detailed-mode error. The slice A PR has to list every existing fixture whose verdict moved.canvas_autofixreads the unfolded list.Verification
Three independent verifiers checked the first draft: one for code references, one for fidelity to the research and the baseline, and one that tried to break every pass/fail rule. A second round checked the rewrite. Every blocker and major issue they raised is resolved in the text.