Dashboard: honest embeddings state, pollinating→settings, honeycomb→hive rebrand#16
Conversation
… icons, tab title)
The dashboard is the fleet's front door and is named "hive", so the chrome now
reflects that:
- Serve the brand mark at /hive-mark.svg (was /honeycomb-memory-cluster.svg) and
render the hive mark + "hive" wordmark in the sidebar; update the setup / first-run
/ migration screens and the gate's static-asset exemption to match.
- Set the per-route tab title to `hive · <label>` (was `honeycomb · <label>`).
- The rebrand repurposed the top-level logo route to the hive mark, which had left
the "Honeycomb" PRODUCT icon (onboarding / buzzing fleet list) pointing at an
unserved path. Add assets/brand/honeycomb-mark.svg and serve every product mark
from the consistent /assets/brand/<name>-mark.svg route, and point the two hero
marks ("Waiting for the hive…", "Bringing the fleet up green") at the hive mark.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…dashboard The Embeddings toggle "did nothing" because /health reported the coarse `reasons.embeddings` from the enabled flag alone — so it read "on" even while the model was still downloading or had failed to load, giving no real feedback. The daemon now emits an additive `reasons.embeddingsState` (off | warming | on | failed); the settings toggle renders it truthfully (shows "warming…" and polls to completion, "failed" when the model can't load) and the health strip's `semantic` chip is honest. The wire schema adds the field with `.optional().catch(undefined)` so a pre-honesty daemon or a bad value degrades to the coarse field, never a throw. Also remove the duplicate provider/model/pollinating SettingsPanel from the home: turning pollinating on is a settings action, and the panel was rendered verbatim on both the dashboard and the Settings page. It now lives only on Settings. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
📝 WalkthroughWalkthroughThis PR rebrands the product's SVG mark from honeycomb-memory-cluster to hive-mark across daemon asset serving, gate bypass paths, dashboard shell, and onboarding screens. Separately, it adds an ChangesHive Logo Rebrand
Embeddings Honesty State
Estimated code review effort: 3 (Moderate) | ~25 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (3)
src/dashboard/web/pages/settings.tsx (1)
573-652: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winNo test coverage for the new embeddings state machine.
The wire schema layer has dedicated tests (
health-embeddings-state.test.ts), but the richer UI behavior here — warming→on/failed polling, toggle intent flip, health-load fallback tooffon error — has no accompanying test in the provided files. This is the more behaviorally complex half of the honesty feature.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/dashboard/web/pages/settings.tsx` around lines 573 - 652, Add UI tests for EmbeddingsSection to cover the new state machine behavior. Verify that load() falls back to "off" when wire.health() rejects, that the warming state starts polling and advances via embeddingsView/load, and that toggle() flips intent correctly (on→warming, off→off) while re-reading health afterward. Use the EmbeddingsSection, load, toggle, and embeddingsView symbols to locate the behavior and mirror the existing health-embeddings-state.test.ts style.src/dashboard/web/onboarding/health-view.tsx (1)
42-48: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winSame dead
assetBaseparam asbuzzing-screen.tsx.This duplicate
whileYouWaitEntries(assetBase: string)also no longer readsassetBasein its body. Same fix as flagged inbuzzing-screen.tsxapplies here for consistency withproduct-copy.ts's_assetBasetreatment.♻️ Proposed fix
-function whileYouWaitEntries(assetBase: string): readonly WhileYouWaitEntry[] { +function whileYouWaitEntries(): readonly WhileYouWaitEntry[] {🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/dashboard/web/onboarding/health-view.tsx` around lines 42 - 48, The whileYouWaitEntries function still takes an assetBase parameter but does not use it, so update the signature to match the same dead-parameter cleanup used in buzzing-screen.tsx and the _assetBase pattern in product-copy.ts. Remove or rename the unused assetBase parameter in whileYouWaitEntries, and keep the function body unchanged since it no longer depends on that value.src/dashboard/web/buzzing-screen.tsx (1)
152-159: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low valueRemove the unused
assetBaseplumbing here.whileYouWaitEntriesignores its parameter, soWhileYouWaitandBuzzingScreenonly forward it through; dropping it from this path would simplify the component chain.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/dashboard/web/buzzing-screen.tsx` around lines 152 - 159, Remove the unused assetBase parameter from whileYouWaitEntries since it is never read, and update the call chain so WhileYouWait and BuzzingScreen no longer accept or forward it. Keep the data returned by whileYouWaitEntries unchanged, and adjust the function signatures and call sites to use only the values actually needed.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/dashboard/web/pages/settings.tsx`:
- Around line 596-602: The warming poll in the settings page only checks tab
visibility once when the interval is created, so it can keep calling load() even
after the tab becomes hidden. Update the React.useEffect for the warming state
to re-check isTabHidden() inside the interval callback on every tick, following
the pattern used by DeeplakeAuthSection’s AUTH_POLL, and keep the cleanup logic
unchanged.
---
Nitpick comments:
In `@src/dashboard/web/buzzing-screen.tsx`:
- Around line 152-159: Remove the unused assetBase parameter from
whileYouWaitEntries since it is never read, and update the call chain so
WhileYouWait and BuzzingScreen no longer accept or forward it. Keep the data
returned by whileYouWaitEntries unchanged, and adjust the function signatures
and call sites to use only the values actually needed.
In `@src/dashboard/web/onboarding/health-view.tsx`:
- Around line 42-48: The whileYouWaitEntries function still takes an assetBase
parameter but does not use it, so update the signature to match the same
dead-parameter cleanup used in buzzing-screen.tsx and the _assetBase pattern in
product-copy.ts. Remove or rename the unused assetBase parameter in
whileYouWaitEntries, and keep the function body unchanged since it no longer
depends on that value.
In `@src/dashboard/web/pages/settings.tsx`:
- Around line 573-652: Add UI tests for EmbeddingsSection to cover the new state
machine behavior. Verify that load() falls back to "off" when wire.health()
rejects, that the warming state starts polling and advances via
embeddingsView/load, and that toggle() flips intent correctly (on→warming,
off→off) while re-reading health afterward. Use the EmbeddingsSection, load,
toggle, and embeddingsView symbols to locate the behavior and mirror the
existing health-embeddings-state.test.ts style.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 487c742e-9374-4d05-8df5-72a679da907a
⛔ Files ignored due to path filters (2)
assets/brand/honeycomb-mark.svgis excluded by!**/*.svgassets/logos/hive-mark.svgis excluded by!**/*.svg
📒 Files selected for processing (15)
src/daemon/dashboard/host.tssrc/daemon/dashboard/web-assets.tssrc/daemon/gate.tssrc/dashboard/web/app.tsxsrc/dashboard/web/buzzing-screen.tsxsrc/dashboard/web/needs-project.tsxsrc/dashboard/web/onboarding/health-view.tsxsrc/dashboard/web/onboarding/product-copy.tssrc/dashboard/web/pages/dashboard.tsxsrc/dashboard/web/pages/settings.tsxsrc/dashboard/web/setup-gate.tsxsrc/dashboard/web/sidebar.tsxsrc/dashboard/web/wire.tstests/dashboard/host.test.tstests/wire/health-embeddings-state.test.ts
| // While warming, re-poll `/health` so the badge advances to "on"/"failed" without a manual refresh. | ||
| React.useEffect(() => { | ||
| if (state !== "warming") return; | ||
| if (isTabHidden()) return; | ||
| const id = setInterval(() => void load(), EMBED_WARMING_POLL_MS); | ||
| return () => clearInterval(id); | ||
| }, [state, load]); |
There was a problem hiding this comment.
🚀 Performance & Scalability | 🟡 Minor | ⚡ Quick win
Warming poll doesn't re-check tab visibility per tick.
isTabHidden() is only evaluated once, when the effect (re)creates the interval. If the tab is visible when warming starts and is then backgrounded, load() keeps firing every 2.5s regardless — the docstring at Line 570 promises the poll "respects hidden tabs," but only the initial state is gated. Compare with DeeplakeAuthSection's AUTH_POLL (this same file, Lines 188-203), which re-checks isTabHidden() inside the tick callback on every fire.
🔧 Proposed fix — check visibility inside the tick
React.useEffect(() => {
if (state !== "warming") return;
- if (isTabHidden()) return;
- const id = setInterval(() => void load(), EMBED_WARMING_POLL_MS);
+ const tick = (): void => {
+ if (isTabHidden()) return;
+ void load();
+ };
+ const id = setInterval(tick, EMBED_WARMING_POLL_MS);
return () => clearInterval(id);
}, [state, load]);📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| // While warming, re-poll `/health` so the badge advances to "on"/"failed" without a manual refresh. | |
| React.useEffect(() => { | |
| if (state !== "warming") return; | |
| if (isTabHidden()) return; | |
| const id = setInterval(() => void load(), EMBED_WARMING_POLL_MS); | |
| return () => clearInterval(id); | |
| }, [state, load]); | |
| // While warming, re-poll `/health` so the badge advances to "on"/"failed" without a manual refresh. | |
| React.useEffect(() => { | |
| if (state !== "warming") return; | |
| const tick = (): void => { | |
| if (isTabHidden()) return; | |
| void load(); | |
| }; | |
| const id = setInterval(tick, EMBED_WARMING_POLL_MS); | |
| return () => clearInterval(id); | |
| }, [state, load]); |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/dashboard/web/pages/settings.tsx` around lines 596 - 602, The warming
poll in the settings page only checks tab visibility once when the interval is
created, so it can keep calling load() even after the tab becomes hidden. Update
the React.useEffect for the warming state to re-check isTabHidden() inside the
interval callback on every tick, following the pattern used by
DeeplakeAuthSection’s AUTH_POLL, and keep the cleanup logic unchanged.
Three related dashboard changes shipping together.
1. Honest embeddings state (pairs with honeycomb#242)
The Embeddings toggle "did nothing" because
/healthreported the coarsereasons.embeddingsfrom the enabled flag alone — so it read "on" even while the model was downloading or had failed to load. The daemon now emits an additivereasons.embeddingsState(off | warming | on | failed):semanticchip is honest (up only when actually warm)..optional().catch(undefined), so a pre-honesty daemon or a bad value degrades to the coarse field, never a throw.2. Pollinating off the dashboard
The provider/model/pollinating
SettingsPanelwas rendered verbatim on both the home and the Settings page. Turning pollinating on is a settings action — removed the duplicate from the home; it lives only on Settings now.3. honeycomb → hive rebrand
The dashboard is the fleet's front door and is named "hive":
/hive-mark.svg; sidebar shows the hive mark + "hive" wordmark; setup / first-run / migration screens updated; tab title is nowhive · <label>.assets/brand/honeycomb-mark.svgand served every product mark from the consistent/assets/brand/<name>-mark.svgroute; the two hero marks now use the hive mark.Tests
HealthReasonsSchemaembeddingsStatetests (parse, optional fallback, catch-to-undefined).main).🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Bug Fixes