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_signalsgrants write rows during a run. The platform stampsagent_idandrun_idserver-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_updatewith the same grants.
tenant_id / workspace_id always come from the credential, never from the body.
Lifecycle
A signal isactive 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.