Skip to content

Dashboard: honest embeddings state, pollinating→settings, honeycomb→hive rebrand#16

Merged
thenotoriousllama merged 2 commits into
mainfrom
dashboard-embeddings-honesty-and-hive-rebrand
Jul 5, 2026
Merged

Dashboard: honest embeddings state, pollinating→settings, honeycomb→hive rebrand#16
thenotoriousllama merged 2 commits into
mainfrom
dashboard-embeddings-honesty-and-hive-rebrand

Conversation

@thenotoriousllama

@thenotoriousllama thenotoriousllama commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

Three related dashboard changes shipping together.

1. Honest embeddings state (pairs with honeycomb#242)

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 downloading or had failed to load. 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 — instead of a dead flip.
  • The dashboard health strip's semantic chip is honest (up only when actually warm).
  • 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.

2. Pollinating off the dashboard

The provider/model/pollinating SettingsPanel was 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":

  • Brand mark served at /hive-mark.svg; sidebar shows the hive mark + "hive" wordmark; setup / first-run / migration screens updated; tab title is now hive · <label>.
  • The rebrand repurposed the top-level logo route, which had left the Honeycomb product icon (onboarding/buzzing) on an unserved path → added assets/brand/honeycomb-mark.svg and served every product mark from the consistent /assets/brand/<name>-mark.svg route; the two hero marks now use the hive mark.

Tests

  • New HealthReasonsSchema embeddingsState tests (parse, optional fallback, catch-to-undefined).
  • Host/onboarding/buzzing suites green. Full suite: 556 passed (2 pre-existing flaky funnel-telemetry failures, confirmed on clean main).

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added a more detailed embeddings status on the Settings page, including warming and failed states with automatic refresh while warming.
    • Updated dashboard branding across the app to use the new Hive logo and wordmark.
  • Bug Fixes

    • Improved health/status display so subsystem indicators show more accurate labels instead of generic values.
    • Updated setup and onboarding screens to match the new branding consistently.

thenotoriousllama and others added 2 commits July 5, 2026 13:17
… 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>
@coderabbitai

coderabbitai Bot commented Jul 5, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

This 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 embeddingsState field to health schema, a richer embeddings toggle state machine in settings, and removes the dashboard's inline settings panel/vault state wiring.

Changes

Hive Logo Rebrand

Layer / File(s) Summary
Daemon asset serving and gate allowlist
src/daemon/dashboard/host.ts, src/daemon/dashboard/web-assets.ts, src/daemon/gate.ts, tests/dashboard/host.test.ts
DASHBOARD_LOGO_PATH, LOGO_FILE, route docs, gate exempt paths, and the host test all now reference /hive-mark.svg.
Dashboard shell and sidebar branding
src/dashboard/web/app.tsx, src/dashboard/web/sidebar.tsx
Document title prefix and sidebar wordmark/logo switch from "honeycomb" to "hive".
Onboarding and setup screen branding
src/dashboard/web/buzzing-screen.tsx, src/dashboard/web/needs-project.tsx, src/dashboard/web/onboarding/health-view.tsx, src/dashboard/web/onboarding/product-copy.ts, src/dashboard/web/setup-gate.tsx
Brand images switch to fixed /assets/brand/* paths and hive-mark.svg; copy adjusted from "Honeycomb" to "Hive".

Embeddings Honesty State

Layer / File(s) Summary
Health schema embeddingsState contract
src/dashboard/web/wire.ts, tests/wire/health-embeddings-state.test.ts
Adds optional embeddingsState enum (off/warming/on/failed) to HealthReasonsSchema with fail-soft parsing, and adds tests covering valid, missing, and invalid values.
Settings page embeddings state machine
src/dashboard/web/pages/settings.tsx
Introduces EmbeddingsState, warming poll loop, embeddingsView mapper, and updated toggle/badge/hint logic reflecting the richer state.
Dashboard health strip and settings panel removal
src/dashboard/web/pages/dashboard.tsx
Reworks semantic chip to use embeddingsState, removes vault settings/secret-name state, fetching, and persistence wiring, and drops inline SettingsPanel rendering.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

  • legioncodeinc/hive#5: Both PRs touch src/daemon/dashboard/host.ts and src/daemon/gate.ts for asset/gate routing.
  • legioncodeinc/hive#11: Both PRs modify the same asset-serving and gate allowlist paths (host.ts, web-assets.ts, gate.ts) for brand SVG routing.

Poem

A honeycomb once held the crown,
now a hive-mark wears the gown 🐝
embeddings warm, then settle "on",
settings panel — gently gone.
Hop along, the brand shines new,
one small rabbit cheers for you!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the three main changes: embeddings honesty, moving pollinating to settings, and the hive rebrand.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dashboard-embeddings-honesty-and-hive-rebrand

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

@thenotoriousllama thenotoriousllama merged commit 0de46bb into main Jul 5, 2026
3 of 4 checks passed
@thenotoriousllama thenotoriousllama deleted the dashboard-embeddings-honesty-and-hive-rebrand branch July 5, 2026 17:21

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (3)
src/dashboard/web/pages/settings.tsx (1)

573-652: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

No 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 to off on 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 win

Same dead assetBase param as buzzing-screen.tsx.

This duplicate whileYouWaitEntries(assetBase: string) also no longer reads assetBase in its body. Same fix as flagged in buzzing-screen.tsx applies here for consistency with product-copy.ts's _assetBase treatment.

♻️ 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 value

Remove the unused assetBase plumbing here. whileYouWaitEntries ignores its parameter, so WhileYouWait and BuzzingScreen only 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

📥 Commits

Reviewing files that changed from the base of the PR and between 634b82b and 1774859.

⛔ Files ignored due to path filters (2)
  • assets/brand/honeycomb-mark.svg is excluded by !**/*.svg
  • assets/logos/hive-mark.svg is excluded by !**/*.svg
📒 Files selected for processing (15)
  • src/daemon/dashboard/host.ts
  • src/daemon/dashboard/web-assets.ts
  • src/daemon/gate.ts
  • src/dashboard/web/app.tsx
  • src/dashboard/web/buzzing-screen.tsx
  • src/dashboard/web/needs-project.tsx
  • src/dashboard/web/onboarding/health-view.tsx
  • src/dashboard/web/onboarding/product-copy.ts
  • src/dashboard/web/pages/dashboard.tsx
  • src/dashboard/web/pages/settings.tsx
  • src/dashboard/web/setup-gate.tsx
  • src/dashboard/web/sidebar.tsx
  • src/dashboard/web/wire.ts
  • tests/dashboard/host.test.ts
  • tests/wire/health-embeddings-state.test.ts

Comment on lines +596 to +602
// 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]);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🚀 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.

Suggested change
// 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.

Sign up for free to 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.

1 participant