Skip to content

feat: Signaal v2 visual craft + Brain UI op vault BrainResponse (GRO-1425) - #59

Closed
MisterWanted wants to merge 2 commits into
mainfrom
feat/chefapp-x10-visual
Closed

feat: Signaal v2 visual craft + Brain UI op vault BrainResponse (GRO-1425)#59
MisterWanted wants to merge 2 commits into
mainfrom
feat/chefapp-x10-visual

Conversation

@MisterWanted

@MisterWanted MisterWanted commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Gestrand lokaal werk zichtbaar gemaakt (dirigent-sweep 2026-08-22).

Chefbar-kant van GRO-1425: Signaal v2 visual craft mirror + Brain UI gebind aan vault BrainResponse (2 commits, +1891). De ChefFactory-zus is al gemerged als #166; CI + review bepalen of deze chefbar-kant nog CURRENT is t.o.v. de doorontwikkelde main.


Open in Devin Review

Port Lucide rail, palette scrim, token pin and gated product stubs from
ChefFactory apps/chefapp while keeping ToggleMute and 5-arg build_actions.
Chefbar has no brain_insight/mTLS parking. Use snapshot.brain plus the
existing digest so the visual mirror compiles on this satellite.
@linear-code

linear-code Bot commented Aug 22, 2026

Copy link
Copy Markdown

GRO-1425

@qodo-code-review

Copy link
Copy Markdown

ⓘ Your Qodo trial ends soon. Ask your workspace admin to set up billing to keep reviews running after the trial. Manage billing

@coderabbitai

coderabbitai Bot commented Aug 22, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 9b906892-5d0e-4459-9c9c-d5aaa0b71cf5


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Signaal v2 visual craft mirror + Brain UI bound to vault BrainResponse

✨ Enhancement 🐞 Bug fix ⚙️ Configuration changes 📝 Documentation 🧪 Tests 🕐 40+ Minutes

Grey Divider

AI Description

• Mirrors Signaal v2 design-system styling and Lucide iconography in ChefApp GTK UI.
• Adds Brain/Agents/Flows harnesses and renders Brain from vault snapshot + digest.
• Introduces gated action stubs (approvals/agents/flows) and clickable domain rows.
Diagram

graph TD
  P["src/panel/*"] --> Z["src/panel/zones.rs"] --> A["src/actions.rs"]
  P --> H["src/harness.rs"] --> M["src/models (Snapshot/Ops)"]
  P --> O["src/panel/overlay.rs"] --> I["src/icons.rs"] --> C["src/css.rs"]
  C --> T["assets/design-tokens.snapshot.css"]
  P --> CFG["src/config.rs"] --> ENV["CHEFBAR_* env/profile"]
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Use GTK symbolic icons instead of rasterized Lucide pixbufs
  • ➕ Avoids theme-recolor bookkeeping (no LIVE tracking + recolor_all)
  • ➕ Leverages existing icon theme; less custom code
  • ➖ Would not match Signaal v2 Lucide stroke set precisely
  • ➖ Icon availability/consistency varies by platform/theme
2. Load design tokens at runtime (parse CSS/JSON) vs Rust-interpolated constants
  • ➕ Single source of truth; no need to regenerate Rust when tokens change
  • ➕ Potentially simplifies CSS.rs diff churn
  • ➖ Adds parsing/runtime failure modes to startup
  • ➖ GTK3 CSS subset limitations still require mapping logic; parsing doesn’t remove complexity
3. Introduce real Agents/Flows/Approvals clients now (instead of gated stubs)
  • ➕ End-to-end product behavior available immediately
  • ➕ Fewer follow-up PRs to wire APIs
  • ➖ High risk without stable endpoints/mTLS; would violate stated 'no second poll/socket' constraints
  • ➖ Harder to review/merge safely while main is evolving

Recommendation: Current approach (visual mirror + gated stubs + Brain bound to existing vault snapshot/digest) is the safest integration path: it preserves the “no new network-calls / no second socket” constraint while unblocking compilation and UI parity work. Consider moving to runtime token loading only if token churn becomes frequent, and keep Agents/Flows/Approvals as explicit gates until live endpoints and security (mTLS/ACP probe) are ready.

Files changed (28) +1891 / -1152

Enhancement (8) +891 / -163
actions.rsAdd gated RunSpec variants for approvals/agents/flows +41/-0

Add gated RunSpec variants for approvals/agents/flows

• Extends RunSpec with Approve/Reject/StartAgentRun/TriggerFlow, adds frecency keys, and implements stub executor behavior via user notifications while APIs are not live.

src/actions.rs

harness.rsAdd Brain/Agents/Flows harness kinds and build from snapshot +92/-11

Add Brain/Agents/Flows harness kinds and build from snapshot

• Introduces new harness kinds (Brain/Agents/Flows), maps aliases/labels/colors/keywords/groups, and builds a Brain harness from snapshot.brain plus brain_digest without new network calls; adds harness stubs for Agents/Flows.

src/harness.rs

icons.rsIntroduce Lucide SVG icon rasterization with theme recolor +279/-0

Introduce Lucide SVG icon rasterization with theme recolor

• Adds a Lucide icon module that rasterizes SVG bodies using current theme ink, tracks live icon instances, and recolors all icons on theme switch; includes tests ensuring nav/action icon mappings resolve.

src/icons.rs

chat.rsAlign chat pane visuals with Signaal v2 (heading + send icon) +30/-17

Align chat pane visuals with Signaal v2 (heading + send icon)

• Applies heading tracking attrs, replaces the send button with an icon-based solid button, and refines message role labeling for a more product-like transcript.

src/panel/chat.rs

domains.rsRender Brain domain + add gated Agents/Flows and clickable rows +270/-50

Render Brain domain + add gated Agents/Flows and clickable rows

• Adds Brain domain UI bound to snapshot.brain and brain_digest with search filtering, introduces Agents/Flows placeholder domains gated by config endpoints, adds approvals empty-state CTA, and makes select rows clickable (fleet exec, herdr focus agent, share sync, linear open issue, secrets actions).

src/panel/domains.rs

mod.rsAdd overlay scrim + pass-through sync and recolor icons on theme change +23/-6

Add overlay scrim + pass-through sync and recolor icons on theme change

• Integrates overlay scrim into the window overlay, binds pass-through behavior based on overlay visibility, triggers icon recolor on theme toggle, and updates domain rendering to pass OpsSnapshot.

src/panel/mod.rs

overlay.rsAdd palette scrim, host binding, and glyphs in results +113/-71

Add palette scrim, host binding, and glyphs in results

• Introduces a full-window scrim that dismisses the palette on click, manages overlay pass-through via host binding, updates copy, and adds Lucide glyphs + keyboard hint chips per action row.

src/panel/overlay.rs

zones.rsAdd caps helper, clickable rows, and richer empty states +43/-8

Add caps helper, clickable rows, and richer empty states

• Centralizes uppercase/caps handling, introduces a reusable clickable_row for binding RunSpec actions, adds empty_state_cta, and tweaks section/bucket styling behavior for Signaal v2 chrome.

src/panel/zones.rs

Refactor (6) +847 / -974
css.rsRework Signaal v2 CSS + expose theme-derived colors/heading attrs +736/-794

Rework Signaal v2 CSS + expose theme-derived colors/heading attrs

• Major refactor of the GTK3 CSS builder to align with design-system tokens and add helper APIs (ink/canvas/muted/accent hex and heading letter-spacing attrs) used by the new icon and typography system.

src/css.rs

lib.rsExport icons module +1/-0

Export icons module

• Exposes the new icons module from the crate root for panel components to use.

src/lib.rs

motion.rsAdjust motion timings and simplify timing tests +13/-36

Adjust motion timings and simplify timing tests

• Revises animation timing constants (including drawer/overlay) and updates tests to assert the current Signaal v2 timing expectations.

src/motion.rs

drawer.rsUpdate drawer motion handling and iconography +9/-7

Update drawer motion handling and iconography

• Uses motion_enabled to disable transitions when needed, tightens spacing/copy, applies heading attrs, and switches close icon to Lucide.

src/panel/drawer.rs

header.rsUpdate header copy and replace system icons with Lucide +14/-87

Update header copy and replace system icons with Lucide

• Simplifies header logic, applies shared heading attrs, updates search placeholder/tooltips, and swaps refresh/minimize/close icons to Lucide pixbufs.

src/panel/header.rs

sidebar.rsRebuild nav rows with Lucide tiles and safe count updates +74/-50

Rebuild nav rows with Lucide tiles and safe count updates

• Adds Agents/Flows/Brain to navigation, updates labels/title to ChefApp, renders each nav item with an icon tile + separate count label, and provides a set_nav_caption helper to update counts without destroying icon children.

src/panel/sidebar.rs

Documentation (5) +23 / -10
SKILL.mdRefresh agent skill doc links/metadata +2/-2

Refresh agent skill doc links/metadata

• Small edits to the Chefbar GTK panel skill documentation to reflect the current guidance for the Signaal v2 mirror work.

.agents/skills/chefbar-gtk-panel/SKILL.md

invariants.mdTighten invariants for GTK panel mirror +1/-1

Tighten invariants for GTK panel mirror

• Updates invariant wording to match current constraints (single window/snapshot-driven UI, no extra polling).

.agents/skills/chefbar-gtk-panel/references/invariants.md

chefbar-gtk-panel.mdSync Cursor agent notes +1/-1

Sync Cursor agent notes

• Minor update to the Cursor agent doc for the GTK panel, keeping instructions consistent with the PR’s direction.

.cursor/agents/chefbar-gtk-panel.md

chefapp-qa.mdUpdate QA checklist for Signaal v2 UI +18/-5

Update QA checklist for Signaal v2 UI

• Expands QA notes to cover the new visual system (palette/overlay/scrim/icons/theme switching) and Brain UI expectations.

docs/chefapp-qa.md

plan-full-chefapp.mdRefresh ChefApp plan reference +1/-1

Refresh ChefApp plan reference

• Small plan tweak to match the current execution path for ChefApp visual parity work.

docs/plan-full-chefapp.md

Other (9) +130 / -5
evals.jsonUpdate eval configuration reference +1/-1

Update eval configuration reference

• Minor adjustment to eval JSON so local/agent checks align with the updated panel behavior.

.agents/skills/chefbar-gtk-panel/evals/evals.json

chefbar-gtk-css.mdcAdjust Cursor CSS rule hints for Signaal v2 +2/-2

Adjust Cursor CSS rule hints for Signaal v2

• Tweaks editor rules to reflect the updated GTK3 CSS/token approach and constraints.

.cursor/rules/chefbar-gtk-css.mdc

design-system.jsonAdd/extend design-system metadata for Signaal v2 +11/-0

Add/extend design-system metadata for Signaal v2

• Adds design-system metadata used to track/designate the Signaal v2 skin and token usage in this repo.

.github/design-system.json

Cargo.tomlWire dependencies needed for icon rendering +1/-0

Wire dependencies needed for icon rendering

• Updates crate configuration to support new Lucide SVG-to-pixbuf icon rendering used across the GTK UI.

Cargo.toml

design-tokens.snapshot.cssSnapshot Signaal v2 design tokens +48/-0

Snapshot Signaal v2 design tokens

• Adds a snapshot CSS file containing the design-system tokens used to keep ChefApp’s styling aligned with Signaal v2.

assets/design-tokens.snapshot.css

fonts-signaal.confAdd fontconfig setup for Signaal fonts +19/-0

Add fontconfig setup for Signaal fonts

• Introduces font configuration to ensure the Signaal/General Sans + mono typography is available for the GTK UI.

config/fonts-signaal.conf

install.shInstall flow for tokens/fonts and visual assets +22/-0

Install flow for tokens/fonts and visual assets

• Adds installation steps to provision design tokens/fonts and related assets so the Signaal v2 mirror runs locally.

install.sh

visual-shot.shAdjust visual snapshot script for new chrome +2/-2

Adjust visual snapshot script for new chrome

• Updates the screenshot/visual-shot helper script to match the revised UI layout and token-driven styling.

scripts/visual-shot.sh

config.rsAdd Agents/Flows endpoint configuration +24/-0

Add Agents/Flows endpoint configuration

• Extends endpoint profile to include agents_api and flows_api, loads from CHEFBAR_AGENTS_API/CHEFBAR_FLOWS_API, and updates tests and URL enumeration.

src/config.rs

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Devin Review found 3 potential issues.

Open in Devin Review

Comment thread src/icons.rs
Comment on lines +200 to +207
LIVE.with(|live| {
live.borrow_mut().push(LiveIcon {
image: image.downgrade(),
name: name.to_string(),
px,
kind,
});
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Icon registry grows without bound

Every icon built through from_kind is appended to the thread-local LIVE list, which is pruned only inside recolor_all on a theme toggle. Icons are rebuilt continuously at runtime — image_muted runs once per palette result on every keystroke while the palette is open (overlay.rs render_actions) — so dead entries accumulate between toggles and memory grows for the life of the process.

Prompt for agents
The thread-local LIVE vector in src/icons.rs accumulates a LiveIcon entry on every from_kind call but is only pruned inside recolor_all (called on theme toggle). Icons are created repeatedly at runtime, e.g. image_muted for each palette row in src/panel/overlay.rs render_actions on every keystroke, so the vector grows without bound between theme switches. Consider pruning dead weak-refs (retain with image.upgrade().is_some()) when pushing a new entry, or capping/compacting the vector periodically, so stale entries do not accumulate for the lifetime of the process.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread src/icons.rs
Comment on lines +1 to +3
//! Lucide-stroke icons for ChefApp (GTK3 pixbuf, no emoji, no Adwaita).
//!
//! SVGs use `currentColor`; [`image`] substitutes the active Signaal ink.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 New module comment written in English, not Dutch

The rule in .cursor/rules/chefbar-rust.mdc requires module comments to stay Dutch while identifiers stay English. The new module's //! doc comment is in English, unlike the rest of the crate.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread docs/chefapp-qa.md
- [ ] `chefbar --ipc "state offline"` → offline-glyph; na 10 s terug naar live
- [ ] Statuslijn max 5 live regels + profielregel; nieuwste eerst binnen priority-groep
- [ ] Menu-items werken: FocusDomain / Pause / Doctor / Quit (geen Open Thuis/Ploeg, geen desktop start/stop)
- [ ] Menu-items werken: FocusDomain / Open Thuis / Pause / Doctor / Quit

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔍 QA checklist adds a tray item the code may not provide

docs/chefapp-qa.md:51 changes the tray menu expectation to include 'Open Thuis', but tray.rs is untouched in this PR. If the tray does not actually expose that item, the manual QA gate will assert against nonexistent behavior. Worth verifying against the tray menu.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@MisterWanted

Copy link
Copy Markdown
Contributor Author

Sluiten als superseded: dit is de ruwe pre-review variant van GRO-1425. Hetzelfde werk (Signaal v2 mirror + Brain UI op vault BrainResponse) is op 2026-08-20 gemerged via #58 (c79ae452), inclusief elf review-fix commits (P0/P1 correctness, LIVE prune, DomainRenderCtx, linear.app routing) die deze branch mist. Branch is bovendien dirty t.o.v. main. Geen unieke wijzigingen om te redden.

Comment thread src/css.rs
Comment on lines 323 to +324
.chefbar-gbtn:focus {{
border: 1px solid {accent};
box-shadow: 0 0 0 3px {accent_soft};
box-shadow: 0 0 0 2px {accent};

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Action required

1. box-shadow emitted in css 📜 Skill insight ≡ Correctness

src/css.rs now emits non-none box-shadow declarations (e.g., focus rings), which the policy
forbids in generated GTK3 CSS. This can lead to GTK3-incompatible styling and violates the project's
CSS emission constraints.
Agent Prompt
## Issue description
`src/css.rs` generates CSS containing non-`none` `box-shadow` (e.g., focus rings). Compliance requires that emitted CSS contains **no** `box-shadow` values other than `none`.

## Issue Context
The generated CSS is consumed by GTK3. This repo’s compliance policy explicitly forbids `box-shadow` (any non-`none` value), along with other disallowed CSS constructs.

## Fix Focus Areas
- src/css.rs[323-348]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread src/icons.rs
Comment on lines +1 to +3
//! Lucide-stroke icons for ChefApp (GTK3 pixbuf, no emoji, no Adwaita).
//!
//! SVGs use `currentColor`; [`image`] substitutes the active Signaal ink.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Remediation recommended

3. English //! in icons.rs 📘 Rule violation ⚙ Maintainability

src/icons.rs module-level doc comments are written in English instead of Dutch. This violates the
requirement that module comments must be in Dutch.
Agent Prompt
## Issue description
Module-level doc comments in `src/icons.rs` are in English, but they must be in Dutch.

## Issue Context
Only module-level doc comments (`//!` or `///` on `mod`) must be Dutch; identifiers should remain English.

## Fix Focus Areas
- src/icons.rs[1-3]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread src/css.rs
Comment on lines +6 to +9
//! Light-first warm off-white canvas, donker basalt-warm met volledige
//! pariteit, één accent, General Sans interface + IBM Plex Mono data,
//! radius 6 / 10 / 200. Scheiding via hairlines. De 2px verticale streep
//! is de v2 worked-row-streep (line-strong in rust, accent tijdens een run).

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Remediation recommended

4. English //! in css.rs 📘 Rule violation ⚙ Maintainability

src/css.rs module-level doc comments include English sentences. This violates the requirement that
module comments must be in Dutch.
Agent Prompt
## Issue description
Module-level doc comments in `src/css.rs` contain English text and must be Dutch.

## Issue Context
This rule applies to module-level doc comments (`//!`).

## Fix Focus Areas
- src/css.rs[6-10]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread src/icons.rs
const SVG_HEAD: &str = r#"<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round">"#;
const SVG_TAIL: &str = "</svg>";

pub fn svg_body(name: &str) -> &'static str {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Remediation recommended

5. svg_body missing doc comment 📜 Skill insight ✧ Quality

src/icons.rs introduces public functions like pub fn svg_body(...) without /// doc comments.
This violates the requirement that public API items must be documented.
Agent Prompt
## Issue description
Public functions were added without Rust doc comments (`///`).

## Issue Context
All public functions/structs/enums/constants must have `///` doc comments.

## Fix Focus Areas
- src/icons.rs[13-21]
- src/icons.rs[83-118]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread src/panel/domains.rs
Comment on lines +117 to +120
.map(|excerpt| excerpt.to_lowercase().contains(&needle))
.unwrap_or(false)
})
.collect();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Remediation recommended

7. Unnecessary .collect() for chunks 📜 Skill insight ➹ Performance

src/panel/domains.rs collects an iterator into a Vec (chunks) only to check emptiness and then
iterate it. This creates an avoidable intermediate allocation; a peekable() iterator (or similar)
can be used instead.
Agent Prompt
## Issue description
The code builds an iterator over `digest.chunks` and immediately `.collect()`s into a `Vec` before consuming it, creating an intermediate allocation.

## Issue Context
Prefer passing/consuming iterators directly when possible (e.g., using `peekable()` to test emptiness, then `take(MAX_ROWS)` to render).

## Fix Focus Areas
- src/panel/domains.rs[105-154]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread src/panel/domains.rs
HarnessKind::Flows => render_flows(content),
HarnessKind::Secrets => render_secrets(content, snap, q, executor),
HarnessKind::Kater => render_kater(content, snap, q),
HarnessKind::Brain => render_brain(content, snap, q, executor),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Remediation recommended

8. Brain action opens health 🐞 Bug ≡ Correctness

The new dedicated Brain domain is rendered at HarnessKind::Brain, but the existing Brain snapshot
palette action still emits FocusDomain("health"). Clicking that Brain result therefore opens the
Health view instead of the Brain UI added by this PR.
Agent Prompt
## Issue description
The dedicated Brain domain was added, but the Brain snapshot palette action still targets the Health domain.

## Issue Context
Update the Brain action's `FocusDomain` target to the canonical new `brain` harness ID and add a regression assertion for its action target.

## Fix Focus Areas
- src/actions.rs[733-744]
- src/panel/domains.rs[61-61]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread scripts/visual-shot.sh
Comment on lines +31 to +32
inbox tasks linear agents flows fleet herdr vault commerce crm share clipboard
desktop containers secrets kater brain health

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Remediation recommended

9. Visual matrix count is wrong 🐞 Bug ◔ Observability

The changed DOMAINS list now contains 18 entries, but successful all-domains and all runs
still report 15 domains and the QA matrix documents fifteen shots. This makes visual-QA logs and
expected artifact counts disagree with the 18 PNGs actually produced.
Agent Prompt
## Issue description
The visual runner executes 18 domains but its success output and QA documentation still claim 15.

## Issue Context
Derive the displayed count from `${#DOMAINS[@]}` so future additions remain accurate, and update the visual-matrix documentation to match the expanded set.

## Fix Focus Areas
- scripts/visual-shot.sh[30-32]
- scripts/visual-shot.sh[353-387]
- docs/chefapp-qa.md[121-130]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread src/panel/domains.rs
Comment on lines +1242 to +1246
if !issue.id.is_empty() {
let target = issue.url.clone().unwrap_or_else(|| issue.id.clone());
let executor = executor.clone();
row_btn.connect_clicked(move |_| {
executor.run_for_ui(&crate::actions::RunSpec::OpenUrl(url.clone()));
executor.run_for_ui(&crate::actions::RunSpec::OpenLinearIssue(target.clone()));

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Action required

10. Linear links are double-wrapped 🐞 Bug ≡ Correctness

Rows with an existing Linear URL pass that URL to OpenLinearIssue, which treats it as an issue ID
and appends its URL-encoded form to the dashboard /linear/ route. Clicking such a row opens a
malformed dashboard path instead of the actual issue URL.
Agent Prompt
## Issue description
Linear rows must preserve a supplied issue URL instead of treating it as an issue ID that gets URL-encoded into a dashboard path.

## Issue Context
`RunSpec::OpenLinearIssue(issue_id)` always builds `{dashboard}/linear/{urlencoding(issue_id)}`. The changed renderer feeds `issue.url` into this action when it is present.

## Fix Focus Areas
- src/panel/domains.rs[1242-1246]
- src/actions.rs[1214-1221]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread src/icons.rs
Comment on lines +200 to +207
LIVE.with(|live| {
live.borrow_mut().push(LiveIcon {
image: image.downgrade(),
name: name.to_string(),
px,
kind,
});
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Remediation recommended

11. Icon registry grows unbounded 🐞 Bug ➹ Performance

Each dynamically created icon is retained as a LiveIcon entry, while dropped weak references are
pruned only during a theme switch. Palette search rebuilds action glyphs on every keystroke, so
normal searching accumulates stale entries for the process lifetime and makes a later recolor
iterate them all.
Agent Prompt
## Issue description
The live-icon registry retains stale entries after transient palette icon widgets are removed.

## Issue Context
`from_kind` pushes an entry for every image, but cleanup occurs only in `recolor_all`. Palette results are rebuilt whenever its search entry changes.

## Fix Focus Areas
- src/icons.rs[200-207]
- src/icons.rs[234-247]
- src/panel/overlay.rs[152-169]
- src/panel/mod.rs[558-580]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants