You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Source: GlitchTip sweep of demo.tale.dev, 2026-09-02 (evening pass). Tracked on the board as TAL-29. Born after the morning 06:10Z sweep finished querying, so no prior task or repo issue covers it: #1991 (closed) fixed the human create-task form (client trim/max-length); this is the agent/workspace-tool path.
The platform's own nightly triage automation tripped it: the event sits 25 seconds before that run created its task (TAL-28, 06:10:50Z) — the agent passed an empty/whitespace (or over-max) title through the workspace task_create tool, got an opaque refusal, and recovered by retrying. Every agent that files tasks can reproduce this, and agent traffic on this surface is growing.
Read
"Title is empty after trim / too long" is an expected validation refusal, and it fails badly three ways:
Code-only error: the ConvexError carries {code: "TASK_TITLE_INVALID"} with no message, no offending value, no limit — the calling agent cannot tell empty-after-trim from over-max or learn TASK_TITLE_MAX. Contrast the platform's own better convention: connectors' INPUT_INVALID carries message + hint + "you passed: …" (TALE-PROJECT-11M), and the Postgres-port twin services/platform/backend/domains/tasks/service.ts:210 (validateTitle) at least throws TaskError('TASK_TITLE_INVALID', 'Invalid title').
Validation sits deep in the internal mutation instead of the agent tool boundary (workspace_domain_tools / write shim), so the bridge surfaces a mutation crash rather than a structured invalid_args result.
Module note: convex/tasks/internal_mutations.ts is private-overlay (absent from the public tree — same situation as #3110/#3111/#3129); the Postgres-port backend/domains/tasks/service.ts and backend/core/node_only/sandbox/workspace_domain_tools.ts are public.
Fix direction
Message-carrying refusal: throw ConvexError with code + message + which constraint failed (empty vs > TASK_TITLE_MAX, include the max), aligned with the TaskError shape and the INPUT_INVALID convention, in both the convex overlay and the Postgres port.
Validate at the tool boundary: task_create / task_upsert_by_external_ref normalize+validate the title before invoking the mutation, returning a structured invalid_args result the agent can act on in one round-trip.
An agent calling task_create with "", whitespace, or an over-max title receives a structured refusal naming the constraint and limit; the run can self-correct without guessing.
No error-level GlitchTip event is minted for it; TALE-PROJECT-12H stays flat.
Filed from the GlitchTip sweep of 2026-09-02. Board task: TAL-29.
Source: GlitchTip sweep of demo.tale.dev, 2026-09-02 (evening pass). Tracked on the board as TAL-29. Born after the morning 06:10Z sweep finished querying, so no prior task or repo issue covers it: #1991 (closed) fixed the human create-task form (client trim/max-length); this is the agent/workspace-tool path.
Evidence
Uncaught ConvexError: {"code":"TASK_TITLE_INVALID"}— 1 event, 2026-09-02T06:10:25Z, error level. Tags:func: tasks/internal_mutations:agentCreateTask(mutation),request_id e799de1b789564f1. Stack:convex/tasks/internal_mutations.ts:199(handler) →:148(trimTitle).task_createtool, got an opaque refusal, and recovered by retrying. Every agent that files tasks can reproduce this, and agent traffic on this surface is growing.Read
"Title is empty after trim / too long" is an expected validation refusal, and it fails badly three ways:
{code: "TASK_TITLE_INVALID"}with no message, no offending value, no limit — the calling agent cannot tell empty-after-trim from over-max or learnTASK_TITLE_MAX. Contrast the platform's own better convention: connectors'INPUT_INVALIDcarriesmessage+hint+ "you passed: …" (TALE-PROJECT-11M), and the Postgres-port twinservices/platform/backend/domains/tasks/service.ts:210(validateTitle) at least throwsTaskError('TASK_TITLE_INVALID', 'Invalid title').workspace_domain_tools/ write shim), so the bridge surfaces a mutation crash rather than a structuredinvalid_argsresult.Module note:
convex/tasks/internal_mutations.tsis private-overlay (absent from the public tree — same situation as #3110/#3111/#3129); the Postgres-portbackend/domains/tasks/service.tsandbackend/core/node_only/sandbox/workspace_domain_tools.tsare public.Fix direction
ConvexErrorwith code + message + which constraint failed (empty vs >TASK_TITLE_MAX, include the max), aligned with theTaskErrorshape and theINPUT_INVALIDconvention, in both the convex overlay and the Postgres port.task_create/task_upsert_by_external_refnormalize+validate the title before invoking the mutation, returning a structuredinvalid_argsresult the agent can act on in one round-trip.Acceptance
task_createwith"", whitespace, or an over-max title receives a structured refusal naming the constraint and limit; the run can self-correct without guessing.Filed from the GlitchTip sweep of 2026-09-02. Board task: TAL-29.