Fix broadcast model switching: skip /model when model names are empty#1
Merged
Fix broadcast model switching: skip /model when model names are empty#1
Conversation
…are empty The callers of BroadcastCheckIn and SingleAgentCheckIn always pass empty strings for checkModel and workModel, causing '/model ' (with no model name) to be sent to agents. This resulted in broken model switch attempts that would time out or fail. Now when checkModel/workModel are empty, the model switch steps are skipped entirely and the check-in runs on whatever model the agent is already using. Model economy still works if actual model names are passed.
jsell-rh
added a commit
that referenced
this pull request
Mar 12, 2026
… audio palette complete audio-sme idea #5 (Agent Moods): - playAgentMoodActive(name): ascending root→fifth — agent 'waking up' - playAgentMoodIdle(name): descending fifth→root — agent 'settling down' - Wired in agent_updated SSE via prevStatus captured before in-place patch - Fixes prevStatus capture bug (was reading post-patch, now pre-patch) audio-sme idea #4 (Boss Level): - playSuccess(priority?) now accepts priority — critical tasks get an ascending C5→G5→C6 lead-in run before the chord, theme-aware - KanbanView wires priority on both local drag-drop and remote SSE task_updated audio-sme idea #7 (Heartbeat Mode): - playAgentTick(name): 3ms pentatonic micro-tone at agent's signature freq instead of uniform white noise burst — active fleets sound like a chord - Replaces playActivityTick() in agent_updated handler (still gated by activityTickEnabled) All 12 audio-sme ideas now accounted for: Implemented: #2 #3 #4 #5 #6 #7 #8 #9 #10 #11 #12 Architecture only (#1 Alert Taxonomy already fulfilled by category system)
jsell-rh
added a commit
that referenced
this pull request
Mar 12, 2026
…beat, control center (#182) * feat(gamification): status pulse rings + event feed stagger + spec update Status pulse animations (StatusBadge.vue): - active: already had ping dot (unchanged) - idle: slow breathe animation (opacity 1.0↔0.45, 3s ease-in-out) - blocked/error: subtle jitter (±1.5px translateX, 0.4s loop) - done: no animation — calm green glow (static) - prefers-reduced-motion: all animations disabled Event feed stagger (EventLog.vue): - New rows slide in from slightly above (translateY -5px → 0, 0.18s) - animation-fill-mode: both keeps initial state before start - prefers-reduced-motion: disabled - Works on DOM insertion — no re-animation on filter/re-render Spec update (gamification.md): - Mark 1.2 (sounds) and 2.2 (all-agents-idle) as implemented - Add 2.3 agent status pulse rings (now implemented) - Add 2.4 agent mood/vibes field - Upgrade 3.5 sound themes to implemented - Add 3.6 agent signature chimes, 3.7 @mention pulse, 3.8 event feed stagger - Remove deterministic SVG avatar item (boss preference: keep existing avatars) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat(gamification): kanban spring-drop, @mention pulse, fleet vibe, sprint-fix Kanban card spring-drop (KanbanColumn.vue): - Cards enter with a physical spring animation: drop from above, slight overshoot (bounce +5px), then settle. CSS @Keyframes, 0.35s. - prefers-reduced-motion: animation disabled. @mention pulse animation (App.vue + AppSidebar.vue): - SSE agent_message handler now parses @mentions from message content. - Mentioned agent's card in sidebar pulses with a 3s ring animation (box-shadow expand/fade, CSS @Keyframes). - Reactive mentionedAgents Set with auto-expiry timers. - AppSidebar accepts mentionedAgents prop and applies .mention-pulse class. Fleet Vibe roll-up (SpaceOverview.vue): - Computed fleetVibe shows a live emoji + label in the space header based on agent status distribution (Shipping / Blocked / On fire / etc.). - Tooltip shows "Fleet vibe: <label>" on hover. - Updates reactively with every SSE agent_updated event. Sprint-complete detection fix (App.vue): - No longer triggers on page load (when agents are already idle). - Requires at least one agent to have been `active` since the last celebration. Resets after celebrating, so next one needs a new active phase. - Requires at least 2 agents — single-agent spaces don't have sprint semantics. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat(gamification): spawn warp, PR shimmer, confetti priority variations Agent spawn warp animation (App.vue + AppSidebar.vue): - When agent_spawned SSE fires, adds agent to spawnedAgents set (600ms). - AppSidebar applies .agent-spawn CSS class: scale(0.35) → overshoot → settle(1.0) with a ring burst. Feels like a portal opening. - Clears automatically after 600ms animation. PR badge shimmer (AppSidebar.vue): - PR links (#N) on agent cards get a traveling light shimmer animation (CSS background-position sweep, 2.4s loop) whenever the agent has a PR. - Visual signal: "code is out there, awaiting review." Priority-based confetti variations (useConfetti.ts + KanbanView.vue): - Critical tasks: gold/orange particle palette, 2x count (130), wider blast radius, 2.4s duration. - High priority: 1.4x count (90), slightly faster spread. - Medium: standard burst (65 particles). - Low: lighter burst (40 particles). - KanbanView passes task.priority to celebrate() on drag-drop and SSE-triggered task_updated to done transitions. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs(gamification): update spec with all brainstorm results and implementation status Mark Tier 2.3-2.10 as implemented. Add Tier 3.9-3.18 from second brainstorm round (audio ticks, emoji reactions, streaks, ship-it broadcast, co-working indicators, standup digest, presence, leaderboard, chromashift). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(sse): agent_spawned payload from lifecycle.go missing space/agent fields The MCP spawn_agent path (lifecycle.go:spawnAgentService) was broadcasting the bare agent name string as the agent_spawned SSE payload. The frontend SSEAgentSpawned type expects {space, agent} JSON, so data.space and data.agent were undefined — causing '[undefined] agent spawned' in the event log and 'Failed to load space undefined: 404' errors. Fix: use json.Marshal({space, agent}) matching the handlers_agent.go path. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(gamification): agent signature chimes, activity tick, spawn guard Agent signature chimes (useNotifications.ts + App.vue): - Each agent gets a unique 2-note chord from a hash of their name. - Pentatonic scale ensures all chords are consonant. Plays once per page load per agent on first agent_updated SSE event. - Resets on space navigation so agents get their chime each visit. Activity tick (useNotifications.ts + App.vue + SettingsView.vue): - 4ms white-noise burst on each agent_updated SSE event. Very subtle. - Off by default; toggled in Settings via new "Ambient activity tick" switch. - Stored in localStorage (boss_activity_tick_enabled). TASK-035 guard (App.vue): - agent_spawned handler drops events with missing space/agent. - Prevents loadSpace("undefined") from partial payloads. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(ux): usability audit fixes — H1, H2, H6, H7, TASK-038 - H1: make `now` a reactive ref in KanbanView, updated via setInterval every 60s so overdue detection stays accurate without page reload - H2: replace browser confirm() in TaskDetailPanel delete with AlertDialog component for consistent UX and keyboard accessibility - H6: add data-search-focus attribute to Kanban search input for Playwright and keyboard shortcut targeting - H7: surface send errors in ConversationsView inline compose — previously silently swallowed, now shows error text below form - TASK-038: fix agent selector dropdown overflow in ConversationsView new-message picker by replacing ScrollArea (which doesn't apply max-height correctly) with a plain div with max-h-48 overflow-y-auto Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(ux): H3, H4, M1, M13 usability audit fixes - H3: Tasks/Conversations sidebar nav items now show active state via useRoute() — was hardcoded :data-active="false" - H4: Remove duplicate unread count badge on Conversations nav item; icon dot badge is sufficient, SidebarMenuBadge was redundant - M1: Guard sound theme preview behind soundEnabled — selecting a theme no longer plays audio when sounds are disabled - M13: pr-shimmer animation now conditional on agent.status === 'active'; previously applied to all agents with a PR regardless of state Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(ux): usability batch 3 — C2, M2, M3, M4, M10, M11, M14 - C2: implement 'i' keyboard shortcut (navigate to space overview); was documented in help overlay but had no handler - M2: add 'Change' label to task assignee dropdown trigger when task is already assigned — lone ChevronDown was undiscoverable - M3: store due dates at noon UTC (T12:00:00Z) instead of midnight UTC (T00:00:00Z); midnight rolls back a day for all GMT+ users - M4: Assignee and Label filter dropdowns highlight in primary color when an active filter is set, matching the Overdue button pattern - M10: add 'no tasks match your filters' empty state + Clear filters button when all columns are empty due to active filters - M11: add .prevent to @keydown.ctrl.enter on comment textarea so the default newline insertion is suppressed on submit - M14: add 'Ctrl+Enter to send' hint below comment textarea Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(ux): TASK-045 — close agent create dialog before opening personas panel The 'Create persona' link in AgentCreateDialog emitted open-personas while the Dialog was still open. Both Dialog and Sheet use z-50 fixed portals, causing the Sheet to render behind (or at same level as) the Dialog overlay. Fix: close agentCreateDialogOpen before emitting open-personas in SpaceOverview. The dialog animates out, then the Personas sheet slides in — clean stack, no z-index conflict. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(gamification): TASK-048 agent voice system enhancements - Add pitch micro-variation (±5%) and timing jitter (±15ms) to agent signature chimes so each play feels organic rather than robotic - Extract _playAgentVoice() helper shared by auto-chime and preview - Add previewAgentVoice() export — plays on demand regardless of once-per-session guard, for explicit user-triggered previews - Add Volume2 button in AgentDetail header (only when sounds enabled) so users can hear an agent's unique voice from their profile Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(gamification): audio-sme ideas — blocked alert, spawn sound, task arc, mention ping Based on audio-sme brainstorm (ideas #2, #3, #6, #9, #12): - #2 Dissonance Flag: playBlockedAlert() — minor second interval (A4+A#4) fires when agent transitions INTO blocked or error state. Tense but not alarming; tells operator something needs attention. - #3 The Arc: playTaskTransition(status) — rising sweep on →in_progress, suspended Csus2 chord on →review. Completes the emotional story that playSuccess() already starts at →done. Wired to both drag-drop and remote SSE task_updated events. - #6 Warp Arrival: playAgentSpawn() — 200→1200Hz sweep + resonant ring. Fires on agent_spawned SSE, skipped under prefers-reduced-motion. - #9 @Mention Ping: playMentionPing() — C6 percussive tone, distinct from message chime. Fires once per agent_message event that contains at least one valid @mention, alongside the existing CSS pulse ring. - #12 Motion-Sound Parity: prefersReducedMotion check halves volume on all new sounds, skips sweeps, replaces with shorter tones. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(gamification): audio control center — volume, per-category toggles, PR shipped, collaboration chord - soundVolume ref (0-100% slider) applied via tone()/sweep() multiplier - soundCategories ref with 5 categories: urgent, events, celebrations, ambient, social - SOUND_CATEGORY_META for rendering category toggles in SettingsView - isCategoryEnabled() helper replaces bare soundEnabled checks in all play* fns - SettingsView: volume slider + per-category toggle grid - playPRShipped(): descending 700→350Hz sweep + landing tone (events) - playCollaborationChord(): both agents' pentatonic voices as chord (social) - App.vue: wire playPRShipped via currentSpace watch, playCollaborationChord in agent_message Audio Control Center implements audio-sme idea #11 (impact 5) PR shipped implements audio-sme idea #10 Collaboration harmony implements audio-sme idea #8 * feat(gamification): agent moods, boss level fanfare, heartbeat mode — audio palette complete audio-sme idea #5 (Agent Moods): - playAgentMoodActive(name): ascending root→fifth — agent 'waking up' - playAgentMoodIdle(name): descending fifth→root — agent 'settling down' - Wired in agent_updated SSE via prevStatus captured before in-place patch - Fixes prevStatus capture bug (was reading post-patch, now pre-patch) audio-sme idea #4 (Boss Level): - playSuccess(priority?) now accepts priority — critical tasks get an ascending C5→G5→C6 lead-in run before the chord, theme-aware - KanbanView wires priority on both local drag-drop and remote SSE task_updated audio-sme idea #7 (Heartbeat Mode): - playAgentTick(name): 3ms pentatonic micro-tone at agent's signature freq instead of uniform white noise burst — active fleets sound like a chord - Replaces playActivityTick() in agent_updated handler (still gated by activityTickEnabled) All 12 audio-sme ideas now accounted for: Implemented: #2 #3 #4 #5 #6 #7 #8 #9 #10 #11 #12 Architecture only (#1 Alert Taxonomy already fulfilled by category system) --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
jsell-rh
added a commit
that referenced
this pull request
Mar 18, 2026
PR #241 added has_more/unread_count pagination to check_messages but did not update the protocol.md MCP resource that agents read at runtime. This caused a gap: agents see the pagination pattern in their ignition prompt but not in the authoritative protocol reference. - Add pagination subsection under Message Polling with field table and drain-loop pseudocode (has_more/cursor pattern) - Update Rule #1 to mention draining the backlog when has_more is true - Add Check 9 to doc-gardening-agent.md audit checklist so future sprints touching check_messages include protocol.md verification Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
jsell-rh
added a commit
that referenced
this pull request
Mar 18, 2026
…K-101) (#241) * fix(ux): scroll-to-top bug, persona display, mobile quick wins (TASK-115, TASK-117, TASK-118) TASK-115: Fix ConversationsView scroll-to-top on any new message - Remove scheduleSpaceReload from agent_message SSE handler in App.vue - Replacing currentSpace.value triggered conversations recompute with new array references, resetting scroll position in the open thread - Replace with in-place boss.unread_count increment for sidebar badge TASK-117: Show active persona assignments on agent cards - SpaceOverview: extend loadPersonaVersions to also track persona names (id→name) - Add getAgentPersonaNames() helper; show violet chip with persona name(s) on cards - Outdated personas still show amber chip (with name instead of "Persona" label) - AgentProfileCard: add personas prop and show Personas row in hover panel TASK-118: Mobile responsiveness quick wins - App.vue SidebarTrigger: h-11 w-11 on mobile, h-7 w-7 on md+ - KanbanColumn: min-h/min-w 44px touch target for + button; add @click to empty-column drop zone (was dblclick-only); update copy to "Click or double-click" - TaskDetailPanel: hide Ctrl+Enter hint on mobile (hidden sm:block) - ApprovalTray: size-11 on mobile, size-8 on md+ - AppSidebar: remove show-on-hover from SidebarMenuAction (hidden on mobile otherwise) - AgentProfileCard: add onTap touch handler for mobile tap-to-toggle - HierarchyView: show summary on mobile with line-clamp-1 instead of hidden md:block - PersonasView: flex-col on mobile, md:flex-row for two-panel split Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(frontend): add explicit separators in live pane status bar The flex gap-3 between status spans was not reliably rendering, causing 'session online', 'idle', and 'captured ...' to appear concatenated as 'session onlineidlecaptured HH:MM:SS'. Add explicit · separator spans between conditional status items so the status bar is legible regardless of CSS gap rendering. Also adds items-center so status items align vertically when they wrap. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(mobile): ConversationsView single-column + Kanban filter toolbar (TASK-118) ConversationsView mobile single-column layout: - Left panel (conversation list): full-width on mobile when no thread selected, hidden when thread is open (hidden md:flex md:w-72) - Right panel (thread view): full-width on mobile when thread selected, hidden otherwise (hidden md:flex) - Added mobile back button (ChevronLeft) in thread header to return to list - Task widget panel: hidden on mobile (hidden md:flex) to avoid crowding - Pattern: same list→detail→back flow used by all mobile messaging apps Kanban filter toolbar mobile collapse: - Added SlidersHorizontal toggle button (mobile only, sm:hidden) - Filter controls now hidden on mobile (hidden sm:flex) behind the toggle - Expandable filter panel (v-if="filtersOpen") with larger 44px-friendly inputs - Desktop: unchanged (filters always visible inline) - "New Task" button text hidden on mobile to save horizontal space Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * test(e2e): add mobile layout, persona display, Kanban filter tests (#16) Covers changes from TASK-115, TASK-117, TASK-118: Mobile ConversationsView (TASK-118): - On mobile viewport: conversation list visible, thread panel hidden (display:none) - Tapping a conversation: thread panel appears, list hides - Back button: returns to conversation list, list is visible again - Desktop: both panels visible simultaneously (regression guard) Persona badge on agent cards (TASK-117): - Create persona, assign to agent config → badge with persona name visible on card - Agent with no persona assigned → no persona badge Kanban filter toolbar mobile (TASK-118): - Mobile: filter toggle button visible, tapping it opens filter panel with search input - Desktop: filter toggle not visible (filters always shown inline) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(tmux): rename agent restart wrapper to not match pkill -f '/tmp/boss' Root cause of agents terminating unexpectedly: the restart procedure uses `pkill -f '/tmp/boss'` to stop the server, but this pattern also matches `bash /tmp/boss-agent-<sessionID>.sh` wrapper processes. This kills every agent's restart loop, causing Claude to exit with "Terminated" and leaving panes at the interactive shell. Two-part fix: 1. CLAUDE.md restart procedure: use `pkill -f '/tmp/boss serve'` so only the server process is killed (the server command always includes the "serve" subcommand). 2. session_backend_tmux.go: rename wrapper scripts from /tmp/boss-agent-*.sh to /tmp/agent-loop-*.sh so they cannot match any reasonable "/tmp/boss" pattern even if an operator forgets the narrower pkill pattern. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * perf(e2e): enable parallel Playwright execution — 4 workers, persistence last All tests except 07-persistence use the isolated `space` fixture (unique name per test) so they have no shared state and are safe to run concurrently. Two Playwright projects with dependencies: - parallel-tests: all non-persistence specs, fullyParallel + 4 workers - persistence: 07-persistence only, runs after parallel-tests completes The persistence test restarts the server mid-run; sequencing it after all other tests prevents concurrent workers from getting connection errors during the restart window. Expected speedup: ~3-4x on a 4-core machine (parallel phase dominates). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(e2e): fix 5 failing CI tests in 16-ui-mobile-and-personas spec - Mobile list-visible test: use empty space (no agents) so auto-select watch cannot fire and the list panel stays visible - Mobile tap/back tests: accept auto-select behavior — TapBot/BackBot is already selected on load, verify thread content then test Back button - Persona badge test: add page.reload() after goto so SpaceOverview picks up the latest agent config data - Kanban filter search test: use .filter({ visible: true }) to avoid matching the desktop-hidden input inside the collapsed sm:hidden div Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(mcp): paginate check_messages to prevent agents missing unread messages When an agent accumulates a large backlog of unread messages (e.g. after a restart), the check_messages response could grow too large for Claude's MCP layer to process, causing messages to be silently dropped. Fix: cap responses at 20 messages per call (checkMessagesPageSize). When there are more messages, return has_more: true and an updated cursor so the agent can call again to drain the backlog. Also add unread_count to show the total scope of work remaining. Response shape additions: - has_more: bool — true when there are more pages to fetch - unread_count: int — total unread across the full in-memory store Update agent ignition protocol to document the has_more pattern. Add TestCheckMessagesPagination and TestCheckMessagesSmallBacklog. Fixes TASK-101. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs(protocol): document check_messages pagination in protocol.md PR #241 added has_more/unread_count pagination to check_messages but did not update the protocol.md MCP resource that agents read at runtime. This caused a gap: agents see the pagination pattern in their ignition prompt but not in the authoritative protocol reference. - Add pagination subsection under Message Polling with field table and drain-loop pseudocode (has_more/cursor pattern) - Update Rule #1 to mention draining the backlog when has_more is true - Add Check 9 to doc-gardening-agent.md audit checklist so future sprints touching check_messages include protocol.md verification Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
/modeltmux commands during broadcast check-ins whencheckModel/workModelare empty strings/modelcommands that confuse agent CLIsCherry-picked from upstream PR markturansky/agent-boss#3.