feat: Signaal v2 visual craft + Brain UI op vault BrainResponse (GRO-1425) - #59
feat: Signaal v2 visual craft + Brain UI op vault BrainResponse (GRO-1425)#59MisterWanted wants to merge 2 commits into
Conversation
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.
|
ⓘ Your Qodo trial ends soon. Ask your workspace admin to set up billing to keep reviews running after the trial. Manage billing |
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 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. Comment |
PR Summary by QodoSignaal v2 visual craft mirror + Brain UI bound to vault BrainResponse
AI Description
Diagram
High-Level Assessment
Files changed (28)
|
| LIVE.with(|live| { | ||
| live.borrow_mut().push(LiveIcon { | ||
| image: image.downgrade(), | ||
| name: name.to_string(), | ||
| px, | ||
| kind, | ||
| }); | ||
| }); |
There was a problem hiding this comment.
🟡 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.
Was this helpful? React with 👍 or 👎 to provide feedback.
| //! Lucide-stroke icons for ChefApp (GTK3 pixbuf, no emoji, no Adwaita). | ||
| //! | ||
| //! SVGs use `currentColor`; [`image`] substitutes the active Signaal ink. |
There was a problem hiding this comment.
| - [ ] `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 |
There was a problem hiding this comment.
🔍 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.
Was this helpful? React with 👍 or 👎 to provide feedback.
|
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 ( |
| .chefbar-gbtn:focus {{ | ||
| border: 1px solid {accent}; | ||
| box-shadow: 0 0 0 3px {accent_soft}; | ||
| box-shadow: 0 0 0 2px {accent}; |
There was a problem hiding this comment.
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
| //! Lucide-stroke icons for ChefApp (GTK3 pixbuf, no emoji, no Adwaita). | ||
| //! | ||
| //! SVGs use `currentColor`; [`image`] substitutes the active Signaal ink. |
There was a problem hiding this comment.
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
| //! 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). |
There was a problem hiding this comment.
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
| 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 { |
There was a problem hiding this comment.
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
| .map(|excerpt| excerpt.to_lowercase().contains(&needle)) | ||
| .unwrap_or(false) | ||
| }) | ||
| .collect(); |
There was a problem hiding this comment.
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
| 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), |
There was a problem hiding this comment.
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
| inbox tasks linear agents flows fleet herdr vault commerce crm share clipboard | ||
| desktop containers secrets kater brain health |
There was a problem hiding this comment.
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
| 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())); |
There was a problem hiding this comment.
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
| LIVE.with(|live| { | ||
| live.borrow_mut().push(LiveIcon { | ||
| image: image.downgrade(), | ||
| name: name.to_string(), | ||
| px, | ||
| kind, | ||
| }); | ||
| }); |
There was a problem hiding this comment.
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
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.