Skip to content

Solver toggle owns the Company Compute connection (amicode#200) - #45

Merged
kateebonner merged 11 commits into
local/amicodefrom
kate/solver-toggle-compute-200
Jul 22, 2026
Merged

kateebonner merged 11 commits into
local/amicodefrom
kate/solver-toggle-compute-200

Conversation

@kateebonner

Copy link
Copy Markdown
Contributor

Implements the fork-side of harmoniqs/amicode#200 — the HP solver option surfaces and manages its own Company Compute dependency at the point of choice.

What changed

  • HP radio status dot (green connected / amber attention / gray no key) — truthful from mount via an always-warm connections instance in the home chrome
  • Click routing: unconnected HP click expands the connect form inline (the same ConnectionCard the status popover hosted); connected click activates; already-HP click opens management (identity, validated-at, revalidate, disconnect)
  • Flip semantics: HP turns on only when a credential submit lands connected; disconnect always reverts to Piccolo — HP is cloud-only, no state implies otherwise
  • Connections tab now renders execution targets only (statusTabConnections filter) — Company Compute row relocated, Pasqal unchanged
  • Stale tooltip removed ("Preview — GPU cloud solver rolling out")
  • Connections state extracted verbatim from the tabs factory into createAmicodeConnectionsState() — popover wiring and mutation contract (Provider permissions: tier resolution engine #165/Provider permissions: source-path tagging on tool results #166) unchanged

Verification: ui 312/312 · app 415/415 · tsgo -b clean on both · new unit tests for dot mapping, click routing, flip-on-connect, mode-after-disconnect, tab filter

Part of harmoniqs/amicode#200 — AC6 (Connect Cloud command + agent copy re-route) lands extension-side in amicode.

🤖 Generated with Claude Code

kateebonner and others added 2 commits July 22, 2026 15:51
…code#200)

The HP radio in the defaults capsule wears a truthful status dot and hosts
the connection itself: clicking HP unconnected expands the same ConnectionCard
the status popover used to render — a credential that lands connected flips
HP on; disconnect always drops back to Piccolo (HP is cloud-only). Connected
+ already-HP clicks open the card in management state.

- solver-toggle: pure decision helpers (dot mapping, click routing,
  flip-on-connect, mode-after-disconnect) with unit tests
- connections: statusTabConnections() render filter — the status popover's
  Connections tab shows execution targets only; Company Compute row removed
- connections-tab: ConnectionCard exported for the capsule mount
- status-popover-body: connections state extracted verbatim into
  createAmicodeConnectionsState() so the home chrome hosts an always-warm
  instance for the dot; popover wiring unchanged
- stale 'Preview — GPU cloud solver rolling out' tooltip removed

Part of harmoniqs/amicode#200 (AC1-5, 7, 8; AC6 lands extension-side).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ow (amicode#200 AC6)

The webview bridge forwards an 'open-compute-connect' envelope; the app-shell
listener records the request and the mounted defaults capsule opens straight
into the connect form (15s freshness window so a request fired on another
page can't pop the popover much later).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
kateebonner and others added 9 commits July 22, 2026 16:10
…on (amicode#200)

ui-ux-pro-max validation pass on the connect flow. The dot was color-only
(WCAG color-not-only): the HP radio's aria-label now carries solver +
connection state in text, with aria-pressed on both radios and
aria-expanded/aria-controls tying the radio to the inline card. The compute
section is a polite live region and takes focus on open so keyboard and
screen-reader users land on the form. The shared card's credential inputs
get aria-labels mirroring their placeholders (placeholder-only labeling
disappears once typing starts) — benefits the Pasqal card too.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…API key' (amicode#200)

Kate's live-test feedback: after a successful connect the form collapses to
the slim connected card, and once the popover closes there was NO visible
route back — 'click the radio again' was a hidden affordance. And 'Company
Compute' presented one credential as a separate product.

- HP row grows a persistent details (gear) button whenever a credential
  exists (connected or troubled) — opens the same card in management state.
  Radio click simplifies: connected → select the solver; unconnected → open
  the connect form. hpClickAction loses the hidden 'manage' branch;
  showConnectionDetails() carries the affordance contract (tested).
- Display copy renames 'Company Compute' to 'Solver API key' everywhere
  user-facing — one credential, one service, presented as what it is. The
  wire id 'company-compute' is server contract and unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…amicode#200)

Kate's review: the details affordance is a three-dot kebab (inline vector,
currentColor — the sprite has no ellipsis glyph yet) and it lives WITHIN the
radio's border. The row is now one bordered control with two borderless
click zones: select (flex) and details (trailing kebab).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e its border (amicode#200)

Kate's review: the row and the card read as two separate components. The
control is now a single bordered accordion: header (select + kebab zones)
on top, the connection card expanding below a hairline divider, all inside
one border. Active tint stays on the header only so the card area stays
readable.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…nly heading (amicode#200)

Kate's review: no hairline between the header row and the expanded card,
and no 'Solver API key' title inside it — the accordion header already
names the thing; the connection STATUS is the first and only text. The
shared card grows a hideHeader prop (capsule mount only; the Connections
tab keeps its titled cards).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ame (amicode#200)

Kate's review: the color indicator belongs to the connection status line —
same idiom as the Connections tab, where the dot leads the card's first
line. The accordion header drops its dot (state still announced via
aria-label/title, still queryable via data-dot); the headerless card's
status line gains the dot/spinner.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…the in-flight switch (amicode#200)

- capsule mount overrides the needs-key state label to bare 'Not connected'
  — the form directly below IS the guidance; the Connections tab keeps the
  full copy.
- while the connect/manage flow is open the accordion wears the accent
  border: 'the choice is moving here'. Selection truth is unchanged —
  Piccolo stays active until the credential lands, then the flip is the
  success feedback (HP cannot be selected keyless by construction).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…anent handle (amicode#200)

Kate's review: clicking Piccolo or anywhere in the popover outside the HP
accordion collapses the card, and the kebab renders in ALL states — the one
predictable open/close control (radios choose, kebab discloses, clicking
away dismisses). The credential-gated showConnectionDetails contract is
retired: the keyless card is the connect form, never empty.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@kateebonner

Copy link
Copy Markdown
Contributor Author

Design review with Kate (live-tested each round in an installed VSIX) — the connect flow evolved past the original issue spec, all within #200's scope:

  • One accordion, not two boxes: the HP row is a single bordered control; the API-key card expands inside it (no divider, no card title — the status line with its dot is the only heading)
  • Interaction grammar: radios choose (Piccolo click also collapses the card) · the vertical-kebab handle is permanent in all states and toggles disclosure · clicking anywhere outside the accordion dismisses it
  • Status dot accompanies the status text, matching the Connections-tab idiom — never the solver name (row still announces state via aria-label/title + data-dot)
  • Transition signal: while the connect flow is open the accordion wears the accent border; selection truth (Piccolo active) flips only when the credential lands — the flip is the success feedback
  • Naming: display copy says "Solver API key" — one credential, one service; the company-compute wire id is unchanged
  • A11y pass (ui-ux-pro-max audit): state-in-text aria-labels, aria-pressed/expanded/controls, focus lands in the opened card, polite live region, aria-labels on all credential inputs

Follow-up candidate for the sprite: the kebab is a one-off inline SVG — worth graduating into icon.tsx if you want it canonical.

🤖 Generated with Claude Code

@kateebonner
kateebonner merged commit fc8cc69 into local/amicode Jul 22, 2026
0 of 4 checks passed
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