{"record":{"id":"492dff0c2ef64f0b","repo":"mastra-ai/mastra","slug":"state-signal-id-is-required","errorCode":null,"errorMessage":"state signal id is required","messagePattern":"state signal id is required","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/core/src/agent/state-signals.ts","lineNumber":204,"sourceCode":"\n  return {\n    ...deriveStateSignalHistory(resolvedStateSignals.length > 0 ? resolvedStateSignals : localStateSignals),\n    contextWindow,\n  };\n}\n\nexport function createStateSignalInput(\n  input: AgentStateSignalInput | (Omit<AgentStateSignalInput, 'id'> & { id?: string }),\n  options?: { defaultId?: string; acceptedAt?: Date },\n): {\n  stateId: string;\n  signal: Extract<CreatedAgentSignal, { type: 'state' }>;\n  mode: 'snapshot' | 'delta';\n  cacheKey: string;\n} {\n  const stateId = input.id ?? options?.defaultId;\n  if (!stateId) {\n    throw new Error('state signal id is required');\n  }\n  if (!input.cacheKey) {\n    throw new Error('state signal cacheKey is required');\n  }\n\n  const mode = input.mode ?? 'snapshot';\n  const { id: _stateId, cacheKey, mode: _mode, value, delta, metadata, ...signalInput } = input;\n  const signal = createSignal({\n    ...signalInput,\n    type: 'state',\n    tagName: signalInput.tagName ?? 'state',\n    acceptedAt: options?.acceptedAt,\n    metadata: {\n      ...metadata,\n      state: {\n        ...(isPlainObject(metadata?.state) ? metadata.state : {}),\n        id: stateId,\n        cacheKey,","sourceCodeStart":186,"sourceCodeEnd":222,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/packages/core/src/agent/state-signals.ts#L186-L222","documentation":"createStateSignalInput builds a state signal from input plus optional defaults. A state signal must have an id (identity for tracking across turns); if neither `input.id` nor `options.defaultId` provides one, this error is thrown before any signal is created.","triggerScenarios":"Calling createStateSignalInput without `id` on the input and without a `defaultId` in options — e.g. `createStateSignalInput({ cacheKey: 'docs', value })` with no options argument.","commonSituations":"Refactoring call sites that previously generated ids; assuming the library auto-generates an id; passing defaultId under the wrong options key so it's undefined at runtime.","solutions":["Pass an explicit id: `createStateSignalInput({ id: 'doc-state', cacheKey: 'docs', value }, ...)`.","Provide `options.defaultId` when the same logical state is reused across a turn/agent scope.","Re-use a stable id for the same logical state so snapshot/delta tracking works; don't invent a new id per call.","Log/validate input.id and options.defaultId upstream to catch undefined values early."],"exampleFix":"// before\ncreateStateSignalInput({ cacheKey: 'docs', value });\n// after\ncreateStateSignalInput({ id: 'doc-state', cacheKey: 'docs', value });","handlingStrategy":"validation","validationCode":"if (!input.id && !options?.defaultId) {\n  throw new TypeError('state signal requires input.id or options.defaultId');\n}","typeGuard":"function hasStateId(input: { id?: string }, options?: { defaultId?: string }): boolean {\n  return Boolean(input.id ?? options?.defaultId);\n}","tryCatchPattern":"try {\n  created = createStateSignalInput(input, options);\n} catch (e) {\n  if (e instanceof Error && e.message === 'state signal id is required') {\n    created = createStateSignalInput({ ...input, id: crypto.randomUUID() }, options);\n  } else throw e;\n}","preventionTips":["Always pass a stable id for the same logical state (reuse, don't regenerate per call)","Provide options.defaultId for scoped defaults","Check that options keys match the expected shape — a misplaced defaultId is silently undefined"],"tags":["signals","state","missing-argument"],"backgroundTag":"missing-required-argument","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}