Skip to main content

What it is

One row per signal: a single, materially true statement about the company right now — observed, reported, or inferred. Signals are not knowledge, not issues, and not strategy. They are the raw reality layer: “Marquis 3020 has 10 units on hand and a 27-day gap before the next PO arrives” or “Netherlands orders in the last 28 days are 3.35× the prior year”. Signals are produced by intelligence agents (the meeting extractor, the e-commerce sales agent) and by people. A curator agent reads them, links them to Processes, and turns the ones that need a human answer into Decisions — see Decision Signal Links for the evidence trail.

How it gets data

Three write paths:
  • Agents with the insert_company_signals / update_company_signals grants write rows during a run. The platform stamps agent_id and run_id server-side on every insert — an agent cannot set or override them, and they are stripped from updates.
  • Ingest — external systems push rows through the Ingest API:
  • People — in the app, or over MCP via data_row_create / data_row_update with the same grants.
tenant_id / workspace_id always come from the credential, never from the body.

Lifecycle

A signal is active until it is either resolved (no longer true, no successor) or superseded (a newer signal on the same subject replaced it — the successor carries supersedes_signal_id). Writers are expected to update or supersede an existing active signal on the same subject rather than insert a duplicate; there is never more than one active signal per subject.

Fields

Source

Content

Assessment

Lifecycle

Provenance (server-stamped)

Like every workspace table, Company Signals also carries id, tenant_id, workspace_id, created_at, and updated_at. id is a registered (hidden) column so agents can target a row for update_company_signals and for supersedes_signal_id.

Query it