From ce3f55fec9490a09767f2104c45e149d7115f2ec Mon Sep 17 00:00:00 2001 From: gsxdsm Date: Sat, 18 Jul 2026 02:20:31 -0700 Subject: [PATCH] FN-8263: reflect session advisor state in task-detail eye Keep the task-detail oversight indicator aligned with the effective session advisor state. - Show and light the oversight eye for enabled advisor inheritance while lifecycle oversight is off or unresolved. - Limit unresolved advisor-only menus to the session advisor toggle and repaint the icon after toggles. - Cover desktop and mobile behavior and document the interaction. Files changed: .changeset/fn-8263-session-advisor-detail-eye.md | 7 ++ docs/dashboard-guide.md | 6 +- .../dashboard/app/components/TaskDetailModal.tsx | 47 ++++++---- .../TaskDetailModal.oversight-controls.test.tsx | 101 +++++++++++++++++++++ .../TaskDetailModal.oversight-mobile.test.tsx | 40 ++++++++ 5 files changed, 183 insertions(+), 18 deletions(-) Fusion-Task-Id: FN-8263 Fusion-Task-Lineage: 61cd134c-7721-4e19-89a9-a406358f54a9 Co-authored-by: Fusion (runfusion.ai) --- .../fn-8263-session-advisor-detail-eye.md | 7 ++ docs/dashboard-guide.md | 6 +- .../app/components/TaskDetailModal.tsx | 47 +++++--- ...askDetailModal.oversight-controls.test.tsx | 101 ++++++++++++++++++ .../TaskDetailModal.oversight-mobile.test.tsx | 40 +++++++ 5 files changed, 183 insertions(+), 18 deletions(-) create mode 100644 .changeset/fn-8263-session-advisor-detail-eye.md diff --git a/.changeset/fn-8263-session-advisor-detail-eye.md b/.changeset/fn-8263-session-advisor-detail-eye.md new file mode 100644 index 0000000000..bf33d02471 --- /dev/null +++ b/.changeset/fn-8263-session-advisor-detail-eye.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": patch +--- + +summary: The task-detail oversight eye icon now reflects the session advisor's on/off state even when planner oversight is off. +category: fix +dev: TaskDetailModal surfaces and lights the detail-oversight-menu-trigger Eye whenever effectiveSessionAdvisorEnabled (resolveTaskSessionAdvisorEnabled: task override / project sessionAdvisorEnabledByDefault / workflow plannerOverseerAdvisorEnabled) is true, independent of the lifecycle oversight level, and repaints on toggle at both breakpoints. diff --git a/docs/dashboard-guide.md b/docs/dashboard-guide.md index fc440823eb..bea0140b16 100644 --- a/docs/dashboard-guide.md +++ b/docs/dashboard-guide.md @@ -248,8 +248,10 @@ FNXC:QuickAddActionRow 2026-07-16-16:00: FN-8194 aligns task-detail metadata act FNXC:PlannerOversight 2026-07-17-13:18: FN-8233 makes the task-detail Oversight trigger communicate the combined effective overseer state: it uses Eye when the oversight level is active or the Session advisor is enabled, and EyeOff only when both are off. -FNXC:PlannerOversight 2026-07-18-12:00: FN-8247 requires Stop to disable both lifecycle oversight and the independently-enabled session advisor, including its live runtime, so project/workflow defaults cannot leave advisor comments running after an operator stops it. --> -- The task detail modal's inline meta-controls cluster follows Quick Add order: compact **Attach file** (`data-testid="detail-inline-attach"`), eligible-task **GitHub tracking** toggle (`data-testid="detail-inline-github-toggle"`), **Oversight**, Priority, and Execution mode. Attach opens the existing task attachment picker; GitHub toggles the existing tracking setting and is omitted for GitLab-tracked or non-editable tasks. The Oversight control exposes planner-overseer actions behind a compact **"Oversight" overflow-menu button** (`data-testid="detail-oversight-menu-trigger"`, `Eye` when the oversight level is active or the Session advisor is enabled, otherwise `EyeOff`, `aria-haspopup="menu"`) on every viewport, desktop and mobile alike. Clicking the trigger opens a `role="menu"` popover (mirroring the existing move-action dropdown pattern) containing: a **quick oversight-level select** (`data-testid="detail-oversight-level-select"`) that writes the per-task `plannerOversightLevel` override (Off/Observe/Steer/Autonomous recovery) or clears it back to the inherited workflow/project default via an "Inherit" option; a **manual nudge** button (`data-testid="detail-overseer-nudge"`) that asks the overseer to inject one guidance-only steering comment into the currently watched stage right now (never a merge/PR/destructive action), disabled when the overseer is off/inactive or the task is user-paused/done/archived/`autoMerge:false` in-review; a **Stop** button (`data-testid="detail-overseer-stop"`) that disables both active lifecycle oversight and the session advisor for the task (confirmation-gated), including its live advisor runtime; it is hidden once oversight is already off; and an **explain current action** button (`data-testid="detail-overseer-explain"`) that toggles a small read-only panel (`data-testid="detail-overseer-explain-panel"`) showing the overseer's watched stage, reason, last action, and attempt count/limit, with a non-empty-shell inactive state when the overseer is not currently watching. All three action controls call the `POST /tasks/:id/overseer/nudge`, `POST /tasks/:id/overseer/stop`, and `GET /tasks/:id/overseer/explain` routes. The trigger itself is withheld entirely when none of the menu's controls would render (no empty-shell overflow button for the unresolved-default case). +FNXC:PlannerOversight 2026-07-18-12:00: FN-8247 requires Stop to disable both lifecycle oversight and the independently-enabled session advisor, including its live runtime, so project/workflow defaults cannot leave advisor comments running after an operator stops it. + +FNXC:PlannerOversight 2026-07-18-14:00: FN-8263 requires the task-detail Eye to remain visible and lit for an effective session advisor even when lifecycle oversight is off or awaiting workflow resolution. Advisor-only menus expose only the advisor toggle; lifecycle controls wait for resolved active oversight. --> +- The task detail modal's inline meta-controls cluster follows Quick Add order: compact **Attach file** (`data-testid="detail-inline-attach"`), eligible-task **GitHub tracking** toggle (`data-testid="detail-inline-github-toggle"`), **Oversight**, Priority, and Execution mode. Attach opens the existing task attachment picker; GitHub toggles the existing tracking setting and is omitted for GitLab-tracked or non-editable tasks. The Oversight control exposes planner-overseer actions behind a compact **"Oversight" overflow-menu button** (`data-testid="detail-oversight-menu-trigger"`, `Eye` when the oversight level is active or the Session advisor is enabled, otherwise `EyeOff`, `aria-haspopup="menu"`) on every viewport, desktop and mobile alike. Clicking the trigger opens a `role="menu"` popover (mirroring the existing move-action dropdown pattern) containing: a **quick oversight-level select** (`data-testid="detail-oversight-level-select"`) that writes the per-task `plannerOversightLevel` override (Off/Observe/Steer/Autonomous recovery) or clears it back to the inherited workflow/project default via an "Inherit" option; a **manual nudge** button (`data-testid="detail-overseer-nudge"`) that asks the overseer to inject one guidance-only steering comment into the currently watched stage right now (never a merge/PR/destructive action), disabled when the overseer is off/inactive or the task is user-paused/done/archived/`autoMerge:false` in-review; a **Stop** button (`data-testid="detail-overseer-stop"`) that disables both active lifecycle oversight and the session advisor for the task (confirmation-gated), including its live advisor runtime; it is hidden once oversight is already off; and an **explain current action** button (`data-testid="detail-overseer-explain"`) that toggles a small read-only panel (`data-testid="detail-overseer-explain-panel"`) showing the overseer's watched stage, reason, last action, and attempt count/limit, with a non-empty-shell inactive state when the overseer is not currently watching. All three action controls call the `POST /tasks/:id/overseer/nudge`, `POST /tasks/:id/overseer/stop`, and `GET /tasks/:id/overseer/explain` routes. The trigger is withheld only for an unresolved task with neither lifecycle oversight controls nor a session-advisor applicability signal. When the effective session advisor is on (task override, project default, or workflow legacy setting), it remains visible and lit even while lifecycle oversight is off or unresolved; toggling it repaints the icon immediately. In the advisor-only unresolved state, the menu contains only the Session advisor toggle: the level select, Nudge, Stop, Explain, and Interventions controls remain hidden until lifecycle oversight resolves and is active. - The controls inside the Oversight menu carry a visible, non-interactive **`"Overseer controls"` group label** (`data-testid="detail-oversight-controls-label"`) so Nudge/Stop/Explain read as an identifiable cluster rather than unlabeled entries; the label is gated by the same `(hasTaskOversightOverride || workflowOversightResolved) && !oversightIsOff` condition as the buttons, so it never renders when oversight is Off/unresolved (opening the menu in that state shows only the level select). When **Nudge** is disabled, an always-visible helper line (`data-testid="detail-overseer-nudge-disabled-reason"`) states the reason in-DOM (mirroring the existing hover `title`) instead of relying on a mouse-hover tooltip alone. **Explain** is read-only and non-mutating, so it is never disabled purely because the overseer is inactive — clicking it always opens/closes the panel, which shows the overseer's live state when watching or an informative "not currently watching this task" message otherwise. Nudge's mutating enablement rule (`canNudgeOverseer`, including the human-control suppression cases) and Stop's confirmation dialog are unchanged.