Skip to content

user-interface: offer to install and onboard a better design tool #6449

Description

@kyle-sexton

Problem

/user-interface:design routes each concern to the best installed tool. When none is installed it answers from its own guidance and may only name a free tool (plugins/user-interface/skills/design/SKILL.md, "Combine routes and settle conflicts"). The deferred routes added in #6429 (Google Stitch MCP, Pencil, Subframe, Paper, Brilliant) need an install and a sign-in, so as things stand a user never reaches them.

Proposed

When a higher-ranked route for the concern is not installed, the skill offers it: the install command for this platform, at local scope, and the sign-in or key step its account needs. It installs only after the user says yes, and otherwise continues with the best present route.

Open questions, settled by the owner on 2026-10-12 (recorded 2026-10-13):

  • Where the install command and sign-in step live → the row's existing pointer (vendor setup page); no restated command in the skill body.
  • Whether the offer covers paid rows → only when no free row covers the concern (already the rule at SKILL.md:81-83).
  • How a row moves from deferred to confirmed → after a recorded end-to-end onboarding test, with as_of updated.

Acceptance

  • The offer appears only for an uninstalled, higher-ranked, non-deferred row, and never installs without the user's yes. plugins/user-interface/skills/design/SKILL.md offers a route only when its row is uninstalled, higher-ranked and non-deferred, and a paid row only when no free row covers the concern; the install and sign-in step comes from the row's pointer; on decline the skill continues with the best present route. Check: the PR's CI runs the skill-quality check on the changed SKILL.md and it passes.
  • Evals cover offer, decline and accept: three cases in plugins/user-interface/skills/design/evals/evals.json, using a fixture routing row marked confirmed (every installable account-bound row on main is deferred). The cases are written, not run. Check: plugins/skill-quality/scripts/check-evals-quality.sh passes.
  • A .changes/user-interface/ fragment exists. Check: scripts/new-changelog-fragment.sh, and the PR's CI runs scripts/check-changelog-fragments.sh --check and it passes.
  • The lane does not fetch vendor setup pages: they are off its host list.

Split to #8987: at least one account-bound route onboarded end to end and marked confirmed, and the three evals run (paid).

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 5, 2026
  2. github-actions commented on Oct 5, 2026

    @github-actions
    Contributor

    Thanks for the report. Automated triage handed this issue to a maintainer.

    Automated triage. A maintainer reviews it.

  3. added
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    on Oct 5, 2026
  4. removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 12, 2026
  5. kyle-sexton commented on Oct 13, 2026

    @kyle-sexton
    MemberAuthor

    Decision recorded. The owner approved applying independently verified recommendations on 2026-10-12.

    • Where do the install command and sign-in step live? → the row's existing pointer (vendor setup page)
      Basis: .claude/rules/skill-bodies-state-current-rules.md (point at live upstream source); plugins/user-interface/reference/routing.json note ('every other row does [carry a pointer]')
    • Does the offer cover paid rows? → only when no free row covers the concern
      Basis: plugins/user-interface/skills/design/SKILL.md 'Combine routes and settle conflicts' (cited in issue); judgment
    • How does a row move from deferred to confirmed? → after a recorded end-to-end onboarding test, with as_of updated
      Basis: plugins/user-interface/reference/routing.json (status, as_of fields); issue acceptance; judgment

    Wants /user-interface:design to offer installing a higher-ranked uninstalled route, with sign-in, only on the user's yes, and to onboard one account-bound route end to end. The account-bound rows in routing.json are all deferred, while the acceptance limits the offer to non-deferred rows, so nothing is offerable until one row is onboarded and confirmed.

    Verification notes:

    • Minor: not every account-bound row is deferred. The built-in Artifact tool row (account login) is confirmed, but it is not installable, so the record's point holds for installable rows.
    • Q2 already matches main: design/SKILL.md:68 says a paid row is suggested only when no free row covers the concern.

    Verified by an independent fresh-context check (confirmed, risk low): gh issue view 6449 (open, no owner decision); origin/main plugins/user-interface/reference/routing.json: version 2; every installable account-bound row (figma, subframe, supernova, stitch, magic, pencil, paper, brilliant, etc.) status deferred, with pointer and as_of 2026-10-04; origin/main design/SKILL.md:62-68 (installed, not deferred, paid only when no free row); docs/conventions/routing-as-data/README.md:61-62: version changes only when the row contract changes - assumption true; a new command field would be a contract change, which supports Q1

    Admission to an agent lane stays with the work-class rules and owner ratification.

  6. added
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    and removed
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    on Oct 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    status: readyTriaged, unblocked, and fully specified; eligible to pick up.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

    Fields

    No fields configured for Feature.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions