Compound Engineering plugin view now renders the dashboard's shared ViewHeader (Sparkles icon + title) so it matches the other main-content views. Expose ViewHeader via the dashboard exports map; resolve it in the plugin via an ambient interop declaration (no host runtime dependency). Tests updated (plugin suite green).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- gm: reset the base .gm-nav-item width:100% in the icon-only container query so each tab is icon-sized and many fit horizontally (was one full-width tab at a time).
- Skills view content no longer repeats the ViewHeader's top padding (removes the doubled gap under the header).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Skills, Mailbox, Agents migrated to the shared ViewHeader (existing controls passed through actions; Skills icon -> Zap to match sidebar).
- Missions keeps its integrated header but adopts the shared 1.125rem title + size-20 icon.
- ChatView intentionally left as-is (height-sensitive two-pane; documented with FNXC).
- Tests updated for the new header markup (606 pass across the view suites).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Clicking a board card opens its detail in a full main-content view (replacing the board) with a 'Back to board' button, instead of the TaskDetailModal overlay. Only the Board entry point changes; list-view embed, right-dock cards, and other openDetail callers keep the modal. New 'task-detail' task view; embedded TaskDetailContent prefers the live task. Works within the mobile shell (swipe-back reverts to board). Tests updated (70 pass).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Normalize these main-content views onto the shared ViewHeader (icon + CC-style title; existing header controls moved into the actions slot). Tests updated for the new header markup (95 pass).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- TeamArea heartbeat card gains a heartbeat-multiplier slider (mirrors AgentsView: same range/step/presets, persisted via updateSettings) and a View Board / View Agents nav row (onChangeView threaded from CommandCenter <- App handleChangeTaskView).
- Update CC/TeamArea test mocks to export fetchSettings/updateSettings (220 pass).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Dashboard (Command Center) is the first mobile bottom-nav tab (before Tasks), matching the desktop sidebar.
- Skills is never a top-level mobile tab; when enabled it lives only in the three-dot More sheet.
- Tests updated to the new order/More-sheet behavior (74 pass).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Scope each converted modal's mobile full-screen/viewport-takeover rules to :not(--embedded) (Settings, GitHub import, Git Manager, Workflows) so the embedded main-content variant fills only the content pane and the app Header + MobileNavBar stay visible on mobile. Modal presentation unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
DockFilesView uses a container query: narrow (dock) keeps the single-panel tree<->viewer navigation stack; wide (pop-out expand modal) shows the file tree and viewer side by side with an empty 'Select a file' state.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Docked terminal resize handle: larger grab target straddling the panel edge with touch-action:none; resize batches height to one rAF update per frame and writes localStorage once on pointer-up (was a sync clamp + write every move).
- Git Manager dock tabs are icon-only in the narrow dock (label sr-only, title/aria-label tooltip) so many tabs fit horizontally.
- Left sidebar Compound plugin label reads 'Compound Eng'.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add a 'settings' main-content task view: SettingsModal gains a presentation=embedded mode (no overlay/close, modal-only behaviors disabled, CC-style padded header) and a thin SettingsView wrapper. App renders it in renderMainContent (before the overview gate so the gear works with no project); settings entry points navigate to the view (carrying the deep-link section via setSettingsSection) while the modal mount stays for bootstrap callers.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Resolve the stash-pop conflicts in command-center CSS/test by keeping the current branch's newer FN-6784 responsive clamps, Team heartbeat docs, and recharts assertions (the stashed snapshot was older).
- Land the stashed workflow-selection refactor (Board/NewTaskModal/WorkflowSwitcher; remove lastSelectedWorkflow util).
- Rename Command Center -> Dashboard (i18n source) and move it to the top of the left sidebar; workflow switcher chevron sized to match the project selector.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
New Task now inherits the project's current or last valid workflow lane.
- Persist explicit Board and List workflow switcher selections per project.
- Seed the New Task workflow selector from the cached valid lane without marking the pristine dialog dirty.
- Preserve default-workflow inheritance when no remembered lane exists or the remembered lane was deleted.
- Cover quick-add parity, workflow defaulting, stale-lane fallback, and storage helper behavior in tests.
- Document New Task workflow selector defaulting in the dashboard guide.
Files changed:
docs/dashboard-guide.md | 2 +
packages/dashboard/app/components/Board.tsx | 12 +-
packages/dashboard/app/components/ListView.tsx | 12 +-
packages/dashboard/app/components/NewTaskModal.tsx | 21 ++-
.../app/components/__tests__/NewTaskModal.test.tsx | 142 ++++++++++++++++++++-
.../utils/__tests__/lastSelectedWorkflow.test.ts | 67 ++++++++++
.../dashboard/app/utils/lastSelectedWorkflow.ts | 31 +++++
7 files changed, 279 insertions(+), 8 deletions(-)
Fusion-Task-Id: FN-6923
Fusion-Task-Lineage: 6e3c8efd-3865-4975-a754-2f0d5ff89ab0
Add a defaultExpanded prop to QuickEntryBox (default true = open, preserving Board/column behavior); List view passes defaultExpanded={false} so the quick-add controls start collapsed. autoExpand (expand-on-focus) is unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- TodoView collapses to a single-panel navigation stack (list -> items with Back) via container query when narrow (right dock); wide two-panel layout unchanged.
- Embedded Import Tasks body scrolls vertically so the preview can be much taller (stacked layout gives the preview natural height; wide layout keeps internal scroll).
- Add a shared ViewHeader component (icon + CC-style title + wrapping actions) for consistent main-view headers.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Each section tab stacks its icon over a small label so all tabs are visible at once in the narrow dock with minimal horizontal scrolling.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Usage (Activity) removed from the right dock and rendered as a non-mobile header button (left of the right-sidebar toggle) that opens the UsageIndicator as a header-anchored modal.
- Left sidebar: Skills and Memory moved to immediately after Mailbox.
- Updated overflowViewRegistry / Header / tablet-header / LeftSidebarNav tests to the new behavior (all green).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The base .modal-overlay (dim + blur) and the docked/floating override were both single-class selectors, so stylesheet order could let the dim/blur win and fade the page. Qualify the override with .modal-overlay so the transparent, non-blurring, click-through backdrop always wins.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Widen the split resize column from 4px to --space-sm and add a centered grip line that brightens on hover/focus, so the task-list sidebar is easy to grab and drag.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Left sidebar reordered to a single explicit list (board, list, graph, command-center, agents, chat, mailbox, planning, missions, artifacts, goals, compound, automation, import, workflows, insights, research, skills, memory, evals, remaining plugins). Command Center before Agents; Artifacts after Missions.
- Dev Server and Secrets moved off the left sidebar into the right dock (inline render; Dev Server gated by the devServerView flag).
- Import Tasks embedded view uses a Command Center-style header (GitHub logo + shared title font + padding).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Right dock: Files first/default; usage/activity-log/git-manager render inline; embedded Git Manager uses a container query (compact horizontal tab strip in the dock, full two-pane in the wide pop-out); Files inline viewer + pop-out.
- Import Tasks layout fits its container (stacked when narrow, two-pane when wide); Import Tasks uses the GitHub mark.
- Planning embeds full-area and works on mobile; planning shows the board WorkflowSwitcher.
- Automations screen uses theme color tokens.
- Workflow selector matches the project selector height/font.
- Left sidebar: uniform spacing across the primary/secondary boundary.
Adds a changeset for @runfusion/fusion (minor).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Files dock: clicking a file opens it inline (read-only FileEditor) with Back + pop-out-to-resizable-modal controls (DockFilesView).
- Planning view shows the same board WorkflowSwitcher in the same Header workflow slot (PlanningWorkflowSwitcherSlot, portaled).
- Embedded Git Manager uses the mobile single-column layout in the narrow dock (section tabs strip + full-width content).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- New built-in task views: workflows, import-tasks, automations (left-sidebar destinations rendering in the main content area).
- WorkflowNodeEditor, GitHubImportModal, and ScheduledTasksModal gain a presentation=embedded mode (inline, no overlay/close, modal-only behaviors disabled). Automations embedded view uses a Command Center-style header and a responsive two-pane (list + detail) layout when wide enough.
- Left sidebar adds Workflows, Import Tasks, Automations entries; renderMainContent renders the embedded views.
- Remove github-import and automation from the right dock; hide the desktop Header Workflow button when the left sidebar owns Workflows. Mobile overflow keeps the modal entry points unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Align the workflow-switcher trigger with the project-selector trigger: transparent background, --radius-md, muted text that brightens on hover with --card-hover fill and --text-dim border, content-driven width (drop the fixed min-width; keep the max-width clamp).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- List view split sidebar min-width 120->64 so it can be dragged much narrower; titles wrap to two lines in the split sidebar.
- Embedded planning blends like Command Center: no panel shadow/border/outline, transparent background, matching --space-lg padding.
- Insights view header wraps so action buttons drop to a new line instead of overlapping the title.
- Dependency graph no longer appears in the right dock (left-sidebar destination only).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Add an embedded presentation to UsageIndicator, ActivityLogModal, and GitManagerModal: rendered inline inside the right-dock container with no fixed overlay, no modal-close, and modal-only behaviors (scroll lock, resize-persist, escape-to-close, popover anchor positioning) disabled when embedded. Modal path unchanged.
- Right-dock registry mounts usage/activity-log/git-manager via presentation=embedded render instead of onActivate modal launchers; Files already inline.
- Remove the in-dock collapse button; the header right-sidebar toggle is the sole show/hide control.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Add a non-mobile header right-sidebar show/hide toggle (PanelRight) wired to the right-dock open state; replaces the tablet three-dots overflow. Mobile keeps its overflow menu untouched.
- Right dock is fully hidden when closed (no persistent rail); main content reclaims the space. Resize handle preserved when open.
- Fix New Task CTA width: .left-sidebar-nav__item width:100% was overriding it, overflowing the unpadded aside by 2x--space-sm and overlapping the resize bar; raise specificity so it matches the item highlight box.
- Make the primary/secondary nav gap match the row rhythm (Compound -> Goals no longer doubled).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Planning mode embedded view drops the modal header/close and uses a plain common title like Command Center.
- Remove the divider before the secondary section (Goals/Evals) in the left sidebar.
- Flatten the Dev Server view header to match embedded-view styling (no card chrome).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Left sidebar New Task CTA now occupies the same box as item highlights (drop bleeding box-shadow).
- Add spacing between Collapse and Settings in the sidebar footer.
- Docked/floating terminal no longer blurs the page behind; page stays interactive.
- Flatten the footer Terminal launcher to plain clickable text like the executor running-state trigger.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- merger-ai: resolve+persist concrete landedSha when a sub-repo is recognized
already-landed via the Fusion-Task-Id trailer fallback, so finalize no longer
drops it and mis-finalizes a fully-landed workspace task as a no-op
- project-engine: manual-merge land-lease busy errors reject the resolver without
burning mergeRetries; clear stale busy-reenqueue counter on real partial land;
persist retry count before arming the backoff timer (fail closed on write error)
- cli/dashboard + task: use shared isWorkspaceTask predicate instead of inlining
- base-commit-capture: POSIX single-quote shell escaping for integration ref
- git-repository: validate workspace.json repos elements are strings
- merger-ai: drop dead store param from landOneRepo
- tests: assert the 60s backoff cap across cycles; exercise the real runAiMerge
merge door; fix non-git-root assertion; re-export real workspace error classes
in the merger-ai mock (fixes 24 pre-existing instanceof-undefined failures);
remove generic fake-timer smoke test now covered by the live engine assertion
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Wrap the fatal-path acquisition observability writes (logEntry + audit.git)
in safeObserve so a store/audit throw can't replace the original
acquisition error, keeping WorkspaceRepoAcquireBusyError instanceof checks
reliable upstream.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Address CodeRabbit out-of-diff review comments: the feature changeset no longer
claims the legacy declaration surface "remains" (U7a retired it; the sibling
changeset documents the removal), and now calls out the optional-group enable
id-collision fix for release-note visibility.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4-persona review of the Phase-D workspace self-healing. The headline: the P0
single-commit-finalize guard had to be applied across ALL surfaces, not just the
one reconciler U1 patched (FN-5893).
Finalize-site audit (A): gated every site where a workspace task could be
single-commit-finalized on one repo's commit — recoverStuckMergeDeadlocks (the
twin of the U1-patched reconciler, reachable via blocked-dependents),
recoverOrphanOnlyScopeViolations, recoverAlreadyMergedReviewTasks,
recoverBranchMisboundInReviewTasks (workspace tasks carry task.branch so the
Boolean(branch) filter didn't exclude them), plus a defensive filter on
finalizeNoOpReviewTasks. recoverMergedReviewTasks confirmed safe (mergeConfirmed
gate). Each is an isWorkspaceTask early-skip; single-repo behavior unchanged.
Reliability/concurrency:
- The partial-land reconciler now captures enqueueMerge's boolean and bounds
re-enqueues (mergeStarvationDrops → fail after N) instead of looping silently
forever on a full queue.
- The phantom-lease reclaim only acts on a terminal owner (null/done/failed) — it
no longer reclaims the lease of an in-progress executing task that registered it
early (shared isWorkspaceOwnerLive predicate).
- A new isMergePending(taskId) = mergeActive ∪ mergeQueue seam (exposed from
ProjectEngine, wired through the runtime) guards both reconcilers against the
merge-queue dispatch window — a task dequeued-but-not-yet-merging is no longer
re-enqueued (which, since a same-task land lease isn't contention, could have
caused a concurrent double-squash).
- FORK-A: a repo whose branch is gone and which isn't landed is parked, not
re-enqueued forever. Orphan-worktree removal failures log.warn + bound.
recoverDoneTaskMergeMetadata skips workspace tasks.
Maintainability: dissolved the self-healing↔merger-ai import cycle by moving
isRepoLanded into a dependency-free workspace-land-predicate.ts; removed a
redundant cast.
Gate green: build, typecheck, lint, test:gate (649+58); self-healing + e2e +
project-engine + merger 724.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A real two-repo workspace lifecycle test in the engine-default lane (describeIfGit,
not the merge gate). Test 1 drives landWorkspaceTask on two acquired sub-repos and
asserts the NO-PUSH invariant directly: each sub-repo gets a real bare origin, and
the test snapshots every origin + remote-tracking ref before/after and asserts
byte-for-byte equality while the local refs/heads advance — a leaked push would
move an origin ref and fail. Plus per-repo landedSha and finalize-exactly-once.
Test 2 forces a repo-B conflict (repo A lands, task not done), then invokes the U1
reconcileWorkspacePartialLands reconciler under fake timers (enqueueMerge wired to
the real in-process route) and asserts recovery completes with no double-land of
repo A (its ref is unchanged from the first pass — proving the isRepoLanded skip).
Engine-default lane confirmed: test:gate stays 649+58 (did not enter engine-core).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Makes the self-healing layer workspace-aware and adds recovery for the states
Phase C introduced. No reconciler may wrongly finalize, skip, or move a workspace
task backward.
Existing reconcilers (the P0/P1 the feasibility check caught):
- recoverInterruptedMergingTasks no longer single-commit-finalizes a workspace
task: a workspace candidate clears the transient "merging" status and re-enqueues
via enqueueMerge (which routes to the idempotent landWorkspaceTask), never
reaching findLandedTaskCommit / moveTask(done) / task:merged — so a partial-landed
task (repo A landedSha, repo B not) is never marked fully merged on one repo's
commit. recoverStaleMergingStatus confirmed single-commit-free.
- recoverMergeableReviewTasks relaxes its Boolean(t.worktree) gate to also admit
isWorkspaceTask(t), so a zero-landed mergeable workspace task (null worktree) is
re-enqueued instead of silently skipped forever.
New reconcilers:
- reconcileWorkspacePartialLands: re-enqueues stuck non-done workspace merges via
enqueueMerge (idempotent skip of landed repos), guarded by allowsAutoMergeProcessing
(FN-5147), user-pause, and a workspace-aware liveness predicate (any sub-repo path
active via pathsForTask+isPathActive — triple-proof isn't workspace-aware). A repo
with its fusion/<id> branch gone AND landedSha unset is parked failed; branch-gone
but landed is skipped. Emits task:reconcile-workspace-partial-land(+-no-action).
- reclaimPhantomWorkspaceLandLeases: enumerates the new activeSessionRegistry
entriesByKind("workspace-repo-land"), age-gated by the FN-6736 floor, and clears a
lease whose owner is terminal/dead (live merging owners untouched). Emits
task:reclaim-phantom-workspace-land-lease.
- reconcileOrphanedWorkspaceWorktrees: removes a done workspace task's recorded
per-repo worktreePaths (isPathActive-guarded) with NO temp-root walk (AGENTS.md).
Emits task:reconcile-orphaned-workspace-worktree.
New activeSessionRegistry.entriesByKind seam; four DatabaseMutationType literals +
the AGENTS.md Run Audit list. Single-repo behavior byte-for-byte unchanged (every
path branches on isWorkspaceTask). 13 new fixture tests; 558 self-healing tests +
test:gate (649+58) green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5-persona review of the Phase-C per-repo merge loop. No P0; the no-push invariant
and retry/park accounting verified clean. Fixed:
Land mechanics (merger-ai.ts / active-session-registry.ts):
- persistRepoLandedSha no longer swallows the DB write: a failed landedSha write
after the ref advanced now escalates to WorkspacePartialLandError so the engine
parks/retries instead of silently re-landing (duplicate squash). isRepoLanded
gains a landedSha-independent fallback — it scans the integration ref for this
task's Fusion-Task-Id trailer (a squash commit is NOT a branch descendant, so a
branch-ancestor check is provably wrong), so an actually-landed repo is skipped
on retry.
- The land lease is now taskId-aware across kinds: any foreign-task holder on a
sub-repo path is contention (a merging task can't run over an executing task's
acquire lease), and registerPath throws ActiveSessionPathHeldByForeignTaskError
instead of silently clobbering a different task's entry.
- The per-repo loop is wrapped in try/finally(setStatus(null)) so the busy/partial
throws can't leave the task stuck 'merging'. WorkspacePartialLandError is a real
exported class (not a .name-mutated Error). finalizeWorkspaceTask re-reads fresh
and no longer swallows the mergeDetails write (TOCTOU). isRepoLanded exported for
Phase D.
Dispatch + doors (project-engine.ts / dashboard.ts / task.ts / @fusion/core):
- getTask-null in the partial-land catch fails closed (park) instead of defaulting
retries to 0 and scheduling an indefinite retry storm.
- The merge-confirmed reachability fast-path skips workspace tasks (its
representative commitSha is a sub-repo squash sha, unreachable in the root cwd —
it was demoting fully-merged tasks); they're verified by per-repo landedSha.
- The CLI/dashboard merge doors now return merged:true on full land (were hardcoded
merged:false). WorkspaceRepoLandBusyError re-enqueues with backoff WITHOUT burning
the mergeRetries quota (bounded busy counter) so contention can't park a healthy
task. Backoff capped at 60s. shouldRetryWorkspacePartialLand folded into
shouldRetryAutoMergeConflict. Catch switched to instanceof. New canonical
isWorkspaceTask predicate in @fusion/core.
Gate green: build, typecheck, lint, test:gate (649+58); workspace-merger + oracle
+ project-engine 174.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Apply the inline orange logo, software-factory framing, the
'See it in action' showcase (Command Center, workflows, agent chat,
chat rooms, agent mail), moved Quick start, and removed stat table to
all five locale READMEs, translating the new copy. Image paths and
section order match the English README exactly.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>