## What
The FNXC convention exists so a reader can place a note against the
change that motivated it. A stamp dated *after* the edit landed defeats
exactly that.
This is program-wide drift, not one author's slip — I contributed to it
in my own commits this week, which is how I noticed it.
## Measured, on this tree
**104 stamps across 61 files** dated later than the day they were
written, from one day ahead to **2026-10-19 (81 days)**:
| count | date | count | date | count | date |
|---|---|---|---|---|---|
| 50 | 2026-07-31 | 6 | 2026-08-05 | 3 | 2026-08-13 |
| 17 | 2026-08-01 | 1 | 2026-08-07 | 1 | 2026-08-19 |
| 7 | 2026-08-02 | 1 | 2026-08-12 | 2 | 2026-08-26 |
| 11 | 2026-08-03 | | | 3 | 2026-10-19 |
An earlier number I circulated was ~70. That came from a narrower
pathspec and was wrong; **104** is the measurement.
## How
Each stamp is rewritten to the date of the commit that introduced **that
line**, via per-line `git blame` — deliberately *not* stamped uniformly
with today's date. A uniform stamp swaps a wrong date for a different
wrong date and flattens the ordering that makes these comments
navigable; blame preserves it. Times of day are untouched, and a blame
date in the future is clamped rather than trusted.
## Why the verification is listed
A docs sweep across 61 files is precisely where a stray edit hides, so
the safety claims are mechanical rather than asserted:
- every changed line begins with a comment marker — **no code touched**;
- **no test asserts an FNXC date later than today**, so no `toContain`
assertion on embedded source text can be silently invalidated (several
such assertions do exist);
- CSS files, which carry several of those assertions, are outside the
pathspec.
## Verified
lint clean · merge gate green (487 + 158 + 10 + 71) · `census --strict`
exit 0 · tsc clean for core, engine, and dashboard
(`tsconfig.app.json`).
**No behavior change.** Comment text only.
## Not done here
A guard preventing recurrence. A check that rejects an FNXC stamp dated
after the commit would stop this returning, but it needs a decision
about where it runs (lint rule vs. gate) and it is a behavior change to
CI — it does not belong riding inside the sweep it would police.
Assign context-menu-created tags to their open conversations immediately.
- Return the created chat tag from the chat hook.
- Preserve existing session tags while assigning the new tag through either creation control.
- Cover Enter, Add, existing-tag, and blank-name paths.
- Add a patch changeset for the chat-tag behavior fix.
Files changed:
.changeset/fn-8568-chat-tag-creation.md | 7 ++
packages/dashboard/app/components/ChatView.tsx | 36 ++++++++-
.../__tests__/ChatView.core-interactions.test.tsx | 90 ++++++++++++++++++++++
packages/dashboard/app/hooks/useChat.ts | 4 +-
4 files changed, 133 insertions(+), 4 deletions(-)
Fusion-Task-Id: FN-8568
Fusion-Task-Lineage: 38ee0e02-adbb-4b21-9058-486310da2190
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
With showTaskChatsInCommonFeed enabled, task-planner sessions appear in the
common Direct feed, so /new//clear there hit ChatView's generic intercept and
createSession orphaned the task's planner history behind a fresh session.
Consume the command with a warning toast for task-bound sessions instead.
Also updates 6 stale ChatView.core.test.tsx sendMessage assertions broken by
FN-8502's onDelivered/onFailed options argument.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Keep live chat and log viewers from snapping readers back to the bottom while streamed content grows.
- Track pinned-bottom state synchronously across task chat, general chat, and agent logs.
- Follow streamed DOM and layout growth only when the reader remains at the tail.
- Add regression coverage and a patch changeset.
Files changed:
.changeset/fn-8339-chat-scroll-follow.md | 7 +++
.../dashboard/app/components/AgentLogViewer.tsx | 52 +++++++++++--------
packages/dashboard/app/components/ChatView.tsx | 4 ++
packages/dashboard/app/components/TaskChatTab.tsx | 59 ++++++++++++++++------
.../__tests__/AgentLogViewer.layout.test.tsx | 58 ++++++++++++++++++++-
.../__tests__/ChatView.streaming-thread.test.tsx | 18 ++++++-
.../app/components/__tests__/TaskChatTab.test.tsx | 34 +++++++++++++
7 files changed, 195 insertions(+), 37 deletions(-)
Fusion-Task-Id: FN-8339
Fusion-Task-Lineage: 8f1290ea-de87-4edc-b343-f50c0ba55bad
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Let operators open Chat from a selected GitHub issue or pull request with its link ready in the composer.
- Add GitHub-only Chat actions to import detail views and route their prefill through modal and embedded surfaces.
- Seed and focus the direct Chat composer without sending, while preserving saved drafts after failed default-session creation.
- Document the workflow and cover import, prefill, and draft-restoration behavior.
Files changed:
docs/dashboard-guide.md | 12 +++-
packages/dashboard/app/App.tsx | 16 +++++
packages/dashboard/app/components/AppModals.tsx | 3 +
packages/dashboard/app/components/ChatView.tsx | 70 +++++++++++++++++++-
.../dashboard/app/components/GitHubImportModal.tsx | 28 +++++++-
.../components/__tests__/ChatView.draft.test.tsx | 74 ++++++++++++++++++++++
.../__tests__/GitHubImportModal.test.tsx | 49 ++++++++++++++
.../app/components/dashboard/MainContent.tsx | 5 ++
.../dashboard/app/components/dashboard/types.ts | 3 +
9 files changed, 255 insertions(+), 5 deletions(-)
Fusion-Task-Id: FN-8266
Fusion-Task-Lineage: 30102ce8-5aca-4e34-8bb0-6f3c23e64044
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Reworks chat message footer affordances: the scroll-to-top control now only becomes visible once a message's top is actually clipped above the visible thread viewport, and the edit pencil moves from a standalone action row into the timestamp footer beside user messages.
- ChatView measures assistant message tops on scroll/message changes (rAF-scheduled) and tracks which message IDs are currently clipped above the `.chat-messages` container edge
- StandardChatMessageItem accepts a new `isTopClipped` prop; the go-to-top button stays DOM-mounted (for tests/a11y) but is visually hidden via CSS until clipped
- Merged the assistant thinking/copy/scroll-to-top actions into a single collapsible footer row instead of separate action rows
- Moved the user-message edit pencil into an inline `chat-message-time-row` next to the relative timestamp instead of a standalone action row above it
- Updated ChatView.css for the new inline layout, collapsed-row state, and hidden/visible scroll-to-top button states
- Updated message-edit and scroll-to-top tests to cover the new inline placement and clipped-visibility behavior
- Added changeset and docs/dashboard-guide.md note describing the new behavior
Files changed:
.changeset/fn-7918-chat-inline-icons.md | 7 ++
docs/dashboard-guide.md | 6 +-
packages/dashboard/app/components/ChatView.css | 80 +++++++++++++++-------
packages/dashboard/app/components/ChatView.tsx | 52 +++++++++++++-
.../app/components/StandardChatSurface.tsx | 33 +++++++--
.../__tests__/ChatView.message-edit.test.tsx | 34 ++++++++-
.../__tests__/ChatView.scroll-to-top.test.tsx | 75 +++++++++++++++++++-
7 files changed, 253 insertions(+), 34 deletions(-)
Fusion-Task-Id: FN-7918
Fusion-Task-Lineage: 76206cd2-94a8-47be-b282-94943e184d01
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Extend the chat brain-icon popup and its backing session PATCH route so an
active Direct chat's model or agent can be switched mid-conversation instead
of only being set at creation time.
- Add a Model/Agent section to ChatThinkingLevelControl (the brain-icon
popup) for picking a model provider/model or retargeting to a real agent
without leaving the chat.
- Extend PATCH /api/chat/sessions/:id to accept modelProvider/modelId (as a
validated pair via the existing validateModelPair helper) and agentId,
forwarding only the keys present in the body so omitted fields leave the
session's stored target untouched.
- Add chat-store updateSession support for the agentId clause alongside the
existing model/thinkingLevel fields, and a useChat.setSessionModel hook
for the dashboard to call the new PATCH capability.
- Update i18n locale strings (en/es/fr/ko/zh-CN/zh-TW) and dashboard-guide.md
docs for the new switcher UI.
- Add unit/integration test coverage across chat-store, chat-manager,
chat-routes, useChat, ChatThinkingLevelControl, and ChatView for the new
model/agent switch behavior.
- Add changeset fn-7908-chat-model-agent-switcher.md (minor,
@runfusion/fusion).
Files changed:
.changeset/fn-7908-chat-model-agent-switcher.md | 7 +
docs/dashboard-guide.md | 3 +-
packages/core/src/__tests__/chat-store.test.ts | 21 ++
packages/core/src/chat-store.ts | 8 +
packages/core/src/chat-types.ts | 2 +
packages/dashboard/app/api/legacy.ts | 11 +-
.../app/components/ChatThinkingLevelControl.tsx | 219 ++++++++++++++++++---
packages/dashboard/app/components/ChatView.css | 135 ++++++++++++-
packages/dashboard/app/components/ChatView.tsx | 23 ++-
.../__tests__/ChatThinkingLevelControl.test.tsx | 109 +++++++++-
.../__tests__/ChatView.thinking-level.test.tsx | 67 ++++++-
.../dashboard/app/hooks/__tests__/useChat.test.ts | 166 +++++++++++++++-
packages/dashboard/app/hooks/useChat.ts | 56 ++++++
.../dashboard/src/__tests__/chat-manager.test.ts | 38 ++++
.../dashboard/src/__tests__/chat-routes.test.ts | 117 ++++++++++-
.../dashboard/src/routes/register-chat-routes.ts | 48 ++++-
packages/i18n/locales/en/app.json | 8 +-
packages/i18n/locales/es/app.json | 8 +-
packages/i18n/locales/fr/app.json | 8 +-
packages/i18n/locales/ko/app.json | 8 +-
packages/i18n/locales/zh-CN/app.json | 8 +-
packages/i18n/locales/zh-TW/app.json | 8 +-
22 files changed, 1007 insertions(+), 71 deletions(-)
Fusion-Task-Id: FN-7908
Fusion-Task-Lineage: b1104865-9b0c-4d77-973e-89152fe245e0
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Chat thinking-level Default entries hardcoded "off" instead of showing the project/global resolved default, misleading operators about which level would actually apply.
- ChatView now fetches Settings via fetchSettings on mount and derives resolvedDefaultThinkingLevel from settings.defaultThinkingLevel (falling back to "off")
- Threads resolvedDefaultThinkingLevel into NewChatDialog and the in-chat ChatThinkingLevelControl (Brain popup) so both surfaces show e.g. "Default (medium)" instead of always "Default (off)"
- ChatThinkingLevelControl accepts a new optional defaultThinkingLevel prop (defaults to "off" for backward compatibility) used only for the Default/clear option label
- Updates dashboard-guide.md to document the resolved-default label behavior in both the New Chat dialog and the in-chat Brain popup
- Adds/updates tests: new ChatThinkingLevelControl coverage for the label prop, new ChatView.thinking-level test coverage for the resolved default, and mocks fetchSettings in the other ChatView test suites that render ChatView
- Adds a patch changeset for @runfusion/fusion
Files changed:
.changeset/fn-7905-chat-thinking-default.md | 7 ++++
docs/dashboard-guide.md | 5 +--
.../app/components/ChatThinkingLevelControl.tsx | 9 +++--
packages/dashboard/app/components/ChatView.tsx | 36 ++++++++++++++++---
.../__tests__/ChatThinkingLevelControl.test.tsx | 16 +++++++++
.../__tests__/ChatView.chat-commands.test.tsx | 1 +
.../__tests__/ChatView.content-search.test.tsx | 1 +
.../__tests__/ChatView.context-window.test.tsx | 1 +
.../__tests__/ChatView.copy-response.test.tsx | 1 +
.../__tests__/ChatView.core-contracts.test.tsx | 1 +
.../__tests__/ChatView.core-interactions.test.tsx | 1 +
.../components/__tests__/ChatView.core.test.tsx | 1 +
.../__tests__/ChatView.default-model-icon.test.tsx | 1 +
.../__tests__/ChatView.hash-mention.test.tsx | 1 +
.../components/__tests__/ChatView.mobile.test.tsx | 1 +
.../__tests__/ChatView.sessions-rooms.test.tsx | 1 +
.../__tests__/ChatView.streaming-thread.test.tsx | 1 +
.../__tests__/ChatView.thinking-level.test.tsx | 42 ++++++++++++++++++++++
18 files changed, 119 insertions(+), 8 deletions(-)
Fusion-Task-Id: FN-7905
Fusion-Task-Lineage: 7290aa8a-f812-43c3-8ba5-fc31a3f4579e
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Greptile/CodeRabbit review of the chat slash-command framework:
- Composer-wipe race: ChatView and TaskPlannerChatTab cleared the composer
inside the command's success callback, silently wiping any text the user
typed while the command was in flight. Clear on submit (before the network
round-trip) instead — consistent with normal chat send, which also clears
immediately and does not restore on failure.
- Attachments were silently dropped when dispatching a slash command in
ChatView (clearing the composer revokes staged attachment URLs). Block
dispatch with a warning toast when attachments are staged.
- CHAT_COMMANDS is now a readonly array; helper signatures accept
readonly ChatCommand[].
- The planner command menu (commands-only) used skill-menu aria-label/empty
copy; use command-specific copy instead.
Add regression tests: in-flight text survives command success, composer
clears on submit even on failure, attachment dispatch is blocked, and the
planner command menu uses command-specific accessible copy.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds a chat command registry and the /steer command for task-bound
chats. Commands are triggered by '/' and dispatch through a common
match/dispatch path alongside existing skills autocomplete.
Fix Chat header showing thread controls (session switcher, back button, room header) while the conversation list is still displayed on mobile after re-entering Chat, since restored session/room state no longer implied the detail pane was visible.
- Derive mobileThreadPaneOpen from actual sidebar visibility (!sidebarVisible) combined with active thread/room state instead of relying solely on restored session/room presence.
- Gate showMobileSessionSwitcher, showMobileDirectThreadHeaderControls, and new showMobileRoomThreadHeaderControls off the corrected mobileThreadPaneOpen signal.
- Wrap the room thread header in showMobileRoomThreadHeaderControls so it only renders when the detail pane is actually shown.
- Add regression coverage in ChatView.mobile.test.tsx and ChatView.swipe-back.test.tsx for the list-shown-after-remount case.
- Add changeset documenting the fix.
Files changed:
.changeset/fn-7784-chat-header-list-consistency.md | 7 +
packages/dashboard/app/components/ChatView.tsx | 18 ++-
.../components/__tests__/ChatView.mobile.test.tsx | 141 +++++++++++++++++++--
.../__tests__/ChatView.swipe-back.test.tsx | 74 +++++++++--
4 files changed, 214 insertions(+), 26 deletions(-)
Fusion-Task-Id: FN-7784
Fusion-Task-Lineage: e2571efa-dff9-43ef-af09-f7d2ce32788b
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Mobile direct-chat dropdowns now identify sessions by conversation title instead of model-name text.
- Render the mobile session trigger with the conversation title or Untitled while preserving the provider logo.
- Remove mobile trigger model-tag styling and assert the model badge stays out of the compact header.
- Document the mobile Chat dropdown behavior and add a patch changeset for the published CLI package.
Files changed:
.changeset/fn-7462-mobile-chat-dropdown-title.md | 7 ++++
docs/dashboard-guide.md | 2 +-
packages/dashboard/app/components/ChatView.css | 8 -----
packages/dashboard/app/components/ChatView.tsx | 8 +++--
.../__tests__/ChatView.core-contracts.test.tsx | 25 +++++++++++---
.../components/__tests__/ChatView.mobile.test.tsx | 39 +++++++++++++++++++++-
6 files changed, 72 insertions(+), 17 deletions(-)
Fusion-Task-Id: FN-7462
Fusion-Task-Lineage: 6a6e2ac3-ecca-4076-81c5-b4e4a65eb286
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Keep the mobile direct-chat header on a single left-aligned row without losing accessible context.
- Hide the direct-chat ViewHeader title shell from layout while preserving the accessible Chat heading.
- Keep the back button first and the active session switcher beside it on a non-wrapping mobile row.
- Extend mobile chat coverage for long duplicate session titles, Bot fallback labels, and the CSS layout contract.
- Document the updated mobile Chat header behavior and add a patch changeset.
Files changed:
.changeset/fn-7455-mobile-chat-header-layout.md | 7 ++
docs/dashboard-guide.md | 2 +-
packages/dashboard/app/components/ChatView.css | 17 +++--
packages/dashboard/app/components/ChatView.tsx | 4 +-
.../components/__tests__/ChatView.mobile.test.tsx | 80 ++++++++++++++++++++--
5 files changed, 98 insertions(+), 12 deletions(-)
Fusion-Task-Id: FN-7455
Fusion-Task-Lineage: fe14b542-ff6a-437b-ad89-8011c2b3c299
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Collapse the mobile direct chat header into the shared top row.
- Move the mobile direct-thread back button and session switcher into ViewHeader actions.
- Hide the redundant mobile thread header while preserving desktop thread identity and context details.
- Update mobile chat styling, docs, changeset, and header contract tests for the single-row layout.
Files changed:
.changeset/fn-7450-mobile-chat-header.md | 7 +
docs/dashboard-guide.md | 3 +-
packages/dashboard/app/components/ChatView.css | 53 +++++-
packages/dashboard/app/components/ChatView.tsx | 197 +++++++++++----------
.../__tests__/ChatView.core-contracts.test.tsx | 48 ++---
.../components/__tests__/ChatView.mobile.test.tsx | 76 ++++++--
6 files changed, 256 insertions(+), 128 deletions(-)
Fusion-Task-Id: FN-7450
Fusion-Task-Lineage: c266a9b8-7fb1-410e-9c35-adad4c6a2d47
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Adds a mobile direct-chat shortcut for starting a new chat from the session switcher.
- Add a New Chat menuitem to the mobile direct-chat session dropdown using the existing NewChatDialog flow.
- Style the new mobile switcher action with touch-friendly spacing and focus handling.
- Extend mobile ChatView tests and docs, and add a changeset for the published CLI package.
Files changed:
.changeset/fn-7120-mobile-new-chat.md | 7 ++
docs/dashboard-guide.md | 2 +-
packages/dashboard/app/components/ChatView.css | 31 ++++++
packages/dashboard/app/components/ChatView.tsx | 17 +++
.../components/__tests__/ChatView.mobile.test.tsx | 115 +++++++++++++++++++--
5 files changed, 162 insertions(+), 10 deletions(-)
Fusion-Task-Id: FN-7120
Fusion-Task-Lineage: 5d066667-20c1-4015-9b84-a9e558eecd48
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
- 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>