Skip to content
This repository was archived by the owner on Sep 4, 2026. It is now read-only.
This repository was archived by the owner on Sep 4, 2026. It is now read-only.

Dynamic semantic chat titles that follow the active task #210

Description

@ElbertePlinio

Summary

Make PickForge chat titles follow the work as it evolves instead of naming only the first prompt.

Current behavior already provides a strong base: chatAutoName.ts derives a title from the first meaningful prompt, accepts OSC 2 terminal titles, and stops after a manual rename. The missing piece is durable title ownership plus controlled refreshes later in the conversation.

Product decision

This is PickForge-owned behavior, not a required skill or MCP tool.

  • Skills can improve wording but cannot reliably mutate host UI.
  • MCP is the wrong default direction: title updates are host/session metadata, not a work tool the model should remember to call.
  • Provider integrations may emit title suggestions (OSC, ACP/session metadata, native events), but PickForge owns precedence, persistence, throttling, and manual override.
  • v1 makes no hidden background LLM call and adds no title-generation cost. It derives from user-owned task text and provider title signals. A tiny/hosted semantic title generator can be evaluated later.

Feature flag

Ship behind dynamicChatTitles, default off. Flag-off builds preserve the current title behavior and storage semantics.

  • merged behind flag dynamicChatTitles
  • tested on main with flag on
  • enabled in the target release
  • flag removed after shipping enabled

Title policy

Precedence:

  1. User rename — locks the title.
  2. Provider/session title signal — accepted only while auto-owned.
  3. PickForge local auto-title — fallback.

Refresh triggers:

  • first meaningful user prompt;
  • a provider plan/replan/title event;
  • every 3 completed meaningful user turns, using the latest task-defining user text;
  • never during streaming; commit at a stable turn boundary.

Guardrails:

  • Persist title source: default | auto | user, plus title_updated_at.
  • Do not rename when the normalized candidate is unchanged or generic.
  • Preserve existing title limits and casing/acronym behavior.
  • Manual rename wins across restarts.
  • Add “Resume automatic titles” beside manual rename controls.
  • Update every visible projection consistently: project/chat list, active header, and terminal/window title where applicable.
  • Never use tool output, file contents, secrets, hidden prompts, or assistant speculation as title source text.

Implementation plan

Keep this as one reviewable PR; migration and behavior are tightly coupled.

  • Add chat title provenance/timestamp migration and narrow database writes.
  • Move in-memory manual/auto ownership into persisted chat metadata.
  • Add milestone-based refresh policy to native agent chats.
  • Feed debounced OSC/provider title signals through the same policy.
  • Add “Resume automatic titles” UI.
  • Add deterministic unit tests for precedence, restart persistence, cadence, generic prompts, and manual lock.
  • Add one VRT/update for the rename control if its rendered state changes.
  • Update docs/releases/UNRELEASED.md after behavior is proven.
  • PR/review.

Acceptance

  • A new chat gets a useful title from the first meaningful task, not greetings/filler.
  • After 3 more meaningful completed user turns, a materially different task updates an auto-owned title.
  • Plan/replan or provider title events can refresh an auto-owned title without waiting for cadence.
  • A manual rename survives restart and is never overwritten.
  • Re-enabling automatic titles allows future refreshes without creating a new chat.
  • Terminal and native agent chats use the same ownership rules.
  • No extra model request, MCP call, or skill installation is required.

Validation

  • bun run test:unit -- chatAutoName
  • focused database migration tests
  • bun run build
  • bun run vrt when rendered controls change

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent-ideAgent IDE last-mileenhancementNew feature or requestflaggedFeature is dark on main behind a @pickforge/flags flaguxUX / interaction polish

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions