Skip to content

feat(web): Redesign setup as an editable roster with a policy compare - #118

Merged
4ndreello merged 3 commits into
mainfrom
feat/web-setup-roster
Sep 25, 2026
Merged

4ndreello merged 3 commits into
mainfrom
feat/web-setup-roster

Conversation

@4ndreello

@4ndreello 4ndreello commented Sep 25, 2026 •

Copy link
Copy Markdown
Owner

mise ~/.config/mise/config.toml tools: gh@2.101.0
Rebuilds the /setup page around a roster table. Each role row opens a searchable model picker grouped by harness, with harness icons, and has an inline effort meter. Models show their catalog name (for example "Claude Opus 5.5") with the id the harness receives muted beside it. The orchestrator policy is shown as the three presets side by side next to an editable Custom column, with an icon for each choice. Sandbox and autocompact become a segmented control and a switch.

The previous page asked for a Keep/Change choice per role, took free-text harness:model values, and hid what each policy preset actually does behind a select. That made the current setup hard to read and a mistyped model easy.

Saving now goes through a review drawer. It runs the dry run, shows the checks, and shows a diff of the config keys Setup manages, built from the state response and the proposta. An off-catalog model is confirmed with a checkbox inside the drawer instead of the native confirm() dialog. The dry-run route never accepts off-catalog models, so a 422 whose only failures are models the user can confirm still counts as reviewable, and any other failure keeps Save disabled. Apply sends offCatalogConfirmed as before.

Policy, effort, sandbox and autocompact changes animate in place: the column highlight slides, the Custom picks and the policy fingerprint move, and changed labels fade in. While state loads, the page renders skeletons shaped like the final content and fades the values in. Nothing slides on first load, and prefers-reduced-motion turns the motion off.

The catalog refresh button spins a symmetric arc and shows a progress bar that sweeps across the discovery timeout. A failed refresh now reads as "Refresh timed out after 12 s. Showing models from 1 h ago." instead of the raw discovery error.

Things worth a careful look:

  • buildSetupSelection and the setup API are unchanged. The controller keeps a draft and derives the old form values from it in readForm(). A role is skipped unless its model or effort changed. Sandbox and autocompact are sent only when they differ from the saved value.
  • The controller is serialized into the page with .toString(), so every helper it uses lives inside createSetupPageController.
  • The harness icons live in the new src/web/setup-icons.ts as an inline SVG sprite, with no new dependencies.
  • .specs/features/web-setup-roster/spec.md holds the requirements, and the older web-setup-redesign spec now notes which parts it replaces.

4ndreello and others added 3 commits September 24, 2026 21:48
The setup page asked for a Keep/Change choice per role and free-text
harness:model fields, and showed the orchestrator policy as selects.
Replace it with a roster table where each role row opens a searchable
model picker with harness icons, plus an inline effort meter.

Show the orchestrator policy as a comparison of the presets next to an
editable Custom column, with icons per choice. Policy, effort, sandbox
and autocompact changes animate in place, and reduced motion turns the
animation off.

Saving now goes through a review drawer that runs the dry run, shows a
diff of the config keys Setup manages, and asks for confirmation of
off-catalog models inside the page instead of a native confirm dialog.

Co-Authored-By: Claude <noreply@anthropic.com>
While setup state loads, the page showed "Loading" text in every model
button and placeholder controls. Render shimmer skeletons shaped like
the loaded content instead, and fade the real values in once they
arrive.

Show the catalog name of a model (for example "Claude Opus 5.5") as the
main label in the role buttons, the picker, and the undo hint, with the
model id the harness receives shown muted beside it.

Co-Authored-By: Claude <noreply@anthropic.com>
The refresh icon spun around a lopsided arrow, so it looked off axis.
Swap it for a symmetric arc while the catalog refreshes, and show a
progress bar under the status that sweeps across the discovery timeout.

A failed refresh printed the raw discovery error after the catalog age.
Say what happened first, for example "Refresh timed out after 12 s.
Showing models from 1 h ago."

Also compare keys with localeCompare in the review diff, as Sonar asks.

Co-Authored-By: Claude <noreply@anthropic.com>
@sonarqubecloud

Copy link
Copy Markdown

@4ndreello
4ndreello merged commit c20254d into main Sep 25, 2026
4 checks passed
@4ndreello
4ndreello deleted the feat/web-setup-roster branch September 25, 2026 01:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant