From 43c1c512014ca9f7fb109a8487791dc044283fdb Mon Sep 17 00:00:00 2001 From: Raghav Chari Date: Tue, 28 Jul 2026 17:32:11 -0400 Subject: [PATCH 1/2] style(capsule): the HP row names Harmoniqs Cloud MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The solver row said "API key connected" and "Runs in the cloud" — which cloud was never stated, on the one control where a user commits to a paid service. Every refusal they can hit downstream now says "Harmoniqs Cloud" (amico-run's local-launch refusal, the hpc gate), so the control that sends them there should use the same name. The connected tooltip also states the consequence — every solve on this solver runs there — since that is the thing users were guessing about. Co-Authored-By: Claude Opus 5 (1M context) --- .../src/components/amicode-defaults-capsule.tsx | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/app/src/components/amicode-defaults-capsule.tsx b/packages/app/src/components/amicode-defaults-capsule.tsx index cf18d3f547..b54dee7d48 100644 --- a/packages/app/src/components/amicode-defaults-capsule.tsx +++ b/packages/app/src/components/amicode-defaults-capsule.tsx @@ -335,18 +335,22 @@ export function AmicodeDefaultsCapsule(props: { compute?: AmicodeComputeControl }} onClick={onHpClick} aria-label={ + // Name the cloud, not just "the cloud": users are picking a + // paid service here, and every refusal they can hit downstream + // (amico-run's local-launch refusal, the hpc gate) calls it + // Harmoniqs Cloud too — one name end to end. dot() === "connected" - ? "Piccolissimo + Altissimo solver — API key connected" + ? "Piccolissimo + Altissimo solver — connected to Harmoniqs Cloud" : dot() === "attention" - ? "Piccolissimo + Altissimo solver — API key needs attention" - : "Piccolissimo + Altissimo solver — add your API key to enable" + ? "Piccolissimo + Altissimo solver — Harmoniqs Cloud key needs attention" + : "Piccolissimo + Altissimo solver — add your Harmoniqs Cloud API key to enable" } title={ dot() === "connected" - ? "API key connected" + ? "Connected to Harmoniqs Cloud — every solve on this solver runs there" : dot() === "attention" - ? "API key needs attention — click to fix" - : "Runs in the cloud — click to add your API key" + ? "Harmoniqs Cloud key needs attention — click to fix" + : "Runs in Harmoniqs Cloud — click to add your API key" } > From 67bfdf7363835882094b96792f7a5ef5388ed3a9 Mon Sep 17 00:00:00 2001 From: Raghav Chari Date: Tue, 28 Jul 2026 17:55:01 -0400 Subject: [PATCH 2/2] feat(connections): Harmoniqs Cloud is connectable where Pasqal is MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reported: "where is our harmoniqs cloud, where can I put an API key in" — and separately, switching to Piccolissimo + Altissimo appeared to do nothing. Both trace to amicode#200. It filtered company-compute OUT of the Connections tab and renamed it "Solver API key", moving the whole connect flow inside the solver capsule's collapsed card. The reasoning was sound in isolation (one credential for one service, not a second product), but the result was that Pasqal Cloud rendered as a connectable service in the place that lists clouds and OURS did not. Users went looking for it exactly where Pasqal is. - statusTabConnections() no longer filters. Harmoniqs Cloud renders as a card beside Pasqal Cloud, with the base-url-token form (Service URL + API key) the tab already supported for non-Pasqal ids — so this is un-hiding a working flow, not building a new one. Kept as a function so there is still one obvious place to filter a genuinely internal connection later. - connectionTitle() returns "Harmoniqs Cloud". In a list whose other entry is "Pasqal Cloud", "Solver API key" read as a settings field rather than our service — and Harmoniqs Cloud is the name every downstream refusal already uses (amico-run's local-launch refusal, the hpc gate). - The solver row now states its connection state (CONNECTED / CHECK KEY / ADD KEY). With a key already on file, clicking HP correctly activates without re-asking — but the status dot lived inside the collapsed card, so the row had no way to say so and a successful switch was indistinguishable from a no-op. Text rather than a bare dot: Kate's idiom is that the dot accompanies words, and words survive colour-blindness and a screenshot. It also says what a click will do. The wire id stays company-compute — renaming it would break the credential route, the status cache, and CONNECTION_IDS for no user-visible gain. Both entry points write the same credential, so connecting in either shows up in both. ui: 57 pass. Co-Authored-By: Claude Opus 5 (1M context) --- .../components/amicode-defaults-capsule.tsx | 27 ++++++++++++++++++- packages/ui/src/amicode/connections.test.ts | 22 ++++++++++----- packages/ui/src/amicode/connections.ts | 27 ++++++++++++++----- 3 files changed, 61 insertions(+), 15 deletions(-) diff --git a/packages/app/src/components/amicode-defaults-capsule.tsx b/packages/app/src/components/amicode-defaults-capsule.tsx index b54dee7d48..8941453091 100644 --- a/packages/app/src/components/amicode-defaults-capsule.tsx +++ b/packages/app/src/components/amicode-defaults-capsule.tsx @@ -374,12 +374,37 @@ export function AmicodeDefaultsCapsule(props: { compute?: AmicodeComputeControl > PRO + {/* Connection state, ON THE ROW. Without this the row is silent: + with a key already on file a click just activates HP, which is + correct but indistinguishable from "nothing happened" (reported + 2026-07-28 as "it did not ask me for an API key" — it had no + reason to ask, and no way to say so). Text, not a bare dot: + Kate's idiom is that the dot accompanies words rather than the + solver name, and words survive colour-blindness and a + screenshot. It also states what a click will DO. */} + + {dot() === "connected" ? "CONNECTED" : dot() === "attention" ? "CHECK KEY" : "ADD KEY"} +