> ## Documentation Index
> Fetch the complete documentation index at: https://agents.concierca.ch/llms.txt
> Use this file to discover all available pages before exploring further.

# Company Signals

> Atomic, dated statements about the current state of the company — extracted from meetings, commerce data, and other sources. The reality layer that decisions are built on.

## 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](/for-agents/data-model/processes), and turns the ones that need a human answer into [Decisions](/for-agents/data-model/decisions) — see [Decision Signal Links](/for-agents/data-model/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](/for-agents/ingest):

```http theme={null}
POST /api/ingest/company_signals
Authorization: Bearer pk_...
Content-Type: application/json
```

* **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

| Field          | Label       | Type     | Writable    | Description                                                                                              |
| -------------- | ----------- | -------- | ----------- | -------------------------------------------------------------------------------------------------------- |
| `source_kind`  | Source Kind | text     | create/edit | `meeting` / `commerce` / `marketing` / `vertical` / `agent` / `human` — which domain produced the signal |
| `source_id`    | Source ID   | text     | create/edit | Id of the source row (e.g. the meeting note, the SKU) — hidden by default                                |
| `source_label` | Source      | text     | create/edit | Human-readable source (e.g. the meeting title or view name)                                              |
| `source_date`  | Source Date | datetime | create/edit | When the underlying observation was made — the default sort                                              |

### Content

| Field           | Label         | Type | Writable    | Description                                                                                                                            |
| --------------- | ------------- | ---- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `signal_type`   | Type          | text | create/edit | `fact` / `goal` / `problem` / `decision` / `constraint` / `risk` / `opportunity` / `assumption` / `unknown`                            |
| `subject`       | Subject       | text | create/edit | Short, stable handle for what the signal is about (e.g. `Marquis 3020 — supply gap risk`). The de-duplication key                      |
| `statement`     | Statement     | text | create/edit | The signal itself — one or two plain sentences with the numbers that matter                                                            |
| `evidence_note` | Evidence Note | text | create/edit | Where the numbers come from (columns, windows, thresholds) — hidden by default                                                         |
| `process_id`    | Process       | uuid | create/edit | Late-bound link to the [Process](/for-agents/data-model/processes) this reality belongs to. Empty until a curator or person assigns it |

### Assessment

| Field                 | Label               | Type    | Writable    | Description                                                          |
| --------------------- | ------------------- | ------- | ----------- | -------------------------------------------------------------------- |
| `confidence`          | Confidence          | text    | create/edit | `high` / `medium` / `low` — how sure the producer is                 |
| `needs_verification`  | Needs Verification  | boolean | create/edit | A person should confirm before anyone acts on it                     |
| `strategic_relevance` | Strategic Relevance | text    | create/edit | `high` / `medium` / `low` — how much this should influence decisions |

### Lifecycle

| Field                  | Label             | Type | Writable    | Description                                                                                  |
| ---------------------- | ----------------- | ---- | ----------- | -------------------------------------------------------------------------------------------- |
| `status`               | Status            | text | create/edit | `active` / `resolved` / `superseded`                                                         |
| `supersedes_signal_id` | Supersedes Signal | uuid | create/edit | The older signal this one replaces; the older row is set to `superseded` — hidden by default |

### Provenance *(server-stamped)*

| Field      | Label | Type | Writable  | Description                                                                   |
| ---------- | ----- | ---- | --------- | ----------------------------------------------------------------------------- |
| `agent_id` | Agent | uuid | read-only | Agent that wrote the row — stamped on insert, never accepted from the payload |
| `run_id`   | Run   | uuid | read-only | Agent run that wrote the row — same rule                                      |

<Note>
  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`.
</Note>

## Query it

```json theme={null}
{
  "method": "tools/call",
  "params": {
    "name": "data_query",
    "arguments": {
      "view_slug": "company_signals",
      "filters": { "status": "active", "strategic_relevance": "high" },
      "select_fields": ["source_date", "signal_type", "subject", "statement", "confidence", "process_id"],
      "sort_by": "source_date",
      "limit": 25
    }
  }
}
```
