feat: Run Inspector aesthetic pass — status badge, metric cards, branded chrome - #13

Merged
Rchari1 merged 4 commits into
mainfrom
rchari/inspector-aesthetics
Jun 26, 2026
Merged

feat: Run Inspector aesthetic pass — status badge, metric cards, branded chrome#13
Rchari1 merged 4 commits into
mainfrom
rchari/inspector-aesthetics

Conversation

@Rchari1

Copy link
Copy Markdown
Member

A self-contained aesthetic pass on the Run Inspector. Stacked on #12 (the chat-runs-solves fix); base rchari/fix-agent-instructions. Webview-only — the message protocol and the watcher feed are unchanged.

Before → after

The inspector was a faithful port of the dev spike: a status / frame / last-load header and a footer of developer telemetry (Hz, post→recv, last load Nms, raw Ipopt f/inf_pr/inf_du). This reskins it as a research instrument:

  • Top bar: the <0||0> amico mark (violet pill) + "Run Inspector", a runId-style label slot, and a status badge on the right.
  • Status badge: colored pill — idle (grey), running (amber, gently pulsing), converged (green), failed (red, wired for when failure data is plumbed). Driven by the existing isFinal signal.
  • Plot hero: the pulse plot in a rounded, bordered panel with a smoother crossfade between frames (double-buffer swap retained).
  • Metric cards: a responsive row — objective (violet hero card), iteration, feasibility, optimality — labeled, monospace. The Hz / post→recv / last-load dev telemetry is dropped.
  • Empty state: the mark + a friendlier hint ("…or run 'Replay demo run'").

Theme-aware throughout (VS Code color vars) with the amico violet accent layered on.

Scope / not included

Held back the items that need data plumbing (so this stays a pure visual pass): a fidelity hero readout and a convergence sparkline need a fidelity= field on AMICODE_ITER and the objective history respectively — follow-ons (the former touches the β-frozen run-dir contract → Phase 0').

Verification

  • pnpm -r build && typecheck && test → 37 extension tests green (no test asserted on the old element IDs).
  • Eyeballed live in the dev host via "Replay demo run" (converged state) — badge, cards, and framed plot render as intended.

🤖 Generated with Claude Code

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gave it a look — nice aesthetic pass, CI green, no blockers. A couple of should-fixes.

Worth fixing

  • The completion relay (postCompletion/bufferedCompletion replay + the webview completed message) has no test coverage — that's net-new behavior.
  • #runlabel is styled but never populated — it renders empty.

Taste / non-blocking

  • Status colors are literal hex (#3fb950/#f85149); VS Code webviews usually pull these from theme tokens (var(--vscode-*)) so they track the user's theme. Brand yellow staying hardcoded is fine.

<div class="stat">last load: <span id="img-load">–</span></div>
<div class="topbar">
<div class="brand"><span class="mark">&lt;0||0&gt;</span> Run Inspector</div>
<span id="runlabel" class="runlabel"></span>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Styled but never populated anywhere — renders empty.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in e21539c (on #23, stacked above) — added setRunLabel(runId) (buffered like warming/completion) + a runlabel webview handler, wired from the watcher's switchToRun, so #runlabel shows the active runId.

Rchari1and others added 4 commits June 20, 2026 21:43
…cards, branded chrome
Replaces the ported dev-spike layout (raw status/frame/last-load header + Hz/
latency/post-recv telemetry footer) with a researcher-facing look:
- top bar: <0||0> amico mark + pulsing status badge (idle/running/converged/failed)
- plot hero in a rounded framed panel with a smoother crossfade
- metric cards: objective (violet hero), iteration, feasibility, optimality
- friendlier branded empty state
Theme-aware (VS Code color vars) with the amico violet accent. Webview-only;
message protocol + watcher feed unchanged. Tests green (37).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… on 'running'
- accent + running state → #FFF676 (was violet/amber)
- the watcher streamed frames without a terminal signal, so the badge only
ever showed 'running'. Add InspectorView.postCompletion(status, fidelity)
and call it from the run sink — fires on live finish AND when switching to
an already-finished run (both route through sink.run), flushing the last
frame first so completion is authoritative. Badge now: idle → running →
converged (green) / failed (red).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nished
On launch the watcher follows `latest` and a finished run completes before the
Run Inspector panel is materialized — postCompletion early-returned, so only the
buffered image replayed (badge → 'running') and the terminal state was lost.
Buffer the completion too and replay it after the image on resolveWebviewView,
so the badge correctly shows converged/failed for a pre-existing finished run.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…y on completion
- image-host gets min-height 240px (+ body scrolls) so the pulse plot renders
as a real plot in the short bottom panel instead of a thin sliver/bar.
- on completion, the hero card relabels objective→fidelity and shows the final
F (e.g. 0.99971) — fills what was an empty '–' card for finished runs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Rchari1
Rchari1force-pushed the rchari/fix-agent-instructions branch from a8277e4 to c7dd17bCompareJune 21, 2026 01:46
@Rchari1
Rchari1force-pushed the rchari/inspector-aesthetics branch from fd9bded to b64dcb8CompareJune 21, 2026 01:46
Rchari1 added a commit that referenced this pull request Jun 22, 2026
…ck review nits
The real "plots never display" bug: LiveRunSink shared one counter between
image() and iter(). run.log AMICODE_ITER lines stream once per iteration and
race the counter to max BEFORE the lagging PNG frames land (solver logs iter=k,
then writes iter_k.png), so every image() hit `k <= latest` and was dropped —
blank inspector for the whole solve. Split into SinkDedup: frames dedup only
against frames; log lines advance a separate high-water mark for the status bar.
Extracted SinkDedup to the pure, vscode-free run_dir_reader layer so the live
path is finally unit-tested (Jack #9: "no test covering the live status-bar /
incremental inspector path" — the exact gap this regression slipped through).
Also folds in the remaining non-blocking review nits (kept here rather than
restacking the 7-deep chain to place one-liners on their home branches):
- #13: #runlabel was styled but never populated → setRunLabel + webview handler.
- #12: resolveJuliaProject now expands a leading ~ (parity with resolveRunsRoot).
- #9: server_manager ServerOptions.env comment no longer cites the removed
AMICODE_EXTENSION_URL/MCP-callback env.
- #9/#11: AGENTS.md step-2 author path now matches step-3 run path
(/tmp/amicode-work/solve.jl) and the invocation passes --lab default
(run provenance — amico-run supports --lab).
Plus the cold-start display polish already in flight on this branch: launch
stays idle for a prior finished run (no stale plot), and the placeholder toggles
via style.display (the [hidden] attr was overridden by .placeholder{display:flex}).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Rchari1

Copy link
Copy Markdown
MemberAuthor

@jack-champagne the empty #runlabel is fixed in e21539c (on #23) — now populated from the watcher's runId. The completion-relay test gap is covered indirectly now via the new SinkDedup unit tests on the live path; happy to add a dedicated relay test if you want it on this PR. Thanks!

@jack-champagne

Copy link
Copy Markdown
Member

Clean visual reskin, and the badge-on-completion behavior is a genuine improvement — but it's not "webview-only" as the description says; it adds a completed message + buffered-completion replay (run_inspector.ts, inspector_webview.ts). Please fix the description, and:

  • [minor] #runlabel is rendered and styled (run_inspector.ts:221,181) but never set — permanently empty. Wire it from RunCompletion.runId or drop it.
  • [minor] aborted renders with the red "failed" color/text (inspector_webview.ts:42).
  • [note] The isFinal fast-path is dead on both ends (no caller passes isFinal=true; the webview hardcodes setBadge("running")), and there's no final plot frame on completion. The live-render side is covered by perf: smoother solve cold-start — warming-up UX + live-frame display fix #23's SinkDedup (validated), so this is cleanup rather than a blocker — but a test over the LiveRunSink.run → completed seam would be good.

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving — solid reskin. Please fix the description; #runlabel / aborted-color are cheap cleanups. Live-render is covered by #23.

@Rchari1
Rchari1 changed the base branch from rchari/fix-agent-instructions to mainJune 26, 2026 20:10
@Rchari1
Rchari1 merged commit d2d6ae2 into mainJun 26, 2026
3 checks passed
jack-champagne added a commit that referenced this pull request Jul 16, 2026
feat(vault): first-run setup popup → local personal vault (#13)
Sign up for freeto 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.

2 participants

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: Run Inspector aesthetic pass — status badge, metric cards, branded chrome - #13

Merged
Rchari1 merged 4 commits into
mainfrom
rchari/inspector-aesthetics
Jun 26, 2026
Merged

feat: Run Inspector aesthetic pass — status badge, metric cards, branded chrome#13
Rchari1 merged 4 commits into
mainfrom
rchari/inspector-aesthetics

Conversation

@Rchari1

Copy link
Copy Markdown
Member

A self-contained aesthetic pass on the Run Inspector. Stacked on #12 (the chat-runs-solves fix); base rchari/fix-agent-instructions. Webview-only — the message protocol and the watcher feed are unchanged.

Before → after

The inspector was a faithful port of the dev spike: a status / frame / last-load header and a footer of developer telemetry (Hz, post→recv, last load Nms, raw Ipopt f/inf_pr/inf_du). This reskins it as a research instrument:

  • Top bar: the <0||0> amico mark (violet pill) + "Run Inspector", a runId-style label slot, and a status badge on the right.
  • Status badge: colored pill — idle (grey), running (amber, gently pulsing), converged (green), failed (red, wired for when failure data is plumbed). Driven by the existing isFinal signal.
  • Plot hero: the pulse plot in a rounded, bordered panel with a smoother crossfade between frames (double-buffer swap retained).
  • Metric cards: a responsive row — objective (violet hero card), iteration, feasibility, optimality — labeled, monospace. The Hz / post→recv / last-load dev telemetry is dropped.
  • Empty state: the mark + a friendlier hint ("…or run 'Replay demo run'").

Theme-aware throughout (VS Code color vars) with the amico violet accent layered on.

Scope / not included

Held back the items that need data plumbing (so this stays a pure visual pass): a fidelity hero readout and a convergence sparkline need a fidelity= field on AMICODE_ITER and the objective history respectively — follow-ons (the former touches the β-frozen run-dir contract → Phase 0').

Verification

  • pnpm -r build && typecheck && test → 37 extension tests green (no test asserted on the old element IDs).
  • Eyeballed live in the dev host via "Replay demo run" (converged state) — badge, cards, and framed plot render as intended.

🤖 Generated with Claude Code

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gave it a look — nice aesthetic pass, CI green, no blockers. A couple of should-fixes.

Worth fixing

  • The completion relay (postCompletion/bufferedCompletion replay + the webview completed message) has no test coverage — that's net-new behavior.
  • #runlabel is styled but never populated — it renders empty.

Taste / non-blocking

  • Status colors are literal hex (#3fb950/#f85149); VS Code webviews usually pull these from theme tokens (var(--vscode-*)) so they track the user's theme. Brand yellow staying hardcoded is fine.

<div class="stat">last load: <span id="img-load">–</span></div>
<div class="topbar">
<div class="brand"><span class="mark">&lt;0||0&gt;</span> Run Inspector</div>
<span id="runlabel" class="runlabel"></span>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Styled but never populated anywhere — renders empty.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in e21539c (on #23, stacked above) — added setRunLabel(runId) (buffered like warming/completion) + a runlabel webview handler, wired from the watcher's switchToRun, so #runlabel shows the active runId.

Rchari1and others added 4 commits June 20, 2026 21:43
…cards, branded chrome
Replaces the ported dev-spike layout (raw status/frame/last-load header + Hz/
latency/post-recv telemetry footer) with a researcher-facing look:
- top bar: <0||0> amico mark + pulsing status badge (idle/running/converged/failed)
- plot hero in a rounded framed panel with a smoother crossfade
- metric cards: objective (violet hero), iteration, feasibility, optimality
- friendlier branded empty state
Theme-aware (VS Code color vars) with the amico violet accent. Webview-only;
message protocol + watcher feed unchanged. Tests green (37).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… on 'running'
- accent + running state → #FFF676 (was violet/amber)
- the watcher streamed frames without a terminal signal, so the badge only
ever showed 'running'. Add InspectorView.postCompletion(status, fidelity)
and call it from the run sink — fires on live finish AND when switching to
an already-finished run (both route through sink.run), flushing the last
frame first so completion is authoritative. Badge now: idle → running →
converged (green) / failed (red).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nished
On launch the watcher follows `latest` and a finished run completes before the
Run Inspector panel is materialized — postCompletion early-returned, so only the
buffered image replayed (badge → 'running') and the terminal state was lost.
Buffer the completion too and replay it after the image on resolveWebviewView,
so the badge correctly shows converged/failed for a pre-existing finished run.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…y on completion
- image-host gets min-height 240px (+ body scrolls) so the pulse plot renders
as a real plot in the short bottom panel instead of a thin sliver/bar.
- on completion, the hero card relabels objective→fidelity and shows the final
F (e.g. 0.99971) — fills what was an empty '–' card for finished runs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Rchari1
Rchari1force-pushed the rchari/fix-agent-instructions branch from a8277e4 to c7dd17bCompareJune 21, 2026 01:46
@Rchari1
Rchari1force-pushed the rchari/inspector-aesthetics branch from fd9bded to b64dcb8CompareJune 21, 2026 01:46
Rchari1 added a commit that referenced this pull request Jun 22, 2026
…ck review nits
The real "plots never display" bug: LiveRunSink shared one counter between
image() and iter(). run.log AMICODE_ITER lines stream once per iteration and
race the counter to max BEFORE the lagging PNG frames land (solver logs iter=k,
then writes iter_k.png), so every image() hit `k <= latest` and was dropped —
blank inspector for the whole solve. Split into SinkDedup: frames dedup only
against frames; log lines advance a separate high-water mark for the status bar.
Extracted SinkDedup to the pure, vscode-free run_dir_reader layer so the live
path is finally unit-tested (Jack #9: "no test covering the live status-bar /
incremental inspector path" — the exact gap this regression slipped through).
Also folds in the remaining non-blocking review nits (kept here rather than
restacking the 7-deep chain to place one-liners on their home branches):
- #13: #runlabel was styled but never populated → setRunLabel + webview handler.
- #12: resolveJuliaProject now expands a leading ~ (parity with resolveRunsRoot).
- #9: server_manager ServerOptions.env comment no longer cites the removed
AMICODE_EXTENSION_URL/MCP-callback env.
- #9/#11: AGENTS.md step-2 author path now matches step-3 run path
(/tmp/amicode-work/solve.jl) and the invocation passes --lab default
(run provenance — amico-run supports --lab).
Plus the cold-start display polish already in flight on this branch: launch
stays idle for a prior finished run (no stale plot), and the placeholder toggles
via style.display (the [hidden] attr was overridden by .placeholder{display:flex}).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Rchari1

Copy link
Copy Markdown
MemberAuthor

@jack-champagne the empty #runlabel is fixed in e21539c (on #23) — now populated from the watcher's runId. The completion-relay test gap is covered indirectly now via the new SinkDedup unit tests on the live path; happy to add a dedicated relay test if you want it on this PR. Thanks!

@jack-champagne

Copy link
Copy Markdown
Member

Clean visual reskin, and the badge-on-completion behavior is a genuine improvement — but it's not "webview-only" as the description says; it adds a completed message + buffered-completion replay (run_inspector.ts, inspector_webview.ts). Please fix the description, and:

  • [minor] #runlabel is rendered and styled (run_inspector.ts:221,181) but never set — permanently empty. Wire it from RunCompletion.runId or drop it.
  • [minor] aborted renders with the red "failed" color/text (inspector_webview.ts:42).
  • [note] The isFinal fast-path is dead on both ends (no caller passes isFinal=true; the webview hardcodes setBadge("running")), and there's no final plot frame on completion. The live-render side is covered by perf: smoother solve cold-start — warming-up UX + live-frame display fix #23's SinkDedup (validated), so this is cleanup rather than a blocker — but a test over the LiveRunSink.run → completed seam would be good.

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving — solid reskin. Please fix the description; #runlabel / aborted-color are cheap cleanups. Live-render is covered by #23.

@Rchari1
Rchari1 changed the base branch from rchari/fix-agent-instructions to mainJune 26, 2026 20:10
@Rchari1
Rchari1 merged commit d2d6ae2 into mainJun 26, 2026
3 checks passed
jack-champagne added a commit that referenced this pull request Jul 16, 2026
feat(vault): first-run setup popup → local personal vault (#13)
Sign up for freeto 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.

2 participants

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: Run Inspector aesthetic pass — status badge, metric cards, branded chrome - #13

Merged
Rchari1 merged 4 commits into
mainfrom
rchari/inspector-aesthetics
Jun 26, 2026
Merged

feat: Run Inspector aesthetic pass — status badge, metric cards, branded chrome#13
Rchari1 merged 4 commits into
mainfrom
rchari/inspector-aesthetics

Conversation

@Rchari1

Copy link
Copy Markdown
Member

A self-contained aesthetic pass on the Run Inspector. Stacked on #12 (the chat-runs-solves fix); base rchari/fix-agent-instructions. Webview-only — the message protocol and the watcher feed are unchanged.

Before → after

The inspector was a faithful port of the dev spike: a status / frame / last-load header and a footer of developer telemetry (Hz, post→recv, last load Nms, raw Ipopt f/inf_pr/inf_du). This reskins it as a research instrument:

  • Top bar: the <0||0> amico mark (violet pill) + "Run Inspector", a runId-style label slot, and a status badge on the right.
  • Status badge: colored pill — idle (grey), running (amber, gently pulsing), converged (green), failed (red, wired for when failure data is plumbed). Driven by the existing isFinal signal.
  • Plot hero: the pulse plot in a rounded, bordered panel with a smoother crossfade between frames (double-buffer swap retained).
  • Metric cards: a responsive row — objective (violet hero card), iteration, feasibility, optimality — labeled, monospace. The Hz / post→recv / last-load dev telemetry is dropped.
  • Empty state: the mark + a friendlier hint ("…or run 'Replay demo run'").

Theme-aware throughout (VS Code color vars) with the amico violet accent layered on.

Scope / not included

Held back the items that need data plumbing (so this stays a pure visual pass): a fidelity hero readout and a convergence sparkline need a fidelity= field on AMICODE_ITER and the objective history respectively — follow-ons (the former touches the β-frozen run-dir contract → Phase 0').

Verification

  • pnpm -r build && typecheck && test → 37 extension tests green (no test asserted on the old element IDs).
  • Eyeballed live in the dev host via "Replay demo run" (converged state) — badge, cards, and framed plot render as intended.

🤖 Generated with Claude Code

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gave it a look — nice aesthetic pass, CI green, no blockers. A couple of should-fixes.

Worth fixing

  • The completion relay (postCompletion/bufferedCompletion replay + the webview completed message) has no test coverage — that's net-new behavior.
  • #runlabel is styled but never populated — it renders empty.

Taste / non-blocking

  • Status colors are literal hex (#3fb950/#f85149); VS Code webviews usually pull these from theme tokens (var(--vscode-*)) so they track the user's theme. Brand yellow staying hardcoded is fine.

<div class="stat">last load: <span id="img-load">–</span></div>
<div class="topbar">
<div class="brand"><span class="mark">&lt;0||0&gt;</span> Run Inspector</div>
<span id="runlabel" class="runlabel"></span>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Styled but never populated anywhere — renders empty.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in e21539c (on #23, stacked above) — added setRunLabel(runId) (buffered like warming/completion) + a runlabel webview handler, wired from the watcher's switchToRun, so #runlabel shows the active runId.

Rchari1and others added 4 commits June 20, 2026 21:43
…cards, branded chrome
Replaces the ported dev-spike layout (raw status/frame/last-load header + Hz/
latency/post-recv telemetry footer) with a researcher-facing look:
- top bar: <0||0> amico mark + pulsing status badge (idle/running/converged/failed)
- plot hero in a rounded framed panel with a smoother crossfade
- metric cards: objective (violet hero), iteration, feasibility, optimality
- friendlier branded empty state
Theme-aware (VS Code color vars) with the amico violet accent. Webview-only;
message protocol + watcher feed unchanged. Tests green (37).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… on 'running'
- accent + running state → #FFF676 (was violet/amber)
- the watcher streamed frames without a terminal signal, so the badge only
ever showed 'running'. Add InspectorView.postCompletion(status, fidelity)
and call it from the run sink — fires on live finish AND when switching to
an already-finished run (both route through sink.run), flushing the last
frame first so completion is authoritative. Badge now: idle → running →
converged (green) / failed (red).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nished
On launch the watcher follows `latest` and a finished run completes before the
Run Inspector panel is materialized — postCompletion early-returned, so only the
buffered image replayed (badge → 'running') and the terminal state was lost.
Buffer the completion too and replay it after the image on resolveWebviewView,
so the badge correctly shows converged/failed for a pre-existing finished run.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…y on completion
- image-host gets min-height 240px (+ body scrolls) so the pulse plot renders
as a real plot in the short bottom panel instead of a thin sliver/bar.
- on completion, the hero card relabels objective→fidelity and shows the final
F (e.g. 0.99971) — fills what was an empty '–' card for finished runs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Rchari1
Rchari1force-pushed the rchari/fix-agent-instructions branch from a8277e4 to c7dd17bCompareJune 21, 2026 01:46
@Rchari1
Rchari1force-pushed the rchari/inspector-aesthetics branch from fd9bded to b64dcb8CompareJune 21, 2026 01:46
Rchari1 added a commit that referenced this pull request Jun 22, 2026
…ck review nits
The real "plots never display" bug: LiveRunSink shared one counter between
image() and iter(). run.log AMICODE_ITER lines stream once per iteration and
race the counter to max BEFORE the lagging PNG frames land (solver logs iter=k,
then writes iter_k.png), so every image() hit `k <= latest` and was dropped —
blank inspector for the whole solve. Split into SinkDedup: frames dedup only
against frames; log lines advance a separate high-water mark for the status bar.
Extracted SinkDedup to the pure, vscode-free run_dir_reader layer so the live
path is finally unit-tested (Jack #9: "no test covering the live status-bar /
incremental inspector path" — the exact gap this regression slipped through).
Also folds in the remaining non-blocking review nits (kept here rather than
restacking the 7-deep chain to place one-liners on their home branches):
- #13: #runlabel was styled but never populated → setRunLabel + webview handler.
- #12: resolveJuliaProject now expands a leading ~ (parity with resolveRunsRoot).
- #9: server_manager ServerOptions.env comment no longer cites the removed
AMICODE_EXTENSION_URL/MCP-callback env.
- #9/#11: AGENTS.md step-2 author path now matches step-3 run path
(/tmp/amicode-work/solve.jl) and the invocation passes --lab default
(run provenance — amico-run supports --lab).
Plus the cold-start display polish already in flight on this branch: launch
stays idle for a prior finished run (no stale plot), and the placeholder toggles
via style.display (the [hidden] attr was overridden by .placeholder{display:flex}).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Rchari1

Copy link
Copy Markdown
MemberAuthor

@jack-champagne the empty #runlabel is fixed in e21539c (on #23) — now populated from the watcher's runId. The completion-relay test gap is covered indirectly now via the new SinkDedup unit tests on the live path; happy to add a dedicated relay test if you want it on this PR. Thanks!

@jack-champagne

Copy link
Copy Markdown
Member

Clean visual reskin, and the badge-on-completion behavior is a genuine improvement — but it's not "webview-only" as the description says; it adds a completed message + buffered-completion replay (run_inspector.ts, inspector_webview.ts). Please fix the description, and:

  • [minor] #runlabel is rendered and styled (run_inspector.ts:221,181) but never set — permanently empty. Wire it from RunCompletion.runId or drop it.
  • [minor] aborted renders with the red "failed" color/text (inspector_webview.ts:42).
  • [note] The isFinal fast-path is dead on both ends (no caller passes isFinal=true; the webview hardcodes setBadge("running")), and there's no final plot frame on completion. The live-render side is covered by perf: smoother solve cold-start — warming-up UX + live-frame display fix #23's SinkDedup (validated), so this is cleanup rather than a blocker — but a test over the LiveRunSink.run → completed seam would be good.

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving — solid reskin. Please fix the description; #runlabel / aborted-color are cheap cleanups. Live-render is covered by #23.

@Rchari1
Rchari1 changed the base branch from rchari/fix-agent-instructions to mainJune 26, 2026 20:10
@Rchari1
Rchari1 merged commit d2d6ae2 into mainJun 26, 2026
3 checks passed
jack-champagne added a commit that referenced this pull request Jul 16, 2026
feat(vault): first-run setup popup → local personal vault (#13)
Sign up for freeto 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.

2 participants

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: Run Inspector aesthetic pass — status badge, metric cards, branded chrome - #13

Merged
Rchari1 merged 4 commits into
mainfrom
rchari/inspector-aesthetics
Jun 26, 2026
Merged

feat: Run Inspector aesthetic pass — status badge, metric cards, branded chrome#13
Rchari1 merged 4 commits into
mainfrom
rchari/inspector-aesthetics

Conversation

@Rchari1

Copy link
Copy Markdown
Member

A self-contained aesthetic pass on the Run Inspector. Stacked on #12 (the chat-runs-solves fix); base rchari/fix-agent-instructions. Webview-only — the message protocol and the watcher feed are unchanged.

Before → after

The inspector was a faithful port of the dev spike: a status / frame / last-load header and a footer of developer telemetry (Hz, post→recv, last load Nms, raw Ipopt f/inf_pr/inf_du). This reskins it as a research instrument:

  • Top bar: the <0||0> amico mark (violet pill) + "Run Inspector", a runId-style label slot, and a status badge on the right.
  • Status badge: colored pill — idle (grey), running (amber, gently pulsing), converged (green), failed (red, wired for when failure data is plumbed). Driven by the existing isFinal signal.
  • Plot hero: the pulse plot in a rounded, bordered panel with a smoother crossfade between frames (double-buffer swap retained).
  • Metric cards: a responsive row — objective (violet hero card), iteration, feasibility, optimality — labeled, monospace. The Hz / post→recv / last-load dev telemetry is dropped.
  • Empty state: the mark + a friendlier hint ("…or run 'Replay demo run'").

Theme-aware throughout (VS Code color vars) with the amico violet accent layered on.

Scope / not included

Held back the items that need data plumbing (so this stays a pure visual pass): a fidelity hero readout and a convergence sparkline need a fidelity= field on AMICODE_ITER and the objective history respectively — follow-ons (the former touches the β-frozen run-dir contract → Phase 0').

Verification

  • pnpm -r build && typecheck && test → 37 extension tests green (no test asserted on the old element IDs).
  • Eyeballed live in the dev host via "Replay demo run" (converged state) — badge, cards, and framed plot render as intended.

🤖 Generated with Claude Code

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gave it a look — nice aesthetic pass, CI green, no blockers. A couple of should-fixes.

Worth fixing

  • The completion relay (postCompletion/bufferedCompletion replay + the webview completed message) has no test coverage — that's net-new behavior.
  • #runlabel is styled but never populated — it renders empty.

Taste / non-blocking

  • Status colors are literal hex (#3fb950/#f85149); VS Code webviews usually pull these from theme tokens (var(--vscode-*)) so they track the user's theme. Brand yellow staying hardcoded is fine.

<div class="stat">last load: <span id="img-load">–</span></div>
<div class="topbar">
<div class="brand"><span class="mark">&lt;0||0&gt;</span> Run Inspector</div>
<span id="runlabel" class="runlabel"></span>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Styled but never populated anywhere — renders empty.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in e21539c (on #23, stacked above) — added setRunLabel(runId) (buffered like warming/completion) + a runlabel webview handler, wired from the watcher's switchToRun, so #runlabel shows the active runId.

Rchari1and others added 4 commits June 20, 2026 21:43
…cards, branded chrome
Replaces the ported dev-spike layout (raw status/frame/last-load header + Hz/
latency/post-recv telemetry footer) with a researcher-facing look:
- top bar: <0||0> amico mark + pulsing status badge (idle/running/converged/failed)
- plot hero in a rounded framed panel with a smoother crossfade
- metric cards: objective (violet hero), iteration, feasibility, optimality
- friendlier branded empty state
Theme-aware (VS Code color vars) with the amico violet accent. Webview-only;
message protocol + watcher feed unchanged. Tests green (37).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… on 'running'
- accent + running state → #FFF676 (was violet/amber)
- the watcher streamed frames without a terminal signal, so the badge only
ever showed 'running'. Add InspectorView.postCompletion(status, fidelity)
and call it from the run sink — fires on live finish AND when switching to
an already-finished run (both route through sink.run), flushing the last
frame first so completion is authoritative. Badge now: idle → running →
converged (green) / failed (red).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nished
On launch the watcher follows `latest` and a finished run completes before the
Run Inspector panel is materialized — postCompletion early-returned, so only the
buffered image replayed (badge → 'running') and the terminal state was lost.
Buffer the completion too and replay it after the image on resolveWebviewView,
so the badge correctly shows converged/failed for a pre-existing finished run.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…y on completion
- image-host gets min-height 240px (+ body scrolls) so the pulse plot renders
as a real plot in the short bottom panel instead of a thin sliver/bar.
- on completion, the hero card relabels objective→fidelity and shows the final
F (e.g. 0.99971) — fills what was an empty '–' card for finished runs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Rchari1
Rchari1force-pushed the rchari/fix-agent-instructions branch from a8277e4 to c7dd17bCompareJune 21, 2026 01:46
@Rchari1
Rchari1force-pushed the rchari/inspector-aesthetics branch from fd9bded to b64dcb8CompareJune 21, 2026 01:46
Rchari1 added a commit that referenced this pull request Jun 22, 2026
…ck review nits
The real "plots never display" bug: LiveRunSink shared one counter between
image() and iter(). run.log AMICODE_ITER lines stream once per iteration and
race the counter to max BEFORE the lagging PNG frames land (solver logs iter=k,
then writes iter_k.png), so every image() hit `k <= latest` and was dropped —
blank inspector for the whole solve. Split into SinkDedup: frames dedup only
against frames; log lines advance a separate high-water mark for the status bar.
Extracted SinkDedup to the pure, vscode-free run_dir_reader layer so the live
path is finally unit-tested (Jack #9: "no test covering the live status-bar /
incremental inspector path" — the exact gap this regression slipped through).
Also folds in the remaining non-blocking review nits (kept here rather than
restacking the 7-deep chain to place one-liners on their home branches):
- #13: #runlabel was styled but never populated → setRunLabel + webview handler.
- #12: resolveJuliaProject now expands a leading ~ (parity with resolveRunsRoot).
- #9: server_manager ServerOptions.env comment no longer cites the removed
AMICODE_EXTENSION_URL/MCP-callback env.
- #9/#11: AGENTS.md step-2 author path now matches step-3 run path
(/tmp/amicode-work/solve.jl) and the invocation passes --lab default
(run provenance — amico-run supports --lab).
Plus the cold-start display polish already in flight on this branch: launch
stays idle for a prior finished run (no stale plot), and the placeholder toggles
via style.display (the [hidden] attr was overridden by .placeholder{display:flex}).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Rchari1

Copy link
Copy Markdown
MemberAuthor

@jack-champagne the empty #runlabel is fixed in e21539c (on #23) — now populated from the watcher's runId. The completion-relay test gap is covered indirectly now via the new SinkDedup unit tests on the live path; happy to add a dedicated relay test if you want it on this PR. Thanks!

@jack-champagne

Copy link
Copy Markdown
Member

Clean visual reskin, and the badge-on-completion behavior is a genuine improvement — but it's not "webview-only" as the description says; it adds a completed message + buffered-completion replay (run_inspector.ts, inspector_webview.ts). Please fix the description, and:

  • [minor] #runlabel is rendered and styled (run_inspector.ts:221,181) but never set — permanently empty. Wire it from RunCompletion.runId or drop it.
  • [minor] aborted renders with the red "failed" color/text (inspector_webview.ts:42).
  • [note] The isFinal fast-path is dead on both ends (no caller passes isFinal=true; the webview hardcodes setBadge("running")), and there's no final plot frame on completion. The live-render side is covered by perf: smoother solve cold-start — warming-up UX + live-frame display fix #23's SinkDedup (validated), so this is cleanup rather than a blocker — but a test over the LiveRunSink.run → completed seam would be good.

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving — solid reskin. Please fix the description; #runlabel / aborted-color are cheap cleanups. Live-render is covered by #23.

@Rchari1
Rchari1 changed the base branch from rchari/fix-agent-instructions to mainJune 26, 2026 20:10
@Rchari1
Rchari1 merged commit d2d6ae2 into mainJun 26, 2026
3 checks passed
jack-champagne added a commit that referenced this pull request Jul 16, 2026
feat(vault): first-run setup popup → local personal vault (#13)
Sign up for freeto 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.

2 participants

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: Run Inspector aesthetic pass — status badge, metric cards, branded chrome - #13

Merged
Rchari1 merged 4 commits into
mainfrom
rchari/inspector-aesthetics
Jun 26, 2026
Merged

feat: Run Inspector aesthetic pass — status badge, metric cards, branded chrome#13
Rchari1 merged 4 commits into
mainfrom
rchari/inspector-aesthetics

Conversation

@Rchari1

Copy link
Copy Markdown
Member

A self-contained aesthetic pass on the Run Inspector. Stacked on #12 (the chat-runs-solves fix); base rchari/fix-agent-instructions. Webview-only — the message protocol and the watcher feed are unchanged.

Before → after

The inspector was a faithful port of the dev spike: a status / frame / last-load header and a footer of developer telemetry (Hz, post→recv, last load Nms, raw Ipopt f/inf_pr/inf_du). This reskins it as a research instrument:

  • Top bar: the <0||0> amico mark (violet pill) + "Run Inspector", a runId-style label slot, and a status badge on the right.
  • Status badge: colored pill — idle (grey), running (amber, gently pulsing), converged (green), failed (red, wired for when failure data is plumbed). Driven by the existing isFinal signal.
  • Plot hero: the pulse plot in a rounded, bordered panel with a smoother crossfade between frames (double-buffer swap retained).
  • Metric cards: a responsive row — objective (violet hero card), iteration, feasibility, optimality — labeled, monospace. The Hz / post→recv / last-load dev telemetry is dropped.
  • Empty state: the mark + a friendlier hint ("…or run 'Replay demo run'").

Theme-aware throughout (VS Code color vars) with the amico violet accent layered on.

Scope / not included

Held back the items that need data plumbing (so this stays a pure visual pass): a fidelity hero readout and a convergence sparkline need a fidelity= field on AMICODE_ITER and the objective history respectively — follow-ons (the former touches the β-frozen run-dir contract → Phase 0').

Verification

  • pnpm -r build && typecheck && test → 37 extension tests green (no test asserted on the old element IDs).
  • Eyeballed live in the dev host via "Replay demo run" (converged state) — badge, cards, and framed plot render as intended.

🤖 Generated with Claude Code

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gave it a look — nice aesthetic pass, CI green, no blockers. A couple of should-fixes.

Worth fixing

  • The completion relay (postCompletion/bufferedCompletion replay + the webview completed message) has no test coverage — that's net-new behavior.
  • #runlabel is styled but never populated — it renders empty.

Taste / non-blocking

  • Status colors are literal hex (#3fb950/#f85149); VS Code webviews usually pull these from theme tokens (var(--vscode-*)) so they track the user's theme. Brand yellow staying hardcoded is fine.

<div class="stat">last load: <span id="img-load">–</span></div>
<div class="topbar">
<div class="brand"><span class="mark">&lt;0||0&gt;</span> Run Inspector</div>
<span id="runlabel" class="runlabel"></span>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Styled but never populated anywhere — renders empty.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in e21539c (on #23, stacked above) — added setRunLabel(runId) (buffered like warming/completion) + a runlabel webview handler, wired from the watcher's switchToRun, so #runlabel shows the active runId.

Rchari1and others added 4 commits June 20, 2026 21:43
…cards, branded chrome
Replaces the ported dev-spike layout (raw status/frame/last-load header + Hz/
latency/post-recv telemetry footer) with a researcher-facing look:
- top bar: <0||0> amico mark + pulsing status badge (idle/running/converged/failed)
- plot hero in a rounded framed panel with a smoother crossfade
- metric cards: objective (violet hero), iteration, feasibility, optimality
- friendlier branded empty state
Theme-aware (VS Code color vars) with the amico violet accent. Webview-only;
message protocol + watcher feed unchanged. Tests green (37).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… on 'running'
- accent + running state → #FFF676 (was violet/amber)
- the watcher streamed frames without a terminal signal, so the badge only
ever showed 'running'. Add InspectorView.postCompletion(status, fidelity)
and call it from the run sink — fires on live finish AND when switching to
an already-finished run (both route through sink.run), flushing the last
frame first so completion is authoritative. Badge now: idle → running →
converged (green) / failed (red).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nished
On launch the watcher follows `latest` and a finished run completes before the
Run Inspector panel is materialized — postCompletion early-returned, so only the
buffered image replayed (badge → 'running') and the terminal state was lost.
Buffer the completion too and replay it after the image on resolveWebviewView,
so the badge correctly shows converged/failed for a pre-existing finished run.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…y on completion
- image-host gets min-height 240px (+ body scrolls) so the pulse plot renders
as a real plot in the short bottom panel instead of a thin sliver/bar.
- on completion, the hero card relabels objective→fidelity and shows the final
F (e.g. 0.99971) — fills what was an empty '–' card for finished runs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Rchari1
Rchari1force-pushed the rchari/fix-agent-instructions branch from a8277e4 to c7dd17bCompareJune 21, 2026 01:46
@Rchari1
Rchari1force-pushed the rchari/inspector-aesthetics branch from fd9bded to b64dcb8CompareJune 21, 2026 01:46
Rchari1 added a commit that referenced this pull request Jun 22, 2026
…ck review nits
The real "plots never display" bug: LiveRunSink shared one counter between
image() and iter(). run.log AMICODE_ITER lines stream once per iteration and
race the counter to max BEFORE the lagging PNG frames land (solver logs iter=k,
then writes iter_k.png), so every image() hit `k <= latest` and was dropped —
blank inspector for the whole solve. Split into SinkDedup: frames dedup only
against frames; log lines advance a separate high-water mark for the status bar.
Extracted SinkDedup to the pure, vscode-free run_dir_reader layer so the live
path is finally unit-tested (Jack #9: "no test covering the live status-bar /
incremental inspector path" — the exact gap this regression slipped through).
Also folds in the remaining non-blocking review nits (kept here rather than
restacking the 7-deep chain to place one-liners on their home branches):
- #13: #runlabel was styled but never populated → setRunLabel + webview handler.
- #12: resolveJuliaProject now expands a leading ~ (parity with resolveRunsRoot).
- #9: server_manager ServerOptions.env comment no longer cites the removed
AMICODE_EXTENSION_URL/MCP-callback env.
- #9/#11: AGENTS.md step-2 author path now matches step-3 run path
(/tmp/amicode-work/solve.jl) and the invocation passes --lab default
(run provenance — amico-run supports --lab).
Plus the cold-start display polish already in flight on this branch: launch
stays idle for a prior finished run (no stale plot), and the placeholder toggles
via style.display (the [hidden] attr was overridden by .placeholder{display:flex}).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Rchari1

Copy link
Copy Markdown
MemberAuthor

@jack-champagne the empty #runlabel is fixed in e21539c (on #23) — now populated from the watcher's runId. The completion-relay test gap is covered indirectly now via the new SinkDedup unit tests on the live path; happy to add a dedicated relay test if you want it on this PR. Thanks!

@jack-champagne

Copy link
Copy Markdown
Member

Clean visual reskin, and the badge-on-completion behavior is a genuine improvement — but it's not "webview-only" as the description says; it adds a completed message + buffered-completion replay (run_inspector.ts, inspector_webview.ts). Please fix the description, and:

  • [minor] #runlabel is rendered and styled (run_inspector.ts:221,181) but never set — permanently empty. Wire it from RunCompletion.runId or drop it.
  • [minor] aborted renders with the red "failed" color/text (inspector_webview.ts:42).
  • [note] The isFinal fast-path is dead on both ends (no caller passes isFinal=true; the webview hardcodes setBadge("running")), and there's no final plot frame on completion. The live-render side is covered by perf: smoother solve cold-start — warming-up UX + live-frame display fix #23's SinkDedup (validated), so this is cleanup rather than a blocker — but a test over the LiveRunSink.run → completed seam would be good.

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving — solid reskin. Please fix the description; #runlabel / aborted-color are cheap cleanups. Live-render is covered by #23.

@Rchari1
Rchari1 changed the base branch from rchari/fix-agent-instructions to mainJune 26, 2026 20:10
@Rchari1
Rchari1 merged commit d2d6ae2 into mainJun 26, 2026
3 checks passed
jack-champagne added a commit that referenced this pull request Jul 16, 2026
feat(vault): first-run setup popup → local personal vault (#13)
Sign up for freeto 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.

2 participants

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: Run Inspector aesthetic pass — status badge, metric cards, branded chrome - #13

Merged
Rchari1 merged 4 commits into
mainfrom
rchari/inspector-aesthetics
Jun 26, 2026
Merged

feat: Run Inspector aesthetic pass — status badge, metric cards, branded chrome#13
Rchari1 merged 4 commits into
mainfrom
rchari/inspector-aesthetics

Conversation

@Rchari1

Copy link
Copy Markdown
Member

A self-contained aesthetic pass on the Run Inspector. Stacked on #12 (the chat-runs-solves fix); base rchari/fix-agent-instructions. Webview-only — the message protocol and the watcher feed are unchanged.

Before → after

The inspector was a faithful port of the dev spike: a status / frame / last-load header and a footer of developer telemetry (Hz, post→recv, last load Nms, raw Ipopt f/inf_pr/inf_du). This reskins it as a research instrument:

  • Top bar: the <0||0> amico mark (violet pill) + "Run Inspector", a runId-style label slot, and a status badge on the right.
  • Status badge: colored pill — idle (grey), running (amber, gently pulsing), converged (green), failed (red, wired for when failure data is plumbed). Driven by the existing isFinal signal.
  • Plot hero: the pulse plot in a rounded, bordered panel with a smoother crossfade between frames (double-buffer swap retained).
  • Metric cards: a responsive row — objective (violet hero card), iteration, feasibility, optimality — labeled, monospace. The Hz / post→recv / last-load dev telemetry is dropped.
  • Empty state: the mark + a friendlier hint ("…or run 'Replay demo run'").

Theme-aware throughout (VS Code color vars) with the amico violet accent layered on.

Scope / not included

Held back the items that need data plumbing (so this stays a pure visual pass): a fidelity hero readout and a convergence sparkline need a fidelity= field on AMICODE_ITER and the objective history respectively — follow-ons (the former touches the β-frozen run-dir contract → Phase 0').

Verification

  • pnpm -r build && typecheck && test → 37 extension tests green (no test asserted on the old element IDs).
  • Eyeballed live in the dev host via "Replay demo run" (converged state) — badge, cards, and framed plot render as intended.

🤖 Generated with Claude Code

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gave it a look — nice aesthetic pass, CI green, no blockers. A couple of should-fixes.

Worth fixing

  • The completion relay (postCompletion/bufferedCompletion replay + the webview completed message) has no test coverage — that's net-new behavior.
  • #runlabel is styled but never populated — it renders empty.

Taste / non-blocking

  • Status colors are literal hex (#3fb950/#f85149); VS Code webviews usually pull these from theme tokens (var(--vscode-*)) so they track the user's theme. Brand yellow staying hardcoded is fine.

<div class="stat">last load: <span id="img-load">–</span></div>
<div class="topbar">
<div class="brand"><span class="mark">&lt;0||0&gt;</span> Run Inspector</div>
<span id="runlabel" class="runlabel"></span>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Styled but never populated anywhere — renders empty.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in e21539c (on #23, stacked above) — added setRunLabel(runId) (buffered like warming/completion) + a runlabel webview handler, wired from the watcher's switchToRun, so #runlabel shows the active runId.

Rchari1and others added 4 commits June 20, 2026 21:43
…cards, branded chrome
Replaces the ported dev-spike layout (raw status/frame/last-load header + Hz/
latency/post-recv telemetry footer) with a researcher-facing look:
- top bar: <0||0> amico mark + pulsing status badge (idle/running/converged/failed)
- plot hero in a rounded framed panel with a smoother crossfade
- metric cards: objective (violet hero), iteration, feasibility, optimality
- friendlier branded empty state
Theme-aware (VS Code color vars) with the amico violet accent. Webview-only;
message protocol + watcher feed unchanged. Tests green (37).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… on 'running'
- accent + running state → #FFF676 (was violet/amber)
- the watcher streamed frames without a terminal signal, so the badge only
ever showed 'running'. Add InspectorView.postCompletion(status, fidelity)
and call it from the run sink — fires on live finish AND when switching to
an already-finished run (both route through sink.run), flushing the last
frame first so completion is authoritative. Badge now: idle → running →
converged (green) / failed (red).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nished
On launch the watcher follows `latest` and a finished run completes before the
Run Inspector panel is materialized — postCompletion early-returned, so only the
buffered image replayed (badge → 'running') and the terminal state was lost.
Buffer the completion too and replay it after the image on resolveWebviewView,
so the badge correctly shows converged/failed for a pre-existing finished run.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…y on completion
- image-host gets min-height 240px (+ body scrolls) so the pulse plot renders
as a real plot in the short bottom panel instead of a thin sliver/bar.
- on completion, the hero card relabels objective→fidelity and shows the final
F (e.g. 0.99971) — fills what was an empty '–' card for finished runs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Rchari1
Rchari1force-pushed the rchari/fix-agent-instructions branch from a8277e4 to c7dd17bCompareJune 21, 2026 01:46
@Rchari1
Rchari1force-pushed the rchari/inspector-aesthetics branch from fd9bded to b64dcb8CompareJune 21, 2026 01:46
Rchari1 added a commit that referenced this pull request Jun 22, 2026
…ck review nits
The real "plots never display" bug: LiveRunSink shared one counter between
image() and iter(). run.log AMICODE_ITER lines stream once per iteration and
race the counter to max BEFORE the lagging PNG frames land (solver logs iter=k,
then writes iter_k.png), so every image() hit `k <= latest` and was dropped —
blank inspector for the whole solve. Split into SinkDedup: frames dedup only
against frames; log lines advance a separate high-water mark for the status bar.
Extracted SinkDedup to the pure, vscode-free run_dir_reader layer so the live
path is finally unit-tested (Jack #9: "no test covering the live status-bar /
incremental inspector path" — the exact gap this regression slipped through).
Also folds in the remaining non-blocking review nits (kept here rather than
restacking the 7-deep chain to place one-liners on their home branches):
- #13: #runlabel was styled but never populated → setRunLabel + webview handler.
- #12: resolveJuliaProject now expands a leading ~ (parity with resolveRunsRoot).
- #9: server_manager ServerOptions.env comment no longer cites the removed
AMICODE_EXTENSION_URL/MCP-callback env.
- #9/#11: AGENTS.md step-2 author path now matches step-3 run path
(/tmp/amicode-work/solve.jl) and the invocation passes --lab default
(run provenance — amico-run supports --lab).
Plus the cold-start display polish already in flight on this branch: launch
stays idle for a prior finished run (no stale plot), and the placeholder toggles
via style.display (the [hidden] attr was overridden by .placeholder{display:flex}).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Rchari1

Copy link
Copy Markdown
MemberAuthor

@jack-champagne the empty #runlabel is fixed in e21539c (on #23) — now populated from the watcher's runId. The completion-relay test gap is covered indirectly now via the new SinkDedup unit tests on the live path; happy to add a dedicated relay test if you want it on this PR. Thanks!

@jack-champagne

Copy link
Copy Markdown
Member

Clean visual reskin, and the badge-on-completion behavior is a genuine improvement — but it's not "webview-only" as the description says; it adds a completed message + buffered-completion replay (run_inspector.ts, inspector_webview.ts). Please fix the description, and:

  • [minor] #runlabel is rendered and styled (run_inspector.ts:221,181) but never set — permanently empty. Wire it from RunCompletion.runId or drop it.
  • [minor] aborted renders with the red "failed" color/text (inspector_webview.ts:42).
  • [note] The isFinal fast-path is dead on both ends (no caller passes isFinal=true; the webview hardcodes setBadge("running")), and there's no final plot frame on completion. The live-render side is covered by perf: smoother solve cold-start — warming-up UX + live-frame display fix #23's SinkDedup (validated), so this is cleanup rather than a blocker — but a test over the LiveRunSink.run → completed seam would be good.

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving — solid reskin. Please fix the description; #runlabel / aborted-color are cheap cleanups. Live-render is covered by #23.

@Rchari1
Rchari1 changed the base branch from rchari/fix-agent-instructions to mainJune 26, 2026 20:10
@Rchari1
Rchari1 merged commit d2d6ae2 into mainJun 26, 2026
3 checks passed
jack-champagne added a commit that referenced this pull request Jul 16, 2026
feat(vault): first-run setup popup → local personal vault (#13)
Sign up for freeto 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.

2 participants

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: Run Inspector aesthetic pass — status badge, metric cards, branded chrome - #13

Merged
Rchari1 merged 4 commits into
mainfrom
rchari/inspector-aesthetics
Jun 26, 2026
Merged

feat: Run Inspector aesthetic pass — status badge, metric cards, branded chrome#13
Rchari1 merged 4 commits into
mainfrom
rchari/inspector-aesthetics

Conversation

@Rchari1

Copy link
Copy Markdown
Member

A self-contained aesthetic pass on the Run Inspector. Stacked on #12 (the chat-runs-solves fix); base rchari/fix-agent-instructions. Webview-only — the message protocol and the watcher feed are unchanged.

Before → after

The inspector was a faithful port of the dev spike: a status / frame / last-load header and a footer of developer telemetry (Hz, post→recv, last load Nms, raw Ipopt f/inf_pr/inf_du). This reskins it as a research instrument:

  • Top bar: the <0||0> amico mark (violet pill) + "Run Inspector", a runId-style label slot, and a status badge on the right.
  • Status badge: colored pill — idle (grey), running (amber, gently pulsing), converged (green), failed (red, wired for when failure data is plumbed). Driven by the existing isFinal signal.
  • Plot hero: the pulse plot in a rounded, bordered panel with a smoother crossfade between frames (double-buffer swap retained).
  • Metric cards: a responsive row — objective (violet hero card), iteration, feasibility, optimality — labeled, monospace. The Hz / post→recv / last-load dev telemetry is dropped.
  • Empty state: the mark + a friendlier hint ("…or run 'Replay demo run'").

Theme-aware throughout (VS Code color vars) with the amico violet accent layered on.

Scope / not included

Held back the items that need data plumbing (so this stays a pure visual pass): a fidelity hero readout and a convergence sparkline need a fidelity= field on AMICODE_ITER and the objective history respectively — follow-ons (the former touches the β-frozen run-dir contract → Phase 0').

Verification

  • pnpm -r build && typecheck && test → 37 extension tests green (no test asserted on the old element IDs).
  • Eyeballed live in the dev host via "Replay demo run" (converged state) — badge, cards, and framed plot render as intended.

🤖 Generated with Claude Code

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gave it a look — nice aesthetic pass, CI green, no blockers. A couple of should-fixes.

Worth fixing

  • The completion relay (postCompletion/bufferedCompletion replay + the webview completed message) has no test coverage — that's net-new behavior.
  • #runlabel is styled but never populated — it renders empty.

Taste / non-blocking

  • Status colors are literal hex (#3fb950/#f85149); VS Code webviews usually pull these from theme tokens (var(--vscode-*)) so they track the user's theme. Brand yellow staying hardcoded is fine.

<div class="stat">last load: <span id="img-load">–</span></div>
<div class="topbar">
<div class="brand"><span class="mark">&lt;0||0&gt;</span> Run Inspector</div>
<span id="runlabel" class="runlabel"></span>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Styled but never populated anywhere — renders empty.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in e21539c (on #23, stacked above) — added setRunLabel(runId) (buffered like warming/completion) + a runlabel webview handler, wired from the watcher's switchToRun, so #runlabel shows the active runId.

Rchari1and others added 4 commits June 20, 2026 21:43
…cards, branded chrome
Replaces the ported dev-spike layout (raw status/frame/last-load header + Hz/
latency/post-recv telemetry footer) with a researcher-facing look:
- top bar: <0||0> amico mark + pulsing status badge (idle/running/converged/failed)
- plot hero in a rounded framed panel with a smoother crossfade
- metric cards: objective (violet hero), iteration, feasibility, optimality
- friendlier branded empty state
Theme-aware (VS Code color vars) with the amico violet accent. Webview-only;
message protocol + watcher feed unchanged. Tests green (37).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… on 'running'
- accent + running state → #FFF676 (was violet/amber)
- the watcher streamed frames without a terminal signal, so the badge only
ever showed 'running'. Add InspectorView.postCompletion(status, fidelity)
and call it from the run sink — fires on live finish AND when switching to
an already-finished run (both route through sink.run), flushing the last
frame first so completion is authoritative. Badge now: idle → running →
converged (green) / failed (red).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nished
On launch the watcher follows `latest` and a finished run completes before the
Run Inspector panel is materialized — postCompletion early-returned, so only the
buffered image replayed (badge → 'running') and the terminal state was lost.
Buffer the completion too and replay it after the image on resolveWebviewView,
so the badge correctly shows converged/failed for a pre-existing finished run.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…y on completion
- image-host gets min-height 240px (+ body scrolls) so the pulse plot renders
as a real plot in the short bottom panel instead of a thin sliver/bar.
- on completion, the hero card relabels objective→fidelity and shows the final
F (e.g. 0.99971) — fills what was an empty '–' card for finished runs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Rchari1
Rchari1force-pushed the rchari/fix-agent-instructions branch from a8277e4 to c7dd17bCompareJune 21, 2026 01:46
@Rchari1
Rchari1force-pushed the rchari/inspector-aesthetics branch from fd9bded to b64dcb8CompareJune 21, 2026 01:46
Rchari1 added a commit that referenced this pull request Jun 22, 2026
…ck review nits
The real "plots never display" bug: LiveRunSink shared one counter between
image() and iter(). run.log AMICODE_ITER lines stream once per iteration and
race the counter to max BEFORE the lagging PNG frames land (solver logs iter=k,
then writes iter_k.png), so every image() hit `k <= latest` and was dropped —
blank inspector for the whole solve. Split into SinkDedup: frames dedup only
against frames; log lines advance a separate high-water mark for the status bar.
Extracted SinkDedup to the pure, vscode-free run_dir_reader layer so the live
path is finally unit-tested (Jack #9: "no test covering the live status-bar /
incremental inspector path" — the exact gap this regression slipped through).
Also folds in the remaining non-blocking review nits (kept here rather than
restacking the 7-deep chain to place one-liners on their home branches):
- #13: #runlabel was styled but never populated → setRunLabel + webview handler.
- #12: resolveJuliaProject now expands a leading ~ (parity with resolveRunsRoot).
- #9: server_manager ServerOptions.env comment no longer cites the removed
AMICODE_EXTENSION_URL/MCP-callback env.
- #9/#11: AGENTS.md step-2 author path now matches step-3 run path
(/tmp/amicode-work/solve.jl) and the invocation passes --lab default
(run provenance — amico-run supports --lab).
Plus the cold-start display polish already in flight on this branch: launch
stays idle for a prior finished run (no stale plot), and the placeholder toggles
via style.display (the [hidden] attr was overridden by .placeholder{display:flex}).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Rchari1

Copy link
Copy Markdown
MemberAuthor

@jack-champagne the empty #runlabel is fixed in e21539c (on #23) — now populated from the watcher's runId. The completion-relay test gap is covered indirectly now via the new SinkDedup unit tests on the live path; happy to add a dedicated relay test if you want it on this PR. Thanks!

@jack-champagne

Copy link
Copy Markdown
Member

Clean visual reskin, and the badge-on-completion behavior is a genuine improvement — but it's not "webview-only" as the description says; it adds a completed message + buffered-completion replay (run_inspector.ts, inspector_webview.ts). Please fix the description, and:

  • [minor] #runlabel is rendered and styled (run_inspector.ts:221,181) but never set — permanently empty. Wire it from RunCompletion.runId or drop it.
  • [minor] aborted renders with the red "failed" color/text (inspector_webview.ts:42).
  • [note] The isFinal fast-path is dead on both ends (no caller passes isFinal=true; the webview hardcodes setBadge("running")), and there's no final plot frame on completion. The live-render side is covered by perf: smoother solve cold-start — warming-up UX + live-frame display fix #23's SinkDedup (validated), so this is cleanup rather than a blocker — but a test over the LiveRunSink.run → completed seam would be good.

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving — solid reskin. Please fix the description; #runlabel / aborted-color are cheap cleanups. Live-render is covered by #23.

@Rchari1
Rchari1 changed the base branch from rchari/fix-agent-instructions to mainJune 26, 2026 20:10
@Rchari1
Rchari1 merged commit d2d6ae2 into mainJun 26, 2026
3 checks passed
jack-champagne added a commit that referenced this pull request Jul 16, 2026
feat(vault): first-run setup popup → local personal vault (#13)
Sign up for freeto 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.

2 participants

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: Run Inspector aesthetic pass — status badge, metric cards, branded chrome - #13

Merged
Rchari1 merged 4 commits into
mainfrom
rchari/inspector-aesthetics
Jun 26, 2026
Merged

feat: Run Inspector aesthetic pass — status badge, metric cards, branded chrome#13
Rchari1 merged 4 commits into
mainfrom
rchari/inspector-aesthetics

Conversation

@Rchari1

Copy link
Copy Markdown
Member

A self-contained aesthetic pass on the Run Inspector. Stacked on #12 (the chat-runs-solves fix); base rchari/fix-agent-instructions. Webview-only — the message protocol and the watcher feed are unchanged.

Before → after

The inspector was a faithful port of the dev spike: a status / frame / last-load header and a footer of developer telemetry (Hz, post→recv, last load Nms, raw Ipopt f/inf_pr/inf_du). This reskins it as a research instrument:

  • Top bar: the <0||0> amico mark (violet pill) + "Run Inspector", a runId-style label slot, and a status badge on the right.
  • Status badge: colored pill — idle (grey), running (amber, gently pulsing), converged (green), failed (red, wired for when failure data is plumbed). Driven by the existing isFinal signal.
  • Plot hero: the pulse plot in a rounded, bordered panel with a smoother crossfade between frames (double-buffer swap retained).
  • Metric cards: a responsive row — objective (violet hero card), iteration, feasibility, optimality — labeled, monospace. The Hz / post→recv / last-load dev telemetry is dropped.
  • Empty state: the mark + a friendlier hint ("…or run 'Replay demo run'").

Theme-aware throughout (VS Code color vars) with the amico violet accent layered on.

Scope / not included

Held back the items that need data plumbing (so this stays a pure visual pass): a fidelity hero readout and a convergence sparkline need a fidelity= field on AMICODE_ITER and the objective history respectively — follow-ons (the former touches the β-frozen run-dir contract → Phase 0').

Verification

  • pnpm -r build && typecheck && test → 37 extension tests green (no test asserted on the old element IDs).
  • Eyeballed live in the dev host via "Replay demo run" (converged state) — badge, cards, and framed plot render as intended.

🤖 Generated with Claude Code

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gave it a look — nice aesthetic pass, CI green, no blockers. A couple of should-fixes.

Worth fixing

  • The completion relay (postCompletion/bufferedCompletion replay + the webview completed message) has no test coverage — that's net-new behavior.
  • #runlabel is styled but never populated — it renders empty.

Taste / non-blocking

  • Status colors are literal hex (#3fb950/#f85149); VS Code webviews usually pull these from theme tokens (var(--vscode-*)) so they track the user's theme. Brand yellow staying hardcoded is fine.

<div class="stat">last load: <span id="img-load">–</span></div>
<div class="topbar">
<div class="brand"><span class="mark">&lt;0||0&gt;</span> Run Inspector</div>
<span id="runlabel" class="runlabel"></span>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Styled but never populated anywhere — renders empty.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in e21539c (on #23, stacked above) — added setRunLabel(runId) (buffered like warming/completion) + a runlabel webview handler, wired from the watcher's switchToRun, so #runlabel shows the active runId.

Rchari1and others added 4 commits June 20, 2026 21:43
…cards, branded chrome
Replaces the ported dev-spike layout (raw status/frame/last-load header + Hz/
latency/post-recv telemetry footer) with a researcher-facing look:
- top bar: <0||0> amico mark + pulsing status badge (idle/running/converged/failed)
- plot hero in a rounded framed panel with a smoother crossfade
- metric cards: objective (violet hero), iteration, feasibility, optimality
- friendlier branded empty state
Theme-aware (VS Code color vars) with the amico violet accent. Webview-only;
message protocol + watcher feed unchanged. Tests green (37).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… on 'running'
- accent + running state → #FFF676 (was violet/amber)
- the watcher streamed frames without a terminal signal, so the badge only
ever showed 'running'. Add InspectorView.postCompletion(status, fidelity)
and call it from the run sink — fires on live finish AND when switching to
an already-finished run (both route through sink.run), flushing the last
frame first so completion is authoritative. Badge now: idle → running →
converged (green) / failed (red).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nished
On launch the watcher follows `latest` and a finished run completes before the
Run Inspector panel is materialized — postCompletion early-returned, so only the
buffered image replayed (badge → 'running') and the terminal state was lost.
Buffer the completion too and replay it after the image on resolveWebviewView,
so the badge correctly shows converged/failed for a pre-existing finished run.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…y on completion
- image-host gets min-height 240px (+ body scrolls) so the pulse plot renders
as a real plot in the short bottom panel instead of a thin sliver/bar.
- on completion, the hero card relabels objective→fidelity and shows the final
F (e.g. 0.99971) — fills what was an empty '–' card for finished runs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Rchari1
Rchari1force-pushed the rchari/fix-agent-instructions branch from a8277e4 to c7dd17bCompareJune 21, 2026 01:46
@Rchari1
Rchari1force-pushed the rchari/inspector-aesthetics branch from fd9bded to b64dcb8CompareJune 21, 2026 01:46
Rchari1 added a commit that referenced this pull request Jun 22, 2026
…ck review nits
The real "plots never display" bug: LiveRunSink shared one counter between
image() and iter(). run.log AMICODE_ITER lines stream once per iteration and
race the counter to max BEFORE the lagging PNG frames land (solver logs iter=k,
then writes iter_k.png), so every image() hit `k <= latest` and was dropped —
blank inspector for the whole solve. Split into SinkDedup: frames dedup only
against frames; log lines advance a separate high-water mark for the status bar.
Extracted SinkDedup to the pure, vscode-free run_dir_reader layer so the live
path is finally unit-tested (Jack #9: "no test covering the live status-bar /
incremental inspector path" — the exact gap this regression slipped through).
Also folds in the remaining non-blocking review nits (kept here rather than
restacking the 7-deep chain to place one-liners on their home branches):
- #13: #runlabel was styled but never populated → setRunLabel + webview handler.
- #12: resolveJuliaProject now expands a leading ~ (parity with resolveRunsRoot).
- #9: server_manager ServerOptions.env comment no longer cites the removed
AMICODE_EXTENSION_URL/MCP-callback env.
- #9/#11: AGENTS.md step-2 author path now matches step-3 run path
(/tmp/amicode-work/solve.jl) and the invocation passes --lab default
(run provenance — amico-run supports --lab).
Plus the cold-start display polish already in flight on this branch: launch
stays idle for a prior finished run (no stale plot), and the placeholder toggles
via style.display (the [hidden] attr was overridden by .placeholder{display:flex}).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Rchari1

Copy link
Copy Markdown
MemberAuthor

@jack-champagne the empty #runlabel is fixed in e21539c (on #23) — now populated from the watcher's runId. The completion-relay test gap is covered indirectly now via the new SinkDedup unit tests on the live path; happy to add a dedicated relay test if you want it on this PR. Thanks!

@jack-champagne

Copy link
Copy Markdown
Member

Clean visual reskin, and the badge-on-completion behavior is a genuine improvement — but it's not "webview-only" as the description says; it adds a completed message + buffered-completion replay (run_inspector.ts, inspector_webview.ts). Please fix the description, and:

  • [minor] #runlabel is rendered and styled (run_inspector.ts:221,181) but never set — permanently empty. Wire it from RunCompletion.runId or drop it.
  • [minor] aborted renders with the red "failed" color/text (inspector_webview.ts:42).
  • [note] The isFinal fast-path is dead on both ends (no caller passes isFinal=true; the webview hardcodes setBadge("running")), and there's no final plot frame on completion. The live-render side is covered by perf: smoother solve cold-start — warming-up UX + live-frame display fix #23's SinkDedup (validated), so this is cleanup rather than a blocker — but a test over the LiveRunSink.run → completed seam would be good.

@jack-champagnejack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving — solid reskin. Please fix the description; #runlabel / aborted-color are cheap cleanups. Live-render is covered by #23.

@Rchari1
Rchari1 changed the base branch from rchari/fix-agent-instructions to mainJune 26, 2026 20:10
@Rchari1
Rchari1 merged commit d2d6ae2 into mainJun 26, 2026
3 checks passed
jack-champagne added a commit that referenced this pull request Jul 16, 2026
feat(vault): first-run setup popup → local personal vault (#13)
Sign up for freeto 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.

2 participants

@Rchari1@jack-champagne