Skip to content

Automation Chat produces prose, never proposals — the chat workflow needs re-thinking #2004

Description

@Chris0Jeky

What happened (live dogfooding, 2026-08-23)

Created a chat session titled "Shopping" with no board context, then asked the assistant to improve a card on Angela's Board. Over four turns the assistant produced only prose: a clarification question, then a Markdown "revised task description", then the same description again with "Deadline: Today". No proposal was created. Nothing appeared in Review. Nothing changed on the board. From the user's seat there was no signal that anything was wrong — the assistant behaved as if it had done the work.

Transcript (abridged):

  • User: "can you update Angela's Board only task to make it tidy, better, better description?"
  • Assistant: Asking for clarification — 4 questions
  • User: "Just do your best"
  • Assistant: prose "Task Title: Board Management Optimization …" (entirely hallucinated content, unrelated to the real card)
  • User: "yeah, just do it, deadline for today"
  • Assistant: the same prose again with "Deadline: Today"

Root causes found

  1. No board context ⇒ no proposal is structurally possible. ChatService.HandleMessage gates every proposal attempt on session.BoardId.HasValue (backend/src/Taskdeck.Application/Services/ChatService.cs:461). The session in this transcript had none. The user names a board in the message ("Angela's Board") and the system never binds it, never asks, never warns — the board picker is a free-text "Board context (optional)" input in the sidebar that the user has no reason to know is load-bearing.
  2. "Request proposal generation" is an unchecked checkbox below the composer. useAutomationChat.ts:40 defaults requestProposal to false and resets it to false after every send (:272). The one control that turns chat from a text generator into an agent is off by default, unlabelled as to consequence, and self-disarming.
  3. The clarification loop has no exit. ClarificationDetector flags the response as a clarification and suppresses proposal creation entirely (ChatService.cs:449-456). "Just do your best" does not force best-effort; the model answered in prose and the loop simply ended with no action and no state change.
  4. The assistant never read the board. It invented "Board Management Optimization" out of the session title. Without board context there is no read-set, so the model confabulates a card that does not exist and the user cannot tell.

Why this matters

Taskdeck's whole premise is capture → proposal → human review → apply. Chat is the surface where a user naturally expresses intent, and in its current shape it produces zero proposals for the most obvious phrasing of the most obvious task. It reads as a chatbot bolted next to the product rather than the front door to it.

What needs re-thinking (not just a patch)

This is a workflow redesign, not a bug fix. Suggested shape — to be settled by an ADR before implementation:

  • Every chat session is board-scoped, or the first turn resolves a board. If the user names a board in natural language, resolve it and confirm inline; if it is ambiguous, ask that question rather than four generic ones.
  • Acting is the default, prose is the exception. Remove or invert the "Request proposal generation" checkbox: the agent should always attempt to turn actionable intent into operations, and say plainly when it cannot.
  • Grounding before generation. An instruction that names an existing card must trigger a board read, so the diff is against the real card, not an invented one. Provenance already has a place to record this.
  • Clarification must terminate. After one clarification round, "just do it" / "do your best" forces a best-effort proposal (the plumbing exists — forceBestEffort in ChatService.cs:450); a proposal the user can reject is strictly better than prose the user cannot act on.
  • Always land somewhere. Every actionable turn should end with either a proposal ID linked into Review, or an explicit "I could not act, because X" — never a wall of Markdown that looks like completed work.

Acceptance criteria

  • ADR recorded in docs/decisions/ covering board binding, default-to-act, grounding, and clarification termination for the chat surface.
  • A session with no bound board cannot silently swallow an actionable instruction — the user is told, in the turn, that no board is bound and given a way to bind one.
  • "update on " phrased naturally produces a proposal visible in Review, with the diff computed against the real card.
  • A clarification round followed by "just do your best" terminates in a proposal or an explicit refusal, never in prose-as-if-done.
  • Assistant output never presents generated text as an applied change.
  • Tests cover: unbound-board actionable message, clarification-then-force, and grounded update against an existing card.

Evidence

Live session 71e202fd-22f0-4c9d-9308-6ab7952ecc63, board "Angela's Board", OpenAI gpt-4o-mini, 2026-08-23 16:32–16:34.

Related

Reported alongside GH-2005 (capture due date dropped end-to-end) and GH-2006 (date-field picker affordance) from the same dogfooding pass.

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

    Priority IRelease-blocking or trust-breaking now; release scope still requires milestone membership.automationProposal/triage/workflow automation mechanics and automation policy control planes.backendPrimary implementation impact in .NET API/domain/application/infrastructure.bugSomething isn't workingdogfoodingFrom real personal/beta use; evidence-grade product feedback (exempt from intake severity bar).frontendPrimary implementation impact in Vue/TypeScript UI and client runtime.llmAI/provider/planner/executor/chat-related implementation and policy work.uxDiscoverability, accessibility, interaction model, and user workflow quality.

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions