Repository navigation
Cloud: show startup checklist in chat - #30386
Conversation
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Gallery before/after for
States
Pick other states with a Unclear: CI failed on
Not re-run automatically: Written by red: cmux-next checks (god files, concurrency, crash safety, l10n); NEW: Shipped in:
|
There was a problem hiding this comment.
6 issues found and verified against the latest diff
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="webviews/src/agent-session/acpmux/CloudStartView.gallery.tsx">
<violation number="1" location="webviews/src/agent-session/acpmux/CloudStartView.gallery.tsx:69">
P2: These fixtures do not render the checklist states described by their notes: the machine row remains pending because the fixtures omit `step`. Set `step: "machine"` for the machine scene and `step: "folder"` for later-stage scenes so the machine row becomes running or done.</violation>
<violation number="2" location="webviews/src/agent-session/acpmux/CloudStartView.gallery.tsx:81">
P2: The running fixtures pass an epoch timestamp of `10_000`, so the gallery shows an absurd multi-decade duration for unfinished work. Use a current epoch base, such as `Date.now() - 2_400`, for running fixture timestamps.</violation>
</file>
<file name="webviews/src/agent-session/acpmux/CloudStartView.tsx">
<violation number="1" location="webviews/src/agent-session/acpmux/CloudStartView.tsx:79">
P2: Failed starts now hide the submitted task in the normal chat view, leaving only the error message. Keep the bubble for failures; the New Tab path already suppresses it explicitly with `bubble={false}`.</violation>
<violation number="2" location="webviews/src/agent-session/acpmux/CloudStartView.tsx:82">
P2: The new checklist is English-only despite the pane's localization path. Add localized keys for its labels, statuses, details, and action text, then render them through `t` like the existing Cloud startup copy.</violation>
</file>
<file name="webviews/src/agent-session/acpmux/cloudStartProgress.ts">
<violation number="1" location="webviews/src/agent-session/acpmux/cloudStartProgress.ts:122">
P2: A stale or partial `initialized: false` push can reopen and expand a checklist after harness startup. Keep this flag monotonic by ignoring false once `next.initialized` is already true.</violation>
<violation number="2" location="webviews/src/agent-session/acpmux/cloudStartProgress.ts:209">
P2: This collapses every newline in the setup log tail into spaces, defeating the checklist's multiline log-tail rendering. Preserve line breaks while applying the length cap.</violation>
</file>
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
| }, | ||
| checklistSetupRunning: { | ||
| note: "The derived environment is still building its setup snapshot.", | ||
| props: { start: { ...begun, hasRepository: true, repository: "manaflow-ai/cmux", clone: { state: "done", ...timing }, setup: { state: "running", status: "building", startedAt: 10_000 } } }, |
There was a problem hiding this comment.
P2: The running fixtures pass an epoch timestamp of 10_000, so the gallery shows an absurd multi-decade duration for unfinished work. Use a current epoch base, such as Date.now() - 2_400, for running fixture timestamps.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/src/agent-session/acpmux/CloudStartView.gallery.tsx, line 81:
<comment>The running fixtures pass an epoch timestamp of `10_000`, so the gallery shows an absurd multi-decade duration for unfinished work. Use a current epoch base, such as `Date.now() - 2_400`, for running fixture timestamps.</comment>
<file context>
@@ -63,6 +64,34 @@ export default componentEntry<ComponentProps<typeof CloudStartView>>({
+ },
+ checklistSetupRunning: {
+ note: "The derived environment is still building its setup snapshot.",
+ props: { start: { ...begun, hasRepository: true, repository: "manaflow-ai/cmux", clone: { state: "done", ...timing }, setup: { state: "running", status: "building", startedAt: 10_000 } } },
+ },
+ checklistSetupFailed: {
</file context>
| }, | ||
| checklistMachine: { | ||
| note: "Cloud machine is being created; the machine step spins while later steps remain quiet.", | ||
| props: { start: { ...begun, machineStartedAt: 10_000, machine: known.machine } }, |
There was a problem hiding this comment.
P2: These fixtures do not render the checklist states described by their notes: the machine row remains pending because the fixtures omit step. Set step: "machine" for the machine scene and step: "folder" for later-stage scenes so the machine row becomes running or done.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/src/agent-session/acpmux/CloudStartView.gallery.tsx, line 69:
<comment>These fixtures do not render the checklist states described by their notes: the machine row remains pending because the fixtures omit `step`. Set `step: "machine"` for the machine scene and `step: "folder"` for later-stage scenes so the machine row becomes running or done.</comment>
<file context>
@@ -63,6 +64,34 @@ export default componentEntry<ComponentProps<typeof CloudStartView>>({
},
+ checklistMachine: {
+ note: "Cloud machine is being created; the machine step spins while later steps remain quiet.",
+ props: { start: { ...begun, machineStartedAt: 10_000, machine: known.machine } },
+ },
+ checklistClone: {
</file context>
| {bubble && !failed && <div className="cv-user"><div className="ui-glass cv-user__bubble selectable">{start.task}</div></div>} | ||
| {!failed && !start.initialized && <output className="acpmux-cloud-start__status"><Spinner size={14} loading /><span>Starting in Cloud</span></output>} | ||
| <div className="acpmux-cloud-start__card"> | ||
| <button type="button" className="acpmux-cloud-start__summary" aria-expanded={expanded} onClick={() => setExpanded((value) => !value)}><span>{start.initialized ? "Initialized session" : "Initializing session"}</span>{expanded ? <ChevronDown size={14} /> : <ChevronRight size={14} />}</button> |
There was a problem hiding this comment.
P2: The new checklist is English-only despite the pane's localization path. Add localized keys for its labels, statuses, details, and action text, then render them through t like the existing Cloud startup copy.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/src/agent-session/acpmux/CloudStartView.tsx, line 82:
<comment>The new checklist is English-only despite the pane's localization path. Add localized keys for its labels, statuses, details, and action text, then render them through `t` like the existing Cloud startup copy.</comment>
<file context>
@@ -1,129 +1,89 @@
+ {bubble && !failed && <div className="cv-user"><div className="ui-glass cv-user__bubble selectable">{start.task}</div></div>}
+ {!failed && !start.initialized && <output className="acpmux-cloud-start__status"><Spinner size={14} loading /><span>Starting in Cloud</span></output>}
+ <div className="acpmux-cloud-start__card">
+ <button type="button" className="acpmux-cloud-start__summary" aria-expanded={expanded} onClick={() => setExpanded((value) => !value)}><span>{start.initialized ? "Initialized session" : "Initializing session"}</span>{expanded ? <ChevronDown size={14} /> : <ChevronRight size={14} />}</button>
+ {expanded && <div className="acpmux-cloud-start__checklist" aria-label="Cloud startup checklist">{rows.map((step) => <div key={step.id} className="acpmux-cloud-start__row" data-step={step.status} data-step-id={step.id}><span className="acpmux-cloud-start__mark" aria-hidden>{mark(step)}</span><span className="acpmux-cloud-start__row-label">{step.label}</span>{step.duration && <time className="acpmux-cloud-start__time">{step.duration}</time>}{step.id === "setup" && step.action ? <span className="acpmux-cloud-start__detail"><button type="button" className="acpmux-cloud-start__link" onClick={openEnvironment}>Add a setup script</button> to install dependencies and configure your environment.</span> : step.detail ? <span className={`acpmux-cloud-start__detail${step.logTail ? " acpmux-cloud-start__log-tail" : ""}`}>{step.detail}</span> : null}</div>)}</div>}
</div>
</file context>
| else window.dispatchEvent(new CustomEvent("cmux:open-cloud-environment", { detail: options })); | ||
| }; | ||
| return <section className="acpmux-cloud-start" data-state={start.state} data-look={arm} data-initialized={start.initialized ? "true" : undefined}> | ||
| {bubble && !failed && <div className="cv-user"><div className="ui-glass cv-user__bubble selectable">{start.task}</div></div>} |
There was a problem hiding this comment.
P2: Failed starts now hide the submitted task in the normal chat view, leaving only the error message. Keep the bubble for failures; the New Tab path already suppresses it explicitly with bubble={false}.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/src/agent-session/acpmux/CloudStartView.tsx, line 79:
<comment>Failed starts now hide the submitted task in the normal chat view, leaving only the error message. Keep the bubble for failures; the New Tab path already suppresses it explicitly with `bubble={false}`.</comment>
<file context>
@@ -1,129 +1,89 @@
+ else window.dispatchEvent(new CustomEvent("cmux:open-cloud-environment", { detail: options }));
+ };
+ return <section className="acpmux-cloud-start" data-state={start.state} data-look={arm} data-initialized={start.initialized ? "true" : undefined}>
+ {bubble && !failed && <div className="cv-user"><div className="ui-glass cv-user__bubble selectable">{start.task}</div></div>}
+ {!failed && !start.initialized && <output className="acpmux-cloud-start__status"><Spinner size={14} loading /><span>Starting in Cloud</span></output>}
+ <div className="acpmux-cloud-start__card">
</file context>
| {bubble && !failed && <div className="cv-user"><div className="ui-glass cv-user__bubble selectable">{start.task}</div></div>} | |
| {bubble && <div className="cv-user"><div className="ui-glass cv-user__bubble selectable">{start.task}</div></div>} |
| const startedAt = number(record.startedAt ?? record.started_at); | ||
| const finishedAt = number(record.finishedAt ?? record.finished_at); | ||
| const hasScript = typeof record.hasScript === "boolean" ? record.hasScript : typeof record.has_script === "boolean" ? record.has_script : undefined; | ||
| const logTail = line(record.logTail ?? record.log_tail ?? record.error, 1200); |
There was a problem hiding this comment.
P2: This collapses every newline in the setup log tail into spaces, defeating the checklist's multiline log-tail rendering. Preserve line breaks while applying the length cap.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/src/agent-session/acpmux/cloudStartProgress.ts, line 209:
<comment>This collapses every newline in the setup log tail into spaces, defeating the checklist's multiline log-tail rendering. Preserve line breaks while applying the length cap.</comment>
<file context>
@@ -89,9 +138,85 @@ export function cloudStartPushed(
+ const startedAt = number(record.startedAt ?? record.started_at);
+ const finishedAt = number(record.finishedAt ?? record.finished_at);
+ const hasScript = typeof record.hasScript === "boolean" ? record.hasScript : typeof record.has_script === "boolean" ? record.has_script : undefined;
+ const logTail = line(record.logTail ?? record.log_tail ?? record.error, 1200);
+ return {
+ ...(base ?? { state: "skipped" as const }),
</file context>
| if (fields.initialized === true || fields.harnessStarted === true || fields.harness_started === true) { | ||
| next.initialized = true; | ||
| } | ||
| if (fields.initialized === false) next.initialized = false; |
There was a problem hiding this comment.
P2: A stale or partial initialized: false push can reopen and expand a checklist after harness startup. Keep this flag monotonic by ignoring false once next.initialized is already true.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/src/agent-session/acpmux/cloudStartProgress.ts, line 122:
<comment>A stale or partial `initialized: false` push can reopen and expand a checklist after harness startup. Keep this flag monotonic by ignoring false once `next.initialized` is already true.</comment>
<file context>
@@ -77,9 +111,24 @@ export function cloudStartPushed(
+ next.initialized = true;
+ next.harnessStartedAt ??= now;
+ }
+ if (fields.initialized === false) next.initialized = false;
+ if (typeof fields.hasRepository === "boolean") next.hasRepository = fields.hasRepository;
+ if (typeof fields.has_repo === "boolean") next.hasRepository = fields.has_repo;
</file context>
| if (fields.initialized === false) next.initialized = false; | |
| if (fields.initialized === false && !next.initialized) next.initialized = false; |
There was a problem hiding this comment.
4 issues found and verified against the latest diff
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="webviews/src/agent-session/acpmux/CloudStartView.test.tsx">
<violation number="1" location="webviews/src/agent-session/acpmux/CloudStartView.test.tsx:59">
P2: This new checklist input exceeds the repository's 120-column Oxfmt width, so `vp fmt --check` will reject the file. Wrap the object literal across lines.</violation>
<violation number="2" location="webviews/src/agent-session/acpmux/CloudStartView.test.tsx:69">
P2: This new assertion also exceeds the repository's 120-column Oxfmt width, so the formatting check will still fail after the other long line is fixed. Break the nested call before the matcher.</violation>
</file>
<file name="webviews/src/agent-session/acpmux/cloudStart.css">
<violation number="1" location="webviews/src/agent-session/acpmux/cloudStart.css:40">
P3: The new checklist mark sizing is overridden by the older `.acpmux-cloud-start__mark` rule later in this stylesheet, leaving the marks 14px wide instead of the declared 18px. Scope this rule to the checklist or update/remove the stale declaration so the icon wrapper has the intended dimensions.</violation>
<violation number="2" location="webviews/src/agent-session/acpmux/cloudStart.css:48">
P2: Long unbroken tokens in setup log tails can be clipped by the card because `pre-wrap` does not break them and the card hides overflow. Add `overflow-wrap:anywhere` so URLs, paths, and error tokens remain visible in narrow chats.</violation>
</file>
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
| const base = { key: "k", task: "hi", state: "starting" as const }; | ||
| expect(startupChecklist({ ...base, setup: { state: "done", status: "ready" } })[2]?.detail).toBe("cached"); | ||
| expect(startupChecklist({ ...base, setup: { state: "running", status: "building" } })[2]?.status).toBe("running"); | ||
| expect(startupChecklist({ ...base, setup: { state: "failed", status: "failed", logTail: "npm ERR!" } })[2]).toMatchObject({ status: "error", logTail: "npm ERR!" }); |
There was a problem hiding this comment.
P2: This new assertion also exceeds the repository's 120-column Oxfmt width, so the formatting check will still fail after the other long line is fixed. Break the nested call before the matcher.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/src/agent-session/acpmux/CloudStartView.test.tsx, line 69:
<comment>This new assertion also exceeds the repository's 120-column Oxfmt width, so the formatting check will still fail after the other long line is fixed. Break the nested call before the matcher.</comment>
<file context>
@@ -54,3 +54,17 @@ test("a failure says the host's words with no spinner, and the New Tab page draw
+ const base = { key: "k", task: "hi", state: "starting" as const };
+ expect(startupChecklist({ ...base, setup: { state: "done", status: "ready" } })[2]?.detail).toBe("cached");
+ expect(startupChecklist({ ...base, setup: { state: "running", status: "building" } })[2]?.status).toBe("running");
+ expect(startupChecklist({ ...base, setup: { state: "failed", status: "failed", logTail: "npm ERR!" } })[2]).toMatchObject({ status: "error", logTail: "npm ERR!" });
+});
</file context>
| expect(startupChecklist({ ...base, setup: { state: "failed", status: "failed", logTail: "npm ERR!" } })[2]).toMatchObject({ status: "error", logTail: "npm ERR!" }); | |
| expect( | |
| startupChecklist({ ...base, setup: { state: "failed", status: "failed", logTail: "npm ERR!" } })[2], | |
| ).toMatchObject({ status: "error", logTail: "npm ERR!" }); |
| }); | ||
|
|
||
| test("the startup checklist skips clone without a repository and explains a missing script", () => { | ||
| const rows = startupChecklist({ key: "k", task: "hi", state: "starting", home: true, setup: { state: "skipped", hasScript: false } }); |
There was a problem hiding this comment.
P2: This new checklist input exceeds the repository's 120-column Oxfmt width, so vp fmt --check will reject the file. Wrap the object literal across lines.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/src/agent-session/acpmux/CloudStartView.test.tsx, line 59:
<comment>This new checklist input exceeds the repository's 120-column Oxfmt width, so `vp fmt --check` will reject the file. Wrap the object literal across lines.</comment>
<file context>
@@ -54,3 +54,17 @@ test("a failure says the host's words with no spinner, and the New Tab page draw
});
+
+test("the startup checklist skips clone without a repository and explains a missing script", () => {
+ const rows = startupChecklist({ key: "k", task: "hi", state: "starting", home: true, setup: { state: "skipped", hasScript: false } });
+ expect(rows.map((row) => row.status)).toEqual(["pending", "skipped", "skipped", "pending"]);
+ expect(rows[2]?.action).toBe(true);
</file context>
| const rows = startupChecklist({ key: "k", task: "hi", state: "starting", home: true, setup: { state: "skipped", hasScript: false } }); | |
| const rows = startupChecklist({ | |
| key: "k", | |
| task: "hi", | |
| state: "starting", | |
| home: true, | |
| setup: { state: "skipped", hasScript: false }, | |
| }); |
| .acpmux-cloud-start__pending-mark { display: block; width: 6px; height: 6px; margin: 6px; border-radius: 50%; background: currentColor; opacity: .25; } | ||
| .acpmux-cloud-start__time { margin-left: 4px; color: var(--agent-muted); font-variant-numeric: tabular-nums; white-space: nowrap; } | ||
| .acpmux-cloud-start__detail { grid-column: 2 / -1; margin: -3px 0 5px; color: var(--agent-muted); line-height: 1.35; } | ||
| .acpmux-cloud-start__log-tail { white-space: pre-wrap; font-family: var(--font-mono, ui-monospace); font-size: .9em; } |
There was a problem hiding this comment.
P2: Long unbroken tokens in setup log tails can be clipped by the card because pre-wrap does not break them and the card hides overflow. Add overflow-wrap:anywhere so URLs, paths, and error tokens remain visible in narrow chats.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/src/agent-session/acpmux/cloudStart.css, line 48:
<comment>Long unbroken tokens in setup log tails can be clipped by the card because `pre-wrap` does not break them and the card hides overflow. Add `overflow-wrap:anywhere` so URLs, paths, and error tokens remain visible in narrow chats.</comment>
<file context>
@@ -13,6 +13,40 @@
+.acpmux-cloud-start__pending-mark { display: block; width: 6px; height: 6px; margin: 6px; border-radius: 50%; background: currentColor; opacity: .25; }
+.acpmux-cloud-start__time { margin-left: 4px; color: var(--agent-muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
+.acpmux-cloud-start__detail { grid-column: 2 / -1; margin: -3px 0 5px; color: var(--agent-muted); line-height: 1.35; }
+.acpmux-cloud-start__log-tail { white-space: pre-wrap; font-family: var(--font-mono, ui-monospace); font-size: .9em; }
+.acpmux-cloud-start__link { padding: 0; border: 0; color: var(--agent-link, #60a5fa); background: none; font: inherit; text-decoration: underline; cursor: pointer; }
.acpmux-cloud-start__status {
</file context>
| .acpmux-cloud-start__log-tail { white-space: pre-wrap; font-family: var(--font-mono, ui-monospace); font-size: .9em; } | |
| .acpmux-cloud-start__log-tail { white-space: pre-wrap; overflow-wrap: anywhere; font-family: var(--font-mono, ui-monospace); font-size: .9em; } |
| .acpmux-cloud-start__row { display: grid; grid-template-columns: 20px max-content max-content 1fr; align-items: start; gap: 7px; min-height: 28px; color: var(--agent-text); } | ||
| .acpmux-cloud-start__row[data-status="pending"], .acpmux-cloud-start__row[data-status="skipped"] { color: var(--agent-muted); } | ||
| .acpmux-cloud-start__row[data-status="error"] { color: var(--agent-danger, #f87171); } | ||
| .acpmux-cloud-start__mark { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 20px; color: var(--agent-accent, #4ade80); } |
There was a problem hiding this comment.
P3: The new checklist mark sizing is overridden by the older .acpmux-cloud-start__mark rule later in this stylesheet, leaving the marks 14px wide instead of the declared 18px. Scope this rule to the checklist or update/remove the stale declaration so the icon wrapper has the intended dimensions.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/src/agent-session/acpmux/cloudStart.css, line 40:
<comment>The new checklist mark sizing is overridden by the older `.acpmux-cloud-start__mark` rule later in this stylesheet, leaving the marks 14px wide instead of the declared 18px. Scope this rule to the checklist or update/remove the stale declaration so the icon wrapper has the intended dimensions.</comment>
<file context>
@@ -13,6 +13,40 @@
+.acpmux-cloud-start__row { display: grid; grid-template-columns: 20px max-content max-content 1fr; align-items: start; gap: 7px; min-height: 28px; color: var(--agent-text); }
+.acpmux-cloud-start__row[data-step="pending"], .acpmux-cloud-start__row[data-step="skipped"] { color: var(--agent-muted); }
+.acpmux-cloud-start__row[data-step="error"] { color: var(--agent-danger, #f87171); }
+.acpmux-cloud-start__mark { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 20px; color: var(--agent-accent, #4ade80); }
+.acpmux-cloud-start__row[data-step="pending"] .acpmux-cloud-start__mark, .acpmux-cloud-start__row[data-step="skipped"] .acpmux-cloud-start__mark { color: var(--agent-muted); }
+.acpmux-cloud-start__row[data-step="error"] .acpmux-cloud-start__mark { color: inherit; }
</file context>
| .acpmux-cloud-start__mark { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 20px; color: var(--agent-accent, #4ade80); } | |
| .acpmux-cloud-start__checklist .acpmux-cloud-start__mark { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 20px; color: var(--agent-accent, #4ade80); } |
There was a problem hiding this comment.
3 issues found and verified against the latest diff
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="webviews/src/agent-session/acpmux/CloudStartView.gallery.tsx">
<violation number="1" location="webviews/src/agent-session/acpmux/CloudStartView.gallery.tsx:73">
P3: The clone fixture marks the operation running but supplies `finishedAt` through `...timing`, freezing its duration at 2.4 seconds. Use a running-only timing object without `finishedAt` for this scene.</violation>
<violation number="2" location="webviews/src/agent-session/acpmux/CloudStartView.gallery.tsx:85">
P3: The expanded checklist scenes exceed the entry's fixed 300px gallery surface, so the new rows and setup log tail are clipped by the gallery window. Give the checklist variants a larger height or raise the entry height.</violation>
<violation number="3" location="webviews/src/agent-session/acpmux/CloudStartView.gallery.tsx:93">
P2: The initialized fixture has a repository folder but no completed clone state, so expanding its collapsed summary shows `Clone repository` pending after initialization. Add a `{ state: "done" }` clone fixture value to represent the completed session.</violation>
</file>
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
| }, | ||
| initialized: { | ||
| note: "Once the harness starts, the checklist folds to one quiet line.", | ||
| props: { start: { ...begun, initialized: true, agent: "Claude Code", harnessStartedAt: 12_400, harnessFinishedAt: 12_900 } }, |
There was a problem hiding this comment.
P2: The initialized fixture has a repository folder but no completed clone state, so expanding its collapsed summary shows Clone repository pending after initialization. Add a { state: "done" } clone fixture value to represent the completed session.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/src/agent-session/acpmux/CloudStartView.gallery.tsx, line 93:
<comment>The initialized fixture has a repository folder but no completed clone state, so expanding its collapsed summary shows `Clone repository` pending after initialization. Add a `{ state: "done" }` clone fixture value to represent the completed session.</comment>
<file context>
@@ -63,6 +64,34 @@ export default componentEntry<ComponentProps<typeof CloudStartView>>({
+ },
+ initialized: {
+ note: "Once the harness starts, the checklist folds to one quiet line.",
+ props: { start: { ...begun, initialized: true, agent: "Claude Code", harnessStartedAt: 12_400, harnessFinishedAt: 12_900 } },
+ },
},
</file context>
| props: { start: { ...begun, initialized: true, agent: "Claude Code", harnessStartedAt: 12_400, harnessFinishedAt: 12_900 } }, | |
| props: { start: { ...begun, initialized: true, agent: "Claude Code", clone: { state: "done", ...timing }, harnessStartedAt: 12_400, harnessFinishedAt: 12_900 } }, |
| }, | ||
| checklistSetupFailed: { | ||
| note: "Setup failed and the card keeps the short log tail inline.", | ||
| props: { start: { ...begun, hasRepository: true, repository: "manaflow-ai/cmux", clone: { state: "done", ...timing }, setup: { state: "failed", status: "failed", logTail: "npm ERR! missing script: build", ...timing } } }, |
There was a problem hiding this comment.
P3: The expanded checklist scenes exceed the entry's fixed 300px gallery surface, so the new rows and setup log tail are clipped by the gallery window. Give the checklist variants a larger height or raise the entry height.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/src/agent-session/acpmux/CloudStartView.gallery.tsx, line 85:
<comment>The expanded checklist scenes exceed the entry's fixed 300px gallery surface, so the new rows and setup log tail are clipped by the gallery window. Give the checklist variants a larger height or raise the entry height.</comment>
<file context>
@@ -63,6 +64,34 @@ export default componentEntry<ComponentProps<typeof CloudStartView>>({
+ },
+ checklistSetupFailed: {
+ note: "Setup failed and the card keeps the short log tail inline.",
+ props: { start: { ...begun, hasRepository: true, repository: "manaflow-ai/cmux", clone: { state: "done", ...timing }, setup: { state: "failed", status: "failed", logTail: "npm ERR! missing script: build", ...timing } } },
+ },
+ checklistSetupSkipped: {
</file context>
| }, | ||
| checklistClone: { | ||
| note: "A repository is being cloned into the chat folder.", | ||
| props: { start: { ...begun, hasRepository: true, repository: "manaflow-ai/cmux", machine: known.machine, machineFinishedAt: 12_400, clone: { state: "running", ...timing } } }, |
There was a problem hiding this comment.
P3: The clone fixture marks the operation running but supplies finishedAt through ...timing, freezing its duration at 2.4 seconds. Use a running-only timing object without finishedAt for this scene.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/src/agent-session/acpmux/CloudStartView.gallery.tsx, line 73:
<comment>The clone fixture marks the operation running but supplies `finishedAt` through `...timing`, freezing its duration at 2.4 seconds. Use a running-only timing object without `finishedAt` for this scene.</comment>
<file context>
@@ -63,6 +64,34 @@ export default componentEntry<ComponentProps<typeof CloudStartView>>({
+ },
+ checklistClone: {
+ note: "A repository is being cloned into the chat folder.",
+ props: { start: { ...begun, hasRepository: true, repository: "manaflow-ai/cmux", machine: known.machine, machineFinishedAt: 12_400, clone: { state: "running", ...timing } } },
+ },
+ checklistSetupCached: {
</file context>
There was a problem hiding this comment.
1 issue found across 4 files (changes from recent commits).
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="webviews/src/agent-session/acpmux/CloudStartView.tsx">
<violation number="1" location="webviews/src/agent-session/acpmux/CloudStartView.tsx:41">
P2: Failed repository seeds can retain a phase or progress alongside `error`, but `cloneDetail` makes the nonempty progress text win and hides the failure message. Include `operation.error` in the displayed detail so users can diagnose the failed clone.</violation>
</file>
Reply with feedback, questions, or to request a fix.
View guided diff | Turn on auto-fix | Re-trigger cubic
| const progress = operation.progress; | ||
| if (progress?.objects !== undefined && progress.totalObjects !== undefined) parts.push(`${progress.objects}/${progress.totalObjects} objects`); | ||
| if (progress?.receivedBytes !== undefined) parts.push(`${Math.round(progress.receivedBytes / 1024)} KB`); | ||
| return parts.filter(Boolean).join(" · ") || operation.error; |
There was a problem hiding this comment.
P2: Failed repository seeds can retain a phase or progress alongside error, but cloneDetail makes the nonempty progress text win and hides the failure message. Include operation.error in the displayed detail so users can diagnose the failed clone.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At webviews/src/agent-session/acpmux/CloudStartView.tsx, line 41:
<comment>Failed repository seeds can retain a phase or progress alongside `error`, but `cloneDetail` makes the nonempty progress text win and hides the failure message. Include `operation.error` in the displayed detail so users can diagnose the failed clone.</comment>
<file context>
@@ -32,12 +32,21 @@ function setupStatus(setup: CloudStartupSetup | undefined): ChecklistStatus | un
+ const progress = operation.progress;
+ if (progress?.objects !== undefined && progress.totalObjects !== undefined) parts.push(`${progress.objects}/${progress.totalObjects} objects`);
+ if (progress?.receivedBytes !== undefined) parts.push(`${Math.round(progress.receivedBytes / 1024)} KB`);
+ return parts.filter(Boolean).join(" · ") || operation.error;
+}
+
</file context>
| return parts.filter(Boolean).join(" · ") || operation.error; | |
| return [...parts, operation.error].filter(Boolean).join(" · ") || undefined; |
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
|
Review (subagent claude-opus-5-5 medium, carried by cloud-item-14): SHIP at 409d77a |
…, regression from #30386's checklist) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-3bab30503f0b9a7059e5
|
Lead (perf lead agent): this PR's squash grows CmuxNextApp Swift lines (+31), part of the feat tip arch-ratchet red (+132 at 4ddb627). Please move the new code into the owning package (CmuxNextApp may keep only a thin call site; net CmuxNextApp lines <= 0) in a follow-up PR within 60 minutes. If no such PR names this PR by then, the lead reverts it (revert-first rule) and you re-land with the move. |
|
Reverted in #30792. This revert did not wait the 60 minutes that the lead first gave, because #30386 blocked every webviews merge:
To re-land:
|
|
Found 9 test failures on Blacksmith runners: Failures
|
…a11y, tokens, type scale, browser lanes, format) (#30801) * base red: webviews lint, four folder-pick promises are explicitly not awaited (no-floating-promises) webviews' lint runs with denyWarnings (config/vite-plus/check.ts), so the four `no-floating-promises` warnings in App.tsx made `vp lint` and `vp check --no-fmt --no-lint` ("0 errors and 4 warnings") exit 1 on every webviews push. #30220 (e24c1aa) made requestFolder and chooseProject return their Promise<void>. Four callers that start a pick and do not wait for it (the New Tab start at 11518, the two browse results and the folder chooser's pick) now say so with `void`. The promise cannot reject with a host error: pickFolder catches the host's refusal and the folder is then used or refused inside it, so no `.catch` is needed. No rule is disabled. Red at 7c549a4 (cd webviews): bunx --bun vp lint exit 1, 4 no-floating-promises Green here: no no-floating-promises finding. * base red: webviews check, #30357's repository picker and recovery card pass lint, tokens, type scale and format #30357 (7d5f3ae) added four jsx-a11y warnings (denyWarnings makes them red), five new design-token violations, four raw font sizes and nine unformatted files, so `bun run check` had five red pieces at the tip. - CloudRepositoryPicker: the Popover focuses the search field (initialFocus ref), not autoFocus; the list of repository buttons is a plain list (a listbox role on a list of buttons was wrong for assistive tech). - RepoRecoveryCard: the repository choices are a named <fieldset>, not a div with role="group"; its CSS removes the fieldset's border, padding and min width. - Spacing on the scale (4/8 px) and font sizes from the type scale (--text-caption 11 px, --text-detail 12 px, the same at interface scale 1). - vp fmt on the nine files; the three test files are byte-identical to #30711. Red at 7c549a4 (cd webviews): bun run check 5 red: check:design-tokens, check:type-scale, vp fmt --check, vp lint, vp check --no-fmt --no-lint Green here: bun run check exit 0. bun test of RepoRecoveryCard, backgroundTurns, subsessions and subagentOrder: all pass. * base red: webviews check, #30386's startup checklist and #30297's rest-gap test pass tokens, browser lanes and format At origin/feat-cmux-next 265c68a, `bun run check` (and scripts/web-lint.sh) had three more red pieces from two later merges: - check:design-tokens: #30386 (f1f79b0) cloudStart.css. Spacing on the scale (gap 6/7 -> 8 px, padding 13 -> 12 px, 2/14 -> 4/12 px), and the two status dots take their height from `aspect-ratio: 1` instead of a calc() that sat beside the height scale; they stay 14 px and 6 px circles. - check:browser-lanes: #30297 (c7c9a16) test/agent-pane-composer-rest-gap.test.ts resized its probe from a requestAnimationFrame loop. The probe now resizes in window.cmuxAfterPaint's drive (the same frame callbacks); its ResizeObserver samples the gap as before. - vp fmt on the eight files these merges left unformatted. Red at 265c68a (cd webviews): bun run check red: check:browser-lanes, check:design-tokens, vp fmt --check Green here: bun run check exit 0. CMUX_BROWSER_TESTS=1 bun test ./test/agent-pane-composer-rest-gap.test.ts 3 pass. bun test CloudStartView.test.tsx 8 pass; summary-started-chats-scale.test.ts 2 pass. * base red: webviews acpmux protocol catalog lists #30775's two Cloud turn methods (generator output) #30775 (6c53035) added agent-session-turn-prepare and agent-session-turn-abandon to cmux-tui/crates/acpmux/spec/acpmux-protocol.json but did not run the webviews generator, so `bun run acpmux-protocol:check` (the last piece of `bun run check`) failed at feat-cmux-next 87b4c90: "acpmux protocol generated files are stale in src/agent-session/acpmux/protocol/generated: methods.ts". This commit is the output of `bun scripts/acpmux-protocol-codegen.ts` only (+4 lines). Red at 87b4c90 (cd webviews): bun run acpmux-protocol:check exit 1 (stale methods.ts) Green here: bun run acpmux-protocol:check exit 0
|
Update: #30792 now reverts only the Swift lines of #30386. #30801 already rewrote the webviews side and fixed the Effect until the re-land: the Cloud start checklist from #30801 gets only step, folder, machine and size from the host. It does not get the clone, setup or timing details, or The re-land must put the Swift code in a package so that the checklist gets its detail back. The code is the extra fields of |
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Cloud startup shows a transcript checklist for machine setup, repository cloning, environment setup and harness startup. Rows show status, supplied duration and setup log tails; after initialization the card folds to “Initialized session ›”. Failed starts stop the running indicators.
Leo asked: “and if i click the < it takes me to environment setup / which is the same as where the cog takes me”. The component exposes the setup action through onOpenEnvironment; without a host callback the setup hint stays plain text. Connecting the environment-sheet host remains integration work.
Gallery entry
agent-pane.cloud-starthaschecklist-machine,checklist-clone,checklist-setup-cached,checklist-setup-running,checklist-setup-failed,checklist-setup-skippedandinitializedscenes. All 12 variants pass gallery entry validation. Labels are in the strings catalog and state words are available to screen readers. The elapsed timer stops on initialization or failure and clears on unmount.Validation: app compile passed at 9db6f6d (80 s); remote targeted Bun tests passed 13/13 at that head (run). git diff --check and gallery validation pass. Repository copy timing follows in #30517; true machine/harness timing sources are tracked in #30577.
Agent session: agent session