Skip to content

feat(dashboards): production builder, native chat, shared context ring (backport #1142) - #1146

Open
mergify[bot] wants to merge 6 commits into
version-15-hotfixfrom
mergify/bp/version-15-hotfix/pr-1142
Open

feat(dashboards): production builder, native chat, shared context ring (backport #1142)#1146
mergify[bot] wants to merge 6 commits into
version-15-hotfixfrom
mergify/bp/version-15-hotfix/pr-1142

Conversation

@mergify

@mergify mergify Bot commented Sep 5, 2026

Copy link
Copy Markdown

Summary

The dashboard builder is now a self-contained workspace: its chat never hands you off to main Chat, a build survives a page refresh, it keeps its own history and approvals, and the composer wears main chat's model picker and context ring without crowding the pane.

What changed

  • Refresh-safe builds: a hard refresh restores the progress card and the reply lands without a duplicate prompt.
  • Dashboard-native navigation: no "Open in chat"; hide and show chat; the Approval Board opens the exact dashboard thread, even with chat hidden.
  • Own namespace: dashboard threads stay out of main chat's list and search and refuse sends from other surfaces.
  • Composer parity: the shared model picker stays inside the pane; the pane mounts main chat's ContextRing and compact popover. Failed runs show their reason.
  • More room: the left rail auto-collapses while the builder is open; on a phone the canvas and chat swap full-width.
  • Sharing: Org and Role scopes hold for non-owners.

Risk and verification

  • 1786 vitest, 839 node:test, focused backend classes and ruff green; verified live on an isolated preview (screenshots below). The local LLM pool was rate-limited, so worker-side paths were driven with seeded transcripts through this branch's worker functions.

Pre-merge checklist

ℹ️ A red check only blocks the merge where the branch ruleset lists it as required.
Honoring this checklist is what keeps broken changes out of UAT. See
CONTRIBUTING.md.

  • CI is green — the tests check on this PR passes (never merge on ❌)
  • Branch is up to date with its base (develop, or version-N-hotfix for a backport)
  • New/changed behavior has tests (the coverage gate still passes)
  • I self-reviewed the diff
  • If the base is version-N: this is the release PR from version-N-hotfix, __version__ is bumped, and release-source is green

Screenshots

Live on an isolated worktree preview of this branch (e2e.localhost). Before = base branch, After = this PR.

Before After
Model and effort picker in the pane dash-03-effort-menu dash-05-picker-fixed
Context meter in the composer dash-22-context-amber dash-30-ring-45-popover
Left rail while the builder is open 01-builder-initial dash-29-final-builder-collapsed
Phone width (390px) dash-24-mobile-builder dash-28-mobile-chat

Refresh-safe build, restored after a hard refresh mid-run (new behavior, no Before):

dash-16-inflight-publishing
Review-round fixes and rebase notes

Intended behavior change: a send into a dashboard thread from main Chat or Triggers now returns ok:false with a "continue in Dashboard Builder" reason.

Found and fixed while testing the builder end to end:

  • The shared model picker hung its menu off the pill's right edge and its effort flyout further left, which put both outside the pane's overflow-hidden edge. New align="start" and compact props keep them inside a narrow host.
  • A run that failed before its first token left an empty assistant row whose reason lived in error; the pane filtered bubbles on content, so the failure rendered as nothing and the composer silently unlocked.
  • A never-titled thread carried the server's "New chat" placeholder into the history menu, where it read as the action beside it.
  • The shell store called window.matchMedia at module load, which broke any spec importing a page that imports the store. Both breakpoint listeners are now guarded.
  • The builder's own text context pill and lib/contextUsage are removed in favor of the shared ContextRing fed by get_conversation_context, and the context_usage snapshot that get_conversation inlined for it is dropped with its tests.

The branch was rebased onto develop after #1136 merged (zero conflicts; the pre-rebase state is kept on backup/dashboard-builder-pre-rebase). Dashboard threads are ordinary sessions to the context and compact endpoints, so nothing there is dashboard-only.

Known, out of scope: the Vue warning "Failed to resolve component: Button" on the Approval Board comes from its pre-existing FileUploader and is untouched here.

https://claude.ai/code/session_01CkvbXsZAizy4UDh9ZWjn51


This is an automatic backport of pull request #1142 done by [Mergify](https://mergify.com).

… and mobile split

Bundles the in-progress dashboard-builder work (dashboard-native navigation,
refresh-safe run restore, dashboard-scoped history and approvals routing,
sharing/permission tests, builder model/effort/context controls) with the
review-round fixes: picker menu clipping in the narrow pane, hidden failed-run
error rows, untitled history label, shell auto-collapse of the left rail while
the builder is open, and a single-pane swap below the phone breakpoint.

Claude-Session: https://claude.ai/code/session_01CkvbXsZAizy4UDh9ZWjn51
(cherry picked from commit 5cd0dfb)
…he builder pane

The builder pane wore its own text pill (Context NN%, filled amber/red). Now
that #1136 is in develop it mounts the SAME ContextRing + CompactDialog main
chat uses, fed by get_conversation_context and compact_conversation, placed
left of the model pill exactly as in ChatView. The local ContextUsagePill and
lib/contextUsage are removed; dashboard threads are ordinary sessions to the
context endpoint, so nothing is dashboard-only.

Claude-Session: https://claude.ai/code/session_01CkvbXsZAizy4UDh9ZWjn51
(cherry picked from commit 49f1e3b)
…tion

The builder pane now reads get_conversation_context (the same endpoint main
chat's ContextRing uses), so the per-conversation snapshot get_conversation
inlined for the old text pill has no consumer. Removed with its two tests.

Claude-Session: https://claude.ai/code/session_01CkvbXsZAizy4UDh9ZWjn51
(cherry picked from commit 68270ca)
… formatting

list_dashboard_conversations is the builder's own capped, owner-scoped history
menu, not a browsable document list, so it is recorded in
list_registry.NON_LIST_ENDPOINTS with that reason (test_list_registry guard).

Formatting now matches the pinned pre-commit hooks (ruff-format, prettier
2.7.1): the worktree's node_modules symlink carries a newer prettier that had
added trailing commas in call arguments across the branch.

Claude-Session: https://claude.ai/code/session_01CkvbXsZAizy4UDh9ZWjn51
(cherry picked from commit f480509)

# Conflicts:
#	jarvis/chat/list_registry.py
@mergify mergify Bot added the conflicts Backport could not be cherry-picked cleanly; resolve it in this PR label Sep 5, 2026
@mergify

mergify Bot commented Sep 5, 2026

Copy link
Copy Markdown
Author

Cherry-pick of f480509 has failed:

On branch mergify/bp/version-15-hotfix/pr-1142
Your branch is ahead of 'origin/version-15-hotfix' by 3 commits.
  (use "git push" to publish your local commits)

You are currently cherry-picking commit f480509.
  (fix conflicts and run "git cherry-pick --continue")
  (use "git cherry-pick --skip" to skip this patch)
  (use "git cherry-pick --abort" to cancel the cherry-pick operation)

Changes to be committed:
	modified:   frontend/src/api/dashboards.js
	modified:   frontend/src/components/chat/ModelEffortPicker.spec.js
	modified:   frontend/src/components/chat/ModelEffortPicker.vue
	modified:   frontend/src/lib/dashboardBuildCard.js
	modified:   frontend/src/lib/dashboardBuildCard.test.js
	modified:   frontend/src/lib/dashboardOpen.test.js
	modified:   frontend/src/lib/dashboardProductionBoundary.test.js
	modified:   frontend/src/lib/dashboardRestore.test.js
	modified:   frontend/src/notify/globalNotifier.js
	modified:   frontend/src/pages/approvals/ApprovalsBoard.vue
	modified:   frontend/src/pages/dashboards/DashboardChatPane.vue
	modified:   frontend/src/pages/dashboards/DashboardView.vue
	modified:   frontend/src/pages/dashboards/DashboardsPage.vue
	modified:   frontend/src/stores/shell.js
	modified:   jarvis/chat/api.py
	modified:   jarvis/chat/chat_asks.py
	modified:   jarvis/chat/events.py
	modified:   jarvis/tests/test_chat_asks.py
	modified:   jarvis/tests/test_chat_events.py
	modified:   jarvis/tests/test_dashboards_api.py

Unmerged paths:
  (use "git add <file>..." to mark resolution)
	both modified:   jarvis/chat/list_registry.py

To fix up this pull request, you can check it out locally. See documentation: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/checking-out-pull-requests-locally

Mergify committed the conflict markers from #1142's registry hunk. Keep only the
Dashboard Builder history entry here: the search_users entry that rode along in
the develop hunk belongs to #1062, which is not on version-15-hotfix, and the
registry test requires every NON_LIST_ENDPOINTS key to resolve to a live callable.

Claude-Session: https://claude.ai/code/session_01CkvbXsZAizy4UDh9ZWjn51
@kavin-114 kavin-114 removed the conflicts Backport could not be cherry-picked cleanly; resolve it in this PR label Sep 6, 2026
The mini-org fixture dated every row from a literal 2025-09-01. Five detectors
scan a 12-month window, so from 2026-09-06 the oldest Work Orders fell out of
mfg-default-bom-usage's window, the Widget habit dropped to 19 units under the
n_min of 20, and shard 4 went red on develop and both hotfix lines. The other
12-month detectors were on the same slope with more headroom.

_day(ordinal) is now anchor + ordinal days with the anchor fixed once per
build() at today minus 11 months, so the dataset always sits 230..335 days
back: inside the tightest window with a month of headroom, never in the
future, and still older than the engine's 180-day dormant cutoff, which is the
age class the literal dates had and test_orchestrator patches around. The
Beta go-live burst and the _insert creation fallback ride the same anchor.

The print-log tests keep their literal days on purpose: they assert exact
periods and the watermark and are bucketed by print-log creation, not by
these fixture dates.

Claude-Session: https://claude.ai/code/session_01CkvbXsZAizy4UDh9ZWjn51
(cherry picked from commit fe59c0c)
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.

2 participants